Browse Source

refactor: 更新统计逻辑

shc 3 years ago
parent
commit
936c77be52

+ 13 - 12
db/v2022/4single_member_settle_same_amount_in_several_months.sql

@@ -10,19 +10,20 @@ DROP TABLE IF EXISTS `single_member_settle_same_amount_in_several_months`;
 CREATE TABLE `single_member_settle_same_amount_in_several_months`
 (
     `record_id`               INT UNSIGNED AUTO_INCREMENT COMMENT 'id',
-    `note_id`                 INT UNSIGNED NOT NULL COMMENT '积分包计算记录id',
-    `realname`                VARCHAR(32)  NOT NULL COMMENT '用户名称',
-    `username`                VARCHAR(11)  NOT NULL COMMENT '用户名',
-    `dept_id`                 INT          NOT NULL COMMENT '结算企业id',
-    `dept_name`               VARCHAR(64)  NOT NULL COMMENT '结算企业名称',
-    `settle_amount`           DECIMAL      NOT NULL COMMENT '结算金额',
+    `note_id`                 INT UNSIGNED NULL COMMENT '积分包计算记录id',
+    `realname`                VARCHAR(32)  NULL COMMENT '用户名称',
+    `username`                VARCHAR(11)  NULL COMMENT '用户名',
+    `id_number`               VARCHAR(18)  NULL COMMENT '身份证',
+    `dept_id`                 INT          NULL COMMENT '结算企业id',
+    `dept_name`               VARCHAR(64)  NULL COMMENT '结算企业名称',
+    `settle_amount`           DECIMAL      NULL COMMENT '结算金额',
     `sub_to_gig_time`         DATETIME     NULL COMMENT '结算时间',
-    `settle_state`            VARCHAR(16)  NOT NULL COMMENT '结算企业名称',
-    `sub_type_name`           VARCHAR(16)  NOT NULL COMMENT '结算渠道名称',
-    `package_name`            VARCHAR(64)  NOT NULL COMMENT '积分包名称',
-    `settle_note_create_time` DATETIME     NOT NULL COMMENT '结算记录创建时间',
-    `period`                  INT UNSIGNED NOT NULL COMMENT '统计周期',
-    `create_time`            DATETIME     NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `settle_state`            VARCHAR(16)  NULL COMMENT '结算企业名称',
+    `sub_type_name`           VARCHAR(16)  NULL COMMENT '结算渠道名称',
+    `package_name`            VARCHAR(64)  NULL COMMENT '积分包名称',
+    `settle_note_create_time` DATETIME     NULL COMMENT '结算记录创建时间',
+    `period`                  INT UNSIGNED NULL COMMENT '统计周期',
+    `create_time`             DATETIME     NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     PRIMARY KEY (`record_id`) USING BTREE
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4 COMMENT ='单人连续多月结算相同金额';

+ 1 - 0
db/v2022/6single_ent_settle_same_amount_for_members_in_current_month.sql

@@ -13,6 +13,7 @@ CREATE TABLE `single_ent_settle_same_amount_for_members_in_current_month`
     `note_id`                 INT UNSIGNED NULL COMMENT '积分包计算记录id',
     `realname`                VARCHAR(32)  NULL COMMENT '用户名称',
     `username`                VARCHAR(11)  NULL COMMENT '用户名',
+    `id_number`               VARCHAR(18)  NULL COMMENT '身份证',
     `dept_id`                 INT          NULL COMMENT '结算企业id',
     `dept_name`               VARCHAR(64)  NULL COMMENT '结算企业名称',
     `settle_amount`           DECIMAL      NULL COMMENT '结算金额',

+ 5 - 0
hnqz-visual/hnqz-daemon-quartz/src/main/java/com/qunzhixinxi/hnqz/daemon/quartz/entity/SingleEnterpriseSettleSameAmountForSeveralMembersInCurrentMonth.java

@@ -32,6 +32,11 @@ public class SingleEnterpriseSettleSameAmountForSeveralMembersInCurrentMonth imp
 	 */
 	private String realname;
 
+	/**
+	 * 身份证号
+	 */
+	private String IdNumber;
+
 	/**
 	 * 用户名
 	 */

+ 7 - 0
hnqz-visual/hnqz-daemon-quartz/src/main/java/com/qunzhixinxi/hnqz/daemon/quartz/entity/SingleMemberSettleSameAmountInSeveralMonths.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
@@ -11,6 +12,7 @@ import java.time.LocalDateTime;
 
 
 @Data
+@EqualsAndHashCode
 @TableName(value = "single_member_settle_same_amount_in_several_months")
 public class SingleMemberSettleSameAmountInSeveralMonths implements Serializable {
 
@@ -32,6 +34,11 @@ public class SingleMemberSettleSameAmountInSeveralMonths implements Serializable
 	 */
 	private String realname;
 
+	/**
+	 * 身份证号
+	 */
+	private String idNumber;
+
 	/**
 	 * 用户名
 	 */

+ 63 - 27
hnqz-visual/hnqz-daemon-quartz/src/main/java/com/qunzhixinxi/hnqz/daemon/quartz/service/impl/WmScorePackageSettleNoteServiceImpl.java

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

+ 2 - 0
hnqz-visual/hnqz-daemon-quartz/src/main/resources/mapper/WmScorePackageSettleNoteMapper.xml

@@ -31,6 +31,7 @@
 		<id property="noteId" column="id"/>
 		<result property="realname" column="realname"/>
 		<result property="username" column="username"/>
+		<result property="idNumber" column="id_number"/>
 		<result property="deptId" column="dept_id"/>
 		<result property="deptName" column="dept_name"/>
 		<result property="settleAmount" column="settle_amount"/>
@@ -57,6 +58,7 @@
 		SELECT wspsn.id,
 			   su.realname,
 			   su.username,
+		       su.id_card_number AS `id_number`,
 			   sd.dept_id,
 			   sd.name AS `dept_name`,
 			   wspsn.settle_amount,