mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-02-13 00:54:59 +08:00
[feat] 1.项目信息管理增加序号自增
[fix] 1.修改附件存储数据格式
This commit is contained in:
parent
55e5265152
commit
c0e572b4b4
@ -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;
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
package cn.iocoder.yudao.module.pms.controller.admin.project.vo;
|
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.annotations.DictFormat;
|
||||||
import cn.iocoder.yudao.framework.excel.core.convert.*;
|
import cn.iocoder.yudao.framework.excel.core.convert.*;
|
||||||
import cn.iocoder.yudao.module.pms.enums.DictTypeConstants;
|
import cn.iocoder.yudao.module.pms.enums.DictTypeConstants;
|
||||||
@ -21,7 +22,7 @@ import java.util.List;
|
|||||||
@ExcelIgnoreUnannotated
|
@ExcelIgnoreUnannotated
|
||||||
public class ProjectRespDetailVO {
|
public class ProjectRespDetailVO {
|
||||||
@Schema(description = "id", example = "11213")
|
@Schema(description = "id", example = "11213")
|
||||||
@ExcelProperty("id")
|
// @ExcelProperty("id")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
|
@Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
|
||||||
@ -137,11 +138,11 @@ public class ProjectRespDetailVO {
|
|||||||
private String customerCompanyName;
|
private String customerCompanyName;
|
||||||
|
|
||||||
@Schema(description = "评审附件", example = "http://ryoyi.pro")
|
@Schema(description = "评审附件", example = "http://ryoyi.pro")
|
||||||
@ExcelProperty(value = "评审附件", converter = ListToStringConvert.class)
|
// @ExcelProperty(value = "评审附件", converter = ListToStringConvert.class)
|
||||||
private List<String> reviewFileUrl;
|
private List<FileDTO> reviewFileUrl;
|
||||||
|
|
||||||
@Schema(description = "中标附件", example = "http://ryoyi.pro")
|
@Schema(description = "中标附件", example = "http://ryoyi.pro")
|
||||||
@ExcelProperty(value = "中标附件", converter = ListToStringConvert.class)
|
// @ExcelProperty(value = "中标附件", converter = ListToStringConvert.class)
|
||||||
private List<String> winFileUrl;
|
private List<FileDTO> winFileUrl;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package cn.iocoder.yudao.module.pms.controller.admin.project.vo;
|
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 io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@ -74,13 +75,13 @@ public class ProjectSaveReqVO {
|
|||||||
private String situation;
|
private String situation;
|
||||||
|
|
||||||
@Schema(description = "评审附件", example = "https://www.iocoder.cn")
|
@Schema(description = "评审附件", example = "https://www.iocoder.cn")
|
||||||
private List<String> reviewFileUrl;
|
private List<FileDTO> reviewFileUrl;
|
||||||
|
|
||||||
@Schema(description = "是否落地")
|
@Schema(description = "是否落地")
|
||||||
private Boolean confirmation;
|
private Boolean confirmation;
|
||||||
|
|
||||||
@Schema(description = "中标附件", example = "https://www.iocoder.cn")
|
@Schema(description = "中标附件", example = "https://www.iocoder.cn")
|
||||||
private List<String> winFileUrl;
|
private List<FileDTO> winFileUrl;
|
||||||
|
|
||||||
@Schema(description = "预计合同金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
|
@Schema(description = "预计合同金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
|
||||||
private String contractAmount;
|
private String contractAmount;
|
||||||
|
@ -59,4 +59,10 @@ public interface ProjectMapper extends BaseMapperX<ProjectDO> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default ProjectDO selectLastSequence(String prefix) {
|
||||||
|
return selectOne(new LambdaQueryWrapperX<ProjectDO>()
|
||||||
|
.likeRight(ProjectDO::getCode, prefix)
|
||||||
|
.orderByDesc(ProjectDO::getCode)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,23 +1,26 @@
|
|||||||
package cn.iocoder.yudao.module.pms.service.project;
|
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.framework.ip.core.utils.AreaUtils;
|
||||||
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
|
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
|
||||||
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
|
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.dal.dataobject.project.ProjectDetailDO;
|
||||||
import cn.iocoder.yudao.module.pms.enums.EntrustMethodConstants;
|
import cn.iocoder.yudao.module.pms.dal.mysql.project.ProjectMapper;
|
||||||
import org.springframework.stereotype.Service;
|
import cn.iocoder.yudao.module.pms.enums.ProjectTypeEnum;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import cn.iocoder.yudao.module.pms.controller.admin.project.vo.*;
|
import java.time.LocalDateTime;
|
||||||
import cn.iocoder.yudao.module.pms.dal.dataobject.project.ProjectDO;
|
import java.time.format.DateTimeFormatter;
|
||||||
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 static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
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 实现类
|
* 项目基本信息 Service 实现类
|
||||||
@ -40,25 +43,16 @@ public class ProjectServiceImpl implements ProjectService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long createProject(Long loginUserId, ProjectSaveReqVO createReqVO) {
|
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);
|
ProjectDO project = BeanUtils.toBean(createReqVO, ProjectDO.class);
|
||||||
projectMapper.insert(project);
|
projectMapper.insert(project);
|
||||||
// 启动流程
|
// 启动流程
|
||||||
if (createReqVO.getId() == null) {
|
if (createReqVO.getId() == null) {
|
||||||
if (EntrustMethodConstants.ENTRUST_PUBLIC_BIDDING.equals(project.getEntrustMethod()) ||
|
String processInstanceId = processInstanceApi.createProcessInstance(loginUserId,
|
||||||
EntrustMethodConstants.ENTRUST_INVITED_BIDDING.equals(project.getEntrustMethod())) {
|
new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY)
|
||||||
// 公开中标或邀请招标需要走流程
|
.setBusinessKey(String.valueOf(project.getId())));
|
||||||
String processInstanceId = processInstanceApi.createProcessInstance(loginUserId,
|
// 写入工作流编号
|
||||||
new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY)
|
projectMapper.updateById(new ProjectDO().setId(project.getId()).setProcessInstanceId(processInstanceId));
|
||||||
.setBusinessKey(String.valueOf(project.getId())));
|
|
||||||
// 写入工作流编号
|
|
||||||
projectMapper.updateById(new ProjectDO().setId(project.getId()).setProcessInstanceId(processInstanceId));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// 返回
|
// 返回
|
||||||
return project.getId();
|
return project.getId();
|
||||||
@ -68,6 +62,12 @@ public class ProjectServiceImpl implements ProjectService {
|
|||||||
public void updateProject(ProjectSaveReqVO updateReqVO) {
|
public void updateProject(ProjectSaveReqVO updateReqVO) {
|
||||||
// 校验存在
|
// 校验存在
|
||||||
validateProjectExists(updateReqVO.getId());
|
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);
|
ProjectDO updateObj = BeanUtils.toBean(updateReqVO, ProjectDO.class);
|
||||||
projectMapper.updateById(updateObj);
|
projectMapper.updateById(updateObj);
|
||||||
@ -125,4 +125,27 @@ public class ProjectServiceImpl implements ProjectService {
|
|||||||
projectMapper.updateById(new ProjectDO().setId(id).setProcessStatus(status));
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -20,7 +20,7 @@ spring:
|
|||||||
# throw-exception-if-no-handler-found: true # 404 错误时抛出异常,方便统一处理
|
# throw-exception-if-no-handler-found: true # 404 错误时抛出异常,方便统一处理
|
||||||
# static-path-pattern: /static/** # 静态资源路径; 注意:如果不配置,则 throw-exception-if-no-handler-found 不生效!!! TODO 芋艿:不能配置,会导致 swagger 不生效
|
# static-path-pattern: /static/** # 静态资源路径; 注意:如果不配置,则 throw-exception-if-no-handler-found 不生效!!! TODO 芋艿:不能配置,会导致 swagger 不生效
|
||||||
|
|
||||||
# Jackson 配置项
|
# Jackson 配置项y
|
||||||
jackson:
|
jackson:
|
||||||
serialization:
|
serialization:
|
||||||
write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳
|
write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳
|
||||||
@ -107,7 +107,7 @@ aj:
|
|||||||
cache-number: 1000 # local 缓存的阈值,达到这个值,清除缓存
|
cache-number: 1000 # local 缓存的阈值,达到这个值,清除缓存
|
||||||
timing-clear: 180 # local定时清除过期缓存(单位秒),设置为0代表不执行
|
timing-clear: 180 # local定时清除过期缓存(单位秒),设置为0代表不执行
|
||||||
type: blockPuzzle # 验证码类型 default两种都实例化。 blockPuzzle 滑块拼图 clickWord 文字点选
|
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)
|
interference-options: 0 # 滑动干扰项(0/1/2)
|
||||||
req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false
|
req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false
|
||||||
req-get-lock-limit: 5 # 验证失败 5 次,get接口锁定
|
req-get-lock-limit: 5 # 验证失败 5 次,get接口锁定
|
||||||
|
Loading…
Reference in New Issue
Block a user