From 5c27bacd1186241db58539b3108b7922c110bd34 Mon Sep 17 00:00:00 2001 From: jiangxh <1217934998@qq.com> Date: Thu, 30 Jul 2026 11:28:26 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E5=90=88=E7=A4=BA=E6=96=B9=E7=94=9F?= =?UTF-8?q?=E6=88=90=E6=B7=B7=E7=82=BC=E7=A4=BA=E6=96=B9=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeecg-module-xslmes/doc/代码修改日志 | 97 ++ .../impl/MesXslFormulaSpecServiceImpl.java | 265 +++-- .../jeecg-system-biz/docs/代码修改日志 | 23 + .../controller/MesMaterialController.java | 65 + .../MesMixerMaterialController.java | 77 ++ .../material/service/IMesMaterialService.java | 6 + .../service/IMesMixerMaterialService.java | 9 +- .../service/impl/MesMaterialServiceImpl.java | 30 + .../impl/MesMixerMaterialServiceImpl.java | 33 +- .../modules/message/websocket/WebSocket.java | 35 +- .../code-template-online/common/blob.ftl | 67 ++ .../form/native/vue3NativeComponents.ftl | 53 + .../common/form/native/vue3NativeForm.ftl | 119 ++ .../common/form/native/vue3NativeImport.ftl | 59 + .../common/form/native/vue3NativeSearch.ftl | 108 ++ .../form/native/vueNativeSearchStyle.ftl | 25 + .../common/form/vue3Jvxepopup.ftl | 16 + .../common/form/vue3SearchStyle.ftl | 5 + .../common/form/vue3popup.ftl | 17 + .../common/init/initValue.ftl | 13 + .../common/init/initValueSub.ftl | 13 + .../init/native/vue3NativeInitValue.ftl | 11 + .../init/native/vue3NativeMainInitValue.ftl | 11 + .../init/native/vue3NativeSubInitValue.ftl | 11 + .../common/sql/menu_insert.ftl | 47 + .../code-template-online/common/utils.ftl | 254 ++++ .../common/validatorRulesTemplate/core.ftl | 57 + .../common/validatorRulesTemplate/main.ftl | 5 + .../native/vue3CoreNative.ftl | 49 + .../native/vue3MainNative.ftl | 6 + .../validatorRulesTemplate/sub-vue3.ftl | 23 + .../common/validatorRulesTemplate/sub.ftl | 5 + .../controller/${entityName}Controller.javai | 275 +++++ .../entity/${entityName}.javai | 93 ++ .../mapper/${entityName}Mapper.javai | 17 + .../mapper/xml/${entityName}Mapper.xml | 5 + .../service/I${entityName}Service.javai | 14 + .../impl/${entityName}ServiceImpl.javai | 19 + .../uniapp/${entityName}Form.vue | 93 ++ .../uniapp/${entityName}List.vue | 44 + .../uniapp3/${entityName}Data.tsi | 49 + .../uniapp3/${entityName}Form.vuei | 560 +++++++++ .../uniapp3/${entityName}List.vuei | 148 +++ .../vue/${entityName}List.vuei | 426 +++++++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../vue/modules/${entityName}Form.vuei | 266 +++++ .../vue/modules/${entityName}Modal.vuei | 69 ++ .../${entityName}Modal__Style#Drawer.vuei | 93 ++ .../vue3/${entityName}List.vuei | 443 +++++++ .../vue3/${entityName}__api.tsi | 64 + .../vue3/${entityName}__data.tsi | 538 +++++++++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../vue3/components/${entityName}Form.vuei | 82 ++ .../vue3/components/${entityName}Modal.vuei | 130 ++ .../vue3Native/${entityName}List.vuei | 583 +++++++++ .../vue3Native/${entityName}__api.tsi | 72 ++ .../vue3Native/${entityName}__data.tsi | 90 ++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../components/${entityName}Form.vuei | 256 ++++ .../components/${entityName}Modal.vuei | 102 ++ .../controller/${entityName}Controller.javai | 286 +++++ .../entity/${entityName}.javai | 77 ++ .../${entityPackage}/entity/[1-n]Entity.javai | 76 ++ .../mapper/${entityName}Mapper.javai | 17 + .../${entityPackage}/mapper/[1-n]Mapper.javai | 34 + .../mapper/xml/${entityName}Mapper.xml | 5 + .../mapper/xml/[1-n]Mapper.xml | 26 + .../service/I${entityName}Service.javai | 54 + .../service/[1-n]Service.javai | 25 + .../impl/${entityName}ServiceImpl.javai | 105 ++ .../service/impl/[1-n]ServiceImpl.javai | 30 + .../vo/${entityName}Page.javai | 83 ++ .../vue/${entityName}List.vuei | 397 ++++++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../vue/modules/${entityName}Form.vuei | 562 +++++++++ .../vue/modules/${entityName}Modal.vuei | 65 + .../vue/modules/[1-n]Form.vuei | 197 +++ .../controller/${entityName}Controller.javai | 372 ++++++ .../entity/${entityName}.javai | 91 ++ .../mapper/${entityName}Mapper.javai | 35 + .../mapper/xml/${entityName}Mapper.xml | 45 + .../service/I${entityName}Service.javai | 74 ++ .../impl/${entityName}ServiceImpl.javai | 229 ++++ .../vue/${entityName}List.vuei | 523 ++++++++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../vue/modules/${entityName}Modal.vuei | 246 ++++ .../vue3/${entityName}List.vuei | 564 +++++++++ .../vue3/${entityName}__api.tsi | 85 ++ .../vue3/${entityName}__data.tsi | 560 +++++++++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../vue3/components/${entityName}Form.vuei | 72 ++ .../vue3/components/${entityName}Modal.vuei | 191 +++ .../vue3Native/${entityName}List.vuei | 738 ++++++++++++ .../vue3Native/${entityName}__api.tsi | 93 ++ .../vue3Native/${entityName}__data.tsi | 94 ++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../components/${entityName}Form.vuei | 316 +++++ .../components/${entityName}Modal.vuei | 101 ++ .../controller/${entityName}Controller.javai | 403 +++++++ .../entity/${entityName}.javai | 82 ++ .../${entityPackage}/entity/[1-n]Entity.javai | 86 ++ .../mapper/${entityName}Mapper.javai | 17 + .../${entityPackage}/mapper/[1-n]Mapper.javai | 35 + .../mapper/xml/${entityName}Mapper.xml | 5 + .../mapper/xml/[1-n]Mapper.xml | 28 + .../service/I${entityName}Service.javai | 36 + .../service/[1-n]Service.javai | 25 + .../impl/${entityName}ServiceImpl.javai | 56 + .../service/impl/[1-n]ServiceImpl.javai | 30 + .../vue/${entityName}List.vuei | 457 +++++++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../${entityPackage}/vue/[1-n]List.vuei | 327 +++++ .../vue/modules/${entityName}Modal.vuei | 212 ++++ .../vue/modules/[1-n]Modal.vuei | 208 ++++ .../vue3/${entityName}List.vuei | 473 ++++++++ .../vue3/${entityName}__api.tsi | 133 +++ .../vue3/${entityName}__data.tsi | 850 +++++++++++++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../${entityPackage}/vue3/[1-n]List.vuei | 189 +++ .../vue3/components/${entityName}Modal.vuei | 129 ++ .../vue3/components/[1-n]Modal.vuei | 114 ++ .../vue3Native/${entityName}List.vuei | 613 ++++++++++ .../vue3Native/${entityName}__api.tsi | 139 +++ .../vue3Native/${entityName}__data.tsi | 155 +++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../vue3Native/[1-n]List.vuei | 250 ++++ .../components/${entityName}Form.vuei | 252 ++++ .../components/${entityName}Modal.vuei | 105 ++ .../vue3Native/components/[1-n]Form.vuei | 228 ++++ .../vue3Native/components/[1-n]Modal.vuei | 79 ++ .../controller/${entityName}Controller.javai | 368 ++++++ .../entity/${entityName}.javai | 82 ++ .../${entityPackage}/entity/[1-n]Entity.javai | 86 ++ .../mapper/${entityName}Mapper.javai | 17 + .../${entityPackage}/mapper/[1-n]Mapper.javai | 34 + .../mapper/xml/${entityName}Mapper.xml | 5 + .../mapper/xml/[1-n]Mapper.xml | 26 + .../service/I${entityName}Service.javai | 54 + .../service/[1-n]Service.javai | 25 + .../impl/${entityName}ServiceImpl.javai | 105 ++ .../service/impl/[1-n]ServiceImpl.javai | 30 + .../vo/${entityName}Page.javai | 117 ++ .../vue/${entityName}List.vuei | 509 ++++++++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../vue/modules/${entityName}Form.vuei | 545 +++++++++ .../vue/modules/${entityName}Modal.vuei | 62 + .../vue/modules/[1-n]Form.vuei | 167 +++ .../vue/subTables/[1-n]SubTable.vuei | 146 +++ .../vue3/${entityName}List.vuei | 470 ++++++++ .../vue3/${entityName}__api.tsi | 83 ++ .../vue3/${entityName}__data.tsi | 1060 +++++++++++++++++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../vue3/components/${entityName}Form.vuei | 212 ++++ .../vue3/components/${entityName}Modal.vuei | 278 +++++ .../vue3/components/[1-n]Form.vuei | 89 ++ .../vue3/subTables/[1-n]SubTable.vuei | 80 ++ .../controller/${entityName}Controller.javai | 377 ++++++ .../entity/${entityName}.javai | 82 ++ .../${entityPackage}/entity/[1-n]Entity.javai | 81 ++ .../mapper/${entityName}Mapper.javai | 17 + .../${entityPackage}/mapper/[1-n]Mapper.javai | 34 + .../mapper/xml/${entityName}Mapper.xml | 5 + .../mapper/xml/[1-n]Mapper.xml | 26 + .../service/I${entityName}Service.javai | 54 + .../service/[1-n]Service.javai | 25 + .../impl/${entityName}ServiceImpl.javai | 105 ++ .../service/impl/[1-n]ServiceImpl.javai | 30 + .../vo/${entityName}Page.javai | 117 ++ .../vue/${entityName}List.vuei | 397 ++++++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../vue/modules/${entityName}Form.vuei | 568 +++++++++ .../vue/modules/${entityName}Modal.vuei | 65 + .../vue/modules/[1-n]Form.vuei | 196 +++ .../vue3/${entityName}List.vuei | 445 +++++++ .../vue3/${entityName}__api.tsi | 75 ++ .../vue3/${entityName}__data.tsi | 988 +++++++++++++++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../vue3/components/${entityName}Form.vuei | 209 ++++ .../vue3/components/${entityName}Modal.vuei | 278 +++++ .../vue3/components/[1-n]Form.vuei | 87 ++ .../vue3Native/${entityName}List.vuei | 582 +++++++++ .../vue3Native/${entityName}__api.tsi | 85 ++ .../vue3Native/${entityName}__data.tsi | 273 +++++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../components/${entityName}Form.vuei | 412 +++++++ .../components/${entityName}Modal.vuei | 97 ++ .../vue3Native/components/[1-n]Form.vuei | 185 +++ .../controller/${entityName}Controller.javai | 365 ++++++ .../entity/${entityName}.javai | 82 ++ .../${entityPackage}/entity/[1-n]Entity.javai | 82 ++ .../mapper/${entityName}Mapper.javai | 17 + .../${entityPackage}/mapper/[1-n]Mapper.javai | 34 + .../mapper/xml/${entityName}Mapper.xml | 5 + .../mapper/xml/[1-n]Mapper.xml | 26 + .../service/I${entityName}Service.javai | 54 + .../service/[1-n]Service.javai | 25 + .../impl/${entityName}ServiceImpl.javai | 105 ++ .../service/impl/[1-n]ServiceImpl.javai | 30 + .../vo/${entityName}Page.javai | 117 ++ .../vue/${entityName}List.vuei | 351 ++++++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../vue/modules/${entityName}Form.vuei | 509 ++++++++ .../vue/modules/${entityName}Modal.vuei | 62 + .../vue/modules/[1-n]Form.vuei | 199 ++++ .../vue3/${entityName}List.vuei | 444 +++++++ .../vue3/${entityName}__api.tsi | 75 ++ .../vue3/${entityName}__data.tsi | 991 +++++++++++++++ ...rentDate}_1__menu_insert_${entityName}.sql | 1 + .../vue3/components/${entityName}Form.vuei | 251 ++++ .../vue3/components/${entityName}Modal.vuei | 366 ++++++ .../vue3/components/[1-n]Form.vuei | 87 ++ ...71__mes_xsl_formula_spec_line_decimal3.sql | 12 + jeecgboot-vue3/src/hooks/web/useWebSocket.ts | 81 +- jeecgboot-vue3/src/utils/http/axios/index.ts | 4 +- .../src/views/mes/material/MesMaterial.api.ts | 8 + .../views/mes/material/MesMaterial.data.ts | 30 +- .../views/mes/material/MesMaterialList.vue | 2 + .../mes/material/MesMixerMaterial.api.ts | 8 + .../mes/material/MesMixerMaterial.data.ts | 51 +- .../mes/material/MesMixerMaterialList.vue | 6 +- .../views/mes/material/materialQuery.util.ts | 52 + .../modules/MesMaterialSelectModal.vue | 20 +- .../modules/MesMixerMaterialSelectModal.vue | 2 + .../MesXslFormulaSpec.api.ts | 5 +- .../MesXslFormulaSpec.data.ts | 22 +- .../MesXslFormulaGenerateMixingModal.vue | 5 + .../components/MesXslFormulaSpecModal.vue | 7 +- .../mesXslMixingSpec/MesXslMixingSpec.data.ts | 23 +- .../MesXslMixingMaterialSelectModal.vue | 26 +- .../components/MesXslMixingSpecModal.vue | 8 +- .../MixerMaterialEditDialogViewModel.cs | 5 +- 231 files changed, 33361 insertions(+), 184 deletions(-) create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/blob.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vue3NativeComponents.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vue3NativeForm.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vue3NativeImport.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vue3NativeSearch.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vueNativeSearchStyle.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/vue3Jvxepopup.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/vue3SearchStyle.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/vue3popup.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/init/initValue.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/init/initValueSub.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/init/native/vue3NativeInitValue.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/init/native/vue3NativeMainInitValue.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/init/native/vue3NativeSubInitValue.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/sql/menu_insert.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/utils.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/validatorRulesTemplate/core.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/validatorRulesTemplate/main.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/validatorRulesTemplate/native/vue3CoreNative.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/validatorRulesTemplate/native/vue3MainNative.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/validatorRulesTemplate/sub-vue3.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/validatorRulesTemplate/sub.ftl create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/uniapp/${entityName}Form.vue create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/uniapp/${entityName}List.vue create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/uniapp3/${entityName}Data.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/uniapp3/${entityName}Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/uniapp3/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal__Style#Drawer.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/[1-n]List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/[1-n]List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/[1-n]List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/subTables/[1-n]SubTable.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/subTables/[1-n]SubTable.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei create mode 100644 jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.2_171__mes_xsl_formula_spec_line_decimal3.sql create mode 100644 jeecgboot-vue3/src/views/mes/material/materialQuery.util.ts diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/doc/代码修改日志 b/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/doc/代码修改日志 index 84d9ad0a..4a01c44c 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/doc/代码修改日志 +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/doc/代码修改日志 @@ -1264,3 +1264,100 @@ jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/ser jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/controller/MesXslMixerConditionController.java jeecgboot-vue3/src/views/xslmes/mesXslMixerCondition/MesXslMixerCondition.api.ts jeecgboot-vue3/src/views/xslmes/mesXslMixerCondition/MesXslMixerCondition.data.ts + +-- author:jiangxh---date:20260729--for: ʾϸ%/λС --- +jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/MesXslFormulaSpec.data.ts +jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/components/MesXslFormulaSpecModal.vue +jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java + +-- author:jiangxh---date:20260729--for: ʾϵ3λĸ3λ2λ --- +jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts +jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingSpecModal.vue +jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java + +-- author:jiangxh---date:20260729--for: ʾرλС --- +jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingSpecModal.vue +jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts +jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java + +-- author:jiangxh---date:20260729--for: ϲѯ/ϼʾѡϸΪģѯ --- +jeecgboot-vue3/src/views/mes/material/materialQuery.util.ts +jeecgboot-vue3/src/views/mes/material/MesMixerMaterialList.vue +jeecgboot-vue3/src/views/mes/material/MesMaterialList.vue +jeecgboot-vue3/src/views/mes/material/modules/MesMixerMaterialSelectModal.vue +jeecgboot-vue3/src/views/mes/material/modules/MesMaterialSelectModal.vue +jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingMaterialSelectModal.vue + +-- author:jiangxh---date:20260729--for: /ϡ༭УΨһ --- +jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.api.ts +jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.data.ts +jeecgboot-vue3/src/views/mes/material/MesMaterial.api.ts +jeecgboot-vue3/src/views/mes/material/MesMaterial.data.ts + +-- author:jiangxh---date:20260729--for: ϡĬϱ365 --- +jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.data.ts +yy-admin-master/YY.Admin/ViewModels/MixerMaterial/MixerMaterialEditDialogViewModel.cs + +-- author:jiangxh---date:20260729--for: ʾϸ%/ͳһλС --- +jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java +jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.2_171__mes_xsl_formula_spec_line_decimal3.sql +jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/MesXslFormulaSpec.data.ts +jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/components/MesXslFormulaSpecModal.vue + +-- author:jiangxh---date:20260729--for: WebSocketpongTimeout 1s10s --- +jeecgboot-vue3/src/hooks/web/useWebSocket.ts + +-- author:jiangxh---date:20260729--for: WebSocket޸RedisذʱƵ --- +jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java +jeecgboot-vue3/src/hooks/web/useWebSocket.ts + +-- author:jiangxh---date:20260729--for: HTTPĬϳʱ10s60sʾ120s --- +jeecgboot-vue3/src/utils/http/axios/index.ts +jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/MesXslFormulaSpec.api.ts + +-- author:jiangxh---date:20260729--for: ʾɡB/FϸΪбƥ䣬ʾά --- +jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java + +-- author:jiangxh---date:20260729--for: ʾɡսϸĸд뽺 --- +jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java + +-- author:jiangxh---date:20260729--for: ѡϵʾ/ʾѡȥϱ --- +jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts +jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingMaterialSelectModal.vue +jeecgboot-vue3/src/views/mes/material/modules/MesMaterialSelectModal.vue +jeecgboot-vue3/src/views/mes/material/materialQuery.util.ts + +-- author:jiangxh---date:20260730--for: ʾɡбɻʾԤʱƥ佺б --- +jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java +jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/components/MesXslFormulaGenerateMixingModal.vue + +-- author:jiangxh---date:20260730--for: ʾɡB/FƥŽǰ׺+ƴSA01Ȱ汾׺ --- +jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java + +-- author:jiangxh---date:20260730--for: ϡȥϱҵֶΣƥ --- +jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/entity/MesMaterial.java +jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/controller/MesMaterialController.java +jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/IMesMaterialService.java +jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/impl/MesMaterialServiceImpl.java +jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java +jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslMixingSpecServiceImpl.java +jeecgboot-vue3/src/views/mes/material/MesMaterial.data.ts +jeecgboot-vue3/src/views/mes/material/MesMaterial.api.ts +jeecgboot-vue3/src/views/mes/material/modules/MesMaterialSelectModal.vue +jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts + +-- author:jiangxh---date:20260730--for: ϡָһȥŸĶ --- +jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/entity/MesMaterial.java +jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/controller/MesMaterialController.java +jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/IMesMaterialService.java +jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/impl/MesMaterialServiceImpl.java +jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java +jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslMixingSpecServiceImpl.java +jeecgboot-vue3/src/views/mes/material/MesMaterial.data.ts +jeecgboot-vue3/src/views/mes/material/MesMaterial.api.ts +jeecgboot-vue3/src/views/mes/material/modules/MesMaterialSelectModal.vue +jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts + +-- author:jiangxh---date:20260730--for: ϡб/أʱԶ뽺һ --- +jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/controller/MesMaterialController.java +jeecgboot-vue3/src/views/mes/material/MesMaterial.data.ts diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java index 23076c8e..db85aa08 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java @@ -12,6 +12,7 @@ import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -300,6 +301,9 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl items = new ArrayList<>(); int aIndex = 0; @@ -551,16 +575,24 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl syncedRubberSpecCodes = new HashSet<>(); + //update-begin---author:jiangxh ---date:20260729 for:【混炼示方生成】B/F胶料改为胶料列表匹配,不存在则提示先维护----------- Map categoryIdCache = new HashMap<>(); - //update-end---author:cursor ---date:20260525 for:【XSLMES-20260525-A48】生成混炼示方同步B/F段胶至密炼物料----------- + assertRequiredRubberMaterialsExist(request.getRows(), formula, lines); + //update-end---author:jiangxh ---date:20260729 for:【混炼示方生成】B/F胶料改为胶料列表匹配,不存在则提示先维护----------- for (MesXslFormulaMixingGenerateRowVO row : request.getRows()) { if (row == null || oConvertUtils.isEmpty(row.getSpecCode()) || row.getStageIndex() == null) { continue; @@ -609,11 +641,6 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl materials = buildMixingMaterials( @@ -647,11 +674,15 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl toGenerateRowsFromPreviewItems( + List items) { + List rows = new ArrayList<>(); + if (CollectionUtils.isEmpty(items)) { + return rows; + } + for (MesXslFormulaMixingGeneratePreviewItemVO item : items) { + if (item == null) { + continue; + } + MesXslFormulaMixingGenerateRowVO row = new MesXslFormulaMixingGenerateRowVO(); + row.setSpecCode(item.getSpecCode()); + row.setStageIndex(item.getStageIndex()); + row.setASegmentIndex(item.getASegmentIndex()); + row.setStepType(item.getStepType()); + rows.add(row); + } + return rows; + } + //update-end---author:jiangxh ---date:20260730 for:【混炼示方生成】预览项转生成行供胶料匹配校验----------- + /** - * 生成混炼示方时,将 B 段/F 段胶料同步写入「胶料信息」(mes_material): - * 除 ERP 编号留空、编码/名称为示方编号外,其余字段按配合示方所选原胶料信息赋值。 + * 生成前校验:按 B段序号/F + 胶料名 拼出的示方编号,必须已在胶料信息中存在;不再自动新建。 + * 在列表点击「生成混炼示方」预览时即调用,确认生成时再次校验。 */ + private void assertRequiredRubberMaterialsExist( + List rows, + MesXslFormulaSpec formula, + List lines) { + if (CollectionUtils.isEmpty(rows)) { + return; + } + LinkedHashSet requiredCodes = new LinkedHashSet<>(); + String rubberName = resolveRubberName(formula); + for (MesXslFormulaMixingGenerateRowVO row : rows) { + if (row == null || StringUtils.isBlank(row.getSpecCode())) { + continue; + } + requiredCodes.add(row.getSpecCode().trim()); + String stepFilter = resolveMixingMaterialStep(row); + int mixingColumn = resolveMixingColumn(row, formula); + if ("Q".equalsIgnoreCase(stepFilter)) { + int lastBSegment = resolveLastBSegmentIndex(formula, lines); + if (lastBSegment > 0 && StringUtils.isNotBlank(rubberName)) { + //update-begin---author:jiangxh ---date:20260730 for:【混炼示方生成】母胶匹配不拼版本后缀----------- + requiredCodes.add(buildBfRubberSpecCode("B" + lastBSegment, rubberName)); + //update-end---author:jiangxh ---date:20260730 for:【混炼示方生成】母胶匹配不拼版本后缀----------- + } + } else if (mixingColumn > 1 && StringUtils.isNotBlank(rubberName)) { + //update-begin---author:jiangxh ---date:20260730 for:【混炼示方生成】母胶匹配不拼版本后缀----------- + requiredCodes.add(buildBfRubberSpecCode("B" + (mixingColumn - 1), rubberName)); + //update-end---author:jiangxh ---date:20260730 for:【混炼示方生成】母胶匹配不拼版本后缀----------- + } + } + List missing = new ArrayList<>(); + for (String code : requiredCodes) { + if (StringUtils.isBlank(code)) { + continue; + } + if (findRubberMaterialByCodeOrName(code.trim()) == null) { + missing.add(code.trim()); + } + } + if (!missing.isEmpty()) { + throw new IllegalArgumentException("请先维护母胶和终胶信息:" + String.join("、", missing)); + } + } + + /** + * @deprecated 已改为仅匹配胶料列表,保留方法避免历史调用编译缺口;生成流程不再自动写入胶料。 + */ + @Deprecated private void syncGeneratedRubberMixerMaterial( MesXslFormulaMixingGenerateRowVO row, MesXslFormulaSpec formula, @@ -784,60 +888,9 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl lines) { if (CollectionUtils.isEmpty(lines)) { return false; @@ -1071,10 +1141,11 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl 0) { - String motherSpecCode = appendFormulaCodeSuffix("B" + lastBSegment + rubberName, codeSuffix); + //update-begin---author:jiangxh ---date:20260730 for:【混炼示方生成】母胶编号不拼版本后缀----------- + String motherSpecCode = buildBfRubberSpecCode("B" + lastBSegment, rubberName); + //update-end---author:jiangxh ---date:20260730 for:【混炼示方生成】母胶编号不拼版本后缀----------- BigDecimal motherWeight = resolveStageCumulativeTotal(formula, lines, lastBSegment); materials.add( createMotherRubberMaterial( @@ -1095,7 +1166,6 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl add(@RequestBody MesMaterial model) { + //update-begin---author:jiangxh ---date:20260729 for:【胶料】名称/编码唯一校验----------- + String err = validateUnique(model, null); + if (err != null) { + return Result.error(err); + } + //update-end---author:jiangxh ---date:20260729 for:【胶料】名称/编码唯一校验----------- mesMaterialService.save(model); mesMaterialService.notifyMaterialChanged("material.created", model); return Result.OK("添加成功!"); @@ -69,6 +77,12 @@ public class MesMaterialController extends JeecgController edit(@RequestBody MesMaterial model) { + //update-begin---author:jiangxh ---date:20260729 for:【胶料】名称/编码唯一校验----------- + String err = validateUnique(model, model.getId()); + if (err != null) { + return Result.error(err); + } + //update-end---author:jiangxh ---date:20260729 for:【胶料】名称/编码唯一校验----------- mesMaterialService.updateById(model); mesMaterialService.notifyMaterialChanged("material.updated", model); return Result.OK("编辑成功!"); @@ -106,6 +120,57 @@ public class MesMaterialController extends JeecgController checkMaterialCode( + @RequestParam(name = "materialCode", required = true) String materialCode, + @RequestParam(name = "dataId", required = false) String dataId) { + if (oConvertUtils.isEmpty(materialCode) || materialCode.trim().isEmpty()) { + return Result.OK("该值可用!"); + } + if (mesMaterialService.isMaterialCodeDuplicated(materialCode, dataId)) { + return Result.error("胶料编码不能重复"); + } + return Result.OK("该值可用!"); + } + + @Operation(summary = "校验胶料名称是否重复") + @GetMapping("/checkMaterialName") + public Result checkMaterialName( + @RequestParam(name = "materialName", required = true) String materialName, + @RequestParam(name = "dataId", required = false) String dataId) { + if (oConvertUtils.isEmpty(materialName) || materialName.trim().isEmpty()) { + return Result.OK("该值可用!"); + } + if (mesMaterialService.isMaterialNameDuplicated(materialName, dataId)) { + return Result.error("胶料名称不能重复"); + } + return Result.OK("该值可用!"); + } + + private String validateUnique(MesMaterial model, String excludeId) { + if (model == null) { + return "数据不能为空"; + } + if (oConvertUtils.isEmpty(model.getMaterialName()) || StringUtils.isBlank(model.getMaterialName())) { + return "胶料名称不能为空"; + } + model.setMaterialName(model.getMaterialName().trim()); + //update-begin---author:jiangxh ---date:20260730 for:【胶料】保存时编号与名称保持一致(界面隐藏编号)----------- + // 表单/列表不展示编号,保存时自动用胶料名称回填胶料编号 + model.setMaterialCode(model.getMaterialName()); + //update-end---author:jiangxh ---date:20260730 for:【胶料】保存时编号与名称保持一致(界面隐藏编号)----------- + if (mesMaterialService.isMaterialNameDuplicated(model.getMaterialName(), excludeId)) { + return "胶料名称不能重复"; + } + if (mesMaterialService.isMaterialCodeDuplicated(model.getMaterialCode(), excludeId)) { + return "胶料编码不能重复"; + } + return null; + } + //update-end---author:jiangxh ---date:20260729 for:【胶料】名称/编码唯一校验接口----------- + @RequiresPermissions("mes:mes_material:exportXls") @RequestMapping("/exportXls") public ModelAndView exportXls(HttpServletRequest request, MesMaterial model) { diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/controller/MesMixerMaterialController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/controller/MesMixerMaterialController.java index 093bfe5e..a8d2de2e 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/controller/MesMixerMaterialController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/controller/MesMixerMaterialController.java @@ -11,11 +11,13 @@ import jakarta.servlet.http.HttpServletResponse; import java.util.Arrays; import java.util.List; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.system.base.controller.JeecgController; import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.mes.material.entity.MesMixerMaterial; import org.jeecg.modules.mes.material.service.IMesMixerMaterialService; import org.springframework.messaging.simp.SimpMessagingTemplate; @@ -52,6 +54,12 @@ public class MesMixerMaterialController extends JeecgController add(@RequestBody MesMixerMaterial model) { + //update-begin---author:jiangxh ---date:20260729 for:【密炼物料】名称/编码唯一校验----------- + String err = validateUnique(model, null); + if (err != null) { + return Result.error(err); + } + //update-end---author:jiangxh ---date:20260729 for:【密炼物料】名称/编码唯一校验----------- service.save(model); publishChanged("add", model.getId()); return Result.OK("添加成功!"); @@ -62,6 +70,12 @@ public class MesMixerMaterialController extends JeecgController edit(@RequestBody MesMixerMaterial model) { + //update-begin---author:jiangxh ---date:20260729 for:【密炼物料】名称/编码唯一校验----------- + String err = validateUnique(model, model.getId()); + if (err != null) { + return Result.error(err); + } + //update-end---author:jiangxh ---date:20260729 for:【密炼物料】名称/编码唯一校验----------- service.updateById(model); publishChanged("edit", model.getId()); return Result.OK("编辑成功!"); @@ -110,6 +124,12 @@ public class MesMixerMaterialController extends JeecgController anonAdd(@RequestBody MesMixerMaterial model) { + //update-begin---author:jiangxh ---date:20260729 for:【密炼物料】名称/编码唯一校验----------- + String err = validateUnique(model, null); + if (err != null) { + return Result.error(err); + } + //update-end---author:jiangxh ---date:20260729 for:【密炼物料】名称/编码唯一校验----------- service.save(model); publishChanged("add", model.getId()); return Result.OK("添加成功!"); @@ -118,6 +138,12 @@ public class MesMixerMaterialController extends JeecgController anonEdit(@RequestBody MesMixerMaterial model) { + //update-begin---author:jiangxh ---date:20260729 for:【密炼物料】名称/编码唯一校验----------- + String err = validateUnique(model, model.getId()); + if (err != null) { + return Result.error(err); + } + //update-end---author:jiangxh ---date:20260729 for:【密炼物料】名称/编码唯一校验----------- boolean ok = service.updateById(model); if (!ok) { return Result.error("数据已被他人修改,请刷新后重试"); @@ -148,6 +174,57 @@ public class MesMixerMaterialController extends JeecgController checkMaterialCode( + @RequestParam(name = "materialCode", required = true) String materialCode, + @RequestParam(name = "dataId", required = false) String dataId) { + if (oConvertUtils.isEmpty(materialCode) || materialCode.trim().isEmpty()) { + return Result.OK("该值可用!"); + } + if (service.isMaterialCodeDuplicated(materialCode, dataId)) { + return Result.error("物料编码不能重复"); + } + return Result.OK("该值可用!"); + } + + @Operation(summary = "校验物料名称是否重复") + @GetMapping("/checkMaterialName") + public Result checkMaterialName( + @RequestParam(name = "materialName", required = true) String materialName, + @RequestParam(name = "dataId", required = false) String dataId) { + if (oConvertUtils.isEmpty(materialName) || materialName.trim().isEmpty()) { + return Result.OK("该值可用!"); + } + if (service.isMaterialNameDuplicated(materialName, dataId)) { + return Result.error("物料名称不能重复"); + } + return Result.OK("该值可用!"); + } + + private String validateUnique(MesMixerMaterial model, String excludeId) { + if (model == null) { + return "数据不能为空"; + } + if (oConvertUtils.isEmpty(model.getMaterialCode()) || StringUtils.isBlank(model.getMaterialCode())) { + return "物料编码不能为空"; + } + model.setMaterialCode(model.getMaterialCode().trim()); + if (service.isMaterialCodeDuplicated(model.getMaterialCode(), excludeId)) { + return "物料编码不能重复"; + } + if (oConvertUtils.isEmpty(model.getMaterialName()) || StringUtils.isBlank(model.getMaterialName())) { + return "物料名称不能为空"; + } + model.setMaterialName(model.getMaterialName().trim()); + if (service.isMaterialNameDuplicated(model.getMaterialName(), excludeId)) { + return "物料名称不能重复"; + } + return null; + } + //update-end---author:jiangxh ---date:20260729 for:【密炼物料】名称/编码唯一校验接口----------- + @RequiresPermissions("mes:mes_mixer_material:exportXls") @RequestMapping("/exportXls") public ModelAndView exportXls(HttpServletRequest request, MesMixerMaterial model) { diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/IMesMaterialService.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/IMesMaterialService.java index 76cb934a..5450255d 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/IMesMaterialService.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/IMesMaterialService.java @@ -5,4 +5,10 @@ import org.jeecg.modules.mes.material.entity.MesMaterial; public interface IMesMaterialService extends IService { void notifyMaterialChanged(String eventType, MesMaterial material); + + //update-begin---author:jiangxh ---date:20260729 for:【胶料】名称/编码唯一校验----------- + boolean isMaterialCodeDuplicated(String materialCode, String excludeId); + + boolean isMaterialNameDuplicated(String materialName, String excludeId); + //update-end---author:jiangxh ---date:20260729 for:【胶料】名称/编码唯一校验----------- } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/IMesMixerMaterialService.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/IMesMixerMaterialService.java index 50dceede..dde48275 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/IMesMixerMaterialService.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/IMesMixerMaterialService.java @@ -3,4 +3,11 @@ package org.jeecg.modules.mes.material.service; import com.baomidou.mybatisplus.extension.service.IService; import org.jeecg.modules.mes.material.entity.MesMixerMaterial; -public interface IMesMixerMaterialService extends IService {} +public interface IMesMixerMaterialService extends IService { + + //update-begin---author:jiangxh ---date:20260729 for:【密炼物料】名称/编码唯一校验----------- + boolean isMaterialCodeDuplicated(String materialCode, String excludeId); + + boolean isMaterialNameDuplicated(String materialName, String excludeId); + //update-end---author:jiangxh ---date:20260729 for:【密炼物料】名称/编码唯一校验----------- +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/impl/MesMaterialServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/impl/MesMaterialServiceImpl.java index bf564df5..8dbd2aca 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/impl/MesMaterialServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/impl/MesMaterialServiceImpl.java @@ -1,9 +1,11 @@ package org.jeecg.modules.mes.material.service.impl; import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import java.util.HashMap; import java.util.Map; +import org.apache.commons.lang3.StringUtils; import org.jeecg.modules.mes.material.entity.MesMaterial; import org.jeecg.modules.mes.material.mapper.MesMaterialMapper; import org.jeecg.modules.mes.material.service.IMesMaterialService; @@ -25,4 +27,32 @@ public class MesMaterialServiceImpl extends ServiceImpl wrapper = + new LambdaQueryWrapper().eq(MesMaterial::getMaterialCode, materialCode.trim()); + if (StringUtils.isNotBlank(excludeId)) { + wrapper.ne(MesMaterial::getId, excludeId.trim()); + } + return this.count(wrapper) > 0; + } + + @Override + public boolean isMaterialNameDuplicated(String materialName, String excludeId) { + if (StringUtils.isBlank(materialName)) { + return false; + } + LambdaQueryWrapper wrapper = + new LambdaQueryWrapper().eq(MesMaterial::getMaterialName, materialName.trim()); + if (StringUtils.isNotBlank(excludeId)) { + wrapper.ne(MesMaterial::getId, excludeId.trim()); + } + return this.count(wrapper) > 0; + } + //update-end---author:jiangxh ---date:20260729 for:【胶料】名称/编码唯一校验----------- } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/impl/MesMixerMaterialServiceImpl.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/impl/MesMixerMaterialServiceImpl.java index 604d69ad..ae7f5be2 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/impl/MesMixerMaterialServiceImpl.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/impl/MesMixerMaterialServiceImpl.java @@ -1,6 +1,8 @@ package org.jeecg.modules.mes.material.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.lang3.StringUtils; import org.jeecg.modules.mes.material.entity.MesMixerMaterial; import org.jeecg.modules.mes.material.mapper.MesMixerMaterialMapper; import org.jeecg.modules.mes.material.service.IMesMixerMaterialService; @@ -8,4 +10,33 @@ import org.springframework.stereotype.Service; @Service public class MesMixerMaterialServiceImpl extends ServiceImpl - implements IMesMixerMaterialService {} + implements IMesMixerMaterialService { + + //update-begin---author:jiangxh ---date:20260729 for:【密炼物料】名称/编码唯一校验----------- + @Override + public boolean isMaterialCodeDuplicated(String materialCode, String excludeId) { + if (StringUtils.isBlank(materialCode)) { + return false; + } + LambdaQueryWrapper wrapper = + new LambdaQueryWrapper().eq(MesMixerMaterial::getMaterialCode, materialCode.trim()); + if (StringUtils.isNotBlank(excludeId)) { + wrapper.ne(MesMixerMaterial::getId, excludeId.trim()); + } + return this.count(wrapper) > 0; + } + + @Override + public boolean isMaterialNameDuplicated(String materialName, String excludeId) { + if (StringUtils.isBlank(materialName)) { + return false; + } + LambdaQueryWrapper wrapper = + new LambdaQueryWrapper().eq(MesMixerMaterial::getMaterialName, materialName.trim()); + if (StringUtils.isNotBlank(excludeId)) { + wrapper.ne(MesMixerMaterial::getId, excludeId.trim()); + } + return this.count(wrapper) > 0; + } + //update-end---author:jiangxh ---date:20260729 for:【密炼物料】名称/编码唯一校验----------- +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java index b450c275..82bdf506 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java @@ -61,16 +61,30 @@ public class WebSocket { @OnOpen public void onOpen(Session session, @PathParam(value = "userId") String userId) { try { - sessionPool.put(userId, session); + //update-begin---author:jiangxh ---date:20260729 for:【WebSocket】同 userId 新连接顶替旧连接,避免双连接互踢----------- + Session previous = sessionPool.put(userId, session); + if (previous != null && previous.isOpen() && !previous.getId().equals(session.getId())) { + try { + previous.close(); + } catch (Exception ignore) { + // ignore + } + } + //update-end---author:jiangxh ---date:20260729 for:【WebSocket】同 userId 新连接顶替旧连接,避免双连接互踢----------- log.info("【系统 WebSocket】连接建立 userId={}, sessionId={}, online={}", userId, session.getId(), sessionPool.size()); } catch (Exception e) { } } @OnClose - public void onClose(@PathParam("userId") String userId) { + public void onClose(Session session, @PathParam("userId") String userId) { try { - sessionPool.remove(userId); + //update-begin---author:jiangxh ---date:20260729 for:【WebSocket】仅移除当前 session,避免旧连接 onClose 清掉新连接----------- + Session current = sessionPool.get(userId); + if (current != null && session != null && current.getId().equals(session.getId())) { + sessionPool.remove(userId, current); + } + //update-end---author:jiangxh ---date:20260729 for:【WebSocket】仅移除当前 session,避免旧连接 onClose 清掉新连接----------- log.info("【系统 WebSocket】连接断开 userId={}, online={}", userId, sessionPool.size()); } catch (Exception e) { e.printStackTrace(); @@ -155,13 +169,24 @@ public class WebSocket { * ws接受客户端消息 */ @OnMessage - public void onMessage(String message, @PathParam(value = "userId") String userId) { + public void onMessage(String message, Session session, @PathParam(value = "userId") String userId) { String normalized = message == null ? "" : message.trim(); if (isHeartbeatOrBlank(normalized)) { log.debug("【系统 WebSocket】收到客户端心跳/空消息:{}", normalized); if ("ping".equalsIgnoreCase(normalized) || WebsocketConst.CMD_CHECK.equalsIgnoreCase(normalized)) { + //update-begin---author:jiangxh ---date:20260729 for:【WebSocket】心跳直接回包,避免走 Redis 导致 pong 超时断线----------- // 代码逻辑说明: 【issues/1161】前端websocket因心跳导致监听不起作用--- - this.sendMessage(userId, "ping"); + // 心跳必须同连接即时回包;走 Redis 发布订阅可能延迟/失败,触发前端 pongTimeout 断线重连 + try { + if (session != null && session.isOpen()) { + synchronized (session) { + session.getBasicRemote().sendText("ping"); + } + } + } catch (Exception e) { + log.warn("【系统 WebSocket】心跳回包失败 userId={}, err={}", userId, e.getMessage()); + } + //update-end---author:jiangxh ---date:20260729 for:【WebSocket】心跳直接回包,避免走 Redis 导致 pong 超时断线----------- } return; } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/blob.ftl b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/blob.ftl new file mode 100644 index 00000000..eb85ea9c --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/blob.ftl @@ -0,0 +1,67 @@ +<#if po.fieldDbType=='Blob'> + private transient java.lang.String ${po.fieldName}String; + + private byte[] ${po.fieldName}; + + public byte[] get${po.fieldName?cap_first}(){ + if(${po.fieldName}String==null){ + return null; + } + try { + return ${po.fieldName}String.getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return null; + } + + public String get${po.fieldName?cap_first}String(){ + if(${po.fieldName}==null || ${po.fieldName}.length==0){ + return ""; + } + try { + return new String(${po.fieldName},"UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return ""; + } +<#elseif po.classType=='switch'> + <#assign switch_extend_arr=['Y','N']> + <#if po.dictField?default("")?contains("[")> + <#assign switch_extend_arr=po.dictField?eval> + + <#list switch_extend_arr as a> + <#if a_index == 0> + <#assign switch_extend_arr1=a> + <#else> + <#assign switch_extend_arr2=a> + + + @Excel(name = "${po.filedComment}", width = 15,replace = {"是_${switch_extend_arr1}","否_${switch_extend_arr2}"} ) + @Schema(description = "${po.filedComment}") + private ${po.fieldType} ${po.fieldName}; +<#elseif po.classType=='pca'> + @Excel(name = "${po.filedComment}", width = 15,exportConvert=true,importConvert = true ) + @Schema(description = "${po.filedComment}") + private ${po.fieldType} ${po.fieldName}; + + public String convertis${po.fieldName?cap_first}() { + return SpringContextUtils.getBean(ProvinceCityArea.class).getText(${po.fieldName}); + } + + public void convertset${po.fieldName?cap_first}(String text) { + this.${po.fieldName} = SpringContextUtils.getBean(ProvinceCityArea.class).getCode(text); + } +<#elseif po.classType=='cat_tree'> + <#assign list_field_dictCode=', dictTable = "sys_category", dicText = "name", dicCode = "id"'> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + @Schema(description = "${po.filedComment}") + private ${po.fieldType} ${po.fieldName}; +<#else> + @Schema(description = "${po.filedComment}") + <#if po.fieldDbName == 'del_flag'> + @TableLogic + + private ${po.fieldType} ${po.fieldName}; + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vue3NativeComponents.ftl b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vue3NativeComponents.ftl new file mode 100644 index 00000000..30a4861f --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vue3NativeComponents.ftl @@ -0,0 +1,53 @@ +<#if need_select_tag> + JDictSelectTag, + +<#if need_switch> + JSwitch, + +<#if need_multi> + JSelectMultiple, + +<#if need_search> + JSearchSelect, + +<#if need_popup> + JPopup, + +<#if need_popup_dict> + JPopupDict, + +<#if need_category> + JCategorySelect, + +<#if need_dept> + JSelectDept, + +<#if need_dept_user> +<#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + JSelectUser, +<#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + +<#if need_select_tree> + JTreeSelect, + +<#if need_time> + TimePicker, + +<#if need_pca> + JAreaLinkage, + +<#if need_upload> + JUpload, + +<#if need_image_upload> + JImageUpload, + +<#if need_markdown> + JMarkdownEditor, + +<#if need_editor> + JEditor, + +<#if need_checkbox> + JCheckbox, + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vue3NativeForm.ftl b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vue3NativeForm.ftl new file mode 100644 index 00000000..519ecb5a --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vue3NativeForm.ftl @@ -0,0 +1,119 @@ +<#include "/common/utils.ftl"> +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if po.isShow =='Y' && po.fieldName != 'id' && po.fieldName !='delFlag' && isNotPidField(tableVo, po.fieldDbName)> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#assign form_field_dictCode=""> + <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}"> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictField}"> + + + + <#if po.classType =='date'> + picker="${po.extendParams.picker}" v-model:value="formData.${po.fieldName}" value-format="YYYY-MM-DD" style="width: 100%" <#if po.readonly=='Y'>disabled allow-clear /> + <#elseif po.classType =='datetime'> + disabled allow-clear /> + <#elseif po.classType =='time'> + <#assign need_time = true> + disabled allow-clear /> + <#elseif po.classType =='popup'> + <#assign need_popup = true> + <#assign sourceFields = po.dictField?default("")?trim?split(",")/> + <#assign targetFields = po.dictText?default("")?trim?split(",")/> + disabled<#rt> allow-clear /> + <#elseif po.classType =='popup_dict'> + <#assign need_popup_dict = true> + <#assign sourceFields = po.dictField?default("")?trim?split(",")/> + <#assign targetFields = po.dictText?default("")?trim?split(",")/> + disabled /> + <#elseif po.classType =='sel_depart'> + <#assign need_dept = true> + labelKey="${po.extendParams.text}" <#if po.extendParams?exists && po.extendParams.store?exists>rowKey="${po.extendParams.store}" <#if po.readonly=='Y'>disabled :multiple="${po.extendParams.multi?default('true')}" checkStrictly <#if po.readonly=='Y'>disabled allow-clear /> + <#elseif po.classType =='switch'> + <#assign need_switch = true> + :options="${po.dictField}" <#if po.readonly=='Y'>disabled> + <#elseif po.classType =='pca'> + <#assign need_pca = true> + disabled allow-clear /> + <#elseif po.classType =='markdown'> + <#assign need_markdown = true> + disabled> + <#elseif po.classType =='password'> + disabled allow-clear /> + <#elseif po.classType =='sel_user'> + <#assign need_dept_user = true> + <#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + labelKey="${po.extendParams.text}" <#if po.extendParams?exists && po.extendParams.store?exists>rowKey="${po.extendParams.store}" <#if po.readonly=='Y'>disabled allow-clear /> + <#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + <#elseif po.classType =='textarea'> + disabled/> + <#elseif po.classType=='radio'> + <#assign need_select_tag = true> + disabled allow-clear /> + <#elseif po.classType=='list'> + <#assign need_select_tag = true> + disabled allow-clear /> + <#elseif po.classType=='list_multi'> + <#assign need_multi = true> + disabled :triggerChange="false"/> + <#elseif po.classType=='checkbox'> + <#assign need_checkbox = true> + disabled allow-clear /> + <#elseif po.classType=='sel_search'> + <#assign need_search = true> + disabled allow-clear /> + <#elseif po.classType=='cat_tree'> + <#assign need_category = true> + back="${dashedToCamel(po.dictText)}" <#if po.readonly=='Y'>disabled @change="(value) => handleFormChange('${po.fieldName}', value)" allow-clear /> + <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + disabled/> + <#elseif po.classType=='file'> + <#assign need_upload = true> + disabled <#if po.uploadnum??>:maxCount=${po.uploadnum}> + <#elseif po.classType=='image'> + <#assign need_image_upload = true> + :fileMax=${po.uploadnum}<#else>:fileMax="0" v-model:value="formData.${po.fieldName}" <#if po.readonly=='Y'>disabled> + <#elseif po.classType=='umeditor'> + <#assign need_editor = true> + disabled :autoFocus="false"/> + <#elseif po.fieldDbType=='Blob'> + disabled allow-clear > + <#elseif po.classType == 'sel_tree'> + <#assign need_select_tree = true> + + <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> + dict="${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}" + <#elseif po.dictText?split(',')[1]??> + pidField="${po.dictText?split(',')[1]}" + <#elseif po.dictText?split(',')[3]??> + hasChildField="${po.dictText?split(',')[3]}" + + + pidValue="${po.dictField}" + <#if po.readonly=='Y'>disabled + v-model:value="formData.${po.fieldName}" + @change="(value) => handleFormChange('${po.fieldName}', value)" allow-clear > + + <#else> + disabled allow-clear > + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vue3NativeImport.ftl b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vue3NativeImport.ftl new file mode 100644 index 00000000..b770ae9f --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vue3NativeImport.ftl @@ -0,0 +1,59 @@ +<#if need_select_tag> + import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue'; + +<#if need_switch> + import JSwitch from '/@/components/Form/src/jeecg/components/JSwitch.vue'; + +<#if need_multi> + import JSelectMultiple from '/@/components/Form/src/jeecg/components/JSelectMultiple.vue'; + +<#if need_search> + import JSearchSelect from '/@/components/Form/src/jeecg/components/JSearchSelect.vue'; + +<#if need_popup> + import JPopup from '/@/components/Form/src/jeecg/components/JPopup.vue'; + +<#if need_popup_dict> + import JPopupDict from '/@/components/Form/src/jeecg/components/JPopupDict.vue'; + +<#if need_category> + import JCategorySelect from '/@/components/Form/src/jeecg/components/JCategorySelect.vue'; + +<#if need_dept> + import JSelectDept from '/@/components/Form/src/jeecg/components/JSelectDept.vue'; + +<#if need_dept_user> +<#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + import JSelectUser from '/@/components/Form/src/jeecg/components/JSelectUser.vue'; +<#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + +<#if need_select_tree> + import JTreeSelect from '/@/components/Form/src/jeecg/components/JTreeSelect.vue'; + +<#if need_time> + import { TimePicker } from 'ant-design-vue'; + +<#if need_pca> + import JAreaLinkage from '/@/components/Form/src/jeecg/components/JAreaLinkage.vue'; + +<#if need_upload> + import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue'; + +<#if need_image_upload> + import JImageUpload from '/@/components/Form/src/jeecg/components/JImageUpload.vue'; + +<#if need_markdown> + import JMarkdownEditor from '/@/components/Form/src/jeecg/components/JMarkdownEditor.vue'; + +<#if need_editor> + import JEditor from '/@/components/Form/src/jeecg/components/JEditor.vue'; + +<#if need_checkbox> + import JCheckbox from "/@/components/Form/src/jeecg/components/JCheckbox.vue"; + +<#if need_range_number> + import JRangeNumber from "/@/components/Form/src/jeecg/components/JRangeNumber.vue"; + +<#if is_like> + import JInput from "/@/components/Form/src/jeecg/components/JInput.vue"; + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vue3NativeSearch.ftl b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vue3NativeSearch.ftl new file mode 100644 index 00000000..f947b00d --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/common/form/native/vue3NativeSearch.ftl @@ -0,0 +1,108 @@ +<#include "/common/utils.ftl"> +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if po.isQuery=='Y' && po.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#assign query_flag=true> + <#if query_field_no==2> + + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi new file mode 100644 index 00000000..61acd7f6 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi @@ -0,0 +1,72 @@ +import { defHttp } from '/@/utils/http/axios'; +import { useMessage } from "/@/hooks/web/useMessage"; + +const { createConfirm } = useMessage(); + +enum Api { + list = '/${entityPackagePath}/${entityName?uncap_first}/list', + save='/${entityPackagePath}/${entityName?uncap_first}/add', + edit='/${entityPackagePath}/${entityName?uncap_first}/edit', + deleteOne = '/${entityPackagePath}/${entityName?uncap_first}/delete', + deleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch', + importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel', + exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls', +} + +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; + +/** + * 导入api + */ +export const getImportUrl = Api.importExcel; + +/** + * 列表接口 + * @param params + */ +export const list = (params) => defHttp.get({ url: Api.list, params }); + +/** + * 删除单个 + * @param params + * @param handleSuccess + */ +export const deleteOne = (params,handleSuccess) => { + return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); +} + +/** + * 批量删除 + * @param params + * @param handleSuccess + */ +export const batchDelete = (params, handleSuccess) => { + createConfirm({ + iconType: 'warning', + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); + } + }); +} + +/** + * 保存或者更新 + * @param params + * @param isUpdate + */ +export const saveOrUpdate = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({ url: url, params }, { isTransformResponse: false }); +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi new file mode 100644 index 00000000..03bf054d --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi @@ -0,0 +1,90 @@ +<#include "/common/utils.ftl"> +import {BasicColumn} from '/@/components/Table'; +import {FormSchema} from '/@/components/Table'; +import { rules} from '/@/utils/helper/validator'; +import { render } from '/@/utils/common/renderUtils'; +import { getWeekMonthQuarterYear } from '/@/utils'; +//列表数据 +export const columns: BasicColumn[] = [ + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + { + title: '${po.filedComment}', + align: "center", + <#if po.sort=='Y'> + sorter: true, + + <#if po.classType=='date'> + dataIndex: '${po.fieldName}', + customRender:({text}) =>{ + text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text); + <#if po.extendParams?exists && po.extendParams.picker?exists> + if(text) { + return getWeekMonthQuarterYear(text)['${po.extendParams.picker}']; + } else { + return text; + } + <#else> + return text; + + }, + <#elseif po.fieldDbType=='Blob'> + dataIndex: '${po.fieldName}String' + <#elseif po.classType=='umeditor'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='pca'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='file'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='image'> + dataIndex: '${po.fieldName}', + customRender: render.renderImage, + <#elseif po.classType=='switch'> + dataIndex: '${po.fieldName}', +<#assign switch_extend_arr=['Y','N']> +<#if po.dictField?default("")?contains("[")> +<#assign switch_extend_arr=po.dictField?eval> + +<#list switch_extend_arr as a> +<#if a_index == 0> +<#assign switch_extend_arr1=a> +<#else> +<#assign switch_extend_arr2=a> + + + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}]); + }, + <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict'> + dataIndex: '${po.fieldName}_dictText' + <#elseif po.classType=='cat_tree'> + dataIndex: '${po.fieldName}', + <#if po.dictText?default("")?trim?length == 0> + customRender:({text}) => { + return render.renderCategoryTree(text,'${po.dictField?default("")}'); + }, + <#else> + customRender: ({text, record}) => (text ? record['${po.dictText}'] : ''); + + <#else> + dataIndex: '${po.fieldName}' + + }, + + +]; + +<#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> +// 高级查询数据 +export const superQuerySchema = { + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + ${superQueryFieldListForVue3(po,po_index)}, + + +}; +<#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql new file mode 100644 index 00000000..5396d5d5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql @@ -0,0 +1 @@ +<#include "/common/sql/menu_insert.ftl"> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei new file mode 100644 index 00000000..0c3f5ee7 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei @@ -0,0 +1,256 @@ +<#include "/common/utils.ftl"> + + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei new file mode 100644 index 00000000..29dc0766 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei @@ -0,0 +1,102 @@ +<#include "/common/utils.ftl"> + + + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai new file mode 100644 index 00000000..9192569c --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -0,0 +1,286 @@ +package ${bussiPackage}.${entityPackage}.controller; + +import java.io.UnsupportedEncodingException; +import java.io.IOException; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.vo.LoginUser; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.util.oConvertUtils; +import org.jeecgframework.poi.excel.entity.enmus.ExcelType; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import ${bussiPackage}.${entityPackage}.vo.${entityName}Page; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.service.I${sub.entityName}Service; + +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; +<#assign bpm_flag=false> +<#list originalColumns as po> +<#if po.fieldDbName=='bpm_status'> + <#assign bpm_flag=true> + + + + /** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Tag(name="${tableVo.ftlDescription}") +@RestController +@RequestMapping("/${entityPackagePath}/${entityName?uncap_first}") +@Slf4j +public class ${entityName}Controller { + @Autowired + private I${entityName}Service ${entityName?uncap_first}Service; + <#list subTables as sub> + @Autowired + private I${sub.entityName}Service ${sub.entityName?uncap_first}Service; + + + /** + * 分页列表查询 + * + * @param ${entityName?uncap_first} + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "${tableVo.ftlDescription}-分页列表查询") + @Operation(summary="${tableVo.ftlDescription}-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(${entityName} ${entityName?uncap_first}, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap()); + Page<${entityName}> page = new Page<${entityName}>(pageNo, pageSize); + IPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param ${entityName?uncap_first}Page + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-添加") + @Operation(summary="${tableVo.ftlDescription}-添加") + @RequiresPermissions("${entityPackage}:${tableName}:add") + @PostMapping(value = "/add") + public Result add(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { + ${entityName} ${entityName?uncap_first} = new ${entityName}(); + BeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first}); + <#if bpm_flag> + ${entityName?uncap_first}.setBpmStatus("1"); + + ${entityName?uncap_first}Service.saveMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param ${entityName?uncap_first}Page + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-编辑") + @Operation(summary="${tableVo.ftlDescription}-编辑") + @RequiresPermissions("${entityPackage}:${tableName}:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { + ${entityName} ${entityName?uncap_first} = new ${entityName}(); + BeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first}); + ${entityName} ${entityName?uncap_first}Entity = ${entityName?uncap_first}Service.getById(${entityName?uncap_first}.getId()); + if(${entityName?uncap_first}Entity==null) { + return Result.error("未找到对应数据"); + } + ${entityName?uncap_first}Service.updateMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-通过id删除") + @Operation(summary="${tableVo.ftlDescription}-通过id删除") + @RequiresPermissions("${entityPackage}:${tableName}:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + ${entityName?uncap_first}Service.delMain(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-批量删除") + @Operation(summary="${tableVo.ftlDescription}-批量删除") + @RequiresPermissions("${entityPackage}:${tableName}:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "${tableVo.ftlDescription}-通过id查询") + @Operation(summary="${tableVo.ftlDescription}-通过id查询") + @GetMapping(value = "/queryById") + public Result<${entityName}> queryById(@RequestParam(name="id",required=true) String id) { + ${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id); + if(${entityName?uncap_first}==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(${entityName?uncap_first}); + + } + + <#list subTables as sub> + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "${sub.ftlDescription}通过主表ID查询") + @Operation(summary="${sub.ftlDescription}主表ID查询") + @GetMapping(value = "/query${sub.entityName}ByMainId") + public Result> query${sub.entityName}ListByMainId(@RequestParam(name="id",required=true) String id) { + List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(id); + return Result.OK(${sub.entityName?uncap_first}List); + } + + + /** + * 导出excel + * + * @param request + * @param ${entityName?uncap_first} + */ + @RequiresPermissions("${entityPackage}:${tableName}:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) { + // Step.1 组装查询条件查询数据 + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap()); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + + //配置选中数据查询条件 + String selections = request.getParameter("selections"); + if(oConvertUtils.isNotEmpty(selections)) { + List selectionList = Arrays.asList(selections.split(",")); + queryWrapper.in("id",selectionList); + } + //Step.2 获取导出数据 + List<${entityName}> ${entityName?uncap_first}List = ${entityName?uncap_first}Service.list(queryWrapper); + + // Step.3 组装pageList + List<${entityName}Page> pageList = new ArrayList<${entityName}Page>(); + for (${entityName} main : ${entityName?uncap_first}List) { + ${entityName}Page vo = new ${entityName}Page(); + BeanUtils.copyProperties(main, vo); + <#list subTables as sub> + List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(main.getId()); + vo.set${sub.entityName}List(${sub.entityName?uncap_first}List); + + pageList.add(vo); + } + + // Step.4 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + mv.addObject(NormalExcelConstants.FILE_NAME, "${tableVo.ftlDescription}列表"); + mv.addObject(NormalExcelConstants.CLASS, ${entityName}Page.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("${tableVo.ftlDescription}数据", "导出人:"+sysUser.getRealname(), "${tableVo.ftlDescription}", ExcelType.XSSF)); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("${entityPackage}:${tableName}:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + // 获取上传文件对象 + MultipartFile file = entity.getValue(); + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<${entityName}Page> list = ExcelImportUtil.importExcel(file.getInputStream(), ${entityName}Page.class, params); + for (${entityName}Page page : list) { + ${entityName} po = new ${entityName}(); + BeanUtils.copyProperties(page, po); + ${entityName?uncap_first}Service.saveMain(po, <#list subTables as sub>page.get${sub.entityName}List()<#if sub_has_next>,); + } + return Result.OK("文件导入成功!数据行数:" + list.size()); + } catch (Exception e) { + log.error(e.getMessage(),e); + return Result.error("文件导入失败:"+e.getMessage()); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.OK("文件导入失败!"); + } + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai new file mode 100644 index 00000000..d5e992bf --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai @@ -0,0 +1,77 @@ +<#include "/common/utils.ftl"> +package ${bussiPackage}.${entityPackage}.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Schema(description="${tableVo.ftlDescription}") +@Data +@TableName("${tableName}") +public class ${entityName} implements Serializable { + private static final long serialVersionUID = 1L; + +<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']> + <#list originalColumns as po> + <#-- 生成字典Code --> + <#assign list_field_dictCode=""> + <#if po.classType='sel_user'> + <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'> + <#elseif po.classType='sel_depart'> + <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'> + <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dicCode = "${po.dictField}"'> + + <#elseif po.classType=='sel_tree'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText?split(",")[2]}", dicCode = "${po.dictText?split(",")[0]}"'> + + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + @TableId(type = IdType.ASSIGN_ID) + <#else> + <#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'> + <#if po.classType=='date'> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + + + <#if list_field_dictCode?length gt 1> + @Dict(${list_field_dictCode?substring(2)}) + + + <#-- 大字段转换 --> + <#include "/common/blob.ftl"> + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai new file mode 100644 index 00000000..e4b78b96 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai @@ -0,0 +1,76 @@ +<#include "/common/utils.ftl"> +<#list subTables as subTab> +#segment#${subTab.entityName}.java +package ${bussiPackage}.${entityPackage}.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import java.util.Date; +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.UnsupportedEncodingException; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Schema(description="${subTab.ftlDescription}") +@Data +@TableName("${subTab.tableName}") +public class ${subTab.entityName} implements Serializable { + private static final long serialVersionUID = 1L; + +<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']> + <#list subTab.originalColumns as po> + <#-- 生成字典Code --> + <#assign list_field_dictCode=""> + <#if po.classType='sel_user'> + <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'> + <#elseif po.classType='sel_depart'> + <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'> + <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dicCode = "${po.dictField}"'> + <#elseif po.classType=='sel_tree'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText?split(",")[2]}", dicCode = "${po.dictText?split(",")[0]}"'> + + + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + @TableId(type = IdType.ASSIGN_ID) + <#else> + <#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'> + <#if po.classType=='date'> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + + <#elseif !subTab.foreignKeys?seq_contains(po.fieldName?cap_first)> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + + + + <#-- 大字段转换 --> + <#include "/common/blob.ftl"> + +} + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai new file mode 100644 index 00000000..c31b9bfd --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai @@ -0,0 +1,17 @@ +package ${bussiPackage}.${entityPackage}.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface ${entityName}Mapper extends BaseMapper<${entityName}> { + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai new file mode 100644 index 00000000..a33449b4 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai @@ -0,0 +1,34 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}Mapper.java +package ${bussiPackage}.${entityPackage}.mapper; + +import java.util.List; +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface ${subTab.entityName}Mapper extends BaseMapper<${subTab.entityName}> { + + /** + * 通过主表id删除子表数据 + * + * @param mainId 主表id + * @return boolean + */ + public boolean deleteByMainId(@Param("mainId") String mainId); + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List<${subTab.entityName}> + */ + public List<${subTab.entityName}> selectByMainId(@Param("mainId") String mainId); +} + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml new file mode 100644 index 00000000..16f3d653 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml new file mode 100644 index 00000000..117c9b6f --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml @@ -0,0 +1,26 @@ +<#list subTables as subTab> +<#assign originalForeignKeys = subTab.originalForeignKeys> +#segment#${subTab.entityName}Mapper.xml + + + + + + DELETE + FROM ${subTab.tableName} + WHERE + <#list originalForeignKeys as key> + ${key} = ${r'#'}{mainId} <#rt/> + + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai new file mode 100644 index 00000000..d56db205 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai @@ -0,0 +1,54 @@ +package ${bussiPackage}.${entityPackage}.service; + +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import com.baomidou.mybatisplus.extension.service.IService; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface I${entityName}Service extends IService<${entityName}> { + + /** + * 添加一对多 + * + * @param ${entityName?uncap_first} + <#list subTables as sub> + * @param ${sub.entityName?uncap_first}List + + */ + public void saveMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,) ; + + /** + * 修改一对多 + * + * @param ${entityName?uncap_first} + <#list subTables as sub> + * @param ${sub.entityName?uncap_first}List + + */ + public void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,); + + /** + * 删除一对多 + * + * @param id + */ + public void delMain (String id); + + /** + * 批量删除一对多 + * + * @param idList + */ + public void delBatchMain (Collection idList); + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai new file mode 100644 index 00000000..3d45c9fb --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai @@ -0,0 +1,25 @@ +<#list subTables as subTab> +#segment#I${subTab.entityName}Service.java +package ${bussiPackage}.${entityPackage}.service; + +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface I${subTab.entityName}Service extends IService<${subTab.entityName}> { + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List<${subTab.entityName}> + */ + public List<${subTab.entityName}> selectByMainId(String mainId); +} + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai new file mode 100644 index 00000000..7f99d42e --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai @@ -0,0 +1,105 @@ +package ${bussiPackage}.${entityPackage}.service.impl; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.mapper.${sub.entityName}Mapper; + +import ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import java.io.Serializable; +import java.util.List; +import java.util.Collection; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Service +public class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service { + + @Autowired + private ${entityName}Mapper ${entityName?uncap_first}Mapper; + <#list subTables as sub> + @Autowired + private ${sub.entityName}Mapper ${sub.entityName?uncap_first}Mapper; + + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveMain(${entityName} ${entityName?uncap_first}, <#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,) { + ${entityName?uncap_first}Mapper.insert(${entityName?uncap_first}); + <#list subTables as sub> + if(${sub.entityName?uncap_first}List!=null && ${sub.entityName?uncap_first}List.size()>0) { + for(${sub.entityName} entity:${sub.entityName?uncap_first}List) { + <#list sub.foreignKeys as key> + //外键设置 + <#if key?lower_case?index_of("${primaryKeyField}")!=-1> + entity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}()); + <#else> + entity.set${key?cap_first}(${entityName?uncap_first}.get${key}()); + + + ${sub.entityName?uncap_first}Mapper.insert(entity); + } + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,) { + ${entityName?uncap_first}Mapper.updateById(${entityName?uncap_first}); + + //1.先删除子表数据 + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(${entityName?uncap_first}.getId()); + + + //2.子表数据重新插入 + <#list subTables as sub> + if(${sub.entityName?uncap_first}List!=null && ${sub.entityName?uncap_first}List.size()>0) { + for(${sub.entityName} entity:${sub.entityName?uncap_first}List) { + <#list sub.foreignKeys as key> + //外键设置 + <#if key?lower_case?index_of("${primaryKeyField}")!=-1> + entity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}()); + <#else> + entity.set${key?cap_first}(${entityName?uncap_first}.get${key}()); + + + ${sub.entityName?uncap_first}Mapper.insert(entity); + } + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delMain(String id) { + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(id); + + ${entityName?uncap_first}Mapper.deleteById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delBatchMain(Collection idList) { + for(Serializable id:idList) { + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(id.toString()); + + ${entityName?uncap_first}Mapper.deleteById(id); + } + } + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai new file mode 100644 index 00000000..0ce41d36 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai @@ -0,0 +1,30 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}ServiceImpl.java +package ${bussiPackage}.${entityPackage}.service.impl; + +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import ${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper; +import ${bussiPackage}.${entityPackage}.service.I${subTab.entityName}Service; +import org.springframework.stereotype.Service; +import java.util.List; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Service +public class ${subTab.entityName}ServiceImpl extends ServiceImpl<${subTab.entityName}Mapper, ${subTab.entityName}> implements I${subTab.entityName}Service { + + @Autowired + private ${subTab.entityName}Mapper ${subTab.entityName?uncap_first}Mapper; + + @Override + public List<${subTab.entityName}> selectByMainId(String mainId) { + return ${subTab.entityName?uncap_first}Mapper.selectByMainId(mainId); + } +} + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai new file mode 100644 index 00000000..b34674e2 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai @@ -0,0 +1,83 @@ +package ${bussiPackage}.${entityPackage}.vo; + +import java.util.List; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecgframework.poi.excel.annotation.ExcelEntity; +import org.jeecgframework.poi.excel.annotation.ExcelCollection; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import java.util.Date; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Data +@Schema(description="${tableVo.ftlDescription}") +public class ${entityName}Page { + + <#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']> + <#list originalColumns as po> + <#-- 生成字典Code --> + <#assign list_field_dictCode=""> + <#if po.classType='sel_user'> + <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "realname", dicCode = "username"'> + <#elseif po.classType='sel_depart'> + <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "depart_name", dicCode = "id"'> + <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dicCode = "${po.dictField}"'> + + + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + <#else> + <#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'> + <#if po.classType=='date'> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + + + <#if list_field_dictCode?length gt 1> + @Dict(${list_field_dictCode?substring(2)}) + + + @Schema(description = "${po.filedComment}") + <#if po.fieldDbType=='Blob'> + private java.lang.String ${po.fieldName}String; + <#else> + private ${po.fieldType} ${po.fieldName}; + + + + <#list subTables as sub> + @ExcelCollection(name="${sub.ftlDescription}") + @Schema(description = "${sub.ftlDescription}") + private List<${sub.entityName}> ${sub.entityName?uncap_first}List; + + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei new file mode 100644 index 00000000..6605f0c7 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei @@ -0,0 +1,397 @@ + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql new file mode 100644 index 00000000..5396d5d5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql @@ -0,0 +1 @@ +<#include "/common/sql/menu_insert.ftl"> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei new file mode 100644 index 00000000..89518375 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei @@ -0,0 +1,562 @@ +<#include "/common/utils.ftl"> + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei new file mode 100644 index 00000000..8021bb83 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei @@ -0,0 +1,65 @@ +<#include "/common/utils.ftl"> + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei new file mode 100644 index 00000000..e625f88a --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei @@ -0,0 +1,197 @@ +<#include "/common/utils.ftl"> +<#list subTables as sub> +<#if sub.foreignRelationType=='1'> +#segment#${sub.entityName}Form.vue + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai new file mode 100644 index 00000000..468ef47b --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -0,0 +1,372 @@ +package ${bussiPackage}.${entityPackage}.controller; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.common.system.vo.SelectTreeModel; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + + /** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +<#assign pidFieldName = ""> +<#list originalColumns as po> +<#if po.fieldDbName == tableVo.extendParams.pidField> +<#assign pidFieldName = po.fieldName> + + +<#assign enhanceJavaList=[]> +<#if tableVo.extendParams?? && tableVo.extendParams.enhanceJavaList??> + <#assign enhanceJavaList = tableVo.extendParams.enhanceJavaList?filter(enhance -> enhance??)> + +@Tag(name="${tableVo.ftlDescription}") +@RestController +@RequestMapping("/${entityPackagePath}/${entityName?uncap_first}") +@Slf4j +public class ${entityName}Controller extends JeecgController<${entityName}, I${entityName}Service>{ + @Autowired + private I${entityName}Service ${entityName?uncap_first}Service; + + /** + * 分页列表查询 + * + * @param ${entityName?uncap_first} + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "${tableVo.ftlDescription}-分页列表查询") + @Operation(summary="${tableVo.ftlDescription}-分页列表查询") + @GetMapping(value = "/rootList") + public Result> queryPageList(${entityName} ${entityName?uncap_first}, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 查询前触发的方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeQuery() + + + + String hasQuery = req.getParameter("hasQuery"); + if(hasQuery != null && "true".equals(hasQuery)){ + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap()); + List<${entityName}> list = ${entityName?uncap_first}Service.queryTreeListNoPage(queryWrapper); + IPage<${entityName}> pageList = new Page<>(1, 10, list.size()); + pageList.setRecords(list); + return Result.OK(pageList); + }else{ + String parentId = ${entityName?uncap_first}.get${pidFieldName?cap_first}(); + if (oConvertUtils.isEmpty(parentId)) { + parentId = "0"; + } + ${entityName?uncap_first}.set${pidFieldName?cap_first}(null); + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap()); + // 使用 eq 防止模糊查询 + queryWrapper.eq("${Format.humpToUnderline(pidFieldName)}", parentId); + Page<${entityName}> page = new Page<${entityName}>(pageNo, pageSize); + IPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper); + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'> + //TODO 查询后触发的方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.afterQuery() + + + + return Result.OK(pageList); + } + } + + /** + * 【vue3专用】加载节点的子数据 + * + * @param pid + * @return + */ + @RequestMapping(value = "/loadTreeChildren", method = RequestMethod.GET) + public Result> loadTreeChildren(@RequestParam(name = "pid") String pid) { + Result> result = new Result<>(); + try { + List ls = ${entityName?uncap_first}Service.queryListByPid(pid); + result.setResult(ls); + result.setSuccess(true); + } catch (Exception e) { + e.printStackTrace(); + result.setMessage(e.getMessage()); + result.setSuccess(false); + } + return result; + } + + /** + * 【vue3专用】加载一级节点/如果是同步 则所有数据 + * + * @param async + * @param pcode + * @return + */ + @RequestMapping(value = "/loadTreeRoot", method = RequestMethod.GET) + public Result> loadTreeRoot(@RequestParam(name = "async") Boolean async, @RequestParam(name = "pcode") String pcode) { + Result> result = new Result<>(); + try { + List ls = ${entityName?uncap_first}Service.queryListByCode(pcode); + if (!async) { + loadAllChildren(ls); + } + result.setResult(ls); + result.setSuccess(true); + } catch (Exception e) { + e.printStackTrace(); + result.setMessage(e.getMessage()); + result.setSuccess(false); + } + return result; + } + + /** + * 【vue3专用】递归求子节点 同步加载用到 + * + * @param ls + */ + private void loadAllChildren(List ls) { + for (SelectTreeModel tsm : ls) { + List temp = ${entityName?uncap_first}Service.queryListByPid(tsm.getKey()); + if (temp != null && temp.size() > 0) { + tsm.setChildren(temp); + loadAllChildren(temp); + } + } + } + + /** + * 获取子数据 + * @param ${entityName?uncap_first} + * @param req + * @return + */ + //@AutoLog(value = "${tableVo.ftlDescription}-获取子数据") + @Operation(summary="${tableVo.ftlDescription}-获取子数据") + @GetMapping(value = "/childList") + public Result> queryPageList(${entityName} ${entityName?uncap_first},HttpServletRequest req) { + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap()); + List<${entityName}> list = ${entityName?uncap_first}Service.list(queryWrapper); + IPage<${entityName}> pageList = new Page<>(1, 10, list.size()); + pageList.setRecords(list); + return Result.OK(pageList); + } + + /** + * 批量查询子节点 + * @param parentIds 父ID(多个采用半角逗号分割) + * @return 返回 IPage + * @param parentIds + * @return + */ + //@AutoLog(value = "${tableVo.ftlDescription}-批量获取子数据") + @Operation(summary="${tableVo.ftlDescription}-批量获取子数据") + @GetMapping("/getChildListBatch") + public Result getChildListBatch(@RequestParam("parentIds") String parentIds) { + try { + QueryWrapper<${entityName}> queryWrapper = new QueryWrapper<>(); + List parentIdList = Arrays.asList(parentIds.split(",")); + queryWrapper.in("${Format.humpToUnderline(pidFieldName)}", parentIdList); + List<${entityName}> list = ${entityName?uncap_first}Service.list(queryWrapper); + IPage<${entityName}> pageList = new Page<>(1, 10, list.size()); + pageList.setRecords(list); + return Result.OK(pageList); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.error("批量查询子节点失败:" + e.getMessage()); + } + } + + /** + * 添加 + * + * @param ${entityName?uncap_first} + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-添加") + @Operation(summary="${tableVo.ftlDescription}-添加") + @RequiresPermissions("${entityPackage}:${tableName}:add") + @PostMapping(value = "/add") + public Result add(@RequestBody ${entityName} ${entityName?uncap_first}) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 新增前的处理方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeAdd() + + + + ${entityName?uncap_first}Service.add${entityName}(${entityName?uncap_first}); + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'> + //TODO 新增后的处理方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.afterAdd() + + + + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param ${entityName?uncap_first} + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-编辑") + @Operation(summary="${tableVo.ftlDescription}-编辑") + @RequiresPermissions("${entityPackage}:${tableName}:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody ${entityName} ${entityName?uncap_first}) { +<#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 编辑前,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeEdit() + + + + ${entityName?uncap_first}Service.update${entityName}(${entityName?uncap_first}); +<#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'> + //TODO 编辑后,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.afterEdit() + + + + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-通过id删除") + @Operation(summary="${tableVo.ftlDescription}-通过id删除") + @RequiresPermissions("${entityPackage}:${tableName}:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + ${entityName?uncap_first}Service.delete${entityName}(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-批量删除") + @Operation(summary="${tableVo.ftlDescription}-批量删除") + @RequiresPermissions("${entityPackage}:${tableName}:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.${entityName?uncap_first}Service.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "${tableVo.ftlDescription}-通过id查询") + @Operation(summary="${tableVo.ftlDescription}-通过id查询") + @GetMapping(value = "/queryById") + public Result<${entityName}> queryById(@RequestParam(name="id",required=true) String id) { + ${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id); + if(${entityName?uncap_first}==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(${entityName?uncap_first}); + } + + /** + * 导出excel + * + * @param request + * @param ${entityName?uncap_first} + */ + @RequiresPermissions("${entityPackage}:${tableName}:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) { +<#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='export' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 导出前,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeExport() + + + + return super.exportXls(request, ${entityName?uncap_first}, ${entityName}.class, "${tableVo.ftlDescription}"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("${entityPackage}:${tableName}:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { +<#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='import' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 导入前,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeImport() + + + + return super.importExcel(request, response, ${entityName}.class); + } + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai new file mode 100644 index 00000000..b634f67a --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai @@ -0,0 +1,91 @@ +<#include "/common/utils.ftl"> +package ${bussiPackage}.${entityPackage}.entity; + +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.UnsupportedEncodingException; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Data +@TableName("${tableName}") +@Schema(description="${tableVo.ftlDescription}") +public class ${entityName} implements Serializable { + private static final long serialVersionUID = 1L; + +<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']> +<#assign excel_ignore_classType_arr=['pca','switch','cat_tree']> + <#list originalColumns as po> + <#-- 生成字典Code --> + <#assign list_field_dictCode=""> + <#if po.classType='sel_user'> + <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'> + <#elseif po.classType='sel_depart'> + <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'> + <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dicCode = "${po.dictField}"'> + + <#elseif po.classType=='sel_tree'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText?split(",")[2]}", dicCode = "${po.dictText?split(",")[0]}"'> + <#elseif po.classType=='link_table'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicCode = "${po.dictField}", dicText = "${po.dictText?split(",")[0]}"'> + + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + @TableId(type = IdType.ASSIGN_ID) + <#else> + <#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'> + <#if po.classType=='date'> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}") && !excel_ignore_classType_arr?seq_contains("${po.classType}")> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + + + <#-- <#if po.classType!='popup'> + <#if po.dictTable?default("")?trim?length gt 1> + @Dict(dicCode="${po.dictField}",dicText="${po.dictText}",dictTable="${po.dictTable}") + <#elseif po.dictField?default("")?trim?length gt 1> + @Dict(dicCode="${po.dictField}") + + --> + <#if list_field_dictCode?length gt 1> + @Dict(${list_field_dictCode?substring(2)}) + + + <#-- 大字段转换 --> + <#include "/common/blob.ftl"> + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai new file mode 100644 index 00000000..d894ff1b --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai @@ -0,0 +1,35 @@ +package ${bussiPackage}.${entityPackage}.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.jeecg.common.system.vo.SelectTreeModel; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; + +import java.util.List; +import java.util.Map; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface ${entityName}Mapper extends BaseMapper<${entityName}> { + + /** + * 编辑节点状态 + * @param id + * @param status + */ + void updateTreeNodeStatus(@Param("id") String id,@Param("status") String status); + + /** + * 【vue3专用】根据父级ID查询树节点数据 + * + * @param pid + * @param query + * @return + */ + List queryListByPid(@Param("pid") String pid, @Param("query") Map query); + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml new file mode 100644 index 00000000..d61443b6 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml @@ -0,0 +1,45 @@ +<#assign hasChildrenField = ""> +<#assign pidFieldName = ""> +<#assign textFieldName = ""> +<#assign textDbFieldName = ""> +<#assign pidDbFieldName = ""> +<#list originalColumns as po> + <#if po.fieldDbName == tableVo.extendParams.hasChildren> + <#assign hasChildrenField = po.fieldName> + + <#-- begin 【vue3专用】 --> + <#if po.fieldDbName == tableVo.extendParams.pidField> + <#assign pidFieldName = po.fieldName> + <#assign pidDbFieldName = po.fieldDbName> + + <#if po.fieldDbName == tableVo.extendParams.textField> + <#assign textFieldName = po.fieldName> + <#assign textDbFieldName = po.fieldDbName> + + <#-- end 【vue3专用】 --> + + + + + + + update ${tableName} set ${Format.humpToUnderline(hasChildrenField)} = ${r'#'}{status} where id = ${r'#'}{id} + + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai new file mode 100644 index 00000000..701da1a9 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai @@ -0,0 +1,74 @@ +package ${bussiPackage}.${entityPackage}.service; + +import org.jeecg.common.system.vo.SelectTreeModel; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.common.exception.JeecgBootException; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import java.util.List; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface I${entityName}Service extends IService<${entityName}> { + + /**根节点父ID的值*/ + public static final String ROOT_PID_VALUE = "0"; + + /**树节点有子节点状态值*/ + public static final String HASCHILD = "1"; + + /**树节点无子节点状态值*/ + public static final String NOCHILD = "0"; + + /** + * 新增节点 + * + * @param ${entityName?uncap_first} + */ + void add${entityName}(${entityName} ${entityName?uncap_first}); + + /** + * 修改节点 + * + * @param ${entityName?uncap_first} + * @throws JeecgBootException + */ + void update${entityName}(${entityName} ${entityName?uncap_first}) throws JeecgBootException; + + /** + * 删除节点 + * + * @param id + * @throws JeecgBootException + */ + void delete${entityName}(String id) throws JeecgBootException; + + /** + * 查询所有数据,无分页 + * + * @param queryWrapper + * @return List<${entityName}> + */ + List<${entityName}> queryTreeListNoPage(QueryWrapper<${entityName}> queryWrapper); + + /** + * 【vue3专用】根据父级编码加载分类字典的数据 + * + * @param parentCode + * @return + */ + List queryListByCode(String parentCode); + + /** + * 【vue3专用】根据pid查询子节点集合 + * + * @param pid + * @return + */ + List queryListByPid(String pid); + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai new file mode 100644 index 00000000..6372a2c2 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai @@ -0,0 +1,229 @@ +package ${bussiPackage}.${entityPackage}.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.common.system.vo.SelectTreeModel; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +<#assign pidFieldName = ""> +<#assign hasChildrenField = ""> +<#list originalColumns as po> +<#if po.fieldDbName == tableVo.extendParams.pidField> +<#assign pidFieldName = po.fieldName> + +<#if po.fieldDbName == tableVo.extendParams.hasChildren> +<#assign hasChildrenField = po.fieldName> + + + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Service +public class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service { + + @Override + public void add${entityName}(${entityName} ${entityName?uncap_first}) { + //新增时设置hasChild为0 + ${entityName?uncap_first}.set${hasChildrenField?cap_first}(I${entityName}Service.NOCHILD); + if(oConvertUtils.isEmpty(${entityName?uncap_first}.get${pidFieldName?cap_first}())){ + ${entityName?uncap_first}.set${pidFieldName?cap_first}(I${entityName}Service.ROOT_PID_VALUE); + }else{ + //如果当前节点父ID不为空 则设置父节点的hasChildren 为1 + ${entityName} parent = baseMapper.selectById(${entityName?uncap_first}.get${pidFieldName?cap_first}()); + if(parent!=null && !"1".equals(parent.get${hasChildrenField?cap_first}())){ + parent.set${hasChildrenField?cap_first}("1"); + baseMapper.updateById(parent); + } + } + baseMapper.insert(${entityName?uncap_first}); + } + + @Override + public void update${entityName}(${entityName} ${entityName?uncap_first}) { + ${entityName} entity = this.getById(${entityName?uncap_first}.getId()); + if(entity==null) { + throw new JeecgBootException("未找到对应实体"); + } + String old_pid = entity.get${pidFieldName?cap_first}(); + String new_pid = ${entityName?uncap_first}.get${pidFieldName?cap_first}(); + if(!old_pid.equals(new_pid)) { + updateOldParentNode(old_pid); + if(oConvertUtils.isEmpty(new_pid)){ + ${entityName?uncap_first}.set${pidFieldName?cap_first}(I${entityName}Service.ROOT_PID_VALUE); + } + if(!I${entityName}Service.ROOT_PID_VALUE.equals(${entityName?uncap_first}.get${pidFieldName?cap_first}())) { + baseMapper.updateTreeNodeStatus(${entityName?uncap_first}.get${pidFieldName?cap_first}(), I${entityName}Service.HASCHILD); + } + } + baseMapper.updateById(${entityName?uncap_first}); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete${entityName}(String id) throws JeecgBootException { + //查询选中节点下所有子节点一并删除 + id = this.queryTreeChildIds(id); + if(id.indexOf(",")>0) { + StringBuffer sb = new StringBuffer(); + String[] idArr = id.split(","); + for (String idVal : idArr) { + if(idVal != null){ + ${entityName} ${entityName?uncap_first} = this.getById(idVal); + String pidVal = ${entityName?uncap_first}.get${pidFieldName?cap_first}(); + //查询此节点上一级是否还有其他子节点 + List<${entityName}> dataList = baseMapper.selectList(new QueryWrapper<${entityName}>().eq("${tableVo.extendParams.pidField}", pidVal).notIn("id",Arrays.asList(idArr))); + boolean flag = (dataList == null || dataList.size() == 0) && !Arrays.asList(idArr).contains(pidVal) && !sb.toString().contains(pidVal); + if(flag){ + //如果当前节点原本有子节点 现在木有了,更新状态 + sb.append(pidVal).append(","); + } + } + } + //批量删除节点 + baseMapper.deleteBatchIds(Arrays.asList(idArr)); + //修改已无子节点的标识 + String[] pidArr = sb.toString().split(","); + for(String pid : pidArr){ + this.updateOldParentNode(pid); + } + }else{ + ${entityName} ${entityName?uncap_first} = this.getById(id); + if(${entityName?uncap_first}==null) { + throw new JeecgBootException("未找到对应实体"); + } + updateOldParentNode(${entityName?uncap_first}.get${pidFieldName?cap_first}()); + baseMapper.deleteById(id); + } + } + + @Override + public List<${entityName}> queryTreeListNoPage(QueryWrapper<${entityName}> queryWrapper) { + List<${entityName}> dataList = baseMapper.selectList(queryWrapper); + List<${entityName}> mapList = new ArrayList<>(); + for(${entityName} data : dataList){ + String pidVal = data.get${pidFieldName?cap_first}(); + //递归查询子节点的根节点 + if(pidVal != null && !I${entityName}Service.NOCHILD.equals(pidVal)){ + ${entityName} rootVal = this.getTreeRoot(pidVal); + if(rootVal != null && !mapList.contains(rootVal)){ + mapList.add(rootVal); + } + }else{ + if(!mapList.contains(data)){ + mapList.add(data); + } + } + } + return mapList; + } + + @Override + public List queryListByCode(String parentCode) { + String pid = ROOT_PID_VALUE; + if (oConvertUtils.isNotEmpty(parentCode)) { + LambdaQueryWrapper<${entityName}> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(${entityName}::get${pidFieldName?cap_first}, parentCode); + List<${entityName}> list = baseMapper.selectList(queryWrapper); + if (list == null || list.size() == 0) { + throw new JeecgBootException("该编码【" + parentCode + "】不存在,请核实!"); + } + if (list.size() > 1) { + throw new JeecgBootException("该编码【" + parentCode + "】存在多个,请核实!"); + } + pid = list.get(0).getId(); + } + return baseMapper.queryListByPid(pid, null); + } + + @Override + public List queryListByPid(String pid) { + if (oConvertUtils.isEmpty(pid)) { + pid = ROOT_PID_VALUE; + } + return baseMapper.queryListByPid(pid, null); + } + + /** + * 根据所传pid查询旧的父级节点的子节点并修改相应状态值 + * @param pid + */ + private void updateOldParentNode(String pid) { + if(!I${entityName}Service.ROOT_PID_VALUE.equals(pid)) { + Long count = baseMapper.selectCount(new QueryWrapper<${entityName}>().eq("${tableVo.extendParams.pidField}", pid)); + if(count==null || count<=1) { + baseMapper.updateTreeNodeStatus(pid, I${entityName}Service.NOCHILD); + } + } + } + + /** + * 递归查询节点的根节点 + * @param pidVal + * @return + */ + private ${entityName} getTreeRoot(String pidVal){ + ${entityName} data = baseMapper.selectById(pidVal); + if(data != null && !I${entityName}Service.ROOT_PID_VALUE.equals(data.get${pidFieldName?cap_first}()) && !data.get${pidFieldName?cap_first}().equals(data.getId())){ + return this.getTreeRoot(data.get${pidFieldName?cap_first}()); + }else{ + return data; + } + } + + /** + * 根据id查询所有子节点id + * @param ids + * @return + */ + private String queryTreeChildIds(String ids) { + //获取id数组 + String[] idArr = ids.split(","); + StringBuffer sb = new StringBuffer(); + for (String pidVal : idArr) { + if(pidVal != null){ + if(!sb.toString().contains(pidVal)){ + if(sb.toString().length() > 0){ + sb.append(","); + } + sb.append(pidVal); + this.getTreeChildIds(pidVal,sb); + } + } + } + return sb.toString(); + } + + /** + * 递归查询所有子节点 + * @param pidVal + * @param sb + * @return + */ + private StringBuffer getTreeChildIds(String pidVal,StringBuffer sb){ + List<${entityName}> dataList = baseMapper.selectList(new QueryWrapper<${entityName}>().eq("${tableVo.extendParams.pidField}", pidVal)); + if(dataList != null && dataList.size()>0){ + for(${entityName} tree : dataList) { + if(!sb.toString().contains(tree.getId())){ + sb.append(",").append(tree.getId()); + } + this.getTreeChildIds(tree.getId(),sb); + } + } + return sb; + } + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei new file mode 100644 index 00000000..b5758a20 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei @@ -0,0 +1,523 @@ +<#assign pidFieldName = ""> +<#assign hasChildrenField = ""> +<#list originalColumns as po> +<#if po.fieldDbName == tableVo.extendParams.pidField> +<#assign pidFieldName = po.fieldName> + +<#if po.fieldDbName == tableVo.extendParams.hasChildren> +<#assign hasChildrenField = po.fieldName> + + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql new file mode 100644 index 00000000..5396d5d5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql @@ -0,0 +1 @@ +<#include "/common/sql/menu_insert.ftl"> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei new file mode 100644 index 00000000..1a4fa5a3 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei @@ -0,0 +1,246 @@ +<#include "/common/utils.ftl"> + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei new file mode 100644 index 00000000..acead0b6 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei @@ -0,0 +1,564 @@ +<#include "/common/utils.ftl"> +<#assign pidFieldName = ""> +<#assign hasChildrenField = ""> +<#assign bpm_flag=false> +<#assign list_has_popup_dict=false> +<#list originalColumns as po> + <#if po.fieldDbName == tableVo.extendParams.pidField> + <#assign pidFieldName = po.fieldName> + + <#if po.fieldDbName == tableVo.extendParams.hasChildren> + <#assign hasChildrenField = po.fieldName> + + +<#assign list_need_pca=false> +<#assign buttonList=[]> +<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??> + <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)> + +<#-- 开始循环 --> +<#list columns as po> + <#if po.fieldDbName=='bpm_status'> + <#assign bpm_flag=true> + +<#if po.classType=='pca'> +<#assign list_need_pca=true> + +<#if po.classType=='popup_dict'> +<#assign list_has_popup_dict=true> + + + + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi new file mode 100644 index 00000000..b1fd11da --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi @@ -0,0 +1,85 @@ +import {defHttp} from "/@/utils/http/axios"; +import { useMessage } from "/@/hooks/web/useMessage"; + +const { createConfirm } = useMessage(); + +enum Api { + list = '/${entityPackagePath}/${entityName?uncap_first}/rootList', + save='/${entityPackagePath}/${entityName?uncap_first}/add', + edit='/${entityPackagePath}/${entityName?uncap_first}/edit', + delete${entityName} = '/${entityPackagePath}/${entityName?uncap_first}/delete', + importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel', + exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls', + loadTreeData = '/${entityPackagePath}/${entityName?uncap_first}/loadTreeRoot', + getChildList = '/${entityPackagePath}/${entityName?uncap_first}/childList', + getChildListBatch = '/${entityPackagePath}/${entityName?uncap_first}/getChildListBatch', +} + +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; +/** + * 导入api + * @param params + */ +export const getImportUrl = Api.importExcel; +/** + * 列表接口 + * @param params + */ +export const list = (params) => + defHttp.get({url: Api.list, params}); +/** + * 删除 + */ +export const delete${entityName} = (params,handleSuccess) => { + return defHttp.delete({url: Api.delete${entityName}, params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); +} +/** + * 批量删除 + * @param params + */ +export const batchDelete${entityName} = (params, handleSuccess) => { + createConfirm({ + iconType: 'warning', + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({url: Api.delete${entityName}, data: params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); + } + }); +} +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdateDict = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({url: url, params}); +} +/** + * 查询全部树形节点数据 + * @param params + */ +export const loadTreeData = (params) => + defHttp.get({url: Api.loadTreeData,params}); +/** + * 查询子节点数据 + * @param params + */ +export const getChildList = (params) => + defHttp.get({url: Api.getChildList, params}); +/** + * 批量查询子节点数据 + * @param params + */ +export const getChildListBatch = (params) => + defHttp.get({url: Api.getChildListBatch, params},{isTransformResponse:false}); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi new file mode 100644 index 00000000..dec5d763 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi @@ -0,0 +1,560 @@ +<#include "/common/utils.ftl"> +import {BasicColumn} from '/@/components/Table'; +import {FormSchema} from '/@/components/Table'; +import { rules} from '/@/utils/helper/validator'; +import { render } from '/@/utils/common/renderUtils'; +import { getWeekMonthQuarterYear } from '/@/utils'; +//列表数据 +export const columns: BasicColumn[] = [ + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + { + title: '${po.filedComment}', + <#if po.fieldDbName == tableVo.extendParams.textField> + align: 'left', + <#else> + align: 'center', + + <#if po.sort=='Y'> + sorter: true, + + <#if po.classType=='date'> + dataIndex: '${po.fieldName}', + customRender:({text}) =>{ + text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text); + <#if po.extendParams?exists && po.extendParams.picker?exists> + if(text) { + return getWeekMonthQuarterYear(text)['${po.extendParams.picker}']; + } else { + return text; + } + <#else> + return text; + + }, + <#elseif po.fieldDbType=='Blob'> + dataIndex: '${po.fieldName}String' + <#elseif po.classType=='umeditor'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='pca'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='file'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='image'> + dataIndex: '${po.fieldName}', + customRender:render.renderImage, + <#elseif po.classType=='switch'> + dataIndex: '${po.fieldName}', +<#assign switch_extend_arr=['Y','N']> +<#if po.dictField?default("")?contains("[")> +<#assign switch_extend_arr=po.dictField?eval> + +<#list switch_extend_arr as a> +<#if a_index == 0> +<#assign switch_extend_arr1=a> +<#else> +<#assign switch_extend_arr2=a> + + + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}]) + }, + <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict' || po.classType=='link_table'> + dataIndex: '${po.fieldName}_dictText' + <#elseif po.classType=='cat_tree'> + dataIndex: '${po.fieldName}', + <#if po.dictText?default("")?trim?length == 0> + customRender:({text}) => { + return render.renderCategoryTree(text,'${po.dictField?default("")}') + }, + <#else> + customRender: ({text, record}) => (text ? record['${po.dictText}'] : '') + + <#else> + dataIndex: '${po.fieldName}' + + }, + + +]; +//查询数据 +export const searchFormSchema: FormSchema[] = [ +<#-- 开始循环 --> +<#list columns as po> +<#if po.fieldDbName=='bpm_status'> + <#assign bpm_flag=true> + +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if po.isQuery=='Y' && po.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#assign query_flag=true> + <#assign query_field_dictCode=""> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign query_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}"> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign query_field_dictCode="${po.dictField}"> + +<#if po.queryMode=='single'> + { + label: "${po.filedComment}", + field: "${po.fieldName}", +<#if po.classType=='sel_search'> + component: 'JSearchSelect', + componentProps:{ + dict:"${query_field_dictCode}" + }, +<#elseif po.classType=='sel_user'> +<#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + component: 'JSelectUser', +<#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, +<#elseif po.classType=='switch'> + component: 'JSwitch', + componentProps:{ + <#if po.dictField != 'is_open'> + options:"${po.dictField}" + + }, + <#elseif po.classType=='sel_depart'> + component: 'JSelectDept', + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType=='list_multi'> + component: 'JSelectMultiple', + componentProps:{ + <#if po.dictTable?default("")?trim?length gt 1> + dictCode:"${po.dictTable},${po.dictText},${po.dictField}", + <#elseif po.dictField?default("")?trim?length gt 1> + dictCode:"${po.dictField}", + + triggerChange: true + }, + <#elseif po.classType=='cat_tree'> + component: 'JCategorySelect', + componentProps:{ + pcode:"${po.dictField?default("")}",//back和事件未添加,暂时有问题 + }, +<#elseif po.classType=='date'> + component: 'DatePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueFormat: 'YYYY-MM-DD' + }, +<#elseif po.classType=='datetime'> + component: 'DatePicker', + componentProps: { + showTime:true + }, +<#elseif po.classType=='datetime'> + component: 'DatePicker', + componentProps: { + showTime:true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, +<#elseif po.classType=='pca'> + component: 'JAreaLinkage', + componentProps: { + saveCode: 'region', + }, +<#elseif po.classType=='popup'> + <#include "/common/form/vue3popup.ftl"> +<#elseif po.classType=='popup_dict'> + component: 'JPopupDict', + componentProps: { + placeholder: '请选择${po.filedComment}', + dictCode: '${po.dictTable},${po.dictText},${po.dictField}', + multi: ${po.extendParams.popupMulti?c} + }, +<#elseif po.classType == 'sel_tree'> + component: 'JTreeSelect', + componentProps:{ + <#if po.dictText??> + <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> + dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}", + + <#if po.dictText?split(',')[1]??> + pidField:"${po.dictText?split(',')[1]}", + + <#if po.dictText?split(',')[3]??> + hasChildField:"${po.dictText?split(',')[3]}", + + + pidValue:"${po.dictField}", + }, +<#elseif po.classType=='link_table'> + component: 'JLinkTableCard', + componentProps: { + valueField: '${po.dictField}', + textField: '${po.dictText}', + tableName: '${po.dictTable}', + multi: <#if (po.queryMode!"") == "multi">true<#else>false + }, +<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'> +<#-- ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- --> + component: 'JSelectMultiple', + componentProps:{ + <#if po.dictTable?default("")?trim?length gt 1> + dictCode:"${po.dictTable},${po.dictText},${po.dictField}" + <#elseif po.dictField?default("")?trim?length gt 1> + dictCode:"${po.dictField}" + + }, +<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'InputNumber', +<#else> + component: 'Input', + + //colProps: {span: 6}, + }, +<#elseif po.queryMode=='like'> + { + label: "${po.filedComment}", + field: "${po.fieldName}", + component: 'JInput', + }, +<#else> + { + label: "${po.filedComment}", + field: "${po.fieldName}", +<#if po.classType=='date'> + component: 'RangePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueType: 'Date', + }, +<#elseif po.classType=='datetime'> + component: 'RangePicker', + componentProps: { + valueType: 'Date', + showTime:true + }, +<#elseif po.classType == 'time'> + component: 'TimePicker', + componentProps:{ + valueFormat: 'HH:mm:ss', + }, +<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'JRangeNumber', +<#-- update-begin---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> +<#elseif po.classType=='time'> + component: 'RangeTime', +<#-- update-end---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> +<#else> + component: 'Input', //TODO 范围查询 + + //colProps: {span: 6}, + }, + + + +<#-- 结束循环 --> +]; +//表单数据 +export const formSchema: FormSchema[] = [ +<#assign form_cat_tree = false> +<#assign form_cat_back = ""> +<#assign bpm_flag=false> +<#assign id_exists = false> +<#list columns as po><#rt/> +<#if po.fieldDbName=='bpm_status'> + <#assign bpm_flag=true> + +<#if po.fieldDbName == 'id'> + <#assign id_exists = true> + +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if po.isShow =='Y' && po.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#assign form_field_dictCode=""> + <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}"> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictField}"> + + { + label: '${po.filedComment}', + field: ${autoStringSuffix(po)}, +<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.defaultVal??> + <#if po.fieldDbType=="BigDecimal" || po.fieldDbType=="double" || po.fieldDbType=="int"> + defaultValue: ${po.defaultVal}, + <#else> + defaultValue: "${po.defaultVal}", + + +<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.fieldDbName == tableVo.extendParams.pidField> + component: 'JTreeSelect', + componentProps: { + dict: "${tableVo.tableName},${tableVo.extendParams.textField},id", + pidField: "${tableVo.extendParams.pidField}", + pidValue: "0", + hasChildField: "${tableVo.extendParams.hasChildren}", + }, + <#elseif po.classType =='date'> + component: 'DatePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueFormat: 'YYYY-MM-DD' + }, + <#elseif po.classType =='datetime'> + component: 'DatePicker', + componentProps: { + showTime:true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, + <#elseif po.classType =='time'> + component: 'TimePicker', + componentProps:{ + valueFormat: 'HH:mm:ss', + }, + <#elseif po.classType =='popup'> + <#include "/common/form/vue3popup.ftl"> + <#elseif po.classType=='popup_dict'> + component: 'JPopupDict', + componentProps: { + placeholder: '请选择${po.filedComment}', + dictCode: '${po.dictTable},${po.dictText},${po.dictField}', + multi: ${po.extendParams.popupMulti?c} + }, + <#elseif po.classType =='sel_depart'> + component: 'JSelectDept', + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType =='switch'> + component: 'JSwitch', + componentProps:{ + <#if po.dictField != 'is_open'> + options:${po.dictField} + + }, + <#elseif po.classType =='pca'> + component: 'JAreaLinkage', + componentProps: { + saveCode: 'region', + }, + <#elseif po.classType =='markdown'> + component: 'JMarkdownEditor',//注意string转换问题 + <#elseif po.classType =='password'> + component: 'InputPassword', + <#elseif po.classType =='sel_user'> +<#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + component: 'JSelectUser', +<#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType =='textarea'> + component: 'InputTextArea', + <#elseif po.classType=='list'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#elseif po.classType=='radio'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + type: "radio", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='list_multi'> + component: 'JSelectMultiple', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#elseif po.classType=='checkbox'> + component: 'JCheckbox', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='sel_search'> + component: 'JSearchSelect', + componentProps:{ + dict:"${form_field_dictCode}" + }, +<#elseif po.classType=='cat_tree'> + <#assign form_cat_tree = true> + component: 'JCategorySelect', + componentProps:{ + pcode:"${po.dictField?default("")}", //TODO back和事件未添加,暂时有问题 + }, + <#if po.dictText?default("")?trim?length gt 1> + <#assign form_cat_back = "${po.dictText}"> + + <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'InputNumber', + <#elseif po.classType=='file'> + component: 'JUpload', + componentProps:{ + <#if po.uploadnum??> + maxCount:${po.uploadnum} + + }, + <#elseif po.classType=='image'> + component: 'JImageUpload', + componentProps:{ + <#if po.uploadnum??> + fileMax:${po.uploadnum} + <#else> + fileMax: 0 + + }, + <#elseif po.classType=='umeditor'> + component: 'JEditor', + <#elseif po.classType == 'sel_tree'> + component: 'JTreeSelect', + componentProps:{ + <#if po.dictText??> + <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> + dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}", + + <#if po.dictText?split(',')[1]??> + pidField:"${po.dictText?split(',')[1]}", + + <#if po.dictText?split(',')[3]??> + hasChildField:"${po.dictText?split(',')[3]}", + + + pidValue:"${po.dictField}", + }, + <#else> + component: 'Input', + + <#include "/common/utils.ftl"> + <#if po.isShow == 'Y' && poHasCheck(po)> + dynamicRules: ({model,schema}) => { + <#if po.fieldName != 'id'> + <#assign fieldValidType = po.fieldValidType!''> + return [ + <#-- 非空校验 --> + <#if po.nullable == 'N' || fieldValidType == '*'> + { required: true, message: '请输入${po.filedComment}!'}, + <#elseif fieldValidType!=''> + { required: false}, + + <#-- 唯一校验 --> + <#if fieldValidType == 'only'> + {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}', '${po.fieldDbName}',model,schema)[0]}, + <#-- 6到16位数字 --> + <#elseif fieldValidType == 'n6-16'> + { pattern: /^\d{6,16}$|^(?=\d+\.\d+)[\d.]{7,17}$/, message: '请输入6到16位数字!'}, + <#-- 6到16位任意字符 --> + <#elseif fieldValidType == '*6-16'> + { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'}, + <#-- 6到18位字母 --> + <#elseif fieldValidType == 's6-18'> + { pattern:/^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'}, + <#-- 网址 --> + <#elseif fieldValidType == 'url'> + { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'}, + <#-- 电子邮件 --> + <#elseif fieldValidType == 'e'> + { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'}, + <#-- 手机号码 --> + <#elseif fieldValidType == 'm'> + { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'}, + <#-- 邮政编码 --> + <#elseif fieldValidType == 'p'> + { pattern: /^[0-9]\d{5}$/, message: '请输入正确的邮政编码!'}, + <#-- 字母 --> + <#elseif fieldValidType == 's'> + { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'}, + <#-- 数字 --> + <#elseif fieldValidType == 'n'> + { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'}, + <#-- 整数 --> + <#elseif fieldValidType == 'z'> + { pattern: /^-?\d+$/, message: '请输入整数!'}, + <#-- 金额 --> + <#elseif fieldValidType == 'money'> + { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'}, + <#-- 正则校验 --> + <#elseif fieldValidType != '' && fieldValidType != '*'> + { pattern: '${fieldValidType}', message: '不符合校验规则!'}, + <#-- 无校验 --> + <#else> + <#t> + + ]; + + }, + + <#if po.readonly=='Y'> + dynamicDisabled:true + + }, + + +<#if id_exists == false> + // TODO 主键隐藏字段,目前写死为ID + { + label: '', + field: 'id', + component: 'Input', + show: false + }, + +]; + +<#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> +// 高级查询数据 +export const superQuerySchema = { + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + ${superQueryFieldListForVue3(po,po_index)}, + + +}; +<#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> + + +/** +* 流程表单调用这个方法获取formSchema +* @param param +*/ +export function getBpmFormSchema(_formData): FormSchema[]{ + // 默认和原始表单保持一致 如果流程中配置了权限数据,这里需要单独处理formSchema + return formSchema; +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql new file mode 100644 index 00000000..5396d5d5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql @@ -0,0 +1 @@ +<#include "/common/sql/menu_insert.ftl"> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei new file mode 100644 index 00000000..3b5b65e4 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei @@ -0,0 +1,72 @@ +<#include "/common/utils.ftl"> + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei new file mode 100644 index 00000000..531645c7 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei @@ -0,0 +1,191 @@ +<#include "/common/utils.ftl"> +<#assign pidFieldName = ""> +<#assign hasChildrenField = ""> +<#list originalColumns as po> + <#if po.fieldDbName == tableVo.extendParams.pidField> + <#assign pidFieldName = po.fieldName> + + <#if po.fieldDbName == tableVo.extendParams.hasChildren> + <#assign hasChildrenField = po.fieldName> + + +<#assign buttonList=[]> +<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??> + <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)> + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei new file mode 100644 index 00000000..01decc77 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei @@ -0,0 +1,738 @@ +<#include "/common/utils.ftl"> + + +<#if query_flag> + + + + 查询 + 重置 + + {{ toggleSearchStatus ? '收起' : '展开' }} + + + + + + + + + +<#-- 结束循环 --> + + + + + + + + + + + <${entityName}Modal ref="registerModal" @success="handleSuccess"> + <#if bpm_flag==true> + + + + + + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi new file mode 100644 index 00000000..7944cae2 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi @@ -0,0 +1,93 @@ +import { defHttp } from "/@/utils/http/axios"; +import { useMessage } from "/@/hooks/web/useMessage"; + +const { createConfirm } = useMessage(); + +enum Api { + list = '/${entityPackagePath}/${entityName?uncap_first}/rootList', + save='/${entityPackagePath}/${entityName?uncap_first}/add', + edit='/${entityPackagePath}/${entityName?uncap_first}/edit', + delete${entityName} = '/${entityPackagePath}/${entityName?uncap_first}/delete', + importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel', + exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls', + loadTreeData = '/${entityPackagePath}/${entityName?uncap_first}/loadTreeRoot', + getChildList = '/${entityPackagePath}/${entityName?uncap_first}/childList', + getChildListBatch = '/${entityPackagePath}/${entityName?uncap_first}/getChildListBatch', +} + +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; + +/** + * 导入api + * @param params + */ +export const getImportUrl = Api.importExcel; + +/** + * 列表接口 + * @param params + */ +export const list = (params) => defHttp.get({ url: Api.list, params }); + +/** + * 删除 + * @param params + * @param handleSuccess + */ +export const delete${entityName} = (params,handleSuccess) => { + return defHttp.delete({ url: Api.delete${entityName}, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +} + +/** + * 批量删除 + * @param params + * @param handleSuccess + */ +export const batchDelete${entityName} = (params, handleSuccess) => { + createConfirm({ + iconType: 'warning', + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({ url: Api.delete${entityName}, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + } + }); +} + +/** + * 保存或者更新 + * @param params + * @param isUpdate + */ +export const saveOrUpdateDict = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({ url: url, params },{ isTransformResponse:false }); +} + +/** + * 查询全部树形节点数据 + * @param params + */ +export const loadTreeData = (params) => defHttp.get({ url: Api.loadTreeData,params }); + +/** + * 查询子节点数据 + * @param params + */ +export const getChildList = (params) => defHttp.get({ url: Api.getChildList, params }); + +/** + * 批量查询子节点数据 + * @param params + */ +export const getChildListBatch = (params) => defHttp.get({ url: Api.getChildListBatch, params },{ isTransformResponse:false }); diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi new file mode 100644 index 00000000..e6c34471 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi @@ -0,0 +1,94 @@ +<#include "/common/utils.ftl"> +import {BasicColumn} from '/@/components/Table'; +import {FormSchema} from '/@/components/Table'; +import { rules} from '/@/utils/helper/validator'; +import { render } from '/@/utils/common/renderUtils'; +import { getWeekMonthQuarterYear } from '/@/utils'; +//列表数据 +export const columns: BasicColumn[] = [ + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + { + title: '${po.filedComment}', + <#if po.fieldDbName == tableVo.extendParams.textField> + align: 'left', + <#else> + align: 'center', + + <#if po.sort=='Y'> + sorter: true, + + <#if po.classType=='date'> + dataIndex: '${po.fieldName}', + customRender:({text}) =>{ + text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text); + <#if po.extendParams?exists && po.extendParams.picker?exists> + if(text) { + return getWeekMonthQuarterYear(text)['${po.extendParams.picker}']; + } else { + return text; + } + <#else> + return text; + + }, + <#elseif po.fieldDbType=='Blob'> + dataIndex: '${po.fieldName}String' + <#elseif po.classType=='umeditor'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='pca'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='file'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='image'> + dataIndex: '${po.fieldName}', + customRender: render.renderImage, + <#elseif po.classType=='switch'> + dataIndex: '${po.fieldName}', +<#assign switch_extend_arr=['Y','N']> +<#if po.dictField?default("")?contains("[")> +<#assign switch_extend_arr=po.dictField?eval> + +<#list switch_extend_arr as a> +<#if a_index == 0> +<#assign switch_extend_arr1=a> +<#else> +<#assign switch_extend_arr2=a> + + + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}]); + }, + <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict'> + dataIndex: '${po.fieldName}_dictText' + <#elseif po.classType=='cat_tree'> + dataIndex: '${po.fieldName}', + <#if po.dictText?default("")?trim?length == 0> + customRender:({text}) => { + return render.renderCategoryTree(text,'${po.dictField?default("")}'); + }, + <#else> + customRender: ({text, record}) => (text ? record['${po.dictText}'] : ''); + + <#else> + dataIndex: '${po.fieldName}' + + }, + + +]; + +<#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> +// 高级查询数据 +export const superQuerySchema = { + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + ${superQueryFieldListForVue3(po,po_index)}, + + +}; +<#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql new file mode 100644 index 00000000..5396d5d5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql @@ -0,0 +1 @@ +<#include "/common/sql/menu_insert.ftl"> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei new file mode 100644 index 00000000..12dfa603 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei @@ -0,0 +1,316 @@ +<#include "/common/utils.ftl"> + + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei new file mode 100644 index 00000000..7242007c --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei @@ -0,0 +1,101 @@ +<#include "/common/utils.ftl"> + + + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai new file mode 100644 index 00000000..4c143dea --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -0,0 +1,403 @@ +package ${bussiPackage}.${entityPackage}.controller; + +import org.jeecg.common.system.query.QueryGenerator; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.jeecg.common.system.query.QueryRuleEnum; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.system.base.controller.JeecgController; +import org.jeecg.common.api.vo.Result; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.servlet.ModelAndView; +import java.util.Arrays; +import java.util.HashMap; +import org.jeecg.common.util.oConvertUtils; +import org.jeecgframework.poi.excel.entity.enmus.ExcelType; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.service.I${sub.entityName}Service; + +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import org.apache.shiro.authz.annotation.RequiresPermissions; +<#assign has_multi_query_field=false> +<#list originalColumns as po> +<#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')> + <#assign has_multi_query_field=true> + + +<#assign enhanceJavaList=[]> +<#if tableVo.extendParams?? && tableVo.extendParams.enhanceJavaList??> + <#assign enhanceJavaList = tableVo.extendParams.enhanceJavaList?filter(enhance -> enhance??)> + + /** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Tag(name="${tableVo.ftlDescription}") +@RestController +@RequestMapping("/${entityPackagePath}/${entityName?uncap_first}") +@Slf4j +public class ${entityName}Controller extends JeecgController<${entityName}, I${entityName}Service> { + + @Autowired + private I${entityName}Service ${entityName?uncap_first}Service; + <#list subTables as sub> + + @Autowired + private I${sub.entityName}Service ${sub.entityName?uncap_first}Service; + + + + /*---------------------------------主表处理-begin-------------------------------------*/ + + /** + * 分页列表查询 + * @param ${entityName?uncap_first} + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "${tableVo.ftlDescription}-分页列表查询") + @Operation(summary="${tableVo.ftlDescription}-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(${entityName} ${entityName?uncap_first}, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 查询前触发的方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeQuery() + + + + <#if has_multi_query_field> + // 自定义查询规则 + Map customeRuleMap = new HashMap<>(); + // 自定义多选的查询规则为:LIKE_WITH_OR + <#list originalColumns as po> + <#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')> + customeRuleMap.put("${po.fieldName}", QueryRuleEnum.LIKE_WITH_OR); + + + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap(),customeRuleMap); + <#else> + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap()); + + Page<${entityName}> page = new Page<${entityName}>(pageNo, pageSize); + IPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper); +<#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'> + //TODO 查询后触发的方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.afterQuery() + + + + return Result.OK(pageList); + } + + /** + * 添加 + * @param ${entityName?uncap_first} + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-添加") + @Operation(summary="${tableVo.ftlDescription}-添加") + @RequiresPermissions("${entityPackage}:${tableName}:add") + @PostMapping(value = "/add") + public Result add(@RequestBody ${entityName} ${entityName?uncap_first}) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 新增前的处理方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeAdd() + + + + ${entityName?uncap_first}Service.save(${entityName?uncap_first}); +<#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'> + //TODO 新增后的处理方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.afterAdd() + + + + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * @param ${entityName?uncap_first} + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-编辑") + @Operation(summary="${tableVo.ftlDescription}-编辑") + @RequiresPermissions("${entityPackage}:${tableName}:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody ${entityName} ${entityName?uncap_first}) { +<#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 编辑前,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeEdit() + + + + ${entityName?uncap_first}Service.updateById(${entityName?uncap_first}); +<#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'> + //TODO 编辑后,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.afterEdit() + + + + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * @param id + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-通过id删除") + @Operation(summary="${tableVo.ftlDescription}-通过id删除") + @RequiresPermissions("${entityPackage}:${tableName}:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + ${entityName?uncap_first}Service.delMain(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * @param ids + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-批量删除") + @Operation(summary="${tableVo.ftlDescription}-批量删除") + @RequiresPermissions("${entityPackage}:${tableName}:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 导出 + * @return + */ + @RequiresPermissions("${entityPackage}:${tableName}:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='export' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 导出前,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeExport() + + + + return super.exportXls(request, ${entityName?uncap_first}, ${entityName}.class, "${tableVo.ftlDescription}"); + } + + /** + * 导入 + * @return + */ + @RequiresPermissions("${entityPackage}:${tableName}:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='import' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 导入前,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeImport() + + + + return super.importExcel(request, response, ${entityName}.class); + } + /*---------------------------------主表处理-end-------------------------------------*/ + + <#list subTables as sub> + + /*--------------------------------子表处理-${sub.ftlDescription}-begin----------------------------------------------*/ + /** + * 通过主表ID查询 + * @return + */ + //@AutoLog(value = "${sub.ftlDescription}-通过主表ID查询") + @Operation(summary="${sub.ftlDescription}-通过主表ID查询") + @GetMapping(value = "/list${sub.entityName}ByMainId") + public Result> list${sub.entityName}ByMainId(${sub.entityName} ${sub.entityName?uncap_first}, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper<${sub.entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${sub.entityName?uncap_first}, req.getParameterMap()); + Page<${sub.entityName}> page = new Page<${sub.entityName}>(pageNo, pageSize); + IPage<${sub.entityName}> pageList = ${sub.entityName?uncap_first}Service.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * @param ${sub.entityName?uncap_first} + * @return + */ + @AutoLog(value = "${sub.ftlDescription}-添加") + @Operation(summary="${sub.ftlDescription}-添加") + @PostMapping(value = "/add${sub.entityName}") + public Result add${sub.entityName}(@RequestBody ${sub.entityName} ${sub.entityName?uncap_first}) { + ${sub.entityName?uncap_first}Service.save(${sub.entityName?uncap_first}); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * @param ${sub.entityName?uncap_first} + * @return + */ + @AutoLog(value = "${sub.ftlDescription}-编辑") + @Operation(summary="${sub.ftlDescription}-编辑") + @RequestMapping(value = "/edit${sub.entityName}", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit${sub.entityName}(@RequestBody ${sub.entityName} ${sub.entityName?uncap_first}) { + ${sub.entityName?uncap_first}Service.updateById(${sub.entityName?uncap_first}); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * @param id + * @return + */ + @AutoLog(value = "${sub.ftlDescription}-通过id删除") + @Operation(summary="${sub.ftlDescription}-通过id删除") + @DeleteMapping(value = "/delete${sub.entityName}") + public Result delete${sub.entityName}(@RequestParam(name="id",required=true) String id) { + ${sub.entityName?uncap_first}Service.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * @param ids + * @return + */ + @AutoLog(value = "${sub.ftlDescription}-批量删除") + @Operation(summary="${sub.ftlDescription}-批量删除") + @DeleteMapping(value = "/deleteBatch${sub.entityName}") + public Result deleteBatch${sub.entityName}(@RequestParam(name="ids",required=true) String ids) { + this.${sub.entityName?uncap_first}Service.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 导出 + * @return + */ + @RequestMapping(value = "/export${sub.entityName}") + public ModelAndView export${sub.entityName}(HttpServletRequest request, ${sub.entityName} ${sub.entityName?uncap_first}) { + // Step.1 组装查询条件 + QueryWrapper<${sub.entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${sub.entityName?uncap_first}, request.getParameterMap()); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + + // Step.2 获取导出数据 + List<${sub.entityName}> pageList = ${sub.entityName?uncap_first}Service.list(queryWrapper); + List<${sub.entityName}> exportList = null; + + // 过滤选中数据 + String selections = request.getParameter("selections"); + if (oConvertUtils.isNotEmpty(selections)) { + List selectionList = Arrays.asList(selections.split(",")); + exportList = pageList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList()); + } else { + exportList = pageList; + } + + // Step.3 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + //此处设置的filename无效,前端会重更新设置一下 + mv.addObject(NormalExcelConstants.FILE_NAME, "${sub.ftlDescription}"); + mv.addObject(NormalExcelConstants.CLASS, ${sub.entityName}.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("${sub.ftlDescription}报表", "导出人:" + sysUser.getRealname(), "${sub.ftlDescription}", ExcelType.XSSF)); + mv.addObject(NormalExcelConstants.DATA_LIST, exportList); + return mv; + } + + /** + * 导入 + * @return + */ + @RequestMapping(value = "/import${sub.entityName}/{mainId}") + public Result import${sub.entityName}(HttpServletRequest request, HttpServletResponse response, @PathVariable("mainId") String mainId) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + // 获取上传文件对象 + MultipartFile file = entity.getValue(); + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<${sub.entityName}> list = ExcelImportUtil.importExcel(file.getInputStream(), ${sub.entityName}.class, params); + for (${sub.entityName} temp : list) { + <#list sub.foreignKeys as key> + temp.set${key?cap_first}(mainId); + + } + long start = System.currentTimeMillis(); + ${sub.entityName?uncap_first}Service.saveBatch(list); + log.info("消耗时间" + (System.currentTimeMillis() - start) + "毫秒"); + return Result.OK("文件导入成功!数据行数:" + list.size()); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.error("文件导入失败:" + e.getMessage()); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.error("文件导入失败!"); + } + + /*--------------------------------子表处理-${sub.ftlDescription}-end----------------------------------------------*/ + + + + + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai new file mode 100644 index 00000000..f68b1f8e --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai @@ -0,0 +1,82 @@ +<#include "/common/utils.ftl"> +package ${bussiPackage}.${entityPackage}.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecg.common.aspect.annotation.Dict; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Data +@TableName("${tableName}") +@Schema(description="${tableVo.ftlDescription}") +public class ${entityName} implements Serializable { + private static final long serialVersionUID = 1L; + + <#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']> + <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']> + <#list originalColumns as po> + <#-- 生成字典Code --> + <#assign list_field_dictCode=""> + <#if po.classType='sel_user'> + <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'> + <#elseif po.classType='sel_depart'> + <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'> + <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dicCode = "${po.dictField}"'> + + <#elseif po.classType=='sel_tree'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText?split(",")[2]}", dicCode = "${po.dictText?split(",")[0]}"'> + <#elseif po.classType=='link_table'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicCode = "${po.dictField}", dicText = "${po.dictText?split(",")[0]}"'> + + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + @TableId(type = IdType.ASSIGN_ID) + <#else> + <#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'> + <#if po.classType=='date'> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}") && !excel_ignore_classType_arr?seq_contains("${po.classType}")> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + + + <#if list_field_dictCode?length gt 1> + @Dict(${list_field_dictCode?substring(2)}) + + + <#include "/common/blob.ftl"> + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai new file mode 100644 index 00000000..2108b249 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai @@ -0,0 +1,86 @@ +<#include "/common/utils.ftl"> +<#list subTables as subTab> +#segment#${subTab.entityName}.java +package ${bussiPackage}.${entityPackage}.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import java.util.Date; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.UnsupportedEncodingException; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Data +@TableName("${subTab.tableName}") +@Schema(description="${subTab.ftlDescription}") +public class ${subTab.entityName} implements Serializable { + private static final long serialVersionUID = 1L; + + <#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']> + <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']> +<#list subTab.originalColumns as po> + <#-- 生成字典Code --> + <#assign list_field_dictCode=""> + <#if po.classType='sel_user'> + <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'> + <#elseif po.classType='sel_depart'> + <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'> + <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dicCode = "${po.dictField}"'> + <#elseif po.classType=='sel_tree'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText?split(",")[2]}", dicCode = "${po.dictText?split(",")[0]}"'> + + <#elseif po.classType=='link_table'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicCode = "${po.dictField}", dicText = "${po.dictText?split(",")[0]}"'> + + /**${po.filedComment}*/ +<#if po.fieldName == primaryKeyField> + @TableId(type = IdType.ASSIGN_ID) +<#else> + <#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'> + <#if po.classType=='date'> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + + <#elseif !subTab.foreignKeys?seq_contains(po.fieldName?cap_first)> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}") && !excel_ignore_classType_arr?seq_contains("${po.classType}")> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + + + + <#if list_field_dictCode?length gt 1> + @Dict(${list_field_dictCode?substring(2)}) + + <#-- 大字段转换 --> + <#include "/common/blob.ftl"> + +} + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai new file mode 100644 index 00000000..c31b9bfd --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai @@ -0,0 +1,17 @@ +package ${bussiPackage}.${entityPackage}.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface ${entityName}Mapper extends BaseMapper<${entityName}> { + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai new file mode 100644 index 00000000..6b6736d0 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai @@ -0,0 +1,35 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}Mapper.java +package ${bussiPackage}.${entityPackage}.mapper; + +import java.util.List; +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface ${subTab.entityName}Mapper extends BaseMapper<${subTab.entityName}> { + + /** + * 通过主表id删除子表数据 + * + * @param mainId 主表id + * @return boolean + */ + public boolean deleteByMainId(@Param("mainId") String mainId); + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List<${subTab.entityName}> + */ + public List<${subTab.entityName}> selectByMainId(@Param("mainId") String mainId); + +} + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml new file mode 100644 index 00000000..16f3d653 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml new file mode 100644 index 00000000..1dc58027 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml @@ -0,0 +1,28 @@ +<#list subTables as subTab> +<#assign originalForeignKeys = subTab.originalForeignKeys> +#segment#${subTab.entityName}Mapper.xml + + + + + + DELETE + FROM ${subTab.tableName} + WHERE + <#list originalForeignKeys as key> + ${key} = ${r'#'}{mainId} <#rt/> + + + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai new file mode 100644 index 00000000..e22b54c5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai @@ -0,0 +1,36 @@ +package ${bussiPackage}.${entityPackage}.service; + +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.beans.factory.annotation.Autowired; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface I${entityName}Service extends IService<${entityName}> { + + /** + * 删除一对多 + * + * @param id + */ + public void delMain (String id); + + /** + * 批量删除一对多 + * + * @param idList + */ + public void delBatchMain (Collection idList); + + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai new file mode 100644 index 00000000..74ad5a72 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai @@ -0,0 +1,25 @@ +<#list subTables as subTab> +#segment#I${subTab.entityName}Service.java +package ${bussiPackage}.${entityPackage}.service; + +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface I${subTab.entityName}Service extends IService<${subTab.entityName}> { + + /** + * 通过主表id查询子表数据 + * + * @param mainId + * @return List<${subTab.entityName}> + */ + public List<${subTab.entityName}> selectByMainId(String mainId); +} + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai new file mode 100644 index 00000000..a98cfee6 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai @@ -0,0 +1,56 @@ +package ${bussiPackage}.${entityPackage}.service.impl; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.mapper.${sub.entityName}Mapper; + +import ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import java.io.Serializable; +import java.util.List; +import java.util.Collection; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Service +public class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service { + + @Autowired + private ${entityName}Mapper ${entityName?uncap_first}Mapper; + <#list subTables as sub> + @Autowired + private ${sub.entityName}Mapper ${sub.entityName?uncap_first}Mapper; + + + @Override + @Transactional(rollbackFor = Exception.class) + public void delMain(String id) { + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(id); + + ${entityName?uncap_first}Mapper.deleteById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delBatchMain(Collection idList) { + for(Serializable id:idList) { + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(id.toString()); + + ${entityName?uncap_first}Mapper.deleteById(id); + } + } + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai new file mode 100644 index 00000000..0ce41d36 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai @@ -0,0 +1,30 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}ServiceImpl.java +package ${bussiPackage}.${entityPackage}.service.impl; + +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import ${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper; +import ${bussiPackage}.${entityPackage}.service.I${subTab.entityName}Service; +import org.springframework.stereotype.Service; +import java.util.List; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Service +public class ${subTab.entityName}ServiceImpl extends ServiceImpl<${subTab.entityName}Mapper, ${subTab.entityName}> implements I${subTab.entityName}Service { + + @Autowired + private ${subTab.entityName}Mapper ${subTab.entityName?uncap_first}Mapper; + + @Override + public List<${subTab.entityName}> selectByMainId(String mainId) { + return ${subTab.entityName?uncap_first}Mapper.selectByMainId(mainId); + } +} + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei new file mode 100644 index 00000000..9d2cbbb5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei @@ -0,0 +1,457 @@ +<#include "/common/utils.ftl"> + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql new file mode 100644 index 00000000..5396d5d5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql @@ -0,0 +1 @@ +<#include "/common/sql/menu_insert.ftl"> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/[1-n]List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/[1-n]List.vuei new file mode 100644 index 00000000..dae14454 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/[1-n]List.vuei @@ -0,0 +1,327 @@ +<#list subTables as sub> +#segment#${sub.entityName}List.vue + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei new file mode 100644 index 00000000..f20d9887 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei @@ -0,0 +1,212 @@ +<#include "/common/utils.ftl"> + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Modal.vuei new file mode 100644 index 00000000..f5e31a97 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Modal.vuei @@ -0,0 +1,208 @@ +<#include "/common/utils.ftl"> +<#list subTables as sub> +#segment#${sub.entityName}Modal.vue + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei new file mode 100644 index 00000000..a3d1c2b0 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei @@ -0,0 +1,473 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi new file mode 100644 index 00000000..c1300749 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi @@ -0,0 +1,133 @@ +import {defHttp} from '/@/utils/http/axios'; +import { useMessage } from "/@/hooks/web/useMessage"; + +const { createConfirm } = useMessage(); + +enum Api { + list = '/${entityPackagePath}/${entityName?uncap_first}/list', + save='/${entityPackagePath}/${entityName?uncap_first}/add', + edit='/${entityPackagePath}/${entityName?uncap_first}/edit', + deleteOne = '/${entityPackagePath}/${entityName?uncap_first}/delete', + deleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch', + importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel', + exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls', +<#list subTables as sub><#rt/> + ${sub.entityName?uncap_first}List = '/${entityPackagePath}/${entityName?uncap_first}/list${sub.entityName}ByMainId', + ${sub.entityName?uncap_first}Save='/${entityPackagePath}/${entityName?uncap_first}/add${sub.entityName}', + ${sub.entityName?uncap_first}Edit='/${entityPackagePath}/${entityName?uncap_first}/edit${sub.entityName}', + ${sub.entityName?uncap_first}Delete = '/${entityPackagePath}/${entityName?uncap_first}/delete${sub.entityName}', + ${sub.entityName?uncap_first}DeleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch${sub.entityName}', + +} +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; + +/** + * 导入api + */ +export const getImportUrl = Api.importExcel; +/** + * 列表接口 + * @param params + */ +export const list = (params) => + defHttp.get({url: Api.list, params}); + +/** + * 删除单个 + */ +export const deleteOne = (params,handleSuccess) => { + return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); +} +/** + * 批量删除 + * @param params + */ +export const batchDelete = (params, handleSuccess) => { + createConfirm({ + iconType: 'warning', + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); + } + }); +} +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdate = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({url: url, params}); +} +<#list subTables as sub><#rt/> + <#assign myForeignKeys=''> + <#list sub.foreignKeys as key> + <#assign myForeignKeys='${key?uncap_first}'> + +/** + * 列表接口 + * @param params + */ +export const ${sub.entityName?uncap_first}List = (params) => { + if(params['${myForeignKeys}']){ + return defHttp.get({url: Api.${sub.entityName?uncap_first}List, params}); + } + return Promise.resolve({}); +} + + +/** + * 删除单个 + */ +export const ${sub.entityName?uncap_first}Delete = (params,handleSuccess) => { + return defHttp.delete({url: Api.${sub.entityName?uncap_first}Delete, params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); +} +/** + * 批量删除 + * @param params + */ +export const ${sub.entityName?uncap_first}DeleteBatch = (params, handleSuccess) => { + createConfirm({ + iconType: 'warning', + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({url: Api.${sub.entityName?uncap_first}DeleteBatch, data: params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); + } + }); +} +/** + * 保存或者更新 + * @param params + */ +export const ${sub.entityName?uncap_first}SaveOrUpdate = (params, isUpdate) => { + let url = isUpdate ? Api.${sub.entityName?uncap_first}Edit : Api.${sub.entityName?uncap_first}Save; + return defHttp.post({url: url, params}); +} +/** + * 导入 + */ +export const ${sub.entityName?uncap_first}ImportUrl = '/${entityPackagePath}/${entityName?uncap_first}/import${sub.entityName}' + +/** + * 导出 + */ +export const ${sub.entityName?uncap_first}ExportXlsUrl = '/${entityPackagePath}/${entityName?uncap_first}/export${sub.entityName}' + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi new file mode 100644 index 00000000..25b8e2ac --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi @@ -0,0 +1,850 @@ +<#include "/common/utils.ftl"> +import {BasicColumn} from '/@/components/Table'; +import {FormSchema} from '/@/components/Table'; +import { rules} from '/@/utils/helper/validator'; +import { render } from '/@/utils/common/renderUtils'; +import { getWeekMonthQuarterYear } from '/@/utils'; +//列表数据 +export const columns: BasicColumn[] = [ + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + { + title: '${po.filedComment}', + align:"center", + <#if po.sort=='Y'> + sorter: true, + + <#if po.classType=='date'> + dataIndex: '${po.fieldName}', + customRender:({text}) =>{ + text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text); + <#if po.extendParams?exists && po.extendParams.picker?exists> + if(text) { + return getWeekMonthQuarterYear(text)['${po.extendParams.picker}']; + } else { + return text; + } + <#else> + return text; + + }, + <#elseif po.fieldDbType=='Blob'> + dataIndex: '${po.fieldName}String' + <#elseif po.classType=='umeditor'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='pca'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='file'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='image'> + dataIndex: '${po.fieldName}', + customRender:render.renderImage, + <#elseif po.classType=='switch'> + dataIndex: '${po.fieldName}', +<#assign switch_extend_arr=['Y','N']> +<#if po.dictField?default("")?contains("[")> +<#assign switch_extend_arr=po.dictField?eval> + +<#list switch_extend_arr as a> +<#if a_index == 0> +<#assign switch_extend_arr1=a> +<#else> +<#assign switch_extend_arr2=a> + + + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}]) + }, + <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict' || po.classType=='link_table'> + dataIndex: '${po.fieldName}_dictText' + <#elseif po.classType=='cat_tree'> + dataIndex: '${po.fieldName}', + <#if po.dictText?default("")?trim?length == 0> + customRender:({text}) => { + return render.renderCategoryTree(text,'${po.dictField?default("")}') + }, + <#else> + customRender: (text, record) => (text ? record['${po.dictText}'] : '') + + <#else> + dataIndex: '${po.fieldName}' + + }, + + +]; +//查询数据 +export const searchFormSchema: FormSchema[] = [ +<#-- 开始循环 --> +<#list columns as po> +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if po.isQuery=='Y' && po.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#assign query_flag=true> + <#assign query_field_dictCode=""> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign query_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}"> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign query_field_dictCode="${po.dictField}"> + +<#if po.queryMode=='single'> + { + label: "${po.filedComment}", + field: "${po.fieldName}", +<#if po.classType=='sel_search'> + component: 'JSearchSelect', + componentProps:{ + dict:"${query_field_dictCode}" + }, +<#elseif po.classType=='sel_user'> +<#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + component: 'JSelectUser', +<#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, +<#elseif po.classType=='switch'> + component: 'JSwitch', + componentProps:{ + query:true, + <#if po.dictField != 'is_open'> + options:${po.dictField} + + }, + <#elseif po.classType=='sel_depart'> + component: 'JSelectDept', + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType=='list_multi'> + component: 'JSelectMultiple', + componentProps:{ + <#if po.dictTable?default("")?trim?length gt 1> + dictCode:"${po.dictTable},${po.dictText},${po.dictField}", + <#elseif po.dictField?default("")?trim?length gt 1> + dictCode:"${po.dictField}", + + triggerChange: true + }, + <#elseif po.classType=='cat_tree'> + component: 'JCategorySelect', + componentProps:{ + pcode:"${po.dictField?default("")}",//back和事件未添加,暂时有问题 + }, +<#elseif po.classType=='date'> + component: 'DatePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueFormat: 'YYYY-MM-DD' + }, +<#elseif po.classType=='datetime'> + component: 'DatePicker', + componentProps: { + showTime:true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, +<#elseif po.classType=='pca'> + component: 'JAreaLinkage', + componentProps: { + saveCode: 'region', + }, +<#elseif po.classType=='popup'> + <#include "/common/form/vue3popup.ftl"> +<#elseif po.classType=='popup_dict'> + component: 'JPopupDict', + componentProps: { + placeholder: '请选择${po.filedComment}', + dictCode: '${po.dictTable},${po.dictText},${po.dictField}', + multi: ${po.extendParams.popupMulti?c} + }, +<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'> +<#-- ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- --> + component: 'JSelectMultiple', + componentProps:{ + <#if po.dictTable?default("")?trim?length gt 1> + dictCode:"${po.dictTable},${po.dictText},${po.dictField}" + <#elseif po.dictField?default("")?trim?length gt 1> + dictCode:"${po.dictField}" + + }, +<#elseif po.classType == 'sel_tree'> + component: 'JTreeSelect', + componentProps:{ + <#if po.dictText??> + <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> + dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}", + <#elseif po.dictText?split(',')[1]??> + pidField:"${po.dictText?split(',')[1]}", + <#elseif po.dictText?split(',')[3]??> + hasChildField:"${po.dictText?split(',')[3]}", + + + pidValue:"${po.dictField}", + }, +<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'InputNumber', +<#else> + component: 'Input', + + //colProps: {span: 6}, + }, +<#elseif po.queryMode=='like'> + { + label: "${po.filedComment}", + field: "${po.fieldName}", + component: 'JInput', + }, +<#else> + { + label: "${po.filedComment}", + field: "${po.fieldName}", +<#if po.classType=='date'> + component: 'RangePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueType: 'Date', + }, +<#elseif po.classType=='datetime'> + component: 'RangePicker', + componentProps: { + valueType: 'Date', + showTime:true + }, +<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'JRangeNumber', +<#-- update-begin---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> +<#elseif po.classType=='time'> + component: 'RangeTime', +<#-- update-end---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> +<#else> + component: 'Input', //TODO 范围查询 + + //colProps: {span: 6}, + }, + + + +<#-- 结束循环 --> +]; + +//表单数据 +export const formSchema: FormSchema[] = [ +<#assign form_cat_tree = false> +<#assign form_cat_back = ""> +<#assign bpm_flag=false> +<#assign id_exists = false> +<#list columns as po><#rt/> +<#if po.fieldDbName=='bpm_status'> + <#assign bpm_flag=true> + +<#if po.fieldDbName == 'id'> + <#assign id_exists = true> + +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if po.isShow =='Y' && po.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#assign form_field_dictCode=""> + <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}"> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictField}"> + + { + label: '${po.filedComment}', + field: ${autoStringSuffix(po)}, +<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.defaultVal??> + <#if po.fieldDbType=="BigDecimal" || po.fieldDbType=="double" || po.fieldDbType=="int"> + defaultValue: ${po.defaultVal}, + <#else> + defaultValue: "${po.defaultVal}", + + +<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.classType =='date'> + component: 'DatePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueFormat: 'YYYY-MM-DD' + }, + <#elseif po.classType =='datetime'> + component: 'DatePicker', + componentProps: { + showTime:true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, + <#elseif po.classType =='time'> + component: 'TimePicker', + componentProps: { + valueFormat: 'HH:mm:ss' + }, + <#elseif po.classType =='popup'> + <#include "/common/form/vue3popup.ftl"> + <#elseif po.classType=='popup_dict'> + component: 'JPopupDict', + componentProps: { + placeholder: '请选择${po.filedComment}', + dictCode: '${po.dictTable},${po.dictText},${po.dictField}', + multi: ${po.extendParams.popupMulti?c} + }, + <#elseif po.classType =='sel_depart'> + component: 'JSelectDept', + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType =='switch'> + component: 'JSwitch', + componentProps:{ + <#if po.dictField != 'is_open'> + options:${po.dictField} + + }, + <#elseif po.classType =='pca'> + component: 'JAreaLinkage', + componentProps: { + saveCode: 'region', + }, + <#elseif po.classType =='markdown'> + component: 'JMarkdownEditor',//注意string转换问题 + <#elseif po.classType =='password'> + component: 'InputPassword', + <#elseif po.classType =='sel_user'> +<#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + component: 'JSelectUser', +<#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + <#else> + labelKey:'realname', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType =='textarea'> + component: 'InputTextArea',//TODO 注意string转换问题 + <#elseif po.classType=='list'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#elseif po.classType=='radio'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + type: "radio", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='list_multi'> + component: 'JSelectMultiple', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#elseif po.classType=='checkbox'> + component: 'JCheckbox', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='sel_search'> + component: 'JSearchSelect', + componentProps:{ + dict:"${form_field_dictCode}" + }, +<#elseif po.classType=='cat_tree'> + <#assign form_cat_tree = true> + component: 'JCategorySelect', + componentProps:{ + pcode:"${po.dictField?default("")}", //TODO back和事件未添加,暂时有问题 + }, + <#if po.dictText?default("")?trim?length gt 1> + <#assign form_cat_back = "${po.dictText}"> + + <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'InputNumber', + <#elseif po.classType=='file'> + component: 'JUpload', + componentProps:{ + <#if po.uploadnum??> + maxCount:${po.uploadnum} + + }, + <#elseif po.classType=='image'> + component: 'JImageUpload', + componentProps:{ + <#if po.uploadnum??> + fileMax:${po.uploadnum} + <#else> + fileMax: 0 + + }, + <#elseif po.classType=='umeditor'> + component: 'JEditor', + <#elseif po.classType == 'sel_tree'> + component: 'JTreeSelect', + componentProps:{ + <#if po.dictText??> + <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> + dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}", + <#elseif po.dictText?split(',')[1]??> + pidField:"${po.dictText?split(',')[1]}", + <#elseif po.dictText?split(',')[3]??> + hasChildField:"${po.dictText?split(',')[3]}", + + + pidValue:"${po.dictField}", + }, + <#elseif po.classType=='link_table'> + component: 'JLinkTableCard', + componentProps: { + valueField: '${po.dictField}', + textField: '${po.dictText}', + tableName: '${po.dictTable}', + multi: <#if (po.queryMode!"") == "multi">true<#else>false + }, + <#else> + component: 'Input', + + <#include "/common/utils.ftl"> + <#if po.isShow == 'Y' && poHasCheck(po)> + dynamicRules: ({model,schema}) => { + <#if po.fieldName != 'id'> + <#assign fieldValidType = po.fieldValidType!''> + return [ + <#-- 非空校验 --> + <#if po.nullable == 'N' || fieldValidType == '*'> + { required: true, message: '请输入${po.filedComment}!'}, + <#elseif fieldValidType!=''> + { required: false}, + + <#-- 唯一校验 --> + <#if fieldValidType == 'only'> + {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}', '${po.fieldDbName}',model,schema)[0]}, + <#-- 6到16位数字 --> + <#elseif fieldValidType == 'n6-16'> + { pattern: /^\d{6,16}$|^(?=\d+\.\d+)[\d.]{7,17}$/, message: '请输入6到16位数字!'}, + <#-- 6到16位任意字符 --> + <#elseif fieldValidType == '*6-16'> + { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'}, + <#-- 6到18位字母 --> + <#elseif fieldValidType == 's6-18'> + { pattern:/^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'}, + <#-- 网址 --> + <#elseif fieldValidType == 'url'> + { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'}, + <#-- 电子邮件 --> + <#elseif fieldValidType == 'e'> + { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'}, + <#-- 手机号码 --> + <#elseif fieldValidType == 'm'> + { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'}, + <#-- 邮政编码 --> + <#elseif fieldValidType == 'p'> + { pattern: /^[0-9]\d{5}$/, message: '请输入正确的邮政编码!'}, + <#-- 字母 --> + <#elseif fieldValidType == 's'> + { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'}, + <#-- 数字 --> + <#elseif fieldValidType == 'n'> + { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'}, + <#-- 整数 --> + <#elseif fieldValidType == 'z'> + { pattern: /^-?\d+$/, message: '请输入整数!'}, + <#-- 金额 --> + <#elseif fieldValidType == 'money'> + { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'}, + <#-- 正则校验 --> + <#elseif fieldValidType != '' && fieldValidType != '*'> + { pattern: '${fieldValidType}', message: '不符合校验规则!'}, + <#-- 无校验 --> + <#else> + <#t> + + ]; + + }, + + <#if po.readonly=='Y'> + dynamicDisabled:true, + + }, + + +<#if id_exists == false> + // TODO 主键隐藏字段,目前写死为ID + { + label: '', + field: 'id', + component: 'Input', + show: false + }, + +]; + +<#list subTables as sub> +//子表列表数据 +export const ${sub.entityName?uncap_first}Columns: BasicColumn[] = [ + <#list sub.originalColumns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + { + title: '${po.filedComment}', + align:"center", + <#if po.sort=='Y'> + sorter: true, + + <#if po.classType=='date'> + dataIndex: '${po.fieldName}', + customRender:({text}) =>{ + text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text); + <#if po.extendParams?exists && po.extendParams.picker?exists> + if(text) { + return getWeekMonthQuarterYear(text)['${po.extendParams.picker}']; + } else { + return text; + } + <#else> + return text; + + }, + <#elseif po.fieldDbType=='Blob'> + dataIndex: '${po.fieldName}String' + <#elseif po.classType=='umeditor'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='pca'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='file'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='image'> + dataIndex: '${po.fieldName}', + customRender:render.renderImage, + <#elseif po.classType=='switch'> + dataIndex: '${po.fieldName}', +<#assign switch_extend_arr=['Y','N']> +<#if po.dictField?default("")?contains("[")> +<#assign switch_extend_arr=po.dictField?eval> + +<#list switch_extend_arr as a> +<#if a_index == 0> +<#assign switch_extend_arr1=a> +<#else> +<#assign switch_extend_arr2=a> + + + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}]) + }, + <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='link_table'> + dataIndex: '${po.fieldName}_dictText' + <#elseif po.classType=='cat_tree'> + dataIndex: '${po.fieldName}', + <#if po.dictText?default("")?trim?length == 0> + customRender:({text}) => { + return render.renderCategoryTree(text,'${po.dictField?default("")}') + }, + <#else> + customRender: ({text, record}) => (text ? record['${po.dictText}'] : '') + + <#else> + dataIndex: '${po.fieldName}' + + }, + + +]; +//子表表单数据 +export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [ +<#assign form_cat_tree = false> +<#assign form_cat_back = ""> +<#assign bpm_flag=false> +<#list sub.originalColumns as po><#rt/> +<#if po.fieldName == 'id'> + // TODO 子表隐藏字段,目前写死为ID + { + label: '', + field: 'id', + component: 'Input', + show: false + }, + +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if po.isShow =='Y' && po.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#assign form_field_dictCode=""> + <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}"> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictField}"> + + { + label: '${po.filedComment}', + field: ${autoStringSuffix(po)}, +<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.defaultVal??> + <#if po.fieldDbType=="BigDecimal" || po.fieldDbType=="double" || po.fieldDbType=="int"> + defaultValue: ${po.defaultVal}, + <#else> + defaultValue: "${po.defaultVal}", + + +<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.classType =='date'> + component: 'DatePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueFormat: 'YYYY-MM-DD' + }, + <#elseif po.classType =='datetime'> + component: 'DatePicker', + componentProps: { + showTime:true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, + <#elseif po.classType =='time'> + component: 'TimePicker', + componentProps: { + valueFormat: 'HH:mm:ss' + }, + <#elseif po.classType =='popup'> + <#include "/common/form/vue3popup.ftl"> + <#elseif po.classType=='popup_dict'> + component: 'JPopupDict', + componentProps: { + placeholder: '请选择${po.filedComment}', + dictCode: '${po.dictTable},${po.dictText},${po.dictField}', + multi: ${po.extendParams.popupMulti?c} + }, + <#elseif po.classType =='sel_depart'> + component: 'JSelectDept', + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType =='switch'> + component: 'JSwitch', + componentProps:{ + <#if po.dictField != 'is_open'> + options:${po.dictField} + + }, + <#elseif po.classType =='pca'> + component: 'JAreaLinkage', + componentProps: { + saveCode: 'region', + }, + <#elseif po.classType =='markdown'> + component: 'JMarkdownEditor',//注意string转换问题 + <#elseif po.classType =='password'> + component: 'InputPassword', + <#elseif po.classType =='sel_user'> +<#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + component: 'JSelectUser', +<#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + <#else> + labelKey:'realname', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType =='textarea'> + component: 'InputTextArea', + <#elseif po.classType=='list' || po.classType=='radio'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='list_multi'> + component: 'JSelectMultiple', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#elseif po.classType=='checkbox'> + component: 'JCheckbox', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='sel_search'> + component: 'JSearchSelect', + componentProps:{ + dict:"${form_field_dictCode}" + }, +<#elseif po.classType=='cat_tree'> + <#assign form_cat_tree = true> + component: 'JCategorySelect', + componentProps:{ + pcode:"${po.dictField?default("")}", //TODO back和事件未添加,暂时有问题 + }, + <#if po.dictText?default("")?trim?length gt 1> + <#assign form_cat_back = "${po.dictText}"> + + <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'InputNumber', + <#elseif po.classType=='file'> + component: 'JUpload', + componentProps:{ + <#if po.uploadnum??> + maxCount:${po.uploadnum} + + }, + <#elseif po.classType=='image'> + component: 'JImageUpload', + componentProps:{ + <#if po.uploadnum??> + fileMax:${po.uploadnum} + <#else> + fileMax: 0 + + }, + <#elseif po.classType=='umeditor'> + component: 'JEditor', + <#elseif po.classType == 'sel_tree'> + component: 'JTreeSelect', + componentProps:{ + <#if po.dictText??> + <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> + dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}", + <#elseif po.dictText?split(',')[1]??> + pidField:"${po.dictText?split(',')[1]}", + <#elseif po.dictText?split(',')[3]??> + hasChildField:"${po.dictText?split(',')[3]}", + + + pidValue:"${po.dictField}", + }, + <#elseif po.classType=='link_table'> + component: 'JLinkTableCard', + componentProps: { + valueField: '${po.dictField}', + textField: '${po.dictText}', + tableName: '${po.dictTable}', + multi: <#if (po.queryMode!"") == "multi">true<#else>false + }, + <#else> + component: 'Input', + + <#include "/common/utils.ftl"> + <#if po.isShow == 'Y' && poHasCheck(po)> + dynamicRules: ({model,schema}) => { + <#if po.fieldName != 'id'> + <#assign fieldValidType = po.fieldValidType!''> + return [ + <#-- 非空校验 --> + <#if po.nullable == 'N' || fieldValidType == '*'> + { required: true, message: '请输入${po.filedComment}!'}, + <#elseif fieldValidType!=''> + { required: false}, + + <#-- 唯一校验 --> + <#if fieldValidType == 'only'> + {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}', '${po.fieldDbName}',model,schema)[0]}, + <#-- 6到16位数字 --> + <#elseif fieldValidType == 'n6-16'> + { pattern: /^\d{6,16}$|^(?=\d+\.\d+)[\d.]{7,17}$/, message: '请输入6到16位数字!'}, + <#-- 6到16位任意字符 --> + <#elseif fieldValidType == '*6-16'> + { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'}, + <#-- 6到18位字母 --> + <#elseif fieldValidType == 's6-18'> + { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'}, + <#-- 网址 --> + <#elseif fieldValidType == 'url'> + { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'}, + <#-- 电子邮件 --> + <#elseif fieldValidType == 'e'> + { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'}, + <#-- 手机号码 --> + <#elseif fieldValidType == 'm'> + { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'}, + <#-- 邮政编码 --> + <#elseif fieldValidType == 'p'> + { pattern: /^[0-9]\d{5}$/, message: '请输入正确的邮政编码!'}, + <#-- 字母 --> + <#elseif fieldValidType == 's'> + { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'}, + <#-- 数字 --> + <#elseif fieldValidType == 'n'> + { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'}, + <#-- 整数 --> + <#elseif fieldValidType == 'z'> + { pattern: /^-?\d+$/, message: '请输入整数!'}, + <#-- 金额 --> + <#elseif fieldValidType == 'money'> + { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'}, + <#-- 正则校验 --> + <#elseif fieldValidType != '' && fieldValidType != '*'> + { pattern: '${fieldValidType}', message: '不符合校验规则!'}, + <#-- 无校验 --> + <#else> + <#t> + + ]; + + }, + + <#if po.readonly=='Y'> + dynamicDisabled:true, + + }, + + +]; + + +<#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> +// 高级查询数据 +export const superQuerySchema = { + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + ${superQueryFieldListForVue3(po,po_index)}, + + +}; +<#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql new file mode 100644 index 00000000..5396d5d5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql @@ -0,0 +1 @@ +<#include "/common/sql/menu_insert.ftl"> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/[1-n]List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/[1-n]List.vuei new file mode 100644 index 00000000..d882ad56 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/[1-n]List.vuei @@ -0,0 +1,189 @@ +<#list subTables as sub> +#segment#${sub.entityName}List.vue + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei new file mode 100644 index 00000000..54e87d06 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei @@ -0,0 +1,129 @@ +<#include "/common/utils.ftl"> + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Modal.vuei new file mode 100644 index 00000000..526b1821 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Modal.vuei @@ -0,0 +1,114 @@ +<#include "/common/utils.ftl"> +<#list subTables as sub> +#segment#${sub.entityName}Modal.vue + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei new file mode 100644 index 00000000..09c1a614 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei @@ -0,0 +1,613 @@ +<#include "/common/utils.ftl"> + + +<#if query_flag> + + + + 查询 + 重置 + + {{ toggleSearchStatus ? '收起' : '展开' }} + + + + + + + + + +<#-- 结束循环 --> +
+ + + + + + + + + + + + <#assign sub_seq=1> + <#list subTables as sub> + forceRender> + <${sub.entityName}List /> + + <#assign sub_seq=sub_seq+1> + + +
+ + <${entityName}Modal ref="registerModal" @success="handleSuccess" /> + <#if bpm_flag==true> + + + + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi new file mode 100644 index 00000000..e40d27c8 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi @@ -0,0 +1,139 @@ +import {defHttp} from '/@/utils/http/axios'; +import { useMessage } from "/@/hooks/web/useMessage"; + +const { createConfirm } = useMessage(); + +enum Api { + list = '/${entityPackagePath}/${entityName?uncap_first}/list', + save= '/${entityPackagePath}/${entityName?uncap_first}/add', + edit= '/${entityPackagePath}/${entityName?uncap_first}/edit', + deleteOne = '/${entityPackagePath}/${entityName?uncap_first}/delete', + deleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch', + importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel', + exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls', +<#list subTables as sub><#rt/> + ${sub.entityName?uncap_first}List = '/${entityPackagePath}/${entityName?uncap_first}/list${sub.entityName}ByMainId', + ${sub.entityName?uncap_first}Save= '/${entityPackagePath}/${entityName?uncap_first}/add${sub.entityName}', + ${sub.entityName?uncap_first}Edit= '/${entityPackagePath}/${entityName?uncap_first}/edit${sub.entityName}', + ${sub.entityName?uncap_first}Delete = '/${entityPackagePath}/${entityName?uncap_first}/delete${sub.entityName}', + ${sub.entityName?uncap_first}DeleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch${sub.entityName}', + +} +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; + +/** + * 导入api + */ +export const getImportUrl = Api.importExcel; + +/** + * 列表接口 + * @param params + */ +export const list = (params) => + defHttp.get({ url: Api.list, params }); + +/** + * 删除单个 + */ +export const deleteOne = (params,handleSuccess) => { + return defHttp.delete({ url: Api.deleteOne, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +} + +/** + * 批量删除 + * @param params + */ +export const batchDelete = (params, handleSuccess) => { + createConfirm({ + iconType: 'warning', + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + } + }); +} + +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdate = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({ url: url, params },{ isTransformResponse: false }); +} +<#list subTables as sub><#rt/> + <#assign myForeignKeys=''> + <#list sub.foreignKeys as key> + <#assign myForeignKeys='${key?uncap_first}'> + + +/** + * 列表接口 + * @param params + */ +export const ${sub.entityName?uncap_first}List = (params) => { + if(params['${myForeignKeys}']){ + return defHttp.get({ url: Api.${sub.entityName?uncap_first}List, params }); + } + return Promise.resolve({}); +} + +/** + * 删除单个 + */ +export const ${sub.entityName?uncap_first}Delete = (params,handleSuccess) => { + return defHttp.delete({ url: Api.${sub.entityName?uncap_first}Delete, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +} + +/** + * 批量删除 + * @param params + */ +export const ${sub.entityName?uncap_first}DeleteBatch = (params, handleSuccess) => { + createConfirm({ + iconType: 'warning', + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({ url: Api.${sub.entityName?uncap_first}DeleteBatch, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + } + }); +} + +/** + * 保存或者更新 + * @param params + */ +export const ${sub.entityName?uncap_first}SaveOrUpdate = (params, isUpdate) => { + let url = isUpdate ? Api.${sub.entityName?uncap_first}Edit : Api.${sub.entityName?uncap_first}Save; + return defHttp.post({ url: url, params },{ isTransformResponse: false }); +} + +/** + * 导入 + */ +export const ${sub.entityName?uncap_first}ImportUrl = '/${entityPackagePath}/${entityName?uncap_first}/import${sub.entityName}' + +/** + * 导出 + */ +export const ${sub.entityName?uncap_first}ExportXlsUrl = '/${entityPackagePath}/${entityName?uncap_first}/export${sub.entityName}' + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi new file mode 100644 index 00000000..bd01e278 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi @@ -0,0 +1,155 @@ +<#include "/common/utils.ftl"> +import {BasicColumn} from '/@/components/Table'; +import {FormSchema} from '/@/components/Table'; +import { rules} from '/@/utils/helper/validator'; +import { render } from '/@/utils/common/renderUtils'; +import { getWeekMonthQuarterYear } from '/@/utils'; +//列表数据 +export const columns: BasicColumn[] = [ + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + { + title: '${po.filedComment}', + align:"center", + <#if po.sort=='Y'> + sorter: true, + + <#if po.classType=='date'> + dataIndex: '${po.fieldName}', + customRender:({text}) =>{ + text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text); + <#if po.extendParams?exists && po.extendParams.picker?exists> + if(text) { + return getWeekMonthQuarterYear(text)['${po.extendParams.picker}']; + } else { + return text; + } + <#else> + return text; + + }, + <#elseif po.fieldDbType=='Blob'> + dataIndex: '${po.fieldName}String' + <#elseif po.classType=='umeditor'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='pca'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='file'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='image'> + dataIndex: '${po.fieldName}', + customRender:render.renderImage, + <#elseif po.classType=='switch'> + dataIndex: '${po.fieldName}', +<#assign switch_extend_arr=['Y','N']> +<#if po.dictField?default("")?contains("[")> +<#assign switch_extend_arr=po.dictField?eval> + +<#list switch_extend_arr as a> +<#if a_index == 0> +<#assign switch_extend_arr1=a> +<#else> +<#assign switch_extend_arr2=a> + + + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}]) + }, + <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict'> + dataIndex: '${po.fieldName}_dictText' + <#elseif po.classType=='cat_tree'> + dataIndex: '${po.fieldName}', + <#if po.dictText?default("")?trim?length == 0> + customRender:({text}) => { + return render.renderCategoryTree(text,'${po.dictField?default("")}') + }, + <#else> + customRender: (text, record) => (text ? record['${po.dictText}'] : '') + + <#else> + dataIndex: '${po.fieldName}' + + }, + + +]; + +<#list subTables as sub> +//子表列表数据 +export const ${sub.entityName?uncap_first}Columns: BasicColumn[] = [ + <#list sub.originalColumns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + { + title: '${po.filedComment}', + align:"center", + <#if po.sort=='Y'> + sorter: true, + + <#if po.classType=='date'> + dataIndex: '${po.fieldName}', + customRender:({text}) =>{ + return !text?"":(text.length>10?text.substr(0,10):text) + }, + <#elseif po.fieldDbType=='Blob'> + dataIndex: '${po.fieldName}String' + <#elseif po.classType=='umeditor'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='pca'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='file'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='image'> + dataIndex: '${po.fieldName}', + customRender:render.renderImage, + <#elseif po.classType=='switch'> + dataIndex: '${po.fieldName}', +<#assign switch_extend_arr=['Y','N']> +<#if po.dictField?default("")?contains("[")> +<#assign switch_extend_arr=po.dictField?eval> + +<#list switch_extend_arr as a> +<#if a_index == 0> +<#assign switch_extend_arr1=a> +<#else> +<#assign switch_extend_arr2=a> + + + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}]) + }, + <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict'> + dataIndex: '${po.fieldName}_dictText' + <#elseif po.classType=='cat_tree'> + dataIndex: '${po.fieldName}', + <#if po.dictText?default("")?trim?length == 0> + customRender:({text}) => { + return render.renderCategoryTree(text,'${po.dictField?default("")}') + }, + <#else> + customRender: ({text, record}) => (text ? record['${po.dictText}'] : '') + + <#else> + dataIndex: '${po.fieldName}' + + }, + + +]; + + +<#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> +// 高级查询数据 +export const superQuerySchema = { + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + ${superQueryFieldListForVue3(po,po_index)}, + + +}; +<#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql new file mode 100644 index 00000000..5396d5d5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql @@ -0,0 +1 @@ +<#include "/common/sql/menu_insert.ftl"> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/[1-n]List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/[1-n]List.vuei new file mode 100644 index 00000000..39ea595c --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/[1-n]List.vuei @@ -0,0 +1,250 @@ +<#list subTables as sub> +#segment#${sub.entityName}List.vue +<#assign need_pca = false> +<#assign is_like = false> + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei new file mode 100644 index 00000000..abd2775e --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei @@ -0,0 +1,252 @@ +<#include "/common/utils.ftl"> + + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei new file mode 100644 index 00000000..2bc88163 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei @@ -0,0 +1,105 @@ +<#include "/common/utils.ftl"> + + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Form.vuei new file mode 100644 index 00000000..87511dc6 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Form.vuei @@ -0,0 +1,228 @@ +<#list subTables as sub> +#segment#${sub.entityName}Form.vue +<#include "/common/utils.ftl"> +<#assign need_category = false> +<#assign bpm_flag=false> +<#assign need_pca = false> +<#assign need_search = false> +<#assign need_dept_user = false> +<#assign need_switch = false> +<#assign need_dept = false> +<#assign need_multi = false> +<#assign need_popup = false> +<#assign need_popup_dict = false> +<#assign need_select_tag = false> +<#assign need_select_tree = false> +<#assign need_time = false> +<#assign need_markdown = false> +<#assign need_upload = false> +<#assign need_image_upload = false> +<#assign need_editor = false> +<#assign need_checkbox = false> +<#assign need_range_number = false> +<#assign is_like = false> +<#assign form_span = 24> +<#if tableVo.fieldRowNum==2> + <#assign form_span = 12> +<#elseif tableVo.fieldRowNum==3> + <#assign form_span = 8> +<#elseif tableVo.fieldRowNum==4> + <#assign form_span = 6> + + <#assign hasOnlyValidate = false> + + + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Modal.vuei new file mode 100644 index 00000000..2218e926 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Modal.vuei @@ -0,0 +1,79 @@ +<#include "/common/utils.ftl"> +<#list subTables as sub> +#segment#${sub.entityName}Modal.vue + + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai new file mode 100644 index 00000000..932ba94a --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -0,0 +1,368 @@ +package ${bussiPackage}.${entityPackage}.controller; + +import java.io.UnsupportedEncodingException; +import java.io.IOException; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.HashMap; +import java.util.stream.Collectors; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.vo.LoginUser; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.util.oConvertUtils; +import org.jeecgframework.poi.excel.entity.enmus.ExcelType; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import ${bussiPackage}.${entityPackage}.vo.${entityName}Page; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.service.I${sub.entityName}Service; + +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; +<#assign has_multi_query_field=false> +<#list originalColumns as po> +<#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')> + <#assign has_multi_query_field=true> + + +<#assign enhanceJavaList=[]> +<#if tableVo.extendParams?? && tableVo.extendParams.enhanceJavaList??> + <#assign enhanceJavaList = tableVo.extendParams.enhanceJavaList?filter(enhance -> enhance??)> + + /** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Tag(name="${tableVo.ftlDescription}") +@RestController +@RequestMapping("/${entityPackagePath}/${entityName?uncap_first}") +@Slf4j +public class ${entityName}Controller { + @Autowired + private I${entityName}Service ${entityName?uncap_first}Service; + <#list subTables as sub> + @Autowired + private I${sub.entityName}Service ${sub.entityName?uncap_first}Service; + + + /** + * 分页列表查询 + * + * @param ${entityName?uncap_first} + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "${tableVo.ftlDescription}-分页列表查询") + @Operation(summary="${tableVo.ftlDescription}-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(${entityName} ${entityName?uncap_first}, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 查询前触发的方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeQuery() + + + + <#if has_multi_query_field> + // 自定义查询规则 + Map customeRuleMap = new HashMap<>(); + // 自定义多选的查询规则为:LIKE_WITH_OR + <#list originalColumns as po> + <#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')> + customeRuleMap.put("${po.fieldName}", QueryRuleEnum.LIKE_WITH_OR); + + + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap(),customeRuleMap); + <#else> + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap()); + + Page<${entityName}> page = new Page<${entityName}>(pageNo, pageSize); + IPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper); + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'> + //TODO 查询后触发的方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.afterQuery() + + + + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param ${entityName?uncap_first}Page + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-添加") + @Operation(summary="${tableVo.ftlDescription}-添加") + @RequiresPermissions("${entityPackage}:${tableName}:add") + @PostMapping(value = "/add") + public Result add(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 新增前的处理方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeAdd() + + + + ${entityName} ${entityName?uncap_first} = new ${entityName}(); + BeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first}); + ${entityName?uncap_first}Service.saveMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,); + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'> + //TODO 新增后的处理方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.afterAdd() + + + + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param ${entityName?uncap_first}Page + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-编辑") + @Operation(summary="${tableVo.ftlDescription}-编辑") + @RequiresPermissions("${entityPackage}:${tableName}:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 编辑前,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeEdit() + + + + ${entityName} ${entityName?uncap_first} = new ${entityName}(); + BeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first}); + ${entityName} ${entityName?uncap_first}Entity = ${entityName?uncap_first}Service.getById(${entityName?uncap_first}.getId()); + if(${entityName?uncap_first}Entity==null) { + return Result.error("未找到对应数据"); + } + ${entityName?uncap_first}Service.updateMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,); + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'> + //TODO 编辑后,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.afterEdit() + + + + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-通过id删除") + @Operation(summary="${tableVo.ftlDescription}-通过id删除") + @RequiresPermissions("${entityPackage}:${tableName}:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + ${entityName?uncap_first}Service.delMain(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-批量删除") + @Operation(summary="${tableVo.ftlDescription}-批量删除") + @RequiresPermissions("${entityPackage}:${tableName}:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "${tableVo.ftlDescription}-通过id查询") + @Operation(summary="${tableVo.ftlDescription}-通过id查询") + @GetMapping(value = "/queryById") + public Result<${entityName}> queryById(@RequestParam(name="id",required=true) String id) { + ${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id); + if(${entityName?uncap_first}==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(${entityName?uncap_first}); + + } + + <#list subTables as sub> + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "${sub.ftlDescription}-通过主表ID查询") + @Operation(summary="${sub.ftlDescription}-通过主表ID查询") + @GetMapping(value = "/query${sub.entityName}ByMainId") + public Result> query${sub.entityName}ListByMainId(@RequestParam(name="id",required=true) String id) { + List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(id); + <#-- 包裹分页对象,用于翻译注解 --> + IPage <${sub.entityName}> page = new Page<>(); + page.setRecords(${sub.entityName?uncap_first}List); + page.setTotal(${sub.entityName?uncap_first}List.size()); + return Result.OK(page); + } + + + /** + * 导出excel + * + * @param request + * @param ${entityName?uncap_first} + */ + @RequiresPermissions("${entityPackage}:${tableName}:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='export' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 导出前,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeExport() + + + + // Step.1 组装查询条件查询数据 + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap()); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + + //配置选中数据查询条件 + String selections = request.getParameter("selections"); + if(oConvertUtils.isNotEmpty(selections)) { + List selectionList = Arrays.asList(selections.split(",")); + queryWrapper.in("id",selectionList); + } + //Step.2 获取导出数据 + List<${entityName}> ${entityName?uncap_first}List = ${entityName?uncap_first}Service.list(queryWrapper); + + // Step.3 组装pageList + List<${entityName}Page> pageList = new ArrayList<${entityName}Page>(); + for (${entityName} main : ${entityName?uncap_first}List) { + ${entityName}Page vo = new ${entityName}Page(); + BeanUtils.copyProperties(main, vo); + <#list subTables as sub> + List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(main.getId()); + vo.set${sub.entityName}List(${sub.entityName?uncap_first}List); + + pageList.add(vo); + } + + // Step.4 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + mv.addObject(NormalExcelConstants.FILE_NAME, "${tableVo.ftlDescription}列表"); + mv.addObject(NormalExcelConstants.CLASS, ${entityName}Page.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("${tableVo.ftlDescription}数据", "导出人:"+sysUser.getRealname(), "${tableVo.ftlDescription}", ExcelType.XSSF)); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("${entityPackage}:${tableName}:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='import' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 导入前,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeImport() + + + + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + // 获取上传文件对象 + MultipartFile file = entity.getValue(); + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<${entityName}Page> list = ExcelImportUtil.importExcel(file.getInputStream(), ${entityName}Page.class, params); + for (${entityName}Page page : list) { + ${entityName} po = new ${entityName}(); + BeanUtils.copyProperties(page, po); + ${entityName?uncap_first}Service.saveMain(po, <#list subTables as sub>page.get${sub.entityName}List()<#if sub_has_next>,); + } + return Result.OK("文件导入成功!数据行数:" + list.size()); + } catch (Exception e) { + log.error(e.getMessage(),e); + return Result.error("文件导入失败:"+e.getMessage()); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.OK("文件导入失败!"); + } + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai new file mode 100644 index 00000000..5762ece1 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai @@ -0,0 +1,82 @@ +<#include "/common/utils.ftl"> +package ${bussiPackage}.${entityPackage}.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Schema(description="${tableVo.ftlDescription}") +@Data +@TableName("${tableName}") +public class ${entityName} implements Serializable { + private static final long serialVersionUID = 1L; + + <#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']> + <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']> + <#list originalColumns as po> + <#-- 生成字典Code --> + <#assign list_field_dictCode=""> + <#if po.classType='sel_user'> + <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'> + <#elseif po.classType='sel_depart'> + <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'> + <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dicCode = "${po.dictField}"'> + + <#elseif po.classType=='sel_tree'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText?split(",")[2]}", dicCode = "${po.dictText?split(",")[0]}"'> + <#elseif po.classType=='link_table'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicCode = "${po.dictField}", dicText = "${po.dictText?split(",")[0]}"'> + + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + @TableId(type = IdType.ASSIGN_ID) + <#else> + <#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'> + <#if po.classType=='date'> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}") && !excel_ignore_classType_arr?seq_contains("${po.classType}")> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + + + <#if list_field_dictCode?length gt 1> + @Dict(${list_field_dictCode?substring(2)}) + + + <#include "/common/blob.ftl"> + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai new file mode 100644 index 00000000..a81400f1 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai @@ -0,0 +1,86 @@ +<#include "/common/utils.ftl"> +<#list subTables as subTab> +#segment#${subTab.entityName}.java +package ${bussiPackage}.${entityPackage}.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import java.util.Date; +import org.jeecg.common.aspect.annotation.Dict; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.UnsupportedEncodingException; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Schema(description="${subTab.ftlDescription}") +@Data +@TableName("${subTab.tableName}") +public class ${subTab.entityName} implements Serializable { + private static final long serialVersionUID = 1L; + +<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']> + <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']> + <#list subTab.originalColumns as po> + <#-- 生成字典Code --> + <#assign list_field_dictCode=""> + <#if po.classType='sel_user'> + <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'> + <#elseif po.classType='sel_depart'> + <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'> + <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dicCode = "${po.dictField}"'> + <#elseif po.classType=='sel_tree'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText?split(",")[2]}", dicCode = "${po.dictText?split(",")[0]}"'> + + <#elseif po.classType=='link_table'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicCode = "${po.dictField}", dicText = "${po.dictText?split(",")[0]}"'> + + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + @TableId(type = IdType.ASSIGN_ID) + <#else> + <#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'> + <#if po.classType=='date'> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + + <#elseif !subTab.foreignKeys?seq_contains(po.fieldName?cap_first)> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}") && !excel_ignore_classType_arr?seq_contains("${po.classType}")> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + + + + <#if list_field_dictCode?length gt 1> + @Dict(${list_field_dictCode?substring(2)}) + + <#-- 大字段转换 --> + <#include "/common/blob.ftl"> + +} + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai new file mode 100644 index 00000000..c31b9bfd --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai @@ -0,0 +1,17 @@ +package ${bussiPackage}.${entityPackage}.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface ${entityName}Mapper extends BaseMapper<${entityName}> { + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai new file mode 100644 index 00000000..10b27644 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai @@ -0,0 +1,34 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}Mapper.java +package ${bussiPackage}.${entityPackage}.mapper; + +import java.util.List; +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface ${subTab.entityName}Mapper extends BaseMapper<${subTab.entityName}> { + + /** + * 通过主表id删除子表数据 + * + * @param mainId 主表id + * @return boolean + */ + public boolean deleteByMainId(@Param("mainId") String mainId); + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List<${subTab.entityName}> + */ + public List<${subTab.entityName}> selectByMainId(@Param("mainId") String mainId); +} + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml new file mode 100644 index 00000000..16f3d653 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml new file mode 100644 index 00000000..117c9b6f --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml @@ -0,0 +1,26 @@ +<#list subTables as subTab> +<#assign originalForeignKeys = subTab.originalForeignKeys> +#segment#${subTab.entityName}Mapper.xml + + + + + + DELETE + FROM ${subTab.tableName} + WHERE + <#list originalForeignKeys as key> + ${key} = ${r'#'}{mainId} <#rt/> + + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai new file mode 100644 index 00000000..d80c0290 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai @@ -0,0 +1,54 @@ +package ${bussiPackage}.${entityPackage}.service; + +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import com.baomidou.mybatisplus.extension.service.IService; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface I${entityName}Service extends IService<${entityName}> { + + /** + * 添加一对多 + * + * @param ${entityName?uncap_first} + <#list subTables as sub> + * @param ${sub.entityName?uncap_first}List + + */ + public void saveMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,) ; + + /** + * 修改一对多 + * + * @param ${entityName?uncap_first} + <#list subTables as sub> + * @param ${sub.entityName?uncap_first}List + + */ + public void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,); + + /** + * 删除一对多 + * + * @param id + */ + public void delMain (String id); + + /** + * 批量删除一对多 + * + * @param idList + */ + public void delBatchMain (Collection idList); + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai new file mode 100644 index 00000000..cbc72ff4 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai @@ -0,0 +1,25 @@ +<#list subTables as subTab> +#segment#I${subTab.entityName}Service.java +package ${bussiPackage}.${entityPackage}.service; + +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface I${subTab.entityName}Service extends IService<${subTab.entityName}> { + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List<${subTab.entityName}> + */ + public List<${subTab.entityName}> selectByMainId(String mainId); +} + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai new file mode 100644 index 00000000..7f99d42e --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai @@ -0,0 +1,105 @@ +package ${bussiPackage}.${entityPackage}.service.impl; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.mapper.${sub.entityName}Mapper; + +import ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import java.io.Serializable; +import java.util.List; +import java.util.Collection; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Service +public class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service { + + @Autowired + private ${entityName}Mapper ${entityName?uncap_first}Mapper; + <#list subTables as sub> + @Autowired + private ${sub.entityName}Mapper ${sub.entityName?uncap_first}Mapper; + + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveMain(${entityName} ${entityName?uncap_first}, <#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,) { + ${entityName?uncap_first}Mapper.insert(${entityName?uncap_first}); + <#list subTables as sub> + if(${sub.entityName?uncap_first}List!=null && ${sub.entityName?uncap_first}List.size()>0) { + for(${sub.entityName} entity:${sub.entityName?uncap_first}List) { + <#list sub.foreignKeys as key> + //外键设置 + <#if key?lower_case?index_of("${primaryKeyField}")!=-1> + entity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}()); + <#else> + entity.set${key?cap_first}(${entityName?uncap_first}.get${key}()); + + + ${sub.entityName?uncap_first}Mapper.insert(entity); + } + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,) { + ${entityName?uncap_first}Mapper.updateById(${entityName?uncap_first}); + + //1.先删除子表数据 + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(${entityName?uncap_first}.getId()); + + + //2.子表数据重新插入 + <#list subTables as sub> + if(${sub.entityName?uncap_first}List!=null && ${sub.entityName?uncap_first}List.size()>0) { + for(${sub.entityName} entity:${sub.entityName?uncap_first}List) { + <#list sub.foreignKeys as key> + //外键设置 + <#if key?lower_case?index_of("${primaryKeyField}")!=-1> + entity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}()); + <#else> + entity.set${key?cap_first}(${entityName?uncap_first}.get${key}()); + + + ${sub.entityName?uncap_first}Mapper.insert(entity); + } + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delMain(String id) { + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(id); + + ${entityName?uncap_first}Mapper.deleteById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delBatchMain(Collection idList) { + for(Serializable id:idList) { + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(id.toString()); + + ${entityName?uncap_first}Mapper.deleteById(id); + } + } + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai new file mode 100644 index 00000000..0ce41d36 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai @@ -0,0 +1,30 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}ServiceImpl.java +package ${bussiPackage}.${entityPackage}.service.impl; + +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import ${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper; +import ${bussiPackage}.${entityPackage}.service.I${subTab.entityName}Service; +import org.springframework.stereotype.Service; +import java.util.List; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Service +public class ${subTab.entityName}ServiceImpl extends ServiceImpl<${subTab.entityName}Mapper, ${subTab.entityName}> implements I${subTab.entityName}Service { + + @Autowired + private ${subTab.entityName}Mapper ${subTab.entityName?uncap_first}Mapper; + + @Override + public List<${subTab.entityName}> selectByMainId(String mainId) { + return ${subTab.entityName?uncap_first}Mapper.selectByMainId(mainId); + } +} + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai new file mode 100644 index 00000000..218e4899 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai @@ -0,0 +1,117 @@ +package ${bussiPackage}.${entityPackage}.vo; + +import java.util.List; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecgframework.poi.excel.annotation.ExcelEntity; +import org.jeecgframework.poi.excel.annotation.ExcelCollection; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import java.util.Date; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Data +@Schema(description="${tableVo.ftlDescription}") +public class ${entityName}Page { + +<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']> +<#assign excel_ignore_classType_arr=['pca','switch','cat_tree']> + <#list originalColumns as po> + <#-- 生成字典Code --> + <#assign list_field_dictCode=""> + <#if po.classType='sel_user'> + <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "realname", dicCode = "username"'> + <#elseif po.classType='sel_depart'> + <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "depart_name", dicCode = "id"'> + <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dicCode = "${po.dictField}"'> + <#elseif po.classType=='cat_tree'> + <#assign list_field_dictCode=', dictTable = "sys_category", dicText = "name", dicCode = "id"'> + + + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + <#else> + <#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'> + <#if po.classType=='date'> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}") && !excel_ignore_classType_arr?seq_contains("${po.classType}")> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + + <#if list_field_dictCode?length gt 1 && !excel_ignore_classType_arr?seq_contains("${po.classType}")> + @Dict(${list_field_dictCode?substring(2)}) + + + + @Schema(description = "${po.filedComment}") + <#if po.fieldDbType=='Blob'> + private java.lang.String ${po.fieldName}String; + <#elseif po.classType=='pca'> + @Excel(name = "${po.filedComment}", width = 15,exportConvert=true,importConvert = true ) + private ${po.fieldType} ${po.fieldName}; + + public String convertis${po.fieldName?cap_first}() { + return SpringContextUtils.getBean(ProvinceCityArea.class).getText(${po.fieldName}); + } + + public void convertset${po.fieldName?cap_first}(String text) { + this.${po.fieldName} = SpringContextUtils.getBean(ProvinceCityArea.class).getCode(text); + } + <#elseif po.classType=='cat_tree'> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + private ${po.fieldType} ${po.fieldName}; + <#elseif po.classType=='switch'> + <#assign switch_extend_arr=['Y','N']> + <#if po.dictField?default("")?contains("[")> + <#assign switch_extend_arr=po.dictField?eval> + + <#list switch_extend_arr as a> + <#if a_index == 0> + <#assign switch_extend_arr1=a> + <#else> + <#assign switch_extend_arr2=a> + + + @Excel(name = "${po.filedComment}", width = 15,replace = {"是_${switch_extend_arr1}","否_${switch_extend_arr2}"} ) + private ${po.fieldType} ${po.fieldName}; + <#else> + private ${po.fieldType} ${po.fieldName}; + + + + <#list subTables as sub> + @ExcelCollection(name="${sub.ftlDescription}") + @Schema(description = "${sub.ftlDescription}") + private List<${sub.entityName}> ${sub.entityName?uncap_first}List; + + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei new file mode 100644 index 00000000..aa402355 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei @@ -0,0 +1,509 @@ +<#-- noinspection JSDuplicatedDeclaration,RequiredAttributes,NpmUsedModulesInstalled --> +<#-- ** 引入全局工具方法 ** --> +<#include "/common/utils.ftl"> +<#-- ** 定义全局使用的变量 ** --> +<#-- 是否有查询条件 --> +<#assign query_flag=false> +<#-- 是否有下拉查询条件 --> +<#assign query_field_select=false> +<#-- 是否有日期查询条件 --> +<#assign query_field_date=false> +<#-- 是否有字典 --> +<#assign list_need_dict=false> +<#-- 是否有分类字典 --> +<#assign list_need_category=false> +<#-- 是否有省市区 --> +<#assign list_need_pca=false> +<#-- 是否有用户选择 --> +<#assign query_sel_user=false> +<#-- 是否有部门选择 --> +<#assign query_sel_dep=false> +<#-- 是否有下拉多选框 --> +<#assign query_sel_multi=false> +<#-- 是否有下拉搜索框 --> +<#assign query_sel_search=false> +<#-- 是否有省市区组件 --> +<#assign query_field_pca=false> +<#-- 是否有分类字典树 --> +<#assign query_sel_cat=false> + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql new file mode 100644 index 00000000..5396d5d5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql @@ -0,0 +1 @@ +<#include "/common/sql/menu_insert.ftl"> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei new file mode 100644 index 00000000..d2d6ac6c --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei @@ -0,0 +1,545 @@ +<#include "/common/utils.ftl"> + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei new file mode 100644 index 00000000..5d789e93 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei @@ -0,0 +1,62 @@ +<#include "/common/utils.ftl"> + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei new file mode 100644 index 00000000..9b697c66 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei @@ -0,0 +1,167 @@ +<#include "/common/utils.ftl"> +<#list subTables as sub> +<#if sub.foreignRelationType=='1'> +#segment#${sub.entityName}Form.vue + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/subTables/[1-n]SubTable.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/subTables/[1-n]SubTable.vuei new file mode 100644 index 00000000..a68776e7 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/subTables/[1-n]SubTable.vuei @@ -0,0 +1,146 @@ +<#--noinspection JSDuplicatedDeclaration--> +<#list subTables as sub> +#segment#${sub.entityName}SubTable.vue + + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei new file mode 100644 index 00000000..8b086409 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei @@ -0,0 +1,470 @@ +<#-- ** 引入全局工具方法 ** --> +<#include "/common/utils.ftl"> + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi new file mode 100644 index 00000000..a22734b2 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi @@ -0,0 +1,83 @@ +import {defHttp} from '/@/utils/http/axios'; +import { useMessage } from "/@/hooks/web/useMessage"; + +const { createConfirm } = useMessage(); + +enum Api { + list = '/${entityPackagePath}/${entityName?uncap_first}/list', + save='/${entityPackagePath}/${entityName?uncap_first}/add', + edit='/${entityPackagePath}/${entityName?uncap_first}/edit', + deleteOne = '/${entityPackagePath}/${entityName?uncap_first}/delete', + deleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch', + importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel', + exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls', +<#list subTables as sub><#rt/> + ${sub.entityName?uncap_first}List = '/${entityPackagePath}/${entityName?uncap_first}/query${sub.entityName}ByMainId', + +} +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; + +/** + * 导入api + */ +export const getImportUrl = Api.importExcel; +<#list subTables as sub><#rt/> +/** + * 子表单查询接口 + * @param params + */ +export const query${sub.entityName} = Api.${sub.entityName?uncap_first}List + +/** + * 列表接口 + * @param params + */ +export const list = (params) => + defHttp.get({url: Api.list, params}); + +/** + * 删除单个 + */ +export const deleteOne = (params,handleSuccess) => { + return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); +} +/** + * 批量删除 + * @param params + */ +export const batchDelete = (params, handleSuccess) => { + createConfirm({ + iconType: 'warning', + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); + } + }); +} +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdate = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({url: url, params}); +} +<#list subTables as sub><#rt/> +/** + * 子表列表接口 + * @param params + */ +export const ${sub.entityName?uncap_first}List = (params) => + defHttp.get({url: Api.${sub.entityName?uncap_first}List, params},{isTransformResponse:false}); + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi new file mode 100644 index 00000000..2d744b30 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi @@ -0,0 +1,1060 @@ +<#include "/common/utils.ftl"> +import {BasicColumn} from '/@/components/Table'; +import {FormSchema} from '/@/components/Table'; +import { rules} from '/@/utils/helper/validator'; +import { render } from '/@/utils/common/renderUtils'; +import {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types' +import { getWeekMonthQuarterYear } from '/@/utils'; +//列表数据 +export const columns: BasicColumn[] = [ + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + { + title: '${po.filedComment}', + align:"center", + <#if po.sort=='Y'> + sorter: true, + + <#if po.classType=='date'> + dataIndex: '${po.fieldName}', + customRender:({text}) =>{ + text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text); + <#if po.extendParams?exists && po.extendParams.picker?exists> + if(text) { + return getWeekMonthQuarterYear(text)['${po.extendParams.picker}']; + } else { + return text; + } + <#else> + return text; + + }, + <#elseif po.fieldDbType=='Blob'> + dataIndex: '${po.fieldName}String' + <#elseif po.classType=='umeditor'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='pca'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='file'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='image'> + dataIndex: '${po.fieldName}', + customRender:render.renderImage, + <#elseif po.classType=='switch'> + dataIndex: '${po.fieldName}', +<#assign switch_extend_arr=['Y','N']> +<#if po.dictField?default("")?contains("[")> +<#assign switch_extend_arr=po.dictField?eval> + +<#list switch_extend_arr as a> +<#if a_index == 0> +<#assign switch_extend_arr1=a> +<#else> +<#assign switch_extend_arr2=a> + + + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}]) + }, + <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict' || po.classType=='link_table'> + dataIndex: '${po.fieldName}_dictText' + <#elseif po.classType=='cat_tree'> + dataIndex: '${po.fieldName}', + <#if po.dictText?default("")?trim?length == 0> + customRender:({text}) => { + return render.renderCategoryTree(text,'${po.dictField?default("")}') + }, + <#else> + customRender: ({text, record}) => (text ? record['${po.dictText}'] : '') + + <#else> + dataIndex: '${po.fieldName}' + + }, + + +]; +//查询数据 +export const searchFormSchema: FormSchema[] = [ +<#-- 开始循环 --> +<#list columns as po> +<#if po.fieldDbName=='bpm_status'> + <#assign bpm_flag=true> + +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if po.isQuery=='Y' && po.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#assign query_flag=true> + <#assign query_field_dictCode=""> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign query_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}"> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign query_field_dictCode="${po.dictField}"> + +<#if po.queryMode=='single'> + { + label: "${po.filedComment}", + field: ${autoStringSuffix(po)}, +<#if po.classType=='sel_search'> + component: 'JSearchSelect', + componentProps:{ + dict:"${query_field_dictCode}" + }, +<#elseif po.classType=='sel_user'> +<#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + component: 'JSelectUser', +<#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, +<#elseif po.classType=='switch'> + component: 'JSwitch', + componentProps:{ + query:true, + <#if po.dictField != 'is_open'> + options:${po.dictField} + + }, + <#elseif po.classType=='sel_depart'> + component: 'JSelectDept', + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType=='list_multi'> + component: 'JSelectMultiple', + componentProps:{ + <#if po.dictTable?default("")?trim?length gt 1> + dictCode:"${po.dictTable},${po.dictText},${po.dictField}", + <#elseif po.dictField?default("")?trim?length gt 1> + dictCode:"${po.dictField}", + + triggerChange: true + }, + <#elseif po.classType=='cat_tree'> + component: 'JCategorySelect', + componentProps:{ + pcode:"${po.dictField?default("")}",//back和事件未添加,暂时有问题 + }, +<#elseif po.classType=='date'> + component: 'DatePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueFormat: 'YYYY-MM-DD' + }, +<#elseif po.classType=='datetime'> + component: 'DatePicker', + componentProps: { + showTime:true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, +<#elseif po.classType=='pca'> + component: 'JAreaLinkage', + componentProps: { + saveCode: 'region', + }, +<#elseif po.classType=='popup'> + <#include "/common/form/vue3popup.ftl"> +<#elseif po.classType=='popup_dict'> + component: 'JPopupDict', + componentProps: { + placeholder: '请选择${po.filedComment}', + dictCode: '${po.dictTable},${po.dictText},${po.dictField}', + multi: ${po.extendParams.popupMulti?c} + }, +<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'> +<#-- ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- --> + component: 'JSelectMultiple', + componentProps:{ + <#if po.dictTable?default("")?trim?length gt 1> + dictCode:"${po.dictTable},${po.dictText},${po.dictField}" + <#elseif po.dictField?default("")?trim?length gt 1> + dictCode:"${po.dictField}" + + }, +<#elseif po.classType == 'sel_tree'> + component: 'JTreeSelect', + componentProps:{ + <#if po.dictText??> + <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> + dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}", + <#elseif po.dictText?split(',')[1]??> + pidField:"${po.dictText?split(',')[1]}", + <#elseif po.dictText?split(',')[3]??> + hasChildField:"${po.dictText?split(',')[3]}", + + + pidValue:"${po.dictField}", + }, +<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'InputNumber', +<#else> + component: 'Input', + + //colProps: {span: 6}, + }, +<#elseif po.queryMode=='like'> + { + label: "${po.filedComment}", + field: "${po.fieldName}", + component: 'JInput', + }, +<#else> + { + label: "${po.filedComment}", + field: "${po.fieldName}", +<#if po.classType=='date'> + component: 'RangePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueType: 'Date', + }, +<#elseif po.classType=='datetime'> + component: 'RangePicker', + componentProps: { + valueType: 'Date', + showTime:true + }, +<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'JRangeNumber', +<#-- update-begin---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> +<#elseif po.classType=='time'> + component: 'RangeTime', +<#-- update-end---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> +<#else> + component: 'Input', //TODO 范围查询 + + //colProps: {span: 6}, + }, + + + +<#-- 结束循环 --> +]; +//表单数据 +export const formSchema: FormSchema[] = [ +<#assign form_cat_tree = false> +<#assign form_cat_back = ""> +<#assign bpm_flag=false> +<#assign id_exists = false> +<#list columns as po><#rt/> +<#if po.fieldDbName=='bpm_status'> + <#assign bpm_flag=true> + +<#if po.fieldDbName == 'id'> + <#assign id_exists = true> + +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if po.isShow =='Y' && po.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#assign form_field_dictCode=""> + <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}"> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictField}"> + + { + label: '${po.filedComment}', + field: ${autoStringSuffix(po)}, +<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.defaultVal??> + <#if po.fieldDbType=="BigDecimal" || po.fieldDbType=="double" || po.fieldDbType=="int"> + defaultValue: ${po.defaultVal}, + <#else> + defaultValue: "${po.defaultVal}", + + +<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.classType =='date'> + component: 'DatePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueFormat: 'YYYY-MM-DD' + }, + <#elseif po.classType =='datetime'> + component: 'DatePicker', + componentProps: { + showTime:true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, + <#elseif po.classType =='time'> + component: 'TimePicker', + componentProps: { + valueFormat: 'HH:mm:ss' + }, + <#elseif po.classType =='popup'> + <#include "/common/form/vue3popup.ftl"> + <#elseif po.classType=='popup_dict'> + component: 'JPopupDict', + componentProps: { + placeholder: '请选择${po.filedComment}', + dictCode: '${po.dictTable},${po.dictText},${po.dictField}', + multi: ${po.extendParams.popupMulti?c} + }, + <#elseif po.classType =='sel_depart'> + component: 'JSelectDept', + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType =='switch'> + component: 'JSwitch', + componentProps:{ + <#if po.dictField != 'is_open'> + options:${po.dictField} + + }, + <#elseif po.classType =='pca'> + component: 'JAreaLinkage', + componentProps: { + saveCode: 'region', + }, + <#elseif po.classType =='markdown'> + component: 'JMarkdownEditor',//注意string转换问题 + <#elseif po.classType =='password'> + component: 'InputPassword', + <#elseif po.classType =='sel_user'> +<#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + component: 'JSelectUser', +<#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType =='textarea'> + component: 'InputTextArea', + <#elseif po.classType=='list'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#elseif po.classType=='radio'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + type: "radio", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='list_multi'> + component: 'JSelectMultiple', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#elseif po.classType=='checkbox'> + component: 'JCheckbox', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='sel_search'> + component: 'JSearchSelect', + componentProps:{ + dict:"${form_field_dictCode}" + }, +<#elseif po.classType=='cat_tree'> + <#assign form_cat_tree = true> + component: 'JCategorySelect', + componentProps:{ + pcode:"${po.dictField?default("")}", //TODO back和事件未添加,暂时有问题 + }, + <#if po.dictText?default("")?trim?length gt 1> + <#assign form_cat_back = "${po.dictText}"> + + <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'InputNumber', + <#elseif po.classType=='file'> + component: 'JUpload', + componentProps:{ + <#if po.uploadnum??> + maxCount:${po.uploadnum} + + }, + <#elseif po.classType=='image'> + component: 'JImageUpload', + componentProps:{ + <#if po.uploadnum??> + fileMax:${po.uploadnum} + <#else> + fileMax: 0 + + }, + <#elseif po.classType=='umeditor'> + component: 'JEditor', + <#elseif po.classType == 'sel_tree'> + component: 'JTreeSelect', + componentProps:{ + <#if po.dictText??> + <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> + dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}", + <#elseif po.dictText?split(',')[1]??> + pidField:"${po.dictText?split(',')[1]}", + <#elseif po.dictText?split(',')[3]??> + hasChildField:"${po.dictText?split(',')[3]}", + + + pidValue:"${po.dictField}", + }, +<#elseif po.classType=='link_table'> + component: 'JLinkTableCard', + componentProps: { + valueField: '${po.dictField}', + textField: '${po.dictText}', + tableName: '${po.dictTable}', + multi: <#if (po.queryMode!"") == "multi">true<#else>false + }, + <#else> + component: 'Input', + + <#include "/common/utils.ftl"> + <#if po.isShow == 'Y' && poHasCheck(po)> + dynamicRules: ({model,schema}) => { + <#if po.fieldName != 'id'> + <#assign fieldValidType = po.fieldValidType!''> + return [ + <#-- 非空校验 --> + <#if po.nullable == 'N' || fieldValidType == '*'> + { required: true, message: '请输入${po.filedComment}!'}, + <#elseif fieldValidType!=''> + { required: false}, + + <#-- 唯一校验 --> + <#if fieldValidType == 'only'> + {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}', '${po.fieldDbName}',model,schema)[0]}, + <#-- 6到16位数字 --> + <#elseif fieldValidType == 'n6-16'> + { pattern: /^\d{6,16}$|^(?=\d+\.\d+)[\d.]{7,17}$/, message: '请输入6到16位数字!'}, + <#-- 6到16位任意字符 --> + <#elseif fieldValidType == '*6-16'> + { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'}, + <#-- 6到18位字母 --> + <#elseif fieldValidType == 's6-18'> + { pattern:/^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'}, + <#-- 网址 --> + <#elseif fieldValidType == 'url'> + { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'}, + <#-- 电子邮件 --> + <#elseif fieldValidType == 'e'> + { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'}, + <#-- 手机号码 --> + <#elseif fieldValidType == 'm'> + { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'}, + <#-- 邮政编码 --> + <#elseif fieldValidType == 'p'> + { pattern: /^[0-9]\d{5}$/, message: '请输入正确的邮政编码!'}, + <#-- 字母 --> + <#elseif fieldValidType == 's'> + { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'}, + <#-- 数字 --> + <#elseif fieldValidType == 'n'> + { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'}, + <#-- 整数 --> + <#elseif fieldValidType == 'z'> + { pattern: /^-?\d+$/, message: '请输入整数!'}, + <#-- 金额 --> + <#elseif fieldValidType == 'money'> + { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'}, + <#-- 正则校验 --> + <#elseif fieldValidType != '' && fieldValidType != '*'> + { pattern: '${fieldValidType}', message: '不符合校验规则!'}, + <#-- 无校验 --> + <#else> + <#t> + + ]; + + }, + + <#if po.readonly=='Y'> + dynamicDisabled:true + + }, + + +<#if id_exists == false> + // TODO 主键隐藏字段,目前写死为ID + { + label: '', + field: 'id', + component: 'Input', + show: false + }, + +]; +//子表单数据 +<#list subTables as sub> +//子表列表数据 +export const ${sub.entityName?uncap_first}Columns: BasicColumn[] = [ + <#list sub.originalColumns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + { + title: '${po.filedComment}', + align:"center", + <#if po.sort=='Y'> + sorter: true, + + <#if po.classType=='date'> + dataIndex: '${po.fieldName}', + customRender:({text}) =>{ + return !text?"":(text.length>10?text.substr(0,10):text) + }, + <#elseif po.fieldDbType=='Blob'> + dataIndex: '${po.fieldName}String' + <#elseif po.classType=='umeditor'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='pca'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='file'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='image'> + dataIndex: '${po.fieldName}', + customRender:render.renderImage, + <#elseif po.classType=='switch'> + dataIndex: '${po.fieldName}', +<#assign switch_extend_arr=['Y','N']> +<#if po.dictField?default("")?contains("[")> +<#assign switch_extend_arr=po.dictField?eval> + +<#list switch_extend_arr as a> +<#if a_index == 0> +<#assign switch_extend_arr1=a> +<#else> +<#assign switch_extend_arr2=a> + + + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}]) + }, + <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict' || po.classType=='link_table'> + dataIndex: '${po.fieldName}_dictText' + <#elseif po.classType=='cat_tree'> + dataIndex: '${po.fieldName}', + <#if po.dictText?default("")?trim?length == 0> + customRender:({text}) => { + return render.renderCategoryTree(text,'${po.dictField?default("")}') + }, + <#else> + customRender: ({text, record}) => (text ? record['${po.dictText}'] : '') + + <#else> + dataIndex: '${po.fieldName}' + + }, + + +]; +<#if sub.foreignRelationType =='1'> +export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [ +<#assign form_cat_tree = false> +<#assign form_cat_back = ""> +<#assign bpm_flag=false> +<#assign sub_id_exists=false> +<#list sub.colums as po><#rt/> +<#if po.fieldDbName=='bpm_status'> + <#assign bpm_flag=true> + +<#if po.fieldDbName=='id'> + <#assign sub_id_exists=true> + +<#if po.isShow =='Y'> +<#assign form_field_dictCode=""> + <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}"> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictField}"> + + { + label: '${po.filedComment}', + field: ${autoStringSuffix(po)}, +<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.defaultVal??> + <#if po.fieldDbType=="BigDecimal" || po.fieldDbType=="double" || po.fieldDbType=="int"> + defaultValue: ${po.defaultVal}, + <#else> + defaultValue: "${po.defaultVal}", + + +<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.classType =='date'> + component: 'DatePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueFormat: 'YYYY-MM-DD' + }, + <#elseif po.classType =='datetime'> + component: 'DatePicker', + componentProps: { + showTime:true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, + <#elseif po.classType =='time'> + component: 'TimePicker', + componentProps: { + valueFormat: 'HH:mm:ss' + }, + <#elseif po.classType =='popup'> + <#include "/common/form/vue3popup.ftl"> + <#elseif po.classType=='popup_dict'> + component: 'JPopupDict', + componentProps: { + placeholder: '请选择${po.filedComment}', + dictCode: '${po.dictTable},${po.dictText},${po.dictField}', + multi: ${po.extendParams.popupMulti?c} + }, + <#elseif po.classType =='sel_depart'> + component: 'JSelectDept', + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType =='switch'> + component: 'JSwitch', + componentProps:{ + <#if po.dictField != 'is_open'> + options:${po.dictField} + + }, + <#elseif po.classType =='pca'> + component: 'JAreaLinkage', + componentProps: { + saveCode: 'region', + }, + <#elseif po.classType =='markdown'> + component: 'JMarkdownEditor',//注意string转换问题 + <#elseif po.classType =='password'> + component: 'InputPassword', + <#elseif po.classType =='sel_user'> +<#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + component: 'JSelectUser', +<#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType =='textarea'> + component: 'InputTextArea', + <#elseif po.classType=='list'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#elseif po.classType=='radio'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + type: "radio", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='list_multi'> + component: 'JSelectMultiple', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#elseif po.classType=='checkbox'> + component: 'JCheckbox', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='sel_search'> + component: 'JSearchSelect', + componentProps:{ + dict:"${form_field_dictCode}" + }, +<#elseif po.classType=='cat_tree'> + <#assign form_cat_tree = true> + component: 'JCategorySelect', + componentProps:{ + pcode:"${po.dictField?default("")}", //TODO back和事件未添加,暂时有问题 + }, + <#if po.dictText?default("")?trim?length gt 1> + <#assign form_cat_back = "${po.dictText}"> + + <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'InputNumber', + <#elseif po.classType=='file'> + component: 'JUpload', + componentProps:{ + <#if po.uploadnum??> + maxCount:${po.uploadnum} + + }, + <#elseif po.classType=='image'> + component: 'JImageUpload', + componentProps:{ + <#if po.uploadnum??> + fileMax:${po.uploadnum} + <#else> + fileMax: 0 + + }, + <#elseif po.classType=='umeditor'> + component: 'JEditor', + <#elseif po.classType == 'sel_tree'> + component: 'JTreeSelect', + componentProps:{ + <#if po.dictText??> + <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> + dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}", + <#elseif po.dictText?split(',')[1]??> + pidField:"${po.dictText?split(',')[1]}", + <#elseif po.dictText?split(',')[3]??> + hasChildField:"${po.dictText?split(',')[3]}", + + + pidValue:"${po.dictField}", + }, +<#elseif po.classType=='link_table'> + component: 'JLinkTableCard', + componentProps: { + valueField: '${po.dictField}', + textField: '${po.dictText}', + tableName: '${po.dictTable}', + multi: <#if (po.queryMode!"") == "multi">true<#else>false + }, + <#else> + component: 'Input', + + <#include "/common/utils.ftl"> + <#if po.isShow == 'Y' && poHasCheck(po)> + dynamicRules: ({model,schema}) => { + <#if po.fieldName != 'id'> + <#assign fieldValidType = po.fieldValidType!''> + return [ + <#-- 非空校验 --> + <#if po.nullable == 'N' || fieldValidType == '*'> + { required: true, message: '请输入${po.filedComment}!'}, + <#elseif fieldValidType!=''> + { required: false}, + + <#-- 唯一校验 --> + <#if fieldValidType == 'only'> + {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}', '${po.fieldDbName}',model,schema)[0]}, + <#-- 6到16位数字 --> + <#elseif fieldValidType == 'n6-16'> + { pattern: /^\d{6,16}$|^(?=\d+\.\d+)[\d.]{7,17}$/, message: '请输入6到16位数字!'}, + <#-- 6到16位任意字符 --> + <#elseif fieldValidType == '*6-16'> + { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'}, + <#-- 6到18位字母 --> + <#elseif fieldValidType == 's6-18'> + { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'}, + <#-- 网址 --> + <#elseif fieldValidType == 'url'> + { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'}, + <#-- 电子邮件 --> + <#elseif fieldValidType == 'e'> + { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'}, + <#-- 手机号码 --> + <#elseif fieldValidType == 'm'> + { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'}, + <#-- 邮政编码 --> + <#elseif fieldValidType == 'p'> + { pattern: /^[0-9]\d{5}$/, message: '请输入正确的邮政编码!'}, + <#-- 字母 --> + <#elseif fieldValidType == 's'> + { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'}, + <#-- 数字 --> + <#elseif fieldValidType == 'n'> + { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'}, + <#-- 整数 --> + <#elseif fieldValidType == 'z'> + { pattern: /^-?\d+$/, message: '请输入整数!'}, + <#-- 金额 --> + <#elseif fieldValidType == 'money'> + { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'}, + <#-- 正则校验 --> + <#elseif fieldValidType != '' && fieldValidType != '*'> + { pattern: '${fieldValidType}', message: '不符合校验规则!'}, + <#-- 无校验 --> + <#else> + <#t> + + ]; + + }, + + <#if po.readonly=='Y'> + dynamicDisabled:true + + }, + + +<#if sub_id_exists == false> + { + label: '', + field: 'id', + component: 'Input', + show: false + }, + +]; + + +//子表表格配置 +<#list subTables as sub> +<#if sub.foreignRelationType =='0'> +export const ${sub.entityName?uncap_first}JVxeColumns: JVxeColumn[] = [ +<#assign popupBackFields = ""> + +<#-- 循环子表的列 开始 --> +<#list sub.colums as col><#rt/> +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if col.isShow =='Y' && col.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if col.filedComment !='外键' > + { + title: '${col.filedComment}', + key: '${autoStringSuffixForModel(col)}', +<#if col.classType =='date'> + type: JVxeTypes.date, + <#if col.extendParams?exists && col.extendParams.picker?exists> + picker: '${col.extendParams.picker}', + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='datetime'> + type: JVxeTypes.datetime, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='time'> + type: JVxeTypes.time, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='textarea'> + type: JVxeTypes.textarea, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='list' || col.classType =='radio'> + type: JVxeTypes.select, + options:[], + <#if col.dictTable?default("")?trim?length gt 1> + dictCode:"${col.dictTable},${col.dictText},${col.dictField}", + <#else> + dictCode:"${col.dictField}", + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='list_multi' || col.classType =='checkbox'> + type: JVxeTypes.selectMultiple, + options:[], + <#if col.dictTable?default("")?trim?length gt 1> + dictCode:"${col.dictTable},${col.dictText},${col.dictField}", + <#else> + dictCode:"${col.dictField}", + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='sel_search'> + type: JVxeTypes.selectSearch, + <#if col.dictTable?default("")?trim?length gt 1> + dictCode:"${col.dictTable},${col.dictText},${col.dictField}", + <#else> + dictCode:"${col.dictField}", + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='sel_depart'> + type: JVxeTypes.departSelect, + props:{ + <#if col.extendParams?exists && col.extendParams.text?exists> + labelKey: '${col.extendParams.text}', + + <#if col.extendParams?exists && col.extendParams.store?exists> + rowKey: '${col.extendParams.store}', + + }, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='sel_user'> + type: JVxeTypes.userSelect, + props:{ + <#if col.extendParams?exists && col.extendParams.text?exists> + labelKey: '${col.extendParams.text}', + + <#if col.extendParams?exists && col.extendParams.store?exists> + rowKey: '${col.extendParams.store}', + + }, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='image'> + type: JVxeTypes.image, + token:true, + responseName:"message", + <#if col.readonly=='Y'> + disabled:true, + + <#if col.uploadnum??> + number: ${col.uploadnum}, + +<#elseif col.classType =='file'> + type: JVxeTypes.file, + token:true, + responseName:"message", + <#if col.readonly=='Y'> + disabled:true, + + <#if col.uploadnum??> + number: ${col.uploadnum}, + +<#elseif col.classType =='switch'> + type: JVxeTypes.checkbox, + <#if col.dictField == 'is_open'> + customValue: ['Y', 'N'], + <#else> + customValue: ${col.dictField}, + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType=='pca'> + type: JVxeTypes.pca, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='popup'> +<#if popupBackFields?length gt 0> + <#assign popupBackFields = "${popupBackFields}"+","+"${col.dictText}"> +<#else> + <#assign popupBackFields = "${col.dictText}"> + + <#include "/common/form/vue3Jvxepopup.ftl"> +<#-- update-begin-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对,数字或者金额类型 --> +<#-- elseif "int,decimal,double,"?contains(col.classType) --> +<#elseif col.fieldDbType=='int' || col.fieldDbType=='long' || col.fieldDbType=='double' || col.fieldDbType=='BigDecimal'> +<#-- update-end-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对,数字或者金额类型 --> + type: JVxeTypes.inputNumber, + <#if col.readonly=='Y'> + disabled:true, + +<#else> + type: JVxeTypes.input, + <#if col.readonly=='Y'> + disabled:true, + + +<#if col.classType =='list_multi' || col.classType =='checkbox'> + width:"250px", +<#else> + width:"200px", + +<#if col.classType =='file'> + placeholder: '请选择文件', +<#else> + placeholder: '请输入${'$'}{title}', + +<#if col.defaultVal??> +<#if col.fieldDbType=="BigDecimal" || col.fieldDbType=="double" || col.fieldDbType=="int"> + defaultValue:${col.defaultVal}, + <#else> + defaultValue:"${col.defaultVal}", + +<#else> + defaultValue:'', + +<#-- 子表的校验 --> + <#include "/common/validatorRulesTemplate/sub-vue3.ftl"> + }, + + + +<#-- 循环子表的列 结束 --> + ] + + + +<#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> +// 高级查询数据 +export const superQuerySchema = { + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + ${superQueryFieldListForVue3(po,po_index)}, + + + //子表高级查询 + <#list subTables as sub> + ${sub.entityName?uncap_first}: { + title: '${sub.ftlDescription}', + view: 'table', + fields: { + <#list sub.colums as subCol> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if subCol.isShowList =='Y' && subCol.fieldName !='id' && subCol.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + ${superQueryFieldListForVue3(subCol,subCol_index)}, + + + } + }, + +}; +<#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> + +/** +* 流程表单调用这个方法获取formSchema +* @param param +*/ +export function getBpmFormSchema(_formData): FormSchema[]{ + // 默认和原始表单保持一致 如果流程中配置了权限数据,这里需要单独处理formSchema + return formSchema; +} \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql new file mode 100644 index 00000000..5396d5d5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql @@ -0,0 +1 @@ +<#include "/common/sql/menu_insert.ftl"> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei new file mode 100644 index 00000000..b5e8c33c --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei @@ -0,0 +1,212 @@ +<#include "/common/utils.ftl"> + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei new file mode 100644 index 00000000..d25bb5a5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei @@ -0,0 +1,278 @@ +<#include "/common/utils.ftl"> + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei new file mode 100644 index 00000000..a2c7a582 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei @@ -0,0 +1,89 @@ +<#include "/common/utils.ftl"> +<#list subTables as sub> +<#if sub.foreignRelationType=='1'> +#segment#${sub.entityName}Form.vue + + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/subTables/[1-n]SubTable.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/subTables/[1-n]SubTable.vuei new file mode 100644 index 00000000..dc2ed4ae --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/subTables/[1-n]SubTable.vuei @@ -0,0 +1,80 @@ +<#--noinspection JSDuplicatedDeclaration--> +<#list subTables as sub> +#segment#${sub.entityName}SubTable.vue + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai new file mode 100644 index 00000000..c4665557 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -0,0 +1,377 @@ +package ${bussiPackage}.${entityPackage}.controller; + +import java.io.UnsupportedEncodingException; +import java.io.IOException; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.HashMap; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.vo.LoginUser; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.util.oConvertUtils; +import org.jeecgframework.poi.excel.entity.enmus.ExcelType; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import ${bussiPackage}.${entityPackage}.vo.${entityName}Page; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.service.I${sub.entityName}Service; + +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + +<#assign bpm_flag=false> +<#assign has_multi_query_field=false> +<#list originalColumns as po> +<#if po.fieldDbName=='bpm_status'> + <#assign bpm_flag=true> + + + +<#assign has_multi_query_field=false> +<#list originalColumns as po> +<#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')> + <#assign has_multi_query_field=true> + + +<#assign enhanceJavaList=[]> +<#if tableVo.extendParams?? && tableVo.extendParams.enhanceJavaList??> + <#assign enhanceJavaList = tableVo.extendParams.enhanceJavaList?filter(enhance -> enhance??)> + + /** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Tag(name="${tableVo.ftlDescription}") +@RestController +@RequestMapping("/${entityPackagePath}/${entityName?uncap_first}") +@Slf4j +public class ${entityName}Controller { + @Autowired + private I${entityName}Service ${entityName?uncap_first}Service; + <#list subTables as sub> + @Autowired + private I${sub.entityName}Service ${sub.entityName?uncap_first}Service; + + + /** + * 分页列表查询 + * + * @param ${entityName?uncap_first} + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "${tableVo.ftlDescription}-分页列表查询") + @Operation(summary="${tableVo.ftlDescription}-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(${entityName} ${entityName?uncap_first}, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 查询前触发的方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeQuery() + + + + <#if has_multi_query_field> + // 自定义查询规则 + Map customeRuleMap = new HashMap<>(); + // 自定义多选的查询规则为:LIKE_WITH_OR + <#list originalColumns as po> + <#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')> + customeRuleMap.put("${po.fieldName}", QueryRuleEnum.LIKE_WITH_OR); + + + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap(),customeRuleMap); + <#else> + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap()); + + Page<${entityName}> page = new Page<${entityName}>(pageNo, pageSize); + IPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper); + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'> + //TODO 查询后触发的方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.afterQuery() + + + + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param ${entityName?uncap_first}Page + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-添加") + @Operation(summary="${tableVo.ftlDescription}-添加") + @RequiresPermissions("${entityPackage}:${tableName}:add") + @PostMapping(value = "/add") + public Result add(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 新增前的处理方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeAdd() + + + + ${entityName} ${entityName?uncap_first} = new ${entityName}(); + BeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first}); + <#if bpm_flag> + ${entityName?uncap_first}.setBpmStatus("1"); + + ${entityName?uncap_first}Service.saveMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,); + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'> + //TODO 新增后的处理方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.afterAdd() + + + + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param ${entityName?uncap_first}Page + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-编辑") + @Operation(summary="${tableVo.ftlDescription}-编辑") + @RequiresPermissions("${entityPackage}:${tableName}:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 编辑前,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeEdit() + + + + ${entityName} ${entityName?uncap_first} = new ${entityName}(); + BeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first}); + ${entityName} ${entityName?uncap_first}Entity = ${entityName?uncap_first}Service.getById(${entityName?uncap_first}.getId()); + if(${entityName?uncap_first}Entity==null) { + return Result.error("未找到对应数据"); + } + ${entityName?uncap_first}Service.updateMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,); + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'> + //TODO 编辑后,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.afterEdit() + + + + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-通过id删除") + @Operation(summary="${tableVo.ftlDescription}-通过id删除") + @RequiresPermissions("${entityPackage}:${tableName}:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + ${entityName?uncap_first}Service.delMain(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-批量删除") + @Operation(summary="${tableVo.ftlDescription}-批量删除") + @RequiresPermissions("${entityPackage}:${tableName}:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "${tableVo.ftlDescription}-通过id查询") + @Operation(summary="${tableVo.ftlDescription}-通过id查询") + @GetMapping(value = "/queryById") + public Result<${entityName}> queryById(@RequestParam(name="id",required=true) String id) { + ${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id); + if(${entityName?uncap_first}==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(${entityName?uncap_first}); + + } + + <#list subTables as sub> + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "${sub.ftlDescription}通过主表ID查询") + @Operation(summary="${sub.ftlDescription}主表ID查询") + @GetMapping(value = "/query${sub.entityName}ByMainId") + public Result> query${sub.entityName}ListByMainId(@RequestParam(name="id",required=true) String id) { + List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(id); + return Result.OK(${sub.entityName?uncap_first}List); + } + + + /** + * 导出excel + * + * @param request + * @param ${entityName?uncap_first} + */ + @RequiresPermissions("${entityPackage}:${tableName}:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='export' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 导出前,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeExport() + + + + + // Step.1 组装查询条件查询数据 + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap()); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + + //配置选中数据查询条件 + String selections = request.getParameter("selections"); + if(oConvertUtils.isNotEmpty(selections)) { + List selectionList = Arrays.asList(selections.split(",")); + queryWrapper.in("id",selectionList); + } + //Step.2 获取导出数据 + List<${entityName}> ${entityName?uncap_first}List = ${entityName?uncap_first}Service.list(queryWrapper); + + // Step.3 组装pageList + List<${entityName}Page> pageList = new ArrayList<${entityName}Page>(); + for (${entityName} main : ${entityName?uncap_first}List) { + ${entityName}Page vo = new ${entityName}Page(); + BeanUtils.copyProperties(main, vo); + <#list subTables as sub> + List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(main.getId()); + vo.set${sub.entityName}List(${sub.entityName?uncap_first}List); + + pageList.add(vo); + } + + // Step.4 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + mv.addObject(NormalExcelConstants.FILE_NAME, "${tableVo.ftlDescription}列表"); + mv.addObject(NormalExcelConstants.CLASS, ${entityName}Page.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("${tableVo.ftlDescription}数据", "导出人:"+sysUser.getRealname(), "${tableVo.ftlDescription}", ExcelType.XSSF)); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("${entityPackage}:${tableName}:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='import' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 导入前,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeImport() + + + + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + // 获取上传文件对象 + MultipartFile file = entity.getValue(); + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<${entityName}Page> list = ExcelImportUtil.importExcel(file.getInputStream(), ${entityName}Page.class, params); + for (${entityName}Page page : list) { + ${entityName} po = new ${entityName}(); + BeanUtils.copyProperties(page, po); + ${entityName?uncap_first}Service.saveMain(po, <#list subTables as sub>page.get${sub.entityName}List()<#if sub_has_next>,); + } + return Result.OK("文件导入成功!数据行数:" + list.size()); + } catch (Exception e) { + log.error(e.getMessage(),e); + return Result.error("文件导入失败:"+e.getMessage()); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.OK("文件导入失败!"); + } + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai new file mode 100644 index 00000000..385ea9df --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai @@ -0,0 +1,82 @@ +<#include "/common/utils.ftl"> +package ${bussiPackage}.${entityPackage}.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Schema(description="${tableVo.ftlDescription}") +@Data +@TableName("${tableName}") +public class ${entityName} implements Serializable { + private static final long serialVersionUID = 1L; + +<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']> +<#assign excel_ignore_classType_arr=['pca','switch','cat_tree']> + <#list originalColumns as po> + <#-- 生成字典Code --> + <#assign list_field_dictCode=""> + <#if po.classType='sel_user'> + <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'> + <#elseif po.classType='sel_depart'> + <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'> + <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dicCode = "${po.dictField}"'> + + <#elseif po.classType=='sel_tree'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText?split(",")[2]}", dicCode = "${po.dictText?split(",")[0]}"'> + <#elseif po.classType=='link_table'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicCode = "${po.dictField}", dicText = "${po.dictText?split(",")[0]}"'> + + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + @TableId(type = IdType.ASSIGN_ID) + <#else> + <#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'> + <#if po.classType=='date'> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}") && !excel_ignore_classType_arr?seq_contains("${po.classType}")> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + + + <#if list_field_dictCode?length gt 1> + @Dict(${list_field_dictCode?substring(2)}) + + + <#include "/common/blob.ftl"> + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai new file mode 100644 index 00000000..f9ab598c --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai @@ -0,0 +1,81 @@ +<#include "/common/utils.ftl"> +<#list subTables as subTab> +#segment#${subTab.entityName}.java +package ${bussiPackage}.${entityPackage}.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import java.util.Date; +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.UnsupportedEncodingException; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Schema(description="${subTab.ftlDescription}") +@Data +@TableName("${subTab.tableName}") +public class ${subTab.entityName} implements Serializable { + private static final long serialVersionUID = 1L; + +<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']> + <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']> + <#list subTab.originalColumns as po> + <#-- 生成字典Code --> + <#assign list_field_dictCode=""> + <#if po.classType='sel_user'> + <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'> + <#elseif po.classType='sel_depart'> + <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'> + <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dicCode = "${po.dictField}"'> + <#elseif po.classType=='sel_tree'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText?split(",")[2]}", dicCode = "${po.dictText?split(",")[0]}"'> + + <#elseif po.classType=='link_table'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicCode = "${po.dictField}", dicText = "${po.dictText?split(",")[0]}"'> + + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + @TableId(type = IdType.ASSIGN_ID) + <#else> + <#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'> + <#if po.classType=='date'> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + + <#elseif !subTab.foreignKeys?seq_contains(po.fieldName?cap_first)> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}") && !excel_ignore_classType_arr?seq_contains("${po.classType}")> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + + + + <#-- 大字段转换 --> + <#include "/common/blob.ftl"> + +} + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai new file mode 100644 index 00000000..c31b9bfd --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai @@ -0,0 +1,17 @@ +package ${bussiPackage}.${entityPackage}.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface ${entityName}Mapper extends BaseMapper<${entityName}> { + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai new file mode 100644 index 00000000..10b27644 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai @@ -0,0 +1,34 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}Mapper.java +package ${bussiPackage}.${entityPackage}.mapper; + +import java.util.List; +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface ${subTab.entityName}Mapper extends BaseMapper<${subTab.entityName}> { + + /** + * 通过主表id删除子表数据 + * + * @param mainId 主表id + * @return boolean + */ + public boolean deleteByMainId(@Param("mainId") String mainId); + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List<${subTab.entityName}> + */ + public List<${subTab.entityName}> selectByMainId(@Param("mainId") String mainId); +} + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml new file mode 100644 index 00000000..16f3d653 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml new file mode 100644 index 00000000..117c9b6f --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml @@ -0,0 +1,26 @@ +<#list subTables as subTab> +<#assign originalForeignKeys = subTab.originalForeignKeys> +#segment#${subTab.entityName}Mapper.xml + + + + + + DELETE + FROM ${subTab.tableName} + WHERE + <#list originalForeignKeys as key> + ${key} = ${r'#'}{mainId} <#rt/> + + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai new file mode 100644 index 00000000..43ef9dc4 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai @@ -0,0 +1,54 @@ +package ${bussiPackage}.${entityPackage}.service; + +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import com.baomidou.mybatisplus.extension.service.IService; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface I${entityName}Service extends IService<${entityName}> { + + /** + * 添加一对多 + * + * @param ${entityName?uncap_first} + <#list subTables as sub> + * @param ${sub.entityName?uncap_first}List + + */ + public void saveMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,) ; + + /** + * 修改一对多 + * + * @param ${entityName?uncap_first} + <#list subTables as sub> + * @param ${sub.entityName?uncap_first}List + + */ + public void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,); + + /** + * 删除一对多 + * + * @param id + */ + public void delMain (String id); + + /** + * 批量删除一对多 + * + * @param idList + */ + public void delBatchMain (Collection idList); + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai new file mode 100644 index 00000000..cbc72ff4 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai @@ -0,0 +1,25 @@ +<#list subTables as subTab> +#segment#I${subTab.entityName}Service.java +package ${bussiPackage}.${entityPackage}.service; + +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface I${subTab.entityName}Service extends IService<${subTab.entityName}> { + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List<${subTab.entityName}> + */ + public List<${subTab.entityName}> selectByMainId(String mainId); +} + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai new file mode 100644 index 00000000..7f99d42e --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai @@ -0,0 +1,105 @@ +package ${bussiPackage}.${entityPackage}.service.impl; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.mapper.${sub.entityName}Mapper; + +import ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import java.io.Serializable; +import java.util.List; +import java.util.Collection; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Service +public class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service { + + @Autowired + private ${entityName}Mapper ${entityName?uncap_first}Mapper; + <#list subTables as sub> + @Autowired + private ${sub.entityName}Mapper ${sub.entityName?uncap_first}Mapper; + + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveMain(${entityName} ${entityName?uncap_first}, <#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,) { + ${entityName?uncap_first}Mapper.insert(${entityName?uncap_first}); + <#list subTables as sub> + if(${sub.entityName?uncap_first}List!=null && ${sub.entityName?uncap_first}List.size()>0) { + for(${sub.entityName} entity:${sub.entityName?uncap_first}List) { + <#list sub.foreignKeys as key> + //外键设置 + <#if key?lower_case?index_of("${primaryKeyField}")!=-1> + entity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}()); + <#else> + entity.set${key?cap_first}(${entityName?uncap_first}.get${key}()); + + + ${sub.entityName?uncap_first}Mapper.insert(entity); + } + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,) { + ${entityName?uncap_first}Mapper.updateById(${entityName?uncap_first}); + + //1.先删除子表数据 + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(${entityName?uncap_first}.getId()); + + + //2.子表数据重新插入 + <#list subTables as sub> + if(${sub.entityName?uncap_first}List!=null && ${sub.entityName?uncap_first}List.size()>0) { + for(${sub.entityName} entity:${sub.entityName?uncap_first}List) { + <#list sub.foreignKeys as key> + //外键设置 + <#if key?lower_case?index_of("${primaryKeyField}")!=-1> + entity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}()); + <#else> + entity.set${key?cap_first}(${entityName?uncap_first}.get${key}()); + + + ${sub.entityName?uncap_first}Mapper.insert(entity); + } + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delMain(String id) { + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(id); + + ${entityName?uncap_first}Mapper.deleteById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delBatchMain(Collection idList) { + for(Serializable id:idList) { + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(id.toString()); + + ${entityName?uncap_first}Mapper.deleteById(id); + } + } + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai new file mode 100644 index 00000000..0ce41d36 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai @@ -0,0 +1,30 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}ServiceImpl.java +package ${bussiPackage}.${entityPackage}.service.impl; + +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import ${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper; +import ${bussiPackage}.${entityPackage}.service.I${subTab.entityName}Service; +import org.springframework.stereotype.Service; +import java.util.List; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Service +public class ${subTab.entityName}ServiceImpl extends ServiceImpl<${subTab.entityName}Mapper, ${subTab.entityName}> implements I${subTab.entityName}Service { + + @Autowired + private ${subTab.entityName}Mapper ${subTab.entityName?uncap_first}Mapper; + + @Override + public List<${subTab.entityName}> selectByMainId(String mainId) { + return ${subTab.entityName?uncap_first}Mapper.selectByMainId(mainId); + } +} + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai new file mode 100644 index 00000000..c34e18bd --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai @@ -0,0 +1,117 @@ +package ${bussiPackage}.${entityPackage}.vo; + +import java.util.List; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecgframework.poi.excel.annotation.ExcelEntity; +import org.jeecgframework.poi.excel.annotation.ExcelCollection; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import java.util.Date; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Data +@Schema(description="${tableVo.ftlDescription}") +public class ${entityName}Page { + + <#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']> + <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']> + <#list originalColumns as po> + <#-- 生成字典Code --> + <#assign list_field_dictCode=""> + <#if po.classType='sel_user'> + <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "realname", dicCode = "username"'> + <#elseif po.classType='sel_depart'> + <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "depart_name", dicCode = "id"'> + <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dicCode = "${po.dictField}"'> + + <#elseif po.classType=='cat_tree'> + <#assign list_field_dictCode=', dictTable = "sys_category", dicText = "name", dicCode = "id"'> + + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + <#else> + <#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'> + <#if po.classType=='date'> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}") && !excel_ignore_classType_arr?seq_contains("${po.classType}")> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + + + <#if list_field_dictCode?length gt 1 && !excel_ignore_classType_arr?seq_contains("${po.classType}")> + @Dict(${list_field_dictCode?substring(2)}) + + + @Schema(description = "${po.filedComment}") + <#if po.fieldDbType=='Blob'> + private java.lang.String ${po.fieldName}String; + <#elseif po.classType=='pca'> + @Excel(name = "${po.filedComment}", width = 15,exportConvert=true,importConvert = true ) + private ${po.fieldType} ${po.fieldName}; + + public String convertis${po.fieldName?cap_first}() { + return SpringContextUtils.getBean(ProvinceCityArea.class).getText(${po.fieldName}); + } + + public void convertset${po.fieldName?cap_first}(String text) { + this.${po.fieldName} = SpringContextUtils.getBean(ProvinceCityArea.class).getCode(text); + } + <#elseif po.classType=='cat_tree'> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + private ${po.fieldType} ${po.fieldName}; + <#elseif po.classType=='switch'> + <#assign switch_extend_arr=['Y','N']> + <#if po.dictField?default("")?contains("[")> + <#assign switch_extend_arr=po.dictField?eval> + + <#list switch_extend_arr as a> + <#if a_index == 0> + <#assign switch_extend_arr1=a> + <#else> + <#assign switch_extend_arr2=a> + + + @Excel(name = "${po.filedComment}", width = 15,replace = {"是_${switch_extend_arr1}","否_${switch_extend_arr2}"} ) + private ${po.fieldType} ${po.fieldName}; + <#else> + private ${po.fieldType} ${po.fieldName}; + + + + <#list subTables as sub> + @ExcelCollection(name="${sub.ftlDescription}") + @Schema(description = "${sub.ftlDescription}") + private List<${sub.entityName}> ${sub.entityName?uncap_first}List; + + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei new file mode 100644 index 00000000..1df3deea --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei @@ -0,0 +1,397 @@ + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql new file mode 100644 index 00000000..5396d5d5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql @@ -0,0 +1 @@ +<#include "/common/sql/menu_insert.ftl"> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei new file mode 100644 index 00000000..e54b9a89 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei @@ -0,0 +1,568 @@ +<#include "/common/utils.ftl"> + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei new file mode 100644 index 00000000..8021bb83 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei @@ -0,0 +1,65 @@ +<#include "/common/utils.ftl"> + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei new file mode 100644 index 00000000..50472872 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei @@ -0,0 +1,196 @@ +<#include "/common/utils.ftl"> +<#list subTables as sub> +<#if sub.foreignRelationType=='1'> +#segment#${sub.entityName}Form.vue + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei new file mode 100644 index 00000000..862b931f --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei @@ -0,0 +1,445 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi new file mode 100644 index 00000000..a3c1bb7c --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi @@ -0,0 +1,75 @@ +import {defHttp} from '/@/utils/http/axios'; +import { useMessage } from "/@/hooks/web/useMessage"; + +const { createConfirm } = useMessage(); + +enum Api { + list = '/${entityPackagePath}/${entityName?uncap_first}/list', + save='/${entityPackagePath}/${entityName?uncap_first}/add', + edit='/${entityPackagePath}/${entityName?uncap_first}/edit', + deleteOne = '/${entityPackagePath}/${entityName?uncap_first}/delete', + deleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch', + importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel', + exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls', +<#list subTables as sub><#rt/> + ${sub.entityName?uncap_first}List = '/${entityPackagePath}/${entityName?uncap_first}/query${sub.entityName}ByMainId', + +} +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; + +/** + * 导入api + */ +export const getImportUrl = Api.importExcel; +<#list subTables as sub><#rt/> +/** + * 查询子表数据 + * @param params + */ +export const ${sub.entityName?uncap_first}List = Api.${sub.entityName?uncap_first}List; + +/** + * 列表接口 + * @param params + */ +export const list = (params) => + defHttp.get({url: Api.list, params}); + +/** + * 删除单个 + */ +export const deleteOne = (params,handleSuccess) => { + return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); +} +/** + * 批量删除 + * @param params + */ +export const batchDelete = (params, handleSuccess) => { + createConfirm({ + iconType: 'warning', + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); + } + }); +} +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdate = (params, isUpdate,showTip = true) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({url: url, params},{ successMessageMode :showTip?'success':'none'}); +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi new file mode 100644 index 00000000..b3245add --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi @@ -0,0 +1,988 @@ +<#include "/common/utils.ftl"> +import {BasicColumn} from '/@/components/Table'; +import {FormSchema} from '/@/components/Table'; +import { rules} from '/@/utils/helper/validator'; +import { render } from '/@/utils/common/renderUtils'; +import {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types' +import { getWeekMonthQuarterYear } from '/@/utils'; +//列表数据 +export const columns: BasicColumn[] = [ + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + { + title: '${po.filedComment}', + align:"center", + <#if po.sort=='Y'> + sorter: true, + + <#if po.classType=='date'> + dataIndex: '${po.fieldName}', + customRender:({text}) =>{ + text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text); + <#if po.extendParams?exists && po.extendParams.picker?exists> + if(text) { + return getWeekMonthQuarterYear(text)['${po.extendParams.picker}']; + } else { + return text; + } + <#else> + return text; + + }, + <#elseif po.fieldDbType=='Blob'> + dataIndex: '${po.fieldName}String' + <#elseif po.classType=='umeditor'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='pca'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='file'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='image'> + dataIndex: '${po.fieldName}', + customRender:render.renderImage, + <#elseif po.classType=='switch'> + dataIndex: '${po.fieldName}', +<#assign switch_extend_arr=['Y','N']> +<#if po.dictField?default("")?contains("[")> +<#assign switch_extend_arr=po.dictField?eval> + +<#list switch_extend_arr as a> +<#if a_index == 0> +<#assign switch_extend_arr1=a> +<#else> +<#assign switch_extend_arr2=a> + + + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}]) + }, + <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict'> + dataIndex: '${po.fieldName}_dictText' + <#elseif po.classType=='cat_tree'> + dataIndex: '${po.fieldName}', + <#if po.dictText?default("")?trim?length == 0> + customRender:({text}) => { + return render.renderCategoryTree(text,'${po.dictField?default("")}') + }, + <#else> + customRender: ({text, record}) => (text ? record['${po.dictText}'] : '') + + <#else> + dataIndex: '${po.fieldName}' + + }, + + +]; +//查询数据 +export const searchFormSchema: FormSchema[] = [ +<#-- 开始循环 --> +<#list columns as po> +<#if po.fieldDbName=='bpm_status'> + <#assign bpm_flag=true> + +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if po.isQuery=='Y' && po.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#assign query_flag=true> + <#assign query_field_dictCode=""> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign query_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}"> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign query_field_dictCode="${po.dictField}"> + +<#if po.queryMode=='single'> + { + label: "${po.filedComment}", + field: "${po.fieldName}", +<#if po.classType=='sel_search'> + component: 'JSearchSelect', + componentProps:{ + dict:"${query_field_dictCode}" + }, +<#elseif po.classType=='sel_user'> +<#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + component: 'JSelectUser', +<#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, +<#elseif po.classType=='switch'> + component: 'JSwitch', + componentProps:{ + query:true, + <#if po.dictField != 'is_open'> + options:${po.dictField} + + }, + <#elseif po.classType=='sel_depart'> + component: 'JSelectDept', + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType=='list_multi'> + component: 'JSelectMultiple', + componentProps:{ + <#if po.dictTable?default("")?trim?length gt 1> + dictCode:"${po.dictTable},${po.dictText},${po.dictField}", + <#elseif po.dictField?default("")?trim?length gt 1> + dictCode:"${po.dictField}", + + triggerChange: true + }, + <#elseif po.classType=='cat_tree'> + component: 'JCategorySelect', + componentProps:{ + pcode:"${po.dictField?default("")}",//back和事件未添加,暂时有问题 + }, +<#elseif po.classType=='date'> + component: 'DatePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueFormat: 'YYYY-MM-DD' + }, +<#elseif po.classType=='datetime'> + component: 'DatePicker', + componentProps: { + showTime:true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, +<#elseif po.classType=='pca'> + component: 'JAreaLinkage', + componentProps: { + saveCode: 'region', + }, +<#elseif po.classType=='popup'> + <#include "/common/form/vue3popup.ftl"> +<#elseif po.classType=='popup_dict'> + component: 'JPopupDict', + componentProps: { + placeholder: '请选择${po.filedComment}', + dictCode: '${po.dictTable},${po.dictText},${po.dictField}', + multi: ${po.extendParams.popupMulti?c} + }, +<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'> +<#-- ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- --> + component: 'JSelectMultiple', + componentProps:{ + <#if po.dictTable?default("")?trim?length gt 1> + dictCode:"${po.dictTable},${po.dictText},${po.dictField}" + <#elseif po.dictField?default("")?trim?length gt 1> + dictCode:"${po.dictField}" + + }, +<#elseif po.classType == 'sel_tree'> + component: 'JTreeSelect', + componentProps:{ + <#if po.dictText??> + <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> + dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}", + <#elseif po.dictText?split(',')[1]??> + pidField:"${po.dictText?split(',')[1]}", + <#elseif po.dictText?split(',')[3]??> + hasChildField:"${po.dictText?split(',')[3]}", + + + pidValue:"${po.dictField}", + }, +<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'InputNumber', +<#else> + component: 'Input', + + //colProps: {span: 6}, + }, +<#elseif po.queryMode=='like'> + { + label: "${po.filedComment}", + field: "${po.fieldName}", + component: 'JInput', + }, +<#else> + { + label: "${po.filedComment}", + field: "${po.fieldName}", +<#if po.classType=='date'> + component: 'RangePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueType: 'Date', + }, +<#elseif po.classType=='datetime'> + component: 'RangePicker', + componentProps: { + valueType: 'Date', + showTime:true + }, +<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'JRangeNumber', +<#-- update-begin---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> +<#elseif po.classType=='time'> + component: 'RangeTime', +<#-- update-end---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> +<#else> + component: 'Input', //TODO 范围查询 + + //colProps: {span: 6}, + }, + + + +<#-- 结束循环 --> +]; +//表单数据 +export const formSchema: FormSchema[] = [ +<#assign form_cat_tree = false> +<#assign form_cat_back = ""> +<#assign bpm_flag=false> +<#assign id_exists = false> +<#list columns as po><#rt/> +<#if po.fieldDbName=='bpm_status'> + <#assign bpm_flag=true> + +<#if po.fieldDbName == 'id'> + <#assign id_exists = true> + +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if po.isShow =='Y' && po.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#assign form_field_dictCode=""> + <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}"> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictField}"> + + { + label: '${po.filedComment}', + field: ${autoStringSuffix(po)}, +<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.defaultVal??> + <#if po.fieldDbType=="BigDecimal" || po.fieldDbType=="double" || po.fieldDbType=="int"> + defaultValue: ${po.defaultVal}, + <#else> + defaultValue: "${po.defaultVal}", + + +<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.classType =='date'> + component: 'DatePicker', + componentProps:{ + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueFormat: 'YYYY-MM-DD' + }, + <#elseif po.classType =='datetime'> + component: 'DatePicker', + componentProps: { + showTime:true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, + <#elseif po.classType =='time'> + component: 'TimePicker', + componentProps: { + valueFormat: 'HH:mm:ss' + }, + <#elseif po.classType =='popup'> + <#include "/common/form/vue3popup.ftl"> + <#elseif po.classType=='popup_dict'> + component: 'JPopupDict', + componentProps: { + placeholder: '请选择${po.filedComment}', + dictCode: '${po.dictTable},${po.dictText},${po.dictField}', + multi: ${po.extendParams.popupMulti?c} + }, + <#elseif po.classType =='sel_depart'> + component: 'JSelectDept', + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType =='switch'> + component: 'JSwitch', + componentProps:{ + <#if po.dictField != 'is_open'> + options:${po.dictField} + + }, + <#elseif po.classType =='pca'> + component: 'JAreaLinkage', + componentProps: { + saveCode: 'region', + }, + <#elseif po.classType =='markdown'> + component: 'JMarkdownEditor',//注意string转换问题 + <#elseif po.classType =='password'> + component: 'InputPassword', + <#elseif po.classType =='sel_user'> +<#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件------------- --> + component: 'JSelectUser', +<#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件------------- --> + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType =='textarea'> + component: 'InputTextArea', + <#elseif po.classType=='list'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#elseif po.classType=='radio'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + type: "radio", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='list_multi'> + component: 'JSelectMultiple', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#elseif po.classType=='checkbox'> + component: 'JCheckbox', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='sel_search'> + component: 'JSearchSelect', + componentProps:{ + dict:"${form_field_dictCode}" + }, +<#elseif po.classType=='cat_tree'> + <#assign form_cat_tree = true> + component: 'JCategorySelect', + componentProps:{ + pcode:"${po.dictField?default("")}", //TODO back和事件未添加,暂时有问题 + }, + <#if po.dictText?default("")?trim?length gt 1> + <#assign form_cat_back = "${po.dictText}"> + + <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'InputNumber', + <#elseif po.classType=='file'> + component: 'JUpload', + componentProps:{ + <#if po.uploadnum??> + maxCount:${po.uploadnum} + + }, + <#elseif po.classType=='image'> + component: 'JImageUpload', + componentProps:{ + <#if po.uploadnum??> + fileMax:${po.uploadnum} + <#else> + fileMax: 0 + + }, + <#elseif po.classType=='umeditor'> + component: 'JEditor', + <#elseif po.classType == 'sel_tree'> + component: 'JTreeSelect', + componentProps:{ + <#if po.dictText??> + <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> + dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}", + <#elseif po.dictText?split(',')[1]??> + pidField:"${po.dictText?split(',')[1]}", + <#elseif po.dictText?split(',')[3]??> + hasChildField:"${po.dictText?split(',')[3]}", + + + pidValue:"${po.dictField}", + }, + <#elseif po.classType=='link_table'> + component: 'JLinkTableCard', + componentProps: { + valueField: '${po.dictField}', + textField: '${po.dictText}', + tableName: '${po.dictTable}', + multi: <#if (po.queryMode!"") == "multi">true<#else>false + }, + <#else> + component: 'Input', + + <#include "/common/utils.ftl"> + <#if po.isShow == 'Y' && poHasCheck(po)> + dynamicRules: ({model,schema}) => { + <#if po.fieldName != 'id'> + <#assign fieldValidType = po.fieldValidType!''> + return [ + <#-- 非空校验 --> + <#if po.nullable == 'N' || fieldValidType == '*'> + { required: true, message: '请输入${po.filedComment}!'}, + <#elseif fieldValidType!=''> + { required: false}, + + <#-- 唯一校验 --> + <#if fieldValidType == 'only'> + {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}', '${po.fieldDbName}',model,schema)[0]}, + <#-- 6到16位数字 --> + <#elseif fieldValidType == 'n6-16'> + { pattern: /^\d{6,16}$|^(?=\d+\.\d+)[\d.]{7,17}$/, message: '请输入6到16位数字!'}, + <#-- 6到16位任意字符 --> + <#elseif fieldValidType == '*6-16'> + { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'}, + <#-- 6到18位字母 --> + <#elseif fieldValidType == 's6-18'> + { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'}, + <#-- 网址 --> + <#elseif fieldValidType == 'url'> + { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'}, + <#-- 电子邮件 --> + <#elseif fieldValidType == 'e'> + { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'}, + <#-- 手机号码 --> + <#elseif fieldValidType == 'm'> + { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'}, + <#-- 邮政编码 --> + <#elseif fieldValidType == 'p'> + { pattern: /^[0-9]\d{5}$/, message: '请输入正确的邮政编码!'}, + <#-- 字母 --> + <#elseif fieldValidType == 's'> + { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'}, + <#-- 数字 --> + <#elseif fieldValidType == 'n'> + { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'}, + <#-- 整数 --> + <#elseif fieldValidType == 'z'> + { pattern: /^-?\d+$/, message: '请输入整数!'}, + <#-- 金额 --> + <#elseif fieldValidType == 'money'> + { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'}, + <#-- 正则校验 --> + <#elseif fieldValidType != '' && fieldValidType != '*'> + { pattern: '${fieldValidType}', message: '不符合校验规则!'}, + <#-- 无校验 --> + <#else> + <#t> + + ]; + + }, + + <#if po.readonly=='Y'> + dynamicDisabled:true + + }, + + +<#if id_exists == false> + // TODO 主键隐藏字段,目前写死为ID + { + label: '', + field: 'id', + component: 'Input', + show: false + }, + +]; +//子表单数据 +<#list subTables as sub> +<#if sub.foreignRelationType =='1'> +export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [ +<#assign form_cat_tree = false> +<#assign form_cat_back = ""> +<#assign bpm_flag=false> +<#assign sub_id_exists=false> +<#list sub.colums as po><#rt/> +<#if po.fieldDbName=='bpm_status'> + <#assign bpm_flag=true> + +<#if po.fieldDbName=='id'> + <#assign sub_id_exists=true> + +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if po.isShow =='Y' && po.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#assign form_field_dictCode=""> + <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}"> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictField}"> + + { + label: '${po.filedComment}', + field: ${autoStringSuffix(po)}, +<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.defaultVal??> + <#if po.fieldDbType=="BigDecimal" || po.fieldDbType=="double" || po.fieldDbType=="int"> + defaultValue: ${po.defaultVal}, + <#else> + defaultValue: "${po.defaultVal}", + + +<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.classType =='date'> + component: 'DatePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueFormat: 'YYYY-MM-DD' + }, + <#elseif po.classType =='datetime'> + component: 'DatePicker', + componentProps: { + showTime:true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, + <#elseif po.classType =='time'> + component: 'TimePicker', + componentProps: { + valueFormat: 'HH:mm:ss' + }, + <#elseif po.classType =='popup'> + <#include "/common/form/vue3popup.ftl"> + <#elseif po.classType=='popup_dict'> + component: 'JPopupDict', + componentProps: { + placeholder: '请选择${po.filedComment}', + dictCode: '${po.dictTable},${po.dictText},${po.dictField}', + multi: ${po.extendParams.popupMulti?c} + }, + <#elseif po.classType =='sel_depart'> + component: 'JSelectDept', + <#elseif po.classType =='switch'> + component: 'JSwitch', + componentProps:{ + <#if po.dictField != 'is_open'> + options:${po.dictField} + + }, + <#elseif po.classType =='pca'> + component: 'JAreaLinkage', + componentProps: { + saveCode: 'region', + }, + <#elseif po.classType =='markdown'> + component: 'JMarkdownEditor',//注意string转换问题 + <#elseif po.classType =='password'> + component: 'InputPassword', + <#elseif po.classType =='sel_user'> +<#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件------------- --> + component: 'JSelectUser', +<#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件------------- --> + componentProps:{ + labelKey:'realname', + }, + <#elseif po.classType =='textarea'> + component: 'InputTextArea', + <#elseif po.classType=='list'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#elseif po.classType=='radio'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + type: "radio", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='list_multi'> + component: 'JSelectMultiple', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#elseif po.classType=='checkbox'> + component: 'JCheckbox', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='sel_search'> + component: 'JSearchSelect', + componentProps:{ + dict:"${form_field_dictCode}" + }, +<#elseif po.classType=='cat_tree'> + <#assign form_cat_tree = true> + component: 'JCategorySelect', + componentProps:{ + pcode:"${po.dictField?default("")}", //TODO back和事件未添加,暂时有问题 + }, + <#if po.dictText?default("")?trim?length gt 1> + <#assign form_cat_back = "${po.dictText}"> + + <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'InputNumber', + <#elseif po.classType=='file'> + component: 'JUpload', + componentProps:{ + <#if po.uploadnum??> + maxCount:${po.uploadnum} + + }, + <#elseif po.classType=='image'> + component: 'JImageUpload', + componentProps:{ + <#if po.uploadnum??> + fileMax:${po.uploadnum} + <#else> + fileMax: 0 + + }, + <#elseif po.classType=='umeditor'> + component: 'JEditor', + <#elseif po.classType == 'sel_tree'> + component: 'JTreeSelect', + componentProps:{ + <#if po.dictText??> + <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> + dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}", + <#elseif po.dictText?split(',')[1]??> + pidField:"${po.dictText?split(',')[1]}", + <#elseif po.dictText?split(',')[3]??> + hasChildField:"${po.dictText?split(',')[3]}", + + + pidValue:"${po.dictField}", + }, + <#elseif po.classType=='link_table'> + component: 'JLinkTableCard', + componentProps: { + valueField: '${po.dictField}', + textField: '${po.dictText}', + tableName: '${po.dictTable}', + multi: <#if (po.queryMode!"") == "multi">true<#else>false + }, + <#else> + component: 'Input', + + <#include "/common/utils.ftl"> + <#if po.isShow == 'Y' && poHasCheck(po)> + dynamicRules: ({model,schema}) => { + <#if po.fieldName != 'id'> + <#assign fieldValidType = po.fieldValidType!''> + return [ + <#-- 非空校验 --> + <#if po.nullable == 'N' || fieldValidType == '*'> + { required: true, message: '请输入${po.filedComment}!'}, + <#elseif fieldValidType!=''> + { required: false}, + + <#-- 唯一校验 --> + <#if fieldValidType == 'only'> + {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}', '${po.fieldDbName}',model,schema)[0]}, + <#-- 6到16位数字 --> + <#elseif fieldValidType == 'n6-16'> + { pattern: /^\d{6,16}$|^(?=\d+\.\d+)[\d.]{7,17}$/, message: '请输入6到16位数字!'}, + <#-- 6到16位任意字符 --> + <#elseif fieldValidType == '*6-16'> + { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'}, + <#-- 6到18位字母 --> + <#elseif fieldValidType == 's6-18'> + { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'}, + <#-- 网址 --> + <#elseif fieldValidType == 'url'> + { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'}, + <#-- 电子邮件 --> + <#elseif fieldValidType == 'e'> + { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'}, + <#-- 手机号码 --> + <#elseif fieldValidType == 'm'> + { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'}, + <#-- 邮政编码 --> + <#elseif fieldValidType == 'p'> + { pattern: /^[0-9]\d{5}$/, message: '请输入正确的邮政编码!'}, + <#-- 字母 --> + <#elseif fieldValidType == 's'> + { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'}, + <#-- 数字 --> + <#elseif fieldValidType == 'n'> + { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'}, + <#-- 整数 --> + <#elseif fieldValidType == 'z'> + { pattern: /^-?\d+$/, message: '请输入整数!'}, + <#-- 金额 --> + <#elseif fieldValidType == 'money'> + { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'}, + <#-- 正则校验 --> + <#elseif fieldValidType != '' && fieldValidType != '*'> + { pattern: '${fieldValidType}', message: '不符合校验规则!'}, + <#-- 无校验 --> + <#else> + <#t> + + ]; + + }, + + <#if po.readonly=='Y'> + dynamicDisabled:true + + }, + + +<#if sub_id_exists == false> + { + label: '', + field: 'id', + component: 'Input', + show: false + }, + +]; + + +//子表表格配置 +<#list subTables as sub> +<#if sub.foreignRelationType =='0'> +export const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [ +<#assign popupBackFields = ""> + +<#-- 循环子表的列 开始 --> +<#list sub.colums as col><#rt/> +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if col.isShow =='Y' && col.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if col.filedComment !='外键' > + { + title: '${col.filedComment}', + key: '${autoStringSuffixForModel(col)}', +<#if col.classType =='date'> + type: JVxeTypes.date, + <#if col.extendParams?exists && col.extendParams.picker?exists> + picker: '${col.extendParams.picker}', + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='datetime'> + type: JVxeTypes.datetime, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='time'> + type: JVxeTypes.time, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='textarea'> + type: JVxeTypes.textarea, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='list' || col.classType =='radio'> + type: JVxeTypes.select, + options:[], + <#if col.dictTable?default("")?trim?length gt 1> + dictCode:"${col.dictTable},${col.dictText},${col.dictField}", + <#else> + dictCode:"${col.dictField}", + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='list_multi' || col.classType =='checkbox'> + type: JVxeTypes.selectMultiple, + options:[], + <#if col.dictTable?default("")?trim?length gt 1> + dictCode:"${col.dictTable},${col.dictText},${col.dictField}", + <#else> + dictCode:"${col.dictField}", + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='sel_search'> + type: JVxeTypes.selectSearch, + <#if col.dictTable?default("")?trim?length gt 1> + dictCode:"${col.dictTable},${col.dictText},${col.dictField}", + <#else> + dictCode:"${col.dictField}", + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='sel_depart'> + type: JVxeTypes.departSelect, + props:{ + <#if col.extendParams?exists && col.extendParams.text?exists> + labelKey: '${col.extendParams.text}', + + <#if col.extendParams?exists && col.extendParams.store?exists> + rowKey: '${col.extendParams.store}', + + }, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='sel_user'> + type: JVxeTypes.userSelect, + props:{ + <#if col.extendParams?exists && col.extendParams.text?exists> + labelKey: '${col.extendParams.text}', + + <#if col.extendParams?exists && col.extendParams.store?exists> + rowKey: '${col.extendParams.store}', + + }, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='image'> + type: JVxeTypes.image, + token:true, + responseName:"message", + <#if col.readonly=='Y'> + disabled:true, + + <#if col.uploadnum??> + number: ${col.uploadnum}, + +<#elseif col.classType =='file'> + type: JVxeTypes.file, + token:true, + responseName:"message", + <#if col.readonly=='Y'> + disabled:true, + + <#if col.uploadnum??> + number: ${col.uploadnum}, + +<#elseif col.classType =='switch'> + type: JVxeTypes.checkbox, + <#if col.dictField == 'is_open'> + customValue: ['Y', 'N'], + <#else> + customValue: ${col.dictField}, + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType=='pca'> + type: JVxeTypes.pca, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='popup'> +<#if popupBackFields?length gt 0> + <#assign popupBackFields = "${popupBackFields}"+","+"${col.dictText}"> +<#else> + <#assign popupBackFields = "${col.dictText}"> + + <#include "/common/form/vue3Jvxepopup.ftl"> +<#-- update-begin-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对,数字或者金额类型 --> +<#-- elseif "int,decimal,double,"?contains(col.classType) --> +<#elseif col.fieldDbType=='int' || col.fieldDbType=='long' || col.fieldDbType=='double' || col.fieldDbType=='BigDecimal'> +<#-- update-end-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对,数字或者金额类型 --> + type: JVxeTypes.inputNumber, + <#if col.readonly=='Y'> + disabled:true, + +<#else> + type: JVxeTypes.input, + <#if col.readonly=='Y'> + disabled:true, + + +<#if col.classType =='list_multi' || col.classType =='checkbox'> + width:"250px", +<#else> + width:"200px", + +<#if col.classType =='file'> + placeholder: '请选择文件', +<#else> + placeholder: '请输入${'$'}{title}', + +<#if col.defaultVal??> +<#if col.fieldDbType=="BigDecimal" || col.fieldDbType=="double" || col.fieldDbType=="int"> + defaultValue:${col.defaultVal}, + <#else> + defaultValue:"${col.defaultVal}", + +<#else> + defaultValue:'', + +<#-- 子表的校验 --> + <#include "/common/validatorRulesTemplate/sub-vue3.ftl"> + }, + + + +<#-- 循环子表的列 结束 --> + ] + + + + +<#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> +// 高级查询数据 +export const superQuerySchema = { + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + ${superQueryFieldListForVue3(po,po_index)}, + + + //子表高级查询 + <#list subTables as sub> + ${sub.entityName?uncap_first}: { + title: '${sub.ftlDescription}', + view: 'table', + fields: { + <#list sub.colums as subCol> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if subCol.isShowList =='Y' && subCol.fieldName !='id' && subCol.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + ${superQueryFieldListForVue3(subCol,subCol_index)}, + + + } + }, + +}; +<#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> + +/** +* 流程表单调用这个方法获取formSchema +* @param param +*/ +export function getBpmFormSchema(_formData): FormSchema[]{ +// 默认和原始表单保持一致 如果流程中配置了权限数据,这里需要单独处理formSchema + return formSchema; +} \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql new file mode 100644 index 00000000..7292339d --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql @@ -0,0 +1 @@ +<#include "/common/sql/menu_insert.ftl"> diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei new file mode 100644 index 00000000..eff0ab39 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei @@ -0,0 +1,209 @@ +<#include "/common/utils.ftl"> + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei new file mode 100644 index 00000000..a3698d0b --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei @@ -0,0 +1,278 @@ +<#include "/common/utils.ftl"> + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei new file mode 100644 index 00000000..9bf73fa0 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei @@ -0,0 +1,87 @@ +<#include "/common/utils.ftl"> +<#list subTables as sub> +<#if sub.foreignRelationType=='1'> +#segment#${sub.entityName}Form.vue + + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei new file mode 100644 index 00000000..95ff8e5f --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei @@ -0,0 +1,582 @@ +<#include "/common/utils.ftl"> + + +<#if query_flag> + + + + 查询 + 重置 + + {{ toggleSearchStatus ? '收起' : '展开' }} + + + + + + + + + +<#-- 结束循环 --> + + + + + + + + + + + <${entityName}Modal @register="registerModal" @success="handleSuccess"> + <#if bpm_flag==true> + + + + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi new file mode 100644 index 00000000..6762659f --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi @@ -0,0 +1,85 @@ +import {defHttp} from '/@/utils/http/axios'; +import { useMessage } from "/@/hooks/web/useMessage"; + +const { createConfirm } = useMessage(); + +enum Api { + list = '/${entityPackagePath}/${entityName?uncap_first}/list', + save='/${entityPackagePath}/${entityName?uncap_first}/add', + edit='/${entityPackagePath}/${entityName?uncap_first}/edit', + deleteOne = '/${entityPackagePath}/${entityName?uncap_first}/delete', + deleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch', + importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel', + exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls', + queryDataById = '/${entityPackagePath}/${entityName?uncap_first}/queryById', +<#list subTables as sub><#rt/> + ${sub.entityName?uncap_first}List = '/${entityPackagePath}/${entityName?uncap_first}/query${sub.entityName}ByMainId', + +} +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; + +/** + * 导入api + */ +export const getImportUrl = Api.importExcel; + +<#list subTables as sub><#rt/> +/** + * 查询子表数据 + * @param params + */ +export const query${sub.entityName}ListByMainId = (id) => defHttp.get({url: Api.${sub.entityName?uncap_first}List, params:{ id }}); + + +/** + * 列表接口 + * @param params + */ +export const list = (params) => + defHttp.get({url: Api.list, params}); + +/** + * 删除单个 + */ +export const deleteOne = (params,handleSuccess) => { + return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); +} +/** + * 批量删除 + * @param params + */ +export const batchDelete = (params, handleSuccess) => { + createConfirm({ + iconType: 'warning', + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); + } + }); +} +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdate = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({url: url, params}); +} + +/** +* 根据id查询数据 +* @param params +*/ +export const queryDataById = (id) => defHttp.get({url: Api.queryDataById, params:{ id }}); + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi new file mode 100644 index 00000000..89ec48cd --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi @@ -0,0 +1,273 @@ +<#include "/common/utils.ftl"> +import {BasicColumn} from '/@/components/Table'; +import {FormSchema} from '/@/components/Table'; +import { rules} from '/@/utils/helper/validator'; +import { render } from '/@/utils/common/renderUtils'; +import {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types' +import { getWeekMonthQuarterYear } from '/@/utils'; +//列表数据 +export const columns: BasicColumn[] = [ + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + { + title: '${po.filedComment}', + align:"center", + <#if po.sort=='Y'> + sorter: true, + + <#if po.classType=='date'> + dataIndex: '${po.fieldName}', + customRender:({text}) =>{ + text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text); + <#if po.extendParams?exists && po.extendParams.picker?exists> + if(text) { + return getWeekMonthQuarterYear(text)['${po.extendParams.picker}']; + } else { + return text; + } + <#else> + return text; + + }, + <#elseif po.fieldDbType=='Blob'> + dataIndex: '${po.fieldName}String' + <#elseif po.classType=='umeditor'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='pca'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='file'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='image'> + dataIndex: '${po.fieldName}', + customRender:render.renderImage, + <#elseif po.classType=='switch'> + dataIndex: '${po.fieldName}', +<#assign switch_extend_arr=['Y','N']> +<#if po.dictField?default("")?contains("[")> +<#assign switch_extend_arr=po.dictField?eval> + +<#list switch_extend_arr as a> +<#if a_index == 0> +<#assign switch_extend_arr1=a> +<#else> +<#assign switch_extend_arr2=a> + + + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}]) + }, + <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict'> + dataIndex: '${po.fieldName}_dictText' + <#elseif po.classType=='cat_tree'> + dataIndex: '${po.fieldName}', + <#if po.dictText?default("")?trim?length == 0> + customRender:({text}) => { + return render.renderCategoryTree(text,'${po.dictField?default("")}') + }, + <#else> + customRender: ({text, record}) => (text ? record['${po.dictText}'] : '') + + <#else> + dataIndex: '${po.fieldName}' + + }, + + +]; + +//子表表格配置 +<#list subTables as sub> +<#if sub.foreignRelationType =='0'> +export const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [ +<#assign popupBackFields = ""> + +<#-- 循环子表的列 开始 --> +<#list sub.colums as col><#rt/> +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if col.isShow =='Y' && col.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if col.filedComment !='外键' > + { + title: '${col.filedComment}', + key: '${autoStringSuffixForModel(col)}', +<#if col.classType =='date'> + type: JVxeTypes.date, + <#if col.extendParams?exists && col.extendParams.picker?exists> + picker: '${col.extendParams.picker}', + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='datetime'> + type: JVxeTypes.datetime, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='time'> + type: JVxeTypes.time, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='textarea'> + type: JVxeTypes.textarea, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='list' || col.classType =='radio'> + type: JVxeTypes.select, + options:[], + <#if col.dictTable?default("")?trim?length gt 1> + dictCode:"${col.dictTable},${col.dictText},${col.dictField}", + <#else> + dictCode:"${col.dictField}", + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='list_multi' || col.classType =='checkbox'> + type: JVxeTypes.selectMultiple, + options:[], + <#if col.dictTable?default("")?trim?length gt 1> + dictCode:"${col.dictTable},${col.dictText},${col.dictField}", + <#else> + dictCode:"${col.dictField}", + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='sel_search'> + type: JVxeTypes.selectSearch, + <#if col.dictTable?default("")?trim?length gt 1> + dictCode:"${col.dictTable},${col.dictText},${col.dictField}", + <#else> + dictCode:"${col.dictField}", + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='sel_depart'> + type: JVxeTypes.departSelect, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='sel_user'> + type: JVxeTypes.userSelect, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='image'> + type: JVxeTypes.image, + token:true, + responseName:"message", + <#if col.readonly=='Y'> + disabled:true, + + <#if col.uploadnum??> + number: ${col.uploadnum}, + +<#elseif col.classType =='file'> + type: JVxeTypes.file, + token:true, + responseName:"message", + <#if col.readonly=='Y'> + disabled:true, + + <#if col.uploadnum??> + number: ${col.uploadnum}, + +<#elseif col.classType =='switch'> + type: JVxeTypes.checkbox, + <#if col.dictField == 'is_open'> + customValue: ['Y', 'N'], + <#else> + customValue: ${col.dictField}, + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType=='pca'> + type: JVxeTypes.pca, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='popup'> +<#if popupBackFields?length gt 0> + <#assign popupBackFields = "${popupBackFields}"+","+"${col.dictText}"> +<#else> + <#assign popupBackFields = "${col.dictText}"> + + <#include "/common/form/vue3Jvxepopup.ftl"> +<#-- update-begin-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对,数字或者金额类型 --> +<#-- elseif "int,decimal,double,"?contains(col.classType) --> +<#elseif col.fieldDbType=='int' || col.fieldDbType=='long' || col.fieldDbType=='double' || col.fieldDbType=='BigDecimal'> +<#-- update-end-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对,数字或者金额类型 --> + type: JVxeTypes.inputNumber, + <#if col.readonly=='Y'> + disabled:true, + +<#else> + type: JVxeTypes.input, + <#if col.readonly=='Y'> + disabled:true, + + +<#if col.classType =='list_multi' || col.classType =='checkbox'> + width:"250px", +<#else> + width:"200px", + +<#if col.classType =='file'> + placeholder: '请选择文件', +<#else> + placeholder: '请输入${'$'}{title}', + +<#if col.defaultVal??> +<#if col.fieldDbType=="BigDecimal" || col.fieldDbType=="double" || col.fieldDbType=="int"> + defaultValue:${col.defaultVal}, + <#else> + defaultValue:"${col.defaultVal}", + +<#else> + defaultValue:'', + +<#-- 子表的校验 --> + <#include "/common/validatorRulesTemplate/sub-vue3.ftl"> + }, + + + +<#-- 循环子表的列 结束 --> + ] + + + +<#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> +// 高级查询数据 +export const superQuerySchema = { + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + ${superQueryFieldListForVue3(po,po_index)}, + + + //子表高级查询 + <#list subTables as sub> + ${sub.entityName?uncap_first}: { + title: '${sub.ftlDescription}', + view: 'table', + fields: { + <#list sub.colums as subCol> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if subCol.isShowList =='Y' && subCol.fieldName !='id' && subCol.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + ${superQueryFieldListForVue3(subCol,subCol_index)}, + + + } + }, + +}; +<#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql new file mode 100644 index 00000000..5396d5d5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql @@ -0,0 +1 @@ +<#include "/common/sql/menu_insert.ftl"> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei new file mode 100644 index 00000000..24cbc013 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei @@ -0,0 +1,412 @@ +<#include "/common/utils.ftl"> +<#assign need_category = false> +<#assign bpm_flag=false> +<#assign need_pca = false> +<#assign need_search = false> +<#assign need_dept_user = false> +<#assign need_switch = false> +<#assign need_dept = false> +<#assign need_multi = false> +<#assign need_popup = false> +<#assign need_popup_dict = false> +<#assign need_select_tag = false> +<#assign need_select_tree = false> +<#assign need_time = false> +<#assign need_markdown = false> +<#assign need_upload = false> +<#assign need_image_upload = false> +<#assign need_editor = false> +<#assign need_checkbox = false> +<#assign need_range_number = false> +<#assign is_like = false> +<#assign form_span = 24> +<#if tableVo.fieldRowNum==2> + <#assign form_span = 12> +<#elseif tableVo.fieldRowNum==3> + <#assign form_span = 8> +<#elseif tableVo.fieldRowNum==4> + <#assign form_span = 6> + +<#assign hasOne2manyTable = false> +<#assign subTabActiveKey = ''> +<#assign subMainFieldMap={}> +<#assign subTableColumnsKey=[]> +<#assign hasOnlyValidate = false> + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei new file mode 100644 index 00000000..1a3a8dde --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei @@ -0,0 +1,97 @@ +<#include "/common/utils.ftl"> + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Form.vuei new file mode 100644 index 00000000..4a2e3697 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Form.vuei @@ -0,0 +1,185 @@ +<#include "/common/utils.ftl"> +<#list subTables as sub> +<#if sub.foreignRelationType=='1'> +#segment#${sub.entityName}Form.vue +<#include "/common/utils.ftl"> +<#assign need_category = false> +<#assign bpm_flag=false> +<#assign need_pca = false> +<#assign need_search = false> +<#assign need_dept_user = false> +<#assign need_switch = false> +<#assign need_dept = false> +<#assign need_multi = false> +<#assign need_popup = false> +<#assign need_popup_dict = false> +<#assign need_select_tag = false> +<#assign need_select_tree = false> +<#assign need_time = false> +<#assign need_markdown = false> +<#assign need_upload = false> +<#assign need_image_upload = false> +<#assign need_editor = false> +<#assign need_checkbox = false> +<#assign need_range_number = false> +<#assign is_like = false> +<#assign form_span = 24> +<#if tableVo.fieldRowNum==2> + <#assign form_span = 12> +<#elseif tableVo.fieldRowNum==3> + <#assign form_span = 8> +<#elseif tableVo.fieldRowNum==4> + <#assign form_span = 6> + + <#assign hasOnlyValidate = false> + + + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai new file mode 100644 index 00000000..3c513ee7 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -0,0 +1,365 @@ +package ${bussiPackage}.${entityPackage}.controller; + +import java.io.UnsupportedEncodingException; +import java.io.IOException; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.HashMap; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.vo.LoginUser; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.util.oConvertUtils; +import org.jeecgframework.poi.excel.entity.enmus.ExcelType; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import ${bussiPackage}.${entityPackage}.vo.${entityName}Page; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.service.I${sub.entityName}Service; + +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; +<#assign has_multi_query_field=false> +<#list originalColumns as po> +<#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')> + <#assign has_multi_query_field=true> + + +<#assign enhanceJavaList=[]> +<#if tableVo.extendParams?? && tableVo.extendParams.enhanceJavaList??> + <#assign enhanceJavaList = tableVo.extendParams.enhanceJavaList?filter(enhance -> enhance??)> + + /** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Tag(name="${tableVo.ftlDescription}") +@RestController +@RequestMapping("/${entityPackagePath}/${entityName?uncap_first}") +@Slf4j +public class ${entityName}Controller { + @Autowired + private I${entityName}Service ${entityName?uncap_first}Service; + <#list subTables as sub> + @Autowired + private I${sub.entityName}Service ${sub.entityName?uncap_first}Service; + + + /** + * 分页列表查询 + * + * @param ${entityName?uncap_first} + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "${tableVo.ftlDescription}-分页列表查询") + @Operation(summary="${tableVo.ftlDescription}-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(${entityName} ${entityName?uncap_first}, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 查询前触发的方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeQuery() + + + + <#if has_multi_query_field> + // 自定义查询规则 + Map customeRuleMap = new HashMap<>(); + // 自定义多选的查询规则为:LIKE_WITH_OR + <#list originalColumns as po> + <#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')> + customeRuleMap.put("${po.fieldName}", QueryRuleEnum.LIKE_WITH_OR); + + + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap(),customeRuleMap); + <#else> + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap()); + + Page<${entityName}> page = new Page<${entityName}>(pageNo, pageSize); + IPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper); + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'> + //TODO 查询后触发的方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.afterQuery() + + + + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param ${entityName?uncap_first}Page + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-添加") + @Operation(summary="${tableVo.ftlDescription}-添加") + @RequiresPermissions("${entityPackage}:${tableName}:add") + @PostMapping(value = "/add") + public Result add(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 新增前的处理方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeAdd() + + + + ${entityName} ${entityName?uncap_first} = new ${entityName}(); + BeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first}); + ${entityName?uncap_first}Service.saveMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,); + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'> + //TODO 新增后的处理方法,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.afterAdd() + + + + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param ${entityName?uncap_first}Page + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-编辑") + @Operation(summary="${tableVo.ftlDescription}-编辑") + @RequiresPermissions("${entityPackage}:${tableName}:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 编辑前,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeEdit() + + + + ${entityName} ${entityName?uncap_first} = new ${entityName}(); + BeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first}); + ${entityName} ${entityName?uncap_first}Entity = ${entityName?uncap_first}Service.getById(${entityName?uncap_first}.getId()); + if(${entityName?uncap_first}Entity==null) { + return Result.error("未找到对应数据"); + } + ${entityName?uncap_first}Service.updateMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,); + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'> + //TODO 编辑后,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.afterEdit() + + + + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-通过id删除") + @Operation(summary="${tableVo.ftlDescription}-通过id删除") + @RequiresPermissions("${entityPackage}:${tableName}:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + ${entityName?uncap_first}Service.delMain(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "${tableVo.ftlDescription}-批量删除") + @Operation(summary="${tableVo.ftlDescription}-批量删除") + @RequiresPermissions("${entityPackage}:${tableName}:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "${tableVo.ftlDescription}-通过id查询") + @Operation(summary="${tableVo.ftlDescription}-通过id查询") + @GetMapping(value = "/queryById") + public Result<${entityName}> queryById(@RequestParam(name="id",required=true) String id) { + ${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id); + if(${entityName?uncap_first}==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(${entityName?uncap_first}); + + } + + <#list subTables as sub> + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "${sub.ftlDescription}通过主表ID查询") + @Operation(summary="${sub.ftlDescription}主表ID查询") + @GetMapping(value = "/query${sub.entityName}ByMainId") + public Result> query${sub.entityName}ListByMainId(@RequestParam(name="id",required=true) String id) { + List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(id); + return Result.OK(${sub.entityName?uncap_first}List); + } + + + /** + * 导出excel + * + * @param request + * @param ${entityName?uncap_first} + */ + @RequiresPermissions("${entityPackage}:${tableName}:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='export' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 导出前,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeExport() + + + + + // Step.1 组装查询条件查询数据 + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap()); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + + //配置选中数据查询条件 + String selections = request.getParameter("selections"); + if(oConvertUtils.isNotEmpty(selections)) { + List selectionList = Arrays.asList(selections.split(",")); + queryWrapper.in("id",selectionList); + } + //Step.2 获取导出数据 + List<${entityName}> ${entityName?uncap_first}List = ${entityName?uncap_first}Service.list(queryWrapper); + + // Step.3 组装pageList + List<${entityName}Page> pageList = new ArrayList<${entityName}Page>(); + for (${entityName} main : ${entityName?uncap_first}List) { + ${entityName}Page vo = new ${entityName}Page(); + BeanUtils.copyProperties(main, vo); + <#list subTables as sub> + List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(main.getId()); + vo.set${sub.entityName}List(${sub.entityName?uncap_first}List); + + pageList.add(vo); + } + + // Step.4 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + mv.addObject(NormalExcelConstants.FILE_NAME, "${tableVo.ftlDescription}列表"); + mv.addObject(NormalExcelConstants.CLASS, ${entityName}Page.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("${tableVo.ftlDescription}数据", "导出人:"+sysUser.getRealname(), "${tableVo.ftlDescription}", ExcelType.XSSF)); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("${entityPackage}:${tableName}:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + <#if enhanceJavaList?size gt 0> + <#list enhanceJavaList as enhanceJava> + <#if enhanceJava.buttonCode=='import' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'> + //TODO 导入前,代码生成后,请手工实现增强类逻辑; + //${entityName?uncap_first}Service.beforeImport() + + + + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + // 获取上传文件对象 + MultipartFile file = entity.getValue(); + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<${entityName}Page> list = ExcelImportUtil.importExcel(file.getInputStream(), ${entityName}Page.class, params); + for (${entityName}Page page : list) { + ${entityName} po = new ${entityName}(); + BeanUtils.copyProperties(page, po); + ${entityName?uncap_first}Service.saveMain(po, <#list subTables as sub>page.get${sub.entityName}List()<#if sub_has_next>,); + } + return Result.OK("文件导入成功!数据行数:" + list.size()); + } catch (Exception e) { + log.error(e.getMessage(),e); + return Result.error("文件导入失败:"+e.getMessage()); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.OK("文件导入失败!"); + } + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai new file mode 100644 index 00000000..b45dbe91 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai @@ -0,0 +1,82 @@ +<#include "/common/utils.ftl"> +package ${bussiPackage}.${entityPackage}.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Schema(description="${tableVo.ftlDescription}") +@Data +@TableName("${tableName}") +public class ${entityName} implements Serializable { + private static final long serialVersionUID = 1L; + +<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']> + <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']> + <#list originalColumns as po> + <#-- 生成字典Code --> + <#assign list_field_dictCode=""> + <#if po.classType='sel_user'> + <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'> + <#elseif po.classType='sel_depart'> + <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'> + <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dicCode = "${po.dictField}"'> + + <#elseif po.classType=='sel_tree'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText?split(",")[2]}", dicCode = "${po.dictText?split(",")[0]}"'> + <#elseif po.classType=='link_table'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicCode = "${po.dictField}", dicText = "${po.dictText?split(",")[0]}"'> + + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + @TableId(type = IdType.ASSIGN_ID) + <#else> + <#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'> + <#if po.classType=='date'> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}") && !excel_ignore_classType_arr?seq_contains("${po.classType}")> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + + + <#if list_field_dictCode?length gt 1> + @Dict(${list_field_dictCode?substring(2)}) + + + <#include "/common/blob.ftl"> + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai new file mode 100644 index 00000000..f85ed30c --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai @@ -0,0 +1,82 @@ +<#include "/common/utils.ftl"> +<#list subTables as subTab> +#segment#${subTab.entityName}.java +package ${bussiPackage}.${entityPackage}.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import java.util.Date; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.UnsupportedEncodingException; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Schema(description="${subTab.ftlDescription}") +@Data +@TableName("${subTab.tableName}") +public class ${subTab.entityName} implements Serializable { + private static final long serialVersionUID = 1L; + +<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']> + <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']> + <#list subTab.originalColumns as po> + <#-- 生成字典Code --> + <#assign list_field_dictCode=""> + <#if po.classType='sel_user'> + <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'> + <#elseif po.classType='sel_depart'> + <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'> + <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dicCode = "${po.dictField}"'> + <#elseif po.classType=='sel_tree'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText?split(",")[2]}", dicCode = "${po.dictText?split(",")[0]}"'> + + <#elseif po.classType=='link_table'> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicCode = "${po.dictField}", dicText = "${po.dictText?split(",")[0]}"'> + + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + @TableId(type = IdType.ASSIGN_ID) + <#else> + <#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'> + <#if po.classType=='date'> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + + <#elseif !subTab.foreignKeys?seq_contains(po.fieldName?cap_first)> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}") && !excel_ignore_classType_arr?seq_contains("${po.classType}")> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + + + + <#-- 大字段转换 --> + <#include "/common/blob.ftl"> + +} + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai new file mode 100644 index 00000000..c31b9bfd --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai @@ -0,0 +1,17 @@ +package ${bussiPackage}.${entityPackage}.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface ${entityName}Mapper extends BaseMapper<${entityName}> { + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai new file mode 100644 index 00000000..10b27644 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai @@ -0,0 +1,34 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}Mapper.java +package ${bussiPackage}.${entityPackage}.mapper; + +import java.util.List; +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface ${subTab.entityName}Mapper extends BaseMapper<${subTab.entityName}> { + + /** + * 通过主表id删除子表数据 + * + * @param mainId 主表id + * @return boolean + */ + public boolean deleteByMainId(@Param("mainId") String mainId); + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List<${subTab.entityName}> + */ + public List<${subTab.entityName}> selectByMainId(@Param("mainId") String mainId); +} + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml new file mode 100644 index 00000000..16f3d653 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml new file mode 100644 index 00000000..117c9b6f --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml @@ -0,0 +1,26 @@ +<#list subTables as subTab> +<#assign originalForeignKeys = subTab.originalForeignKeys> +#segment#${subTab.entityName}Mapper.xml + + + + + + DELETE + FROM ${subTab.tableName} + WHERE + <#list originalForeignKeys as key> + ${key} = ${r'#'}{mainId} <#rt/> + + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai new file mode 100644 index 00000000..d80c0290 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai @@ -0,0 +1,54 @@ +package ${bussiPackage}.${entityPackage}.service; + +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import com.baomidou.mybatisplus.extension.service.IService; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface I${entityName}Service extends IService<${entityName}> { + + /** + * 添加一对多 + * + * @param ${entityName?uncap_first} + <#list subTables as sub> + * @param ${sub.entityName?uncap_first}List + + */ + public void saveMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,) ; + + /** + * 修改一对多 + * + * @param ${entityName?uncap_first} + <#list subTables as sub> + * @param ${sub.entityName?uncap_first}List + + */ + public void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,); + + /** + * 删除一对多 + * + * @param id + */ + public void delMain (String id); + + /** + * 批量删除一对多 + * + * @param idList + */ + public void delBatchMain (Collection idList); + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai new file mode 100644 index 00000000..cbc72ff4 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai @@ -0,0 +1,25 @@ +<#list subTables as subTab> +#segment#I${subTab.entityName}Service.java +package ${bussiPackage}.${entityPackage}.service; + +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +public interface I${subTab.entityName}Service extends IService<${subTab.entityName}> { + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List<${subTab.entityName}> + */ + public List<${subTab.entityName}> selectByMainId(String mainId); +} + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai new file mode 100644 index 00000000..7f99d42e --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai @@ -0,0 +1,105 @@ +package ${bussiPackage}.${entityPackage}.service.impl; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.mapper.${sub.entityName}Mapper; + +import ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import java.io.Serializable; +import java.util.List; +import java.util.Collection; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Service +public class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service { + + @Autowired + private ${entityName}Mapper ${entityName?uncap_first}Mapper; + <#list subTables as sub> + @Autowired + private ${sub.entityName}Mapper ${sub.entityName?uncap_first}Mapper; + + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveMain(${entityName} ${entityName?uncap_first}, <#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,) { + ${entityName?uncap_first}Mapper.insert(${entityName?uncap_first}); + <#list subTables as sub> + if(${sub.entityName?uncap_first}List!=null && ${sub.entityName?uncap_first}List.size()>0) { + for(${sub.entityName} entity:${sub.entityName?uncap_first}List) { + <#list sub.foreignKeys as key> + //外键设置 + <#if key?lower_case?index_of("${primaryKeyField}")!=-1> + entity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}()); + <#else> + entity.set${key?cap_first}(${entityName?uncap_first}.get${key}()); + + + ${sub.entityName?uncap_first}Mapper.insert(entity); + } + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,) { + ${entityName?uncap_first}Mapper.updateById(${entityName?uncap_first}); + + //1.先删除子表数据 + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(${entityName?uncap_first}.getId()); + + + //2.子表数据重新插入 + <#list subTables as sub> + if(${sub.entityName?uncap_first}List!=null && ${sub.entityName?uncap_first}List.size()>0) { + for(${sub.entityName} entity:${sub.entityName?uncap_first}List) { + <#list sub.foreignKeys as key> + //外键设置 + <#if key?lower_case?index_of("${primaryKeyField}")!=-1> + entity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}()); + <#else> + entity.set${key?cap_first}(${entityName?uncap_first}.get${key}()); + + + ${sub.entityName?uncap_first}Mapper.insert(entity); + } + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delMain(String id) { + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(id); + + ${entityName?uncap_first}Mapper.deleteById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delBatchMain(Collection idList) { + for(Serializable id:idList) { + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(id.toString()); + + ${entityName?uncap_first}Mapper.deleteById(id); + } + } + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai new file mode 100644 index 00000000..0ce41d36 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai @@ -0,0 +1,30 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}ServiceImpl.java +package ${bussiPackage}.${entityPackage}.service.impl; + +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import ${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper; +import ${bussiPackage}.${entityPackage}.service.I${subTab.entityName}Service; +import org.springframework.stereotype.Service; +import java.util.List; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description: ${subTab.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Service +public class ${subTab.entityName}ServiceImpl extends ServiceImpl<${subTab.entityName}Mapper, ${subTab.entityName}> implements I${subTab.entityName}Service { + + @Autowired + private ${subTab.entityName}Mapper ${subTab.entityName?uncap_first}Mapper; + + @Override + public List<${subTab.entityName}> selectByMainId(String mainId) { + return ${subTab.entityName?uncap_first}Mapper.selectByMainId(mainId); + } +} + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai new file mode 100644 index 00000000..c8550f84 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai @@ -0,0 +1,117 @@ +package ${bussiPackage}.${entityPackage}.vo; + +import java.util.List; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; + +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecgframework.poi.excel.annotation.ExcelEntity; +import org.jeecgframework.poi.excel.annotation.ExcelCollection; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import java.util.Date; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @Description: ${tableVo.ftlDescription} + * @Author: jeecg-boot + * @Date: ${.now?string["yyyy-MM-dd"]} + * @Version: V1.0 + */ +@Data +@Schema(description="${tableVo.ftlDescription}") +public class ${entityName}Page { + + <#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']> + <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']> + <#list originalColumns as po> + <#-- 生成字典Code --> + <#assign list_field_dictCode=""> + <#if po.classType='sel_user'> + <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "realname", dicCode = "username"'> + <#elseif po.classType='sel_depart'> + <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "depart_name", dicCode = "id"'> + <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign list_field_dictCode=', dicCode = "${po.dictField}"'> + <#elseif po.classType=='cat_tree'> + <#assign list_field_dictCode=', dictTable = "sys_category", dicText = "name", dicCode = "id"'> + + + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + <#else> + <#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'> + <#if po.classType=='date'> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}")> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + + <#else> + <#if !excel_ignore_arr?seq_contains("${po.fieldName}") && !excel_ignore_classType_arr?seq_contains("${po.classType}")> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + + + <#if list_field_dictCode?length gt 1 && !excel_ignore_classType_arr?seq_contains("${po.classType}")> + @Dict(${list_field_dictCode?substring(2)}) + + + @Schema(description = "${po.filedComment}") + <#if po.fieldDbType=='Blob'> + private java.lang.String ${po.fieldName}String; + <#elseif po.classType=='pca'> + @Excel(name = "${po.filedComment}", width = 15,exportConvert=true,importConvert = true ) + private ${po.fieldType} ${po.fieldName}; + + public String convertis${po.fieldName?cap_first}() { + return SpringContextUtils.getBean(ProvinceCityArea.class).getText(${po.fieldName}); + } + + public void convertset${po.fieldName?cap_first}(String text) { + this.${po.fieldName} = SpringContextUtils.getBean(ProvinceCityArea.class).getCode(text); + } + <#elseif po.classType=='cat_tree'> + @Excel(name = "${po.filedComment}", width = 15${list_field_dictCode}) + private ${po.fieldType} ${po.fieldName}; + <#elseif po.classType=='switch'> + <#assign switch_extend_arr=['Y','N']> + <#if po.dictField?default("")?contains("[")> + <#assign switch_extend_arr=po.dictField?eval> + + <#list switch_extend_arr as a> + <#if a_index == 0> + <#assign switch_extend_arr1=a> + <#else> + <#assign switch_extend_arr2=a> + + + @Excel(name = "${po.filedComment}", width = 15,replace = {"是_${switch_extend_arr1}","否_${switch_extend_arr2}"} ) + private ${po.fieldType} ${po.fieldName}; + <#else> + private ${po.fieldType} ${po.fieldName}; + + + + <#list subTables as sub> + @ExcelCollection(name="${sub.ftlDescription}") + @Schema(description = "${sub.ftlDescription}") + private List<${sub.entityName}> ${sub.entityName?uncap_first}List; + + +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei new file mode 100644 index 00000000..e440c054 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei @@ -0,0 +1,351 @@ + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql new file mode 100644 index 00000000..5396d5d5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql @@ -0,0 +1 @@ +<#include "/common/sql/menu_insert.ftl"> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei new file mode 100644 index 00000000..1e84cd72 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei @@ -0,0 +1,509 @@ +<#include "/common/utils.ftl"> + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei new file mode 100644 index 00000000..c666aa4c --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei @@ -0,0 +1,62 @@ +<#include "/common/utils.ftl"> + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei new file mode 100644 index 00000000..7b69d6d9 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei @@ -0,0 +1,199 @@ +<#include "/common/utils.ftl"> +<#list subTables as sub> +<#if sub.foreignRelationType=='1'> +#segment#${sub.entityName}Form.vue + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei new file mode 100644 index 00000000..14c7d9f7 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei @@ -0,0 +1,444 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi new file mode 100644 index 00000000..ffe92f57 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi @@ -0,0 +1,75 @@ +import {defHttp} from '/@/utils/http/axios'; +import { useMessage } from "/@/hooks/web/useMessage"; + +const { createConfirm } = useMessage(); + +enum Api { + list = '/${entityPackagePath}/${entityName?uncap_first}/list', + save='/${entityPackagePath}/${entityName?uncap_first}/add', + edit='/${entityPackagePath}/${entityName?uncap_first}/edit', + deleteOne = '/${entityPackagePath}/${entityName?uncap_first}/delete', + deleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch', + importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel', + exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls', +<#list subTables as sub><#rt/> + ${sub.entityName?uncap_first}List = '/${entityPackagePath}/${entityName?uncap_first}/query${sub.entityName}ByMainId', + +} +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; + +/** + * 导入api + */ +export const getImportUrl = Api.importExcel; +<#list subTables as sub><#rt/> +/** + * 查询子表数据 + * @param params + */ +export const ${sub.entityName?uncap_first}List = Api.${sub.entityName?uncap_first}List; + +/** + * 列表接口 + * @param params + */ +export const list = (params) => + defHttp.get({url: Api.list, params}); + +/** + * 删除单个 + */ +export const deleteOne = (params,handleSuccess) => { + return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); +} +/** + * 批量删除 + * @param params + */ +export const batchDelete = (params, handleSuccess) => { + createConfirm({ + iconType: 'warning', + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); + } + }); +} +/** + * 保存或者更新 + * @param params + */ +export const saveOrUpdate = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({url: url, params}); +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi new file mode 100644 index 00000000..e6a50f95 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi @@ -0,0 +1,991 @@ +<#include "/common/utils.ftl"> +import {BasicColumn} from '/@/components/Table'; +import {FormSchema} from '/@/components/Table'; +import { rules} from '/@/utils/helper/validator'; +import { render } from '/@/utils/common/renderUtils'; +import {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types' +import { getWeekMonthQuarterYear } from '/@/utils'; +//列表数据 +export const columns: BasicColumn[] = [ + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + { + title: '${po.filedComment}', + align:"center", + <#if po.sort=='Y'> + sorter: true, + + <#if po.classType=='date'> + dataIndex: '${po.fieldName}', + customRender:({text}) =>{ + text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text); + <#if po.extendParams?exists && po.extendParams.picker?exists> + if(text) { + return getWeekMonthQuarterYear(text)['${po.extendParams.picker}']; + } else { + return text; + } + <#else> + return text; + + }, + <#elseif po.fieldDbType=='Blob'> + dataIndex: '${po.fieldName}String' + <#elseif po.classType=='umeditor'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='pca'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='file'> + dataIndex: '${po.fieldName}', + <#elseif po.classType=='image'> + dataIndex: '${po.fieldName}', + customRender:render.renderImage, + <#elseif po.classType=='switch'> + dataIndex: '${po.fieldName}', +<#assign switch_extend_arr=['Y','N']> +<#if po.dictField?default("")?contains("[")> +<#assign switch_extend_arr=po.dictField?eval> + +<#list switch_extend_arr as a> +<#if a_index == 0> +<#assign switch_extend_arr1=a> +<#else> +<#assign switch_extend_arr2=a> + + + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}]) + }, + <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict' || po.classType=='link_table'> + dataIndex: '${po.fieldName}_dictText' + <#elseif po.classType=='cat_tree'> + dataIndex: '${po.fieldName}', + <#if po.dictText?default("")?trim?length == 0> + customRender:({text}) => { + return render.renderCategoryTree(text,'${po.dictField?default("")}') + }, + <#else> + customRender: ({text, record}) => (text ? record['${po.dictText}'] : '') + + <#else> + dataIndex: '${po.fieldName}' + + }, + + +]; +//查询数据 +export const searchFormSchema: FormSchema[] = [ +<#-- 开始循环 --> +<#list columns as po> +<#if po.fieldDbName=='bpm_status'> + <#assign bpm_flag=true> + +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if po.isQuery=='Y' && po.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#assign query_flag=true> + <#assign query_field_dictCode=""> + <#if po.dictTable?default("")?trim?length gt 1> + <#assign query_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}"> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign query_field_dictCode="${po.dictField}"> + +<#if po.queryMode=='single'> + { + label: "${po.filedComment}", + field: "${po.fieldName}", +<#if po.classType=='sel_search'> + component: 'JSearchSelect', + componentProps:{ + dict:"${query_field_dictCode}" + }, +<#elseif po.classType=='sel_user'> +<#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + component: 'JSelectUser', +<#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, +<#elseif po.classType=='switch'> + component: 'JSwitch', + componentProps:{ + query:true, + <#if po.dictField != 'is_open'> + options:${po.dictField} + + }, + <#elseif po.classType=='sel_depart'> + component: 'JSelectDept', + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType=='list_multi'> + component: 'JSelectMultiple', + componentProps:{ + <#if po.dictTable?default("")?trim?length gt 1> + dictCode:"${po.dictTable},${po.dictText},${po.dictField}", + <#elseif po.dictField?default("")?trim?length gt 1> + dictCode:"${po.dictField}", + + triggerChange: true + }, + <#elseif po.classType=='cat_tree'> + component: 'JCategorySelect', + componentProps:{ + pcode:"${po.dictField?default("")}",//back和事件未添加,暂时有问题 + }, +<#elseif po.classType=='date'> + component: 'DatePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueFormat: 'YYYY-MM-DD' + }, +<#elseif po.classType=='datetime'> + component: 'DatePicker', + componentProps: { + showTime:true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, +<#elseif po.classType=='pca'> + component: 'JAreaLinkage', + componentProps: { + saveCode: 'region', + }, +<#elseif po.classType=='popup'> + <#include "/common/form/vue3popup.ftl"> +<#elseif po.classType=='popup_dict'> + component: 'JPopupDict', + componentProps: { + placeholder: '请选择${po.filedComment}', + dictCode: '${po.dictTable},${po.dictText},${po.dictField}', + multi: ${po.extendParams.popupMulti?c} + }, +<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'> +<#-- ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- --> + component: 'JSelectMultiple', + componentProps:{ + <#if po.dictTable?default("")?trim?length gt 1> + dictCode:"${po.dictTable},${po.dictText},${po.dictField}" + <#elseif po.dictField?default("")?trim?length gt 1> + dictCode:"${po.dictField}" + + }, +<#elseif po.classType == 'sel_tree'> + component: 'JTreeSelect', + componentProps:{ + <#if po.dictText??> + <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> + dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}", + <#elseif po.dictText?split(',')[1]??> + pidField:"${po.dictText?split(',')[1]}", + <#elseif po.dictText?split(',')[3]??> + hasChildField:"${po.dictText?split(',')[3]}", + + + pidValue:"${po.dictField}", + }, +<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'InputNumber', +<#else> + component: 'Input', + + //colProps: {span: 6}, + }, +<#elseif po.queryMode=='like'> + { + label: "${po.filedComment}", + field: "${po.fieldName}", + component: 'JInput', + }, +<#else> + { + label: "${po.filedComment}", + field: "${po.fieldName}", +<#if po.classType=='date'> + component: 'RangePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueType: 'Date', + }, +<#elseif po.classType=='datetime'> + component: 'RangePicker', + componentProps: { + valueType: 'Date', + showTime:true + }, +<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'JRangeNumber', +<#-- update-begin---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> +<#elseif po.classType=='time'> + component: 'RangeTime', +<#-- update-end---author:chenrui ---date:20240527 for:[TV360X-388]时间范围查询控件---------- --> +<#else> + component: 'Input', //TODO 范围查询 + + //colProps: {span: 6}, + }, + + + +<#-- 结束循环 --> +]; +//表单数据 +export const formSchema: FormSchema[] = [ +<#assign form_cat_tree = false> +<#assign form_cat_back = ""> +<#assign bpm_flag=false> +<#assign id_exists = false> +<#list columns as po><#rt/> +<#if po.fieldDbName=='bpm_status'> + <#assign bpm_flag=true> + +<#if po.fieldDbName == 'id'> + <#assign id_exists = true> + +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if po.isShow =='Y' && po.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#assign form_field_dictCode=""> + <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}"> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictField}"> + + { + label: '${po.filedComment}', + field: ${autoStringSuffix(po)}, +<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.defaultVal??> + <#if po.fieldDbType=="BigDecimal" || po.fieldDbType=="double" || po.fieldDbType=="int"> + defaultValue: ${po.defaultVal}, + <#else> + defaultValue: "${po.defaultVal}", + + +<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.classType =='date'> + component: 'DatePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueFormat: 'YYYY-MM-DD' + }, + <#elseif po.classType =='datetime'> + component: 'DatePicker', + componentProps: { + showTime:true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, + <#elseif po.classType =='time'> + component: 'TimePicker', + componentProps: { + valueFormat: 'HH:mm:ss' + }, + <#elseif po.classType =='popup'> + <#include "/common/form/vue3popup.ftl"> + <#elseif po.classType=='popup_dict'> + component: 'JPopupDict', + componentProps: { + placeholder: '请选择${po.filedComment}', + dictCode: '${po.dictTable},${po.dictText},${po.dictField}', + multi: ${po.extendParams.popupMulti?c} + }, + <#elseif po.classType =='sel_depart'> + component: 'JSelectDept', + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType =='switch'> + component: 'JSwitch', + componentProps:{ + <#if po.dictField != 'is_open'> + options:${po.dictField} + + }, + <#elseif po.classType =='pca'> + component: 'JAreaLinkage', + componentProps: { + saveCode: 'region', + }, + <#elseif po.classType =='markdown'> + component: 'JMarkdownEditor',//注意string转换问题 + <#elseif po.classType =='password'> + component: 'InputPassword', + <#elseif po.classType =='sel_user'> +<#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + component: 'JSelectUser', +<#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType =='textarea'> + component: 'InputTextArea', + <#elseif po.classType=='list'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#elseif po.classType=='radio'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + type: "radio", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='list_multi'> + component: 'JSelectMultiple', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#elseif po.classType=='checkbox'> + component: 'JCheckbox', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='sel_search'> + component: 'JSearchSelect', + componentProps:{ + dict:"${form_field_dictCode}" + }, +<#elseif po.classType=='cat_tree'> + <#assign form_cat_tree = true> + component: 'JCategorySelect', + componentProps:{ + pcode:"${po.dictField?default("")}", //TODO back和事件未添加,暂时有问题 + }, + <#if po.dictText?default("")?trim?length gt 1> + <#assign form_cat_back = "${po.dictText}"> + + <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'InputNumber', + <#elseif po.classType=='file'> + component: 'JUpload', + componentProps:{ + <#if po.uploadnum??> + maxCount:${po.uploadnum} + + }, + <#elseif po.classType=='image'> + component: 'JImageUpload', + componentProps:{ + <#if po.uploadnum??> + fileMax:${po.uploadnum} + <#else> + fileMax: 0 + + }, + <#elseif po.classType=='umeditor'> + component: 'JEditor', + <#elseif po.classType == 'sel_tree'> + component: 'JTreeSelect', + componentProps:{ + <#if po.dictText??> + <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> + dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}", + <#elseif po.dictText?split(',')[1]??> + pidField:"${po.dictText?split(',')[1]}", + <#elseif po.dictText?split(',')[3]??> + hasChildField:"${po.dictText?split(',')[3]}", + + + pidValue:"${po.dictField}", + }, + <#elseif po.classType=='link_table'> + component: 'JLinkTableCard', + componentProps: { + valueField: '${po.dictField}', + textField: '${po.dictText}', + tableName: '${po.dictTable}', + multi: <#if (po.queryMode!"") == "multi">true<#else>false + }, + <#else> + component: 'Input', + + <#include "/common/utils.ftl"> + <#if po.isShow == 'Y' && poHasCheck(po)> + dynamicRules: ({model,schema}) => { + <#if po.fieldName != 'id'> + <#assign fieldValidType = po.fieldValidType!''> + return [ + <#-- 非空校验 --> + <#if po.nullable == 'N' || fieldValidType == '*'> + { required: true, message: '请输入${po.filedComment}!'}, + <#elseif fieldValidType!=''> + { required: false}, + + <#-- 唯一校验 --> + <#if fieldValidType == 'only'> + {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}', '${po.fieldDbName}',model,schema)[0]}, + <#-- 6到16位数字 --> + <#elseif fieldValidType == 'n6-16'> + { pattern: /^\d{6,16}$|^(?=\d+\.\d+)[\d.]{7,17}$/, message: '请输入6到16位数字!'}, + <#-- 6到16位任意字符 --> + <#elseif fieldValidType == '*6-16'> + { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'}, + <#-- 6到18位字母 --> + <#elseif fieldValidType == 's6-18'> + { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'}, + <#-- 网址 --> + <#elseif fieldValidType == 'url'> + { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'}, + <#-- 电子邮件 --> + <#elseif fieldValidType == 'e'> + { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'}, + <#-- 手机号码 --> + <#elseif fieldValidType == 'm'> + { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'}, + <#-- 邮政编码 --> + <#elseif fieldValidType == 'p'> + { pattern: /^[0-9]\d{5}$/, message: '请输入正确的邮政编码!'}, + <#-- 字母 --> + <#elseif fieldValidType == 's'> + { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'}, + <#-- 数字 --> + <#elseif fieldValidType == 'n'> + { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'}, + <#-- 整数 --> + <#elseif fieldValidType == 'z'> + { pattern: /^-?\d+$/, message: '请输入整数!'}, + <#-- 金额 --> + <#elseif fieldValidType == 'money'> + { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'}, + <#-- 正则校验 --> + <#elseif fieldValidType != '' && fieldValidType != '*'> + { pattern: '${fieldValidType}', message: '不符合校验规则!'}, + <#-- 无校验 --> + <#else> + <#t> + + ]; + + }, + + <#if po.readonly=='Y'> + dynamicDisabled:true + + }, + + +<#if id_exists == false> + // TODO 主键隐藏字段,目前写死为ID + { + label: '', + field: 'id', + component: 'Input', + show: false + }, + +]; +//子表单数据 +<#list subTables as sub> +<#if sub.foreignRelationType =='1'> +export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [ +<#assign form_cat_tree = false> +<#assign form_cat_back = ""> +<#assign bpm_flag=false> +<#assign sub_id_exists = false> +<#list sub.colums as po><#rt/> +<#if po.fieldDbName=='bpm_status'> + <#assign bpm_flag=true> + +<#if po.fieldDbName == 'id'> + <#assign sub_id_exists = true> + +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if po.isShow =='Y' && po.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#assign form_field_dictCode=""> + <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}"> + <#elseif po.dictField?default("")?trim?length gt 1> + <#assign form_field_dictCode="${po.dictField}"> + + { + label: '${po.filedComment}', + field: ${autoStringSuffix(po)}, +<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.defaultVal??> + <#if po.fieldDbType=="BigDecimal" || po.fieldDbType=="double" || po.fieldDbType=="int"> + defaultValue: ${po.defaultVal}, + <#else> + defaultValue: "${po.defaultVal}", + + +<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 --> + <#if po.classType =='date'> + component: 'DatePicker', + componentProps: { + <#if po.extendParams?exists && po.extendParams.picker?exists> + picker: '${po.extendParams.picker}', + + valueFormat: 'YYYY-MM-DD' + }, + <#elseif po.classType =='datetime'> + component: 'DatePicker', + componentProps: { + showTime:true, + valueFormat: 'YYYY-MM-DD HH:mm:ss' + }, + <#elseif po.classType =='time'> + component: 'TimePicker', + componentProps: { + valueFormat: 'HH:mm:ss' + }, + <#elseif po.classType =='popup'> + <#include "/common/form/vue3popup.ftl"> + <#elseif po.classType=='popup_dict'> + component: 'JPopupDict', + componentProps: { + placeholder: '请选择${po.filedComment}', + dictCode: '${po.dictTable},${po.dictText},${po.dictField}', + multi: ${po.extendParams.popupMulti?c} + }, + <#elseif po.classType =='sel_depart'> + component: 'JSelectDept', + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType =='switch'> + component: 'JSwitch', + componentProps:{ + <#if po.dictField != 'is_open'> + options:${po.dictField} + + }, + <#elseif po.classType =='pca'> + component: 'JAreaLinkage', + componentProps: { + saveCode: 'region', + }, + <#elseif po.classType =='markdown'> + component: 'JMarkdownEditor',//注意string转换问题 + <#elseif po.classType =='password'> + component: 'InputPassword', + <#elseif po.classType =='sel_user'> +<#-- update-begin---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + component: 'JSelectUser', +<#-- update-end---author:chenrui ---date:20240102 for:[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- --> + componentProps:{ + <#if po.extendParams?exists && po.extendParams.text?exists> + labelKey: '${po.extendParams.text}', + + <#if po.extendParams?exists && po.extendParams.store?exists> + rowKey: '${po.extendParams.store}', + + }, + <#elseif po.classType =='textarea'> + component: 'InputTextArea', + <#elseif po.classType=='list'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#elseif po.classType=='radio'> + component: 'JDictSelectTag', + componentProps:{ + dictCode:"${form_field_dictCode}", + type: "radio", + <#if po.fieldDbType=='int'> + stringToNumber: true + + }, + <#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- --> + <#elseif po.classType=='list_multi'> + component: 'JSelectMultiple', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#elseif po.classType=='checkbox'> + component: 'JCheckbox', + componentProps:{ + dictCode:"${form_field_dictCode}" + }, + <#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选----------- --> + <#elseif po.classType=='sel_search'> + component: 'JSearchSelect', + componentProps:{ + dict:"${form_field_dictCode}" + }, +<#elseif po.classType=='cat_tree'> + <#assign form_cat_tree = true> + component: 'JCategorySelect', + componentProps:{ + pcode:"${po.dictField?default("")}", //TODO back和事件未添加,暂时有问题 + }, + <#if po.dictText?default("")?trim?length gt 1> + <#assign form_cat_back = "${po.dictText}"> + + <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'> + component: 'InputNumber', + <#elseif po.classType=='file'> + component: 'JUpload', + componentProps:{ + <#if po.uploadnum??> + maxCount:${po.uploadnum} + + }, + <#elseif po.classType=='image'> + component: 'JImageUpload', + componentProps:{ + <#if po.uploadnum??> + fileMax:${po.uploadnum} + <#else> + fileMax: 0 + + }, + <#elseif po.classType=='umeditor'> + component: 'JEditor', + <#elseif po.classType == 'sel_tree'> + component: 'JTreeSelect', + componentProps:{ + <#if po.dictText??> + <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??> + dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}", + <#elseif po.dictText?split(',')[1]??> + pidField:"${po.dictText?split(',')[1]}", + <#elseif po.dictText?split(',')[3]??> + hasChildField:"${po.dictText?split(',')[3]}", + + + pidValue:"${po.dictField}", + }, + <#elseif po.classType=='link_table'> + component: 'JLinkTableCard', + componentProps: { + valueField: '${po.dictField}', + textField: '${po.dictText}', + tableName: '${po.dictTable}', + multi: <#if (po.queryMode!"") == "multi">true<#else>false + }, + <#else> + component: 'Input', + + <#include "/common/utils.ftl"> + <#if po.isShow == 'Y' && poHasCheck(po)> + dynamicRules: ({model,schema}) => { + <#if po.fieldName != 'id'> + <#assign fieldValidType = po.fieldValidType!''> + return [ + <#-- 非空校验 --> + <#if po.nullable == 'N' || fieldValidType == '*'> + { required: true, message: '请输入${po.filedComment}!'}, + <#elseif fieldValidType!=''> + { required: false}, + + <#-- 唯一校验 --> + <#if fieldValidType == 'only'> + {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}', '${po.fieldDbName}',model,schema)[0]}, + <#-- 6到16位数字 --> + <#elseif fieldValidType == 'n6-16'> + { pattern: /^\d{6,16}$|^(?=\d+\.\d+)[\d.]{7,17}$/, message: '请输入6到16位数字!'}, + <#-- 6到16位任意字符 --> + <#elseif fieldValidType == '*6-16'> + { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'}, + <#-- 6到18位字母 --> + <#elseif fieldValidType == 's6-18'> + { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'}, + <#-- 网址 --> + <#elseif fieldValidType == 'url'> + { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'}, + <#-- 电子邮件 --> + <#elseif fieldValidType == 'e'> + { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'}, + <#-- 手机号码 --> + <#elseif fieldValidType == 'm'> + { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'}, + <#-- 邮政编码 --> + <#elseif fieldValidType == 'p'> + { pattern: /^[0-9]\d{5}$/, message: '请输入正确的邮政编码!'}, + <#-- 字母 --> + <#elseif fieldValidType == 's'> + { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'}, + <#-- 数字 --> + <#elseif fieldValidType == 'n'> + { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'}, + <#-- 整数 --> + <#elseif fieldValidType == 'z'> + { pattern: /^-?\d+$/, message: '请输入整数!'}, + <#-- 金额 --> + <#elseif fieldValidType == 'money'> + { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'}, + <#-- 正则校验 --> + <#elseif fieldValidType != '' && fieldValidType != '*'> + { pattern: '${fieldValidType}', message: '不符合校验规则!'}, + <#-- 无校验 --> + <#else> + <#t> + + ]; + + }, + + <#if po.readonly=='Y'> + dynamicDisabled:true + + }, + + +<#if sub_id_exists == false> + { + label: '', + field: 'id', + component: 'Input', + show: false + }, + +]; + + +//子表表格配置 +<#list subTables as sub> +<#if sub.foreignRelationType =='0'> +export const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [ +<#assign popupBackFields = ""> + +<#-- 循环子表的列 开始 --> +<#list sub.colums as col><#rt/> +<#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if col.isShow =='Y' && col.fieldName !='delFlag'> +<#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> +<#if col.filedComment !='外键' > + { + title: '${col.filedComment}', + key: '${autoStringSuffixForModel(col)}', +<#if col.classType =='date'> + type: JVxeTypes.date, + <#if col.extendParams?exists && col.extendParams.picker?exists> + picker: '${col.extendParams.picker}', + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='datetime'> + type: JVxeTypes.datetime, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='time'> + type: JVxeTypes.time, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='textarea'> + type: JVxeTypes.textarea, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='list' || col.classType =='radio'> + type: JVxeTypes.select, + options:[], + <#if col.dictTable?default("")?trim?length gt 1> + dictCode:"${col.dictTable},${col.dictText},${col.dictField}", + <#else> + dictCode:"${col.dictField}", + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='list_multi' || col.classType =='checkbox'> + type: JVxeTypes.selectMultiple, + options:[], + <#if col.dictTable?default("")?trim?length gt 1> + dictCode:"${col.dictTable},${col.dictText},${col.dictField}", + <#else> + dictCode:"${col.dictField}", + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='sel_search'> + type: JVxeTypes.selectSearch, + <#if col.dictTable?default("")?trim?length gt 1> + dictCode:"${col.dictTable},${col.dictText},${col.dictField}", + <#else> + dictCode:"${col.dictField}", + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='sel_depart'> + type: JVxeTypes.departSelect, + props:{ + <#if col.extendParams?exists && col.extendParams.text?exists> + labelKey: '${col.extendParams.text}', + + <#if col.extendParams?exists && col.extendParams.store?exists> + rowKey: '${col.extendParams.store}', + + }, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='sel_user'> + type: JVxeTypes.userSelect, + props:{ + <#if col.extendParams?exists && col.extendParams.text?exists> + labelKey: '${col.extendParams.text}', + + <#if col.extendParams?exists && col.extendParams.store?exists> + rowKey: '${col.extendParams.store}', + + }, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='image'> + type: JVxeTypes.image, + token:true, + responseName:"message", + <#if col.readonly=='Y'> + disabled:true, + + <#if col.uploadnum??> + number: ${col.uploadnum}, + +<#elseif col.classType =='file'> + type: JVxeTypes.file, + token:true, + responseName:"message", + <#if col.readonly=='Y'> + disabled:true, + + <#if col.uploadnum??> + number: ${col.uploadnum}, + +<#elseif col.classType =='switch'> + type: JVxeTypes.checkbox, + <#if col.dictField == 'is_open'> + customValue: ['Y', 'N'], + <#else> + customValue: ${col.dictField}, + + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType=='pca'> + type: JVxeTypes.pca, + <#if col.readonly=='Y'> + disabled:true, + +<#elseif col.classType =='popup'> +<#if popupBackFields?length gt 0> + <#assign popupBackFields = "${popupBackFields}"+","+"${col.dictText}"> +<#else> + <#assign popupBackFields = "${col.dictText}"> + + <#include "/common/form/vue3Jvxepopup.ftl"> +<#-- update-begin-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对,数字或者金额类型 --> +<#-- elseif "int,decimal,double,"?contains(col.classType) --> +<#elseif col.fieldDbType=='int' || col.fieldDbType=='long' || col.fieldDbType=='double' || col.fieldDbType=='BigDecimal'> +<#-- update-end-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对,数字或者金额类型 --> + type: JVxeTypes.inputNumber, + <#if col.readonly=='Y'> + disabled:true, + +<#else> + type: JVxeTypes.input, + <#if col.readonly=='Y'> + disabled:true, + + +<#if col.classType =='list_multi' || col.classType =='checkbox'> + width:"250px", +<#else> + width:"200px", + +<#if col.classType =='file'> + placeholder: '请选择文件', +<#else> + placeholder: '请输入${'$'}{title}', + +<#if col.defaultVal??> +<#if col.fieldDbType=="BigDecimal" || col.fieldDbType=="double" || col.fieldDbType=="int"> + defaultValue:${col.defaultVal}, + <#else> + defaultValue:"${col.defaultVal}", + +<#else> + defaultValue:'', + +<#-- 子表的校验 --> + <#include "/common/validatorRulesTemplate/sub-vue3.ftl"> + }, + + + +<#-- 循环子表的列 结束 --> + ] + + + +<#-- update-begin---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> +// 高级查询数据 +export const superQuerySchema = { + <#list columns as po> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + ${superQueryFieldListForVue3(po,po_index)}, + + + //子表高级查询 + <#list subTables as sub> + ${sub.entityName?uncap_first}: { + title: '${sub.ftlDescription}', + view: 'table', + fields: { + <#list sub.colums as subCol> + <#-- update-begin---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + <#if subCol.isShowList =='Y' && subCol.fieldName !='id' && subCol.fieldName !='delFlag'> + <#-- update-end---author:chenrui ---date:20240108 for:[issues/5755]vue代码不加入逻辑删除字段---------- --> + ${superQueryFieldListForVue3(subCol,subCol_index)}, + + + } + }, + +}; +<#-- update-end---author:chenrui ---date:20231228 for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- --> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql new file mode 100644 index 00000000..5396d5d5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql @@ -0,0 +1 @@ +<#include "/common/sql/menu_insert.ftl"> \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei new file mode 100644 index 00000000..b3080bd5 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei @@ -0,0 +1,251 @@ +<#include "/common/utils.ftl"> + + + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei new file mode 100644 index 00000000..34a5ac15 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei @@ -0,0 +1,366 @@ +<#include "/common/utils.ftl"> + + + + + + + \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei new file mode 100644 index 00000000..c02ad27e --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/config/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei @@ -0,0 +1,87 @@ +<#include "/common/utils.ftl"> +<#list subTables as sub> +<#if sub.foreignRelationType=='1'> +#segment#${sub.entityName}Form.vue + + + + + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.2_171__mes_xsl_formula_spec_line_decimal3.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.2_171__mes_xsl_formula_spec_line_decimal3.sql new file mode 100644 index 00000000..a8e3a440 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.2_171__mes_xsl_formula_spec_line_decimal3.sql @@ -0,0 +1,12 @@ +-- 配合示方明细:重量%、体积统一为三位小数 +ALTER TABLE `mes_xsl_formula_spec_line` + MODIFY COLUMN `weight_percent` decimal(18,3) DEFAULT NULL COMMENT '重量%', + MODIFY COLUMN `volume` decimal(18,3) DEFAULT NULL COMMENT '体积'; + +UPDATE `mes_xsl_formula_spec_line` +SET `weight_percent` = ROUND(`weight_percent`, 3) +WHERE `weight_percent` IS NOT NULL; + +UPDATE `mes_xsl_formula_spec_line` +SET `volume` = ROUND(`volume`, 3) +WHERE `volume` IS NOT NULL; diff --git a/jeecgboot-vue3/src/hooks/web/useWebSocket.ts b/jeecgboot-vue3/src/hooks/web/useWebSocket.ts index 91c6cd6c..c2be2e04 100644 --- a/jeecgboot-vue3/src/hooks/web/useWebSocket.ts +++ b/jeecgboot-vue3/src/hooks/web/useWebSocket.ts @@ -48,9 +48,12 @@ export function ensureWebSocketConnected(): void { if (!url) { return; } - if (result?.status?.value === 'OPEN' && connectedUrl === url) { + //update-begin---author:jiangxh ---date:20260729 for:【WebSocket】已连接/连接中则复用,避免重复建连----------- + const status = result?.status?.value; + if (connectedUrl === url && (status === 'OPEN' || status === 'CONNECTING')) { return; } + //update-end---author:jiangxh ---date:20260729 for:【WebSocket】已连接/连接中则复用,避免重复建连----------- connectWebSocket(url); } @@ -59,20 +62,34 @@ export function ensureWebSocketConnected(): void { * @param url */ export function connectWebSocket(url: string) { + //update-begin---author:jiangxh ---date:20260729 for:【WebSocket】单例连接:关闭旧实例后再建,防止多路 autoReconnect 互踢----------- + const status = result?.status?.value; + if (connectedUrl === url && (status === 'OPEN' || status === 'CONNECTING')) { + return; + } + try { + result?.close?.(); + } catch { + // ignore + } connectedUrl = url; + //update-end---author:jiangxh ---date:20260729 for:【WebSocket】单例连接:关闭旧实例后再建,防止多路 autoReconnect 互踢----------- // 代码逻辑说明: v2.4.6 的 websocket 服务端,存在性能和安全问题。 #3278 const token = (getToken() || '') as string; result = useWebSocket(url, { // 自动重连 (遇到错误最多重复连接10次) autoReconnect: { - retries : 10, - delay : 5000 + retries: 10, + delay: 5000, }, - // 心跳检测 + // 心跳检测:服务端同连接直接回 ping;pongTimeout 需大于网络抖动 + //update-begin---author:jiangxh ---date:20260729 for:【WebSocket】稳定心跳参数,避免 pong 超时频繁断线----------- heartbeat: { - message: "ping", - interval: 55000 + message: 'ping', + interval: 30000, + pongTimeout: 20000, }, + //update-end---author:jiangxh ---date:20260729 for:【WebSocket】稳定心跳参数,避免 pong 超时频繁断线----------- protocols: [token], // 代码逻辑说明: [issues/6662] 演示系统socket总断,换一个写法 onConnected: function (ws) { @@ -81,7 +98,11 @@ export function connectWebSocket(url: string) { //update-begin---author:xsl ---date:20260528 for:【IM聊天】WS 重连后通知监听方重新拉取消息----------- if (wsConnectionCount > 1) { reconnectListeners.forEach((cb) => { - try { cb(); } catch (err) { console.error(err); } + try { + cb(); + } catch (err) { + console.error(err); + } }); } //update-end---author:xsl ---date:20260528 for:【IM聊天】WS 重连后通知监听方重新拉取消息----------- @@ -112,54 +133,8 @@ export function connectWebSocket(url: string) { } }, }); - // if (result) { - // result.open = onOpen; - // result.close = onClose; - - // const ws = unref(result.ws); - // if(ws!=null){ - // ws.onerror = onError; - // ws.onmessage = onMessage; - // ws.onopen = onOpen; - // ws.onclose = onClose; - // - // } - // } } -function onOpen() { - console.log('[WebSocket] 连接成功'); -} - -function onClose(e) { - console.log('[WebSocket] 连接断开:', e); -} - -function onError(e) { - console.log('[WebSocket] 连接发生错误: ', e); -} - -function onMessage(e) { - console.debug('[WebSocket] -----接收消息-------', e.data); - try { - // 代码逻辑说明: 【issues/1161】前端websocket因心跳导致监听不起作用--- - if(e==='ping'){ - return; - } - const data = JSON.parse(e.data); - for (const callback of listeners.keys()) { - try { - callback(data); - } catch (err) { - console.error(err); - } - } - } catch (err) { - console.error('[WebSocket] data解析失败:', err); - } -} - - /** * 添加 WebSocket 消息监听 * @param callback diff --git a/jeecgboot-vue3/src/utils/http/axios/index.ts b/jeecgboot-vue3/src/utils/http/axios/index.ts index 757affcb..6c75f6b1 100644 --- a/jeecgboot-vue3/src/utils/http/axios/index.ts +++ b/jeecgboot-vue3/src/utils/http/axios/index.ts @@ -293,7 +293,9 @@ function createAxios(opt?: Partial) { // authenticationScheme: 'Bearer', authenticationScheme: '', //接口超时设置 - timeout: 10 * 1000, + //update-begin---author:jiangxh ---date:20260729 for:【HTTP】远程库场景默认超时10s过短,调整为60s----------- + timeout: 60 * 1000, + //update-end---author:jiangxh ---date:20260729 for:【HTTP】远程库场景默认超时10s过短,调整为60s----------- // 基础接口地址 // baseURL: globSetting.apiUrl, headers: { 'Content-Type': ContentTypeEnum.JSON }, diff --git a/jeecgboot-vue3/src/views/mes/material/MesMaterial.api.ts b/jeecgboot-vue3/src/views/mes/material/MesMaterial.api.ts index 256b2c9e..073728b8 100644 --- a/jeecgboot-vue3/src/views/mes/material/MesMaterial.api.ts +++ b/jeecgboot-vue3/src/views/mes/material/MesMaterial.api.ts @@ -10,6 +10,8 @@ enum Api { importExcel = '/mes/material/material/importExcel', exportXls = '/mes/material/material/exportXls', queryById = '/mes/material/material/queryById', + checkMaterialCode = '/mes/material/material/checkMaterialCode', + checkMaterialName = '/mes/material/material/checkMaterialName', } export const getExportUrl = Api.exportXls; @@ -17,6 +19,12 @@ export const getImportUrl = Api.importExcel; export const list = (params) => defHttp.get({ url: Api.list, params }); export const queryById = (params) => defHttp.get({ url: Api.queryById, params }, { successMessageMode: 'none' }); +export const checkMaterialCode = (params: { materialCode: string; dataId?: string }) => + defHttp.get({ url: Api.checkMaterialCode, params }, { successMessageMode: 'none', errorMessageMode: 'none' }); + +export const checkMaterialName = (params: { materialName: string; dataId?: string }) => + defHttp.get({ url: Api.checkMaterialName, params }, { successMessageMode: 'none', errorMessageMode: 'none' }); + export const deleteOne = (params, handleSuccess) => defHttp.delete({ url: Api.deleteOne, params }, { joinParamsToUrl: true }).then(() => handleSuccess()); diff --git a/jeecgboot-vue3/src/views/mes/material/MesMaterial.data.ts b/jeecgboot-vue3/src/views/mes/material/MesMaterial.data.ts index 8e862af3..71952304 100644 --- a/jeecgboot-vue3/src/views/mes/material/MesMaterial.data.ts +++ b/jeecgboot-vue3/src/views/mes/material/MesMaterial.data.ts @@ -1,5 +1,6 @@ import { BasicColumn, FormSchema } from '/@/components/Table'; import { loadTreeData } from '/@/api/common/api'; +import { checkMaterialName } from './MesMaterial.api'; function useStatusText(v: unknown) { if (v === 1) return '使用中'; @@ -32,6 +33,7 @@ const glueCategoryProps = { placeholder: '请选择胶料类别', }; +//update-begin---author:jiangxh ---date:20260729 for:【胶料】列表/表单去掉胶料编码展示----------- export const columns: BasicColumn[] = [ { title: '胶料名称', align: 'center', width: 160, dataIndex: 'materialName' }, { title: '胶料类别', align: 'center', width: 140, dataIndex: 'categoryId_dictText' }, @@ -92,7 +94,32 @@ export const searchFormSchema: FormSchema[] = [ export const formSchema: FormSchema[] = [ { label: '', field: 'id', component: 'Input', show: false }, - { label: '胶料名称', field: 'materialName', component: 'Input', required: true }, + //update-begin---author:jiangxh ---date:20260730 for:【胶料】编号隐藏,保存由后端按名称回填----------- + // 列表/表单均不展示;新增编辑保存后后端将 materialCode = materialName + { label: '', field: 'materialCode', component: 'Input', show: false }, + //update-end---author:jiangxh ---date:20260730 for:【胶料】编号隐藏,保存由后端按名称回填----------- + { + label: '胶料名称', + field: 'materialName', + component: 'Input', + required: true, + dynamicRules: ({ model }) => [ + { required: true, message: '请输入胶料名称' }, + { + validator: async (_rule, value) => { + const v = value == null ? '' : String(value).trim(); + if (!v) return Promise.resolve(); + try { + await checkMaterialName({ materialName: v, dataId: model?.id }); + return Promise.resolve(); + } catch (e: any) { + return Promise.reject(e?.response?.data?.message || e?.message || '胶料名称不能重复'); + } + }, + trigger: 'blur', + }, + ], + }, { label: '胶料类别', field: 'categoryId', @@ -141,3 +168,4 @@ export const formSchema: FormSchema[] = [ componentProps: { options: specialRubberOptions }, }, ]; +//update-end---author:jiangxh ---date:20260729 for:【胶料】列表/表单去掉胶料编码展示----------- diff --git a/jeecgboot-vue3/src/views/mes/material/MesMaterialList.vue b/jeecgboot-vue3/src/views/mes/material/MesMaterialList.vue index b6c74ff3..875031d1 100644 --- a/jeecgboot-vue3/src/views/mes/material/MesMaterialList.vue +++ b/jeecgboot-vue3/src/views/mes/material/MesMaterialList.vue @@ -29,6 +29,7 @@ import { useListPage } from '/@/hooks/system/useListPage'; import MesMaterialModal from './modules/MesMaterialModal.vue'; import { columns, searchFormSchema } from './MesMaterial.data'; import { batchDelete, deleteOne, getExportUrl, getImportUrl, list } from './MesMaterial.api'; +import { applyJeecgLikeQuery, RUBBER_MATERIAL_LIKE_FIELDS } from './materialQuery.util'; const [registerModal, { openModal }] = useModal(); const { tableContext, onExportXls, onImportXls } = useListPage({ @@ -39,6 +40,7 @@ const { tableContext, onExportXls, onImportXls } = useListPage({ canResize: true, formConfig: { labelWidth: 120, schemas: searchFormSchema, autoSubmitOnEnter: true, showAdvancedButton: true }, actionColumn: { width: 120 }, + beforeFetch: (params) => applyJeecgLikeQuery(params, RUBBER_MATERIAL_LIKE_FIELDS), }, exportConfig: { name: '胶料信息', url: getExportUrl }, importConfig: { url: getImportUrl, success: handleSuccess }, diff --git a/jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.api.ts b/jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.api.ts index 811931a2..151a17dd 100644 --- a/jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.api.ts +++ b/jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.api.ts @@ -4,6 +4,8 @@ import { Modal } from 'ant-design-vue'; enum Api { list = '/mes/material/mixerMaterial/list', queryById = '/mes/material/mixerMaterial/queryById', + checkMaterialCode = '/mes/material/mixerMaterial/checkMaterialCode', + checkMaterialName = '/mes/material/mixerMaterial/checkMaterialName', save = '/mes/material/mixerMaterial/add', edit = '/mes/material/mixerMaterial/edit', deleteOne = '/mes/material/mixerMaterial/delete', @@ -17,6 +19,12 @@ export const getImportUrl = Api.importExcel; export const list = (params) => defHttp.get({ url: Api.list, params }); export const queryById = (params) => defHttp.get({ url: Api.queryById, params }); +export const checkMaterialCode = (params: { materialCode: string; dataId?: string }) => + defHttp.get({ url: Api.checkMaterialCode, params }, { successMessageMode: 'none', errorMessageMode: 'none' }); + +export const checkMaterialName = (params: { materialName: string; dataId?: string }) => + defHttp.get({ url: Api.checkMaterialName, params }, { successMessageMode: 'none', errorMessageMode: 'none' }); + export const deleteOne = (params, handleSuccess) => defHttp.delete({ url: Api.deleteOne, params }, { joinParamsToUrl: true }).then(() => handleSuccess()); diff --git a/jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.data.ts b/jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.data.ts index 36770bd3..a5bb269c 100644 --- a/jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.data.ts +++ b/jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.data.ts @@ -1,5 +1,6 @@ import { BasicColumn, FormSchema } from '/@/components/Table'; import { loadTreeData } from '/@/api/common/api'; +import { checkMaterialCode, checkMaterialName } from './MesMixerMaterial.api'; function feedManageStatusText(v: unknown) { if (v === 1) return '在投管'; @@ -93,8 +94,50 @@ const useStatusOptions = [ export const formSchema: FormSchema[] = [ { label: '', field: 'id', component: 'Input', show: false }, - { label: '物料编码', field: 'materialCode', component: 'Input', required: true }, - { label: '物料名称', field: 'materialName', component: 'Input', required: true }, + { + label: '物料编码', + field: 'materialCode', + component: 'Input', + required: true, + dynamicRules: ({ model }) => [ + { required: true, message: '请输入物料编码' }, + { + validator: async (_rule, value) => { + const v = value == null ? '' : String(value).trim(); + if (!v) return Promise.resolve(); + try { + await checkMaterialCode({ materialCode: v, dataId: model?.id }); + return Promise.resolve(); + } catch (e: any) { + return Promise.reject(e?.response?.data?.message || e?.message || '物料编码不能重复'); + } + }, + trigger: 'blur', + }, + ], + }, + { + label: '物料名称', + field: 'materialName', + component: 'Input', + required: true, + dynamicRules: ({ model }) => [ + { required: true, message: '请输入物料名称' }, + { + validator: async (_rule, value) => { + const v = value == null ? '' : String(value).trim(); + if (!v) return Promise.resolve(); + try { + await checkMaterialName({ materialName: v, dataId: model?.id }); + return Promise.resolve(); + } catch (e: any) { + return Promise.reject(e?.response?.data?.message || e?.message || '物料名称不能重复'); + } + }, + trigger: 'blur', + }, + ], + }, { label: 'ERP编号', field: 'erpCode', component: 'Input' }, { label: '物料大类', @@ -127,7 +170,9 @@ export const formSchema: FormSchema[] = [ componentProps: { options: useStatusOptions }, }, { label: '比重', field: 'specificGravity', component: 'InputNumber', componentProps: { min: 0, step: 0.001, precision: 6 } }, - { label: '保质期(天)', field: 'shelfLifeDays', component: 'InputNumber', componentProps: { min: 0, precision: 0 } }, + //update-begin---author:jiangxh ---date:20260729 for:【密炼物料】新增默认保质期365天----------- + { label: '保质期(天)', field: 'shelfLifeDays', component: 'InputNumber', defaultValue: 365, componentProps: { min: 0, precision: 0 } }, + //update-end---author:jiangxh ---date:20260729 for:【密炼物料】新增默认保质期365天----------- { label: '最短烘胶时间(分钟)', field: 'minBakeMinutes', component: 'InputNumber', componentProps: { min: 0, precision: 0 } }, { label: '总安全库存KG', diff --git a/jeecgboot-vue3/src/views/mes/material/MesMixerMaterialList.vue b/jeecgboot-vue3/src/views/mes/material/MesMixerMaterialList.vue index 06bb3b0c..888298d2 100644 --- a/jeecgboot-vue3/src/views/mes/material/MesMixerMaterialList.vue +++ b/jeecgboot-vue3/src/views/mes/material/MesMixerMaterialList.vue @@ -77,6 +77,7 @@ import MesMixerMaterialModal from './modules/MesMixerMaterialModal.vue'; import MesMixerMaterialSysCategoryModal from './modules/MesMixerMaterialSysCategoryModal.vue'; import { columns, searchFormSchema } from './MesMixerMaterial.data'; import { batchDelete, deleteOne, getExportUrl, getImportUrl, list } from './MesMixerMaterial.api'; +import { applyJeecgLikeQuery, MIXER_MATERIAL_LIKE_FIELDS } from './materialQuery.util'; import { loadTreeData as loadCategoryTreeRoot } from '/@/views/system/category/category.api'; import type { KeyType } from '/@/components/Tree/src/types/tree'; import { deleteMaterialSysCategory, fetchMaterialCategoryRoot } from './MesMixerMaterialSysCategory.api'; @@ -119,7 +120,10 @@ const { tableContext, onExportXls, onImportXls } = useListPage({ canResize: true, formConfig: { labelWidth: 120, schemas: searchFormSchema, autoSubmitOnEnter: true, showAdvancedButton: true }, actionColumn: { width: 120 }, - beforeFetch: (params) => Object.assign(params, queryParam), + beforeFetch: (params) => { + Object.assign(params, queryParam); + return applyJeecgLikeQuery(params, MIXER_MATERIAL_LIKE_FIELDS); + }, }, exportConfig: { name: '密炼物料信息', url: getExportUrl, params: queryParam }, importConfig: { url: getImportUrl, success: handleSuccess }, diff --git a/jeecgboot-vue3/src/views/mes/material/materialQuery.util.ts b/jeecgboot-vue3/src/views/mes/material/materialQuery.util.ts new file mode 100644 index 00000000..0b788e86 --- /dev/null +++ b/jeecgboot-vue3/src/views/mes/material/materialQuery.util.ts @@ -0,0 +1,52 @@ +/** + * Jeecg QueryGenerator 模糊查询工具: + * - 普通字段:值两侧加 * 转为 LIKE + * - 关键字多字段 OR:走 superQueryParams + */ + +/** 给指定字符串查询字段追加 *value*(已含 * 则不重复处理) */ +export function applyJeecgLikeQuery(params: Recordable, fields: string[]): Recordable { + if (!params || !fields?.length) { + return params; + } + for (const field of fields) { + const raw = params[field]; + if (raw == null || raw === '') { + continue; + } + const text = String(raw).trim(); + if (!text || text.includes('*')) { + continue; + } + params[field] = `*${text}*`; + } + return params; +} + +/** 构造多字段 OR 模糊高级查询参数 */ +export function buildOrLikeSuperQuery(fields: string[], keyword: string): { + superQueryMatchType: string; + superQueryParams: string; +} | null { + const kw = keyword?.trim(); + if (!kw || !fields?.length) { + return null; + } + const conditions = fields.map((field) => ({ + field, + rule: 'like', + val: kw, + })); + return { + superQueryMatchType: 'or', + superQueryParams: encodeURI(JSON.stringify(conditions)), + }; +} + +/** 密炼物料文本查询字段 */ +export const MIXER_MATERIAL_LIKE_FIELDS = ['materialCode', 'materialName', 'erpCode', 'materialDesc', 'aliasName']; + +/** 胶料文本查询字段(已去掉胶料编码) */ +//update-begin---author:jiangxh ---date:20260729 for:【选料弹窗】胶料关键字查询去掉编码----------- +export const RUBBER_MATERIAL_LIKE_FIELDS = ['materialName', 'erpCode', 'aliasName', 'shortName']; +//update-end---author:jiangxh ---date:20260729 for:【选料弹窗】胶料关键字查询去掉编码----------- diff --git a/jeecgboot-vue3/src/views/mes/material/modules/MesMaterialSelectModal.vue b/jeecgboot-vue3/src/views/mes/material/modules/MesMaterialSelectModal.vue index 57e9660d..68c7a9ef 100644 --- a/jeecgboot-vue3/src/views/mes/material/modules/MesMaterialSelectModal.vue +++ b/jeecgboot-vue3/src/views/mes/material/modules/MesMaterialSelectModal.vue @@ -10,6 +10,7 @@ import { BasicTable, useTable } from '/@/components/Table'; import { list as materialList, queryById as queryMaterialById } from '../MesMaterial.api'; import { columns as materialColumns, searchFormSchema as materialSearch } from '../MesMaterial.data'; + import { applyJeecgLikeQuery, RUBBER_MATERIAL_LIKE_FIELDS } from '../materialQuery.util'; import { useMessage } from '/@/hooks/web/useMessage'; const emit = defineEmits(['register', 'select']); @@ -21,7 +22,9 @@ const [registerTable, { reload, getSelectRowKeys, getSelectRows, setSelectedRowKeys, clearSelectedRowKeys }] = useTable({ api: materialList, - columns: materialColumns.slice(0, 6), + //update-begin---author:jiangxh ---date:20260729 for:【选料弹窗】配合示方选胶料不展示胶料编码----------- + columns: materialColumns.filter((col) => col.dataIndex !== 'materialCode').slice(0, 6), + //update-end---author:jiangxh ---date:20260729 for:【选料弹窗】配合示方选胶料不展示胶料编码----------- rowKey: 'id', useSearchForm: true, formConfig: { @@ -32,12 +35,15 @@ canResize: false, showIndexColumn: false, immediate: true, - beforeFetch: (params) => ({ - ...params, - enableFlag: params.enableFlag ?? 1, - onlySales: onlySales.value ? 1 : undefined, - excludeProductionFB1: excludeProductionFB1.value ? 1 : undefined, - }), + beforeFetch: (params) => { + const next = { + ...params, + enableFlag: params.enableFlag ?? 1, + onlySales: onlySales.value ? 1 : undefined, + excludeProductionFB1: excludeProductionFB1.value ? 1 : undefined, + }; + return applyJeecgLikeQuery(next, RUBBER_MATERIAL_LIKE_FIELDS); + }, rowSelection: { type: 'radio', columnWidth: 48, diff --git a/jeecgboot-vue3/src/views/mes/material/modules/MesMixerMaterialSelectModal.vue b/jeecgboot-vue3/src/views/mes/material/modules/MesMixerMaterialSelectModal.vue index 5ebbc299..f2b4f592 100644 --- a/jeecgboot-vue3/src/views/mes/material/modules/MesMixerMaterialSelectModal.vue +++ b/jeecgboot-vue3/src/views/mes/material/modules/MesMixerMaterialSelectModal.vue @@ -10,6 +10,7 @@ import { BasicTable, useTable } from '/@/components/Table'; import { list as mixerList, queryById as queryMixerById } from '../MesMixerMaterial.api'; import { columns as mixerColumns, searchFormSchema as mixerSearch } from '../MesMixerMaterial.data'; + import { applyJeecgLikeQuery, MIXER_MATERIAL_LIKE_FIELDS } from '../materialQuery.util'; import { useMessage } from '/@/hooks/web/useMessage'; //update-begin---author:cursor ---date:20260525 for:【XSLMES-20260525-A53】通用密炼物料选料弹窗种类改读配置表----------- import { @@ -40,6 +41,7 @@ canResize: false, showIndexColumn: false, immediate: true, + beforeFetch: (params) => applyJeecgLikeQuery(params, MIXER_MATERIAL_LIKE_FIELDS), rowSelection: { type: 'radio', columnWidth: 48, diff --git a/jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/MesXslFormulaSpec.api.ts b/jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/MesXslFormulaSpec.api.ts index bfa34cf7..a91bb8f5 100644 --- a/jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/MesXslFormulaSpec.api.ts +++ b/jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/MesXslFormulaSpec.api.ts @@ -42,7 +42,10 @@ export const batchDelete = (params, handleSuccess) => { }); }; -export const saveOrUpdate = (params, isUpdate) => defHttp.post({ url: isUpdate ? Api.edit : Api.save, params }); +export const saveOrUpdate = (params, isUpdate) => + //update-begin---author:jiangxh ---date:20260729 for:【配合示方】保存延长超时,避免远程库慢导致误报超时----------- + defHttp.post({ url: isUpdate ? Api.edit : Api.save, params, timeout: 120 * 1000 }); + //update-end---author:jiangxh ---date:20260729 for:【配合示方】保存延长超时,避免远程库慢导致误报超时----------- //update-begin---author:cursor ---date:20260522 for:【XSLMES-20260522-A38】配合示方生成混炼示方----------- export const buildMixingGeneratePreview = (params) => diff --git a/jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/MesXslFormulaSpec.data.ts b/jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/MesXslFormulaSpec.data.ts index b12c7b2e..83aee11b 100644 --- a/jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/MesXslFormulaSpec.data.ts +++ b/jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/MesXslFormulaSpec.data.ts @@ -111,7 +111,7 @@ export function applyWeightPercentToLines(lines: Recordable[]): void { row.weightPercent = null; return; } - row.weightPercent = Number(((phr / totalPhr) * 100).toFixed(1)); + row.weightPercent = Number(((phr / totalPhr) * 100).toFixed(3)); }); } @@ -429,9 +429,25 @@ export function createEmptyLineRows(count = DEFAULT_LINE_ROW_COUNT): Recordable[ return Array.from({ length: count }, () => ({ id: buildUUID() })); } +/** 明细数值保留三位小数 */ +export function roundFormulaLineDecimal3(value: unknown): number | null { + if (value == null || value === '') { + return null; + } + const n = Number(value); + return Number.isFinite(n) ? Number(n.toFixed(3)) : null; +} + /** 确保每行有唯一 id(JVxeTable rowKey 依赖 id,否则单元格无法渲染) */ export function normalizeLineRows(rows: Recordable[]): Recordable[] { - return (rows || []).map((r) => ({ ...r, id: r?.id || buildUUID() })); + //update-begin---author:jiangxh ---date:20260729 for:【配合示方】明细重量%/体积保留三位小数----------- + return (rows || []).map((r) => ({ + ...r, + id: r?.id || buildUUID(), + weightPercent: roundFormulaLineDecimal3(r?.weightPercent), + volume: roundFormulaLineDecimal3(r?.volume), + })); + //update-end---author:jiangxh ---date:20260729 for:【配合示方】明细重量%/体积保留三位小数----------- } function sectionTitle(label: string, field: string): FormSchema { @@ -931,6 +947,7 @@ export function buildLineJVxeColumns(mixingStages?: number | null, tableDisabled type: JVxeTypes.inputNumber, minWidth: 90, align: 'center', + props: { precision: 3 }, }, { title: '体积', @@ -939,6 +956,7 @@ export function buildLineJVxeColumns(mixingStages?: number | null, tableDisabled minWidth: 90, align: 'center', placeholder: '自动计算', + props: { precision: 3 }, }, { title: '备注', diff --git a/jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/components/MesXslFormulaGenerateMixingModal.vue b/jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/components/MesXslFormulaGenerateMixingModal.vue index 8bd6e269..22de543c 100644 --- a/jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/components/MesXslFormulaGenerateMixingModal.vue +++ b/jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/components/MesXslFormulaGenerateMixingModal.vue @@ -92,6 +92,7 @@ } loading.value = true; try { + //update-begin---author:jiangxh ---date:20260730 for:【混炼示方生成】打开预览即匹配胶料,失败则关闭弹窗----------- const preview = await buildMixingGeneratePreview({ formulaSpecId: formulaSpecId.value }); rubberName.value = preview?.rubberName || ''; mixingStages.value = preview?.mixingStages || 0; @@ -106,9 +107,13 @@ if (!tableRows.value.length) { createMessage.warning('无可生成的混炼段,请检查混合段数'); } + } catch (_e) { + // 预览阶段胶料匹配失败等错误由全局提示,关闭弹窗避免空表继续操作 + closeModal(); } finally { loading.value = false; } + //update-end---author:jiangxh ---date:20260730 for:【混炼示方生成】打开预览即匹配胶料,失败则关闭弹窗----------- }); function formatMachineNames(machines: Recordable[] = []) { diff --git a/jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/components/MesXslFormulaSpecModal.vue b/jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/components/MesXslFormulaSpecModal.vue index a1e55aa0..c57d6b18 100644 --- a/jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/components/MesXslFormulaSpecModal.vue +++ b/jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/components/MesXslFormulaSpecModal.vue @@ -441,6 +441,7 @@ createEmptyLineRows, getActiveStageCount, normalizeLineRows, + roundFormulaLineDecimal3, stageTotalNumberProps, SUMMARY_FOOTER_FIELD_KEYS, SUMMARY_METRICS_FIELD_KEYS, @@ -1464,7 +1465,7 @@ const material = (raw as Recordable)?.id != null ? raw : (raw as Recordable)?.result; const sg = Number(material?.specificGravity); if (sg > 0) { - row.volume = Number((Number(row.phr) / sg).toFixed(6)); + row.volume = Number((Number(row.phr) / sg).toFixed(3)); } else { row.volume = null; } @@ -1505,6 +1506,10 @@ .filter((r) => r && (r.mixerMaterialId || r.phr != null)) .map((r, index) => ({ ...stripFormulaLineDisplayFields(r), + //update-begin---author:jiangxh ---date:20260729 for:【配合示方】明细重量%/体积提交保留三位小数----------- + weightPercent: roundFormulaLineDecimal3(r.weightPercent), + volume: roundFormulaLineDecimal3(r.volume), + //update-end---author:jiangxh ---date:20260729 for:【配合示方】明细重量%/体积提交保留三位小数----------- sortNo: index, })); diff --git a/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts b/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts index 1b156e96..68b368c0 100644 --- a/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts +++ b/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts @@ -79,11 +79,11 @@ export const mainSchema: FormSchema[] = [ rules: [{ required: true, message: '请选择发行编号' }], }, //update-end---author:cursor ---date:20260522 for:【XSLMES-20260522-A33】混炼示方基本信息字段优化----------- - { label: '换算系数', field: 'convertFactor', component: 'InputNumber', colProps: { span: 8 }, componentProps: { precision: 2, style: { width: '100%' } } }, - { label: '填充体积', field: 'fillVolume', component: 'InputNumber', colProps: { span: 8 }, componentProps: { precision: 6, style: { width: '100%' } } }, + { label: '换算系数', field: 'convertFactor', component: 'InputNumber', colProps: { span: 8 }, componentProps: { precision: 3, style: { width: '100%' } } }, + { label: '填充体积', field: 'fillVolume', component: 'InputNumber', colProps: { span: 8 }, componentProps: { precision: 2, style: { width: '100%' } } }, { label: '回收炭黑(秒)', field: 'recycleCarbonSec', component: 'InputNumber', colProps: { span: 8 }, componentProps: { precision: 0, style: { width: '100%' } } }, - { label: '母胶比重', field: 'motherRubberSg', component: 'InputNumber', colProps: { span: 8 }, componentProps: { precision: 6, style: { width: '100%' } } }, - { label: '终炼胶比重', field: 'finalRubberSg', component: 'InputNumber', colProps: { span: 8 }, componentProps: { precision: 6, style: { width: '100%' } } }, + { label: '母胶比重', field: 'motherRubberSg', component: 'InputNumber', colProps: { span: 8 }, componentProps: { precision: 3, style: { width: '100%' } } }, + { label: '终炼胶比重', field: 'finalRubberSg', component: 'InputNumber', colProps: { span: 8 }, componentProps: { precision: 3, style: { width: '100%' } } }, { label: '适用工厂', field: 'applyFactory', component: 'Input', colProps: { span: 8 } }, { label: '段数', field: 'stageCount', component: 'Input', colProps: { span: 8 }, componentProps: { placeholder: '如 2/3' } }, { label: '纯混炼时间(秒)', field: 'pureMixSec', component: 'InputNumber', colProps: { span: 8 }, componentProps: { precision: 0, style: { width: '100%' } } }, @@ -319,7 +319,13 @@ const MIXING_MATERIAL_WEIGHT_SCALE = 6; //update-begin---author:cursor ---date:20260526 for:【XSLMES-20260526-A60】换算系数/配方参数数值展示优化----------- /** 换算系数展示小数位 */ -export const MIXING_CONVERT_FACTOR_SCALE = 2; +export const MIXING_CONVERT_FACTOR_SCALE = 3; + +/** 母胶比重展示小数位 */ +export const MIXING_MOTHER_RUBBER_SG_SCALE = 3; + +/** 填充体积展示小数位 */ +export const MIXING_FILL_VOLUME_SCALE = 2; /** 配方参数设定允许的小数精度 */ export const MIXING_RECIPE_PARAM_DECIMAL_SCALE = 6; @@ -333,7 +339,7 @@ export const MIXING_RECIPE_PARAM_DECIMAL_FIELDS = [ 'maxFeedTemp', ] as const; -/** 换算系数展示:固定保留两位小数 */ +/** 换算系数展示:固定保留三位小数 */ export function formatMixingConvertFactorDisplay(value: unknown): string { if (value === null || value === undefined || value === '') { return ''; @@ -536,7 +542,7 @@ export function calcMixingFillVolume(totalWeight: unknown, specificGravity: unkn return null; } const materialVolume = weight / sg; - return Number(((materialVolume / volume) * 100).toFixed(6)); + return Number(((materialVolume / volume) * 100).toFixed(MIXING_FILL_VOLUME_SCALE)); } //update-end---author:cursor ---date:20260525 for:【XSLMES-20260525-A46】填充体积按单重/比重/机台有效体积自动计算----------- @@ -1311,8 +1317,9 @@ export function applyMixingMaterialFromSelection(row: Recordable, material: Reco //update-begin---author:cursor ---date:20260601 for:【XSLMES-20260601-A62】选料弹窗新增胶料页签(查询胶料信息)----------- /** 选料弹窗「胶料」页签表格列(数据源为胶料信息 mes_material) */ export const mixingRubberPickerTableColumns: BasicColumn[] = [ - { title: '胶料编码', align: 'center', width: 140, dataIndex: 'materialCode' }, + //update-begin---author:jiangxh ---date:20260729 for:【选料弹窗】胶料页签去掉胶料编码----------- { title: '胶料名称', align: 'center', width: 180, dataIndex: 'materialName' }, + //update-end---author:jiangxh ---date:20260729 for:【选料弹窗】胶料页签去掉胶料编码----------- //update-begin---author:cursor ---date:20260601 for:【XSLMES-20260601-A62】胶料页签补齐自动/人工称量列----------- { title: '自动/人工称量', align: 'center', width: 132, dataIndex: 'pickerWeighMode' }, //update-end---author:cursor ---date:20260601 for:【XSLMES-20260601-A62】胶料页签补齐自动/人工称量列----------- diff --git a/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingMaterialSelectModal.vue b/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingMaterialSelectModal.vue index 2866c07a..764a5dca 100644 --- a/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingMaterialSelectModal.vue +++ b/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingMaterialSelectModal.vue @@ -13,7 +13,7 @@ @@ -105,6 +105,11 @@ import { list as rubberList, queryById as queryRubberById } from '/@/views/mes/material/MesMaterial.api'; import { loadTreeData } from '/@/api/common/api'; //update-end---author:cursor ---date:20260601 for:【XSLMES-20260601-A62】胶料页签查询胶料信息(mes_material)-------------> + import { + buildOrLikeSuperQuery, + MIXER_MATERIAL_LIKE_FIELDS, + RUBBER_MATERIAL_LIKE_FIELDS, + } from '/@/views/mes/material/materialQuery.util'; import { useMessage } from '/@/hooks/web/useMessage'; import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue'; import MesXslMixingMaterialCategorySetting from './MesXslMixingMaterialCategorySetting.vue'; @@ -133,6 +138,11 @@ const RUBBER_TREE_ALL = 'ALL'; const RUBBER_CATEGORY_PCODE = 'XSLMES_RUBBER'; const pickerType = ref<'mixer' | 'rubber'>('mixer'); + //update-begin---author:jiangxh ---date:20260729 for:【选料弹窗】胶料页签关键字提示去掉编码----------- + const keywordPlaceholder = computed(() => + pickerType.value === 'rubber' ? '关键字(名称/别名/ERP)' : '关键字(编码/名称/描述)', + ); + //update-end---author:jiangxh ---date:20260729 for:【选料弹窗】胶料页签关键字提示去掉编码----------- const rubberTreeLoading = ref(false); const rubberCategoryTree = ref([]); /** 胶料类别 id -> { code, title },用于按种类配置编码匹配 */ @@ -256,14 +266,20 @@ const kw = keyword.value?.trim(); if (pickerType.value === 'rubber') { const rubberParams = { ...params, ...selectedRubberCategoryFilter.value }; - if (kw) { - rubberParams.materialName = `*${kw}*`; + //update-begin---author:jiangxh ---date:20260729 for:【选料弹窗】胶料关键字按名称/ERP/别名模糊查询----------- + // 关键字按名称/ERP/别名模糊 OR 查询(不含编码) + const orQuery = buildOrLikeSuperQuery(RUBBER_MATERIAL_LIKE_FIELDS, kw || ''); + //update-end---author:jiangxh ---date:20260729 for:【选料弹窗】胶料关键字按名称/ERP/别名模糊查询----------- + if (orQuery) { + Object.assign(rubberParams, orQuery); } return rubberParams; } const next = { ...params, ...selectedCategoryFilter.value }; - if (kw) { - next.materialName = `*${kw}*`; + // 关键字按编码/名称/描述/ERP/别名模糊 OR 查询 + const orQuery = buildOrLikeSuperQuery(MIXER_MATERIAL_LIKE_FIELDS, kw || ''); + if (orQuery) { + Object.assign(next, orQuery); } return next; }, diff --git a/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingSpecModal.vue b/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingSpecModal.vue index 49ebd2ca..e270cd16 100644 --- a/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingSpecModal.vue +++ b/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingSpecModal.vue @@ -67,7 +67,7 @@ 填充体积 - + 回收炭黑(秒) @@ -99,7 +99,7 @@ 母胶比重 - + 段数 @@ -123,7 +123,7 @@ 终炼胶比重 - + 适用工厂 diff --git a/yy-admin-master/YY.Admin/ViewModels/MixerMaterial/MixerMaterialEditDialogViewModel.cs b/yy-admin-master/YY.Admin/ViewModels/MixerMaterial/MixerMaterialEditDialogViewModel.cs index 684c6369..b6ffacf9 100644 --- a/yy-admin-master/YY.Admin/ViewModels/MixerMaterial/MixerMaterialEditDialogViewModel.cs +++ b/yy-admin-master/YY.Admin/ViewModels/MixerMaterial/MixerMaterialEditDialogViewModel.cs @@ -56,11 +56,14 @@ public class MixerMaterialEditDialogViewModel : BaseViewModel, IDialogResultable public void InitializeForAdd() { + //update-begin---author:jiangxh ---date:20260729 for:【密炼物料】新增默认保质期365天----------- Material = new MesMixerMaterial { FeedManageStatus = 1, - UseStatus = 1 + UseStatus = 1, + ShelfLifeDays = 365 }; + //update-end---author:jiangxh ---date:20260729 for:【密炼物料】新增默认保质期365天----------- MinorCategoryOptions.Clear(); RaisePropertyChanged(nameof(IsAddMode)); RaisePropertyChanged(nameof(DialogTitle));