DataSetting.vue 33 KB

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