1、销售BI汇总优化

This commit is contained in:
llllon 2025-09-07 17:35:35 +08:00
parent a5e13b915e
commit 1f4656c7f5
5 changed files with 186 additions and 4 deletions

View File

@ -11,6 +11,7 @@ import com.awspaas.user.apps.bnbm.datalinkup.service.DataSummaryService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Array;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
@ -75,6 +76,10 @@ public class SaleCountDimensionImpl implements DataSummaryService {
if (dateRange == null || dateRange.getStartDate() == null || dateRange.getEndDate() == null) {
LOGGER.info("未提供有效时间范围,按当前日期计算");
calculateForCurrentDate(bkgs);
// 处理营业收入数据
newProcessRevenueData(dateRange,bkgs);
// 处理销量销额数据分页查询
newProcessSalesVolumeData(dateRange,bkgs);
} else {
LOGGER.info("开始执行销售数据多维度汇总计算(时间范围: {} 至 {})",
dateRange.getStartDate(), dateRange.getEndDate());
@ -82,6 +87,11 @@ public class SaleCountDimensionImpl implements DataSummaryService {
// 计算月度维度数据按月遍历
calculateMonthlyData(dateRange, bkgs);
// 处理营业收入数据
newProcessRevenueData(dateRange,bkgs);
// 处理销量销额数据分页查询
newProcessSalesVolumeData(dateRange,bkgs);
LOGGER.info("销售数据多维度汇总计算完成");
}
} catch (Exception e) {
@ -91,6 +101,178 @@ public class SaleCountDimensionImpl implements DataSummaryService {
}
}
/**
* 处理销量销额数据
* @param dateRange 时间范围
* @param bkgs 板块公司
*/
private void newProcessSalesVolumeData(DateRange dateRange, String bkgs) {
LOGGER.info("开始处理销量销额数据,年月: {}-{}, 板块公司: {}", dateRange.getStartDate(),dateRange.getEndDate(), bkgs);
// 删除已存在的记录
String deleteSql = "DELETE FROM " + BO_EU_XS_XLXE + " WHERE YEARMONTH >= ? AND BKGS = ?";
try {
int deleted = DBSql.update(deleteSql, new Object[]{YEAR_MONTH_FORMAT.format(dateRange.getStartDate()), bkgs});
LOGGER.info("销量销额数据-已删除{}-{}条营业收入记录", YEAR_MONTH_FORMAT.format(dateRange.getStartDate()), deleted);
}catch (Exception e){
LOGGER.error("销量销额-删除数据{}年月-{}板块数据错误删除sql为{},请检查数据库链接:{}",
YEAR_MONTH_FORMAT.format(dateRange.getStartDate()), bkgs,deleteSql,e.getMessage());
throw e;
}
try {
// 获取公司位置信息
List<RowMap> companyList = DBSql.getMaps("SELECT GSMC,JD,WD FROM BO_EU_BNBM_DATALINKUP_GSJWD");
Map<String, Location> resultMap = companyList.stream()
.filter(row -> row.get("GSMC") != null)
.collect(Collectors.toMap(
row -> row.get("GSMC").toString(),
row -> new Location(
row.get("JD") != null ? row.get("JD").toString() : null,
row.get("WD") != null ? row.get("WD").toString() : null
),
(existing, replacement) -> existing
));
String querySql = "SELECT QYGS, KCZZ, LB_1, LB_2, LB_3, SQ, CS, QY, SUM(ZSSL) AS XL," +
" SUM(SSJERMB) AS XE, SUM(XSSL) AS TSXL, YEARMONTH" +
" FROM " + SALES_DETAIL_TABLE +
" WHERE DZRQ >= ? AND DZRQ < ? AND BKGS = ?" +
" GROUP BY QYGS, KCZZ, LB_1, LB_2, LB_3, SQ, CS, QY, YEARMONTH";
LOGGER.info("销量销额数据查询SQL: {}", querySql);
List<RowMap> maps = DBSql.getMaps(querySql, DATE_FORMAT.format(dateRange.getStartDate()),
DATE_FORMAT.format(dateRange.getEndDate()), bkgs);
if (maps.isEmpty()) {
LOGGER.info("销量销额数据无数据,停止查询");
} else {
ArrayList<BO> bos = new ArrayList<>();
for (RowMap map : maps) {
String gc = map.getString("KCZZ");
String yearmonth = map.getString("YEARMONTH");
BO bo = new BO();
bo.set("YEARMONTH", yearmonth);
bo.set("BKGS", bkgs);
bo.set("QYGS", map.getString("QYGS"));
bo.set("GC", gc);
bo.set("LB_1", map.getString("LB_1"));
bo.set("LB_2", map.getString("LB_2"));
bo.set("LB_3", map.getString("LB_3"));
bo.set("SQ", map.getString("SQ"));
bo.set("CITY", map.getString("CS"));
bo.set("QX", map.getString("QY"));
if (resultMap.containsKey(gc)) {
Location location = resultMap.get(gc);
bo.set("JD", location.getLongitude());
bo.set("WD", location.getLatitude());
}
if ("石膏板".equals(map.getString("LB_1"))){
bo.set("XL", map.getDouble("TSXL"));
}else {
bo.set("XL", map.getDouble("XL"));
}
bo.set("XE", map.getDouble("XE"));
bo.set("MC_JC", Math.random()%2==0?"面材":"基材");
bo.set("JZ_GZ", Math.random()%2==0?"家装":"工装");
bos.add(bo);
}
// 批量新增BO
if (!bos.isEmpty()) {
int[] admins = SDK.getBOAPI().createDataBO(BO_EU_XS_XLXE, bos, UserContext.fromUID("admin"));
LOGGER.info("{}-销量销额数据处理完成,共查询除{}条记录,导入{}条", bkgs, bos.size(), admins[0]);
}
}
}catch (Exception e){
LOGGER.error("销量销额-新增数据{}年月-{}板块数据错误,请检查数据库链接:{}",
YEAR_MONTH_FORMAT.format(dateRange.getStartDate()), bkgs,e.getMessage());
throw e;
}
}
/**
* 处理营业收入数据
* @param dateRange 时间范围
* @param bkgs 板块公司
*/
private void newProcessRevenueData(DateRange dateRange, String bkgs) {
LOGGER.info("开始处理营业收入数据,年月: {}-{}, 板块公司: {}", dateRange.getStartDate(),dateRange.getEndDate(), bkgs);
// 删除已存在的记录
String deleteSql = "DELETE FROM " + BO_EU_XS_YESR + " WHERE YEARMONTH >= ? AND BKGS = ?";
try {
int deleted = DBSql.update(deleteSql, new Object[]{YEAR_MONTH_FORMAT.format(dateRange.getStartDate()), bkgs});
LOGGER.info("营业收入数据-已删除{}-{}条营业收入记录", YEAR_MONTH_FORMAT.format(dateRange.getStartDate()), deleted);
}catch (Exception e){
LOGGER.error("营业收入-删除数据{}年月-{}板块数据错误删除sql为{},请检查数据库链接:{}",
YEAR_MONTH_FORMAT.format(dateRange.getStartDate()), bkgs,deleteSql,e.getMessage());
throw e;
}
try {
// 获取公司位置信息
List<RowMap> companyList = DBSql.getMaps("SELECT GSMC,JD,WD FROM BO_EU_BNBM_DATALINKUP_GSJWD");
Map<String, Location> resultMap = companyList.stream()
.filter(row -> row.get("GSMC") != null)
.collect(Collectors.toMap(
row -> row.get("GSMC").toString(),
row -> new Location(
row.get("JD") != null ? row.get("JD").toString() : null,
row.get("WD") != null ? row.get("WD").toString() : null
),
(existing, replacement) -> existing
));
String querySql = "SELECT QYGS, KCZZ, LB_1, LB_2, LB_3, SQ, CS, QY, SUM(SSJERMB) as YYSR, YEARMONTH" +
" FROM " + SALES_DETAIL_TABLE +
" WHERE DZRQ >= ? AND DZRQ < ? AND BKGS = ?" +
" GROUP BY QYGS, KCZZ, LB_1, LB_2, LB_3, SQ, CS, QY, YEARMONTH";
LOGGER.info("营业收入数据查询SQL: {}", querySql);
List<RowMap> maps = DBSql.getMaps(querySql, DATE_FORMAT.format(dateRange.getStartDate()),
DATE_FORMAT.format(dateRange.getEndDate()), bkgs);
if (maps.isEmpty()) {
LOGGER.info("营业收入数据无数据,停止查询");
} else {
ArrayList<BO> bos = new ArrayList<>();
for (RowMap map : maps) {
String gc = map.getString("KCZZ");
String yearmonth = map.getString("YEARMONTH");
BO bo = new BO();
bo.set("YEARMONTH", yearmonth);
bo.set("BKGS", bkgs);
bo.set("QYGS", map.getString("QYGS"));
bo.set("GC", gc);
bo.set("LB_1", map.getString("LB_1"));
bo.set("LB_2", map.getString("LB_2"));
bo.set("LB_3", map.getString("LB_3"));
bo.set("SQ", map.getString("SQ"));
bo.set("CITY", map.getString("CS"));
bo.set("QX", map.getString("QY"));
if (resultMap.containsKey(gc)) {
Location location = resultMap.get(gc);
bo.set("JD", location.getLongitude());
bo.set("WD", location.getLatitude());
}
bo.set("YYSR", map.getDouble("YYSR"));
bos.add(bo);
}
// 批量新增BO
if (!bos.isEmpty()) {
int[] admins = SDK.getBOAPI().createDataBO(BO_EU_XS_YESR, bos, UserContext.fromUID("admin"));
LOGGER.info("{}-营业收入数据处理完成,共查询{}条记录,导入{}条", bkgs, bos.size(), admins[0]);
}
}
}catch (Exception e){
LOGGER.error("营业收入-新增数据{}年月-{}板块数据错误,请检查数据库链接:{}",
YEAR_MONTH_FORMAT.format(dateRange.getStartDate()), bkgs,e.getMessage());
throw e;
}
}
/**
* 按当前日期计算无时间范围时使用
*/
@ -129,12 +311,12 @@ public class SaleCountDimensionImpl implements DataSummaryService {
processRegionTwoFundsRatio(conn, yearMonth, bkgs);
// 1. 处理营业收入数据
LOGGER.info("开始营业收入数据");
processRevenueData(conn, yearMonth, bkgs);
// LOGGER.info("开始营业收入数据");
// processRevenueData(conn, yearMonth, bkgs);
// 2. 处理销量销额数据
LOGGER.info("开始销量销额数据");
processSalesVolumeData(conn, yearMonth, bkgs);
// LOGGER.info("开始销量销额数据");
// processSalesVolumeData(conn, yearMonth, bkgs);
// 3. 处理应收账款数据
LOGGER.info("开始应收账款数据");