DataSetting.vue 41 KB

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