修复流水上传身份证号回填
This commit is contained in:
@@ -46,6 +46,7 @@ import java.nio.file.StandardCopyOption;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.RejectedExecutionException;
|
||||
@@ -819,7 +820,9 @@ public class CcdiFileUploadServiceImpl implements ICcdiFileUploadService {
|
||||
enterpriseNamesStr, accountNosStr);
|
||||
|
||||
log.info("【文件上传】步骤7: 获取流水数据");
|
||||
FetchBankStatementResult fetchResult = fetchAndSaveBankStatements(projectId, lsfxProjectId, logId);
|
||||
String fallbackCretNo = extractIdCardFromFileName(record.getFileName());
|
||||
FetchBankStatementResult fetchResult = fetchAndSaveBankStatements(projectId, lsfxProjectId, logId,
|
||||
fallbackCretNo);
|
||||
if (!fetchResult.isSuccess()) {
|
||||
updateFailedRecord(record, fetchResult.getErrorMessage());
|
||||
return;
|
||||
@@ -892,7 +895,8 @@ public class CcdiFileUploadServiceImpl implements ICcdiFileUploadService {
|
||||
* @param logId 文件ID
|
||||
*/
|
||||
private FetchBankStatementResult fetchAndSaveBankStatements(Long projectId, Integer groupId,
|
||||
Integer logId) {
|
||||
Integer logId,
|
||||
String fallbackCretNo) {
|
||||
log.info("【文件上传】开始获取流水数据: projectId={}, groupId={}, logId={}",
|
||||
projectId, groupId, logId);
|
||||
|
||||
@@ -957,6 +961,7 @@ public class CcdiFileUploadServiceImpl implements ICcdiFileUploadService {
|
||||
if (statement != null) {
|
||||
statement.setBatchId(logId);
|
||||
statement.setProjectId(projectId);
|
||||
fillMissingCretNo(statement, fallbackCretNo);
|
||||
normalizeDedupFields(statement);
|
||||
batchList.add(statement);
|
||||
|
||||
@@ -1000,6 +1005,22 @@ public class CcdiFileUploadServiceImpl implements ICcdiFileUploadService {
|
||||
}
|
||||
}
|
||||
|
||||
private String extractIdCardFromFileName(String fileName) {
|
||||
if (!StringUtils.hasText(fileName)) {
|
||||
return null;
|
||||
}
|
||||
String mainFileName = getMainFileName(fileName);
|
||||
Matcher matcher = UPLOAD_FILE_NAME_ID_CARD_PATTERN.matcher(mainFileName);
|
||||
return matcher.find() ? matcher.group() : null;
|
||||
}
|
||||
|
||||
private void fillMissingCretNo(CcdiBankStatement statement, String fallbackCretNo) {
|
||||
if (statement == null || StringUtils.hasText(statement.getCretNo()) || !StringUtils.hasText(fallbackCretNo)) {
|
||||
return;
|
||||
}
|
||||
statement.setCretNo(fallbackCretNo);
|
||||
}
|
||||
|
||||
private void cleanupBankStatements(Long projectId, Integer logId) {
|
||||
bankStatementMapper.deleteByProjectIdAndBatchId(projectId, logId);
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import ch.qos.logback.core.read.ListAppender;
|
||||
import com.alibaba.excel.EasyExcel;
|
||||
import com.ruoyi.ccdi.project.domain.CcdiProject;
|
||||
import com.ruoyi.ccdi.project.domain.enums.TriggerType;
|
||||
import com.ruoyi.ccdi.project.domain.entity.CcdiBankStatement;
|
||||
import com.ruoyi.ccdi.project.domain.vo.CcdiFileUploadStatisticsVO;
|
||||
import com.ruoyi.ccdi.project.domain.entity.CcdiFileUploadRecord;
|
||||
import com.ruoyi.ccdi.project.mapper.CcdiBankStatementMapper;
|
||||
@@ -470,6 +471,44 @@ class CcdiFileUploadServiceImplTest {
|
||||
), eq("原始流水.xlsx"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void processFileAsync_shouldBackfillMissingCretNoFromUploadFileName() throws IOException {
|
||||
AtomicReference<List<CcdiBankStatement>> insertedStatements = new AtomicReference<>();
|
||||
doAnswer(invocation -> {
|
||||
List<CcdiBankStatement> statements = invocation.getArgument(0);
|
||||
insertedStatements.set(new ArrayList<>(statements));
|
||||
return statements.size();
|
||||
}).when(bankStatementMapper).insertBatch(any());
|
||||
|
||||
CcdiProject project = new CcdiProject();
|
||||
project.setProjectId(PROJECT_ID);
|
||||
when(projectMapper.selectById(PROJECT_ID)).thenReturn(project);
|
||||
when(bankStatementMapper.countMatchedStaffCountByProjectId(PROJECT_ID)).thenReturn(1);
|
||||
when(lsfxClient.uploadFile(eq(LSFX_PROJECT_ID), any(), eq("张三_330101199001010011_流水.xlsx")))
|
||||
.thenReturn(buildUploadResponse());
|
||||
when(lsfxClient.checkParseStatus(LSFX_PROJECT_ID, String.valueOf(LOG_ID)))
|
||||
.thenReturn(buildCheckParseStatusResponse(false));
|
||||
when(lsfxClient.getFileUploadStatus(any())).thenReturn(buildParsedSuccessStatusResponse());
|
||||
when(lsfxClient.getBankStatement(any(GetBankStatementRequest.class)))
|
||||
.thenAnswer(invocation -> {
|
||||
GetBankStatementRequest request = invocation.getArgument(0);
|
||||
if (Integer.valueOf(1).equals(request.getPageSize())) {
|
||||
return buildBankStatementCountResponse(1);
|
||||
}
|
||||
return buildBankStatementResponseWithBlankCretNo();
|
||||
});
|
||||
|
||||
CcdiFileUploadRecord record = buildRecord();
|
||||
record.setFileName("张三_330101199001010011_流水.xlsx");
|
||||
Path tempFile = createTempFile();
|
||||
|
||||
service.processFileAsync(PROJECT_ID, LSFX_PROJECT_ID, tempFile.toString(), RECORD_ID, "batch-1", record);
|
||||
|
||||
assertNotNull(insertedStatements.get());
|
||||
assertEquals(1, insertedStatements.get().size());
|
||||
assertEquals("330101199001010011", insertedStatements.get().get(0).getCretNo());
|
||||
}
|
||||
|
||||
@Test
|
||||
void processFileAsync_shouldKeepOriginalFileNameWhenStatusReturnsDifferentName() throws IOException {
|
||||
when(lsfxClient.uploadFile(eq(LSFX_PROJECT_ID), any(), org.mockito.ArgumentMatchers.anyString()))
|
||||
@@ -717,7 +756,8 @@ class CcdiFileUploadServiceImplTest {
|
||||
"fetchAndSaveBankStatements",
|
||||
PROJECT_ID,
|
||||
LSFX_PROJECT_ID,
|
||||
LOG_ID
|
||||
LOG_ID,
|
||||
null
|
||||
);
|
||||
|
||||
assertTrue(Boolean.TRUE.equals(ReflectionTestUtils.getField(result, "success")));
|
||||
@@ -929,6 +969,27 @@ class CcdiFileUploadServiceImplTest {
|
||||
return response;
|
||||
}
|
||||
|
||||
private GetBankStatementResponse buildBankStatementCountResponse(int totalCount) {
|
||||
GetBankStatementResponse.BankStatementData data = new GetBankStatementResponse.BankStatementData();
|
||||
data.setTotalCount(totalCount);
|
||||
|
||||
GetBankStatementResponse response = new GetBankStatementResponse();
|
||||
response.setData(data);
|
||||
return response;
|
||||
}
|
||||
|
||||
private GetBankStatementResponse buildBankStatementResponseWithBlankCretNo() {
|
||||
GetBankStatementResponse.BankStatementItem item = new GetBankStatementResponse.BankStatementItem();
|
||||
item.setBankStatementId(1L);
|
||||
item.setLeName("测试主体");
|
||||
item.setAccountNo("62220001");
|
||||
item.setCustomerName("交易对手");
|
||||
item.setCustomerAccountNo("62220002");
|
||||
item.setDrAmount(BigDecimal.TEN);
|
||||
item.setCretNo(null);
|
||||
return buildBankStatementResponseWithItems(1, List.of(item));
|
||||
}
|
||||
|
||||
private void invokeSubmitTasksAsync(List<String> tempFilePaths,
|
||||
List<CcdiFileUploadRecord> records,
|
||||
String batchId) throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user