day13_StringBuffer&排序&查找&Arrays

本文详细讲解了StringBuffer与StringBuilder的区别,包括它们与String及数组的不同之处。深入探讨了StringBuffer的构造方法、添加、删除、替换、反转和截取功能。此外,还介绍了排序算法(冒泡排序和选择排序)、查找算法(二分查找和基本查找)以及Arrays工具类的使用。同时,对Integer和Character类进行了全面解析。

今天听了刘意老师JavaSE第13天的前半部分(1-17),归纳如下

一、StringBuffer&StringBuilder

  • 1:String,StringBuffer,StringBuilder的区别?

  • A:String是内容不可变的,而StringBuffer,StringBuilder都是内容可变的。

  • B:StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高

  • 2:StringBuffer和数组的区别?

  • 二者都可以看出是一个容器,装其他的数据。

  • 但是呢,StringBuffer的数据最终是一个字符串数据。

  • 而数组可以放置多种数据,但必须是同一种数据类型的。

  • 3:形式参数问题

  • String作为参数传递

  • StringBuffer作为参数传递

  • 形式参数:

  •  基本类型:形式参数的改变不影响实际参数
    
  •  引用类型:形式参数的改变直接影响实际参数
    
  • 注意:

  •  String作为参数传递,效果和基本类型作为参数传递是一样的,当通过方法被赋值以后,main方法里的值不会改变。
    

4:StringBuffer的构造方法

  • public StringBuffer():无参构造方法
  •  public StringBuffer(int capacity):指定容量的字符串缓冲区对象
    
  •  public StringBuffer(String str):指定字符串内容的字符串缓冲区对象
    
  • StringBuffer的方法:
  •  public int capacity():返回当前容量。	理论值
    
  •  public int length():返回长度(字符数)。 实际值
    

5:StringBuffer的添加功能

  • public StringBuffer append(String str):可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身

  • public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身

6: StringBuffer的删除功能

  • public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
  • public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身

7: StringBuffer的替换功能:

  • public StringBuffer replace(int start,int end,String str):从start开始到end用str替换

8:StringBuffer的反转功能:

  • public StringBuffer reverse()

9: StringBuffer的截取功能:
(注意返回值类型不再是StringBuffer本身了)

  • public String substring(int start)
  • public String substring(int start,int end)

二、排序
1、冒泡排序
①原理:从索引0处开始两两比较,比到末位算一轮,共比较length-1轮。
②代码:

 `public static void bubbleSort (int [] arr){
 for (int x = 0; x < arr.length ; x++)  {
			for (int y = 0; y < arr.length  - x; y++) {
				if (arr[y] > arr[y + 1]) {
					int temp = arr[y];
					arr[y] = arr[y + 1];
					arr[y + 1] = temp;
				}
			}
		}`

2、选择排序
①原理:从索引0处开始两两比较,小的成为新的索引0处元素,再和第三个比较,二者中小的成为新的索引0处元素,不断更新的索引0处元素和末位比完算一轮,共比较length-1轮。
②代码:

