package com.htsc.service;
import com.alibaba.dubbo.common.utils.CollectionUtils;
import com.htsc.commons.SystemUtil;
import com.htsc.jpa.po.LiquidReportChart;
import com.htsc.jpa.po.ReportStatusManage;
import com.htsc.jpa.repository.LiquidBurdenDeptRepository;
import com.htsc.jpa.repository.LiquidReportChartRepository;
import com.htsc.jpa.repository.LiquidReportDocxRepository;
import com.htsc.jpa.repository.ReportStatusRepository;
import com.htsc.view.vo.DebtBusinessDayReportDpAssetVO;
import com.htsc.view.vo.DebtBusinessDayReportParentAssetVO;
import com.htsc.view.vo.DebtBusinessDayReportWholeAssetVO;
import com.htsc.view.vo.LiquidAssetDailyReportResultVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
import static com.htsc.strategy.ISubLcrNsfrHandlerStrategy.log;
/**
* @Author K0171746
* @Date 2025/10/22 14:35
*/
@Service
public class DebtBusinessDayReportService {
private static final Logger logger = LoggerFactory.getLogger(SwapConvenienceWeeklyService.class);
// 日报名称
public static String debtBusinessDayReport = "AssetDebtDailyReport";
// 部门列表
private static final String[] departments = {"母公司整体",
"证券投资部", "中央交易室", "金融创新部", "销售交易部",
"固定收益部", "报价融资部", "资金运营部", "融资融券部"
};
private static final Map<String, List<String>> DEPT_TO_BUSINESS_MAPPING = new HashMap<>();
// 静态块初始化映射关系
static {
DEPT_TO_BUSINESS_MAPPING.put("母公司整体", Arrays.asList("证券投资部", "金融创新部", "固定收益部"));
DEPT_TO_BUSINESS_MAPPING.put("证券投资部", Arrays.asList("股票投资", "债券投资", "衍生品交易"));
DEPT_TO_BUSINESS_MAPPING.put("固定收益部", Arrays.asList("国债", "金融债", "企业债"));
DEPT_TO_BUSINESS_MAPPING.put("销售交易部", Arrays.asList("利率互换", "信用衍生品", "外汇远期"));
DEPT_TO_BUSINESS_MAPPING.put("金融创新部", Arrays.asList("场外期权", "雪球结构", "收益凭证"));
DEPT_TO_BUSINESS_MAPPING.put("报价融资部", Arrays.asList("质押式回购", "买断式回购", "融资融券"));
DEPT_TO_BUSINESS_MAPPING.put("资金运营部", Arrays.asList("银行存款", "同业拆借", "现金管理"));
DEPT_TO_BUSINESS_MAPPING.put("中央交易室", Arrays.asList("现券交易", "期货对冲", "算法执行"));
DEPT_TO_BUSINESS_MAPPING.put("融资融券部", Arrays.asList("两融业务", "转融通", "约定购回"));
}
private static final Map<String, String> PROJ_TYPE_TO_KEY = new HashMap<>();
private static final Map<String, String> KEY_TO_DISPLAY_NAME = new LinkedHashMap<>(); // 保持顺序
static {
// 中文 projType 映射到内部字段 key
PROJ_TYPE_TO_KEY.put("债券", "bond");
PROJ_TYPE_TO_KEY.put("股票", "stock");
PROJ_TYPE_TO_KEY.put("基金", "fund");
PROJ_TYPE_TO_KEY.put("股指期货", "indexFutures");
PROJ_TYPE_TO_KEY.put("国债期货", "treasuryFutures");
PROJ_TYPE_TO_KEY.put("收益互换", "swap");
PROJ_TYPE_TO_KEY.put("场外期权", "otcOption");
// 内部 key 映射回中文显示名(用于报表第二列)
KEY_TO_DISPLAY_NAME.put("bond", "债券");
KEY_TO_DISPLAY_NAME.put("stock", "股票");
KEY_TO_DISPLAY_NAME.put("fund", "基金");
KEY_TO_DISPLAY_NAME.put("indexFutures", "股指期货");
KEY_TO_DISPLAY_NAME.put("treasuryFutures", "国债期货");
KEY_TO_DISPLAY_NAME.put("swap", "收益互换");
KEY_TO_DISPLAY_NAME.put("otcOption", "场外期权");
}
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private LiquidReportChartRepository liquidReportChartRepository;
@Autowired
private LiquidReportDocxRepository liquidReportDocxRepository;
@Autowired
private LiquidBurdenDeptRepository liquidBurdenDeptRepository;
@Autowired
private ReportStatusRepository reportStatusRepository;
@Autowired
private WorkDayService workDayService;
// 生成日报
public void generateReport(String dateDt) {
int i = this.queryCount(dateDt);
if(i==0){
logger.info("#############{}没有数据,不生成报告", dateDt);
return;
}
// 删除当日数据
liquidReportChartRepository.deleteLiquidReportChartByDataDtAndReportCode(dateDt, debtBusinessDayReport);
liquidReportDocxRepository.deleteLiquidReportDocxByDataDtAndReportCode(dateDt, debtBusinessDayReport);
// 查询所有数据
List<DebtBusinessDayReportWholeAssetVO> wholeVO = this.queryAsset(dateDt);
// 生成折线图1数据
this.generateChart1(wholeVO,dateDt);
// 生成折线图2数据
this.generateChart2(wholeVO,dateDt);
// 生成母公司表格数据
this.generateParent(wholeVO,dateDt);
// 生成各部门表格数据
this.generateDpAsset(wholeVO,dateDt);
// 生成日报记录
reportStatusRepository.deleteByReportConfirmDateAndReportName(SystemUtil.strToDate(dateDt), "资负日报");
ReportStatusManage reportStatusManage = new ReportStatusManage();
reportStatusManage.setReportStatus("Y");
reportStatusManage.setReportName("资负日报");
reportStatusManage.setReportConfirmDate(SystemUtil.strToDate(dateDt));
reportStatusRepository.save(reportStatusManage);
}
/**
* @Description 根据时间查询所有数据
* @author K0171746
*/
private List<DebtBusinessDayReportWholeAssetVO> queryAsset (String dateDt) {
// 获取今年第一个工作日
String bgnDt = workDayService.findYearFirstNaturalDay(dateDt);
// 获取去年最后一个工作日
String lastYearFinalWorkDay = workDayService.findLastYearFinalWorkDayStr(dateDt);
List<String> bgnDts = workDayService.findTransDts(bgnDt, dateDt);
String firstWorkDay = bgnDts.get(0);
StringBuffer sql = new StringBuffer();
sql.append("SELECT a.DEPT," +
"a.BUSI_BIGC_NAME," +
"a.BUSI_SMLC_NAME," +
"a.PAL," +
"a.PAL_MON," +
"a.PAL_YEAR," +
"a.COMPARE_YEAR," +
"a.PROJ_TYPE," +
"a.AMT," +
"a.COMPARE_DAY," +
"a.COMPARE_MON, " +
"a.AMT - b.AMT as compareBeginYear, " +
"c.PAL_YEAR as compareLastYearWorkDay from T_LIQUID_BURDEN_DEPT a left join T_LIQUID_BURDEN_DEPT b on a.DEPT = b.DEPT" +
" AND a.LIQ_BIG_CLAS = b.LIQ_BIG_CLAS" +
" AND a.BUSI_BIGC_NAME = b.BUSI_BIGC_NAME" +
" AND a.BUSI_SMLC_NAME = b.BUSI_SMLC_NAME" +
" AND a.STRA = b.STRA" +
" AND a.PROJ_TYPE = b.PROJ_TYPE " +
" AND a.BS = b.BS " +
" AND b.DATA_DT = '"+firstWorkDay+"' left join T_LIQUID_BURDEN_DEPT c on a.DEPT = c.DEPT" +
" AND a.BUSI_BIGC_NAME = c.BUSI_BIGC_NAME" +
" AND a.BUSI_SMLC_NAME = c.BUSI_SMLC_NAME" +
" AND a.STRA = c.STRA" +
" AND a.PROJ_TYPE = c.PROJ_TYPE " +
" AND a.BS = c.BS " +
" and c.DATA_DT = '" + lastYearFinalWorkDay + "' where a.DATA_DT = '"+ dateDt +"';");
return jdbcTemplate.query(sql.toString(),new BeanPropertyRowMapper(DebtBusinessDayReportWholeAssetVO.class));
}
/**
* @Description 生成损益折线图
* @author K0171746
*/
private void generateChart1(List<DebtBusinessDayReportWholeAssetVO> wholeVO,String dateDt){
// 查询资负表,获取全部数据
List<LiquidReportChart> chartList = new ArrayList<>();
int rowNum = 1;
for (String dept : departments) {
List<String> bizTypes = DEPT_TO_BUSINESS_MAPPING.get(dept);
if (bizTypes == null || bizTypes.size() < 3) {
log.warn("部门 {} 未配置完整的三项业务类型,跳过", dept);
continue;
}
Map<String, BigDecimal> result = CalculateChart1(wholeVO, dept, bizTypes.get(0), bizTypes.get(1), bizTypes.get(2));
for (int i = 0; i < 3; i++) {
LiquidReportChart chart = new LiquidReportChart();
chart.setDataDt(dateDt);
chart.setReportCode(debtBusinessDayReport);
chart.setChartId("char0010");
chart.setRowNum(rowNum++);
chart.setCellValue1(dept); // 部门名
chart.setCellValue2(bizTypes.get(i).toString()); // 业务名
chart.setCellValue3(String.valueOf(result.get(bizTypes.get(i)))); // 业务值
chartList.add(chart);
}
}
if (!chartList.isEmpty()) {
liquidReportChartRepository.save(chartList);
log.info("成功将 {} 条 chart1 ({}) 数据落库", chartList.size(), "char0010");
} else {
log.warn("没有有效数据生成 chart1");
}
}
/**
* @Description 计算损益折线图数据
* @author K0171746
*/
private Map<String,BigDecimal> CalculateChart1(List<DebtBusinessDayReportWholeAssetVO> wholeVO, String department, String bs1, String bs2, String bs3) {
BigDecimal totalYear = BigDecimal.ZERO;
BigDecimal totalLastYear = BigDecimal.ZERO;
BigDecimal totalDpOrBs1 = BigDecimal.ZERO;
BigDecimal totalDpOrBs2 = BigDecimal.ZERO;
BigDecimal totalDpOrBs3 = BigDecimal.ZERO;
// 遍历列表,逐个累加
for (int i = 0; i < wholeVO.size(); i++) {
DebtBusinessDayReportWholeAssetVO vo = wholeVO.get(i);
String dept = vo.getDept();
// 精确匹配部门(不去空格)
if (!department.equals(dept)) {
continue;
}
// 累加
if (!vo.getProjType().contains("合计")) {
totalYear = totalYear.add(vo.getPalYear());
totalLastYear = totalLastYear.add(vo.getCompareLastYearWorkDay());
if (vo.getBusiBigcName().equals(bs1)){
totalDpOrBs1 = totalDpOrBs1.add(vo.getPal());
}
if (vo.getBusiBigcName().equals(bs2)){
totalDpOrBs2 = totalDpOrBs2.add(vo.getPal());
}
if (vo.getBusiBigcName().equals(bs3)){
totalDpOrBs3 = totalDpOrBs3.add(vo.getPal());
}
}
}
// 封装结果到 Map
Map<String, BigDecimal> result = new HashMap<>();
result.put("部门合计(今年)", totalYear);
result.put("部门合计(去年)", totalLastYear);
result.put(bs1, totalDpOrBs1);
result.put(bs2, totalDpOrBs2);
result.put(bs3, totalDpOrBs3);
return result;
}
/**
* @Description 生成资负规模变化数据
* @author K0171746
*/
private void generateChart2(List<DebtBusinessDayReportWholeAssetVO> wholeVO,String dateDt){
String[] fieldKeys = {"bond", "stock", "fund", "indexFutures", "treasuryFutures", "swap", "otcOption"};
String[] displayNames = {"债券", "股票", "基金", "股指期货", "国债期货", "收益互换", "场外期权"};
List<LiquidReportChart> chartList = new ArrayList<>();
int rowNum = 1;
for (String dept : departments) {
// 调用 chart2 统计该部门各项 P&L
Map<String, BigDecimal> result = CalculateChart2(wholeVO, dept);
// 内层循环:遍历七种类型(固定7次)
for (int i = 0; i < 7; i++) {
String fieldKey = fieldKeys[i];
String displayName = displayNames[i];
// 从 result 中取值(手动 get)
BigDecimal value = result.get(fieldKey);
if (value == null) {
value = BigDecimal.ZERO;
}
// 构造实体对象
LiquidReportChart chart = new LiquidReportChart();
chart.setDataDt(dateDt);
chart.setReportCode(debtBusinessDayReport);
chart.setChartId("char0020");
chart.setRowNum(rowNum++);
chart.setCellValue1(dept); // 部门名称
chart.setCellValue2(displayName); // 业务名称
// 格式化数值:去掉末尾零,转字符串
chart.setCellValue3(value.stripTrailingZeros().toPlainString());
// 添加到列表
chartList.add(chart);
}
}
// 批量落库 + 异常捕获
try {
if (!chartList.isEmpty()) {
liquidReportChartRepository.save(chartList);
log.info("成功将 {} 条 chart2 ({}, date={}) 数据落库",
chartList.size(), "chart0020", dateDt);
} else {
log.warn("没有有效数据生成 chart2 (date={})", dateDt);
}
} catch (Exception e) {
log.error("保存 chart2 数据时发生异常 (date={})", dateDt, e);
throw new RuntimeException("Failed to save chart2 data", e);
}
}
/**
* @Description 计算资负规模变化图数据
* @author K0171746
*/
private Map<String, BigDecimal> CalculateChart2(List<DebtBusinessDayReportWholeAssetVO> wholeVO, String department){
BigDecimal totalBond = BigDecimal.ZERO;
BigDecimal totalStock = BigDecimal.ZERO;
BigDecimal totalFund = BigDecimal.ZERO;
BigDecimal totalIndexFutures = BigDecimal.ZERO;
BigDecimal totalTreasuryFutures = BigDecimal.ZERO;
BigDecimal totalSwap = BigDecimal.ZERO;
BigDecimal totalOtcOption = BigDecimal.ZERO;
// 遍历列表,逐个累加
for (DebtBusinessDayReportWholeAssetVO vo:wholeVO) {
String dept = vo.getDept();
if (department == null || dept == null) {
continue; // 如果任一方为 null,跳过
}
if (!department.equals(dept)) {
continue; // 部门不匹配则跳过
}
// 获取项目类型并判空
String projType = vo.getProjType();
if (projType == null) {
continue;
}
// 累加
if (vo.getProjType().equals("债券")){
totalBond = totalBond.add(vo.getPal());
}
if (vo.getProjType().equals("股票")){
totalStock = totalStock.add(vo.getPal());
}
if (vo.getProjType().equals("基金")){
totalFund = totalFund.add(vo.getPal());
}
if (vo.getProjType().equals("股指期货")){
totalIndexFutures = totalIndexFutures.add(vo.getPal());
}
if (vo.getProjType().equals("国债期货")){
totalTreasuryFutures = totalTreasuryFutures.add(vo.getPal());
}
if (vo.getProjType().equals("收益互换")){
totalSwap = totalSwap.add(vo.getPal());
}
if (vo.getProjType().equals("场外期权")){
totalOtcOption = totalOtcOption.add(vo.getPal());
}
}
// 封装结果到 Map
Map<String, BigDecimal> changes = new HashMap<>();
changes.put("bond", totalBond);
changes.put("stock", totalStock);
changes.put("fund", totalFund);
changes.put("indexFutures", totalIndexFutures);
changes.put("treasuryFutures", totalTreasuryFutures);
changes.put("swap", totalSwap);
changes.put("otcOption", totalOtcOption);
return changes;
}
/**
* @Description 查询资负表有无当日数据
* @author K0171746
*/
private int queryCount(String dateDt) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ");
sql.append(" count(1) ");
sql.append("FROM ");
sql.append(" T_LIQUID_BURDEN_DEPT ");
sql.append("WHERE ");
sql.append(" d_date = ? ");
logger.info("查询T_LIQUID_BURDEN_DEPT数据是否为空", sql);
return jdbcTemplate.queryForObject(sql.toString(), Integer.class, dateDt);
}
/**
* @Description 生成母公司数据表
* @author K0171746
*/
private void generateParent(List<DebtBusinessDayReportWholeAssetVO> wholeVO,String dateDt){
List<DebtBusinessDayReportParentAssetVO> parent = new ArrayList<>();
for (DebtBusinessDayReportWholeAssetVO vo : wholeVO) {
// 判空处理
String projType = vo.getProjType();
// 检查是否符合两个条件之一
boolean isTotalLine = projType.contains("合计");
if (!isTotalLine) {
continue; // 不符合条件,跳过
}
DebtBusinessDayReportParentAssetVO parentVO = new DebtBusinessDayReportParentAssetVO();
parentVO.setDept(vo.getDept());
parentVO.setPal(vo.getPal());
parentVO.setPalMon(vo.getPalMon());
parentVO.setPalYear(vo.getPalYear());
parentVO.setCompareYear(vo.getCompareYear());
parentVO.setProjType(vo.getProjType());
parentVO.setAmt(vo.getAmt());
parentVO.setCompareYesterday(vo.getCompareYesterday());
parentVO.setCompareMon(vo.getCompareMon());
parentVO.setCompareBeginYear(vo.getCompareBeginYear());
parent.add(parentVO);
}
// 排序
Collections.sort(parent, (a, b) -> {
String deptA = a.getDept() == null ? "" : a.getDept().trim();
String deptB = b.getDept() == null ? "" : b.getDept().trim();
// 规则1:a 是母公司 → 排前面(返回 -1)
if ("母公司".equals(deptA) && !"母公司".equals(deptB)) return -1;
// 规则2:b 是母公司 → b 排前面(即 a 后移,返回 1)
if (!"母公司".equals(deptA) && "母公司".equals(deptB)) return 1;
// 规则3:都不是或都是母公司 → 按部门名升序排序
return deptA.compareTo(deptB);
});
int rowNum = 1;
List<LiquidReportChart> chartList = new ArrayList<>();
for (DebtBusinessDayReportParentAssetVO vo : parent) {
String deptName = vo.getDept(); // 当前部门名
addField(chartList, deptName, "单日损益", String.valueOf(vo.getPal()), dateDt, debtBusinessDayReport, rowNum++);
addField(chartList, deptName, "本月损益累计", String.valueOf(vo.getPalMon()), dateDt, debtBusinessDayReport, rowNum++);
addField(chartList, deptName, "年度损益累计", String.valueOf(vo.getPalYear()), dateDt, debtBusinessDayReport, rowNum++);
addField(chartList, deptName, "较上年同期", String.valueOf(vo.getCompareYear()), dateDt, debtBusinessDayReport, rowNum++);
addField(chartList, deptName, "资负类别", String.valueOf(vo.getProjType()), dateDt, debtBusinessDayReport, rowNum++);
addField(chartList, deptName, "本日规模", String.valueOf(vo.getAmt()), dateDt, debtBusinessDayReport, rowNum++);
addField(chartList, deptName, "较上日变化", String.valueOf(vo.getCompareYesterday()), dateDt, debtBusinessDayReport, rowNum++);
addField(chartList, deptName, "较上月末变化", String.valueOf(vo.getCompareMon()), dateDt, debtBusinessDayReport, rowNum++);
addField(chartList, deptName, "较年初变化", String.valueOf(vo.getCompareBeginYear()), dateDt, debtBusinessDayReport, rowNum++);
}
try {
if (!chartList.isEmpty()) {
liquidReportChartRepository.save(chartList);
log.info("成功将 {} 条 chart2 ({}, date={}) 数据落库",
chartList.size(), "chart0030", dateDt);
} else {
log.warn("没有有效数据生成 chart3 (date={})", dateDt);
}
} catch (Exception e) {
log.error("保存 chart3 数据时发生异常 (date={})", dateDt, e);
throw new RuntimeException("Failed to save chart3 data", e);
}
}
/**
* @Description 表格计算公式
* @author K0171746
*/
private void addField(List<LiquidReportChart> chartList,
String deptName,
String fieldName,
String fieldValue,
String dateDt,
String reportCode,
int rowNum) {
LiquidReportChart chart = new LiquidReportChart();
chart.setDataDt(dateDt);
chart.setReportCode(reportCode);
chart.setChartId("char0030"); // 固定图表ID(可配置)
chart.setRowNum(rowNum);
chart.setCellValue1(deptName); // 维度1: 部门
chart.setCellValue2(fieldName); // 维度2: 指标名称
chart.setCellValue3(fieldValue); // 指标值(字符串化)
chartList.add(chart);
}
/**
* @Description 母公司计算部门数据表
* @author K0171746
*/
private List<DebtBusinessDayReportDpAssetVO> CalculateDpAsset(List<DebtBusinessDayReportWholeAssetVO> wholeVO, String department){
// 参数校验
if (wholeVO == null || wholeVO.isEmpty()) {
logger.warn("输入数据为空,无法生成部门资负数据");
return new ArrayList<>();
}
if (department == null || department.isEmpty()) {
logger.warn("目标部门列表为空,返回空结果");
return new ArrayList<>();
}
// 生成部门资负数据
List<DebtBusinessDayReportDpAssetVO> assetVOS = new ArrayList<>();
for (DebtBusinessDayReportWholeAssetVO vo : wholeVO) {
// 跳过 null 记录
if (vo == null) continue;
String dept = vo.getDept();
// 跳过 dept 为 null 的记录
if (dept == null) {
logger.debug("发现 dept 为 null 的记录,已跳过");
continue;
}
// 判断是否在目标部门列表中
if (department.contains(dept)) {
DebtBusinessDayReportDpAssetVO dpVO = new DebtBusinessDayReportDpAssetVO();
dpVO.setDept(dept);
dpVO.setBusiBigcName(vo.getBusiBigcName());
dpVO.setBusiSmlcName(vo.getBusiSmlcName());
dpVO.setPal(vo.getPal());
dpVO.setPalMon(vo.getPalMon());
dpVO.setPalYear(vo.getPalYear());
dpVO.setProjType(vo.getProjType());
dpVO.setAmt(vo.getAmt());
dpVO.setCompareYesterday(vo.getCompareYesterday());
dpVO.setCompareMon(vo.getCompareMon());
dpVO.setCompareBeginYear(vo.getCompareBeginYear());
dpVO.setCompareLastYearWorkDay(vo.getCompareLastYearWorkDay());
assetVOS.add(dpVO);
}
}
return assetVOS;
}
/**
* @Description 生成各部门数据表
* @author K0171746
*/
private void generateDpAsset(List<DebtBusinessDayReportWholeAssetVO> wholeVO,String dateDt){
// 1. 参数校验
if (CollectionUtils.isEmpty(wholeVO)) {
logger.warn("输入的 wholeVO 数据为空,跳过 generateDpAsset 处理");
return;
}
if (dateDt == null || dateDt.trim().isEmpty()) {
logger.error("日期 dateDt 不能为空");
throw new IllegalArgumentException("dateDt is required");
}
List<LiquidReportChart> chartList = new ArrayList<>();
int rowNum = 1;
// 2. 遍历每一个目标部门
for (String dept : departments) {
for (DebtBusinessDayReportWholeAssetVO vo : wholeVO) {
// 跳过 null 或不匹配部门的数据
if (vo == null || vo.getDept() == null || !dept.equals(vo.getDept())) {
continue;
}
// 获取业务维度
String busiBigcName = vo.getBusiBigcName();
String busiSmlcName = vo.getBusiSmlcName();
// 添加多个指标字段
addField(chartList, dept, busiBigcName, busiSmlcName, "单日损益", String.valueOf((vo.getPal())), dateDt, "char0040", rowNum++);
addField(chartList, dept, busiBigcName, busiSmlcName, "本月损益累计", String.valueOf(vo.getPalMon()), dateDt, "char0040", rowNum++);
addField(chartList, dept, busiBigcName, busiSmlcName, "年度损益累计", String.valueOf(vo.getPalYear()), dateDt, "char0040", rowNum++);
addField(chartList, dept, busiBigcName, busiSmlcName, "资负类别", String.valueOf(vo.getPalYear()), dateDt, "char0040", rowNum++);
addField(chartList, dept, busiBigcName, busiSmlcName, "本日规模", String.valueOf(vo.getPalYear()), dateDt, "char0040", rowNum++);
addField(chartList, dept, busiBigcName, busiSmlcName, "较上日变化", String.valueOf(vo.getCompareYesterday()), dateDt, "char0040", rowNum++);
addField(chartList, dept, busiBigcName, busiSmlcName, "较上月末变化", String.valueOf(vo.getCompareMon()), dateDt, "char0040", rowNum++);
addField(chartList, dept, busiBigcName, busiSmlcName, "较年初变化", String.valueOf(vo.getCompareBeginYear()), dateDt, "char0040", rowNum++);
}
}
// 3. 落地入库
try {
if (!chartList.isEmpty()) {
liquidReportChartRepository.save(chartList);
log.info("成功将 {} 条部门明细数据 ({}, date={}) 落库", chartList.size(), "char0040", dateDt);
} else {
log.warn("没有有效数据生成部门明细表 (date={})", dateDt);
}
} catch (Exception e) {
log.error("保存部门明细数据时发生异常 (date={})", dateDt, e);
throw new RuntimeException("Failed to save department asset detail data", e);
}
}
/**
* @Description 部门表格计算公式
* @author K0171746
*/
private void addField(List<LiquidReportChart> list,
String dept,
String busiBigcName,
String busiSmlcName,
String metricName,
String metricValue,
String dateDt,
String chartId,
int rowNum) {
LiquidReportChart chart = new LiquidReportChart();
chart.setDataDt(dateDt);
chart.setReportCode(debtBusinessDayReport);
chart.setChartId(chartId);
chart.setRowNum(rowNum);
chart.setCellValue1(dept); // 第一列:部门
chart.setCellValue2(busiBigcName); // 第二列:业务大类
chart.setCellValue3(busiSmlcName); // 第三列:业务小类
chart.setCellValue4(metricName); // 业务字段
chart.setCellValue5(metricValue); // 字段值
list.add(chart);
}
/**
* @Description 查询日报
* @author K0171746
*/
public LiquidAssetDailyReportResultVO getReport(String dateDt, String department) {
return null;
}
}
帮我检查一下有没有问题,有没有可以优化的点