DataSetting.vue 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987
  1. <template>
  2. <div
  3. class="bs-setting-wrap"
  4. @click.stop
  5. >
  6. <el-form
  7. ref="form"
  8. :model="config"
  9. :rules="rules"
  10. label-width="100px"
  11. label-position="left"
  12. class="setting-body bs-el-form"
  13. >
  14. <div class="data-setting-box">
  15. <div
  16. v-if="config.option.displayOption.dataSourceType.enable"
  17. class="data-setting-data-box"
  18. >
  19. <div class="lc-field-head">
  20. <div class="lc-field-title">
  21. 数据来源
  22. </div>
  23. </div>
  24. <div class="lc-field-body">
  25. <el-form-item
  26. label="数据集"
  27. >
  28. <data-set-select
  29. :dataset-name="datasetName"
  30. :ds-id="config.dataSource.businessKey"
  31. @getDsId="dsId => { getDataSetDetailsById(dsId, 'treeTable');}"
  32. >
  33. <template #dataSetSelect="{value}">
  34. <slot
  35. name="dataSetSelect"
  36. :value="value"
  37. />
  38. </template>
  39. </data-set-select>
  40. </el-form-item>
  41. <el-form-item
  42. v-if="config.option.displayOption.text && config.option.displayOption.text.enable"
  43. label="文本内容"
  44. >
  45. <el-input
  46. v-model="config.customize.title"
  47. placeholder="请输入文本内容"
  48. clearable
  49. />
  50. </el-form-item>
  51. <el-form-item
  52. v-if="config.option.displayOption.expression && config.option.displayOption.expression.enable"
  53. label="表达式"
  54. >
  55. <i
  56. class="el-icon-edit expression"
  57. @click="openExpression"
  58. />
  59. </el-form-item>
  60. </div>
  61. </div>
  62. <div
  63. v-if="['customComponent','marquee', 'echartsComponent'].includes(config.type)"
  64. class="data-setting-data-box"
  65. >
  66. <div class="lc-field-head">
  67. <div class="lc-field-title">
  68. 数据处理
  69. </div>
  70. </div>
  71. <div class="lc-field-body">
  72. <el-form-item
  73. label="数据处理脚本"
  74. >
  75. <el-input
  76. v-model="config.dataHandler"
  77. type="textarea"
  78. :rows="5"
  79. placeholder="示例:
  80. data.forEach(item => {
  81. // 数据处理
  82. })"
  83. />
  84. </el-form-item>
  85. </div>
  86. </div>
  87. <div
  88. v-if="!['tree','multipleNumberChart','carousel'].includes(config.type) && config.option.displayOption.dataSourceType.enable "
  89. class="data-setting-data-box"
  90. >
  91. <div class="lc-field-head">
  92. <div
  93. v-if="config.type!=='flyMap'"
  94. class="lc-field-title"
  95. >
  96. 数据配置
  97. </div>
  98. </div>
  99. <!-- 基础组件数据配置 -->
  100. <template v-if="!['customComponent', 'remoteComponent','echartsComponent'].includes(config.type)">
  101. <!--维度多选-->
  102. <el-form-item
  103. v-if="config.option.displayOption.dimensionField.enable"
  104. :label="config.option.displayOption.dimensionField.label"
  105. :prop="config.option.displayOption.dimensionField.multiple? 'dataSource.dimensionFieldList' : 'dataSource.dimensionField'"
  106. class="data-form-item"
  107. >
  108. <el-drag-select
  109. v-if="config.option.displayOption.dimensionField.enable && config.option.displayOption.dimensionField.multiple"
  110. v-model="config.dataSource.dimensionFieldList"
  111. class="bs-el-select"
  112. popper-class="bs-el-select"
  113. filterable
  114. clearable
  115. :multiple="config.option.displayOption.dimensionField.multiple"
  116. @change="dimensionFieldListChange"
  117. @valuePositionChange="valuePositionChange"
  118. >
  119. <el-option
  120. v-for="(field, index) in dataSourceDataList"
  121. :key="index"
  122. :label="field.comment"
  123. :value="field.name"
  124. >
  125. <div class="source-key-option">
  126. <div>
  127. {{ field.comment !== "" ? field.comment : field.name }}
  128. </div>
  129. <div class="option-txt">
  130. {{ field.name }}
  131. </div>
  132. </div>
  133. </el-option>
  134. </el-drag-select>
  135. <!--维度单选-->
  136. <el-select
  137. v-else
  138. v-model="config.dataSource.dimensionField"
  139. class="bs-el-select"
  140. popper-class="bs-el-select"
  141. filterable
  142. clearable
  143. >
  144. <el-option
  145. v-for="(field, index) in dataSourceDataList"
  146. :key="index"
  147. :label="field.comment"
  148. :value="field.name"
  149. >
  150. <div class="source-key-option">
  151. <div>
  152. {{ field.comment !== "" ? field.comment : field.name }}
  153. </div>
  154. <div class="option-txt">
  155. {{ field.name }}
  156. </div>
  157. </div>
  158. </el-option>
  159. </el-select>
  160. </el-form-item>
  161. <!--指标-->
  162. <el-form-item
  163. v-if="config.option.displayOption.metricField.enable"
  164. :label="config.option.displayOption.metricField.label"
  165. prop="dataSource.metricField"
  166. class="data-form-item"
  167. >
  168. <el-select
  169. v-model="config.dataSource.metricField"
  170. class="bs-el-select"
  171. popper-class="bs-el-select"
  172. filterable
  173. clearable
  174. >
  175. <el-option
  176. v-for="(field, index) in dataSourceDataList"
  177. :key="index"
  178. :label="field.comment"
  179. :value="field.name"
  180. >
  181. <div class="source-key-option">
  182. <div>
  183. {{ field.comment !== "" ? field.comment : field.name }}
  184. </div>
  185. <div class="option-txt">
  186. {{ field.name }}
  187. </div>
  188. </div>
  189. </el-option>
  190. </el-select>
  191. </el-form-item>
  192. </template>
  193. <!-- g2plot和远程组件数据配置 -->
  194. <template v-else>
  195. <template
  196. v-for="(setting, index) in config.setting.filter(set => set.tabName === 'data')"
  197. >
  198. <el-form-item
  199. :key="index"
  200. :label="setting.label"
  201. class="data-form-item"
  202. >
  203. <el-select
  204. v-if="setting.type === 'select'"
  205. class="bs-el-select select"
  206. popper-class="bs-el-select"
  207. :value="setting.value"
  208. filterable
  209. clearable
  210. :multiple="setting.multiple"
  211. :placeholder="`请选择${setting.label}`"
  212. @change="changeCustomProps(...arguments, setting)"
  213. >
  214. <el-option
  215. v-for="(field, fieldIndex) in dataSourceDataList"
  216. :key="fieldIndex"
  217. :label="field.comment"
  218. :value="field.name"
  219. >
  220. <div class="source-key-option">
  221. <div>
  222. {{ field.comment !== "" ? field.comment : field.name }}
  223. </div>
  224. <div class="option-txt">
  225. {{ field.name }}
  226. </div>
  227. </div>
  228. </el-option>
  229. </el-select>
  230. <el-input
  231. v-else
  232. :value="setting.value"
  233. :placeholder="`请输入${setting.label}`"
  234. @change="changeCustomProps(...arguments, setting)"
  235. />
  236. </el-form-item>
  237. </template>
  238. </template>
  239. </div>
  240. <div
  241. v-if="config.option.displayOption.headerField && config.option.displayOption.headerField.enable"
  242. name="轮播表配置"
  243. >
  244. <template slot="title">
  245. <div class="lc-field-head">
  246. <div class="lc-field-title">
  247. 轮播表配置
  248. </div>
  249. </div>
  250. </template>
  251. <div class="lc-field-body">
  252. <el-table
  253. ref="headerTable"
  254. :border="true"
  255. :data="config.customize.columnConfig"
  256. class="params-config"
  257. >
  258. <el-table-column
  259. prop="code"
  260. label="参数名称"
  261. align="center"
  262. >
  263. <template slot-scope="scope">
  264. <el-input
  265. v-model="scope.row.code"
  266. placeholder="请输入名称"
  267. readonly
  268. />
  269. </template>
  270. </el-table-column>
  271. <el-table-column
  272. prop="name"
  273. label="列名称"
  274. align="center"
  275. >
  276. <template slot-scope="scope">
  277. <el-input
  278. v-model="scope.row.name"
  279. placeholder="请输入字段名称"
  280. />
  281. </template>
  282. </el-table-column>
  283. <el-table-column
  284. prop="width"
  285. label="列宽"
  286. align="center"
  287. >
  288. <template slot-scope="scope">
  289. <el-input
  290. v-model="scope.row.width"
  291. placeholder="请输入列宽"
  292. clearable
  293. />
  294. </template>
  295. </el-table-column>
  296. <el-table-column
  297. prop="align"
  298. label="对齐方式"
  299. align="center"
  300. >
  301. <template slot-scope="scope">
  302. <el-select
  303. v-model="scope.row.align"
  304. class="bs-el-select"
  305. popper-class="bs-el-select"
  306. filterable
  307. clearable
  308. placeholder="请选择对齐方式"
  309. >
  310. <el-option
  311. value="left"
  312. label="左对齐"
  313. />
  314. <el-option
  315. value="center"
  316. label="居中"
  317. />
  318. <el-option
  319. value="right"
  320. label="右对齐"
  321. />
  322. </el-select>
  323. </template>
  324. </el-table-column>
  325. </el-table>
  326. </div>
  327. </div>
  328. <div
  329. v-if="config.option.displayOption.mapField && config.option.displayOption.mapField.enable"
  330. name="地图数据配置"
  331. >
  332. <template slot="title">
  333. <div class="lc-field-head">
  334. <div class="lc-field-title">
  335. 地图数据配置
  336. </div>
  337. </div>
  338. </template>
  339. <div class="lc-field-body">
  340. <el-form-item
  341. label="展示字段"
  342. class="data-form-item"
  343. >
  344. <el-select
  345. v-model="config.customize.value"
  346. class="bs-el-select"
  347. popper-class="bs-el-select"
  348. filterable
  349. clearable
  350. >
  351. <el-option
  352. v-for="(field, index) in dataSourceDataList"
  353. :key="index"
  354. :label="field.comment"
  355. :value="field.name"
  356. >
  357. <div class="source-key-option">
  358. <div>
  359. {{ field.comment !== "" ? field.comment : field.name }}
  360. </div>
  361. <div class="option-txt">
  362. {{ field.name }}
  363. </div>
  364. </div>
  365. </el-option>
  366. </el-select>
  367. </el-form-item>
  368. <el-form-item
  369. label="地名字段"
  370. class="data-form-item"
  371. >
  372. <el-select
  373. v-model="config.customize.name"
  374. class="bs-el-select"
  375. popper-class="bs-el-select"
  376. filterable
  377. clearable
  378. >
  379. <el-option
  380. v-for="(field, index) in dataSourceDataList"
  381. :key="index"
  382. :label="field.comment"
  383. :value="field.name"
  384. >
  385. <div class="source-key-option">
  386. <div>
  387. {{ field.comment !== "" ? field.comment : field.name }}
  388. </div>
  389. <div class="option-txt">
  390. {{ field.name }}
  391. </div>
  392. </div>
  393. </el-option>
  394. </el-select>
  395. </el-form-item>
  396. <el-form-item
  397. label="x坐标"
  398. class="data-form-item"
  399. >
  400. <el-select
  401. v-model="config.customize.xaxis"
  402. class="bs-el-select"
  403. popper-class="bs-el-select"
  404. filterable
  405. clearable
  406. >
  407. <el-option
  408. v-for="(field, index) in dataSourceDataList"
  409. :key="index"
  410. :label="field.comment"
  411. :value="field.name"
  412. >
  413. <div class="source-key-option">
  414. <div>
  415. {{ field.comment !== "" ? field.comment : field.name }}
  416. </div>
  417. <div class="option-txt">
  418. {{ field.name }}
  419. </div>
  420. </div>
  421. </el-option>
  422. </el-select>
  423. </el-form-item>
  424. <el-form-item
  425. label="y坐标"
  426. class="data-form-item"
  427. >
  428. <el-select
  429. v-model="config.customize.yaxis"
  430. class="bs-el-select"
  431. popper-class="bs-el-select"
  432. filterable
  433. clearable
  434. >
  435. <el-option
  436. v-for="(field, index) in dataSourceDataList"
  437. :key="index"
  438. :label="field.comment"
  439. :value="field.name"
  440. >
  441. <div class="source-key-option">
  442. <div>
  443. {{ field.comment !== "" ? field.comment : field.name }}
  444. </div>
  445. <div class="option-txt">
  446. {{ field.name }}
  447. </div>
  448. </div>
  449. </el-option>
  450. </el-select>
  451. </el-form-item>
  452. </div>
  453. </div>
  454. <div
  455. v-if="config.option.displayOption.params.enable"
  456. class="data-setting-data-box"
  457. >
  458. <div class="lc-field-head">
  459. <div class="lc-field-title">
  460. 参数配置
  461. </div>
  462. </div>
  463. <div class="lc-field-body">
  464. <el-table
  465. ref="singleTable"
  466. :border="true"
  467. :data="params"
  468. class="params-config"
  469. >
  470. <el-table-column
  471. prop="name"
  472. label="参数名称"
  473. align="center"
  474. >
  475. <template slot-scope="scope">
  476. <div>
  477. <el-form-item>
  478. <el-input
  479. v-model="scope.row.name"
  480. placeholder="请输入名称"
  481. readonly
  482. />
  483. <el-tooltip
  484. :content="
  485. `${
  486. scope.row.type ? '参数类型:' + scope.row.type : ''
  487. }
  488. ${
  489. scope.row.remark ? '备注:' + scope.row.remark : ''
  490. }`
  491. "
  492. placement="top"
  493. >
  494. <span
  495. class="el-icon-question"
  496. style="color:#9e9e9e"
  497. />
  498. </el-tooltip>
  499. </el-form-item>
  500. </div>
  501. </template>
  502. </el-table-column>
  503. <el-table-column
  504. prop="value"
  505. label="参数值"
  506. align="center"
  507. >
  508. <template slot-scope="scope">
  509. <el-form-item
  510. :prop="scope.row.require === 1 ? 'params' : null"
  511. >
  512. <el-date-picker
  513. v-if="scope.row.type === 'Date'"
  514. v-model="scope.row.value"
  515. type="datetime"
  516. value-format="yyyy-MM-dd HH:mm:ss"
  517. placeholder="选择日期时间"
  518. />
  519. <el-input
  520. v-else
  521. v-model="scope.row.value"
  522. clearable
  523. placeholder="请输入参数值"
  524. />
  525. </el-form-item>
  526. </template>
  527. </el-table-column>
  528. </el-table>
  529. </div>
  530. </div>
  531. <div
  532. v-if="config.option.displayOption.serverPagination.enable"
  533. class="data-setting-data-box"
  534. name="分页配置"
  535. >
  536. <div class="lc-field-head">
  537. <div class="lc-field-title">
  538. 分页配置
  539. </div>
  540. </div>
  541. <div class="form">
  542. <el-form-item
  543. v-if="config.option.displayOption.serverPagination.enable"
  544. label="服务端分页"
  545. prop="dataSource.serverPagination"
  546. >
  547. <el-radio-group
  548. v-model="config.dataSource.serverPagination"
  549. class="bs-el-radio-group"
  550. size="mini"
  551. @change="serverPaginationChange"
  552. >
  553. <el-radio-button :label="true">
  554. 开启
  555. </el-radio-button>
  556. <el-radio-button :label="false">
  557. 关闭
  558. </el-radio-button>
  559. </el-radio-group>
  560. </el-form-item>
  561. <el-form-item
  562. v-if="
  563. config.dataSource.serverPagination &&
  564. config.option.displayOption.pageSize.enable
  565. "
  566. label="分页长度"
  567. prop="dataSource.pageSize"
  568. >
  569. <el-select
  570. v-model="config.dataSource.pageSize"
  571. class="bs-el-select"
  572. popper-class="bs-el-select"
  573. filterable
  574. allow-create
  575. default-first-option
  576. >
  577. <el-option
  578. v-for="size in pageSizeList"
  579. :key="size"
  580. :label="size"
  581. :value="size"
  582. />
  583. </el-select>
  584. </el-form-item>
  585. </div>
  586. </div>
  587. <ComponentBinding
  588. v-if="['button'].includes(config.type)"
  589. :config="config"
  590. :source-field-list="sourceFieldList"
  591. />
  592. <ComponentRelation
  593. v-if="!['carousel','gauge','liquid','marquee'].includes(config.type)"
  594. :config="config"
  595. :source-field-list="sourceFieldList"
  596. />
  597. <expression-dialog
  598. ref="expressionDialog"
  599. :config="config"
  600. />
  601. </div>
  602. </el-form>
  603. </div>
  604. </template>
  605. <script>
  606. import ElDragSelect from './ElDragSelect.vue'
  607. // import { isEmpty, cloneDeep } from 'lodash'
  608. import isEmpty from 'lodash/isEmpty'
  609. import cloneDeep from 'lodash/cloneDeep'
  610. import ComponentRelation from 'data-room-ui/BigScreenDesign/RightSetting/ComponentRelation/index.vue'
  611. import ComponentBinding from 'data-room-ui/BigScreenDesign/RightSetting/ComponentBinding/index.vue'
  612. import dataSetSelect from 'data-room-ui/DataSetSetting/index.vue'
  613. import { mapState } from 'vuex'
  614. import { getDataSetDetails } from 'data-room-ui/js/api/bigScreenApi'
  615. import ExpressionDialog from 'data-room-ui/BigScreenDesign/RightSetting/ExpressionDialog.vue'
  616. export default {
  617. name: 'DataSetting',
  618. components: {
  619. ComponentRelation,
  620. ComponentBinding,
  621. dataSetSelect,
  622. ElDragSelect,
  623. ExpressionDialog
  624. },
  625. data () {
  626. return {
  627. fieldsList: [],
  628. params: [], // 参数配置
  629. datasetName: '',
  630. headerList: [],
  631. pageSizeList: [10, 20, 50, 100],
  632. rules: {
  633. // 'dataSource.businessKey': [
  634. // { required: true, message: '请选择数据集', trigger: 'change' }
  635. // ],
  636. // 'dataSource.dimensionField': [
  637. // { required: true, message: '请选择维度', trigger: 'change' }
  638. // ],
  639. // 'dataSource.dimensionFieldList': [
  640. // { required: true, message: '请选择维度', trigger: 'change' }
  641. // ],
  642. // 'dataSource.metricField': [
  643. // { required: true, message: '请选择指标', trigger: 'change' }
  644. // ],
  645. params: [
  646. {
  647. validator: (rule, value, callback) => {
  648. if (!value) {
  649. this.params.map(sort => {
  650. if (!sort.value) {
  651. callback(new Error('请输入参数值'))
  652. } else {
  653. callback()
  654. }
  655. })
  656. } else {
  657. callback()
  658. }
  659. }
  660. }
  661. ]
  662. }
  663. }
  664. },
  665. computed: {
  666. ...mapState({
  667. pageInfo: state => state.bigScreen.pageInfo,
  668. config: state => state.bigScreen.activeItemConfig
  669. // 缓存数据集
  670. // cacheDataSets: state => state.bigScreen.pageInfo.pageConfig.cacheDataSets
  671. }),
  672. dataSourceDataList () {
  673. return this.fieldsList?.map(item => ({
  674. ...item,
  675. comment: item?.fieldDesc || item?.fieldName,
  676. name: item?.fieldName
  677. }))
  678. },
  679. appCode: {
  680. get () {
  681. return this.$store.state.bigScreen.pageInfo.appCode
  682. }
  683. },
  684. seriesFieldProp () {
  685. if (this.config.option.displayOption.seriesField.required) {
  686. return 'dataSource.seriesField'
  687. } else {
  688. return ''
  689. }
  690. },
  691. pageCode () {
  692. return this.$route.query.code
  693. },
  694. // 映射字段
  695. sourceFieldList () {
  696. const list = this?.config?.customize?.bindComponents || this.fieldsList
  697. const modifiedList = list?.map(field => ({
  698. label: field.comment || field.fieldDesc,
  699. value: field.name || field.fieldName
  700. })) || []
  701. if (['input', 'timePicker', 'dateTimePicker'].includes(this.config.type)) {
  702. modifiedList.push({ label: '当前组件值', value: this.config.code })
  703. }
  704. return modifiedList
  705. }
  706. },
  707. watch: {
  708. // 切换数据集时将其他配置清空
  709. 'config.dataSource.businessKey' (val) {
  710. this.clearCustomVerify()
  711. this.clearVerify()
  712. },
  713. // 切换数据集类型时将其他配置清空
  714. 'config.dataSource.dataSetType' () {
  715. this.config.dataSource.businessKey = ''
  716. this.clearCustomVerify()
  717. this.clearVerify()
  718. },
  719. // 参数改变时
  720. params: {
  721. handler (val) {
  722. if (!isEmpty(val)) {
  723. const params = cloneDeep(val)
  724. const paramsMap = params.reduce((obj, param) => {
  725. obj[param.name] = param.value
  726. return obj
  727. }, {})
  728. this.config.dataSource.params = paramsMap
  729. }
  730. },
  731. deep: true
  732. },
  733. 'config.dataSource.dimensionField' (val) {
  734. if (['select'].includes(this.config.type)) {
  735. if (this.config.customize?.placeholder) {
  736. this.config.customize.placeholder = '请选择' + this.dataSourceDataList.find(item => item.fieldName === val).comment
  737. }
  738. }
  739. }
  740. },
  741. mounted () {
  742. if (this.config.dataSource && this.config.dataSource.businessKey) {
  743. this.getDataSetDetailsById(this.config.dataSource.businessKey, 'initial')
  744. }
  745. },
  746. methods: {
  747. // 打开表达式弹窗
  748. openExpression () {
  749. this.$refs.expressionDialog.init()
  750. },
  751. // 切换前后端分页
  752. serverPaginationChange (val) {
  753. this.config.customize.webPagination = !val
  754. },
  755. // 清空自定义组件配置,与手动配置的组件区分开
  756. clearCustomVerify () {
  757. this.config.setting = this.config.setting?.map(set => {
  758. this.datasetName = ''
  759. if (set.tabName === 'data') {
  760. set.value = ''
  761. }
  762. return set
  763. })
  764. },
  765. // 清空手动配置的组件配置
  766. clearVerify () {
  767. this.config.dataSource.metricField = ''
  768. this.config.dataSource.dimensionField = ''
  769. this.config.dataSource.dimensionFieldList = []
  770. this.config.dataSource.seriesField = ''
  771. this.config.dataSource.params = {}
  772. },
  773. // 根据数据集来获取数据集详情
  774. getDataSetDetailsById (id, type) {
  775. if (id) {
  776. this.config.dataSource.businessKey = id
  777. getDataSetDetails(id).then(res => {
  778. this.fieldsList = res.fields
  779. // 初始化时以组件本来的参数设置为主
  780. if (type === 'initial') {
  781. const deleteKeys = []
  782. for (const key in this.config.dataSource.params) {
  783. const param = res?.params?.find(field => field.name === key)
  784. // 如果组件参数在数据集中找不到,说明参数已经被删除,不需要再显示
  785. if (param) {
  786. deleteKeys.push(key)
  787. this.params.push({
  788. name: key,
  789. value: this.config.dataSource.params[key],
  790. type: param?.type,
  791. remark: param?.remark
  792. })
  793. }
  794. }
  795. if (res.params) {
  796. // 如果数据集中有新增的参数,需要显示出来
  797. res.params.forEach(param => {
  798. if (!this.params.find(item => item.name === param.name)) {
  799. this.params.push({
  800. name: param.name,
  801. value: param.value,
  802. type: param.type,
  803. remark: param.remark
  804. })
  805. }
  806. })
  807. }
  808. deleteKeys.forEach(key => {
  809. delete this.config.dataSource.params[key]
  810. })
  811. } else {
  812. this.params = res.params
  813. }
  814. this.datasetName = res.name
  815. // 选择数据集的时候,如果数据集类型是dataModel,则不显示参数配置
  816. this.config.option.displayOption.params.enable = res.type !== 'dataModel'
  817. // 根据数据集初始化组件的入参:inparams
  818. if (res.type !== 'dataModel') {
  819. this.config.inParams =
  820. this.params?.map(param => {
  821. return {
  822. name: param.remark, // 参数名
  823. code: param.name // 参数值
  824. }
  825. }) || []
  826. } else {
  827. this.config.inParams =
  828. this.fieldsList?.map(field => {
  829. return {
  830. name: field.fieldDesc, // 参数名
  831. code: field.fieldName // 参数值
  832. }
  833. }) || []
  834. }
  835. // 根据数据集的参数初始化表单项
  836. this.config.paramsList = this.params
  837. if (type === 'treeTable') {
  838. const enumeration = {
  839. dataSetType: '1', // 数据集类型
  840. dataSetKey: '', // 数据集
  841. itemKeyName: '', // 选项显示字段
  842. itemValueName: '', // 选项value字段
  843. params: []
  844. }
  845. this.config.fields =
  846. this.params?.map(param => {
  847. return {
  848. name: param.name,
  849. label: param.remark || param.name,
  850. component: 'input',
  851. display: res.type !== 'dataModel',
  852. enumeration: {
  853. ...enumeration
  854. },
  855. queryRule: 'like'
  856. }
  857. }) || []
  858. }
  859. })
  860. }
  861. },
  862. // 改变维度
  863. dimensionFieldListChange (list) {
  864. const colFieldList = []
  865. if (list.length > 0) {
  866. list.forEach(item => {
  867. colFieldList.push(
  868. this.dataSourceDataList.find(field => field.name === item)
  869. )
  870. })
  871. }
  872. this.headerList = []
  873. colFieldList.forEach(item => {
  874. this.headerList.push({ name: item.comment, code: item.name, width: '150', align: 'left' })
  875. })
  876. this.config.customize.columnConfig = cloneDeep(this.headerList)
  877. this.$store.commit('bigScreen/changeActiveItemConfig', this.config)
  878. },
  879. valuePositionChange (value) {
  880. const sortedColumnData = {}
  881. const columnData = cloneDeep(this.config.option?.columnData)
  882. value.forEach((item, index) => {
  883. sortedColumnData[item] = columnData[item]
  884. })
  885. this.config.option.columnData = sortedColumnData
  886. this.$store.commit('bigScreen/changeActiveItemConfig', this.config)
  887. },
  888. changeCustomProps (value, setting) {
  889. this.config.setting = this.config.setting.map(item => {
  890. if (item.field === setting.field) {
  891. item.value = value
  892. }
  893. return item
  894. })
  895. }
  896. // 改变缓存数据集key
  897. // changeCacheBusinessKey (id) {
  898. // // 根据id在缓存中获取fields
  899. // this.fieldsList = this.cacheDataSets?.find(cache => cache.dataSetId === id)?.fields
  900. // this.params = this.cacheDataSets?.find(cache => cache.dataSetId === id)?.params
  901. // }
  902. }
  903. }
  904. </script>
  905. <style lang="scss" scoped>
  906. @import "../../assets/style/settingWrap.scss";
  907. .add-filter-box {
  908. position: relative;
  909. .add-filter {
  910. margin-left: 100px;
  911. }
  912. .add-filter-btn {
  913. position: absolute;
  914. top: 0;
  915. }
  916. }
  917. .form {
  918. padding: 12px;
  919. }
  920. ::v-deep .el-tag__close.el-icon-close::before {
  921. color: #fff;
  922. }
  923. ::v-deep .el-tag__close.el-icon-close {
  924. top: -1px;
  925. &:hover {
  926. background-color:var(--bs-el-color-primary);
  927. }
  928. }
  929. .opt-wrap{
  930. margin-top: 10px;
  931. }
  932. .link-set-item {
  933. position: relative;
  934. border: 1px solid #f5f7fa;
  935. padding: 30px 16px 10px;
  936. box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
  937. margin: 10px;
  938. .del-icon {
  939. cursor: pointer;
  940. position: absolute;
  941. right: 10px;
  942. top: 5px;
  943. font-size: 20px;
  944. color: #f00;
  945. }
  946. .opt-wrap {
  947. display: flex;
  948. justify-content: center;
  949. }
  950. }
  951. //表达式样式
  952. .expression{
  953. &:hover{
  954. cursor: pointer;
  955. }
  956. }
  957. // 修改设置面板样式
  958. .data-setting-box{
  959. .data-setting-data-box{
  960. .lc-field-head{
  961. height: 30px;
  962. .lc-field-title{
  963. position: relative;
  964. padding-left: 12px;
  965. line-height: 30px;
  966. height: 30px;
  967. &:after{
  968. position: absolute;
  969. left: 0;
  970. top: 50%;
  971. transform: translateY(-50%);
  972. content: '';
  973. width: 4px;
  974. height: 14px;
  975. background-color: var(--bs-el-color-primary);
  976. }
  977. }
  978. }
  979. }
  980. }
  981. </style>