package ieven.server.webapp.service.datastatic; import com.mongodb.client.MongoCursor; import ieven.server.webapp.domain.alipay.HeaderProperties; import ieven.server.webapp.domain.data.DataMap; import ieven.server.webapp.domain.file.FileService; import ieven.server.webapp.service.Ops; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.bson.Document; import org.springframework.data.mongodb.core.MongoTemplate; import java.math.BigDecimal; import java.util.*; import java.util.concurrent.CountDownLatch; @Slf4j public class DataStaticAnalysisDs extends Ops implements Runnable { private HeaderProperties headerProperties; String modelId; MongoTemplate mongoTemplate; FileService fileService; CountDownLatch latch; public DataStaticAnalysisDs( HeaderProperties headerProperties, String modelId, MongoTemplate mongoTemplate, FileService fileService, CountDownLatch latch) { this.headerProperties = headerProperties; this.modelId = modelId; this.mongoTemplate = mongoTemplate; this.fileService = fileService; this.latch = latch; } @Override public void run() { log.info("数据分析-对手透视"); // 直接删除并创建表 String newFileId = ""; String dateFileIdwld = getFileId("五联单-账户明细", modelId, mongoTemplate); String dateFileIdfa = getFileId("反诈治安-交易明细", modelId, mongoTemplate); String dateFileIdcft = getFileId("财付通-交易明细", modelId, mongoTemplate); // 插入记录用户后续查询明细 if (StringUtils.isNotBlank(dateFileIdwld) || StringUtils.isNotBlank(dateFileIdfa) || StringUtils.isNotBlank(dateFileIdcft)) { newFileId = createLogicAndDeleteOld("数据分析-对手透视", modelId, headerProperties.getAntiSecurityTradeEndAnalysisOutput(), mongoTemplate, fileService); } // 插入记录用户后续查询明细 if (StringUtils.isNotBlank(dateFileIdcft)) { MongoCursor cursor = getCursor(dateFileIdcft, mongoTemplate); if (cursor.hasNext()) { insertFromTo(dateFileIdcft, newFileId, modelId, mongoTemplate); } Set alipayIds = new HashSet<>(); Map idToData = new HashMap<>(); Map> idToMainIds = new HashMap<>(); Map> idToNames = new HashMap<>(); Map> hm = new HashMap<>(); Document origin; while (cursor.hasNext()) { try { origin = cursor.next(); String alipayId = origin.getString("交易对手账号"); DataMap dataMap; if (alipayIds.contains(alipayId)) { dataMap = idToData.get(alipayId); } else { alipayIds.add(alipayId); dataMap = new DataMap(); dataMap.put("fileId", newFileId); dataMap.put("交易对手账号", alipayId); dataMap.put("交易对手户名", ""); dataMap.put("交易总额", new BigDecimal("0.00")); dataMap.put("交易主体收入金额", new BigDecimal("0.00")); dataMap.put("交易主体支出金额", new BigDecimal("0.00")); dataMap.put("交易主体收入笔数", 0); dataMap.put("交易主体支出笔数", 0); dataMap.put("总笔数", 0); dataMap.put("共同交易主体数", 0); dataMap.put("共同交易主体账号汇总", ""); dataMap.put("来源", "财付通"); dataMap.put("共同交易主体户名汇总", 0); idToData.put(alipayId, dataMap); } String alipayUsername = origin.getString("交易对手户名"); if (StringUtils.isNotBlank(alipayUsername) && !"_".equals(alipayUsername) && !"-".equals(alipayUsername) && !"null".equals(alipayUsername)) { if (idToNames.containsKey(alipayId)) { Set names = idToNames.get(alipayId); names.add(alipayUsername); } else { Set names = new HashSet<>(); names.add(alipayUsername); idToNames.put(alipayId, names); } } String flag = "借贷类型"; String flagValue = origin.getString(flag); String money = (String) origin.get("交易金额(元)"); if (StringUtils.isBlank(money)) { money = "0"; } if ("入".equals(flagValue)) { BigDecimal oMoney = (BigDecimal) dataMap.get("交易主体收入金额"); oMoney = oMoney.add(new BigDecimal(money)); dataMap.put("交易主体收入金额", oMoney); int oCount = (int) dataMap.get("交易主体收入笔数"); oCount++; dataMap.put("交易主体收入笔数", oCount); } else if ("出".equals(flagValue)) { BigDecimal oMoney = (BigDecimal) dataMap.get("交易主体支出金额"); oMoney = oMoney.add(new BigDecimal(money)); dataMap.put("交易主体支出金额", oMoney); int oCount = (int) dataMap.get("交易主体支出笔数"); oCount++; dataMap.put("交易主体支出笔数", oCount); } BigDecimal oMoney = (BigDecimal) dataMap.get("交易总额"); oMoney = oMoney.add(new BigDecimal(money)); dataMap.put("交易总额", oMoney); int oCount = (int) dataMap.get("总笔数"); oCount++; dataMap.put("总笔数", oCount); String mainId = (String) origin.get("交易主体账号"); String mainIdhm = (String) origin.get("交易主体户名"); if(StringUtils.isNotBlank(mainId)&&StringUtils.isNotBlank(mainIdhm)){ if (hm.containsKey(mainId)) { Set hmnew = hm.get(mainId); hmnew.add(mainIdhm); hm.put(mainId,hmnew); } else { Set mainIds = new HashSet<>(); mainIds.add(mainIdhm); hm.put(mainId, mainIds); } } if (idToMainIds.containsKey(alipayId)) { Set mainIds = idToMainIds.get(alipayId); mainIds.add(mainId); } else { Set mainIds = new HashSet<>(); mainIds.add(mainId); idToMainIds.put(alipayId, mainIds); } } catch (Exception exception) { log.error(exception.getMessage(), exception); } } if (CollectionUtils.isNotEmpty(idToData.values())) { for (Map.Entry entry : idToData.entrySet()) { String key = entry.getKey(); DataMap value = entry.getValue(); Set mainIds = idToMainIds.get(key); Set names = idToNames.get(key); if (CollectionUtils.isNotEmpty(names)) { value.put("交易对手户名", StringUtils.join(names, ";")); } if (CollectionUtils.isNotEmpty(mainIds)) { value.put("共同交易主体数", mainIds.size()); String str=""; Setjyzthm = new HashSet<>(); for (String mainId : mainIds) { Set strings = hm.get(mainId); if(CollectionUtils.isNotEmpty(strings)){ jyzthm.addAll(strings); } str+=CollectionUtils.isEmpty(strings)?mainId+";":mainId+"("+StringUtils.join(strings, ",")+");"; } value.put("共同交易主体账号汇总", str); value.put("共同交易主体户名汇总", Math.min(mainIds.size(),jyzthm.size())); } DataMap dataMap = entry.getValue(); BigDecimal money1 = (BigDecimal) dataMap.get("交易总额"); dataMap.put("交易总额", money1.doubleValue()); BigDecimal money2 = (BigDecimal) dataMap.get("交易主体收入金额"); dataMap.put("交易主体收入金额", money2.doubleValue()); BigDecimal money3 = (BigDecimal) dataMap.get("交易主体支出金额"); dataMap.put("交易主体支出金额", money3.doubleValue()); } saveLines(idToData.values(), "共同交易主体数", mongoTemplate); } } if (StringUtils.isNotBlank(dateFileIdfa)) { MongoCursor cursor = getCursor(dateFileIdfa, mongoTemplate); if (cursor.hasNext()) { insertFromTo(dateFileIdfa, newFileId, modelId, mongoTemplate); } Set alipayIds = new HashSet<>(); Map idToData = new HashMap<>(); Map> idToMainIds = new HashMap<>(); Map> idToNames = new HashMap<>(); Document origin; Map> hm = new HashMap<>(); while (cursor.hasNext()) { try { origin = cursor.next(); String alipayId = origin.getString("交易对手账号"); DataMap dataMap; if (alipayIds.contains(alipayId)) { dataMap = idToData.get(alipayId); } else { alipayIds.add(alipayId); dataMap = new DataMap(); dataMap.put("fileId", newFileId); dataMap.put("交易对手账号", alipayId); dataMap.put("交易对手户名", ""); dataMap.put("交易总额", new BigDecimal("0.00")); dataMap.put("交易主体收入金额", new BigDecimal("0.00")); dataMap.put("交易主体支出金额", new BigDecimal("0.00")); dataMap.put("交易主体收入笔数", 0); dataMap.put("交易主体支出笔数", 0); dataMap.put("总笔数", 0); dataMap.put("共同交易主体数", 0); dataMap.put("共同交易主体户名汇总", 0); dataMap.put("来源", "反诈"); idToData.put(alipayId, dataMap); } String alipayUsername = origin.getString("交易对手户名"); if (StringUtils.isNotBlank(alipayUsername) && !"_".equals(alipayUsername) && !"-".equals(alipayUsername)&& !"null".equals(alipayUsername)) { if (idToNames.containsKey(alipayId)) { Set names = idToNames.get(alipayId); names.add(alipayUsername); } else { Set names = new HashSet<>(); names.add(alipayUsername); idToNames.put(alipayId, names); } } String flag = "交易主体的出入账标识"; String flagValue = origin.getString(flag); String money = (String) origin.get("交易金额"); if ("入账".equals(flagValue)) { BigDecimal oMoney = (BigDecimal) dataMap.get("交易主体收入金额"); oMoney = oMoney.add(new BigDecimal(money)); dataMap.put("交易主体收入金额", oMoney); int oCount = (int) dataMap.get("交易主体收入笔数"); oCount++; dataMap.put("交易主体收入笔数", oCount); } else if ("出账".equals(flagValue)) { BigDecimal oMoney = (BigDecimal) dataMap.get("交易主体支出金额"); oMoney = oMoney.add(new BigDecimal(money)); dataMap.put("交易主体支出金额", oMoney); int oCount = (int) dataMap.get("交易主体支出笔数"); oCount++; dataMap.put("交易主体支出笔数", oCount); } BigDecimal oMoney = (BigDecimal) dataMap.get("交易总额"); oMoney = oMoney.add(new BigDecimal(money)); dataMap.put("交易总额", oMoney); int oCount = (int) dataMap.get("总笔数"); oCount++; dataMap.put("总笔数", oCount); String mainId = (String) origin.get("交易主体账号"); String mainIdhm = (String) origin.get("交易主体户名"); if(StringUtils.isNotBlank(mainId)&&StringUtils.isNotBlank(mainIdhm)){ if (hm.containsKey(mainId)) { Set hmnew = hm.get(mainId); hmnew.add(mainIdhm); hm.put(mainId,hmnew); } else { Set mainIds = new HashSet<>(); mainIds.add(mainIdhm); hm.put(mainId, mainIds); } } if (idToMainIds.containsKey(alipayId)) { Set mainIds = idToMainIds.get(alipayId); mainIds.add(mainId); } else { Set mainIds = new HashSet<>(); mainIds.add(mainId); //mainIds.add(mainId+(StringUtils.isBlank(mainName)||"null".equals(mainName)?"":"("+mainName+")")); idToMainIds.put(alipayId, mainIds); } } catch (Exception exception) { log.error(exception.getMessage(), exception); } } if (CollectionUtils.isNotEmpty(idToData.values())) { for (Map.Entry entry : idToData.entrySet()) { String key = entry.getKey(); DataMap value = entry.getValue(); Set names = idToNames.get(key); if (CollectionUtils.isNotEmpty(names)) { value.put("交易对手户名", StringUtils.join(names, ";")); } Set mainIds = idToMainIds.get(key); if (CollectionUtils.isNotEmpty(mainIds)) { value.put("共同交易主体数", mainIds.size()); String str=""; Setjyzthm = new HashSet<>(); for (String mainId : mainIds) { Set strings = hm.get(mainId); if(CollectionUtils.isNotEmpty(strings)){ jyzthm.addAll(strings); } str+=CollectionUtils.isEmpty(strings)?mainId+";":mainId+"("+StringUtils.join(strings, ",")+");"; } value.put("共同交易主体账号汇总", str); value.put("共同交易主体户名汇总", Math.min(mainIds.size(),jyzthm.size())); } DataMap dataMap = entry.getValue(); BigDecimal money1 = (BigDecimal) dataMap.get("交易总额"); dataMap.put("交易总额", money1.doubleValue()); BigDecimal money2 = (BigDecimal) dataMap.get("交易主体收入金额"); dataMap.put("交易主体收入金额", money2.doubleValue()); BigDecimal money3 = (BigDecimal) dataMap.get("交易主体支出金额"); dataMap.put("交易主体支出金额", money3.doubleValue()); } saveLines(idToData.values(), "共同交易主体数", mongoTemplate); } } if (StringUtils.isNotBlank(dateFileIdwld)) { MongoCursor cursor = getCursor(dateFileIdwld, mongoTemplate); if (cursor.hasNext()) { insertFromTo(dateFileIdwld, newFileId, modelId, mongoTemplate); } Set alipayIds = new HashSet<>(); Map idToData = new HashMap<>(); Map> idToMainIds = new HashMap<>(); Map> idToNames = new HashMap<>(); Map> hm = new HashMap<>(); Document origin; while (cursor.hasNext()) { try { origin = cursor.next(); String alipayId = origin.getString("对手支付宝用户ID"); DataMap dataMap; if (alipayIds.contains(alipayId)) { dataMap = idToData.get(alipayId); } else { alipayIds.add(alipayId); dataMap = new DataMap(); dataMap.put("fileId", newFileId); dataMap.put("交易对手账号", alipayId); dataMap.put("交易对手户名", ""); dataMap.put("交易总额", new BigDecimal("0.00")); dataMap.put("交易主体收入金额", new BigDecimal("0.00")); dataMap.put("交易主体支出金额", new BigDecimal("0.00")); dataMap.put("交易主体收入笔数", 0); dataMap.put("交易主体支出笔数", 0); dataMap.put("总笔数", 0); dataMap.put("共同交易主体数", 0); dataMap.put("共同交易主体账号汇总", ""); dataMap.put("共同交易主体户名汇总", 0); dataMap.put("来源", "五联单"); idToData.put(alipayId, dataMap); } String alipayUsername = origin.getString("对手支付宝户名"); if (StringUtils.isNotBlank(alipayUsername) && !"_".equals(alipayUsername) && !"-".equals(alipayUsername)&& !"null".equals(alipayUsername)) { if (idToNames.containsKey(alipayId)) { Set names = idToNames.get(alipayId); names.add(alipayUsername); } else { Set names = new HashSet<>(); names.add(alipayUsername); idToNames.put(alipayId, names); } } String flag = "收/支"; String flagValue = origin.getString(flag); String money = (String) origin.get("金额(元)"); if ("收入".equals(flagValue)) { BigDecimal oMoney = (BigDecimal) dataMap.get("交易主体收入金额"); oMoney = oMoney.add(new BigDecimal(money)); dataMap.put("交易主体收入金额", oMoney); int oCount = (int) dataMap.get("交易主体收入笔数"); oCount++; dataMap.put("交易主体收入笔数", oCount); } else if ("支出".equals(flagValue)) { BigDecimal oMoney = (BigDecimal) dataMap.get("交易主体支出金额"); oMoney = oMoney.add(new BigDecimal(money)); dataMap.put("交易主体支出金额", oMoney); int oCount = (int) dataMap.get("交易主体支出笔数"); oCount++; dataMap.put("交易主体支出笔数", oCount); } BigDecimal oMoney = (BigDecimal) dataMap.get("交易总额"); oMoney = oMoney.add(new BigDecimal(money)); dataMap.put("交易总额", oMoney); int oCount = (int) dataMap.get("总笔数"); oCount++; dataMap.put("总笔数", oCount); String mainId = (String) origin.get("支付宝用户ID"); String mainIdhm = (String) origin.get("支付宝户名"); if (StringUtils.isNotBlank(mainId) && StringUtils.isNotBlank(mainIdhm)) { if (hm.containsKey(mainId)) { Set hmnew = hm.get(mainId); hmnew.add(mainIdhm); hm.put(mainId, hmnew); } else { Set mainIds = new HashSet<>(); mainIds.add(mainIdhm); hm.put(mainId, mainIds); } } if (idToMainIds.containsKey(alipayId)) { Set mainIds = idToMainIds.get(alipayId); mainIds.add(mainId); } else { Set mainIds = new HashSet<>(); mainIds.add(mainId); idToMainIds.put(alipayId, mainIds); } } catch (Exception exception) { log.error(exception.getMessage(), exception); } } if (CollectionUtils.isNotEmpty(idToData.values())) { for (Map.Entry entry : idToData.entrySet()) { String key = entry.getKey(); DataMap value = entry.getValue(); Set mainIds = idToMainIds.get(key); Set names = idToNames.get(key); if (CollectionUtils.isNotEmpty(names)) { value.put("交易对手户名", StringUtils.join(names, ";")); } if (CollectionUtils.isNotEmpty(mainIds)) { value.put("共同交易主体数", mainIds.size()); String str=""; Setjyzthm = new HashSet<>(); int count=0; for (String mainId : mainIds) { Set strings = hm.get(mainId); if(CollectionUtils.isNotEmpty(strings)){ count++; } str+=CollectionUtils.isEmpty(strings)?mainId+";":mainId+"("+StringUtils.join(strings, ",")+");"; } value.put("共同交易主体账号汇总", str); value.put("共同交易主体户名汇总", Math.min(mainIds.size(),count)); } DataMap dataMap = entry.getValue(); BigDecimal money1 = (BigDecimal) dataMap.get("交易总额"); dataMap.put("交易总额", money1.doubleValue()); BigDecimal money2 = (BigDecimal) dataMap.get("交易主体收入金额"); dataMap.put("交易主体收入金额", money2.doubleValue()); BigDecimal money3 = (BigDecimal) dataMap.get("交易主体支出金额"); dataMap.put("交易主体支出金额", money3.doubleValue()); } saveLines(idToData.values(), "共同交易主体数", mongoTemplate); } } latch.countDown(); log.info("数据分析-对手透视"); } }