[feat] 新增外部合同的流程管理

This commit is contained in:
wyw
2024-08-19 16:47:29 +08:00
parent 5f2cb54ab9
commit f12b055dfe
12 changed files with 89 additions and 471 deletions

View File

@ -2,12 +2,9 @@ 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.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceRespDTO; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceGetRespDTO;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmTaskRespDTO;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import java.util.List;
/** /**
* 流程实例 Api 接口 * 流程实例 Api 接口
* *
@ -24,20 +21,8 @@ public interface BpmProcessInstanceApi {
*/ */
String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO reqDTO); String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO reqDTO);
/** /**
* 查询流程 * 获得流程实例
*
* @param id 流程id
* @return
*/ */
BpmProcessInstanceRespDTO getProcessInstance(String id); BpmProcessInstanceGetRespDTO getProcessInstance(String processInstanceId);
/**
* 查询指定流程的任务
* @param id 流程id
* @return
*/
List<BpmTaskRespDTO> getTask(String id);
} }

View File

@ -1,115 +0,0 @@
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<String> formFields;
/**
* 自定义表单的提交路径
*/
private String formCustomCreatePath;
/**
* 自定义表单的查看路径
*/
private String formCustomViewPath;
/**
* 中断状态-参见 SuspensionState 枚举
*/
private Integer suspensionState; // 参见 SuspensionState 枚举
/**
* 部署时间
*/
private LocalDateTime deploymentTime; // 需要从对应的 Deployment 读取,非必须返回
/**
* BPMN XML
*/
private String bpmnXml; // 需要从对应的 BpmnModel 读取,非必须返回
/**
* 发起用户需要选择审批人的任务数组
*/
private List<UserTask> startUserSelectTasks; // 需要从对应的 BpmnModel 读取,非必须返回
@Data
public static class UserTask {
private String id;
private String name;
}
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.bpm.api.task.dto;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
* 流程实例的创建 Request DTO
*
* @author 芋道源码
*/
@Data
public class BpmProcessInstanceGetRespDTO {
/**
* 流程实例状态
*/
private Integer status;
}

View File

@ -1,118 +0,0 @@
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<Task> 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;
}
}

View File

@ -1,144 +0,0 @@
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<BpmTaskRespDTO> children;
/**
* 表单编号
*/
private Long formId;
/**
* 表单名字
*/
private String formName;
/**
* 表单的配置-JSON 字符串
*/
private String formConf;
/**
* 表单项的数组
*/
private List<String> formFields;
/**
* 提交的表单值
*/
private Map<String, Object> formVariables;
/**
* 流程实例
*/
@Data
public static class ProcessInstance {
/**
* 流程实例编号
*/
private String id;
/**
* 流程实例名称
*/
private String name;
/**
* 提交时间
*/
private LocalDateTime createTime;
/**
* 流程定义的编号
*/
private String processDefinitionId;
/**
* 发起人的用户信息
*/
private BpmProcessInstanceRespDTO.User startUser;
}
}

View File

