| 
					
				 | 
			
			
				@@ -49,7 +49,7 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //获取积分项目分数配置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Map<Long, BigDecimal> scoreConfMap = getScoreConf(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<String, BigDecimal> scoreConfMap = getScoreConf(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //统计人员各项目已累计积分 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Long[] personIdArray = scoreItemValidScoreList.stream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .map(ScoreItemValidScore::getPersonId) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -71,6 +71,7 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Long personId = scoreItemValidScore.getPersonId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Long scoreItemId = scoreItemValidScore.getScoreItemId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Long scoreItemSubId = scoreItemValidScore.getScoreItemSubId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Long scoreItemRankId = scoreItemValidScore.getScoreItemRankId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //获取该人员的累计积分数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             List<ScoreItemValidScore> personAccumulateScores = personAccumulateScoreMap.getOrDefault(personId, new ArrayList<>()); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -78,23 +79,30 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //计算积分项目和具体项目累计分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             BigDecimal scoreItemSumScore = BigDecimal.ZERO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             BigDecimal scoreItemSubSumScore = BigDecimal.ZERO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            BigDecimal scoreItemRankSumScore = BigDecimal.ZERO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for (ScoreItemValidScore accumulateScore : personAccumulateScores) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Long tempScoreItemId = accumulateScore.getScoreItemId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Long tempScoreItemSubId = accumulateScore.getScoreItemSubId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Long tempScoreItemRankId = accumulateScore.getScoreItemRankId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (Objects.equals(tempScoreItemId, scoreItemId)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     scoreItemSumScore = scoreItemSumScore.add(accumulateScore.getSumScore()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (Objects.equals(tempScoreItemSubId, scoreItemSubId)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        scoreItemSubSumScore = accumulateScore.getSumScore(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        scoreItemSubSumScore = scoreItemSubSumScore.add(accumulateScore.getSumScore()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // 添加名次维度判断 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (Objects.equals(tempScoreItemRankId, scoreItemRankId)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        scoreItemRankSumScore = scoreItemRankSumScore.add(accumulateScore.getSumScore()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //根据配置决定使用哪种累计分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            BigDecimal sumScore = determineSumScore(scoreConfMap, scoreItemId, scoreItemSumScore, scoreItemSubSumScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            BigDecimal sumScore = determineSumScore(scoreConfMap, scoreItemId, scoreItemSubId, scoreItemRankId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    scoreItemSumScore, scoreItemSubSumScore, scoreItemRankSumScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            BigDecimal validScore = calculateAvailableScore(scoreConfMap, scoreItemId, scoreItemSubId, sumScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            BigDecimal validScore = calculateAvailableScore(scoreConfMap, scoreItemId, scoreItemSubId, scoreItemRankId, sumScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             scoreItemValidScore.setValidScore(validScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             scoreItemValidScore.setSumScore(sumScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -143,6 +151,7 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .add(ContributionConstant.NCKD_YEAR) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .addIdNumberName(ContributionConstant.NCKD_SCOREITEM) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .addIdNumberName(ContributionConstant.NCKD_SCOREITEMSUB) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .addIdNumberName(ContributionConstant.NCKD_SCOREITEMRANK) // 添加积分项目名次字段 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .addGroup(new String[]{FormConstant.NCKD_ENTRYENTITY, ContributionConstant.NCKD_PERSON},FormConstant.ID_KEY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .addGroup(new String[]{FormConstant.NCKD_ENTRYENTITY}, ContributionConstant.NCKD_SCORE, ContributionConstant.NCKD_ORISCORE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -172,11 +181,12 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     new QFilter[]{filter}, null, 5000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             DataSet sumDateSet = dateSet.copy() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    // 按人员、积分项目、积分项目子项进行分组 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // 按人员、积分项目、积分项目子项、积分项目名次进行分组 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     .groupBy(new String[]{String.join(".", ContributionConstant.NCKD_ENTRYENTITY, ContributionConstant.NCKD_PERSON, FormConstant.ID_KEY), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             String.join(".", ContributionConstant.NCKD_SCOREITEM, FormConstant.ID_KEY), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             String.join(".", ContributionConstant.NCKD_SCOREITEM, FormConstant.NUMBER_KEY), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            String.join(".", ContributionConstant.NCKD_SCOREITEMSUB, FormConstant.ID_KEY)}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            String.join(".", ContributionConstant.NCKD_SCOREITEMSUB, FormConstant.ID_KEY), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            String.join(".", ContributionConstant.NCKD_SCOREITEMRANK, FormConstant.ID_KEY)}) // 添加名次分组 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     .sum(String.join(".", ContributionConstant.NCKD_ENTRYENTITY, FormConstant.NCKD_SCORE),"sumScore").finish(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             while (sumDateSet.hasNext()) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -185,9 +195,10 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Long scoreItemId = row.getLong(String.join(".", ContributionConstant.NCKD_SCOREITEM, FormConstant.ID_KEY)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 String scoreItemNumber = row.getString(String.join(".", ContributionConstant.NCKD_SCOREITEM, FormConstant.NUMBER_KEY)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Long scoreItemSubId = row.getLong(String.join(".", ContributionConstant.NCKD_SCOREITEMSUB, FormConstant.ID_KEY)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Long scoreItemRankId = row.getLong(String.join(".", ContributionConstant.NCKD_SCOREITEMRANK, FormConstant.ID_KEY)); // 获取名次ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 //已获得的累计积分 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 BigDecimal sumScore = row.getBigDecimal("sumScore"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                ScoreItemValidScore scoreItemValidScore = new ScoreItemValidScore(personId, scoreItemId,scoreItemNumber, scoreItemSubId, sumScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ScoreItemValidScore scoreItemValidScore = new ScoreItemValidScore(personId, scoreItemId,scoreItemNumber, scoreItemSubId, scoreItemRankId, sumScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 scoreItemValidScoreList.add(scoreItemValidScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -227,6 +238,7 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param scoreConfMap 分数配置映射表,key为配置ID,value为限分数值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param scoreItemId 积分项目ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param scoreItemSubId 具体积分项目ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param scoreItemRankId 积分项目名次ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param accumulatedScore 已累计总分 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @return 可获得的有效分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      *         如果没有任何限制返回null 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -235,14 +247,25 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @author W.Y.C 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @date: 2025/10/26 16:53 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private static BigDecimal calculateAvailableScore(Map<Long, BigDecimal> scoreConfMap, Long scoreItemId, Long scoreItemSubId, BigDecimal accumulatedScore) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static BigDecimal calculateAvailableScore(Map<String, BigDecimal> scoreConfMap, Long scoreItemId, Long scoreItemSubId, Long scoreItemRankId, BigDecimal accumulatedScore) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 积分项目限分 - 如果没有找到则不限分 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        BigDecimal scoreItemMaxScore = scoreConfMap.get(scoreItemId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String scoreItemKey = scoreItemId + ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        BigDecimal scoreItemMaxScore = scoreConfMap.get(scoreItemKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 具体积分项目限分 - 如果没有找到则不限分 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String scoreItemSubKey = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         BigDecimal scoreItemSubMaxScore = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (scoreItemSubId != null && scoreItemSubId > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            scoreItemSubMaxScore = scoreConfMap.get(scoreItemSubId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            scoreItemSubKey = scoreItemId + "-" + scoreItemSubId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            scoreItemSubMaxScore = scoreConfMap.get(scoreItemSubKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 积分项目名次限分 - 如果没有找到则不限分 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String scoreItemRankKey = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        BigDecimal scoreItemRankMaxScore = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (scoreItemRankId != null && scoreItemRankId > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            scoreItemRankKey = scoreItemId + "-" + scoreItemSubId + "-" + scoreItemRankId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            scoreItemRankMaxScore = scoreConfMap.get(scoreItemRankKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 处理累计分数的空值 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -251,9 +274,19 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 计算实际的最大限制 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         BigDecimal actualMaxScore = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 检查积分项目名次限分是否存在且大于0(最高优先级) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (scoreItemRankMaxScore != null && scoreItemRankMaxScore.compareTo(BigDecimal.ZERO) > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            actualMaxScore = scoreItemRankMaxScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 检查具体积分项目限分是否存在且大于0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (scoreItemSubMaxScore != null && scoreItemSubMaxScore.compareTo(BigDecimal.ZERO) > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            actualMaxScore = scoreItemSubMaxScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (actualMaxScore == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                actualMaxScore = scoreItemSubMaxScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 多重限制,取较小值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                actualMaxScore = actualMaxScore.min(scoreItemSubMaxScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 检查积分项目限分是否存在且大于0 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -261,7 +294,7 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (actualMaxScore == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 actualMaxScore = scoreItemMaxScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 双重限制,取较小值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 多重限制,取较小值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 actualMaxScore = actualMaxScore.min(scoreItemMaxScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -284,14 +317,25 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return availableScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static void main(String[] args) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<ScoreItemValidScore> list = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        list.add(new ScoreItemValidScore(1L, 11L, "1", 111L, 1111L, BigDecimal.valueOf(6))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        list.add(new ScoreItemValidScore(1L, 11L, "1", 121L, null, BigDecimal.valueOf(10))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        list.add(new ScoreItemValidScore(1L, 11L, "1", 131L, null, BigDecimal.valueOf(10))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        list.add(new ScoreItemValidScore(1L, 11L, "1", 141L, null, BigDecimal.valueOf(20))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<ScoreItemValidScore> scoreItemValidScores = calculateMaxAllowedScore(list); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        System.out.println(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 计算最多可得的分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 根据累计积分和分数配置映射表,如果超过配置的限制分数则返回限制分最大分数, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * 计算每个积分大项在考虑双重限制条件下的最大可获得分数: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * 1. 子项限制:每个具体积分项目子项可能有分数上限 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * 2. 大项限制:整个积分大项可能有总分上限 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 计算每个积分大项在考虑三重限制条件下的最大可获得分数: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 1. 名次限制:每个积分项目名次可能有分数上限(最高优先级) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 2. 子项限制:每个具体积分项目子项可能有分数上限 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 3. 大项限制:整个积分大项可能有总分上限 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * @param scoreItemValidScoreList 某个人员所有积分项目的累计积分(personId、scoreItemId、scoreItemSubId、sumScore有值) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param scoreItemValidScoreList 某个人员所有积分项目的累计积分(personId、scoreItemId、scoreItemSubId、scoreItemRankId、sumScore有值) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @return 最多可得的分数列表(按大项维度聚合) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @author W.Y.C 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @date: 2025/10/27 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -299,7 +343,11 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public static List<ScoreItemValidScore> calculateMaxAllowedScore(List<ScoreItemValidScore> scoreItemValidScoreList) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //获取积分限分配置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Map<Long, BigDecimal> scoreConfMap = ContributionHelper.getScoreConf(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<String, BigDecimal> scoreConfMap = ContributionHelper.getScoreConf(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /*Map<String, BigDecimal> scoreConfMap = Maps.newConcurrentMap(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         scoreConfMap.put("11-111-1111",new BigDecimal(2)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         scoreConfMap.put("11-121",new BigDecimal(5)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         scoreConfMap.put("11",new BigDecimal(20));*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         List<ScoreItemValidScore> result = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -312,51 +360,72 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             List<ScoreItemValidScore> valueList = entry.getValue(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // 获取大项限制分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            BigDecimal scoreItemMaxScore = scoreConfMap.get(scoreItemId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // 计算大项总分(按子项分组后求和) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            Map<Long, BigDecimal> subItemSumMap = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for (ScoreItemValidScore item : valueList) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                Long subItemId = item.getScoreItemSubId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                BigDecimal score = item.getSumScore() == null ? BigDecimal.ZERO : item.getSumScore(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                subItemSumMap.merge(subItemId, score, BigDecimal::add); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            BigDecimal scoreItemMaxScore = scoreConfMap.get(scoreItemId + ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // 计算未受限制的实际总分 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            BigDecimal actualTotalScore = BigDecimal.ZERO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for (BigDecimal subItemScore : subItemSumMap.values()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                actualTotalScore = actualTotalScore.add(subItemScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 按具体项目分组 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Map<Long, List<ScoreItemValidScore>> groupedBySubItemId = valueList.stream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .collect(Collectors.groupingBy(ScoreItemValidScore::getScoreItemSubId)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // 计算每个子项的有效分数并求和 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             BigDecimal totalAllowedScore = BigDecimal.ZERO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for (Map.Entry<Long, BigDecimal> subEntry : subItemSumMap.entrySet()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            BigDecimal actualTotalScore = BigDecimal.ZERO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 遍历每个具体项目 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (Map.Entry<Long, List<ScoreItemValidScore>> subEntry : groupedBySubItemId.entrySet()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Long subItemId = subEntry.getKey(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                BigDecimal subItemSumScore = subEntry.getValue(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                List<ScoreItemValidScore> subItemList = subEntry.getValue(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // 获取子项限制分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 BigDecimal scoreItemSubMaxScore = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (subItemId != null && subItemId > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    scoreItemSubMaxScore = scoreConfMap.get(subItemId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    scoreItemSubMaxScore = scoreConfMap.get(scoreItemId + "-" + subItemId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 按名次分组 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Map<Long, BigDecimal> rankSumMap = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (ScoreItemValidScore item : subItemList) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Long rankItemId = item.getScoreItemRankId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    BigDecimal score = item.getSumScore() == null ? BigDecimal.ZERO : item.getSumScore(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    rankSumMap.merge(rankItemId, score, BigDecimal::add); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    actualTotalScore = actualTotalScore.add(score); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 子项限制后的分数(优先考虑子项限制) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                BigDecimal allowedSubScore = subItemSumScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                BigDecimal subItemAllowedScore = BigDecimal.ZERO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 处理每个名次的分数限制 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (Map.Entry<Long, BigDecimal> rankEntry : rankSumMap.entrySet()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Long rankItemId = rankEntry.getKey(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    BigDecimal rankSumScore = rankEntry.getValue(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // 获取名次限制分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    BigDecimal scoreItemRankMaxScore = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (rankItemId != null && rankItemId > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        scoreItemRankMaxScore = scoreConfMap.get(scoreItemId + "-" + subItemId + "-" + rankItemId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // 名次限制后的分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    BigDecimal allowedRankScore = rankSumScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (scoreItemRankMaxScore != null && scoreItemRankMaxScore.compareTo(BigDecimal.ZERO) > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        allowedRankScore = rankSumScore.min(scoreItemRankMaxScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    subItemAllowedScore = subItemAllowedScore.add(allowedRankScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 应用子项限制(如果设置了子项限制) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (scoreItemSubMaxScore != null && scoreItemSubMaxScore.compareTo(BigDecimal.ZERO) > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    allowedSubScore = subItemSumScore.min(scoreItemSubMaxScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    subItemAllowedScore = subItemAllowedScore.min(scoreItemSubMaxScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                totalAllowedScore = totalAllowedScore.add(allowedSubScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                totalAllowedScore = totalAllowedScore.add(subItemAllowedScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // 如果大项有限制,需要检查是否超过大项限制 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 应用大项限制(如果设置了大项限制) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (scoreItemMaxScore != null && scoreItemMaxScore.compareTo(BigDecimal.ZERO) > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 totalAllowedScore = totalAllowedScore.min(scoreItemMaxScore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // 创建结果对象,只包含scoreItemId和validScore 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            ScoreItemValidScore resultItem = new ScoreItemValidScore(null, scoreItemId, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ScoreItemValidScore resultItem = new ScoreItemValidScore(null, scoreItemId, null, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             String scoreItemNumber = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!valueList.isEmpty() && valueList.get(0) != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 scoreItemNumber = valueList.get(0).getScoreItemNumber(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -376,45 +445,84 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param scoreItemId 积分项目ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param scoreItemSumScore 积分项目累计分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param scoreItemSubSumScore 积分项目具体项目累计分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param scoreItemRankSumScore 积分项目名次累计分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @return 应该使用的累计分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private static BigDecimal determineSumScore(Map<Long, BigDecimal> scoreConfMap, Long scoreItemId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                BigDecimal scoreItemSumScore, BigDecimal scoreItemSubSumScore) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        BigDecimal scoreItemMaxScore = scoreConfMap.get(scoreItemId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (scoreItemMaxScore != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //如果设置积分项目大类分数限制,则取大类的累计积分 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return scoreItemSumScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //如果没有设置积分项目大类分数限制,则取小类的累计积分 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return scoreItemSubSumScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static BigDecimal determineSumScore(Map<String, BigDecimal> scoreConfMap, Long scoreItemId, Long scoreItemSubId, Long scoreItemRankId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                BigDecimal scoreItemSumScore, BigDecimal scoreItemSubSumScore, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                BigDecimal scoreItemRankSumScore) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 按照优先级判断使用哪个维度的累计分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 优先级:名次 > 子项 > 大类 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 如果设置了积分项目名次限制,使用名次的累计积分 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (scoreItemRankSumScore != null && scoreItemRankSumScore.compareTo(BigDecimal.ZERO) > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String key = scoreItemId + "-" + scoreItemSubId + "-" + scoreItemRankId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (scoreConfMap.containsKey(key)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return scoreItemRankSumScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 如果设置了积分项目子项限制,使用子项的累计积分 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (scoreItemSubSumScore != null && scoreItemSubSumScore.compareTo(BigDecimal.ZERO) > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String key = scoreItemId + "-" + scoreItemSubId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (scoreConfMap.containsKey(key)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return scoreItemSubSumScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 默认使用大类的累计积分 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return scoreItemSumScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static Map<String, BigDecimal> getScoreConf() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return getScoreConf(null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 获取积分配置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * @return: java.util.Map<java.lang.Long, java.math.BigDecimal>;key为积分项目子项ID(项目子项为空时key为项目大项),value为积分项目对应的最大分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return: java.util.Map<java.lang.String, java.math.BigDecimal>;key:根据配置的完整程度生成不同格式的字符串, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     *          仅配置积分项目时为"scoreItemId", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     *          配置积分项目和具体积分项目时为"scoreItemId-scoreItemSubId", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     *          配置积分项目、具体积分项目和积分项目名次时为"scoreItemId-scoreItemSubId-scoreItemRankId", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     *          value为积分项目对应的最大分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @author W.Y.C 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @date: 2025/10/26 13:38 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public static Map<Long, BigDecimal> getScoreConf() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static Map<String, BigDecimal> getScoreConf(QFilter otherFilter) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //查询积分项目分数配置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         QueryFieldBuilder scoreItemConfFieldBuilder = QueryFieldBuilder.create() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .addIdNumberName(FormConstant.NCKD_ENTRYENTITY, ContributionConstant.NCKD_SCOREITEM) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .addIdNumberName(FormConstant.NCKD_ENTRYENTITY, ContributionConstant.NCKD_SCOREITEMSUB) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .addIdNumberName(FormConstant.NCKD_ENTRYENTITY, ContributionConstant.NCKD_SCOREITEMRANK) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .addGroup(new String[]{FormConstant.NCKD_ENTRYENTITY}, ContributionConstant.NCKD_MAXSCORE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        QFilter filter = QFilterCommonHelper.getEnableFilter() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .and(QFilterCommonHelper.getValidDateFilter(FormConstant.NCKD_STARTDATE,FormConstant.NCKD_ENDDATE)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(otherFilter != null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            filter = filter.and(otherFilter); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         DynamicObjectCollection scoreItemConfQuery = QueryServiceHelper.query(ContributionConstant.SCOREITEMCONF_ENTITYID, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 scoreItemConfFieldBuilder.buildSelect(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                new QFilter[]{QFilterCommonHelper.getEnableFilter()}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new QFilter[]{filter}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //scoreMap:key为积分项目子项ID(项目子项为空时key为项目大项),value为积分项目对应的最大分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Map<Long, BigDecimal> scoreMap = scoreItemConfQuery.stream().collect(Collectors.toMap( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //scoreMap:key为积分配置维度ID,value为积分项目对应的最大分数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //优先级顺序:NCKD_SCOREITEMRANK > NCKD_SCOREITEMSUB > NCKD_SCOREITEM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<String, BigDecimal> scoreMap = scoreItemConfQuery.stream().collect(Collectors.toMap( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 item -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    long scoreItemRankId = item.getLong(String.join(".", FormConstant.NCKD_ENTRYENTITY, ContributionConstant.NCKD_SCOREITEMRANK, FormConstant.ID_KEY)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     long scoreItemSubId = item.getLong(String.join(".", FormConstant.NCKD_ENTRYENTITY, ContributionConstant.NCKD_SCOREITEMSUB, FormConstant.ID_KEY)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (scoreItemSubId <= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return item.getLong(String.join(".", FormConstant.NCKD_ENTRYENTITY, ContributionConstant.NCKD_SCOREITEM, FormConstant.ID_KEY)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    long scoreItemId = item.getLong(String.join(".", FormConstant.NCKD_ENTRYENTITY, ContributionConstant.NCKD_SCOREITEM, FormConstant.ID_KEY)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // 按优先级顺序确定key值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (scoreItemRankId > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        // 优先使用NCKD_SCOREITEMRANK作为key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return scoreItemId+"-"+scoreItemSubId+"-"+scoreItemRankId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } else if (scoreItemSubId > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        // 当NCKD_SCOREITEMRANK为空时,使用NCKD_SCOREITEMSUB作为key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return scoreItemId+"-"+scoreItemSubId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return scoreItemSubId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        // 当NCKD_SCOREITEMRANK和NCKD_SCOREITEMSUB都为空时,使用NCKD_SCOREITEM作为key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return scoreItemId+""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 item -> item.getBigDecimal(String.join(".", FormConstant.NCKD_ENTRYENTITY, ContributionConstant.NCKD_MAXSCORE)), 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -429,6 +537,7 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         private Long scoreItemId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         private String scoreItemNumber; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         private Long scoreItemSubId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private Long scoreItemRankId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /**本次积分*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         private BigDecimal currentScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         private BigDecimal sumScore; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -437,24 +546,27 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //没有业务含义,只用来记录分录索引号; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         private int rowIndex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        public ScoreItemValidScore(Long personId, Long scoreItemId, Long scoreItemSubId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public ScoreItemValidScore(Long personId, Long scoreItemId, Long scoreItemSubId, Long scoreItemRankId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.personId = personId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.scoreItemId = scoreItemId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.scoreItemSubId = scoreItemSubId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.scoreItemRankId = scoreItemRankId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        public ScoreItemValidScore(Long personId, Long scoreItemId,String scoreItemNumber, Long scoreItemSubId, BigDecimal sumScore) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public ScoreItemValidScore(Long personId, Long scoreItemId,String scoreItemNumber, Long scoreItemSubId, Long scoreItemRankId, BigDecimal sumScore) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.personId = personId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.scoreItemId = scoreItemId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.scoreItemNumber = scoreItemNumber; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.scoreItemSubId = scoreItemSubId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.scoreItemRankId = scoreItemRankId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sumScore = sumScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        public ScoreItemValidScore(Long personId, Long scoreItemId, Long scoreItemSubId, BigDecimal sumScore, BigDecimal validScore) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public ScoreItemValidScore(Long personId, Long scoreItemId, Long scoreItemSubId, Long scoreItemRankId, BigDecimal sumScore, BigDecimal validScore) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.personId = personId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.scoreItemId = scoreItemId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.scoreItemSubId = scoreItemSubId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.scoreItemRankId = scoreItemRankId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sumScore = sumScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.validScore = validScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -490,6 +602,14 @@ public class ContributionHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.scoreItemSubId = scoreItemSubId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public Long getScoreItemRankId() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return scoreItemRankId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void setScoreItemRankId(Long scoreItemRankId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.scoreItemRankId = scoreItemRankId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public BigDecimal getSumScore() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return sumScore; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 |