config.vue 11 KB

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