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/SaleDataSyncServiceImpl.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/SaleDataSyncServiceImpl.class index 377012e..9d8e498 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/SaleDataSyncServiceImpl.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/SaleDataSyncServiceImpl.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 e433ae6..c4226a5 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 3b3411c..a9283e8 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 @@ -100,7 +100,7 @@ public class WaterproofPaintAccountsReceivableJob implements IJob { // 查询销售组织和客户分组信息 List maps = DBSql.getMaps("SELECT QYGS, FCUSTNAME, SQ AS FPROVINCE,CS AS FCITY FROM " + - section.getYsdTable() + " GROUP BY QYGS, FCUSTNAME, SQ,CS"); + section.getYsdTable() + " WHERE QYGS IS NOT NULL GROUP BY QYGS, FCUSTNAME, SQ,CS"); if (maps == null || maps.isEmpty()) { LOGGER.warn("{}板块未查询到销售组织和客户数据", sectionName); 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/PurchaseDataSummaryServiceImpl.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/PurchaseDataSummaryServiceImpl.java index 0ceff8b..39a3708 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/PurchaseDataSummaryServiceImpl.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/PurchaseDataSummaryServiceImpl.java @@ -81,29 +81,41 @@ public class PurchaseDataSummaryServiceImpl implements DataSummaryService { String startDate = LocalDate.now().minusDays(1).format(DateTimeFormatter.ofPattern("yyyy-mm-dd")); // 1. 计算并保存各板块物料采购总额、总量、单价(按月存储) // monthlyMaterialSummaryBySegment(year, month, yearMonth, yearLastMonth, lastYearMonth, bkgs, distinctList); -// newmonthlyMaterialSummaryBySegment(startDate, bkgs, distinctList); + newmonthlyMaterialSummaryBySegment(startDate, bkgs, distinctList); // 2. 根据年月汇总板块、基地、年月、当期、上期、同期数据 // monthlyBaseSummaryBySegment(year, month, yearMonth, yearLastMonth, lastYearMonth, bkgs, distinctList); + newmonthlyBaseSummaryBySegment(startDate, bkgs, distinctList); // 3. 计算并保存各板块物料采购总额、总量、单价(按日存储) // dailyMaterialSummaryBySegment(year, month, day, currentDate, bkgs, distinctList); + newdailyMaterialSummaryBySegment(startDate, bkgs, distinctList); // 4. 根据日期、入库单号、物料名称分页查询 日期、入库单号、物料编码、物料名称、规格型号、 // (汇总)入库数量、单位、入库单价、(汇总)入库金额、供应商、订单编号、库存数 // dailyWarehousingSummary(year, month, day, currentDate, bkgs, distinctList); - calculateForCurrentDate(bkgs, distinctList); + newdailyWarehousingSummary(startDate, bkgs, distinctList); + +// calculateForCurrentDate(bkgs, distinctList); } else { LOGGER.info("开始执行采购数据多维度汇总计算(时间范围: {} 至 {})", dateRange.getStartDate(), dateRange.getEndDate()); String startDate = DATE_FORMAT.format(dateRange.getStartDate()); //计算并保存各板块物料采购总额、总量、单价(按月存储) -// newmonthlyMaterialSummaryBySegment(startDate, bkgs, distinctList); + newmonthlyMaterialSummaryBySegment(startDate, bkgs, distinctList); + //根据年月汇总板块、基地、年月、当期、上期、同期数据 + newmonthlyBaseSummaryBySegment(startDate, bkgs, distinctList); + //计算并保存各板块物料采购总额、总量、单价(按日存储) + newdailyMaterialSummaryBySegment(startDate, bkgs, distinctList); + // 4. 根据日期、入库单号、物料名称分页查询 日期、入库单号、物料编码、物料名称、规格型号、 + // (汇总)入库数量、单位、入库单价、(汇总)入库金额、供应商、订单编号、库存数 + newdailyWarehousingSummary(startDate, bkgs, distinctList); + // 计算月度维度数据(按月遍历) - calculateMonthlyData(dateRange, bkgs, distinctList); +// calculateMonthlyData(dateRange, bkgs, distinctList); // 计算日度维度数据(按天遍历) - calculateDailyData(dateRange, bkgs, distinctList); +// calculateDailyData(dateRange, bkgs, distinctList); LOGGER.info("采购数据多维度汇总计算完成"); } @@ -114,6 +126,362 @@ public class PurchaseDataSummaryServiceImpl implements DataSummaryService { } } + /** + * 根据日期、入库单号、物料名称分页查询 日期、入库单号、物料编码、物料名称、规格型号、 + * @param startDate + * @param bkgs + * @param distinctList + */ + private void newdailyWarehousingSummary(String startDate, String bkgs, List distinctList) { + LOGGER.info("开始计算{}入库明细日度汇总数据,板块公司:{}", startDate, bkgs); + + try { + // 1. 删除该日期已存在的汇总数据(避免重复) + String deleteSql = "DELETE FROM BO_EU_CG_NYRKMX WHERE BKGS = ? AND DATE >= ?"; + int update = DBSql.update(deleteSql, new Object[]{bkgs, startDate}); + LOGGER.info("已清理{}的旧入库明细数据", startDate); + LOGGER.info("采购_年月入库明细:{}物料采购月度汇总数据,板块公司:{},删除了{}条数据", startDate, bkgs, update); + + // 2. 计算总记录数用于分页 + String countSql = "SELECT COUNT(1) AS total FROM " + BO_EU_DWD_ORDER_RKD_HZ + " " + + "WHERE BKGS = ? AND DATE(DJRQ) >= ?"; + RowMap countResult = DBSql.getMap(countSql, bkgs, startDate); + int totalCount = countResult.getInt("total"); + LOGGER.info("共查询到{}条入库记录需要处理", totalCount); + + if (totalCount == 0) { + LOGGER.info("无入库数据需要处理,跳过"); + return; + } + + // 3. 分页处理数据 + int pageSize = 10000; + int totalPages = (int) Math.ceil((double) totalCount / pageSize); + LOGGER.info("开始分页处理入库数据,共{}页", totalPages); + + for (int page = 0; page < totalPages; page++) { + int offset = page * pageSize; + LOGGER.debug("正在处理第{}页入库数据,偏移量:{}", page + 1, offset); + String querySql = "SELECT BKGS, YEARMONTH, DJRQ, DJH, WLMC, WLBM, GGXH, SLGC, SUM(RKSL) AS RKSL, " + + " JLDW, HSDJHYF, SUM(JSHJHYF) AS JSHJHYF, GYSNAME, CGDDH, DHJE " + + "FROM "+BO_EU_DWD_ORDER_RKD_HZ+" WHERE BKGS = ? AND DATE(DJRQ) >= ? " + + "GROUP BY YEARMONTH,DJH,WLMC " + + "ORDER BY DJRQ LIMIT ? OFFSET ?"; + + List pageData = DBSql.getMaps(querySql, bkgs, startDate, pageSize, offset); + LOGGER.debug("第{}页查询到{}条记录", page + 1, pageData.size()); + + // 转换并批量插入数据 + List bos = new ArrayList<>(); + for (RowMap row : pageData) { + BO detailBO = new BO(); + detailBO.set("DATE", row.getDate("DJRQ")); // 入库日期 + detailBO.set("RKDH", row.getString("DJH")); // 入库单号 + detailBO.set("WLBM", row.getString("WLBM")); // 物料编码 + String wlmc = row.getString("WLMC"); + detailBO.set("WLMC", wlmc); // 物料名称 + detailBO.set("GGXH", row.getString("GGXH")); // 规格型号 + detailBO.set("GC", row.getString("SLGC")); // 收料工厂 + detailBO.set("RKSL", row.getDouble("RKSL")); // 入库数量 + detailBO.set("DW", row.getString("JLDW")); // 单位 + if ("泰山石膏".equals(bkgs)) { + detailBO.set("RKDJ", row.getDouble("HSDJHYF")); // 入库单价(含税单价含运费) + detailBO.set("RKJE", row.getDouble("DHJE")); // 入库金额(金额含运费) + }else { + detailBO.set("RKDJ", row.getDouble("HSDJHYF")); // 入库单价(含税单价含运费) + detailBO.set("RKJE", row.getDouble("JSHJHYF")); // 入库金额(金额含运费) + } + detailBO.set("GYS", row.getString("GYSNAME")); // 供应商 + detailBO.set("DDBH", row.getString("CGDDH")); // 订单编号 + detailBO.set("KCS", 0.00); // 库存数(默认为0,需后续计算) + detailBO.set("BKGS", bkgs); // 板块公司 + String yearmonth = String.format("%04d-%02d", row.getString("YEARMONTH")); + detailBO.set("YEARMONTH", yearmonth); // 年月 + bos.add(detailBO); + } + // 批量插入当前页数据 + if (!bos.isEmpty()) { + SDK.getBOAPI().createDataBO(BO_EU_CG_NYRKMX, bos, UserContext.fromUID("admin")); + LOGGER.debug("入库明细日度汇总数据,板块公司:{}, 第{}页数据插入成功,共{}条,数量总共{}条", + bkgs, page + 1, bos.size(),totalCount); + } + } + + LOGGER.info("{}开始入库明细日度汇总完成,共处理{}条数据", startDate, totalCount); + } catch (Exception e) { + String errorMsg = String.format("日度入库明细汇总失败(日期=%s,板块=%s): %s", + startDate, bkgs, e.getMessage()); + LOGGER.error(errorMsg, e); + throw new RuntimeException(errorMsg, e); + } + } + + /** + * 计算并保存各板块物料采购总额、总量、单价(按日存储) + * @param startDate + * @param bkgs + * @param distinctList + */ + private void newdailyMaterialSummaryBySegment(String startDate, String bkgs, List distinctList) { + try { + // 格式化日期字符串 (yyyy-MM-dd) + LOGGER.info("开始计算{}物料采购日度汇总数据,板块公司:{}", startDate, bkgs); + + // 1. 删除该日期已存在的汇总数据 + String deleteSql = "DELETE FROM " + PROCUREMENT_DETAILS_YEAR_MONTH_DAY + + " WHERE BKGS = ? AND RQ >= ?"; + int update = DBSql.update(deleteSql, new Object[]{bkgs, startDate}); + LOGGER.info("采购_年月日采购明细:{}物料采购月度汇总数据,板块公司:{},删除了{}条数据", startDate, bkgs, update); + + String querySql = "SELECT BKGS,DJRQ,WLMC, SUM(DHJE) AS tstotalAmount,SUM(JSHJHYF) AS lptotalAmount,SUM(RKSL) AS totalQuantity" + + "FROM BO_EU_DWD_ORDER_RKD_HZ WHERE BKGS = ? AND DJRQ >= ?" + + "GROUP BY WLMC,DJRQ" + + "ORDER BY DJRQ"; + List dailyData = DBSql.getMaps(querySql, bkgs, startDate); + // 批量插入 + if (dailyData==null){ + return; + } + List bos = new ArrayList<>(); + for (RowMap row : dailyData) { + String bkgs1 = row.getString("BKGS"); + String wlmc = row.getString("WLMC"); + String djrq = row.getString("DJRQ"); + Double totalQuantity = row.getDouble("totalQuantity"); + double safeTotalQuantity = totalQuantity != null ? totalQuantity : 0.0; + Double totalAmount = 0.0; + double avgPrice = 0.0; + BO summaryBO = new BO(); + summaryBO.set("BKGS", bkgs1); + summaryBO.set("WLMC", wlmc); + summaryBO.set("RQ", djrq); + if (bkgs1.equals("泰山石膏")){ + totalAmount = row.getDouble("tstotalAmount"); + double safeTotalAmount = totalAmount != null ? totalAmount : 0.0; + if (wlmc.equals("乳液") || wlmc.equals("钛白粉") || wlmc.equals("重钙")) { + double adjustedQuantity = safeTotalQuantity / 1000; + summaryBO.set("CGZL", adjustedQuantity); + if (safeTotalAmount != 0 && adjustedQuantity != 0) { + avgPrice = safeTotalAmount / adjustedQuantity; + } + } else { + summaryBO.set("CGZL", safeTotalQuantity); + if (safeTotalAmount != 0 && safeTotalQuantity != 0) { + avgPrice = safeTotalAmount / safeTotalQuantity; + } + } + summaryBO.set("CGZE", safeTotalAmount); + }else { + totalAmount = row.getDouble("lptotalAmount"); + double safeTotalAmount = totalAmount != null ? totalAmount : 0.0; + if (wlmc.equals("乳液") || wlmc.equals("钛白粉") || wlmc.equals("重钙")) { + double adjustedQuantity = safeTotalQuantity / 1000; + summaryBO.set("CGZL", adjustedQuantity); + if (safeTotalAmount != 0 && adjustedQuantity != 0) { + avgPrice = safeTotalAmount / adjustedQuantity; + } + } else { + summaryBO.set("CGZL", safeTotalQuantity); + if (safeTotalAmount != 0 && safeTotalQuantity != 0) { + avgPrice = safeTotalAmount / safeTotalQuantity; + } + } + summaryBO.set("CGZE", safeTotalAmount); + } + summaryBO.set("PJDJ", avgPrice); + bos.add(summaryBO); + } + if (!bos.isEmpty()) { + SDK.getBOAPI().createDataBO(PROCUREMENT_DETAILS_YEAR_MONTH_DAY, bos, UserContext.fromUID("admin")); + } + + LOGGER.info("成功保存{}条日度汇总数据,板块:{}", bos.size(), bkgs); + } catch (Exception e) { + String errorMsg = String.format("日度汇总计算失败(日期=%s,板块=%s): %s", startDate, bkgs, e.getMessage()); + LOGGER.error(errorMsg, e); + throw new RuntimeException(errorMsg, e); + } + } + + /** + * 根据年月汇总板块、基地、年月、当期、上期、同期数据 + * @param startDate + * @param bkgs + * @param distinctList + */ + private void newmonthlyBaseSummaryBySegment(String startDate, String bkgs, List distinctList) { + try { + LOGGER.info("开始计算{}物料采购各基地月度汇总数据,板块公司:{}", startDate, bkgs); + + // 1. 删除该月份已存在的汇总数据(避免重复) + String deleteSql = "DELETE FROM " + JD_PROCUREMENT_DETAILS_YEAR_MONTH + + " WHERE BKGS = ? AND YEARMONTH >= ?"; + int update = DBSql.update(deleteSql, new Object[]{bkgs, startDate}); + LOGGER.info("采购_基地_年月采购明细:{}物料采购月度汇总数据,板块公司:{},删除了{}条数据", startDate, bkgs, update); + + String currentMonthSql = "SELECT c.BKGS,c.DJRQ,c.YEARMONTH,c.WLMC,c.SLGC,c.tstotalAmount,c.lptotalAmount,c.totalQuantity," + + " ly.tstotalAmount AS ly_tstotalAmount,ly.lptotalAmount AS ly_lptotalAmount,ly.totalQuantity AS ly_totalQuantity," + + " lm.tstotalAmount AS lm_tstotalAmount,lm.lptotalAmount AS lm_lptotalAmount,lm.totalQuantity AS lm_totalQuantity " + + "FROM (" + + " SELECT BKGS,MAX(DJRQ) AS DJRQ,YEARMONTH,WLMC,SLGC,SUM(DHJE) AS tstotalAmount," + + " SUM(JSHJHYF) AS lptotalAmount,SUM(RKSL) AS totalQuantity,YEAR(DJRQ) AS Year,MONTH(DJRQ) AS Month " + + " FROM BO_EU_DWD_ORDER_RKD_HZ " + + " WHERE BKGS = ? AND DJRQ >= ? " + + " GROUP BY WLMC, SLGC, YEARMONTH" + + " ) c LEFT JOIN (" + + " SELECT WLMC,SLGC,SUM(DHJE) AS tstotalAmount,SUM(JSHJHYF) AS lptotalAmount, " + + " SUM(RKSL) AS totalQuantity,YEAR(DJRQ) AS Year,MONTH(DJRQ) AS Month " + + " FROM BO_EU_DWD_ORDER_RKD_HZ " + + " WHERE BKGS = ? AND DJRQ >= DATE_SUB(?, INTERVAL 1 YEAR)" + + " GROUP BY WLMC, SLGC, YEAR(DJRQ), MONTH(DJRQ) " + + ") ly ON c.WLMC = ly.WLMC AND c.SLGC = ly.SLGC AND c.Month = ly.Month AND ly.Year = c.Year - 1 " + + " LEFT JOIN ( " + + " SELECT WLMC,SLGC,SUM(DHJE) AS tstotalAmount,SUM(JSHJHYF) AS lptotalAmount,SUM(RKSL) AS totalQuantity, " + + " YEAR(DJRQ) AS Year,MONTH(DJRQ) AS Month " + + " FROM BO_EU_DWD_ORDER_RKD_HZ " + + " WHERE BKGS = ? AND DJRQ >= DATE_SUB(?, INTERVAL 1 MONTH)" + + " GROUP BY WLMC, SLGC, YEAR(DJRQ), MONTH(DJRQ) " + + ") lm ON c.WLMC = lm.WLMC AND c.SLGC = lm.SLGC " + + " AND ((c.Month > 1 AND c.Year = lm.Year AND c.Month = lm.Month + 1) OR (c.Month = 1 AND c.Year = lm.Year + 1 AND lm.Month = 12)) " + + "ORDER BY c.YEARMONTH"; + List currentMonthData = DBSql.getMaps(currentMonthSql, bkgs, startDate, bkgs, startDate,bkgs, startDate); + + if (currentMonthData==null){ + return; + } + + // 5. 批量插入 + List bos = new ArrayList<>(); + for (RowMap currentMonthRow : currentMonthData) { + String base = currentMonthRow.getString("SLGC"); + String wlmc = currentMonthRow.getString("WLMC"); + String bkgs1 = currentMonthRow.getString("BKGS"); + String yearMonth = currentMonthRow.getString("YEARMONTH"); + BO summaryBO = new BO(); + summaryBO.set("BKGS", bkgs1); + summaryBO.set("JD", base); + summaryBO.set("WLMC",wlmc); + summaryBO.set("YEARMONTH", yearMonth); + double avgPrice = 0.0; + double lyavgPrice = 0.0; + double lmavgPrice = 0.0; + if (bkgs1.equals("泰山石膏")) { + double totalAmount = currentMonthRow.getDouble("tstotalAmount"); + double lytotalAmount = currentMonthRow.getDouble("ly_tstotalAmount"); + double lmtotalAmount = currentMonthRow.getDouble("lm_tstotalAmount"); + double totalQuantity = 0.00; + double lytotalQuantity = 0.00; + double lmtotalQuantity = 0.00; + if (wlmc.equals("乳液") || wlmc.equals("钛白粉") || wlmc.equals("重钙")) { + totalQuantity = BigDecimal.valueOf(currentMonthRow.getDouble("totalQuantity")) + .divide(BigDecimal.valueOf(1000), 4, BigDecimal.ROUND_HALF_UP).doubleValue(); + lytotalQuantity = BigDecimal.valueOf(currentMonthRow.getDouble("ly_totalQuantity")) + .divide(BigDecimal.valueOf(1000), 4, BigDecimal.ROUND_HALF_UP).doubleValue(); + lmtotalQuantity = BigDecimal.valueOf(currentMonthRow.getDouble("lm_totalQuantity")) + .divide(BigDecimal.valueOf(1000), 4, BigDecimal.ROUND_HALF_UP).doubleValue(); + summaryBO.set("CGZL", totalQuantity); + summaryBO.set("TQCGZL", lytotalQuantity); + summaryBO.set("SQCGZL", lmtotalQuantity); + }else { + totalQuantity = BigDecimal.valueOf(currentMonthRow.getDouble("totalQuantity")).doubleValue(); + lytotalQuantity = BigDecimal.valueOf(currentMonthRow.getDouble("ly_totalQuantity")).doubleValue(); + lmtotalQuantity = BigDecimal.valueOf(currentMonthRow.getDouble("lm_totalQuantity")).doubleValue(); + summaryBO.set("CGZL", totalQuantity); + summaryBO.set("TQCGZL", lytotalQuantity); + summaryBO.set("SQCGZL", lmtotalQuantity); + } + // 添加除数非零检查 + if (totalAmount != 0 && totalQuantity != 0) { + avgPrice = BigDecimal.valueOf(totalAmount) + .divide(BigDecimal.valueOf(totalQuantity), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); + } else { + avgPrice = 0; + } + //同期 + if (lytotalAmount != 0 && lytotalQuantity != 0) { + lyavgPrice = BigDecimal.valueOf(totalAmount) + .divide(BigDecimal.valueOf(totalQuantity), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); + } else { + lyavgPrice = 0; + } + //上期 + if (lmtotalAmount != 0 && lmtotalQuantity != 0) { + lmavgPrice = BigDecimal.valueOf(totalAmount) + .divide(BigDecimal.valueOf(totalQuantity), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); + } else { + lmavgPrice = 0; + } + summaryBO.set("CGZE", totalAmount); + summaryBO.set("TQCGZE", lytotalAmount); + summaryBO.set("SQCGZE", lmtotalAmount); + }else { + double totalAmount = currentMonthRow.getDouble("lptotalAmount"); + double lytotalAmount = currentMonthRow.getDouble("ly_lptotalAmount"); + double lmtotalAmount = currentMonthRow.getDouble("lm_lptotalAmount"); + double totalQuantity = 0.00; + double lytotalQuantity = 0.00; + double lmtotalQuantity = 0.00; + if (wlmc.equals("乳液") || wlmc.equals("钛白粉") || wlmc.equals("重钙")) { + totalQuantity = BigDecimal.valueOf(currentMonthRow.getDouble("totalQuantity")) + .divide(BigDecimal.valueOf(1000), 4, BigDecimal.ROUND_HALF_UP).doubleValue(); + lytotalQuantity = BigDecimal.valueOf(currentMonthRow.getDouble("ly_totalQuantity")) + .divide(BigDecimal.valueOf(1000), 4, BigDecimal.ROUND_HALF_UP).doubleValue(); + lmtotalQuantity = BigDecimal.valueOf(currentMonthRow.getDouble("lm_totalQuantity")) + .divide(BigDecimal.valueOf(1000), 4, BigDecimal.ROUND_HALF_UP).doubleValue(); + summaryBO.set("CGZL", totalQuantity); + summaryBO.set("TQCGZL", lytotalQuantity); + summaryBO.set("SQCGZL", lmtotalQuantity); + }else { + totalQuantity = BigDecimal.valueOf(currentMonthRow.getDouble("totalQuantity")).doubleValue(); + lytotalQuantity = BigDecimal.valueOf(currentMonthRow.getDouble("ly_totalQuantity")).doubleValue(); + lmtotalQuantity = BigDecimal.valueOf(currentMonthRow.getDouble("lm_totalQuantity")).doubleValue(); + summaryBO.set("CGZL", totalQuantity); + summaryBO.set("TQCGZL", lytotalQuantity); + summaryBO.set("SQCGZL", lmtotalQuantity); + } + // 添加除数非零检查 + if (totalAmount != 0 && totalQuantity != 0) { + avgPrice = BigDecimal.valueOf(totalAmount) + .divide(BigDecimal.valueOf(totalQuantity), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); + } else { + avgPrice = 0; + } + //同期 + if (lytotalAmount != 0 && lytotalQuantity != 0) { + lyavgPrice = BigDecimal.valueOf(totalAmount) + .divide(BigDecimal.valueOf(totalQuantity), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); + } else { + lyavgPrice = 0; + } + //上期 + if (lmtotalAmount != 0 && lmtotalQuantity != 0) { + lmavgPrice = BigDecimal.valueOf(totalAmount) + .divide(BigDecimal.valueOf(totalQuantity), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); + } else { + lmavgPrice = 0; + } + summaryBO.set("CGZE", totalAmount); + summaryBO.set("TQCGZE", lytotalAmount); + summaryBO.set("SQCGZE", lmtotalAmount); + } + summaryBO.set("PJDJ", avgPrice); + summaryBO.set("SQPJDJ", lmavgPrice); + summaryBO.set("TQPJDJ", lyavgPrice); + bos.add(summaryBO); + } + if (!bos.isEmpty()) { + // 批量插入数据 + SDK.getBOAPI().createDataBO(JD_PROCUREMENT_DETAILS_YEAR_MONTH, bos, UserContext.fromUID("admin")); + } + LOGGER.info("成功保存{}条月度基地汇总数据,板块:{}", bos.size(), bkgs); + + } catch (Exception e) { + String errorMsg = String.format("月度基地汇总计算失败(开始时间=%s,板块=%s): %s", startDate, bkgs, e.getMessage()); + LOGGER.error(errorMsg, e); + throw new RuntimeException(errorMsg, e); + } + } + /** * 计算并保存各板块物料采购总额、总量、单价(按月存储) * 逻辑:按物料名称(WLMC)分组,计算月度采购总额(SUM(JSHJ))、采购总量(SUM(YSSL))和平均单价(采购总额/采购总量) @@ -131,33 +499,33 @@ public class PurchaseDataSummaryServiceImpl implements DataSummaryService { int update = DBSql.update(deleteSql, new Object[]{bkgs, startDate}); LOGGER.info("采购_年月采购明细:{}物料采购月度汇总数据,板块公司:{},删除了{}条数据",startDate, bkgs, update); - String currentMonthSql = "SELECT CONCAT(YEAR(DJRQ), '-', LPAD(MONTH(DJRQ), 2, '0')) ASyear_month,c.Year AS year,c.Month AS month,c.WLMC AS WLMC," + + String currentMonthSql = "SELECT CONCAT(c.Year, '-', LPAD(c.Month, 2, '0')) ASyear_month,c.Year AS year,c.Month AS month,c.WLMC AS WLMC," + " c.tstotalAmount AS tstotalAmount,c.lptotalAmount AS lptotalAmount,c.totalQuantity AS totalQuantity," + " ly.tstotalAmount AS LY_tstotalAmount,ly.lptotalAmount AS LY_lptotalAmount,ly.totalQuantity AS LY_totalQuantity," + " lm.tstotalAmount AS LM_tstotalAmount,lm.lptotalAmount AS LM_lptotalAmount,lm.totalQuantity AS LM_totalQuantity" + - " FROM (" + - " SELECT WLMC,SUM(DHJE) AS tstotalAmount,SUM(JSHJHYF) AS lptotalAmount,SUM(RKSL) AS totalQuantity,YEAR(DJRQ) AS Year,MONTH(DJRQ) AS Month" + - " FROM BO_EU_DWD_ORDER_RKD_HZ" + - " WHERE BKGS = ? AND DJRQ >= DATE_FORMAT(DATE_SUB(?, INTERVAL 1 YEAR), '%Y-%m-%d')" + - " GROUP BY WLMC, YEAR(DJRQ), MONTH(DJRQ)" + - " ) c" + + "FROM (" + + " SELECT WLMC,SUM(DHJE) AS tstotalAmount,SUM(JSHJHYF) AS lptotalAmount,SUM(RKSL) AS totalQuantity," + + " YEAR(DJRQ) AS Year,MONTH(DJRQ) AS Month" + + " FROM BO_EU_DWD_ORDER_RKD_HZ" + + " WHERE BKGS = ? AND DJRQ >= DATE_SUB( ? , INTERVAL 1 YEAR)" + + " GROUP BY WLMC, YEAR(DJRQ), MONTH(DJRQ)" + + " ) c LEFT JOIN (" + + " SELECT WLMC,SUM(DHJE) AS tstotalAmount,SUM(JSHJHYF) AS lptotalAmount,SUM(RKSL) AS totalQuantity," + + " YEAR(DJRQ) AS Year,MONTH(DJRQ) AS Month" + + " FROM BO_EU_DWD_ORDER_RKD_HZ" + + " WHERE BKGS = ? AND DJRQ >= DATE_SUB( ? , INTERVAL 2 YEAR)" + + " GROUP BY WLMC, YEAR(DJRQ), MONTH(DJRQ)" + + " ) ly ON c.WLMC = ly.WLMC AND c.Month = ly.Month AND ly.Year = c.Year - 1" + " LEFT JOIN (" + " SELECT WLMC,SUM(DHJE) AS tstotalAmount,SUM(JSHJHYF) AS lptotalAmount,SUM(RKSL) AS totalQuantity," + - " YEAR(DJRQ) AS Year,MONTH(DJRQ) AS Month" + + " YEAR(DJRQ) AS Year,MONTH(DJRQ) AS Month" + " FROM BO_EU_DWD_ORDER_RKD_HZ" + - " WHERE BKGS = ? AND DJRQ >= DATE_FORMAT(DATE_SUB(?, INTERVAL 1 YEAR), '%Y-%m-%d')" + + " WHERE BKGS = ? AND DJRQ >= DATE_SUB(?, INTERVAL 1 YEAR)" + " GROUP BY WLMC, YEAR(DJRQ), MONTH(DJRQ)" + - ") ly ON c.WLMC = ly.WLMC AND c.Month = ly.Month AND ly.Year = c.Year - 1" + - " LEFT JOIN (" + - " SELECT WLMC,SUM(DHJE) AS tstotalAmount,SUM(JSHJHYF) AS lptotalAmount,SUM(RKSL) AS totalQuantity," + - " YEAR(DJRQ) AS Year,MONTH(DJRQ) AS Month" + - " FROM BO_EU_DWD_ORDER_RKD_HZ" + - " WHERE BKGS = ? AND DJRQ >= DATE_FORMAT(DATE_SUB(?, INTERVAL 1 YEAR), '%Y-%m-%d')" + - " GROUP BY WLMC, YEAR(DJRQ), MONTH(DJRQ)" + - ") lm ON c.WLMC = lm.WLMC" + - " AND ( (c.Month > 1 AND c.Year = lm.Year AND c.Month = lm.Month + 1) OR(c.Month = 1 AND c.Year = lm.Year + 1 AND lm.Month = 12))" + - "WHERE c.Year = YEAR(?)" + - "ORDER BY c.Year, c.Month"; + " ) lm ON c.WLMC = lm.WLMC" + + " AND ((c.Month > 1 AND c.Year = lm.Year AND c.Month = lm.Month + 1)" + + " OR (c.Month = 1 AND c.Year = lm.Year + 1 AND lm.Month = 12))" + + "WHERE c.Year = YEAR(?) ORDER BY c.Year, c.Month"; List currentMonthData = DBSql.getMaps(currentMonthSql, bkgs, startDate,bkgs,startDate,bkgs,startDate,startDate); if (currentMonthData==null){ @@ -287,17 +655,17 @@ public class PurchaseDataSummaryServiceImpl implements DataSummaryService { Date currentDate = new Date(System.currentTimeMillis()); // 1. 计算并保存各板块物料采购总额、总量、单价(按月存储) - monthlyMaterialSummaryBySegment(year, month, yearMonth, yearLastMonth, lastYearMonth, bkgs, distinctList); +// monthlyMaterialSummaryBySegment(year, month, yearMonth, yearLastMonth, lastYearMonth, bkgs, distinctList); // 2. 根据年月汇总板块、基地、年月、当期、上期、同期数据 - monthlyBaseSummaryBySegment(year, month, yearMonth, yearLastMonth, lastYearMonth, bkgs, distinctList); +// monthlyBaseSummaryBySegment(year, month, yearMonth, yearLastMonth, lastYearMonth, bkgs, distinctList); // 3. 计算并保存各板块物料采购总额、总量、单价(按日存储) - dailyMaterialSummaryBySegment(year, month, day, currentDate, bkgs, distinctList); +// dailyMaterialSummaryBySegment(year, month, day, currentDate, bkgs, distinctList); // 4. 根据日期、入库单号、物料名称分页查询 日期、入库单号、物料编码、物料名称、规格型号、 // (汇总)入库数量、单位、入库单价、(汇总)入库金额、供应商、订单编号、库存数 - dailyWarehousingSummary(year, month, day, currentDate, bkgs, distinctList); +// dailyWarehousingSummary(year, month, day, currentDate, bkgs, distinctList); } @@ -338,7 +706,7 @@ public class PurchaseDataSummaryServiceImpl implements DataSummaryService { // monthlyMaterialSummaryBySegment(year, month, yearMonth, yearLastMonth, lastYearMonth, bkgs, distinctList); // 2. 根据年月汇总板块、基地、年月、当期、上期、同期数据 - monthlyBaseSummaryBySegment(year, month, yearMonth, yearLastMonth, lastYearMonth, bkgs, distinctList); +// monthlyBaseSummaryBySegment(year, month, yearMonth, yearLastMonth, lastYearMonth, bkgs, distinctList); // 移动到下个月 monthCal.add(Calendar.MONTH, 1); @@ -364,11 +732,11 @@ public class PurchaseDataSummaryServiceImpl implements DataSummaryService { LOGGER.info("计算日度汇总数据: {}-{}-{}", year, month, day); // 计算并保存各板块物料采购总额、总量、单价(按日存储) - dailyMaterialSummaryBySegment(year, month, day, currentDate, bkgs, distinctList); +// dailyMaterialSummaryBySegment(year, month, day, currentDate, bkgs, distinctList); // 根据日期、入库单号、物料名称分页查询 日期、入库单号、物料编码、物料名称、规格型号、 //(汇总)入库数量、单位、入库单价、(汇总)入库金额、供应商、订单编号、库存数 - dailyWarehousingSummary(year, month, day, currentDate, bkgs, distinctList); +// dailyWarehousingSummary(year, month, day, currentDate, bkgs, distinctList); // 下一天 dayCal.add(Calendar.DATE, 1); 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/SaleDataSummaryServiceImpl.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/SaleDataSummaryServiceImpl.java index 258ff92..79f0b26 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/SaleDataSummaryServiceImpl.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/SaleDataSummaryServiceImpl.java @@ -8,6 +8,7 @@ import com.actionsoft.bpms.util.UtilDate; import com.actionsoft.sdk.local.SDK; import com.awspaas.user.apps.bnbm.datalinkup.entity.DateRange; import com.awspaas.user.apps.bnbm.datalinkup.service.DataSummaryService; +import com.awspaas.user.apps.bnbm.datalinkup.util.SaleUtil; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -174,66 +175,83 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService { + " WHERE DATE >= '" + startDate + "' AND BKGS = '"+bkgs+"'"); LOGGER.info("准备同步{}-产品单价日明细数据,删除了{}条数据",startDate,delete); - String sql = "SELECT DZRQ,LB_1,BKGS,SQ,SUM(XSSL) AS tssales, SUM(ZSSL) AS lpsales,SUM(SSJERMB) AS revenue" + - " FROM " +SALES_DETAIL_TABLE+ - " WHERE LB_1 IN ('石膏板', '轻钢龙骨', '涂料') AND (SQ LIKE '%新疆%' OR SQ LIKE '%海南%' OR SQ LIKE '%西藏%')" + - " GROUP BY DZRQ,LB_1,BKGS ORDER BY DZRQ"; + HashMap sfMap = new HashMap<>(); + sfMap.put("新疆维吾尔自治区","SQ LIKE '%新疆%' "); + sfMap.put("海南省","SQ LIKE '%海南%' "); + sfMap.put("西藏自治区","SQ LIKE '%西藏%' "); + sfMap.put("一体化","SQ LIKE '%新疆%' OR SQ LIKE '%海南%' OR SQ LIKE '%西藏%') "); + for (String key : sfMap.keySet()) { + // 获取省份简称 + String abbreviation = SaleUtil.getProvinceAbbreviation(key); + String sfSql = sfMap.get(key); - List maps = DBSql.getMaps(sql); - if (maps!=null){ - ArrayList list = new ArrayList<>(); - for (RowMap map : maps) { - BigDecimal tssales = BigDecimal.valueOf(map.getDouble("tssales")); - BigDecimal lpsales = BigDecimal.valueOf(map.getDouble("lpsales")); - BigDecimal revenue = BigDecimal.valueOf(map.getDouble("revenue")); - BigDecimal unitPrice = BigDecimal.ZERO; - String bkgs1 = map.getString("BKGS"); - String lb_1 = map.getString("LB_1"); + String sql = "SELECT DZRQ,LB_1,LB_2,BKGS,SQ,SUM(XSSL) AS tssales, SUM(ZSSL) AS lpsales,SUM(SSJERMB) AS revenue" + + " FROM " +SALES_DETAIL_TABLE+ + " WHERE LB_1 IN ('石膏板', '轻钢龙骨', '涂料') AND ("+sfSql+")" + + " GROUP BY DZRQ,LB_1,BKGS ORDER BY DZRQ"; - BO priceBO = new BO(); - priceBO.set("BKGS", bkgs1); - priceBO.set("DATE", map.getString("DZRQ")); - if ("北新嘉宝莉".equals(bkgs)) { - priceBO.set("PRODUCT_TYPE", "涂料"); - }else { - priceBO.set("PRODUCT_TYPE", lb_1); - } - if (bkgs1.equals("泰山石膏")){ - // 计算单价(避免除零错误) - if (tssales.compareTo(BigDecimal.ZERO) > 0) { - // 石膏板单位转换:万元/万平方米 → 元/平方米 - if ("石膏板".equals(lb_1)) { - unitPrice = revenue.divide(tssales, 4, RoundingMode.HALF_UP); - priceBO.set("SALES_VOLUME", tssales.setScale(2, RoundingMode.HALF_UP)); - } - // 轻钢龙骨单位:元/吨 - if ("轻钢龙骨".equals(lb_1)) { - unitPrice = revenue.divide(lpsales, 2, RoundingMode.HALF_UP); - } - priceBO.set("SALES_VOLUME", lpsales.setScale(2, RoundingMode.HALF_UP)); + List maps = DBSql.getMaps(sql); + if (maps!=null){ + // 循环外先获取下公装家装、基材面材类别 + List gzjzList = SDK.getBOAPI().query("BO_EU_DATALINKUP_CPJZGZJCMC").orderBy("CPLB_L2").desc().list(); + ArrayList list = new ArrayList<>(); + for (RowMap map : maps) { + BigDecimal tssales = BigDecimal.valueOf(map.getDouble("tssales")); + BigDecimal lpsales = BigDecimal.valueOf(map.getDouble("lpsales")); + BigDecimal revenue = BigDecimal.valueOf(map.getDouble("revenue")); + BigDecimal unitPrice = BigDecimal.ZERO; + String bkgs1 = map.getString("BKGS"); + String lb_1 = map.getString("LB_1"); + String lb_2 = map.getString("LB_2"); + + BO priceBO = new BO(); + priceBO.set("BKGS", bkgs1); + priceBO.set("DATE", map.getString("DZRQ")); + if ("北新嘉宝莉".equals(bkgs)) { + priceBO.set("PRODUCT_TYPE", "涂料"); + }else { + priceBO.set("PRODUCT_TYPE", lb_1); } - }else { - // 计算单价(避免除零错误) - if (lpsales.compareTo(BigDecimal.ZERO) > 0) { - // 石膏板单位转换:万元/万平方米 → 元/平方米 - if ("石膏板".equals(lb_1)) { - unitPrice = revenue.divide(lpsales, 4, RoundingMode.HALF_UP); + if (bkgs1.equals("泰山石膏")){ + // 计算单价(避免除零错误) + if (tssales.compareTo(BigDecimal.ZERO) > 0) { + // 石膏板单位转换:万元/万平方米 → 元/平方米 + if ("石膏板".equals(lb_1)) { + unitPrice = revenue.divide(tssales, 4, RoundingMode.HALF_UP); + priceBO.set("SALES_VOLUME", tssales.setScale(2, RoundingMode.HALF_UP)); + } + // 轻钢龙骨单位:元/吨 + if ("轻钢龙骨".equals(lb_1)) { + unitPrice = revenue.divide(lpsales, 2, RoundingMode.HALF_UP); + } + priceBO.set("SALES_VOLUME", lpsales.setScale(2, RoundingMode.HALF_UP)); } - // 轻钢龙骨单位:元/吨 - if ("轻钢龙骨".equals(lb_1)) { - unitPrice = revenue.divide(lpsales, 2, RoundingMode.HALF_UP); + }else { + // 计算单价(避免除零错误) + if (lpsales.compareTo(BigDecimal.ZERO) > 0) { + // 石膏板单位转换:万元/万平方米 → 元/平方米 + if ("石膏板".equals(lb_1)) { + unitPrice = revenue.divide(lpsales, 4, RoundingMode.HALF_UP); + } + // 轻钢龙骨单位:元/吨 + if ("轻钢龙骨".equals(lb_1)) { + unitPrice = revenue.divide(lpsales, 2, RoundingMode.HALF_UP); + } + priceBO.set("SALES_VOLUME", lpsales.setScale(2, RoundingMode.HALF_UP)); } - priceBO.set("SALES_VOLUME", lpsales.setScale(2, RoundingMode.HALF_UP)); } - } - priceBO.set("REVENUE_AMOUNT", revenue.setScale(2, RoundingMode.HALF_UP)); - priceBO.set("UNIT_PRICE", unitPrice.setScale(2, RoundingMode.HALF_UP)); + priceBO.set("REVENUE_AMOUNT", revenue.setScale(2, RoundingMode.HALF_UP)); + priceBO.set("UNIT_PRICE", unitPrice.setScale(2, RoundingMode.HALF_UP)); + priceBO.set("SHENGQU", abbreviation);//省区 + String[] gzjzStrings = SaleUtil.matchSingleField(bkgs, lb_1, lb_2, gzjzList, "其他", "其他","其他"); + priceBO.set("MC_JC", gzjzStrings[1]);//面材/基材 + priceBO.set("JZ_GZ", gzjzStrings[0]);//家装/工装 - list.add(priceBO); + list.add(priceBO); + } + SDK.getBOAPI().createDataBO(UNIT_PRICE_DAILY_TABLE,list,UserContext.fromUID("admin")); } - SDK.getBOAPI().createDataBO(UNIT_PRICE_DAILY_TABLE,list,UserContext.fromUID("admin")); } - LOGGER.info("产品单价日明细数据保存成功"); } catch (Exception e) { String errorMsg = String.format("产品单价日明细数据计算失败: %s", e.getMessage()); @@ -257,63 +275,75 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService { + " WHERE YEARMONTH >= '" + yearMonth + "' AND BKGS = '"+bkgs+"'"); LOGGER.info("准备同步{}-应收账款年度汇总(按月存储),删除了{}条数据",startDate,delete); - String sql = "SELECT CONCAT(YEAR(RQ), '-', LPAD(MONTH(RQ), 2, '0')) ASyear_month,BKGS," + - " SUM(QCYE) AS QCYE,SUM(LJXS) AS LJXS,SUM(LJHK) AS LJHK,(SUM(QCYE) + SUM(LJXS) - SUM(LJHK)) AS receivable" + - " FROM BO_EU_BNBM_DATALINKUP_XS_YSL" + - " WHERE RQ >= ? AND BKGS = ? AND SHENGQU IN ('新疆维吾尔自治区', '海南', '西藏')" + - " GROUP BY YEAR(RQ), MONTH(RQ)" + - " ORDER BY YEAR(RQ), MONTH(RQ)"; + //分别遍历省份 + HashMap sfMap = new HashMap<>(); + sfMap.put("新疆维吾尔自治区","SHENGQU IN ('新疆维吾尔自治区') "); + sfMap.put("海南省","SHENGQU IN ('海南') "); + sfMap.put("西藏自治区","SHENGQU IN ('西藏') "); + sfMap.put("一体化","SHENGQU IN ('新疆维吾尔自治区', '海南', '西藏') "); + for (String key : sfMap.keySet()) { + // 获取省份简称 + String abbreviation = SaleUtil.getProvinceAbbreviation(key); + String sfSql = sfMap.get(key); + String sql = "SELECT CONCAT(YEAR(RQ), '-', LPAD(MONTH(RQ), 2, '0')) ASyear_month,BKGS," + + " SUM(QCYE) AS QCYE,SUM(LJXS) AS LJXS,SUM(LJHK) AS LJHK,(SUM(QCYE) + SUM(LJXS) - SUM(LJHK)) AS receivable" + + " FROM BO_EU_BNBM_DATALINKUP_XS_YSL" + + " WHERE RQ >= ? AND BKGS = ? AND "+sfSql+"" + + " GROUP BY YEAR(RQ), MONTH(RQ)" + + " ORDER BY YEAR(RQ), MONTH(RQ)"; - List maps = DBSql.getMaps(sql, startDate, bkgs); + List maps = DBSql.getMaps(sql, startDate, bkgs); - //查询去年数据 - LocalDate localDate = LocalDate.parse(startDate).minusYears(1); - String lastDate = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - List lastMaps = DBSql.getMaps(sql, lastDate, bkgs); - Map resultMap = lastMaps.stream() - .filter(row -> row.getString("ASyear_month") != null) // 过滤掉键为 null 的条目 - .collect(Collectors.toMap( - row -> row.getString("ASyear_month"), - row -> row, - (oldValue, newValue) -> newValue // 重复时取新值 - )); + //查询去年数据 + LocalDate localDate = LocalDate.parse(startDate).minusYears(1); + String lastDate = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + List lastMaps = DBSql.getMaps(sql, lastDate, bkgs); + Map resultMap = lastMaps.stream() + .filter(row -> row.getString("ASyear_month") != null) // 过滤掉键为 null 的条目 + .collect(Collectors.toMap( + row -> row.getString("ASyear_month"), + row -> row, + (oldValue, newValue) -> newValue // 重复时取新值 + )); - if (maps!=null){ - ArrayList list = new ArrayList<>(); - for (RowMap map : maps) { - String aSyear_month = map.getString("ASyear_month"); - BO bo = new BO(); - bo.set("YEARMONTH",aSyear_month);//年月(YYYY-MM) - bo.set("BKGS",map.getString("BKGS"));//板块公司 + if (maps!=null){ + ArrayList list = new ArrayList<>(); + for (RowMap map : maps) { + String aSyear_month = map.getString("ASyear_month"); + BO bo = new BO(); + bo.set("YEARMONTH",aSyear_month);//年月(YYYY-MM) + bo.set("BKGS",map.getString("BKGS"));//板块公司 // bo.set("RECEIVABLE_TYPE",map.getString(""));//应收类型(板骨/涂料) - bo.set("OPENING_BALANCE",map.getString("QCYE"));//期初余额(万元) - bo.set("CUMULATIVE_SALES",map.getString("LJXS"));//累计销售(万元) - bo.set("CUMULATIVE_REPAYMENT",map.getString("LJHK"));//累计回款(万元) - bo.set("ENDING_BALANCE",map.getString("receivable"));//期末余额(万元) - // 定义日期格式 - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM"); - // 解析字符串为YearMonth对象 - YearMonth current = YearMonth.parse(yearMonth, formatter); - // 获取上一年同月 - YearMonth previous = current.minusYears(1); - String lastYearMonth = previous.format(formatter); - RowMap map1 = resultMap.get(lastYearMonth); - if (map1!=null){ - double lastDou = StringUtils.isNotBlank(map1.getString("receivable"))?Double.parseDouble(map1.getString("receivable")):0; - BigDecimal last = BigDecimal.valueOf(lastDou); - double currentDou = StringUtils.isNotBlank(map.getString("receivable"))?Double.parseDouble(map.getString("receivable")):0; - BigDecimal bigDecimal = BigDecimal.valueOf(currentDou); - if (last == null || last.compareTo(BigDecimal.ZERO) == 0) { - bo.set("YOY_RATE",0.0);//同比变化率(%) - }else { - bo.set("YOY_RATE",bigDecimal.subtract(last) - .divide(last, 4, RoundingMode.HALF_UP) - .multiply(BigDecimal.valueOf(100)));//同比变化率(%) + bo.set("OPENING_BALANCE",map.getString("QCYE"));//期初余额(万元) + bo.set("CUMULATIVE_SALES",map.getString("LJXS"));//累计销售(万元) + bo.set("CUMULATIVE_REPAYMENT",map.getString("LJHK"));//累计回款(万元) + bo.set("ENDING_BALANCE",map.getString("receivable"));//期末余额(万元) + // 定义日期格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM"); + // 解析字符串为YearMonth对象 + YearMonth current = YearMonth.parse(yearMonth, formatter); + // 获取上一年同月 + YearMonth previous = current.minusYears(1); + String lastYearMonth = previous.format(formatter); + RowMap map1 = resultMap.get(lastYearMonth); + if (map1!=null){ + double lastDou = StringUtils.isNotBlank(map1.getString("receivable"))?Double.parseDouble(map1.getString("receivable")):0; + BigDecimal last = BigDecimal.valueOf(lastDou); + double currentDou = StringUtils.isNotBlank(map.getString("receivable"))?Double.parseDouble(map.getString("receivable")):0; + BigDecimal bigDecimal = BigDecimal.valueOf(currentDou); + if (last == null || last.compareTo(BigDecimal.ZERO) == 0) { + bo.set("YOY_RATE",0.0);//同比变化率(%) + }else { + bo.set("YOY_RATE",bigDecimal.subtract(last) + .divide(last, 4, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)));//同比变化率(%) + } } + bo.set("SHENGQU",abbreviation);//省区 + list.add(bo); } - list.add(bo); + SDK.getBOAPI().createDataBO(RECEIVABLE_YEAR_TABLE,list,UserContext.fromUID("admin")); } - SDK.getBOAPI().createDataBO(RECEIVABLE_YEAR_TABLE,list,UserContext.fromUID("admin")); } LOGGER.info("应收账款月度累计数据保存成功"); } catch (Exception e) { @@ -340,30 +370,43 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService { + " WHERE YEARMONTH >= '" + yearMonth + "' AND BKGS = '"+bkgs+"'"); LOGGER.info("{}:准备同步{}-应收账款品牌月明细,删除了{}条数据",bkgs,yearMonth,delete); - String sql = "SELECT CONCAT(YEAR(t1.RQ), '-', LPAD(MONTH(t1.RQ), 2, '0')) ASyear_month,t1.BKGS AS BKGS, YEAR(t1.RQ) AS year,MONTH(t1.RQ) AS month,t1.SHENGQU,SUM(t1.YSYE) AS receivable " + - " FROM BO_EU_BNBM_DATALINKUP_XS_YSL t1 " + - " INNER JOIN (" + - " SELECT MAX(RQ) AS max_rq,YEAR(RQ) AS year,MONTH(RQ) AS month " + - " FROM BO_EU_BNBM_DATALINKUP_XS_YSL " + - " WHERE RQ >= ? AND BKGS = ? AND SHENGQU IN ('新疆维吾尔自治区', '海南', '西藏') " + - " GROUP BY YEAR(RQ), MONTH(RQ) " + - ") t2 ON t1.RQ = t2.max_rq AND YEAR(t1.RQ) = t2.year AND MONTH(t1.RQ) = t2.month " + - " WHERE t1.BKGS = ? AND t1.SHENGQU IN ('新疆维吾尔自治区', '海南', '西藏') " + - " GROUP BY YEAR(t1.RQ),MONTH(t1.RQ),t1.SHENGQU " + - " ORDER BY year, month, t1.SHENGQU"; + //分别遍历省份 + HashMap sfMap = new HashMap<>(); + sfMap.put("新疆维吾尔自治区","SHENGQU IN ('新疆维吾尔自治区') "); + sfMap.put("海南省","SHENGQU IN ('海南') "); + sfMap.put("西藏自治区","SHENGQU IN ('西藏') "); + sfMap.put("一体化","SHENGQU IN ('新疆维吾尔自治区', '海南', '西藏') "); + for (String key : sfMap.keySet()) { + // 获取省份简称 + String abbreviation = SaleUtil.getProvinceAbbreviation(key); + // 根据省份value值查询数据 + String sfSql = sfMap.get(key); + String sql = "SELECT CONCAT(YEAR(t1.RQ), '-', LPAD(MONTH(t1.RQ), 2, '0')) ASyear_month,t1.BKGS AS BKGS, YEAR(t1.RQ) AS year,MONTH(t1.RQ) AS month,t1.SHENGQU,SUM(t1.YSYE) AS receivable " + + " FROM BO_EU_BNBM_DATALINKUP_XS_YSL t1 " + + " INNER JOIN (" + + " SELECT MAX(RQ) AS max_rq,YEAR(RQ) AS year,MONTH(RQ) AS month " + + " FROM BO_EU_BNBM_DATALINKUP_XS_YSL " + + " WHERE RQ >= ? AND BKGS = ? AND "+sfSql+" " + + " GROUP BY YEAR(RQ), MONTH(RQ) " + + ") t2 ON t1.RQ = t2.max_rq AND YEAR(t1.RQ) = t2.year AND MONTH(t1.RQ) = t2.month " + + " WHERE t1.BKGS = ? AND t1."+sfSql+" " + + " GROUP BY YEAR(t1.RQ),MONTH(t1.RQ),t1.SHENGQU " + + " ORDER BY year, month, t1.SHENGQU"; - List maps = DBSql.getMaps(sql, startDate, bkgs, bkgs); - if (maps!=null){ - ArrayList list = new ArrayList<>(); - for (RowMap map : maps) { - BO bo = new BO(); - bo.set("YEARMONTH",map.getString("ASyear_month"));//年月(YYYY-MM) - bo.set("BKGS",map.getString("BKGS"));//板块公司 - bo.set("BRAND",map.getString("BKGS"));//品牌(龙牌/泰山/梦牌/北新/嘉宝莉) - bo.set("RECEIVABLE_AMOUNT",map.getString("receivable"));//应收账款余额(万元) - list.add(bo); + List maps = DBSql.getMaps(sql, startDate, bkgs, bkgs); + if (maps!=null){ + ArrayList list = new ArrayList<>(); + for (RowMap map : maps) { + BO bo = new BO(); + bo.set("YEARMONTH",map.getString("ASyear_month"));//年月(YYYY-MM) + bo.set("BKGS",map.getString("BKGS"));//板块公司 + bo.set("BRAND",map.getString("BKGS"));//品牌(龙牌/泰山/梦牌/北新/嘉宝莉) + bo.set("RECEIVABLE_AMOUNT",map.getString("receivable"));//应收账款余额(万元) + bo.set("SHENGQU",abbreviation);//省区 + list.add(bo); + } + SDK.getBOAPI().createDataBO(RECEIVABLE_BRAND_MONTHLY_TABLE,list,UserContext.fromUID("admin")); } - SDK.getBOAPI().createDataBO(RECEIVABLE_BRAND_MONTHLY_TABLE,list,UserContext.fromUID("admin")); } LOGGER.info("应收账款品牌月明细数据保存成功"); } catch (Exception e) { @@ -388,51 +431,64 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService { + " WHERE YEARMONTH >= '" + yearMonth + "' AND BKGS = '"+bkgs+"'"); LOGGER.info("准备同步{}-产品销售明细数据,删除了{}条数据",yearMonth,delete); - String sql = "SELECT BKGS,LB_1,LB_2 AS brand,CONCAT(YEAR, '-', LPAD(MONTH, 2, '0')) ASyear_month," + - " SUM(ZSSL) AS total_zssl, SUM(XSSL)/10000 AS total_xssl_10k, SUM(SSJERMB) AS total_ssjermb," + - " (SUM(ZSSL)/(SUM(SUM(ZSSL)) OVER (PARTITION BY LB_1, YEAR(DZRQ), MONTH(DZRQ)))) *100 AS lb1_month_zssl_total," + - " ((SUM(XSSL)/10000)/(SUM(SUM(XSSL)) OVER (PARTITION BY LB_1, YEAR(DZRQ), MONTH(DZRQ)) / 10000))*100 AS lb1_month_xssl_total_10k," + - " (SUM(SSJERMB)/(SUM(SUM(SSJERMB)) OVER (PARTITION BY LB_1, YEAR(DZRQ), MONTH(DZRQ))))*100 AS lb1_month_ssjermb_total" + - " FROM BO_EU_BNBM_DATALINKUP_XS_XSL_HZ " + - " WHERE DZRQ>? AND BKGS = ? AND LB_1 IN('石膏板','轻钢龙骨','涂料') AND (SQ LIKE '%新疆%' OR SQ LIKE '%海南%' OR SQ LIKE '%西藏%') " + - " GROUP BY LB_2,year, month" + - " ORDER BY year, month"; - List maps = DBSql.getMaps(sql, startDate, bkgs); - ArrayList list = new ArrayList<>(); - if (maps!=null){ - for (RowMap map : maps) { - String lb_1 = map.getString("LB_1"); - String year_month = map.getString("ASyear_month"); - String brand = map.getString("brand"); + //分别遍历省份 + HashMap sfMap = new HashMap<>(); + sfMap.put("新疆维吾尔自治区","SQ LIKE '%新疆%'"); + sfMap.put("海南省","SQ LIKE '%海南%'"); + sfMap.put("西藏自治区","SQ LIKE '%西藏%'"); + sfMap.put("一体化","SQ LIKE '%新疆%' OR SQ LIKE '%海南%' OR SQ LIKE '%西藏%'"); + for (String key : sfMap.keySet()) { + // 获取省份简称 + String abbreviation = SaleUtil.getProvinceAbbreviation(key); + // 根据省份value值查询数据 + String sfSql = sfMap.get(key); + String sql = "SELECT BKGS,LB_1,LB_2 AS brand,CONCAT(YEAR, '-', LPAD(MONTH, 2, '0')) ASyear_month," + + " SUM(ZSSL) AS total_zssl, SUM(XSSL)/10000 AS total_xssl_10k, SUM(SSJERMB) AS total_ssjermb," + + " (SUM(ZSSL)/(SUM(SUM(ZSSL)) OVER (PARTITION BY LB_1, YEAR(DZRQ), MONTH(DZRQ)))) *100 AS lb1_month_zssl_total," + + " ((SUM(XSSL)/10000)/(SUM(SUM(XSSL)) OVER (PARTITION BY LB_1, YEAR(DZRQ), MONTH(DZRQ)) / 10000))*100 AS lb1_month_xssl_total_10k," + + " (SUM(SSJERMB)/(SUM(SUM(SSJERMB)) OVER (PARTITION BY LB_1, YEAR(DZRQ), MONTH(DZRQ))))*100 AS lb1_month_ssjermb_total" + + " FROM BO_EU_BNBM_DATALINKUP_XS_XSL_HZ " + + " WHERE DZRQ>? AND BKGS = ? AND LB_1 IN('石膏板','轻钢龙骨','涂料') AND ("+sfSql+") " + + " GROUP BY LB_2,year, month" + + " ORDER BY year, month"; + List maps = DBSql.getMaps(sql, startDate, bkgs); + ArrayList list = new ArrayList<>(); + if (maps!=null){ + for (RowMap map : maps) { + String lb_1 = map.getString("LB_1"); + String year_month = map.getString("ASyear_month"); + String brand = map.getString("brand"); - BO productBO = new BO(); - productBO.set("BKGS", bkgs); // 新增BKGS字段 - productBO.set("YEARMONTH", year_month); - if ("北新嘉宝莉".equals(bkgs) || "北新涂料".equals(bkgs)) { - if ("其他".equals(lb_1)){ + BO productBO = new BO(); + productBO.set("BKGS", bkgs); // 新增BKGS字段 + productBO.set("YEARMONTH", year_month); + if ("北新嘉宝莉".equals(bkgs) || "北新涂料".equals(bkgs)) { + if ("其他".equals(lb_1)){ + productBO.set("PRODUCT_TYPE", "其他"); + }else { + productBO.set("PRODUCT_TYPE", "涂料"); + } + } else if ("石膏板".equals(lb_1) || "轻钢龙骨".equals(lb_1) ) { + productBO.set("PRODUCT_TYPE", lb_1); + } else { productBO.set("PRODUCT_TYPE", "其他"); - }else { - productBO.set("PRODUCT_TYPE", "涂料"); } - } else if ("石膏板".equals(lb_1) || "轻钢龙骨".equals(lb_1) ) { - productBO.set("PRODUCT_TYPE", lb_1); - } else { - productBO.set("PRODUCT_TYPE", "其他"); + productBO.set("BRAND", brand); + // 设置销量及占比 + if (bkgs.contains("泰山")){ + productBO.set("SALES_VOLUME",map.getString("total_xssl_10k"));// 销售量 + productBO.set("SALES_VOLUME_RATIO",map.getString("lb1_month_xssl_total_10k"));// 销量占比(%) + }else { + productBO.set("SALES_VOLUME",map.getString("total_zssl"));// 销售量 + productBO.set("SALES_VOLUME_RATIO",map.getString("lb1_month_zssl_total"));// 销量占比(%) + } + productBO.set("REVENUE_AMOUNT",map.getString("total_ssjermb"));// 营业收入(万元) + productBO.set("REVENUE_RATIO",map.getString("lb1_month_ssjermb_total"));// 收入占比(%) + productBO.set("SHENGQU",abbreviation);// 省区 + list.add(productBO); } - productBO.set("BRAND", brand); - // 设置销量及占比 - if (bkgs.contains("泰山")){ - productBO.set("SALES_VOLUME",map.getString("total_xssl_10k"));// 销售量 - productBO.set("SALES_VOLUME_RATIO",map.getString("lb1_month_xssl_total_10k"));// 销量占比(%) - }else { - productBO.set("SALES_VOLUME",map.getString("total_zssl"));// 销售量 - productBO.set("SALES_VOLUME_RATIO",map.getString("lb1_month_zssl_total"));// 销量占比(%) - } - productBO.set("REVENUE_AMOUNT",map.getString("total_ssjermb"));// 营业收入(万元) - productBO.set("REVENUE_RATIO",map.getString("lb1_month_ssjermb_total"));// 收入占比(%) - list.add(productBO); + SDK.getBOAPI().createDataBO(PRODUCT_MONTHLY_TABLE,list,UserContext.fromUID("admin")); } - SDK.getBOAPI().createDataBO(PRODUCT_MONTHLY_TABLE,list,UserContext.fromUID("admin")); } LOGGER.info("产品销售月明细数据保存成功"); @@ -457,35 +513,47 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService { int delete = DBSql.update("DELETE FROM " + MATCHING_RATE_YEAR_TABLE + " WHERE YEARMONTH >= '" + yearMonth + "' AND BKGS = '"+bkgs+"'"); LOGGER.info("{}:准备同步{}产品配套率数据,删除了{}条数据",bkgs,yearMonth,delete); + //分别遍历省份 + HashMap sfMap = new HashMap<>(); + sfMap.put("新疆维吾尔自治区","SQ LIKE '%新疆%'"); + sfMap.put("海南省","SQ LIKE '%海南%'"); + sfMap.put("西藏自治区","SQ LIKE '%西藏%'"); + sfMap.put("一体化","SQ LIKE '%新疆%' OR SQ LIKE '%海南%' OR SQ LIKE '%西藏%'"); + for (String key : sfMap.keySet()) { + // 获取省份简称 + String abbreviation = SaleUtil.getProvinceAbbreviation(key); + // 根据省份value值查询数据 + String sfSql = sfMap.get(key); + String sql = "SELECT CONCAT(YEAR, '-', LPAD(MONTH, 2, '0')) ASyear_month,YEAR(DZRQ) AS year, MONTH(DZRQ) AS month, SUM(CASE WHEN LB_1 = '石膏板' THEN ZSSL ELSE 0 END) AS gypsum_board_sales, SUM(CASE WHEN LB_1 = '轻钢龙骨' THEN ZSSL ELSE 0 END) AS steel_keel_sales, " + + " CASE " + + " WHEN SUM(CASE WHEN LB_1 = '轻钢龙骨' THEN ZSSL ELSE 0 END) > 0 " + + " THEN ROUND(SUM(CASE WHEN LB_1 = '石膏板' THEN ZSSL ELSE 0 END) / " + + " SUM(CASE WHEN LB_1 = '轻钢龙骨' THEN ZSSL ELSE 0 END), 4) " + + " ELSE 0 " + + " END AS gypsum_to_keel_ratio " + + " FROM BO_EU_BNBM_DATALINKUP_XS_XSL_HZ " + + " WHERE DZRQ >= ? AND BKGS = ? AND ("+sfSql+") AND LB_1 IN ('石膏板', '轻钢龙骨') " + + " GROUP BY YEAR(DZRQ), MONTH(DZRQ)" + + " ORDER BY year, month"; - String sql = "SELECT CONCAT(YEAR, '-', LPAD(MONTH, 2, '0')) ASyear_month,YEAR(DZRQ) AS year, MONTH(DZRQ) AS month, SUM(CASE WHEN LB_1 = '石膏板' THEN ZSSL ELSE 0 END) AS gypsum_board_sales, SUM(CASE WHEN LB_1 = '轻钢龙骨' THEN ZSSL ELSE 0 END) AS steel_keel_sales, " + - " CASE " + - " WHEN SUM(CASE WHEN LB_1 = '轻钢龙骨' THEN ZSSL ELSE 0 END) > 0 " + - " THEN ROUND(SUM(CASE WHEN LB_1 = '石膏板' THEN ZSSL ELSE 0 END) / " + - " SUM(CASE WHEN LB_1 = '轻钢龙骨' THEN ZSSL ELSE 0 END), 4) " + - " ELSE 0 " + - " END AS gypsum_to_keel_ratio " + - " FROM BO_EU_BNBM_DATALINKUP_XS_XSL_HZ " + - " WHERE DZRQ >= ? AND BKGS = ? AND (SQ LIKE '%新疆%' OR SQ LIKE '%海南%' OR SQ LIKE '%西藏%') AND LB_1 IN ('石膏板', '轻钢龙骨') " + - " GROUP BY YEAR(DZRQ), MONTH(DZRQ)" + - " ORDER BY year, month"; - - List maps = DBSql.getMaps(sql, startDate, bkgs); - ArrayList list = new ArrayList<>(); - if (maps!=null) { - for (RowMap map : maps) { - String aSyear_month = map.getString("ASyear_month"); - BO matchingRateBO = new BO(); - matchingRateBO.set("YEARMONTH", aSyear_month); - matchingRateBO.set("BKGS", bkgs); - matchingRateBO.set("GYPSUM_SALES_VOLUME", map.getString("gypsum_board_sales")); - matchingRateBO.set("STEEL_SALES_VOLUME", map.getString("steel_keel_sales")); - matchingRateBO.set("MATCHING_RATE", map.getString("gypsum_to_keel_ratio")); - list.add(matchingRateBO); + List maps = DBSql.getMaps(sql, startDate, bkgs); + ArrayList list = new ArrayList<>(); + if (maps!=null) { + for (RowMap map : maps) { + String aSyear_month = map.getString("ASyear_month"); + BO matchingRateBO = new BO(); + matchingRateBO.set("YEARMONTH", aSyear_month); + matchingRateBO.set("BKGS", bkgs); + matchingRateBO.set("GYPSUM_SALES_VOLUME", map.getString("gypsum_board_sales")); + matchingRateBO.set("STEEL_SALES_VOLUME", map.getString("steel_keel_sales")); + matchingRateBO.set("MATCHING_RATE", map.getString("gypsum_to_keel_ratio")); + matchingRateBO.set("SHENGQU", abbreviation); + list.add(matchingRateBO); + } } + // 保存数据 + SDK.getBOAPI().createDataBO(MATCHING_RATE_YEAR_TABLE,list,UserContext.fromUID("admin")); } - // 保存数据 - SDK.getBOAPI().createDataBO(MATCHING_RATE_YEAR_TABLE,list,UserContext.fromUID("admin")); LOGGER.info("产品配套率月度累计数据保存成功"); } catch (Exception e) { String errorMsg = String.format("产品配套率月度累计数据计算失败: %s", e.getMessage()); @@ -498,32 +566,32 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService { /** * 按当前日期计算(无时间范围时使用) */ - private void calculateForCurrentDate(String bkgs) { - Calendar cal = Calendar.getInstance(); - int year = cal.get(Calendar.YEAR); - int month = cal.get(Calendar.MONTH) + 1; - int day = cal.get(Calendar.DAY_OF_MONTH); - String yearMonth = String.format("%04d-%02d", year, month); - Date currentDate = new Date(System.currentTimeMillis()); - - // 1. 计算并保存产品配套率年度数据(按月存储) - calculateAndSaveMatchingRate(year, month, yearMonth, bkgs); - - // 2. 计算并保存产品销售月明细数据 - calculateAndSaveProductMonthly(year, month, yearMonth, bkgs); - - // 3. 计算并保存应收账款品牌月明细 - calculateAndSaveReceivableBrandMonthly(year, month, yearMonth, bkgs); - - // 4. 计算并保存应收账款年度汇总(按月存储) - calculateAndSaveReceivableYear(year, month, yearMonth, bkgs); - - // 5. 计算并保存营业收入年度汇总(按月存储) - calculateAndSaveRevenueYear(year, month, yearMonth, bkgs); - - // 6. 计算并保存产品单价日明细 - calculateAndSaveUnitPriceDaily(year, month, day, currentDate, bkgs); - } +// private void calculateForCurrentDate(String bkgs) { +// Calendar cal = Calendar.getInstance(); +// int year = cal.get(Calendar.YEAR); +// int month = cal.get(Calendar.MONTH) + 1; +// int day = cal.get(Calendar.DAY_OF_MONTH); +// String yearMonth = String.format("%04d-%02d", year, month); +// Date currentDate = new Date(System.currentTimeMillis()); +// +// // 1. 计算并保存产品配套率年度数据(按月存储) +// calculateAndSaveMatchingRate(year, month, yearMonth, bkgs); +// +// // 2. 计算并保存产品销售月明细数据 +// calculateAndSaveProductMonthly(year, month, yearMonth, bkgs); +// +// // 3. 计算并保存应收账款品牌月明细 +// calculateAndSaveReceivableBrandMonthly(year, month, yearMonth, bkgs); +// +// // 4. 计算并保存应收账款年度汇总(按月存储) +// calculateAndSaveReceivableYear(year, month, yearMonth, bkgs); +// +// // 5. 计算并保存营业收入年度汇总(按月存储) +// calculateAndSaveRevenueYear(year, month, yearMonth, bkgs); +// +// // 6. 计算并保存产品单价日明细 +// calculateAndSaveUnitPriceDaily(year, month, day, currentDate, bkgs); +// } /** * 计算月度维度数据 @@ -849,26 +917,38 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService { int lastYear = year - 1; int lastYearMonth = month; // 去年同月 - if (bkgs.equals("泰山石膏") || bkgs.equals("梦牌") || bkgs.equals("龙牌")) { - // 处理石膏板数据 - 当年当前月 - saveRevenueYearData(yearMonth, "石膏板", - getRevenueToMonth(year, month, "石膏板", bkgs), - getRevenueToMonth(lastYear, lastYearMonth, "石膏板", bkgs), - bkgs); + //分别遍历省份 + HashMap sfMap = new HashMap<>(); + sfMap.put("新疆维吾尔自治区","SQ LIKE '%新疆%' "); + sfMap.put("海南省","SQ LIKE '%海南%' "); + sfMap.put("西藏自治区","SQ LIKE '%西藏%' "); + sfMap.put("一体化","SQ LIKE '%新疆%' OR SQ LIKE '%海南%' OR SQ LIKE '%西藏%') "); + for (String key : sfMap.keySet()) { + // 获取省份简称 + String abbreviation = SaleUtil.getProvinceAbbreviation(key); + String sfSql = sfMap.get(key); + + if (bkgs.equals("泰山石膏") || bkgs.equals("梦牌") || bkgs.equals("龙牌")) { + // 处理石膏板数据 - 当年当前月 + saveRevenueYearData(yearMonth, "石膏板", + getRevenueToMonth(year, month, "石膏板", bkgs, sfSql), + getRevenueToMonth(lastYear, lastYearMonth, "石膏板", bkgs, sfSql), + bkgs,abbreviation); + } + + // 处理轻钢龙骨数据 - 当年当前月 + saveRevenueYearData(yearMonth, "轻钢龙骨", + getRevenueToMonth(year, month, "轻钢龙骨", bkgs,sfSql), + getRevenueToMonth(lastYear, lastYearMonth, "轻钢龙骨", bkgs,sfSql), + bkgs,abbreviation); + + // 处理涂料数据 - 当年1月到当前月 + saveRevenueYearData(yearMonth, "涂料", + getRevenueToMonth(year, month, "涂料", bkgs,sfSql), + getRevenueToMonth(lastYear, lastYearMonth, "涂料", bkgs,sfSql), + bkgs,abbreviation); } - // 处理轻钢龙骨数据 - 当年当前月 - saveRevenueYearData(yearMonth, "轻钢龙骨", - getRevenueToMonth(year, month, "轻钢龙骨", bkgs), - getRevenueToMonth(lastYear, lastYearMonth, "轻钢龙骨", bkgs), - bkgs); - - // 处理涂料数据 - 当年1月到当前月 - saveRevenueYearData(yearMonth, "涂料", - getRevenueToMonth(year, month, "涂料", bkgs), - getRevenueToMonth(lastYear, lastYearMonth, "涂料", bkgs), - bkgs); - LOGGER.info("营业收入月度累计数据保存成功"); } catch (Exception e) { String errorMsg = String.format("营业收入月度累计数据计算失败: %s", e.getMessage()); @@ -881,7 +961,7 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService { * 保存营业收入月度累计数据 */ private void saveRevenueYearData(String yearMonth, String category, - BigDecimal currentRevenue, BigDecimal lastRevenue, String bkgs) { + BigDecimal currentRevenue, BigDecimal lastRevenue, String bkgs,String abbreviation) { BigDecimal yoy = calculateYoy(currentRevenue, lastRevenue); BO revenueBO = createBaseBO(bkgs); @@ -900,6 +980,7 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService { revenueBO.set("REVENUE_AMOUNT", currentRevenue.setScale(2, RoundingMode.HALF_UP)); revenueBO.set("YOY_RATE", yoy.setScale(2, RoundingMode.HALF_UP)); + revenueBO.set("SHENGQU", abbreviation);//省区 saveSummaryData(revenueBO, REVENUE_YEAR_TABLE); } @@ -1049,7 +1130,7 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService { /** * 获取产品从1月到指定月份的累计营收 */ - private BigDecimal getRevenueToMonth(int year, int month, String category, String bkgs) { + private BigDecimal getRevenueToMonth(int year, int month, String category, String bkgs, String sfSql) { String sql = "SELECT SUM(SSJERMB) AS revenue " + "FROM " + SALES_DETAIL_TABLE + " " + // "WHERE YEAR(DZRQ) = '"+year+"' AND MONTH(DZRQ) BETWEEN 1 AND '"+month+"' AND LB_1 LIKE '%"+category+"%' AND BKGS = '"+bkgs+"'"+ 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/SaleDataSyncServiceImpl.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/SaleDataSyncServiceImpl.java index 7d51a84..5c7a5a2 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/SaleDataSyncServiceImpl.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/SaleDataSyncServiceImpl.java @@ -756,6 +756,8 @@ public class SaleDataSyncServiceImpl implements DataSyncService { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String startDate = ""; String endDate = ""; + // 查询梦牌区域 + List mpqyList = SDK.getBOAPI().query("BO_EU_DATALINKUP_QYGSED").addQuery("BKGS = ", "梦牌").list(); try { do { if (startDated == null || endDated == null) { @@ -810,13 +812,28 @@ public class SaleDataSyncServiceImpl implements DataSyncService { } } //修改产量类型1 -// if ("龙牌".equals(map.getString("BKGS")) -// && ("装饰石膏板".equals(map.getString("LB_1")) || "鲁班装饰万能板".equals(map.getString("LB_1")))){ -// bo.set("LB_1","石膏板"); -// } else if ("泰山石膏".equals(map.getString("BKGS")) && ("装饰板".equals(map.getString("LB_1")))) { -// bo.set("LB_1","石膏板"); -// } - LOGGER.info("泰山应收的数据:{}",bo.toJSONObject()); + if ("龙牌".equals(map.getString("BKGS")) + && ("装饰石膏板".equals(map.getString("LB_1")) || "鲁班装饰万能板".equals(map.getString("LB_1")))){ + bo.set("LB_1","石膏板"); + } else if ("泰山石膏".equals(map.getString("BKGS")) && ("装饰板".equals(map.getString("LB_1")))) { + bo.set("LB_1","石膏板"); + } +// LOGGER.info("泰山应收的数据:{}",bo.toJSONObject()); + //销售汇总表修改区域公司 + if ("梦牌".equals(map.getString("BKGS")) && hzb.equals("BO_EU_BNBM_DATALINKUP_XS_XSL_HZ")){ + String cs = bo.getString("CS"); + String sq = bo.getString("SQ"); + for (BO bo1 : mpqyList) { + String ss = bo1.getString("SS"); + if (ss.contains(cs)){ + bo.set("QYGS",bo1.getString("QYGS")); + } else if (ss.contains(sq)) { + bo.set("QYGS",bo1.getString("QYGS")); + }else { + bo.set("QYGS","其他"); + } + } + } bos.add(bo); } diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/util/SaleUtil.java b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/util/SaleUtil.java index ba93f00..e9f90ad 100644 --- a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/util/SaleUtil.java +++ b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/util/SaleUtil.java @@ -1,6 +1,7 @@ package com.awspaas.user.apps.bnbm.datalinkup.util; import com.actionsoft.bpms.bo.engine.BO; +import com.actionsoft.sdk.local.SDK; import java.util.List; @@ -63,4 +64,21 @@ public class SaleUtil { return 0; } + + /** + * 获取省份简称 + * @param sf 省份全称 + * @return + */ + public static String getProvinceAbbreviation(String sf) { + String sfjc = ""; + BO bo_eu_1755768181783 = SDK.getBOAPI().query("BO_EU_1755768181783").addQuery("F_D2IYKX5I = ", sf).detail(); + if (bo_eu_1755768181783==null){ + sfjc = "其他"; + }else { + sfjc = bo_eu_1755768181783.getString("SQ_SHORT"); + } + return sfjc; + } + }