中介黑名单更新

This commit is contained in:
wkc
2026-02-05 13:33:27 +08:00
parent 1af2677c05
commit 81d4038302
48 changed files with 2789 additions and 1312 deletions

View File

@@ -35,19 +35,6 @@ public class CcdiEnumController {
return AjaxResult.success(options);
}
/**
* 获取人员子类型选项
*/
@Operation(summary = "获取人员子类型选项")
@GetMapping("/indivSubType")
public AjaxResult getIndivSubTypeOptions() {
List<EnumOptionVO> options = new ArrayList<>();
for (IndivSubType type : IndivSubType.values()) {
options.add(new EnumOptionVO(type.getCode(), type.getDesc()));
}
return AjaxResult.success(options);
}
/**
* 获取性别选项
*/

View File

@@ -66,9 +66,6 @@ public class CcdiBizIntermediary implements Serializable {
/** 关联人员ID */
private String relatedNumId;
/** 关联关系 */
private String relationTypeField;
/** 数据来源MANUAL:手动录入, SYSTEM:系统同步, IMPORT:批量导入, API:接口获取 */
private String dataSource;

View File

@@ -32,9 +32,6 @@ public class CcdiIntermediaryPersonAddDTO implements Serializable {
@Schema(description = "人员子类型")
private String personSubType;
@Schema(description = "关系类型")
private String relationType;
@Schema(description = "性别")
private String gender;
@@ -76,7 +73,8 @@ public class CcdiIntermediaryPersonAddDTO implements Serializable {
@Schema(description = "关联关系")
@Size(max = 50, message = "关联关系长度不能超过50个字符")
private String relation;
private String relationType;
@Schema(description = "备注")
@Size(max = 500, message = "备注长度不能超过500个字符")

View File

@@ -36,9 +36,6 @@ public class CcdiIntermediaryPersonEditDTO implements Serializable {
@Schema(description = "人员子类型")
private String personSubType;
@Schema(description = "关系类型")
private String relationType;
@Schema(description = "性别")
private String gender;
@@ -79,7 +76,7 @@ public class CcdiIntermediaryPersonEditDTO implements Serializable {
@Schema(description = "关联关系")
@Size(max = 50, message = "关联关系长度不能超过50个字符")
private String relation;
private String relationType;
@Schema(description = "备注")
@Size(max = 500, message = "备注长度不能超过500个字符")

View File

@@ -22,19 +22,19 @@ public class CcdiIntermediaryEntityExcel implements Serializable {
private static final long serialVersionUID = 1L;
/** 机构名称 */
@ExcelProperty(value = "机构名称", index = 0)
@ExcelProperty(value = "机构名称*", index = 0)
@ColumnWidth(30)
private String enterpriseName;
/** 统一社会信用代码 */
@ExcelProperty(value = "统一社会信用代码", index = 1)
@ExcelProperty(value = "统一社会信用代码*", index = 1)
@ColumnWidth(20)
private String socialCreditCode;
/** 主体类型 */
@ExcelProperty(value = "主体类型", index = 2)
@ColumnWidth(15)
@DictDropdown(dictType = "ccdi_enterprise_type")
@DictDropdown(dictType = "ccdi_entity_type")
private String enterpriseType;
/** 企业性质 */
@@ -71,7 +71,7 @@ public class CcdiIntermediaryEntityExcel implements Serializable {
/** 法定代表人证件类型 */
@ExcelProperty(value = "法定代表人证件类型", index = 9)
@ColumnWidth(20)
@DictDropdown(dictType = "ccdi_id_type")
@DictDropdown(dictType = "ccdi_certificate_type")
private String legalCertType;
/** 法定代表人证件号码 */

View File

@@ -21,7 +21,7 @@ public class CcdiIntermediaryPersonExcel implements Serializable {
private static final long serialVersionUID = 1L;
/** 姓名 */
@ExcelProperty(value = "姓名", index = 0)
@ExcelProperty(value = "姓名*", index = 0)
@ColumnWidth(15)
private String name;
@@ -34,75 +34,68 @@ public class CcdiIntermediaryPersonExcel implements Serializable {
/** 人员子类型 */
@ExcelProperty(value = "人员子类型", index = 2)
@ColumnWidth(15)
@DictDropdown(dictType = "ccdi_person_sub_type")
private String personSubType;
/** 关系类型 */
@ExcelProperty(value = "关系类型", index = 3)
@ColumnWidth(15)
@DictDropdown(dictType = "ccdi_relation_type")
private String relationType;
/** 性别 */
@ExcelProperty(value = "性别", index = 4)
@ExcelProperty(value = "性别", index = 3)
@ColumnWidth(10)
@DictDropdown(dictType = "sys_user_sex")
@DictDropdown(dictType = "ccdi_indiv_gender")
private String gender;
/** 证件类型 */
@ExcelProperty(value = "证件类型", index = 5)
@ExcelProperty(value = "证件类型", index = 4)
@ColumnWidth(15)
@DictDropdown(dictType = "ccdi_id_type")
@DictDropdown(dictType = "ccdi_certificate_type")
private String idType;
/** 证件号码 */
@ExcelProperty(value = "证件号码", index = 6)
@ExcelProperty(value = "证件号码*", index = 5)
@ColumnWidth(20)
private String personId;
/** 手机号码 */
@ExcelProperty(value = "手机号码", index = 7)
@ExcelProperty(value = "手机号码", index = 6)
@ColumnWidth(15)
private String mobile;
/** 微信号 */
@ExcelProperty(value = "微信号", index = 8)
@ExcelProperty(value = "微信号", index = 7)
@ColumnWidth(15)
private String wechatNo;
/** 联系地址 */
@ExcelProperty(value = "联系地址", index = 9)
@ExcelProperty(value = "联系地址", index = 8)
@ColumnWidth(30)
private String contactAddress;
/** 所在公司 */
@ExcelProperty(value = "所在公司", index = 10)
@ExcelProperty(value = "所在公司", index = 9)
@ColumnWidth(20)
private String company;
/** 企业统一信用码 */
@ExcelProperty(value = "企业统一信用码", index = 11)
@ExcelProperty(value = "企业统一信用码", index = 10)
@ColumnWidth(20)
private String socialCreditCode;
/** 职位 */
@ExcelProperty(value = "职位", index = 12)
@ExcelProperty(value = "职位", index = 11)
@ColumnWidth(15)
private String position;
/** 关联人员ID */
@ExcelProperty(value = "关联人员ID", index = 13)
@ExcelProperty(value = "关联人员ID", index = 12)
@ColumnWidth(15)
private String relatedNumId;
/** 关联关系 */
@ExcelProperty(value = "联关", index = 14)
/** 关系类型 */
@ExcelProperty(value = "关系类型", index = 13)
@ColumnWidth(15)
@DictDropdown(dictType = "ccdi_relation")
private String relation;
@DictDropdown(dictType = "ccdi_relation_type")
private String relationType;
/** 备注 */
@ExcelProperty(value = "备注", index = 15)
@ExcelProperty(value = "备注", index = 14)
@ColumnWidth(30)
private String remark;
}

View File

@@ -21,9 +21,15 @@ public class CcdiIntermediaryEntityDetailVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "业务ID")
private String bizId;
@Schema(description = "统一社会信用代码")
private String socialCreditCode;
@Schema(description = "中介类型(1=个人, 2=实体)")
private String intermediaryType;
@Schema(description = "企业名称")
private String enterpriseName;

View File

@@ -24,6 +24,9 @@ public class CcdiIntermediaryPersonDetailVO implements Serializable {
@Schema(description = "人员ID")
private String bizId;
@Schema(description = "中介类型(1=个人, 2=实体)")
private String intermediaryType;
@Schema(description = "姓名")
private String name;
@@ -54,6 +57,9 @@ public class CcdiIntermediaryPersonDetailVO implements Serializable {
@Schema(description = "所在公司")
private String company;
@Schema(description = "企业统一信用码")
private String socialCreditCode;
@Schema(description = "职位")
private String position;

View File

@@ -45,4 +45,8 @@ public class CcdiIntermediaryVO implements Serializable {
@Schema(description = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@Schema(description = "修改时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}

View File

@@ -1,59 +0,0 @@
package com.ruoyi.ccdi.enums;
/**
* 人员子类型枚举
*
* @author ruoyi
*/
public enum IndivSubType {
/** 本人 */
SELF("本人", "本人"),
/** 配偶 */
SPOUSE("配偶", "配偶"),
/** 父亲 */
FATHER("父亲", "父亲"),
/** 母亲 */
MOTHER("母亲", "母亲"),
/** 兄弟 */
BROTHER("兄弟", "兄弟"),
/** 姐妹 */
SISTER("姐妹", "姐妹"),
/** 子女 */
CHILD("子女", "子女");
private final String code;
private final String desc;
IndivSubType(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public String getDesc() {
return desc;
}
/**
* 根据编码获取描述
*/
public static String getDescByCode(String code) {
for (IndivSubType type : values()) {
if (type.getCode().equals(code)) {
return type.getDesc();
}
}
return null;
}
}

View File

@@ -0,0 +1,28 @@
package com.ruoyi.ccdi.mapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.ccdi.domain.dto.CcdiIntermediaryQueryDTO;
import com.ruoyi.ccdi.domain.vo.CcdiIntermediaryVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 中介黑名单联合查询Mapper接口
*
* @author ruoyi
* @date 2026-02-05
*/
@Mapper
public interface CcdiIntermediaryMapper {
/**
* 联合查询中介列表(支持MyBatis Plus分页)
* 通过UNION ALL联合查询个人中介和实体中介
* 支持按中介类型筛选(1=个人, 2=实体, null=全部)
*
* @param page 分页对象
* @param queryDTO 查询条件
* @return 中介VO分页结果
*/
Page<CcdiIntermediaryVO> selectIntermediaryList(Page<CcdiIntermediaryVO> page, @Param("query") CcdiIntermediaryQueryDTO queryDTO);
}

View File

@@ -4,11 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.ccdi.domain.CcdiBizIntermediary;
import com.ruoyi.ccdi.domain.CcdiEnterpriseBaseInfo;
import com.ruoyi.ccdi.domain.dto.CcdiIntermediaryEntityAddDTO;
import com.ruoyi.ccdi.domain.dto.CcdiIntermediaryEntityEditDTO;
import com.ruoyi.ccdi.domain.dto.CcdiIntermediaryPersonAddDTO;
import com.ruoyi.ccdi.domain.dto.CcdiIntermediaryPersonEditDTO;
import com.ruoyi.ccdi.domain.dto.CcdiIntermediaryQueryDTO;
import com.ruoyi.ccdi.domain.dto.*;
import com.ruoyi.ccdi.domain.excel.CcdiIntermediaryEntityExcel;
import com.ruoyi.ccdi.domain.excel.CcdiIntermediaryPersonExcel;
import com.ruoyi.ccdi.domain.vo.CcdiIntermediaryEntityDetailVO;
@@ -16,6 +12,7 @@ import com.ruoyi.ccdi.domain.vo.CcdiIntermediaryPersonDetailVO;
import com.ruoyi.ccdi.domain.vo.CcdiIntermediaryVO;
import com.ruoyi.ccdi.mapper.CcdiBizIntermediaryMapper;
import com.ruoyi.ccdi.mapper.CcdiEnterpriseBaseInfoMapper;
import com.ruoyi.ccdi.mapper.CcdiIntermediaryMapper;
import com.ruoyi.ccdi.service.ICcdiIntermediaryService;
import com.ruoyi.common.utils.StringUtils;
import jakarta.annotation.Resource;
@@ -41,8 +38,13 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
@Resource
private CcdiEnterpriseBaseInfoMapper enterpriseBaseInfoMapper;
@Resource
private CcdiIntermediaryMapper intermediaryMapper;
/**
* 分页查询中介列表
* 使用XML联合查询实现,支持个人中介和实体中介的灵活查询
* 使用MyBatis Plus分页插件自动处理分页
*
* @param page 分页对象
* @param queryDTO 查询条件
@@ -50,61 +52,8 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
*/
@Override
public Page<CcdiIntermediaryVO> selectIntermediaryPage(Page<CcdiIntermediaryVO> page, CcdiIntermediaryQueryDTO queryDTO) {
Page<CcdiIntermediaryVO> voPage = new Page<>(page.getCurrent(), page.getSize());
List<CcdiIntermediaryVO> list = new ArrayList<>();
// 查询个人中介
LambdaQueryWrapper<CcdiBizIntermediary> personWrapper = new LambdaQueryWrapper<>();
personWrapper.eq(CcdiBizIntermediary::getPersonType, "中介")
.like(StringUtils.isNotEmpty(queryDTO.getName()), CcdiBizIntermediary::getName, queryDTO.getName())
.like(StringUtils.isNotEmpty(queryDTO.getCertificateNo()), CcdiBizIntermediary::getPersonId, queryDTO.getCertificateNo());
List<CcdiBizIntermediary> personList = bizIntermediaryMapper.selectList(personWrapper);
for (CcdiBizIntermediary person : personList) {
CcdiIntermediaryVO vo = new CcdiIntermediaryVO();
vo.setId(person.getBizId());
vo.setName(person.getName());
vo.setCertificateNo(person.getPersonId());
vo.setIntermediaryType("1");
vo.setPersonType(person.getPersonType());
vo.setCompany(person.getCompany());
vo.setDataSource(person.getDataSource());
vo.setCreateTime(person.getCreateTime());
list.add(vo);
}
// 查询实体中介
LambdaQueryWrapper<CcdiEnterpriseBaseInfo> entityWrapper = new LambdaQueryWrapper<>();
entityWrapper.eq(CcdiEnterpriseBaseInfo::getRiskLevel, "1")
.eq(CcdiEnterpriseBaseInfo::getEntSource, "INTERMEDIARY")
.like(StringUtils.isNotEmpty(queryDTO.getName()), CcdiEnterpriseBaseInfo::getEnterpriseName, queryDTO.getName())
.like(StringUtils.isNotEmpty(queryDTO.getCertificateNo()), CcdiEnterpriseBaseInfo::getSocialCreditCode, queryDTO.getCertificateNo());
List<CcdiEnterpriseBaseInfo> entityList = enterpriseBaseInfoMapper.selectList(entityWrapper);
for (CcdiEnterpriseBaseInfo entity : entityList) {
CcdiIntermediaryVO vo = new CcdiIntermediaryVO();
vo.setId(entity.getSocialCreditCode());
vo.setName(entity.getEnterpriseName());
vo.setCertificateNo(entity.getSocialCreditCode());
vo.setIntermediaryType("2");
vo.setDataSource(entity.getDataSource());
vo.setCreateTime(entity.getCreateTime());
list.add(vo);
}
// 手动分页
int start = (int) ((voPage.getCurrent() - 1) * voPage.getSize());
int end = (int) Math.min(start + voPage.getSize(), list.size());
List<CcdiIntermediaryVO> pageList = new ArrayList<>();
if (start < list.size()) {
pageList = list.subList(start, end);
}
voPage.setRecords(pageList);
voPage.setTotal(list.size());
return voPage;
// 直接调用Mapper的联合查询方法MyBatis Plus会自动处理分页
return intermediaryMapper.selectIntermediaryList(page, queryDTO);
}
/**
@@ -122,6 +71,8 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
CcdiIntermediaryPersonDetailVO vo = new CcdiIntermediaryPersonDetailVO();
BeanUtils.copyProperties(person, vo);
// 设置中介类型为个人
vo.setIntermediaryType("1");
return vo;
}
@@ -140,6 +91,10 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
CcdiIntermediaryEntityDetailVO vo = new CcdiIntermediaryEntityDetailVO();
BeanUtils.copyProperties(entity, vo);
// 设置中介类型为实体
vo.setIntermediaryType("2");
// 设置业务ID(使用socialCreditCode作为bizId,前端判断是否为新增模式)
vo.setBizId(socialCreditCode);
return vo;
}
@@ -159,7 +114,6 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
CcdiBizIntermediary person = new CcdiBizIntermediary();
BeanUtils.copyProperties(addDTO, person);
person.setPersonType("中介");
person.setDataSource("MANUAL");
return bizIntermediaryMapper.insert(person);
@@ -286,6 +240,7 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
/**
* 导入个人中介数据(批量操作)
* 优化:使用批量查询替代循环中的单条查询,减少数据库交互次数
*
* @param list Excel实体列表
* @param updateSupport 是否更新支持
@@ -308,7 +263,28 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
List<CcdiBizIntermediary> updateList = new ArrayList<>();
List<String> personIds = new ArrayList<>();
// 第一轮:数据验证和分类
// 第一轮:收集所有personId
for (CcdiIntermediaryPersonExcel excel : list) {
if (StringUtils.isNotEmpty(excel.getPersonId())) {
personIds.add(excel.getPersonId());
}
}
// 第二轮批量查询已存在的记录一次查询替代N次查询
java.util.Map<String, String> personIdToBizIdMap = new java.util.HashMap<>();
if (!personIds.isEmpty()) {
LambdaQueryWrapper<CcdiBizIntermediary> wrapper = new LambdaQueryWrapper<>();
wrapper.select(CcdiBizIntermediary::getBizId, CcdiBizIntermediary::getPersonId);
wrapper.in(CcdiBizIntermediary::getPersonId, personIds);
List<CcdiBizIntermediary> existingList = bizIntermediaryMapper.selectList(wrapper);
// 建立personId到bizId的映射
for (CcdiBizIntermediary existing : existingList) {
personIdToBizIdMap.put(existing.getPersonId(), existing.getBizId());
}
}
// 第三轮数据验证和分类使用Map进行快速判断避免重复查询
for (int i = 0; i < list.size(); i++) {
try {
CcdiIntermediaryPersonExcel excel = list.get(i);
@@ -327,12 +303,13 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
person.setPersonType("中介");
person.setDataSource("IMPORT");
personIds.add(excel.getPersonId());
// 检查唯一性
if (!checkPersonIdUnique(excel.getPersonId(), null)) {
// 使用Map快速判断是否存在
String existingBizId = personIdToBizIdMap.get(excel.getPersonId());
if (existingBizId != null) {
// 记录已存在
if (updateSupport) {
// 需要更新,暂时加入更新列表
// 需要更新,设置bizId
person.setBizId(existingBizId);
updateList.add(person);
} else {
throw new RuntimeException("该证件号已存在");
@@ -351,12 +328,15 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
}
}
// 构建返回消息
StringBuilder resultMsg = new StringBuilder();
if (failureNum > 0) {
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new RuntimeException(failureMsg.toString());
resultMsg.append("很抱歉,导入失败!共 ").append(failureNum).append(" 条数据格式不正确,错误如下:");
resultMsg.append(failureMsg);
}
// 第轮:批量处理
// 第轮:批量处理
try {
// 批量插入新记录
if (!insertList.isEmpty()) {
@@ -365,31 +345,16 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
// 批量更新已存在的记录
if (!updateList.isEmpty()) {
// 查询已存在记录的bizId
LambdaQueryWrapper<CcdiBizIntermediary> wrapper = new LambdaQueryWrapper<>();
wrapper.in(CcdiBizIntermediary::getPersonId, personIds);
List<CcdiBizIntermediary> existingList = bizIntermediaryMapper.selectList(wrapper);
// 建立personId到bizId的映射
java.util.Map<String, String> personIdToBizIdMap = new java.util.HashMap<>();
for (CcdiBizIntermediary existing : existingList) {
personIdToBizIdMap.put(existing.getPersonId(), existing.getBizId());
}
// 设置bizId到更新列表
for (CcdiBizIntermediary person : updateList) {
String bizId = personIdToBizIdMap.get(person.getPersonId());
if (bizId != null) {
person.setBizId(bizId);
}
}
// 批量更新
bizIntermediaryMapper.updateBatch(updateList);
}
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + "");
return successMsg.toString();
// 只在有失败的情况下才返回成功信息,否则返回简洁的成功消息
if (failureNum > 0) {
resultMsg.append("<br/><br/>成功导入 ").append(successNum).append(" 条数据");
} else {
resultMsg.append("恭喜您,数据已全部导入成功!共 ").append(successNum).append("");
}
return resultMsg.toString();
} catch (Exception e) {
throw new RuntimeException("批量操作失败:" + e.getMessage());
}
@@ -397,6 +362,7 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
/**
* 导入实体中介数据(批量操作)
* 优化:使用批量查询替代循环中的单条查询,减少数据库交互次数
*
* @param list Excel实体列表
* @param updateSupport 是否更新支持
@@ -419,7 +385,27 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
List<CcdiEnterpriseBaseInfo> updateList = new ArrayList<>();
List<String> socialCreditCodes = new ArrayList<>();
// 第一轮:数据验证和分类
// 第一轮:收集所有socialCreditCode
for (CcdiIntermediaryEntityExcel excel : list) {
if (StringUtils.isNotEmpty(excel.getSocialCreditCode())) {
socialCreditCodes.add(excel.getSocialCreditCode());
}
}
// 第二轮批量查询已存在的记录一次查询替代N次查询
java.util.Map<String, CcdiEnterpriseBaseInfo> existingEntityMap = new java.util.HashMap<>();
if (!socialCreditCodes.isEmpty()) {
LambdaQueryWrapper<CcdiEnterpriseBaseInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.in(CcdiEnterpriseBaseInfo::getSocialCreditCode, socialCreditCodes);
List<CcdiEnterpriseBaseInfo> existingList = enterpriseBaseInfoMapper.selectList(wrapper);
// 建立socialCreditCode到实体的映射
for (CcdiEnterpriseBaseInfo existing : existingList) {
existingEntityMap.put(existing.getSocialCreditCode(), existing);
}
}
// 第三轮数据验证和分类使用Map进行快速判断避免重复查询
for (int i = 0; i < list.size(); i++) {
try {
CcdiIntermediaryEntityExcel excel = list.get(i);
@@ -436,13 +422,13 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
entity.setEntSource("INTERMEDIARY");
entity.setDataSource("IMPORT");
// 检查唯一性
// 使用Map快速判断是否存在
if (StringUtils.isNotEmpty(excel.getSocialCreditCode())) {
socialCreditCodes.add(excel.getSocialCreditCode());
if (!checkSocialCreditCodeUnique(excel.getSocialCreditCode(), null)) {
CcdiEnterpriseBaseInfo existingEntity = existingEntityMap.get(excel.getSocialCreditCode());
if (existingEntity != null) {
// 记录已存在
if (updateSupport) {
// 需要更新,加入更新列表
// 需要更新,直接使用socialCreditCode作为主键
updateList.add(entity);
} else {
throw new RuntimeException("该统一社会信用代码已存在");
@@ -465,12 +451,15 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
}
}
// 构建返回消息
StringBuilder resultMsg = new StringBuilder();
if (failureNum > 0) {
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new RuntimeException(failureMsg.toString());
resultMsg.append("很抱歉,导入失败!共 ").append(failureNum).append(" 条数据格式不正确,错误如下:");
resultMsg.append(failureMsg);
}
// 第轮:批量处理
// 第轮:批量处理
try {
// 批量插入新记录
if (!insertList.isEmpty()) {
@@ -479,12 +468,16 @@ public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
// 批量更新已存在的记录
if (!updateList.isEmpty()) {
// 批量更新socialCreditCode已在实体中
enterpriseBaseInfoMapper.updateBatch(updateList);
}
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + "");
return successMsg.toString();
// 只在有失败的情况下才返回成功信息,否则返回简洁的成功消息
if (failureNum > 0) {
resultMsg.append("<br/><br/>成功导入 ").append(successNum).append(" 条数据");
} else {
resultMsg.append("恭喜您,数据已全部导入成功!共 ").append(successNum).append("");
}
return resultMsg.toString();
} catch (Exception e) {
throw new RuntimeException("批量操作失败:" + e.getMessage());
}

View File

@@ -2,59 +2,59 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.ccdi.mapper.CcdiBizIntermediaryMapper">
<mapper namespace="com.ruoyi.ccdi.mapper.CcdiIntermediaryMapper">
<!--
统一列表联合查询
使用UNION ALL联合查询个人中介和实体中介
支持按中介类型、姓名、证件号筛选
中介黑名单联合查询
支持按中介类型筛选: 1=个人中介, 2=实体中介, null=全部
使用MyBatis Plus分页插件自动处理分页
-->
<select id="selectIntermediaryList" resultType="com.ruoyi.ccdi.domain.vo.CcdiIntermediaryVO">
<!-- 查询个人中介 -->
SELECT
biz_id as id,
name,
person_id as certificate_no,
'1' as intermediary_type,
person_type,
company,
data_source,
create_time
FROM ccdi_biz_intermediary
WHERE person_type = '中介'
<if test="intermediaryType == null or intermediaryType == '1'">
<if test="name != null and name != ''">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="certificateNo != null and certificateNo != ''">
AND person_id = #{certificateNo}
</if>
</if>
SELECT * FROM (
<!-- 查询个人中介 -->
SELECT
biz_id as id,
name,
person_id as certificate_no,
'1' as intermediary_type,
person_type,
company,
data_source,
create_time,
update_time
FROM ccdi_biz_intermediary
UNION ALL
UNION ALL
<!-- 查询实体中介 -->
SELECT
social_credit_code as id,
enterprise_name as name,
social_credit_code as certificate_no,
'2' as intermediary_type,
'实体' as person_type,
enterprise_name as company,
data_source,
create_time
FROM ccdi_enterprise_base_info
WHERE risk_level = '1' AND ent_source = 'INTERMEDIARY'
<if test="intermediaryType == null or intermediaryType == '2'">
<if test="name != null and name != ''">
AND enterprise_name LIKE CONCAT('%', #{name}, '%')
<!-- 查询实体中介 -->
SELECT
social_credit_code as id,
enterprise_name as name,
social_credit_code as certificate_no,
'2' as intermediary_type,
'实体' as person_type,
enterprise_name as company,
data_source,
create_time,
update_time
FROM ccdi_enterprise_base_info
WHERE risk_level = '1' AND ent_source = 'INTERMEDIARY'
) AS combined_result
<where>
<!-- 按中介类型筛选 -->
<if test="query.intermediaryType != null and query.intermediaryType != ''">
AND intermediary_type = #{query.intermediaryType}
</if>
<if test="certificateNo != null and certificateNo != ''">
AND social_credit_code = #{certificateNo}
<!-- 按姓名/机构名称模糊查询 -->
<if test="query.name != null and query.name != ''">
AND name LIKE CONCAT('%', #{query.name}, '%')
</if>
</if>
ORDER BY create_time DESC
<!-- 按证件号/统一社会信用代码精确查询 -->
<if test="query.certificateNo != null and query.certificateNo != ''">
AND certificate_no = #{query.certificateNo}
</if>
</where>
ORDER BY update_time DESC
</select>
</mapper>