feat: 添加中介Service接口和实现类

- 新增ICcdiIntermediaryService接口,定义中介服务层操作方法
- 新增CcdiIntermediaryServiceImpl实现类,提供中介CRUD功能
- 支持个人和实体中介的统一查询、详情查询、新增、修改、删除
- 实现证件号和统一社会信用代码唯一性校验
- 支持Excel批量导入功能

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
wkc
2026-02-04 19:31:46 +08:00
parent 7084b3ee6a
commit 36698468f4
2 changed files with 541 additions and 0 deletions

View File

@@ -0,0 +1,117 @@
package com.ruoyi.ccdi.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.ccdi.domain.dto.*;
import com.ruoyi.ccdi.domain.vo.CcdiIntermediaryEntityDetailVO;
import com.ruoyi.ccdi.domain.vo.CcdiIntermediaryPersonDetailVO;
import com.ruoyi.ccdi.domain.vo.CcdiIntermediaryVO;
/**
* 中介Service接口
*
* @author ruoyi
* @date 2026-02-04
*/
public interface ICcdiIntermediaryService {
/**
* 分页查询中介列表
*
* @param page 分页对象
* @param queryDTO 查询条件
* @return 中介VO分页结果
*/
Page<CcdiIntermediaryVO> selectIntermediaryPage(Page<CcdiIntermediaryVO> page, CcdiIntermediaryQueryDTO queryDTO);
/**
* 查询个人中介详情
*
* @param bizId 人员ID
* @return 个人中介详情VO
*/
CcdiIntermediaryPersonDetailVO selectIntermediaryPersonDetail(String bizId);
/**
* 查询实体中介详情
*
* @param socialCreditCode 统一社会信用代码
* @return 实体中介详情VO
*/
CcdiIntermediaryEntityDetailVO selectIntermediaryEntityDetail(String socialCreditCode);
/**
* 新增个人中介
*
* @param addDTO 新增DTO
* @return 结果
*/
int insertIntermediaryPerson(CcdiIntermediaryPersonAddDTO addDTO);
/**
* 修改个人中介
*
* @param editDTO 编辑DTO
* @return 结果
*/
int updateIntermediaryPerson(CcdiIntermediaryPersonEditDTO editDTO);
/**
* 新增实体中介
*
* @param addDTO 新增DTO
* @return 结果
*/
int insertIntermediaryEntity(CcdiIntermediaryEntityAddDTO addDTO);
/**
* 修改实体中介
*
* @param editDTO 编辑DTO
* @return 结果
*/
int updateIntermediaryEntity(CcdiIntermediaryEntityEditDTO editDTO);
/**
* 批量删除中介
*
* @param ids 需要删除的ID数组
* @return 结果
*/
int deleteIntermediaryByIds(String[] ids);
/**
* 校验人员ID唯一性
*
* @param personId 人员ID
* @param bizId 排除的人员ID
* @return true=唯一, false=不唯一
*/
boolean checkPersonIdUnique(String personId, String bizId);
/**
* 校验统一社会信用代码唯一性
*
* @param socialCreditCode 统一社会信用代码
* @param excludeId 排除的ID
* @return true=唯一, false=不唯一
*/
boolean checkSocialCreditCodeUnique(String socialCreditCode, String excludeId);
/**
* 导入个人中介数据
*
* @param list Excel实体列表
* @param updateSupport 是否更新支持
* @return 结果
*/
String importIntermediaryPerson(java.util.List<com.ruoyi.ccdi.domain.excel.CcdiIntermediaryPersonExcel> list, boolean updateSupport);
/**
* 导入实体中介数据
*
* @param list Excel实体列表
* @param updateSupport 是否更新支持
* @return 结果
*/
String importIntermediaryEntity(java.util.List<com.ruoyi.ccdi.domain.excel.CcdiIntermediaryEntityExcel> list, boolean updateSupport);
}

View File