@ -36,6 +36,7 @@ public interface ErrorCodeConstants {
ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF = new ErrorCode(1_009_004_002, "流程取消失败,该流程不是你发起的"); ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF = new ErrorCode(1_009_004_002, "流程取消失败,该流程不是你发起的");
ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_CONFIG = new ErrorCode(1_009_004_003, "审批任务({})的审批人未配置"); ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_CONFIG = new ErrorCode(1_009_004_003, "审批任务({})的审批人未配置");
ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_EXISTS = new ErrorCode(1_009_004_004, "审批任务({})的审批人({})不存在"); ErrorCode PROCESS_INSTANCE_START_USER_SELECT_ASSIGNEES_NOT_EXISTS = new ErrorCode(1_009_004_004, "审批任务({})的审批人({})不存在");
ErrorCode PROCESS_INSTANCE_NOT_END = new ErrorCode(1_009_004_005, "流程实例创建失败,该流程还未结束");
// ========== 流程任务 1-009-005-000 ========== // ========== 流程任务 1-009-005-000 ==========
ErrorCode TASK_OPERATE_FAIL_ASSIGN_NOT_SELF = new ErrorCode(1_009_005_001, "操作失败,原因:该任务的审批人不是你"); ErrorCode TASK_OPERATE_FAIL_ASSIGN_NOT_SELF = new ErrorCode(1_009_005_001, "操作失败,原因:该任务的审批人不是你");

View File

@ -1,41 +1,28 @@
package cn.iocoder.yudao.module.bpm.api.task; 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.number.NumberUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 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.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceRespDTO; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceGetRespDTO;
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.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.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.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; 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.definition.BpmProcessDefinitionService;
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; 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.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; 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.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
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 实现类 * Flowable 流程实例 Api 实现类
@ -50,29 +37,22 @@ public class BpmProcessInstanceApiImpl implements BpmProcessInstanceApi {
@Resource @Resource
private BpmProcessInstanceService processInstanceService; private BpmProcessInstanceService processInstanceService;
@Resource
private BpmProcessDefinitionService processDefinitionService;
@Resource @Resource
private AdminUserApi adminUserApi; private AdminUserApi adminUserApi;
@Resource @Resource
private DeptApi deptApi; private DeptApi deptApi;
@Resource
private BpmProcessDefinitionService processDefinitionService;
@Resource
private BpmTaskService taskService;
@Resource
private BpmFormService formService;
@Override @Override
public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO reqDTO) { public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO reqDTO) {
return processInstanceService.createProcessInstance(userId, reqDTO); return processInstanceService.createProcessInstance(userId, reqDTO);
} }
@Override @Override
public BpmProcessInstanceRespDTO getProcessInstance(String id) { public BpmProcessInstanceGetRespDTO getProcessInstance(String id) {
HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(id); HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(id);
if (processInstance == null) { if (processInstance == null) {
return null; return null;
@ -83,46 +63,17 @@ public class BpmProcessInstanceApiImpl implements BpmProcessInstanceApi {
processInstance.getProcessDefinitionId()); processInstance.getProcessDefinitionId());
BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo( BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(
processInstance.getProcessDefinitionId()); processInstance.getProcessDefinitionId());
String bpmnXml = BpmnModelUtils.getBpmnXml( String bpmnXml = BpmnModelUtils.getBpmnXml(
processDefinitionService.getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId())); processDefinitionService.getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId()));
AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId())); AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId()));
DeptRespDTO dept = null; DeptRespDTO dept = null;
if (startUser != null) { if (startUser != null) {
dept = deptApi.getDept(startUser.getDeptId()); dept = deptApi.getDept(startUser.getDeptId());
} }
BpmProcessInstanceRespVO bpmProcessInstanceRespVO = BpmProcessInstanceConvert.INSTANCE.buildProcessInstance(processInstance, BpmProcessInstanceRespVO bpmProcessInstanceRespVO = BpmProcessInstanceConvert.INSTANCE.buildProcessInstance(processInstance,
processDefinition, processDefinitionInfo, bpmnXml, startUser, dept); processDefinition, processDefinitionInfo, bpmnXml, startUser, dept);
return BeanUtils.toBean(bpmProcessInstanceRespVO, BpmProcessInstanceGetRespDTO.class);
return BeanUtils.toBean(bpmProcessInstanceRespVO, BpmProcessInstanceRespDTO.class);
}
//List<BpmTaskRespVO>
@Override
public List<BpmTaskRespDTO> getTask(String id) {
List<HistoricTaskInstance> taskList = taskService.getTaskListByProcessInstanceId(id);
if (CollUtil.isEmpty(taskList)) {
return null;
}
// 拼接数据
HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(id);
// 获得 User 和 Dept Map
Set<Long> userIds = convertSetByFlatMap(taskList, task ->
Stream.of(NumberUtils.parseLong(task.getAssignee()), NumberUtils.parseLong(task.getOwner())));
userIds.add(NumberUtils.parseLong(processInstance.getStartUserId()));
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
// 获得 Form Map
Map<Long, BpmFormDO> formMap = formService.getFormMap(
convertSet(taskList, task -> NumberUtils.parseLong(task.getFormKey())));
List<BpmTaskRespVO> bpmTaskRespVOS = BpmTaskConvert.INSTANCE.buildTaskListByProcessInstanceId(taskList, processInstance,
formMap, userMap, deptMap);
return BeanUtils.toBean(bpmTaskRespVOS, BpmTaskRespDTO.class);
} }

