yxk-20260728

改善提案
改善效果得分拆分为安全、质量、效率、成本四个,权重平均分
This commit is contained in:
ye1023
2026-07-28 15:05:15 +08:00
parent bbebf12399
commit 9a6416f2fd
3 changed files with 62 additions and 12 deletions
@@ -20,8 +20,17 @@ public class ImprovementDeptScoreBpmDTO {
@Schema(description = "当前流程任务ID")
private String taskId;
@Schema(description = "改善效果得分,0-100")
private BigDecimal effectScore;
@Schema(description = "安全得分,0-100")
private BigDecimal safetyScore;
@Schema(description = "质量得分,0-100")
private BigDecimal qualityScore;
@Schema(description = "效率得分,0-100")
private BigDecimal efficiencyScore;
@Schema(description = "成本得分,0-100")
private BigDecimal costScore;
@Schema(description = "可推广度得分,0-100")
private BigDecimal promotionScore;
@@ -50,6 +50,22 @@ public class ImprovementDeptScore implements Serializable {
@Excel(name = "评分状态:pending/completed", width = 15)
@Schema(description = "评分状态:pending/completed")
private String scoreStatus;
/**安全得分*/
@Excel(name = "安全得分", width = 15)
@Schema(description = "安全得分")
private java.math.BigDecimal safetyScore;
/**质量得分*/
@Excel(name = "质量得分", width = 15)
@Schema(description = "质量得分")
private java.math.BigDecimal qualityScore;
/**效率得分*/
@Excel(name = "效率得分", width = 15)
@Schema(description = "效率得分")
private java.math.BigDecimal efficiencyScore;
/**成本得分*/
@Excel(name = "成本得分", width = 15)
@Schema(description = "成本得分")
private java.math.BigDecimal costScore;
/**改善效果得分*/
@Excel(name = "改善效果得分", width = 15)
@Schema(description = "改善效果得分")
@@ -231,14 +231,16 @@ public class ImprovementProposalServiceImpl extends ServiceImpl<ImprovementPropo
throw new IllegalStateException("评分已锁定,请重新提交流程办理");
}
BigDecimal totalScore = calculateTotalScore(scoreAction);
// 改善效果由四个子项在服务端计算,避免前端篡改汇总得分或加权总分。
BigDecimal effectScore = calculateEffectScore(scoreAction);
BigDecimal totalScore = calculateTotalScore(scoreAction, effectScore);
if (existingScore == null) {
ImprovementDeptScore newScore = new ImprovementDeptScore();
newScore.setMainId(lockedProposal.getId());
newScore.setProcessTaskId(scoreAction.getTaskId());
newScore.setScorerId(loginUser.getId());
newScore.setScorerName(loginUser.getRealname());
fillDeptScoreDraft(newScore, scoreAction, totalScore);
fillDeptScoreDraft(newScore, scoreAction, effectScore, totalScore);
improvementDeptScoreMapper.insert(newScore);
} else {
// 草稿保存只能更新 pending 记录,避免流程已提交后通过接口修改最终评分。
@@ -246,7 +248,11 @@ public class ImprovementProposalServiceImpl extends ServiceImpl<ImprovementPropo
.eq(ImprovementDeptScore::getId, existingScore.getId())
.eq(ImprovementDeptScore::getScoreStatus, "pending")
.set(ImprovementDeptScore::getProcessTaskId, scoreAction.getTaskId())
.set(ImprovementDeptScore::getEffectScore, scoreAction.getEffectScore())
.set(ImprovementDeptScore::getSafetyScore, scoreAction.getSafetyScore())
.set(ImprovementDeptScore::getQualityScore, scoreAction.getQualityScore())
.set(ImprovementDeptScore::getEfficiencyScore, scoreAction.getEfficiencyScore())
.set(ImprovementDeptScore::getCostScore, scoreAction.getCostScore())
.set(ImprovementDeptScore::getEffectScore, effectScore)
.set(ImprovementDeptScore::getPromotionScore, scoreAction.getPromotionScore())
.set(ImprovementDeptScore::getOriginalityScore, scoreAction.getOriginalityScore())
.set(ImprovementDeptScore::getEffortScore, scoreAction.getEffortScore())
@@ -374,7 +380,10 @@ public class ImprovementProposalServiceImpl extends ServiceImpl<ImprovementPropo
if (scoreAction == null) {
throw new IllegalStateException("评分参数不能为空");
}
validateScoreValue(scoreAction.getEffectScore(), "改善效果");
validateScoreValue(scoreAction.getSafetyScore(), "安全");
validateScoreValue(scoreAction.getQualityScore(), "质量");
validateScoreValue(scoreAction.getEfficiencyScore(), "效率");
validateScoreValue(scoreAction.getCostScore(), "成本");
validateScoreValue(scoreAction.getPromotionScore(), "可推广度");
validateScoreValue(scoreAction.getOriginalityScore(), "独创性");
validateScoreValue(scoreAction.getEffortScore(), "努力度");
@@ -386,16 +395,28 @@ public class ImprovementProposalServiceImpl extends ServiceImpl<ImprovementPropo
}
}
private BigDecimal calculateTotalScore(ImprovementDeptScoreBpmDTO scoreAction) {
return scoreAction.getEffectScore().multiply(new BigDecimal("0.50"))
private BigDecimal calculateEffectScore(ImprovementDeptScoreBpmDTO scoreAction) {
return calculateEffectScore(scoreAction.getSafetyScore(), scoreAction.getQualityScore(), scoreAction.getEfficiencyScore(), scoreAction.getCostScore());
}
private BigDecimal calculateEffectScore(BigDecimal safetyScore, BigDecimal qualityScore, BigDecimal efficiencyScore, BigDecimal costScore) {
return safetyScore.add(qualityScore).add(efficiencyScore).add(costScore).divide(BigDecimal.valueOf(4), 2, RoundingMode.HALF_UP);
}
private BigDecimal calculateTotalScore(ImprovementDeptScoreBpmDTO scoreAction, BigDecimal effectScore) {
return effectScore.multiply(new BigDecimal("0.50"))
.add(scoreAction.getPromotionScore().multiply(new BigDecimal("0.20")))
.add(scoreAction.getOriginalityScore().multiply(new BigDecimal("0.20")))
.add(scoreAction.getEffortScore().multiply(new BigDecimal("0.10")))
.setScale(2, RoundingMode.HALF_UP);
}
private void fillDeptScoreDraft(ImprovementDeptScore target, ImprovementDeptScoreBpmDTO source, BigDecimal totalScore) {
target.setEffectScore(source.getEffectScore());
private void fillDeptScoreDraft(ImprovementDeptScore target, ImprovementDeptScoreBpmDTO source, BigDecimal effectScore, BigDecimal totalScore) {
target.setSafetyScore(source.getSafetyScore());
target.setQualityScore(source.getQualityScore());
target.setEfficiencyScore(source.getEfficiencyScore());
target.setCostScore(source.getCostScore());
target.setEffectScore(effectScore);
target.setPromotionScore(source.getPromotionScore());
target.setOriginalityScore(source.getOriginalityScore());
target.setEffortScore(source.getEffortScore());
@@ -406,11 +427,15 @@ public class ImprovementProposalServiceImpl extends ServiceImpl<ImprovementPropo
}
private void validateSavedScore(ImprovementDeptScore score) {
validateScoreValue(score.getEffectScore(), "改善效果");
validateScoreValue(score.getSafetyScore(), "安全");
validateScoreValue(score.getQualityScore(), "质量");
validateScoreValue(score.getEfficiencyScore(), "效率");
validateScoreValue(score.getCostScore(), "成本");
validateScoreValue(score.getPromotionScore(), "可推广度");
validateScoreValue(score.getOriginalityScore(), "独创性");
validateScoreValue(score.getEffortScore(), "努力度");
if (score.getTotalScore() == null) {
BigDecimal calculatedEffectScore = calculateEffectScore(score.getSafetyScore(), score.getQualityScore(), score.getEfficiencyScore(), score.getCostScore());
if (score.getEffectScore() == null || score.getEffectScore().compareTo(calculatedEffectScore) != 0 || score.getTotalScore() == null) {
throw new IllegalStateException("请先保存完整个人评分");
}
}