From 1d5ce0a0f98e1a4de58e003a00235c5964a56561 Mon Sep 17 00:00:00 2001 From: chenbowen Date: Wed, 6 Aug 2025 17:45:38 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=96=B0=E5=A2=9E=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E4=BB=BB=E5=8A=A1=E8=A1=A8=E5=8D=95=E5=8F=AF?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E8=87=AA=E5=AE=9A=E4=B9=89=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: 1. 修复 mysql 脚本部分字段未同步脚本的错误 2. 角色为空无法登录系统 3. 主子表缩写命名下代码生成器错误 (cherry picked from commit 3812611b046bdb05081effaffa3ee19979b6d0a0) --- sql/dm/patch.sql | 118 +++++++++++++++- sql/dm/ruoyi-vue-pro-dm8.sql | 121 +++++++++++++--- sql/mysql/ruoyi-vue-pro.sql | 89 ++++++++++-- sql/tools/convertor.py | 4 +- .../admin/task/BpmTaskController.java | 14 +- .../task/vo/task/BpmTaskApproveReqVO.java | 3 + .../admin/task/vo/task/BpmTaskRespVO.java | 2 + .../bpm/convert/task/BpmTaskConvert.java | 13 +- .../bpm/service/task/BpmTaskServiceImpl.java | 16 ++- .../infra/enums/ErrorCodeConstants.java | 2 +- .../infra/api/stdnms/StdNmsApiImpl.java | 59 -------- .../codegen/vo/CodegenCreateListReqVO.java | 5 +- .../standardname/StandardNameController.java | 106 ++++++++++++++ .../vo/StandardNamePageReqVO.java} | 8 +- .../vo/StandardNameRespVO.java} | 10 +- .../vo/StandardNameSaveReqVO.java} | 10 +- .../admin/stdnms/stdnms/StdNmsController.java | 120 ---------------- .../standardname/StandardNameDO.java | 47 +++++++ .../dataobject/stdnms/stdnms/StdNmsDO.java | 50 ------- .../dal/mysql/codegen/CodegenTableMapper.java | 33 ++++- .../standardname/StandardNameMapper.java | 48 +++++++ .../infra/dal/mysql/stdnms/StdNmsMapper.java | 28 ---- .../service/codegen/CodegenServiceImpl.java | 14 +- .../service/codegen/inner/CodegenBuilder.java | 23 ++- .../service/codegen/inner/CodegenEngine.java | 76 +--------- .../service/db/DatabaseTableService.java | 5 +- .../service/db/DatabaseTableServiceImpl.java | 132 ++++++++++++++++-- .../standardname/StandardNameService.java | 66 +++++++++ .../standardname/StandardNameServiceImpl.java | 97 +++++++++++++ .../module/infra/stdnms/StdNmsService.java | 76 ---------- .../infra/stdnms/StdNmsServiceImpl.java | 105 -------------- .../src/main/resources/application.yaml | 2 +- .../src/main/resources/codegen/java/dal/do.vm | 2 +- .../main/resources/codegen/java/dal/do_sub.vm | 7 +- .../main/resources/codegen/vue3/api/api.ts.vm | 5 +- .../standardname/StandardNameMapper.xml | 6 + .../resources/mapper/stdnms/StdNmsMapper.xml | 24 ---- .../codegen/CodegenServiceImplTest.java | 8 +- .../codegen/inner/CodegenBuilderTest.java | 2 +- .../system/api/sequence/SequenceApi.java | 13 ++ .../system/enums/ErrorCodeConstants.java | 16 +++ .../enums/sequence/SequenceCycleTypeEnum.java | 64 +++++++++ .../permission/PermissionServiceImpl.java | 17 +-- .../src/main/resources/application.yaml | 3 + 44 files changed, 1037 insertions(+), 632 deletions(-) delete mode 100644 yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/api/stdnms/StdNmsApiImpl.java create mode 100644 yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/standardname/StandardNameController.java rename yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/{stdnms/stdnms/vo/StdNmsPageReqVO.java => standardname/vo/StandardNamePageReqVO.java} (79%) rename yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/{stdnms/stdnms/vo/StdNmsRespVO.java => standardname/vo/StandardNameRespVO.java} (82%) rename yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/{stdnms/stdnms/vo/StdNmsSaveReqVO.java => standardname/vo/StandardNameSaveReqVO.java} (77%) delete mode 100644 yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/StdNmsController.java create mode 100644 yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/standardname/StandardNameDO.java delete mode 100644 yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/stdnms/stdnms/StdNmsDO.java create mode 100644 yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/standardname/StandardNameMapper.java delete mode 100644 yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/stdnms/StdNmsMapper.java create mode 100644 yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/standardname/StandardNameService.java create mode 100644 yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/standardname/StandardNameServiceImpl.java delete mode 100644 yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/stdnms/StdNmsService.java delete mode 100644 yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/stdnms/StdNmsServiceImpl.java create mode 100644 yudao-module-infra/yudao-module-infra-server/src/main/resources/mapper/standardname/StandardNameMapper.xml delete mode 100644 yudao-module-infra/yudao-module-infra-server/src/main/resources/mapper/stdnms/StdNmsMapper.xml create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sequence/SequenceApi.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sequence/SequenceCycleTypeEnum.java diff --git a/sql/dm/patch.sql b/sql/dm/patch.sql index 1d7e8478..1455f2bb 100644 --- a/sql/dm/patch.sql +++ b/sql/dm/patch.sql @@ -88,4 +88,120 @@ INSERT INTO system_menu( VALUES ( '1951092724040097797', '业务附件关联导出', 'infra:business-file:export', 3, 5, 1948328245618204673, '', '', '', 0 - ); \ No newline at end of file + ); + +-- 新增命名规范字典菜单 +-- 菜单 SQL +INSERT INTO system_menu( + id, name, permission, type, sort, parent_id, + path, icon, component, status, component_name +) +VALUES ( + '1947909810016006146', '数据命名与简写标准管理', '', 2, 0, 2, + 'standard-name', '', 'infra/standardname/index', 0, 'StandardName' + ); + +-- 按钮父菜单ID +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 +-- SELECT @parentId := LAST_INSERT_ID(); + + +-- 按钮 SQL +INSERT INTO system_menu( + id, name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '1953301310553645058', '数据命名与简写标准查询', 'infra:standard-name:query', 3, 1, 1947909810016006146, + '', '', '', 0 + ); +INSERT INTO system_menu( + id, name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '1953301310553645059', '数据命名与简写标准创建', 'infra:standard-name:create', 3, 2, 1947909810016006146, + '', '', '', 0 + ); +INSERT INTO system_menu( + id, name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '1953301310553645060', '数据命名与简写标准更新', 'infra:standard-name:update', 3, 3, 1947909810016006146, + '', '', '', 0 + ); +INSERT INTO system_menu( + id, name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '1953301310553645061', '数据命名与简写标准删除', 'infra:standard-name:delete', 3, 4, 1947909810016006146, + '', '', '', 0 + ); +INSERT INTO system_menu( + id, name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '1953301310553645062', '数据命名与简写标准导出', 'infra:standard-name:export', 3, 5, 1947909810016006146, + '', '', '', 0 + ); + +-- 新增序列获取菜单 +-- 菜单 SQL +INSERT INTO system_menu( + id, name, permission, type, sort, parent_id, + path, icon, component, status, component_name +) +VALUES ( + '1953701540574969857', '系统序列号管理', '', 2, 0, ${table.parentMenuId}, + 'sequence', '', 'system/sequence/index', 0, 'Sequence' + ); + +-- 按钮父菜单ID +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 +-- SELECT @parentId := LAST_INSERT_ID(); + + +-- 按钮 SQL +INSERT INTO system_menu( + id, name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '1953702581324398594', '系统序列号查询', 'system:sequence:query', 3, 1, 1953701540574969857, + '', '', '', 0 + ); +INSERT INTO system_menu( + id, name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '1953702581324398595', '系统序列号创建', 'system:sequence:create', 3, 2, 1953701540574969857, + '', '', '', 0 + ); +INSERT INTO system_menu( + id, name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '1953702581324398596', '系统序列号更新', 'system:sequence:update', 3, 3, 1953701540574969857, + '', '', '', 0 + ); +INSERT INTO system_menu( + id, name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '1953702581324398597', '系统序列号删除', 'system:sequence:delete', 3, 4, 1953701540574969857, + '', '', '', 0 + ); +INSERT INTO system_menu( + id, name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '1953702581324398598', '系统序列号导出', 'system:sequence:export', 3, 5, 1953701540574969857, + '', '', '', 0 + ); diff --git a/sql/dm/ruoyi-vue-pro-dm8.sql b/sql/dm/ruoyi-vue-pro-dm8.sql index 7a6d6cb9..09f8caaa 100644 --- a/sql/dm/ruoyi-vue-pro-dm8.sql +++ b/sql/dm/ruoyi-vue-pro-dm8.sql @@ -5,7 +5,7 @@ Target Server Type : DM8 - Date: 2025-07-24 17:21:17 + Date: 2025-08-07 17:00:48 */ @@ -4762,6 +4762,7 @@ COMMENT ON COLUMN system_role_menu_exclusion.updater IS '更新者'; COMMENT ON COLUMN system_role_menu_exclusion.update_time IS '更新时间'; COMMENT ON COLUMN system_role_menu_exclusion.deleted IS '是否删除'; COMMENT ON COLUMN system_role_menu_exclusion.tenant_id IS '租户编号'; +COMMENT ON TABLE system_role_menu_exclusion IS '角色菜单剔除表'; -- ---------------------------- -- Table structure for system_user_dept @@ -4789,16 +4790,16 @@ COMMENT ON COLUMN system_user_dept.create_time IS '创建时间'; COMMENT ON COLUMN system_user_dept.updater IS '更新者'; COMMENT ON COLUMN system_user_dept.deleted IS '是否删除'; COMMENT ON COLUMN system_user_dept.update_time IS '更新时间'; +COMMENT ON TABLE system_user_dept IS '用户与部门关系表'; -- ---------------------------- --- Table structure for infra_std_nms +-- Table structure for infra_std_name -- ---------------------------- -DROP TABLE IF EXISTS infra_std_nms; -CREATE TABLE infra_std_nms ( +CREATE TABLE infra_std_name ( id bigint NOT NULL PRIMARY KEY, word varchar(128) NOT NULL, abbr varchar(32) NOT NULL, - info varchar(128) NOT NULL, + inf varchar(128) NOT NULL, creator varchar(64) DEFAULT '' NULL, create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, updater varchar(64) DEFAULT '' NULL, @@ -4806,20 +4807,20 @@ CREATE TABLE infra_std_nms ( deleted smallint DEFAULT 0 NOT NULL ); -COMMENT ON COLUMN infra_std_nms.id IS '主键ID'; -COMMENT ON COLUMN infra_std_nms.word IS '英文'; -COMMENT ON COLUMN infra_std_nms.abbr IS '简写'; -COMMENT ON COLUMN infra_std_nms.info IS '中文意思'; -COMMENT ON COLUMN infra_std_nms.creator IS '创建者'; -COMMENT ON COLUMN infra_std_nms.create_time IS '创建时间'; -COMMENT ON COLUMN infra_std_nms.updater IS '更新者'; -COMMENT ON COLUMN infra_std_nms.update_time IS '最后更新时间'; -COMMENT ON COLUMN infra_std_nms.deleted IS '是否删除'; +COMMENT ON COLUMN infra_std_name.id IS '主键ID'; +COMMENT ON COLUMN infra_std_name.word IS '英文'; +COMMENT ON COLUMN infra_std_name.abbr IS '简写'; +COMMENT ON COLUMN infra_std_name.inf IS '中文意思'; +COMMENT ON COLUMN infra_std_name.creator IS '创建者'; +COMMENT ON COLUMN infra_std_name.create_time IS '创建时间'; +COMMENT ON COLUMN infra_std_name.updater IS '更新者'; +COMMENT ON COLUMN infra_std_name.update_time IS '最后更新时间'; +COMMENT ON COLUMN infra_std_name.deleted IS '是否删除'; +COMMENT ON TABLE infra_std_name IS '数据命名与简写标准'; -- ---------------------------- -- Table structure for infra_bsn_file -- ---------------------------- -DROP TABLE IF EXISTS infra_bsn_file; CREATE TABLE infra_bsn_file ( id bigint NOT NULL PRIMARY KEY, bsn_id bigint NOT NULL, @@ -4834,7 +4835,7 @@ CREATE TABLE infra_bsn_file ( deleted smallint DEFAULT 0 NOT NULL, tenant_id bigint DEFAULT 0 NOT NULL ); -COMMENT ON TABLE infra_bsn_file IS '业务附件关联表'; + COMMENT ON COLUMN infra_bsn_file.id IS '主键ID'; COMMENT ON COLUMN infra_bsn_file.bsn_id IS '业务Id'; COMMENT ON COLUMN infra_bsn_file.bsn_cd IS '业务编码'; @@ -4847,6 +4848,90 @@ COMMENT ON COLUMN infra_bsn_file.updater IS '更新者'; COMMENT ON COLUMN infra_bsn_file.update_time IS '最后更新时间'; COMMENT ON COLUMN infra_bsn_file.deleted IS '是否删除'; COMMENT ON COLUMN infra_bsn_file.tenant_id IS '租户编号'; +COMMENT ON TABLE infra_bsn_file IS '业务附件表'; + -- ---------------------------- --- Records of infra_bsn_file --- ---------------------------- \ No newline at end of file +-- Table structure for system_seq +-- ---------------------------- +CREATE TABLE system_seq ( + id bigint NOT NULL PRIMARY KEY, + seq_cd varchar(100) NOT NULL, + seq_name varchar(255) NOT NULL, + cycl_tp varchar(50) DEFAULT 'Y' NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN system_seq.id IS '主键ID'; +COMMENT ON COLUMN system_seq.seq_cd IS '序列号编码'; +COMMENT ON COLUMN system_seq.seq_name IS '序列号名称'; +COMMENT ON COLUMN system_seq.cycl_tp IS '循环类型(yyyy-年/yyyy-MM-dd-日/XXX-自定义)'; +COMMENT ON COLUMN system_seq.creator IS '创建者'; +COMMENT ON COLUMN system_seq.create_time IS '创建时间'; +COMMENT ON COLUMN system_seq.updater IS '更新者'; +COMMENT ON COLUMN system_seq.update_time IS '更新时间'; +COMMENT ON COLUMN system_seq.deleted IS '是否删除'; +COMMENT ON TABLE system_seq IS '系统序列号表'; + +-- ---------------------------- +-- Table structure for system_seq_dtl +-- ---------------------------- +CREATE TABLE system_seq_dtl ( + id bigint NOT NULL PRIMARY KEY, + seq_cd varchar(100) NOT NULL, + seq_id bigint NOT NULL, + seq_dtl_no varchar(20) NOT NULL, + seq_dtl_tp varchar(50) NOT NULL, + seq_dtl_rul varchar(255) NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN system_seq_dtl.id IS '主键ID'; +COMMENT ON COLUMN system_seq_dtl.seq_id IS '序列Id'; +COMMENT ON COLUMN system_seq_dtl.seq_cd IS '序列号编码'; +COMMENT ON COLUMN system_seq_dtl.seq_dtl_no IS '分段编号'; +COMMENT ON COLUMN system_seq_dtl.seq_dtl_tp IS '分段类型'; +COMMENT ON COLUMN system_seq_dtl.seq_dtl_rul IS '分段规则'; +COMMENT ON COLUMN system_seq_dtl.creator IS '创建者'; +COMMENT ON COLUMN system_seq_dtl.create_time IS '创建时间'; +COMMENT ON COLUMN system_seq_dtl.updater IS '更新者'; +COMMENT ON COLUMN system_seq_dtl.update_time IS '更新时间'; +COMMENT ON COLUMN system_seq_dtl.deleted IS '是否删除'; +COMMENT ON TABLE system_seq_dtl IS '系统序列号分段明细表'; + +-- ---------------------------- +-- Table structure for system_seq_rcd +-- ---------------------------- +CREATE TABLE system_seq_rcd ( + id bigint NOT NULL PRIMARY KEY, + seq_cd varchar(100) NOT NULL, + seq_id bigint NOT NULL, + seq_dtl_no varchar(20) NOT NULL, + crnt_val varchar(14) NOT NULL, + cycl_val varchar(64) NOT NULL, + creator varchar(64) DEFAULT '' NULL, + create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater varchar(64) DEFAULT '' NULL, + update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted bit DEFAULT '0' NOT NULL +); + +COMMENT ON COLUMN system_seq_rcd.id IS '主键ID'; +COMMENT ON COLUMN system_seq_rcd.seq_id IS '序列Id'; +COMMENT ON COLUMN system_seq_rcd.seq_cd IS '序列号编码'; +COMMENT ON COLUMN system_seq_rcd.seq_dtl_no IS '分段编号'; +COMMENT ON COLUMN system_seq_rcd.crnt_val IS '当前值'; +COMMENT ON COLUMN system_seq_rcd.cycl_val IS '循环值'; +COMMENT ON COLUMN system_seq_rcd.creator IS '创建者'; +COMMENT ON COLUMN system_seq_rcd.create_time IS '创建时间'; +COMMENT ON COLUMN system_seq_rcd.updater IS '更新者'; +COMMENT ON COLUMN system_seq_rcd.update_time IS '更新时间'; +COMMENT ON COLUMN system_seq_rcd.deleted IS '是否删除'; +COMMENT ON TABLE system_seq_rcd IS '系统序列号记录表'; \ No newline at end of file diff --git a/sql/mysql/ruoyi-vue-pro.sql b/sql/mysql/ruoyi-vue-pro.sql index 36b4215a..d1904ba4 100644 --- a/sql/mysql/ruoyi-vue-pro.sql +++ b/sql/mysql/ruoyi-vue-pro.sql @@ -4116,15 +4116,15 @@ CREATE TABLE `system_user_dept` -- ---------------------------- -- ---------------------------- --- Table structure for infra_std_nms +-- Table structure for infra_std_name -- ---------------------------- -DROP TABLE IF EXISTS `infra_std_nms`; -CREATE TABLE `infra_std_nms` +DROP TABLE IF EXISTS `infra_std_name`; +CREATE TABLE `infra_std_name` ( `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', `word` VARCHAR(128) NOT NULL UNIQUE COMMENT '英文', `abbr` VARCHAR(32) NOT NULL UNIQUE COMMENT '简写', - `info` VARCHAR(128) NOT NULL UNIQUE COMMENT '中文意思', + `inf` VARCHAR(128) NOT NULL UNIQUE COMMENT '中文意思', `creator` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建者', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '更新者', @@ -4132,7 +4132,7 @@ CREATE TABLE `infra_std_nms` `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据命名与简写标准'; -- ---------------------------- --- Records of infra_std_nms +-- Records of infra_std_name -- ---------------------------- -- ---------------------------- @@ -4143,10 +4143,10 @@ CREATE TABLE `infra_bsn_file` ( `id` BIGINT NOT NULL PRIMARY KEY COMMENT '主键ID', `bsn_id` BIGINT NOT NULL COMMENT '业务Id', - `bsn_code` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '业务编码', + `bsn_cd` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '业务编码', `file_id` BIGINT NOT NULL COMMENT '附件fileId', - `file_id` VARCHAR(500) NOT NULL COMMENT '附件名称', - `source` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '附件来源', + `file_name` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '附件名称', + `src` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '附件来源', `creator` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建者', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '更新者', @@ -4158,4 +4158,77 @@ CREATE TABLE `infra_bsn_file` -- Records of infra_bsn_file -- ---------------------------- +-- ---------------------------- +-- Table structure for system_seq +-- ---------------------------- +DROP TABLE IF EXISTS `system_seq`; +CREATE TABLE `system_seq` ( + `id` varchar(50) NOT NULL COMMENT '主键ID', + `seq_id` varchar(100) NOT NULL COMMENT '序列号ID', + `seq_name` varchar(255) NOT NULL COMMENT '序列号名称', + `cycl_tp` varchar(50) NOT NULL DEFAULT 'Y' COMMENT '循环类型(yyyy-年/yyyy-MM-dd-日/XXX-自定义)', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_seq_id` (`seq_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统序列号表'; + +-- ---------------------------- +-- Records of system_seq +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_seq_detail +-- ---------------------------- +DROP TABLE IF EXISTS `system_seq_dtl`; +CREATE TABLE `system_seq_dtl` ( + `id` varchar(50) NOT NULL COMMENT '主键ID', + `seq_id` varchar(100) NOT NULL COMMENT '序列号ID', + `seq_dtl_no` varchar(20) NOT NULL COMMENT '分段编号', + `seq_dtl_tp` varchar(50) NOT NULL COMMENT '分段类型', + `seq_dtl_rul` varchar(255) NOT NULL COMMENT '分段规则', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统序列号分段明细表'; + +-- ---------------------------- +-- Records of system_seq_dtl +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_seq_rcd +-- ---------------------------- +DROP TABLE IF EXISTS `system_seq_rcd`; +CREATE TABLE `system_seq_rcd` ( + `id` varchar(50) NOT NULL COMMENT '主键ID', + `seq_id` varchar(100) NOT NULL COMMENT '序列号ID', + `seq_dtl_no` varchar(20) NOT NULL COMMENT '分段编号', + `crnt_val` varchar(14) NOT NULL COMMENT '当前值', + `cycl_val` varchar(64) NOT NULL COMMENT '循环值', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统序列号记录表'; + +-- ---------------------------- +-- Records of system_seq_record +-- ---------------------------- +BEGIN; +COMMIT; + + SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/sql/tools/convertor.py b/sql/tools/convertor.py index ae7b9f5f..3ad38306 100644 --- a/sql/tools/convertor.py +++ b/sql/tools/convertor.py @@ -190,7 +190,7 @@ class Convertor(ABC): yield field, comment_string def table_comment(self, table_sql: str) -> str: - match = re.search(r"COMMENT \= '([^']+)';", table_sql) + match = re.search(r"COMMENT\s*=\s*'([^']+)';", table_sql) return match.group(1) if match else None def print(self): @@ -837,7 +837,7 @@ def main(): ) args = parser.parse_args() - sql_file = pathlib.Path("../mysql/ai.sql").resolve().as_posix() + sql_file = pathlib.Path("../mysql/ruoyi-vue-pro.sql").resolve().as_posix() convertor = None if args.type == "postgres": convertor = PostgreSQLConvertor(sql_file) diff --git a/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java b/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java index 6b29710b..69afba33 100644 --- a/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java +++ b/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmTaskController.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.business.core.util.DeptUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -142,7 +143,18 @@ public class BpmTaskController { Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), DeptUtil::getDeptId)); // 获得 Form Map Map formMap = formService.getFormMap( - convertSet(taskList, task -> NumberUtils.parseLong(task.getFormKey()))); + convertSet(taskList, task -> { + String formKey = task.getFormKey(); + if (StrUtil.isBlank(formKey)) { + return 0L; + } + try { + return Long.parseLong(formKey); + } catch (NumberFormatException e) { + // 如果 formKey 不是数字(比如是URL),返回0L + return 0L; + } + })); return success(BpmTaskConvert.INSTANCE.buildTaskListByProcessInstanceId(taskList, formMap, userMap, deptMap)); } diff --git a/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java b/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java index 0969fda1..2a13644e 100644 --- a/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskApproveReqVO.java @@ -27,4 +27,7 @@ public class BpmTaskApproveReqVO { @Schema(description = "下一个节点审批人", example = "{nodeId:[1, 2]}") private Map> nextAssignees; // 为什么是 Map,而不是 List 呢?因为下一个节点可能是多个,例如说并行网关的情况 + // 新增任务变量实例,业务表单 + @Schema(description = "任务变量实例,业务表单", example = "{'formField1': 'value1', 'formField2': 'value2'}") + private Map taskVariables; } diff --git a/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java b/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java index fce72a49..dbe92089 100644 --- a/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java @@ -68,6 +68,8 @@ public class BpmTaskRespVO { @Schema(description = "表单编号", example = "1024") private Long formId; + @Schema(description = "表单路由", example = "1024") + private String formPath; @Schema(description = "表单名字", example = "请假表单") private String formName; @Schema(description = "表单的配置,JSON 字符串") diff --git a/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java b/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java index e65c2f64..86903637 100644 --- a/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java @@ -103,7 +103,15 @@ public interface BpmTaskConvert { } taskVO.setStatus(taskStatus).setReason(FlowableUtils.getTaskReason(task)); // 表单信息 - BpmFormDO form = MapUtil.get(formMap, NumberUtils.parseLong(task.getFormKey()), BpmFormDO.class); + BpmFormDO form = null; + try { + Long formId = NumberUtils.parseLong(task.getFormKey()); + form = MapUtil.get(formMap, formId, BpmFormDO.class); + } catch (NumberFormatException e) { + // 如果 formKey 不是数字(比如是URL),设置 formPath + taskVO.setFormPath(task.getFormKey()); + taskVO.setFormVariables(FlowableUtils.getTaskFormVariable(task)); + } if (form != null) { taskVO.setFormId(form.getId()).setFormName(form.getName()).setFormConf(form.getConf()) .setFormFields(form.getFields()).setFormVariables(FlowableUtils.getTaskFormVariable(task)); @@ -146,6 +154,9 @@ public interface BpmTaskConvert { if (form != null) { bpmTaskRespVO.setFormId(form.getId()).setFormName(form.getName()) .setFormConf(form.getConf()).setFormFields(form.getFields()); + }else{ + // 任务级别的业务表单 + bpmTaskRespVO.setFormPath(todoTask.getFormKey()); } return bpmTaskRespVO; } diff --git a/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index 23569451..654d74eb 100644 --- a/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.*; import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; @@ -165,7 +166,13 @@ public class BpmTaskServiceImpl implements BpmTaskService { // 4. 任务表单 BpmFormDO taskForm = null; if (StrUtil.isNotBlank(todoTask.getFormKey())) { - taskForm = formService.getForm(NumberUtils.parseLong(todoTask.getFormKey())); + try { + Long formId = Long.parseLong(todoTask.getFormKey()); + taskForm = formService.getForm(formId); + } catch (NumberFormatException e) { + // 如果 formKey 不是数字(比如是URL),则不处理表单 + taskForm = null; + } } return BpmTaskConvert.INSTANCE.buildTodoTask(todoTask, childrenTasks, buttonsSetting, taskForm) @@ -573,6 +580,13 @@ public class BpmTaskServiceImpl implements BpmTaskService { processVariables.putAll(reqVO.getVariables()); } + // 如果任务变量不为空,设置任务级别的变量实例信息 + if (CollUtil.isNotEmpty(reqVO.getTaskVariables())) { + Map taskVariables = new HashMap<>(); + taskVariables.put("taskVariables", JSONUtil.toJsonStr(reqVO.getTaskVariables())); + taskService.setVariablesLocal(task.getId(), taskVariables); + } + // 4. 校验并处理 APPROVE_USER_SELECT 当前审批人,选择下一节点审批人的逻辑 Map variables = validateAndSetNextAssignees(task.getTaskDefinitionKey(), processVariables, bpmnModel, reqVO.getNextAssignees(), instance); diff --git a/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/enums/ErrorCodeConstants.java b/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/enums/ErrorCodeConstants.java index 6e5a9524..d920c75f 100644 --- a/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/enums/ErrorCodeConstants.java +++ b/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/enums/ErrorCodeConstants.java @@ -83,7 +83,7 @@ public interface ErrorCodeConstants { ErrorCode BUSINESS_FILE_NOT_EXISTS = new ErrorCode(1_002_201_010, "业务附件关联不存在"); // ========== 数据命名与简写标准 ========== - ErrorCode STD_NMS_NOT_EXISTS = new ErrorCode(1_002_030_000, "数据命名与简写标准不存在"); + ErrorCode STANDARD_NAME_NOT_EXISTS = new ErrorCode(1_002_030_000, "数据命名与简写标准不存在"); ErrorCode STD_ABBR_NOT_EXISTS = new ErrorCode(1_002_030_001, "字段名 {} 不存在命名规范定义,请核对字段定义"); } diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/api/stdnms/StdNmsApiImpl.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/api/stdnms/StdNmsApiImpl.java deleted file mode 100644 index b73d887a..00000000 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/api/stdnms/StdNmsApiImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.iocoder.yudao.module.infra.api.stdnms; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.infra.api.stdnms.dto.StdNmsRespDTO; -import cn.iocoder.yudao.module.infra.dal.dataobject.stdnms.stdnms.StdNmsDO; -import cn.iocoder.yudao.module.infra.stdnms.StdNmsService; -import jakarta.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Collection; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -/** - * 数据命名与简写标准 API 实现 - * - * @author 后台管理 - */ -@RestController // 提供 RESTful API 接口,给 Feign 调用 -@Validated -public class StdNmsApiImpl implements StdNmsApi { - - @Resource - private StdNmsService stdNmsService; - - @Override - public CommonResult deleteStdNms(Long id) { - stdNmsService.deleteStdNms(id); - return success(true); - } - - @Override - public CommonResult deleteStdNmsList(List ids) { - stdNmsService.deleteStdNmsListByIds(ids); - return success(true); - } - - @Override - public CommonResult getStdNms(Long id) { - StdNmsDO stdNms = stdNmsService.getStdNms(id); - return success(BeanUtils.toBean(stdNms, StdNmsRespDTO.class)); - } - - @Override - public CommonResult getStdNmsByAbbr(String abbr) { - StdNmsDO stdNms = stdNmsService.getStdNmsByAbbr(abbr); - return success(BeanUtils.toBean(stdNms, StdNmsRespDTO.class)); - } - - @Override - public CommonResult> getStdNmsListByAbbrs(Collection abbrs) { - List stdNmsList = stdNmsService.getStdNmsListByAbbrs(abbrs); - return success(BeanUtils.toBean(stdNmsList, StdNmsRespDTO.class)); - } - -} diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java index 5e73377d..7f0a5f3b 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.infra.controller.admin.codegen.vo; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Data; -import jakarta.validation.constraints.NotNull; import java.util.List; @Schema(description = "管理后台 - 基于数据库的表结构,创建代码生成器的表和字段定义 Request VO") @@ -18,4 +18,7 @@ public class CodegenCreateListReqVO { @NotNull(message = "表名数组不能为空") private List tableNames; + @Schema(description = "是否为规范缩写定义表", example = "true") + private Boolean isStandardized = false; + } diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/standardname/StandardNameController.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/standardname/StandardNameController.java new file mode 100644 index 00000000..8a8f1f8a --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/standardname/StandardNameController.java @@ -0,0 +1,106 @@ +package cn.iocoder.yudao.module.infra.controller.admin.standardname; + +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; + +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.constraints.*; +import jakarta.validation.*; +import jakarta.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.infra.controller.admin.standardname.vo.*; +import cn.iocoder.yudao.module.infra.dal.dataobject.standardname.StandardNameDO; +import cn.iocoder.yudao.module.infra.service.standardname.StandardNameService; + +@Tag(name = "管理后台 - 数据命名与简写标准") +@RestController +@RequestMapping("/infra/standard-name") +@Validated +public class StandardNameController { + + + @Resource + private StandardNameService standardNameService; + + @PostMapping("/create") + @Operation(summary = "创建数据命名与简写标准") + @PreAuthorize("@ss.hasPermission('infra:standard-name:create')") + public CommonResult createStandardName(@Valid @RequestBody StandardNameSaveReqVO createReqVO) { + return success(standardNameService.createStandardName(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新数据命名与简写标准") + @PreAuthorize("@ss.hasPermission('infra:standard-name:update')") + public CommonResult updateStandardName(@Valid @RequestBody StandardNameSaveReqVO updateReqVO) { + standardNameService.updateStandardName(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除数据命名与简写标准") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('infra:standard-name:delete')") + public CommonResult deleteStandardName(@RequestParam("id") Long id) { + standardNameService.deleteStandardName(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除数据命名与简写标准") + @PreAuthorize("@ss.hasPermission('infra:standard-name:delete')") + public CommonResult deleteStandardNameList(@RequestParam("ids") List ids) { + standardNameService.deleteStandardNameListByIds(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得数据命名与简写标准") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:standard-name:query')") + public CommonResult getStandardName(@RequestParam("id") Long id) { + StandardNameDO standardName = standardNameService.getStandardName(id); + return success(BeanUtils.toBean(standardName, StandardNameRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得数据命名与简写标准分页") + @PreAuthorize("@ss.hasPermission('infra:standard-name:query')") + public CommonResult> getStandardNamePage(@Valid StandardNamePageReqVO pageReqVO) { + PageResult pageResult = standardNameService.getStandardNamePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, StandardNameRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出数据命名与简写标准 Excel") + @PreAuthorize("@ss.hasPermission('infra:standard-name:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportStandardNameExcel(@Valid StandardNamePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = standardNameService.getStandardNamePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "数据命名与简写标准.xls", "数据", StandardNameRespVO.class, + BeanUtils.toBean(list, StandardNameRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsPageReqVO.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/standardname/vo/StandardNamePageReqVO.java similarity index 79% rename from yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsPageReqVO.java rename to yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/standardname/vo/StandardNamePageReqVO.java index ab50d46e..4186fc4f 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsPageReqVO.java +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/standardname/vo/StandardNamePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo; +package cn.iocoder.yudao.module.infra.controller.admin.standardname.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.v3.oas.annotations.media.Schema; @@ -11,16 +11,16 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @Schema(description = "管理后台 - 数据命名与简写标准分页 Request VO") @Data -public class StdNmsPageReqVO extends PageParam { +public class StandardNamePageReqVO extends PageParam { @Schema(description = "英文") private String word; @Schema(description = "简写") - private String abbr; + private String abbreviation; @Schema(description = "中文意思") - private String info; + private String information; @Schema(description = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsRespVO.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/standardname/vo/StandardNameRespVO.java similarity index 82% rename from yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsRespVO.java rename to yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/standardname/vo/StandardNameRespVO.java index 47be53e7..1a41fc8d 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsRespVO.java +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/standardname/vo/StandardNameRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo; +package cn.iocoder.yudao.module.infra.controller.admin.standardname.vo; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; @@ -10,9 +10,9 @@ import java.time.LocalDateTime; @Schema(description = "管理后台 - 数据命名与简写标准 Response VO") @Data @ExcelIgnoreUnannotated -public class StdNmsRespVO { +public class StandardNameRespVO { - @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2987") + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8832") @ExcelProperty("主键ID") private Long id; @@ -22,11 +22,11 @@ public class StdNmsRespVO { @Schema(description = "简写", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("简写") - private String abbr; + private String abbreviation; @Schema(description = "中文意思", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("中文意思") - private String info; + private String information; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsSaveReqVO.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/standardname/vo/StandardNameSaveReqVO.java similarity index 77% rename from yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsSaveReqVO.java rename to yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/standardname/vo/StandardNameSaveReqVO.java index be96fa8f..9fe73893 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsSaveReqVO.java +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/standardname/vo/StandardNameSaveReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo; +package cn.iocoder.yudao.module.infra.controller.admin.standardname.vo; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotEmpty; @@ -6,9 +6,9 @@ import lombok.Data; @Schema(description = "管理后台 - 数据命名与简写标准新增/修改 Request VO") @Data -public class StdNmsSaveReqVO { +public class StandardNameSaveReqVO { - @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2987") + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8832") private Long id; @Schema(description = "英文", requiredMode = Schema.RequiredMode.REQUIRED) @@ -17,10 +17,10 @@ public class StdNmsSaveReqVO { @Schema(description = "简写", requiredMode = Schema.RequiredMode.REQUIRED) @NotEmpty(message = "简写不能为空") - private String abbr; + private String abbreviation; @Schema(description = "中文意思", requiredMode = Schema.RequiredMode.REQUIRED) @NotEmpty(message = "中文意思不能为空") - private String info; + private String information; } \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/StdNmsController.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/StdNmsController.java deleted file mode 100644 index fb11064a..00000000 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/StdNmsController.java +++ /dev/null @@ -1,120 +0,0 @@ -package cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms; - -import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; -import cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo.StdNmsPageReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo.StdNmsRespVO; -import cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo.StdNmsSaveReqVO; -import cn.iocoder.yudao.module.infra.dal.dataobject.stdnms.stdnms.StdNmsDO; -import cn.iocoder.yudao.module.infra.stdnms.StdNmsService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.Valid; -import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.http.HttpStatus; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; -import java.util.List; - -import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 数据命名与简写标准") -@RestController -@RequestMapping("/infra/std-nms") -@Validated -public class StdNmsController { - - @Resource - private StdNmsService stdNmsService; - - @PostMapping("/create") - @Operation(summary = "创建数据命名与简写标准") - @PreAuthorize("@ss.hasPermission('system:std-nms:create')") - @TenantIgnore - public CommonResult createStdNms(@Valid @RequestBody StdNmsSaveReqVO createReqVO) { - try { - return success(stdNmsService.createStdNms(createReqVO)); - } catch (DataIntegrityViolationException e) { - return CommonResult.customize(0L, HttpStatus.BAD_REQUEST.value(), "已存在相同含义的定义"); - } - } - - @PutMapping("/update") - @Operation(summary = "更新数据命名与简写标准") - @PreAuthorize("@ss.hasPermission('system:std-nms:update')") - @TenantIgnore - public CommonResult updateStdNms(@Valid @RequestBody StdNmsSaveReqVO updateReqVO) { - try { - stdNmsService.updateStdNms(updateReqVO); - } catch (Exception e) { - return CommonResult.customize(true,HttpStatus.BAD_REQUEST.value(), "已存在相同含义的定义"); - } - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除数据命名与简写标准") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('system:std-nms:delete')") - @TenantIgnore - public CommonResult deleteStdNms(@RequestParam("id") Long id) { - stdNmsService.deleteStdNms(id); - return success(true); - } - - @DeleteMapping("/delete-list") - @Parameter(name = "ids", description = "编号", required = true) - @Operation(summary = "批量删除数据命名与简写标准") - @PreAuthorize("@ss.hasPermission('system:std-nms:delete')") - @TenantIgnore - public CommonResult deleteStdNmsList(@RequestParam("ids") List ids) { - stdNmsService.deleteStdNmsListByIds(ids); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得数据命名与简写标准") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('system:std-nms:query')") - @TenantIgnore - public CommonResult getStdNms(@RequestParam("id") Long id) { - StdNmsDO stdNms = stdNmsService.getStdNms(id); - return success(BeanUtils.toBean(stdNms, StdNmsRespVO.class)); - } - - @GetMapping("/page") - @Operation(summary = "获得数据命名与简写标准分页") - @PreAuthorize("@ss.hasPermission('system:std-nms:query')") - @TenantIgnore - public CommonResult> getStdNmsPage(@Valid StdNmsPageReqVO pageReqVO) { - PageResult pageResult = stdNmsService.getStdNmsPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, StdNmsRespVO.class)); - } - - @GetMapping("/export-excel") - @Operation(summary = "导出数据命名与简写标准 Excel") - @PreAuthorize("@ss.hasPermission('system:std-nms:export')") - @TenantIgnore - @ApiAccessLog(operateType = EXPORT) - public void exportStdNmsExcel(@Valid StdNmsPageReqVO pageReqVO, - HttpServletResponse response) throws IOException { - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = stdNmsService.getStdNmsPage(pageReqVO).getList(); - // 导出 Excel - ExcelUtils.write(response, "数据命名与简写标准.xls", "数据", StdNmsRespVO.class, - BeanUtils.toBean(list, StdNmsRespVO.class)); - } - -} \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/standardname/StandardNameDO.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/standardname/StandardNameDO.java new file mode 100644 index 00000000..b91daedd --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/standardname/StandardNameDO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.infra.dal.dataobject.standardname; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.*; +import lombok.*; + +/** + * 数据命名与简写标准 DO + * + * @author 后台管理 + */ +@TableName("infra_std_name") +@KeySequence("infra_std_name_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +/** + * 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO + */ +public class StandardNameDO extends BaseDO { + + + /** + * 主键ID + */ + @TableId(type = IdType.ASSIGN_ID) + private Long id; + /** + * 英文 + */ + @TableField("WORD") + private String word; + /** + * 简写 + */ + @TableField("ABBR") + private String abbreviation; + /** + * 中文意思 + */ + @TableField("INF") + private String information; + +} \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/stdnms/stdnms/StdNmsDO.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/stdnms/stdnms/StdNmsDO.java deleted file mode 100644 index 0b8299e9..00000000 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/stdnms/stdnms/StdNmsDO.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.iocoder.yudao.module.infra.dal.dataobject.stdnms.stdnms; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; -/** - * 数据命名与简写标准 DO - * - * @author 后台管理 - */ -@TableName("infra_std_nms") -@KeySequence("infra_std_nms_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -/** - * 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO - */ -public class StdNmsDO extends BaseDO { - - - /** - * 主键ID - */ - @TableId(type = IdType.ASSIGN_ID) - private Long id; - /** - * 英文 - */ - private String word; - /** - * 简写 - */ - private String abbr; - /** - * 中文意思 - */ - private String info; - /** - * 是否删除(取消逻辑删除) - */ - private Boolean deleted; - -} \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/CodegenTableMapper.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/CodegenTableMapper.java index f1967006..690410b0 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/CodegenTableMapper.java +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/CodegenTableMapper.java @@ -1,13 +1,18 @@ package cn.iocoder.yudao.module.infra.dal.mysql.codegen; +import cn.hutool.core.lang.func.LambdaUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO; import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.baomidou.mybatisplus.core.toolkit.LambdaUtils; +import com.baomidou.mybatisplus.core.toolkit.support.ColumnCache; import org.apache.ibatis.annotations.Mapper; +import org.springframework.util.StringUtils; import java.util.List; +import java.util.Map; @Mapper public interface CodegenTableMapper extends BaseMapperX { @@ -18,13 +23,27 @@ public interface CodegenTableMapper extends BaseMapperX { } default PageResult selectPage(CodegenTablePageReqVO pageReqVO) { - return selectPage(pageReqVO, new LambdaQueryWrapperX() - .likeIfPresent(CodegenTableDO::getTableName, pageReqVO.getTableName()) - .likeIfPresent(CodegenTableDO::getTableComment, pageReqVO.getTableComment()) - .likeIfPresent(CodegenTableDO::getClassName, pageReqVO.getClassName()) - .betweenIfPresent(CodegenTableDO::getCreateTime, pageReqVO.getCreateTime()) - .orderByDesc(CodegenTableDO::getUpdateTime) - ); + LambdaQueryWrapperX wrapper = new LambdaQueryWrapperX<>(); + + Map columnMap = LambdaUtils.getColumnMap(CodegenTableDO.class); + // 大小写不敏感的 like 查询,使用动态获取的列名 + if (StringUtils.hasText(pageReqVO.getTableName())) { + String tableNameColumn = LambdaUtil.getFieldName(CodegenTableDO::getTableName).toUpperCase(); + wrapper.apply("LOWER(" + columnMap.get(tableNameColumn).getColumn() + ") LIKE LOWER({0})", "%" + pageReqVO.getTableName() + "%"); + } + if (StringUtils.hasText(pageReqVO.getTableComment())) { + String tableCommentColumn = LambdaUtil.getFieldName(CodegenTableDO::getTableComment).toUpperCase(); + wrapper.apply("LOWER(" + columnMap.get(tableCommentColumn).getColumn() + ") LIKE LOWER({0})", "%" + pageReqVO.getTableComment() + "%"); + } + if (StringUtils.hasText(pageReqVO.getClassName())) { + String classNameColumn = LambdaUtil.getFieldName(CodegenTableDO::getClassName).toUpperCase(); + wrapper.apply("LOWER(" + columnMap.get(classNameColumn).getColumn() + ") LIKE LOWER({0})", "%" + pageReqVO.getClassName() + "%"); + } + + wrapper.betweenIfPresent(CodegenTableDO::getCreateTime, pageReqVO.getCreateTime()) + .orderByDesc(CodegenTableDO::getUpdateTime); + + return selectPage(pageReqVO, wrapper); } default List selectListByDataSourceConfigId(Long dataSourceConfigId) { diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/standardname/StandardNameMapper.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/standardname/StandardNameMapper.java new file mode 100644 index 00000000..2c742565 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/standardname/StandardNameMapper.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.module.infra.dal.mysql.standardname; + +import cn.hutool.core.lang.func.LambdaUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.infra.controller.admin.standardname.vo.StandardNamePageReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.standardname.StandardNameDO; +import com.baomidou.mybatisplus.core.toolkit.LambdaUtils; +import com.baomidou.mybatisplus.core.toolkit.support.ColumnCache; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.util.StringUtils; + +import java.util.Map; + +/** + * 数据命名与简写标准 Mapper + * + * @author 后台管理 + */ +@Mapper +public interface StandardNameMapper extends BaseMapperX { + + default PageResult selectPage(StandardNamePageReqVO reqVO) { + LambdaQueryWrapperX wrapper = new LambdaQueryWrapperX<>(); + + Map columnMap = LambdaUtils.getColumnMap(StandardNameDO.class); + // 大小写不敏感的 like 查询,使用动态获取的列名 + if (StringUtils.hasText(reqVO.getWord())) { + String wordColumn = LambdaUtil.getFieldName(StandardNameDO::getWord).toUpperCase(); + wrapper.apply("LOWER(" + columnMap.get(wordColumn).getColumn() + ") LIKE LOWER({0})", "%" + reqVO.getWord() + "%"); + } + if (StringUtils.hasText(reqVO.getAbbreviation())) { + String abbreviationColumn = LambdaUtil.getFieldName(StandardNameDO::getAbbreviation).toUpperCase(); + wrapper.apply("LOWER(" + columnMap.get(abbreviationColumn).getColumn() + ") LIKE LOWER({0})", "%" + reqVO.getAbbreviation() + "%"); + } + if (StringUtils.hasText(reqVO.getInformation())) { + String informationColumn = LambdaUtil.getFieldName(StandardNameDO::getInformation).toUpperCase(); + wrapper.apply("LOWER(" + columnMap.get(informationColumn).getColumn() + ") LIKE LOWER({0})", "%" + reqVO.getInformation() + "%"); + } + + wrapper.betweenIfPresent(StandardNameDO::getCreateTime, reqVO.getCreateTime()) + .orderByAsc(StandardNameDO::getWord); + + return selectPage(reqVO, wrapper); + } + +} \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/stdnms/StdNmsMapper.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/stdnms/StdNmsMapper.java deleted file mode 100644 index bc2d5e3c..00000000 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/stdnms/StdNmsMapper.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.module.infra.dal.mysql.stdnms; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo.StdNmsPageReqVO; -import cn.iocoder.yudao.module.infra.dal.dataobject.stdnms.stdnms.StdNmsDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 数据命名与简写标准 Mapper - * - * @author 后台管理 - */ -@Mapper -public interface StdNmsMapper extends BaseMapperX { - - // 使用自定义 XML SQL 分页查询,word 不区分大小写 - List selectPageCustom(StdNmsPageReqVO reqVO); - - default PageResult selectPage(StdNmsPageReqVO reqVO) { - List records = selectPageCustom(reqVO); - // 这里只做简单封装,如需 total 可自定义 count SQL - return new PageResult<>(records, (long) records.size()); - } -} - diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java index a1ae6f91..989fcfe4 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java @@ -64,18 +64,18 @@ public class CodegenServiceImpl implements CodegenService { public List createCodegenList(String author, CodegenCreateListReqVO reqVO) { List ids = new ArrayList<>(reqVO.getTableNames().size()); // 遍历添加。虽然效率会低一点,但是没必要做成完全批量,因为不会这么大量 - reqVO.getTableNames().forEach(tableName -> ids.add(createCodegen(author, reqVO.getDataSourceConfigId(), tableName))); + reqVO.getTableNames().forEach(tableName -> ids.add(createCodegen(author, reqVO.getDataSourceConfigId(), tableName, reqVO.getIsStandardized()))); return ids; } - private Long createCodegen(String author, Long dataSourceConfigId, String tableName) { + private Long createCodegen(String author, Long dataSourceConfigId, String tableName, Boolean isStandardized) { // 从数据库中,获得数据库表结构 - TableInfo tableInfo = databaseTableService.getTable(dataSourceConfigId, tableName); + TableInfo tableInfo = databaseTableService.getTable(dataSourceConfigId, tableName, isStandardized); // 导入 - return createCodegen0(author, dataSourceConfigId, tableInfo); + return createCodegen0(author, dataSourceConfigId, tableInfo, isStandardized); } - private Long createCodegen0(String author, Long dataSourceConfigId, TableInfo tableInfo) { + private Long createCodegen0(String author, Long dataSourceConfigId, TableInfo tableInfo, Boolean isStandardized) { // 校验导入的表和字段非空 validateTableInfo(tableInfo); // 校验是否已经存在 @@ -85,7 +85,7 @@ public class CodegenServiceImpl implements CodegenService { } // 构建 CodegenTableDO 对象,插入到 DB 中 - CodegenTableDO table = codegenBuilder.buildTable(tableInfo); + CodegenTableDO table = codegenBuilder.buildTable(tableInfo, isStandardized); table.setDataSourceConfigId(dataSourceConfigId); table.setScene(CodegenSceneEnum.ADMIN.getScene()); // 默认配置下,使用管理后台的模板 table.setFrontType(codegenProperties.getFrontType()); @@ -155,7 +155,7 @@ public class CodegenServiceImpl implements CodegenService { throw exception(CODEGEN_TABLE_NOT_EXISTS); } // 从数据库中,获得数据库表结构 - TableInfo tableInfo = databaseTableService.getTable(table.getDataSourceConfigId(), table.getTableName()); + TableInfo tableInfo = databaseTableService.getTable(table.getDataSourceConfigId(), table.getTableName(),false); // 执行同步 syncCodegen0(tableId, tableInfo); } diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilder.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilder.java index 80c846a9..7cca9ec7 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilder.java +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilder.java @@ -14,6 +14,7 @@ import cn.iocoder.yudao.module.infra.enums.codegen.CodegenTemplateTypeEnum; import com.baomidou.mybatisplus.generator.config.po.TableField; import com.baomidou.mybatisplus.generator.config.po.TableInfo; import com.google.common.collect.Sets; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -104,9 +105,14 @@ public class CodegenBuilder { LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是需要返回的 } - public CodegenTableDO buildTable(TableInfo tableInfo) { + public CodegenTableDO buildTable(TableInfo tableInfo, Boolean isStandardized) { CodegenTableDO table = CodegenConvert.INSTANCE.convert(tableInfo); - initTableDefault(table); + if (isStandardized) { + initTableDefault(table, table.getTableName().toLowerCase(), tableInfo.getEntityName()); + }else{ + initTableDefault(table, table.getTableName().toLowerCase(), null); + } + return table; } @@ -114,17 +120,20 @@ public class CodegenBuilder { * 初始化 Table 表的默认字段 * * @param table 表定义 + * @param tableName */ - private void initTableDefault(CodegenTableDO table) { + private void initTableDefault(CodegenTableDO table, String tableName, String entityName) { // 以 system_dept 举例子。moduleName 为 system、businessName 为 dept、className 为 Dept // 如果希望以 System 前缀,则可以手动在【代码生成 - 修改生成配置 - 基本信息】,将实体类名称改为 SystemDept 即可 - String tableName = table.getTableName().toLowerCase(); // 第一步,_ 前缀的前面,作为 module 名字;第二步,moduleName 必须小写; - table.setModuleName(subBefore(tableName, '_', false).toLowerCase()); + String moduleName = subBefore(tableName, '_', false).toLowerCase(); + table.setModuleName(moduleName.toLowerCase()); // 第一步,第一个 _ 前缀的后面,作为 module 名字; 第二步,可能存在多个 _ 的情况,转换成驼峰; 第三步,businessName 必须小写; - table.setBusinessName(toCamelCase(subAfter(tableName, '_', false)).toLowerCase()); + String businessName = toCamelCase(subAfter(tableName, '_', false)).toLowerCase(); + table.setBusinessName(StringUtils.isBlank(entityName) ? businessName : entityName.toLowerCase()); // 驼峰 + 首字母大写;第一步,第一个 _ 前缀的后面,作为 class 名字;第二步,驼峰命名 - table.setClassName(upperFirst(toCamelCase(subAfter(tableName, '_', false)))); + String className = upperFirst(toCamelCase(subAfter(tableName, '_', false))); + table.setClassName(StringUtils.isBlank(entityName) ? className : entityName); // 去除结尾的表,作为类描述 table.setClassComment(StrUtil.removeSuffixIgnoreCase(table.getTableComment(), "表")); table.setTemplateType(CodegenTemplateTypeEnum.ONE.getType()); diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java index 39459d47..0f18508b 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java @@ -29,13 +29,12 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO; import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO; -import cn.iocoder.yudao.module.infra.dal.dataobject.stdnms.stdnms.StdNmsDO; import cn.iocoder.yudao.module.infra.enums.codegen.CodegenFrontTypeEnum; import cn.iocoder.yudao.module.infra.enums.codegen.CodegenSceneEnum; import cn.iocoder.yudao.module.infra.enums.codegen.CodegenTemplateTypeEnum; import cn.iocoder.yudao.module.infra.enums.codegen.CodegenVOTypeEnum; import cn.iocoder.yudao.module.infra.framework.codegen.config.CodegenProperties; -import cn.iocoder.yudao.module.infra.stdnms.StdNmsService; +import cn.iocoder.yudao.module.infra.service.standardname.StandardNameService; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableTable; @@ -48,14 +47,9 @@ import org.springframework.stereotype.Component; import org.springframework.util.ClassUtils; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; -import java.util.stream.IntStream; import static cn.hutool.core.map.MapUtil.getStr; import static cn.hutool.core.text.CharSequenceUtil.*; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.STD_ABBR_NOT_EXISTS; /** * 代码生成的引擎,用于具体生成代码 @@ -67,7 +61,7 @@ import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.STD_ABBR_NO @Component public class CodegenEngine { @Resource - private StdNmsService stdNmsService; + private StandardNameService standardNameService; /** * 后端的模板配置 @@ -284,6 +278,7 @@ public class CodegenEngine { */ /** * 代码生成,支持传递额外参数 + * * @param extraParam 额外参数,如 isBusiness */ public Map execute(CodegenTableDO table, List columns, @@ -291,9 +286,6 @@ public class CodegenEngine { // 1.1 初始化 bindMap 上下文 Map bindingMap = initBindingMap(table, columns, subTables, subColumnsList); - // 标准化命名校验逻辑 - standardizedJavaField(columns, subColumnsList, extraParam); - // 传递 extraParam 到模板 if (extraParam != null) { bindingMap.putAll(extraParam); @@ -327,68 +319,6 @@ public class CodegenEngine { return result; } - /** - * 如果是标准化的字段名需要针对标准命名表映射 javaField 全名 - * @param columns 主表的字段集合 - * @param subColumnsList 子表的字段集合 - * @param extraParam 额外参数,包含 isStandardized 标志 - */ - private void standardizedJavaField(List columns, List> subColumnsList, Map extraParam) { - if (extraParam != null && Boolean.TRUE.equals(extraParam.get("isStandardized"))) { - List allColumns = new ArrayList<>(); - allColumns.addAll(columns); - allColumns.addAll(Optional.ofNullable(subColumnsList).orElse(new ArrayList<>()).stream().flatMap(Collection::stream).toList()); - // BusinessBaseDO 字段集合 - Set businessBaseFields = CodegenBuilder.BUSINESS_BASE_DO_FIELDS; - Map abbrToFullName = new HashMap<>(); - Set columnNameSet = allColumns.stream() - // 跳过 BusinessBaseDO 字段 - .filter(x -> !businessBaseFields.contains(x.getJavaField())) - .map(CodegenColumnDO::getColumnName).collect(Collectors.toSet()); - // 分词(如驼峰转词组) - Set phrases = columnNameSet.stream().map(String::toLowerCase) - // 分割,最终使用大写 - .flatMap(y -> Arrays.stream(y.split("_"))).map(String::toUpperCase) - .collect(Collectors.toSet()); - List checkedData = stdNmsService.getStdNmsListByAbbrs(phrases); - Set stdAbbrSet = checkedData.stream().map(StdNmsDO::getAbbr).collect(Collectors.toSet()); - phrases.removeAll(stdAbbrSet); - if (CollUtil.isNotEmpty(phrases)) { - throw exception(STD_ABBR_NOT_EXISTS, String.join(",", phrases)); - } - Map stdNmsAbbrMap = new ConcurrentHashMap<>(); - checkedData.forEach(x-> { - stdNmsAbbrMap.put(x.getAbbr(), x.getWord()); - }); - - // 构造列名和全名的映射(需要根据短语映射的关系进行拼接) - abbrToFullName = allColumns.stream() - // 跳过 BusinessBaseDO 字段 - .filter(x -> !businessBaseFields.contains(x.getJavaField())) - .collect(Collectors.toMap( - CodegenColumnDO::getJavaField, - column -> { - // 1.1.1 获取短语 - String columnName = column.getColumnName().toUpperCase(); - List words = new LinkedList<>(Arrays.asList(columnName.split("_"))); - List fullWords = words.stream().map(stdNmsAbbrMap::get).map(String::toLowerCase).toList(); - // 拼接 fullName 除第一个单词外,首字母需要大写 - return IntStream.range(0, fullWords.size()) - .mapToObj(i -> i == 0 ? fullWords.get(i) : Character.toUpperCase(fullWords.get(i).charAt(0)) + fullWords.get(i).substring(1)) - .collect(Collectors.joining()); - }, - (v1, v2) -> v1, - HashMap::new - )); - // 替换 所有列的 javaField - Map finalAbbrToFullName = abbrToFullName; - columns.stream().filter(x -> !businessBaseFields.contains(x.getJavaField())).forEach(column -> { - String fullName = finalAbbrToFullName.get(column.getJavaField()); - column.setJavaField(fullName); - }); - } - } - /** * 兼容原有接口,默认 isBusiness=false */ diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableService.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableService.java index c58b125c..d9e9122c 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableService.java +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableService.java @@ -25,9 +25,10 @@ public interface DatabaseTableService { * 获得指定表名 * * @param dataSourceConfigId 数据源配置的编号 - * @param tableName 表名称 + * @param name 表名称 + * @param isStandardized 是否标准化的表名 * @return 表 */ - TableInfo getTable(Long dataSourceConfigId, String tableName); + TableInfo getTable(Long dataSourceConfigId, String name, Boolean isStandardized); } diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableServiceImpl.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableServiceImpl.java index 289cae1e..ae7e28d0 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableServiceImpl.java @@ -5,19 +5,27 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils; import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO; +import cn.iocoder.yudao.module.infra.dal.dataobject.standardname.StandardNameDO; +import cn.iocoder.yudao.module.infra.service.codegen.inner.CodegenBuilder; +import cn.iocoder.yudao.module.infra.service.standardname.StandardNameService; import com.baomidou.mybatisplus.generator.config.DataSourceConfig; import com.baomidou.mybatisplus.generator.config.GlobalConfig; import com.baomidou.mybatisplus.generator.config.StrategyConfig; import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder; +import com.baomidou.mybatisplus.generator.config.po.TableField; import com.baomidou.mybatisplus.generator.config.po.TableInfo; import com.baomidou.mybatisplus.generator.config.rules.DateType; import com.baomidou.mybatisplus.generator.query.SQLQuery; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; -import java.util.Comparator; -import java.util.List; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.STD_ABBR_NOT_EXISTS; /** * 数据库表 Service 实现类 @@ -30,20 +38,27 @@ public class DatabaseTableServiceImpl implements DatabaseTableService { @Resource private DataSourceConfigService dataSourceConfigService; + @Resource + private StandardNameService standardNameService; + @Override public List getTableList(Long dataSourceConfigId, String nameLike, String commentLike) { - List tables = getTableList0(dataSourceConfigId, null); - return tables.stream().filter(tableInfo -> (StrUtil.isEmpty(nameLike) || tableInfo.getName().contains(nameLike)) - && (StrUtil.isEmpty(commentLike) || tableInfo.getComment().contains(commentLike))) - .collect(Collectors.toList()); + List tables = getTableList0(dataSourceConfigId, null,false); + // 转为小写进行不区分大小写的匹配 + String nameLikeLower = StrUtil.isEmpty(nameLike) ? null : nameLike.toLowerCase(); + String commentLikeLower = StrUtil.isEmpty(commentLike) ? null : commentLike.toLowerCase(); + return tables.stream().filter(tableInfo -> + (nameLikeLower == null || (tableInfo.getName() != null && tableInfo.getName().toLowerCase().contains(nameLikeLower))) + && (commentLikeLower == null || (tableInfo.getComment() != null && tableInfo.getComment().toLowerCase().contains(commentLikeLower))) + ).collect(Collectors.toList()); } @Override - public TableInfo getTable(Long dataSourceConfigId, String name) { - return CollUtil.getFirst(getTableList0(dataSourceConfigId, name)); + public TableInfo getTable(Long dataSourceConfigId, String name, Boolean isStandardized) { + return CollUtil.getFirst(getTableList0(dataSourceConfigId, name, isStandardized)); } - private List getTableList0(Long dataSourceConfigId, String name) { + private List getTableList0(Long dataSourceConfigId, String name, Boolean isStandardized) { // 获得数据源配置 DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(dataSourceConfigId); Assert.notNull(config, "数据源({}) 不存在!", dataSourceConfigId); @@ -70,8 +85,107 @@ public class DatabaseTableServiceImpl implements DatabaseTableService { null, globalConfig, null); // 按照名字排序 List tables = builder.getTableInfoList(); + standardizedAbbrName(tables, isStandardized); tables.sort(Comparator.comparing(TableInfo::getName)); return tables; } + /** + * 如果是标准化的字段名需要针对标准命名表映射 javaField 全名 + * + */ + private void standardizedAbbrName(List tableInfos, Boolean isStandardized) { + if (isStandardized) { + Set businessBaseFields = CodegenBuilder.BUSINESS_BASE_DO_FIELDS; + // 获取所有的简写列名 + Set columnNameSet = tableInfos.stream().flatMap(tableInfo -> { + List fields = tableInfo.getFields(); + return fields.stream() + // 跳过 BusinessBaseDO 字段 + .filter(x -> !businessBaseFields.contains(x.getPropertyName())) + .map(TableField::getColumnName); + }).collect(Collectors.toSet()); + // 获取所有简写表名 + Set tableNameSet = tableInfos.stream() + .map(TableInfo::getName) + // 只取第一个 _ 后面的部分,模块名称不缩写,也不进行匹配 + .map(tableName -> { + int index = tableName.indexOf("_"); + return index == -1 ? tableName : tableName.substring(index + 1); + }) + .collect(Collectors.toSet()); + columnNameSet.addAll(tableNameSet); + + // 获取所有列名,表名的分词集合 _ 分割 + Set phrases = columnNameSet.stream().map(String::toLowerCase) + // 分割,最终使用大写 + .flatMap(y -> Arrays.stream(y.split("_"))).map(String::toUpperCase) + .collect(Collectors.toSet()); + + List checkedData = standardNameService.getStandardNameListByAbbrs(phrases); + Set abbrSet = checkedData.stream().map(StandardNameDO::getAbbreviation).collect(Collectors.toSet()); + + // 如果对于的缩写不存在,则抛出异常提示不符合规范的字段缩写单词 + phrases.removeAll(abbrSet); + if (CollUtil.isNotEmpty(phrases)) { + throw exception(STD_ABBR_NOT_EXISTS, String.join(",", phrases)); + } + + // 缩写分词与全写分词的映射关系 + Map abbrToFullWord = new ConcurrentHashMap<>(); + checkedData.forEach(x -> { + abbrToFullWord.put(x.getAbbreviation(), x.getWord()); + }); + + // 缩写列名与全名的映射关系(忽略大小写) + Map abbrNameToFullName; + // 构造列名和全名的映射(需要根据短语映射的关系进行拼接) + abbrNameToFullName = (columnNameSet.stream() + .collect(Collectors.toMap( + x -> x, + abbrName -> { + // 1.1.1 获取短语 + String abbrNameUpperCase = abbrName.toUpperCase(); + List words = new LinkedList<>(Arrays.asList(abbrNameUpperCase.split("_"))); + List fullWords = words.stream().map(abbrToFullWord::get).toList(); + // 拼接 fullName 除第一个单词外,首字母需要大写 + return IntStream.range(0, fullWords.size()) + .mapToObj(i -> i == 0 ? fullWords.get(i) : Character.toUpperCase(fullWords.get(i).charAt(0)) + fullWords.get(i).substring(1)) + .collect(Collectors.joining()); + }, + (v1, v2) -> v1, + () -> new TreeMap<>(String.CASE_INSENSITIVE_ORDER) + ))); + // 替换 所有 JavaField + Map finalAbbrNameToFullName = abbrNameToFullName; + tableInfos.forEach(tableInfo -> { + // 处理表名/实体名称 + String tableName = tableInfo.getName(); + // 只使用第一个_后面的部分,模块名称不缩写,也不进行匹配 + int index = tableName.indexOf("_"); + String tableNamePart = index == -1 ? tableName : tableName.substring(index + 1); + String entityFullName = finalAbbrNameToFullName.get(tableNamePart.toUpperCase()); + + if (entityFullName != null) { + tableInfo.setEntityName(entityFullName); + tableInfo.getStrategyConfig().mapper().getConverterMapperFileName().convert(tableInfo.getEntityName()); + tableInfo.getStrategyConfig().mapper().getConverterXmlFileName().convert(tableInfo.getEntityName()); + tableInfo.getStrategyConfig().service().getConverterServiceFileName().convert(tableInfo.getEntityName()); + tableInfo.getStrategyConfig().service().getConverterServiceImplFileName().convert(tableInfo.getEntityName()); + } + + // 处理字段名称 + tableInfo.getFields().forEach(field -> { + String columnName = field.getColumnName(); + String fieldFullName = finalAbbrNameToFullName.get(columnName); + if (fieldFullName != null) { + fieldFullName = fieldFullName.substring(0, 1).toLowerCase() + fieldFullName.substring(1); + field.setPropertyName(fieldFullName,field.getColumnType()); + } + }); + + }); + } + } + } diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/standardname/StandardNameService.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/standardname/StandardNameService.java new file mode 100644 index 00000000..66954b90 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/standardname/StandardNameService.java @@ -0,0 +1,66 @@ +package cn.iocoder.yudao.module.infra.service.standardname; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.infra.controller.admin.standardname.vo.StandardNamePageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.standardname.vo.StandardNameRespVO; +import cn.iocoder.yudao.module.infra.controller.admin.standardname.vo.StandardNameSaveReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.standardname.StandardNameDO; +import jakarta.validation.Valid; + +import java.util.Collection; +import java.util.List; + +/** + * 数据命名与简写标准 Service 接口 + * + * @author 后台管理 + */ +public interface StandardNameService { + + /** + * 创建数据命名与简写标准 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + StandardNameRespVO createStandardName(@Valid StandardNameSaveReqVO createReqVO); + + /** + * 更新数据命名与简写标准 + * + * @param updateReqVO 更新信息 + */ + void updateStandardName(@Valid StandardNameSaveReqVO updateReqVO); + + /** + * 删除数据命名与简写标准 + * + * @param id 编号 + */ + void deleteStandardName(Long id); + + /** + * 批量删除数据命名与简写标准 + * + * @param ids 编号 + */ + void deleteStandardNameListByIds(List ids); + + /** + * 获得数据命名与简写标准 + * + * @param id 编号 + * @return 数据命名与简写标准 + */ + StandardNameDO getStandardName(Long id); + + /** + * 获得数据命名与简写标准分页 + * + * @param pageReqVO 分页查询 + * @return 数据命名与简写标准分页 + */ + PageResult getStandardNamePage(StandardNamePageReqVO pageReqVO); + + List getStandardNameListByAbbrs(Collection abbrs); +} \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/standardname/StandardNameServiceImpl.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/standardname/StandardNameServiceImpl.java new file mode 100644 index 00000000..5358c829 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/standardname/StandardNameServiceImpl.java @@ -0,0 +1,97 @@ +package cn.iocoder.yudao.module.infra.service.standardname; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.infra.controller.admin.standardname.vo.StandardNamePageReqVO; +import cn.iocoder.yudao.module.infra.controller.admin.standardname.vo.StandardNameRespVO; +import cn.iocoder.yudao.module.infra.controller.admin.standardname.vo.StandardNameSaveReqVO; +import cn.iocoder.yudao.module.infra.dal.dataobject.standardname.StandardNameDO; +import cn.iocoder.yudao.module.infra.dal.mysql.standardname.StandardNameMapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.Collection; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.STANDARD_NAME_NOT_EXISTS; + +/** + * 数据命名与简写标准 Service 实现类 + * + * @author 后台管理 + */ +@Service +@Validated +public class StandardNameServiceImpl implements StandardNameService { + + @Resource + private StandardNameMapper standardNameMapper; + + @Override + public StandardNameRespVO createStandardName(StandardNameSaveReqVO createReqVO) { + // 插入 + StandardNameDO standardName = BeanUtils.toBean(createReqVO, StandardNameDO.class); + standardNameMapper.insert(standardName); + // 返回 + return BeanUtils.toBean(standardName, StandardNameRespVO.class); + } + + @Override + public void updateStandardName(StandardNameSaveReqVO updateReqVO) { + // 校验存在 + validateStandardNameExists(updateReqVO.getId()); + // 更新 + StandardNameDO updateObj = BeanUtils.toBean(updateReqVO, StandardNameDO.class); + standardNameMapper.updateById(updateObj); + } + + @Override + public void deleteStandardName(Long id) { + // 校验存在 + validateStandardNameExists(id); + // 删除 + standardNameMapper.deleteById(id); + } + + @Override + public void deleteStandardNameListByIds(List ids) { + // 校验存在 + validateStandardNameExists(ids); + // 删除 + standardNameMapper.deleteByIds(ids); + } + + private void validateStandardNameExists(List ids) { + List list = standardNameMapper.selectByIds(ids); + if (CollUtil.isEmpty(list) || list.size() != ids.size()) { + throw exception(STANDARD_NAME_NOT_EXISTS); + } + } + + private void validateStandardNameExists(Long id) { + if (standardNameMapper.selectById(id) == null) { + throw exception(STANDARD_NAME_NOT_EXISTS); + } + } + + @Override + public StandardNameDO getStandardName(Long id) { + return standardNameMapper.selectById(id); + } + + @Override + public PageResult getStandardNamePage(StandardNamePageReqVO pageReqVO) { + return standardNameMapper.selectPage(pageReqVO); + } + + @Override + public List getStandardNameListByAbbrs(Collection abbrs) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("abbr", abbrs); + return standardNameMapper.selectList(queryWrapper); + } +} \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/stdnms/StdNmsService.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/stdnms/StdNmsService.java deleted file mode 100644 index df15aaca..00000000 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/stdnms/StdNmsService.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.iocoder.yudao.module.infra.stdnms; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo.StdNmsPageReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo.StdNmsSaveReqVO; -import cn.iocoder.yudao.module.infra.dal.dataobject.stdnms.stdnms.StdNmsDO; -import jakarta.validation.Valid; - -import java.util.Collection; -import java.util.List; - -/** - * 数据命名与简写标准 Service 接口 - * - * @author 后台管理 - */ -public interface StdNmsService { - - /** - * 创建数据命名与简写标准 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createStdNms(@Valid StdNmsSaveReqVO createReqVO); - - /** - * 更新数据命名与简写标准 - * - * @param updateReqVO 更新信息 - */ - void updateStdNms(@Valid StdNmsSaveReqVO updateReqVO); - - /** - * 删除数据命名与简写标准 - * - * @param id 编号 - */ - void deleteStdNms(Long id); - - /** - * 批量删除数据命名与简写标准 - * - * @param ids 编号 - */ - void deleteStdNmsListByIds(List ids); - - /** - * 获得数据命名与简写标准 - * - * @param id 编号 - * @return 数据命名与简写标准 - */ - StdNmsDO getStdNms(Long id); - - /** - * 获得数据命名与简写标准分页 - * - * @param pageReqVO 分页查询 - * @return 数据命名与简写标准分页 - */ - PageResult getStdNmsPage(StdNmsPageReqVO pageReqVO); - /** - * 根据缩写查询数据命名与简写标准 - * @param abbr 缩写 - * @return 数据命名与简写标准 - */ - StdNmsDO getStdNmsByAbbr(String abbr); - - /** - * 根据缩写列表查询数据命名与简写标准 - * @param abbrs 缩写列表 - * @return 数据命名与简写标准列表 - */ - List getStdNmsListByAbbrs(Collection abbrs); -} \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/stdnms/StdNmsServiceImpl.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/stdnms/StdNmsServiceImpl.java deleted file mode 100644 index 68a165b2..00000000 --- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/stdnms/StdNmsServiceImpl.java +++ /dev/null @@ -1,105 +0,0 @@ -package cn.iocoder.yudao.module.infra.stdnms; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; -import cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo.StdNmsPageReqVO; -import cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo.StdNmsSaveReqVO; -import cn.iocoder.yudao.module.infra.dal.dataobject.stdnms.stdnms.StdNmsDO; -import cn.iocoder.yudao.module.infra.dal.mysql.stdnms.StdNmsMapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import java.util.Collection; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.STD_NMS_NOT_EXISTS; - -/** - * 数据命名与简写标准 Service 实现类 - * - * @author 后台管理 - */ -@Service -@Validated -@TenantIgnore -public class StdNmsServiceImpl implements StdNmsService { - - @Resource - private StdNmsMapper stdNmsMapper; - - @Override - public StdNmsDO getStdNmsByAbbr(String abbr) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("abbr", abbr); - return stdNmsMapper.selectOne(queryWrapper); - } - - @Override - public List getStdNmsListByAbbrs(Collection abbrs) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.in("abbr", abbrs); - return stdNmsMapper.selectList(queryWrapper); - } - - @Override - public Long createStdNms(StdNmsSaveReqVO createReqVO) { - StdNmsDO stdNms = BeanUtils.toBean(createReqVO, StdNmsDO.class); - stdNmsMapper.insert(stdNms); - // 返回 - return stdNms.getId(); - } - - @Override - public void updateStdNms(StdNmsSaveReqVO updateReqVO) { - // 校验存在 - validateStdNmsExists(updateReqVO.getId()); - // 更新 - StdNmsDO updateObj = BeanUtils.toBean(updateReqVO, StdNmsDO.class); - stdNmsMapper.updateById(updateObj); - } - - @Override - public void deleteStdNms(Long id) { - // 校验存在 - validateStdNmsExists(id); - // 删除 - stdNmsMapper.deleteById(id); - } - - @Override - public void deleteStdNmsListByIds(List ids) { - // 校验存在 - validateStdNmsExists(ids); - // 删除 - stdNmsMapper.deleteByIds(ids); - } - - private void validateStdNmsExists(List ids) { - List list = stdNmsMapper.selectByIds(ids); - if (CollUtil.isEmpty(list) || list.size() != ids.size()) { - throw exception(STD_NMS_NOT_EXISTS); - } - } - - private void validateStdNmsExists(Long id) { - if (stdNmsMapper.selectById(id) == null) { - throw exception(STD_NMS_NOT_EXISTS); - } - } - - @Override - public StdNmsDO getStdNms(Long id) { - return stdNmsMapper.selectById(id); - } - - @Override - public PageResult getStdNmsPage(StdNmsPageReqVO pageReqVO) { - return stdNmsMapper.selectPage(pageReqVO); - } - -} \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/application.yaml b/yudao-module-infra/yudao-module-infra-server/src/main/resources/application.yaml index d336b3bf..acddc695 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/resources/application.yaml +++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/application.yaml @@ -173,6 +173,6 @@ yudao: enable: true ignore-urls: ignore-tables: - - infra_std_nms + - infra_std_name debug: false diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/dal/do.vm b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/dal/do.vm index ace9f98a..d85dd24a 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/dal/do.vm +++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/dal/do.vm @@ -86,7 +86,7 @@ public static final Long ${treeParentColumn_javaField_underlineCase.toUpperCase( #end #if($isStandardized == true) #if(!${column.primaryKey}) - @TableField("${column.columnName}") + @TableField("${column.columnName}") #end #end private ${column.javaType} ${column.javaField}; diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/dal/do_sub.vm b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/dal/do_sub.vm index 0dfc38ff..1c599cae 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/dal/do_sub.vm +++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/dal/do_sub.vm @@ -55,7 +55,12 @@ public class ${subTable.className}DO extends BaseDO { #end */ #if (${column.primaryKey})##处理主键 - @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end + @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#else(type = IdType.ASSIGN_ID)#end + #end + #if($isStandardized == true) + #if(!${column.primaryKey}) + @TableField("${column.columnName}") + #end #end #if ($voType == 20) ## 1. 处理 Swagger 注解 diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/vue3/api/api.ts.vm b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/vue3/api/api.ts.vm index bf7a7960..986d23b1 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/vue3/api/api.ts.vm +++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/vue3/api/api.ts.vm @@ -65,10 +65,13 @@ export const ${simpleClassName}Api = { return await request.download({ url: `${baseURL}/export-excel`, params }) }, + #if($isFileUpload && $isFileUpload == true) // 查询接口相关的文件上传元数据信息 getFileUploadInfo: async () => { return await request.get({url: `${baseURL}/upload-info`}) - } + }, + #end + ## 特殊:主子表专属逻辑 #foreach ($subTable in $subTables) #set ($index = $foreach.count - 1) diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/mapper/standardname/StandardNameMapper.xml b/yudao-module-infra/yudao-module-infra-server/src/main/resources/mapper/standardname/StandardNameMapper.xml new file mode 100644 index 00000000..75eea1a1 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/mapper/standardname/StandardNameMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/mapper/stdnms/StdNmsMapper.xml b/yudao-module-infra/yudao-module-infra-server/src/main/resources/mapper/stdnms/StdNmsMapper.xml deleted file mode 100644 index 9e42dcb1..00000000 --- a/yudao-module-infra/yudao-module-infra-server/src/main/resources/mapper/stdnms/StdNmsMapper.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - diff --git a/yudao-module-infra/yudao-module-infra-server/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImplTest.java b/yudao-module-infra/yudao-module-infra-server/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImplTest.java index dfef7866..da52e8c5 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImplTest.java +++ b/yudao-module-infra/yudao-module-infra-server/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImplTest.java @@ -79,7 +79,7 @@ public class CodegenServiceImplTest extends BaseDbUnitTest { o -> o.setDataSourceConfigId(1L).setTableNames(Collections.singletonList("t_yunai"))); // mock 方法(TableInfo) TableInfo tableInfo = mock(TableInfo.class); - when(databaseTableService.getTable(eq(1L), eq("t_yunai"))) + when(databaseTableService.getTable(eq(1L), eq("t_yunai"), false)) .thenReturn(tableInfo); when(tableInfo.getComment()).thenReturn("芋艿"); // mock 方法(TableInfo fields) @@ -91,7 +91,7 @@ public class CodegenServiceImplTest extends BaseDbUnitTest { when(tableInfo.getFields()).thenReturn(fields); // mock 方法(CodegenTableDO) CodegenTableDO table = randomPojo(CodegenTableDO.class); - when(codegenBuilder.buildTable(same(tableInfo))).thenReturn(table); + when(codegenBuilder.buildTable(same(tableInfo), false)).thenReturn(table); // mock 方法(CodegenColumnDO) List columns = randomPojoList(CodegenColumnDO.class); when(codegenBuilder.buildColumns(eq(table.getId()), same(fields))) @@ -240,7 +240,7 @@ public class CodegenServiceImplTest extends BaseDbUnitTest { Long tableId = table.getId(); // mock 方法(TableInfo) TableInfo tableInfo = mock(TableInfo.class); - when(databaseTableService.getTable(eq(1L), eq("t_yunai"))) + when(databaseTableService.getTable(eq(1L), eq("t_yunai"), false)) .thenReturn(tableInfo); when(tableInfo.getComment()).thenReturn("芋艿"); // mock 方法(TableInfo fields) @@ -250,7 +250,7 @@ public class CodegenServiceImplTest extends BaseDbUnitTest { when(field03.getComment()).thenReturn("分类"); List fields = Arrays.asList(field01, field03); when(tableInfo.getFields()).thenReturn(fields); - when(databaseTableService.getTable(eq(1L), eq("t_yunai"))) + when(databaseTableService.getTable(eq(1L), eq("t_yunai"), false)) .thenReturn(tableInfo); // mock 方法(CodegenTableDO) List newColumns = randomPojoList(CodegenColumnDO.class, 2); diff --git a/yudao-module-infra/yudao-module-infra-server/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilderTest.java b/yudao-module-infra/yudao-module-infra-server/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilderTest.java index 7a26ea9c..29c07d77 100644 --- a/yudao-module-infra/yudao-module-infra-server/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilderTest.java +++ b/yudao-module-infra/yudao-module-infra-server/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilderTest.java @@ -32,7 +32,7 @@ public class CodegenBuilderTest extends BaseMockitoUnitTest { when(tableInfo.getComment()).thenReturn("用户"); // 调用 - CodegenTableDO table = codegenBuilder.buildTable(tableInfo); + CodegenTableDO table = codegenBuilder.buildTable(tableInfo, false); // 断言 assertEquals("system_user", table.getTableName()); assertEquals("用户", table.getTableComment()); diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sequence/SequenceApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sequence/SequenceApi.java new file mode 100644 index 00000000..2f851b39 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sequence/SequenceApi.java @@ -0,0 +1,13 @@ +package cn.iocoder.yudao.module.system.api.sequence; + +import cn.iocoder.yudao.module.system.enums.ApiConstants; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.cloud.openfeign.FeignClient; + +/** + * @author chenbowen + */ +@FeignClient(name = ApiConstants.NAME) +@Tag(name = "序列管理 Api") +public interface SequenceApi { +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 2d66a7f8..a9943e22 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -176,4 +176,20 @@ public interface ErrorCodeConstants { // ========== 用户与部门关系 1-002-029-000 ========== ErrorCode USER_DEPT_NOT_EXISTS = new ErrorCode(1_002_029_000, "用户与部门关系不存在"); + + // ========== 系统序列号分段明细 1-002-030-000 ========== + ErrorCode SEQUENCE_DETAIL_NOT_EXISTS = new ErrorCode(1_002_030_000, "系统序列号分段明细不存在"); + + // ========== 系统序列号 1-002-031-000 ========== + ErrorCode SEQUENCE_NOT_EXISTS = new ErrorCode(1_002_031_000, "系统序列号不存在"); + ErrorCode SEQUENCE_DETAIL_EMPTY = new ErrorCode(1_002_031_001, "序列号分段明细不存在"); + ErrorCode SEQUENCE_GENERATE_ERROR = new ErrorCode(1_002_031_002, "序列号生成失败:{}"); + ErrorCode SEQUENCE_LOCK_TIMEOUT = new ErrorCode(1_002_031_003, "序列号生成锁超时"); + + // ========== 系统序列号规则校验 1-002-031-010 ========== + ErrorCode SEQUENCE_DETAIL_RULE_INVALID = new ErrorCode(1_002_031_010, "序列号分段规则无效:{}"); + + // ========== 系统序列号记录 1-002-032-000 ========== + ErrorCode SEQUENCE_RECORD_NOT_EXISTS = new ErrorCode(1_002_032_000, "系统序列号记录不存在"); + } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sequence/SequenceCycleTypeEnum.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sequence/SequenceCycleTypeEnum.java new file mode 100644 index 00000000..478eb305 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sequence/SequenceCycleTypeEnum.java @@ -0,0 +1,64 @@ +package cn.iocoder.yudao.module.system.enums.sequence; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 序列号循环类型 + */ +@Getter +@AllArgsConstructor +public enum SequenceCycleTypeEnum { + + // 年循环。示例: 2025 + SEQUENCE_CYCLE_YEAR("Y", "年循环。示例: 2025"), + // 年-月循环。示例: 2025-08 + SEQUENCE_CYCLE_YEAR_MONTH("Y-M", "年-月循环。示例: 2025-08"), + // 年月紧凑。示例: 202508 + SEQUENCE_CYCLE_YEAR_MONTH_COMPACT("YM", "年月紧凑。示例: 202508"), + // 两位年+月。示例: 2508 + SEQUENCE_CYCLE_SHORT_YEAR_MONTH("yM", "两位年+月。示例: 2508"), + // 年-月-日循环。示例: 2025-08-08 + SEQUENCE_CYCLE_YEAR_MONTH_DAY("Y-M-D", "年-月-日循环。示例: 2025-08-08"), + // 年月日紧凑。示例: 20250808 + SEQUENCE_CYCLE_YEAR_MONTH_DAY_COMPACT("YMD", "年月日紧凑。示例: 20250808"), + // 两位年+月日。示例: 250808 + SEQUENCE_CYCLE_SHORT_YEAR_MONTH_DAY("yMD", "两位年+月日。示例: 250808"), + // 自定义循环值;若未传 circulationValue,则默认用 seqId + SEQUENCE_CYCLE_CUSTOM("CUST", "自定义循环值;若未传 circulationValue,则默认用 seqId"), + // 仅前缀,不需要时间循环值(不设置则不抛错) + SEQUENCE_CYCLE_PREFIX_ONLY("PFX", "仅前缀,不需要时间循环值(不设置则不抛错)"); + + /** + * 类型编码(精简版) + */ + private final String code; + private final String name; + + public static SequenceCycleTypeEnum getByCode(String code) { + if (code == null) { + return null; + } + // 先按精简编码匹配 + for (SequenceCycleTypeEnum value : SequenceCycleTypeEnum.values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + public static SequenceCycleTypeEnum getByName(String name) { + for (SequenceCycleTypeEnum value : SequenceCycleTypeEnum.values()) { + if (value.getName().equals(name)) { + return value; + } + } + return null; + } + + // 获取 EnumList + public static SequenceCycleTypeEnum[] getEnumList() { + return SequenceCycleTypeEnum.values(); + } +} diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java index 6b3826d7..032fef3b 100644 --- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java +++ b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java @@ -46,7 +46,6 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.ROLE_CAN_NOT_UPDATE_NORMAL_TYPE_ROLE; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE; /** * 权限 Service 实现类 @@ -335,18 +334,20 @@ public class PermissionServiceImpl implements PermissionService { // 获得用户的角色 List roles = getEnableUserRoleListByUserIdFromCache(userId); - // 如果角色为空,则只能查看自己 - DeptDataPermissionRespDTO result = new DeptDataPermissionRespDTO(); - if (CollUtil.isEmpty(roles)) { - result.setSelf(true); - return result; - } - // 获得用户的部门编号的缓存,通过 Guava 的 Suppliers 惰性求值,即有且仅有第一次发起 DB 的查询 Supplier> userDeptIds = Suppliers.memoize(() -> { List validUserDeptListByUserId = userDeptService.getValidUserDeptListByUserIds(singleton(userId)); return validUserDeptListByUserId.stream().map(UserDeptDO::getDeptId).collect(Collectors.toSet()); }); + + // 如果角色为空,则只能查看自己,以及自己直属部门的信息 + DeptDataPermissionRespDTO result = new DeptDataPermissionRespDTO(); + if (CollUtil.isEmpty(roles)) { + result.setSelf(true); + result.setDeptIds(userDeptIds.get()); + return result; + } + // 遍历每个角色,计算 for (RoleDO role : roles) { // 为空时,跳过 diff --git a/yudao-module-system/yudao-module-system-server/src/main/resources/application.yaml b/yudao-module-system/yudao-module-system-server/src/main/resources/application.yaml index b58d3151..2c4db115 100644 --- a/yudao-module-system/yudao-module-system-server/src/main/resources/application.yaml +++ b/yudao-module-system/yudao-module-system-server/src/main/resources/application.yaml @@ -170,6 +170,9 @@ yudao: - /admin-api/system/user/profile/** - /admin-api/system/auth/** ignore-tables: + - system_seq + - system_seq_dtl + - system_seq_rcd ignore-caches: - user_role_ids - permission_menu_ids