@@ -0,0 +1,424 @@
package com.ruoyi.ccdi.service.impl;
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.excel.CcdiIntermediaryEntityExcel;
import com.ruoyi.ccdi.domain.excel.CcdiIntermediaryPersonExcel;
import com.ruoyi.ccdi.domain.vo.CcdiIntermediaryEntityDetailVO;
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.service.ICcdiIntermediaryService;
import com.ruoyi.common.utils.StringUtils;
import jakarta.annotation.Resource;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
* 中介Service业务层处理
*
* @author ruoyi
* @date 2026-02-04
*/
@Service
public class CcdiIntermediaryServiceImpl implements ICcdiIntermediaryService {
@Resource
private CcdiBizIntermediaryMapper bizIntermediaryMapper;
@Resource
private CcdiEnterpriseBaseInfoMapper enterpriseBaseInfoMapper;
/**
* 分页查询中介列表
*
* @param page 分页对象
* @param queryDTO 查询条件
* @return 中介VO分页结果
*/
@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.like(StringUtils.isNotEmpty(queryDTO.getName()), CcdiBizIntermediary::getName, queryDTO.getName())
.like(StringUtils.isNotEmpty(queryDTO.getCertificateNo()), CcdiBizIntermediary::getPersonId, queryDTO.getCertificateNo())
.eq(StringUtils.isNotEmpty(queryDTO.getIntermediaryType()), CcdiBizIntermediary::getIntermediaryType, queryDTO.getIntermediaryType())
.or()
.eq(StringUtils.isEmpty(queryDTO.getIntermediaryType()) || "1".equals(queryDTO.getIntermediaryType()),
CcdiBizIntermediary::getIntermediaryType, "1");
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.like(StringUtils.isNotEmpty(queryDTO.getName()), CcdiEnterpriseBaseInfo::getEnterpriseName, queryDTO.getName())
.like(StringUtils.isNotEmpty(queryDTO.getCertificateNo()), CcdiEnterpriseBaseInfo::getSocialCreditCode, queryDTO.getCertificateNo())
.eq(StringUtils.isNotEmpty(queryDTO.getIntermediaryType()), CcdiEnterpriseBaseInfo::getIntermediaryType, queryDTO.getIntermediaryType())
.or()
.eq(StringUtils.isEmpty(queryDTO.getIntermediaryType()) || "2".equals(queryDTO.getIntermediaryType()),
CcdiEnterpriseBaseInfo::getIntermediaryType, "2");
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;
}
/**
* 查询个人中介详情
*
* @param bizId 人员ID
* @return 个人中介详情VO
*/
@Override
public CcdiIntermediaryPersonDetailVO selectIntermediaryPersonDetail(String bizId) {
CcdiBizIntermediary person = bizIntermediaryMapper.selectById(bizId);
if (person == null) {
return null;
}
CcdiIntermediaryPersonDetailVO vo = new CcdiIntermediaryPersonDetailVO();
BeanUtils.copyProperties(person, vo);
return vo;
}
/**
* 查询实体中介详情
*
* @param socialCreditCode 统一社会信用代码
* @return 实体中介详情VO
*/
@Override
public CcdiIntermediaryEntityDetailVO selectIntermediaryEntityDetail(String socialCreditCode) {
CcdiEnterpriseBaseInfo entity = enterpriseBaseInfoMapper.selectById(socialCreditCode);
if (entity == null) {
return null;
}
CcdiIntermediaryEntityDetailVO vo = new CcdiIntermediaryEntityDetailVO();
BeanUtils.copyProperties(entity, vo);
return vo;
}
/**
* 新增个人中介
*
* @param addDTO 新增DTO
* @return 结果
*/
@Override
@Transactional
public int insertIntermediaryPerson(CcdiIntermediaryPersonAddDTO addDTO) {
// 检查人员ID唯一性
if (!checkPersonIdUnique(addDTO.getPersonId(), null)) {
throw new RuntimeException("该证件号已存在");
}
CcdiBizIntermediary person = new CcdiBizIntermediary();
BeanUtils.copyProperties(addDTO, person);
person.setIntermediaryType("1");
return bizIntermediaryMapper.insert(person);
}
/**
* 修改个人中介
*
* @param editDTO 编辑DTO
* @return 结果
*/
@Override
@Transactional
public int updateIntermediaryPerson(CcdiIntermediaryPersonEditDTO editDTO) {
// 检查人员ID唯一性排除自己
if (StringUtils.isNotEmpty(editDTO.getPersonId())) {
if (!checkPersonIdUnique(editDTO.getPersonId(), editDTO.getBizId())) {
throw new RuntimeException("该证件号已存在");
}
}
CcdiBizIntermediary person = new CcdiBizIntermediary();
BeanUtils.copyProperties(editDTO, person);
return bizIntermediaryMapper.updateById(person);
}
/**
* 新增实体中介
*
* @param addDTO 新增DTO
* @return 结果
*/
@Override
@Transactional
public int insertIntermediaryEntity(CcdiIntermediaryEntityAddDTO addDTO) {
// 检查统一社会信用代码唯一性
if (StringUtils.isNotEmpty(addDTO.getSocialCreditCode())) {
if (!checkSocialCreditCodeUnique(addDTO.getSocialCreditCode(), null)) {
throw new RuntimeException("该统一社会信用代码已存在");
}
}
CcdiEnterpriseBaseInfo entity = new CcdiEnterpriseBaseInfo();
BeanUtils.copyProperties(addDTO, entity);
entity.setIntermediaryType("2");
return enterpriseBaseInfoMapper.insert(entity);
}
/**
* 修改实体中介
*
* @param editDTO 编辑DTO
* @return 结果
*/
@Override
@Transactional
public int updateIntermediaryEntity(CcdiIntermediaryEntityEditDTO editDTO) {
CcdiEnterpriseBaseInfo entity = new CcdiEnterpriseBaseInfo();
BeanUtils.copyProperties(editDTO, entity);
return enterpriseBaseInfoMapper.updateById(entity);
}
/**
* 批量删除中介
*
* @param ids 需要删除的ID数组
* @return 结果
*/
@Override
@Transactional
public int deleteIntermediaryByIds(String[] ids) {
int count = 0;
for (String id : ids) {
// 判断是个人还是实体个人ID长度较长实体统一社会信用代码18位
if (id.length() > 18) {
// 个人中介
count += bizIntermediaryMapper.deleteById(id);
} else {
// 实体中介
count += enterpriseBaseInfoMapper.deleteById(id);
}
}
return count;
}
/**
* 校验人员ID唯一性
*
* @param personId 人员ID
* @param bizId 排除的人员ID
* @return true=唯一, false=不唯一
*/
@Override
public boolean checkPersonIdUnique(String personId, String bizId) {
LambdaQueryWrapper<CcdiBizIntermediary> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(CcdiBizIntermediary::getPersonId, personId);
if (StringUtils.isNotEmpty(bizId)) {
wrapper.ne(CcdiBizIntermediary::getBizId, bizId);
}
return bizIntermediaryMapper.selectCount(wrapper) == 0;
}
/**
* 校验统一社会信用代码唯一性
*
* @param socialCreditCode 统一社会信用代码
* @param excludeId 排除的ID
* @return true=唯一, false=不唯一
*/
@Override
public boolean checkSocialCreditCodeUnique(String socialCreditCode, String excludeId) {
LambdaQueryWrapper<CcdiEnterpriseBaseInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(CcdiEnterpriseBaseInfo::getSocialCreditCode, socialCreditCode);
if (StringUtils.isNotEmpty(excludeId)) {
wrapper.ne(CcdiEnterpriseBaseInfo::getSocialCreditCode, excludeId);
}
return enterpriseBaseInfoMapper.selectCount(wrapper) == 0;
}
/**
* 导入个人中介数据
*
* @param list Excel实体列表
* @param updateSupport 是否更新支持
* @return 结果
*/
@Override
@Transactional
public String importIntermediaryPerson(List<CcdiIntermediaryPersonExcel> list, boolean updateSupport) {
if (StringUtils.isNull(list) || list.isEmpty()) {
return "至少需要一条数据";
}
int successNum = 0;
int failureNum = 0;
StringBuilder successMsg = new StringBuilder();
StringBuilder failureMsg = new StringBuilder();
for (CcdiIntermediaryPersonExcel excel : list) {
try {
// 验证数据
if (StringUtils.isEmpty(excel.getName())) {
throw new RuntimeException("姓名不能为空");
}
if (StringUtils.isEmpty(excel.getPersonId())) {
throw new RuntimeException("证件号码不能为空");
}
// 转换为实体
CcdiBizIntermediary person = new CcdiBizIntermediary();
BeanUtils.copyProperties(excel, person);
person.setIntermediaryType("1");
// 检查唯一性
if (!checkPersonIdUnique(excel.getPersonId(), null)) {
if (updateSupport) {
// 更新模式:查询已存在记录并更新
LambdaQueryWrapper<CcdiBizIntermediary> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(CcdiBizIntermediary::getPersonId, excel.getPersonId());
CcdiBizIntermediary existingPerson = bizIntermediaryMapper.selectOne(wrapper);
if (existingPerson != null) {
person.setBizId(existingPerson.getBizId());
bizIntermediaryMapper.updateById(person);
}
} else {
throw new RuntimeException("该证件号已存在");
}
} else {
bizIntermediaryMapper.insert(person);
}
successNum++;
successMsg.append("<br/>").append(successNum).append("").append(excel.getName()).append(" 导入成功");
} catch (Exception e) {
failureNum++;
failureMsg.append("<br/>").append(failureNum).append("").append(excel.getName()).append(" 导入失败:");
failureMsg.append(e.getMessage());
}
}
if (failureNum > 0) {
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new RuntimeException(failureMsg.toString());
} else {
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + "");
return successMsg.toString();
}
}
/**
* 导入实体中介数据
*
* @param list Excel实体列表
* @param updateSupport 是否更新支持
* @return 结果
*/
@Override
@Transactional
public String importIntermediaryEntity(List<CcdiIntermediaryEntityExcel> list, boolean updateSupport) {
if (StringUtils.isNull(list) || list.isEmpty()) {
return "至少需要一条数据";
}
int successNum = 0;
int failureNum = 0;
StringBuilder successMsg = new StringBuilder();
StringBuilder failureMsg = new StringBuilder();
for (CcdiIntermediaryEntityExcel excel : list) {
try {
// 验证数据
if (StringUtils.isEmpty(excel.getEnterpriseName())) {
throw new RuntimeException("机构名称不能为空");
}
// 转换为实体
CcdiEnterpriseBaseInfo entity = new CcdiEnterpriseBaseInfo();
BeanUtils.copyProperties(excel, entity);
entity.setIntermediaryType("2");
// 检查唯一性
if (StringUtils.isNotEmpty(excel.getSocialCreditCode())) {
if (!checkSocialCreditCodeUnique(excel.getSocialCreditCode(), null)) {
if (updateSupport) {
// 更新模式
enterpriseBaseInfoMapper.updateById(entity);
} else {
throw new RuntimeException("该统一社会信用代码已存在");
}
} else {
enterpriseBaseInfoMapper.insert(entity);
}
} else {
// 没有统一社会信用代码,直接插入
enterpriseBaseInfoMapper.insert(entity);
}
successNum++;
successMsg.append("<br/>").append(successNum).append("").append(excel.getEnterpriseName()).append(" 导入成功");
} catch (Exception e) {
failureNum++;
failureMsg.append("<br/>").append(failureNum).append("").append(excel.getEnterpriseName()).append(" 导入失败:");
failureMsg.append(e.getMessage());
}
}
if (failureNum > 0) {
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new RuntimeException(failureMsg.toString());
} else {
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + "");
return successMsg.toString();
}
}
}