From 2d107e5c57fccb1ae1bfcc8b59389fbd0e2c67a5 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 29 四月 2026 15:44:02 +0800
Subject: [PATCH] feat(staff): 添加在职员工导入功能
---
src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java | 132 +++++++++++++++++++++++++++++++++++++++++---
1 files changed, 123 insertions(+), 9 deletions(-)
diff --git a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
index a024221..841247a 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
@@ -6,10 +6,14 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.dto.WordDateDto;
+import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.domain.SysPost;
+import com.ruoyi.project.system.mapper.SysDeptMapper;
import com.ruoyi.project.system.mapper.SysPostMapper;
+import com.ruoyi.staff.dto.StaffOnJobImportDto;
import com.ruoyi.staff.dto.StaffOnJobDto;
import com.ruoyi.staff.mapper.StaffContractMapper;
import com.ruoyi.staff.mapper.StaffLeaveMapper;
@@ -26,6 +30,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
@@ -35,6 +40,8 @@
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
@AllArgsConstructor
@Service
@@ -44,6 +51,8 @@
private StaffOnJobMapper staffOnJobMapper;
@Autowired
private SysPostMapper sysPostMapper;
+ @Autowired
+ private SysDeptMapper sysDeptMapper;
@Autowired
private StaffContractMapper staffContractMapper;
@@ -69,6 +78,7 @@
}
// 鍒涘缓鍏ヨ亴鏁版嵁
staffOnJobPrams.setContractExpireTime(staffOnJobPrams.getContractEndTime());
+ staffOnJobPrams.setStaffState(1);
staffOnJobMapper.insert(staffOnJobPrams);
// 鍒涘缓鍚堝悓璁板綍
@@ -90,7 +100,7 @@
throw new BaseException("缂栧彿涓�"+staffOnJobParams.getStaffNo()+"鐨勫憳宸ヤ笉瀛樺湪,鏃犳硶鏇存柊!!!");
}
- String[] ignoreProperties = {"id"};//鎺掗櫎id灞炴��
+ String[] ignoreProperties = {"id"};//鎺掗櫎鏇存柊灞炴��
// 鑾峰彇鏈�鏂板悎鍚屾暟鎹紝骞朵笖鏇存柊
StaffContract contract = staffContractMapper.selectOne(Wrappers.<StaffContract>lambdaQuery()
@@ -103,9 +113,8 @@
}
// 鏇存柊鍛樺伐鏁版嵁
- BeanUtils.copyProperties(staffOnJobParams,job,ignoreProperties);
- job.setContractExpireTime(staffOnJobParams.getContractEndTime());
- return staffOnJobMapper.updateById(job);
+ staffOnJobParams.setContractExpireTime(staffOnJobParams.getContractEndTime());
+ return staffOnJobMapper.updateById(staffOnJobParams);
}
//鍒犻櫎鍏ヨ亴
@@ -189,17 +198,122 @@
}
@Override
+ @Transactional(rollbackFor = Exception.class)
public Boolean importData(MultipartFile file) {
try {
- ExcelUtil<StaffOnJob> util = new ExcelUtil<>(StaffOnJob.class);
- List<StaffOnJob> staffOnJobs = util.importExcel(file.getInputStream());
- return saveOrUpdateBatch(staffOnJobs);
+ ExcelUtil<StaffOnJobImportDto> util = new ExcelUtil<>(StaffOnJobImportDto.class);
+ List<StaffOnJobImportDto> staffOnJobs = util.importExcel(file.getInputStream());
+ if (CollectionUtils.isEmpty(staffOnJobs)) {
+ throw new BaseException("妯℃澘閿欒鎴栧鍏ユ暟鎹负绌�");
+ }
+
+ Map<String, SysPost> postMap = buildPostMap();
+ Map<String, SysDept> deptMap = buildDeptMap();
+ Set<String> importedStaffNos = new HashSet<>();
+ for (int i = 0; i < staffOnJobs.size(); i++) {
+ StaffOnJobDto staffOnJobDto = buildImportStaff(staffOnJobs.get(i), i + 2, postMap, deptMap, importedStaffNos);
+ add(staffOnJobDto);
+ }
+ return true;
} catch (Exception e) {
- e.printStackTrace();
- return false;
+ if (e instanceof BaseException) {
+ throw (BaseException) e;
+ }
+ throw new BaseException("瀵煎叆澶辫触锛岃妫�鏌ユā鏉挎牸寮忔槸鍚︽纭�");
}
}
+ private StaffOnJobDto buildImportStaff(StaffOnJobImportDto row, int rowNum, Map<String, SysPost> postMap,
+ Map<String, SysDept> deptMap, Set<String> importedStaffNos) {
+ String staffNo = normalizeValue(row.getStaffNo());
+ String postName = normalizeValue(row.getPostName());
+ String deptName = normalizeValue(row.getDeptName());
+
+ if (StringUtils.isBlank(staffNo)) {
+ throw new BaseException("绗�" + rowNum + "琛屽憳宸ョ紪鍙蜂笉鑳戒负绌�");
+ }
+ if (!importedStaffNos.add(staffNo)) {
+ throw new BaseException("绗�" + rowNum + "琛屽憳宸ョ紪鍙烽噸澶嶏細" + staffNo);
+ }
+ if (StringUtils.isBlank(normalizeValue(row.getStaffName()))) {
+ throw new BaseException("绗�" + rowNum + "琛屽憳宸ュ鍚嶄笉鑳戒负绌�");
+ }
+ if (StringUtils.isBlank(postName)) {
+ throw new BaseException("绗�" + rowNum + "琛屽矖浣嶄笉鑳戒负绌�");
+ }
+ if (StringUtils.isBlank(deptName)) {
+ throw new BaseException("绗�" + rowNum + "琛岄儴闂ㄤ笉鑳戒负绌�");
+ }
+ if (row.getContractStartTime() == null) {
+ throw new BaseException("绗�" + rowNum + "琛屽悎鍚屽紑濮嬫棩鏈熶笉鑳戒负绌�");
+ }
+ if (row.getContractEndTime() == null) {
+ throw new BaseException("绗�" + rowNum + "琛屽悎鍚岀粨鏉熸棩鏈熶笉鑳戒负绌�");
+ }
+
+ SysPost post = postMap.get(postName);
+ if (post == null) {
+ throw new BaseException("绗�" + rowNum + "琛屽矖浣嶄笉瀛樺湪鎴栧凡鍋滅敤锛�" + postName);
+ }
+ SysDept dept = deptMap.get(deptName);
+ if (dept == null) {
+ throw new BaseException("绗�" + rowNum + "琛岄儴闂ㄤ笉瀛樺湪鎴栧凡鍋滅敤锛�" + deptName);
+ }
+
+ StaffOnJobDto staffOnJobDto = new StaffOnJobDto();
+ BeanUtils.copyProperties(row, staffOnJobDto);
+ staffOnJobDto.setStaffNo(staffNo);
+ staffOnJobDto.setStaffName(normalizeValue(row.getStaffName()));
+ staffOnJobDto.setSex(normalizeValue(row.getSex()));
+ staffOnJobDto.setNativePlace(normalizeValue(row.getNativePlace()));
+ staffOnJobDto.setAdress(normalizeValue(row.getAdress()));
+ staffOnJobDto.setFirstStudy(normalizeValue(row.getFirstStudy()));
+ staffOnJobDto.setProfession(normalizeValue(row.getProfession()));
+ staffOnJobDto.setAge(normalizeValue(row.getAge()));
+ staffOnJobDto.setPhone(normalizeValue(row.getPhone()));
+ staffOnJobDto.setEmergencyContact(normalizeValue(row.getEmergencyContact()));
+ staffOnJobDto.setEmergencyContactPhone(normalizeValue(row.getEmergencyContactPhone()));
+ staffOnJobDto.setContractTerm(normalizeValue(row.getContractTerm()));
+ staffOnJobDto.setSysPostId(post.getPostId().intValue());
+ staffOnJobDto.setSysDeptId(dept.getDeptId().intValue());
+ return staffOnJobDto;
+ }
+
+ private Map<String, SysPost> buildPostMap() {
+ SysPost query = new SysPost();
+ query.setStatus("0");
+ return buildUniqueMap(sysPostMapper.selectPostList(query), SysPost::getPostName, "宀椾綅");
+ }
+
+ private Map<String, SysDept> buildDeptMap() {
+ SysDept query = new SysDept();
+ query.setStatus("0");
+ return buildUniqueMap(sysDeptMapper.selectDeptList(query), SysDept::getDeptName, "閮ㄩ棬");
+ }
+
+ private <T> Map<String, T> buildUniqueMap(List<T> dataList, Function<T, String> nameGetter, String fieldName) {
+ Map<String, List<T>> groupedMap = dataList.stream()
+ .filter(Objects::nonNull)
+ .filter(item -> StringUtils.isNotBlank(normalizeValue(nameGetter.apply(item))))
+ .collect(Collectors.groupingBy(item -> normalizeValue(nameGetter.apply(item))));
+
+ List<String> duplicateNames = groupedMap.entrySet().stream()
+ .filter(entry -> entry.getValue().size() > 1)
+ .map(Map.Entry::getKey)
+ .sorted()
+ .collect(Collectors.toList());
+ if (!duplicateNames.isEmpty()) {
+ throw new BaseException("绯荤粺涓瓨鍦ㄩ噸鍚�" + fieldName + "锛屾棤娉曞鍏ワ細" + String.join("銆�", duplicateNames));
+ }
+
+ return groupedMap.entrySet().stream()
+ .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().get(0)));
+ }
+
+ private String normalizeValue(String value) {
+ return value == null ? null : value.trim();
+ }
+
@Override
public String exportCopy(HttpServletResponse response, StaffOnJob staffOnJob) throws Exception {
--
Gitblit v1.9.3