整体修改一体化事业部BI汇总sql逻辑

This commit is contained in:
yujh_java 2025-09-17 19:36:21 +08:00
parent 22021eef26
commit 3df164a773

View File

@ -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<String, String> 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<RowMap> maps = DBSql.getMaps(sql);
if (maps!=null){
// 循环外先获取下公装家装基材面材类别
List<BO> gzjzList = SDK.getBOAPI().query("BO_EU_DATALINKUP_CPJZGZJCMC").orderBy("CPLB_L2").desc().list();
ArrayList<BO> 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<RowMap> maps = DBSql.getMaps(sql, startDate, bkgs);
if (maps!=null){
// 循环外先获取下公装家装基材面材类别
List<BO> gzjzList = SDK.getBOAPI().query("BO_EU_DATALINKUP_CPJZGZJCMC").orderBy("CPLB_L2").desc().list();
ArrayList<BO> 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<String, String> 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<RowMap> maps = DBSql.getMaps(sql, startDate, bkgs);
ArrayList<BO> 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<RowMap> maps = DBSql.getMaps(querySql, startDate, bkgs);
ArrayList<BO> 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<String, String> 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<RowMap> rowMaps = DBSql.getMaps(querySql, bkgs);
// 保存数据
List<BO> 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);
}
}
/**
* 构建表唯一性条件基于业务键
*/