index.vue 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158
  1. <template>
  2. <div class="app-container">
  3. <el-form
  4. :model="queryParams"
  5. ref="queryForm"
  6. size="small"
  7. :inline="true"
  8. v-show="showSearch"
  9. label-width="68px"
  10. >
  11. <el-form-item label-width="100px" label="动态组名称" prop="fGName">
  12. <el-input
  13. v-model="queryParams.fGName"
  14. placeholder="请输入动态组名称"
  15. clearable
  16. @keyup.enter.native="handleQuery"
  17. />
  18. </el-form-item>
  19. <!-- <el-form-item label="当前表单组中所绑定的表单" prop="formKeys">
  20. <el-input
  21. v-model="queryParams.formKeys"
  22. placeholder="请输入当前表单组中所绑定的表单"
  23. clearable
  24. @keyup.enter.native="handleQuery"
  25. />
  26. </el-form-item> -->
  27. <el-form-item label="主表名称" prop="mainTable">
  28. <el-input
  29. v-model="queryParams.mainTable"
  30. placeholder="请输入表单组主表名称"
  31. clearable
  32. @keyup.enter.native="handleQuery"
  33. />
  34. </el-form-item>
  35. <!-- <el-form-item label="更新人编号" prop="updateById">
  36. <el-input
  37. v-model="queryParams.updateById"
  38. placeholder="请输入更新人编号"
  39. clearable
  40. @keyup.enter.native="handleQuery"
  41. />
  42. </el-form-item> -->
  43. <!-- <el-form-item label="创建人编号" prop="createById">
  44. <el-input
  45. v-model="queryParams.createById"
  46. placeholder="请输入创建人编号"
  47. clearable
  48. @keyup.enter.native="handleQuery"
  49. />
  50. </el-form-item> -->
  51. <el-form-item>
  52. <el-button
  53. type="primary"
  54. icon="el-icon-search"
  55. size="mini"
  56. @click="handleQuery"
  57. >搜索</el-button
  58. >
  59. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
  60. >重置</el-button
  61. >
  62. </el-form-item>
  63. </el-form>
  64. <el-row :gutter="10" class="mb8">
  65. <el-col :span="1.5">
  66. <el-button
  67. type="primary"
  68. plain
  69. icon="el-icon-plus"
  70. size="mini"
  71. @click="addHandler"
  72. v-hasPermi="['system:formGroup:add']"
  73. >新增</el-button
  74. >
  75. </el-col>
  76. <!-- <el-col :span="1.5">
  77. <el-button
  78. type="success"
  79. plain
  80. icon="el-icon-edit"
  81. size="mini"
  82. :disabled="single"
  83. @click="handleUpdate"
  84. v-hasPermi="['system:formGroup:edit']"
  85. >修改</el-button
  86. >
  87. </el-col> -->
  88. <el-col :span="1.5">
  89. <el-button
  90. type="danger"
  91. plain
  92. icon="el-icon-delete"
  93. size="mini"
  94. :disabled="multiple"
  95. @click="handleDelete"
  96. v-hasPermi="['system:formGroup:remove']"
  97. >删除</el-button
  98. >
  99. </el-col>
  100. <!-- <el-col :span="1.5">
  101. <el-button
  102. type="warning"
  103. plain
  104. icon="el-icon-download"
  105. size="mini"
  106. @click="handleExport"
  107. v-hasPermi="['system:formGroup:export']"
  108. >导出</el-button
  109. >
  110. </el-col> -->
  111. <right-toolbar
  112. :showSearch.sync="showSearch"
  113. @queryTable="getList"
  114. ></right-toolbar>
  115. </el-row>
  116. <el-table
  117. v-loading="loading"
  118. :data="formGroupList"
  119. @selection-change="handleSelectionChange"
  120. >
  121. <el-table-column type="selection" width="55" align="center" />
  122. <el-table-column label="主键" align="center" prop="id" />
  123. <el-table-column label="动态组名称" align="center" prop="fGName" />
  124. <el-table-column label="备注" align="center" prop="remark" />
  125. <el-table-column
  126. label="当前表单组中所绑定的表单"
  127. align="center"
  128. prop="formKeys"
  129. />
  130. <el-table-column label="表单组主表名称" align="center" prop="mainTable" />
  131. <!-- <el-table-column
  132. label="各个表单之间的关系"
  133. align="center"
  134. prop="relationJson"
  135. /> -->
  136. <!-- <el-table-column label="回显数据sql" align="center" prop="showDataSql" />
  137. <el-table-column label="更新人编号" align="center" prop="updateById" />
  138. <el-table-column label="创建人编号" align="center" prop="createById" /> -->
  139. <el-table-column
  140. label="操作"
  141. align="center"
  142. class-name="small-padding fixed-width"
  143. >
  144. <template slot-scope="scope">
  145. <el-dropdown>
  146. <el-button type="warning" plain size="small">
  147. 处理<i class="el-icon-arrow-down el-icon--right"></i>
  148. </el-button>
  149. <el-dropdown-menu slot="dropdown">
  150. <el-dropdown-item
  151. ><el-button
  152. size="mini"
  153. type="text"
  154. icon="el-icon-edit"
  155. @click="handleUpdate(scope.row)"
  156. >修改
  157. </el-button></el-dropdown-item
  158. >
  159. <el-dropdown-item
  160. ><el-button
  161. size="mini"
  162. type="text"
  163. icon="el-icon-edit"
  164. @click="handlePosition(scope.row)"
  165. >设置布局
  166. </el-button></el-dropdown-item
  167. >
  168. <el-dropdown-item>
  169. <el-button
  170. size="mini"
  171. type="text"
  172. icon="el-icon-delete"
  173. @click="handleDelete(scope.row)"
  174. >删除
  175. </el-button>
  176. </el-dropdown-item>
  177. </el-dropdown-menu>
  178. </el-dropdown>
  179. <!-- <el-button
  180. size="mini"
  181. type="text"
  182. icon="el-icon-edit"
  183. @click="handleUpdate(scope.row)"
  184. v-hasPermi="['system:formGroup:edit']"
  185. >修改</el-button
  186. >
  187. <el-button
  188. size="mini"
  189. type="text"
  190. icon="el-icon-delete"
  191. @click="handleDelete(scope.row)"
  192. v-hasPermi="['system:formGroup:remove']"
  193. >删除</el-button
  194. > -->
  195. </template>
  196. </el-table-column>
  197. </el-table>
  198. <pagination
  199. v-show="total > 0"
  200. :total="total"
  201. :page.sync="queryParams.pageNum"
  202. :limit.sync="queryParams.pageSize"
  203. @pagination="getList"
  204. />
  205. <!-- 表格组新增或编辑弹窗 -->
  206. <el-dialog
  207. :title="isEdit ? '修改表单组' : '新增表单组'"
  208. :visible.sync="isShow"
  209. >
  210. <el-form
  211. :model="groupForm"
  212. ref="groupFormRef"
  213. :rules="rules"
  214. label-width="80px"
  215. :inline="true"
  216. size="normal"
  217. >
  218. <el-form-item prop="fGName" label="组名称:">
  219. <el-input v-model="groupForm.fGName"></el-input>
  220. </el-form-item>
  221. <el-form-item prop="groupDesc" label="组描述:">
  222. <el-input v-model="groupForm.groupDesc"></el-input>
  223. </el-form-item>
  224. <el-form-item prop="mainFormName" label="主表单:">
  225. <el-select
  226. v-model="groupForm.mainFormName"
  227. placeholder="请选择主表单"
  228. clearable
  229. filterable
  230. @change="mainFormChange"
  231. >
  232. <el-option
  233. v-for="(item, index) in formOptionList"
  234. :key="index"
  235. :label="item.dfNickname"
  236. :value="item.formKey"
  237. >
  238. <span class="discribe" style="float: left">{{
  239. item.dfNickname
  240. }}</span>
  241. <span style="float: right; color: #8492a6; font-size: 13px">{{
  242. item.dfName
  243. }}</span>
  244. </el-option>
  245. </el-select>
  246. </el-form-item>
  247. <el-form-item label-width="100px" prop="mainFormItem" label="表单主键:">
  248. <el-select
  249. v-model="groupForm.mainFormItem"
  250. placeholder="请选择表单主键"
  251. clearable
  252. filterable
  253. >
  254. <el-option
  255. v-for="item in groupForm.mainFormItemOptions"
  256. :key="item.model"
  257. :label="item.label"
  258. :value="item.tableName + '.' + item.model"
  259. >
  260. <span class="discribe" style="float: left">{{ item.label }}</span>
  261. <span style="float: right; color: #8492a6; font-size: 13px">{{
  262. item.tableName + "." + item.model
  263. }}</span>
  264. </el-option>
  265. </el-select>
  266. </el-form-item>
  267. <el-form-item label="是否显示" prop="isShow" size="normal">
  268. <el-switch
  269. v-model="groupForm.isShow"
  270. active-color="#13ce66"
  271. inactive-color="#ff4949"
  272. active-text="是"
  273. inactive-text="否"
  274. >
  275. </el-switch>
  276. </el-form-item>
  277. </el-form>
  278. <el-divider content-position="center">从表单数据</el-divider>
  279. <el-table :data="subFormList" border stripe>
  280. <el-table-column type="index" width="50" />
  281. <el-table-column prop="formKey" label="从表单">
  282. <template slot-scope="scope">
  283. <el-select
  284. v-model="scope.row.formKey"
  285. placeholder="请选择表单"
  286. clearable
  287. filterable
  288. @change="subFormChangeHandler(scope.row)"
  289. >
  290. <el-option
  291. v-for="(item, index) in formOptionList"
  292. :key="index"
  293. :label="item.dfNickname"
  294. :value="item.formKey"
  295. >
  296. <span class="discribe" style="float: left">{{
  297. item.dfNickname
  298. }}</span>
  299. <span style="float: right; color: #8492a6; font-size: 13px">{{
  300. item.dfName
  301. }}</span>
  302. </el-option>
  303. </el-select>
  304. </template>
  305. </el-table-column>
  306. <el-table-column prop="formItem" label="子表单键">
  307. <template slot-scope="scope">
  308. <el-select
  309. v-model="scope.row.formItem"
  310. placeholder="请选择子表单键"
  311. clearable
  312. filterable
  313. @change="subFormItemChangeHandler(scope.row)"
  314. >
  315. <el-option
  316. v-for="item in scope.row.formItemList"
  317. :key="item.model"
  318. :label="item.label"
  319. :value="item.tableName + '.' + item.model"
  320. >
  321. <span class="discribe" style="float: left">{{
  322. item.label
  323. }}</span>
  324. <span style="float: right; color: #8492a6; font-size: 13px">{{
  325. item.tableName + "." + item.model
  326. }}</span>
  327. </el-option>
  328. </el-select>
  329. </template>
  330. </el-table-column>
  331. <el-table-column prop="mainFormItem" label="依赖的主表单键">
  332. <template slot-scope="scope">
  333. <el-select
  334. v-model="scope.row.relateMainItem"
  335. placeholder="请选择表单主键"
  336. clearable
  337. filterable
  338. >
  339. <el-option
  340. v-for="item in groupForm.mainFormItemOptions"
  341. :key="item.model"
  342. :label="item.label"
  343. :value="item.tableName + '.' + item.model"
  344. >
  345. <span class="discribe" style="float: left">{{
  346. item.label
  347. }}</span>
  348. <span style="float: right; color: #8492a6; font-size: 13px">{{
  349. item.tableName + "." + item.model
  350. }}</span>
  351. </el-option>
  352. </el-select>
  353. </template>
  354. </el-table-column>
  355. <el-table-column prop="isShow" label="是否展示">
  356. <template slot-scope="scope">
  357. <el-switch
  358. v-model="scope.row.isShow"
  359. active-color="#13ce66"
  360. inactive-color="#ff4949"
  361. active-text="是"
  362. inactive-text="否"
  363. >
  364. </el-switch>
  365. </template>
  366. </el-table-column>
  367. <el-table-column prop="queryMap" label="查询条件">
  368. <template slot-scope="scope">
  369. <el-button
  370. type="info"
  371. size="small"
  372. @click="editHandler(scope.row, 'query', scope.$index)"
  373. >
  374. 编辑条件
  375. </el-button>
  376. </template>
  377. </el-table-column>
  378. <el-table-column prop="queryMap" label="插入条件">
  379. <template slot-scope="scope">
  380. <el-button
  381. type="info"
  382. size="small"
  383. @click="editHandler(scope.row, 'insert', scope.$index)"
  384. >
  385. 编辑条件
  386. </el-button>
  387. </template>
  388. </el-table-column>
  389. <el-table-column label="操作">
  390. <template slot-scope="scope">
  391. <el-button
  392. type="danger"
  393. icon="el-icon-delete"
  394. size="small"
  395. @click="handleRemove(scope.$index, scope.row)"
  396. >
  397. 删除
  398. </el-button>
  399. </template>
  400. </el-table-column>
  401. </el-table>
  402. <el-button
  403. class="mt10"
  404. icon="el-icon-plus"
  405. type="success"
  406. size="mini"
  407. @click="addOne"
  408. >
  409. 新增
  410. </el-button>
  411. <template #footer>
  412. <span>
  413. <el-button @click="cancelHandler">取消</el-button>
  414. <el-button type="primary" @click="confirmHandler">确认</el-button>
  415. </span>
  416. </template>
  417. </el-dialog>
  418. <!-- 条件弹窗 -->
  419. <el-dialog :title="conditionTitle" :visible.sync="queryShow">
  420. <el-table
  421. v-if="conditionTableShow"
  422. :data="conditionTableData"
  423. border
  424. stripe
  425. >
  426. <el-table-column type="index" width="50" />
  427. <el-table-column prop="fieldName" label="子表单键">
  428. <template slot-scope="scope">
  429. <el-select
  430. v-model="scope.row.fieldName"
  431. placeholder="请选择子表单键"
  432. clearable
  433. filterable
  434. >
  435. <el-option
  436. v-for="item in fieldOptions"
  437. :key="item.model"
  438. :label="item.label"
  439. :value="item.tableName + '.' + item.model"
  440. >
  441. <span class="discribe" style="float: left">{{
  442. item.label
  443. }}</span>
  444. <span style="float: right; color: #8492a6; font-size: 13px">{{
  445. item.tableName + "." + item.model
  446. }}</span>
  447. </el-option>
  448. </el-select>
  449. </template>
  450. </el-table-column>
  451. <el-table-column prop="type" label="类型">
  452. <template slot-scope="scope">
  453. <el-select
  454. v-model="scope.row.type"
  455. placeholder="请选择类型"
  456. filterable
  457. @change="changeType(scope.row)"
  458. >
  459. <el-option
  460. v-for="item in typeOptions"
  461. :key="item.value"
  462. :label="item.label"
  463. :value="item.value"
  464. >
  465. </el-option>
  466. </el-select>
  467. </template>
  468. </el-table-column>
  469. <el-table-column prop="tableName" label="依赖表单">
  470. <template slot-scope="scope">
  471. <el-select
  472. v-model="scope.row.formKey"
  473. placeholder="请选择依赖表单"
  474. clearable
  475. filterable
  476. @change="changeTableName(scope.row)"
  477. :disabled="scope.row.type === 'defaultValue'"
  478. >
  479. <el-option
  480. v-for="item in relaTableOptions"
  481. :key="item.dfTableName"
  482. :label="item.dfName"
  483. :value="item.formKey"
  484. >
  485. <span class="discribe" style="float: left">{{
  486. item.dfName
  487. }}</span>
  488. <span style="float: right; color: #8492a6; font-size: 13px">{{
  489. item.dfTableName
  490. }}</span>
  491. </el-option>
  492. </el-select>
  493. </template>
  494. </el-table-column>
  495. <el-table-column prop="relaField" label="依赖字段">
  496. <template slot-scope="scope">
  497. <el-select
  498. v-model="scope.row.relaField"
  499. placeholder="请选择依赖字段"
  500. clearable
  501. filterable
  502. :disabled="scope.row.type === 'defaultValue'"
  503. >
  504. <el-option
  505. v-for="item in scope.row.mainFormItemList"
  506. :key="item.model"
  507. :label="item.label"
  508. :value="item.tableName + '.' + item.model"
  509. >
  510. <span class="discribe" style="float: left">{{
  511. item.label
  512. }}</span>
  513. <span style="float: right; color: #8492a6; font-size: 13px">{{
  514. item.tableName + "." + item.model
  515. }}</span>
  516. </el-option>
  517. </el-select>
  518. </template>
  519. </el-table-column>
  520. <el-table-column prop="refValue" label="默认值">
  521. <template slot-scope="scope">
  522. <el-input
  523. :disabled="scope.row.type === 'relateValue'"
  524. v-model="scope.row.refValue"
  525. placeholder="请输入默认值"
  526. clearable
  527. />
  528. </template>
  529. </el-table-column>
  530. <el-table-column label="操作">
  531. <template slot-scope="scope">
  532. <el-button
  533. type="danger"
  534. size="mini"
  535. @click="handleRemove(scope.$index, scope.row)"
  536. >
  537. 删除
  538. </el-button>
  539. </template>
  540. </el-table-column>
  541. </el-table>
  542. <div class="btn-wrap">
  543. <el-button type="primary" size="mini" @click="addCondition">
  544. 新增条件
  545. </el-button>
  546. </div>
  547. <template #footer>
  548. <span>
  549. <el-button @click="queryShow = false">取消</el-button>
  550. <el-button type="primary" @click="conditionConfirmHandler"
  551. >确认</el-button
  552. >
  553. </span>
  554. </template>
  555. </el-dialog>
  556. <!-- 布局弹窗 -->
  557. <el-dialog title="布局" :visible.sync="layoutShow" fullscreen>
  558. <DragPosition></DragPosition>
  559. </el-dialog>
  560. </div>
  561. </template>
  562. <script>
  563. import { listForm } from "@/api/dragform/form";
  564. import { getFormItems } from "@packages/bo-utils/getFormItems";
  565. import {
  566. listFormGroup,
  567. getFormGroup,
  568. delFormGroup,
  569. addFormGroup,
  570. updateFormGroup,
  571. } from "@/api/system/formGroup";
  572. import { v4 as uuidv4 } from "uuid";
  573. import { mapState } from "vuex";
  574. import {
  575. getFormName,
  576. getListName,
  577. dragTablePreview,
  578. } from "@/api/dragform/form.js";
  579. import DragPosition from "./component/DragPosition.vue";
  580. export default {
  581. name: "formRelateMange",
  582. props: [],
  583. components: { DragPosition },
  584. data() {
  585. return {
  586. // 弹窗相关数据
  587. isEdit: false, // 是否编辑
  588. isShow: false,
  589. editRow: {}, //当前编辑的行数据
  590. groupForm: {
  591. fGName: "", //组名称
  592. groupDesc: "", //组描述
  593. mainFormName: "", //主表单
  594. mainFormItem: "", //主表单主键
  595. mainFormTable: "", //主表单对应表格
  596. mainFormItemOptions: [], //主表单键选项
  597. groupKey: "", //组key
  598. isShow: true,
  599. },
  600. subFormList: [
  601. // {
  602. // formKey: "", //从表单
  603. // dfTableName: "", //从表名
  604. // formItemList: [], //从表单键列表
  605. // formItem: "", //从表单键
  606. // relateMainItem: "", //依赖的主表单键
  607. // },
  608. ],
  609. formOptionList: [],
  610. // 模板参数
  611. // 遮罩层
  612. loading: false,
  613. // 选中数组
  614. ids: [],
  615. // 非单个禁用
  616. single: true,
  617. // 非多个禁用
  618. multiple: true,
  619. // 显示搜索条件
  620. showSearch: true,
  621. // 总条数
  622. total: 0,
  623. // 动态表单组表格数据
  624. formGroupList: [],
  625. // 弹出层标题
  626. title: "",
  627. // 是否显示弹出层
  628. open: false,
  629. // 查询参数
  630. queryParams: {
  631. pageNum: 1,
  632. pageSize: 10,
  633. fGName: null,
  634. formKeys: null,
  635. mainTable: null,
  636. relationJson: null,
  637. showDataSql: null,
  638. updateById: null,
  639. createById: null,
  640. },
  641. // 表单参数
  642. form: {},
  643. // 表单校验
  644. rules: {
  645. fGName: [{ required: true, message: "请输入组名称", trigger: "blur" }],
  646. groupDesc: [
  647. { required: true, message: "请输入组描述", trigger: "blur" },
  648. ],
  649. mainFormName: [
  650. { required: true, message: "请选择主表表单", trigger: "change" },
  651. ],
  652. mainFormItem: [
  653. { required: true, message: "请选择表单主键", trigger: "change" },
  654. ],
  655. },
  656. // 查询条件数据
  657. // start
  658. flag: "", //query:查询条件 insert:插入条件
  659. editIndex: "",
  660. queryMap: {},
  661. queryShow: false,
  662. conditionTableData: [],
  663. conditionTitle: "",
  664. fieldOptions: [],
  665. relaTableOptions: [], //依赖
  666. typeOptions: [
  667. {
  668. label: "自定义值",
  669. value: "defaultValue",
  670. },
  671. {
  672. label: "依赖值",
  673. value: "relateValue",
  674. },
  675. ],
  676. conditionTableShow: true,
  677. // end
  678. // 布局数据 start
  679. layoutShow: false,
  680. // 布局数据 end
  681. };
  682. },
  683. computed: {
  684. ...mapState({
  685. databaseName: (state) => state.user.dataSource.databaseName,
  686. databaseType: (state) => state.user.dataSource.databaseType,
  687. username: (state) => state.user.dataSource.username,
  688. tenantId: (state) => state.user.tenant.tenantId,
  689. }),
  690. },
  691. mounted() {
  692. this.getList();
  693. },
  694. methods: {
  695. // 布局回调
  696. handlePosition(row) {
  697. this.layoutShow = true;
  698. },
  699. //条件编辑确认回调
  700. conditionConfirmHandler() {
  701. if (this.flag == "query") {
  702. this.subFormList[this.editIndex].queryMap = this.conditionTableData;
  703. } else if (this.flag == "insert") {
  704. this.subFormList[this.editIndex].insertMap = this.conditionTableData;
  705. }
  706. this.queryShow = false;
  707. },
  708. // 条件类型改变回调
  709. changeType(row) {
  710. // if(){}
  711. if (row.type == "defaultValue") {
  712. row.tableName = "";
  713. row.relaField = "";
  714. } else {
  715. row.refValue = "";
  716. }
  717. },
  718. // 根据formKey获取表单绑定的表名
  719. getTableNameByFormKey(formKey) {
  720. let temp = this.formOptionList.find((item) => item.formKey == formKey);
  721. return temp?.dfTableName || "";
  722. },
  723. // 依赖的主表单变化回调
  724. async changeTableName(row) {
  725. if (row.formKey) {
  726. let tableName = this.getTableNameByFormKey(row.formKey);
  727. row.tableName = tableName;
  728. let data = {
  729. databaseName: this.databaseName,
  730. databaseType: this.databaseType,
  731. tableName,
  732. };
  733. try {
  734. let res = await getListName(data);
  735. row.mainFormItemList = res.map((item) => {
  736. return {
  737. model: item.fieldName,
  738. label: item.fieldDescription,
  739. tableName,
  740. };
  741. });
  742. this.conditionTableShow = false;
  743. this.$nextTick(() => {
  744. this.conditionTableShow = true;
  745. });
  746. } catch (error) {
  747. console.error(error);
  748. }
  749. }
  750. },
  751. // 新增条件
  752. addCondition() {
  753. this.conditionTableData.push({
  754. fieldName: "", //字段
  755. type: "", //类型
  756. formKey: "", //字段
  757. tableName: "", //依赖表单
  758. relaField: "", //依赖字段
  759. refValue: "", //默认值
  760. mainFormItemList: [], //表单键列表
  761. });
  762. },
  763. // 删除条件
  764. handleRemove(index, row) {
  765. this.conditionTableData.splice(index, 1);
  766. },
  767. // 条件编辑回调
  768. editHandler(row, flag, index) {
  769. console.log(row);
  770. this.flag = flag;
  771. this.editIndex = index;
  772. if (flag == "query") {
  773. //编辑查询条件
  774. this.conditionTitle = "查询条件编辑";
  775. this.conditionTableData = row.queryMap
  776. ? JSON.parse(JSON.stringify(row.queryMap))
  777. : [];
  778. } else {
  779. //编辑插入条件
  780. this.conditionTitle = "插入条件编辑";
  781. this.conditionTableData = row.insertMap
  782. ? JSON.parse(JSON.stringify(row.insertMap))
  783. : [];
  784. }
  785. console.log(this.conditionTableData);
  786. this.fieldOptions = row.formItemList || [];
  787. // 可选表单范围 主表单和当前表单上面的子表单
  788. let formKeys = this.subFormList
  789. .map((item) => item.formKey)
  790. .slice(0, index);
  791. formKeys.unshift(this.groupForm.mainFormName);
  792. this.relaTableOptions = this.formOptionList.filter((item) =>
  793. formKeys.includes(item.formKey)
  794. ); //可依赖表单选项
  795. console.log(this.relaTableOptions);
  796. this.queryShow = true;
  797. },
  798. // 子表单键改变回调
  799. subFormItemChangeHandler(row) {
  800. row.dfTableName = row.formItem.split(".")[0];
  801. console.log(row.dfTableName);
  802. },
  803. // 新增表单组回调
  804. async addHandler() {
  805. this.resetDialogForm();
  806. await this.getFormList();
  807. this.isEdit = false;
  808. this.isShow = true;
  809. },
  810. // 重置弹窗的表单数据
  811. resetDialogForm() {
  812. Object.assign(this.groupForm, {
  813. fGName: "", //组名称
  814. groupDesc: "", //组描述
  815. mainFormName: "", //主表单
  816. mainFormItem: "", //主表单键
  817. mainFormTable: "", //主表单对应表格
  818. mainFormItemOptions: [], //主表单键选项
  819. groupKey: "", //组key
  820. });
  821. this.subFormList = [];
  822. },
  823. // 取消回调
  824. cancelHandler() {
  825. this.isShow = false;
  826. },
  827. // 确认回调
  828. confirmHandler() {
  829. this.$refs.groupFormRef.validate(async (valid) => {
  830. if (valid) {
  831. let {
  832. fGName,
  833. groupDesc,
  834. mainFormName,
  835. mainFormItem,
  836. mainFormTable,
  837. groupKey,
  838. } = this.groupForm;
  839. let mainTable = mainFormTable + ":" + mainFormName;
  840. let tempFormKeys = this.subFormList.map((item) => item.formKey);
  841. // 去掉多余数据 start
  842. this.subFormList.forEach((item) => {
  843. if (item.queryMap) {
  844. item.queryMap.forEach((i) => {
  845. delete i.mainFormItemList;
  846. });
  847. }
  848. if (item.insertMap) {
  849. item.insertMap.forEach((i) => {
  850. delete i.mainFormItemList;
  851. });
  852. }
  853. });
  854. // 去掉多余数据 end
  855. tempFormKeys.push(mainFormName);
  856. let formKeys = JSON.stringify(tempFormKeys);
  857. let relationJson = JSON.stringify({
  858. mainForm: { ...this.groupForm, formKey: mainFormName },
  859. subFormList: this.subFormList,
  860. });
  861. let payLoad = {
  862. fGName,
  863. remark: groupDesc,
  864. formKeys,
  865. mainTable,
  866. relationJson,
  867. showDataSql: "",
  868. groupKey,
  869. };
  870. let res;
  871. try {
  872. if (this.isEdit) {
  873. //修改
  874. payLoad.id = this.editRow.id;
  875. res = await updateFormGroup(payLoad);
  876. if (res.code == 200) {
  877. this.$message.success("修改成功");
  878. this.isShow = false;
  879. this.getList();
  880. } else {
  881. this.$message.error("修改失败");
  882. }
  883. } else {
  884. //新增
  885. payLoad.groupKey = uuidv4();
  886. res = await addFormGroup(payLoad);
  887. if (res.code == 200) {
  888. this.$message.success("新增成功");
  889. this.isShow = false;
  890. this.getList();
  891. } else {
  892. this.$message.error("新增失败");
  893. }
  894. }
  895. } catch (error) {
  896. console.log(error);
  897. this.$message.error("网络异常,请稍后再试");
  898. }
  899. }
  900. });
  901. },
  902. // 获取所有表单数据
  903. async getFormList() {
  904. let queryParams = { isEnablePaging: false };
  905. try {
  906. let res = await listForm(queryParams);
  907. if (res.code == 200) {
  908. this.formOptionList = res.rows;
  909. console.log(this.formOptionList);
  910. } else {
  911. throw Error("获取表单列表失败");
  912. }
  913. } catch (error) {
  914. this.$message.error("网络异常,获取表单列表失败");
  915. }
  916. },
  917. // 主表单变化回调
  918. async mainFormChange(mainFormName) {
  919. // let targetForm = this.getFormJson(formKey);
  920. // console.log("targetForm", targetForm);
  921. // if (targetForm) {
  922. // this.groupForm.mainFormItemOptions = getFormItems(
  923. // targetForm.dfVueTemplate
  924. // );
  925. // this.groupForm.mainFormTable = targetForm.dfTableName;
  926. // }
  927. let dfTableName = this.getTableNameByFormKey(mainFormName);
  928. let data = {
  929. databaseName: this.databaseName,
  930. databaseType: this.databaseType,
  931. tableName: dfTableName,
  932. };
  933. try {
  934. let res = await getListName(data);
  935. this.groupForm.mainFormItemOptions = res.map((item) => {
  936. return {
  937. model: item.fieldName,
  938. label: item.fieldDescription,
  939. tableName: dfTableName,
  940. };
  941. });
  942. this.groupForm.mainFormTable = dfTableName;
  943. // this.conditionTableShow = false;
  944. // this.$nextTick(() => {
  945. // this.conditionTableShow = true;
  946. // });
  947. } catch (error) {
  948. console.error(error);
  949. }
  950. },
  951. // 获取fId对应的表单JSON数据
  952. getFormJson(formKey) {
  953. if (!formKey) return false;
  954. return this.formOptionList.find((item) => item.formKey === formKey);
  955. },
  956. // 字表单变化回调
  957. async subFormChangeHandler(row) {
  958. // if (!row.formKey) {
  959. // Object.assign(row, {
  960. // dfTableName: "",
  961. // formItemList: [],
  962. // formItem: "",
  963. // });
  964. // } else {
  965. // let targetForm = this.getFormJson(row.formKey);
  966. // if (targetForm) {
  967. // row.formItemList = getFormItems(targetForm.dfVueTemplate);
  968. // }
  969. // }
  970. if (!row.formKey) {
  971. Object.assign(row, {
  972. dfTableName: "",
  973. formItemList: [],
  974. formItem: "",
  975. });
  976. } else {
  977. let tableName = this.getTableNameByFormKey(row.formKey);
  978. let data = {
  979. databaseName: this.databaseName,
  980. databaseType: this.databaseType,
  981. tableName: tableName,
  982. };
  983. try {
  984. let res = await getListName(data);
  985. row.formItemList = res.map((item) => {
  986. return {
  987. model: item.fieldName,
  988. label: item.fieldDescription,
  989. tableName: tableName,
  990. };
  991. });
  992. } catch (error) {
  993. console.error(error);
  994. }
  995. }
  996. },
  997. //删除从表单
  998. handleRemove(index) {
  999. this.subFormList.splice(index, 1);
  1000. },
  1001. // 新增从表单
  1002. addOne() {
  1003. this.subFormList.push({
  1004. formKey: "", //从表单
  1005. dfTableName: "", //从表名
  1006. formItemList: [], //从表单项列表
  1007. formItem: "", //从表单键
  1008. relateMainItem: "", //依赖的主表单键
  1009. isShow: true, //是否显示该表单
  1010. insertMap: [],
  1011. queryMap: [],
  1012. });
  1013. },
  1014. //模板方法
  1015. /** 查询动态表单组列表 */
  1016. getList() {
  1017. this.loading = true;
  1018. listFormGroup(this.queryParams).then((response) => {
  1019. this.formGroupList = response.rows;
  1020. this.total = response.total;
  1021. this.loading = false;
  1022. });
  1023. },
  1024. // 取消按钮
  1025. cancel() {
  1026. this.open = false;
  1027. this.reset();
  1028. },
  1029. // 表单重置
  1030. reset() {
  1031. this.form = {
  1032. id: null,
  1033. fGName: null,
  1034. remark: null,
  1035. formKeys: null,
  1036. mainTable: null,
  1037. relationJson: null,
  1038. showDataSql: null,
  1039. updateTime: null,
  1040. updateBy: null,
  1041. updateById: null,
  1042. createTime: null,
  1043. createById: null,
  1044. createBy: null,
  1045. delFlag: null,
  1046. };
  1047. this.resetForm("form");
  1048. },
  1049. /** 搜索按钮操作 */
  1050. handleQuery() {
  1051. this.queryParams.pageNum = 1;
  1052. this.getList();
  1053. },
  1054. /** 重置按钮操作 */
  1055. resetQuery() {
  1056. this.resetForm("queryForm");
  1057. this.handleQuery();
  1058. },
  1059. // 多选框选中数据
  1060. handleSelectionChange(selection) {
  1061. this.ids = selection.map((item) => item.id);
  1062. this.single = selection.length !== 1;
  1063. this.multiple = !selection.length;
  1064. },
  1065. /** 新增按钮操作 */
  1066. handleAdd() {
  1067. this.reset();
  1068. this.open = true;
  1069. this.title = "添加动态表单组";
  1070. },
  1071. /** 修改按钮操作 */
  1072. async handleUpdate(row) {
  1073. if (row.id) {
  1074. await this.getFormList();
  1075. this.isEdit = true;
  1076. this.editRow = JSON.parse(JSON.stringify(row));
  1077. getFormGroup(row.id).then((response) => {
  1078. console.log("回显数据", response);
  1079. let { fGName, remark, relationJson } = response.data;
  1080. // this.groupForm.fGName = fGName;
  1081. // this.groupForm.groupDesc = remark;
  1082. let { mainForm, subFormList } = JSON.parse(relationJson);
  1083. mainForm.groupKey = response.data.groupKey;
  1084. Object.assign(this.groupForm, mainForm);
  1085. if (subFormList && subFormList.length > 0) {
  1086. this.subFormList = subFormList;
  1087. } else {
  1088. this.subFormList = [];
  1089. }
  1090. this.isShow = true;
  1091. });
  1092. }
  1093. },
  1094. /** 提交按钮 */
  1095. submitForm() {
  1096. this.$refs["form"].validate((valid) => {
  1097. if (valid) {
  1098. if (this.form.id != null) {
  1099. updateFormGroup(this.form).then((response) => {
  1100. this.$modal.msgSuccess("修改成功");
  1101. this.open = false;
  1102. this.getList();
  1103. });
  1104. } else {
  1105. addFormGroup(this.form).then((response) => {
  1106. this.$modal.msgSuccess("新增成功");
  1107. this.open = false;
  1108. this.getList();
  1109. });
  1110. }
  1111. }
  1112. });
  1113. },
  1114. /** 删除按钮操作 */
  1115. handleDelete(row) {
  1116. const ids = row.id || this.ids;
  1117. this.$modal
  1118. .confirm('是否确认删除动态表单组编号为"' + ids + '"的数据项?')
  1119. .then(function () {
  1120. return delFormGroup(ids);
  1121. })
  1122. .then(() => {
  1123. this.getList();
  1124. this.$modal.msgSuccess("删除成功");
  1125. })
  1126. .catch(() => {});
  1127. },
  1128. /** 导出按钮操作 */
  1129. handleExport() {
  1130. this.download(
  1131. "system/formGroup/export",
  1132. {
  1133. ...this.queryParams,
  1134. },
  1135. `formGroup_${new Date().getTime()}.xlsx`
  1136. );
  1137. },
  1138. },
  1139. };
  1140. </script>
  1141. <style scoped lang="scss">
  1142. ::v-deep .el-dialog__body {
  1143. box-sizing: border-box;
  1144. height: calc(100% - 60px) !important;
  1145. }
  1146. </style>