From c0e572b4b425fbc672a75d033168bfe923db56b6 Mon Sep 17 00:00:00 2001 From: hhyykk Date: Mon, 8 Jul 2024 20:53:09 +0800 Subject: [PATCH] =?UTF-8?q?[feat]=201.=E9=A1=B9=E7=9B=AE=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=A2=9E=E5=8A=A0=E5=BA=8F=E5=8F=B7=E8=87=AA?= =?UTF-8?q?=E5=A2=9E=20[fix]=201.=E4=BF=AE=E6=94=B9=E9=99=84=E4=BB=B6?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E6=95=B0=E6=8D=AE=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/ProcessStatusEnum.java | 32 +++++++++ .../yudao/framework/common/pojo/FileDTO.java | 27 ++++++++ .../module/pms/enums/ProjectTypeEnum.java | 47 +++++++++++++ .../admin/project/vo/ProjectRespDetailVO.java | 11 +-- .../admin/project/vo/ProjectSaveReqVO.java | 5 +- .../pms/dal/mysql/project/ProjectMapper.java | 6 ++ .../service/project/ProjectServiceImpl.java | 69 ++++++++++++------- .../src/main/resources/application.yaml | 4 +- 8 files changed, 169 insertions(+), 32 deletions(-) create mode 100644 yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/ProcessStatusEnum.java create mode 100644 yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/FileDTO.java create mode 100644 yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ProjectTypeEnum.java diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/ProcessStatusEnum.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/ProcessStatusEnum.java new file mode 100644 index 000000000..f0e85aac3 --- /dev/null +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/ProcessStatusEnum.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.framework.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author hhyykk + * @description 流程状态枚举 + * @date 2024/7/8 + */ +@Getter +@AllArgsConstructor +public enum ProcessStatusEnum { + + // 审批中 + APPROVAL_IN_PROGRESS(1, "审批中"), + // 审批通过 + APPROVAL_PASS(2, "审批通过"), + // 审批不通过 + APPROVAL_NOT_PASS(3, "审批不通过"), + // 已取消 + CANCELLED(4, "已取消"); + + /** + * 类型 + */ + private final Integer interval; + /** + * 名称 + */ + private final String name; +} diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/FileDTO.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/FileDTO.java new file mode 100644 index 000000000..c4f8ac81c --- /dev/null +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/FileDTO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.framework.common.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @author hhyykk + * @description + * @date 2024/7/8 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FileDTO implements Serializable { + + /** + * 文件名 + */ + private String name; + /** + * 文件地址 + */ + private String url; +} diff --git a/yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ProjectTypeEnum.java b/yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ProjectTypeEnum.java new file mode 100644 index 000000000..788dcc6b2 --- /dev/null +++ b/yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ProjectTypeEnum.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.pms.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author hhyykk + * @description 项目类型枚举 + * @date 2024/7/8 + */ +@Getter +@AllArgsConstructor +public enum ProjectTypeEnum { + // 设计 + DESIGN("design", "SJ"), + // 检查 + CHECK("check", "JC"), + // 勘察设计 + SURVEY("survey", "KS"), + // 数智 + DIGITAL("digital", "SZ"), + // 咨询 + CONSULTING("consulting", "ZX"); + /** + * 类型编号 + */ + private final String code; + /** + * 类型编码 + */ + private final String no; + + /** + * 通过code获取no + * @param code 字典编号 + * @return 类型编码 + */ + public static String getNoByCode(String code) { + for (ProjectTypeEnum value : values()) { + if (value.getCode().equals(code)) { + return value.getNo(); + } + } + return null; + } + +} diff --git a/yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/project/vo/ProjectRespDetailVO.java b/yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/project/vo/ProjectRespDetailVO.java index 84b85e85e..8c394bff9 100644 --- a/yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/project/vo/ProjectRespDetailVO.java +++ b/yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/project/vo/ProjectRespDetailVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.pms.controller.admin.project.vo; +import cn.iocoder.yudao.framework.common.pojo.FileDTO; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.*; import cn.iocoder.yudao.module.pms.enums.DictTypeConstants; @@ -21,7 +22,7 @@ import java.util.List; @ExcelIgnoreUnannotated public class ProjectRespDetailVO { @Schema(description = "id", example = "11213") - @ExcelProperty("id") +// @ExcelProperty("id") private Long id; @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") @@ -137,11 +138,11 @@ public class ProjectRespDetailVO { private String customerCompanyName; @Schema(description = "评审附件", example = "http://ryoyi.pro") - @ExcelProperty(value = "评审附件", converter = ListToStringConvert.class) - private List reviewFileUrl; +// @ExcelProperty(value = "评审附件", converter = ListToStringConvert.class) + private List reviewFileUrl; @Schema(description = "中标附件", example = "http://ryoyi.pro") - @ExcelProperty(value = "中标附件", converter = ListToStringConvert.class) - private List winFileUrl; +// @ExcelProperty(value = "中标附件", converter = ListToStringConvert.class) + private List winFileUrl; } diff --git a/yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/project/vo/ProjectSaveReqVO.java b/yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/project/vo/ProjectSaveReqVO.java index 951ed3ed1..7ca385179 100644 --- a/yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/project/vo/ProjectSaveReqVO.java +++ b/yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/project/vo/ProjectSaveReqVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.pms.controller.admin.project.vo; +import cn.iocoder.yudao.framework.common.pojo.FileDTO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -74,13 +75,13 @@ public class ProjectSaveReqVO { private String situation; @Schema(description = "评审附件", example = "https://www.iocoder.cn") - private List reviewFileUrl; + private List reviewFileUrl; @Schema(description = "是否落地") private Boolean confirmation; @Schema(description = "中标附件", example = "https://www.iocoder.cn") - private List winFileUrl; + private List winFileUrl; @Schema(description = "预计合同金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") private String contractAmount; diff --git a/yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/project/ProjectMapper.java b/yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/project/ProjectMapper.java index e91a0b147..7307acbd1 100644 --- a/yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/project/ProjectMapper.java +++ b/yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/project/ProjectMapper.java @@ -59,4 +59,10 @@ public interface ProjectMapper extends BaseMapperX { ); } + default ProjectDO selectLastSequence(String prefix) { + return selectOne(new LambdaQueryWrapperX() + .likeRight(ProjectDO::getCode, prefix) + .orderByDesc(ProjectDO::getCode) + ); + } } \ No newline at end of file diff --git a/yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/project/ProjectServiceImpl.java b/yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/project/ProjectServiceImpl.java index 1c1232812..dec5e5ff3 100644 --- a/yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/project/ProjectServiceImpl.java +++ b/yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/project/ProjectServiceImpl.java @@ -1,23 +1,26 @@ package cn.iocoder.yudao.module.pms.service.project; +import cn.iocoder.yudao.framework.common.enums.ProcessStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils; import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; +import cn.iocoder.yudao.module.pms.controller.admin.project.vo.ProjectPageReqVO; +import cn.iocoder.yudao.module.pms.controller.admin.project.vo.ProjectSaveReqVO; +import cn.iocoder.yudao.module.pms.dal.dataobject.project.ProjectDO; import cn.iocoder.yudao.module.pms.dal.dataobject.project.ProjectDetailDO; -import cn.iocoder.yudao.module.pms.enums.EntrustMethodConstants; -import org.springframework.stereotype.Service; +import cn.iocoder.yudao.module.pms.dal.mysql.project.ProjectMapper; +import cn.iocoder.yudao.module.pms.enums.ProjectTypeEnum; import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import cn.iocoder.yudao.module.pms.controller.admin.project.vo.*; -import cn.iocoder.yudao.module.pms.dal.dataobject.project.ProjectDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; - -import cn.iocoder.yudao.module.pms.dal.mysql.project.ProjectMapper; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstants.PROJECT_NOT_EXISTS; /** * 项目基本信息 Service 实现类 @@ -40,25 +43,16 @@ public class ProjectServiceImpl implements ProjectService { @Override public Long createProject(Long loginUserId, ProjectSaveReqVO createReqVO) { - // 非公开招标或者邀请招标的无需审批 - if (!EntrustMethodConstants.ENTRUST_PUBLIC_BIDDING.equals(createReqVO.getEntrustMethod()) && - !EntrustMethodConstants.ENTRUST_INVITED_BIDDING.equals(createReqVO.getEntrustMethod())) { - createReqVO.setProcessStatus(2); //审批通过 - } // 插入 ProjectDO project = BeanUtils.toBean(createReqVO, ProjectDO.class); projectMapper.insert(project); // 启动流程 if (createReqVO.getId() == null) { - if (EntrustMethodConstants.ENTRUST_PUBLIC_BIDDING.equals(project.getEntrustMethod()) || - EntrustMethodConstants.ENTRUST_INVITED_BIDDING.equals(project.getEntrustMethod())) { - // 公开中标或邀请招标需要走流程 - String processInstanceId = processInstanceApi.createProcessInstance(loginUserId, - new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY) - .setBusinessKey(String.valueOf(project.getId()))); - // 写入工作流编号 - projectMapper.updateById(new ProjectDO().setId(project.getId()).setProcessInstanceId(processInstanceId)); - } + String processInstanceId = processInstanceApi.createProcessInstance(loginUserId, + new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY) + .setBusinessKey(String.valueOf(project.getId()))); + // 写入工作流编号 + projectMapper.updateById(new ProjectDO().setId(project.getId()).setProcessInstanceId(processInstanceId)); } // 返回 return project.getId(); @@ -68,6 +62,12 @@ public class ProjectServiceImpl implements ProjectService { public void updateProject(ProjectSaveReqVO updateReqVO) { // 校验存在 validateProjectExists(updateReqVO.getId()); + // 如果审批通过,且项目落地,则生成项目编号 eg. 勘察设计:KS20240001,检测监测:JC20240001,咨询:ZX20240001,数智:SZ20240001 + if (ProcessStatusEnum.APPROVAL_PASS.getInterval().equals(updateReqVO.getProcessStatus()) + && Boolean.TRUE.equals(updateReqVO.getConfirmation())) { + String codeNo = this.generator(ProjectTypeEnum.getNoByCode(updateReqVO.getType()), 1); + updateReqVO.setCode(codeNo); + } // 更新 ProjectDO updateObj = BeanUtils.toBean(updateReqVO, ProjectDO.class); projectMapper.updateById(updateObj); @@ -125,4 +125,27 @@ public class ProjectServiceImpl implements ProjectService { projectMapper.updateById(new ProjectDO().setId(id).setProcessStatus(status)); } + /** + * 序号自增 + * @param prefix 前缀 + * @param number 步进 + * @return 自增后的序列 + */ + private String generator(String prefix, Integer number) { + // 获取当前年月日 + prefix += LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy")); + ProjectDO projectDO = projectMapper.selectLastSequence(prefix); + if (projectDO == null) { + return prefix + "0001"; + } else { + String sequence = projectDO.getCode(); + // 截取最后四位 + String lastSequence = sequence.substring(sequence.length() - 4); + // 自增1 + int lastNumber = Integer.parseInt(lastSequence); + lastNumber = lastNumber + number; + return prefix + String.format("%04d", lastNumber); + } + } + } \ No newline at end of file diff --git a/yudao-server/src/main/resources/application.yaml b/yudao-server/src/main/resources/application.yaml index 6cb5386e3..c03ba2b97 100644 --- a/yudao-server/src/main/resources/application.yaml +++ b/yudao-server/src/main/resources/application.yaml @@ -20,7 +20,7 @@ spring: # throw-exception-if-no-handler-found: true # 404 错误时抛出异常,方便统一处理 # static-path-pattern: /static/** # 静态资源路径; 注意:如果不配置,则 throw-exception-if-no-handler-found 不生效!!! TODO 芋艿:不能配置,会导致 swagger 不生效 - # Jackson 配置项 + # Jackson 配置项y jackson: serialization: write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳 @@ -107,7 +107,7 @@ aj: cache-number: 1000 # local 缓存的阈值,达到这个值,清除缓存 timing-clear: 180 # local定时清除过期缓存(单位秒),设置为0代表不执行 type: blockPuzzle # 验证码类型 default两种都实例化。 blockPuzzle 滑块拼图 clickWord 文字点选 - water-mark: 芋道源码 # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode + water-mark: hhyykk # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode interference-options: 0 # 滑动干扰项(0/1/2) req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false req-get-lock-limit: 5 # 验证失败 5 次,get接口锁定