|
@@ -1,5 +1,6 @@
|
|
|
package com.qunzhixinxi.hnqz.daemon.quartz.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.date.DatePattern;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.qunzhixinxi.hnqz.daemon.quartz.entity.SingleMemberSettleSameAmountInSeveralMonths;
|
|
@@ -14,9 +15,13 @@ import java.math.BigDecimal;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.HashSet;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
-import java.util.function.Function;
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.Optional;
|
|
|
+import java.util.Set;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
@@ -63,25 +68,45 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
|
|
|
|
|
|
List<SingleMemberSettleSameAmountInSeveralMonths> list = wmScorePackageSettleNoteMapper.singleMemberSettleSameAmountInSeveralMonths(startTime, endTime);
|
|
|
|
|
|
- // 按照用户分组,然后按照结算金额分组,再按创建月分组,如果创建月对应的结算记录大于1,则表明有相同的金额
|
|
|
- Map<String, Map<BigDecimal, Map<String, List<SingleMemberSettleSameAmountInSeveralMonths>>>> collect =
|
|
|
- list.stream().collect(Collectors.groupingBy(SingleMemberSettleSameAmountInSeveralMonths::getUsername,
|
|
|
- Collectors.groupingBy(SingleMemberSettleSameAmountInSeveralMonths::getSettleAmount,
|
|
|
- Collectors.groupingBy(e -> DateTimeFormatter.ofPattern(DatePattern.NORM_MONTH_PATTERN).format(LocalDateTime.parse(e.getSettleNoteCreateTime(), DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)))))));
|
|
|
+ // 按照用户分组,然后按照月度分组
|
|
|
+ Map<String, Map<String, List<SingleMemberSettleSameAmountInSeveralMonths>>> collect = list.stream().collect(Collectors.groupingBy(SingleMemberSettleSameAmountInSeveralMonths::getIdNumber,
|
|
|
+ Collectors.groupingBy(e -> DateTimeFormatter.ofPattern(DatePattern.NORM_MONTH_PATTERN).format(LocalDateTime.parse(e.getSettleNoteCreateTime(), DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN))))));
|
|
|
|
|
|
+ List<SingleMemberSettleSameAmountInSeveralMonths> riskList = new ArrayList<>(list.size());
|
|
|
|
|
|
- List<SingleMemberSettleSameAmountInSeveralMonths> duplicated = new ArrayList<>(list.size());
|
|
|
+ // 遍历结果
|
|
|
+ for (Map.Entry<String, Map<String, List<SingleMemberSettleSameAmountInSeveralMonths>>> entry : collect.entrySet()) {
|
|
|
+ // 如果 只有一个月结算自动跳过
|
|
|
+ if (entry.getValue().size() <= 1){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 遍历个人
|
|
|
+ List<BigDecimal> tmp = new ArrayList<>(entry.getValue().keySet().size());
|
|
|
+ for (Map.Entry<String, List<SingleMemberSettleSameAmountInSeveralMonths>> ent : entry.getValue().entrySet()) {
|
|
|
+ // 计算每个月份的金额
|
|
|
+ Optional<BigDecimal> reduce = ent.getValue().stream().map(SingleMemberSettleSameAmountInSeveralMonths::getSettleAmount).filter(Objects::nonNull)
|
|
|
+ .reduce(BigDecimal::add);
|
|
|
+
|
|
|
+ if (!reduce.isPresent()) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- for (Map.Entry<String, Map<BigDecimal, Map<String, List<SingleMemberSettleSameAmountInSeveralMonths>>>> entry : collect.entrySet()) {
|
|
|
- for (Map.Entry<BigDecimal, Map<String, List<SingleMemberSettleSameAmountInSeveralMonths>>> ent : entry.getValue().entrySet()) {
|
|
|
- Map<String, List<SingleMemberSettleSameAmountInSeveralMonths>> entValue = ent.getValue();
|
|
|
- if (entValue.size() > 1) {
|
|
|
- entValue.forEach((key, value) -> duplicated.addAll(value));
|
|
|
+ // 判断是否有相同的金额
|
|
|
+ if (tmp.contains(reduce.get())) {
|
|
|
+ riskList.addAll(ent.getValue());
|
|
|
+ }
|
|
|
+ // 记录月份结算值
|
|
|
+ else {
|
|
|
+ // 如果 记录不存在 证明 连续月份金额不相同
|
|
|
+ if (CollUtil.isNotEmpty(tmp)) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ tmp.add(reduce.get());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return duplicated;
|
|
|
+ return riskList;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -96,7 +121,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
|
|
|
public List<SingleMemberSettleSameAmountInSeveralMonths> singleMemberSettleAmountOverrunInSeveralMonths(LocalDateTime startTime, LocalDateTime endTime, BigDecimal limit) {
|
|
|
List<SingleMemberSettleSameAmountInSeveralMonths> list = wmScorePackageSettleNoteMapper.singleMemberSettleSameAmountInSeveralMonths(startTime, endTime);
|
|
|
|
|
|
- Map<String, List<SingleMemberSettleSameAmountInSeveralMonths>> collect = list.stream().collect(Collectors.groupingBy(SingleMemberSettleSameAmountInSeveralMonths::getUsername));
|
|
|
+ Map<String, List<SingleMemberSettleSameAmountInSeveralMonths>> collect = list.stream().collect(Collectors.groupingBy(SingleMemberSettleSameAmountInSeveralMonths::getIdNumber));
|
|
|
|
|
|
List<SingleMemberSettleSameAmountInSeveralMonths> riskList = new ArrayList<>(list.size());
|
|
|
|
|
@@ -131,24 +156,35 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
|
|
|
public List<SingleMemberSettleSameAmountInSeveralMonths> singleEnterpriseSettleSameAmountForSeveralMembersInCurrentMonth(LocalDateTime startTime, LocalDateTime endTime, int memberCount) {
|
|
|
List<SingleMemberSettleSameAmountInSeveralMonths> list = wmScorePackageSettleNoteMapper.singleMemberSettleSameAmountInSeveralMonths(startTime, endTime);
|
|
|
|
|
|
- // 按照企业分组,然后按照结算金额分组,然后按照月份分组如果结算金额对应的结算记录大于1,则表明有相同的金额
|
|
|
- Map<String, Map<BigDecimal, Map<String, List<SingleMemberSettleSameAmountInSeveralMonths>>>> collect =
|
|
|
- list.stream().collect(Collectors.groupingBy(SingleMemberSettleSameAmountInSeveralMonths::getDeptId,
|
|
|
- Collectors.groupingBy(SingleMemberSettleSameAmountInSeveralMonths::getSettleAmount,
|
|
|
- Collectors.groupingBy(e -> DateTimeFormatter.ofPattern(DatePattern.NORM_MONTH_PATTERN).format(LocalDateTime.parse(e.getSettleNoteCreateTime(), DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)))))));
|
|
|
+ // 按照企业分组,然后按照用户分组
|
|
|
+ Map<String, Map<String, List<SingleMemberSettleSameAmountInSeveralMonths>>> collect = list.stream().collect(Collectors.groupingBy(SingleMemberSettleSameAmountInSeveralMonths::getDeptId,
|
|
|
+ Collectors.groupingBy(SingleMemberSettleSameAmountInSeveralMonths::getIdNumber)));
|
|
|
|
|
|
- List<SingleMemberSettleSameAmountInSeveralMonths> riskResult = new ArrayList<>(list.size());
|
|
|
+ Set<SingleMemberSettleSameAmountInSeveralMonths> riskResult = new HashSet<>(list.size());
|
|
|
|
|
|
- for (Map.Entry<String, Map<BigDecimal, Map<String, List<SingleMemberSettleSameAmountInSeveralMonths>>>> entry : collect.entrySet()) {
|
|
|
- for (Map.Entry<BigDecimal, Map<String, List<SingleMemberSettleSameAmountInSeveralMonths>>> ent : entry.getValue().entrySet()) {
|
|
|
- Map<String, List<SingleMemberSettleSameAmountInSeveralMonths>> entValue = ent.getValue();
|
|
|
- if (entValue.size() > memberCount) {
|
|
|
- entValue.forEach((k, v) -> riskResult.addAll(v));
|
|
|
+ // 遍历所有记录
|
|
|
+ for (Map.Entry<String, Map<String, List<SingleMemberSettleSameAmountInSeveralMonths>>> entry : collect.entrySet()) {
|
|
|
+ // 遍历所有人
|
|
|
+ Map<BigDecimal, List<SingleMemberSettleSameAmountInSeveralMonths>> temp = new HashMap<>();
|
|
|
+ for (Map.Entry<String, List<SingleMemberSettleSameAmountInSeveralMonths>> ent : entry.getValue().entrySet()) {
|
|
|
+ // 计算每个人的结算金额
|
|
|
+ Optional<BigDecimal> reduce = ent.getValue().stream().map(SingleMemberSettleSameAmountInSeveralMonths::getSettleAmount).filter(Objects::nonNull)
|
|
|
+ .reduce(BigDecimal::add);
|
|
|
+
|
|
|
+ if (!reduce.isPresent()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (temp.containsKey(reduce.get())) {
|
|
|
+ riskResult.addAll(temp.get(reduce.get()));
|
|
|
+ riskResult.addAll(ent.getValue());
|
|
|
+ } else {
|
|
|
+ temp.put(reduce.get(), ent.getValue());
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|
|
|
-
|
|
|
- return riskResult;
|
|
|
+ return new ArrayList<>(riskResult);
|
|
|
}
|
|
|
}
|