采购BI汇总sql优化,setBO逻辑优化

This commit is contained in:
yujh_java 2025-09-16 18:19:16 +08:00
parent 3fdce1dddd
commit d6db22bc49

View File

@ -150,7 +150,7 @@ public class PurchaseDataSummaryServiceImpl implements DataSummaryService {
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 " +
" JLDW, HSDJHYF, SUM(JSHJHYF) AS JSHJHYF, GYSNAME, CGDDH, SUM(DHJE) AS DHJE " +
" FROM "+BO_EU_DWD_ORDER_RKD_HZ+" WHERE BKGS = ? AND DATE(DJRQ) >= ? " +
" GROUP BY YEARMONTH,DJH,WLMC " +
" ORDER BY DJRQ LIMIT ? OFFSET ?";
@ -334,193 +334,51 @@ public class PurchaseDataSummaryServiceImpl implements DataSummaryService {
int update = DBSql.update(deleteSql, new Object[]{bkgs, yearMonth});
LOGGER.info("采购_基地_年月采购明细{}年月物料采购月度汇总数据,板块公司:{},删除了{}条数据", yearMonth, 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 " +
String currentMonthSql = "SELECT " +
" CONCAT(c.Year, '-', LPAD(c.Month, 2, '0')) AS ny, " +
" c.Year AS year, " +
" c.Month AS month, " +
" c.WLMC AS WLMC, " +
" c.SLGC AS SLGC,, " +
" c.tstotalAmount AS tstotalAmount, " +
" c.totalQuantity AS totalQuantity, " +
" tstotalAmount/totalQuantity AS PJDJ " +
" 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 " +
" SELECT " +
" WLMC, " +
" SUM(DHJE) AS tstotalAmount, " +
" SUM(RKSL) AS totalQuantity, " +
" SLGC, " +
" 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<RowMap> currentMonthData = DBSql.getMaps(currentMonthSql, bkgs, startDate, bkgs, startDate,bkgs, startDate);
" WHERE BKGS = ? " +
" AND DJRQ >= DATE_SUB(?, INTERVAL 2 YEAR) " +
" GROUP BY WLMC, YEAR(DJRQ), MONTH(DJRQ),SLGC " +
" ) c " +
" WHERE c.Year IN (YEAR(?), YEAR(?) + 1) " +
" ORDER BY c.Year, c.Month";
List<RowMap> currentMonthData = DBSql.getMaps(currentMonthSql, bkgs, startDate,startDate,startDate);
if (currentMonthData==null){
return;
}
// 5. 批量插入
List<BO> bos = new ArrayList<>();
for (RowMap currentMonthRow : currentMonthData) {
String base = currentMonthRow.getString("SLGC");
String wlmc = currentMonthRow.getString("WLMC");
String bkgs1 = currentMonthRow.getString("BKGS");
YearMonth yearMonths = YearMonth.parse(currentMonthRow.getString("YEARMONTH"), DateTimeFormatter.ofPattern("yyyyMM"));
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM");
String yearmonth1 = yearMonths.format(outputFormatter);
BO summaryBO = new BO();
summaryBO.set("BKGS", bkgs1);
summaryBO.set("JD", base);
summaryBO.set("WLMC",wlmc);
summaryBO.set("YEARMONTH", yearmonth1);
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("重钙")) {
double Quantity = currentMonthRow.getDouble("totalQuantity")==0.0?0.00:currentMonthRow.getDouble("totalQuantity");
if (Quantity==0.0){
totalQuantity=0.0;
}else {
totalQuantity = BigDecimal.valueOf(Quantity)
.divide(BigDecimal.valueOf(1000), 4, BigDecimal.ROUND_HALF_UP).doubleValue();
}
double lyQuantity = currentMonthRow.getDouble("ly_totalQuantity")==0.0?0.00:currentMonthRow.getDouble("ly_totalQuantity");
if (lyQuantity==0.0){
lytotalQuantity = 0.0;
}else {
lytotalQuantity = BigDecimal.valueOf(lyQuantity)
.divide(BigDecimal.valueOf(1000), 4, BigDecimal.ROUND_HALF_UP).doubleValue();
}
double lmQuantity = currentMonthRow.getDouble("lm_totalQuantity")==0.0?0.00:currentMonthRow.getDouble("lm_totalQuantity");
if (lmQuantity==0.0){
lmQuantity = 0.0;
}else {
lmtotalQuantity = BigDecimal.valueOf(lmQuantity)
.divide(BigDecimal.valueOf(1000), 4, BigDecimal.ROUND_HALF_UP).doubleValue();
}
summaryBO.set("CGZL", totalQuantity);
summaryBO.set("TQCGZL", lytotalQuantity);
summaryBO.set("SQCGZL", lmtotalQuantity);
}else {
double Quantity = currentMonthRow.getDouble("totalQuantity")==0.0?0.00:currentMonthRow.getDouble("totalQuantity");
totalQuantity = BigDecimal.valueOf(Quantity).doubleValue();
double lyQuantity = currentMonthRow.getDouble("ly_totalQuantity")==0.0?0.00:currentMonthRow.getDouble("ly_totalQuantity");
lytotalQuantity = BigDecimal.valueOf(lyQuantity).doubleValue();
double lmQuantity = currentMonthRow.getDouble("lm_totalQuantity")==0.0?0.00:currentMonthRow.getDouble("lm_totalQuantity");
lmtotalQuantity = BigDecimal.valueOf(lmQuantity).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(lytotalAmount)
.divide(BigDecimal.valueOf(lytotalQuantity), 2, BigDecimal.ROUND_HALF_UP).doubleValue();
} else {
lyavgPrice = 0;
}
//上期
if (lmtotalAmount != 0 && lmtotalQuantity != 0) {
lmavgPrice = BigDecimal.valueOf(lmtotalAmount)
.divide(BigDecimal.valueOf(lmtotalQuantity), 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")==0.0?0.0:currentMonthRow.getDouble("lptotalAmount");
double lytotalAmount = currentMonthRow.getDouble("ly_lptotalAmount")==0.0?0.0:currentMonthRow.getDouble("ly_lptotalAmount");
double lmtotalAmount = currentMonthRow.getDouble("lm_lptotalAmount")==0.0?0.0:currentMonthRow.getDouble("lm_lptotalAmount");
double totalQuantity = 0.00;
double lytotalQuantity = 0.00;
double lmtotalQuantity = 0.00;
if (wlmc.equals("乳液") || wlmc.equals("钛白粉") || wlmc.equals("重钙")) {
double Quantity = currentMonthRow.getDouble("totalQuantity")==0.0?0.0:currentMonthRow.getDouble("totalQuantity");
if (Quantity==0.00) {
totalQuantity = 0.0;
}else {
totalQuantity = BigDecimal.valueOf(Quantity)
.divide(BigDecimal.valueOf(1000), 4, BigDecimal.ROUND_HALF_UP).doubleValue();
}
double lyQuantity = currentMonthRow.getDouble("ly_totalQuantity")==0.0?0.0:currentMonthRow.getDouble("ly_totalQuantity");
if (lyQuantity==0.0){
lytotalQuantity = 0.0;
}else {
lytotalQuantity = BigDecimal.valueOf(lyQuantity)
.divide(BigDecimal.valueOf(1000), 4, BigDecimal.ROUND_HALF_UP).doubleValue();
}
double lmQuantity = currentMonthRow.getDouble("lm_totalQuantity")==0.0?0.0:currentMonthRow.getDouble("lm_totalQuantity");
if (lmQuantity==0.0){
lmtotalQuantity = 0.0;
}else {
lmtotalQuantity = BigDecimal.valueOf(lmQuantity)
.divide(BigDecimal.valueOf(1000), 4, BigDecimal.ROUND_HALF_UP).doubleValue();
}
summaryBO.set("CGZL", totalQuantity);
summaryBO.set("TQCGZL", lytotalQuantity);
summaryBO.set("SQCGZL", lmtotalQuantity);
}else {
double Quantity = currentMonthRow.getDouble("totalQuantity")==0.0?0.0:currentMonthRow.getDouble("totalQuantity");
double lyQuantity = currentMonthRow.getDouble("ly_totalQuantity")==0.0?0.0:currentMonthRow.getDouble("ly_totalQuantity");
double lmQuantity = currentMonthRow.getDouble("lm_totalQuantity")==0.0?0.0:currentMonthRow.getDouble("lm_totalQuantity");
totalQuantity = BigDecimal.valueOf(Quantity).doubleValue();
lytotalQuantity = BigDecimal.valueOf(lyQuantity).doubleValue();
lmtotalQuantity = BigDecimal.valueOf(lmQuantity).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(lytotalAmount)
.divide(BigDecimal.valueOf(lytotalQuantity), 2, BigDecimal.ROUND_HALF_UP).doubleValue();
} else {
lyavgPrice = 0;
}
//上期
if (lmtotalAmount != 0 && lmtotalQuantity != 0) {
lmavgPrice = BigDecimal.valueOf(lmtotalAmount)
.divide(BigDecimal.valueOf(lmtotalQuantity), 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);
summaryBO.set("YEARMONTH",currentMonthRow.getString("ny"));//年月YYYYMM
Double tstotalAmount = currentMonthRow.getDouble("tstotalAmount");
Double totalQuantity = currentMonthRow.getDouble("totalQuantity");
summaryBO.set("CGZE", tstotalAmount);//采购总额
summaryBO.set("CGZL",totalQuantity);//采购总量
summaryBO.set("SLGC",currentMonthRow.getString("SLGC"));//收料工厂
summaryBO.set("PJDJ",currentMonthRow.getDouble("PJDJ"));
bos.add(summaryBO);
}
if (!bos.isEmpty()) {
@ -555,39 +413,32 @@ public class PurchaseDataSummaryServiceImpl implements DataSummaryService {
" WHERE BKGS = ? AND YEARMONTH >= ?";
int update = DBSql.update(deleteSql, new Object[]{bkgs, yearMonth});
LOGGER.info("采购_年月采购明细{}年月物料采购月度汇总数据,板块公司:{},删除了{}条数据",yearMonth, bkgs, update);
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" +
String currentMonthSql = "SELECT " +
" CONCAT(c.Year, '-', LPAD(c.Month, 2, '0')) AS ny, " +
" c.Year AS year, " +
" c.Month AS month, " +
" c.WLMC AS WLMC, " +
" c.tstotalAmount AS tstotalAmount, " +
" c.totalQuantity AS totalQuantity, " +
" tstotalAmount/totalQuantity AS PJDJ " +
" 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" +
" FROM BO_EU_DWD_ORDER_RKD_HZ" +
" WHERE BKGS = ? AND DJRQ >= DATE_SUB(?, INTERVAL 1 YEAR)" +
" 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";
List<RowMap> currentMonthData = DBSql.getMaps(currentMonthSql, bkgs, startDate,bkgs,startDate,bkgs,startDate,startDate);
" SELECT " +
" WLMC, " +
" SUM(DHJE) AS tstotalAmount, " +
" 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) " +
" ) c " +
" WHERE c.Year IN (YEAR(?), YEAR(?) + 1) " +
" ORDER BY c.Year, c.Month";
List<RowMap> currentMonthData = DBSql.getMaps(currentMonthSql, bkgs, startDate,startDate,startDate);
if (currentMonthData==null){
return;
}
// 4. 批量插入
List<BO> bos = new ArrayList<>();
for (RowMap currentMonthRow : currentMonthData) {
@ -595,50 +446,16 @@ public class PurchaseDataSummaryServiceImpl implements DataSummaryService {
BO bo = new BO();
bo.set("BKGS",bkgs);//板块
bo.set("WLMC",wlmc);//物料名称
bo.set("YEARMONTH",currentMonthRow.getString("ASyear_month"));//年月YYYYMM
if (bkgs.equals("泰山石膏")) {
Double tstotalAmount = currentMonthRow.getDouble("tstotalAmount");
double tstotalAmount1 = tstotalAmount==null?0.0: tstotalAmount;
Double totalQuantity = currentMonthRow.getDouble("totalQuantity");
double totalQuantity1 = totalQuantity==null?0.0: totalQuantity;
bo.set("CGZE", tstotalAmount1);//采购总额
bo.set("CGZL",totalQuantity1);//采购总量
if (tstotalAmount1!=0 && totalQuantity1!=0) {
bo.set("PJDJ", tstotalAmount1/totalQuantity1);//平均单价
}else {
bo.set("PJDJ", 0);//平均单价
}
bo.set("TQCGZE",currentMonthRow.getString("LY_tstotalAmount"));//同期采购总额
bo.set("SQCGZE",currentMonthRow.getString("LM_tstotalAmount"));//上期采购总额
}
else {
Double tstotalAmount = currentMonthRow.getDouble("lptotalAmount");
double tstotalAmount1 = tstotalAmount==null?0.0: tstotalAmount;
Double totalQuantity = currentMonthRow.getDouble("totalQuantity");
double totalQuantity1 = totalQuantity==null?0.0: totalQuantity;
bo.set("CGZE", tstotalAmount1);//采购总额
bo.set("CGZL",totalQuantity1);//采购总量
if (tstotalAmount1!=0 && totalQuantity1!=0) {
bo.set("PJDJ", tstotalAmount1/totalQuantity1);//平均单价
}else {
bo.set("PJDJ", 0);//平均单价
}
bo.set("TQCGZE",currentMonthRow.getString("LY_lptotalAmount"));//同期采购总额
bo.set("SQCGZE",currentMonthRow.getString("LM_lptotalAmount"));//上期采购总额
}
bo.set("TQCGZL",currentMonthRow.getString("LY_totalQuantity"));//同期采购总量
bo.set("SQCGZL",currentMonthRow.getString("LM_totalQuantity"));//上期采购总量
bo.set("YEARMONTH",currentMonthRow.getString("ny"));//年月YYYYMM
Double tstotalAmount = currentMonthRow.getDouble("tstotalAmount");
Double totalQuantity = currentMonthRow.getDouble("totalQuantity");
bo.set("CGZE", tstotalAmount);//采购总额
bo.set("CGZL",totalQuantity);//采购总量
bo.set("PJDJ",currentMonthRow.getDouble("PJDJ"));
bos.add(bo);
}
if (!bos.isEmpty()) {
// 批量插入数据
// int batchSize = 1000;
// for (int i = 0; i < bos.size(); i += batchSize) {
// int end = Math.min(i + batchSize, bos.size());
// List<BO> batch = bos.subList(i, end);
SDK.getBOAPI().createDataBO(PROCUREMENT_DETAILS_YEAR_MONTH, bos, UserContext.fromUID("admin"));
// }
SDK.getBOAPI().createDataBO(PROCUREMENT_DETAILS_YEAR_MONTH, bos, UserContext.fromUID("admin"));
}
LOGGER.info("成功保存{}条月度汇总数据,板块:{}", bos.size(), bkgs);