From d07a7e761a57a004743fe17dbe39dab70c2fcadf Mon Sep 17 00:00:00 2001 From: caiyuchao Date: Mon, 30 Jun 2025 17:43:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=A1=B9=E7=9B=AE=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=90=8D=E7=A7=B0=E5=92=8C=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E5=94=AF=E4=B8=80=EF=BC=9B=E7=94=9F=E6=88=90=E7=BC=96=E7=A0=81?= =?UTF-8?q?sn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../license/enums/ErrorCodeConstants.java | 2 + .../admin/project/ProjectController.java | 19 +++++ .../admin/project/vo/ProjectRespVO.java | 2 +- .../dal/mysql/project/ProjectMapper.java | 15 +++- .../service/customer/CustomerService.java | 2 +- .../service/project/ProjectService.java | 33 ++++++-- .../service/project/ProjectServiceImpl.java | 77 ++++++++++++++++--- .../mapper/project/ProjectMapper.xml | 9 +-- 8 files changed, 132 insertions(+), 27 deletions(-) diff --git a/agt-module-license/agt-module-license-api/src/main/java/org/agt/module/license/enums/ErrorCodeConstants.java b/agt-module-license/agt-module-license-api/src/main/java/org/agt/module/license/enums/ErrorCodeConstants.java index 4bfefd7..60cfede 100644 --- a/agt-module-license/agt-module-license-api/src/main/java/org/agt/module/license/enums/ErrorCodeConstants.java +++ b/agt-module-license/agt-module-license-api/src/main/java/org/agt/module/license/enums/ErrorCodeConstants.java @@ -12,4 +12,6 @@ public interface ErrorCodeConstants { ErrorCode CUSTOMER_NAME_DUPLICATE = new ErrorCode(1_100_001_002, "客户名称`{}`已存在"); ErrorCode CUSTOMER_CODE_DUPLICATE = new ErrorCode(1_100_001_003, "客户编号`{}`已存在"); ErrorCode PROJECT_NOT_EXISTS = new ErrorCode(1_100_002_001, "项目不存在"); + ErrorCode PROJECT_NAME_DUPLICATE = new ErrorCode(1_100_001_002, "项目名称`{}`已存在"); + ErrorCode PROJECT_CODE_DUPLICATE = new ErrorCode(1_100_001_003, "项目编号`{}`已存在"); } diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/project/ProjectController.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/project/ProjectController.java index 86c02a9..98d15a4 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/project/ProjectController.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/project/ProjectController.java @@ -98,4 +98,23 @@ public class ProjectController { TranslateUtils.translate(BeanUtils.toBean(list, ProjectRespVO.class))); } + @GetMapping("/name-unique") + @Operation(summary = "校验项目名称是否唯一") + public CommonResult validateProjectNameUnique(@RequestParam(value = "name", required = false) String name, @RequestParam(value = "id", required = false) Long id) { + Boolean isExists = projectService.validateProjectNameUnique(name, id); + return success(isExists); + } + + @GetMapping("/code-unique") + @Operation(summary = "校验项目编号是否唯一") + public CommonResult validateProjectCodeUnique(@RequestParam(value = "code", required = false) String code, @RequestParam(value = "id", required = false) Long id) { + Boolean isExists = projectService.validateProjectCodeUnique(code, id); + return success(isExists); + } + + @GetMapping("/max-sn") + @Operation(summary = "返回当前最大项目sn") + public CommonResult selectMaxCode() { + return success(projectService.selectMaxCode()); + } } \ No newline at end of file diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/project/vo/ProjectRespVO.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/project/vo/ProjectRespVO.java index 1c27e21..99e1c74 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/project/vo/ProjectRespVO.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/controller/admin/project/vo/ProjectRespVO.java @@ -37,7 +37,7 @@ public class ProjectRespVO implements VO { @Schema(description = "项目编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000") @ExcelProperty("项目编号") - private String code; + private Long code; @Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1111") @ExcelProperty("合同编号") diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/mysql/project/ProjectMapper.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/mysql/project/ProjectMapper.java index 9f4f1d7..227c1ee 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/mysql/project/ProjectMapper.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/dal/mysql/project/ProjectMapper.java @@ -1,13 +1,11 @@ package org.agt.module.license.dal.mysql.project; -import java.util.*; - import org.agt.framework.common.pojo.PageResult; -import org.agt.framework.mybatis.core.query.LambdaQueryWrapperX; import org.agt.framework.mybatis.core.mapper.BaseMapperX; +import org.agt.framework.mybatis.core.query.LambdaQueryWrapperX; +import org.agt.module.license.controller.admin.project.vo.ProjectPageReqVO; import org.agt.module.license.dal.dataobject.project.ProjectDO; import org.apache.ibatis.annotations.Mapper; -import org.agt.module.license.controller.admin.project.vo.*; /** * 项目 Mapper @@ -36,4 +34,13 @@ public interface ProjectMapper extends BaseMapperX { .orderByDesc(ProjectDO::getId)); } + default ProjectDO selectByName(String name) { + return selectOne(ProjectDO::getName, name); + } + + default ProjectDO selectByCode(String code) { + return selectOne(ProjectDO::getCode, code); + } + + Integer selectMaxCode(); } \ No newline at end of file diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/customer/CustomerService.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/customer/CustomerService.java index aa98308..63d5f9c 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/customer/CustomerService.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/customer/CustomerService.java @@ -81,7 +81,7 @@ public interface CustomerService { /** * 查询当前最大的sn号 * - * @return + * @return 最大sn号 */ Integer selectMaxCode(); } \ No newline at end of file diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/project/ProjectService.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/project/ProjectService.java index 79aff7b..bc80f68 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/project/ProjectService.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/project/ProjectService.java @@ -1,11 +1,10 @@ package org.agt.module.license.service.project; -import java.util.*; -import jakarta.validation.*; -import org.agt.module.license.controller.admin.project.vo.*; -import org.agt.module.license.dal.dataobject.project.ProjectDO; +import jakarta.validation.Valid; import org.agt.framework.common.pojo.PageResult; -import org.agt.framework.common.pojo.PageParam; +import org.agt.module.license.controller.admin.project.vo.ProjectPageReqVO; +import org.agt.module.license.controller.admin.project.vo.ProjectSaveReqVO; +import org.agt.module.license.dal.dataobject.project.ProjectDO; /** * 项目 Service 接口 @@ -52,4 +51,28 @@ public interface ProjectService { */ PageResult getProjectPage(ProjectPageReqVO pageReqVO); + /** + * 校验项目名称是否唯一 + * + * @param name 项目名称 + * @param id 项目id + * @return 是否存在 + */ + Boolean validateProjectNameUnique(String name, Long id); + + /** + * 校验项目编号是否唯一 + * + * @param code 项目编号 + * @param id 项目id + * @return 是否存在 + */ + Boolean validateProjectCodeUnique(String code, Long id); + + /** + * 查询当前最大的sn号 + * + * @return 最大sn号 + */ + Integer selectMaxCode(); } \ No newline at end of file diff --git a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/project/ProjectServiceImpl.java b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/project/ProjectServiceImpl.java index c4ed922..0ae6212 100644 --- a/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/project/ProjectServiceImpl.java +++ b/agt-module-license/agt-module-license-server/src/main/java/org/agt/module/license/service/project/ProjectServiceImpl.java @@ -1,21 +1,20 @@ package org.agt.module.license.service.project; -import org.springframework.stereotype.Service; +import cn.hutool.core.util.StrUtil; import jakarta.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import org.agt.module.license.controller.admin.project.vo.*; -import org.agt.module.license.dal.dataobject.project.ProjectDO; import org.agt.framework.common.pojo.PageResult; -import org.agt.framework.common.pojo.PageParam; import org.agt.framework.common.util.object.BeanUtils; - +import org.agt.module.license.controller.admin.project.vo.ProjectPageReqVO; +import org.agt.module.license.controller.admin.project.vo.ProjectSaveReqVO; +import org.agt.module.license.dal.dataobject.project.ProjectDO; import org.agt.module.license.dal.mysql.project.ProjectMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; import static org.agt.framework.common.exception.util.ServiceExceptionUtil.exception; -import static org.agt.module.license.enums.ErrorCodeConstants.*; +import static org.agt.module.license.enums.ErrorCodeConstants.PROJECT_CODE_DUPLICATE; +import static org.agt.module.license.enums.ErrorCodeConstants.PROJECT_NAME_DUPLICATE; +import static org.agt.module.license.enums.ErrorCodeConstants.PROJECT_NOT_EXISTS; /** * 项目 Service 实现类 @@ -31,6 +30,8 @@ public class ProjectServiceImpl implements ProjectService { @Override public Long createProject(ProjectSaveReqVO createReqVO) { + // 校验项目名称和编号是否唯一 + validateProjectNameAndCodeUnique(createReqVO.getName(), createReqVO.getCode(), createReqVO.getId()); // 插入 ProjectDO project = BeanUtils.toBean(createReqVO, ProjectDO.class); projectMapper.insert(project); @@ -40,6 +41,8 @@ public class ProjectServiceImpl implements ProjectService { @Override public void updateProject(ProjectSaveReqVO updateReqVO) { + // 校验项目名称和编号是否唯一 + validateProjectNameAndCodeUnique(updateReqVO.getName(), updateReqVO.getCode(), updateReqVO.getId()); // 校验存在 validateProjectExists(updateReqVO.getId()); // 更新 @@ -61,6 +64,17 @@ public class ProjectServiceImpl implements ProjectService { } } + private void validateProjectNameAndCodeUnique(String name, String code, Long id) { + Boolean isNameUnique = validateProjectNameUnique(name, id); + if (!isNameUnique) { + throw exception(PROJECT_NAME_DUPLICATE, name); + } + Boolean isCodeUnique = validateProjectCodeUnique(code, id); + if (!isCodeUnique) { + throw exception(PROJECT_CODE_DUPLICATE, code); + } + } + @Override public ProjectDO getProject(Long id) { return projectMapper.selectById(id); @@ -71,4 +85,47 @@ public class ProjectServiceImpl implements ProjectService { return projectMapper.selectPage(pageReqVO); } + @Override + public Boolean validateProjectNameUnique(String name, Long id) { + if (StrUtil.isBlank(name)) { + return true; + } + ProjectDO project = projectMapper.selectByName(name); + if (project == null) { + return true; + } + // 如果 id 为空,说明不用比较是否为相同 id 的客户 + if (id == null) { + return false; + } + if (!project.getId().equals(id)) { + return false; + } + return true; + } + + @Override + public Boolean validateProjectCodeUnique(String code, Long id) { + if (StrUtil.isBlank(code)) { + return true; + } + ProjectDO project = projectMapper.selectByCode(code); + if (project == null) { + return true; + } + // 如果 id 为空,说明不用比较是否为相同 id 的客户 + if (id == null) { + return false; + } + if (!project.getId().equals(id)) { + return false; + } + return true; + } + + @Override + public Integer selectMaxCode() { + Integer maxCode = projectMapper.selectMaxCode(); + return maxCode == null || maxCode < 2000 ? 2000 : maxCode + 1; + } } \ No newline at end of file diff --git a/agt-module-license/agt-module-license-server/src/main/resources/mapper/project/ProjectMapper.xml b/agt-module-license/agt-module-license-server/src/main/resources/mapper/project/ProjectMapper.xml index a1a8ddd..672610f 100644 --- a/agt-module-license/agt-module-license-server/src/main/resources/mapper/project/ProjectMapper.xml +++ b/agt-module-license/agt-module-license-server/src/main/resources/mapper/project/ProjectMapper.xml @@ -2,11 +2,8 @@ - + \ No newline at end of file