1. 修复代码生成器错误的 mysql 路径

2. 新增部门代码,部门简称字段
This commit is contained in:
chenbowen
2025-09-18 13:50:29 +08:00
parent c9233e7053
commit 377f5d7494
12 changed files with 95 additions and 21 deletions

View File

@@ -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;

View File

@@ -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"))

View File

@@ -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 ==========

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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
*

View File

@@ -88,4 +88,14 @@ public interface DeptMapper extends BaseMapperX<DeptDO> {
);
}
/**
* 根据部门编码查询部门
*
* @param code 部门编码
* @return 部门信息
*/
default DeptDO selectByCode(String code) {
return selectOne(DeptDO::getCode, code);
}
}

View File

@@ -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);

View File

@@ -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() {

View File

@@ -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<PageResult<DemoContractRespVO>> getDemoContractPage(@Valid DemoContractPageReqVO pageReqVO) {
BusinessFilePageReqDTO pageReqDTO = new BusinessFilePageReqDTO();
pageReqDTO.setBusinessCode("22323");
CommonResult<PageResult<BusinessFileWithUrlRespDTO>> businessFilePageWithUrl = businessFileApi.getBusinessFilePageWithUrl(pageReqDTO);
CommonResult<Set<CompanyDeptInfoRespDTO>> companyDeptInfoListByUserId = deptApi.getCompanyDeptInfoListByUserId(getLoginUserId());
Long id = IdWorker.getId();
System.out.println("Generated ID: " + id);
PageResult<DemoContractDO> pageResult = demoContractService.getDemoContractPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, DemoContractRespVO.class));
}

View File

@@ -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 {
}