View File

@ -16,6 +16,7 @@ import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.*; import jakarta.validation.*;
import jakarta.servlet.http.*; import jakarta.servlet.http.*;
import java.util.*; import java.util.*;
import java.io.IOException; import java.io.IOException;
@ -23,11 +24,13 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; 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.apilog.core.enums.OperateTypeEnum.*;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@ -45,14 +48,14 @@ public class ExtContractController {
@Operation(summary = "创建外部合同") @Operation(summary = "创建外部合同")
@PreAuthorize("@ss.hasPermission('cms-ext:ext-contract:create')") @PreAuthorize("@ss.hasPermission('cms-ext:ext-contract:create')")
public CommonResult<Long> createExtContract(@Valid @RequestBody ExtContractSaveReqVO createReqVO) { public CommonResult<Long> createExtContract(@Valid @RequestBody ExtContractSaveReqVO createReqVO) {
return success(extContractService.createExtContract(getLoginUserId(),createReqVO)); return success(extContractService.createExtContract(getLoginUserId(), createReqVO));
} }
@PutMapping("/update") @PutMapping("/update")
@Operation(summary = "更新外部合同") @Operation(summary = "更新外部合同")
@PreAuthorize("@ss.hasPermission('cms-ext:ext-contract:update')") @PreAuthorize("@ss.hasPermission('cms-ext:ext-contract:update')")
public CommonResult<Boolean> updateExtContract(@Valid @RequestBody ExtContractSaveReqVO updateReqVO) { public CommonResult<Boolean> updateExtContract(@Valid @RequestBody ExtContractSaveReqVO updateReqVO) {
extContractService.updateExtContract(getLoginUserId(),updateReqVO); extContractService.updateExtContract(getLoginUserId(), updateReqVO);
return success(true); return success(true);
} }
@ -92,12 +95,20 @@ public class ExtContractController {
@PreAuthorize("@ss.hasPermission('cms-ext:ext-contract:export')") @PreAuthorize("@ss.hasPermission('cms-ext:ext-contract:export')")
@ApiAccessLog(operateType = EXPORT) @ApiAccessLog(operateType = EXPORT)
public void exportExtContractExcel(@Valid ExtContractPageReqVO pageReqVO, public void exportExtContractExcel(@Valid ExtContractPageReqVO pageReqVO,
HttpServletResponse response) throws IOException { HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ExtContractRespVO> list = extContractService.getExtContractPage(pageReqVO).getList(); List<ExtContractRespVO> list = extContractService.getExtContractPage(pageReqVO).getList();
// 导出 Excel // 导出 Excel
ExcelUtils.write(response, "外部合同.xls", "数据", ExtContractRespVO.class, ExcelUtils.write(response, "外部合同.xls", "数据", ExtContractRespVO.class,
BeanUtils.toBean(list, ExtContractRespVO.class)); BeanUtils.toBean(list, ExtContractRespVO.class));
}
@PostMapping("/create_process")
@Operation(summary = "创建流程")
@PreAuthorize("@ss.hasPermission('cms-ext:ext-contract:create')")
public CommonResult<String> createExtContractProcess(@RequestParam("id") Long id) {
String processId = extContractService.createProcess(getLoginUserId(), id);
return success(processId);
} }
} }

