fix(征求意见流程): 超过征求意见结束日期业务逻辑

This commit is contained in:
yjz
2024-02-01 13:47:50 +08:00
parent 5e79e1ac38
commit 978a9a15c3
5 changed files with 125 additions and 98 deletions
@@ -34,7 +34,6 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
import java.util.Objects;
/**
* @author liJiaRao
@@ -67,6 +66,7 @@ public class WorkCenterController {
queryWrapper.eq("par.user_id",userId);
queryWrapper.eq("par.finish_flag", FinishFlagEnum.INCOMPLETE.getValue());
queryWrapper.ne("pa.prc_status", ProcessStatusEnum.WITHDRAWN.getValue());
queryWrapper.ne("pa.prc_status", ProcessStatusEnum.COMPLETED.getValue());
Page<ProcessAll> page = new Page<>(pageNo, pageSize);
IPage<ProcessAll> todoList = processAllService.getTodoList(page, queryWrapper, req);
@@ -4,14 +4,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.jero.common.constant.enums.YesOrNoEnum;
import com.jero.modules.activiti.entity.ProcessApprovalRecord;
import com.jero.modules.activiti.enums.FinishFlagEnum;
import com.jero.modules.activiti.process.fb.common.ConsultationTaskKey;
import com.jero.modules.activiti.process.fb.common.FbCommon;
import com.jero.modules.activiti.process.fb.service.IProcessFbStandardConsultationService;
import com.jero.modules.activiti.process.fb.vo.NodeDispose;
import com.jero.modules.activiti.service.ProcessApprovalRecordService;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.*;
import org.apache.commons.collections4.CollectionUtils;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
@@ -47,7 +47,7 @@ public class DepartLeaderStartOverDueJob implements Job {
* @throws JobExecutionException
*/
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
public void execute(JobExecutionContext jobExecutionContext) {
log.info("征求意见流程-超过征求意见结束日期,各部所主管级领导 部分/全部 未分发时任务开始");
long num = 0L;
// 查询超过征求意见结束日期的各部所主管级领导未分发节点情况
@@ -64,16 +64,7 @@ public class DepartLeaderStartOverDueJob implements Job {
.in(ProcessApprovalRecord::getProcessInstanceId, processInstanceIdList)
.eq(ProcessApprovalRecord::getNodeId, ConsultationTaskKey.DEPART_LEADER_START_1)
.eq(ProcessApprovalRecord::getOverDue, YesOrNoEnum.NO.getValue())
.isNull(ProcessApprovalRecord::getEndTime));
for (ProcessApprovalRecord processApprovalRecord : processApprovalRecordList) {
num += 1;
// 设置网关条件
runtimeService.setVariableLocal(processApprovalRecord.getProcessInstanceId(),
FbCommon.VARIABLE_PASS_FIRST, "overDue");
// 完成任务
taskService.complete(processApprovalRecord.getTaskId());
}
.eq(ProcessApprovalRecord::getFinishFlag, FinishFlagEnum.INCOMPLETE.getValue()));
// 更新超期标识
if (!processApprovalRecordList.isEmpty()){
@@ -85,8 +76,18 @@ public class DepartLeaderStartOverDueJob implements Job {
.eq(ProcessApprovalRecord::getOverDue, YesOrNoEnum.NO.getValue())
.set(ProcessApprovalRecord::getOverDue, YesOrNoEnum.YES.getValue()));
}
for (ProcessApprovalRecord processApprovalRecord : processApprovalRecordList) {
num += 1;
// 设置网关条件
runtimeService.setVariableLocal(processApprovalRecord.getProcessInstanceId(),
FbCommon.VARIABLE_PASS_FIRST, 3);
// 完成任务
taskService.complete(processApprovalRecord.getTaskId());
}
}
log.info("征求意见流程-超过征求意见结束日期,各部所主管级领导 部分/全部 未分发时任务结束");
log.info("征求意见流程-超过征求意见结束日期, 任务数量{}", num);
log.info("征求意见流程-超过征求意见结束日期,任务数量{}", num);
}
}
@@ -2,17 +2,23 @@ package com.jero.modules.activiti.process.fb.job;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.jero.modules.activiti.entity.ProcessAll;
import com.jero.modules.activiti.entity.ProcessApprovalRecord;
import com.jero.modules.activiti.enums.FinishFlagEnum;
import com.jero.modules.activiti.enums.ProcessStatusEnum;
import com.jero.modules.activiti.process.fb.common.ConsultationTaskKey;
import com.jero.modules.activiti.process.fb.entity.ProcessFbConsultationList;
import com.jero.modules.activiti.process.fb.entity.ProcessFbConsultationUserLink;
import com.jero.modules.activiti.process.fb.entity.ProcessFbStandardConsultation;
import com.jero.modules.activiti.process.fb.service.IProcessFbConsultationListService;
import com.jero.modules.activiti.process.fb.service.IProcessFbConsultationUserLinkService;
import com.jero.modules.activiti.process.fb.service.IProcessFbStandardConsultationService;
import com.jero.modules.activiti.process.fb.vo.NodeDispose;
import com.jero.modules.activiti.service.ProcessAllService;
import com.jero.modules.activiti.service.ProcessApprovalRecordService;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.task.Task;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
@@ -21,7 +27,6 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@@ -45,7 +50,11 @@ public class DesignEngineerOverDueJob implements Job {
@Resource
private ProcessApprovalRecordService processApprovalRecordService;
@Resource
private ProcessAllService processAllService;
@Resource
private TaskService taskService;
@Resource
private RuntimeService runtimeService;
/**
* 征求意见流程-超过征求意见结束日期,存在设计师未提交意见时,直接流转到下一节点任务
@@ -55,59 +64,64 @@ public class DesignEngineerOverDueJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
log.info("征求意见流程-超过征求意见结束日期,存在设计师未提交意见时,直接流转到下一节点任务开始");
// 查询所有未完成的 设计工程师填写征求意见 节点
long num = 0L;
// 查询超过征求意见结束日期的设计工程师填写征求意见节点情况
List<String> designEngineerNodeList = Arrays.asList(ConsultationTaskKey.DESIGN_ENGINEER_1,
ConsultationTaskKey.DESIGN_ENGINEER_2);
List<ProcessApprovalRecord> nodeList = processApprovalRecordService.list(
new LambdaQueryWrapper<ProcessApprovalRecord>()
.in(ProcessApprovalRecord::getNodeId, designEngineerNodeList)
.isNull(ProcessApprovalRecord::getEndTime));
if (!nodeList.isEmpty()){
// 查询节点相关的流程的征求意见结束日期 < 当前日期的
List<String> projectIdList = nodeList.stream()
.map(ProcessApprovalRecord::getProjectId)
List<NodeDispose> nodeDisposeCount =
processFbStandardConsultationService.findNodeDisposeCount(
String.join(",", designEngineerNodeList));
if (!nodeDisposeCount.isEmpty()){
// 获取实例id
List<String> processInstanceIdList = nodeDisposeCount.stream()
.map(NodeDispose::getProcessInstanceId)
.collect(Collectors.toList());
List<ProcessFbStandardConsultation> fbStandardConsultationList = processFbStandardConsultationService.list(
new LambdaQueryWrapper<ProcessFbStandardConsultation>()
.in(ProcessFbStandardConsultation::getId, projectIdList)
.lt(ProcessFbStandardConsultation::getConsultationDueDate, new Date()));
if (!fbStandardConsultationList.isEmpty()){
List<String> idList = fbStandardConsultationList.stream()
.map(ProcessFbStandardConsultation::getId)
.collect(Collectors.toList());
// 过滤符合条件的待办
nodeList = nodeList.stream()
.filter(v -> idList.contains(v.getProjectId()))
.collect(Collectors.toList());
for (ProcessApprovalRecord processApprovalRecord : nodeList) {
// 获取流程信息
List<ProcessAll> processAllList = processAllService.list(new LambdaQueryWrapper<ProcessAll>()
.in(ProcessAll::getProcessInstanceId, processInstanceIdList)
.eq(ProcessAll::getPrcStatus, ProcessStatusEnum.INCOMPLETE.getValue()));
for (ProcessAll processAll : processAllList) {
// 查询节点待办信息
List<ProcessApprovalRecord> processApprovalRecordList = processApprovalRecordService.list(
new LambdaQueryWrapper<ProcessApprovalRecord>()
.eq(ProcessApprovalRecord::getProcessInstanceId, processAll.getProcessInstanceId())
.in(ProcessApprovalRecord::getNodeId, designEngineerNodeList)
.eq(ProcessApprovalRecord::getFinishFlag, FinishFlagEnum.INCOMPLETE.getValue()));
for (ProcessApprovalRecord processApprovalRecord : processApprovalRecordList) {
// 获取任务信息
Task task = taskService.createTaskQuery().taskId(processApprovalRecord.getTaskId()).singleResult();
String executionId = task.getExecutionId();
Execution execution = runtimeService.createExecutionQuery().executionId(executionId).singleResult();
String executionParentId = execution.getParentId();
// 查询用户关联表
ProcessFbConsultationUserLink userLink = processFbConsultationUserLinkService.getOne(
new LambdaQueryWrapper<ProcessFbConsultationUserLink>()
.eq(ProcessFbConsultationUserLink::getParentExecutionId, executionId)
.eq(ProcessFbConsultationUserLink::getParentExecutionId, executionParentId)
.eq(ProcessFbConsultationUserLink::getDesignEngineerId,
processApprovalRecord.getUserId())
.eq(ProcessFbConsultationUserLink::getBusinessId,
processApprovalRecord.getProjectId()));
processAll.getProjectId()));
if (!Objects.isNull(userLink)){
// 修改流程相关业务数据
LambdaUpdateWrapper<ProcessFbConsultationList> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(ProcessFbConsultationList::getBusinessId, processApprovalRecord.getProjectId());
updateWrapper.eq(ProcessFbConsultationList::getDesignEngineerId, userLink.getDesignEngineerId());
updateWrapper.eq(ProcessFbConsultationList::getBusinessId, processAll.getProjectId());
updateWrapper.eq(ProcessFbConsultationList::getDesignEngineerId,
processApprovalRecord.getUserId());
updateWrapper.eq(ProcessFbConsultationList::getUserLinkId, userLink.getId());
updateWrapper.set(ProcessFbConsultationList::getModificationBefore, null);
updateWrapper.set(ProcessFbConsultationList::getModificationAfter, null);
updateWrapper.set(ProcessFbConsultationList::getModificationReason, "无意见");
processFbConsultationListService.update(updateWrapper);
}
num += 1;
// 完成任务
taskService.complete(processApprovalRecord.getTaskId());
}
}
}
log.info("征求意见流程-超过征求意见结束日期,存在设计师未提交意见时,直接流转到下一节点任务开始");
log.info("征求意见流程-超过征求意见结束日期,存在设计师未提交意见时,任务数量{}", num);
}
}
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.jero.common.constant.enums.YesOrNoEnum;
import com.jero.modules.activiti.entity.ProcessApprovalRecord;
import com.jero.modules.activiti.enums.FinishFlagEnum;
import com.jero.modules.activiti.process.fb.common.ConsultationTaskKey;
import com.jero.modules.activiti.process.fb.common.FbCommon;
import com.jero.modules.activiti.process.fb.service.IProcessFbStandardConsultationService;
@@ -75,16 +76,7 @@ public class ModuleOwnerStartOverDueJob implements Job {
.in(ProcessApprovalRecord::getProcessInstanceId, processInstanceIdList)
.eq(ProcessApprovalRecord::getNodeId, ConsultationTaskKey.MODULE_OWNER_START)
.eq(ProcessApprovalRecord::getOverDue, YesOrNoEnum.NO.getValue())
.isNull(ProcessApprovalRecord::getEndTime));
for (ProcessApprovalRecord processApprovalRecord : processApprovalRecordList) {
num += 1;
// 设置网关条件
runtimeService.setVariableLocal(processApprovalRecord.getProcessInstanceId(),
FbCommon.OVER_DUE, true);
// 完成任务
taskService.complete(processApprovalRecord.getTaskId());
}
.eq(ProcessApprovalRecord::getFinishFlag, FinishFlagEnum.INCOMPLETE.getValue()));
// 更新超期标识
if (!processApprovalRecordList.isEmpty()){
@@ -96,8 +88,21 @@ public class ModuleOwnerStartOverDueJob implements Job {
.eq(ProcessApprovalRecord::getOverDue, YesOrNoEnum.NO.getValue())
.set(ProcessApprovalRecord::getOverDue, YesOrNoEnum.YES.getValue()));
}
for (ProcessApprovalRecord processApprovalRecord : processApprovalRecordList) {
num += 1;
// 设置网关条件
runtimeService.setVariableLocal(processApprovalRecord.getProcessInstanceId(),
FbCommon.OVER_DUE, true);
// 完成任务
try {
taskService.complete(processApprovalRecord.getTaskId());
}catch (Exception e){
log.error("{}处理失败!" + e.getMessage(), processApprovalRecord.getTaskId());
}
}
}
log.info("征求意见流程-超过征求意见结束日期,模块负责人 部分/全部 未分发时任务结束");
log.info("征求意见流程-超过征求意见结束日期, 任务数量{}", num);
log.info("征求意见流程-超过征求意见结束日期,任务数量{}", num);
}
}
@@ -595,50 +595,64 @@ public class ProcessFbStandardConsultationServiceImpl extends ServiceImpl<Proces
@Override
public void endOverDueBackLog(String id) {
// 未结束的流程
// 通过标准id查询未结束的业务数据
List<ProcessFbStandardConsultation> list = list(new LambdaQueryWrapper<ProcessFbStandardConsultation>()
.eq(ProcessFbStandardConsultation::getStandardId, id)
.isNull(ProcessFbStandardConsultation::getConsultationEndDate));
if (!list.isEmpty()){
// 超期节点
List<String> nodeIdList = Arrays.asList(ConsultationTaskKey.DEPART_LEADER_START_1, ConsultationTaskKey.MODULE_OWNER_START);
List<NodeDispose> nodeDisposeCount = findNodeDisposeCount(String.join(",", nodeIdList));
// 全部未完成
List<NodeDispose> allUnFinishedList = nodeDisposeCount.stream()
.filter(v -> v.getUnFinished().equals(v.getCount())).collect(Collectors.toList());
List<String> processInstanceId = allUnFinishedList.stream()
.map(NodeDispose::getProcessInstanceId).collect(Collectors.toList());
// 查询含有超期的待办
// 通过业务id查询未完成的相关流程信息
List<String> idList = list.stream().map(ProcessFbStandardConsultation::getId).collect(Collectors.toList());
List<ProcessApprovalRecord> processApprovalRecords = processApprovalRecordService.list(
new LambdaQueryWrapper<ProcessApprovalRecord>()
.in(ProcessApprovalRecord::getProjectId, idList)
.in(ProcessApprovalRecord::getProcessInstanceId , processInstanceId)
.eq(ProcessApprovalRecord::getOverDue, YesOrNoEnum.YES.getValue()));
// 结束流程
for (ProcessApprovalRecord processApprovalRecord : processApprovalRecords) {
runtimeService.deleteProcessInstance(processApprovalRecord.getProcessInstanceId(),"结束流程");
//更新流程总表状态
processAllService.update(new LambdaUpdateWrapper<ProcessAll>()
.eq(ProcessAll::getProjectId, processApprovalRecord.getProjectId())
.set(ProcessAll::getPrcStatus, ProcessStatusEnum.COMPLETED.getValue()));
}
List<ProcessAll> processAllList = processAllService.list(
new LambdaQueryWrapper<ProcessAll>()
.in(ProcessAll::getProjectId, idList)
.eq(ProcessAll::getPrcStatus, ProcessStatusEnum.INCOMPLETE.getValue()));
if (!processAllList.isEmpty()){
// 获取流程实例id
List<String> processInstanceIdList = processAllList.stream()
.map(ProcessAll::getProcessInstanceId).collect(Collectors.toList());
if (!processApprovalRecords.isEmpty()){
List<String> processApprovalRecordIdList = processApprovalRecords.stream().map(ProcessApprovalRecord::getId).collect(Collectors.toList());
//清除超期标识
processApprovalRecordService.update(
new LambdaUpdateWrapper<ProcessApprovalRecord>()
.in(ProcessApprovalRecord::getId, processApprovalRecordIdList)
.eq(ProcessApprovalRecord::getOverDue, YesOrNoEnum.YES.getValue())
.set(ProcessApprovalRecord::getOverDue, YesOrNoEnum.NO.getValue()));
// 处理各部所主管级领导分发
manageOverDue(processAllList, processInstanceIdList, ConsultationTaskKey.DEPART_LEADER_START_1);
// 处理模块负责人分发
manageOverDue(processAllList, processInstanceIdList, ConsultationTaskKey.MODULE_OWNER_START);
}
}
}
private void manageOverDue(List<ProcessAll> processAllList, List<String> processInstanceIdList, String nodeIds) {
List<NodeDispose> nodeDisposeCount = findNodeDisposeCount(nodeIds);
// 过滤每个流程这两个节点全部未完成的流程实例
List<NodeDispose> allUnFinishedList = nodeDisposeCount.stream()
.filter(v -> v.getUnFinished().equals(v.getCount())).collect(Collectors.toList());
List<String> processInstanceIds = allUnFinishedList.stream()
.map(NodeDispose::getProcessInstanceId).collect(Collectors.toList());
// 取交集
List<String> intersectionProcessInstanceIdList =
(List<String>) CollectionUtils.intersection(processInstanceIdList, processInstanceIds);
Date date = new Date();
for (String processInstanceId: intersectionProcessInstanceIdList) {
// 结束流程
runtimeService.deleteProcessInstance(processInstanceId,"结束流程");
//更新流程总表状态
processAllService.update(new LambdaUpdateWrapper<ProcessAll>()
.eq(ProcessAll::getProcessInstanceId, processInstanceId)
.set(ProcessAll::getPrcStatus, ProcessStatusEnum.COMPLETED.getValue()));
Optional<ProcessAll> optionalProcessAll = processAllList.stream()
.filter(v -> v.getProcessInstanceId().equals(processInstanceId)).findFirst();
optionalProcessAll.ifPresent(v ->
// 更新业务状态
update(new LambdaUpdateWrapper<ProcessFbStandardConsultation>()
.eq(ProcessFbStandardConsultation::getId, optionalProcessAll.get().getProjectId())
.set(ProcessFbStandardConsultation::getConsultationEndDate, date)
.set(ProcessFbStandardConsultation::getUpdateTime, date))
);
}
}
/**
* @Author: liao
* @Date: 2023/11/13 16:00
@@ -730,13 +744,6 @@ public class ProcessFbStandardConsultationServiceImpl extends ServiceImpl<Proces
} catch (Exception e) {
log.error("邮件发送失败!" + e.getMessage());
}
// 清除超期待办
processApprovalRecordService.update(
new LambdaUpdateWrapper<ProcessApprovalRecord>()
.eq(ProcessApprovalRecord::getProcessInstanceId, processInstanceId)
.eq(ProcessApprovalRecord::getOverDue, YesOrNoEnum.YES.getValue())
.set(ProcessApprovalRecord::getOverDue, YesOrNoEnum.NO.getValue()));
} else {
List<Task> taskList = taskService.createTaskQuery().processInstanceId(processInstanceId).list();
log.info("还剩 {} 个任务待完成", taskList.size());
@@ -1050,7 +1057,7 @@ public class ProcessFbStandardConsultationServiceImpl extends ServiceImpl<Proces
linkList.add(link);
});
processFbConsultationUserLinkService.saveBatch(linkList, linkList.size());
variables.put(FbCommon.VARIABLE_PASS_FIRST, true);
variables.put(FbCommon.VARIABLE_PASS_FIRST, 1);
variables.put(FbCommon.VARIABLE_MODULE_OWNER_LIST, moduleOwnerIds);
saveNodeUserLink(processInstanceId, ConsultationNodeSort.MODULE_OWNER_LIST, moduleOwnerIds, taskDefinitionKey);
} else { // 设计工程师
@@ -1067,7 +1074,7 @@ public class ProcessFbStandardConsultationServiceImpl extends ServiceImpl<Proces
linkList.add(link);
});
processFbConsultationUserLinkService.saveBatch(linkList, linkList.size());
variables.put(FbCommon.VARIABLE_PASS_FIRST, false);
variables.put(FbCommon.VARIABLE_PASS_FIRST, 2);
variables.put(FbCommon.VARIABLE_DESIGN_ENGINEER_LIST, designEngineerIds);
saveNodeUserLink(processInstanceId, ConsultationNodeSort.DESIGN_ENGINEER_LIST, designEngineerIds, taskDefinitionKey);
}