From 01410747fc92a6f7bccdf9497fcde43368dc9752 Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期六, 30 十一月 2024 08:05:27 +0800 Subject: [PATCH] 项目跟进回显部门 --- business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java | 814 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 750 insertions(+), 64 deletions(-) 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 e109539..d2dd255 100644 --- a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java +++ b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java @@ -1,7 +1,26 @@ package com.ycl.service.impl; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; +import com.ycl.common.constant.ProcessConstants; +import com.ycl.common.core.domain.AjaxResult; +import com.ycl.common.core.domain.entity.SysDept; +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; import com.ycl.service.ProjectProcessService; import com.ycl.common.base.Result; @@ -9,13 +28,31 @@ import com.ycl.domain.form.ProjectProcessForm; import com.ycl.domain.vo.ProjectProcessVO; import com.ycl.domain.query.ProjectProcessQuery; +import com.ycl.system.service.ISysDeptService; +import com.ycl.system.service.ISysRoleService; +import com.ycl.system.service.ISysUserService; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.model.*; +import org.flowable.bpmn.model.Process; +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; +import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import com.ycl.framework.utils.PageUtil; import org.springframework.beans.BeanUtils; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; /** @@ -29,56 +66,15 @@ public class ProjectProcessServiceImpl extends ServiceImpl<ProjectProcessMapper, ProjectProcess> implements ProjectProcessService { private final ProjectProcessMapper projectProcessMapper; - - /** - * 娣诲姞 - * @param form - * @return - */ - @Override - public Result add(ProjectProcessForm form) { - ProjectProcess entity = ProjectProcessForm.getEntityByForm(form, null); - baseMapper.insert(entity); - return Result.ok("娣诲姞鎴愬姛"); - } - - /** - * 淇敼 - * @param form - * @return - */ - @Override - public Result update(ProjectProcessForm form) { - ProjectProcess entity = baseMapper.selectById(form.getId()); - - // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊 - Assert.notNull(entity, "璁板綍涓嶅瓨鍦�"); - BeanUtils.copyProperties(form, entity); - baseMapper.updateById(entity); - return Result.ok("淇敼鎴愬姛"); - } - - /** - * 鎵归噺鍒犻櫎 - * @param ids - * @return - */ - @Override - public Result remove(List<String> ids) { - baseMapper.deleteBatchIds(ids); - return Result.ok("鍒犻櫎鎴愬姛"); - } - - /** - * id鍒犻櫎 - * @param id - * @return - */ - @Override - public Result removeById(String id) { - baseMapper.deleteById(id); - return Result.ok("鍒犻櫎鎴愬姛"); - } + private final RuntimeService runtimeService; + private final TaskService taskService; + private final IdentityService identityService; + private final RepositoryService repositoryService; + private final ProjectInfoMapper projectInfoMapper; + private final HistoryService historyService; + private final ISysUserService sysUserService; + private final ISysRoleService sysRoleService; + private final ISysDeptService sysDeptService; /** * 鍒嗛〉鏌ヨ @@ -89,28 +85,718 @@ public Result page(ProjectProcessQuery query) { IPage<ProjectProcessVO> page = PageUtil.getPage(query, ProjectProcessVO.class); baseMapper.getPage(page, query); + for (ProjectProcessVO vo : page.getRecords()) { + if (Objects.nonNull(vo.getProcessDefId())) { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(vo.getProcessDefId()).singleResult(); + if (Objects.nonNull(processDefinition)) { + vo.setSuspended(processDefinition.isSuspended()); + } + } + } return Result.ok().data(page.getRecords()).total(page.getTotal()); } - /** - * 鏍规嵁id鏌ユ壘 - * @param id - * @return - */ @Override - public Result detail(Integer id) { - ProjectProcessVO vo = baseMapper.getById(id); - Assert.notNull(vo, "璁板綍涓嶅瓨鍦�"); - return Result.ok().data(vo); + @Transactional(rollbackFor = Exception.class) + public Result projectSetProcess(ProjectProcessForm form) { + // 鏌ヨ璇ラ」鐩槸鍚﹀凡缁忕粦瀹氳繃娴佺▼浜嗭紝妫�鏌ョ粦瀹氱殑娴佺▼鏄惁鍦ㄨ繍琛岋紝鍦ㄨ繍琛屽氨鍒犱簡 + ProjectProcess pp = new LambdaQueryChainWrapper<>(baseMapper) + .eq(ProjectProcess::getProjectId, form.getProjectId()) + .one(); + if (Objects.isNull(pp)) { + throw new RuntimeException("璇ラ」鐩湭缁戝畾娴佺▼"); + } + if (Objects.nonNull(pp.getProcessInsId())) { + HistoricProcessInstance historicProcessInstance = + historyService.createHistoricProcessInstanceQuery().processInstanceId(pp.getProcessInsId()).singleResult(); + // 鍒犻櫎涔嬪墠娴佺▼鐨勬暟鎹� + if (historicProcessInstance.getEndTime() != null) { + historyService.deleteHistoricProcessInstance(historicProcessInstance.getId()); + } else { + // 鍒犻櫎娴佺▼瀹炰緥 + runtimeService.deleteProcessInstance(pp.getProcessInsId(), ""); + // 鍒犻櫎鍘嗗彶娴佺▼瀹炰緥 + historyService.deleteHistoricProcessInstance(pp.getProcessInsId()); + } + } + String processInsId = this.startPro(form.getProjectId(), form.getProcessDefId()); + new LambdaUpdateChainWrapper<>(baseMapper) + .eq(ProjectProcess::getProjectId, form.getProjectId()) + .set(ProjectProcess::getProcessDefId, form.getProcessDefId()) + .set(ProjectProcess::getProcessInsId, processInsId) + .update(); + return Result.ok("娴佺▼鍙樻洿鎴愬姛"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result startProcess(Long projectId, String processDefId) { + String processInsId = this.startPro(projectId, processDefId); + ProjectProcess entity = new ProjectProcess(); + entity.setProjectId(projectId); + entity.setProcessDefId(processDefId); + entity.setProcessInsId(processInsId); + baseMapper.insert(entity); + return Result.ok("娴佺▼鍚姩鎴愬姛"); } /** - * 鍒楄〃 + * 鍚姩娴佺▼ + * + * @param projectId + * @param processDefId + * @return + */ + private String startPro(Long projectId, String processDefId) { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefId) + .latestVersion().singleResult(); + if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) { + throw new RuntimeException("璇ユ祦绋嬪凡琚寕璧�,璇峰厛婵�娲绘祦绋�"); + } + 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); + return processInstance.getId(); + } + + /** + * 鑾峰彇娴佺▼璇︽儏 + * @param projectId * @return */ @Override - public Result all() { - List<ProjectProcess> entities = baseMapper.selectList(null); - return Result.ok().data(entities); + public Result detail(Long projectId, String processDefId) { + // 椤圭洰淇℃伅 + ProjectInfo projectInfo = new LambdaQueryChainWrapper<>(projectInfoMapper) + .select(ProjectInfo::getId, ProjectInfo::getProjectName, ProjectInfo::getProjectCode) + .eq(ProjectInfo::getId, projectId) + .one(); + + if (Objects.isNull(projectInfo)) { + return Result.error("璇ラ」鐩笉瀛樺湪"); + } + + ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(baseMapper) + .eq(ProjectProcess::getProjectId, projectId) + .eq(ProjectProcess::getProcessDefId, processDefId) + .one(); + if (Objects.isNull(projectProcess)) { + return Result.error("璇ラ」鐩湭璁剧疆娴佺▼"); + } + + ProjectProcessDetailVO detail = new ProjectProcessDetailVO(); + detail.setProjectId(projectId); + detail.setProjectName(projectInfo.getProjectName()); + detail.setProjectCode(projectInfo.getProjectCode()); + + ProjectProcessDetailVO.TaskStatistics taskStatistics = new ProjectProcessDetailVO.TaskStatistics(); + // 鐘舵�佺粺璁� + taskStatistics.setTotalTaskNum(this.getTotalTaskNum(processDefId)); + taskStatistics.setTodoTaskNum(this.getTodoTaskNum(projectProcess.getProcessInsId())); + taskStatistics.setRemainingTaskNum(this.getRemainingTaskNum(processDefId, projectProcess.getProcessInsId())); +// taskStatistics.setCurrentTask(this.getCurrentNodeTaskList(projectProcess.getProcessInstanceId())); + taskStatistics.setRemainingTaskNum(this.getNotFinishedTaskNum(projectProcess.getProcessInsId())); + detail.setStatistics(taskStatistics); + + Result result = Result.ok(); + + // 浠e姙浠诲姟 + this.getTodoTaskList(projectProcess.getProcessInsId(),"", 5, 1, result); + return result.data(detail); + } + + @Override + 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.isNull(projectProcess)) { + throw new RuntimeException("璇ラ」鐩湭閰嶇疆娴佺▼"); + } + 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); + break; + case TaskTypeConstant.TODO: + this.getTodoTaskList(projectProcess.getProcessInsId(), query.getTaskName(), (int)query.getPageSize(), (int)query.getCurrentPage(), ok); + ok.data(ok.get("taskList")); + break; + case TaskTypeConstant.CURRENT: + break; + case TaskTypeConstant.REMAINING: + this.getRemainingTask(query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName (), (int)query.getCurrentPage(), (int)query.getPageSize(), ok); + break; + default: + break; + + } + return ok; + } + + @Override + public void getAllTodoTask(String taskName, int pageSize, int pageNum, Result result) { + TaskQuery taskQuery = taskService.createTaskQuery() + .active() + .includeProcessVariables() + .orderByTaskCreateTime().desc(); + + if (StringUtils.isNotBlank(taskName)) { + taskQuery.processDefinitionNameLike(taskName); + } + result.total(taskQuery.count()); + List<Task> taskList = taskQuery.listPage(pageSize * (pageNum - 1), pageSize); + List<CustomerTaskVO> vos = new ArrayList<>(); + for (Task task : taskList) { + CustomerTaskVO taskVO = new CustomerTaskVO(); + // 褰撳墠娴佺▼淇℃伅 + 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(); + 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())); + 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) { + // 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂� + 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); + } + } + } + vos.add(taskVO); + } + result.put("taskList", vos); + } + + /** + * 鏌ヨ寰呭姙浠诲姟 + * + * @param processInsId + * @param taskName + * @param pageSize + * @param pageNum + * @param result + */ + public void getTodoTaskList(String processInsId, String taskName, int pageSize, int pageNum, Result result) { + TaskQuery taskQuery = taskService.createTaskQuery() + .active() + .processInstanceId(processInsId) + .includeProcessVariables() + .orderByTaskCreateTime().desc(); + + if (StringUtils.isNotBlank(taskName)) { + taskQuery.processDefinitionNameLike(taskName); + } + result.total(taskQuery.count()); + List<Task> taskList = taskQuery.listPage(pageSize * (pageNum - 1), pageSize); + List<CustomerTaskVO> vos = new ArrayList<>(); + for (Task task : taskList) { + CustomerTaskVO taskVO = new CustomerTaskVO(); + // 褰撳墠娴佺▼淇℃伅 + 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(); + 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())); + 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) { + // 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂� + 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())) { + if (identityLink.getGroupId().startsWith("dept")) { // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1 + String[] split = identityLink.getGroupId().split(":"); + if (split.length > 1) { + // 閮ㄩ棬 + SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); + if (Objects.nonNull(dept)) { + taskVO.setHandlerUnitId(dept.getDeptId()); + taskVO.setHandlerUnitName(dept.getDeptName()); + taskVO.setHandlerName("鏆傛湭澶勭悊"); + taskVO.setHandlerId(null); + } + } + } else { + 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); + } + } + } + } + vos.add(taskVO); + } + result.put("taskList", vos); + } + + /** + * 鑾峰彇鎵�鏈変换鍔� + * + * @param processDefinitionId 娴佺▼杩愯id + * @param processInsId 娴佺▼瀹炰緥id + * @param pageNum + * @param pageSize + * @param result + * @return + */ + 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)) { + // 鏈紑濮嬬殑浠诲姟锛屽叾鍏宠仈鐨勭敤鎴风粍杩欎簺閮藉彲浠ヤ粠UserTask涓嬁鍒帮紝鍥犱负鏈韩鏈紑濮嬬殑浠诲姟鏄病鏈塼ask鐨勶紝鎵�浠ヨ繖閲岀洿鎺ユ煡 + if (StringUtils.isNotBlank(userTask.getAssignee())) { + SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee())); + if (Objects.nonNull(sysUser)) { + vo.setHandlerId(sysUser.getUserId()); + vo.setHandlerName(sysUser.getNickName()); + vo.setHandlerUnitId(Objects.nonNull(sysUser.getDept()) ? sysUser.getDept().getDeptId() : null); + vo.setHandlerUnitName(Objects.nonNull(sysUser.getDept()) ? sysUser.getDept().getDeptName() : null); + } + } else if (CollectionUtil.isNotEmpty(userTask.getCandidateGroups())) { + String groupId = userTask.getCandidateGroups().get(0); + if (groupId.startsWith("dept")) { // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1 + String[] split = groupId.split(":"); + if (split.length > 1) { + // 閮ㄩ棬 + SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); + if (Objects.nonNull(dept)) { + vo.setHandlerUnitId(dept.getDeptId()); + vo.setHandlerUnitName(dept.getDeptName()); + vo.setHandlerName("鏈紑濮�"); + vo.setHandlerId(null); + } + } + } else { + SysRole role = sysRoleService.selectRoleById(Long.parseLong(groupId)); + if (Objects.nonNull(role)) { + vo.setHandlerUnitId(Long.parseLong(groupId)); + vo.setHandlerUnitName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�"); + vo.setHandlerName("鏈紑濮�"); + vo.setHandlerId(null); + } + } + } + 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 processDefinitionId + * @param processInsId + * @param taskName + * @param pageNum + * @param pageSize + * @param result + * @return + */ + private List<CustomerTaskVO> getRemainingTask(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)) { + // 鏈紑濮嬬殑浠诲姟锛屽叾鍏宠仈鐨勭敤鎴风粍杩欎簺閮藉彲浠ヤ粠UserTask涓嬁鍒帮紝鍥犱负鏈韩鏈紑濮嬬殑浠诲姟鏄病鏈塼ask鐨勶紝鎵�浠ヨ繖閲岀洿鎺ユ煡 + if (StringUtils.isNotBlank(userTask.getAssignee())) { + SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee())); + if (Objects.nonNull(sysUser)) { + vo.setHandlerId(sysUser.getUserId()); + vo.setHandlerName(sysUser.getNickName()); + vo.setHandlerUnitId(Objects.nonNull(sysUser.getDept()) ? sysUser.getDept().getDeptId() : null); + vo.setHandlerUnitName(Objects.nonNull(sysUser.getDept()) ? sysUser.getDept().getDeptName() : null); + } + } else if (CollectionUtil.isNotEmpty(userTask.getCandidateGroups())) { + String groupId = userTask.getCandidateGroups().get(0); + if (groupId.startsWith("dept")) { // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1 + String[] split = groupId.split(":"); + if (split.length > 1) { + // 閮ㄩ棬 + SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); + if (Objects.nonNull(dept)) { + vo.setHandlerUnitId(dept.getDeptId()); + vo.setHandlerUnitName(dept.getDeptName()); + vo.setHandlerName("鏈紑濮�"); + vo.setHandlerId(null); + } + } + } else { + SysRole role = sysRoleService.selectRoleById(Long.parseLong(groupId)); + if (Objects.nonNull(role)) { + vo.setHandlerUnitId(Long.parseLong(groupId)); + vo.setHandlerUnitName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�"); + vo.setHandlerName("鏈紑濮�"); + vo.setHandlerId(null); + } + } + } + vo.setTaskStatus(TaskStatusEnum.NOT_START); + return vo; + } else { + return null; + } + } else { + return null; + } + }).filter(Objects::nonNull).collect(Collectors.toList()); + result.data(vos); + return vos; + } + + /** + * 鏌ヨ鍓╀綑浜嬮」锛堟湭寮�濮嬬殑浠诲姟锛夋暟閲� + * + * @param processDefinitionId 娴佺▼瀹氫箟id + * @param processInsId 娴佺▼瀹炰緥id + * @return + */ + private Long getRemainingTaskNum(String processDefinitionId, String processInsId) { + + List<UserTask> allUserTaskElement = this.getAllUserTaskElement(processDefinitionId); + // 鏌ュ嚭娴佺▼ + ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(processInsId).singleResult(); + long num = 0L; + // 鍒ゆ柇浠诲姟鐘舵�� + for (UserTask userTask : allUserTaskElement) { + 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)) { + num++; + } + } + } + return num; + } + + + /** + * 璁剧疆浠诲姟鐨勫彂璧蜂汉&澶勭悊浜� + * + * @param taskVO + * @param identityLinkInfos 濡傛灉鏄凡瀹屾垚鐨勪换鍔★紝鐢ㄨ繖涓幓鍙栧叧鑱旂殑鐢ㄦ埛/鐢ㄦ埛缁� + */ + private void setPromoterAndHandler(CustomerTaskVO taskVO, List<? extends IdentityLinkInfo> identityLinkInfos) { + // TODO 鍙戣捣浜烘槸鍚﹀簲涓轰笂涓�鑺傜偣鐨勫鐞嗕汉 + // 娴佺▼鍙戣捣浜轰俊鎭� + 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()); + } + // 缁戝畾鐨勬槸瑙掕壊鎴栬�呮槸閮ㄩ棬锛岄渶瑕佹牴鎹甶d鍒ゆ柇 + } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { + if (identityLink.getGroupId().startsWith("dept")) { // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1 + String[] split = identityLink.getGroupId().split(":"); + if (split.length > 1) { + // 閮ㄩ棬 + SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); + if (Objects.nonNull(dept)) { + taskVO.setHandlerUnitId(dept.getDeptId()); + taskVO.setHandlerUnitName(dept.getDeptName()); + taskVO.setHandlerName("鏆傛湭澶勭悊"); + taskVO.setHandlerId(null); + } + } + } else { + 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())) { + if (identityLink.getGroupId().startsWith("dept")) { + String[] split = identityLink.getGroupId().split(":"); + if (split.length > 1) { + // 閮ㄩ棬 + SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); + if (Objects.nonNull(dept)) { + taskVO.setHandlerUnitId(dept.getDeptId()); + taskVO.setHandlerUnitName(dept.getDeptName()); + } + } + } + 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) + .singleResult(); + + if (processDefinition == null) { + throw new IllegalArgumentException("娴佺▼瀹氫箟ID鏃犳晥: " + processDefinitionId); + } + + // 鑾峰彇BPMN妯″瀷 + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); + if (bpmnModel == null) { + throw new IllegalStateException("鏃犳硶鑾峰彇BPMN妯″瀷: " + processDefinitionId); + } + + // 鑾峰彇娴佺▼瀵硅薄 + Process process = bpmnModel.getProcessById(processDefinition.getKey()); + if (process == null) { + throw new IllegalStateException("鏃犳硶鑾峰彇娴佺▼瀵硅薄: " + processDefinition.getKey()); + } + + List<FlowElement> flowElements = process.getFlowElements().stream().toList(); + 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()); + } + + /** + * 鑾峰彇娴佺▼鍓╀綑鏈畬鎴愮殑浠诲姟鏁� + * + * @param processInstanceId + * @return + */ + private Long getNotFinishedTaskNum(String processInstanceId) { + return historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).processUnfinished().count(); + } + + /** + * 鑾峰彇寰呭姙浠诲姟鏁� + * + * @param processInstanceId + * @return + */ + private Long getTodoTaskNum(String processInstanceId) { + return taskService.createTaskQuery().active().processInstanceId(processInstanceId).count(); + } + + /** + * 鑾峰彇褰撳墠鐜妭鐨勬墍鏈変换鍔℃暟 + * + * @param processInstanceId + * @return + */ + private List<Task> getCurrentNodeTaskList(String processInstanceId) { + return taskService.createTaskQuery().processDefinitionId(processInstanceId).list(); } } -- Gitblit v1.8.0