View File

@ -24,17 +24,14 @@ public class ExtContractHistoryPageReqVO extends PageParam {
@DictFormat(DictTypeConstants.CONTRACT_TYPE) @DictFormat(DictTypeConstants.CONTRACT_TYPE)
private String type; private String type;
@Schema(description = "状态", example = "1") @Schema(description = "合同状态", example = "1")
@DictFormat(DictTypeConstants.CONTRACT_STATUS) @DictFormat(DictTypeConstants.CONTRACT_STATUS)
private String status; private String status;
@Schema(description = "流程状态", example = "2") @Schema(description = "流程状态")
@DictFormat(DictTypeConstants.PROCESS_STATUS) @DictFormat(DictTypeConstants.PROCESS_STATUS)
private Integer processStatus; private Integer processStatus;
@Schema(description = "合同id", example = "26795")
private Long contractId;
@Schema(description = "外部合同id", example = "12093") @Schema(description = "外部合同id", example = "12093")
private Long extContractId; private Long extContractId;

View File

@ -133,7 +133,7 @@ public class ExtContractHistorySaveReqVO {
@ExcelProperty("流程实体id") @ExcelProperty("流程实体id")
private String processInstanceId; private String processInstanceId;
@Schema(description = "流程状态", example = "2") @Schema(description = "流程状态")
@ExcelProperty(value = "流程状态", converter = DictConvert.class) @ExcelProperty(value = "流程状态", converter = DictConvert.class)
@DictFormat(DictTypeConstants.PROCESS_STATUS) @DictFormat(DictTypeConstants.PROCESS_STATUS)
private Integer processStatus; private Integer processStatus;

View File

@ -8,9 +8,6 @@ import cn.iocoder.yudao.module.cms.dal.dataobject.extcontract.ExtContractDetailD
import jakarta.validation.*; import jakarta.validation.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import java.time.LocalDateTime;
import java.util.List;
/** /**
* 外部合同 Service 接口 * 外部合同 Service 接口
* *
@ -56,5 +53,13 @@ public interface ExtContractService {
*/ */
PageResult<ExtContractRespVO> getExtContractPage(ExtContractPageReqVO pageReqVO); PageResult<ExtContractRespVO> getExtContractPage(ExtContractPageReqVO pageReqVO);
/**
*
* @param loginUserId 当前登录的用户id
* @param id 外部合同id
* @return 流程id
*/
String createProcess(Long loginUserId,Long id);
} }

View File

