1、修改防水涂料应收计算
2、一体化事业部修改增加字段和省份维度 3、梦牌在明细汇总修改区域公司 4、采购汇总sql修改
This commit is contained in:
parent
83bb2d090a
commit
5a90a8e12b
Binary file not shown.
Binary file not shown.
@ -100,7 +100,7 @@ public class WaterproofPaintAccountsReceivableJob implements IJob {
|
||||
|
||||
// 查询销售组织和客户分组信息
|
||||
List<RowMap> 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);
|
||||
|
||||
@ -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<String> 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<RowMap> pageData = DBSql.getMaps(querySql, bkgs, startDate, pageSize, offset);
|
||||
LOGGER.debug("第{}页查询到{}条记录", page + 1, pageData.size());
|
||||
|
||||
// 转换并批量插入数据
|
||||
List<BO> 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<String> 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<RowMap> dailyData = DBSql.getMaps(querySql, bkgs, startDate);
|
||||
// 批量插入
|
||||
if (dailyData==null){
|
||||
return;
|
||||
}
|
||||
List<BO> 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<String> 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<RowMap> currentMonthData = DBSql.getMaps(currentMonthSql, bkgs, startDate, bkgs, startDate,bkgs, 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");
|
||||
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 (" +
|
||||
" 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')" +
|
||||
" WHERE BKGS = ? AND DJRQ >= DATE_SUB( ? , INTERVAL 1 YEAR)" +
|
||||
" GROUP BY WLMC, YEAR(DJRQ), MONTH(DJRQ)" +
|
||||
" ) c" +
|
||||
" ) 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_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<RowMap> 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);
|
||||
|
||||
@ -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,13 +175,25 @@ 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" +
|
||||
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,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 '%西藏%')" +
|
||||
" WHERE LB_1 IN ('石膏板', '轻钢龙骨', '涂料') AND ("+sfSql+")" +
|
||||
" GROUP BY DZRQ,LB_1,BKGS 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"));
|
||||
@ -189,6 +202,7 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService {
|
||||
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);
|
||||
@ -228,12 +242,16 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService {
|
||||
}
|
||||
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);
|
||||
}
|
||||
SDK.getBOAPI().createDataBO(UNIT_PRICE_DAILY_TABLE,list,UserContext.fromUID("admin"));
|
||||
}
|
||||
|
||||
}
|
||||
LOGGER.info("产品单价日明细数据保存成功");
|
||||
} catch (Exception e) {
|
||||
String errorMsg = String.format("产品单价日明细数据计算失败: %s", e.getMessage());
|
||||
@ -257,10 +275,20 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService {
|
||||
+ " WHERE YEARMONTH >= '" + yearMonth + "' AND BKGS = '"+bkgs+"'");
|
||||
LOGGER.info("准备同步{}-应收账款年度汇总(按月存储),删除了{}条数据",startDate,delete);
|
||||
|
||||
//分别遍历省份
|
||||
HashMap<String, String> 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 SHENGQU IN ('新疆维吾尔自治区', '海南', '西藏')" +
|
||||
" WHERE RQ >= ? AND BKGS = ? AND "+sfSql+"" +
|
||||
" GROUP BY YEAR(RQ), MONTH(RQ)" +
|
||||
" ORDER BY YEAR(RQ), MONTH(RQ)";
|
||||
|
||||
@ -311,10 +339,12 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService {
|
||||
.multiply(BigDecimal.valueOf(100)));//同比变化率(%)
|
||||
}
|
||||
}
|
||||
bo.set("SHENGQU",abbreviation);//省区
|
||||
list.add(bo);
|
||||
}
|
||||
SDK.getBOAPI().createDataBO(RECEIVABLE_YEAR_TABLE,list,UserContext.fromUID("admin"));
|
||||
}
|
||||
}
|
||||
LOGGER.info("应收账款月度累计数据保存成功");
|
||||
} catch (Exception e) {
|
||||
String errorMsg = String.format("应收账款月度累计数据计算失败: %s", e.getMessage());
|
||||
@ -340,15 +370,26 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService {
|
||||
+ " WHERE YEARMONTH >= '" + yearMonth + "' AND BKGS = '"+bkgs+"'");
|
||||
LOGGER.info("{}:准备同步{}-应收账款品牌月明细,删除了{}条数据",bkgs,yearMonth,delete);
|
||||
|
||||
//分别遍历省份
|
||||
HashMap<String, String> 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 SHENGQU IN ('新疆维吾尔自治区', '海南', '西藏') " +
|
||||
" 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.SHENGQU IN ('新疆维吾尔自治区', '海南', '西藏') " +
|
||||
" WHERE t1.BKGS = ? AND t1."+sfSql+" " +
|
||||
" GROUP BY YEAR(t1.RQ),MONTH(t1.RQ),t1.SHENGQU " +
|
||||
" ORDER BY year, month, t1.SHENGQU";
|
||||
|
||||
@ -361,10 +402,12 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService {
|
||||
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"));
|
||||
}
|
||||
}
|
||||
LOGGER.info("应收账款品牌月明细数据保存成功");
|
||||
} catch (Exception e) {
|
||||
String errorMsg = String.format("应收账款品牌月明细数据计算失败: %s", e.getMessage());
|
||||
@ -388,13 +431,24 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService {
|
||||
+ " WHERE YEARMONTH >= '" + yearMonth + "' AND BKGS = '"+bkgs+"'");
|
||||
LOGGER.info("准备同步{}-产品销售明细数据,删除了{}条数据",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 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 '%西藏%') " +
|
||||
" WHERE DZRQ>? AND BKGS = ? AND LB_1 IN('石膏板','轻钢龙骨','涂料') AND ("+sfSql+") " +
|
||||
" GROUP BY LB_2,year, month" +
|
||||
" ORDER BY year, month";
|
||||
List<RowMap> maps = DBSql.getMaps(sql, startDate, bkgs);
|
||||
@ -430,10 +484,12 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService {
|
||||
}
|
||||
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);
|
||||
}
|
||||
SDK.getBOAPI().createDataBO(PRODUCT_MONTHLY_TABLE,list,UserContext.fromUID("admin"));
|
||||
}
|
||||
}
|
||||
|
||||
LOGGER.info("产品销售月明细数据保存成功");
|
||||
} catch (Exception e) {
|
||||
@ -457,7 +513,17 @@ 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 " +
|
||||
@ -466,7 +532,7 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService {
|
||||
" 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 ('石膏板', '轻钢龙骨') " +
|
||||
" WHERE DZRQ >= ? AND BKGS = ? AND ("+sfSql+") AND LB_1 IN ('石膏板', '轻钢龙骨') " +
|
||||
" GROUP BY YEAR(DZRQ), MONTH(DZRQ)" +
|
||||
" ORDER BY year, month";
|
||||
|
||||
@ -481,11 +547,13 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService {
|
||||
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"));
|
||||
}
|
||||
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,25 +917,37 @@ public class SaleDataSummaryServiceImpl implements DataSummaryService {
|
||||
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),
|
||||
getRevenueToMonth(lastYear, lastYearMonth, "石膏板", bkgs),
|
||||
bkgs);
|
||||
getRevenueToMonth(year, month, "石膏板", bkgs, sfSql),
|
||||
getRevenueToMonth(lastYear, lastYearMonth, "石膏板", bkgs, sfSql),
|
||||
bkgs,abbreviation);
|
||||
}
|
||||
|
||||
// 处理轻钢龙骨数据 - 当年当前月
|
||||
saveRevenueYearData(yearMonth, "轻钢龙骨",
|
||||
getRevenueToMonth(year, month, "轻钢龙骨", bkgs),
|
||||
getRevenueToMonth(lastYear, lastYearMonth, "轻钢龙骨", bkgs),
|
||||
bkgs);
|
||||
getRevenueToMonth(year, month, "轻钢龙骨", bkgs,sfSql),
|
||||
getRevenueToMonth(lastYear, lastYearMonth, "轻钢龙骨", bkgs,sfSql),
|
||||
bkgs,abbreviation);
|
||||
|
||||
// 处理涂料数据 - 当年1月到当前月
|
||||
saveRevenueYearData(yearMonth, "涂料",
|
||||
getRevenueToMonth(year, month, "涂料", bkgs),
|
||||
getRevenueToMonth(lastYear, lastYearMonth, "涂料", bkgs),
|
||||
bkgs);
|
||||
getRevenueToMonth(year, month, "涂料", bkgs,sfSql),
|
||||
getRevenueToMonth(lastYear, lastYearMonth, "涂料", bkgs,sfSql),
|
||||
bkgs,abbreviation);
|
||||
}
|
||||
|
||||
LOGGER.info("营业收入月度累计数据保存成功");
|
||||
} catch (Exception e) {
|
||||
@ -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+"'"+
|
||||
|
||||
@ -756,6 +756,8 @@ public class SaleDataSyncServiceImpl implements DataSyncService {
|
||||
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
String startDate = "";
|
||||
String endDate = "";
|
||||
// 查询梦牌区域
|
||||
List<BO> 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);
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user