实现关联业务自动补入实体库
This commit is contained in:
@@ -94,6 +94,6 @@ public class CcdiEnterpriseBaseInfo implements Serializable {
|
|||||||
/** 风险等级:1-高风险, 2-中风险, 3-低风险 */
|
/** 风险等级:1-高风险, 2-中风险, 3-低风险 */
|
||||||
private String riskLevel;
|
private String riskLevel;
|
||||||
|
|
||||||
/** 企业来源:GENERAL-一般企业, EMP_RELATION-员工关系人, CREDIT_CUSTOMER-信贷客户, INTERMEDIARY-中介, BOTH-兼有 */
|
/** 企业来源:GENERAL-一般企业, EMP_RELATION-员工关系人, CREDIT_CUSTOMER-信贷客户, SUPPLIER-供应商, INTERMEDIARY-中介, BOTH-兼有 */
|
||||||
private String entSource;
|
private String entSource;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ public enum EnterpriseSource {
|
|||||||
GENERAL("GENERAL", "一般企业"),
|
GENERAL("GENERAL", "一般企业"),
|
||||||
EMP_RELATION("EMP_RELATION", "员工关系人"),
|
EMP_RELATION("EMP_RELATION", "员工关系人"),
|
||||||
CREDIT_CUSTOMER("CREDIT_CUSTOMER", "信贷客户"),
|
CREDIT_CUSTOMER("CREDIT_CUSTOMER", "信贷客户"),
|
||||||
|
SUPPLIER("SUPPLIER", "供应商"),
|
||||||
INTERMEDIARY("INTERMEDIARY", "中介"),
|
INTERMEDIARY("INTERMEDIARY", "中介"),
|
||||||
BOTH("BOTH", "兼有");
|
BOTH("BOTH", "兼有");
|
||||||
|
|
||||||
|
|||||||
@@ -7,8 +7,11 @@ import com.ruoyi.info.collection.domain.excel.CcdiCustEnterpriseRelationExcel;
|
|||||||
import com.ruoyi.info.collection.domain.vo.CustEnterpriseRelationImportFailureVO;
|
import com.ruoyi.info.collection.domain.vo.CustEnterpriseRelationImportFailureVO;
|
||||||
import com.ruoyi.info.collection.domain.vo.ImportResult;
|
import com.ruoyi.info.collection.domain.vo.ImportResult;
|
||||||
import com.ruoyi.info.collection.domain.vo.ImportStatusVO;
|
import com.ruoyi.info.collection.domain.vo.ImportStatusVO;
|
||||||
|
import com.ruoyi.info.collection.enums.DataSource;
|
||||||
|
import com.ruoyi.info.collection.enums.EnterpriseSource;
|
||||||
import com.ruoyi.info.collection.mapper.CcdiCustEnterpriseRelationMapper;
|
import com.ruoyi.info.collection.mapper.CcdiCustEnterpriseRelationMapper;
|
||||||
import com.ruoyi.info.collection.service.ICcdiCustEnterpriseRelationImportService;
|
import com.ruoyi.info.collection.service.ICcdiCustEnterpriseRelationImportService;
|
||||||
|
import com.ruoyi.info.collection.service.support.EnterpriseAutoFillService;
|
||||||
import com.ruoyi.info.collection.utils.ImportLogUtils;
|
import com.ruoyi.info.collection.utils.ImportLogUtils;
|
||||||
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
@@ -43,6 +46,9 @@ public class CcdiCustEnterpriseRelationImportServiceImpl implements ICcdiCustEnt
|
|||||||
@Resource
|
@Resource
|
||||||
private RedisTemplate<String, Object> redisTemplate;
|
private RedisTemplate<String, Object> redisTemplate;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private EnterpriseAutoFillService enterpriseAutoFillService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Async
|
@Async
|
||||||
@Transactional
|
@Transactional
|
||||||
@@ -127,6 +133,15 @@ public class CcdiCustEnterpriseRelationImportServiceImpl implements ICcdiCustEnt
|
|||||||
|
|
||||||
// 批量插入新数据
|
// 批量插入新数据
|
||||||
if (!newRecords.isEmpty()) {
|
if (!newRecords.isEmpty()) {
|
||||||
|
enterpriseAutoFillService.ensureExistsBatch(newRecords.stream()
|
||||||
|
.map(item -> new EnterpriseAutoFillService.EnterpriseFillItem(
|
||||||
|
item.getSocialCreditCode(),
|
||||||
|
item.getEnterpriseName(),
|
||||||
|
EnterpriseSource.CREDIT_CUSTOMER.getCode(),
|
||||||
|
DataSource.IMPORT.getCode(),
|
||||||
|
userName
|
||||||
|
))
|
||||||
|
.toList());
|
||||||
ImportLogUtils.logBatchOperationStart(log, taskId, "插入",
|
ImportLogUtils.logBatchOperationStart(log, taskId, "插入",
|
||||||
(newRecords.size() + 499) / 500, 500);
|
(newRecords.size() + 499) / 500, 500);
|
||||||
saveBatch(newRecords, 500);
|
saveBatch(newRecords, 500);
|
||||||
|
|||||||
@@ -8,9 +8,12 @@ import com.ruoyi.info.collection.domain.dto.CcdiCustEnterpriseRelationEditDTO;
|
|||||||
import com.ruoyi.info.collection.domain.dto.CcdiCustEnterpriseRelationQueryDTO;
|
import com.ruoyi.info.collection.domain.dto.CcdiCustEnterpriseRelationQueryDTO;
|
||||||
import com.ruoyi.info.collection.domain.excel.CcdiCustEnterpriseRelationExcel;
|
import com.ruoyi.info.collection.domain.excel.CcdiCustEnterpriseRelationExcel;
|
||||||
import com.ruoyi.info.collection.domain.vo.CcdiCustEnterpriseRelationVO;
|
import com.ruoyi.info.collection.domain.vo.CcdiCustEnterpriseRelationVO;
|
||||||
|
import com.ruoyi.info.collection.enums.DataSource;
|
||||||
|
import com.ruoyi.info.collection.enums.EnterpriseSource;
|
||||||
import com.ruoyi.info.collection.mapper.CcdiCustEnterpriseRelationMapper;
|
import com.ruoyi.info.collection.mapper.CcdiCustEnterpriseRelationMapper;
|
||||||
import com.ruoyi.info.collection.service.ICcdiCustEnterpriseRelationImportService;
|
import com.ruoyi.info.collection.service.ICcdiCustEnterpriseRelationImportService;
|
||||||
import com.ruoyi.info.collection.service.ICcdiCustEnterpriseRelationService;
|
import com.ruoyi.info.collection.service.ICcdiCustEnterpriseRelationService;
|
||||||
|
import com.ruoyi.info.collection.service.support.EnterpriseAutoFillService;
|
||||||
import com.ruoyi.common.utils.SecurityUtils;
|
import com.ruoyi.common.utils.SecurityUtils;
|
||||||
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
@@ -43,6 +46,9 @@ public class CcdiCustEnterpriseRelationServiceImpl implements ICcdiCustEnterpris
|
|||||||
@Resource
|
@Resource
|
||||||
private RedisTemplate<String, Object> redisTemplate;
|
private RedisTemplate<String, Object> redisTemplate;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private EnterpriseAutoFillService enterpriseAutoFillService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询信贷客户实体关联列表
|
* 查询信贷客户实体关联列表
|
||||||
*
|
*
|
||||||
@@ -135,6 +141,14 @@ public class CcdiCustEnterpriseRelationServiceImpl implements ICcdiCustEnterpris
|
|||||||
relation.setDataSource("MANUAL");
|
relation.setDataSource("MANUAL");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enterpriseAutoFillService.ensureExists(new EnterpriseAutoFillService.EnterpriseFillItem(
|
||||||
|
addDTO.getSocialCreditCode(),
|
||||||
|
addDTO.getEnterpriseName(),
|
||||||
|
EnterpriseSource.CREDIT_CUSTOMER.getCode(),
|
||||||
|
DataSource.MANUAL.getCode(),
|
||||||
|
SecurityUtils.getUsername()
|
||||||
|
));
|
||||||
|
|
||||||
int result = relationMapper.insert(relation);
|
int result = relationMapper.insert(relation);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
@@ -131,14 +131,18 @@ public class CcdiEnterpriseBaseInfoImportServiceImpl implements ICcdiEnterpriseB
|
|||||||
if (!excel.getSocialCreditCode().matches("^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$")) {
|
if (!excel.getSocialCreditCode().matches("^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$")) {
|
||||||
throw new RuntimeException("统一社会信用代码格式不正确");
|
throw new RuntimeException("统一社会信用代码格式不正确");
|
||||||
}
|
}
|
||||||
String riskLevel = EnterpriseRiskLevel.resolveCode(StringUtils.trim(excel.getRiskLevel()));
|
|
||||||
if (riskLevel == null) {
|
|
||||||
throw new RuntimeException("风险等级不在允许范围内");
|
|
||||||
}
|
|
||||||
String entSource = EnterpriseSource.resolveCode(StringUtils.trim(excel.getEntSource()));
|
String entSource = EnterpriseSource.resolveCode(StringUtils.trim(excel.getEntSource()));
|
||||||
if (entSource == null) {
|
if (entSource == null) {
|
||||||
throw new RuntimeException("企业来源不在允许范围内");
|
throw new RuntimeException("企业来源不在允许范围内");
|
||||||
}
|
}
|
||||||
|
String riskLevel = EnterpriseRiskLevel.resolveCode(StringUtils.trim(excel.getRiskLevel()));
|
||||||
|
if (riskLevel == null) {
|
||||||
|
if (EnterpriseSource.INTERMEDIARY.getCode().equals(entSource) && StringUtils.isEmpty(excel.getRiskLevel())) {
|
||||||
|
riskLevel = "1";
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException("风险等级不在允许范围内");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (existingCreditCodes.contains(excel.getSocialCreditCode())) {
|
if (existingCreditCodes.contains(excel.getSocialCreditCode())) {
|
||||||
throw new RuntimeException(String.format("统一社会信用代码[%s]已存在,请勿重复导入", excel.getSocialCreditCode()));
|
throw new RuntimeException(String.format("统一社会信用代码[%s]已存在,请勿重复导入", excel.getSocialCreditCode()));
|
||||||
|
|||||||
@@ -3,16 +3,17 @@ package com.ruoyi.info.collection.service.impl;
|
|||||||
import com.alibaba.fastjson2.JSON;
|
import com.alibaba.fastjson2.JSON;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.ruoyi.info.collection.domain.CcdiBizIntermediary;
|
import com.ruoyi.info.collection.domain.CcdiBizIntermediary;
|
||||||
import com.ruoyi.info.collection.domain.CcdiEnterpriseBaseInfo;
|
|
||||||
import com.ruoyi.info.collection.domain.CcdiIntermediaryEnterpriseRelation;
|
import com.ruoyi.info.collection.domain.CcdiIntermediaryEnterpriseRelation;
|
||||||
import com.ruoyi.info.collection.domain.excel.CcdiIntermediaryEnterpriseRelationExcel;
|
import com.ruoyi.info.collection.domain.excel.CcdiIntermediaryEnterpriseRelationExcel;
|
||||||
import com.ruoyi.info.collection.domain.vo.ImportResult;
|
import com.ruoyi.info.collection.domain.vo.ImportResult;
|
||||||
import com.ruoyi.info.collection.domain.vo.ImportStatusVO;
|
import com.ruoyi.info.collection.domain.vo.ImportStatusVO;
|
||||||
import com.ruoyi.info.collection.domain.vo.IntermediaryEnterpriseRelationImportFailureVO;
|
import com.ruoyi.info.collection.domain.vo.IntermediaryEnterpriseRelationImportFailureVO;
|
||||||
|
import com.ruoyi.info.collection.enums.DataSource;
|
||||||
|
import com.ruoyi.info.collection.enums.EnterpriseSource;
|
||||||
import com.ruoyi.info.collection.mapper.CcdiBizIntermediaryMapper;
|
import com.ruoyi.info.collection.mapper.CcdiBizIntermediaryMapper;
|
||||||
import com.ruoyi.info.collection.mapper.CcdiEnterpriseBaseInfoMapper;
|
|
||||||
import com.ruoyi.info.collection.mapper.CcdiIntermediaryEnterpriseRelationMapper;
|
import com.ruoyi.info.collection.mapper.CcdiIntermediaryEnterpriseRelationMapper;
|
||||||
import com.ruoyi.info.collection.service.ICcdiIntermediaryEnterpriseRelationImportService;
|
import com.ruoyi.info.collection.service.ICcdiIntermediaryEnterpriseRelationImportService;
|
||||||
|
import com.ruoyi.info.collection.service.support.EnterpriseAutoFillService;
|
||||||
import com.ruoyi.info.collection.utils.ImportLogUtils;
|
import com.ruoyi.info.collection.utils.ImportLogUtils;
|
||||||
import com.ruoyi.common.utils.IdCardUtil;
|
import com.ruoyi.common.utils.IdCardUtil;
|
||||||
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
@@ -54,10 +55,10 @@ public class CcdiIntermediaryEnterpriseRelationImportServiceImpl implements ICcd
|
|||||||
private CcdiBizIntermediaryMapper intermediaryMapper;
|
private CcdiBizIntermediaryMapper intermediaryMapper;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private CcdiEnterpriseBaseInfoMapper enterpriseBaseInfoMapper;
|
private RedisTemplate<String, Object> redisTemplate;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private RedisTemplate<String, Object> redisTemplate;
|
private EnterpriseAutoFillService enterpriseAutoFillService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Async
|
@Async
|
||||||
@@ -67,7 +68,6 @@ public class CcdiIntermediaryEnterpriseRelationImportServiceImpl implements ICcd
|
|||||||
ImportLogUtils.logImportStart(log, taskId, "中介实体关联关系", excelList.size(), userName);
|
ImportLogUtils.logImportStart(log, taskId, "中介实体关联关系", excelList.size(), userName);
|
||||||
|
|
||||||
Map<String, String> ownerBizIdByPersonId = getOwnerBizIdByPersonId(excelList);
|
Map<String, String> ownerBizIdByPersonId = getOwnerBizIdByPersonId(excelList);
|
||||||
Set<String> existingEnterpriseCodes = getExistingEnterpriseCodes(excelList);
|
|
||||||
Set<String> existingCombinations = getExistingRelationCombinations(ownerBizIdByPersonId, excelList);
|
Set<String> existingCombinations = getExistingRelationCombinations(ownerBizIdByPersonId, excelList);
|
||||||
|
|
||||||
List<CcdiIntermediaryEnterpriseRelation> successRecords = new ArrayList<>();
|
List<CcdiIntermediaryEnterpriseRelation> successRecords = new ArrayList<>();
|
||||||
@@ -83,9 +83,6 @@ public class CcdiIntermediaryEnterpriseRelationImportServiceImpl implements ICcd
|
|||||||
if (StringUtils.isEmpty(ownerBizId)) {
|
if (StringUtils.isEmpty(ownerBizId)) {
|
||||||
throw new RuntimeException("中介本人不存在,请先导入或维护中介本人信息");
|
throw new RuntimeException("中介本人不存在,请先导入或维护中介本人信息");
|
||||||
}
|
}
|
||||||
if (!existingEnterpriseCodes.contains(excel.getSocialCreditCode())) {
|
|
||||||
throw new RuntimeException("统一社会信用代码不存在于系统机构表");
|
|
||||||
}
|
|
||||||
|
|
||||||
String combination = ownerBizId + "|" + excel.getSocialCreditCode();
|
String combination = ownerBizId + "|" + excel.getSocialCreditCode();
|
||||||
if (existingCombinations.contains(combination)) {
|
if (existingCombinations.contains(combination)) {
|
||||||
@@ -109,6 +106,15 @@ public class CcdiIntermediaryEnterpriseRelationImportServiceImpl implements ICcd
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!successRecords.isEmpty()) {
|
if (!successRecords.isEmpty()) {
|
||||||
|
enterpriseAutoFillService.ensureExistsBatch(successRecords.stream()
|
||||||
|
.map(item -> new EnterpriseAutoFillService.EnterpriseFillItem(
|
||||||
|
item.getSocialCreditCode(),
|
||||||
|
null,
|
||||||
|
EnterpriseSource.INTERMEDIARY.getCode(),
|
||||||
|
DataSource.IMPORT.getCode(),
|
||||||
|
userName
|
||||||
|
))
|
||||||
|
.toList());
|
||||||
saveBatch(successRecords, 500);
|
saveBatch(successRecords, 500);
|
||||||
}
|
}
|
||||||
if (!failures.isEmpty()) {
|
if (!failures.isEmpty()) {
|
||||||
@@ -173,23 +179,6 @@ public class CcdiIntermediaryEnterpriseRelationImportServiceImpl implements ICcd
|
|||||||
.collect(Collectors.toMap(CcdiBizIntermediary::getPersonId, CcdiBizIntermediary::getBizId, (left, right) -> left));
|
.collect(Collectors.toMap(CcdiBizIntermediary::getPersonId, CcdiBizIntermediary::getBizId, (left, right) -> left));
|
||||||
}
|
}
|
||||||
|
|
||||||
private Set<String> getExistingEnterpriseCodes(List<CcdiIntermediaryEnterpriseRelationExcel> excelList) {
|
|
||||||
List<String> socialCreditCodes = excelList.stream()
|
|
||||||
.map(CcdiIntermediaryEnterpriseRelationExcel::getSocialCreditCode)
|
|
||||||
.filter(StringUtils::isNotEmpty)
|
|
||||||
.distinct()
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
if (socialCreditCodes.isEmpty()) {
|
|
||||||
return Collections.emptySet();
|
|
||||||
}
|
|
||||||
|
|
||||||
LambdaQueryWrapper<CcdiEnterpriseBaseInfo> wrapper = new LambdaQueryWrapper<>();
|
|
||||||
wrapper.in(CcdiEnterpriseBaseInfo::getSocialCreditCode, socialCreditCodes);
|
|
||||||
return enterpriseBaseInfoMapper.selectList(wrapper).stream()
|
|
||||||
.map(CcdiEnterpriseBaseInfo::getSocialCreditCode)
|
|
||||||
.collect(Collectors.toSet());
|
|
||||||
}
|
|
||||||
|
|
||||||
private Set<String> getExistingRelationCombinations(Map<String, String> ownerBizIdByPersonId,
|
private Set<String> getExistingRelationCombinations(Map<String, String> ownerBizIdByPersonId,
|
||||||
List<CcdiIntermediaryEnterpriseRelationExcel> excelList) {
|
List<CcdiIntermediaryEnterpriseRelationExcel> excelList) {
|
||||||
List<String> combinations = excelList.stream()
|
List<String> combinations = excelList.stream()
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ import com.ruoyi.info.collection.domain.vo.CcdiIntermediaryEntityDetailVO;
|
|||||||
import com.ruoyi.info.collection.domain.vo.CcdiIntermediaryPersonDetailVO;
|
import com.ruoyi.info.collection.domain.vo.CcdiIntermediaryPersonDetailVO;
|
||||||
import com.ruoyi.info.collection.domain.vo.CcdiIntermediaryRelativeVO;
|
import com.ruoyi.info.collection.domain.vo.CcdiIntermediaryRelativeVO;
|
||||||
import com.ruoyi.info.collection.domain.vo.CcdiIntermediaryVO;
|
import com.ruoyi.info.collection.domain.vo.CcdiIntermediaryVO;
|
||||||
|
import com.ruoyi.info.collection.enums.DataSource;
|
||||||
|
import com.ruoyi.info.collection.enums.EnterpriseSource;
|
||||||
import com.ruoyi.info.collection.mapper.CcdiBizIntermediaryMapper;
|
import com.ruoyi.info.collection.mapper.CcdiBizIntermediaryMapper;
|
||||||
import com.ruoyi.info.collection.mapper.CcdiEnterpriseBaseInfoMapper;
|
import com.ruoyi.info.collection.mapper.CcdiEnterpriseBaseInfoMapper;
|
||||||
import com.ruoyi.info.collection.mapper.CcdiIntermediaryEnterpriseRelationMapper;
|
import com.ruoyi.info.collection.mapper.CcdiIntermediaryEnterpriseRelationMapper;
|
||||||
@@ -22,6 +24,7 @@ import com.ruoyi.info.collection.service.ICcdiIntermediaryEnterpriseRelationImpo
|
|||||||
import com.ruoyi.info.collection.service.ICcdiIntermediaryEntityImportService;
|
import com.ruoyi.info.collection.service.ICcdiIntermediaryEntityImportService;
|
||||||
import com.ruoyi.info.collection.service.ICcdiIntermediaryPersonImportService;
|
import com.ruoyi.info.collection.service.ICcdiIntermediaryPersonImportService;
|
||||||
import com.ruoyi.info.collection.service.ICcdiIntermediaryService;
|
import com.ruoyi.info.collection.service.ICcdiIntermediaryService;
|
||||||
|
import com.ruoyi.info.collection.service.support.EnterpriseAutoFillService;
|
||||||
import com.ruoyi.common.utils.SecurityUtils;
|
import com.ruoyi.common.utils.SecurityUtils;
|
||||||
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
@@ -69,6 +72,9 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
|
|||||||
@Resource
|
@Resource
|
||||||
private RedisTemplate<String, Object> redisTemplate;
|
private RedisTemplate<String, Object> redisTemplate;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private EnterpriseAutoFillService enterpriseAutoFillService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页查询中介列表
|
* 分页查询中介列表
|
||||||
* 使用XML联合查询实现,支持个人中介和实体中介的灵活查询
|
* 使用XML联合查询实现,支持个人中介和实体中介的灵活查询
|
||||||
@@ -302,6 +308,13 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
|
|||||||
CcdiIntermediaryEnterpriseRelation relation = new CcdiIntermediaryEnterpriseRelation();
|
CcdiIntermediaryEnterpriseRelation relation = new CcdiIntermediaryEnterpriseRelation();
|
||||||
BeanUtils.copyProperties(addDTO, relation);
|
BeanUtils.copyProperties(addDTO, relation);
|
||||||
relation.setIntermediaryBizId(owner.getBizId());
|
relation.setIntermediaryBizId(owner.getBizId());
|
||||||
|
enterpriseAutoFillService.ensureExists(new EnterpriseAutoFillService.EnterpriseFillItem(
|
||||||
|
addDTO.getSocialCreditCode(),
|
||||||
|
null,
|
||||||
|
EnterpriseSource.INTERMEDIARY.getCode(),
|
||||||
|
DataSource.MANUAL.getCode(),
|
||||||
|
SecurityUtils.getUsername()
|
||||||
|
));
|
||||||
return enterpriseRelationMapper.insert(relation);
|
return enterpriseRelationMapper.insert(relation);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -317,6 +330,13 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
|
|||||||
CcdiIntermediaryEnterpriseRelation relation = new CcdiIntermediaryEnterpriseRelation();
|
CcdiIntermediaryEnterpriseRelation relation = new CcdiIntermediaryEnterpriseRelation();
|
||||||
BeanUtils.copyProperties(editDTO, relation);
|
BeanUtils.copyProperties(editDTO, relation);
|
||||||
relation.setIntermediaryBizId(existing.getIntermediaryBizId());
|
relation.setIntermediaryBizId(existing.getIntermediaryBizId());
|
||||||
|
enterpriseAutoFillService.ensureExists(new EnterpriseAutoFillService.EnterpriseFillItem(
|
||||||
|
editDTO.getSocialCreditCode(),
|
||||||
|
null,
|
||||||
|
EnterpriseSource.INTERMEDIARY.getCode(),
|
||||||
|
DataSource.MANUAL.getCode(),
|
||||||
|
SecurityUtils.getUsername()
|
||||||
|
));
|
||||||
return enterpriseRelationMapper.updateById(relation);
|
return enterpriseRelationMapper.updateById(relation);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -520,9 +540,6 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
|
|||||||
|
|
||||||
private void validateEnterpriseRelation(String bizId, String socialCreditCode, Long excludeId) {
|
private void validateEnterpriseRelation(String bizId, String socialCreditCode, Long excludeId) {
|
||||||
requireIntermediaryPerson(bizId);
|
requireIntermediaryPerson(bizId);
|
||||||
if (enterpriseBaseInfoMapper.selectById(socialCreditCode) == null) {
|
|
||||||
throw new RuntimeException("关联机构不存在");
|
|
||||||
}
|
|
||||||
boolean exists = enterpriseRelationMapper.existsByIntermediaryBizIdAndSocialCreditCode(bizId, socialCreditCode);
|
boolean exists = enterpriseRelationMapper.existsByIntermediaryBizIdAndSocialCreditCode(bizId, socialCreditCode);
|
||||||
if (exists) {
|
if (exists) {
|
||||||
if (excludeId == null) {
|
if (excludeId == null) {
|
||||||
|
|||||||
@@ -9,9 +9,12 @@ import com.ruoyi.info.collection.domain.excel.CcdiPurchaseTransactionSupplierExc
|
|||||||
import com.ruoyi.info.collection.domain.vo.ImportResult;
|
import com.ruoyi.info.collection.domain.vo.ImportResult;
|
||||||
import com.ruoyi.info.collection.domain.vo.ImportStatusVO;
|
import com.ruoyi.info.collection.domain.vo.ImportStatusVO;
|
||||||
import com.ruoyi.info.collection.domain.vo.PurchaseTransactionImportFailureVO;
|
import com.ruoyi.info.collection.domain.vo.PurchaseTransactionImportFailureVO;
|
||||||
|
import com.ruoyi.info.collection.enums.DataSource;
|
||||||
|
import com.ruoyi.info.collection.enums.EnterpriseSource;
|
||||||
import com.ruoyi.info.collection.mapper.CcdiPurchaseTransactionMapper;
|
import com.ruoyi.info.collection.mapper.CcdiPurchaseTransactionMapper;
|
||||||
import com.ruoyi.info.collection.mapper.CcdiPurchaseTransactionSupplierMapper;
|
import com.ruoyi.info.collection.mapper.CcdiPurchaseTransactionSupplierMapper;
|
||||||
import com.ruoyi.info.collection.service.ICcdiPurchaseTransactionImportService;
|
import com.ruoyi.info.collection.service.ICcdiPurchaseTransactionImportService;
|
||||||
|
import com.ruoyi.info.collection.service.support.EnterpriseAutoFillService;
|
||||||
import com.ruoyi.info.collection.utils.ImportLogUtils;
|
import com.ruoyi.info.collection.utils.ImportLogUtils;
|
||||||
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
@@ -53,6 +56,9 @@ public class CcdiPurchaseTransactionImportServiceImpl implements ICcdiPurchaseTr
|
|||||||
@Resource
|
@Resource
|
||||||
private RedisTemplate<String, Object> redisTemplate;
|
private RedisTemplate<String, Object> redisTemplate;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private EnterpriseAutoFillService enterpriseAutoFillService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Async
|
@Async
|
||||||
@Transactional
|
@Transactional
|
||||||
@@ -183,6 +189,7 @@ public class CcdiPurchaseTransactionImportServiceImpl implements ICcdiPurchaseTr
|
|||||||
|
|
||||||
// 批量插入新数据
|
// 批量插入新数据
|
||||||
if (!newTransactions.isEmpty()) {
|
if (!newTransactions.isEmpty()) {
|
||||||
|
autoFillSupplierEnterprises(newSuppliers, userName);
|
||||||
ImportLogUtils.logBatchOperationStart(log, taskId, "插入",
|
ImportLogUtils.logBatchOperationStart(log, taskId, "插入",
|
||||||
(newTransactions.size() + 499) / 500, 500);
|
(newTransactions.size() + 499) / 500, 500);
|
||||||
saveBatch(newTransactions, 500);
|
saveBatch(newTransactions, 500);
|
||||||
@@ -328,6 +335,19 @@ public class CcdiPurchaseTransactionImportServiceImpl implements ICcdiPurchaseTr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void autoFillSupplierEnterprises(List<CcdiPurchaseTransactionSupplier> supplierList, String userName) {
|
||||||
|
enterpriseAutoFillService.ensureExistsBatch(supplierList.stream()
|
||||||
|
.filter(item -> StringUtils.isNotEmpty(item.getSupplierUscc()))
|
||||||
|
.map(item -> new EnterpriseAutoFillService.EnterpriseFillItem(
|
||||||
|
item.getSupplierUscc(),
|
||||||
|
item.getSupplierName(),
|
||||||
|
EnterpriseSource.SUPPLIER.getCode(),
|
||||||
|
DataSource.IMPORT.getCode(),
|
||||||
|
userName
|
||||||
|
))
|
||||||
|
.toList());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 验证采购交易数据
|
* 验证采购交易数据
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -11,10 +11,13 @@ import com.ruoyi.info.collection.domain.excel.CcdiPurchaseTransactionExcel;
|
|||||||
import com.ruoyi.info.collection.domain.excel.CcdiPurchaseTransactionSupplierExcel;
|
import com.ruoyi.info.collection.domain.excel.CcdiPurchaseTransactionSupplierExcel;
|
||||||
import com.ruoyi.info.collection.domain.vo.CcdiPurchaseTransactionVO;
|
import com.ruoyi.info.collection.domain.vo.CcdiPurchaseTransactionVO;
|
||||||
import com.ruoyi.info.collection.domain.vo.CcdiPurchaseTransactionSupplierVO;
|
import com.ruoyi.info.collection.domain.vo.CcdiPurchaseTransactionSupplierVO;
|
||||||
|
import com.ruoyi.info.collection.enums.DataSource;
|
||||||
|
import com.ruoyi.info.collection.enums.EnterpriseSource;
|
||||||
import com.ruoyi.info.collection.mapper.CcdiPurchaseTransactionMapper;
|
import com.ruoyi.info.collection.mapper.CcdiPurchaseTransactionMapper;
|
||||||
import com.ruoyi.info.collection.mapper.CcdiPurchaseTransactionSupplierMapper;
|
import com.ruoyi.info.collection.mapper.CcdiPurchaseTransactionSupplierMapper;
|
||||||
import com.ruoyi.info.collection.service.ICcdiPurchaseTransactionImportService;
|
import com.ruoyi.info.collection.service.ICcdiPurchaseTransactionImportService;
|
||||||
import com.ruoyi.info.collection.service.ICcdiPurchaseTransactionService;
|
import com.ruoyi.info.collection.service.ICcdiPurchaseTransactionService;
|
||||||
|
import com.ruoyi.info.collection.service.support.EnterpriseAutoFillService;
|
||||||
import com.ruoyi.common.utils.SecurityUtils;
|
import com.ruoyi.common.utils.SecurityUtils;
|
||||||
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
@@ -55,6 +58,9 @@ public class CcdiPurchaseTransactionServiceImpl implements ICcdiPurchaseTransact
|
|||||||
@Resource
|
@Resource
|
||||||
private RedisTemplate<String, Object> redisTemplate;
|
private RedisTemplate<String, Object> redisTemplate;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private EnterpriseAutoFillService enterpriseAutoFillService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询采购交易列表
|
* 查询采购交易列表
|
||||||
*
|
*
|
||||||
@@ -134,6 +140,7 @@ public class CcdiPurchaseTransactionServiceImpl implements ICcdiPurchaseTransact
|
|||||||
CcdiPurchaseTransaction transaction = new CcdiPurchaseTransaction();
|
CcdiPurchaseTransaction transaction = new CcdiPurchaseTransaction();
|
||||||
BeanUtils.copyProperties(addDTO, transaction);
|
BeanUtils.copyProperties(addDTO, transaction);
|
||||||
fillWinnerSummary(transaction, supplierList);
|
fillWinnerSummary(transaction, supplierList);
|
||||||
|
autoFillSupplierEnterprises(supplierList, DataSource.MANUAL.getCode(), SecurityUtils.getUsername());
|
||||||
int result = transactionMapper.insert(transaction);
|
int result = transactionMapper.insert(transaction);
|
||||||
saveSuppliers(supplierList);
|
saveSuppliers(supplierList);
|
||||||
|
|
||||||
@@ -331,6 +338,21 @@ public class CcdiPurchaseTransactionServiceImpl implements ICcdiPurchaseTransact
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void autoFillSupplierEnterprises(List<CcdiPurchaseTransactionSupplier> supplierList,
|
||||||
|
String dataSource,
|
||||||
|
String userName) {
|
||||||
|
enterpriseAutoFillService.ensureExistsBatch(supplierList.stream()
|
||||||
|
.filter(item -> StringUtils.isNotEmpty(item.getSupplierUscc()))
|
||||||
|
.map(item -> new EnterpriseAutoFillService.EnterpriseFillItem(
|
||||||
|
item.getSupplierUscc(),
|
||||||
|
item.getSupplierName(),
|
||||||
|
EnterpriseSource.SUPPLIER.getCode(),
|
||||||
|
dataSource,
|
||||||
|
userName
|
||||||
|
))
|
||||||
|
.toList());
|
||||||
|
}
|
||||||
|
|
||||||
private List<CcdiPurchaseTransactionSupplierVO> selectSupplierListByPurchaseId(String purchaseId) {
|
private List<CcdiPurchaseTransactionSupplierVO> selectSupplierListByPurchaseId(String purchaseId) {
|
||||||
return supplierMapper.selectList(
|
return supplierMapper.selectList(
|
||||||
new LambdaQueryWrapper<CcdiPurchaseTransactionSupplier>()
|
new LambdaQueryWrapper<CcdiPurchaseTransactionSupplier>()
|
||||||
|
|||||||
@@ -9,9 +9,12 @@ import com.ruoyi.info.collection.domain.excel.CcdiStaffEnterpriseRelationExcel;
|
|||||||
import com.ruoyi.info.collection.domain.vo.ImportResult;
|
import com.ruoyi.info.collection.domain.vo.ImportResult;
|
||||||
import com.ruoyi.info.collection.domain.vo.ImportStatusVO;
|
import com.ruoyi.info.collection.domain.vo.ImportStatusVO;
|
||||||
import com.ruoyi.info.collection.domain.vo.StaffEnterpriseRelationImportFailureVO;
|
import com.ruoyi.info.collection.domain.vo.StaffEnterpriseRelationImportFailureVO;
|
||||||
|
import com.ruoyi.info.collection.enums.DataSource;
|
||||||
|
import com.ruoyi.info.collection.enums.EnterpriseSource;
|
||||||
import com.ruoyi.info.collection.mapper.CcdiStaffFmyRelationMapper;
|
import com.ruoyi.info.collection.mapper.CcdiStaffFmyRelationMapper;
|
||||||
import com.ruoyi.info.collection.mapper.CcdiStaffEnterpriseRelationMapper;
|
import com.ruoyi.info.collection.mapper.CcdiStaffEnterpriseRelationMapper;
|
||||||
import com.ruoyi.info.collection.service.ICcdiStaffEnterpriseRelationImportService;
|
import com.ruoyi.info.collection.service.ICcdiStaffEnterpriseRelationImportService;
|
||||||
|
import com.ruoyi.info.collection.service.support.EnterpriseAutoFillService;
|
||||||
import com.ruoyi.info.collection.utils.ImportLogUtils;
|
import com.ruoyi.info.collection.utils.ImportLogUtils;
|
||||||
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
@@ -49,6 +52,9 @@ public class CcdiStaffEnterpriseRelationImportServiceImpl implements ICcdiStaffE
|
|||||||
@Resource
|
@Resource
|
||||||
private CcdiStaffFmyRelationMapper familyRelationMapper;
|
private CcdiStaffFmyRelationMapper familyRelationMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private EnterpriseAutoFillService enterpriseAutoFillService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Async
|
@Async
|
||||||
@Transactional
|
@Transactional
|
||||||
@@ -147,6 +153,15 @@ public class CcdiStaffEnterpriseRelationImportServiceImpl implements ICcdiStaffE
|
|||||||
|
|
||||||
// 批量插入新数据
|
// 批量插入新数据
|
||||||
if (!newRecords.isEmpty()) {
|
if (!newRecords.isEmpty()) {
|
||||||
|
enterpriseAutoFillService.ensureExistsBatch(newRecords.stream()
|
||||||
|
.map(item -> new EnterpriseAutoFillService.EnterpriseFillItem(
|
||||||
|
item.getSocialCreditCode(),
|
||||||
|
item.getEnterpriseName(),
|
||||||
|
EnterpriseSource.EMP_RELATION.getCode(),
|
||||||
|
DataSource.IMPORT.getCode(),
|
||||||
|
userName
|
||||||
|
))
|
||||||
|
.toList());
|
||||||
ImportLogUtils.logBatchOperationStart(log, taskId, "插入",
|
ImportLogUtils.logBatchOperationStart(log, taskId, "插入",
|
||||||
(newRecords.size() + 499) / 500, 500);
|
(newRecords.size() + 499) / 500, 500);
|
||||||
saveBatch(newRecords, 500);
|
saveBatch(newRecords, 500);
|
||||||
|
|||||||
@@ -10,10 +10,13 @@ import com.ruoyi.info.collection.domain.dto.CcdiStaffEnterpriseRelationQueryDTO;
|
|||||||
import com.ruoyi.info.collection.domain.excel.CcdiStaffEnterpriseRelationExcel;
|
import com.ruoyi.info.collection.domain.excel.CcdiStaffEnterpriseRelationExcel;
|
||||||
import com.ruoyi.info.collection.domain.vo.CcdiStaffEnterpriseRelationOptionVO;
|
import com.ruoyi.info.collection.domain.vo.CcdiStaffEnterpriseRelationOptionVO;
|
||||||
import com.ruoyi.info.collection.domain.vo.CcdiStaffEnterpriseRelationVO;
|
import com.ruoyi.info.collection.domain.vo.CcdiStaffEnterpriseRelationVO;
|
||||||
|
import com.ruoyi.info.collection.enums.DataSource;
|
||||||
|
import com.ruoyi.info.collection.enums.EnterpriseSource;
|
||||||
import com.ruoyi.info.collection.mapper.CcdiStaffFmyRelationMapper;
|
import com.ruoyi.info.collection.mapper.CcdiStaffFmyRelationMapper;
|
||||||
import com.ruoyi.info.collection.mapper.CcdiStaffEnterpriseRelationMapper;
|
import com.ruoyi.info.collection.mapper.CcdiStaffEnterpriseRelationMapper;
|
||||||
import com.ruoyi.info.collection.service.ICcdiStaffEnterpriseRelationImportService;
|
import com.ruoyi.info.collection.service.ICcdiStaffEnterpriseRelationImportService;
|
||||||
import com.ruoyi.info.collection.service.ICcdiStaffEnterpriseRelationService;
|
import com.ruoyi.info.collection.service.ICcdiStaffEnterpriseRelationService;
|
||||||
|
import com.ruoyi.info.collection.service.support.EnterpriseAutoFillService;
|
||||||
import com.ruoyi.common.utils.SecurityUtils;
|
import com.ruoyi.common.utils.SecurityUtils;
|
||||||
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
@@ -49,6 +52,9 @@ public class CcdiStaffEnterpriseRelationServiceImpl implements ICcdiStaffEnterpr
|
|||||||
@Resource
|
@Resource
|
||||||
private RedisTemplate<String, Object> redisTemplate;
|
private RedisTemplate<String, Object> redisTemplate;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private EnterpriseAutoFillService enterpriseAutoFillService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询员工实体关系列表
|
* 查询员工实体关系列表
|
||||||
*
|
*
|
||||||
@@ -144,6 +150,14 @@ public class CcdiStaffEnterpriseRelationServiceImpl implements ICcdiStaffEnterpr
|
|||||||
relation.setDataSource("MANUAL");
|
relation.setDataSource("MANUAL");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enterpriseAutoFillService.ensureExists(new EnterpriseAutoFillService.EnterpriseFillItem(
|
||||||
|
addDTO.getSocialCreditCode(),
|
||||||
|
addDTO.getEnterpriseName(),
|
||||||
|
EnterpriseSource.EMP_RELATION.getCode(),
|
||||||
|
DataSource.MANUAL.getCode(),
|
||||||
|
SecurityUtils.getUsername()
|
||||||
|
));
|
||||||
|
|
||||||
int result = relationMapper.insert(relation);
|
int result = relationMapper.insert(relation);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
@@ -0,0 +1,130 @@
|
|||||||
|
package com.ruoyi.info.collection.service.support;
|
||||||
|
|
||||||
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
|
import com.ruoyi.info.collection.domain.CcdiEnterpriseBaseInfo;
|
||||||
|
import com.ruoyi.info.collection.enums.EnterpriseSource;
|
||||||
|
import com.ruoyi.info.collection.mapper.CcdiEnterpriseBaseInfoMapper;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.dao.DuplicateKeyException;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关联业务实体库自动补全服务。
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class EnterpriseAutoFillService {
|
||||||
|
|
||||||
|
private static final int BATCH_SIZE = 500;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CcdiEnterpriseBaseInfoMapper enterpriseBaseInfoMapper;
|
||||||
|
|
||||||
|
public record EnterpriseFillItem(
|
||||||
|
String socialCreditCode,
|
||||||
|
String enterpriseName,
|
||||||
|
String entSource,
|
||||||
|
String dataSource,
|
||||||
|
String userName
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public void ensureExists(EnterpriseFillItem item) {
|
||||||
|
ensureExistsBatch(List.of(item));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public void ensureExistsBatch(List<EnterpriseFillItem> items) {
|
||||||
|
if (StringUtils.isEmpty(items)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Map<String, EnterpriseFillItem> normalizedItems = normalizeItems(items);
|
||||||
|
if (normalizedItems.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<String> existingCodes = enterpriseBaseInfoMapper.selectBatchIds(new ArrayList<>(normalizedItems.keySet()))
|
||||||
|
.stream()
|
||||||
|
.map(CcdiEnterpriseBaseInfo::getSocialCreditCode)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
List<CcdiEnterpriseBaseInfo> missingEntities = normalizedItems.entrySet().stream()
|
||||||
|
.filter(entry -> !existingCodes.contains(entry.getKey()))
|
||||||
|
.map(entry -> buildEntity(entry.getKey(), entry.getValue()))
|
||||||
|
.toList();
|
||||||
|
if (missingEntities.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
insertBatchIgnoreDuplicate(missingEntities);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, EnterpriseFillItem> normalizeItems(List<EnterpriseFillItem> items) {
|
||||||
|
Map<String, EnterpriseFillItem> normalizedItems = new LinkedHashMap<>();
|
||||||
|
for (EnterpriseFillItem item : items) {
|
||||||
|
if (item == null || StringUtils.isEmpty(item.socialCreditCode())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String socialCreditCode = item.socialCreditCode().trim();
|
||||||
|
normalizedItems.putIfAbsent(socialCreditCode, new EnterpriseFillItem(
|
||||||
|
socialCreditCode,
|
||||||
|
trimToNull(item.enterpriseName()),
|
||||||
|
trimToNull(item.entSource()),
|
||||||
|
trimToNull(item.dataSource()),
|
||||||
|
trimToNull(item.userName())
|
||||||
|
));
|
||||||
|
}
|
||||||
|
return normalizedItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
private CcdiEnterpriseBaseInfo buildEntity(String socialCreditCode, EnterpriseFillItem item) {
|
||||||
|
CcdiEnterpriseBaseInfo entity = new CcdiEnterpriseBaseInfo();
|
||||||
|
entity.setSocialCreditCode(socialCreditCode);
|
||||||
|
entity.setEnterpriseName(item.enterpriseName());
|
||||||
|
entity.setEntSource(item.entSource());
|
||||||
|
entity.setDataSource(item.dataSource());
|
||||||
|
entity.setRiskLevel(EnterpriseSource.INTERMEDIARY.getCode().equals(item.entSource()) ? "1" : null);
|
||||||
|
entity.setCreatedBy(item.userName());
|
||||||
|
entity.setUpdatedBy(item.userName());
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void insertBatchIgnoreDuplicate(List<CcdiEnterpriseBaseInfo> entities) {
|
||||||
|
try {
|
||||||
|
for (int i = 0; i < entities.size(); i += BATCH_SIZE) {
|
||||||
|
int end = Math.min(i + BATCH_SIZE, entities.size());
|
||||||
|
enterpriseBaseInfoMapper.insertBatch(entities.subList(i, end));
|
||||||
|
}
|
||||||
|
} catch (DuplicateKeyException ex) {
|
||||||
|
insertOneByOneIgnoreDuplicate(entities);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void insertOneByOneIgnoreDuplicate(List<CcdiEnterpriseBaseInfo> entities) {
|
||||||
|
for (CcdiEnterpriseBaseInfo entity : entities) {
|
||||||
|
if (enterpriseBaseInfoMapper.selectById(entity.getSocialCreditCode()) != null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
enterpriseBaseInfoMapper.insert(entity);
|
||||||
|
} catch (DuplicateKeyException duplicate) {
|
||||||
|
if (enterpriseBaseInfoMapper.selectById(entity.getSocialCreditCode()) == null) {
|
||||||
|
throw duplicate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String trimToNull(String value) {
|
||||||
|
if (StringUtils.isEmpty(value)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return value.trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# 关联业务自动补入实体库实施记录
|
||||||
|
|
||||||
|
## 修改内容
|
||||||
|
|
||||||
|
- 新增 `EnterpriseAutoFillService`,统一处理关联业务按统一社会信用代码补入 `ccdi_enterprise_base_info`。
|
||||||
|
- 员工实体关系、信贷客户实体关系、中介关系、招投标供应商新增与导入成功数据,均在保存关联关系前按缺失实体自动补入实体库。
|
||||||
|
- 企业名称按“允许为空,有值则入库”的规则处理;供应商场景使用供应商名称补入,其余当前无企业名称来源的场景补入 `NULL`。
|
||||||
|
- 新增企业来源枚举 `SUPPLIER/供应商`,前端实体库企业来源下拉复用后端枚举接口,无需新增前端硬编码。
|
||||||
|
- 中介来源实体默认风险等级为高风险;中介实体关系不再要求实体库预先存在。
|
||||||
|
- 新增迁移脚本 `sql/migration/2026-04-26-make-enterprise-name-nullable-for-auto-fill.sql`,将 `ccdi_enterprise_base_info.enterprise_name` 调整为可空。
|
||||||
|
|
||||||
|
## 影响范围
|
||||||
|
|
||||||
|
- 后端模块:`ccdi-info-collection`
|
||||||
|
- 相关业务:员工关系实体、信贷客户实体、中介关系、招投标供应商、实体库导入、企业来源枚举
|
||||||
|
- 数据库表:`ccdi_enterprise_base_info`
|
||||||
|
|
||||||
|
## 验证情况
|
||||||
|
|
||||||
|
- 后端单元验证已通过:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn -pl ccdi-info-collection -am -Dtest=CcdiEnumControllerTest,EnterpriseAutoFillServiceTest,CcdiStaffEnterpriseRelationServiceImplTest,CcdiStaffEnterpriseRelationImportServiceImplTest,CcdiCustEnterpriseRelationServiceImplTest,CcdiCustEnterpriseRelationImportServiceImplTest,CcdiIntermediaryServiceImplTest,CcdiIntermediaryEnterpriseRelationImportServiceImplTest,CcdiEnterpriseBaseInfoImportServiceImplTest,CcdiPurchaseTransactionServiceImplTest,CcdiPurchaseTransactionImportServiceImplTest,CcdiPurchaseTransactionFeatureContractTest -Dsurefire.failIfNoSpecifiedTests=false test
|
||||||
|
```
|
||||||
|
|
||||||
|
- 启动当前工作树后端成功,监听 `62318`。
|
||||||
|
- 使用 `nvm use` 切换到 Node `v14.21.3`,启动前端开发服务到 `http://localhost:8080/`。
|
||||||
|
- 使用 browser-use 打开真实业务页面:
|
||||||
|
- `http://localhost:8080/maintain/enterpriseBaseInfo` 加载正常,企业来源下拉出现“供应商”。
|
||||||
|
- `http://localhost:8080/maintain/purchaseTransaction` 加载正常,供应商明细相关页面可访问。
|
||||||
|
- 后端枚举接口 `GET /ccdi/enum/enterpriseSource` 已返回 `{ "value": "SUPPLIER", "label": "供应商" }`。
|
||||||
|
|
||||||
|
## 未执行事项
|
||||||
|
|
||||||
|
- 远程联调库当前 `ccdi_enterprise_base_info.enterprise_name` 仍为 `Null=NO`。
|
||||||
|
- 本次未直接执行远程库结构变更;提权执行迁移脚本被安全审查拦截。真实写入空企业名称的补库验证需先由授权人员执行迁移脚本。
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
ALTER TABLE ccdi_enterprise_base_info
|
||||||
|
MODIFY COLUMN enterprise_name varchar(200)
|
||||||
|
CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
|
||||||
|
DEFAULT NULL COMMENT '企业名称';
|
||||||
Reference in New Issue
Block a user