新增征信维护上传与覆盖服务

This commit is contained in:
wkc
2026-03-24 09:08:40 +08:00
parent d2e3388a08
commit c22e379334
3 changed files with 407 additions and 7 deletions

View File

@@ -1,18 +1,138 @@
package com.ruoyi.info.collection.service;
import com.ruoyi.info.collection.domain.dto.CcdiCreditInfoQueryDTO;
import com.ruoyi.info.collection.domain.CcdiBaseStaff;
import com.ruoyi.info.collection.domain.CcdiCreditNegativeInfo;
import com.ruoyi.info.collection.domain.CcdiDebtsInfo;
import com.ruoyi.info.collection.domain.vo.CreditInfoUploadResultVO;
import com.ruoyi.info.collection.mapper.CcdiBaseStaffMapper;
import com.ruoyi.info.collection.mapper.CcdiCreditInfoQueryMapper;
import com.ruoyi.info.collection.mapper.CcdiCreditNegativeInfoMapper;
import com.ruoyi.info.collection.mapper.CcdiDebtsInfoMapper;
import com.ruoyi.info.collection.service.impl.CcdiCreditInfoServiceImpl;
import com.ruoyi.info.collection.service.support.CreditInfoPayloadAssembler;
import com.ruoyi.lsfx.client.CreditParseClient;
import com.ruoyi.lsfx.domain.response.CreditParsePayload;
import com.ruoyi.lsfx.domain.response.CreditParseResponse;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.mock.web.MockMultipartFile;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.io.File;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class CcdiCreditInfoServiceImplTest {
@InjectMocks
private CcdiCreditInfoServiceImpl service;
@Mock
private CreditParseClient creditParseClient;
@Mock
private CreditInfoPayloadAssembler assembler;
@Mock
private CcdiBaseStaffMapper baseStaffMapper;
@Mock
private CcdiDebtsInfoMapper debtsInfoMapper;
@Mock
private CcdiCreditNegativeInfoMapper negativeInfoMapper;
@Mock
private CcdiCreditInfoQueryMapper queryMapper;
@Test
void shouldCompileCreditInfoContracts() {
CcdiCreditInfoQueryDTO queryDTO = new CcdiCreditInfoQueryDTO();
CreditInfoUploadResultVO resultVO = new CreditInfoUploadResultVO();
assertNotNull(queryDTO);
assertNotNull(resultVO);
void uploadHtmlFiles_shouldIsolateFailuresPerEmployee() {
MockMultipartFile successFile = new MockMultipartFile("files", "a.html", "text/html", "<html>a</html>".getBytes(StandardCharsets.UTF_8));
MockMultipartFile failFile = new MockMultipartFile("files", "b.html", "text/html", "<html>b</html>".getBytes(StandardCharsets.UTF_8));
when(creditParseClient.parse(anyString(), anyString(), any(File.class)))
.thenReturn(successResponse("330101199001010011", "张三", "2026-03-03"))
.thenThrow(new RuntimeException("征信解析失败"));
when(baseStaffMapper.selectOne(any())).thenReturn(baseStaff("330101199001010011", "张三"));
when(assembler.buildDebts(anyString(), anyString(), any(LocalDate.class), any(CreditParsePayload.class)))
.thenReturn(List.of(buildDebt()));
when(assembler.buildNegative(anyString(), anyString(), any(LocalDate.class), any(CreditParsePayload.class)))
.thenReturn(buildNegative());
CreditInfoUploadResultVO result = service.upload(Arrays.asList(successFile, failFile));
assertEquals(1, result.getSuccessCount());
assertEquals(1, result.getFailureCount());
assertEquals("征信解析失败", result.getFailures().get(0).getReason());
verify(debtsInfoMapper).deleteByPersonId("330101199001010011");
verify(negativeInfoMapper).deleteByPersonId("330101199001010011");
verify(debtsInfoMapper).insertBatch(any());
verify(negativeInfoMapper).insert(any(CcdiCreditNegativeInfo.class));
}
@Test
void uploadHtmlFiles_shouldRejectOlderReportDate() {
MockMultipartFile file = new MockMultipartFile("files", "a.html", "text/html", "<html>a</html>".getBytes(StandardCharsets.UTF_8));
when(creditParseClient.parse(anyString(), anyString(), any(File.class)))
.thenReturn(successResponse("330101199001010011", "张三", "2026-03-03"));
when(baseStaffMapper.selectOne(any())).thenReturn(baseStaff("330101199001010011", "张三"));
when(queryMapper.selectLatestQueryDate("330101199001010011"))
.thenReturn(LocalDate.parse("2026-03-05"));
CreditInfoUploadResultVO result = service.upload(List.of(file));
assertEquals(0, result.getSuccessCount());
assertEquals("上传征信日期早于当前已维护最新记录", result.getFailures().get(0).getReason());
}
private CreditParseResponse successResponse(String personId, String personName, String reportTime) {
CreditParsePayload payload = new CreditParsePayload();
Map<String, Object> header = new HashMap<>();
header.put("query_cert_no", personId);
header.put("query_cust_name", personName);
header.put("report_time", reportTime);
payload.setLxHeader(header);
payload.setLxDebt(Map.of("uncle_bank_house_bal", "1"));
payload.setLxPublictype(Map.of("civil_cnt", 1));
CreditParseResponse response = new CreditParseResponse();
response.setStatusCode("0");
response.setPayload(payload);
return response;
}
private CcdiBaseStaff baseStaff(String idCard, String name) {
CcdiBaseStaff staff = new CcdiBaseStaff();
staff.setIdCard(idCard);
staff.setName(name);
return staff;
}
private CcdiDebtsInfo buildDebt() {
CcdiDebtsInfo debt = new CcdiDebtsInfo();
debt.setPersonId("330101199001010011");
debt.setDebtTotalAmount(new BigDecimal("100"));
return debt;
}
private CcdiCreditNegativeInfo buildNegative() {
CcdiCreditNegativeInfo info = new CcdiCreditNegativeInfo();
info.setPersonId("330101199001010011");
return info;
}
}