Debug日志3

用友实习-debug日志

本周主要进入的项目是FDIP下的全面税务管理项目,主要对项目中的需求性bug进行修改,并通过GitLab与同事进行版本控制,于周末同意打新补丁,更新项目版本。

image-20241107151555625

需求BUG

人员工时明细,导入导出模板中将原来机构改为机构名称,增加一列字段名为机构编码,导入时根据人员编码查找人员基本信息反写机构编码与名称,注意导出时机构编码与名称是否有值

要对Excel的导入导出流进行逻辑校验,并且对excel模板进行修改。FDIP的excel是通过输入输出流手搓的一个excel导入导出功能,并没有使用Spring框架以及第三方库Apache POI 和 JExcelAPI实现Excel导入导出,所以在理解代码的就花了不少时间。

image-20241107155920965

FDIP是通过批注的方式控制Excel的导出范围,当新增列或者行的时候需要对应的修改批注,不然会造成数据丢失:

行和列都要调整

image-20241107160309848

image-20241107160047851

导出的时候需要把新增的列也就是机构编码查询出来并放进导出数据集中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 获取所有的人员编号
Set<String> staffNoSet = staffHourDetailExportList.stream()
.map(StaffHourDetailExport::getStaffNo)
.filter(Objects::nonNull)
.collect(Collectors.toSet());

// 查询出对应的机构编码
List<StaffHourDetailExport> orgDetails = staffHourDetailService.queryOrgByStaffNo(staffNoSet, null);
Map<String, String> staffNoToPkOrgMap = orgDetails.stream()
.collect(Collectors.toMap(
StaffHourDetailExport::getStaffNo,
StaffHourDetailExport::getPkOrg,
(existingValue, newValue) -> existingValue // 处理重复键
));

// 将查询到的机构编码设置到对应的 staffHourDetailExportList
staffHourDetailExportList.forEach(detail -> {
if (detail.getStaffNo() != null && staffNoToPkOrgMap.containsKey(detail.getStaffNo())) {
detail.setPkOrg(staffNoToPkOrgMap.get(detail.getStaffNo()));
}
});

image-20241107160508359

最后就可以实现导出了:

image-20241107160625617

导入的时候就需要staffNoSet就是人员编号列表去查询每个人员对应的staffNostaffNmae然后再反写到excelData,在进行导入操作就能实现需求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 3. 根据staffNo查询并补全pkOrg和pkOrgName
Set<String> staffNoSet = data.stream().map(d -> d.get("staffNo").toString()).collect(Collectors.toSet());
List<StaffHourDetailExport> orgDetails = this.staffHourDetailService.queryOrgByStaffNo(staffNoSet, null);

// 将查询到的pkOrg和pkOrgName映射到staffNo
Map<String, StaffHourDetailExport> staffOrgMap = orgDetails.stream()
.filter(orgDetail -> orgDetail != null && orgDetail.getStaffNo() != null) // 过滤掉 null 值
.collect(Collectors.toMap(
StaffHourDetailExport::getStaffNo,
orgDetail -> orgDetail,
(existing, replacement) -> existing // 保留第一个出现的值
));

// 反写查询结果到导入数据集合中
for (Map<String, Object> excelData : data) {
String staffNo = excelData.get("staffNo").toString();
if (staffOrgMap.containsKey(staffNo)) {
StaffHourDetailExport orgDetail = staffOrgMap.get(staffNo);
excelData.put("pkOrg", orgDetail.getPkOrg());
excelData.put("pkOrgName", orgDetail.getPkOrgName());
} else {
excelData.put("pkOrg", "");
excelData.put("pkOrgName", "");
}
}