diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiIntermediaryService.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiIntermediaryService.java new file mode 100644 index 0000000..a359c0b --- /dev/null +++ b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiIntermediaryService.java @@ -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 selectIntermediaryPage(Page 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 list, boolean updateSupport); + + /** + * 导入实体中介数据 + * + * @param list Excel实体列表 + * @param updateSupport 是否更新支持 + * @return 结果 + */ + String importIntermediaryEntity(java.util.List list, boolean updateSupport); +} diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiIntermediaryServiceImpl.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiIntermediaryServiceImpl.java new file mode 100644 index 0000000..82413e0 --- /dev/null +++ b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiIntermediaryServiceImpl.java @@ -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 selectIntermediaryPage(Page page, CcdiIntermediaryQueryDTO queryDTO) { + Page voPage = new Page<>(page.getCurrent(), page.getSize()); + List list = new ArrayList<>(); + + // 查询个人中介 + LambdaQueryWrapper 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 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 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 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 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 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 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 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 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("
").append(successNum).append("、").append(excel.getName()).append(" 导入成功"); + } catch (Exception e) { + failureNum++; + failureMsg.append("
").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 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("
").append(successNum).append("、").append(excel.getEnterpriseName()).append(" 导入成功"); + } catch (Exception e) { + failureNum++; + failureMsg.append("
").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(); + } + } +}