|
|
@ -1011,33 +1011,53 @@ public class ErfExpApplyServiceImpl extends ServiceImpl<ErfExpApplyMapper, ErfEx |
|
|
return false; |
|
|
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 prodMaxAttemptNo = prodInstances.get(0).getAttemptNo(); |
|
|
int qualityMaxAttemptNo = qualityInstances.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() |
|
|
long prodTotal = prodInstances.stream() |
|
|
.filter(inst -> inst.getAttemptNo() == prodMaxAttemptNo) |
|
|
|
|
|
|
|
|
.filter(inst -> inst.getAttemptNo() >= prodMinAttemptNo && inst.getAttemptNo() <= prodMaxAttemptNo) |
|
|
.count(); |
|
|
.count(); |
|
|
long prodApproved = prodInstances.stream() |
|
|
long prodApproved = prodInstances.stream() |
|
|
.filter(inst -> inst.getAttemptNo() == prodMaxAttemptNo) |
|
|
|
|
|
|
|
|
.filter(inst -> inst.getAttemptNo() >= prodMinAttemptNo && inst.getAttemptNo() <= prodMaxAttemptNo) |
|
|
.filter(inst -> "已批准".equals(inst.getStatus())) |
|
|
.filter(inst -> "已批准".equals(inst.getStatus())) |
|
|
.count(); |
|
|
.count(); |
|
|
long prodRejected = prodInstances.stream() |
|
|
long prodRejected = prodInstances.stream() |
|
|
.filter(inst -> inst.getAttemptNo() == prodMaxAttemptNo) |
|
|
|
|
|
|
|
|
.filter(inst -> inst.getAttemptNo() >= prodMinAttemptNo && inst.getAttemptNo() <= prodMaxAttemptNo) |
|
|
.filter(inst -> "已驳回".equals(inst.getStatus())) |
|
|
.filter(inst -> "已驳回".equals(inst.getStatus())) |
|
|
.count(); |
|
|
.count(); |
|
|
|
|
|
|
|
|
// 统计质量经理审批状态 |
|
|
|
|
|
|
|
|
// 统计质量经理审批状态(当前批次的所有节点:attempt_no在[min, max]范围内) |
|
|
long qualityTotal = qualityInstances.stream() |
|
|
long qualityTotal = qualityInstances.stream() |
|
|
.filter(inst -> inst.getAttemptNo() == qualityMaxAttemptNo) |
|
|
|
|
|
|
|
|
.filter(inst -> inst.getAttemptNo() >= qualityMinAttemptNo && inst.getAttemptNo() <= qualityMaxAttemptNo) |
|
|
.count(); |
|
|
.count(); |
|
|
long qualityApproved = qualityInstances.stream() |
|
|
long qualityApproved = qualityInstances.stream() |
|
|
.filter(inst -> inst.getAttemptNo() == qualityMaxAttemptNo) |
|
|
|
|
|
|
|
|
.filter(inst -> inst.getAttemptNo() >= qualityMinAttemptNo && inst.getAttemptNo() <= qualityMaxAttemptNo) |
|
|
.filter(inst -> "已批准".equals(inst.getStatus())) |
|
|
.filter(inst -> "已批准".equals(inst.getStatus())) |
|
|
.count(); |
|
|
.count(); |
|
|
long qualityRejected = qualityInstances.stream() |
|
|
long qualityRejected = qualityInstances.stream() |
|
|
.filter(inst -> inst.getAttemptNo() == qualityMaxAttemptNo) |
|
|
|
|
|
|
|
|
.filter(inst -> inst.getAttemptNo() >= qualityMinAttemptNo && inst.getAttemptNo() <= qualityMaxAttemptNo) |
|
|
.filter(inst -> "已驳回".equals(inst.getStatus())) |
|
|
.filter(inst -> "已驳回".equals(inst.getStatus())) |
|
|
.count(); |
|
|
.count(); |
|
|
|
|
|
|
|
|
|