1、运营BI汇总

This commit is contained in:
llllon 2025-10-31 16:13:29 +08:00
parent 933c7f83d4
commit 26e1b6db5d
3 changed files with 239 additions and 3 deletions

View File

@ -270,7 +270,7 @@ public class DataLinkUpController {
summaryService = new PurchaseDataSummaryServiceImpl(); summaryService = new PurchaseDataSummaryServiceImpl();
LOGGER.info("采购业务检测到创建summaryService实例"); LOGGER.info("采购业务检测到创建summaryService实例");
} else if ("运营".equals(ssyw)) { } else if ("运营".equals(ssyw)) {
// summaryService = new ProductionDataSyncServiceImpl(); summaryService = new ProductionDataSummaryServiceImpl();
LOGGER.info("运营业务检测到创建summaryService实例"); LOGGER.info("运营业务检测到创建summaryService实例");
} else { } else {
LOGGER.error("{}没有汇总类",ssyw); LOGGER.error("{}没有汇总类",ssyw);

View File

@ -6,6 +6,8 @@ import com.actionsoft.bpms.schedule.IJob;
import com.actionsoft.bpms.util.DBSql; import com.actionsoft.bpms.util.DBSql;
import com.actionsoft.sdk.local.SDK; import com.actionsoft.sdk.local.SDK;
import com.awspaas.user.apps.bnbm.datalinkup.entity.DateRange; 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.service.impl.ProductionDataSummaryServiceImpl;
import com.awspaas.user.apps.bnbm.datalinkup.service.impl.ProductionDataSyncServiceImpl; import com.awspaas.user.apps.bnbm.datalinkup.service.impl.ProductionDataSyncServiceImpl;
import com.awspaas.user.apps.bnbm.datalinkup.service.impl.PurchaseDataSummaryServiceImpl; import com.awspaas.user.apps.bnbm.datalinkup.service.impl.PurchaseDataSummaryServiceImpl;
import com.awspaas.user.apps.bnbm.datalinkup.service.impl.PurchaseDataSyncServiceImpl; import com.awspaas.user.apps.bnbm.datalinkup.service.impl.PurchaseDataSyncServiceImpl;
@ -30,7 +32,7 @@ public class ProductionDataLinkUpJob implements IJob{
//时间范围数值 //时间范围数值
ArrayList<DateRange> list = new ArrayList<>(); ArrayList<DateRange> list = new ArrayList<>();
ProductionDataSyncServiceImpl syncService = new ProductionDataSyncServiceImpl(); ProductionDataSyncServiceImpl syncService = new ProductionDataSyncServiceImpl();
// PurchaseDataSummaryServiceImpl purchaseDataSummaryService = new PurchaseDataSummaryServiceImpl(); DataSummaryService productionDataSummaryService = new ProductionDataSummaryServiceImpl();
LOGGER.info("======== 开始执行运营数据同步任务 ========"); LOGGER.info("======== 开始执行运营数据同步任务 ========");
// 查询销售业务的主配置 // 查询销售业务的主配置
List<BO> mainConfigs = SDK.getBOAPI().query("BO_EU_BNBM_DATALINKUP_SJGTPZ") List<BO> mainConfigs = SDK.getBOAPI().query("BO_EU_BNBM_DATALINKUP_SJGTPZ")
@ -62,7 +64,7 @@ public class ProductionDataLinkUpJob implements IJob{
for (RowMap map : bkgsMaps) { for (RowMap map : bkgsMaps) {
BO bo = new BO(); BO bo = new BO();
bo.set("BKGS", map.getString("BKGS")); bo.set("BKGS", map.getString("BKGS"));
// purchaseDataSummaryService.calculateSummary(dateRange, bo); productionDataSummaryService.calculateSummary(dateRange, bo);
} }
} }
LOGGER.info("======== 运营数据同步任务执行完成 ========"); LOGGER.info("======== 运营数据同步任务执行完成 ========");

View File

@ -0,0 +1,234 @@
package com.awspaas.user.apps.bnbm.datalinkup.service.impl;
import com.actionsoft.bpms.bo.engine.BO;
import com.actionsoft.bpms.commons.database.RowMap;
import com.actionsoft.bpms.server.UserContext;
import com.actionsoft.bpms.util.DBSql;
import com.actionsoft.exception.AWSDataAccessException;
import com.actionsoft.exception.AWSException;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.*;
/**
* @ClassName: ProductionDataSummaryServiceImpl
* @Description: 运营数据汇总
* @date: 2025/10/31 10:05
* @Blog: https://
*/
public class ProductionDataSummaryServiceImpl implements DataSummaryService {
private static final Logger LOGGER = LoggerFactory.getLogger(ProductionDataSummaryServiceImpl.class);
/**
* 运营_产量汇总
*/
private static final String BO_EU_YY_CLHZ = "BO_EU_YY_CLHZ";
/**
* 运营_对标单耗汇总
*/
private static final String BO_EU_YY_DBDHHZ = "BO_EU_YY_DBDHHZ";
// 日期格式化
private static final SimpleDateFormat YEAR_MONTH_FORMAT = new SimpleDateFormat("yyyy-MM");
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
@Override
public void calculateSummary(DateRange dateRange, BO mainConfig) {
try {
// 从主配置获取BKGS值
String bkgs = mainConfig.getString("BKGS");
if (bkgs == null || bkgs.isEmpty()) {
LOGGER.error("主配置中BKGS为空无法进行汇总计算");
return;
}
if (LocalDate.now().getDayOfMonth()!=32){
LOGGER.error("等待开始同步时间");
return;
}
if (dateRange == null || dateRange.getStartDate() == null || dateRange.getEndDate() == null) {
LOGGER.info("未提供有效时间范围,按当前日期计算");
Calendar cal = Calendar.getInstance();
// DateRange dateRangeNow = new DateRange();
// 设置为当前月的第一天
cal.set(Calendar.DAY_OF_MONTH, 1);
dateRange.setStartDate(cal.getTime());
// 设置为当前月的最后一天
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
dateRange.setEndDate(cal.getTime());
//产量汇总
productionSummary(dateRange,bkgs);
//对标单耗汇总
summaryOfBenchmarkConsumption(dateRange,bkgs);
LOGGER.info("{}运营数据多维度汇总计算完成",bkgs);
} else {
LOGGER.info("开始执行运营数据多维度汇总计算(时间范围: {} 至 {})",
dateRange.getStartDate(), dateRange.getEndDate());
//产量汇总
productionSummary(dateRange,bkgs);
//对标单耗汇总
summaryOfBenchmarkConsumption(dateRange,bkgs);
LOGGER.info("{}运营数据多维度汇总计算完成",bkgs);
}
} catch (Exception e) {
String errorMsg = "运营数据汇总计算失败: " + e.getMessage();
LOGGER.error(errorMsg, e);
throw new RuntimeException(errorMsg, e);
}
}
/**
* 对标单耗汇总
* @param dateRange 时间区间
* @param bkgs 板块公司
*/
private void summaryOfBenchmarkConsumption(DateRange dateRange, String bkgs) {
LOGGER.info("开始对标单耗汇总数据,年月: {}-{}, 板块公司: {}", dateRange.getStartDate(),dateRange.getEndDate(), bkgs);
// 删除已存在的记录
String deleteSql = "DELETE FROM " + BO_EU_YY_DBDHHZ + " WHERE YEARMONTH >= ?";
try {
int deleted = DBSql.update(deleteSql, new Object[]{YEAR_MONTH_FORMAT.format(dateRange.getStartDate())});
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 {
String yyyy_mm_dd = DATE_FORMAT.format(dateRange.getStartDate());
LocalDate parse = LocalDate.parse(yyyy_mm_dd);
int year = parse.getYear();
int monthValue = parse.getMonthValue();
//创建遍历从cp和查询字段
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("护面纸","HMZDH_SZ");
hashMap.put("石膏","SGDH_SZ");
hashMap.put("煤耗","MH_SZ");
hashMap.put("电耗","DH_SZ");
ArrayList<BO> bos = new ArrayList<>();
for (String cpKey:hashMap.keySet()) {
String sql = "SELECT CONCAT(NF, '-', LPAD(YF, 2, '0')) AS YEARMONTH," +
" BK AS BKGS," +
" ? AS CP," +
" ? AS DH" +
"FROM BO_EU_YYGLB_DB_SGBYDDF_XMDBZ" +
"WHERE HMZDH_SZ IS NOT NULL AND NF = ? AND YF = ? AND XM = '合计'" +
"GROUP BY NF, YF, BK";
LOGGER.info("对标单耗汇总数据查询SQL: {}", sql);
List<RowMap> maps = DBSql.getMaps(sql, cpKey, hashMap.get(cpKey), year, monthValue);
if (maps.isEmpty()) {
LOGGER.info("对标单耗汇总数据无数据,停止查询");
} else {
for (RowMap map : maps) {
String yearmonth = map.getString("YEARMONTH");
String bk = map.getString("BKGS");
String cp = map.getString("CP");
String dh = map.getString("DH");
BO bo = new BO();
bo.set("YEARMONTH",yearmonth);
bo.set("BKGS",bk);
bo.set("CP",cp);
bo.set("DH",dh);
bos.add(bo);
}
}
}
// 批量新增BO
if (!bos.isEmpty()) {
int[] admins = SDK.getBOAPI().createDataBO(BO_EU_YY_DBDHHZ, bos, UserContext.fromUID("admin"));
LOGGER.info("{}-对标单耗汇总数据处理完成,共查询{}条记录,导入{}条", bkgs, bos.size(), admins[0]);
}
} catch (AWSDataAccessException e) {
LOGGER.error("对标单耗汇总-新增数据{}年月-{}板块数据错误,请检查数据库链接:{}",
YEAR_MONTH_FORMAT.format(dateRange.getStartDate()), bkgs,e.getMessage());
throw new AWSException("对标单耗汇总-新增数据"+YEAR_MONTH_FORMAT.format(dateRange.getStartDate())+"年月-"+bkgs+"板块数据错误,请检查数据库链接:"+e.getMessage());
}
}
/**
* 产量汇总
* @param dateRange 时间区间
* @param bkgs 板块公司
*/
private void productionSummary(DateRange dateRange, String bkgs) {
LOGGER.info("开始处理产量汇总数据,年月: {}-{}, 板块公司: {}", dateRange.getStartDate(),dateRange.getEndDate(), bkgs);
// 删除已存在的记录
String deleteSql = "DELETE FROM " + BO_EU_YY_CLHZ + " WHERE YEARMONTH >= ?";
try {
int deleted = DBSql.update(deleteSql, new Object[]{YEAR_MONTH_FORMAT.format(dateRange.getStartDate())});
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 {
String yyyy_mm = YEAR_MONTH_FORMAT.format(dateRange.getStartDate());
String sql = "SELECT clmxb.YEARS_MONTH AS YEARMONTH, '' AS BKGS, clmxb.PRODEUCT AS CP," +
" SUM(CAST(clmxb.CURRENT_PRODUCTION AS DECIMAL(16,4))) AS CL," +
" CASE" +
" WHEN SUM(cnmxb.YXCN) IS NULL OR SUM(cnmxb.YXCN) = 0 THEN 0" +
" ELSE SUM(CAST(clmxb.CURRENT_PRODUCTION AS DECIMAL(16,4))) / SUM(cnmxb.YXCN)" +
" END AS CNLYL," +
" SUM(cnmxb.YXCN) AS CN" +
" FROM BO_EU_CLMXB clmxb" +
" LEFT JOIN (" +
" SELECT CP COLLATE utf8mb4_general_ci AS CP," +
" CONCAT(CAST(YEAR AS CHAR), '-', LPAD(CAST(MONTH AS CHAR), 2, '0')) AS YEARMONTH," +
" CAST(YXCN AS DECIMAL(16,4)) AS YXCN" +
" FROM BO_EU_DATALINKUP_CNMXB" +
" WHERE CONCAT(CAST(YEAR AS CHAR), '-', LPAD(CAST(MONTH AS CHAR), 2, '0')) = " +
" (SELECT MAX(CONCAT(CAST(YEAR AS CHAR), '-', LPAD(CAST(MONTH AS CHAR), 2, '0')))" +
" FROM BO_EU_DATALINKUP_CNMXB )" +
" ) cnmxb ON clmxb.PRODEUCT = cnmxb.CP" +
" WHERE clmxb.GONGCHANG NOT LIKE '%小计%' AND clmxb.YEARS_MONTH >= ?" +
" GROUP BY clmxb.PRODEUCT";
LOGGER.info("产量汇总数据查询SQL: {}", sql);
List<RowMap> maps = DBSql.getMaps(sql, yyyy_mm);
if (maps.isEmpty()) {
LOGGER.info("产量汇总数据无数据,停止查询");
} else {
ArrayList<BO> bos = new ArrayList<>();
for (RowMap map : maps) {
String yearmonth = map.getString("YEARMONTH");
String cp = map.getString("CP");
String cl = map.getString("CL");
String cnlyl = map.getString("CNLYL");
String cn = map.getString("CN");
BO bo = new BO();
bo.set("YEARMONTH",yearmonth);
bo.set("CP",cp);
bo.set("CL",cl);
bo.set("CNLYL",cnlyl);
bo.set("CN",cn);
bos.add(bo);
}
// 批量新增BO
if (!bos.isEmpty()) {
int[] admins = SDK.getBOAPI().createDataBO(BO_EU_YY_CLHZ, bos, UserContext.fromUID("admin"));
LOGGER.info("{}-产量汇总数据处理完成,共查询{}条记录,导入{}条", bkgs, bos.size(), admins[0]);
}
}
} catch (AWSDataAccessException e) {
LOGGER.error("产量汇总-新增数据{}年月-{}板块数据错误,请检查数据库链接:{}",
YEAR_MONTH_FORMAT.format(dateRange.getStartDate()), bkgs,e.getMessage());
throw new AWSException("产量汇总-新增数据"+YEAR_MONTH_FORMAT.format(dateRange.getStartDate())+"年月-"+bkgs+"板块数据错误,请检查数据库链接:"+e.getMessage());
}
}
}