From 1519a7c81e6566dd0cbc6acfb1b5e92c3aaba7df Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期日, 02 三月 2025 10:53:57 +0800 Subject: [PATCH] 赋码定时任务只判断超时,且用红码时间判断 --- business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java | 688 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 514 insertions(+), 174 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 16549dc..ca1ea6f 100644 --- a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java +++ b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java @@ -1,46 +1,41 @@ package com.ycl.service.impl; +import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.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.TaskStatusEnum; +import com.ycl.common.enums.business.*; import com.ycl.common.utils.SecurityUtils; import com.ycl.constant.TaskTypeConstant; -import com.ycl.domain.entity.ProcessCoding; -import com.ycl.domain.entity.ProjectInfo; -import com.ycl.domain.entity.ProjectProcess; -import com.ycl.domain.entity.SysForm; -import com.ycl.domain.form.TaskDelegationForm; -import com.ycl.domain.form.TaskJumpForm; -import com.ycl.domain.json.DelegateData; +import com.ycl.domain.entity.*; +import com.ycl.domain.form.*; +import com.ycl.domain.json.*; import com.ycl.domain.vo.CustomerTaskVO; import com.ycl.domain.vo.IndexCustomerTaskVO; import com.ycl.domain.vo.ProjectProcessDetailVO; import com.ycl.event.event.TaskLogEvent; import com.ycl.mapper.ProjectInfoMapper; import com.ycl.mapper.ProjectProcessMapper; -import com.ycl.service.IFlowTaskService; -import com.ycl.service.ISysFormService; -import com.ycl.service.ProcessCodingService; -import com.ycl.service.ProjectProcessService; +import com.ycl.service.*; import com.ycl.common.base.Result; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.ycl.domain.form.ProjectProcessForm; import com.ycl.domain.vo.ProjectProcessVO; 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; import org.apache.commons.lang3.StringUtils; import org.flowable.bpmn.model.*; import org.flowable.bpmn.model.Process; @@ -92,6 +87,9 @@ private final ProcessCodingService processCodingService; private final ApplicationEventPublisher publisher; private final ISysDeptService deptService; + private final ProcessLogService processLogService; + private final ISysDictTypeService dictTypeService; + private final ProcessConfigInfoService processConfigInfoService; /** * 鍒嗛〉鏌ヨ @@ -104,6 +102,7 @@ IPage<ProjectProcessVO> page = PageUtil.getPage(query, ProjectProcessVO.class); baseMapper.getPage(query, page); for (ProjectProcessVO vo : page.getRecords()) { + vo.setStatus(vo.getProjectStatus()); if (Objects.nonNull(vo.getProcessDefId())) { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(vo.getProcessDefId()).singleResult(); if (Objects.nonNull(processDefinition)) { @@ -142,46 +141,44 @@ } } ProjectInfo project = new LambdaQueryChainWrapper<>(projectInfoMapper) - .select(ProjectInfo::getCreateBy) + .select(ProjectInfo::getProjectOwnerUnit) .eq(ProjectInfo::getId, form.getProjectId()) .one(); if (Objects.isNull(project)) { throw new RuntimeException("椤圭洰涓嶅瓨鍦�"); } - SysUser user = sysUserService.selectUserById(project.getCreateBy()); - if (Objects.isNull(user)) { + SysDept dept = deptService.selectDeptById(project.getProjectOwnerUnit()); + if (Objects.isNull(dept)) { throw new RuntimeException("椤圭洰涓氫富鍗曚綅涓嶅瓨鍦�"); } - String processInsId = this.startPro(form.getProjectId(), form.getProcessDefId(), user.getDeptId()); + String processInsId = this.startPro(form.getProjectId(), form.getProcessDefId(), dept.getDeptId()); new LambdaUpdateChainWrapper<>(baseMapper) .eq(ProjectProcess::getProjectId, form.getProjectId()) .set(ProjectProcess::getProcessDefId, form.getProcessDefId()) .set(ProjectProcess::getProcessInsId, processInsId) - .set(ProjectProcess::getDataLaunch, project.getCreateBy()) + .set(ProjectProcess::getDataLaunch, project.getProjectOwnerUnit()) .update(); + return Result.ok("娴佺▼鍙樻洿鎴愬姛"); } @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("椤圭洰涓嶅瓨鍦�"); } - SysUser user = sysUserService.selectUserById(project.getCreateBy()); - if (Objects.isNull(user)) { + SysDept dept = deptService.selectDeptById(project.getProjectOwnerUnit()); + if (Objects.isNull(dept)) { throw new RuntimeException("椤圭洰涓氫富鍗曚綅涓嶅瓨鍦�"); } - String processInsId = this.startPro(projectId, processDefId, user.getDeptId()); + String processInsId = this.startPro(projectId, processDefId, dept.getDeptId()); ProjectProcess entity = new ProjectProcess(); entity.setProjectId(projectId); entity.setProcessDefId(processDefId); entity.setProcessInsId(processInsId); - entity.setDataLaunch(project.getCreateBy()); + entity.setDataLaunch(project.getProjectOwnerUnit()); baseMapper.insert(entity); return Result.ok("娴佺▼鍚姩鎴愬姛"); @@ -207,9 +204,8 @@ SysUser sysUser = SecurityUtils.getLoginUser().getUser(); identityService.setAuthenticatedUserId(sysUser.getUserId().toString()); variables.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId()); - // 灏嗚椤圭洰鐨勭敵璇蜂汉锛堜笟涓绘柟锛変綔涓烘祦绋嬩腑鏌愪簺鐜妭鐨勫鐞嗕汉 - variables.put(ProcessConstants.DATA_LAUNCH, createBy); + variables.put(ProcessConstants.DATA_LAUNCH, "dept:" + createBy); ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, projectId + "", variables); return processInstance.getId(); } @@ -288,7 +284,7 @@ this.getRemainingTask(query.getProjectId(), query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getCurrentPage(), (int) query.getPageSize(), ok); break; case TaskTypeConstant.TIMELY: - this.getTimelyTask(query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getCurrentPage(), (int) query.getPageSize(), ok); + this.getTimelyTask(query.getProjectId(), query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getCurrentPage(), (int) query.getPageSize(), ok); break; case TaskTypeConstant.OVERTIME: this.getOvertimeTask(query.getProjectId(), query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getCurrentPage(), (int) query.getPageSize(), ok); @@ -309,11 +305,17 @@ .active() .includeProcessVariables() .orderByTaskCreateTime().desc(); - - if (StringUtils.isNotBlank(taskName)) { - taskQuery.processDefinitionNameLike(taskName); + List<String> insIds = baseMapper.getNormalInsIds(); + if (CollectionUtils.isEmpty(insIds)) { + result.data(new ArrayList<>()).total(0L); + return; + } else { + taskQuery.processInstanceIdIn(insIds); } - if (! SecurityUtils.getLoginUser().getUser().isAdmin()) { + if (StringUtils.isNotBlank(taskName)) { + taskQuery.taskNameLike(taskName); + } + if (!SecurityUtils.getLoginUser().getUser().isAdmin()) { taskQuery .or() .taskCandidateGroupIn(taskCommonService.getCurrentUserGroups()) @@ -338,7 +340,7 @@ .processDefinitionId(task.getProcessDefinitionId()) .singleResult(); taskVO.setDeployId(pd.getDeploymentId()); - taskVO.setProcessName(pd.getName()); + taskVO.setProcessName(pd.getName() + "(v" + pd.getVersion() + ")"); taskVO.setProcessInsId(task.getProcessInstanceId()); taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey()); @@ -406,14 +408,52 @@ } } } + // 妫�鏌ユ槸鍚︽寕璧� + if (processLogService.taskIsHangup(task.getId(), task.getProcessInstanceId())) { + taskVO.setTaskStatus(TaskStatusEnum.HANGUP); + } + // 璁$畻鍔炵悊鏃堕棿 + ProcessCoding processCoding = processCodingService.getByTaskId(task.getId()); + if (processCoding != null) { + if (StringUtils.isNotBlank(processCoding.getOvertime())) { + Long overtime = getTime(processCoding.getOvertime()); + long durationTime = 0l; + if (Objects.nonNull(processCoding.getStartTaskTime())) { + durationTime = ((new Date()).getTime() - processCoding.getStartTaskTime().getTime()) / 1000; + } else { + taskVO.setRemainingTime("鏈缃姙鐞嗘椂闂�"); + } + if (overtime > durationTime) { + taskVO.setRemainingTime((overtime - durationTime) / 3600 + "灏忔椂"); + } else { + taskVO.setRemainingTime("宸茶秴鏃�"); + } + } else { + taskVO.setRemainingTime("-"); + } + } this.distinctVo(taskVO); vos.add(taskVO); } - if (vos.size() < pageSize) { - result.total(vos.size()); - } result.put("taskList", vos); + } + + private Long getTime(String timeStr) { + Long time = null; + if (StringUtils.isNotBlank(timeStr)) { + String[] timeArr = timeStr.split("-"); + // 瑙f瀽澶╂暟鍜屽皬鏃舵暟 + int days = Integer.parseInt(timeArr[0]); + int hours = 0; + if (timeArr.length > 1) { + hours = Integer.parseInt(timeArr[1]); + } + time = (days * 24L + hours) * 3600L; +// //鍒�-绉� +// time= (days * 60L) + hours; + } + return time; } @Override @@ -607,7 +647,7 @@ jsonData.setAfterHandlerIds(afterHandlerIds); jsonData.setAfterHandlerType(form.getPeopleType()); // 鍙戝竷杞姙浜嬩欢 - publisher.publishEvent(new TaskLogEvent(this, form.getProjectId(), form.getProcessInsId(), task.getId(), ProcessLogEventTypeEnum.DELEGATE, jsonData)); + publisher.publishEvent(new TaskLogEvent(this, null, SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), task.getId(), task.getName(), ProcessLogEventTypeEnum.DELEGATE, jsonData)); return Result.ok("杞姙鎴愬姛"); } @@ -618,7 +658,7 @@ Task task = taskService.createTaskQuery().taskId(form.getTaskId()).processInstanceId(form.getProcessInsId()).singleResult(); if (Objects.nonNull(task)) { // 娣诲姞璺宠繃鏃ュ織 - publisher.publishEvent(new TaskLogEvent(this, form.getProjectId(), form.getProcessInsId(), form.getTaskId(), ProcessLogEventTypeEnum.JUMP, null)); + publisher.publishEvent(new TaskLogEvent(this, null, SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), task.getName(), ProcessLogEventTypeEnum.JUMP, new JumpData(form.getDesc()))); // 鏌ュ嚭璇ヤ换鍔$粦瀹氱殑琛ㄥ崟 Map<String, Object> data = new HashMap<>(1); @@ -631,6 +671,142 @@ // 瀹屾垚浠诲姟 flowTaskService.completeSubmitForm(form.getTaskId(), data); } + return Result.ok("鎿嶄綔鎴愬姛"); + } + + @Override + public Result taskSupervise(TaskSuperviseForm form) { + Task task = taskService.createTaskQuery().taskId(form.getTaskId()).singleResult(); + SuperviseData jsonData = new SuperviseData(); + jsonData.setCreateTime(new Date()); + jsonData.setContent(form.getContent()); + jsonData.setSenderId(SecurityUtils.getUserId() + ""); + jsonData.setSenderType(HandlerTypeEnum.USER); + jsonData.setReceiverIds(form.getReceiverIds()); + jsonData.setReceiverType(form.getReceiverType()); + jsonData.setSuperviseType(form.getSuperviseType()); + QueryWrapper<ProcessLog> queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("task_id", form.getTaskId()); + queryWrapper.eq("event_type", ProcessLogEventTypeEnum.SUPERVISE); + queryWrapper.eq("process_ins_id", form.getProcessInsId()); + //鏌ヨ鐫e姙鏃ュ織 + ProcessLog processLog = processLogService.getOne(queryWrapper); + List<SuperviseData> dataList; + if (processLog != null) { + String eventDataJson = processLog.getEventDataJson(); + dataList = JSONArray.parseArray(eventDataJson, SuperviseData.class); + } else { + processLog = new ProcessLog(); + processLog.setUserId(SecurityUtils.getUserId()); + dataList = new ArrayList<>(); + } + dataList.add(jsonData); + //娣诲姞鐫e姙鏃ュ織 + publisher.publishEvent(new TaskLogEvent(this, processLog.getId(), processLog.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), task.getName(), ProcessLogEventTypeEnum.SUPERVISE, dataList)); + return Result.ok("鎿嶄綔鎴愬姛"); + } + + @Override + @Synchronized + public Result taskHangup(TaskHangupForm form) { + Task task = taskService.createTaskQuery().taskId(form.getTaskId()).singleResult(); + if (Objects.isNull(task)) { + throw new RuntimeException("浠诲姟涓嶅瓨鍦�"); + } + List<ProcessLog> logs = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) + .eq(ProcessLog::getTaskId, form.getTaskId()) + .eq(ProcessLog::getProcessInsId, form.getProcessInsId()) + .eq(ProcessLog::getProjectId, form.getProjectId()) + .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.HANGUP, ProcessLogEventTypeEnum.CANCEL_HANGUP) + .list(); + if (logs.size() % 2 != 0) { + throw new RuntimeException("璇ヤ换鍔℃鍦ㄦ寕璧蜂腑锛屼笉鑳藉啀娆℃寕璧�"); + } + // 浠诲姟鎸傝捣鍙渶瑕佸瓨鏃ュ織锛屾煡璇㈠緟鍔炴椂濡傛灉鏈夎繖涓棩蹇楄褰曪紝鍒欑鐢ㄦ彁浜ゆ寜閽紝浠ユ瀹炵幇浠诲姟鎸傝捣 + publisher.publishEvent(new TaskLogEvent(this, + null, + SecurityUtils.getUserId(), + form.getProjectId(), + form.getProcessInsId(), + form.getTaskId(), + task.getName(), + ProcessLogEventTypeEnum.HANGUP, + new HangupData(form.getReason()) + )); + return Result.ok("鎿嶄綔鎴愬姛"); + } + + @Override + @Synchronized + public Result cancelTaskHangup(TaskHangupForm form) { + Task task = taskService.createTaskQuery().taskId(form.getTaskId()).singleResult(); + if (Objects.isNull(task)) { + throw new RuntimeException("浠诲姟涓嶅瓨鍦�"); + } + List<ProcessLog> logs = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) + .eq(ProcessLog::getTaskId, form.getTaskId()) + .eq(ProcessLog::getProcessInsId, form.getProcessInsId()) + .eq(ProcessLog::getProjectId, form.getProjectId()) + .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.HANGUP, ProcessLogEventTypeEnum.CANCEL_HANGUP) + .list(); + if (logs.size() % 2 == 0) { + throw new RuntimeException("璇ヤ换鍔℃湭琚寕璧凤紝涓嶈兘鍙栨秷鎸傝捣"); + } + publisher.publishEvent(new TaskLogEvent(this, + null, + SecurityUtils.getUserId(), + form.getProjectId(), + form.getProcessInsId(), + form.getTaskId(), + task.getName(), + ProcessLogEventTypeEnum.CANCEL_HANGUP, + new HangupData(form.getReason()) + )); + 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("鎿嶄綔鎴愬姛"); } @@ -653,7 +829,7 @@ .desc(); if (StringUtils.isNotBlank(taskName)) { - taskQuery.processDefinitionNameLike(taskName); + taskQuery.taskNameLike(taskName); } result.total(taskQuery.count()); List<Task> taskList = taskQuery.listPage(pageSize * (pageNum - 1), pageSize); @@ -661,6 +837,10 @@ for (Task task : taskList) { CustomerTaskVO taskVO = new CustomerTaskVO(); this.setRuntimeTaskInfo(task, taskVO, projectId); + // 妫�鏌ユ槸鍚︽寕璧� + if (processLogService.taskIsHangup(task.getId(), task.getProcessInstanceId())) { + taskVO.setTaskStatus(TaskStatusEnum.HANGUP); + } vos.add(taskVO); } result.put("taskList", vos); @@ -669,7 +849,7 @@ /** * 鑾峰彇鎵�鏈変换鍔� * - * @param projectId 椤圭洰id + * @param projectId 椤圭洰id * @param processDefinitionId 娴佺▼杩愯id * @param processInsId 娴佺▼瀹炰緥id * @param pageNum @@ -718,11 +898,16 @@ List<String> handlerNames = new ArrayList<>(2); List<Long> handlerUnitIds = new ArrayList<>(2); List<String> handlerUnitNames = new ArrayList<>(2); + List<String> promoterNames = new ArrayList<>(2); + List<String> promoterUnitNames = new ArrayList<>(2); vo.setHandlerId(handlerIds); vo.setHandlerName(handlerNames); vo.setHandlerUnitId(handlerUnitIds); vo.setHandlerUnitName(handlerUnitNames); + vo.setPromoterName(promoterNames); + vo.setPromoterUnitName(promoterUnitNames); + this.setCandidateInfo(userTask, vo, projectId, processInsId); if (Objects.isNull(task)) { // 濡傛灉浠诲姟鍦ㄨ繍琛屾椂娌℃壘鍒帮紝閭d箞鍙兘涓烘湭寮�濮嬫垨鑰呭凡瀹屾垚锛岄渶瑕佷粠鍘嗗彶浠诲姟涓啀鎵句竴涓� List<HistoricTaskInstance> historicTasks = historyService.createHistoricTaskInstanceQuery() @@ -733,29 +918,26 @@ .desc() .list(); if (CollectionUtils.isEmpty(historicTasks)) { - vo.setPromoterName("鏆傛棤"); - vo.setPromoterUnitName("鏆傛棤"); // 鏈紑濮嬬殑浠诲姟锛屽叾鍏宠仈鐨勭敤鎴风粍杩欎簺閮藉彲浠ヤ粠UserTask涓嬁鍒帮紝鍥犱负鏈韩鏈紑濮嬬殑浠诲姟鏄病鏈塼ask鐨勶紝鎵�浠ヨ繖閲岀洿鎺ユ煡 if (StringUtils.isNotBlank(userTask.getAssignee())) { vo.setHandlerType(HandlerTypeEnum.USER); - // 澶勭悊鍙橀噺琛ㄨ揪寮� - if (userTask.getAssignee().contains(ProcessConstants.DATA_LAUNCH)) { - this.varReview(vo, projectId, processInsId); - } else { - SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee())); - if (Objects.nonNull(sysUser)) { - handlerIds.add(sysUser.getUserId()); - handlerNames.add(sysUser.getNickName()); - if (Objects.nonNull(sysUser.getDept())) { - handlerUnitIds.add(sysUser.getDept().getDeptId()); - handlerUnitNames.add(sysUser.getDept().getDeptName()); - } + SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee())); + if (Objects.nonNull(sysUser)) { + handlerIds.add(sysUser.getUserId()); + handlerNames.add(this.getUserShowName(sysUser)); + if (Objects.nonNull(sysUser.getDept())) { + handlerUnitIds.add(sysUser.getDept().getDeptId()); + handlerUnitNames.add(sysUser.getDept().getDeptName()); } } } else if (CollectionUtil.isNotEmpty(userTask.getCandidateGroups())) { List<String> groupIds = userTask.getCandidateGroups(); for (String groupId : groupIds) { - if (groupId.startsWith("dept")) { // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1 + // 澶勭悊鍙橀噺琛ㄨ揪寮忥紝DATA_LAUNCH鍙彲鑳芥槸閮ㄩ棬涓嶄細鏄鑹诧紝鍥犱负浠h〃鐨勬槸涓氫富閮ㄩ棬 + if (groupId.contains(ProcessConstants.DATA_LAUNCH)) { + vo.setHandlerType(HandlerTypeEnum.DEPT); + this.varYzReview(vo, projectId, processInsId, HandlerTypeEnum.DEPT, 1); + } else if (groupId.startsWith("dept")) { // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1 vo.setHandlerType(HandlerTypeEnum.DEPT); String[] split = groupId.split(":"); if (split.length > 1) { @@ -764,7 +946,7 @@ if (Objects.nonNull(dept)) { handlerUnitIds.add(dept.getDeptId()); handlerUnitNames.add(dept.getDeptName()); - + handlerNames.add(this.getDeptLeaderShowName(dept)); } } } else { @@ -790,9 +972,11 @@ SysUser handlerUser = sysUserService.selectUserById(handlerUserId); if (Objects.nonNull(handlerUser)) { handlerIds.add(handlerUserId); - handlerNames.add(handlerUser.getNickName()); - vo.setActualHandlerUserId(historicTasks.get(0).getAssignee()); - vo.setActualHandlerUserName(handlerUser.getNickName()); + handlerNames.add(this.getUserShowName(handlerUser)); + if (Objects.nonNull(handlerUser.getDept())) { + handlerUnitNames.add(handlerUser.getDept().getDeptName()); + handlerUnitIds.add(handlerUser.getDept().getDeptId()); + } } vo.setTaskDefinitionKey(historicTasks.get(0).getTaskDefinitionKey()); this.setPromoterAndHandler(vo, historicTasks.get(0).getIdentityLinks()); @@ -817,13 +1001,16 @@ /** * 鏌ヨ宸插畬鎴愮殑娴佺▼鐨勪换鍔′俊鎭� * - * @param userTasks 浠诲姟鑺傜偣鍒楄〃 + * @param userTasks 浠诲姟鑺傜偣鍒楄〃 * @param processInsId 娴佺▼瀹炰緥id * @param processDefId 娴佺▼瀹氫箟id * @return */ private List<CustomerTaskVO> getFinishedProcessTaskInfo(List<UserTask> userTasks, String processInsId, String processDefId) { HistoricProcessInstance hisProcess = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInsId).singleResult(); + if (Objects.isNull(hisProcess)) { + return new ArrayList<>(); + } List<CustomerTaskVO> vos = userTasks.stream().map(userTask -> { CustomerTaskVO vo = new CustomerTaskVO(); vo.setProcessInsId(hisProcess.getId()); @@ -864,8 +1051,8 @@ /** * 璁剧疆杩愯鏃朵换鍔$殑淇℃伅 * - * @param task 浠诲姟 - * @param taskVO 浠诲姟vo + * @param task 浠诲姟 + * @param taskVO 浠诲姟vo * @param projectId 椤圭洰id */ private void setRuntimeTaskInfo(Task task, CustomerTaskVO taskVO, Long projectId) { @@ -893,40 +1080,40 @@ taskVO.setProcessInsId(task.getProcessInstanceId()); taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey()); - // 娴佺▼鍙戣捣浜轰俊鎭� - this.setPromoterInfo(taskVO); - // 涓�涓换鍔″彲鑳芥湁澶氫釜鍊欓�変汉/缁勶紝鎵�浠ラ渶瑕佷娇鐢╨ist List<Long> handlerIds = new ArrayList<>(2); List<String> handlerNames = new ArrayList<>(2); List<Long> handlerUnitIds = new ArrayList<>(2); List<String> handlerUnitNames = new ArrayList<>(2); + List<String> promoterNames = new ArrayList<>(2); + List<String> promoterUnitNames = new ArrayList<>(2); taskVO.setHandlerId(handlerIds); taskVO.setHandlerName(handlerNames); taskVO.setHandlerUnitId(handlerUnitIds); taskVO.setHandlerUnitName(handlerUnitNames); + taskVO.setPromoterName(promoterNames); + taskVO.setPromoterUnitName(promoterUnitNames); // 娴佺▼澶勭悊浜轰俊鎭� List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId()); for (IdentityLinkInfo identityLink : identityLinksForTask) { -// if (StringUtils.isBlank(((IdentityLinkEntityImpl)identityLink).getId())) { -// continue; -// } // 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂� if (StringUtils.isNotBlank(identityLink.getUserId())) { - // 澶勭悊鍙橀噺琛ㄨ揪寮� - if (identityLink.getUserId().contains(ProcessConstants.DATA_LAUNCH)) { - this.varReview(taskVO, projectId, task.getProcessInstanceId()); - continue; - } + // 澶勭悊鍙橀噺琛ㄨ揪寮忥紝杩愯涓殑浠诲姟鏃犻渶鍐嶅鐞嗚〃杈惧紡浜嗭紝flowable宸茬粡鑷姩鏍规嵁鍙橀噺璁剧疆浜� +// if (identityLink.getUserId().contains(ProcessConstants.DATA_LAUNCH)) { +// this.varReview(taskVO, projectId, task.getProcessInstanceId()); +// continue; +// } taskVO.setHandlerType(HandlerTypeEnum.USER); SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); if (Objects.nonNull(sysUser)) { taskVO.getHandlerId().add(sysUser.getUserId()); - taskVO.getHandlerName().add(sysUser.getNickName()); + taskVO.getHandlerName().add(this.getUserShowName(sysUser)); if (Objects.nonNull(sysUser.getDept())) { taskVO.getHandlerUnitId().add(sysUser.getDept().getDeptId()); taskVO.getHandlerUnitName().add(sysUser.getDept().getDeptName()); + taskVO.getPromoterName().add(this.getUserShowName(sysUser)); + taskVO.getPromoterUnitName().add(sysUser.getDept().getDeptName()); } } // 缁戝畾鐨勬槸瑙掕壊鎴栬�呴儴闂� @@ -940,6 +1127,8 @@ if (Objects.nonNull(dept)) { taskVO.getHandlerUnitId().add(dept.getDeptId()); taskVO.getHandlerUnitName().add(dept.getDeptName()); + taskVO.getPromoterName().add(this.getDeptLeaderShowName(dept)); + taskVO.getPromoterUnitName().add(dept.getDeptName()); } } } else { @@ -951,7 +1140,6 @@ } } } - this.distinctVo(taskVO); } } @@ -967,8 +1155,8 @@ List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery() .processInstanceId(processInsId) .finished() - .includeIdentityLinks() .list(); + hisTaskList = this.distinctHisTask(hisTaskList); if (CollectionUtils.isEmpty(hisTaskList)) { return 0L; } @@ -976,20 +1164,24 @@ List<String> hisTaskKeys = hisTaskList.stream().map(HistoricTaskInstance::getTaskDefinitionKey).distinct().collect(Collectors.toList()); Map<String, HistoricTaskInstance> hisTaskMap = hisTaskList.stream().collect(Collectors.toMap(HistoricTaskInstance::getTaskDefinitionKey, his -> his)); // 鏌ュ嚭鏃堕棿姝e父鐨勪换鍔ey - List<ProcessCoding> taskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) + List<ProcessCoding> codeList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) .eq(ProcessCoding::getProcessInsId, processInsId) .in(ProcessCoding::getTaskDefKey, hisTaskKeys) .list(); - Map<String, ProcessCoding> codingMap = taskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro)); List<HistoricTaskInstance> finishedTaskList = new ArrayList<>(); // 鍒ゆ柇 for (String key : hisTaskMap.keySet()) { - ProcessCoding processCoding = codingMap.get(key); + List<ProcessCoding> targetProcessCodings = codeList.stream().filter(code -> key.equals(code.getTaskDefKey())).collect(Collectors.toList()); // 濡傛灉宸插畬鎴愮殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝鐩存帴璁剧疆涓烘寜鏃跺畬鎴� - if (Objects.isNull(processCoding)) { + if (CollectionUtils.isEmpty(targetProcessCodings)) { finishedTaskList.add(hisTaskMap.get(key)); - } else if (ProcessOverTimeConstants.NORMAL.equals(processCoding.getOvertimeStatus()) || StringUtils.isBlank(processCoding.getOvertimeStatus())) { - finishedTaskList.add(hisTaskMap.get(key)); + } else { + // 鎸夌収鏃堕棿闄嶅簭鎺掑垪 + targetProcessCodings.sort(Comparator.comparing(ProcessCoding::getGmtCreate).reversed()); + ProcessCoding latestProjectProcess = targetProcessCodings.get(0); + if (ProcessOverTimeConstants.NORMAL.equals(latestProjectProcess.getOvertimeStatus()) || StringUtils.isBlank(latestProjectProcess.getOvertimeStatus())) { + finishedTaskList.add(hisTaskMap.get(key)); + } } } return Long.valueOf(finishedTaskList.size()); @@ -999,14 +1191,14 @@ * 鏌ヨ鎸夋椂瀹屾垚鐨勪换鍔� * * @param processDefinitionId 娴佺▼瀹氫箟id - * @param processInsId 娴佺▼瀹炰緥id - * @param taskName 浠诲姟鍚嶇О--鎼滅储鏉′欢 + * @param processInsId 娴佺▼瀹炰緥id + * @param taskName 浠诲姟鍚嶇О--鎼滅储鏉′欢 * @param pageNum * @param pageSize * @param result * @return */ - private List<CustomerTaskVO> getTimelyTask(String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) { + private List<CustomerTaskVO> getTimelyTask(Long projectId, String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) { int startNum = pageSize * (pageNum - 1); int endNum = startNum + pageSize; @@ -1025,22 +1217,26 @@ } List<String> hisTaskKeys = hisTaskList.stream().map(HistoricTaskInstance::getTaskDefinitionKey).distinct().collect(Collectors.toList()); - Map<String, HistoricTaskInstance> hisTaskMap = hisTaskList.stream().collect(Collectors.toMap(HistoricTaskInstance::getTaskDefinitionKey, his -> his)); + Map<String, HistoricTaskInstance> hisTaskMap = this.distinctHisTask(hisTaskList).stream().collect(Collectors.toMap(HistoricTaskInstance::getTaskDefinitionKey, his -> his)); // 鏌ュ嚭鏃堕棿姝e父鐨勪换鍔ey - List<ProcessCoding> taskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) + List<ProcessCoding> codeList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) .eq(ProcessCoding::getProcessInsId, processInsId) .in(ProcessCoding::getTaskDefKey, hisTaskKeys) .list(); - Map<String, ProcessCoding> codingMap = taskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro)); List<HistoricTaskInstance> finishedTaskList = new ArrayList<>(); // 鍒ゆ柇 for (String key : hisTaskMap.keySet()) { - ProcessCoding processCoding = codingMap.get(key); + List<ProcessCoding> targetProcessCodings = codeList.stream().filter(code -> key.equals(code.getTaskDefKey())).collect(Collectors.toList()); // 濡傛灉宸插畬鎴愮殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝鐩存帴璁剧疆涓烘寜鏃跺畬鎴� - if (Objects.isNull(processCoding)) { + if (CollectionUtils.isEmpty(targetProcessCodings)) { finishedTaskList.add(hisTaskMap.get(key)); - } else if (ProcessOverTimeConstants.NORMAL.equals(processCoding.getOvertimeStatus()) || StringUtils.isBlank(processCoding.getOvertimeStatus())) { - finishedTaskList.add(hisTaskMap.get(key)); + } else { + // 鎸夌収鏃堕棿闄嶅簭鎺掑垪 + targetProcessCodings.sort(Comparator.comparing(ProcessCoding::getGmtCreate).reversed()); + ProcessCoding latestProjectProcess = targetProcessCodings.get(0); + if (ProcessOverTimeConstants.NORMAL.equals(latestProjectProcess.getOvertimeStatus()) || StringUtils.isBlank(latestProjectProcess.getOvertimeStatus())) { + finishedTaskList.add(hisTaskMap.get(key)); + } } } @@ -1085,11 +1281,16 @@ List<String> handlerNames = new ArrayList<>(2); List<Long> handlerUnitIds = new ArrayList<>(2); List<String> handlerUnitNames = new ArrayList<>(2); + List<String> promoterNames = new ArrayList<>(2); + List<String> promoterUnitNames = new ArrayList<>(2); vo.setHandlerId(handlerIds); vo.setHandlerName(handlerNames); vo.setHandlerUnitId(handlerUnitIds); vo.setHandlerUnitName(handlerUnitNames); + vo.setPromoterName(promoterNames); + vo.setPromoterUnitName(promoterUnitNames); + this.setCandidateInfo(userTask, vo, projectId, processInsId); HistoricTaskInstance hisTask = keyMap.get(userTask.getId()); if (Objects.nonNull(hisTask)) { vo.setTaskStatus(TaskStatusEnum.FINISHED); @@ -1103,9 +1304,7 @@ SysUser handlerUser = sysUserService.selectUserById(handlerUserId); if (Objects.nonNull(handlerUser)) { vo.getHandlerId().add(handlerUserId); - vo.getHandlerName().add(handlerUser.getNickName()); - vo.setActualHandlerUserId(hisTask.getAssignee()); - vo.setActualHandlerUserName(handlerUser.getNickName()); + vo.getHandlerName().add(this.getUserShowName(handlerUser)); } vo.setTaskDefinitionKey(hisTask.getTaskDefinitionKey()); this.setPromoterAndHandler(vo, hisTask.getIdentityLinks()); @@ -1116,6 +1315,47 @@ }).collect(Collectors.toList()); result.data(vos); return vos; + } + + /** + * 鐢ㄦ埛鍚嶇О鍚庨潰璺熺數璇濆彿鐮� + * + * @param user + * @return + */ + private String getUserShowName(SysUser user) { + return user.getNickName() + (StringUtils.isNotBlank(user.getPhonenumber()) ? "(" + user.getPhonenumber() + ")" : ""); + } + + /** + * 閮ㄩ棬璐熻矗浜哄悕绉板悗闈㈣窡鐢佃瘽鍙风爜 + * + * @param dept + * @return + */ + private String getDeptLeaderShowName(SysDept dept) { + return dept.getLeader() + (StringUtils.isNotBlank(dept.getPhone()) ? "(" + dept.getPhone() + ")" : ""); + } + + /** + * 鏍规嵁浠诲姟key鍘婚噸鍘嗗彶浠诲姟锛岀浉鍚屾儏鍐典笅鍙栨渶鏂扮殑涓�鏉� + * + * @param hisTaskList + * @return + */ + private List<HistoricTaskInstance> distinctHisTask(List<HistoricTaskInstance> hisTaskList) { + Map<String, HistoricTaskInstance> uniqueTasks = new HashMap<>(); + for (HistoricTaskInstance task : hisTaskList) { + String taskDefinitionKey = task.getTaskDefinitionKey(); + HistoricTaskInstance existingTask = uniqueTasks.get(taskDefinitionKey); + + // 濡傛灉浠诲姟key閲嶅锛堝彲鑳借椹冲洖杩囷紝閲嶆柊鎻愪氦瀵艰嚧key閲嶅锛夛紝鍙栨渶杩戠殑涓�鏉� + if (existingTask == null || task.getCreateTime().after(existingTask.getCreateTime())) { + uniqueTasks.put(taskDefinitionKey, task); + } + } + // 鏈�缁堝幓閲嶅悗鐨勪换鍔″垪琛� + return new ArrayList<>(uniqueTasks.values()); } @@ -1135,31 +1375,36 @@ List<String> taskKeys = taskList.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList()); Map<String, Task> taskMap = taskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his)); // 鏌ュ嚭鏁版嵁搴撶殑浠诲姟key - List<ProcessCoding> databaseTaskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) + List<ProcessCoding> codeList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) .eq(ProcessCoding::getProcessInsId, processInsId) .in(ProcessCoding::getTaskDefKey, taskKeys) .list(); - Map<String, ProcessCoding> codingMap = databaseTaskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro)); List<Task> tList = new ArrayList<>(); // 鍒ゆ柇 for (String key : taskMap.keySet()) { - ProcessCoding processCoding = codingMap.get(key); - // 濡傛灉杩愯涓殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝涓嶇畻瓒呮椂 - if (Objects.nonNull(processCoding) && ProcessOverTimeConstants.OVERTIME.equals(processCoding.getOvertimeStatus())) { + List<ProcessCoding> targetProcessCodings = codeList.stream().filter(code -> key.equals(code.getTaskDefKey())).collect(Collectors.toList()); + // 濡傛灉宸插畬鎴愮殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝鐩存帴璁剧疆涓烘寜鏃跺畬鎴� + if (CollectionUtils.isEmpty(targetProcessCodings)) { tList.add(taskMap.get(key)); + } else { + // 鎸夌収鏃堕棿闄嶅簭鎺掑垪 + targetProcessCodings.sort(Comparator.comparing(ProcessCoding::getGmtCreate).reversed()); + ProcessCoding latestProjectProcess = targetProcessCodings.get(0); + if (Objects.nonNull(latestProjectProcess) && ProcessOverTimeConstants.OVERTIME.equals(latestProjectProcess.getOvertimeStatus())) { + tList.add(taskMap.get(key)); + } } } - return Long.valueOf(taskList.size()); } /** * 鏌ヨ瓒呮椂鐨勪换鍔� * - * @param projectId 椤圭洰id + * @param projectId 椤圭洰id * @param processDefinitionId 娴佺▼瀹氫箟id - * @param processInsId 娴佺▼瀹炰緥id - * @param taskName 浠诲姟鍚嶇О--鎼滅储鏉′欢 + * @param processInsId 娴佺▼瀹炰緥id + * @param taskName 浠诲姟鍚嶇О--鎼滅储鏉′欢 * @param pageNum * @param pageSize * @param result @@ -1183,18 +1428,24 @@ List<String> taskKeys = taskList.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList()); Map<String, Task> taskMap = taskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his)); // 鏌ュ嚭鏁版嵁搴撶殑浠诲姟key - List<ProcessCoding> databaseTaskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) + List<ProcessCoding> codeList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) .eq(ProcessCoding::getProcessInsId, processInsId) .in(ProcessCoding::getTaskDefKey, taskKeys) .list(); - Map<String, ProcessCoding> codingMap = databaseTaskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro)); List<Task> tList = new ArrayList<>(); // 鍒ゆ柇 for (String key : taskMap.keySet()) { - ProcessCoding processCoding = codingMap.get(key); - // 濡傛灉杩愯涓殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝涓嶇畻瓒呮椂 - if (Objects.nonNull(processCoding) && ProcessOverTimeConstants.OVERTIME.equals(processCoding.getOvertimeStatus())) { + List<ProcessCoding> targetProcessCodings = codeList.stream().filter(code -> key.equals(code.getTaskDefKey())).collect(Collectors.toList()); + // 濡傛灉宸插畬鎴愮殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝鐩存帴璁剧疆涓烘寜鏃跺畬鎴� + if (CollectionUtils.isEmpty(targetProcessCodings)) { tList.add(taskMap.get(key)); + } else { + // 鎸夌収鏃堕棿闄嶅簭鎺掑垪 + targetProcessCodings.sort(Comparator.comparing(ProcessCoding::getGmtCreate).reversed()); + ProcessCoding latestProjectProcess = targetProcessCodings.get(0); + if (Objects.nonNull(latestProjectProcess) && ProcessOverTimeConstants.OVERTIME.equals(latestProjectProcess.getOvertimeStatus())) { + tList.add(taskMap.get(key)); + } } } @@ -1237,18 +1488,24 @@ List<String> taskKeys = taskList.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList()); Map<String, Task> taskMap = taskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his)); // 鏌ュ嚭鏁版嵁搴撶殑浠诲姟key - List<ProcessCoding> databaseTaskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) + List<ProcessCoding> codeList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) .eq(ProcessCoding::getProcessInsId, processInsId) .in(ProcessCoding::getTaskDefKey, taskKeys) .list(); - Map<String, ProcessCoding> codingMap = databaseTaskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro)); List<Task> tList = new ArrayList<>(); // 鍒ゆ柇 for (String key : taskMap.keySet()) { - ProcessCoding processCoding = codingMap.get(key); - // 濡傛灉杩愯涓殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝涓嶇畻鍗冲皢瓒呮椂 - if (Objects.nonNull(processCoding) && ProcessOverTimeConstants.WILLOVERTIME.equals(processCoding.getOvertimeStatus())) { + List<ProcessCoding> targetProcessCodings = codeList.stream().filter(code -> key.equals(code.getTaskDefKey())).collect(Collectors.toList()); + // 濡傛灉宸插畬鎴愮殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝鐩存帴璁剧疆涓烘寜鏃跺畬鎴� + if (CollectionUtils.isEmpty(targetProcessCodings)) { tList.add(taskMap.get(key)); + } else { + // 鎸夌収鏃堕棿闄嶅簭鎺掑垪 + targetProcessCodings.sort(Comparator.comparing(ProcessCoding::getGmtCreate).reversed()); + ProcessCoding latestProjectProcess = targetProcessCodings.get(0); + if (Objects.nonNull(latestProjectProcess) && ProcessOverTimeConstants.WILLOVERTIME.equals(latestProjectProcess.getOvertimeStatus())) { + tList.add(taskMap.get(key)); + } } } return Long.valueOf(tList.size()); @@ -1257,10 +1514,10 @@ /** * 鏌ヨ鍗冲皢瓒呮椂鐨勪换鍔� * - * @param projectId 椤圭洰id + * @param projectId 椤圭洰id * @param processDefinitionId 娴佺▼瀹氫箟id - * @param processInsId 娴佺▼瀹炰緥id - * @param taskName 浠诲姟鍚嶇О--鎼滅储鏉′欢 + * @param processInsId 娴佺▼瀹炰緥id + * @param taskName 浠诲姟鍚嶇О--鎼滅储鏉′欢 * @param pageNum * @param pageSize * @param result @@ -1284,18 +1541,24 @@ List<String> taskKeys = taskList.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList()); Map<String, Task> taskMap = taskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his)); // 鏌ュ嚭鏁版嵁搴撶殑浠诲姟key - List<ProcessCoding> databaseTaskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) + List<ProcessCoding> codeList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) .eq(ProcessCoding::getProcessInsId, processInsId) .in(ProcessCoding::getTaskDefKey, taskKeys) .list(); - Map<String, ProcessCoding> codingMap = databaseTaskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro)); List<Task> tList = new ArrayList<>(); // 鍒ゆ柇 for (String key : taskMap.keySet()) { - ProcessCoding processCoding = codingMap.get(key); - // 濡傛灉杩愯涓殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝涓嶇畻鍗冲皢瓒呮椂 - if (Objects.nonNull(processCoding) && ProcessOverTimeConstants.WILLOVERTIME.equals(processCoding.getOvertimeStatus())) { + List<ProcessCoding> targetProcessCodings = codeList.stream().filter(code -> key.equals(code.getTaskDefKey())).collect(Collectors.toList()); + // 濡傛灉宸插畬鎴愮殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝鐩存帴璁剧疆涓烘寜鏃跺畬鎴� + if (CollectionUtils.isEmpty(targetProcessCodings)) { tList.add(taskMap.get(key)); + } else { + // 鎸夌収鏃堕棿闄嶅簭鎺掑垪 + targetProcessCodings.sort(Comparator.comparing(ProcessCoding::getGmtCreate).reversed()); + ProcessCoding latestProjectProcess = targetProcessCodings.get(0); + if (Objects.nonNull(latestProjectProcess) && ProcessOverTimeConstants.WILLOVERTIME.equals(latestProjectProcess.getOvertimeStatus())) { + tList.add(taskMap.get(key)); + } } } @@ -1326,7 +1589,7 @@ /** * 鏌ヨ鍓╀綑浜嬮」锛堟湭寮�濮嬬殑浠诲姟锛� * - * @param projectId 椤圭洰id + * @param projectId 椤圭洰id * @param processDefinitionId * @param processInsId * @param taskName @@ -1372,7 +1635,6 @@ List<UserTask> userTasks = allUserTaskElement.subList(startNum, end); - // 鍒ゆ柇浠诲姟鐘舵�侊紝鏋勫缓vo List<CustomerTaskVO> vos = new ArrayList<>(48); for (UserTask userTask : userTasks) { @@ -1382,10 +1644,14 @@ List<String> handlerNames = new ArrayList<>(2); List<Long> handlerUnitIds = new ArrayList<>(2); List<String> handlerUnitNames = new ArrayList<>(2); + List<String> promoterNames = new ArrayList<>(2); + List<String> promoterUnitNames = new ArrayList<>(2); vo.setHandlerId(handlerIds); vo.setHandlerName(handlerNames); vo.setHandlerUnitId(handlerUnitIds); vo.setHandlerUnitName(handlerUnitNames); + vo.setPromoterName(promoterNames); + vo.setPromoterUnitName(promoterUnitNames); vo.setProcessInsId(process.getId()); vo.setProcessDefId(processDefinitionId); @@ -1393,16 +1659,12 @@ vo.setTaskName(userTask.getName()); vo.setProcessName(process.getProcessDefinitionName()); vo.setTaskStatus(TaskStatusEnum.NOT_START); + + this.setCandidateInfo(userTask, vo, projectId, processInsId); + // 鏈紑濮嬬殑浠诲姟锛屽叾鍏宠仈鐨勭敤鎴风粍杩欎簺閮藉彲浠ヤ粠UserTask涓嬁鍒帮紝鍥犱负鏈韩鏈紑濮嬬殑浠诲姟鏄病鏈塼ask鐨勶紝鎵�浠ヨ繖閲岀洿鎺ユ煡 if (StringUtils.isNotBlank(userTask.getAssignee())) { vo.setHandlerType(HandlerTypeEnum.USER); - - // 澶勭悊鍙橀噺琛ㄨ揪寮� - if (userTask.getAssignee().contains(ProcessConstants.DATA_LAUNCH)) { - this.varReview(vo, projectId, processInsId); - vos.add(vo); - continue; - } SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee())); if (Objects.nonNull(sysUser)) { vo.getHandlerId().add(sysUser.getUserId()); @@ -1415,7 +1677,11 @@ } else if (CollectionUtil.isNotEmpty(userTask.getCandidateGroups())) { List<String> groupIds = userTask.getCandidateGroups(); for (String groupId : groupIds) { - if (groupId.startsWith("dept")) { // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1 + // 澶勭悊鍙橀噺琛ㄨ揪寮忥紝DATA_LAUNCH鍙彲鑳芥槸閮ㄩ棬涓嶄細鏄鑹诧紝鍥犱负浠h〃鐨勬槸涓氫富閮ㄩ棬 + if (groupId.contains(ProcessConstants.DATA_LAUNCH)) { + vo.setHandlerType(HandlerTypeEnum.DEPT); + this.varYzReview(vo, projectId, processInsId, HandlerTypeEnum.DEPT, 1); + } else if (groupId.startsWith("dept")) { // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1 vo.setHandlerType(HandlerTypeEnum.DEPT); String[] split = groupId.split(":"); if (split.length > 1) { @@ -1456,11 +1722,11 @@ } /** - * 澶勭悊娴佺▼鍙橀噺鐨勫鐞嗕汉鍥炴樉 - * + * 澶勭悊娴佺▼鍙橀噺-涓氫富鍗曚綅 + * @param setType 0 璁剧疆璐d换鍗曚綅 1 璁剧疆鍔炵悊鍗曚綅 * @param vo */ - private void varReview(CustomerTaskVO vo, Long projectId, String processInsId) { + private void varYzReview(CustomerTaskVO vo, Long projectId, String processInsId, HandlerTypeEnum type, Integer setType) { ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(projectProcessMapper) .eq(ProjectProcess::getProjectId, projectId) .eq(ProjectProcess::getProcessInsId, processInsId) @@ -1468,11 +1734,32 @@ if (Objects.isNull(projectProcess)) { throw new RuntimeException("璇ユ祦绋嬫湭缁戝畾椤圭洰"); } - SysUser user = sysUserService.selectUserById(projectProcess.getDataLaunch()); - if (Objects.nonNull(user) && Objects.nonNull(user.getDept())) { - vo.getHandlerName().add(user.getDept().getDeptName()); - vo.getHandlerId().add(user.getDept().getDeptId()); + if (HandlerTypeEnum.USER.equals(type) || HandlerTypeEnum.FIX_USER.equals(type)) { + SysUser user = sysUserService.selectUserById(projectProcess.getDataLaunch()); + if (Objects.nonNull(user) && Objects.nonNull(user.getDept())) { + vo.getHandlerName().add(user.getNickName()); + vo.getHandlerId().add(user.getUserId()); + } + } else if (HandlerTypeEnum.DEPT.equals(type)) { + SysDept dept = deptService.selectDeptById(projectProcess.getDataLaunch()); + if (Objects.nonNull(dept)) { + if (setType == 1) { + vo.getHandlerUnitId().add(dept.getDeptId()); + vo.getHandlerUnitName().add(dept.getDeptName()); + vo.getHandlerName().add(this.getDeptLeaderShowName(dept)); + } else { + vo.getPromoterUnitName().add(dept.getDeptName()); + vo.getPromoterName().add(this.getDeptLeaderShowName(dept)); + } + } + } else if (HandlerTypeEnum.ROLE.equals(type)) { + SysRole role = sysRoleService.selectRoleById(projectProcess.getDataLaunch()); + if (Objects.nonNull(role)) { + vo.getHandlerUnitId().add(role.getRoleId()); + vo.getHandlerUnitName().add(role.getRoleName()); + } } + this.distinctVo(vo); } @@ -1501,6 +1788,52 @@ return totalNum - num; } + /** + * 璁剧疆鍊欓�変汉淇℃伅/璐d换鍗曚綅 + * + * @param userTask + * @param vo + * @param projectId + * @param processInsId + */ + private void setCandidateInfo(UserTask userTask, CustomerTaskVO vo, Long projectId, String processInsId) { + if (StringUtils.isNotBlank(userTask.getAssignee())) { + SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee())); + if (Objects.nonNull(sysUser)) { + if (Objects.nonNull(sysUser.getDept())) { + // 濡傛灉鏄寚瀹氱殑鏌愪釜浜猴紝閭d箞璐d换鍗曚綅鏄繖涓汉鎵�鍦ㄧ殑閮ㄩ棬 + vo.getPromoterUnitName().add(sysUser.getDept().getDeptName()); + vo.getPromoterName().add(this.getUserShowName(sysUser)); + } + } + } else if (CollectionUtil.isNotEmpty(userTask.getCandidateGroups())) { + List<String> groupIds = userTask.getCandidateGroups(); + for (String groupId : groupIds) { + // 澶勭悊鍙橀噺琛ㄨ揪寮忥紝DATA_LAUNCH鍙彲鑳芥槸閮ㄩ棬涓嶄細鏄鑹诧紝鍥犱负浠h〃鐨勬槸涓氫富閮ㄩ棬 + if (groupId.contains(ProcessConstants.DATA_LAUNCH)) { + vo.setHandlerType(HandlerTypeEnum.DEPT); + this.varYzReview(vo, projectId, processInsId, HandlerTypeEnum.DEPT, 0); + } else if (groupId.startsWith("dept")) { // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1 + vo.setHandlerType(HandlerTypeEnum.DEPT); + String[] split = groupId.split(":"); + if (split.length > 1) { + // 閮ㄩ棬 + SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); + if (Objects.nonNull(dept)) { + vo.getPromoterUnitName().add(dept.getDeptName()); + vo.getPromoterName().add(this.getDeptLeaderShowName(dept)); + } + } + } else { + vo.setHandlerType(HandlerTypeEnum.ROLE); + SysRole role = sysRoleService.selectRoleById(Long.parseLong(groupId)); + if (Objects.nonNull(role)) { + vo.getPromoterUnitName().add(role.getRoleName()); + } + } + } + } + } /** * 璁剧疆浠诲姟鐨勫彂璧蜂汉&澶勭悊浜� 鍙湁寰呭姙浠诲姟鍜屽凡瀹屾垚浠诲姟鎵嶄細鎺夎繖涓柟娉� @@ -1509,7 +1842,7 @@ * @param identityLinkInfos 濡傛灉鏄凡瀹屾垚鐨勪换鍔★紝鐢ㄨ繖涓幓鍙栧叧鑱旂殑鐢ㄦ埛/鐢ㄦ埛缁� */ private void setPromoterAndHandler(CustomerTaskVO taskVO, List<? extends IdentityLinkInfo> identityLinkInfos) { - this.setPromoterInfo(taskVO); +// this.setPromoterInfo(taskVO); // 涓�涓换鍔″彲鑳芥湁澶氫釜鍊欓�変汉/缁勶紝鎵�浠ラ渶瑕佷娇鐢╨ist List<Long> handlerIds = new ArrayList<>(2); @@ -1525,7 +1858,7 @@ if (TaskStatusEnum.TODO.equals(taskVO.getTaskStatus())) { List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(taskVO.getTaskId()); for (IdentityLink identityLink : identityLinksForTask) { - if (StringUtils.isBlank(((IdentityLinkEntityImpl)identityLink).getId())) { + if (StringUtils.isBlank(((IdentityLinkEntityImpl) identityLink).getId())) { continue; } // 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂� @@ -1534,7 +1867,7 @@ if (Objects.nonNull(sysUser)) { taskVO.setHandlerType(HandlerTypeEnum.USER); handlerIds.add(sysUser.getUserId()); - handlerNames.add(sysUser.getNickName()); + handlerNames.add(this.getUserShowName(sysUser)); if (Objects.nonNull(sysUser.getDept())) { handlerUnitIds.add(sysUser.getDept().getDeptId()); handlerUnitNames.add(sysUser.getDept().getDeptName()); @@ -1571,7 +1904,7 @@ SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); if (Objects.nonNull(sysUser)) { handlerIds.add(sysUser.getUserId()); - handlerNames.add(sysUser.getNickName()); + handlerNames.add(this.getUserShowName(sysUser)); if (Objects.nonNull(sysUser.getDept())) { handlerUnitIds.add(sysUser.getDept().getDeptId()); handlerUnitNames.add(sysUser.getDept().getDeptName()); @@ -1601,7 +1934,6 @@ } } } - this.distinctVo(taskVO); } @@ -1611,33 +1943,41 @@ * @param taskVO */ private void setPromoterInfo(CustomerTaskVO taskVO) { - // 鍙戣捣浜哄簲涓轰笂涓�鑺傜偣鐨勫鐞嗕汉 - List<String> beforeNodeKey = taskCommonService.getBeforeNodeInfo(taskVO.getProcessDefId(), taskVO.getTaskDefinitionKey()); - List<SysUser> userList = beforeNodeKey.stream().map(key -> { - List<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery() - .processInstanceId(taskVO.getProcessInsId()) - .taskDefinitionKey(key) - .orderByHistoricTaskInstanceStartTime() - .desc() - .list(); // 涔嬫墍浠ョ敤list鏄洜涓哄鏋滄煇涓换鍔¤椹冲洖杩囷紝涓斿鏋滆浠诲姟鍐嶆鎵ц鏃朵細鏈夊鏉℃暟鎹紝鍙栨渶鏂扮殑涓�鏉� - if (! CollectionUtils.isEmpty(historicTaskInstances)) { - // 瀹為檯棰嗗彇杩欎釜浠诲姟鐨勪汉锛屼篃灏辨槸澶勭悊浜� - String assignee = historicTaskInstances.get(0).getAssignee(); - SysUser startUser = sysUserService.selectUserById(Long.parseLong(assignee)); - return startUser; - } else { - return null; - } - }).filter(user -> Objects.nonNull(user)).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(userList)) { - taskVO.setPromoterName("鏆傛棤"); - taskVO.setPromoterUnitName("鏆傛棤"); - } else { - taskVO.setPromoterId(userList.stream().map(user -> { return user.getUserId() + ""; }).collect(Collectors.joining("銆�"))); - taskVO.setPromoterName(userList.stream().map(user -> { return user.getNickName(); }).collect(Collectors.joining("銆�"))); - taskVO.setPromoterUnitId(userList.stream().filter(user -> Objects.nonNull(user.getDept())).map(user -> { return user.getDept().getDeptId() + "";}).collect(Collectors.joining("銆�"))); - taskVO.setPromoterUnitName(userList.stream().filter(user -> Objects.nonNull(user.getDept())).map(user -> { return user.getDept().getDeptName() + "";}).collect(Collectors.joining("銆�"))); - } +// // 鍙戣捣浜哄簲涓轰笂涓�鑺傜偣鐨勫鐞嗕汉 +// List<String> beforeNodeKey = taskCommonService.getBeforeNodeInfo(taskVO.getProcessDefId(), taskVO.getTaskDefinitionKey()); +// List<SysUser> userList = beforeNodeKey.stream().map(key -> { +// List<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery() +// .processInstanceId(taskVO.getProcessInsId()) +// .taskDefinitionKey(key) +// .orderByHistoricTaskInstanceStartTime() +// .desc() +// .list(); // 涔嬫墍浠ョ敤list鏄洜涓哄鏋滄煇涓换鍔¤椹冲洖杩囷紝涓斿鏋滆浠诲姟鍐嶆鎵ц鏃朵細鏈夊鏉℃暟鎹紝鍙栨渶鏂扮殑涓�鏉� +// if (!CollectionUtils.isEmpty(historicTaskInstances)) { +// // 瀹為檯棰嗗彇杩欎釜浠诲姟鐨勪汉锛屼篃灏辨槸澶勭悊浜� +// String assignee = historicTaskInstances.get(0).getAssignee(); +// SysUser startUser = sysUserService.selectUserById(Long.parseLong(assignee)); +// return startUser; +// } else { +// return null; +// } +// }).filter(user -> Objects.nonNull(user)).collect(Collectors.toList()); +// if (CollectionUtils.isEmpty(userList)) { +// taskVO.setPromoterName("鏆傛棤"); +// taskVO.setPromoterUnitName("鏆傛棤"); +// } else { +// taskVO.setPromoterId(userList.stream().map(user -> { +// return user.getUserId() + ""; +// }).collect(Collectors.joining("銆�"))); +// taskVO.setPromoterName(userList.stream().map(user -> { +// return this.getUserShowName(user); +// }).collect(Collectors.joining("銆�"))); +// taskVO.setPromoterUnitId(userList.stream().filter(user -> Objects.nonNull(user.getDept())).map(user -> { +// return user.getDept().getDeptId() + ""; +// }).collect(Collectors.joining("銆�"))); +// taskVO.setPromoterUnitName(userList.stream().filter(user -> Objects.nonNull(user.getDept())).map(user -> { +// return user.getDept().getDeptName() + ""; +// }).collect(Collectors.joining("銆�"))); +// } } /** -- Gitblit v1.8.0