|
|
@@ -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;
|
|
|
}
|