From 07c4ad96c75dc93b39e002feb19845219fede415 Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期五, 29 十一月 2024 16:49:09 +0800 Subject: [PATCH] 全部事项和待办事项查询功能完善 --- business/src/main/java/com/ycl/domain/entity/ProjectProcess.java | 8 flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java | 4 business/src/main/java/com/ycl/controller/ProjectProcessController.java | 14 + business/src/main/java/com/ycl/constant/TaskTypeConstant.java | 19 + business/src/main/java/com/ycl/domain/query/TaskQuery.java | 33 +++ business/src/main/java/com/ycl/domain/form/ProjectProcessForm.java | 4 business/src/main/resources/mapper/ProjectProcessMapper.xml | 6 business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java | 111 ++++++++++ common/src/main/java/com/ycl/common/enums/business/TaskStatusEnum.java | 29 ++ system/src/main/java/com/ycl/system/domain/base/AbsQuery.java | 4 business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java | 367 ++++++++++++++++++++++++-------- business/src/main/java/com/ycl/service/ProjectProcessService.java | 14 + business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java | 8 13 files changed, 506 insertions(+), 115 deletions(-) diff --git a/business/src/main/java/com/ycl/constant/TaskTypeConstant.java b/business/src/main/java/com/ycl/constant/TaskTypeConstant.java new file mode 100644 index 0000000..a3f6896 --- /dev/null +++ b/business/src/main/java/com/ycl/constant/TaskTypeConstant.java @@ -0,0 +1,19 @@ +package com.ycl.constant; + +import lombok.Data; + +/** + * @author锛歺p + * @date锛�2024/11/29 8:30 + */ +public class TaskTypeConstant { + + public final static String ALL = "all"; // 鍏ㄩ儴浠诲姟 + public final static String TODO = "todo"; // 寰呭姙浠诲姟 + public final static String CURRENT = "current"; // 褰撳墠鐜妭 + public final static String REMAINING = "remaining"; // 鍓╀綑浠诲姟 + public final static String TIMELY = "timely"; // 鍙婃椂瀹屾垚鐨勪换鍔� + public final static String WILL_OVER_TIME = "willOvertime"; // 鍗冲皢瓒呮椂浠诲姟 + public final static String urge = "urge"; // 鐫e姙 + +} diff --git a/business/src/main/java/com/ycl/controller/ProjectProcessController.java b/business/src/main/java/com/ycl/controller/ProjectProcessController.java index 9024cbf..31de96f 100644 --- a/business/src/main/java/com/ycl/controller/ProjectProcessController.java +++ b/business/src/main/java/com/ycl/controller/ProjectProcessController.java @@ -2,6 +2,7 @@ import com.ycl.common.group.Update; import com.ycl.common.group.Add; +import com.ycl.domain.query.TaskQuery; import org.springframework.validation.annotation.Validated; import org.springframework.security.access.prepost.PreAuthorize; import lombok.RequiredArgsConstructor; @@ -55,10 +56,17 @@ return projectProcessService.detail(projectId, processId); } - @PostMapping("/start/{projectId}/{processId}") + @PostMapping("/start/{projectId}/{processDefId}") @ApiOperation(value = "鍚姩娴佺▼", notes = "鍚姩娴佺▼") // @PreAuthorize("@ss.hasPermi('projectProcess:start')") - public Result startProcess(@PathVariable("projectId") String projectId, @PathVariable("processId") String processId) { - return projectProcessService.startProcess(projectId, processId); + public Result startProcess(@PathVariable("projectId") String projectId, @PathVariable("processDefId") String processDefId) { + return projectProcessService.startProcess(projectId, processDefId); + } + + @GetMapping("/detail/task/list") + @ApiOperation(value = "鑾峰彇浠诲姟鍒楄〃", notes = "鑾峰彇浠诲姟鍒楄〃") +// @PreAuthorize("@ss.hasPermi('projectProcess:detail')") + public Result taskList(TaskQuery query) { + return projectProcessService.taskList(query); } } diff --git a/business/src/main/java/com/ycl/domain/entity/ProjectProcess.java b/business/src/main/java/com/ycl/domain/entity/ProjectProcess.java index e5609bf..7c161f1 100644 --- a/business/src/main/java/com/ycl/domain/entity/ProjectProcess.java +++ b/business/src/main/java/com/ycl/domain/entity/ProjectProcess.java @@ -23,12 +23,12 @@ /** 椤圭洰ID */ private Long projectId; - @TableField("flowable_process_id") + @TableField("process_def_id") /** 娴佺▼瀹氫箟ID */ - private String flowableProcessId; + private String processDefId; - @TableField("process_instance_id") + @TableField("process_ins_id") /** 娴佺▼瀹炰緥id */ - private String processInstanceId; + private String processInsId; } diff --git a/business/src/main/java/com/ycl/domain/form/ProjectProcessForm.java b/business/src/main/java/com/ycl/domain/form/ProjectProcessForm.java index ea3ad13..d2db186 100644 --- a/business/src/main/java/com/ycl/domain/form/ProjectProcessForm.java +++ b/business/src/main/java/com/ycl/domain/form/ProjectProcessForm.java @@ -28,8 +28,8 @@ private Long projectId; @NotBlank(message = "娴佺▼ID涓嶈兘涓虹┖", groups = {Add.class, Update.class}) - @ApiModelProperty("娴佺▼ID") - private String flowableProcessId; + @ApiModelProperty("娴佺▼瀹氫箟ID") + private String processDefId; public static ProjectProcess getEntityByForm(@NonNull ProjectProcessForm form, ProjectProcess entity) { if(entity == null) { diff --git a/business/src/main/java/com/ycl/domain/query/TaskQuery.java b/business/src/main/java/com/ycl/domain/query/TaskQuery.java new file mode 100644 index 0000000..d6cdfb3 --- /dev/null +++ b/business/src/main/java/com/ycl/domain/query/TaskQuery.java @@ -0,0 +1,33 @@ +package com.ycl.domain.query; + +import com.ycl.system.domain.base.AbsQuery; +import lombok.Data; + +/** + * @author锛歺p + * @date锛�2024/11/29 8:12 + */ +@Data +public class TaskQuery extends AbsQuery { + + /** + * 椤圭洰id + */ + private Long projectId; + + /** + * 娴佺▼瀹氫箟id + */ + private String processDefId; + + /** + * 浠诲姟鍚嶇О + */ + private String taskName; + + /** + * 浠诲姟绫诲瀷 + */ + private String taskType; + +} diff --git a/business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java b/business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java new file mode 100644 index 0000000..86eebff --- /dev/null +++ b/business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java @@ -0,0 +1,111 @@ +package com.ycl.domain.vo; + +import com.ycl.common.enums.business.TaskStatusEnum; +import lombok.Data; + +import java.util.Date; + +/** + * 浠诲姟鍥炴樉鍐呭 + * + * @author锛歺p + * @date锛�2024/11/29 10:59 + */ +@Data +public class CustomerTaskVO { + + /** + * flowable涓殑浠诲姟id + */ + private String taskId; + + /** + * flowable娴佺▼瀹炰緥id + */ + private String processInsId; + + /** + * flowable娴佺▼瀹氫箟id + */ + private String processDefId; + + /** + * 閮ㄧ讲id + */ + private String deployId; + + /** + * 鎵цid + */ + private String executionId; + + /** + * 浠诲姟鍚嶇О + */ + private String taskName; + + /** + * 娴佺▼鍚嶇О + */ + private String processName; + + /** + * 鍙戣捣浜篿d + */ + private Long promoterId; + + /** + * 鍙戣捣浜哄鍚� + */ + private String promoterName; + + /** + * 鍙戣捣浜哄崟浣� + */ + private Long promoterUnitId; + + /** + * 鍙戣捣浜哄崟浣嶅悕绉� + */ + private String promoterUnitName; + + /** + * 澶勭悊浜� + */ + private String handlerName; + + /** + * 鍙戣捣浜篿d + */ + private Long handlerId; + + /** + * 澶勭悊浜哄崟浣峣d + */ + private Long handlerUnitId; + + /** + * 澶勭悊浜哄崟浣嶅悕绉� + */ + private String handlerUnitName; + + /** + * 鍔炵悊鏈熼檺 + */ + private String timeLimit; + + /** + * 鍓╀綑鏃堕棿 + */ + private String remainingTime; + + /** + * 浠诲姟鐘舵�� + */ + private TaskStatusEnum taskStatus; + + /** + * 浠诲姟鍒涘缓鏃堕棿 + */ + private Date createTime; +} diff --git a/business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java b/business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java index 1c0c7b1..66df29d 100644 --- a/business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java +++ b/business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java @@ -21,13 +21,13 @@ @ApiModel(value = "椤圭洰绠$悊鍩虹淇℃伅琛ㄥ搷搴旀暟鎹�", description = "椤圭洰绠$悊鍩虹淇℃伅琛ㄥ搷搴旀暟鎹�") public class ProjectProcessVO extends ProjectInfoVO { - /** 娴佺▼id */ - @ApiModelProperty("娴佺▼id") - private String flowableProcessId; + /** 娴佺▼瀹氫箟id */ + @ApiModelProperty("娴佺▼瀹氫箟id") + private String processDefId; @ApiModelProperty("娴佺▼鍚嶇О") private String flowableProcessName; @ApiModelProperty("娴佺▼瀹炰緥id") - private String processInstanceId; + private String processInsId; } diff --git a/business/src/main/java/com/ycl/service/ProjectProcessService.java b/business/src/main/java/com/ycl/service/ProjectProcessService.java index 2a67244..7ef2719 100644 --- a/business/src/main/java/com/ycl/service/ProjectProcessService.java +++ b/business/src/main/java/com/ycl/service/ProjectProcessService.java @@ -5,6 +5,8 @@ import com.ycl.common.base.Result; import com.ycl.domain.form.ProjectProcessForm; import com.ycl.domain.query.ProjectProcessQuery; +import com.ycl.domain.query.TaskQuery; + import java.util.List; /** @@ -41,9 +43,17 @@ /** * 鍚姩娴佺▼ * - * @param processId 娴佺▼瀹氫箟id + * @param processDefId 娴佺▼瀹氫箟id * @param projectId 椤圭洰id锛屼綔涓轰笟鍔d瀛樺叆activity琛� * @return */ - Result startProcess(String projectId, String processId); + Result startProcess(String projectId, String processDefId); + + /** + * 鏌ヨ浠诲姟鍒楄〃 + * + * @param query + * @return + */ + Result taskList(TaskQuery query); } diff --git a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java index 4856ea1..ab53566 100644 --- a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java +++ b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java @@ -10,10 +10,13 @@ import com.ycl.common.core.domain.entity.SysRole; import com.ycl.common.core.domain.entity.SysUser; import com.ycl.common.enums.FlowComment; +import com.ycl.common.enums.business.TaskStatusEnum; import com.ycl.common.utils.SecurityUtils; +import com.ycl.constant.TaskTypeConstant; import com.ycl.domain.dto.FlowTaskDto; import com.ycl.domain.entity.ProjectInfo; import com.ycl.domain.entity.ProjectProcess; +import com.ycl.domain.vo.CustomerTaskVO; import com.ycl.domain.vo.ProjectProcessDetailVO; import com.ycl.mapper.ProjectInfoMapper; import com.ycl.mapper.ProjectProcessMapper; @@ -26,15 +29,15 @@ import com.ycl.system.service.ISysRoleService; import com.ycl.system.service.ISysUserService; import org.apache.commons.lang3.StringUtils; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.FlowElement; +import org.flowable.bpmn.model.*; import org.flowable.bpmn.model.Process; -import org.flowable.bpmn.model.StartEvent; import org.flowable.engine.*; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.identitylink.api.IdentityLink; +import org.flowable.identitylink.api.IdentityLinkInfo; +import org.flowable.identitylink.api.history.HistoricIdentityLink; import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; import org.flowable.task.api.history.HistoricTaskInstance; @@ -81,13 +84,62 @@ return Result.ok().data(page.getRecords()).total(page.getTotal()); } + @Override + public Result projectSetProcess(ProjectProcessForm form) { + // 鏌ヨ璇ラ」鐩槸鍚﹀凡缁忕粦瀹氳繃娴佺▼浜嗭紝妫�鏌ョ粦瀹氱殑娴佺▼鏄惁鍦ㄨ繍琛岋紝鍦ㄨ繍琛屽氨鍒犱簡 + ProjectProcess pp = new LambdaQueryChainWrapper<>(baseMapper) + .eq(ProjectProcess::getProjectId, form.getProjectId()) + .one(); + if (Objects.nonNull(pp)) { + // TODO 澶勭悊涔嬪墠缁戝畾杩囩殑娴佺▼鏁版嵁 + new LambdaUpdateChainWrapper<>(baseMapper) + .eq(ProjectProcess::getProjectId, form.getProjectId()) + .set(ProjectProcess::getProcessDefId, form.getProcessDefId()) + .update(); + } else { + ProjectProcess entity = ProjectProcessForm.getEntityByForm(form, null); + baseMapper.insert(entity); + } + return Result.ok("娴佺▼鍙樻洿鎴愬姛"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result startProcess(String projectId, String processDefId) { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefId) + .latestVersion().singleResult(); + if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) { + return Result.error("璇ユ祦绋嬪凡琚寕璧�,璇峰厛婵�娲绘祦绋�"); + } + Map<String, Object> variables = new HashMap<>(2); + // 璁剧疆娴佺▼鍙戣捣浜篒d鍒版祦绋嬩腑 + SysUser sysUser = SecurityUtils.getLoginUser().getUser(); + identityService.setAuthenticatedUserId(sysUser.getUserId().toString()); + variables.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId()); + ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, projectId, variables); +// // 娴佺▼鍙戣捣鏃� 璺宠繃鍙戣捣浜鸿妭鐐� +// // 缁欑涓�姝ョ敵璇蜂汉鑺傜偣璁剧疆浠诲姟鎵ц浜哄拰鎰忚 +// Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult(); +// if (Objects.nonNull(task)) { +// taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.NORMAL.getType(), sysUser.getNickName() + "鍙戣捣娴佺▼鐢宠"); +// taskService.complete(task.getId(), variables); +// } + // 椤圭洰娴佺▼鍏宠仈娴佺▼瀹炰緥id + new LambdaUpdateChainWrapper<>(baseMapper) + .eq(ProjectProcess::getProjectId, projectId) + .eq(ProjectProcess::getProcessDefId, processDefId) + .set(ProjectProcess::getProcessInsId, processInstance.getProcessInstanceId()) + .update(); + return Result.ok("娴佺▼鍚姩鎴愬姛"); + } + /** * 鑾峰彇娴佺▼璇︽儏 * @param projectId * @return */ @Override - public Result detail(Long projectId, String processId) { + public Result detail(Long projectId, String processDefId) { // 椤圭洰淇℃伅 ProjectInfo projectInfo = new LambdaQueryChainWrapper<>(projectInfoMapper) .select(ProjectInfo::getId, ProjectInfo::getProjectName, ProjectInfo::getProjectCode) @@ -100,7 +152,7 @@ ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(baseMapper) .eq(ProjectProcess::getProjectId, projectId) - .eq(ProjectProcess::getFlowableProcessId, processId) + .eq(ProjectProcess::getProcessDefId, processDefId) .one(); if (Objects.isNull(projectProcess)) { return Result.error("璇ラ」鐩湭璁剧疆娴佺▼"); @@ -113,110 +165,86 @@ ProjectProcessDetailVO.TaskStatistics taskStatistics = new ProjectProcessDetailVO.TaskStatistics(); // 鐘舵�佺粺璁� - taskStatistics.setTotalTaskNum(this.getTotalTaskNum(processId)); - taskStatistics.setTodoTaskNum(this.getTodoTaskNum(projectProcess.getProcessInstanceId())); + taskStatistics.setTotalTaskNum(this.getTotalTaskNum(processDefId)); + taskStatistics.setTodoTaskNum(this.getTodoTaskNum(projectProcess.getProcessInsId())); // taskStatistics.setCurrentTask(this.getCurrentNodeTaskList(projectProcess.getProcessInstanceId())); - taskStatistics.setRemainingTaskNum(this.getNotFinishedTaskNum(projectProcess.getProcessInstanceId())); + taskStatistics.setRemainingTaskNum(this.getNotFinishedTaskNum(projectProcess.getProcessInsId())); detail.setStatistics(taskStatistics); Result result = Result.ok(); // 浠e姙浠诲姟 - this.getTodoTaskList(projectProcess.getProcessInstanceId(),"", 1, 5, result); + this.getTodoTaskList(projectProcess.getProcessInsId(),"", 5, 1, result); return result.data(detail); } - @Override - public Result projectSetProcess(ProjectProcessForm form) { - // 鏌ヨ璇ラ」鐩槸鍚﹀凡缁忕粦瀹氳繃娴佺▼浜嗭紝妫�鏌ョ粦瀹氱殑娴佺▼鏄惁鍦ㄨ繍琛岋紝鍦ㄨ繍琛屽氨鍒犱簡 - ProjectProcess pp = new LambdaQueryChainWrapper<>(baseMapper) - .eq(ProjectProcess::getProjectId, form.getProjectId()) + public Result taskList(com.ycl.domain.query.TaskQuery query) { + // 鑾峰彇椤圭洰瀵瑰簲鐨勬祦绋嬪疄渚媔d + ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(baseMapper) + .eq(ProjectProcess::getProjectId, query.getProjectId()) + .eq(ProjectProcess::getProcessDefId, query.getProcessDefId()) .one(); - if (Objects.nonNull(pp)) { - // TODO 澶勭悊涔嬪墠缁戝畾杩囩殑娴佺▼鏁版嵁 - new LambdaUpdateChainWrapper<>(baseMapper) - .eq(ProjectProcess::getProjectId, form.getProjectId()) - .set(ProjectProcess::getFlowableProcessId, form.getFlowableProcessId()) - .update(); - } else { - ProjectProcess entity = ProjectProcessForm.getEntityByForm(form, null); - baseMapper.insert(entity); + if (Objects.isNull(projectProcess)) { + throw new RuntimeException("璇ラ」鐩湭閰嶇疆娴佺▼"); } - return Result.ok("娴佺▼鍙樻洿鎴愬姛"); + Result ok = Result.ok(); + switch (query.getTaskType()) { + case TaskTypeConstant.ALL: + this.getAllUserTask(query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName (), (int)query.getCurrentPage(), (int)query.getPageSize(), ok); + case TaskTypeConstant.TODO: + this.getTodoTaskList(projectProcess.getProcessInsId(), query.getTaskName(), (int)query.getPageSize(), (int)query.getCurrentPage(), ok); + case TaskTypeConstant.CURRENT: + + case TaskTypeConstant.REMAINING: + + default: + + + } + return ok; } - @Override - @Transactional(rollbackFor = Exception.class) - public Result startProcess(String projectId, String processId) { - ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processId) - .latestVersion().singleResult(); - if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) { - return Result.error("璇ユ祦绋嬪凡琚寕璧�,璇峰厛婵�娲绘祦绋�"); - } - Map<String, Object> variables = new HashMap<>(2); - // 璁剧疆娴佺▼鍙戣捣浜篒d鍒版祦绋嬩腑 - SysUser sysUser = SecurityUtils.getLoginUser().getUser(); - identityService.setAuthenticatedUserId(sysUser.getUserId().toString()); - variables.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId()); - ProcessInstance processInstance = runtimeService.startProcessInstanceById(processId, projectId, variables); -// // 娴佺▼鍙戣捣鏃� 璺宠繃鍙戣捣浜鸿妭鐐� -// // 缁欑涓�姝ョ敵璇蜂汉鑺傜偣璁剧疆浠诲姟鎵ц浜哄拰鎰忚 -// Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult(); -// if (Objects.nonNull(task)) { -// taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.NORMAL.getType(), sysUser.getNickName() + "鍙戣捣娴佺▼鐢宠"); -// taskService.complete(task.getId(), variables); -// } - // 椤圭洰娴佺▼鍏宠仈娴佺▼瀹炰緥id - new LambdaUpdateChainWrapper<>(baseMapper) - .eq(ProjectProcess::getProjectId, projectId) - .eq(ProjectProcess::getFlowableProcessId, processId) - .set(ProjectProcess::getProcessInstanceId, processInstance.getProcessInstanceId()) - .update(); - return Result.ok("娴佺▼鍚姩鎴愬姛"); - } - - - private void getTodoTaskList(String processInstanceId, String name, Integer pageNum, Integer pageSize, Result result) { + private void getTodoTaskList(String processInsId, String taskName, int pageSize, int pageNum, Result result) { TaskQuery taskQuery = taskService.createTaskQuery() .active() - .processInstanceId(processInstanceId) + .processInstanceId(processInsId) .includeProcessVariables() .orderByTaskCreateTime().desc(); // TODO 浼犲叆鍚嶇О鏌ヨ涓嶅埌鏁版嵁? - if (StringUtils.isNotBlank(name)) { - taskQuery.processDefinitionNameLike(name); + if (StringUtils.isNotBlank(taskName)) { + taskQuery.processDefinitionNameLike(taskName); } result.total(taskQuery.count()); List<Task> taskList = taskQuery.listPage(pageSize * (pageNum - 1), pageSize); - List<FlowTaskDto> flowList = new ArrayList<>(); + List<CustomerTaskVO> vos = new ArrayList<>(); for (Task task : taskList) { - FlowTaskDto flowTask = new FlowTaskDto(); + CustomerTaskVO taskVO = new CustomerTaskVO(); // 褰撳墠娴佺▼淇℃伅 - flowTask.setTaskId(task.getId()); - flowTask.setTaskDefKey(task.getTaskDefinitionKey()); - flowTask.setCreateTime(task.getCreateTime()); - flowTask.setProcDefId(task.getProcessDefinitionId()); - flowTask.setExecutionId(task.getExecutionId()); - flowTask.setTaskName(task.getName()); + taskVO.setTaskId(task.getId()); + taskVO.setCreateTime(task.getCreateTime()); + taskVO.setProcessDefId(task.getProcessDefinitionId()); + taskVO.setExecutionId(task.getExecutionId()); + taskVO.setTaskName(task.getName()); + taskVO.setTaskStatus(TaskStatusEnum.TODO); // 娴佺▼瀹氫箟淇℃伅 ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() .processDefinitionId(task.getProcessDefinitionId()) .singleResult(); - flowTask.setDeployId(pd.getDeploymentId()); - flowTask.setProcDefName(pd.getName()); - flowTask.setProcDefVersion(pd.getVersion()); - flowTask.setProcInsId(task.getProcessInstanceId()); + taskVO.setDeployId(pd.getDeploymentId()); + taskVO.setProcessName(pd.getName()); + taskVO.setProcessInsId(task.getProcessInstanceId()); // 娴佺▼鍙戣捣浜轰俊鎭� HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(task.getProcessInstanceId()) .singleResult(); SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); - flowTask.setStartUserId(startUser.getUserId().toString()); - flowTask.setStartUserName(startUser.getNickName()); - flowTask.setStartDeptName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : ""); + taskVO.setPromoterId(startUser.getUserId()); + taskVO.setPromoterName(startUser.getNickName()); + taskVO.setPromoterUnitName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : ""); + taskVO.setPromoterUnitId(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptId() : null); // 娴佺▼澶勭悊浜轰俊鎭� List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId()); for (IdentityLink identityLink : identityLinksForTask) { @@ -224,34 +252,179 @@ if (StringUtils.isNotBlank(identityLink.getUserId())) { SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); if (Objects.nonNull(sysUser)) { - flowTask.setAssigneeId(sysUser.getUserId()); + taskVO.setHandlerId(sysUser.getUserId()); if (Objects.nonNull(sysUser.getDept())) { - flowTask.setAssigneeDeptName(sysUser.getDept().getDeptName()); + taskVO.setHandlerUnitId(sysUser.getDept().getDeptId()); + taskVO.setHandlerUnitName(sysUser.getDept().getDeptName()); } - flowTask.setAssigneeName(sysUser.getNickName()); + taskVO.setHandlerName(sysUser.getNickName()); } - // 缁戝畾鐨勬槸瑙掕壊锛屾煡鍑鸿鑹插悕绉� + // 缁戝畾鐨勬槸瑙掕壊锛屾煡鍑鸿鑹插悕绉� } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); if (Objects.nonNull(role)) { - flowTask.setAssigneeId(Long.parseLong(identityLink.getGroupId())); - flowTask.setAssigneeDeptName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�"); - flowTask.setAssigneeName("鏆傛湭澶勭悊"); + taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); + taskVO.setHandlerUnitName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�"); + taskVO.setHandlerName("鏆傛湭澶勭悊"); + taskVO.setHandlerId(null); } } } - flowList.add(flowTask); + vos.add(taskVO); } - result.put("taskList", flowList); + result.put("taskList", vos); } /** - * 鑾峰彇娴佺▼鑺傜偣鏁帮紙鎬讳换鍔℃暟锛屼笉鍖呭惈寮�濮嬨�佺粨鏉熺瓑鐗规畩鐨勶紝鍙粺璁serTask绫诲瀷鐨勶級 + * 鑾峰彇鎵�鏈変换鍔� * - * @param processDefinitionId 娴佺▼瀹氫箟id + * @param processDefinitionId 娴佺▼杩愯id + * @param processInsId 娴佺▼瀹炰緥id + * @param pageNum + * @param pageSize + * @param result * @return */ - private Long getTotalTaskNum(String processDefinitionId) { + private List<CustomerTaskVO> getAllUserTask(String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) { + int startNum = pageSize * (pageNum - 1); + int endNum = startNum + pageSize; + List<UserTask> allUserTaskElement = this.getAllUserTaskElement(processDefinitionId); + result.total(allUserTaskElement.size()); + if (startNum >= allUserTaskElement.size()) { + // 濡傛灉璧峰绱㈠紩瓒呭嚭浜嗗垪琛ㄧ殑澶у皬锛岃繑鍥炰竴涓┖鍒楄〃 + return new ArrayList<>(); + } + if (StringUtils.isNotBlank(taskName)) { + // 妯℃嫙妯$硦鏌ヨ + allUserTaskElement = allUserTaskElement.stream().filter(taskEl -> taskEl.getName().contains(taskName)).collect(Collectors.toList()); + } + int end = Math.min(endNum, allUserTaskElement.size()); + List<UserTask> userTasks = allUserTaskElement.subList(startNum, end); + // 鏌ュ嚭娴佺▼ + ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(processInsId).singleResult(); + // 鍒ゆ柇浠诲姟鐘舵�� + List<CustomerTaskVO> vos = userTasks.stream().map(userTask -> { + CustomerTaskVO vo = new CustomerTaskVO(); + vo.setProcessInsId(process.getId()); + vo.setProcessDefId(processDefinitionId); + vo.setDeployId(process.getDeploymentId()); + vo.setTaskName(userTask.getName()); + vo.setProcessName(process.getProcessDefinitionName()); + Task task = taskService.createTaskQuery().processInstanceId(process.getId()).taskDefinitionKey(userTask.getId()).singleResult(); + if (Objects.isNull(task)) { + // 濡傛灉浠诲姟鍦ㄨ繍琛屾椂娌℃壘鍒帮紝閭d箞鍙兘涓烘湭寮�濮嬫垨鑰呭凡瀹屾垚锛岄渶瑕佷粠鍘嗗彶浠诲姟涓啀鎵句竴涓� + HistoricTaskInstance historicTask = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(process.getProcessInstanceId()) + .taskDefinitionKey(userTask.getId()) + .includeIdentityLinks() + .singleResult(); + if (Objects.isNull(historicTask)) { + vo.setTaskStatus(TaskStatusEnum.NOT_START); + } else { + vo.setTaskStatus(TaskStatusEnum.FINISHED); + // 濡傛灉鏄凡瀹屾垚鐨勶紝淇℃伅闇�瑕佸崟鐙祴鍊� + vo.setTaskId(historicTask.getId()); + vo.setExecutionId(historicTask.getExecutionId()); + vo.setCreateTime(historicTask.getStartTime()); + // 鏌ヨ瀹為檯澶勭悊浜� + long handlerUserId = Long.parseLong(historicTask.getAssignee()); + SysUser handlerUser = sysUserService.selectUserById(handlerUserId); + if (Objects.nonNull(handlerUser)) { + vo.setHandlerId(handlerUserId); + vo.setHandlerName(handlerUser.getNickName()); + } + this.setPromoterAndHandler(vo, historicTask.getIdentityLinks()); + } + } else { + vo.setTaskStatus(TaskStatusEnum.TODO); + vo.setTaskId(task.getId()); + vo.setExecutionId(task.getExecutionId()); + vo.setCreateTime(task.getCreateTime()); + this.setPromoterAndHandler(vo, null); + } + return vo; + }).collect(Collectors.toList()); + result.data(vos); + return vos; + } + + /** + * 璁剧疆浠诲姟鐨勫彂璧蜂汉&澶勭悊浜� + * + * @param taskVO + * @param identityLinkInfos 濡傛灉鏄凡瀹屾垚鐨勪换鍔★紝鐢ㄨ繖涓幓鍙栧叧鑱旂殑鐢ㄦ埛/鐢ㄦ埛缁� + */ + private void setPromoterAndHandler(CustomerTaskVO taskVO, List<? extends IdentityLinkInfo> identityLinkInfos) { + // 娴佺▼鍙戣捣浜轰俊鎭� + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(taskVO.getProcessInsId()) + .singleResult(); + SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); + taskVO.setPromoterId(startUser.getUserId()); + taskVO.setPromoterName(startUser.getNickName()); + taskVO.setPromoterUnitId(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptId() : null); + taskVO.setPromoterUnitName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : ""); + // 娴佺▼澶勭悊浜轰俊鎭� + if (TaskStatusEnum.TODO.equals(taskVO.getTaskStatus())) { + List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(taskVO.getTaskId()); + for (IdentityLink identityLink : identityLinksForTask) { + // 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂� + if (StringUtils.isNotBlank(identityLink.getUserId())) { + SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); + if (Objects.nonNull(sysUser)) { + taskVO.setHandlerId(sysUser.getUserId()); + if (Objects.nonNull(sysUser.getDept())) { + taskVO.setHandlerUnitId(sysUser.getDept().getDeptId()); + taskVO.setHandlerUnitName(sysUser.getDept().getDeptName()); + } + taskVO.setHandlerName(sysUser.getNickName()); + } + // 缁戝畾鐨勬槸瑙掕壊锛屾煡鍑鸿鑹插悕绉� + } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { + SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); + if (Objects.nonNull(role)) { + taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); + taskVO.setHandlerUnitName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�"); + taskVO.setHandlerName("鏆傛湭澶勭悊"); + taskVO.setHandlerId(null); + } + } + } + } else if (TaskStatusEnum.FINISHED.equals(taskVO.getTaskStatus())){ + for (IdentityLinkInfo identityLink : identityLinkInfos) { + // 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂� + if (StringUtils.isNotBlank(identityLink.getUserId())) { + SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); + if (Objects.nonNull(sysUser)) { +// taskVO.setHandlerId(sysUser.getUserId()); + if (Objects.nonNull(sysUser.getDept())) { + taskVO.setHandlerUnitId(sysUser.getDept().getDeptId()); + taskVO.setHandlerUnitName(sysUser.getDept().getDeptName()); + } +// taskVO.setHandlerName(sysUser.getNickName()); + } + // 缁戝畾鐨勬槸瑙掕壊锛屾煡鍑鸿鑹插悕绉� + } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { + SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); + if (Objects.nonNull(role)) { + taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); + taskVO.setHandlerUnitName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�"); +// taskVO.setHandlerName(role.getRoleName()); +// taskVO.setHandlerId(null); + } + } + } + } + + } + + /** + * 鑾峰彇鏌愪釜娴佺▼鐨勬墍鏈変换鍔¤妭鐐� + * + * @param processDefinitionId + * @return + */ + private List<UserTask> getAllUserTaskElement(String processDefinitionId) { // 鑾峰彇娴佺▼瀹氫箟 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionId(processDefinitionId) @@ -273,15 +446,21 @@ throw new IllegalStateException("鏃犳硶鑾峰彇娴佺▼瀵硅薄: " + processDefinition.getKey()); } - // 璁$畻浠诲姟鑺傜偣鏁伴噺 - Long taskNodeCount = 0L; List<FlowElement> flowElements = process.getFlowElements().stream().toList(); - for (FlowElement flowElement : flowElements) { - if (flowElement instanceof org.flowable.bpmn.model.UserTask) { - taskNodeCount++; - } - } - return taskNodeCount; + List<UserTask> userTaskElements = flowElements.stream().filter(flowElement -> flowElement instanceof UserTask).map(flowElement -> { + return (UserTask) flowElement; + }).collect(Collectors.toList()); + return userTaskElements; + } + + /** + * 鑾峰彇娴佺▼鑺傜偣鏁帮紙鎬讳换鍔℃暟锛屼笉鍖呭惈寮�濮嬨�佺粨鏉熺瓑鐗规畩鐨勶紝鍙粺璁serTask绫诲瀷鐨勶級 + * + * @param processDefinitionId 娴佺▼瀹氫箟id + * @return + */ + private Long getTotalTaskNum(String processDefinitionId) { + return Long.valueOf(this.getAllUserTaskElement(processDefinitionId).size()); } /** diff --git a/business/src/main/resources/mapper/ProjectProcessMapper.xml b/business/src/main/resources/mapper/ProjectProcessMapper.xml index 5ce1bb6..ae53deb 100644 --- a/business/src/main/resources/mapper/ProjectProcessMapper.xml +++ b/business/src/main/resources/mapper/ProjectProcessMapper.xml @@ -37,7 +37,7 @@ <result column="gmt_update_time" property="gmtUpdateTime" /> <result column="update_by" property="updateBy" /> <result column="create_by" property="createBy" /> - <result column="flowable_process_id" property="flowableProcessId" /> + <result column="process_def_id" property="processDefId" /> <!-- <association property="id" column=""--> </resultMap> @@ -47,7 +47,7 @@ <select id="getById" resultMap="BaseResultMap"> SELECT TPP.project_id, - TPP.flowable_process_id, + TPP.process_def_id, TPP.id FROM t_project_process TPP @@ -59,7 +59,7 @@ <select id="getPage" resultMap="BaseResultMap"> SELECT PI.*, - TPP.flowable_process_id + TPP.process_def_id FROM t_project_info PI LEFT JOIN t_project_process TPP ON TPP.project_id = PI.id AND TPP.deleted = 0 AND PI.deleted = 0 diff --git a/common/src/main/java/com/ycl/common/enums/business/TaskStatusEnum.java b/common/src/main/java/com/ycl/common/enums/business/TaskStatusEnum.java new file mode 100644 index 0000000..a942187 --- /dev/null +++ b/common/src/main/java/com/ycl/common/enums/business/TaskStatusEnum.java @@ -0,0 +1,29 @@ +package com.ycl.common.enums.business; + +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.Getter; + +/** + * 宸ヤ綔娴佷换鍔$姸鎬� + * + * @author锛歺p + * @date锛�2024/11/29 11:13 + */ +@Getter +public enum TaskStatusEnum { + + NOT_START("not_start", "鏈紑濮�"), + TODO("todo", "寰呭姙"), + FINISHED("finished", "宸插畬鎴�") + ; + + private final String value; + + @JsonValue + private final String desc; + + TaskStatusEnum(String value, String desc) { + this.value = value; + this.desc = desc; + } +} diff --git a/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java b/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java index e8d0fdb..d2d5a45 100644 --- a/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java +++ b/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java @@ -113,12 +113,14 @@ * @return */ @Override + @Transactional(rollbackFor = Exception.class) public AjaxResult completeSubmitForm(String taskId, Map<String, Object> variables) { Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); if (Objects.isNull(task)) { return AjaxResult.error("浠诲姟涓嶅瓨鍦�"); } -// variables.put(taskId + "formJson", variables.get("formJson")); + // 鍏堣褰撳墠鐢ㄦ埛璁ら杩欎釜浠诲姟 + taskService.claim(taskId, SecurityUtils.getUserId() + ""); taskService.addComment(taskId, task.getProcessInstanceId(), FlowComment.SUBMIT.getType(), "瀹屾垚鎻愪氦"); taskService.complete(taskId, variables); return AjaxResult.success("鎻愪氦鎴愬姛"); diff --git a/system/src/main/java/com/ycl/system/domain/base/AbsQuery.java b/system/src/main/java/com/ycl/system/domain/base/AbsQuery.java index 3a669db..940053d 100644 --- a/system/src/main/java/com/ycl/system/domain/base/AbsQuery.java +++ b/system/src/main/java/com/ycl/system/domain/base/AbsQuery.java @@ -13,9 +13,9 @@ public class AbsQuery { @ApiModelProperty(value = "褰撳墠椤�", required = true) - private Long currentPage = 1L; + private long currentPage = 1L; @ApiModelProperty(value = "姣忛〉鏉℃暟", required = true) - private Long pageSize = 10L; + private long pageSize = 10L; } -- Gitblit v1.8.0