package ieven.server.webapp.service.alipay; 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 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 TransferAnalysis extends Ops implements Runnable { private HeaderProperties headerProperties; List originFields; String modelId; MongoTemplate mongoTemplate; FileService fileService; CountDownLatch latch; public TransferAnalysis( 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); // 遍历账户明细全表 if (StringUtils.isNotBlank(dateFileId)) { MongoCursor cursor = getCursor(dateFileId, mongoTemplate); if (cursor.hasNext()) { newFileId = createLogicAndDeleteOld( "五联单-转账分析", modelId, headerProperties.getTransferAnalysisOutput(), mongoTemplate, fileService); insertFromTo(dateFileId, newFileId, modelId, mongoTemplate); } Set alipayIds = new HashSet<>(); Map idToData = new HashMap<>(); Document origin; while (cursor.hasNext()) { try { origin = cursor.next(); String transferFlag = origin.getString("消费名称"); if (!transferFlag.equals("转账")) { continue; } String alipayId = origin.getString("支付宝用户ID"); DataMap dataMap; if (alipayIds.contains(alipayId)) { dataMap = idToData.get(alipayId); } else { alipayIds.add(alipayId); String alipayUsername = origin.getString("支付宝户名"); dataMap = new DataMap(); dataMap.put("fileId", newFileId); dataMap.put("支付宝用户ID", alipayId); dataMap.put("支付宝户名", alipayUsername); 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); idToData.put(alipayId, dataMap); } 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); } catch (Exception exception) { log.error(exception.getMessage(), exception); } } if (CollectionUtils.isNotEmpty(idToData.values())) { for (Map.Entry entry : idToData.entrySet()) { 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(); } }