config.vue 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. <template>
  2. <a-card :bordered="false">
  3. <s-table
  4. ref="table"
  5. :columns="columns"
  6. :data="loadDate"
  7. :expand-row-by-click="true"
  8. :showPagination="false"
  9. bordered
  10. >
  11. <template #bodyCell="{ column, record }">
  12. <template v-if="column.dataIndex === 'fieldRemark'">
  13. <a-input v-model:value="record.fieldRemark" />
  14. </template>
  15. <template v-if="column.dataIndex === 'fieldJavaType'">
  16. <a-select
  17. style="width: 100%"
  18. v-model:value="record.fieldJavaType"
  19. :options="fieldJavaTypeOptions"
  20. placeholder="请选择"
  21. :disabled="toCommonFieldEstimate(record)"
  22. @change="fieldJavaTypeChange(record)"
  23. />
  24. </template>
  25. <template v-if="column.dataIndex === 'effectType'">
  26. <a-select
  27. style="width: 100%"
  28. v-model:value="record.effectType"
  29. :options="effectTypeOptions"
  30. placeholder="请选择"
  31. :disabled="toCommonFieldEstimate(record) || toFieldSelectEstimate(record)"
  32. />
  33. </template>
  34. <template v-if="column.dataIndex === 'dictTypeCode'">
  35. <a-select
  36. v-if="record.effectType === 'radio' || record.effectType === 'select' || record.effectType === 'checkbox'"
  37. style="width: 100%"
  38. v-model:value="record.dictTypeCode"
  39. :options="dictTypeCodeOptions"
  40. placeholder="请选择字典"
  41. />
  42. <span v-else>无</span>
  43. </template>
  44. <template v-if="column.dataIndex === 'whetherTable'">
  45. <a-checkbox v-model:checked="record.whetherTable" />
  46. </template>
  47. <template v-if="column.dataIndex === 'whetherRetract'">
  48. <a-checkbox v-model:checked="record.whetherRetract" :disabled="!record.whetherTable" />
  49. </template>
  50. <template v-if="column.dataIndex === 'whetherAddUpdate'">
  51. <a-checkbox v-model:checked="record.whetherAddUpdate" :disabled="toFieldEstimate(record)" />
  52. </template>
  53. <template v-if="column.dataIndex === 'whetherRequired'">
  54. <a-checkbox
  55. v-model:checked="record.whetherRequired"
  56. :disabled="toFieldEstimate(record) || !record.whetherAddUpdate"
  57. />
  58. </template>
  59. <template v-if="column.dataIndex === 'queryWhether'">
  60. <a-switch v-model:checked="record.queryWhether" :disabled="!record.whetherTable" />
  61. </template>
  62. <template v-if="column.dataIndex === 'queryType'">
  63. <a-select
  64. v-if="record.queryWhether === true && record.effectType !== 'datepicker'"
  65. style="width: 100%"
  66. v-model:value="record.queryType"
  67. :options="queryTypeOptions"
  68. placeholder="请选择"
  69. />
  70. <span v-else-if="record.effectType === 'datepicker' && record.queryWhether === true">时间段</span>
  71. <span v-else>无</span>
  72. </template>
  73. </template>
  74. </s-table>
  75. </a-card>
  76. </template>
  77. <script setup name="genConfig">
  78. import tool from '@/utils/tool'
  79. import genConfigApi from '@/api/gen/genConfigApi'
  80. import { cloneDeep } from 'lodash-es'
  81. const table = ref()
  82. const recordData = ref()
  83. const tableData = ref()
  84. const columns = [
  85. {
  86. title: '字段',
  87. align: 'center',
  88. dataIndex: 'fieldName',
  89. ellipsis: true
  90. },
  91. {
  92. title: '注释',
  93. align: 'center',
  94. dataIndex: 'fieldRemark',
  95. ellipsis: true
  96. },
  97. {
  98. title: '类型',
  99. align: 'center',
  100. dataIndex: 'fieldType',
  101. ellipsis: true
  102. },
  103. {
  104. title: '实体类型',
  105. align: 'center',
  106. dataIndex: 'fieldJavaType',
  107. ellipsis: true
  108. },
  109. {
  110. title: '作用类型',
  111. align: 'center',
  112. dataIndex: 'effectType',
  113. ellipsis: true
  114. },
  115. {
  116. title: '字典',
  117. align: 'center',
  118. dataIndex: 'dictTypeCode',
  119. width: 140
  120. },
  121. {
  122. title: '列表显示',
  123. align: 'center',
  124. dataIndex: 'whetherTable',
  125. width: 80
  126. },
  127. {
  128. title: '列省略',
  129. align: 'center',
  130. dataIndex: 'whetherRetract',
  131. width: 80
  132. },
  133. {
  134. title: '增改',
  135. align: 'center',
  136. dataIndex: 'whetherAddUpdate',
  137. width: 80
  138. },
  139. {
  140. title: '必填',
  141. align: 'center',
  142. dataIndex: 'whetherRequired',
  143. width: 80
  144. },
  145. {
  146. title: '查询',
  147. align: 'center',
  148. dataIndex: 'queryWhether',
  149. width: 80
  150. },
  151. {
  152. title: '查询方式',
  153. align: 'center',
  154. dataIndex: 'queryType'
  155. }
  156. ]
  157. const onOpen = (record) => {
  158. recordData.value = record
  159. nextTick(() => {
  160. table.value.refresh()
  161. })
  162. }
  163. // 表格查询 返回 Promise 对象
  164. const loadDate = (parameter) => {
  165. if (recordData.value) {
  166. parameter.basicId = recordData.value.id
  167. return genConfigApi.configList(parameter).then((data) => {
  168. tableData.value = JSON.parse(JSON.stringify(data))
  169. let deleteIndex = []
  170. tableData.value.forEach((item, index) => {
  171. for (const key in item) {
  172. if (item[key] === 'Y') {
  173. item[key] = true
  174. }
  175. if (item[key] === 'N') {
  176. item[key] = false
  177. }
  178. }
  179. // 如果是主键,我们不提供主键的配置,也用不到
  180. if (item.isTableKey) {
  181. deleteIndex.push(index)
  182. }
  183. // 去掉删除标识
  184. if (item.fieldName.toLowerCase().indexOf('delete_flag') > -1) {
  185. deleteIndex.push(index)
  186. }
  187. // 让默认的变成设置的
  188. fieldJavaTypeChange(item)
  189. })
  190. if (deleteIndex) {
  191. deleteIndex.forEach((item, index) => {
  192. if (index > 0) {
  193. item = item - 1
  194. }
  195. delete tableData.value.splice(item, 1)
  196. })
  197. }
  198. return tableData.value
  199. })
  200. } else {
  201. return new Promise((resolve, reject) => {
  202. resolve([])
  203. })
  204. }
  205. }
  206. // 实体类型
  207. const fieldJavaTypeOptions = ref([
  208. {
  209. label: 'Integer',
  210. value: 'Integer'
  211. },
  212. {
  213. label: 'Long',
  214. value: 'Long'
  215. },
  216. {
  217. label: 'String',
  218. value: 'String'
  219. },
  220. {
  221. label: 'Boolean',
  222. value: 'Boolean'
  223. },
  224. {
  225. label: 'Float',
  226. value: 'Float'
  227. },
  228. {
  229. label: 'Double',
  230. value: 'Double'
  231. },
  232. {
  233. label: 'Date',
  234. value: 'Date'
  235. },
  236. {
  237. label: 'BigDecimal',
  238. value: 'BigDecimal'
  239. }
  240. ])
  241. // 类型
  242. const effectTypeOptions = ref([
  243. {
  244. label: '输入框',
  245. value: 'input'
  246. },
  247. {
  248. label: '文本框',
  249. value: 'textarea'
  250. },
  251. {
  252. label: '下拉框',
  253. value: 'select'
  254. },
  255. {
  256. label: '单选框',
  257. value: 'radio'
  258. },
  259. {
  260. label: '复选框',
  261. value: 'checkbox'
  262. },
  263. {
  264. label: '日期选择器',
  265. value: 'datepicker'
  266. },
  267. {
  268. label: '时间选择器',
  269. value: 'timepicker'
  270. },
  271. {
  272. label: '数字输入框',
  273. value: 'inputNumber'
  274. },
  275. {
  276. label: '滑动数字条',
  277. value: 'slider'
  278. }
  279. ])
  280. // 字典数据
  281. const dictTypeCodeOptions = tool.dictDataAll().map((item) => {
  282. return {
  283. label: item.name,
  284. value: item.dictValue
  285. }
  286. })
  287. // 查询方式
  288. const queryTypeOptions = ref([
  289. {
  290. label: '模糊包含',
  291. value: 'like'
  292. },
  293. {
  294. label: '模糊不包含',
  295. value: 'notLike'
  296. },
  297. {
  298. label: '等于',
  299. value: 'eq'
  300. },
  301. {
  302. label: '不等于',
  303. value: 'ne'
  304. },
  305. {
  306. label: '大于',
  307. value: 'gt'
  308. },
  309. {
  310. label: '大于等于',
  311. value: 'ge'
  312. },
  313. {
  314. label: '小于',
  315. value: 'lt'
  316. },
  317. {
  318. label: '小于等于',
  319. value: 'le'
  320. }
  321. ])
  322. const emit = defineEmits({ successful: null }, { close: null })
  323. const toFieldEstimate = (data) => {
  324. if (
  325. data.fieldName.toLowerCase().indexOf('create_user') > -1 ||
  326. data.fieldName.toLowerCase().indexOf('create_time') > -1 ||
  327. data.fieldName.toLowerCase().indexOf('update_user') > -1 ||
  328. data.fieldName.toLowerCase().indexOf('update_time') > -1 ||
  329. data.fieldName.toLowerCase().indexOf('delete_flag') > -1 ||
  330. data.isTableKey === true
  331. ) {
  332. return true
  333. }
  334. return false
  335. }
  336. // 通用字段是否可选
  337. const toCommonFieldEstimate = (record) => {
  338. if (
  339. record.fieldName.toLowerCase().indexOf('create_user') > -1 ||
  340. record.fieldName.toLowerCase().indexOf('update_user') > -1
  341. ) {
  342. return true
  343. }
  344. return false
  345. }
  346. // 设置该下拉框是否能选
  347. const toFieldSelectEstimate = (record) => {
  348. if (record.fieldJavaType === 'Date' && record.effectType === 'datepicker') {
  349. return true
  350. }
  351. return false
  352. }
  353. // 实体类型选择触发
  354. const fieldJavaTypeChange = (record) => {
  355. if (record.fieldJavaType === 'Date') {
  356. record.effectType = 'datepicker'
  357. }
  358. }
  359. // 提交
  360. const onSubmit = (recordData) => {
  361. let submitParam = cloneDeep(tableData.value)
  362. let errStatus = 100
  363. submitParam.forEach((item) => {
  364. // 必填那一项转换
  365. for (const key in item) {
  366. if (item[key] === true) {
  367. item[key] = 'Y'
  368. }
  369. if (item[key] === false) {
  370. item[key] = 'N'
  371. }
  372. }
  373. if (item.queryWhether === 'Y' && !item.queryType) {
  374. // 排除掉时间选择
  375. if (item.fieldJavaType !== 'Date' && item.effectType !== 'checkbox') {
  376. errStatus++
  377. }
  378. }
  379. if (
  380. (item.effectType === 'select' || item.effectType === 'radio' || item.effectType === 'checkbox') &&
  381. !item.dictTypeCode
  382. ) {
  383. errStatus++
  384. }
  385. })
  386. return new Promise((resolve, reject) => {
  387. if (errStatus > 100) {
  388. reject('校验失败,请选择对应的下拉框选项')
  389. return
  390. }
  391. genConfigApi
  392. .configEditBatch(submitParam)
  393. .then((data) => {
  394. resolve(data)
  395. })
  396. .catch((err) => {
  397. reject(err)
  398. })
  399. })
  400. }
  401. // 抛出钩子
  402. defineExpose({
  403. onOpen,
  404. onSubmit
  405. })
  406. </script>
  407. <style scoped>
  408. .table-wrapper {
  409. margin-top: -16px !important;
  410. }
  411. </style>