fix: scc流程并行流处理后排序错乱问题

This commit is contained in:
2024-08-14 14:22:59 +08:00
parent 9d46378dac
commit 432cf2363a
2 changed files with 62 additions and 5 deletions
@@ -17,10 +17,9 @@ import org.jeecgframework.poi.excel.annotation.ExcelCollection;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
@@ -31,7 +30,7 @@ import java.util.List;
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="process_standard_compliance_check对象", description="法规符合性排查流程-子表")
public class ProcessStandardComplianceCheckDetail implements Serializable {
public class ProcessStandardComplianceCheckDetail implements Serializable, Comparator<ProcessStandardComplianceCheckDetail> {
/**
* 主键ID
@@ -242,4 +241,56 @@ public class ProcessStandardComplianceCheckDetail implements Serializable {
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@Override
public int compare(ProcessStandardComplianceCheckDetail o1, ProcessStandardComplianceCheckDetail o2) {
String termNumber1 = o1.getTermNumber();
String termNumber2 = o2.getTermNumber();
// 提取字符串中的数字和非数字部分
List<String> parts1 = splitByNumber(termNumber1);
List<String> parts2 = splitByNumber(termNumber2);
int size = Math.min(parts1.size(), parts2.size());
for (int i = 0; i < size; i++) {
String part1 = parts1.get(i);
String part2 = parts2.get(i);
int result;
// 如果部分是数字,按数值比较
if (isNumeric(part1) && isNumeric(part2)) {
result = Integer.compare(Integer.parseInt(part1), Integer.parseInt(part2));
} else {
// 非数字部分按字典顺序比较
result = part1.compareTo(part2);
}
if (result != 0) {
return result;
}
}
// 如果前面的部分都相等,则按长度比较
return Integer.compare(parts1.size(), parts2.size());
}
private List<String> splitByNumber(String input) {
Matcher matcher = Pattern.compile("[0-9]+|[^0-9]+").matcher(input);
List<String> result = new ArrayList<>();
while (matcher.find()) {
result.add(matcher.group());
}
return result;
}
private boolean isNumeric(String str) {
try {
Integer.parseInt(str);
return true;
} catch (NumberFormatException e) {
return false;
}
}
}
@@ -551,6 +551,7 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl<Proce
});
// 复制一份数据
List<ProcessStandardComplianceCheckDetail> newRecordsExport = new ArrayList<>(detailInfoList);
newRecordsExport.sort(new ProcessStandardComplianceCheckDetail());
Workbook workbook = ExcelExportUtil
.exportExcel(exportParams, ProcessStandardComplianceCheckDetail.class, detailInfoList);
// 生成超链接
@@ -914,6 +915,7 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl<Proce
if (Objects.nonNull(scc)) {
detailQueryWrapper.eq(ProcessStandardComplianceCheckDetail::getCheckId, scc.getId());
detailList = sccDetailService.list(detailQueryWrapper);
detailList.sort(new ProcessStandardComplianceCheckDetail());
}
String xmlNodeId = record.getNodeId();
// 设置流程信息
@@ -932,6 +934,7 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl<Proce
detailList = detailList.stream().filter(detail ->
StrUtil.isBlank(detail.getDesignEngineer())
&& detail.getProcessInstanceId().equals(processInstanceId)).collect(Collectors.toList());
detailList.sort(new ProcessStandardComplianceCheckDetail());
processSccVO.setDetailInfoList(detailList);
break;
case DESIGNER_ENGINEER_EVALUATION:
@@ -941,6 +944,7 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl<Proce
case MAIN_CHECK_USER_REDISTRIBUTE:
detailList = detailList.stream().filter(detail ->
detail.getProcessInstanceId().equals(processInstanceId)).collect(Collectors.toList());
detailList.sort(new ProcessStandardComplianceCheckDetail());
processSccVO.setDetailInfoList(detailList);
break;
}
@@ -981,6 +985,8 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl<Proce
LambdaQueryWrapper<ProcessStandardComplianceCheckDetail> detailQueryWrapper = new LambdaQueryWrapper<>();
detailQueryWrapper.eq(ProcessStandardComplianceCheckDetail::getProcessInstanceId, processInstanceId);
List<ProcessStandardComplianceCheckDetail> detailList = sccDetailService.list(detailQueryWrapper);
// 排序detailList
detailList.sort(new ProcessStandardComplianceCheckDetail());
processSccVO.setDetailInfoList(detailList);
}