DataSetting.vue 33 KB

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