diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/controller/DataLinkUpController.java b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/controller/DataLinkUpController.java index 6d9a357..fbbc43f 100644 --- a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/controller/DataLinkUpController.java +++ b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/controller/DataLinkUpController.java @@ -270,7 +270,7 @@ public class DataLinkUpController { summaryService = new PurchaseDataSummaryServiceImpl(); LOGGER.info("采购业务检测到,创建summaryService实例"); } else if ("运营".equals(ssyw)) { -// summaryService = new ProductionDataSyncServiceImpl(); + summaryService = new ProductionDataSummaryServiceImpl(); LOGGER.info("运营业务检测到,创建summaryService实例"); } else { LOGGER.error("{}没有汇总类",ssyw); diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/job/ProductionDataLinkUpJob.java b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/job/ProductionDataLinkUpJob.java index 4571df3..cf44f9a 100644 --- a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/job/ProductionDataLinkUpJob.java +++ b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/job/ProductionDataLinkUpJob.java @@ -6,6 +6,8 @@ import com.actionsoft.bpms.schedule.IJob; import com.actionsoft.bpms.util.DBSql; 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.service.impl.ProductionDataSummaryServiceImpl; 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.PurchaseDataSyncServiceImpl; @@ -30,7 +32,7 @@ public class ProductionDataLinkUpJob implements IJob{ //时间范围数值 ArrayList list = new ArrayList<>(); ProductionDataSyncServiceImpl syncService = new ProductionDataSyncServiceImpl(); -// PurchaseDataSummaryServiceImpl purchaseDataSummaryService = new PurchaseDataSummaryServiceImpl(); + DataSummaryService productionDataSummaryService = new ProductionDataSummaryServiceImpl(); LOGGER.info("======== 开始执行运营数据同步任务 ========"); // 查询销售业务的主配置 List mainConfigs = SDK.getBOAPI().query("BO_EU_BNBM_DATALINKUP_SJGTPZ") @@ -62,7 +64,7 @@ public class ProductionDataLinkUpJob implements IJob{ for (RowMap map : bkgsMaps) { BO bo = new BO(); bo.set("BKGS", map.getString("BKGS")); -// purchaseDataSummaryService.calculateSummary(dateRange, bo); + productionDataSummaryService.calculateSummary(dateRange, bo); } } LOGGER.info("======== 运营数据同步任务执行完成 ========"); diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/ProductionDataSummaryServiceImpl.java b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/ProductionDataSummaryServiceImpl.java new file mode 100644 index 0000000..72360df --- /dev/null +++ b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/ProductionDataSummaryServiceImpl.java @@ -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 hashMap = new HashMap<>(); + hashMap.put("护面纸","HMZDH_SZ"); + hashMap.put("石膏","SGDH_SZ"); + hashMap.put("煤耗","MH_SZ"); + hashMap.put("电耗","DH_SZ"); + ArrayList 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 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 maps = DBSql.getMaps(sql, yyyy_mm); + if (maps.isEmpty()) { + LOGGER.info("产量汇总数据无数据,停止查询"); + } else { + ArrayList 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()); + } + } +}