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 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; public class ScaleAnalysis extends Ops implements Runnable { private HeaderProperties headerProperties; List originFields; String modelId; MongoTemplate mongoTemplate; FileService fileService; CountDownLatch latch; public ScaleAnalysis( HeaderProperties headerProperties, List originFields, String modelId, MongoTemplate mongoTemplate, FileService fileService, CountDownLatch latch) { this.headerProperties = headerProperties; this.originFields = originFields; this.modelId = modelId; this.mongoTemplate = mongoTemplate; this.fileService = fileService; this.latch = latch; } @Override public void run() { // 直接删除并创建表 String newFileId = ""; String dateFileId = getFileId("五联单-账户明细", modelId, mongoTemplate); // 遍历账户明细全表 if (StringUtils.isNotBlank(dateFileId)) { MongoCursor cursor = getCursor(dateFileId, mongoTemplate); if (cursor.hasNext()) { createLogicAndDeleteOld( "五联单-账户透视", modelId, headerProperties.getScaleAnalysisOutput(), mongoTemplate, fileService); insertFromTo(dateFileId, newFileId, modelId, mongoTemplate); } Set alipayIds = new HashSet<>(); Map idToData = new HashMap<>(); Document origin; while (cursor.hasNext()) { origin = cursor.next(); 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); } 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(); } }