From 3d4a42b9fbf127d48af740c5a9eb4c3d5084be74 Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Fri, 6 Feb 2026 11:19:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=91=98=E5=B7=A5=E5=BC=82=E6=AD=A5=E5=AF=BC?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .../employee/employee_test_data_1000.xlsx | Bin 60518 -> 61697 bytes .../controller/CcdiEmployeeController.java | 11 +- .../ruoyi/ccdi/domain/vo/ImportResult.java | 15 + .../ruoyi/ccdi/mapper/CcdiEmployeeMapper.java | 15 +- .../service/ICcdiEmployeeImportService.java | 40 ++ .../ccdi/service/ICcdiEmployeeService.java | 27 -- .../impl/CcdiEmployeeImportServiceImpl.java | 277 ++++++++++++++ .../service/impl/CcdiEmployeeServiceImpl.java | 362 +----------------- .../mapper/ccdi/CcdiEmployeeMapper.xml | 15 +- 10 files changed, 357 insertions(+), 406 deletions(-) create mode 100644 ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/vo/ImportResult.java create mode 100644 ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiEmployeeImportService.java create mode 100644 ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiEmployeeImportServiceImpl.java diff --git a/.gitignore b/.gitignore index 9327d07..b012e0a 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ target/ .project .settings .springBeans +.claude ### IntelliJ IDEA ### .idea diff --git a/doc/test-data/employee/employee_test_data_1000.xlsx b/doc/test-data/employee/employee_test_data_1000.xlsx index 6a966ac214ff32b8bb458dfa0ca99a3ddb13df97..9c43d570fb6fbe0de46888d80403f38eec548d17 100644 GIT binary patch delta 58261 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 literal 60518 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

