diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/classes/java/main/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleCountDimensionImpl.class b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/classes/java/main/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleCountDimensionImpl.class index 40bea77..6804e55 100644 Binary files a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/classes/java/main/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleCountDimensionImpl.class and b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/classes/java/main/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleCountDimensionImpl.class differ diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/tmp/compileJava/previous-compilation-data.bin b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/tmp/compileJava/previous-compilation-data.bin index 1a032d9..5f71c4a 100644 Binary files a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/tmp/compileJava/previous-compilation-data.bin and b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/job/WaterproofPaintAccountsReceivableJob.java b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/job/WaterproofPaintAccountsReceivableJob.java index 63176cd..3b3411c 100644 --- a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/job/WaterproofPaintAccountsReceivableJob.java +++ b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/job/WaterproofPaintAccountsReceivableJob.java @@ -35,29 +35,23 @@ public class WaterproofPaintAccountsReceivableJob implements IJob { private static final String DEFAULT_BKGS_TL = "北新涂料"; private static final int BATCH_SIZE = 1000; private static final int THREAD_POOL_SIZE = 2; // 线程池大小,根据需求调整 - // 板块配置 - @Override public void execute(JobExecutionContext job) throws JobExecutionException { try { String param = SDK.getJobAPI().getJobParameter(job); int timeRange = StringUtils.isNotBlank(param)?Integer.parseInt(param):0; - // 获取当前时间 LocalDate nowDate = LocalDate.now(); LocalDate startDate; - if (timeRange > 0) { startDate = nowDate.minusDays(timeRange); } else { // 默认计算去年第一天到现在的数据 startDate = nowDate.minusYears(1).withDayOfYear(1); } - LOGGER.info("开始执行防水涂料应收单计算任务,时间范围:{} 到 {}", startDate, nowDate); - // 依次处理防水和涂料两个板块 boolean allSuccess = true; for (Section section : Section.values()) { @@ -67,11 +61,9 @@ public class WaterproofPaintAccountsReceivableJob implements IJob { LOGGER.error("{}板块处理失败", section.getName()); } } - if (!allSuccess) { throw new JobExecutionException("部分板块处理失败"); } - LOGGER.info("防水涂料应收单计算任务完成,共处理 {} 天数据", nowDate.toEpochDay() - startDate.toEpochDay() + 1); } catch (Exception e) { @@ -92,6 +84,10 @@ public class WaterproofPaintAccountsReceivableJob implements IJob { // 每个板块使用独立的缓存 Map> historicalBalanceCache = new HashMap<>(); + // 新增缓存用于存储每日的累计值 + Map previousLjxsCache = new HashMap<>(); // 缓存前一天的累计销售 + Map previousLjhkCache = new HashMap<>(); // 缓存前一天的累计还款 + Map qcyeCache = new HashMap<>(); // 缓存期初余额(每个客户只需计算一次) try { // 开始清理开始时间到结束时间的数据后再进行计算更新数据 @@ -102,14 +98,10 @@ public class WaterproofPaintAccountsReceivableJob implements IJob { LOGGER.info("已删除目标表[{}]中{}条数据(时间范围: {} - {})", section.getTargetTable(), delete, startDateFormat, nowDateFormat); - // 获取RDSAPI实例 -// RDSAPI rdsapi = SDK.getCCAPI().getRDSAPI(RDS_ID); - // 查询销售组织和客户分组信息 List maps = DBSql.getMaps("SELECT QYGS, FCUSTNAME, SQ AS FPROVINCE,CS AS FCITY FROM " + section.getYsdTable() + " GROUP BY QYGS, FCUSTNAME, SQ,CS"); - if (maps == null || maps.isEmpty()) { LOGGER.warn("{}板块未查询到销售组织和客户数据", sectionName); return true; // 没有数据也算成功 @@ -133,28 +125,58 @@ public class WaterproofPaintAccountsReceivableJob implements IJob { String custName = row.getString("FCUSTNAME"); // 查询省市区信息 -// RowMap locationInfo = rdsapi.getMap( -// "SELECT FProvince, FCity FROM " + section.getYsdTable() + -// " WHERE FSaleOrgUnit = ? AND FCustName = ? ", -// saleOrgUnit, custName -// ); - String province = row != null ? row.getString("FPROVINCE") : ""; String city = row != null ? row.getString("FCITY") : ""; String district = row != null ? row.getString("FDISTRICT")!=null ? row.getString("FDISTRICT"):"": ""; - // 计算期初余额(上一年度) - LocalDate previousYearStart = currentDate.minusYears(1).withDayOfYear(1); - LocalDate previousYearEnd = currentDate.minusYears(1).withDayOfYear(365); + String cacheKey = saleOrgUnit + "_" + custName; - BigDecimal qcye = calculateInitialBalance(section, saleOrgUnit, custName, previousYearStart, previousYearEnd); + // 计算期初余额(上一年度)- 每个客户只需计算一次 + BigDecimal qcye; + if (currentDate.equals(startDate)) { + LocalDate previousYearStart = currentDate.minusYears(1).withDayOfYear(1); + LocalDate previousYearEnd = currentDate.minusYears(1).withDayOfYear(365); + qcye = calculateInitialBalance(section, saleOrgUnit, custName, previousYearStart, previousYearEnd); + qcyeCache.put(cacheKey, qcye); + } else { + qcye = qcyeCache.get(cacheKey); + if (qcye == null) { + // 如果缓存中没有,说明之前没有计算过,则计算并缓存 + LocalDate previousYearStart = currentDate.minusYears(1).withDayOfYear(1); + LocalDate previousYearEnd = currentDate.minusYears(1).withDayOfYear(365); + qcye = calculateInitialBalance(section, saleOrgUnit, custName, previousYearStart, previousYearEnd); + qcyeCache.put(cacheKey, qcye); + } + } - // 计算累计销售(本年年初到当前日期) - LocalDate currentYearStart = currentDate.withDayOfYear(1); - BigDecimal ljxs = calculateTotalSales(section, saleOrgUnit, custName, currentYearStart, currentDate); + // 计算当日销售 + BigDecimal dailySales = calculateTotalSales(section, saleOrgUnit, custName, currentDate, currentDate); + // 计算当日还款 + BigDecimal dailyRepayment = calculateTotalRepayment(section, saleOrgUnit, custName, currentDate, currentDate); - // 计算累计还款(本年年初到当前日期) - BigDecimal ljhk = calculateTotalRepayment(section, saleOrgUnit, custName, currentYearStart, currentDate); + // 计算累计销售(本年年初到当前日期)- 使用增量方式 + BigDecimal ljxs; + if (currentDate.equals(startDate)) { + // 第一天直接使用当日销售 + ljxs = dailySales; + } else { + // 后续天数:前一天的累计销售 + 当日销售 + BigDecimal previousLjxs = previousLjxsCache.getOrDefault(cacheKey, BigDecimal.ZERO); + ljxs = previousLjxs.add(dailySales); + } + previousLjxsCache.put(cacheKey, ljxs); + + // 计算累计还款(本年年初到当前日期)- 使用增量方式 + BigDecimal ljhk; + if (currentDate.equals(startDate)) { + // 第一天直接使用当日还款 + ljhk = dailyRepayment; + } else { + // 后续天数:前一天的累计还款 + 当日还款 + BigDecimal previousLjhk = previousLjhkCache.getOrDefault(cacheKey, BigDecimal.ZERO); + ljhk = previousLjhk.add(dailyRepayment); + } + previousLjhkCache.put(cacheKey, ljhk); // 计算应收余额 BigDecimal ysye = qcye.add(ljxs).subtract(ljhk); diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleCountDimensionImpl.java b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleCountDimensionImpl.java index 04fe8b8..029819e 100644 --- a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleCountDimensionImpl.java +++ b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleCountDimensionImpl.java @@ -16,6 +16,7 @@ import java.sql.Array; import java.sql.Connection; import java.sql.SQLException; import java.text.SimpleDateFormat; +import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; @@ -171,7 +172,7 @@ public class SaleCountDimensionImpl implements DataSummaryService { String xszz = map.getString("XSZZ"); String rq = map.getString("RQ"); BO bo = new BO(); - bo.set("YEARMONTH", YEAR_MONTH_FORMAT.format(rq)); + bo.set("YEARMONTH", rq.substring(0, 7)); bo.set("BKGS", bkgs); bo.set("QYGS", map.getString("QYGS")); bo.set("GC", xszz);