[fix] 文件管理

This commit is contained in:
hhyykk 2024-07-15 18:15:51 +08:00
parent ca78b91424
commit 2b29b12235
8 changed files with 82 additions and 24 deletions

View File

@ -30,4 +30,7 @@ public class FilePageReqVO extends PageParam {
@Schema(description = "目录id", example = "12345646") @Schema(description = "目录id", example = "12345646")
private Long categoryId; private Long categoryId;
@Schema(description = "名称", example = "12345646")
private String name;
} }

View File

@ -21,6 +21,7 @@ public interface FileMapper extends BaseMapperX<FileDO> {
.likeIfPresent(FileDO::getType, reqVO.getType()) .likeIfPresent(FileDO::getType, reqVO.getType())
.betweenIfPresent(FileDO::getCreateTime, reqVO.getCreateTime()) .betweenIfPresent(FileDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(FileDO::getCategoryId, reqVO.getCategoryId()) .eqIfPresent(FileDO::getCategoryId, reqVO.getCategoryId())
.likeIfPresent(FileDO::getName, reqVO.getName())
.orderByDesc(FileDO::getId)); .orderByDesc(FileDO::getId));
} }

View File

@ -9,6 +9,7 @@ import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
@ -61,7 +62,7 @@ public class ProjectRespDetailVO {
@Schema(description = "漏斗预期", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") @Schema(description = "漏斗预期", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
@ExcelProperty("漏斗预期") @ExcelProperty("漏斗预期")
private String funnelExpectation; private BigDecimal funnelExpectation;
@Schema(description = "委托方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") @Schema(description = "委托方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
@ExcelProperty(value = "委托方式", converter = DictConvert.class) @ExcelProperty(value = "委托方式", converter = DictConvert.class)
@ -112,7 +113,7 @@ public class ProjectRespDetailVO {
@Schema(description = "预计合同金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") @Schema(description = "预计合同金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
// @ExcelProperty(value = "预计合同金额", converter = MoneyConvert.class) // @ExcelProperty(value = "预计合同金额", converter = MoneyConvert.class)
private String contractAmount; private BigDecimal contractAmount;
@Schema(description = "客户电话", example = "17656598224") @Schema(description = "客户电话", example = "17656598224")
@ExcelProperty("客户电话") @ExcelProperty("客户电话")

View File

@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.pms.controller.admin.project.vo;
import cn.iocoder.yudao.module.pms.enums.DictTypeConstants; import cn.iocoder.yudao.module.pms.enums.DictTypeConstants;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.*;
import java.math.BigDecimal;
import java.util.*; import java.util.*;
import com.alibaba.excel.annotation.*; import com.alibaba.excel.annotation.*;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
@ -47,7 +49,7 @@ public class ProjectRespVO {
@Schema(description = "预计合同金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1216569") @Schema(description = "预计合同金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1216569")
@ExcelProperty("预计合同金额") @ExcelProperty("预计合同金额")
private String contractAmount; private BigDecimal contractAmount;
@Schema(description = "客户公司", example = "26238") @Schema(description = "客户公司", example = "26238")
@ExcelProperty("客户公司") @ExcelProperty("客户公司")

View File

@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.pms.controller.admin.project.vo;
import cn.iocoder.yudao.framework.common.pojo.FileDTO; 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.math.BigDecimal;
import java.util.*; import java.util.*;
import jakarta.validation.constraints.*; import jakarta.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
@ -40,9 +42,8 @@ public class ProjectSaveReqVO {
@NotEmpty(message = "落地可能性不能为空") @NotEmpty(message = "落地可能性不能为空")
private String possibility; private String possibility;
@Schema(description = "漏斗预期", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "漏斗预期")
@NotEmpty(message = "漏斗预期不能为空") private BigDecimal funnelExpectation;
private String funnelExpectation;
@Schema(description = "委托方式", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "委托方式", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "委托方式不能为空") @NotEmpty(message = "委托方式不能为空")
@ -84,7 +85,7 @@ public class ProjectSaveReqVO {
private List<FileDTO> 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 BigDecimal contractAmount;
@Schema(description = "客户电话", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "客户电话", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "客户电话不能为空") @NotEmpty(message = "客户电话不能为空")

View File

@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.pms.dal.dataobject.project;
import cn.iocoder.yudao.module.pms.enums.DictTypeConstants; import cn.iocoder.yudao.module.pms.enums.DictTypeConstants;
import lombok.*; import lombok.*;
import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -75,7 +77,7 @@ public class ProjectDO extends BaseDO {
/** /**
* 漏斗预期 * 漏斗预期
*/ */
private String funnelExpectation; private BigDecimal funnelExpectation;
/** /**
* 委托方式 * 委托方式
* *
@ -145,7 +147,7 @@ public class ProjectDO extends BaseDO {
/** /**
* 预计合同金额 * 预计合同金额
*/ */
private String contractAmount; private BigDecimal contractAmount;
/** /**
* 客户电话 * 客户电话
*/ */

View File

@ -58,10 +58,19 @@ public interface ProjectMapper extends BaseMapperX<ProjectDO> {
); );
} }
default ProjectDO selectLastSequence(String prefix) { default ProjectDO selectLastCodeSequence(String prefix, String type) {
return selectOne(new LambdaQueryWrapperX<ProjectDO>() if ("code".equals(type)) {
.likeRight(ProjectDO::getCode, prefix) return selectOne(new LambdaQueryWrapperX<ProjectDO>()
.orderByDesc(ProjectDO::getCode) .likeRight(ProjectDO::getCode, prefix)
); .orderByDesc(ProjectDO::getCode)
);
} else if ("trackingCode".equals(type)) {
return selectOne(new LambdaQueryWrapperX<ProjectDO>()
.likeRight(ProjectDO::getTrackingCode, prefix)
.orderByDesc(ProjectDO::getTrackingCode)
);
}
return null;
} }
} }

View File

@ -1,7 +1,6 @@
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.enums.ProcessStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.FileDTO;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.file.FileUtils; import cn.iocoder.yudao.framework.common.util.file.FileUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@ -14,15 +13,14 @@ 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.dal.mysql.project.ProjectMapper; import cn.iocoder.yudao.module.pms.dal.mysql.project.ProjectMapper;
import cn.iocoder.yudao.module.pms.enums.ProjectTypeEnum; import cn.iocoder.yudao.module.pms.enums.ProjectTypeEnum;
import com.alibaba.fastjson.JSON;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.List;
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.PROJECT_NOT_EXISTS; import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstants.PROJECT_NOT_EXISTS;
@ -40,6 +38,18 @@ public class ProjectServiceImpl implements ProjectService {
* 项目立项审批流程定义 * 项目立项审批流程定义
*/ */
public static final String PROCESS_KEY = "pms_project_init"; public static final String PROCESS_KEY = "pms_project_init";
/**
* 项目跟踪编号前缀
*/
private static final String TRACKING_PREFIX = "XS";
/**
* 项目编号
*/
private static final String CODE = "code";
/**
* 项目跟踪编号
*/
private static final String TRACKING_CODE = "trackingCode";
@Resource @Resource
private ProjectMapper projectMapper; private ProjectMapper projectMapper;
@ -50,9 +60,14 @@ public class ProjectServiceImpl implements ProjectService {
public Long createProject(Long loginUserId, ProjectSaveReqVO createReqVO) { public Long createProject(Long loginUserId, ProjectSaveReqVO createReqVO) {
// 插入 // 插入
ProjectDO project = BeanUtils.toBean(createReqVO, ProjectDO.class); ProjectDO project = BeanUtils.toBean(createReqVO, ProjectDO.class);
// 生成跟踪编号
project.setTrackingCode(this.generator(TRACKING_PREFIX, 1, TRACKING_CODE));
// 处理文件
project.setReviewFileUrl(FileUtils.covertFileToJSONString(createReqVO.getReviewFileUrl())); project.setReviewFileUrl(FileUtils.covertFileToJSONString(createReqVO.getReviewFileUrl()));
project.setWinFileUrl(FileUtils.covertFileToJSONString(createReqVO.getWinFileUrl())); project.setWinFileUrl(FileUtils.covertFileToJSONString(createReqVO.getWinFileUrl()));
// 漏斗预期计算
BigDecimal funnel = caculateFunnel(project.getPossibility(), project.getContractAmount());
project.setFunnelExpectation(funnel);
projectMapper.insert(project); projectMapper.insert(project);
// 启动流程 // 启动流程
if (createReqVO.getId() == null) { if (createReqVO.getId() == null) {
@ -73,9 +88,12 @@ public class ProjectServiceImpl implements ProjectService {
// 如果审批通过,且项目落地则生成项目编号 eg. 勘察设计KS20240001检测监测JC20240001咨询ZX20240001数智SZ20240001 // 如果审批通过,且项目落地则生成项目编号 eg. 勘察设计KS20240001检测监测JC20240001咨询ZX20240001数智SZ20240001
if (ProcessStatusEnum.APPROVAL_PASS.getInterval().equals(updateReqVO.getProcessStatus()) if (ProcessStatusEnum.APPROVAL_PASS.getInterval().equals(updateReqVO.getProcessStatus())
&& Boolean.TRUE.equals(updateReqVO.getConfirmation())) { && Boolean.TRUE.equals(updateReqVO.getConfirmation())) {
String codeNo = this.generator(ProjectTypeEnum.getNoByCode(updateReqVO.getType()), 1); String codeNo = this.generator(ProjectTypeEnum.getNoByCode(updateReqVO.getType()), 1, CODE);
updateReqVO.setCode(codeNo); updateReqVO.setCode(codeNo);
} }
// 漏斗预期计算
BigDecimal funnel = caculateFunnel(updateReqVO.getPossibility(), updateReqVO.getContractAmount());
updateReqVO.setFunnelExpectation(funnel);
// 更新 // 更新
ProjectDO updateObj = BeanUtils.toBean(updateReqVO, ProjectDO.class); ProjectDO updateObj = BeanUtils.toBean(updateReqVO, ProjectDO.class);
updateObj.setReviewFileUrl(FileUtils.covertFileToJSONString(updateReqVO.getReviewFileUrl())); updateObj.setReviewFileUrl(FileUtils.covertFileToJSONString(updateReqVO.getReviewFileUrl()));
@ -138,13 +156,13 @@ public class ProjectServiceImpl implements ProjectService {
/** /**
* 序号自增 * 序号自增
* @param prefix 前缀 * @param prefix 前缀
* @param number 步进 * @param increment 步进
* @return 自增后的序列 * @return 自增后的序列
*/ */
private String generator(String prefix, Integer number) { private String generator(String prefix, Integer increment, String type) {
// 获取当前年月日 // 获取当前年月日
prefix += LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy")); prefix += LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy"));
ProjectDO projectDO = projectMapper.selectLastSequence(prefix); ProjectDO projectDO = projectMapper.selectLastCodeSequence(prefix, type);
if (projectDO == null) { if (projectDO == null) {
return prefix + "0001"; return prefix + "0001";
} else { } else {
@ -153,8 +171,29 @@ public class ProjectServiceImpl implements ProjectService {
String lastSequence = sequence.substring(sequence.length() - 4); String lastSequence = sequence.substring(sequence.length() - 4);
// 自增1 // 自增1
int lastNumber = Integer.parseInt(lastSequence); int lastNumber = Integer.parseInt(lastSequence);
lastNumber = lastNumber + number; lastNumber = lastNumber + increment;
return prefix + String.format("%04d", lastNumber); return prefix + String.format("%04d", lastNumber);
} }
} }
/**
* 计算漏斗预期 漏斗预期 = 落地可能性 x 预计合同额
* @param possibility 落地可能性百分比
* @param contractAmount 预计合同金额
* @return 漏斗预期
*/
private BigDecimal caculateFunnel(String possibility, BigDecimal contractAmount) {
if (possibility.endsWith("%")) {
// 去掉百分号
String withoutPercent = possibility.replace("%", "");
// 转换为BigDecimal
BigDecimal possibilityDecimal = new BigDecimal(withoutPercent).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
// 四舍五入取整
return contractAmount.multiply(possibilityDecimal).setScale(0, RoundingMode.DOWN);
} else {
// 为0
return BigDecimal.ZERO;
}
}
} }