From 4cd516ce7b518561769e6af1791b6285a6b224a3 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期二, 11 二月 2025 14:01:23 +0800
Subject: [PATCH] 审核按钮直接通过主管部门控制
---
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java | 446 +++++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 413 insertions(+), 33 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 e89024f..6a3e6b7 100644
--- a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -1,35 +1,36 @@
package com.ycl.service.impl;
-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.constant.ProcessOverTimeConstants;
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.FlowLogEventTypeEnum;
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.utils.SecurityUtils;
import com.ycl.constant.TaskTypeConstant;
-import com.ycl.domain.dto.FlowTaskDto;
-import com.ycl.domain.entity.FlowLog;
+import com.ycl.domain.entity.ProcessCoding;
import com.ycl.domain.entity.ProjectInfo;
import com.ycl.domain.entity.ProjectProcess;
-import com.ycl.domain.form.RejectTaskForm;
+import com.ycl.domain.entity.SysForm;
import com.ycl.domain.form.TaskDelegationForm;
-import com.ycl.domain.json.TaskDelegateData;
+import com.ycl.domain.form.TaskJumpForm;
+import com.ycl.domain.json.DelegateData;
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.FlowLogService;
+import com.ycl.service.IFlowTaskService;
+import com.ycl.service.ISysFormService;
+import com.ycl.service.ProcessCodingService;
import com.ycl.service.ProjectProcessService;
import com.ycl.common.base.Result;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -51,18 +52,15 @@
import org.flowable.identitylink.api.IdentityLink;
import org.flowable.identitylink.api.IdentityLinkInfo;
import org.flowable.identitylink.api.IdentityLinkType;
-import org.flowable.identitylink.api.history.HistoricIdentityLink;
import org.flowable.identitylink.service.impl.persistence.entity.IdentityLinkEntityImpl;
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.context.ApplicationEventPublisher;
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 org.springframework.util.CollectionUtils;
import java.util.*;
@@ -89,7 +87,10 @@
private final ISysRoleService sysRoleService;
private final ISysDeptService sysDeptService;
private final TaskCommonService taskCommonService;
- private final FlowLogService flowLogService;
+ private final IFlowTaskService flowTaskService;
+ private final ISysFormService formService;
+ private final ProcessCodingService processCodingService;
+ private final ApplicationEventPublisher publisher;
/**
* 鍒嗛〉鏌ヨ
@@ -100,13 +101,14 @@
@Override
public Result page(ProjectProcessQuery query) {
IPage<ProjectProcessVO> page = PageUtil.getPage(query, ProjectProcessVO.class);
- baseMapper.getPage(page, query);
+ baseMapper.getPage(query, page);
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());
vo.setFlowableProcessName(processDefinition.getName() + "(v" + processDefinition.getVersion() + ")");
+ vo.setDeployId(processDefinition.getDeploymentId());
}
}
}
@@ -144,6 +146,7 @@
.set(ProjectProcess::getProcessDefId, form.getProcessDefId())
.set(ProjectProcess::getProcessInsId, processInsId)
.update();
+
return Result.ok("娴佺▼鍙樻洿鎴愬姛");
}
@@ -186,7 +189,8 @@
SysUser sysUser = SecurityUtils.getLoginUser().getUser();
identityService.setAuthenticatedUserId(sysUser.getUserId().toString());
variables.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId());
-
+ //娴嬭瘯瀹圭己
+ variables.put("miss",true);
// 灏嗚椤圭洰鐨勭敵璇蜂汉锛堜笟涓绘柟锛変綔涓烘祦绋嬩腑鏌愪簺鐜妭鐨勫鐞嗕汉
variables.put(ProcessConstants.DATA_LAUNCH, project.getCreateBy());
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, projectId + "", variables);
@@ -229,6 +233,9 @@
taskStatistics.setTotalTaskNum(this.getTotalTaskNum(processDefId));
taskStatistics.setTodoTaskNum(this.getTodoTaskNum(projectProcess.getProcessInsId()));
taskStatistics.setRemainingTaskNum(this.getRemainingTaskNum(processDefId, projectProcess.getProcessInsId(), taskStatistics.getTotalTaskNum()));
+ taskStatistics.setTimelyFinishedTaskNum(this.getTimelyTaskNum(projectProcess.getProcessInsId()));
+ taskStatistics.setOvertimeTaskNum(this.getOvertimeTaskNum(projectProcess.getProcessInsId()));
+ taskStatistics.setWillOvertimeTaskNum(this.getWillOvertimeTaskNum(projectProcess.getProcessInsId()));
// taskStatistics.setCurrentTask(this.getCurrentNodeTaskList(projectProcess.getProcessInstanceId()));
detail.setStatistics(taskStatistics);
@@ -263,6 +270,15 @@
case TaskTypeConstant.REMAINING:
this.getRemainingTask(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);
+ break;
+ case TaskTypeConstant.OVERTIME:
+ this.getOvertimeTask(query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getCurrentPage(), (int) query.getPageSize(), ok);
+ break;
+ case TaskTypeConstant.WILL_OVER_TIME:
+ this.getWillOvertimeTask(query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getCurrentPage(), (int) query.getPageSize(), ok);
+ break;
default:
break;
@@ -279,6 +295,14 @@
if (StringUtils.isNotBlank(taskName)) {
taskQuery.processDefinitionNameLike(taskName);
+ }
+ if (! SecurityUtils.getLoginUser().getUser().isAdmin()) {
+ taskQuery
+ .or()
+ .taskCandidateGroupIn(taskCommonService.getCurrentUserGroups())
+ .taskCandidateUser(SecurityUtils.getUserId() + "")
+ .taskAssignee(SecurityUtils.getUserId() + "")
+ .endOr();
}
result.total(taskQuery.count());
List<Task> taskList = taskQuery.listPage(pageSize * (pageNum - 1), pageSize);
@@ -306,6 +330,8 @@
if (Objects.nonNull(project)) {
taskVO.setProjectId(project.getId());
taskVO.setProjectName(project.getProjectName());
+ } else {
+ continue;
}
// 娴佺▼鍙戣捣浜轰俊鎭�
@@ -319,6 +345,10 @@
// 娴佺▼澶勭悊浜轰俊鎭�
List<IdentityLink> identityLinks = taskService.getIdentityLinksForTask(task.getId());
+// Boolean aboutMe = taskCommonService.taskAboutMe(identityLinks);
+// if (! aboutMe) {
+// continue;
+// }
for (IdentityLinkInfo identityLink : identityLinks) {
// 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂�
if (StringUtils.isNotBlank(identityLink.getUserId())) {
@@ -360,6 +390,9 @@
taskVO.setHandlerUnitId(handlerUnitIds);
taskVO.setHandlerUnitName(handlerUnitNames);
vos.add(taskVO);
+ }
+ if (vos.size() < pageSize) {
+ result.total(vos.size());
}
result.put("taskList", vos);
}
@@ -468,7 +501,7 @@
for (FlowElement flowElement : flowElements) {
if (flowElement instanceof UserTask && flowElement.getId().equals(task.getTaskDefinitionKey())) {
UserTask userTask = (UserTask) flowElement;
- needAuditing = taskCommonService.checkTaskNeedAuditing(userTask.getExtensionElements().get("properties"));
+ needAuditing = taskCommonService.checkHasExeProperty(userTask.getExtensionElements().get("properties"), ProcessConstants.EXTENSION_PROPERTY_NEED_AUDITING_TEXT);
break;
}
@@ -509,7 +542,7 @@
taskService.deleteCandidateGroup(task.getId(), identityLink.getGroupId());
}
}
- TaskDelegateData jsonData = new TaskDelegateData();
+ DelegateData jsonData = new DelegateData();
jsonData.setBeforeHandlerIds(beforeHandlerIds);
jsonData.setBeforeHandlerType(beforeHandlerType);
@@ -554,10 +587,32 @@
}
jsonData.setAfterHandlerIds(afterHandlerIds);
jsonData.setAfterHandlerType(form.getPeopleType());
- // 娣诲姞鏃ュ織
- flowLogService.add(task.getId(), task.getProcessInstanceId(), FlowLogEventTypeEnum.DELEGATE, form.getProjectId(), JSON.toJSONString(jsonData));
+ // 鍙戝竷杞姙浜嬩欢
+ publisher.publishEvent(new TaskLogEvent(this, form.getProjectId(), form.getProcessInsId(), task.getId(), ProcessLogEventTypeEnum.DELEGATE, jsonData));
return Result.ok("杞姙鎴愬姛");
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Result taskJump(TaskJumpForm form) {
+ 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));
+ // 鏌ュ嚭璇ヤ换鍔$粦瀹氱殑琛ㄥ崟
+
+ Map<String, Object> data = new HashMap<>(1);
+ if (StringUtils.isNotBlank(task.getFormKey())) {
+ SysForm sysForm = formService.selectSysFormById(Long.parseLong(task.getFormKey()));
+ if (Objects.nonNull(sysForm)) {
+ data.put(ProcessConstants.TASK_FORM_KEY, JSONObject.parseObject(sysForm.getFormContent()));
+ }
+ }
+ // 瀹屾垚浠诲姟
+ flowTaskService.completeSubmitForm(form.getTaskId(), data);
+ }
+ return Result.ok("鎿嶄綔鎴愬姛");
}
/**
@@ -657,13 +712,18 @@
// 鏈紑濮嬬殑浠诲姟锛屽叾鍏宠仈鐨勭敤鎴风粍杩欎簺閮藉彲浠ヤ粠UserTask涓嬁鍒帮紝鍥犱负鏈韩鏈紑濮嬬殑浠诲姟鏄病鏈塼ask鐨勶紝鎵�浠ヨ繖閲岀洿鎺ユ煡
if (StringUtils.isNotBlank(userTask.getAssignee())) {
vo.setHandlerType(HandlerTypeEnum.USER);
- 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());
+ // 澶勭悊鍙橀噺琛ㄨ揪寮�
+ if (userTask.getAssignee().contains(ProcessConstants.DATA_LAUNCH)) {
+ handlerNames.add(userTask.getAssignee());
+ } 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());
+ }
}
}
} else if (CollectionUtil.isNotEmpty(userTask.getCandidateGroups())) {
@@ -794,11 +854,19 @@
taskVO.setTaskName(task.getName());
taskVO.setTaskStatus(TaskStatusEnum.TODO);
// 娴佺▼瀹氫箟淇℃伅
- ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
- .processDefinitionId(task.getProcessDefinitionId())
- .singleResult();
- taskVO.setDeployId(pd.getDeploymentId());
- taskVO.setProcessName(pd.getName());
+ ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
+ String deployId = "";
+ String processName = "";
+ if (Objects.nonNull(process)) {
+ deployId = process.getDeploymentId();
+ processName = process.getProcessDefinitionName();
+ } else {
+ HistoricProcessInstance hisProcess = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
+ deployId = hisProcess.getDeploymentId();
+ processName = hisProcess.getProcessDefinitionName();
+ }
+ taskVO.setDeployId(deployId);
+ taskVO.setProcessName(processName);
taskVO.setProcessInsId(task.getProcessInstanceId());
taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey());
@@ -856,6 +924,313 @@
taskVO.setHandlerUnitId(handlerUnitIds);
taskVO.setHandlerUnitName(handlerUnitNames);
}
+ }
+
+ /**
+ * 缁熻鎸夋椂瀹屾垚鐨勪换鍔�
+ *
+ * @param processInsId 娴佺▼瀹炰緥id
+ * @return
+ */
+ private Long getTimelyTaskNum(String processInsId) {
+ // 鏌ュ嚭鏃堕棿姝e父鐨勪换鍔d
+ List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
+ .select(ProcessCoding::getTaskDefKey)
+ .eq(ProcessCoding::getProcessInsId, processInsId)
+ .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.NORMAL)
+ .list()
+ .stream()
+ .map(ProcessCoding::getTaskDefKey)
+ .collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(taskKeyList)) {
+ return 0L;
+ }
+ // 鏌ュ嚭鎵�鏈夊凡瀹屾垚鐨勪换鍔�
+ return historyService.createHistoricTaskInstanceQuery()
+ .processInstanceId(processInsId)
+ .finished()
+ .caseDefinitionKeyIn(taskKeyList)
+ .count();
+ }
+
+ /**
+ * 鏌ヨ鎸夋椂瀹屾垚鐨勪换鍔�
+ *
+ * @param processDefinitionId 娴佺▼瀹氫箟id
+ * @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) {
+ int startNum = pageSize * (pageNum - 1);
+ int endNum = startNum + pageSize;
+
+ // 鏌ュ嚭鏃堕棿姝e父鐨勪换鍔d
+ List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
+ .select(ProcessCoding::getTaskDefKey)
+ .eq(ProcessCoding::getProcessInsId, processInsId)
+ .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.NORMAL)
+ .list()
+ .stream()
+ .map(ProcessCoding::getTaskDefKey)
+ .collect(Collectors.toList());
+
+ List<HistoricTaskInstance> finishedTaskList = new ArrayList<>();
+ if (! CollectionUtils.isEmpty(taskKeyList)) {
+ // 鏌ュ嚭鎵�鏈夊凡瀹屾垚鐨勪换鍔�
+ finishedTaskList = historyService.createHistoricTaskInstanceQuery()
+ .processInstanceId(processInsId)
+ .finished()
+ .taskNameLike(taskName)
+ .caseDefinitionKeyIn(taskKeyList)
+ .includeIdentityLinks()
+ .list();
+ }
+
+ if (startNum >= finishedTaskList.size()) {
+ // 濡傛灉璧峰绱㈠紩瓒呭嚭浜嗗垪琛ㄧ殑澶у皬锛岃繑鍥炰竴涓┖鍒楄〃
+ return new ArrayList<>();
+ }
+ result.total(finishedTaskList.size());
+ int end = Math.min(endNum, finishedTaskList.size());
+ List<HistoricTaskInstance> pageFinishedTaskList = finishedTaskList.subList(startNum, end);
+ List<String> taskDefs = pageFinishedTaskList.stream().map(HistoricTaskInstance::getTaskDefinitionKey).collect(Collectors.toList());
+ Map<String, HistoricTaskInstance> keyMap = pageFinishedTaskList.stream().collect(Collectors.toMap(HistoricTaskInstance::getTaskDefinitionKey, his -> his));
+
+ // 寰楀埌鐩爣浠诲姟瀵瑰簲鐨勫畾涔�
+ List<UserTask> finishedUserTaskElement = this.getAllUserTaskElement(processDefinitionId).stream().filter(el -> taskDefs.contains(el.getId())).collect(Collectors.toList());
+ // 鏌ュ嚭娴佺▼
+
+ ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(processInsId).singleResult();
+ String deployId = "";
+ String processName = "";
+ if (Objects.nonNull(process)) {
+ deployId = process.getDeploymentId();
+ processName = process.getProcessDefinitionName();
+ } else {
+ HistoricProcessInstance hisProcess = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInsId).singleResult();
+ deployId = hisProcess.getDeploymentId();
+ processName = hisProcess.getProcessDefinitionName();
+ }
+
+ String finalDeployId = deployId;
+ String finalProcessName = processName;
+ List<CustomerTaskVO> vos = finishedUserTaskElement.stream().map(userTask -> {
+ CustomerTaskVO vo = new CustomerTaskVO();
+ vo.setProcessInsId(processInsId);
+ vo.setProcessDefId(processDefinitionId);
+ vo.setDeployId(finalDeployId);
+ vo.setTaskName(userTask.getName());
+ vo.setProcessName(finalProcessName);
+
+ // 涓�涓换鍔″彲鑳芥湁澶氫釜鍊欓�変汉/缁勶紝鎵�浠ラ渶瑕佷娇鐢╨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);
+
+ HistoricTaskInstance hisTask = keyMap.get(userTask.getId());
+ if (Objects.nonNull(hisTask)) {
+ vo.setTaskStatus(TaskStatusEnum.FINISHED);
+ // 濡傛灉鏄凡瀹屾垚鐨勶紝淇℃伅闇�瑕佸崟鐙祴鍊�
+ vo.setTaskId(hisTask.getId());
+ vo.setExecutionId(hisTask.getExecutionId());
+ vo.setCreateTime(hisTask.getStartTime());
+
+ // 鏌ヨ瀹為檯澶勭悊浜�
+ long handlerUserId = Long.parseLong(hisTask.getAssignee());
+ SysUser handlerUser = sysUserService.selectUserById(handlerUserId);
+ if (Objects.nonNull(handlerUser)) {
+ handlerIds.add(handlerUserId);
+ handlerNames.add(handlerUser.getNickName());
+ vo.setActualHandlerUserId(hisTask.getAssignee());
+ vo.setActualHandlerUserName(handlerUser.getNickName());
+ }
+ vo.setTaskDefinitionKey(hisTask.getTaskDefinitionKey());
+ this.setPromoterAndHandler(vo, hisTask.getIdentityLinks());
+ }
+ vo.setHandlerId(handlerIds);
+ vo.setHandlerName(handlerNames);
+ vo.setHandlerUnitId(handlerUnitIds);
+ vo.setHandlerUnitName(handlerUnitNames);
+ return vo;
+ }).collect(Collectors.toList());
+ result.data(vos);
+ return vos;
+ }
+
+
+ /**
+ * 缁熻瓒呮椂鐨勪换鍔℃暟
+ *
+ * @param processInsId 娴佺▼瀹炰緥id
+ * @return
+ */
+ private Long getOvertimeTaskNum(String processInsId) {
+ // 鏌ュ嚭鏃堕棿姝e父鐨勪换鍔d
+ List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
+ .select(ProcessCoding::getTaskDefKey)
+ .eq(ProcessCoding::getProcessInsId, processInsId)
+ .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.OVERTIME)
+ .list()
+ .stream()
+ .map(ProcessCoding::getTaskDefKey)
+ .collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(taskKeyList)) {
+ return 0L;
+ }
+ // 鏌ュ嚭鎵�鏈夊凡瀹屾垚鐨勪换鍔�
+ return taskService.createTaskQuery()
+ .processInstanceId(processInsId)
+ .caseDefinitionKeyIn(taskKeyList)
+ .count();
+ }
+
+ /**
+ * 鏌ヨ瓒呮椂鐨勪换鍔�
+ *
+ * @param processDefinitionId 娴佺▼瀹氫箟id
+ * @param processInsId 娴佺▼瀹炰緥id
+ * @param taskName 浠诲姟鍚嶇О--鎼滅储鏉′欢
+ * @param pageNum
+ * @param pageSize
+ * @param result
+ * @return
+ */
+ private List<CustomerTaskVO> getOvertimeTask(String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) {
+ int startNum = pageSize * (pageNum - 1);
+ int endNum = startNum + pageSize;
+
+ // 鏌ュ嚭鍗冲皢瓒呮椂鐨勪换鍔�
+ List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
+ .select(ProcessCoding::getTaskDefKey)
+ .eq(ProcessCoding::getProcessInsId, processInsId)
+ .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.OVERTIME)
+ .list()
+ .stream()
+ .map(ProcessCoding::getTaskDefKey)
+ .collect(Collectors.toList());
+
+ List<Task> taskList = new ArrayList<>();
+ // 鏌ュ嚭鎵�鏈夋鍦ㄥ鐞�(杩愯鏃�)鐨勪换鍔�
+ if (! CollectionUtils.isEmpty(taskKeyList)) {
+ taskList = taskService.createTaskQuery()
+ .processInstanceId(processInsId)
+ .taskNameLike(taskName)
+ .caseDefinitionKeyIn(taskKeyList)
+ .list();
+ }
+
+ if (startNum >= taskList.size()) {
+ // 濡傛灉璧峰绱㈠紩瓒呭嚭浜嗗垪琛ㄧ殑澶у皬锛岃繑鍥炰竴涓┖鍒楄〃
+ return new ArrayList<>();
+ }
+ result.total(taskList.size());
+ int end = Math.min(endNum, taskList.size());
+ List<Task> pageTaskList = taskList.subList(startNum, end);
+ List<String> taskDefs = pageTaskList.stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList());
+ Map<String, Task> keyMap = pageTaskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his));
+
+ // 寰楀埌鐩爣浠诲姟瀵瑰簲鐨勫畾涔�
+ List<UserTask> finishedUserTaskElement = this.getAllUserTaskElement(processDefinitionId).stream().filter(el -> taskDefs.contains(el.getId())).collect(Collectors.toList());
+
+ // 鏌ヨ浠诲姟鐩稿叧淇℃伅
+ List<CustomerTaskVO> vos = finishedUserTaskElement.stream().map(userTask -> {
+ Task task = keyMap.get(userTask.getId());
+ CustomerTaskVO vo = new CustomerTaskVO();
+ this.setRuntimeTaskInfo(task, vo);
+ return vo;
+ }).collect(Collectors.toList());
+ result.data(vos);
+ return vos;
+ }
+
+ /**
+ * 缁熻鍗冲皢瓒呮椂鐨勪换鍔℃暟
+ *
+ * @param processInsId 娴佺▼瀹炰緥id
+ * @return
+ */
+ private Long getWillOvertimeTaskNum(String processInsId) {
+ // 鏌ュ嚭鏃堕棿姝e父鐨勪换鍔d
+ List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
+ .select(ProcessCoding::getTaskDefKey)
+ .eq(ProcessCoding::getProcessInsId, processInsId)
+ .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.WILLOVERTIME)
+ .list()
+ .stream()
+ .map(ProcessCoding::getTaskDefKey)
+ .collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(taskKeyList)) {
+ return 0L;
+ }
+ // 鏌ュ嚭鎵�鏈夊凡瀹屾垚鐨勪换鍔�
+ return taskService.createTaskQuery()
+ .processInstanceId(processInsId)
+ .caseDefinitionKeyIn(taskKeyList)
+ .count();
+ }
+
+ /**
+ * 鏌ヨ鍗冲皢瓒呮椂鐨勪换鍔�
+ *
+ * @param processDefinitionId 娴佺▼瀹氫箟id
+ * @param processInsId 娴佺▼瀹炰緥id
+ * @param taskName 浠诲姟鍚嶇О--鎼滅储鏉′欢
+ * @param pageNum
+ * @param pageSize
+ * @param result
+ * @return
+ */
+ private List<CustomerTaskVO> getWillOvertimeTask(String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) {
+ int startNum = pageSize * (pageNum - 1);
+ int endNum = startNum + pageSize;
+
+ // 鏌ュ嚭鍗冲皢瓒呮椂鐨勪换鍔�
+ List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
+ .select(ProcessCoding::getTaskDefKey)
+ .eq(ProcessCoding::getProcessInsId, processInsId)
+ .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.WILLOVERTIME)
+ .list()
+ .stream()
+ .map(ProcessCoding::getTaskDefKey)
+ .collect(Collectors.toList());
+
+ List<Task> taskList = new ArrayList<>();
+ // 鏌ュ嚭鎵�鏈夋鍦ㄥ鐞�(杩愯鏃�)鐨勪换鍔�
+ if (! CollectionUtils.isEmpty(taskKeyList)) {
+ taskList = taskService.createTaskQuery()
+ .processInstanceId(processInsId)
+ .taskNameLike(taskName)
+ .caseDefinitionKeyIn(taskKeyList)
+ .list();
+ }
+
+ if (startNum >= taskList.size()) {
+ // 濡傛灉璧峰绱㈠紩瓒呭嚭浜嗗垪琛ㄧ殑澶у皬锛岃繑鍥炰竴涓┖鍒楄〃
+ return new ArrayList<>();
+ }
+ result.total(taskList.size());
+ int end = Math.min(endNum, taskList.size());
+ List<Task> pageTaskList = taskList.subList(startNum, end);
+ List<String> taskDefs = pageTaskList.stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList());
+ Map<String, Task> keyMap = pageTaskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his));
+
+ // 寰楀埌鐩爣浠诲姟瀵瑰簲鐨勫畾涔�
+ List<UserTask> finishedUserTaskElement = this.getAllUserTaskElement(processDefinitionId).stream().filter(el -> taskDefs.contains(el.getId())).collect(Collectors.toList());
+
+ // 鏌ヨ浠诲姟鐩稿叧淇℃伅
+ List<CustomerTaskVO> vos = finishedUserTaskElement.stream().map(userTask -> {
+ Task task = keyMap.get(userTask.getId());
+ CustomerTaskVO vo = new CustomerTaskVO();
+ this.setRuntimeTaskInfo(task, vo);
+ return vo;
+ }).collect(Collectors.toList());
+ result.data(vos);
+ return vos;
}
/**
@@ -926,6 +1301,11 @@
// 鏈紑濮嬬殑浠诲姟锛屽叾鍏宠仈鐨勭敤鎴风粍杩欎簺閮藉彲浠ヤ粠UserTask涓嬁鍒帮紝鍥犱负鏈韩鏈紑濮嬬殑浠诲姟鏄病鏈塼ask鐨勶紝鎵�浠ヨ繖閲岀洿鎺ユ煡
if (StringUtils.isNotBlank(userTask.getAssignee())) {
vo.setHandlerType(HandlerTypeEnum.USER);
+ // 澶勭悊鍙橀噺琛ㄨ揪寮�
+ if (userTask.getAssignee().contains(ProcessConstants.DATA_LAUNCH)) {
+ handlerNames.add(userTask.getAssignee());
+ continue;
+ }
SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee()));
if (Objects.nonNull(sysUser)) {
handlerIds.add(sysUser.getUserId());
@@ -997,7 +1377,7 @@
.processInstanceId(process.getProcessInstanceId())
.finished()
.list();
- long num = list.stream().map(HistoricTaskInstance::getTaskDefinitionId).distinct().count();
+ long num = list.stream().map(HistoricTaskInstance::getTaskDefinitionKey).distinct().count();
return totalNum - num;
}
--
Gitblit v1.8.0