优化账账相对问题

This commit is contained in:
lihao 2024-12-31 10:12:29 +08:00
parent 13b4d92f6f
commit 30a5ae7f0d
2 changed files with 99 additions and 0 deletions

5
gl/component.xml Normal file
View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding='gb2312'?>
<module displayname="gl" name="gl">
<dependencies>
</dependencies>
</module>

View File

@ -0,0 +1,94 @@
package nccloud.web.gl.accountrep.action;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import nc.vo.pub.BusinessException;
import nccloud.framework.service.ServiceLocator;
import nccloud.pubitf.gl.account.IAccountReportWebService;
public class AccountBalanceTotalQueryAction {
public AccountBalanceTotalQueryAction() {
}
public Object doQuery(Map<String, Object> paraMap) throws BusinessException {
// 科目余额表数据
Map<String, Object> result = ((IAccountReportWebService) ServiceLocator.find(IAccountReportWebService.class)).queryAccBalance(paraMap);
// 科目辅助余额表数据
Map<String, Object> result1 = ((IAccountReportWebService) ServiceLocator.find(IAccountReportWebService.class)).querySubjAssBalanceBooks(paraMap);
List<Map<String, Object>> data = (List<Map<String, Object>>) result.get("data");
List<Map<String, Object>> data1 = (List<Map<String, Object>>) result1.get("data");
// 过滤掉 data1 assname 为空的数据
data1 = data1.stream()
.filter(item -> item.get("assname") != null && !item.get("assname").toString().trim().isEmpty())
.collect(Collectors.toList());
// 创建一个映射根据 acccode 快速查找 data 中的元素
Map<String, Map<String, Object>> dataMap = data.stream()
.collect(Collectors.toMap(item -> (String) item.get("acccode"), item -> item));
// 构造新的 Map存储每个父级科目的期末余额之和
Map<String, Double> sumMap = new HashMap<>();
// 构造新的列表
List<Map<String, Object>> mergedList = new ArrayList<>();
for (Map<String, Object> item : data1) {
Map<String, Object> linkMap = (Map<String, Object>) item.get("link");
String acccode = (String) linkMap.get("acccode");
String parentAcccode = acccode.substring(0, 4); // 假设父级科目编码是前4位
Map<String, Object> parentItem = dataMap.get(parentAcccode);
if (parentItem != null) {
String endlocamountStr = (String) item.get("endlocamount");
double endlocamount = parseEndlocamount(endlocamountStr);
// 更新 sumMap
sumMap.put(parentAcccode, sumMap.getOrDefault(parentAcccode, 0.0) + endlocamount);
// 构造新的 Map
Map<String, Object> newItem = new HashMap<>();
newItem.put("pacccode", parentAcccode);
newItem.put("paccname", parentItem.get("accname"));
newItem.put("pendlocamount", parentItem.get("endlocamount"));
newItem.put("acccode", acccode);
newItem.put("accname", parentItem.get("accname")); // 假设 data1 中没有 accname使用父级的 accname
newItem.put("assname", item.get("assname"));
newItem.put("endlocamount", endlocamount);
mergedList.add(newItem);
}
}
// 计算每个父级科目的 endlocamount 和所有关联 data1 endlocamount 的差值
for (Map<String, Object> item : mergedList) {
String parentAcccode = (String) item.get("pacccode");
double endlocamount = (double) item.get("pendlocamount");
double sumEndlocamount = sumMap.get(parentAcccode);
double difference = sumEndlocamount - endlocamount;
item.put("difference", difference);
}
// 输出合并后的列表
for (Map<String, Object> item : mergedList) {
System.out.println(item);
}
return mergedList;
}
// 解析 endlocamount 字符串为 double 类型
private static double parseEndlocamount(String endlocamountStr) {
if (endlocamountStr == null || endlocamountStr.isEmpty()) {
return 0.0;
}
// 去除逗号
endlocamountStr = endlocamountStr.replace(",", "");
try {
return Double.parseDouble(endlocamountStr);
} catch (NumberFormatException e) {
return 0.0;
}
}
}