OptionsEdit.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. <template>
  2. <div class="option-edit-wrap">
  3. <el-button
  4. type="info"
  5. size="small"
  6. icon="el-icon-edit"
  7. @click="editHandler(0)"
  8. v-if="selectItem.type == 'select'"
  9. >
  10. </el-button>
  11. <div class="btn-list" v-else>
  12. <el-button
  13. type="primary"
  14. size="small"
  15. icon="el-icon-plus"
  16. @click="addHandler"
  17. circle
  18. >
  19. </el-button>
  20. <el-button
  21. v-for="(btnData, index) in btnList"
  22. :key="index"
  23. type="info"
  24. size="small"
  25. icon="el-icon-edit"
  26. @click="editHandler(index)"
  27. >第{{ index + 1 }}级选项
  28. </el-button>
  29. <el-button
  30. circle
  31. type="danger"
  32. size="small"
  33. icon="el-icon-minus"
  34. @click="minusHandler"
  35. >
  36. </el-button>
  37. </div>
  38. <!-- 按钮 -->
  39. <el-dialog
  40. title="设置下拉选项数据"
  41. :visible.sync="isShow"
  42. width="50%"
  43. :before-close="cancleHandler"
  44. >
  45. <el-form
  46. ref="formDataRef"
  47. :model="formData"
  48. :rules="rules"
  49. label-width="140px"
  50. >
  51. <el-row type="flex" style="flex-wrap: wrap">
  52. <!-- <el-col :span="12">
  53. <el-form-item label="选项数据名" prop="dynamicName">
  54. <el-input
  55. v-model="formData.dynamicName"
  56. placeholder="请输入动态数据名"
  57. size="normal"
  58. ></el-input>
  59. </el-form-item>
  60. </el-col> -->
  61. <el-col :span="12">
  62. <el-form-item label="表名" prop="tableName">
  63. <el-select
  64. class="mr10"
  65. v-model="formData.tableName"
  66. placeholder="请选择表名"
  67. clearable
  68. filterable
  69. @change="
  70. (value) => {
  71. getFieldOptions(value);
  72. }
  73. "
  74. >
  75. <el-option
  76. v-for="item in tableList"
  77. :key="item.tableName"
  78. :label="item.tableComment"
  79. :value="item.tableName"
  80. >
  81. <span style="float: left">{{ item.tableComment }}</span>
  82. <span style="float: right; color: #8492a6; font-size: 13px">{{
  83. item.tableName
  84. }}</span>
  85. </el-option>
  86. </el-select>
  87. </el-form-item>
  88. </el-col>
  89. <el-col :span="12">
  90. <el-form-item label="描述字段(label)" prop="optLabelData">
  91. <el-select
  92. v-model="formData.optLabelData"
  93. placeholder="请选择字段"
  94. clearable
  95. filterable
  96. >
  97. <el-option
  98. v-for="item in fieldList"
  99. :key="item.fieldName"
  100. :label="item.fieldDescription"
  101. :value="item.fieldName"
  102. >
  103. <span style="float: left">{{ item.fieldDescription }}</span>
  104. <span style="float: right; color: #8492a6; font-size: 13px">{{
  105. item.fieldName
  106. }}</span>
  107. </el-option>
  108. </el-select>
  109. </el-form-item>
  110. </el-col>
  111. <el-col :span="12">
  112. <el-form-item label="值字段(value)" prop="optValueData">
  113. <el-select
  114. v-model="formData.optValueData"
  115. placeholder="请选择字段"
  116. clearable
  117. filterable
  118. >
  119. <el-option
  120. v-for="item in fieldList"
  121. :key="item.fieldName"
  122. :label="item.fieldDescription"
  123. :value="item.fieldName"
  124. >
  125. <span style="float: left">{{ item.fieldDescription }}</span>
  126. <span style="float: right; color: #8492a6; font-size: 13px">{{
  127. item.fieldName
  128. }}</span>
  129. </el-option>
  130. </el-select>
  131. </el-form-item>
  132. </el-col>
  133. <el-col :span="24">
  134. <div class="filter-table-wrap">
  135. <span class="title">添加数据过滤条件</span>
  136. <el-table :data="filterTableData" style="width: 100%">
  137. <el-table-column label="序号" type="index" width="50">
  138. </el-table-column>
  139. <!-- <el-table-column prop="tableName" label="表名" width="150">
  140. <template slot-scope="scope">
  141. <el-select
  142. v-model="scope.row.tableName"
  143. @change="
  144. (value) => {
  145. getFieldOptions(value, scope.row);
  146. }
  147. "
  148. placeholder="请选择"
  149. >
  150. <el-option
  151. v-for="item in tableList"
  152. :key="item.tableName"
  153. :label="item.tableComment"
  154. :value="item.tableName"
  155. >
  156. <span style="float: left">{{ item.tableComment }}</span>
  157. <span
  158. style="float: right; color: #8492a6; font-size: 13px"
  159. >{{ item.tableName }}</span
  160. >
  161. </el-option>
  162. </el-select>
  163. </template>
  164. </el-table-column> -->
  165. <el-table-column prop="fieldName" label="字段名" width="150">
  166. <template slot-scope="scope">
  167. <el-select
  168. v-model="scope.row.fieldName"
  169. placeholder="请选择"
  170. >
  171. <el-option
  172. v-for="item in fieldList"
  173. :key="item.fieldName"
  174. :label="item.fieldDescription"
  175. :value="item.fieldName"
  176. >
  177. <span style="float: left">{{
  178. item.fieldDescription
  179. }}</span>
  180. <span
  181. style="float: right; color: #8492a6; font-size: 13px"
  182. >{{ item.fieldName }}</span
  183. >
  184. </el-option>
  185. </el-select>
  186. </template>
  187. </el-table-column>
  188. <el-table-column prop="flagValue" label="参照值" width="100">
  189. <template slot-scope="scope">
  190. <el-button
  191. type="info"
  192. size="small"
  193. icon="el-icon-edit"
  194. @click="editFlagHandler(scope.row, scope.$index)"
  195. >
  196. </el-button>
  197. </template>
  198. </el-table-column>
  199. <el-table-column label="操作">
  200. <template slot-scope="scope">
  201. <el-button
  202. size="mini"
  203. type="danger"
  204. icon="el-icon-delete"
  205. @click="deleteFilterItem(scope.$index)"
  206. >删除
  207. </el-button>
  208. </template>
  209. </el-table-column>
  210. </el-table>
  211. <el-button
  212. type="primary"
  213. class="inline-large-button mb10"
  214. icon="el-icon-plus"
  215. size="mini"
  216. style="width: 100%"
  217. @click="addFilterHandler"
  218. >
  219. 添加条件
  220. </el-button>
  221. </div>
  222. </el-col>
  223. </el-row>
  224. </el-form>
  225. <template #footer>
  226. <span>
  227. <el-button @click="cancleHandler">取消</el-button>
  228. <el-button type="primary" @click="conformHandler">确认</el-button>
  229. </span>
  230. </template>
  231. </el-dialog>
  232. <el-dialog title="编辑参照值" :visible.sync="flagShow" width="30%">
  233. <!-- :rules="rules" -->
  234. <el-form
  235. :model="flagFormData"
  236. ref="flagFormDataRef"
  237. label-width="100px"
  238. :rules="flagRules"
  239. :inline="false"
  240. size="normal"
  241. >
  242. <el-form-item label="参照类型">
  243. <el-select
  244. v-model="flagFormData.flagType"
  245. placeholder="请选择参照类型"
  246. filterable
  247. >
  248. <el-option
  249. v-for="item in flagTypeList"
  250. :key="item.value"
  251. :label="item.label"
  252. :value="item.value"
  253. >
  254. </el-option>
  255. </el-select>
  256. </el-form-item>
  257. <el-form-item
  258. prop="flagValue"
  259. v-show="flagFormData.flagType == 0"
  260. label="自定义值"
  261. >
  262. <el-input v-model="flagFormData.flagValue"></el-input>
  263. </el-form-item>
  264. <el-form-item
  265. prop="tableField"
  266. v-show="flagFormData.flagType == 1"
  267. label="关联表格字段"
  268. >
  269. <el-select
  270. class="mr10"
  271. v-model="flagFormData.tableField.tableName"
  272. placeholder="请选择表名"
  273. clearable
  274. filterable
  275. @change="
  276. (value) => {
  277. getFieldOptions(value, flagFormData.tableField);
  278. }
  279. "
  280. >
  281. <el-option
  282. v-for="item in tableList"
  283. :key="item.tableName"
  284. :label="item.tableComment"
  285. :value="item.tableName"
  286. >
  287. <span style="float: left">{{ item.tableComment }}</span>
  288. <span style="float: right; color: #8492a6; font-size: 13px">{{
  289. item.tableName
  290. }}</span>
  291. </el-option>
  292. </el-select>
  293. <el-select
  294. v-model="flagFormData.tableField.fieldName"
  295. placeholder="请选择字段"
  296. clearable
  297. filterable
  298. >
  299. <el-option
  300. v-for="item in flagFormData.tableField.fieldOptions"
  301. :key="item.fieldName"
  302. :label="item.fieldDescription"
  303. :value="item.fieldName"
  304. >
  305. <span style="float: left">{{ item.fieldDescription }}</span>
  306. <span style="float: right; color: #8492a6; font-size: 13px">{{
  307. item.fieldName
  308. }}</span>
  309. </el-option>
  310. </el-select>
  311. </el-form-item>
  312. <el-form-item
  313. v-show="flagFormData.flagType == 2"
  314. label="固定值"
  315. size="normal"
  316. >
  317. <el-select
  318. v-model="flagFormData.flagValue"
  319. placeholder="请选择固定值"
  320. filterable
  321. >
  322. <el-option
  323. v-for="item in constFlagList"
  324. :key="item.value"
  325. :label="item.label"
  326. :value="item.value"
  327. >
  328. </el-option>
  329. </el-select>
  330. </el-form-item>
  331. </el-form>
  332. <template #footer>
  333. <span>
  334. <el-button @click="flagShow = false">取消</el-button>
  335. <el-button type="primary" @click="flagConfirm">确认</el-button>
  336. </span>
  337. </template>
  338. </el-dialog>
  339. </div>
  340. </template>
  341. <script>
  342. import { getFormName, getListName } from "@/api/dragform/form.js";
  343. import { mapState } from "vuex";
  344. import getOptionsSqlString from "@/utils/sqlString";
  345. export default {
  346. name: "OptionsEdit",
  347. props: ["options", "selectItem", "dynamicKey"],
  348. components: {},
  349. data() {
  350. return {
  351. relateOptionShow: false,
  352. isShow: false,
  353. flagShow: false,
  354. flagEditIndex: "",
  355. formData: {
  356. dynamicName: "", //英文字符串
  357. tableName: "",
  358. optLabelData: "",
  359. optValueData: "",
  360. },
  361. filterTableData: [
  362. {
  363. fieldName: "",
  364. flagValue: "",
  365. fieldOptions: [],
  366. flagFormData: {
  367. flagType: 0,
  368. tableField: {
  369. tableName: "",
  370. fieldName: "",
  371. fieldOptions: [],
  372. },
  373. flagValue: "",
  374. },
  375. },
  376. ],
  377. flagFormData: {
  378. flagType: 0,
  379. tableField: {
  380. tableName: "",
  381. fieldName: "",
  382. fieldOptions: [],
  383. },
  384. flagValue: "",
  385. },
  386. flagTypeList: [
  387. {
  388. value: 0,
  389. label: "自定义",
  390. },
  391. // {
  392. // value: 1,
  393. // label: "关联其他字段",
  394. // },
  395. {
  396. value: 2,
  397. label: "固定值",
  398. },
  399. ],
  400. tableList: [],
  401. fieldList: [],
  402. rules: {
  403. tableName: [
  404. { required: true, message: "请选择表格名称", trigger: "change" },
  405. ],
  406. optLabelData: [
  407. { required: true, message: "请选择描述字段", trigger: "change" },
  408. ],
  409. optValueData: [
  410. { required: true, message: "请选择值字段", trigger: "change" },
  411. ],
  412. },
  413. flagRules: {
  414. flagType: [
  415. { required: true, message: "请选择参照值类型", trigger: "change" },
  416. ],
  417. },
  418. constFlagList: [
  419. {
  420. value: "#{USERID}",
  421. label: "当前用户相关数据",
  422. },
  423. ],
  424. //树形数据
  425. btnList: [
  426. // {
  427. // sql: "",
  428. // echoData: "",
  429. // },
  430. ],
  431. editIndex: "", //当前编辑层级
  432. };
  433. },
  434. watch: {
  435. myDynamicKey: {
  436. handler(nval) {
  437. this.formData.dynamicName = nval;
  438. console.log(this.formData.dynamicName);
  439. },
  440. deep: true,
  441. },
  442. },
  443. computed: {
  444. ...mapState({
  445. databaseName: (state) => state.user.dataSource.databaseName,
  446. databaseType: (state) => state.user.dataSource.databaseType,
  447. }),
  448. domType() {
  449. return this.selectItem.type; //select treeSelect cascader
  450. },
  451. myDynamicKey() {
  452. return this.dynamicKey;
  453. },
  454. },
  455. methods: {
  456. // 添加一级回调
  457. addHandler() {
  458. this.btnList.push({
  459. sql: "",
  460. echoData: "",
  461. });
  462. },
  463. minusHandler() {
  464. this.btnList.pop();
  465. },
  466. // 重置条件表单数据
  467. resetFlagFormData() {
  468. Object.assign(this.flagFormData, {
  469. flagType: 0,
  470. tableField: {
  471. tableName: "",
  472. fieldName: "",
  473. fieldOptions: [],
  474. },
  475. flagValue: "",
  476. });
  477. },
  478. // 开始编辑回调
  479. async editHandler(editIndex) {
  480. await this.getAllTable();
  481. // if (this.domType == "select") {
  482. // this.isShow = true;
  483. // } else {
  484. // this.relateOptionShow = true;
  485. // }
  486. this.editIndex = editIndex;
  487. let currentItem = this.btnList[editIndex];
  488. if (currentItem?.echoData) {
  489. let { formData, filterTableData, flagFormData } = JSON.parse(
  490. currentItem.echoData
  491. );
  492. this.filterTableData = filterTableData;
  493. this.formData = formData;
  494. // this.flagFormData = flagFormData;
  495. } else {
  496. this.btnList[editIndex] = {
  497. sql: "",
  498. echoData: "",
  499. };
  500. }
  501. this.isShow = true;
  502. },
  503. // 弹窗取消回调
  504. cancleHandler() {
  505. this.isShow = false;
  506. },
  507. // 弹窗确认回调
  508. conformHandler() {
  509. console.log(this.formData, this.filterTableData);
  510. let sql = getOptionsSqlString(this.formData, this.filterTableData);
  511. // let sqlData = {};
  512. // sqlData[this.formData.dynamicName] = sql;
  513. let echoData = {
  514. formData: {},
  515. filterTableData: [],
  516. // flagFormData: {},
  517. };
  518. Object.assign(echoData.formData, this.formData);
  519. Object.assign(echoData.filterTableData, this.filterTableData);
  520. // Object.assign(echoData.flagFormData, this.flagFormData);
  521. echoData.filterTableData.forEach((item) => {
  522. delete item.flagFormData.tableField.fieldOptions;
  523. });
  524. this.btnList[this.editIndex].sql = sql;
  525. this.btnList[this.editIndex].echoData = JSON.stringify(echoData);
  526. let sqlData = {};
  527. sqlData.dynamicName = this.formData.dynamicName;
  528. sqlData.sqls = this.btnList.map((item) => item.sql);
  529. sqlData.echoDatas = this.btnList.map((item) => item.echoData);
  530. this.$emit("setDynamicKey", sqlData);
  531. console.log(sql);
  532. this.isShow = false;
  533. },
  534. // 获取所有表格
  535. async getAllTable() {
  536. let data = {
  537. databaseName: this.databaseName,
  538. databaseType: this.databaseType,
  539. };
  540. let res = await getFormName(data);
  541. this.tableList = res.data;
  542. },
  543. async getFieldOptions(value, tempData) {
  544. let data = {
  545. databaseName: this.databaseName,
  546. databaseType: this.databaseType,
  547. tableName: value,
  548. };
  549. try {
  550. let res = await getListName(data);
  551. if (tempData) {
  552. tempData.fieldOptions = res;
  553. } else {
  554. this.fieldList = res;
  555. }
  556. } catch (error) {
  557. this.$message.error("网络异常,请稍后再试");
  558. }
  559. },
  560. // 删除一条筛选条件
  561. deleteFilterItem(index) {
  562. this.filterTableData.splice(index, 1);
  563. },
  564. // 新增一条筛选条件
  565. addFilterHandler() {
  566. this.filterTableData.push({
  567. // tableName: "",
  568. fieldName: "",
  569. flagValue: "",
  570. fieldOptions: [],
  571. flagFormData: {
  572. flagType: 0,
  573. tableField: {
  574. tableName: "",
  575. fieldName: "",
  576. fieldOptions: [],
  577. },
  578. flagValue: "",
  579. },
  580. });
  581. },
  582. // 编辑参照回调
  583. editFlagHandler(row, index) {
  584. this.flagEditIndex = index;
  585. this.flagFormData = JSON.parse(JSON.stringify(row.flagFormData));
  586. this.flagShow = true;
  587. },
  588. // 确认参照回调
  589. flagConfirm() {
  590. this.filterTableData[this.flagEditIndex].flagFormData = JSON.parse(
  591. JSON.stringify(this.flagFormData)
  592. );
  593. this.flagShow = false;
  594. },
  595. },
  596. async mounted() {
  597. console.log(this.options, this.selectItem);
  598. if (this.selectItem.options.sqlData) {
  599. this.btnList = this.selectItem.options.sqlData.echoDatas.map((item) => {
  600. return {
  601. sql: "",
  602. echoData: item,
  603. };
  604. });
  605. console.log(this.btnList);
  606. }
  607. },
  608. };
  609. </script>
  610. <style scoped lang="scss">
  611. .filter-table-wrap {
  612. display: flex;
  613. flex-direction: column;
  614. align-items: center;
  615. }
  616. .btn-list {
  617. display: flex;
  618. flex-wrap: wrap;
  619. }
  620. </style>