feat: scc流程所有审批

This commit is contained in:
2024-07-15 15:17:15 +08:00
parent f337505137
commit 11557c27b8
2 changed files with 82 additions and 3 deletions
@@ -24,6 +24,8 @@ public class ProcessStandardComplianceCheckConstants {
public static final String SENIOR_MANAGER = "seniorManager";
/** 未分配数量 */
public static final String UNALLOCATED_QUANTITY = "unallocatedQuantity";
/** 主表Id */
public static final String CHECK_ID = "checkId";
/**
* 法规工程师发起
@@ -2,6 +2,7 @@ package com.jero.modules.activiti.process.standardComplianceCheck.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jero.common.constant.enums.YesOrNoEnum;
@@ -40,6 +41,7 @@ import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.http.entity.ContentType;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.entity.ImportParams;
@@ -50,7 +52,9 @@ import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static com.jero.modules.activiti.common.ActivitiCommon.DISTRIBUTE;
@@ -156,6 +160,8 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl<Proce
ProcessStandardComplianceCheck standardInfo = businessInfoDTO.getStandardInfo();
standardInfo.setProcessInstanceId(processInstanceId);
save(standardInfo);
// 给流程中设置主表流程变量Id
runtimeService.setVariable(processInstanceId, CHECK_ID, standardInfo.getId());
// 子表设置流程实例Id
List<ProcessStandardComplianceCheckDetail> detailInfoList = businessInfoDTO.getDetailInfoList();
detailInfoList.forEach(detail -> {
@@ -194,7 +200,18 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl<Proce
switch (xmlNodeId) {
case MAIN_CHECK_USER_DISTRIBUTE:
case MAIN_CHECK_USER_REDISTRIBUTE:
runtimeService.setVariable(processInstanceId, PASS, false);
break;
case DESIGNER_ENGINEER_EVALUATION:
// 获取数据 将设计师字段设置为null
ProcessInfoVO<ProcessSccVO> handleData = this.getHandleData(taskId);
List<ProcessStandardComplianceCheckDetail> detailInfoList = handleData.getBusinessInfoDTO().getDetailInfoList();
List<String> ids = detailInfoList.stream().map(ProcessStandardComplianceCheckDetail::getId).collect(Collectors.toList());
LambdaUpdateWrapper<ProcessStandardComplianceCheckDetail> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.in(ProcessStandardComplianceCheckDetail::getId, ids);
updateWrapper.set(ProcessStandardComplianceCheckDetail::getDesignEngineer, null);
updateWrapper.set(ProcessStandardComplianceCheckDetail::getProcessInstanceId, null);
sccDetailService.update(updateWrapper);
runtimeService.setVariable(processInstanceId, PASS, false);
break;
case MAIN_CHECK_USER_APPROVAL:
@@ -246,10 +263,38 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl<Proce
boolean distributeFlag = businessInfoDTO.getStandardInfo().getDistributeFlag().equals(YesOrNoEnum.YES.getValue());
int unallocatedQuantity = 0;
if (distributeFlag) {
// 筛选出本次提交分发出的数据
List<ProcessStandardComplianceCheckDetail> distributeDetailList = detailInfoList.stream()
.filter(e -> StrUtil.isNotBlank(e.getDesignEngineer()))
.collect(Collectors.toList());
List<String> ids = distributeDetailList.stream().map(ProcessStandardComplianceCheckDetail::getId).collect(Collectors.toList());
// 分发需要设置未分发数据条数
unallocatedQuantity = (int) detailInfoList.stream().filter(e -> StrUtil.isBlank(e.getDesignEngineer())).count();
unallocatedQuantity = distributeDetailList.size();
// 去重找到所有设计师
List<String> designEngineerList = detailInfoList.stream().map(ProcessStandardComplianceCheckDetail::getDesignEngineer).distinct().collect(Collectors.toList());
List<String> designEngineerList = distributeDetailList.stream()
.map(ProcessStandardComplianceCheckDetail::getDesignEngineer)
.distinct()
.flatMap(engineer -> Arrays.stream(engineer.split(",")))
.collect(Collectors.toList());
// 分发给多个人的需要复制数据并保存
List<ProcessStandardComplianceCheckDetail> needAddDetailInfoList = new ArrayList<>();
distributeDetailList.forEach(detail -> {
String[] engineers = detail.getDesignEngineer().split(",");
for (String engineer : engineers) {
ProcessStandardComplianceCheckDetail newDetail = new ProcessStandardComplianceCheckDetail();
try {
BeanUtils.copyProperties(detail, newDetail);
} catch (IllegalAccessException | InvocationTargetException e) {
log.error("BeanUtils.copyProperties error", e);
throw new JeroBootException(e);
}
newDetail.setDesignEngineer(engineer);
needAddDetailInfoList.add(newDetail);
}
});
// 先删后增
sccDetailService.removeByIds(ids);
sccDetailService.saveBatch(needAddDetailInfoList);
runtimeService.setVariable(processInstanceId, DESIGNER_LIST, designEngineerList);
} else {
// 不分发直接设置后续审批节点的人员变量
@@ -309,6 +354,30 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl<Proce
case DEPT_USER_DISTRIBUTE:
case MAIN_CHECK_USER_DISTRIBUTE:
processSccVO.setStandardInfo(scc);
// 过滤出未分发的数据
detailList = detailList.stream().filter(detail -> StrUtil.isBlank(detail.getProcessInstanceId())).collect(Collectors.toList());
// TODO 根据条款号/条款标题/条款内容/车型去重并删除重复的数据
// 定义一个比较器,用于根据指定的属性判断两个对象是否相等(即认为它们是重复的)
Comparator<ProcessStandardComplianceCheckDetail> comparator = Comparator.comparing(ProcessStandardComplianceCheckDetail::getTermNumber)
.thenComparing(ProcessStandardComplianceCheckDetail::getTermTitle)
.thenComparing(ProcessStandardComplianceCheckDetail::getTermContent)
.thenComparing(ProcessStandardComplianceCheckDetail::getModel);
Map<ProcessStandardComplianceCheckDetail, Long> counts = detailList.stream()
.filter(Objects::nonNull) // 确保非空处理
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
// 筛选出出现超过一次(即重复的)的条目
List<ProcessStandardComplianceCheckDetail> duplicates = counts.entrySet().stream()
.filter(entry -> entry.getValue() > 1)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
// 从重复的条目中提取ID
List<String> duplicateIds = duplicates.stream()
.map(ProcessStandardComplianceCheckDetail::getId)
.distinct()
.collect(Collectors.toList());
processSccVO.setDetailInfoList(detailList);
break;
case MAIN_CHECK_USER_COLLECT:
@@ -336,11 +405,13 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl<Proce
variables.put(ActivitiCommon.MAIN_INSTANCE_ID, mainInstanceId != null ? mainInstanceId : processInstanceId);
variables.put(ActivitiCommon.PARENT_TASK_ID, taskId);
String mainCheckUser = (String) delegateTask.getVariable(MAIN_CHECK_USER);
LambdaUpdateWrapper<ProcessStandardComplianceCheckDetail> wrapper = new LambdaUpdateWrapper<>();
switch (taskDefinitionKey) {
//主排查人分批下发后自动任务
case AUTO_TASK_1:
case AUTO_TASK_3:
List<String> designerList = (List<String>) delegateTask.getVariable(DESIGNER_LIST);
String checkId = (String) delegateTask.getVariable(CHECK_ID);
for (String designer : designerList) {
userInfoMap.put(DESIGNER, designer);
userInfoMap.put(MAIN_CHECK_USER, mainCheckUser);
@@ -352,7 +423,13 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl<Proce
processInfoVO.setProcessVariables(variables);
processInfoVO.setUserInfoMap(userInfoMap);
processHandleService.startChildrenProcess(processInfoVO);
String childPrcId = processHandleService.startChildrenProcess(processInfoVO);
// 更新子表数据,将数据绑定给子流程
wrapper.eq(ProcessStandardComplianceCheckDetail::getCheckId, checkId);
wrapper.isNull(ProcessStandardComplianceCheckDetail::getDesignEngineer);
wrapper.set(ProcessStandardComplianceCheckDetail::getDesignEngineer, designer);
wrapper.set(ProcessStandardComplianceCheckDetail::getProcessInstanceId, childPrcId);
sccDetailService.update(wrapper);
}
break;
//设计工程师驳回后自动任务