mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-02-01 19:24:57 +08:00
[feat] 新增项目信息管理模块业务流程表单
This commit is contained in:
parent
8bfc2a8ef8
commit
55e5265152
@ -6,9 +6,16 @@ package cn.iocoder.yudao.module.pms.enums;
|
||||
* @date 2024/7/3
|
||||
*/
|
||||
public interface DictTypeConstants {
|
||||
|
||||
// ***** 字典名称 ******
|
||||
String PROJECT_TYPE = "project_type"; // 项目类型
|
||||
String ENTRUST_METHOD = "entrust_method"; // 委托方式
|
||||
String INFRA_BOOLEAN_STRING = "infra_boolean_string"; // 布尔
|
||||
String PROCESS_STATUS = "process_status"; // 流程状态
|
||||
String POSSIBILITY_OF_LANDING = "possibility_of_landing"; // 可能性
|
||||
String BPM_PROCESS_INSTANCE_STATUS = "bpm_process_instance_status"; // 流程实例状态
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,14 @@
|
||||
package cn.iocoder.yudao.module.pms.enums;
|
||||
|
||||
/**
|
||||
* @author hhyykk
|
||||
* @description 委托方式枚举
|
||||
* @date 2024/7/6
|
||||
*/
|
||||
public interface EntrustMethodConstants {
|
||||
|
||||
// **** 字典值 ******
|
||||
String ENTRUST_PUBLIC_BIDDING = "public_bidding"; // 公开招标
|
||||
String ENTRUST_DIRECT_DELEGATION = "public_direct_delegation"; // 直接委托
|
||||
String ENTRUST_INVITED_BIDDING = "invited_bidding"; // 邀请招标
|
||||
}
|
@ -25,6 +25,7 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||
|
||||
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
|
||||
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
|
||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||
|
||||
import cn.iocoder.yudao.module.pms.controller.admin.project.vo.*;
|
||||
import cn.iocoder.yudao.module.pms.dal.dataobject.project.ProjectDO;
|
||||
@ -43,7 +44,7 @@ public class ProjectController {
|
||||
@Operation(summary = "创建项目基本信息")
|
||||
@PreAuthorize("@ss.hasPermission('pms:project:create')")
|
||||
public CommonResult<Long> createProject(@Valid @RequestBody ProjectSaveReqVO createReqVO) {
|
||||
return success(projectService.createProject(createReqVO));
|
||||
return success(projectService.createProject(getLoginUserId(),createReqVO));
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
|
@ -73,8 +73,8 @@ public class ProjectRespDetailVO {
|
||||
private String reason;
|
||||
|
||||
@Schema(description = "审批状态", example = "doing")
|
||||
@DictFormat(DictTypeConstants.PROCESS_STATUS)
|
||||
private String processStatus;
|
||||
@DictFormat(DictTypeConstants.BPM_PROCESS_INSTANCE_STATUS)
|
||||
private Integer processStatus;
|
||||
|
||||
@Schema(description = "状态", example = "doing")
|
||||
private String status;
|
||||
|
@ -52,4 +52,10 @@ public class ProjectRespVO {
|
||||
@Schema(description = "客户公司", example = "26238")
|
||||
@ExcelProperty("客户公司")
|
||||
private String customerCompanyName;
|
||||
|
||||
@Schema(description = "流程实体id", example = "26238")
|
||||
private String processInstanceId;
|
||||
|
||||
@Schema(description = "委托方式", example = "public_bidding")
|
||||
private String entrustMethod;
|
||||
}
|
@ -21,7 +21,7 @@ public class ProjectSaveReqVO {
|
||||
@Schema(description = "项目编号")
|
||||
private String code;
|
||||
|
||||
@Schema(description = "客户联系人")
|
||||
@Schema(description = "客户联系人", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
|
||||
private String customerUser;
|
||||
|
||||
@Schema(description = "出图公司", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ -51,19 +51,19 @@ public class ProjectSaveReqVO {
|
||||
private String reason;
|
||||
|
||||
@Schema(description = "审批状态", example = "2")
|
||||
private String processStatus;
|
||||
private Integer processStatus;
|
||||
|
||||
@Schema(description = "跟踪编号")
|
||||
@Schema(description = "跟踪编号", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String trackingCode;
|
||||
|
||||
@Schema(description = "类型", example = "1")
|
||||
@Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
private String type;
|
||||
|
||||
@Schema(description = "客户公司id", requiredMode = Schema.RequiredMode.REQUIRED, example = "12216")
|
||||
@NotNull(message = "客户公司id不能为空")
|
||||
private Long customerCompanyId;
|
||||
|
||||
@Schema(description = "项目经理id", example = "26238")
|
||||
@Schema(description = "项目经理id", requiredMode = Schema.RequiredMode.REQUIRED, example = "26238")
|
||||
private Long projectManagerId;
|
||||
|
||||
@Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ -82,17 +82,17 @@ public class ProjectSaveReqVO {
|
||||
@Schema(description = "中标附件", example = "https://www.iocoder.cn")
|
||||
private List<String> winFileUrl;
|
||||
|
||||
@Schema(description = "预计合同金额")
|
||||
@Schema(description = "预计合同金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
|
||||
private String contractAmount;
|
||||
|
||||
@Schema(description = "客户电话", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotEmpty(message = "客户电话不能为空")
|
||||
private String customerPhone;
|
||||
|
||||
@Schema(description = "省份id", example = "25195")
|
||||
@Schema(description = "省份id", requiredMode = Schema.RequiredMode.REQUIRED, example = "25195")
|
||||
private Long provinceId;
|
||||
|
||||
@Schema(description = "城市id", example = "23899")
|
||||
@Schema(description = "城市id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23899")
|
||||
private Long cityId;
|
||||
|
||||
}
|
@ -97,7 +97,7 @@ public class ProjectDO extends BaseDO {
|
||||
*
|
||||
* 枚举 {@link DictTypeConstants}
|
||||
*/
|
||||
private String processStatus;
|
||||
private Integer processStatus;
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
|
@ -1,13 +1,10 @@
|
||||
package cn.iocoder.yudao.module.pms.service.project;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import cn.iocoder.yudao.module.pms.dal.dataobject.project.ProjectDetailDO;
|
||||
import jakarta.validation.*;
|
||||
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.pojo.PageParam;
|
||||
|
||||
/**
|
||||
* 项目基本信息 Service 接口
|
||||
@ -19,10 +16,11 @@ public interface ProjectService {
|
||||
/**
|
||||
* 创建项目基本信息
|
||||
*
|
||||
* @param loginUserId 登录用户id
|
||||
* @param createReqVO 创建信息
|
||||
* @return 编号
|
||||
*/
|
||||
Long createProject(@Valid ProjectSaveReqVO createReqVO);
|
||||
Long createProject(Long loginUserId, @Valid ProjectSaveReqVO createReqVO);
|
||||
|
||||
/**
|
||||
* 更新项目基本信息
|
||||
@ -68,4 +66,11 @@ public interface ProjectService {
|
||||
* @return 基本信息
|
||||
*/
|
||||
ProjectDetailDO getProjectDetail(Long id);
|
||||
|
||||
/**
|
||||
* 更新项目立项状态
|
||||
* @param id 编号
|
||||
* @param status 结果
|
||||
*/
|
||||
void updateProjectStatus(Long id, Integer status);
|
||||
}
|
@ -1,17 +1,17 @@
|
||||
package cn.iocoder.yudao.module.pms.service.project;
|
||||
|
||||
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.dal.dataobject.project.ProjectDetailDO;
|
||||
import cn.iocoder.yudao.module.pms.enums.EntrustMethodConstants;
|
||||
import org.springframework.stereotype.Service;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.*;
|
||||
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.pojo.PageParam;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
|
||||
import cn.iocoder.yudao.module.pms.dal.mysql.project.ProjectMapper;
|
||||
@ -28,15 +28,38 @@ import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstants.*;
|
||||
@Validated
|
||||
public class ProjectServiceImpl implements ProjectService {
|
||||
|
||||
/**
|
||||
* 项目立项审批流程定义
|
||||
*/
|
||||
public static final String PROCESS_KEY = "pms_project_init";
|
||||
|
||||
@Resource
|
||||
private ProjectMapper projectMapper;
|
||||
@Resource
|
||||
private BpmProcessInstanceApi processInstanceApi;
|
||||
|
||||
@Override
|
||||
public Long createProject(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);
|
||||
projectMapper.insert(project);
|
||||
// todo 启动流程
|
||||
// 启动流程
|
||||
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));
|
||||
}
|
||||
}
|
||||
// 返回
|
||||
return project.getId();
|
||||
}
|
||||
@ -95,4 +118,11 @@ public class ProjectServiceImpl implements ProjectService {
|
||||
return dto;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateProjectStatus(Long id, Integer status) {
|
||||
// 校验存在
|
||||
validateProjectExists(id);
|
||||
projectMapper.updateById(new ProjectDO().setId(id).setProcessStatus(status));
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package cn.iocoder.yudao.module.pms.service.project.listener;
|
||||
|
||||
import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;
|
||||
import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEventListener;
|
||||
import cn.iocoder.yudao.module.pms.service.project.ProjectService;
|
||||
import cn.iocoder.yudao.module.pms.service.project.ProjectServiceImpl;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @author hhyykk
|
||||
* @description 项目立项状态监听器
|
||||
* @date 2024/7/6
|
||||
*/
|
||||
@Component
|
||||
public class ProjectInitStatusListener extends BpmProcessInstanceStatusEventListener {
|
||||
|
||||
@Resource
|
||||
private ProjectService projectService;
|
||||
|
||||
@Override
|
||||
protected String getProcessDefinitionKey() {
|
||||
return ProjectServiceImpl.PROCESS_KEY;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onEvent(BpmProcessInstanceStatusEvent event) {
|
||||
projectService.updateProjectStatus(Long.parseLong(event.getBusinessKey()), event.getStatus());
|
||||
}
|
||||
}
|
@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.pms.service.project;
|
||||
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
|
||||
import jakarta.annotation.Resource;
|
||||
|
||||
@ -13,20 +12,14 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.project.ProjectDO;
|
||||
import cn.iocoder.yudao.module.pms.dal.mysql.project.ProjectMapper;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import java.util.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import static cn.hutool.core.util.RandomUtil.*;
|
||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||
import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstants.*;
|
||||
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;
|
||||
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
|
||||
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*;
|
||||
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
/**
|
||||
* {@link ProjectServiceImpl} 的单元测试类
|
||||
@ -48,7 +41,7 @@ public class ProjectServiceImplTest extends BaseDbUnitTest {
|
||||
ProjectSaveReqVO createReqVO = randomPojo(ProjectSaveReqVO.class).setId(null);
|
||||
|
||||
// 调用
|
||||
Long projectId = projectService.createProject(createReqVO);
|
||||
Long projectId = projectService.createProject(1L, createReqVO);
|
||||
// 断言
|
||||
assertNotNull(projectId);
|
||||
// 校验记录的属性是否正确
|
||||
|
Loading…
Reference in New Issue
Block a user