DataSetting.vue 42 KB

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