@ -1,4 +1,5 @@
package cn.iocoder.yudao.module.cms.service.extContract; package cn.iocoder.yudao.module.cms.service.extContract;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.iocoder.yudao.framework.common.util.file.FileUtils; import cn.iocoder.yudao.framework.common.util.file.FileUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
@ -26,6 +27,7 @@ import java.util.ArrayList;
import java.util.List; 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.bpm.enums.ErrorCodeConstants.PROCESS_INSTANCE_NOT_END;
import static cn.iocoder.yudao.module.cms.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.cms.enums.ErrorCodeConstants.*;
/** /**
@ -61,6 +63,8 @@ public class ExtContractServiceImpl implements ExtContractService {
@Resource @Resource
private ExtContractHistoryMapper extContractHistoryMapper; private ExtContractHistoryMapper extContractHistoryMapper;
@Resource
private BpmProcessInstanceApi bpmProcessInstanceApi;
@Override @Override
@ -74,7 +78,7 @@ public class ExtContractServiceImpl implements ExtContractService {
projectTrackingApi.validateProjectExists(projectId); projectTrackingApi.validateProjectExists(projectId);
List<ExtContractDO> extContractList = extContractMapper.selectList("project_id", projectId); List<ExtContractDO> extContractList = extContractMapper.selectList("project_id", projectId);
for (ExtContractDO extContractDO : extContractList) { for (ExtContractDO extContractDO : extContractList) {
if (extContractDO.getName().equals(trimName)){ if (extContractDO.getName().equals(trimName)) {
throw exception(EXT_CONTRACT_EXISTS); throw exception(EXT_CONTRACT_EXISTS);
} }
} }
@ -90,15 +94,13 @@ public class ExtContractServiceImpl implements ExtContractService {
//版本 //版本
if (extContractHistoryMapper.selectCount("project_id", createReqVO.getProjectId()) < 1) { if (extContractHistoryMapper.selectCount("project_id", createReqVO.getProjectId()) < 1) {
extContractHistoryDO.setVersion("1"); extContractHistoryDO.setVersion("1");
}else{ } else {
extContractHistoryDO.setVersion(String.valueOf(extContractHistoryMapper.selectCount("project_id", createReqVO.getProjectId()) + 1)); extContractHistoryDO.setVersion(String.valueOf(extContractHistoryMapper.selectCount("project_id", createReqVO.getProjectId()) + 1));
} }
//状态 //状态
extContractHistoryDO.setProcessStatus(1); extContractHistoryDO.setProcessStatus(1);
extContractHistoryMapper.insert(extContractHistoryDO); extContractHistoryMapper.insert(extContractHistoryDO);
// 启动流程 // 启动流程
if (createReqVO.getId() == null) { if (createReqVO.getId() == null) {
String processInstanceId = processInstanceApi.createProcessInstance(loginUserId, String processInstanceId = processInstanceApi.createProcessInstance(loginUserId,
@ -145,8 +147,8 @@ public class ExtContractServiceImpl implements ExtContractService {
ProjectScheduleDetailDTO projectScheduleDetail = projectScheduleApi.getProjectScheduleDetail(projectId); ProjectScheduleDetailDTO projectScheduleDetail = projectScheduleApi.getProjectScheduleDetail(projectId);
ProjectTrackingDetailDTO projectTracking = projectTrackingApi.getProjectTracking(projectId); ProjectTrackingDetailDTO projectTracking = projectTrackingApi.getProjectTracking(projectId);
BeanUtil.copyProperties(extContractDO, extContractDetailDO); BeanUtil.copyProperties(extContractDO, extContractDetailDO);
BeanUtil.copyProperties(projectTracking,extContractDetailDO); BeanUtil.copyProperties(projectTracking, extContractDetailDO);
BeanUtil.copyProperties(projectScheduleDetail,extContractDetailDO); BeanUtil.copyProperties(projectScheduleDetail, extContractDetailDO);
return extContractDetailDO; return extContractDetailDO;
} }
@ -168,6 +170,27 @@ public class ExtContractServiceImpl implements ExtContractService {
return pageResult; return pageResult;
} }
@Override
public String createProcess(Long loginUserId, Long id) {
//拿出该合同的当前流程
ExtContractHistoryDO extContractHistoryDO = extContractHistoryMapper.selectOne("ext_contract_id", id);
String processInstanceId0 = extContractHistoryDO.getProcessInstanceId();
//流程引擎里的最新状态
Integer status = bpmProcessInstanceApi.getProcessInstance(processInstanceId0).getStatus();
if (status == 1) {
throw exception(PROCESS_INSTANCE_NOT_END);
}
//创建新的流程
String processInstanceId = processInstanceApi.createProcessInstance(loginUserId,
new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY)
.setBusinessKey(String.valueOf(id)));
// 写入工作流编号
extContractHistoryMapper.updateById(extContractHistoryDO.setProcessInstanceId(processInstanceId).setProcessStatus(status));
return processInstanceId;
}
private void validateExtContractExists(Long id) { private void validateExtContractExists(Long id) {
if (extContractMapper.selectById(id) == null) { if (extContractMapper.selectById(id) == null) {
throw exception(EXT_CONTRACT_NOT_EXISTS); throw exception(EXT_CONTRACT_NOT_EXISTS);