public static void selectSort(int[]arr){
	for (int x=0;x<arr.length-1;x++){
	for(int y=x+1;y<length;y++){
	if(arr[x]>arr[y]){
		int temp=arr[x];
		arr[x]=arr[y];
		arr[y]=int temp;
		}
	}
}
	

三、查找
1、二分查找
前提:有序数列
在这里插入图片描述
代码:

public static int binarySearch (int []arr, int value){
	int max=arr.length-1;
	int min=0;
	int mid=(max+min)/2;

	while(arr[mid]!=value){
		if(value<arr[mid]){
			max=mid-1;}
		else if(value>arr[mid]){
				min=mid+1;}
		if(min>max){
		return -1;}//判断所给值是否在数列内
		mid=(max+min)/2; } //这步保证循环能进行下去
			return mid;} //最终需要让被查找索引等于中间值

(注意:如果给了一个无序数组,不能先排序再查找,因为排序已经把它的索引值改变了)

2、基本查找
代码

public static int basicSearch (int []arr,int value){
	int index=-1;
	for(int i=0;i<arr.length;i++){
	if(arr[i]==int value){
		index=i;
		break;}
		return index;}
		}

四、Arrays工具类
(无构造方法–>所有成员方法都是静态的–>可以通过类名Arrays直接调用)
(1)定义:针对数组进行操作的工具类(如排序、查找)
(2)成员方法:
public static String toString (int []a) 把数组转换成字符串
public static void sort (int []a) 排序(底层是快排,源码没看)
public static int binarySearch (int []a, int key) 二分查找

五、Integer
(1)定义:为了让基本类型的数据进行更多的操作,Java就为每种基本类型提供了对应的包装类类型。
(2)Integer的构造方法
A:Integer i = new Integer(100);
B:Integer i = new Integer(“100”);
注意:这里的字符串必须是由数字字符组成
(3)String和int的相互转换
A:String – int
Integer.parseInt(“100”);
B:int – String
String.valueOf(100);
(4)其他的功能(了解)
进制转换
(5)JDK5的新特性
自动装箱 基本类型–引用类型
自动拆箱 引用类型–基本类型

	把下面的这个代码理解即可:
		Integer i = 100;
		i += 200;

六、Character
(1)构造方法:

  •  Character(char value)
    

(2)成员方法:

  • public static boolean isUpperCase(char ch):判断给定的字符是否是大写字符
  • public static boolean isLowerCase(char ch):判断给定的字符是否是小写字符
  • public static boolean isDigit(char ch):判断给定的字符是否是数字字符
  • public static char toUpperCase(char ch):把给定的字符转换为大写字符
  • public static char toLowerCase(char ch):把给定的字符转换为小写字符
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 = &quot;AssetDebtDailyReport&quot;; // 部门列表 private static final String[] departments = {&quot;母公司整体&quot;, &quot;证券投资部&quot;, &quot;中央交易室&quot;, &quot;金融创新部&quot;, &quot;销售交易部&quot;, &quot;固定收益部&quot;, &quot;报价融资部&quot;, &quot;资金运营部&quot;, &quot;融资融券部&quot; }; private static final Map&lt;String, List&lt;String&gt;&gt; DEPT_TO_BUSINESS_MAPPING = new HashMap&lt;&gt;(); // 静态块初始化映射关系 static { DEPT_TO_BUSINESS_MAPPING.put(&quot;母公司整体&quot;, Arrays.asList(&quot;证券投资部&quot;, &quot;金融创新部&quot;, &quot;固定收益部&quot;)); DEPT_TO_BUSINESS_MAPPING.put(&quot;证券投资部&quot;, Arrays.asList(&quot;股票投资&quot;, &quot;债券投资&quot;, &quot;衍生品交易&quot;)); DEPT_TO_BUSINESS_MAPPING.put(&quot;固定收益部&quot;, Arrays.asList(&quot;国债&quot;, &quot;金融债&quot;, &quot;企业债&quot;)); DEPT_TO_BUSINESS_MAPPING.put(&quot;销售交易部&quot;, Arrays.asList(&quot;利率互换&quot;, &quot;信用衍生品&quot;, &quot;外汇远期&quot;)); DEPT_TO_BUSINESS_MAPPING.put(&quot;金融创新部&quot;, Arrays.asList(&quot;场外期权&quot;, &quot;雪球结构&quot;, &quot;收益凭证&quot;)); DEPT_TO_BUSINESS_MAPPING.put(&quot;报价融资部&quot;, Arrays.asList(&quot;质押式回购&quot;, &quot;买断式回购&quot;, &quot;融资融券&quot;)); DEPT_TO_BUSINESS_MAPPING.put(&quot;资金运营部&quot;, Arrays.asList(&quot;银行存款&quot;, &quot;同业拆借&quot;, &quot;现金管理&quot;)); DEPT_TO_BUSINESS_MAPPING.put(&quot;中央交易室&quot;, Arrays.asList(&quot;现券交易&quot;, &quot;期货对冲&quot;, &quot;算法执行&quot;)); DEPT_TO_BUSINESS_MAPPING.put(&quot;融资融券部&quot;, Arrays.asList(&quot;两融业务&quot;, &quot;转融通&quot;, &quot;约定购回&quot;)); } private static final Map&lt;String, String&gt; PROJ_TYPE_TO_KEY = new HashMap&lt;&gt;(); private static final Map&lt;String, String&gt; KEY_TO_DISPLAY_NAME = new LinkedHashMap&lt;&gt;(); // 保持顺序 static { // 中文 projType 映射到内部字段 key PROJ_TYPE_TO_KEY.put(&quot;债券&quot;, &quot;bond&quot;); PROJ_TYPE_TO_KEY.put(&quot;股票&quot;, &quot;stock&quot;); PROJ_TYPE_TO_KEY.put(&quot;基金&quot;, &quot;fund&quot;); PROJ_TYPE_TO_KEY.put(&quot;股指期货&quot;, &quot;indexFutures&quot;); PROJ_TYPE_TO_KEY.put(&quot;国债期货&quot;, &quot;treasuryFutures&quot;); PROJ_TYPE_TO_KEY.put(&quot;收益互换&quot;, &quot;swap&quot;); PROJ_TYPE_TO_KEY.put(&quot;场外期权&quot;, &quot;otcOption&quot;); // 内部 key 映射回中文显示名(用于报表第二列) KEY_TO_DISPLAY_NAME.put(&quot;bond&quot;, &quot;债券&quot;); KEY_TO_DISPLAY_NAME.put(&quot;stock&quot;, &quot;股票&quot;); KEY_TO_DISPLAY_NAME.put(&quot;fund&quot;, &quot;基金&quot;); KEY_TO_DISPLAY_NAME.put(&quot;indexFutures&quot;, &quot;股指期货&quot;); KEY_TO_DISPLAY_NAME.put(&quot;treasuryFutures&quot;, &quot;国债期货&quot;); KEY_TO_DISPLAY_NAME.put(&quot;swap&quot;, &quot;收益互换&quot;); KEY_TO_DISPLAY_NAME.put(&quot;otcOption&quot;, &quot;场外期权&quot;); } @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(&quot;#############{}没有数据,不生成报告&quot;, dateDt); return; } // 删除当日数据 liquidReportChartRepository.deleteLiquidReportChartByDataDtAndReportCode(dateDt, debtBusinessDayReport); liquidReportDocxRepository.deleteLiquidReportDocxByDataDtAndReportCode(dateDt, debtBusinessDayReport); // 查询所有数据 List&lt;DebtBusinessDayReportWholeAssetVO&gt; 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), &quot;资负日报&quot;); ReportStatusManage reportStatusManage = new ReportStatusManage(); reportStatusManage.setReportStatus(&quot;Y&quot;); reportStatusManage.setReportName(&quot;资负日报&quot;); reportStatusManage.setReportConfirmDate(SystemUtil.strToDate(dateDt)); reportStatusRepository.save(reportStatusManage); } /** * @Description 根据时间查询所有数据 * @author K0171746 */ private List&lt;DebtBusinessDayReportWholeAssetVO&gt; queryAsset (String dateDt) { // 获取今年第一个工作日 String bgnDt = workDayService.findYearFirstNaturalDay(dateDt); // 获取去年最后一个工作日 String lastYearFinalWorkDay = workDayService.findLastYearFinalWorkDayStr(dateDt); List&lt;String&gt; bgnDts = workDayService.findTransDts(bgnDt, dateDt); String firstWorkDay = bgnDts.get(0); StringBuffer sql = new StringBuffer(); sql.append(&quot;SELECT a.DEPT,&quot; + &quot;a.BUSI_BIGC_NAME,&quot; + &quot;a.BUSI_SMLC_NAME,&quot; + &quot;a.PAL,&quot; + &quot;a.PAL_MON,&quot; + &quot;a.PAL_YEAR,&quot; + &quot;a.COMPARE_YEAR,&quot; + &quot;a.PROJ_TYPE,&quot; + &quot;a.AMT,&quot; + &quot;a.COMPARE_DAY,&quot; + &quot;a.COMPARE_MON, &quot; + &quot;a.AMT - b.AMT as compareBeginYear, &quot; + &quot;c.PAL_YEAR as compareLastYearWorkDay from T_LIQUID_BURDEN_DEPT a left join T_LIQUID_BURDEN_DEPT b on a.DEPT = b.DEPT&quot; + &quot; AND a.LIQ_BIG_CLAS = b.LIQ_BIG_CLAS&quot; + &quot; AND a.BUSI_BIGC_NAME = b.BUSI_BIGC_NAME&quot; + &quot; AND a.BUSI_SMLC_NAME = b.BUSI_SMLC_NAME&quot; + &quot; AND a.STRA = b.STRA&quot; + &quot; AND a.PROJ_TYPE = b.PROJ_TYPE &quot; + &quot; AND a.BS = b.BS &quot; + &quot; AND b.DATA_DT = &#39;&quot;+firstWorkDay+&quot;&#39; left join T_LIQUID_BURDEN_DEPT c on a.DEPT = c.DEPT&quot; + &quot; AND a.BUSI_BIGC_NAME = c.BUSI_BIGC_NAME&quot; + &quot; AND a.BUSI_SMLC_NAME = c.BUSI_SMLC_NAME&quot; + &quot; AND a.STRA = c.STRA&quot; + &quot; AND a.PROJ_TYPE = c.PROJ_TYPE &quot; + &quot; AND a.BS = c.BS &quot; + &quot; and c.DATA_DT = &#39;&quot; + lastYearFinalWorkDay + &quot;&#39; where a.DATA_DT = &#39;&quot;+ dateDt +&quot;&#39;;&quot;); return jdbcTemplate.query(sql.toString(),new BeanPropertyRowMapper(DebtBusinessDayReportWholeAssetVO.class)); } /** * @Description 生成损益折线图 * @author K0171746 */ private void generateChart1(List&lt;DebtBusinessDayReportWholeAssetVO&gt; wholeVO,String dateDt){ // 查询资负表,获取全部数据 List&lt;LiquidReportChart&gt; chartList = new ArrayList&lt;&gt;(); int rowNum = 1; for (String dept : departments) { List&lt;String&gt; bizTypes = DEPT_TO_BUSINESS_MAPPING.get(dept); if (bizTypes == null || bizTypes.size() &lt; 3) { log.warn(&quot;部门 {} 未配置完整的三项业务类型,跳过&quot;, dept); continue; } Map&lt;String, BigDecimal&gt; result = CalculateChart1(wholeVO, dept, bizTypes.get(0), bizTypes.get(1), bizTypes.get(2)); for (int i = 0; i &lt; 3; i++) { LiquidReportChart chart = new LiquidReportChart(); chart.setDataDt(dateDt); chart.setReportCode(debtBusinessDayReport); chart.setChartId(&quot;char0010&quot;); 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(&quot;成功将 {} 条 chart1 ({}) 数据落库&quot;, chartList.size(), &quot;char0010&quot;); } else { log.warn(&quot;没有有效数据生成 chart1&quot;); } } /** * @Description 计算损益折线图数据 * @author K0171746 */ private Map&lt;String,BigDecimal&gt; CalculateChart1(List&lt;DebtBusinessDayReportWholeAssetVO&gt; 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 &lt; wholeVO.size(); i++) { DebtBusinessDayReportWholeAssetVO vo = wholeVO.get(i); String dept = vo.getDept(); // 精确匹配部门(不去空格) if (!department.equals(dept)) { continue; } // 累加 if (!vo.getProjType().contains(&quot;合计&quot;)) { 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&lt;String, BigDecimal&gt; result = new HashMap&lt;&gt;(); result.put(&quot;部门合计(今年)&quot;, totalYear); result.put(&quot;部门合计(去年)&quot;, totalLastYear); result.put(bs1, totalDpOrBs1); result.put(bs2, totalDpOrBs2); result.put(bs3, totalDpOrBs3); return result; } /** * @Description 生成资负规模变化数据 * @author K0171746 */ private void generateChart2(List&lt;DebtBusinessDayReportWholeAssetVO&gt; wholeVO,String dateDt){ String[] fieldKeys = {&quot;bond&quot;, &quot;stock&quot;, &quot;fund&quot;, &quot;indexFutures&quot;, &quot;treasuryFutures&quot;, &quot;swap&quot;, &quot;otcOption&quot;}; String[] displayNames = {&quot;债券&quot;, &quot;股票&quot;, &quot;基金&quot;, &quot;股指期货&quot;, &quot;国债期货&quot;, &quot;收益互换&quot;, &quot;场外期权&quot;}; List&lt;LiquidReportChart&gt; chartList = new ArrayList&lt;&gt;(); int rowNum = 1; for (String dept : departments) { // 调用 chart2 统计该部门各项 P&amp;L Map&lt;String, BigDecimal&gt; result = CalculateChart2(wholeVO, dept); // 内层循环:遍历七种类型(固定7次) for (int i = 0; i &lt; 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(&quot;char0020&quot;); 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(&quot;成功将 {} 条 chart2 ({}, date={}) 数据落库&quot;, chartList.size(), &quot;chart0020&quot;, dateDt); } else { log.warn(&quot;没有有效数据生成 chart2 (date={})&quot;, dateDt); } } catch (Exception e) { log.error(&quot;保存 chart2 数据时发生异常 (date={})&quot;, dateDt, e); throw new RuntimeException(&quot;Failed to save chart2 data&quot;, e); } } /** * @Description 计算资负规模变化图数据 * @author K0171746 */ private Map&lt;String, BigDecimal&gt; CalculateChart2(List&lt;DebtBusinessDayReportWholeAssetVO&gt; 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(&quot;债券&quot;)){ totalBond = totalBond.add(vo.getPal()); } if (vo.getProjType().equals(&quot;股票&quot;)){ totalStock = totalStock.add(vo.getPal()); } if (vo.getProjType().equals(&quot;基金&quot;)){ totalFund = totalFund.add(vo.getPal()); } if (vo.getProjType().equals(&quot;股指期货&quot;)){ totalIndexFutures = totalIndexFutures.add(vo.getPal()); } if (vo.getProjType().equals(&quot;国债期货&quot;)){ totalTreasuryFutures = totalTreasuryFutures.add(vo.getPal()); } if (vo.getProjType().equals(&quot;收益互换&quot;)){ totalSwap = totalSwap.add(vo.getPal()); } if (vo.getProjType().equals(&quot;场外期权&quot;)){ totalOtcOption = totalOtcOption.add(vo.getPal()); } } // 封装结果到 Map Map&lt;String, BigDecimal&gt; changes = new HashMap&lt;&gt;(); changes.put(&quot;bond&quot;, totalBond); changes.put(&quot;stock&quot;, totalStock); changes.put(&quot;fund&quot;, totalFund); changes.put(&quot;indexFutures&quot;, totalIndexFutures); changes.put(&quot;treasuryFutures&quot;, totalTreasuryFutures); changes.put(&quot;swap&quot;, totalSwap); changes.put(&quot;otcOption&quot;, totalOtcOption); return changes; } /** * @Description 查询资负表有无当日数据 * @author K0171746 */ private int queryCount(String dateDt) { StringBuilder sql = new StringBuilder(); sql.append(&quot;SELECT &quot;); sql.append(&quot; count(1) &quot;); sql.append(&quot;FROM &quot;); sql.append(&quot; T_LIQUID_BURDEN_DEPT &quot;); sql.append(&quot;WHERE &quot;); sql.append(&quot; d_date = ? &quot;); logger.info(&quot;查询T_LIQUID_BURDEN_DEPT数据是否为空&quot;, sql); return jdbcTemplate.queryForObject(sql.toString(), Integer.class, dateDt); } /** * @Description 生成母公司数据表 * @author K0171746 */ private void generateParent(List&lt;DebtBusinessDayReportWholeAssetVO&gt; wholeVO,String dateDt){ List&lt;DebtBusinessDayReportParentAssetVO&gt; parent = new ArrayList&lt;&gt;(); for (DebtBusinessDayReportWholeAssetVO vo : wholeVO) { // 判空处理 String projType = vo.getProjType(); // 检查是否符合两个条件之一 boolean isTotalLine = projType.contains(&quot;合计&quot;); 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) -&gt; { String deptA = a.getDept() == null ? &quot;&quot; : a.getDept().trim(); String deptB = b.getDept() == null ? &quot;&quot; : b.getDept().trim(); // 规则1:a 是母公司 &rarr; 排前面(返回 -1) if (&quot;母公司整体&quot;.equals(deptA) &amp;&amp; !&quot;母公司整体&quot;.equals(deptB)) return -1; // 规则2:b 是母公司 &rarr; b 排前面(即 a 后移,返回 1) if (!&quot;母公司整体&quot;.equals(deptA) &amp;&amp; &quot;母公司整体&quot;.equals(deptB)) return 1; // 规则3:都不是或都是母公司 &rarr; 按部门名升序排序 return deptA.compareTo(deptB); }); int rowNum = 1; List&lt;LiquidReportChart&gt; chartList = new ArrayList&lt;&gt;(); for (DebtBusinessDayReportParentAssetVO vo : parent) { String deptName = vo.getDept(); // 当前部门名 addField(chartList, deptName, &quot;单日损益&quot;, String.valueOf(vo.getPal()), dateDt, debtBusinessDayReport, rowNum++); addField(chartList, deptName, &quot;本月损益累计&quot;, String.valueOf(vo.getPalMon()), dateDt, debtBusinessDayReport, rowNum++); addField(chartList, deptName, &quot;年度损益累计&quot;, String.valueOf(vo.getPalYear()), dateDt, debtBusinessDayReport, rowNum++); addField(chartList, deptName, &quot;较上年同期&quot;, String.valueOf(vo.getCompareYear()), dateDt, debtBusinessDayReport, rowNum++); addField(chartList, deptName, &quot;资负类别&quot;, String.valueOf(vo.getProjType()), dateDt, debtBusinessDayReport, rowNum++); addField(chartList, deptName, &quot;本日规模&quot;, String.valueOf(vo.getAmt()), dateDt, debtBusinessDayReport, rowNum++); addField(chartList, deptName, &quot;较上日变化&quot;, String.valueOf(vo.getCompareYesterday()), dateDt, debtBusinessDayReport, rowNum++); addField(chartList, deptName, &quot;较上月末变化&quot;, String.valueOf(vo.getCompareMon()), dateDt, debtBusinessDayReport, rowNum++); addField(chartList, deptName, &quot;较年初变化&quot;, String.valueOf(vo.getCompareBeginYear()), dateDt, debtBusinessDayReport, rowNum++); } try { if (!chartList.isEmpty()) { liquidReportChartRepository.save(chartList); log.info(&quot;成功将 {} 条 chart2 ({}, date={}) 数据落库&quot;, chartList.size(), &quot;chart0030&quot;, dateDt); } else { log.warn(&quot;没有有效数据生成 chart3 (date={})&quot;, dateDt); } } catch (Exception e) { log.error(&quot;保存 chart3 数据时发生异常 (date={})&quot;, dateDt, e); throw new RuntimeException(&quot;Failed to save chart3 data&quot;, e); } } /** * @Description 表格计算公式 * @author K0171746 */ private void addField(List&lt;LiquidReportChart&gt; 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(&quot;char0030&quot;); // 固定图表ID(可配置) chart.setRowNum(rowNum); chart.setCellValue1(deptName); // 维度1: 部门 chart.setCellValue2(fieldName); // 维度2: 指标名称 chart.setCellValue3(fieldValue); // 指标值(字符串化) chartList.add(chart); } /** * @Description 母公司计算部门数据表 * @author K0171746 */ private List&lt;DebtBusinessDayReportDpAssetVO&gt; CalculateDpAsset(List&lt;DebtBusinessDayReportWholeAssetVO&gt; wholeVO, String department){ // 参数校验 if (wholeVO == null || wholeVO.isEmpty()) { logger.warn(&quot;输入数据为空,无法生成部门资负数据&quot;); return new ArrayList&lt;&gt;(); } if (department == null || department.isEmpty()) { logger.warn(&quot;目标部门列表为空,返回空结果&quot;); return new ArrayList&lt;&gt;(); } // 生成部门资负数据 List&lt;DebtBusinessDayReportDpAssetVO&gt; assetVOS = new ArrayList&lt;&gt;(); for (DebtBusinessDayReportWholeAssetVO vo : wholeVO) { // 跳过 null 记录 if (vo == null) continue; String dept = vo.getDept(); // 跳过 dept 为 null 的记录 if (dept == null) { logger.debug(&quot;发现 dept 为 null 的记录,已跳过&quot;); 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&lt;DebtBusinessDayReportWholeAssetVO&gt; wholeVO,String dateDt){ // 1. 参数校验 if (CollectionUtils.isEmpty(wholeVO)) { logger.warn(&quot;输入的 wholeVO 数据为空,跳过 generateDpAsset 处理&quot;); return; } if (dateDt == null || dateDt.trim().isEmpty()) { logger.error(&quot;日期 dateDt 不能为空&quot;); throw new IllegalArgumentException(&quot;dateDt is required&quot;); } List&lt;LiquidReportChart&gt; chartList = new ArrayList&lt;&gt;(); 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, &quot;单日损益&quot;, String.valueOf((vo.getPal())), dateDt, &quot;char0040&quot;, rowNum++); addField(chartList, dept, busiBigcName, busiSmlcName, &quot;本月损益累计&quot;, String.valueOf(vo.getPalMon()), dateDt, &quot;char0040&quot;, rowNum++); addField(chartList, dept, busiBigcName, busiSmlcName, &quot;年度损益累计&quot;, String.valueOf(vo.getPalYear()), dateDt, &quot;char0040&quot;, rowNum++); addField(chartList, dept, busiBigcName, busiSmlcName, &quot;资负类别&quot;, String.valueOf(vo.getProjType()), dateDt, &quot;char0040&quot;, rowNum++); addField(chartList, dept, busiBigcName, busiSmlcName, &quot;本日规模&quot;, String.valueOf(vo.getAmt()), dateDt, &quot;char0040&quot;, rowNum++); addField(chartList, dept, busiBigcName, busiSmlcName, &quot;较上日变化&quot;, String.valueOf(vo.getCompareYesterday()), dateDt, &quot;char0040&quot;, rowNum++); addField(chartList, dept, busiBigcName, busiSmlcName, &quot;较上月末变化&quot;, String.valueOf(vo.getCompareMon()), dateDt, &quot;char0040&quot;, rowNum++); addField(chartList, dept, busiBigcName, busiSmlcName, &quot;较年初变化&quot;, String.valueOf(vo.getCompareBeginYear()), dateDt, &quot;char0040&quot;, rowNum++); } } // 3. 落地入库 try { if (!chartList.isEmpty()) { liquidReportChartRepository.save(chartList); log.info(&quot;成功将 {} 条部门明细数据 ({}, date={}) 落库&quot;, chartList.size(), &quot;char0040&quot;, dateDt); } else { log.warn(&quot;没有有效数据生成部门明细表 (date={})&quot;, dateDt); } } catch (Exception e) { log.error(&quot;保存部门明细数据时发生异常 (date={})&quot;, dateDt, e); throw new RuntimeException(&quot;Failed to save department asset detail data&quot;, e); } } /** * @Description 部门表格计算公式 * @author K0171746 */ private void addField(List&lt;LiquidReportChart&gt; 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; } } 这是修改后的,根据这个生成getReport方法
最新发布
10-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值