diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiStaffFmyRelationImportServiceImpl.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiStaffFmyRelationImportServiceImpl.java index 2e1eb40..aff8d2a 100644 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiStaffFmyRelationImportServiceImpl.java +++ b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiStaffFmyRelationImportServiceImpl.java @@ -1,6 +1,8 @@ package com.ruoyi.ccdi.service.impl; import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.ccdi.domain.CcdiBaseStaff; import com.ruoyi.ccdi.domain.CcdiStaffFmyRelation; import com.ruoyi.ccdi.domain.dto.CcdiStaffFmyRelationAddDTO; import com.ruoyi.ccdi.domain.excel.CcdiStaffFmyRelationExcel; @@ -8,6 +10,7 @@ import com.ruoyi.ccdi.domain.vo.ImportResult; import com.ruoyi.ccdi.domain.vo.ImportStatusVO; import com.ruoyi.ccdi.domain.vo.StaffFmyRelationImportFailureVO; import com.ruoyi.ccdi.enums.GenderEnum; +import com.ruoyi.ccdi.mapper.CcdiBaseStaffMapper; import com.ruoyi.ccdi.mapper.CcdiStaffFmyRelationMapper; import com.ruoyi.ccdi.service.ICcdiStaffFmyRelationImportService; import com.ruoyi.ccdi.utils.ImportLogUtils; @@ -24,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; /** * 员工亲属关系异步导入服务层处理 @@ -43,6 +47,9 @@ public class CcdiStaffFmyRelationImportServiceImpl implements ICcdiStaffFmyRelat @Resource private RedisTemplate redisTemplate; + @Resource + private CcdiBaseStaffMapper baseStaffMapper; + @Override @Async @Transactional @@ -55,14 +62,32 @@ public class CcdiStaffFmyRelationImportServiceImpl implements ICcdiStaffFmyRelat List newRecords = new ArrayList<>(); List failures = new ArrayList<>(); + // 批量验证员工身份证号是否存在 + Set excelPersonIds = excelList.stream() + .map(CcdiStaffFmyRelationExcel::getPersonId) + .filter(StringUtils::isNotEmpty) + .collect(Collectors.toSet()); + + Set existingPersonIds = new HashSet<>(); + if (!excelPersonIds.isEmpty()) { + ImportLogUtils.logBatchQueryStart(log, taskId, "员工身份证号", excelPersonIds.size()); + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.select(CcdiBaseStaff::getIdCard) + .in(CcdiBaseStaff::getIdCard, excelPersonIds); + + List existingStaff = baseStaffMapper.selectList(wrapper); + existingPersonIds = existingStaff.stream() + .map(CcdiBaseStaff::getIdCard) + .collect(Collectors.toSet()); + + ImportLogUtils.logBatchQueryComplete(log, taskId, "员工身份证号", existingPersonIds.size()); + } + // ========== 第一步:批量唯一性校验 ========== - // 1. 提取Excel中所有的personId和relationCertNo - Set excelPersonIds = new HashSet<>(); + // 1. 提取Excel中所有的relationCertNo(personId已在前面提取) Set excelRelationCertNos = new HashSet<>(); for (CcdiStaffFmyRelationExcel excel : excelList) { - if (StringUtils.isNotEmpty(excel.getPersonId())) { - excelPersonIds.add(excel.getPersonId()); - } if (StringUtils.isNotEmpty(excel.getRelationCertNo())) { excelRelationCertNos.add(excel.getRelationCertNo()); } @@ -70,7 +95,7 @@ public class CcdiStaffFmyRelationImportServiceImpl implements ICcdiStaffFmyRelat // 2. 批量查询数据库中已存在的记录 Set existingKeys = new HashSet<>(); - if (!excelPersonIds.isEmpty() && !excelRelationCertNos.isEmpty()) { + if (!excelRelationCertNos.isEmpty()) { ImportLogUtils.logBatchQueryStart(log, taskId, "已存在的亲属关系", excelList.size()); List existingRecords = relationMapper.selectExistingRelations( new ArrayList<>(excelPersonIds), @@ -100,6 +125,13 @@ public class CcdiStaffFmyRelationImportServiceImpl implements ICcdiStaffFmyRelat // 验证数据 validateRelationData(addDTO); + // 身份证号存在性检查(在基本验证之后) + if (!existingPersonIds.contains(excel.getPersonId())) { + throw new RuntimeException(String.format( + "第%d行: 身份证号[%s]不存在于员工信息表中,请先添加员工信息", + i + 1, excel.getPersonId())); + } + // 生成唯一键 String uniqueKey = excel.getPersonId() + "|" + excel.getRelationCertNo();