Browse Source

经理审批支持多人

master
han\hanst 4 weeks ago
parent
commit
53e3260cb4
  1. 40
      src/main/java/com/xujie/sys/modules/erf/service/impl/ErfExpApplyServiceImpl.java

40
src/main/java/com/xujie/sys/modules/erf/service/impl/ErfExpApplyServiceImpl.java

@ -1011,33 +1011,53 @@ public class ErfExpApplyServiceImpl extends ServiceImpl<ErfExpApplyMapper, ErfEx
return false;
}
// 获取最大attempt_no当前轮次
// 修复并发审批bug统计当前轮次所有审批人的状态
// 问题原因多个审批人的attempt_no不同1,2,3...原代码只统计最大attempt_no会漏掉其他审批人
// 例如Tony(attempt_no=1)和Charles(attempt_no=2)原代码只统计Charles导致Tony审批被忽略
// 解决方案找到当前批次的最小attempt_no统计从最小到最大范围内的所有活动节点
int prodMaxAttemptNo = prodInstances.get(0).getAttemptNo();
int qualityMaxAttemptNo = qualityInstances.get(0).getAttemptNo();
// 统计生产经理审批状态
// 找到当前批次的起始attempt_no最小的"待审核"节点如果没有则用最大的"已批准"节点
int prodMinAttemptNo = prodInstances.stream()
.filter(inst -> "待审核".equals(inst.getStatus()))
.mapToInt(ErfFlowNodeInstance::getAttemptNo)
.min()
.orElse(prodMaxAttemptNo);
int qualityMinAttemptNo = qualityInstances.stream()
.filter(inst -> "待审核".equals(inst.getStatus()))
.mapToInt(ErfFlowNodeInstance::getAttemptNo)
.min()
.orElse(qualityMaxAttemptNo);
log.info("当前批次范围 - 生产经理: attempt_no [{}-{}], 质量经理: attempt_no [{}-{}]",
prodMinAttemptNo, prodMaxAttemptNo, qualityMinAttemptNo, qualityMaxAttemptNo);
// 统计生产经理审批状态当前批次的所有节点attempt_no在[min, max]范围内
long prodTotal = prodInstances.stream()
.filter(inst -> inst.getAttemptNo() == prodMaxAttemptNo)
.filter(inst -> inst.getAttemptNo() >= prodMinAttemptNo && inst.getAttemptNo() <= prodMaxAttemptNo)
.count();
long prodApproved = prodInstances.stream()
.filter(inst -> inst.getAttemptNo() == prodMaxAttemptNo)
.filter(inst -> inst.getAttemptNo() >= prodMinAttemptNo && inst.getAttemptNo() <= prodMaxAttemptNo)
.filter(inst -> "已批准".equals(inst.getStatus()))
.count();
long prodRejected = prodInstances.stream()
.filter(inst -> inst.getAttemptNo() == prodMaxAttemptNo)
.filter(inst -> inst.getAttemptNo() >= prodMinAttemptNo && inst.getAttemptNo() <= prodMaxAttemptNo)
.filter(inst -> "已驳回".equals(inst.getStatus()))
.count();
// 统计质量经理审批状态
// 统计质量经理审批状态当前批次的所有节点attempt_no在[min, max]范围内
long qualityTotal = qualityInstances.stream()
.filter(inst -> inst.getAttemptNo() == qualityMaxAttemptNo)
.filter(inst -> inst.getAttemptNo() >= qualityMinAttemptNo && inst.getAttemptNo() <= qualityMaxAttemptNo)
.count();
long qualityApproved = qualityInstances.stream()
.filter(inst -> inst.getAttemptNo() == qualityMaxAttemptNo)
.filter(inst -> inst.getAttemptNo() >= qualityMinAttemptNo && inst.getAttemptNo() <= qualityMaxAttemptNo)
.filter(inst -> "已批准".equals(inst.getStatus()))
.count();
long qualityRejected = qualityInstances.stream()
.filter(inst -> inst.getAttemptNo() == qualityMaxAttemptNo)
.filter(inst -> inst.getAttemptNo() >= qualityMinAttemptNo && inst.getAttemptNo() <= qualityMaxAttemptNo)
.filter(inst -> "已驳回".equals(inst.getStatus()))
.count();

Loading…
Cancel
Save