package ieven.server.webapp.service.alipay; import com.google.common.collect.Lists; import com.mongodb.client.MongoCursor; import ieven.server.webapp.domain.alipay.HeaderProperties; import ieven.server.webapp.domain.data.DataMap; import ieven.server.webapp.domain.data.Fields; import ieven.server.webapp.domain.file.FileService; import ieven.server.webapp.service.Ops; import ieven.server.webapp.util.excel.PublicStatic; 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 EndAnalysis extends Ops implements Runnable { private HeaderProperties headerProperties; List originFields; String modelId; MongoTemplate mongoTemplate; FileService fileService; CountDownLatch latch; public EndAnalysis( HeaderProperties headerProperties, List originFields, String modelId, MongoTemplate mongoTemplate, FileService fileService, CountDownLatch latch2) { this.headerProperties = headerProperties; this.originFields = originFields; this.modelId = modelId; this.mongoTemplate = mongoTemplate; this.fileService = fileService; this.latch = latch2; } @Override public void run() { // 直接删除并创建表 String newFileId = ""; String dateFileId = getFileId("五联单-账户明细", modelId, mongoTemplate); String dateFileId1 = getFileId("经侦云-账户明细", modelId, mongoTemplate); List dateFileIdList = new ArrayList<>(); if (StringUtils.isNotBlank(dateFileId)) { dateFileIdList.add(dateFileId); } if (StringUtils.isNotBlank(dateFileId1)) { dateFileIdList.add(dateFileId1); } // 遍历账户明细全表 if (StringUtils.isNotBlank(dateFileId)||StringUtils.isNotBlank(dateFileId1)) { MongoCursor cursor = getCursor(dateFileIdList, mongoTemplate); if (cursor.hasNext()) { newFileId = createLogicAndDeleteOld( "五联单-对手透视", modelId, headerProperties.getEndAnalysisOutput(), mongoTemplate, fileService ); if(StringUtils.isNotBlank(dateFileId)){ insertFromTo(dateFileId, newFileId, modelId, mongoTemplate); } if(StringUtils.isNotBlank(dateFileId1)){ insertFromTo(dateFileId1, 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("对手支付宝用户ID", alipayId); dataMap.put("对手支付宝户名", ""); dataMap.put("交易总额", new BigDecimal("0.00")); dataMap.put("主用户ID收入金额", new BigDecimal("0.00")); dataMap.put("主用户ID支出金额", new BigDecimal("0.00")); dataMap.put("主用户ID收入笔数", 0); dataMap.put("主用户ID支出笔数", 0); dataMap.put("总笔数", 0); dataMap.put("共同主用户ID数", 0); dataMap.put("共同主用户ID汇总", ""); 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 = PublicStatic.checkStrJe((String) origin.get("金额(元)")); if ("收入".equals(flagValue)) { BigDecimal oMoney = (BigDecimal) dataMap.get("主用户ID收入金额"); oMoney = oMoney.add(new BigDecimal(money)); dataMap.put("主用户ID收入金额", oMoney); int oCount = (int) dataMap.get("主用户ID收入笔数"); oCount++; dataMap.put("主用户ID收入笔数", oCount); } else if ("支出".equals(flagValue)) { BigDecimal oMoney = (BigDecimal) dataMap.get("主用户ID支出金额"); oMoney = oMoney.add(new BigDecimal(money)); dataMap.put("主用户ID支出金额", oMoney); int oCount = (int) dataMap.get("主用户ID支出笔数"); oCount++; dataMap.put("主用户ID支出笔数", 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); if (CollectionUtils.isNotEmpty(mainIds)) { value.put("共同主用户ID数", mainIds.size()); String str=""; for (String mainId : mainIds) { Set strings = hm.get(mainId); str+=CollectionUtils.isEmpty(strings)?mainId+";":mainId+"("+StringUtils.join(strings, ",")+");"; } value.put("共同主用户ID汇总", str); } Set names = idToNames.get(key); if (CollectionUtils.isNotEmpty(names)) { value.put("对手支付宝户名", StringUtils.join(names, ";")); } DataMap dataMap = entry.getValue(); BigDecimal money1 = (BigDecimal) dataMap.get("交易总额"); dataMap.put("交易总额", money1.doubleValue()); BigDecimal money2 = (BigDecimal) dataMap.get("主用户ID收入金额"); dataMap.put("主用户ID收入金额", money2.doubleValue()); BigDecimal money3 = (BigDecimal) dataMap.get("主用户ID支出金额"); dataMap.put("主用户ID支出金额", money3.doubleValue()); } saveLines(idToData.values(), "共同主用户ID数", mongoTemplate); } } latch.countDown(); } }