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 | 193 ++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 170 insertions(+), 23 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 69e0638..841247a 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
@@ -1,23 +1,24 @@
package com.ruoyi.staff.service.impl;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
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.StaffJoinLeaveRecordMapper;
import com.ruoyi.staff.mapper.StaffLeaveMapper;
import com.ruoyi.staff.mapper.StaffOnJobMapper;
import com.ruoyi.staff.pojo.StaffContract;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
import com.ruoyi.staff.pojo.StaffLeave;
import com.ruoyi.staff.pojo.StaffOnJob;
import com.ruoyi.staff.service.IStaffOnJobService;
@@ -26,8 +27,10 @@
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
+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;
@@ -37,20 +40,23 @@
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.*;
-
-import static com.ruoyi.common.enums.StaffJoinLeaveRecordDimissionReason.StaffJoinLeaveRecordDimissionReasonOther;
+import java.util.function.Function;
+import java.util.stream.Collectors;
@AllArgsConstructor
@Service
public class StaffOnJobServiceImpl extends ServiceImpl<StaffOnJobMapper, StaffOnJob> implements IStaffOnJobService {
-
+ @Autowired
private StaffOnJobMapper staffOnJobMapper;
-
+ @Autowired
private SysPostMapper sysPostMapper;
+ @Autowired
+ private SysDeptMapper sysDeptMapper;
- private StaffJoinLeaveRecordMapper staffJoinLeaveRecordMapper;
+ @Autowired
private StaffContractMapper staffContractMapper;
+ @Autowired
private StaffLeaveMapper staffLeaveMapper;
@@ -71,6 +77,8 @@
throw new BaseException("缂栧彿涓�"+staffOnJobPrams.getStaffNo()+"鐨勫憳宸ュ凡缁忓瓨鍦�,鏃犳硶鏂板!!!");
}
// 鍒涘缓鍏ヨ亴鏁版嵁
+ staffOnJobPrams.setContractExpireTime(staffOnJobPrams.getContractEndTime());
+ staffOnJobPrams.setStaffState(1);
staffOnJobMapper.insert(staffOnJobPrams);
// 鍒涘缓鍚堝悓璁板綍
@@ -92,20 +100,21 @@
throw new BaseException("缂栧彿涓�"+staffOnJobParams.getStaffNo()+"鐨勫憳宸ヤ笉瀛樺湪,鏃犳硶鏇存柊!!!");
}
- // 鏇存柊鍛樺伐鏁版嵁
- String[] ignoreProperties = {"id"};//鎺掗櫎id灞炴��
- BeanUtils.copyProperties(staffOnJobParams,job,ignoreProperties);
- staffOnJobMapper.updateById(job);
+ String[] ignoreProperties = {"id"};//鎺掗櫎鏇存柊灞炴��
// 鑾峰彇鏈�鏂板悎鍚屾暟鎹紝骞朵笖鏇存柊
StaffContract contract = staffContractMapper.selectOne(Wrappers.<StaffContract>lambdaQuery()
.eq(StaffContract::getStaffOnJobId, id)
+ .last("limit 1")
.orderByDesc(StaffContract::getId));
if (contract != null){
BeanUtils.copyProperties(staffOnJobParams,contract,ignoreProperties);
- return staffContractMapper.updateById(contract);
+ staffContractMapper.updateById(contract);
}
- return 0;
+
+ // 鏇存柊鍛樺伐鏁版嵁
+ staffOnJobParams.setContractExpireTime(staffOnJobParams.getContractEndTime());
+ return staffOnJobMapper.updateById(staffOnJobParams);
}
//鍒犻櫎鍏ヨ亴
@@ -120,19 +129,52 @@
return staffContractMapper.delete(Wrappers.<StaffContract>lambdaQuery().in(StaffContract::getStaffOnJobId, ids));
}
+ // 缁鍚堝悓
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public int renewContract(Long id, StaffContract staffContract) {
+ // 鍒ゆ柇瀵硅薄鏄惁瀛樺湪
+ StaffOnJob job = staffOnJobMapper.selectById(id);
+ if (job == null){
+ throw new BaseException("璇ュ憳宸ヤ笉瀛樺湪,鏃犳硶鏇存柊!!!");
+ }
+
+ // 澧炲姞鍚堝悓
+ StaffContract newStaffContract = new StaffContract();
+ newStaffContract.setStaffOnJobId(id);
+ newStaffContract.setContractTerm(staffContract.getContractTerm());
+ newStaffContract.setContractStartTime(staffContract.getContractStartTime());
+ newStaffContract.setContractEndTime(staffContract.getContractEndTime());
+ staffContractMapper.insert(newStaffContract);
+
+ // 鏇存柊鍛樺伐鍚堝悓杩囨湡鏃堕棿
+ job.setContractExpireTime(staffContract.getContractEndTime());
+ staffOnJobMapper.updateById(job);
+ return 0;
+ }
+
//鍦ㄨ亴鍛樺伐璇︽儏
@Override
public StaffOnJobDto staffOnJobDetail(Long id) {
StaffOnJob staffOnJob = staffOnJobMapper.selectById(id);
+ if (staffOnJob == null) {
+ throw new IllegalArgumentException("璇ュ憳宸ヤ笉瀛樺湪");
+ }
+
StaffOnJobDto staffOnJobDto = new StaffOnJobDto();
BeanUtils.copyProperties(staffOnJob, staffOnJobDto);
// 鏌ヨ宀椾綅鍚嶇О
- SysPost post = sysPostMapper.selectPostById((long) staffOnJob.getSysPostId());
- staffOnJobDto.setPostName(post.getPostName());
+ if (staffOnJob.getSysPostId() != null) {
+ SysPost post = sysPostMapper.selectPostById(staffOnJob.getSysPostId().longValue());
+ if (post != null) {
+ staffOnJobDto.setPostName(post.getPostName());
+ }
+ }
// 鏌ヨ鍚堝悓淇℃伅
StaffContract contract = staffContractMapper.selectOne(Wrappers.<StaffContract>lambdaQuery()
.eq(StaffContract::getStaffOnJobId, staffOnJob.getId())
+ .last("limit 1")
.orderByDesc(StaffContract::getId));
if (contract != null){
staffOnJobDto.setContractTerm(contract.getContractTerm());
@@ -151,22 +193,127 @@
}
@Override
- public List<StaffJoinLeaveRecord> staffOnJobList() {
- return staffJoinLeaveRecordMapper.staffOnJobList();
+ public List<StaffOnJobDto> staffOnJobList(StaffOnJob staffOnJob) {
+ return staffOnJobMapper.staffOnJobList(staffOnJob);
}
@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