From 377f5d7494593489d8ecc84712216afc341a4187 Mon Sep 17 00:00:00 2001 From: chenbowen Date: Thu, 18 Sep 2025 13:50:29 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E4=BF=AE=E5=A4=8D=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=99=A8=E9=94=99=E8=AF=AF=E7=9A=84=20mysql?= =?UTF-8?q?=20=E8=B7=AF=E5=BE=84=202.=20=E6=96=B0=E5=A2=9E=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E4=BB=A3=E7=A0=81=EF=BC=8C=E9=83=A8=E9=97=A8=E7=AE=80?= =?UTF-8?q?=E7=A7=B0=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../扩充用户表部门表名称字段,匹配e办数据.sql | 9 ++++++++ .../service/codegen/inner/CodegenEngine.java | 4 ++-- .../system/enums/ErrorCodeConstants.java | 2 ++ .../admin/dept/vo/dept/DeptRespVO.java | 6 ++++++ .../admin/dept/vo/dept/DeptSaveReqVO.java | 9 ++++++++ .../admin/dept/vo/dept/DeptSimpleRespVO.java | 3 +++ .../system/dal/dataobject/dept/DeptDO.java | 8 +++++++ .../system/dal/mysql/dept/DeptMapper.java | 10 +++++++++ .../system/service/dept/DeptServiceImpl.java | 21 +++++++++++++++++++ .../service/sync/UserSyncServiceImplTest.java | 17 +-------------- .../contract/DemoContractController.java | 14 ++++++++++--- .../rpc/config/RpcConfiguration.java | 13 ++++++++++++ 12 files changed, 95 insertions(+), 21 deletions(-) create mode 100644 sql/dm/扩充用户表部门表名称字段,匹配e办数据.sql create mode 100644 yudao-module-template/yudao-module-template-server/src/main/java/cn/iocoder/yudao/module/template/framework/rpc/config/RpcConfiguration.java diff --git a/sql/dm/扩充用户表部门表名称字段,匹配e办数据.sql b/sql/dm/扩充用户表部门表名称字段,匹配e办数据.sql new file mode 100644 index 00000000..d1f70f3a --- /dev/null +++ b/sql/dm/扩充用户表部门表名称字段,匹配e办数据.sql @@ -0,0 +1,9 @@ +-- 修改部门表名称字段长度为 250 +ALTER TABLE SYSTEM_DEPT + MODIFY NAME VARCHAR(250) DEFAULT ''; + +-- 修改用户表昵称字段长度为 100 +ALTER TABLE SYSTEM_USERS + MODIFY NICKNAME VARCHAR(100) NOT NULL; +ALTER TABLE SYSTEM_USERS + MODIFY USERNAME VARCHAR(100) NOT NULL; \ 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/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 a53f2de7..24bd9590 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 @@ -80,9 +80,9 @@ public class CodegenEngine { .put(javaTemplatePath("dal/do_sub"), // 特殊:主子表专属逻辑 javaModuleImplMainFilePath("dal/dataobject/${table.businessName}/${subTable.className}DO")) .put(javaTemplatePath("dal/mapper"), - javaModuleImplMainFilePath("dal/mysql/${table.businessName}/${table.className}Mapper")) + javaModuleImplMainFilePath("dal/dao/${table.businessName}/${table.className}Mapper")) .put(javaTemplatePath("dal/mapper_sub"), // 特殊:主子表专属逻辑 - javaModuleImplMainFilePath("dal/mysql/${table.businessName}/${subTable.className}Mapper")) + javaModuleImplMainFilePath("dal/dao/${table.businessName}/${subTable.className}Mapper")) .put(javaTemplatePath("dal/mapper.xml"), mapperXmlFilePath()) .put(javaTemplatePath("service/serviceImpl"), javaModuleImplMainFilePath("service/${table.businessName}/${table.className}ServiceImpl")) 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 abe18bdc..0138fc1d 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 @@ -61,6 +61,8 @@ public interface ErrorCodeConstants { ErrorCode DEPT_NOT_ENABLE = new ErrorCode(1_002_004_006, "部门({})不处于开启状态,不允许选择"); ErrorCode DEPT_PARENT_IS_CHILD = new ErrorCode(1_002_004_007, "不能设置自己的子部门为父部门"); ErrorCode DEPT_TENANT_RELATION_EXISTS = new ErrorCode(1_002_004_008, "当前租户已经关联组织机构"); + ErrorCode DEPT_CODE_NOT_NULL = new ErrorCode(1_002_004_009, "部门编码不能为空"); + ErrorCode DEPT_CODE_DUPLICATE = new ErrorCode(1_002_004_010, "已经存在该编码的部门"); // ========== 岗位模块 1-002-005-000 ========== diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptRespVO.java b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptRespVO.java index da376c2d..7da517bd 100644 --- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptRespVO.java +++ b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptRespVO.java @@ -15,9 +15,15 @@ public class DeptRespVO { @Schema(description = "部门编号", example = "1024") private Long id; + @Schema(description = "部门编码", example = "DEPT_001") + private String code; + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") private String name; + @Schema(description = "部门简称", example = "芋道科技") + private String shortName; + @Schema(description = "父部门 ID", example = "1024") private Long parentId; diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptSaveReqVO.java b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptSaveReqVO.java index 97b4ea36..3f9f0f46 100644 --- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptSaveReqVO.java @@ -19,11 +19,20 @@ public class DeptSaveReqVO { @Schema(description = "部门编号", example = "1024") private Long id; + @Schema(description = "部门编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "DEPT_001") + @NotBlank(message = "部门编码不能为空") + @Size(max = 50, message = "部门编码长度不能超过 50 个字符") + private String code; + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") @NotBlank(message = "部门名称不能为空") @Size(max = 30, message = "部门名称长度不能超过 30 个字符") private String name; + @Schema(description = "部门简称", example = "科技") + @Size(max = 20, message = "部门简称长度不能超过 20 个字符") + private String shortName; + @Schema(description = "父部门 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024(顶级部门父级 Id 为 0)") private Long parentId; diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.java b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.java index 8b5f9a18..30f4d6f2 100644 --- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.java @@ -17,6 +17,9 @@ public class DeptSimpleRespVO { @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long id; + @Schema(description = "部门编码", example = "DEPT_001") + private String code; + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") private String name; diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/DeptDO.java b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/DeptDO.java index c82026fa..389413ae 100644 --- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/DeptDO.java +++ b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/DeptDO.java @@ -30,11 +30,19 @@ public class DeptDO extends TenantBaseDO { */ @TableId(type = IdType.ASSIGN_ID) private Long id; + /** + * 部门编码 + */ + private String code; /** * 部门名称 */ @NotEmpty private String name; + /** + * 部门简称 + */ + private String shortName; /** * 父部门ID * diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/DeptMapper.java b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/DeptMapper.java index b30459f3..2bbcbf76 100644 --- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/DeptMapper.java +++ b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/DeptMapper.java @@ -88,4 +88,14 @@ public interface DeptMapper extends BaseMapperX { ); } + /** + * 根据部门编码查询部门 + * + * @param code 部门编码 + * @return 部门信息 + */ + default DeptDO selectByCode(String code) { + return selectOne(DeptDO::getCode, code); + } + } diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java index 3001ae16..dbca17ea 100644 --- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java +++ b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.service.dept; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CompanyDeptInfo; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; @@ -60,6 +61,8 @@ public class DeptServiceImpl implements DeptService { validateParentDept(null, createReqVO.getParentId()); // 校验部门名的唯一性 validateDeptNameUnique(null, createReqVO.getParentId(), createReqVO.getName()); + // 校验部门编码的唯一性 + validateDeptCodeUnique(null, createReqVO.getCode()); // 插入部门 DeptDO dept = BeanUtils.toBean(createReqVO, DeptDO.class); @@ -166,6 +169,24 @@ public class DeptServiceImpl implements DeptService { } } + @VisibleForTesting + void validateDeptCodeUnique(Long id, String code) { + if (StrUtil.isBlank(code)) { + throw exception(DEPT_CODE_NOT_NULL); + } + DeptDO dept = deptMapper.selectByCode(code); + if (dept == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的部门 + if (id == null) { + throw exception(DEPT_CODE_DUPLICATE); + } + if (ObjectUtil.notEqual(dept.getId(), id)) { + throw exception(DEPT_CODE_DUPLICATE); + } + } + @Override public DeptDO getDept(Long id) { return deptMapper.selectById(id); diff --git a/yudao-module-system/yudao-module-system-server/src/test/java/cn/iocoder/yudao/module/system/service/sync/UserSyncServiceImplTest.java b/yudao-module-system/yudao-module-system-server/src/test/java/cn/iocoder/yudao/module/system/service/sync/UserSyncServiceImplTest.java index c1942f76..8054ebd1 100644 --- a/yudao-module-system/yudao-module-system-server/src/test/java/cn/iocoder/yudao/module/system/service/sync/UserSyncServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-server/src/test/java/cn/iocoder/yudao/module/system/service/sync/UserSyncServiceImplTest.java @@ -82,7 +82,7 @@ public class UserSyncServiceImplTest extends BaseMockitoUnitTest { // Arrange UserDeleteRequestVO requestVO = randomPojo(UserDeleteRequestVO.class); AdminUserDO existingUser = randomPojo(AdminUserDO.class); - when(adminUserService.getUserByUsername(requestVO.getBimRemoteUser())).thenReturn(existingUser); + when(adminUserService.getUser(requestVO.getBimUid())).thenReturn(existingUser); // Act UserDeleteResponseVO response = userSyncService.deleteUser(requestVO); @@ -94,21 +94,6 @@ public class UserSyncServiceImplTest extends BaseMockitoUnitTest { verify(adminUserService).deleteUser(requestVO.getBimUid()); } - @Test - void testDeleteUser_NotFound() { - // Arrange - UserDeleteRequestVO requestVO = randomPojo(UserDeleteRequestVO.class); - when(adminUserService.getUserByUsername(requestVO.getBimRemoteUser())).thenReturn(null); - - // Act - UserDeleteResponseVO response = userSyncService.deleteUser(requestVO); - - // Assert - assertNotNull(response); - assertEquals("500", response.getResultCode()); - assertEquals("用户不存在", response.getMessage()); - verify(adminUserService, never()).deleteUser(any()); - } @Test void testUpdateUser_Success() { diff --git a/yudao-module-template/yudao-module-template-server/src/main/java/cn/iocoder/yudao/module/template/controller/admin/contract/DemoContractController.java b/yudao-module-template/yudao-module-template-server/src/main/java/cn/iocoder/yudao/module/template/controller/admin/contract/DemoContractController.java index 5e9e5cc6..30516eb1 100644 --- a/yudao-module-template/yudao-module-template-server/src/main/java/cn/iocoder/yudao/module/template/controller/admin/contract/DemoContractController.java +++ b/yudao-module-template/yudao-module-template-server/src/main/java/cn/iocoder/yudao/module/template/controller/admin/contract/DemoContractController.java @@ -12,12 +12,14 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.module.infra.api.businessfile.BusinessFileApi; import cn.iocoder.yudao.module.infra.api.businessfile.dto.BusinessFilePageReqDTO; -import cn.iocoder.yudao.module.infra.api.businessfile.dto.BusinessFileWithUrlRespDTO; +import cn.iocoder.yudao.module.system.api.dept.DeptApi; +import cn.iocoder.yudao.module.system.api.dept.dto.CompanyDeptInfoRespDTO; import cn.iocoder.yudao.module.template.controller.admin.contract.vo.DemoContractPageReqVO; import cn.iocoder.yudao.module.template.controller.admin.contract.vo.DemoContractRespVO; import cn.iocoder.yudao.module.template.controller.admin.contract.vo.DemoContractSaveReqVO; import cn.iocoder.yudao.module.template.dal.dataobject.contract.DemoContractDO; import cn.iocoder.yudao.module.template.service.contract.DemoContractService; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -30,9 +32,11 @@ import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.util.List; +import java.util.Set; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @Tag(name = "管理后台 - 合同") @RestController @@ -54,6 +58,9 @@ public class DemoContractController extends AbstractFileUploadController impleme @Resource private BusinessFileApi businessFileApi; + @Resource + private DeptApi deptApi; + @PostMapping("/create") @Operation(summary = "创建合同") @PreAuthorize("@ss.hasPermission('template:demo-contract:create')") @@ -101,8 +108,9 @@ public class DemoContractController extends AbstractFileUploadController impleme @PreAuthorize("@ss.hasPermission('template:demo-contract:query')") public CommonResult> getDemoContractPage(@Valid DemoContractPageReqVO pageReqVO) { BusinessFilePageReqDTO pageReqDTO = new BusinessFilePageReqDTO(); - pageReqDTO.setBusinessCode("22323"); - CommonResult> businessFilePageWithUrl = businessFileApi.getBusinessFilePageWithUrl(pageReqDTO); + CommonResult> companyDeptInfoListByUserId = deptApi.getCompanyDeptInfoListByUserId(getLoginUserId()); + Long id = IdWorker.getId(); + System.out.println("Generated ID: " + id); PageResult pageResult = demoContractService.getDemoContractPage(pageReqVO); return success(BeanUtils.toBean(pageResult, DemoContractRespVO.class)); } diff --git a/yudao-module-template/yudao-module-template-server/src/main/java/cn/iocoder/yudao/module/template/framework/rpc/config/RpcConfiguration.java b/yudao-module-template/yudao-module-template-server/src/main/java/cn/iocoder/yudao/module/template/framework/rpc/config/RpcConfiguration.java new file mode 100644 index 00000000..9bf7b2f5 --- /dev/null +++ b/yudao-module-template/yudao-module-template-server/src/main/java/cn/iocoder/yudao/module/template/framework/rpc/config/RpcConfiguration.java @@ -0,0 +1,13 @@ +package cn.iocoder.yudao.module.template.framework.rpc.config; + +import cn.iocoder.yudao.module.infra.api.config.ConfigApi; +import cn.iocoder.yudao.module.infra.api.file.FileApi; +import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi; +import cn.iocoder.yudao.module.system.api.dept.DeptApi; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Configuration; + +@Configuration(value = "templateRpcConfiguration", proxyBeanMethods = false) +@EnableFeignClients(clients = {FileApi.class, WebSocketSenderApi.class, ConfigApi.class, DeptApi.class}) +public class RpcConfiguration { +}