(dB!vRq8#fzU&2lDZPw% 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éErPXy(P3 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 F*S}qgtPlVI diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/controller/CcdiEmployeeController.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/controller/CcdiEmployeeController.java index d2a3455..8498b13 100644 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/controller/CcdiEmployeeController.java +++ b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/controller/CcdiEmployeeController.java @@ -9,6 +9,7 @@ import com.ruoyi.ccdi.domain.vo.CcdiEmployeeVO; import com.ruoyi.ccdi.domain.vo.ImportFailureVO; import com.ruoyi.ccdi.domain.vo.ImportResultVO; import com.ruoyi.ccdi.domain.vo.ImportStatusVO; +import com.ruoyi.ccdi.service.ICcdiEmployeeImportService; import com.ruoyi.ccdi.service.ICcdiEmployeeService; import com.ruoyi.ccdi.utils.EasyExcelUtil; import com.ruoyi.common.annotation.Log; @@ -43,6 +44,9 @@ public class CcdiEmployeeController extends BaseController { @Resource private ICcdiEmployeeService employeeService; + @Resource + private ICcdiEmployeeImportService importAsyncService; + /** * 查询员工列表 */ @@ -137,10 +141,11 @@ public class CcdiEmployeeController extends BaseController { } // 提交异步任务 - employeeService.importEmployeeAsync(list, updateSupport); + String taskId = employeeService.importEmployee(list, updateSupport); // 立即返回,不等待后台任务完成 ImportResultVO result = new ImportResultVO(); + result.setTaskId(taskId); result.setStatus("PROCESSING"); result.setMessage("导入任务已提交,正在后台处理"); @@ -155,7 +160,7 @@ public class CcdiEmployeeController extends BaseController { @GetMapping("/importStatus/{taskId}") public AjaxResult getImportStatus(@PathVariable String taskId) { try { - ImportStatusVO status = employeeService.getImportStatus(taskId); + ImportStatusVO status = importAsyncService.getImportStatus(taskId); return success(status); } catch (Exception e) { return error(e.getMessage()); @@ -173,7 +178,7 @@ public class CcdiEmployeeController extends BaseController { @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize) { - List failures = employeeService.getImportFailures(taskId); + List failures = importAsyncService.getImportFailures( taskId); // 手动分页 int fromIndex = (pageNum - 1) * pageSize; diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/vo/ImportResult.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/vo/ImportResult.java new file mode 100644 index 0000000..36b6171 --- /dev/null +++ b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/vo/ImportResult.java @@ -0,0 +1,15 @@ +package com.ruoyi.ccdi.domain.vo; + +import lombok.Data; + +/** + * @Author: wkc + * @CreateTime: 2026-02-06 + */ +@Data +public class ImportResult { + + private Integer totalCount; + private Integer successCount; + private Integer failureCount; +} diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/mapper/CcdiEmployeeMapper.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/mapper/CcdiEmployeeMapper.java index 725059a..2afc15a 100644 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/mapper/CcdiEmployeeMapper.java +++ b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/mapper/CcdiEmployeeMapper.java @@ -27,21 +27,8 @@ public interface CcdiEmployeeMapper extends BaseMapper { Page selectEmployeePageWithDept(@Param("page") Page page, @Param("query") CcdiEmployeeQueryDTO queryDTO); - /** - * 查询员工详情(包含亲属列表) - * - * @param employeeId 员工ID - * @return 员工VO - */ - CcdiEmployeeVO selectEmployeeWithRelatives(@Param("employeeId") Long employeeId); - /** - * 批量插入或更新员工信息 - * 使用ON DUPLICATE KEY UPDATE语法 - * - * @param list 员工信息列表 - * @return 影响行数 - */ + int insertOrUpdateBatch(@Param("list") List list); /** diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiEmployeeImportService.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiEmployeeImportService.java new file mode 100644 index 0000000..acce4c4 --- /dev/null +++ b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiEmployeeImportService.java @@ -0,0 +1,40 @@ +package com.ruoyi.ccdi.service; + +import com.ruoyi.ccdi.domain.excel.CcdiEmployeeExcel; +import com.ruoyi.ccdi.domain.vo.ImportFailureVO; +import com.ruoyi.ccdi.domain.vo.ImportStatusVO; + +import java.util.List; + +/** + * @Author: wkc + * @CreateTime: 2026-02-06 + */ +public interface ICcdiEmployeeImportService { + + + + /** + * 异步导入员工数据 + * + * @param excelList Excel数据列表 + * @param isUpdateSupport 是否更新已存在的数据 + */ + void importEmployeeAsync(List excelList, Boolean isUpdateSupport, String taskId); + + /** + * 查询导入状态 + * + * @param taskId 任务ID + * @return 导入状态信息 + */ + ImportStatusVO getImportStatus(String taskId); + + /** + * 获取导入失败记录 + * + * @param taskId 任务ID + * @return 失败记录列表 + */ + List getImportFailures(String taskId); +} diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiEmployeeService.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiEmployeeService.java index baaca93..a2cf196 100644 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiEmployeeService.java +++ b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiEmployeeService.java @@ -6,12 +6,8 @@ import com.ruoyi.ccdi.domain.dto.CcdiEmployeeEditDTO; import com.ruoyi.ccdi.domain.dto.CcdiEmployeeQueryDTO; import com.ruoyi.ccdi.domain.excel.CcdiEmployeeExcel; import com.ruoyi.ccdi.domain.vo.CcdiEmployeeVO; -import com.ruoyi.ccdi.domain.vo.ImportFailureVO; -import com.ruoyi.ccdi.domain.vo.ImportResultVO; -import com.ruoyi.ccdi.domain.vo.ImportStatusVO; import java.util.List; -import java.util.concurrent.CompletableFuture; /** * 员工信息 服务层 @@ -87,27 +83,4 @@ public interface ICcdiEmployeeService { */ String importEmployee(List excelList, Boolean isUpdateSupport); - /** - * 异步导入员工数据 - * - * @param excelList Excel数据列表 - * @param isUpdateSupport 是否更新已存在的数据 - */ - void importEmployeeAsync(List excelList, Boolean isUpdateSupport); - - /** - * 查询导入状态 - * - * @param taskId 任务ID - * @return 导入状态信息 - */ - ImportStatusVO getImportStatus(String taskId); - - /** - * 获取导入失败记录 - * - * @param taskId 任务ID - * @return 失败记录列表 - */ - List getImportFailures(String taskId); } diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiEmployeeImportServiceImpl.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiEmployeeImportServiceImpl.java new file mode 100644 index 0000000..e5003a4 --- /dev/null +++ b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiEmployeeImportServiceImpl.java @@ -0,0 +1,277 @@ +package com.ruoyi.ccdi.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.ccdi.domain.CcdiEmployee; +import com.ruoyi.ccdi.domain.dto.CcdiEmployeeAddDTO; +import com.ruoyi.ccdi.domain.excel.CcdiEmployeeExcel; +import com.ruoyi.ccdi.domain.vo.ImportFailureVO; +import com.ruoyi.ccdi.domain.vo.ImportResult; +import com.ruoyi.ccdi.domain.vo.ImportStatusVO; +import com.ruoyi.ccdi.mapper.CcdiEmployeeMapper; +import com.ruoyi.ccdi.service.ICcdiEmployeeImportService; +import com.ruoyi.common.utils.IdCardUtil; +import com.ruoyi.common.utils.StringUtils; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * @Author: wkc + * @CreateTime: 2026-02-06 + */ +@Service +@EnableAsync +public class CcdiEmployeeImportServiceImpl implements ICcdiEmployeeImportService { + + @Resource + private CcdiEmployeeMapper employeeMapper; + + + @Resource + private RedisTemplate redisTemplate; + + @Override + @Async + public void importEmployeeAsync(List excelList, Boolean isUpdateSupport, String taskId) { + List newRecords = new ArrayList<>(); + List updateRecords = new ArrayList<>(); + List failures = new ArrayList<>(); + + // 批量查询已存在的柜员号 + Set existingIds = getExistingEmployeeIds(excelList); + + // 分类数据 + for (int i = 0; i < excelList.size(); i++) { + CcdiEmployeeExcel excel = excelList.get(i); + + try { + // 转换为AddDTO进行验证 + CcdiEmployeeAddDTO addDTO = new CcdiEmployeeAddDTO(); + BeanUtils.copyProperties(excel, addDTO); + + // 验证数据(支持更新模式) + validateEmployeeData(addDTO, isUpdateSupport, existingIds); + + CcdiEmployee employee = new CcdiEmployee(); + BeanUtils.copyProperties(excel, employee); + + if (existingIds.contains(excel.getEmployeeId())) { + if (isUpdateSupport) { + updateRecords.add(employee); + } else { + throw new RuntimeException("柜员号已存在且未启用更新支持"); + } + } else { + newRecords.add(employee); + } + + + } catch (Exception e) { + ImportFailureVO failure = new ImportFailureVO(); + BeanUtils.copyProperties(excel, failure); + failure.setErrorMessage(e.getMessage()); + failures.add(failure); + } + } + + // 批量插入新数据 + if (!newRecords.isEmpty()) { + saveBatch(newRecords, 500); + } + + // 批量更新已有数据(先删除再插入) + if (!updateRecords.isEmpty() && isUpdateSupport) { + employeeMapper.insertOrUpdateBatch(updateRecords); + } + + // 保存失败记录到Redis + if (!failures.isEmpty()) { + String failuresKey = "import:employee:" + taskId + ":failures"; + redisTemplate.opsForValue().set(failuresKey, failures, 7, TimeUnit.DAYS); + } + + ImportResult result = new ImportResult(); + result.setTotalCount(excelList.size()); + result.setSuccessCount(newRecords.size() + updateRecords.size()); + result.setFailureCount(failures.size()); + + // 更新最终状态 + String finalStatus = result.getFailureCount() == 0 ? "SUCCESS" : "PARTIAL_SUCCESS"; + updateImportStatus("employee", taskId, finalStatus, result); + } + + /** + * 获取导入失败记录 + * + * @param taskId 任务ID + * @return 失败记录列表 + */ + @Override + public List getImportFailures( String taskId) { + String key = "import:employee:" + taskId + ":failures"; + Object failuresObj = redisTemplate.opsForValue().get(key); + + if (failuresObj == null) { + return Collections.emptyList(); + } + + return JSON.parseArray(JSON.toJSONString(failuresObj), ImportFailureVO.class); + } + + /** + * 查询导入状态 + * + * @param taskId 任务ID + * @return 导入状态信息 + */ + @Override + public ImportStatusVO getImportStatus(String taskId) { + String key = "import:employee:" + taskId; + Boolean hasKey = redisTemplate.hasKey(key); + + if (Boolean.FALSE.equals(hasKey)) { + throw new RuntimeException("任务不存在或已过期"); + } + + Map statusMap = redisTemplate.opsForHash().entries(key); + + ImportStatusVO statusVO = new ImportStatusVO(); + statusVO.setTaskId((String) statusMap.get("taskId")); + statusVO.setStatus((String) statusMap.get("status")); + statusVO.setTotalCount((Integer) statusMap.get("totalCount")); + statusVO.setSuccessCount((Integer) statusMap.get("successCount")); + statusVO.setFailureCount((Integer) statusMap.get("failureCount")); + statusVO.setProgress((Integer) statusMap.get("progress")); + statusVO.setStartTime((Long) statusMap.get("startTime")); + statusVO.setEndTime((Long) statusMap.get("endTime")); + statusVO.setMessage((String) statusMap.get("message")); + + return statusVO; + } + + /** + * 更新导入状态 + */ + private void updateImportStatus(String taskType, String taskId, String status, ImportResult result) { + String key = "import:employee:" + taskId; + Map statusData = new HashMap<>(); + statusData.put("status", status); + statusData.put("successCount", result.getSuccessCount()); + statusData.put("failureCount", result.getFailureCount()); + statusData.put("progress", 100); + statusData.put("endTime", System.currentTimeMillis()); + + if ("SUCCESS".equals(status)) { + statusData.put("message", "全部成功!共导入" + result.getTotalCount() + "条数据"); + } else { + statusData.put("message", "成功" + result.getSuccessCount() + "条,失败" + result.getFailureCount() + "条"); + } + + redisTemplate.opsForHash().putAll(key, statusData); + } + + /** + * 批量查询已存在的员工ID + */ + private Set getExistingEmployeeIds(List excelList) { + List employeeIds = excelList.stream() + .map(CcdiEmployeeExcel::getEmployeeId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + if (employeeIds.isEmpty()) { + return Collections.emptySet(); + } + + List existingEmployees = employeeMapper.selectBatchIds(employeeIds); + return existingEmployees.stream() + .map(CcdiEmployee::getEmployeeId) + .collect(Collectors.toSet()); + } + + + /** + * 批量保存 + */ + private void saveBatch(List list, int batchSize) { + // 使用真正的批量插入,分批次执行以提高性能 + for (int i = 0; i < list.size(); i += batchSize) { + int end = Math.min(i + batchSize, list.size()); + List subList = list.subList(i, end); + employeeMapper.insertBatch(subList); + } + } + + /** + * 验证员工数据 + * + * @param addDTO 新增DTO + * @param isUpdateSupport 是否支持更新 + * @param existingIds 已存在的员工ID集合(导入场景使用,传null表示单条新增) + */ + public void validateEmployeeData(CcdiEmployeeAddDTO addDTO, Boolean isUpdateSupport, Set existingIds) { + // 验证必填字段 + if (StringUtils.isEmpty(addDTO.getName())) { + throw new RuntimeException("姓名不能为空"); + } + if (addDTO.getEmployeeId() == null) { + throw new RuntimeException("柜员号不能为空"); + } + if (addDTO.getDeptId() == null) { + throw new RuntimeException("所属部门不能为空"); + } + if (StringUtils.isEmpty(addDTO.getIdCard())) { + throw new RuntimeException("身份证号不能为空"); + } + if (StringUtils.isEmpty(addDTO.getPhone())) { + throw new RuntimeException("电话不能为空"); + } + if (StringUtils.isEmpty(addDTO.getStatus())) { + throw new RuntimeException("状态不能为空"); + } + + // 验证身份证号格式 + String idCardError = IdCardUtil.getErrorMessage(addDTO.getIdCard()); + if (idCardError != null) { + throw new RuntimeException(idCardError); + } + + // 单条新增场景:检查柜员号和身份证号唯一性 + if (existingIds == null) { + // 检查柜员号(employeeId)唯一性 + if (employeeMapper.selectById(addDTO.getEmployeeId()) != null) { + throw new RuntimeException("该柜员号已存在"); + } + + // 检查身份证号唯一性 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(CcdiEmployee::getIdCard, addDTO.getIdCard()); + if (employeeMapper.selectCount(wrapper) > 0) { + throw new RuntimeException("该身份证号已存在"); + } + } else { + // 导入场景:如果柜员号不存在,才检查身份证号唯一性 + if (!existingIds.contains(addDTO.getEmployeeId())) { + // 检查身份证号唯一性 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(CcdiEmployee::getIdCard, addDTO.getIdCard()); + if (employeeMapper.selectCount(wrapper) > 0) { + throw new RuntimeException("该身份证号已存在"); + } + } + } + + // 验证状态 + if (!"0".equals(addDTO.getStatus()) && !"1".equals(addDTO.getStatus())) { + throw new RuntimeException("状态只能填写'在职'或'离职'"); + } + } +} diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiEmployeeServiceImpl.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiEmployeeServiceImpl.java index 2c9536b..47348a5 100644 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiEmployeeServiceImpl.java +++ b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiEmployeeServiceImpl.java @@ -1,6 +1,5 @@ package com.ruoyi.ccdi.service.impl; -import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.ccdi.domain.CcdiEmployee; @@ -9,13 +8,10 @@ import com.ruoyi.ccdi.domain.dto.CcdiEmployeeEditDTO; import com.ruoyi.ccdi.domain.dto.CcdiEmployeeQueryDTO; import com.ruoyi.ccdi.domain.excel.CcdiEmployeeExcel; import com.ruoyi.ccdi.domain.vo.CcdiEmployeeVO; -import com.ruoyi.ccdi.domain.vo.ImportFailureVO; -import com.ruoyi.ccdi.domain.vo.ImportResultVO; -import com.ruoyi.ccdi.domain.vo.ImportStatusVO; import com.ruoyi.ccdi.enums.EmployeeStatus; import com.ruoyi.ccdi.mapper.CcdiEmployeeMapper; +import com.ruoyi.ccdi.service.ICcdiEmployeeImportService; import com.ruoyi.ccdi.service.ICcdiEmployeeService; -import com.ruoyi.common.utils.IdCardUtil; import com.ruoyi.common.utils.StringUtils; import jakarta.annotation.Resource; import org.springframework.beans.BeanUtils; @@ -24,10 +20,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; /** * 员工信息 服务层处理 @@ -41,11 +34,12 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService { @Resource private CcdiEmployeeMapper employeeMapper; - @Resource - private RedisTemplate redisTemplate; @Resource - private Executor importExecutor; + private ICcdiEmployeeImportService importAsyncService; + + @Resource + private RedisTemplate redisTemplate; /** * 查询员工列表 @@ -190,54 +184,6 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService { @Override @Transactional public String importEmployee(List excelList, Boolean isUpdateSupport) { - if (StringUtils.isNull(excelList) || excelList.isEmpty()) { - return "至少需要一条数据"; - } - - int successNum = 0; - int failureNum = 0; - StringBuilder successMsg = new StringBuilder(); - StringBuilder failureMsg = new StringBuilder(); - - for (CcdiEmployeeExcel excel : excelList) { - try { - // 转换为AddDTO - CcdiEmployeeAddDTO addDTO = new CcdiEmployeeAddDTO(); - BeanUtils.copyProperties(excel, addDTO); - - // 验证数据 - validateEmployeeData(addDTO, isUpdateSupport, null); - - CcdiEmployee employee = new CcdiEmployee(); - BeanUtils.copyProperties(addDTO, employee); - - employeeMapper.insert(employee); - successNum++; - successMsg.append("
").append(successNum).append("、").append(addDTO.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 excelList Excel数据列表 - * @param isUpdateSupport 是否更新已存在的数据 - */ - @Override - public void importEmployeeAsync(List excelList, Boolean isUpdateSupport) { String taskId = UUID.randomUUID().toString(); long startTime = System.currentTimeMillis(); @@ -256,75 +202,12 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService { redisTemplate.opsForHash().putAll(statusKey, statusData); redisTemplate.expire(statusKey, 7, TimeUnit.DAYS); - // 在独立线程中异步执行导入,立即返回 - CompletableFuture.runAsync(() -> { - try { - // 在后台线程中执行导入 - ImportResult result = doImport(excelList, isUpdateSupport, taskId); + importAsyncService.importEmployeeAsync(excelList, isUpdateSupport, taskId); - // 更新最终状态 - String finalStatus = result.getFailureCount() == 0 ? "SUCCESS" : "PARTIAL_SUCCESS"; - updateImportStatus(taskId, finalStatus, result, startTime); - - } catch (Exception e) { - // 处理异常 - Map errorData = new HashMap<>(); - errorData.put("status", "FAILED"); - errorData.put("message", "导入失败: " + e.getMessage()); - errorData.put("endTime", System.currentTimeMillis()); - redisTemplate.opsForHash().putAll(statusKey, errorData); - } - }, importExecutor); + return taskId; } - /** - * 查询导入状态 - * - * @param taskId 任务ID - * @return 导入状态信息 - */ - @Override - public ImportStatusVO getImportStatus(String taskId) { - String key = "import:employee:" + taskId; - Boolean hasKey = redisTemplate.hasKey(key); - if (Boolean.FALSE.equals(hasKey)) { - throw new RuntimeException("任务不存在或已过期"); - } - - Map statusMap = redisTemplate.opsForHash().entries(key); - - ImportStatusVO statusVO = new ImportStatusVO(); - statusVO.setTaskId((String) statusMap.get("taskId")); - statusVO.setStatus((String) statusMap.get("status")); - statusVO.setTotalCount((Integer) statusMap.get("totalCount")); - statusVO.setSuccessCount((Integer) statusMap.get("successCount")); - statusVO.setFailureCount((Integer) statusMap.get("failureCount")); - statusVO.setProgress((Integer) statusMap.get("progress")); - statusVO.setStartTime((Long) statusMap.get("startTime")); - statusVO.setEndTime((Long) statusMap.get("endTime")); - statusVO.setMessage((String) statusMap.get("message")); - - return statusVO; - } - - /** - * 获取导入失败记录 - * - * @param taskId 任务ID - * @return 失败记录列表 - */ - @Override - public List getImportFailures(String taskId) { - String key = "import:employee:" + taskId + ":failures"; - Object failuresObj = redisTemplate.opsForValue().get(key); - - if (failuresObj == null) { - return Collections.emptyList(); - } - - return JSON.parseArray(JSON.toJSONString(failuresObj), ImportFailureVO.class); - } /** * 构建查询条件 @@ -340,75 +223,12 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService { return wrapper; } - /** - * 验证员工数据 - * - * @param addDTO 新增DTO - * @param isUpdateSupport 是否支持更新 - * @param existingIds 已存在的员工ID集合(导入场景使用,传null表示单条新增) - */ - private void validateEmployeeData(CcdiEmployeeAddDTO addDTO, Boolean isUpdateSupport, Set existingIds) { - // 验证必填字段 - if (StringUtils.isEmpty(addDTO.getName())) { - throw new RuntimeException("姓名不能为空"); - } - if (addDTO.getEmployeeId() == null) { - throw new RuntimeException("柜员号不能为空"); - } - if (addDTO.getDeptId() == null) { - throw new RuntimeException("所属部门不能为空"); - } - if (StringUtils.isEmpty(addDTO.getIdCard())) { - throw new RuntimeException("身份证号不能为空"); - } - if (StringUtils.isEmpty(addDTO.getPhone())) { - throw new RuntimeException("电话不能为空"); - } - if (StringUtils.isEmpty(addDTO.getStatus())) { - throw new RuntimeException("状态不能为空"); - } - // 验证身份证号格式 - String idCardError = IdCardUtil.getErrorMessage(addDTO.getIdCard()); - if (idCardError != null) { - throw new RuntimeException(idCardError); - } - - // 单条新增场景:检查柜员号和身份证号唯一性 - if (existingIds == null) { - // 检查柜员号(employeeId)唯一性 - if (employeeMapper.selectById(addDTO.getEmployeeId()) != null) { - throw new RuntimeException("该柜员号已存在"); - } - - // 检查身份证号唯一性 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(CcdiEmployee::getIdCard, addDTO.getIdCard()); - if (employeeMapper.selectCount(wrapper) > 0) { - throw new RuntimeException("该身份证号已存在"); - } - } else { - // 导入场景:如果柜员号不存在,才检查身份证号唯一性 - if (!existingIds.contains(addDTO.getEmployeeId())) { - // 检查身份证号唯一性 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(CcdiEmployee::getIdCard, addDTO.getIdCard()); - if (employeeMapper.selectCount(wrapper) > 0) { - throw new RuntimeException("该身份证号已存在"); - } - } - } - - // 验证状态 - if (!"0".equals(addDTO.getStatus()) && !"1".equals(addDTO.getStatus())) { - throw new RuntimeException("状态只能填写'在职'或'离职'"); - } - } /** * 转换为VO对象 */ - private CcdiEmployeeVO convertToVO(CcdiEmployee employee) { + public CcdiEmployeeVO convertToVO(CcdiEmployee employee) { if (employee == null) { return null; } @@ -419,177 +239,11 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService { return vo; } - /** - * 执行导入逻辑 - */ - @Transactional - private ImportResult doImport(List excelList, Boolean isUpdateSupport, String taskId) { - List newRecords = new ArrayList<>(); - List updateRecords = new ArrayList<>(); - List failures = new ArrayList<>(); - // 批量查询已存在的柜员号 - Set existingIds = getExistingEmployeeIds(excelList); - // 分类数据 - for (int i = 0; i < excelList.size(); i++) { - CcdiEmployeeExcel excel = excelList.get(i); - try { - // 转换为AddDTO进行验证 - CcdiEmployeeAddDTO addDTO = new CcdiEmployeeAddDTO(); - BeanUtils.copyProperties(excel, addDTO); - // 验证数据(支持更新模式) - validateEmployeeData(addDTO, isUpdateSupport, existingIds); - CcdiEmployee employee = convertToEntity(excel); - if (existingIds.contains(excel.getEmployeeId())) { - if (isUpdateSupport) { - updateRecords.add(employee); - } else { - throw new RuntimeException("柜员号已存在且未启用更新支持"); - } - } else { - newRecords.add(employee); - } - // 更新进度 - int progress = (int) ((i + 1) * 100.0 / excelList.size()); - updateImportProgress(taskId, progress); - - } catch (Exception e) { - ImportFailureVO failure = new ImportFailureVO(); - BeanUtils.copyProperties(excel, failure); - failure.setErrorMessage(e.getMessage()); - failures.add(failure); - } - } - - // 批量插入新数据 - if (!newRecords.isEmpty()) { - saveBatch(newRecords, 500); - } - - // 批量更新已有数据 - if (!updateRecords.isEmpty() && isUpdateSupport) { - employeeMapper.insertOrUpdateBatch(updateRecords); - } - - // 保存失败记录到Redis - if (!failures.isEmpty()) { - String failuresKey = "import:employee:" + taskId + ":failures"; - redisTemplate.opsForValue().set(failuresKey, failures, 7, TimeUnit.DAYS); - } - - ImportResult result = new ImportResult(); - result.setTotalCount(excelList.size()); - result.setSuccessCount(newRecords.size() + updateRecords.size()); - result.setFailureCount(failures.size()); - - return result; - } - - /** - * 批量查询已存在的员工ID - */ - private Set getExistingEmployeeIds(List excelList) { - List employeeIds = excelList.stream() - .map(CcdiEmployeeExcel::getEmployeeId) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - - if (employeeIds.isEmpty()) { - return Collections.emptySet(); - } - - List existingEmployees = employeeMapper.selectBatchIds(employeeIds); - return existingEmployees.stream() - .map(CcdiEmployee::getEmployeeId) - .collect(Collectors.toSet()); - } - - /** - * 转换为实体对象 - */ - private CcdiEmployee convertToEntity(CcdiEmployeeExcel excel) { - CcdiEmployee employee = new CcdiEmployee(); - BeanUtils.copyProperties(excel, employee); - return employee; - } - - /** - * 批量保存 - */ - private void saveBatch(List list, int batchSize) { - // 使用真正的批量插入,分批次执行以提高性能 - for (int i = 0; i < list.size(); i += batchSize) { - int end = Math.min(i + batchSize, list.size()); - List subList = list.subList(i, end); - employeeMapper.insertBatch(subList); - } - } - - /** - * 更新导入进度 - */ - private void updateImportProgress(String taskId, Integer progress) { - String key = "import:employee:" + taskId; - redisTemplate.opsForHash().put(key, "progress", progress); - } - - /** - * 更新导入状态 - */ - private void updateImportStatus(String taskId, String status, ImportResult result, Long startTime) { - String key = "import:employee:" + taskId; - Map statusData = new HashMap<>(); - statusData.put("status", status); - statusData.put("successCount", result.getSuccessCount()); - statusData.put("failureCount", result.getFailureCount()); - statusData.put("progress", 100); - statusData.put("endTime", System.currentTimeMillis()); - - if ("SUCCESS".equals(status)) { - statusData.put("message", "全部成功!共导入" + result.getTotalCount() + "条数据"); - } else { - statusData.put("message", "成功" + result.getSuccessCount() + "条,失败" + result.getFailureCount() + "条"); - } - - redisTemplate.opsForHash().putAll(key, statusData); - } - - /** - * 导入结果内部类 - */ - private static class ImportResult { - private Integer totalCount; - private Integer successCount; - private Integer failureCount; - - public Integer getTotalCount() { - return totalCount; - } - - public void setTotalCount(Integer totalCount) { - this.totalCount = totalCount; - } - - public Integer getSuccessCount() { - return successCount; - } - - public void setSuccessCount(Integer successCount) { - this.successCount = successCount; - } - - public Integer getFailureCount() { - return failureCount; - } - - public void setFailureCount(Integer failureCount) { - this.failureCount = failureCount; - } - } } diff --git a/ruoyi-ccdi/src/main/resources/mapper/ccdi/CcdiEmployeeMapper.xml b/ruoyi-ccdi/src/main/resources/mapper/ccdi/CcdiEmployeeMapper.xml index ce31d9f..a3d9917 100644 --- a/ruoyi-ccdi/src/main/resources/mapper/ccdi/CcdiEmployeeMapper.xml +++ b/ruoyi-ccdi/src/main/resources/mapper/ccdi/CcdiEmployeeMapper.xml @@ -44,7 +44,7 @@ ORDER BY e.create_time DESC - + INSERT INTO ccdi_employee (employee_id, name, dept_id, id_card, phone, hire_date, status, @@ -56,13 +56,12 @@ #{item.createBy}, #{item.updateBy}, NOW()) ON DUPLICATE KEY UPDATE - name = VALUES(name), - dept_id = VALUES(dept_id), - id_card = VALUES(id_card), - phone = VALUES(phone), - hire_date = VALUES(hire_date), - status = VALUES(status), - update_by = VALUES(update_by), + name = COALESCE(VALUES(name), name), + dept_id = COALESCE(VALUES(dept_id), dept_id), + phone = COALESCE(VALUES(phone), phone), + hire_date = COALESCE(VALUES(hire_date), hire_date), + status = COALESCE(VALUES(status), status), + update_by = COALESCE(VALUES(update_by), update_by), update_time = NOW()