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 a6f99ff..242215b 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 @@ -175,98 +175,75 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService { int delete = DBSql.update("DELETE FROM " + UNIT_PRICE_DAILY_TABLE + " WHERE DATE >= '" + startDate + "' AND BKGS = '"+bkgs+"'"); LOGGER.info("准备同步{}-产品单价日明细数据,删除了{}条数据",startDate,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); - String sfSql = sfMap.get(key); - - String sql = "SELECT DZRQ,LB_1,LB_2,LB_3,BKGS,SQ,CS,SUM(XSSL) AS tssales, SUM(ZSSL) AS lpsales,SUM(SSJERMB) AS revenue" + - " FROM " +SALES_DETAIL_TABLE+ - " WHERE LB_1 IN ('石膏板', '轻钢龙骨', '涂料') AND ("+sfSql+")" + - " GROUP BY BKGS,LB_1,DZRQ,BKGS,SQ ORDER BY DZRQ"; - - 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"); - String lb_3 = map.getString("LB_3"); - String dzrq = map.getString("DZRQ"); - - BO priceBO = new BO(); - priceBO.set("BKGS", bkgs1); - priceBO.set("DATE", dzrq); - priceBO.set("CITY", map.getString("CS")); - 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)); - } - }else { - // 计算单价(避免除零错误) - if (lpsales.compareTo(BigDecimal.ZERO) > 0) { - // 石膏板单位转换:万元/万平方米 → 元/平方米 - if ("石膏板".equals(lb_1)) { - unitPrice = revenue.divide(tssales, 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("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,lb_3, gzjzList, "其他", "其他","其他"); - priceBO.set("MC_JC", gzjzStrings[1]);//面材/基材 - priceBO.set("JZ_GZ", gzjzStrings[0]);//家装/工装 - priceBO.set("PROD_CAT", gzjzStrings[2]);//产品类型 - String monthPeriod = SaleUtil.getMonthPeriod(dzrq); - priceBO.set("XUN", monthPeriod);//月寻 - - list.add(priceBO); - } - SDK.getBOAPI().createDataBO(UNIT_PRICE_DAILY_TABLE,list,UserContext.fromUID("admin")); - - //更新城市名称 - int update = DBSql.update("UPDATE" + - " BO_EU_DATALINKUP_FACT_UNIT_PRICE_DAILY a " + - " INNER JOIN " + - " BO_EU_YTH_CCJCWH b ON a.CITY = b.CS " + - " SET " + - " a.CITY_SHORT = b.CSJC"); - LOGGER.info("一体化产品单价日明细更新城市名称"); + String sql = "SELECT " + + " DZRQ, " + + " LB_1, " + + " LB_2, " + + " LB_3, " + + " BKGS, " + + " CASE " + + " WHEN SQ LIKE '%海南%' THEN '海南' " + + " WHEN SQ LIKE '%新疆%' THEN '新疆' " + + " WHEN SQ LIKE '%西藏%' THEN '西藏' " + + " END AS PROVINCE, " + + " CS, " + + " -- 条件判断:如果是轻钢龙骨则用ZSSL,否则用XSSL " + + " SUM(CASE WHEN LB_1 = '轻钢龙骨' THEN ZSSL ELSE XSSL END) AS SALES_VOLUME, " + + " SUM(NMNY) AS REVENUE_AMOUNT, " + + " -- 单价计算也需要同步使用对应的数量字段 " + + " SUM(NMNY) / SUM(CASE WHEN LB_1 = '轻钢龙骨' THEN ZSSL ELSE XSSL END) AS UNIT_PRICE " + + "FROM " + + " BO_EU_BNBM_DATALINKUP_XS_XSL_HZ " + + "WHERE " + + " LB_1 IN ('石膏板', '轻钢龙骨', '涂料') " + + " AND DZRQ >= ? " + + " AND BKGS = ? " + + " AND (SQ LIKE '%海南%' OR SQ LIKE '%新疆%' OR SQ LIKE '%西藏%') " + + "GROUP BY " + + " DZRQ, LB_1, LB_2, LB_3, BKGS, SQ, CS " + + "ORDER BY " + + " DZRQ"; + List maps = DBSql.getMaps(sql, startDate, bkgs); + 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) { + String bkgs1 = map.getString("BKGS"); + String lb_1 = map.getString("LB_1"); + String lb_2 = map.getString("LB_2"); + String lb_3 = map.getString("LB_3"); + String dzrq = map.getString("DZRQ"); + String province = map.getString("PROVINCE"); + String sales_volume = map.getString("SALES_VOLUME"); + String revenue_amount = map.getString("REVENUE_AMOUNT"); + String unit_price = map.getString("UNIT_PRICE"); + BO priceBO = new BO(); + priceBO.set("BKGS", bkgs1); + priceBO.set("DATE", dzrq); + priceBO.set("CITY", map.getString("CS")); + priceBO.set("SALES_VOLUME", sales_volume); + priceBO.set("REVENUE_AMOUNT", revenue_amount); + priceBO.set("UNIT_PRICE", unit_price); + priceBO.set("SHENGQU", province);//省区 + String[] gzjzStrings = SaleUtil.matchSingleField(bkgs, lb_1, lb_2,lb_3, gzjzList, "其他", "其他","其他"); + priceBO.set("MC_JC", gzjzStrings[1]);//面材/基材 + priceBO.set("JZ_GZ", gzjzStrings[0]);//家装/工装 + priceBO.set("PROD_CAT", gzjzStrings[2]);//产品类型 + String monthPeriod = SaleUtil.getMonthPeriod(dzrq); + priceBO.set("XUN", monthPeriod);//月寻 + list.add(priceBO); } + SDK.getBOAPI().createDataBO(UNIT_PRICE_DAILY_TABLE,list,UserContext.fromUID("admin")); + + //更新城市名称 + int update = DBSql.update("UPDATE" + + " BO_EU_DATALINKUP_FACT_UNIT_PRICE_DAILY a " + + " INNER JOIN " + + " BO_EU_YTH_CCJCWH b ON a.CITY = b.CS " + + " SET " + + " a.CITY_SHORT = b.CSJC"); + LOGGER.info("一体化产品单价日明细更新城市名称"); } LOGGER.info("产品单价日明细数据保存成功"); } catch (Exception e) { @@ -529,47 +506,44 @@ 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"; - - 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); - } + String querySql =" SELECT " + + " DATE_FORMAT(DZRQ, '%Y-%m') AS YEARMONTH, " + + " CASE " + + " WHEN SQ LIKE '%海南%' THEN '海南' " + + " WHEN SQ LIKE '%新疆%' THEN '新疆' " + + " WHEN SQ LIKE '%西藏%' THEN '西藏' " + + " END AS PROVINCE, " + + " SUM(CASE WHEN LB_1 = '石膏板' THEN XSSL ELSE 0 END) AS gypsum_board_sales, " + + " SUM(CASE WHEN LB_1 = '轻钢龙骨' THEN ZSSL ELSE 0 END) AS steel_keel_sales " + + " FROM BO_EU_BNBM_DATALINKUP_XS_XSL_HZ " + + " WHERE " + + " (SQ LIKE '%海南%' OR SQ LIKE '%新疆%' OR SQ LIKE '%西藏%') " + + " AND DZRQ >= ? " + + " AND LB_1 IN ('轻钢龙骨','石膏板') " + + " AND BKGS = ? " + + " GROUP BY " + + " PROVINCE, " + + " YEARMONTH " + + " ORDER BY " + + " YEARMONTH ASC, " + + " PROVINCE ASC"; + List maps = DBSql.getMaps(querySql, startDate, bkgs); + ArrayList list = new ArrayList<>(); + if (maps!=null) { + for (RowMap map : maps) { + String year_Month = map.getString("YEARMONTH"); + String province = map.getString("PROVINCE"); + BO matchingRateBO = new BO(); + matchingRateBO.set("YEARMONTH", year_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("SHENGQU", province); + 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()); @@ -924,47 +898,60 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService { private void calculateAndSaveRevenueYear(int year, int month, String yearMonth, String bkgs) { try { LOGGER.info("开始计算{}年{}月营业收入累计数据", year, month); - + // 构造月份的两位格式(如1月转为"01",10月保持"10") + String monthStr = String.format("%02d", month); //新增前删除数据 int delete = DBSql.update("DELETE FROM " + REVENUE_YEAR_TABLE + " WHERE YEARMONTH = '" + yearMonth + "' AND BKGS = '"+bkgs+"'"); LOGGER.info("准备同步{}年{}月-营业收入累计数据,删除了{}条数据",year, month,delete); - - int lastYear = year - 1; - int lastYearMonth = month; // 去年同月 - - //分别遍历省份 - 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); + //计算轻钢龙骨和石膏板 + String querySql = "SELECT " + + " LB_1, " + + " CASE " + + " WHEN SQ LIKE '%海南%' THEN '海南' " + + " WHEN SQ LIKE '%新疆%' THEN '新疆' " + + " WHEN SQ LIKE '%西藏%' THEN '西藏' " + + " END AS PROVINCE, " + + " DATE_FORMAT(DZRQ, '%Y-%m') AS YEARMONTH, " + + " SUM(NMNY) AS REVENUE_AMOUNT " + + " FROM BO_EU_BNBM_DATALINKUP_XS_XSL_HZ " + + " WHERE " + + " (SQ LIKE '%海南%' OR SQ LIKE '%新疆%' OR SQ LIKE '%西藏%') " + + " AND DZRQ >= '" + year + "-" + monthStr + "-01' " + + " AND BKGS = ? " + + " GROUP BY " + + " LB_1, " + + " PROVINCE, " + + " YEARMONTH " + + " ORDER BY " + + " YEARMONTH ASC, " + + " PROVINCE ASC, " + + " LB_1 ASC"; + List rowMaps = DBSql.getMaps(querySql, bkgs); + // 保存数据 + List list = new ArrayList<>(); + for (RowMap rowMap : rowMaps) { + BO revenueBO = createBaseBO(bkgs); + revenueBO.set("YEARMONTH", yearMonth); + String category = rowMap.getString("LB_1"); + String province = rowMap.getString("PROVINCE"); + String revenueAmount = rowMap.getString("REVENUE_AMOUNT"); + if ("北新嘉宝莉".equals(bkgs)){ + if ("其他".equals(category)){ + revenueBO.set("PRODUCT_CATEGORY", category); + }else { + revenueBO.set("PRODUCT_CATEGORY", "涂料"); + } + } else if ("石膏板".equals(category) || "轻钢龙骨".equals(category)) { + revenueBO.set("PRODUCT_CATEGORY", category); + }else { + revenueBO.set("PRODUCT_CATEGORY", "其他"); } - - // 处理轻钢龙骨数据 - 当年当前月 - 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); + revenueBO.set("REVENUE_AMOUNT", revenueAmount); + revenueBO.set("SHENGQU", province);//省区 + list.add(revenueBO); } - + SDK.getBOAPI().createDataBO(REVENUE_YEAR_TABLE,list,UserContext.fromUID("admin")); LOGGER.info("营业收入月度累计数据保存成功"); } catch (Exception e) { String errorMsg = String.format("营业收入月度累计数据计算失败: %s", e.getMessage()); @@ -1149,7 +1136,6 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService { 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+"'"+ "WHERE YEAR(DZRQ) = '"+year+"' AND MONTH(DZRQ) = '"+month+"' AND LB_1 LIKE '%"+category+"%' AND BKGS = '"+bkgs+"'"+ "AND ("+sfSql+")"; // 模糊查询 double value = DBSql.getDouble(sql, "revenue"); @@ -1256,7 +1242,6 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService { throw new RuntimeException(errorMsg, e); } } - /** * 构建表唯一性条件(基于业务键) */