DataSetting.vue 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351
  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-select
  30. v-model="config.dataSource.source"
  31. class="bs-el-select"
  32. popper-class="bs-el-select"
  33. placeholder="请选择数据来源"
  34. clearable
  35. @change="sourceChange"
  36. >
  37. <el-option
  38. value="dataset"
  39. label="数据集"
  40. />
  41. <el-option
  42. value="expression"
  43. label="表达式"
  44. />
  45. <el-option
  46. value="static"
  47. label="静态值"
  48. />
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item
  52. v-if="config.dataSource.source === 'dataset'"
  53. label="数据集"
  54. >
  55. <data-set-select
  56. :dataset-name="datasetName"
  57. :ds-id="config.dataSource.businessKey"
  58. @getDsId="changeDsid"
  59. >
  60. <template #dataSetSelect="{value}">
  61. <slot
  62. name="dataSetSelect"
  63. :value="value"
  64. />
  65. </template>
  66. </data-set-select>
  67. </el-form-item>
  68. <el-form-item
  69. v-if="config.dataSource.source === 'expression' && config.option.displayOption.expression && config.option.displayOption.expression.enable"
  70. label="表达式"
  71. >
  72. <i
  73. class="el-icon-edit expression"
  74. @click="openExpression"
  75. />
  76. </el-form-item>
  77. <el-form-item
  78. v-if="config.dataSource.source === 'static'"
  79. label="文本内容"
  80. >
  81. <el-input
  82. v-model="config.customize.title"
  83. placeholder="请输入文本内容"
  84. clearable
  85. />
  86. </el-form-item>
  87. </div>
  88. </div>
  89. <div
  90. v-if="['customComponent','marquee', 'echartsComponent'].includes(config.type)"
  91. class="data-setting-data-box"
  92. >
  93. <div class="lc-field-head">
  94. <div class="lc-field-title">
  95. 数据处理
  96. </div>
  97. </div>
  98. <div class="lc-field-body">
  99. <el-form-item
  100. label="数据处理脚本"
  101. >
  102. <el-input
  103. v-model="config.dataHandler"
  104. type="textarea"
  105. :rows="5"
  106. placeholder="示例:data.forEach(item => { // 数据处理 })"
  107. />
  108. </el-form-item>
  109. </div>
  110. </div>
  111. <div
  112. v-if="!['tree','multipleNumberChart','carousel'].includes(config.type) && config.option.displayOption.dataSourceType.enable && (!['expression','static'].includes(config.dataSource.source))"
  113. class="data-setting-data-box"
  114. >
  115. <div class="lc-field-head">
  116. <div
  117. class="lc-field-title"
  118. >
  119. 数据配置
  120. </div>
  121. </div>
  122. <!-- 基础组件数据配置 -->
  123. <template v-if="!['customComponent', 'remoteComponent','echartsComponent','candlestick'].includes(config.type)">
  124. <!--维度多选-->
  125. <el-form-item
  126. v-if="config.option.displayOption.dimensionField.enable"
  127. :label="config.option.displayOption.dimensionField.label"
  128. :prop="config.option.displayOption.dimensionField.multiple? 'dataSource.dimensionFieldList' : 'dataSource.dimensionField'"
  129. class="data-form-item"
  130. >
  131. <el-drag-select
  132. v-if="config.option.displayOption.dimensionField.enable && config.option.displayOption.dimensionField.multiple"
  133. v-model="config.dataSource.dimensionFieldList"
  134. class="bs-el-select"
  135. popper-class="bs-el-select"
  136. filterable
  137. clearable
  138. :multiple="config.option.displayOption.dimensionField.multiple"
  139. @change="dimensionFieldListChange"
  140. @valuePositionChange="valuePositionChange"
  141. >
  142. <el-option
  143. v-for="(field, index) in dataSourceDataList"
  144. :key="index"
  145. :label="field.comment"
  146. :value="field.name"
  147. >
  148. <div class="source-key-option">
  149. <div>
  150. {{ field.comment !== "" ? field.comment : field.name }}
  151. </div>
  152. <div class="option-txt">
  153. {{ field.name }}
  154. </div>
  155. </div>
  156. </el-option>
  157. </el-drag-select>
  158. <!--维度单选-->
  159. <el-select
  160. v-else
  161. v-model="config.dataSource.dimensionField"
  162. class="bs-el-select"
  163. popper-class="bs-el-select"
  164. filterable
  165. clearable
  166. >
  167. <el-option
  168. v-for="(field, index) in dataSourceDataList"
  169. :key="index"
  170. :label="field.comment"
  171. :value="field.name"
  172. >
  173. <div class="source-key-option">
  174. <div>
  175. {{ field.comment !== "" ? field.comment : field.name }}
  176. </div>
  177. <div class="option-txt">
  178. {{ field.name }}
  179. </div>
  180. </div>
  181. </el-option>
  182. </el-select>
  183. </el-form-item>
  184. <!--指标-->
  185. <el-form-item
  186. v-if="config.option.displayOption.metricField.enable"
  187. :label="config.option.displayOption.metricField.label"
  188. prop="dataSource.metricField"
  189. class="data-form-item"
  190. >
  191. <el-select
  192. v-model="config.dataSource.metricField"
  193. class="bs-el-select"
  194. popper-class="bs-el-select"
  195. filterable
  196. clearable
  197. >
  198. <el-option
  199. v-for="(field, index) in dataSourceDataList"
  200. :key="index"
  201. :label="field.comment"
  202. :value="field.name"
  203. >
  204. <div class="source-key-option">
  205. <div>
  206. {{ field.comment !== "" ? field.comment : field.name }}
  207. </div>
  208. <div class="option-txt">
  209. {{ field.name }}
  210. </div>
  211. </div>
  212. </el-option>
  213. </el-select>
  214. </el-form-item>
  215. </template>
  216. <!-- K线图数据配置 -->
  217. <template v-else-if="config.type === 'candlestick'">
  218. <el-form-item
  219. v-for="(fieldItem, i) in fieldNameMapping"
  220. :key="i"
  221. prop="dataSource.xField"
  222. class="data-form-item"
  223. :label="fieldItem.desc"
  224. >
  225. <el-select
  226. v-model="config.dataSource[fieldItem.name]"
  227. :multiple="fieldItem.multiple"
  228. class="bs-el-select"
  229. popper-class="bs-el-select"
  230. filterable
  231. clearable
  232. >
  233. <el-option
  234. v-for="(field, index) in dataSourceDataList"
  235. :key="index"
  236. :label="field.comment"
  237. :value="field.name"
  238. >
  239. <div class="source-key-option">
  240. <div>
  241. {{ field.comment !== "" ? field.comment : field.name }}
  242. </div>
  243. <div class="option-txt">
  244. {{ field.name }}
  245. </div>
  246. </div>
  247. </el-option>
  248. </el-select>
  249. </el-form-item>
  250. </template>
  251. <!-- g2plot和远程组件数据配置 -->
  252. <template v-else>
  253. <template
  254. v-for="(setting, index) in config.setting.filter(set => set.tabName === 'data')"
  255. >
  256. <el-form-item
  257. :key="index"
  258. :label="setting.label"
  259. class="data-form-item"
  260. >
  261. <el-select
  262. v-if="setting.type === 'select'"
  263. class="bs-el-select select"
  264. popper-class="bs-el-select"
  265. :value="setting.value"
  266. filterable
  267. clearable
  268. :multiple="setting.multiple"
  269. :placeholder="`请选择${setting.label}`"
  270. @change="changeCustomProps(...arguments, setting)"
  271. >
  272. <el-option
  273. v-for="(field, fieldIndex) in dataSourceDataList"
  274. :key="fieldIndex"
  275. :label="field.comment"
  276. :value="field.name"
  277. >
  278. <div class="source-key-option">
  279. <div>
  280. {{ field.comment !== "" ? field.comment : field.name }}
  281. </div>
  282. <div class="option-txt">
  283. {{ field.name }}
  284. </div>
  285. </div>
  286. </el-option>
  287. </el-select>
  288. <el-input
  289. v-else
  290. :value="setting.value"
  291. :placeholder="`请输入${setting.label}`"
  292. @change="changeCustomProps(...arguments, setting)"
  293. />
  294. </el-form-item>
  295. </template>
  296. </template>
  297. </div>
  298. <div
  299. v-if="config.option.displayOption.headerField && config.option.displayOption.headerField.enable"
  300. name="轮播表配置"
  301. >
  302. <template slot="title">
  303. <div class="lc-field-head">
  304. <div class="lc-field-title">
  305. 轮播表配置
  306. </div>
  307. </div>
  308. </template>
  309. <div class="lc-field-body">
  310. <el-table
  311. ref="headerTable"
  312. :border="true"
  313. :data="config.customize.columnConfig"
  314. class="params-config"
  315. >
  316. <el-table-column
  317. prop="code"
  318. label="参数名称"
  319. align="center"
  320. >
  321. <template slot-scope="scope">
  322. <el-input
  323. v-model="scope.row.code"
  324. placeholder="请输入名称"
  325. readonly
  326. />
  327. </template>
  328. </el-table-column>
  329. <el-table-column
  330. prop="name"
  331. label="列名称"
  332. align="center"
  333. >
  334. <template slot-scope="scope">
  335. <el-input
  336. v-model="scope.row.name"
  337. placeholder="请输入字段名称"
  338. />
  339. </template>
  340. </el-table-column>
  341. <el-table-column
  342. prop="width"
  343. label="列宽"
  344. width="90"
  345. align="center"
  346. >
  347. <template slot-scope="scope">
  348. <el-input
  349. v-model="scope.row.width"
  350. placeholder="请输入列宽"
  351. clearable
  352. />
  353. </template>
  354. </el-table-column>
  355. <el-table-column
  356. prop="align"
  357. label="对齐方式"
  358. align="center"
  359. >
  360. <template slot-scope="scope">
  361. <el-select
  362. v-model="scope.row.align"
  363. class="bs-el-select"
  364. popper-class="bs-el-select"
  365. filterable
  366. clearable
  367. placeholder="请选择对齐方式"
  368. >
  369. <el-option
  370. value="left"
  371. label="左对齐"
  372. />
  373. <el-option
  374. value="center"
  375. label="居中"
  376. />
  377. <el-option
  378. value="right"
  379. label="右对齐"
  380. />
  381. </el-select>
  382. </template>
  383. </el-table-column>
  384. </el-table>
  385. </div>
  386. </div>
  387. <div
  388. v-if="config.option.displayOption.mapField && config.option.displayOption.mapField.enable"
  389. name="地图数据配置"
  390. >
  391. <template slot="title">
  392. <div class="lc-field-head">
  393. <div class="lc-field-title">
  394. 地图数据配置
  395. </div>
  396. </div>
  397. </template>
  398. <div class="lc-field-body">
  399. <el-form-item
  400. label="值"
  401. class="data-form-item"
  402. >
  403. <el-select
  404. v-model="config.customize.value"
  405. class="bs-el-select"
  406. popper-class="bs-el-select"
  407. filterable
  408. clearable
  409. >
  410. <el-option
  411. v-for="(field, index) in dataSourceDataList"
  412. :key="index"
  413. :label="field.comment"
  414. :value="field.name"
  415. >
  416. <div class="source-key-option">
  417. <div>
  418. {{ field.comment !== "" ? field.comment : field.name }}
  419. </div>
  420. <div class="option-txt">
  421. {{ field.name }}
  422. </div>
  423. </div>
  424. </el-option>
  425. </el-select>
  426. </el-form-item>
  427. <el-form-item
  428. label="地名字段"
  429. class="data-form-item"
  430. >
  431. <template slot="label">
  432. <span>
  433. 地名字段
  434. <el-tooltip
  435. class="item"
  436. effect="dark"
  437. content="色块模式下可用,地图将根据该属性值寻找对应的区域,并按照值字段进行色块渲染"
  438. placement="top"
  439. >
  440. <i class="el-icon-question" />
  441. </el-tooltip>
  442. </span>
  443. </template>
  444. <el-select
  445. v-model="config.customize.name"
  446. class="bs-el-select"
  447. popper-class="bs-el-select"
  448. filterable
  449. clearable
  450. >
  451. <el-option
  452. v-for="(field, index) in dataSourceDataList"
  453. :key="index"
  454. :label="field.comment"
  455. :value="field.name"
  456. >
  457. <div class="source-key-option">
  458. <div>
  459. {{ field.comment !== "" ? field.comment : field.name }}
  460. </div>
  461. <div class="option-txt">
  462. {{ field.name }}
  463. </div>
  464. </div>
  465. </el-option>
  466. </el-select>
  467. </el-form-item>
  468. <el-form-item
  469. label="经度字段"
  470. class="data-form-item"
  471. >
  472. <template slot="label">
  473. <span>
  474. 经度字段
  475. <el-tooltip
  476. class="item"
  477. effect="dark"
  478. content="打点模式下可用,地图将经纬度寻找指定坐标,并进行打点显示"
  479. placement="top"
  480. >
  481. <i class="el-icon-question" />
  482. </el-tooltip>
  483. </span>
  484. </template>
  485. <el-select
  486. v-model="config.customize.xaxis"
  487. class="bs-el-select"
  488. popper-class="bs-el-select"
  489. filterable
  490. clearable
  491. >
  492. <el-option
  493. v-for="(field, index) in dataSourceDataList"
  494. :key="index"
  495. :label="field.comment"
  496. :value="field.name"
  497. >
  498. <div class="source-key-option">
  499. <div>
  500. {{ field.comment !== "" ? field.comment : field.name }}
  501. </div>
  502. <div class="option-txt">
  503. {{ field.name }}
  504. </div>
  505. </div>
  506. </el-option>
  507. </el-select>
  508. </el-form-item>
  509. <el-form-item
  510. label="纬度字段"
  511. class="data-form-item"
  512. >
  513. <template slot="label">
  514. <span>
  515. 纬度字段
  516. <el-tooltip
  517. class="item"
  518. effect="dark"
  519. content="打点模式下可用,地图将经纬度寻找指定坐标,并进行打点显示"
  520. placement="top"
  521. >
  522. <i class="el-icon-question" />
  523. </el-tooltip>
  524. </span>
  525. </template>
  526. <el-select
  527. v-model="config.customize.yaxis"
  528. class="bs-el-select"
  529. popper-class="bs-el-select"
  530. filterable
  531. clearable
  532. >
  533. <el-option
  534. v-for="(field, index) in dataSourceDataList"
  535. :key="index"
  536. :label="field.comment"
  537. :value="field.name"
  538. >
  539. <div class="source-key-option">
  540. <div>
  541. {{ field.comment !== "" ? field.comment : field.name }}
  542. </div>
  543. <div class="option-txt">
  544. {{ field.name }}
  545. </div>
  546. </div>
  547. </el-option>
  548. </el-select>
  549. </el-form-item>
  550. </div>
  551. </div>
  552. <div
  553. v-if="config.option.displayOption.flyMapField && config.option.displayOption.flyMapField.enable"
  554. name="飞线地图数据配置"
  555. >
  556. <div class="lc-field-body">
  557. <el-form-item
  558. label="起点经度"
  559. class="data-form-item"
  560. >
  561. <el-select
  562. v-model="config.customize.dataField.fromLng"
  563. class="bs-el-select"
  564. popper-class="bs-el-select"
  565. filterable
  566. clearable
  567. >
  568. <el-option
  569. v-for="(field, index) in dataSourceDataList"
  570. :key="index"
  571. :label="field.comment"
  572. :value="field.name"
  573. >
  574. <div class="source-key-option">
  575. <div>
  576. {{ field.comment !== "" ? field.comment : field.name }}
  577. </div>
  578. <div class="option-txt">
  579. {{ field.name }}
  580. </div>
  581. </div>
  582. </el-option>
  583. </el-select>
  584. </el-form-item>
  585. <el-form-item
  586. label="起点纬度"
  587. class="data-form-item"
  588. >
  589. <el-select
  590. v-model="config.customize.dataField.fromLat"
  591. class="bs-el-select"
  592. popper-class="bs-el-select"
  593. filterable
  594. clearable
  595. >
  596. <el-option
  597. v-for="(field, index) in dataSourceDataList"
  598. :key="index"
  599. :label="field.comment"
  600. :value="field.name"
  601. >
  602. <div class="source-key-option">
  603. <div>
  604. {{ field.comment !== "" ? field.comment : field.name }}
  605. </div>
  606. <div class="option-txt">
  607. {{ field.name }}
  608. </div>
  609. </div>
  610. </el-option>
  611. </el-select>
  612. </el-form-item>
  613. <el-form-item
  614. label="终点经度"
  615. class="data-form-item"
  616. >
  617. <el-select
  618. v-model="config.customize.dataField.toLng"
  619. class="bs-el-select"
  620. popper-class="bs-el-select"
  621. filterable
  622. clearable
  623. >
  624. <el-option
  625. v-for="(field, index) in dataSourceDataList"
  626. :key="index"
  627. :label="field.comment"
  628. :value="field.name"
  629. >
  630. <div class="source-key-option">
  631. <div>
  632. {{ field.comment !== "" ? field.comment : field.name }}
  633. </div>
  634. <div class="option-txt">
  635. {{ field.name }}
  636. </div>
  637. </div>
  638. </el-option>
  639. </el-select>
  640. </el-form-item>
  641. <el-form-item
  642. label="终点纬度"
  643. class="data-form-item"
  644. >
  645. <el-select
  646. v-model="config.customize.dataField.toLat"
  647. class="bs-el-select"
  648. popper-class="bs-el-select"
  649. filterable
  650. clearable
  651. >
  652. <el-option
  653. v-for="(field, index) in dataSourceDataList"
  654. :key="index"
  655. :label="field.comment"
  656. :value="field.name"
  657. >
  658. <div class="source-key-option">
  659. <div>
  660. {{ field.comment !== "" ? field.comment : field.name }}
  661. </div>
  662. <div class="option-txt">
  663. {{ field.name }}
  664. </div>
  665. </div>
  666. </el-option>
  667. </el-select>
  668. </el-form-item>
  669. <el-form-item
  670. label="起点名称"
  671. class="data-form-item"
  672. >
  673. <el-select
  674. v-model="config.customize.dataField.fromName"
  675. class="bs-el-select"
  676. popper-class="bs-el-select"
  677. filterable
  678. clearable
  679. >
  680. <el-option
  681. v-for="(field, index) in dataSourceDataList"
  682. :key="index"
  683. :label="field.comment"
  684. :value="field.name"
  685. >
  686. <div class="source-key-option">
  687. <div>
  688. {{ field.comment !== "" ? field.comment : field.name }}
  689. </div>
  690. <div class="option-txt">
  691. {{ field.name }}
  692. </div>
  693. </div>
  694. </el-option>
  695. </el-select>
  696. </el-form-item>
  697. <el-form-item
  698. label="终点名称"
  699. class="data-form-item"
  700. >
  701. <el-select
  702. v-model="config.customize.dataField.toName"
  703. class="bs-el-select"
  704. popper-class="bs-el-select"
  705. filterable
  706. clearable
  707. >
  708. <el-option
  709. v-for="(field, index) in dataSourceDataList"
  710. :key="index"
  711. :label="field.comment"
  712. :value="field.name"
  713. >
  714. <div class="source-key-option">
  715. <div>
  716. {{ field.comment !== "" ? field.comment : field.name }}
  717. </div>
  718. <div class="option-txt">
  719. {{ field.name }}
  720. </div>
  721. </div>
  722. </el-option>
  723. </el-select>
  724. </el-form-item>
  725. <el-form-item
  726. label="值"
  727. class="data-form-item"
  728. >
  729. <el-select
  730. v-model="config.customize.dataField.value"
  731. class="bs-el-select"
  732. popper-class="bs-el-select"
  733. filterable
  734. clearable
  735. >
  736. <el-option
  737. v-for="(field, index) in dataSourceDataList"
  738. :key="index"
  739. :label="field.comment"
  740. :value="field.name"
  741. >
  742. <div class="source-key-option">
  743. <div>
  744. {{ field.comment !== "" ? field.comment : field.name }}
  745. </div>
  746. <div class="option-txt">
  747. {{ field.name }}
  748. </div>
  749. </div>
  750. </el-option>
  751. </el-select>
  752. </el-form-item>
  753. </div>
  754. </div>
  755. <div
  756. v-if="config.option.displayOption.params.enable &&(!['expression','static'].includes(config.dataSource.source))"
  757. class="data-setting-data-box"
  758. >
  759. <div class="lc-field-head">
  760. <div class="lc-field-title">
  761. 参数配置
  762. </div>
  763. </div>
  764. <div class="lc-field-body">
  765. <el-table
  766. ref="singleTable"
  767. :border="true"
  768. :data="params"
  769. class="params-config"
  770. >
  771. <el-table-column
  772. prop="name"
  773. label="参数名称"
  774. align="center"
  775. >
  776. <template slot-scope="scope">
  777. <div>
  778. <el-form-item>
  779. <el-input
  780. v-model="scope.row.name"
  781. placeholder="请输入名称"
  782. readonly
  783. />
  784. <el-tooltip
  785. :content="
  786. `${
  787. scope.row.type ? '参数类型:' + scope.row.type : ''
  788. }
  789. ${
  790. scope.row.remark ? '备注:' + scope.row.remark : ''
  791. }`
  792. "
  793. placement="top"
  794. >
  795. <span
  796. class="el-icon-question"
  797. style="color:#9e9e9e"
  798. />
  799. </el-tooltip>
  800. </el-form-item>
  801. </div>
  802. </template>
  803. </el-table-column>
  804. <el-table-column
  805. prop="value"
  806. label="参数值"
  807. align="center"
  808. >
  809. <template slot-scope="scope">
  810. <el-form-item
  811. :prop="scope.row.require === 1 ? 'params' : null"
  812. >
  813. <el-date-picker
  814. v-if="scope.row.type === 'Date'"
  815. v-model="scope.row.value"
  816. type="datetime"
  817. value-format="yyyy-MM-dd HH:mm:ss"
  818. placeholder="选择日期时间"
  819. />
  820. <el-input
  821. v-else
  822. v-model="scope.row.value"
  823. clearable
  824. placeholder="请输入参数值"
  825. />
  826. </el-form-item>
  827. </template>
  828. </el-table-column>
  829. </el-table>
  830. </div>
  831. </div>
  832. <!-- <div
  833. v-if="config.option.displayOption.serverPagination.enable"
  834. class="data-setting-data-box"
  835. name="分页配置"
  836. >
  837. <div class="lc-field-head">
  838. <div class="lc-field-title">
  839. 分页配置
  840. </div>
  841. </div>
  842. <div class="form">
  843. <el-form-item
  844. v-if="config.option.displayOption.serverPagination.enable"
  845. label="服务端分页"
  846. prop="dataSource.serverPagination"
  847. >
  848. <el-radio-group
  849. v-model="config.dataSource.serverPagination"
  850. class="bs-el-radio-group"
  851. size="mini"
  852. @change="serverPaginationChange"
  853. >
  854. <el-radio-button :label="true">
  855. 开启
  856. </el-radio-button>
  857. <el-radio-button :label="false">
  858. 关闭
  859. </el-radio-button>
  860. </el-radio-group>
  861. </el-form-item>
  862. <el-form-item
  863. v-if="
  864. config.dataSource.serverPagination &&
  865. config.option.displayOption.pageSize.enable
  866. "
  867. label="分页长度"
  868. prop="dataSource.pageSize"
  869. >
  870. <el-select
  871. v-model="config.dataSource.pageSize"
  872. class="bs-el-select"
  873. popper-class="bs-el-select"
  874. filterable
  875. allow-create
  876. default-first-option
  877. >
  878. <el-option
  879. v-for="size in pageSizeList"
  880. :key="size"
  881. :label="size"
  882. :value="size"
  883. />
  884. </el-select>
  885. </el-form-item>
  886. </div>
  887. </div> -->
  888. <ComponentBinding
  889. v-if="['button'].includes(config.type)"
  890. :config="config"
  891. :source-field-list="sourceFieldList"
  892. />
  893. <ComponentRelation
  894. v-if="!['carousel','gauge','liquid','marquee'].includes(config.type)"
  895. :config="config"
  896. :source-field-list="sourceFieldList"
  897. />
  898. <expression-dialog
  899. ref="expressionDialog"
  900. :config="config"
  901. />
  902. </div>
  903. </el-form>
  904. </div>
  905. </template>
  906. <script>
  907. import ElDragSelect from './ElDragSelect.vue'
  908. // import { isEmpty, cloneDeep } from 'lodash'
  909. import isEmpty from 'lodash/isEmpty'
  910. import cloneDeep from 'lodash/cloneDeep'
  911. import ComponentRelation from 'data-room-ui/BigScreenDesign/RightSetting/ComponentRelation/index.vue'
  912. import ComponentBinding from 'data-room-ui/BigScreenDesign/RightSetting/ComponentBinding/index.vue'
  913. import dataSetSelect from 'data-room-ui/DataSetSetting/index.vue'
  914. import { mapState } from 'vuex'
  915. import { getDataSetDetails } from 'data-room-ui/js/api/bigScreenApi'
  916. import ExpressionDialog from 'data-room-ui/BigScreenDesign/RightSetting/ExpressionDialog.vue'
  917. export default {
  918. name: 'DataSetting',
  919. components: {
  920. ComponentRelation,
  921. ComponentBinding,
  922. dataSetSelect,
  923. ElDragSelect,
  924. ExpressionDialog
  925. },
  926. data () {
  927. return {
  928. fieldNameMapping: [ // k线图的字段列表
  929. {
  930. name: 'xField',
  931. desc: 'X轴',
  932. multiple: false
  933. },
  934. {
  935. name: 'openField',
  936. desc: '开盘价',
  937. multiple: false
  938. },
  939. {
  940. name: 'closeField',
  941. desc: '收盘价',
  942. multiple: false
  943. },
  944. {
  945. name: 'lowField',
  946. desc: '最低价',
  947. multiple: false
  948. },
  949. {
  950. name: 'highField',
  951. desc: '最高价',
  952. multiple: false
  953. }
  954. ],
  955. fieldsList: [],
  956. params: [], // 参数配置
  957. datasetName: '',
  958. headerList: [],
  959. pageSizeList: [10, 20, 50, 100],
  960. rules: {
  961. // 'dataSource.businessKey': [
  962. // { required: true, message: '请选择数据集', trigger: 'change' }
  963. // ],
  964. // 'dataSource.dimensionField': [
  965. // { required: true, message: '请选择维度', trigger: 'change' }
  966. // ],
  967. // 'dataSource.dimensionFieldList': [
  968. // { required: true, message: '请选择维度', trigger: 'change' }
  969. // ],
  970. // 'dataSource.metricField': [
  971. // { required: true, message: '请选择指标', trigger: 'change' }
  972. // ],
  973. params: [
  974. {
  975. validator: (rule, value, callback) => {
  976. if (!value) {
  977. this.params.map(sort => {
  978. if (!sort.value) {
  979. callback(new Error('请输入参数值'))
  980. } else {
  981. callback()
  982. }
  983. })
  984. } else {
  985. callback()
  986. }
  987. }
  988. }
  989. ]
  990. }
  991. }
  992. },
  993. computed: {
  994. ...mapState({
  995. pageInfo: state => state.bigScreen.pageInfo,
  996. config: state => state.bigScreen.activeItemConfig
  997. // 缓存数据集
  998. // cacheDataSets: state => state.bigScreen.pageInfo.pageConfig.cacheDataSets
  999. }),
  1000. dataSourceDataList () {
  1001. return this.fieldsList?.map(item => ({
  1002. ...item,
  1003. comment: item?.fieldDesc || item?.fieldName,
  1004. name: item?.fieldName
  1005. }))
  1006. },
  1007. appCode: {
  1008. get () {
  1009. return this.$store.state.bigScreen.pageInfo.appCode
  1010. }
  1011. },
  1012. seriesFieldProp () {
  1013. if (this.config.option.displayOption.seriesField.required) {
  1014. return 'dataSource.seriesField'
  1015. } else {
  1016. return ''
  1017. }
  1018. },
  1019. pageCode () {
  1020. return this.$route.query.code
  1021. },
  1022. // 映射字段
  1023. sourceFieldList () {
  1024. const list = this?.config?.customize?.bindComponents || this.fieldsList
  1025. const modifiedList = list?.map(field => ({
  1026. label: field.comment || field.fieldDesc,
  1027. value: field.name || field.fieldName
  1028. })) || []
  1029. if (['input', 'timePicker', 'dateTimePicker'].includes(this.config.type)) {
  1030. modifiedList.push({ label: '当前组件值', value: this.config.code })
  1031. }
  1032. if (['map', 'flyMap'].includes(this.config.type)) {
  1033. modifiedList.push({ label: '点击区域名称', value: 'clickAreaName' })
  1034. }
  1035. return modifiedList
  1036. }
  1037. },
  1038. watch: {
  1039. // 切换数据集时将其他配置清空
  1040. 'config.dataSource.businessKey' (val) {
  1041. this.clearCustomVerify()
  1042. this.clearVerify()
  1043. },
  1044. // 切换数据集类型时将其他配置清空
  1045. 'config.dataSource.dataSetType' () {
  1046. this.config.dataSource.businessKey = ''
  1047. this.clearCustomVerify()
  1048. this.clearVerify()
  1049. },
  1050. // 参数改变时
  1051. params: {
  1052. handler (val) {
  1053. if (!isEmpty(val)) {
  1054. const params = cloneDeep(val)
  1055. const paramsMap = params.reduce((obj, param) => {
  1056. obj[param.name] = param.value
  1057. return obj
  1058. }, {})
  1059. this.config.dataSource.params = paramsMap
  1060. }
  1061. },
  1062. deep: true
  1063. },
  1064. 'config.dataSource.dimensionField' (val) {
  1065. if (['select'].includes(this.config.type)) {
  1066. if (this.config.customize?.placeholder) {
  1067. this.config.customize.placeholder = '请选择' + this.dataSourceDataList.find(item => item.fieldName === val).comment
  1068. }
  1069. }
  1070. }
  1071. },
  1072. mounted () {
  1073. if (this.config.dataSource && this.config.dataSource.businessKey) {
  1074. this.getDataSetDetailsById(this.config.dataSource.businessKey, 'initial')
  1075. }
  1076. // TODO 临时解决方案,解决旧版飞线地图配置缺少字段问题
  1077. if (this.config.option.displayOption.flyMapField && this.config.option.displayOption.flyMapField.enable) {
  1078. if (!this.config.customize.dataField) {
  1079. this.config.customize.dataField = {
  1080. // 起点名称
  1081. fromName: '',
  1082. // 起点经度
  1083. fromLng: '',
  1084. // 起点纬度
  1085. fromLat: '',
  1086. // 终点名称
  1087. toName: '',
  1088. // 终点经度
  1089. toLng: '',
  1090. // 终点纬度
  1091. toLat: '',
  1092. // 轨迹数据
  1093. value: ''
  1094. }
  1095. }
  1096. }
  1097. },
  1098. methods: {
  1099. // 切换数据源的时候将文字和数字组件的相关配置清空
  1100. sourceChange (val) {
  1101. this.config.expression = 'return '
  1102. this.config.expressionCodes = []
  1103. },
  1104. changeDsid (dsId) {
  1105. this.clearVerify()
  1106. if (this.config.customize && this.config.customize.columnConfig) {
  1107. this.config.customize.columnConfig = []
  1108. }
  1109. this.getDataSetDetailsById(dsId, 'treeTable')
  1110. },
  1111. // 打开表达式弹窗
  1112. openExpression () {
  1113. this.$refs.expressionDialog.init()
  1114. },
  1115. // 切换前后端分页
  1116. serverPaginationChange (val) {
  1117. this.config.customize.webPagination = !val
  1118. },
  1119. // 清空自定义组件配置,与手动配置的组件区分开
  1120. clearCustomVerify () {
  1121. this.config.setting = this.config.setting?.map(set => {
  1122. this.datasetName = ''
  1123. if (set.tabName === 'data') {
  1124. set.value = ''
  1125. }
  1126. return set
  1127. })
  1128. },
  1129. // 清空手动配置的组件配置
  1130. clearVerify () {
  1131. this.config.dataSource.metricField = ''
  1132. this.config.dataSource.dimensionField = ''
  1133. this.config.dataSource.dimensionFieldList = []
  1134. this.config.dataSource.seriesField = ''
  1135. this.config.dataSource.params = {}
  1136. },
  1137. // 根据数据集来获取数据集详情
  1138. getDataSetDetailsById (id, type) {
  1139. if (id) {
  1140. this.config.dataSource.businessKey = id
  1141. getDataSetDetails(id).then(res => {
  1142. this.fieldsList = res.fields
  1143. // 初始化时以组件本来的参数设置为主
  1144. if (type === 'initial') {
  1145. const deleteKeys = []
  1146. for (const key in this.config.dataSource.params) {
  1147. const param = res?.params?.find(field => field.name === key)
  1148. // 如果组件参数在数据集中找不到,说明参数已经被删除,不需要再显示
  1149. if (param) {
  1150. deleteKeys.push(key)
  1151. this.params.push({
  1152. name: key,
  1153. value: this.config.dataSource.params[key],
  1154. type: param?.type,
  1155. remark: param?.remark
  1156. })
  1157. }
  1158. }
  1159. if (res.params) {
  1160. // 如果数据集中有新增的参数,需要显示出来
  1161. res.params.forEach(param => {
  1162. if (!this.params.find(item => item.name === param.name)) {
  1163. this.params.push({
  1164. name: param.name,
  1165. value: param.value,
  1166. type: param.type,
  1167. remark: param.remark
  1168. })
  1169. }
  1170. })
  1171. }
  1172. deleteKeys.forEach(key => {
  1173. delete this.config.dataSource.params[key]
  1174. })
  1175. } else {
  1176. this.params = res.params
  1177. }
  1178. this.datasetName = res.name
  1179. // 选择数据集的时候,如果数据集类型是dataModel,则不显示参数配置
  1180. this.config.option.displayOption.params.enable = res.type !== 'dataModel'
  1181. // 根据数据集初始化组件的入参:inparams
  1182. if (res.type !== 'dataModel') {
  1183. this.config.inParams =
  1184. this.params?.map(param => {
  1185. return {
  1186. name: param.remark, // 参数名
  1187. code: param.name // 参数值
  1188. }
  1189. }) || []
  1190. } else {
  1191. this.config.inParams =
  1192. this.fieldsList?.map(field => {
  1193. return {
  1194. name: field.fieldDesc, // 参数名
  1195. code: field.fieldName // 参数值
  1196. }
  1197. }) || []
  1198. }
  1199. // 根据数据集的参数初始化表单项
  1200. this.config.paramsList = this.params
  1201. if (type === 'treeTable') {
  1202. const enumeration = {
  1203. dataSetType: '1', // 数据集类型
  1204. dataSetKey: '', // 数据集
  1205. itemKeyName: '', // 选项显示字段
  1206. itemValueName: '', // 选项value字段
  1207. params: []
  1208. }
  1209. this.config.fields =
  1210. this.params?.map(param => {
  1211. return {
  1212. name: param.name,
  1213. label: param.remark || param.name,
  1214. component: 'input',
  1215. display: res.type !== 'dataModel',
  1216. enumeration: {
  1217. ...enumeration
  1218. },
  1219. queryRule: 'like'
  1220. }
  1221. }) || []
  1222. }
  1223. })
  1224. }
  1225. },
  1226. // 改变维度
  1227. dimensionFieldListChange (list) {
  1228. const colFieldList = []
  1229. if (list.length > 0) {
  1230. list.forEach(item => {
  1231. colFieldList.push(
  1232. this.dataSourceDataList.find(field => field.name === item)
  1233. )
  1234. })
  1235. }
  1236. this.headerList = []
  1237. colFieldList.forEach(item => {
  1238. this.headerList.push({ name: item.comment, code: item.name, width: '150', align: 'left' })
  1239. })
  1240. this.config.customize.columnConfig = cloneDeep(this.headerList)
  1241. this.$store.commit('bigScreen/changeActiveItemConfig', this.config)
  1242. },
  1243. valuePositionChange (value) {
  1244. const sortedColumnData = {}
  1245. const columnData = cloneDeep(this.config.option?.columnData)
  1246. value.forEach((item, index) => {
  1247. sortedColumnData[item] = columnData[item]
  1248. })
  1249. this.config.option.columnData = sortedColumnData
  1250. this.$store.commit('bigScreen/changeActiveItemConfig', this.config)
  1251. },
  1252. changeCustomProps (value, setting) {
  1253. this.config.setting = this.config.setting.map(item => {
  1254. if (item.field === setting.field) {
  1255. item.value = value
  1256. }
  1257. return item
  1258. })
  1259. }
  1260. // 改变缓存数据集key
  1261. // changeCacheBusinessKey (id) {
  1262. // // 根据id在缓存中获取fields
  1263. // this.fieldsList = this.cacheDataSets?.find(cache => cache.dataSetId === id)?.fields
  1264. // this.params = this.cacheDataSets?.find(cache => cache.dataSetId === id)?.params
  1265. // }
  1266. }
  1267. }
  1268. </script>
  1269. <style lang="scss" scoped>
  1270. @import "../../assets/style/settingWrap.scss";
  1271. .add-filter-box {
  1272. position: relative;
  1273. .add-filter {
  1274. margin-left: 100px;
  1275. }
  1276. .add-filter-btn {
  1277. position: absolute;
  1278. top: 0;
  1279. }
  1280. }
  1281. .form {
  1282. padding: 12px;
  1283. }
  1284. ::v-deep .el-tag__close.el-icon-close::before {
  1285. color: #fff;
  1286. }
  1287. ::v-deep .el-tag__close.el-icon-close {
  1288. top: -1px;
  1289. &:hover {
  1290. background-color:var(--bs-el-color-primary);
  1291. }
  1292. }
  1293. .opt-wrap{
  1294. margin-top: 10px;
  1295. }
  1296. .link-set-item {
  1297. position: relative;
  1298. border: 1px solid #f5f7fa;
  1299. padding: 30px 16px 10px;
  1300. box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
  1301. margin: 10px;
  1302. .del-icon {
  1303. cursor: pointer;
  1304. position: absolute;
  1305. right: 10px;
  1306. top: 5px;
  1307. font-size: 20px;
  1308. color: #f00;
  1309. }
  1310. .opt-wrap {
  1311. display: flex;
  1312. justify-content: center;
  1313. }
  1314. }
  1315. //表达式样式
  1316. .expression{
  1317. &:hover{
  1318. cursor: pointer;
  1319. }
  1320. }
  1321. // 修改设置面板样式
  1322. .data-setting-box{
  1323. .data-setting-data-box{
  1324. .lc-field-head{
  1325. height: 30px;
  1326. .lc-field-title{
  1327. position: relative;
  1328. padding-left: 12px;
  1329. line-height: 30px;
  1330. height: 30px;
  1331. &:after{
  1332. position: absolute;
  1333. left: 0;
  1334. top: 50%;
  1335. transform: translateY(-50%);
  1336. content: '';
  1337. width: 4px;
  1338. height: 14px;
  1339. background-color: var(--bs-el-color-primary);
  1340. }
  1341. }
  1342. }
  1343. }
  1344. }
  1345. </style>