1、修改应收账款
This commit is contained in:
parent
f59dcdc0e4
commit
028bd539b2
@ -234,7 +234,7 @@ public class DataLinkUpController {
|
|||||||
Date startDate = Date.from(startDateTime.atZone(ZoneId.systemDefault()).toInstant());
|
Date startDate = Date.from(startDateTime.atZone(ZoneId.systemDefault()).toInstant());
|
||||||
DataSummaryService summaryService = null;
|
DataSummaryService summaryService = null;
|
||||||
SaleCountDimensionImpl saleCountDimension = null;
|
SaleCountDimensionImpl saleCountDimension = null;
|
||||||
ExecutorService executorService = null; // 线程池用于并行处理销售业务
|
// ExecutorService executorService = null; // 线程池用于并行处理销售业务
|
||||||
|
|
||||||
try {
|
try {
|
||||||
LOGGER.info("开始执行销售数据多维度汇总计算");
|
LOGGER.info("开始执行销售数据多维度汇总计算");
|
||||||
@ -258,8 +258,8 @@ public class DataLinkUpController {
|
|||||||
if ("销售".equals(ssyw)) {
|
if ("销售".equals(ssyw)) {
|
||||||
summaryService = new SaleDataSummaryServiceImpl();
|
summaryService = new SaleDataSummaryServiceImpl();
|
||||||
saleCountDimension = new SaleCountDimensionImpl();
|
saleCountDimension = new SaleCountDimensionImpl();
|
||||||
executorService = Executors.newFixedThreadPool(2); // 创建固定大小为2的线程池
|
// executorService = Executors.newFixedThreadPool(2); // 创建固定大小为2的线程池
|
||||||
LOGGER.info("销售业务检测到,创建summaryService和saleCountDimension实例,初始化线程池");
|
// LOGGER.info("销售业务检测到,创建summaryService和saleCountDimension实例,初始化线程池");
|
||||||
}else {
|
}else {
|
||||||
summaryService = new PurchaseDataSummaryServiceImpl();
|
summaryService = new PurchaseDataSummaryServiceImpl();
|
||||||
LOGGER.info("采购业务检测到,创建summaryService实例");
|
LOGGER.info("采购业务检测到,创建summaryService实例");
|
||||||
@ -274,40 +274,48 @@ public class DataLinkUpController {
|
|||||||
if ("销售".equals(ssyw)) {
|
if ("销售".equals(ssyw)) {
|
||||||
LOGGER.info("======== 开始并行执行销售数据汇总计算,BKGS: {} ========", bo.get("BKGS"));
|
LOGGER.info("======== 开始并行执行销售数据汇总计算,BKGS: {} ========", bo.get("BKGS"));
|
||||||
|
|
||||||
|
LOGGER.info("开始执行一体化-销售数据汇总计算,BKGS: {}", bo.get("BKGS"));
|
||||||
|
summaryService.calculateSummary(dateRange, bo);
|
||||||
|
LOGGER.info("完成一体化-销售数据汇总计算,BKGS: {}", bo.get("BKGS"));
|
||||||
|
|
||||||
// 创建并提交两个并行任务
|
// 创建并提交两个并行任务
|
||||||
DataSummaryService finalSummaryService = summaryService;
|
// DataSummaryService finalSummaryService = summaryService;
|
||||||
Future<?> summaryFuture = executorService.submit(() -> {
|
// Future<?> summaryFuture = executorService.submit(() -> {
|
||||||
try {
|
// try {
|
||||||
LOGGER.info("开始执行一体化-销售数据汇总计算,BKGS: {}", bo.get("BKGS"));
|
// LOGGER.info("开始执行一体化-销售数据汇总计算,BKGS: {}", bo.get("BKGS"));
|
||||||
finalSummaryService.calculateSummary(dateRange, bo);
|
// finalSummaryService.calculateSummary(dateRange, bo);
|
||||||
LOGGER.info("完成一体化-销售数据汇总计算,BKGS: {}", bo.get("BKGS"));
|
// LOGGER.info("完成一体化-销售数据汇总计算,BKGS: {}", bo.get("BKGS"));
|
||||||
} catch (Exception e) {
|
// } catch (Exception e) {
|
||||||
LOGGER.error("一体化-销售数据汇总计算异常,BKGS: {}", bo.get("BKGS"), e);
|
// LOGGER.error("一体化-销售数据汇总计算异常,BKGS: {}", bo.get("BKGS"), e);
|
||||||
throw new RuntimeException("一体化-销售数据汇总计算失败: " + e.getMessage(), e);
|
// throw new RuntimeException("一体化-销售数据汇总计算失败: " + e.getMessage(), e);
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
|
|
||||||
SaleCountDimensionImpl finalSaleCountDimension = saleCountDimension;
|
SaleCountDimensionImpl finalSaleCountDimension = saleCountDimension;
|
||||||
Future<?> countFuture = executorService.submit(() -> {
|
LOGGER.info("开始执行销售数据多维度汇总计算,BKGS: {}", bo.get("BKGS"));
|
||||||
try {
|
finalSaleCountDimension.calculateSummary(dateRange, bo);
|
||||||
LOGGER.info("开始执行销售数据多维度汇总计算,BKGS: {}", bo.get("BKGS"));
|
LOGGER.info("完成销售数据多维度汇总计算,BKGS: {}", bo.get("BKGS"));
|
||||||
finalSaleCountDimension.calculateSummary(dateRange, bo);
|
|
||||||
LOGGER.info("完成销售数据多维度汇总计算,BKGS: {}", bo.get("BKGS"));
|
// Future<?> countFuture = executorService.submit(() -> {
|
||||||
} catch (Exception e) {
|
// try {
|
||||||
LOGGER.error("销售数据多维度汇总计算异常,BKGS: {}", bo.get("BKGS"), e);
|
// LOGGER.info("开始执行销售数据多维度汇总计算,BKGS: {}", bo.get("BKGS"));
|
||||||
throw new RuntimeException("销售数据多维度汇总计算失败: " + e.getMessage(), e);
|
// finalSaleCountDimension.calculateSummary(dateRange, bo);
|
||||||
}
|
// LOGGER.info("完成销售数据多维度汇总计算,BKGS: {}", bo.get("BKGS"));
|
||||||
});
|
// } catch (Exception e) {
|
||||||
|
// LOGGER.error("销售数据多维度汇总计算异常,BKGS: {}", bo.get("BKGS"), e);
|
||||||
|
// throw new RuntimeException("销售数据多维度汇总计算失败: " + e.getMessage(), e);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
|
||||||
// 等待两个任务完成
|
// 等待两个任务完成
|
||||||
try {
|
// try {
|
||||||
summaryFuture.get();
|
// summaryFuture.get();
|
||||||
countFuture.get();
|
// countFuture.get();
|
||||||
LOGGER.info("销售数据并行计算完成,BKGS: {}", bo.get("BKGS"));
|
// LOGGER.info("销售数据并行计算完成,BKGS: {}", bo.get("BKGS"));
|
||||||
} catch (InterruptedException | ExecutionException e) {
|
// } catch (InterruptedException | ExecutionException e) {
|
||||||
LOGGER.error("销售数据并行计算执行异常,BKGS: {}", bo.get("BKGS"), e);
|
// LOGGER.error("销售数据并行计算执行异常,BKGS: {}", bo.get("BKGS"), e);
|
||||||
throw new RuntimeException("销售数据并行计算失败: " + e.getMessage(), e);
|
// throw new RuntimeException("销售数据并行计算失败: " + e.getMessage(), e);
|
||||||
}
|
// }
|
||||||
} else {
|
} else {
|
||||||
// 非销售业务,单线程执行
|
// 非销售业务,单线程执行
|
||||||
LOGGER.info("======== 开始执行采购数据汇总计算,BKGS: {} ========", bo.get("BKGS"));
|
LOGGER.info("======== 开始执行采购数据汇总计算,BKGS: {} ========", bo.get("BKGS"));
|
||||||
@ -322,18 +330,18 @@ public class DataLinkUpController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 如果是销售业务,关闭线程池
|
// 如果是销售业务,关闭线程池
|
||||||
if ("销售".equals(ssyw) && executorService != null) {
|
// if ("销售".equals(ssyw) && executorService != null) {
|
||||||
executorService.shutdown();
|
// executorService.shutdown();
|
||||||
try {
|
// try {
|
||||||
if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
|
// if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
|
||||||
executorService.shutdownNow();
|
// executorService.shutdownNow();
|
||||||
}
|
// }
|
||||||
} catch (InterruptedException e) {
|
// } catch (InterruptedException e) {
|
||||||
executorService.shutdownNow();
|
// executorService.shutdownNow();
|
||||||
Thread.currentThread().interrupt();
|
// Thread.currentThread().interrupt();
|
||||||
}
|
// }
|
||||||
LOGGER.info("销售业务线程池已关闭");
|
// LOGGER.info("销售业务线程池已关闭");
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
ro.put("success", true);
|
ro.put("success", true);
|
||||||
@ -346,15 +354,16 @@ public class DataLinkUpController {
|
|||||||
ro.put("message", errorMsg);
|
ro.put("message", errorMsg);
|
||||||
|
|
||||||
// 确保异常时关闭线程池
|
// 确保异常时关闭线程池
|
||||||
if (executorService != null) {
|
// if (executorService != null) {
|
||||||
executorService.shutdownNow();
|
// executorService.shutdownNow();
|
||||||
}
|
// }
|
||||||
}finally {
|
|
||||||
// 最终确保线程池关闭
|
|
||||||
if (executorService != null) {
|
|
||||||
executorService.shutdown();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
// finally {
|
||||||
|
// // 最终确保线程池关闭
|
||||||
|
// if (executorService != null) {
|
||||||
|
// executorService.shutdown();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
long methodEndTime = System.currentTimeMillis();
|
long methodEndTime = System.currentTimeMillis();
|
||||||
LOGGER.info("【完成】数据计算汇总操作,总耗时:{}ms", methodEndTime - methodStartTime);
|
LOGGER.info("【完成】数据计算汇总操作,总耗时:{}ms", methodEndTime - methodStartTime);
|
||||||
return ro;
|
return ro;
|
||||||
|
|||||||
@ -86,28 +86,29 @@ public class SaleCountDimensionImpl implements DataSummaryService {
|
|||||||
// 设置为当前月的最后一天
|
// 设置为当前月的最后一天
|
||||||
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
|
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
|
||||||
dateRange.setEndDate(cal.getTime());
|
dateRange.setEndDate(cal.getTime());
|
||||||
// calculateForCurrentDate(bkgs);
|
|
||||||
// calculateMonthlyData(dateRange, bkgs);
|
|
||||||
// 处理营业收入数据
|
// 处理营业收入数据
|
||||||
newProcessRevenueData(dateRange,bkgs);
|
newProcessRevenueData(dateRange,bkgs);
|
||||||
// 处理销量销额数据(分页查询)
|
// 处理销量销额数据(分页查询)
|
||||||
newProcessSalesVolumeData(dateRange,bkgs);
|
newProcessSalesVolumeData(dateRange,bkgs);
|
||||||
// 区域两金占比
|
// 区域两金占比
|
||||||
newProcessRegionTwoFundsRatio(dateRange,bkgs);
|
newProcessRegionTwoFundsRatio(dateRange,bkgs);
|
||||||
|
// 处理应收账款数据(分页查询)
|
||||||
|
newprocessReceivableData(dateRange, bkgs);
|
||||||
|
|
||||||
LOGGER.info("{}销售数据多维度汇总计算完成",bkgs);
|
LOGGER.info("{}销售数据多维度汇总计算完成",bkgs);
|
||||||
} else {
|
} else {
|
||||||
LOGGER.info("开始执行销售数据多维度汇总计算(时间范围: {} 至 {})",
|
LOGGER.info("开始执行销售数据多维度汇总计算(时间范围: {} 至 {})",
|
||||||
dateRange.getStartDate(), dateRange.getEndDate());
|
dateRange.getStartDate(), dateRange.getEndDate());
|
||||||
|
|
||||||
// 计算月度维度数据(按月遍历)
|
|
||||||
calculateMonthlyData(dateRange, bkgs);
|
|
||||||
// 处理营业收入数据
|
// 处理营业收入数据
|
||||||
newProcessRevenueData(dateRange,bkgs);
|
newProcessRevenueData(dateRange,bkgs);
|
||||||
// 处理销量销额数据(分页查询)
|
// 处理销量销额数据(分页查询)
|
||||||
newProcessSalesVolumeData(dateRange,bkgs);
|
newProcessSalesVolumeData(dateRange,bkgs);
|
||||||
// 区域两金占比
|
// 区域两金占比
|
||||||
newProcessRegionTwoFundsRatio(dateRange,bkgs);
|
newProcessRegionTwoFundsRatio(dateRange,bkgs);
|
||||||
|
// 处理应收账款数据(分页查询)
|
||||||
|
newprocessReceivableData(dateRange, bkgs);
|
||||||
|
|
||||||
LOGGER.info("{}销售数据多维度汇总计算完成",bkgs);
|
LOGGER.info("{}销售数据多维度汇总计算完成",bkgs);
|
||||||
}
|
}
|
||||||
@ -118,6 +119,100 @@ public class SaleCountDimensionImpl implements DataSummaryService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void newprocessReceivableData(DateRange dateRange, String bkgs) {
|
||||||
|
LOGGER.info("开始处理应收账款数据,开始时间: {}, 板块公司: {}", dateRange.getStartDate(), bkgs);
|
||||||
|
int totalCount = 0;
|
||||||
|
|
||||||
|
// 删除已存在的记录
|
||||||
|
String deleteSql = "DELETE FROM " + BO_EU_XS_YSZK + " WHERE YEARMONTH >= ? AND BKGS = ?";
|
||||||
|
try {
|
||||||
|
int deleted = DBSql.update(deleteSql, new Object[]{DATE_FORMAT.format(dateRange.getStartDate()), bkgs});
|
||||||
|
LOGGER.info("应收账款-已删除{}条记录", deleted);
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error("应收账款-删除{}数据错误,删除sql为:{},请检查数据库链接:{}", bkgs, deleteSql, e.getMessage());
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
String sql = "SELECT t.RQ,t.QYGS,t.XSZZ,t.SHENGQU,t.SHIQU,t.QX,t.QCYE,t.LJXS,t.LJHK,t.YSYE," +
|
||||||
|
" t.ZLFX0_60,t.ZLFX60_1,t.ZLFX1_2,t.ZLFX2_3,t.ZLFX3_4,t.ZLFX4_5,t.ZLFX5" +
|
||||||
|
" FROM BO_EU_BNBM_DATALINKUP_XS_YSL t" +
|
||||||
|
" INNER JOIN (" +
|
||||||
|
" SELECT QYGS,SHIQU,MAX(RQ) AS MaxRQ,YEAR(RQ) AS Year,MONTH(RQ) AS Month" +
|
||||||
|
" FROM BO_EU_BNBM_DATALINKUP_XS_YSL" +
|
||||||
|
" WHERE DATE(RQ) >= ? AND BKGS = ?" +
|
||||||
|
" GROUP BY QYGS, SHIQU, YEAR(RQ), MONTH(RQ)" +
|
||||||
|
" ) AS grouped ON t.QYGS = grouped.QYGS AND t.SHIQU = grouped.SHIQU AND t.RQ = grouped.MaxRQ" +
|
||||||
|
" WHERE t.BKGS = ?" +
|
||||||
|
" ORDER BY t.QYGS, t.SHIQU, t.RQ";
|
||||||
|
|
||||||
|
List<RowMap> maps = DBSql.getMaps(sql, DATE_FORMAT.format(dateRange.getStartDate()), bkgs);
|
||||||
|
// 获取公司位置信息
|
||||||
|
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
|
||||||
|
));
|
||||||
|
|
||||||
|
if (maps==null){
|
||||||
|
LOGGER.info("应收账款数据第无数据");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 分页查询应收账款数据
|
||||||
|
int page = 0;
|
||||||
|
boolean hasMore = true;
|
||||||
|
ArrayList<BO> bos = new ArrayList<>();
|
||||||
|
for (RowMap map : maps) {
|
||||||
|
String xszz = map.getString("XSZZ");
|
||||||
|
String rq = map.getString("RQ");
|
||||||
|
BO bo = new BO();
|
||||||
|
bo.set("YEARMONTH", YEAR_MONTH_FORMAT.format(rq));
|
||||||
|
bo.set("BKGS", bkgs);
|
||||||
|
bo.set("QYGS", map.getString("QYGS"));
|
||||||
|
bo.set("GC", xszz);
|
||||||
|
bo.set("SQ", map.getString("SHENGQU"));
|
||||||
|
bo.set("CITY", map.getString("SHIQU"));
|
||||||
|
bo.set("QX", map.getString("QX"));
|
||||||
|
if (resultMap.containsKey(xszz)) {
|
||||||
|
Location location = resultMap.get(xszz);
|
||||||
|
bo.set("JD", location.getLongitude());
|
||||||
|
bo.set("WD", location.getLatitude());
|
||||||
|
}
|
||||||
|
bo.set("QCYE", map.getDouble("QCYE"));
|
||||||
|
bo.set("NFH", map.getDouble("LJXS"));
|
||||||
|
bo.set("NHK", map.getDouble("LJHK"));
|
||||||
|
bo.set("YSZE", map.getDouble("YSYE"));
|
||||||
|
bo.set("ZL60", map.getDouble("ZLFX0_60"));
|
||||||
|
bo.set("ZL60_1", map.getDouble("ZLFX60_1"));
|
||||||
|
bo.set("ZL1_2", map.getDouble("ZLFX1_2"));
|
||||||
|
bo.set("ZL2_3", map.getDouble("ZLFX2_3"));
|
||||||
|
bo.set("ZL3_4", map.getDouble("ZLFX3_4"));
|
||||||
|
bo.set("ZL4_5", map.getDouble("ZLFX4_5"));
|
||||||
|
bo.set("ZL5", map.getDouble("ZLFX5"));
|
||||||
|
bos.add(bo);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 批量新增BO
|
||||||
|
if (!bos.isEmpty()) {
|
||||||
|
for (int i = 0; i < bos.size(); i += BATCH_SIZE) {
|
||||||
|
int end = Math.min(bos.size(), i + BATCH_SIZE);
|
||||||
|
List<BO> batchList = bos.subList(i, end);
|
||||||
|
SDK.getBOAPI().createDataBO(BO_EU_XS_YSZK, batchList, UserContext.fromUID("admin"));
|
||||||
|
}
|
||||||
|
totalCount += bos.size();
|
||||||
|
LOGGER.info("应收账款数据第{}页处理完成,本页{}条记录,累计{}条", page + 1, bos.size(), totalCount);
|
||||||
|
page++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LOGGER.info("应收账款数据处理完成,共处理{}条记录", totalCount);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 区域两金占比
|
* 区域两金占比
|
||||||
* @param dateRange 时间范围
|
* @param dateRange 时间范围
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user