OptionsEdit.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
  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. filterable
  170. clearable
  171. placeholder="请选择"
  172. >
  173. <el-option
  174. v-for="item in fieldList"
  175. :key="item.fieldName"
  176. :label="item.fieldDescription"
  177. :value="item.fieldName"
  178. >
  179. <span style="float: left">{{
  180. item.fieldDescription
  181. }}</span>
  182. <span
  183. style="float: right; color: #8492a6; font-size: 13px"
  184. >{{ item.fieldName }}</span
  185. >
  186. </el-option>
  187. </el-select>
  188. </template>
  189. </el-table-column>
  190. <el-table-column prop="flagValue" label="参照值" width="100">
  191. <template slot-scope="scope">
  192. <el-button
  193. type="info"
  194. size="small"
  195. icon="el-icon-edit"
  196. @click="editFlagHandler(scope.row, scope.$index)"
  197. >
  198. </el-button>
  199. </template>
  200. </el-table-column>
  201. <el-table-column label="操作">
  202. <template slot-scope="scope">
  203. <el-button
  204. size="mini"
  205. type="danger"
  206. icon="el-icon-delete"
  207. @click="deleteFilterItem(scope.$index)"
  208. >删除
  209. </el-button>
  210. </template>
  211. </el-table-column>
  212. </el-table>
  213. <el-button
  214. type="primary"
  215. class="inline-large-button mb10"
  216. icon="el-icon-plus"
  217. size="mini"
  218. style="width: 100%"
  219. @click="addFilterHandler"
  220. >
  221. 添加条件
  222. </el-button>
  223. </div>
  224. </el-col>
  225. </el-row>
  226. </el-form>
  227. <template #footer>
  228. <span>
  229. <el-button @click="cancleHandler">取消</el-button>
  230. <el-button type="primary" @click="conformHandler">确认</el-button>
  231. </span>
  232. </template>
  233. </el-dialog>
  234. <el-dialog title="编辑参照值" :visible.sync="flagShow" width="30%">
  235. <!-- :rules="rules" -->
  236. <el-form
  237. :model="flagFormData"
  238. ref="flagFormDataRef"
  239. label-width="100px"
  240. :rules="flagRules"
  241. :inline="false"
  242. size="normal"
  243. >
  244. <el-form-item label="参照类型">
  245. <el-select
  246. v-model="flagFormData.flagType"
  247. placeholder="请选择参照类型"
  248. filterable
  249. >
  250. <el-option
  251. v-for="item in flagTypeList"
  252. :key="item.value"
  253. :label="item.label"
  254. :value="item.value"
  255. >
  256. </el-option>
  257. </el-select>
  258. </el-form-item>
  259. <el-form-item
  260. prop="flagValue"
  261. v-show="flagFormData.flagType == 0"
  262. label="自定义值"
  263. >
  264. <el-input v-model="flagFormData.flagValue"></el-input>
  265. </el-form-item>
  266. <el-form-item
  267. prop="tableField"
  268. v-show="flagFormData.flagType == 1"
  269. label="关联表格字段"
  270. >
  271. <el-select
  272. class="mr10"
  273. v-model="flagFormData.tableField.tableName"
  274. placeholder="请选择表名"
  275. clearable
  276. filterable
  277. @change="
  278. (value) => {
  279. getFieldOptions(value, flagFormData.tableField);
  280. }
  281. "
  282. >
  283. <el-option
  284. v-for="item in tableList"
  285. :key="item.tableName"
  286. :label="item.tableComment"
  287. :value="item.tableName"
  288. >
  289. <span style="float: left">{{ item.tableComment }}</span>
  290. <span style="float: right; color: #8492a6; font-size: 13px">{{
  291. item.tableName
  292. }}</span>
  293. </el-option>
  294. </el-select>
  295. <el-select
  296. v-model="flagFormData.tableField.fieldName"
  297. placeholder="请选择字段"
  298. clearable
  299. filterable
  300. >
  301. <el-option
  302. v-for="item in flagFormData.tableField.fieldOptions"
  303. :key="item.fieldName"
  304. :label="item.fieldDescription"
  305. :value="item.fieldName"
  306. >
  307. <span style="float: left">{{ item.fieldDescription }}</span>
  308. <span style="float: right; color: #8492a6; font-size: 13px">{{
  309. item.fieldName
  310. }}</span>
  311. </el-option>
  312. </el-select>
  313. </el-form-item>
  314. <el-form-item
  315. v-show="flagFormData.flagType == 2"
  316. label="固定值"
  317. size="normal"
  318. >
  319. <el-select
  320. v-model="flagFormData.flagValue"
  321. placeholder="请选择固定值"
  322. filterable
  323. >
  324. <el-option
  325. v-for="item in constFlagList"
  326. :key="item.value"
  327. :label="item.label"
  328. :value="item.value"
  329. >
  330. </el-option>
  331. </el-select>
  332. </el-form-item>
  333. </el-form>
  334. <template #footer>
  335. <span>
  336. <el-button @click="flagShow = false">取消</el-button>
  337. <el-button type="primary" @click="flagConfirm">确认</el-button>
  338. </span>
  339. </template>
  340. </el-dialog>
  341. </div>
  342. </template>
  343. <script>
  344. import { getFormName, getListName } from "@/api/dragform/form.js";
  345. import { mapState } from "vuex";
  346. import getOptionsSqlString from "@/utils/sqlString";
  347. export default {
  348. name: "OptionsEdit",
  349. props: ["options", "selectItem", "dynamicKey"],
  350. components: {},
  351. data() {
  352. return {
  353. relateOptionShow: false,
  354. isShow: false,
  355. flagShow: false,
  356. flagEditIndex: "",
  357. formData: {
  358. dynamicName: "", //英文字符串
  359. tableName: "",
  360. optLabelData: "",
  361. optValueData: "",
  362. },
  363. filterTableData: [
  364. {
  365. fieldName: "",
  366. flagValue: "",
  367. fieldOptions: [],
  368. flagFormData: {
  369. flagType: 0,
  370. tableField: {
  371. tableName: "",
  372. fieldName: "",
  373. fieldOptions: [],
  374. },
  375. flagValue: "",
  376. },
  377. },
  378. ],
  379. flagFormData: {
  380. flagType: 0,
  381. tableField: {
  382. tableName: "",
  383. fieldName: "",
  384. fieldOptions: [],
  385. },
  386. flagValue: "",
  387. },
  388. flagTypeList: [
  389. {
  390. value: 0,
  391. label: "自定义",
  392. },
  393. // {
  394. // value: 1,
  395. // label: "关联其他字段",
  396. // },
  397. {
  398. value: 2,
  399. label: "固定值",
  400. },
  401. ],
  402. tableList: [],
  403. fieldList: [],
  404. rules: {
  405. tableName: [
  406. { required: true, message: "请选择表格名称", trigger: "change" },
  407. ],
  408. optLabelData: [
  409. { required: true, message: "请选择描述字段", trigger: "change" },
  410. ],
  411. optValueData: [
  412. { required: true, message: "请选择值字段", trigger: "change" },
  413. ],
  414. },
  415. flagRules: {
  416. flagType: [
  417. { required: true, message: "请选择参照值类型", trigger: "change" },
  418. ],
  419. },
  420. constFlagList: [
  421. {
  422. value: "#{USERID}",
  423. label: "当前用户相关数据",
  424. },
  425. ],
  426. //树形数据
  427. btnList: [
  428. // {
  429. // sql: "",
  430. // echoData: "",
  431. // },
  432. ],
  433. editIndex: "", //当前编辑层级
  434. };
  435. },
  436. watch: {
  437. myDynamicKey: {
  438. handler(nval) {
  439. this.formData.dynamicName = nval;
  440. console.log(this.formData.dynamicName);
  441. },
  442. deep: true,
  443. },
  444. mySelectItem: {
  445. handler(nval) {
  446. // if (
  447. // nval.options.sqlData &&
  448. // nval.options.sqlData.dynamicName == nval.options.dynamicKey
  449. // ) {
  450. // this.btnList = nval.options.sqlData.echoDatas.map((item) => {
  451. // return {
  452. // sql: "",
  453. // echoData: item,
  454. // };
  455. // });
  456. // }
  457. },
  458. deep: true,
  459. immediate: true,
  460. },
  461. myOptions: {
  462. handler(nval) {
  463. console.log("options", nval);
  464. this.btnList = [];
  465. this.reset();
  466. if (nval.sqlData && nval.sqlData.dynamicName == nval.dynamicKey) {
  467. this.btnList = nval.sqlData.echoDatas.map((item) => {
  468. return {
  469. sql: "",
  470. echoData: item,
  471. };
  472. });
  473. }
  474. console.log(this.btnList);
  475. },
  476. deep: true,
  477. immediate: true,
  478. },
  479. // 'formData.tableName': {
  480. // handler(nval) {
  481. // if(nval){}
  482. // }
  483. // }
  484. },
  485. computed: {
  486. ...mapState({
  487. databaseName: (state) => state.user.dataSource.databaseName,
  488. databaseType: (state) => state.user.dataSource.databaseType,
  489. }),
  490. domType() {
  491. return this.selectItem.type; //select treeSelect cascader
  492. },
  493. myDynamicKey() {
  494. return this.dynamicKey;
  495. },
  496. mySelectItem() {
  497. return this.selectItem;
  498. },
  499. myOptions() {
  500. return this.options;
  501. },
  502. },
  503. methods: {
  504. // 添加一级回调
  505. addHandler() {
  506. this.btnList.push({
  507. sql: "",
  508. echoData: "",
  509. });
  510. },
  511. minusHandler() {
  512. this.btnList.pop();
  513. },
  514. reset() {
  515. Object.assign(this.formData, {
  516. dynamicName: "", //英文字符串
  517. tableName: "",
  518. optLabelData: "",
  519. optValueData: "",
  520. });
  521. this.filterTableData = [];
  522. Object.assign(this.flagFormData, {
  523. flagType: 0,
  524. tableField: {
  525. tableName: "",
  526. fieldName: "",
  527. fieldOptions: [],
  528. },
  529. flagValue: "",
  530. });
  531. },
  532. // 重置条件表单数据
  533. resetFlagFormData() {
  534. Object.assign(this.flagFormData, {
  535. flagType: 0,
  536. tableField: {
  537. tableName: "",
  538. fieldName: "",
  539. fieldOptions: [],
  540. },
  541. flagValue: "",
  542. });
  543. },
  544. // 开始编辑回调
  545. async editHandler(editIndex) {
  546. await this.getAllTable();
  547. // if (this.domType == "select") {
  548. // this.isShow = true;
  549. // } else {
  550. // this.relateOptionShow = true;
  551. // }
  552. this.editIndex = editIndex;
  553. let currentItem = this.btnList[editIndex];
  554. console.log(currentItem, "currentItem");
  555. if (currentItem?.echoData) {
  556. let { formData, filterTableData, flagFormData } = JSON.parse(
  557. currentItem.echoData
  558. );
  559. this.filterTableData = filterTableData;
  560. this.formData = formData;
  561. // this.flagFormData = flagFormData;
  562. } else {
  563. this.btnList[editIndex] = {
  564. sql: "",
  565. echoData: "",
  566. };
  567. }
  568. this.formData.dynamicName = this.myOptions.dynamicKey;
  569. if (this.formData.tableName) {
  570. this.getFieldOptions(this.formData.tableName);
  571. }
  572. this.isShow = true;
  573. },
  574. // 弹窗取消回调
  575. cancleHandler() {
  576. this.reset();
  577. this.isShow = false;
  578. },
  579. // 弹窗确认回调
  580. conformHandler() {
  581. let sql = getOptionsSqlString(this.formData, this.filterTableData);
  582. // let sqlData = {};
  583. // sqlData[this.formData.dynamicName] = sql;
  584. let echoData = {
  585. formData: {},
  586. filterTableData: [],
  587. // flagFormData: {},
  588. };
  589. Object.assign(echoData.formData, this.formData);
  590. Object.assign(echoData.filterTableData, this.filterTableData);
  591. // Object.assign(echoData.flagFormData, this.flagFormData);
  592. echoData.filterTableData.forEach((item) => {
  593. delete item.flagFormData.tableField.fieldOptions;
  594. });
  595. this.btnList[this.editIndex].sql = sql;
  596. this.btnList[this.editIndex].echoData = JSON.stringify(echoData);
  597. let sqlData = {};
  598. sqlData.dynamicName = this.formData.dynamicName;
  599. sqlData.sqls = this.btnList.map((item) => item.sql);
  600. sqlData.echoDatas = this.btnList.map((item) => item.echoData);
  601. this.$emit("setDynamicKey", sqlData);
  602. this.reset();
  603. this.isShow = false;
  604. },
  605. // 获取所有表格
  606. async getAllTable() {
  607. let data = {
  608. databaseName: this.databaseName,
  609. databaseType: this.databaseType,
  610. };
  611. let res = await getFormName(data);
  612. this.tableList = res.data;
  613. },
  614. async getFieldOptions(value, tempData) {
  615. let data = {
  616. databaseName: this.databaseName,
  617. databaseType: this.databaseType,
  618. tableName: value,
  619. };
  620. try {
  621. let res = await getListName(data);
  622. if (tempData) {
  623. tempData.fieldOptions = res;
  624. } else {
  625. this.fieldList = res;
  626. }
  627. } catch (error) {
  628. this.$message.error("网络异常,请稍后再试");
  629. }
  630. },
  631. // 删除一条筛选条件
  632. deleteFilterItem(index) {
  633. this.filterTableData.splice(index, 1);
  634. },
  635. // 新增一条筛选条件
  636. addFilterHandler() {
  637. this.filterTableData.push({
  638. // tableName: "",
  639. fieldName: "",
  640. flagValue: "",
  641. fieldOptions: [],
  642. flagFormData: {
  643. flagType: 0,
  644. tableField: {
  645. tableName: "",
  646. fieldName: "",
  647. fieldOptions: [],
  648. },
  649. flagValue: "",
  650. },
  651. });
  652. },
  653. // 编辑参照回调
  654. editFlagHandler(row, index) {
  655. this.flagEditIndex = index;
  656. this.flagFormData = JSON.parse(JSON.stringify(row.flagFormData));
  657. this.flagShow = true;
  658. },
  659. // 确认参照回调
  660. flagConfirm() {
  661. this.filterTableData[this.flagEditIndex].flagFormData = JSON.parse(
  662. JSON.stringify(this.flagFormData)
  663. );
  664. this.flagShow = false;
  665. },
  666. },
  667. async mounted() {
  668. console.log(this.options, this.selectItem);
  669. // if (this.selectItem.options.sqlData) {
  670. // this.btnList = this.selectItem.options.sqlData.echoDatas.map((item) => {
  671. // return {
  672. // sql: "",
  673. // echoData: item,
  674. // };
  675. // });
  676. // console.log(this.btnList);
  677. // }
  678. },
  679. };
  680. </script>
  681. <style scoped lang="scss">
  682. .filter-table-wrap {
  683. display: flex;
  684. flex-direction: column;
  685. align-items: center;
  686. }
  687. .btn-list {
  688. display: flex;
  689. flex-wrap: wrap;
  690. }
  691. </style>