From 579a6475664fe798baba174004b7589f8903f5eb Mon Sep 17 00:00:00 2001 From: wyw <13885678+wyw0828@user.noreply.gitee.com> Date: Tue, 6 Aug 2024 16:05:31 +0800 Subject: [PATCH] =?UTF-8?q?[feat]=20=E6=96=B0=E5=A2=9E=E5=90=88=E5=90=8C?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=B8=AD=E7=9A=84=E6=B5=81=E7=A8=8B=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/api/task/BpmProcessInstanceApi.java | 20 +++ .../task/dto/BpmProcessDefinitionRespDTO.java | 115 ++++++++++++++ .../task/dto/BpmProcessInstanceRespDTO.java | 118 ++++++++++++++ .../bpm/api/task/dto/BpmTaskRespDTO.java | 144 ++++++++++++++++++ .../api/task/BpmProcessInstanceApiImpl.java | 101 ++++++++++++ .../vo/instance/BpmProcessInstanceRespVO.java | 1 + .../cms/enums/ChargingStandardEnum.java | 6 +- .../module/cms/enums/ContractStatusEnum.java | 10 +- .../module/cms/enums/ContractTypeEnum.java | 8 +- .../yudao/module/cms/enums/CountTypeEnum.java | 4 +- .../cms/enums/OutsContractMajorEnum.java | 10 +- .../module/cms/enums/ProcessStatusEnum.java | 6 +- .../yudao/module/cms/enums/SourceEnum.java | 6 +- .../admin/contract/ContractController.java | 16 ++ .../vo/ContractProcessInstanceRespVO.java | 82 ++++++++++ .../cms/service/contract/ContractService.java | 7 +- .../service/contract/ContractServiceImpl.java | 39 ++++- .../ContractHistoryServiceImpl.java | 1 + .../extContract/ExtContractServiceImpl.java | 2 +- .../ExtContractHistoryServiceImpl.java | 2 +- .../outscontract/OutsContractServiceImpl.java | 2 +- .../OutsContractHistoryServiceImpl.java | 2 +- 22 files changed, 671 insertions(+), 31 deletions(-) create mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/dto/BpmProcessDefinitionRespDTO.java create mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/dto/BpmProcessInstanceRespDTO.java create mode 100644 yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/dto/BpmTaskRespDTO.java create mode 100644 yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/controller/admin/contract/vo/ContractProcessInstanceRespVO.java diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApi.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApi.java index e4eddf6eb..07c9bd25c 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApi.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApi.java @@ -2,8 +2,12 @@ package cn.iocoder.yudao.module.bpm.api.task; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; +import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceRespDTO; +import cn.iocoder.yudao.module.bpm.api.task.dto.BpmTaskRespDTO; import jakarta.validation.Valid; +import java.util.List; + /** * 流程实例 Api 接口 * @@ -20,4 +24,20 @@ public interface BpmProcessInstanceApi { */ String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO reqDTO); + + /** + * 查询流程 + * + * @param id 流程id + * @return + */ + BpmProcessInstanceRespDTO getProcessInstance(String id); + + + /** + * 查询指定流程的任务 + * @param id 流程id + * @return + */ + List getTask(String id); } diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/dto/BpmProcessDefinitionRespDTO.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/dto/BpmProcessDefinitionRespDTO.java new file mode 100644 index 000000000..2ebbe3ac9 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/dto/BpmProcessDefinitionRespDTO.java @@ -0,0 +1,115 @@ +package cn.iocoder.yudao.module.bpm.api.task.dto; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 流程定义 + */ +@Data +public class BpmProcessDefinitionRespDTO { + /** + * 编号 + */ + private String id; + + /** + * 版本 + */ + private Integer version; + + /** + * 流程名称 + */ + private String name; + + /** + * 流程标识 + */ + private String key; + + /** + * 流程图标 + */ + private String icon; + + /** + * 流程描述 + */ + private String description; + + /** + * 流程分类 + */ + private String category; + /** + * 流程分类名字 + */ + private String categoryName; + + /** + * 表单类型 + */ + private Integer formType; + + /** + * 表单编号 + */ + private Long formId; + + /** + * 表单名字 + */ + private String formName; + /** + * 表单的配置 + */ + private String formConf; + + /** + * 表单项的数组 + */ + private List formFields; + + /** + * 自定义表单的提交路径 + */ + private String formCustomCreatePath; + + /** + * 自定义表单的查看路径 + */ + private String formCustomViewPath; + + /** + * 中断状态-参见 SuspensionState 枚举 + */ + private Integer suspensionState; // 参见 SuspensionState 枚举 + + /** + * 部署时间 + */ + private LocalDateTime deploymentTime; // 需要从对应的 Deployment 读取,非必须返回 + + /** + * BPMN XML + */ + private String bpmnXml; // 需要从对应的 BpmnModel 读取,非必须返回 + + /** + * 发起用户需要选择审批人的任务数组 + */ + private List startUserSelectTasks; // 需要从对应的 BpmnModel 读取,非必须返回 + + @Data + public static class UserTask { + + private String id; + + private String name; + + } + +} diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/dto/BpmProcessInstanceRespDTO.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/dto/BpmProcessInstanceRespDTO.java new file mode 100644 index 000000000..93d7272d0 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/dto/BpmProcessInstanceRespDTO.java @@ -0,0 +1,118 @@ +package cn.iocoder.yudao.module.bpm.api.task.dto; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 流程实例的获得 Resp DTO + */ +@Data +public class BpmProcessInstanceRespDTO { + + /** + * 流程实例编号 + */ + private String id; + + /** + * 流程实例名称 + */ + private String name; + + /** + * 流程分类 + */ + private String category; + + /** + * 流程分类名称 + */ + private String categoryName; + + /** + * 流程实例状态 + */ + private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举 + + /** + * 发起时间 + */ + private LocalDateTime startTime; + + /** + * 结束时间 + */ + private LocalDateTime endTime; + + /** + * 持续时间 + */ + private Long durationInMillis; + + /** + * 发起流程的用户 + */ + private User startUser; + + /** + * 流程定义编号 + */ + + private String processDefinitionId; + /** + * 流程定义 + */ + private BpmProcessDefinitionRespDTO processDefinition; + + + /** + * 当前审批中的任务 + */ + private List tasks; // 仅在流程实例分页才返回 + + /** + * 用户信息 + */ + @Data + public static class User { + /** + * 用户编号 + */ + private Long id; + /** + * 用户名称 + */ + private String nickname; + /** + * 部门编号 + */ + private Long deptId; + /** + * 部门名称 + */ + private String deptName; + + } + + /** + * 流程任务 + */ + @Data + public static class Task { + + /** + * 流程任务编号 + */ + private String id; + + /** + * 任务名称 + */ + private String name; + + + } + +} diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/dto/BpmTaskRespDTO.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/dto/BpmTaskRespDTO.java new file mode 100644 index 000000000..c0d9da9a2 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/dto/BpmTaskRespDTO.java @@ -0,0 +1,144 @@ +package cn.iocoder.yudao.module.bpm.api.task.dto; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + + +/** + * 指定流程实例的任务 + */ +@Data +public class BpmTaskRespDTO { + + /** + * 任务编号 + */ + private String id; + + /** + * 任务名字 + */ + private String name; + + /** + * 创建时间 + */ + + private LocalDateTime createTime; + + /** + * 结束时间 + */ + private LocalDateTime endTime; + + + /** + * 持续时间 + */ + private Long durationInMillis; + + /** + * 任务状态 + */ + private Integer status; // 参见 BpmTaskStatusEnum 枚举 + + /** + * 审批理由 + */ + private String reason; + + /** + * 负责人的用户信息 + */ + private BpmProcessInstanceRespDTO.User ownerUser; + /** + * 审核的用户信息 + */ + private BpmProcessInstanceRespDTO.User assigneeUser; + + /** + * 任务定义的标识 + */ + private String taskDefinitionKey; + + /** + * 所属流程实例编号 + */ + private String processInstanceId; + /** + * 所属流程实例 + */ + private ProcessInstance processInstance; + + /** + * 父任务编号 + */ + private String parentTaskId; + + /** + * 子任务列表(由加签生成) + */ + private List children; + + /** + * 表单编号 + */ + private Long formId; + + /** + * 表单名字 + */ + private String formName; + + /** + * 表单的配置-JSON 字符串 + */ + private String formConf; + + /** + * 表单项的数组 + */ + private List formFields; + + /** + * 提交的表单值 + */ + private Map formVariables; + + + /** + * 流程实例 + */ + @Data + public static class ProcessInstance { + + /** + * 流程实例编号 + */ + private String id; + + /** + * 流程实例名称 + */ + private String name; + + /** + * 提交时间 + */ + private LocalDateTime createTime; + + /** + * 流程定义的编号 + */ + private String processDefinitionId; + + /** + * 发起人的用户信息 + */ + private BpmProcessInstanceRespDTO.User startUser; + + } +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java index f8aea4d74..346116d47 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java @@ -1,13 +1,42 @@ package cn.iocoder.yudao.module.bpm.api.task; +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.util.number.NumberUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; +import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceRespDTO; +import cn.iocoder.yudao.module.bpm.api.task.dto.BpmTaskRespDTO; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; +import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; +import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; +import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; +import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService; +import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; +import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; +import cn.iocoder.yudao.module.system.api.dept.DeptApi; +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import jakarta.annotation.Resource; import jakarta.validation.Valid; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Stream; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap; + /** * Flowable 流程实例 Api 实现类 * @@ -21,8 +50,80 @@ public class BpmProcessInstanceApiImpl implements BpmProcessInstanceApi { @Resource private BpmProcessInstanceService processInstanceService; + @Resource + private AdminUserApi adminUserApi; + + @Resource + private DeptApi deptApi; + + @Resource + private BpmProcessDefinitionService processDefinitionService; + + @Resource + private BpmTaskService taskService; + + @Resource + private BpmFormService formService; + @Override public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO reqDTO) { return processInstanceService.createProcessInstance(userId, reqDTO); } + + @Override + public BpmProcessInstanceRespDTO getProcessInstance(String id) { + + HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(id); + if (processInstance == null) { + return null; + } + + // 拼接返回 + ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition( + processInstance.getProcessDefinitionId()); + BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo( + processInstance.getProcessDefinitionId()); + + String bpmnXml = BpmnModelUtils.getBpmnXml( + processDefinitionService.getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId())); + + AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId())); + DeptRespDTO dept = null; + if (startUser != null) { + dept = deptApi.getDept(startUser.getDeptId()); + } + BpmProcessInstanceRespVO bpmProcessInstanceRespVO = BpmProcessInstanceConvert.INSTANCE.buildProcessInstance(processInstance, + processDefinition, processDefinitionInfo, bpmnXml, startUser, dept); + + return BeanUtils.toBean(bpmProcessInstanceRespVO, BpmProcessInstanceRespDTO.class); + + } + + //List + @Override + public List getTask(String id) { + List taskList = taskService.getTaskListByProcessInstanceId(id); + if (CollUtil.isEmpty(taskList)) { + return null; + } + + // 拼接数据 + HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(id); + // 获得 User 和 Dept Map + Set userIds = convertSetByFlatMap(taskList, task -> + Stream.of(NumberUtils.parseLong(task.getAssignee()), NumberUtils.parseLong(task.getOwner()))); + userIds.add(NumberUtils.parseLong(processInstance.getStartUserId())); + Map userMap = adminUserApi.getUserMap(userIds); + Map deptMap = deptApi.getDeptMap( + convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); + // 获得 Form Map + Map formMap = formService.getFormMap( + convertSet(taskList, task -> NumberUtils.parseLong(task.getFormKey()))); + List bpmTaskRespVOS = BpmTaskConvert.INSTANCE.buildTaskListByProcessInstanceId(taskList, processInstance, + formMap, userMap, deptMap); + return BeanUtils.toBean(bpmTaskRespVOS, BpmTaskRespDTO.class); + + } + + } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java index ac6b90c7e..e2f54dcbc 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java @@ -20,6 +20,7 @@ public class BpmProcessInstanceRespVO { @Schema(description = "流程分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private String category; + @Schema(description = "流程分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "请假") private String categoryName; diff --git a/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/ChargingStandardEnum.java b/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/ChargingStandardEnum.java index 2d193587d..1c03eceee 100644 --- a/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/ChargingStandardEnum.java +++ b/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/ChargingStandardEnum.java @@ -12,11 +12,11 @@ import lombok.Getter; @AllArgsConstructor public enum ChargingStandardEnum { //厦建设 - XIA_BUILDING("xia_building","XB"), + XIA_BUILDING("0","xia_building"), //包干价 - LUMP("lump","LU"), + LUMP("1","lump"), //其他省份 - OTHER("other","OT"); + OTHER("2","other"); /** * 类型编号 diff --git a/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/ContractStatusEnum.java b/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/ContractStatusEnum.java index 2a04d132f..3fac1c074 100644 --- a/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/ContractStatusEnum.java +++ b/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/ContractStatusEnum.java @@ -12,15 +12,15 @@ import lombok.Getter; @AllArgsConstructor public enum ContractStatusEnum { //应签未签 - NO_SIGN("no_sign","NS"), + NO_SIGN("0","no_sign"), //已拟定 - PREPARED("prepared","PP"), + PREPARED("1","prepared"), //已盖章 - STAMP("stamp","ST"), + STAMP("2","stamp"), //已签订 - SIGN("sign","SI"), + SIGN("3","sign"), //已终止 - TERMINATION("termination","TE"),; + TERMINATION("4","termination"),; /** * 类型编号 diff --git a/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/ContractTypeEnum.java b/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/ContractTypeEnum.java index 9444d6f71..e097bc5a1 100644 --- a/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/ContractTypeEnum.java +++ b/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/ContractTypeEnum.java @@ -12,13 +12,13 @@ import lombok.Getter; @AllArgsConstructor public enum ContractTypeEnum { //勘察设计 - SURVEY("survey","KS"), + SURVEY("0","survey"), //检测 - DETECTION("detection","JC"), + DETECTION("1","detection"), //总承包合同 - GENERAL_CONTRACT("general_contract","GC"), + GENERAL_CONTRACT("2","general_contract"), //全过程咨询 - PROCESS_CONSULTATION("process_consultation","PC"); + PROCESS_CONSULTATION("3","process_consultation"); /** diff --git a/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/CountTypeEnum.java b/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/CountTypeEnum.java index 8724675b0..bcaaef9f9 100644 --- a/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/CountTypeEnum.java +++ b/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/CountTypeEnum.java @@ -12,9 +12,9 @@ import lombok.Getter; @AllArgsConstructor public enum CountTypeEnum { //费率合同 - RATE_CONTRACT("rate_contract","RC"), + RATE_CONTRACT("0","rate_contract"), //包干合同 - RES_CONTRACT("res_contract","RC"); + RES_CONTRACT("1","res_contract"); /** * 类型编号 */ diff --git a/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/OutsContractMajorEnum.java b/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/OutsContractMajorEnum.java index 3755a157b..8b2f1e154 100644 --- a/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/OutsContractMajorEnum.java +++ b/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/OutsContractMajorEnum.java @@ -12,15 +12,15 @@ import lombok.Getter; @AllArgsConstructor public enum OutsContractMajorEnum { //地勘 - GROUND_SERVICE("ground_service","GE"), + GROUND_SERVICE("0","ground_service"), //景观 - SCENERY("scenery","SC"), + SCENERY("1","scenery"), //建筑 - ARCHITECTURE("architecture","AR"), + ARCHITECTURE("2","architecture"), //测量 - MEASURE("measure","ME"), + MEASURE("3","measure"), //效果图 - EFFECT_PICTURE("effect_picture","EF"); + EFFECT_PICTURE("4","effect_picture"); /** * 类型编号 diff --git a/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/ProcessStatusEnum.java b/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/ProcessStatusEnum.java index 92f1bb771..ce299aa36 100644 --- a/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/ProcessStatusEnum.java +++ b/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/ProcessStatusEnum.java @@ -12,11 +12,11 @@ import lombok.Getter; @AllArgsConstructor public enum ProcessStatusEnum { //未执行 - NO_EXECUTION("0","NO_EXECUTION"), + NO_EXECUTION("0","no_execution"), //正在执行 - EXECUTING("1","EXECUTING"), + EXECUTING("1","executing"), //执行完成 - COMPLETED("2","COMPLETED"); + COMPLETED("2","completed"); /** * 类型编号 diff --git a/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/SourceEnum.java b/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/SourceEnum.java index 2a4ec6b85..06d59c4d8 100644 --- a/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/SourceEnum.java +++ b/yudao-module-cms/yudao-module-cms-api/src/main/java/cn/iocoder/yudao/module/cms/enums/SourceEnum.java @@ -12,11 +12,11 @@ import lombok.Getter; @AllArgsConstructor public enum SourceEnum { //市财政 - MUNICIPAL_FINANCE("municipal_finance","MF"), + MUNICIPAL_FINANCE("0","municipal_finance"), //区财政 - DISTRICT_FINANCE("district_finance","DF"), + DISTRICT_FINANCE("1","district_finance"), //业主自筹 - OWNER_FINANCE("owner_finance","OF"); + OWNER_FINANCE("2","owner_finance"); /** * 类型编号 */ diff --git a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/controller/admin/contract/ContractController.java b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/controller/admin/contract/ContractController.java index f665ec800..94f0bda3e 100644 --- a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/controller/admin/contract/ContractController.java +++ b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/controller/admin/contract/ContractController.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.cms.controller.admin.contract; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.cms.controller.admin.contract.vo.ContractProcessInstanceRespVO; import cn.iocoder.yudao.module.cms.controller.admin.contract.vo.ContractPageReqVO; import cn.iocoder.yudao.module.cms.controller.admin.contract.vo.ContractRespVO; import cn.iocoder.yudao.module.cms.controller.admin.contract.vo.ContractSaveReqVO; @@ -39,6 +40,8 @@ public class ContractController { @Resource private ContractService contractService; + + @PostMapping("/create") @Operation(summary = "创建合同") @PreAuthorize("@ss.hasPermission('cms:contract:create')") @@ -92,4 +95,17 @@ public class ContractController { ExcelUtils.write(response, "合同.xls", "数据", ContractRespVO.class, BeanUtils.toBean(list, ContractRespVO.class)); } + + @GetMapping("/get_process") + @Operation(summary = "查询流程") + @Parameter(name = "id", description = "合同id", required = true) + @PreAuthorize("@ss.hasPermission('cms:contract:process')") + public CommonResult getContractProcess(@RequestParam("id") Long id) { + ContractProcessInstanceRespVO contractProcessInstance = contractService.getContractProcess(id); + return success(contractProcessInstance); + } + + + + } \ No newline at end of file diff --git a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/controller/admin/contract/vo/ContractProcessInstanceRespVO.java b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/controller/admin/contract/vo/ContractProcessInstanceRespVO.java new file mode 100644 index 000000000..8062c38ed --- /dev/null +++ b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/controller/admin/contract/vo/ContractProcessInstanceRespVO.java @@ -0,0 +1,82 @@ +package cn.iocoder.yudao.module.cms.controller.admin.contract.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - 流程实例的 Response VO") +@Data +public class ContractProcessInstanceRespVO { + + @Schema(description = "流程实例的编号", requiredMode = Schema.RequiredMode.REQUIRED) + private String id; + + @Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String name; + + @Schema(description = "流程分类", requiredMode = Schema.RequiredMode.REQUIRED) + private String category; + + @Schema(description = "流程分类名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String categoryName; + + @Schema(description = "流程实例的状态", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举 + + @Schema(description = "发起时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime startTime; + + @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime endTime; + + @Schema(description = "持续时间", example = "1000") + private Long durationInMillis; + + @Schema(description = "提交的表单值", requiredMode = Schema.RequiredMode.REQUIRED) + private Map formVariables; + + @Schema(description = "业务的唯一标识-例如说,请假申请的编号", example = "1") + private String businessKey; + + /** + * 发起流程的用户 + */ + private User startUser; + + /** + * 当前审批中的任务 + */ + private List tasks; // 仅在流程实例分页才返回 + + @Schema(description = "用户信息") + @Data + public static class User { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + private String nickname; + + @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long deptId; + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "研发部") + private String deptName; + + } + + @Schema(description = "流程任务") + @Data + public static class Task { + + @Schema(description = "流程任务的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String id; + + @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") + private String name; + + } + +} diff --git a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/contract/ContractService.java b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/contract/ContractService.java index 78a603faf..3a222b8e6 100644 --- a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/contract/ContractService.java +++ b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/contract/ContractService.java @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.cms.service.contract; import jakarta.validation.*; import cn.iocoder.yudao.module.cms.controller.admin.contract.vo.*; -import cn.iocoder.yudao.module.cms.dal.dataobject.contract.ContractDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import java.math.BigDecimal; @@ -73,4 +72,10 @@ public interface ContractService { void validateContractExists(Long id); + /** + * 查询流程 + * @param id 合同id + */ + ContractProcessInstanceRespVO getContractProcess(Long id); + } \ No newline at end of file diff --git a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/contract/ContractServiceImpl.java b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/contract/ContractServiceImpl.java index d8281c3a4..04722ea1c 100644 --- a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/contract/ContractServiceImpl.java +++ b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/contract/ContractServiceImpl.java @@ -2,9 +2,12 @@ package cn.iocoder.yudao.module.cms.service.contract; 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.BpmProcessInstanceRespDTO; +import cn.iocoder.yudao.module.bpm.api.task.dto.BpmTaskRespDTO; import cn.iocoder.yudao.module.cms.dal.dataobject.contractHistory.ContractHistoryDO; import cn.iocoder.yudao.module.cms.dal.mysql.contract.ContractMapper; import cn.iocoder.yudao.module.cms.dal.mysql.contractHistory.ContractHistoryMapper; +import cn.iocoder.yudao.module.cms.enums.ContractTypeEnum; import cn.iocoder.yudao.module.pms.api.ProjectApi; import cn.iocoder.yudao.module.pms.api.project.dto.ProjectDetailRespDTO; import cn.iocoder.yudao.module.pms.api.project.dto.ProjectRespDTO; @@ -61,6 +64,9 @@ public class ContractServiceImpl implements ContractService { @Resource private ContractHistoryMapper contractHistoryMapper; + @Resource + private BpmProcessInstanceApi bpmProcessInstanceApi; + @Override public Long createContract(Long loginUserId, ContractSaveReqVO createReqVO) { @@ -83,7 +89,6 @@ public class ContractServiceImpl implements ContractService { ProjectDetailRespDTO projectDetail = projectApi.getProjectDetailById(projectId); - //todo 待提取 String code = createReqVO.getCode(); String trackingDep = createReqVO.getTrackingDep(); String projectManager = createReqVO.getProjectManager(); @@ -224,6 +229,8 @@ public class ContractServiceImpl implements ContractService { contractRespVO.setTrackingDep(projectDetail.getTrackingDepName()); contractRespVO.setProjectManager(projectDetail.getProjectManagerName()); + // TODO 枚举优化 + contractRespVO.setType(ContractTypeEnum.getNoByCode(contractRespVO.getType())); //分包合同商议提示 TODO 待优化 // ExtContractDO extContractDO = extContractMapper.selectOne("project_id", projectId); // LocalDateTime reminderTime = extContractDO.getReminderTime(); @@ -265,6 +272,36 @@ public class ContractServiceImpl implements ContractService { return pageResult; } + + @Override + public ContractProcessInstanceRespVO getContractProcess(Long id) { + validateContractExists(id); + //去历史里面找 + ContractHistoryDO contractHistory = contractHistoryMapper.selectOne("contract_id", id); + if (contractHistory == null) { + throw exception(CONTRACT_NOT_EXISTS); + } + //拿到历史之后 找到process_instance_id 和 status + String processInstanceId = contractHistory.getProcessInstanceId(); + String processStatus = contractHistory.getProcessStatus(); + //与当前流程里的进行比较 + String status = String.valueOf(bpmProcessInstanceApi.getProcessInstance(processInstanceId).getStatus()); + + //如果不相等 + if (!status.equals(processStatus)){ + //更新当前合同对应历史表里面的状态 + contractHistory.setProcessStatus(status); + contractHistoryMapper.updateById(contractHistory); + } + //返回给前端必要的数据 当前流程里面对应的数据 + BpmProcessInstanceRespDTO processInstance = bpmProcessInstanceApi.getProcessInstance(processInstanceId); + List tasks = bpmProcessInstanceApi.getTask(processInstanceId); + List taskList = BeanUtils.toBean(tasks, BpmProcessInstanceRespDTO.Task.class); + processInstance.setTasks(taskList); + + return BeanUtils.toBean(processInstance, ContractProcessInstanceRespVO.class); + } + @Override public BigDecimal getProvisionalSettlementById(Long id) { ContractDO contractDO = contractMapper.selectById(id); diff --git a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/contractHistory/ContractHistoryServiceImpl.java b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/contractHistory/ContractHistoryServiceImpl.java index 309d2830e..72e5c1fb6 100644 --- a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/contractHistory/ContractHistoryServiceImpl.java +++ b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/contractHistory/ContractHistoryServiceImpl.java @@ -95,6 +95,7 @@ public class ContractHistoryServiceImpl implements cn.iocoder.yudao.module.cms.s // 6.分包合同商议提示 √ // 7.暂定结算数 √ + // TODO 枚举优化 ProjectRespDTO project = projectApi.getProject(projectId); contractHistoryRespVO.setCode(project.getCode()); contractHistoryRespVO.setDrawingCompany(project.getDrawingCompany()); diff --git a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/extContract/ExtContractServiceImpl.java b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/extContract/ExtContractServiceImpl.java index 944da9772..e78289d97 100644 --- a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/extContract/ExtContractServiceImpl.java +++ b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/extContract/ExtContractServiceImpl.java @@ -102,7 +102,7 @@ public class ExtContractServiceImpl implements ExtContractService { // 5.合同总金额 √ // 6.合同商议提示(和分包提示不一样)√ - //todo 待提取 + //todo 待提取 枚举优化 String code = createReqVO.getCode(); String trackingDep = createReqVO.getTrackingDep(); String projectManager = createReqVO.getProjectManager(); diff --git a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/extcontracthistory/ExtContractHistoryServiceImpl.java b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/extcontracthistory/ExtContractHistoryServiceImpl.java index a1f63d711..90e79001b 100644 --- a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/extcontracthistory/ExtContractHistoryServiceImpl.java +++ b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/extcontracthistory/ExtContractHistoryServiceImpl.java @@ -104,7 +104,7 @@ public class ExtContractHistoryServiceImpl implements ExtContractHistoryService CustomerCompanyDO customerCompanyDO = customerCompanyMapper.selectById(customerCompanyId); String name = customerCompanyDO.getName(); HistoryResp.setCustomerCompanyName(name); - + // TODO 枚举优化 //合同总金额 diff --git a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/outscontract/OutsContractServiceImpl.java b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/outscontract/OutsContractServiceImpl.java index b3b843f3d..20b3b11ff 100644 --- a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/outscontract/OutsContractServiceImpl.java +++ b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/outscontract/OutsContractServiceImpl.java @@ -94,7 +94,7 @@ public class OutsContractServiceImpl implements OutsContractService { // 3.项目经理 √ // 4.签订合同总额 √ - //todo 待提取 + //todo 待提取 枚举优化 String name = createReqVO.getName(); String trackingDep = createReqVO.getTrackingDep(); String projectManager = createReqVO.getProjectManager(); diff --git a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/outscontracthistory/OutsContractHistoryServiceImpl.java b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/outscontracthistory/OutsContractHistoryServiceImpl.java index 326f9010d..40623d0a4 100644 --- a/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/outscontracthistory/OutsContractHistoryServiceImpl.java +++ b/yudao-module-cms/yudao-module-cms-biz/src/main/java/cn/iocoder/yudao/module/cms/service/outscontracthistory/OutsContractHistoryServiceImpl.java @@ -65,7 +65,7 @@ public class OutsContractHistoryServiceImpl implements OutsContractHistoryServic OutsContractHistoryRespVO outsContractHistoryResp = BeanUtils.toBean(outsContractHistoryDO, OutsContractHistoryRespVO.class); Long contractId = outsContractHistoryResp.getContractId(); ContractRespVO contract = contractService.getContract(contractId); - + // TODO 枚举优化 outsContractHistoryResp.setName(contract.getName()); outsContractHistoryResp.setTrackingDep(contract.getTrackingDep()); outsContractHistoryResp.setProjectManager(contract.getProjectManager());