DataSetting.vue 45 KB

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