business/src/main/java/com/ycl/controller/ProjectProcessController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
business/src/main/java/com/ycl/domain/form/TaskTeamWorkForm.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
business/src/main/java/com/ycl/domain/json/TeamWorkData.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
business/src/main/java/com/ycl/service/ProcessLogService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
business/src/main/java/com/ycl/service/ProjectProcessService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
common/src/main/java/com/ycl/common/enums/business/TeamWorkStatusEnum.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
flowable/src/main/java/com/ycl/service/common/TaskCommonService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
business/src/main/java/com/ycl/controller/ProjectProcessController.java
@@ -120,6 +120,13 @@ return projectProcessService.taskSupervise(form); } @PostMapping("/detail/task/teamwork") @ApiOperation(value = "发起协同办理", notes = "发起协同办理") // @PreAuthorize("@ss.hasPermi('projectProcess:detail')") public Result taskTeamwork(@Validated @RequestBody TaskTeamWorkForm form) { return projectProcessService.taskTeamwork(form); } @PostMapping("/detail/task/hangup") @ApiOperation(value = "挂起任务", notes = "挂起任务") // @PreAuthorize("@ss.hasPermi('projectProcess:detail')") business/src/main/java/com/ycl/domain/form/TaskTeamWorkForm.java
New file @@ -0,0 +1,54 @@ package com.ycl.domain.form; import com.ycl.common.enums.business.HandlerTypeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; import java.util.Map; /** * @author:xp * @date:2024/12/13 13:51 */ @Data @ApiModel("任务协同办理表单") public class TaskTeamWorkForm { /** * 当前任务id * */ @ApiModelProperty("任务id") private String taskId; @ApiModelProperty("项目id") private Long projectId; /** * 流程实例id * */ @ApiModelProperty("流程实例id") private String processInsId; /** * 协同人类型 */ @ApiModelProperty("协同人类型") private HandlerTypeEnum handlerType; /** * 协同人id */ @ApiModelProperty("协同人id") private List<Long> handlerIds; /** * 表单信息 */ @ApiModelProperty("表单信息") private Map<String, Object> variables; } business/src/main/java/com/ycl/domain/json/TeamWorkData.java
New file @@ -0,0 +1,38 @@ package com.ycl.domain.json; import com.ycl.common.enums.business.HandlerTypeEnum; import com.ycl.common.enums.business.TeamWorkStatusEnum; import lombok.Data; import java.util.List; /** * 协同办理数据 * * @author:xp * @date:2025/2/18 14:55 */ @Data public class TeamWorkData { /** * 协同人类型 */ private HandlerTypeEnum handlerType; /** * 协同人id */ private List<Long> handlerIds; /** * 状态 */ private TeamWorkStatusEnum status; public TeamWorkData(HandlerTypeEnum handlerType, List<Long> handlerIds, TeamWorkStatusEnum status) { this.handlerType = handlerType; this.handlerIds = handlerIds; this.status = status; } } business/src/main/java/com/ycl/service/ProcessLogService.java
@@ -79,6 +79,15 @@ Boolean taskIsHangup(String taskId, String processInsId); /** * 检查任务是否协同办理了 * * @param taskId 任务id * @param processInsId 流程实例id * @return true 协同办理了 false没协同办理 */ Boolean taskIsTeamwork(String taskId, String processInsId); /** * 流程推进日志 * * @param query business/src/main/java/com/ycl/service/ProjectProcessService.java
@@ -128,4 +128,12 @@ * @return */ Result cancelTaskHangup(TaskHangupForm form); /** * 任务发起协同办理 * * @param form * @return */ Result taskTeamwork(TaskTeamWorkForm form); } business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java
@@ -148,6 +148,21 @@ } @Override public Boolean taskIsTeamwork(String taskId, String processInsId) { ProcessLog log = new LambdaQueryChainWrapper<>(baseMapper) .eq(ProcessLog::getProcessInsId, processInsId) .eq(ProcessLog::getTaskId, taskId) .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.TEAM_WORK) .one(); if (Objects.isNull(log)) { return Boolean.FALSE; } else { // 判断协同人是否全部完成了协同。TODO } return null; } @Override public Result projectProcessLogPage(ProcessLogQuery query) { List<ProcessLogVO> list = baseMapper.projectProcessLogPage(query); // json反序列化 business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -1,7 +1,6 @@ package com.ycl.service.impl; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -11,20 +10,15 @@ import com.ycl.common.constant.ProcessConstants; import com.ycl.common.constant.ProcessOverTimeConstants; import com.ycl.common.core.domain.entity.SysDept; import com.ycl.common.core.domain.entity.SysDictData; import com.ycl.common.core.domain.entity.SysRole; import com.ycl.common.core.domain.entity.SysUser; import com.ycl.common.enums.business.HandlerTypeEnum; import com.ycl.common.enums.business.ProcessLogEventTypeEnum; import com.ycl.common.enums.business.SuperviseTypeEnum; import com.ycl.common.enums.business.TaskStatusEnum; import com.ycl.common.enums.business.*; import com.ycl.common.utils.SecurityUtils; import com.ycl.constant.TaskTypeConstant; import com.ycl.domain.entity.*; import com.ycl.domain.form.*; import com.ycl.domain.json.DelegateData; import com.ycl.domain.json.HangupData; import com.ycl.domain.json.JumpData; import com.ycl.domain.json.SuperviseData; import com.ycl.domain.json.*; import com.ycl.domain.vo.CustomerTaskVO; import com.ycl.domain.vo.IndexCustomerTaskVO; import com.ycl.domain.vo.ProjectProcessDetailVO; @@ -38,6 +32,7 @@ import com.ycl.domain.query.ProjectProcessQuery; import com.ycl.service.common.TaskCommonService; import com.ycl.system.service.ISysDeptService; import com.ycl.system.service.ISysDictTypeService; import com.ycl.system.service.ISysRoleService; import com.ycl.system.service.ISysUserService; import lombok.Synchronized; @@ -93,6 +88,7 @@ private final ApplicationEventPublisher publisher; private final ISysDeptService deptService; private final ProcessLogService processLogService; private final ISysDictTypeService dictTypeService; /** * 分页查询 @@ -167,10 +163,7 @@ @Override @Transactional(rollbackFor = Exception.class) public Result startProcess(Long projectId, String processDefId) { ProjectInfo project = new LambdaQueryChainWrapper<>(projectInfoMapper) .select(ProjectInfo::getCreateBy) .eq(ProjectInfo::getId, projectId) .one(); ProjectInfo project = projectInfoMapper.selectById(projectId); if (Objects.isNull(project)) { throw new RuntimeException("项目不存在"); } @@ -731,6 +724,51 @@ return Result.ok("操作成功"); } @Override public Result taskTeamwork(TaskTeamWorkForm form) { Task task = taskService.createTaskQuery().taskId(form.getTaskId()).singleResult(); if (Objects.isNull(task)) { return Result.error("任务不存在"); } ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(projectProcessMapper) .eq(ProjectProcess::getProcessInsId, task.getProcessInstanceId()) .eq(ProjectProcess::getProcessDefId, task.getProcessDefinitionId()) .one(); if (Objects.isNull(projectProcess)) { return Result.error("项目流程未绑定"); } // 1. 保存发起人填写的表单数据,但不直接完成该任务。提交后任务处理人必须等到协同人处理完之后才能完成任务 Map<String, Object> processVariables = new HashMap<>(); //查出字典中需要注入的字段信息 List<String> dictList = dictTypeService.selectDictDataByType("flow_variables").stream().map(SysDictData::getDictValue).collect(Collectors.toList()); Map<String, Object> newV = new HashMap<>(2); if (!org.springframework.util.CollectionUtils.isEmpty(form.getVariables())) { for (String key : form.getVariables().keySet()) { newV.put(task.getTaskDefinitionKey() + "&" + key, form.getVariables().get(key)); //字典里有就放入流程变量中 if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(dictList) && dictList.contains(key)) { processVariables.put(key,form.getVariables().get(key)); } } } if( !processVariables.isEmpty() ) { taskService.setVariables(form.getTaskId(), processVariables); } // 2. 保存日志 publisher.publishEvent(new TaskLogEvent(this, null, SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), task.getName(), ProcessLogEventTypeEnum.TEAM_WORK, new TeamWorkData(form.getHandlerType(), form.getHandlerIds(), TeamWorkStatusEnum.NOT_FINISHED) )); return Result.ok("操作成功"); } /** * 查询待办任务 * common/src/main/java/com/ycl/common/enums/business/TeamWorkStatusEnum.java
New file @@ -0,0 +1,29 @@ package com.ycl.common.enums.business; import com.fasterxml.jackson.annotation.JsonValue; import lombok.Getter; /** * 协同办理状态 * * @author:xp * @date:2024/11/29 11:13 */ @Getter public enum TeamWorkStatusEnum { NOT_FINISHED("NOT_FINISHED", "未开始"), FINISHED("FINISHED", "已完成"), ; private final String value; @JsonValue private final String desc; TeamWorkStatusEnum(String value, String desc) { this.value = value; this.desc = desc; } } flowable/src/main/java/com/ycl/service/common/TaskCommonService.java
@@ -2,6 +2,7 @@ import com.alibaba.fastjson2.JSONObject; import com.ycl.common.constant.ProcessConstants; import com.ycl.common.core.domain.entity.SysDictData; import com.ycl.common.core.domain.entity.SysUser; import com.ycl.common.enums.FlowComment; import com.ycl.common.enums.business.TaskStatusEnum; @@ -10,6 +11,8 @@ import com.ycl.domain.vo.FormDetailVO; import com.ycl.flow.FindNextNodeUtil; import com.ycl.service.ISysFormService; import com.ycl.system.service.ISysDictDataService; import com.ycl.system.service.ISysDictTypeService; import com.ycl.system.service.ISysUserService; import lombok.RequiredArgsConstructor; import org.flowable.bpmn.model.*; @@ -44,6 +47,7 @@ private final TaskService taskService; private final HistoryService historyService; private final ISysUserService sysUserService; private final ISysDictTypeService sysDictDService; /** * 通过当前节点定义key,获取其上一个节点的信息,如果前面是并行的会返回多个(包含当前节点) @@ -324,4 +328,28 @@ return roleIds; } /** * 处理流程中的变量 * * @param variables * @param taskDefKey * @return */ public Map<String, Object> handleVar(Map<String, Object> variables, String taskDefKey) { Map<String, Object> processVariables = new HashMap<>(); //查出字典中需要注入的字段信息 List<String> dictList = sysDictDService.selectDictDataByType("flow_variables").stream().map(SysDictData::getDictValue).collect(Collectors.toList()); Map<String, Object> newV = new HashMap<>(2); if (!org.springframework.util.CollectionUtils.isEmpty(variables)) { for (String key : variables.keySet()) { newV.put(taskDefKey + "&" + key, variables.get(key)); //字典里有就放入流程变量中 if (!org.apache.commons.collections4.CollectionUtils.isEmpty(dictList) && dictList.contains(key)) { processVariables.put(key,variables.get(key)); } } } return processVariables; } }