From 9af5090f5d4597fbcfdf53a71189175892d29109 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期四, 05 三月 2026 17:44:35 +0800
Subject: [PATCH] yys 人力资源-员工台账模块优化
---
src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java | 367 +++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 348 insertions(+), 19 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 9fc8c43..8336f90 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
@@ -5,55 +5,303 @@
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.OrderUtils;
+import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper;
-import com.ruoyi.staff.mapper.StaffOnJobMapper;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
-import com.ruoyi.staff.pojo.StaffOnJob;
-import com.ruoyi.staff.service.IStaffJoinLeaveRecordService;
+import com.ruoyi.dto.WordDateDto;
+import com.ruoyi.project.system.domain.SysPost;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysPostMapper;
+import com.ruoyi.project.system.mapper.SysUserMapper;
+import com.ruoyi.project.system.service.impl.SysUserServiceImpl;
+import com.ruoyi.staff.dto.StaffOnJobDto;
+import com.ruoyi.staff.mapper.*;
+import com.ruoyi.staff.pojo.*;
import com.ruoyi.staff.service.IStaffOnJobService;
+import freemarker.template.Configuration;
+import freemarker.template.Template;
import lombok.AllArgsConstructor;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.ListUtils;
+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.web.multipart.MultipartFile;
-import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
-import java.util.List;
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.stream.Collectors;
@AllArgsConstructor
@Service
public class StaffOnJobServiceImpl extends ServiceImpl<StaffOnJobMapper, StaffOnJob> implements IStaffOnJobService {
-
+ @Autowired
private StaffOnJobMapper staffOnJobMapper;
+ @Autowired
+ private SysPostMapper sysPostMapper;
- private StaffJoinLeaveRecordMapper staffJoinLeaveRecordMapper;
+ @Autowired
+ private StaffContractMapper staffContractMapper;
+ @Autowired
+ private StaffLeaveMapper staffLeaveMapper;
+
+ @Autowired
+ private SysUserServiceImpl sysUserService;
+
+ @Autowired
+ private SysUserMapper sysUserMapper;
+
+ @Autowired
+ private StaffEducationServiceImpl staffEducationService;
+
+ @Autowired
+ private StaffEducationMapper staffEducationMapper;
+
+ @Autowired
+ private StaffWorkExperienceMapper staffWorkExperienceMapper;
+
+ @Autowired
+ private StaffWorkExperienceServiceImpl staffWorkExperienceServiceImpl;
+
+ @Autowired
+ private StaffEmergencyContactMapper staffEmergencyContactMapper;
+
+ @Autowired
+ private StaffEmergencyContactServiceImpl staffEmergencyContactServiceImpl;
+
//鍦ㄨ亴鍛樺伐鍙拌处鍒嗛〉鏌ヨ
@Override
- public IPage<StaffOnJob> staffOnJobListPage(Page page, StaffOnJob staffOnJob) {
+ public IPage<StaffOnJobDto> staffOnJobListPage(Page page, StaffOnJob staffOnJob) {
return staffOnJobMapper.staffOnJobListPage(page,staffOnJob);
+ }
+
+ //鏂板鍏ヨ亴
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public int add(StaffOnJobDto staffOnJobPrams) {
+ String[] ignoreProperties = {"id"};//鎺掗櫎id灞炴��
+ // 鍒ゆ柇缂栧彿鏄惁瀛樺湪
+ List<StaffOnJob> staffOnJobs = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery().eq(StaffOnJob::getStaffNo, staffOnJobPrams.getStaffNo()));
+ if (staffOnJobs != null && !staffOnJobs.isEmpty()){
+ throw new BaseException("缂栧彿涓�"+staffOnJobPrams.getStaffNo()+"鐨勫憳宸ュ凡缁忓瓨鍦�,鏃犳硶鏂板!!!");
+ }
+
+ // 鍒涘缓鍏ヨ亴鏁版嵁
+ staffOnJobPrams.setContractExpireTime(staffOnJobPrams.getContractEndTime());
+ staffOnJobPrams.setStaffState(1);
+ staffOnJobMapper.insert(staffOnJobPrams);
+ // 鏌ヨ鐢ㄦ埛鏄惁宸茬粡鏂板
+ SysUser sysUser = sysUserService.selectUserById(staffOnJobPrams.getId());
+ if(sysUser == null){
+ SysUser sysUser1 = new SysUser();
+ sysUser1.setUserName(staffOnJobPrams.getStaffNo());
+ sysUser1.setNickName(staffOnJobPrams.getStaffName());
+ String s = SecurityUtils.encryptPassword("123456");
+ sysUser1.setPassword(s);
+ if(staffOnJobPrams.getSysPostId() != null){
+ Long[] posts = new Long[]{staffOnJobPrams.getSysPostId().longValue()};
+ sysUser1.setPostIds(posts);
+ }
+ sysUser1.setRoleIds(new Long[]{staffOnJobPrams.getRoleId()});
+ sysUser1.setDeptIds(new Long[]{staffOnJobPrams.getSysDeptId()});
+ sysUser1.setStatus("0");
+ sysUserService.insertUser(sysUser1);
+ }
+ // 缁戝畾瀛愯〃鏁版嵁
+ bingingStaffOnJobExtra(staffOnJobPrams.getId(),staffOnJobPrams);
+ // 鍒涘缓鍚堝悓璁板綍
+ StaffContract staffContract = new StaffContract();
+ staffContract.setStaffOnJobId(staffOnJobPrams.getId());
+ staffContract.setContractTerm(staffOnJobPrams.getContractTerm());
+ staffContract.setContractStartTime(staffOnJobPrams.getContractStartTime());
+ staffContract.setContractEndTime(staffOnJobPrams.getContractEndTime());
+ return staffContractMapper.insert(staffContract);
+ }
+
+ //鏇存柊鍏ヨ亴淇℃伅
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public int update(Long id, StaffOnJobDto staffOnJobParams) {
+ // 鍒ゆ柇瀵硅薄鏄惁瀛樺湪
+ StaffOnJob job = staffOnJobMapper.selectById(id);
+ if (job == null){
+ throw new BaseException("缂栧彿涓�"+staffOnJobParams.getStaffNo()+"鐨勫憳宸ヤ笉瀛樺湪,鏃犳硶鏇存柊!!!");
+ }
+
+ 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);
+ staffContractMapper.updateById(contract);
+ }
+
+ // 鍒犻櫎鎵�鏈夊瓙琛ㄦ暟鎹�
+ delStaffOnJobExtra(Arrays.asList(id));
+ // 缁戝畾瀛愯〃鏁版嵁
+ bingingStaffOnJobExtra(id,staffOnJobParams);
+ // 鏇存柊鍛樺伐鏁版嵁
+ staffOnJobParams.setContractExpireTime(staffOnJobParams.getContractEndTime());
+ return staffOnJobMapper.updateById(staffOnJobParams);
+ }
+
+ /**
+ * 缁戝畾鍛樺伐瀛愯〃鏁版嵁
+ * @param staffOnJobPrams
+ * @param id
+ */
+ public void bingingStaffOnJobExtra(Long id,StaffOnJob staffOnJobPrams) {
+ // 鏂板鏁欒偛缁忓巻
+ if(CollectionUtils.isNotEmpty(staffOnJobPrams.getStaffEducationList())){
+ staffOnJobPrams.getStaffEducationList().stream()
+ .filter(Objects::nonNull) // 杩囨护null瀵硅薄锛岄伩鍏嶇┖鎸囬拡
+ .forEach(staff -> staff.setStaffOnJobId(id)); // 璧嬪��
+ staffEducationService.saveBatch(staffOnJobPrams.getStaffEducationList());
+ }
+ // 鏂板宸ヤ綔缁忓巻
+ if(CollectionUtils.isNotEmpty(staffOnJobPrams.getStaffWorkExperienceList())){
+ staffOnJobPrams.getStaffWorkExperienceList().stream()
+ .filter(Objects::nonNull) // 杩囨护null瀵硅薄锛岄伩鍏嶇┖鎸囬拡
+ .forEach(staff -> staff.setStaffOnJobId(id)); // 璧嬪��
+ staffWorkExperienceServiceImpl.saveBatch(staffOnJobPrams.getStaffWorkExperienceList());
+ }
+ // 鏂板绱ф�ヨ仈绯讳汉
+ if(CollectionUtils.isNotEmpty(staffOnJobPrams.getStaffEmergencyContactList())){
+ staffOnJobPrams.getStaffEmergencyContactList().stream()
+ .filter(Objects::nonNull) // 杩囨护null瀵硅薄锛岄伩鍏嶇┖鎸囬拡
+ .forEach(staff -> staff.setStaffOnJobId(id)); // 璧嬪��
+ staffEmergencyContactServiceImpl.saveBatch(staffOnJobPrams.getStaffEmergencyContactList());
+ }
+ }
+
+
+ /**
+ * 閫氳繃鍛樺伐id鍒犻櫎鏁欒偛缁忓巻锛屽伐浣滅粡鍘嗭紝绱ф�ヨ仈绯讳汉
+ * @param ids
+ * @return
+ */
+ public void delStaffOnJobExtra(List<Long> ids) {
+ // 鍒犻櫎鏁欒偛缁忓巻
+ staffEducationService.remove(Wrappers.<StaffEducation>lambdaQuery().in(StaffEducation::getStaffOnJobId,ids));
+ // 鍒犻櫎宸ヤ綔缁忓巻
+ staffWorkExperienceServiceImpl.remove(Wrappers.<StaffWorkExperience>lambdaQuery().in(StaffWorkExperience::getStaffOnJobId,ids));
+ // 鍒犻櫎绱ф�ヨ仈绯讳汉
+ staffEmergencyContactServiceImpl.remove(Wrappers.<StaffEmergencyContact>lambdaQuery().in(StaffEmergencyContact::getStaffOnJobId,ids));
+ }
+
+ //鍒犻櫎鍏ヨ亴
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public int delStaffOnJobs(List<Integer> ids) {
+ List<StaffOnJob> staffOnJobs = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery().in(StaffOnJob::getId, ids));
+ if(CollectionUtils.isEmpty(staffOnJobs)){
+ throw new BaseException("璇ュ憳宸ヤ笉瀛樺湪,鏃犳硶鍒犻櫎!!!");
+ }
+ // 鍒犻櫎鍏ヨ亴鏁版嵁
+ staffOnJobMapper.deleteBatchIds(ids);
+ // 鍒犻櫎绂昏亴鏁版嵁
+ staffLeaveMapper.delete(Wrappers.<StaffLeave>lambdaQuery().in(StaffLeave::getStaffOnJobId, ids));
+ // 鍒犻櫎鐢ㄦ埛鏁版嵁
+ List<SysUser> sysUsers = sysUserMapper.selectList(Wrappers.<SysUser>lambdaQuery()
+ .in(SysUser::getUserName, staffOnJobs.stream().map(StaffOnJob::getStaffNo).collect(Collectors.toList())));
+ if(CollectionUtils.isNotEmpty(sysUsers)){
+ Long[] longs = sysUsers.stream().map(SysUser::getUserId).toArray(Long[]::new);
+ sysUserService.deleteUserByIds(longs);
+ }
+ // 鍒犻櫎瀛愯〃鏁版嵁
+ delStaffOnJobExtra(ids.stream().map(Integer::longValue).collect(Collectors.toList()));
+
+ // 鍒犻櫎鍚堝悓鏁版嵁
+ 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 List<StaffJoinLeaveRecord> staffOnJobDetail(String staffNo) {
- return staffJoinLeaveRecordMapper.selectList(Wrappers.<StaffJoinLeaveRecord>lambdaQuery()
- .eq(StaffJoinLeaveRecord::getStaffState,1)
- .eq(StaffJoinLeaveRecord::getStaffNo,staffNo));
+ public StaffOnJobDto staffOnJobDetail(Long id) {
+ StaffOnJob staffOnJob = staffOnJobMapper.selectById(id);
+ if (staffOnJob == null) {
+ throw new IllegalArgumentException("璇ュ憳宸ヤ笉瀛樺湪");
+ }
+
+ StaffOnJobDto staffOnJobDto = new StaffOnJobDto();
+ BeanUtils.copyProperties(staffOnJob, staffOnJobDto);
+ // 鏌ヨ宀椾綅鍚嶇О
+ 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());
+ staffOnJobDto.setContractStartTime(contract.getContractStartTime());
+ staffOnJobDto.setContractEndTime(contract.getContractEndTime());
+ }
+ // 鑾峰彇瀛愯〃鏁版嵁
+ staffOnJobDto.setStaffEducationList(staffEducationMapper.selectList(Wrappers.<StaffEducation>lambdaQuery()
+ .eq(StaffEducation::getStaffOnJobId, staffOnJob.getId())));
+ staffOnJobDto.setStaffWorkExperienceList(staffWorkExperienceMapper.selectList(Wrappers.<StaffWorkExperience>lambdaQuery()
+ .eq(StaffWorkExperience::getStaffOnJobId, staffOnJob.getId())));
+ staffOnJobDto.setStaffEmergencyContactList(staffEmergencyContactMapper.selectList(Wrappers.<StaffEmergencyContact>lambdaQuery()
+ .eq(StaffEmergencyContact::getStaffOnJobId, staffOnJob.getId())));
+ return staffOnJobDto;
}
//鍦ㄨ亴鍛樺伐瀵煎嚭
@Override
public void staffOnJobExport(HttpServletResponse response, StaffOnJob staffOnJob) {
- List<StaffOnJob> staffOnJobs = staffOnJobMapper.staffOnJobList(staffOnJob);
- ExcelUtil<StaffOnJob> util = new ExcelUtil<StaffOnJob>(StaffOnJob.class);
- util.exportExcel(response, staffOnJobs, "鍦ㄨ亴鍛樺伐鍙拌处瀵煎嚭");
+ List<StaffOnJobDto> staffOnJobs = staffOnJobMapper.staffOnJobList(staffOnJob);
+ ExcelUtil<StaffOnJobDto> util = new ExcelUtil<StaffOnJobDto>(StaffOnJobDto.class);
+ util.exportExcel(response, staffOnJobs, "鍛樺伐鍙拌处瀵煎嚭");
}
@Override
- public List<StaffJoinLeaveRecord> staffOnJobList() {
- return staffJoinLeaveRecordMapper.staffOnJobList();
+ public List<StaffOnJobDto> staffOnJobList(StaffOnJob staffOnJob) {
+ return staffOnJobMapper.staffOnJobList(staffOnJob);
}
@Override
@@ -69,4 +317,85 @@
}
+ @Override
+ public String exportCopy(HttpServletResponse response, StaffOnJob staffOnJob) throws Exception {
+ String url = "/javaWork/product-inventory-management/file/prod/" + staffOnJob.getStaffName() + "-鍔冲姩鍚堝悓涔�.docx";
+ Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
+ // 璁剧疆妯℃澘鏂囦欢鎵�鍦ㄧ洰褰曪紙缁濆璺緞锛屼緥濡傦細/templates/锛�
+ cfg.setClassForTemplateLoading(StaffOnJobServiceImpl.class, "/static");
+ cfg.setDefaultEncoding("UTF-8");
+ //2.瀹氫箟闇�瑕佸~鍏呯殑鍙橀噷
+ // 鈶� 鏋勯�犲憳宸ヤ俊鎭紙瀹為檯椤圭洰涓彲浠庢暟鎹簱/Excel璇诲彇锛�
+ WordDateDto staff = new WordDateDto();
+ BeanUtils.copyProperties(staffOnJob, staff);
+ // 閫氳繃鍚堝悓骞撮檺锛屽悎鍚屽埌鏈熸棩鏈熻绠楀悎鍚屽紑濮嬫棩鏈燂紝鍦ㄨ幏鍙栧紑濮嬫棩鏈燂紝缁撴潫鏃ユ湡鐨勫勾鏈堟棩鏁板瓧
+ // 鍚堝悓鍒版湡鏃ユ湡 - 鍚堝悓骞撮檺锛圖ate绫诲瀷锛�
+ // 1. 灏咲ate杞崲涓篒nstant锛堟椂闂存埑锛�
+ Instant instant = staff.getContractExpireTime().toInstant();
+
+ // 涔熷彲浠ユ寚瀹氬叿浣撴椂鍖猴紝渚嬪Asia/Shanghai锛�
+ LocalDate localDate = instant.atZone(ZoneId.of("Asia/Shanghai")).toLocalDate(); // 鍚堝悓缁撴潫鏃堕棿
+ LocalDate localDate1 = localDate.minusYears(Integer.parseInt(staff.getContractTerm()));// 鍚堝悓寮�濮嬫椂闂�
+
+ // 绛捐鏃ユ湡杞崲lcoaldate
+ LocalDate localDate2 = staff.getSignDate().toInstant().atZone(ZoneId.of("Asia/Shanghai")).toLocalDate();
+
+ // 璇曠敤鏃ユ湡杞崲lcoaldate
+ LocalDate localDate3 = staff.getTrialStartDate().toInstant().atZone(ZoneId.of("Asia/Shanghai")).toLocalDate();
+ LocalDate localDate4 = staff.getTrialEndDate().toInstant().atZone(ZoneId.of("Asia/Shanghai")).toLocalDate();
+
+ staff.setQyear(localDate2.getYear() + "");
+ staff.setQmoth(localDate2.getMonthValue() + "");
+ staff.setQday(localDate2.getDayOfMonth() + "");
+ if(staff.getDateSelect().equals("A")){
+ staff.setSyear(localDate1.getYear() + "");
+ staff.setSmoth(localDate1.getMonthValue() + "");
+ staff.setSday(localDate1.getDayOfMonth() + "");
+ staff.setEyear(localDate.getDayOfMonth() + "");
+ staff.setEmoth(localDate.getDayOfMonth() + "");
+ staff.setEday(localDate.getDayOfMonth() + "");
+
+ staff.setStyear(localDate3.getYear() + "");
+ staff.setStmoth(localDate3.getMonthValue() + "");
+ staff.setStday(localDate3.getDayOfMonth() + "");
+ staff.setSeyear(localDate4.getYear() + "");
+ staff.setSemoth(localDate4.getMonthValue() + "");
+ staff.setSeday(localDate4.getDayOfMonth() + "");
+ }else if (staff.getDateSelect().equals("B")){
+
+ staff.setBsyear(localDate1.getYear() + "");
+ staff.setBsmoth(localDate1.getMonthValue() + "");
+ staff.setBsday(localDate1.getDayOfMonth() + "");
+
+ staff.setBstyear(localDate3.getYear() + "");
+ staff.setBstmoth(localDate3.getMonthValue() + "");
+ staff.setBstday(localDate3.getDayOfMonth() + "");
+ staff.setBseyear(localDate4.getYear() + "");
+ staff.setBsemoth(localDate4.getMonthValue() + "");
+ staff.setBseday(localDate4.getDayOfMonth() + "");
+ }else if (staff.getDateSelect().equals("C")){
+ staff.setCsyear(localDate1.getYear() + "");
+ staff.setCsmoth(localDate1.getMonthValue() + "");
+ staff.setCsday(localDate1.getDayOfMonth() + "");
+ }
+
+ Map<String,Object> data = new HashMap<>();
+ data.put("item",staff);
+ //3.鍔犺浇XML 妯℃澘
+ Template template = cfg.getTemplate("鍔冲姩鍚堝悓涔�.xml");
+ //4.鐢熸垚濉厖鍚庣殑 XML 鍐呭
+ StringWriter out = new StringWriter();
+ template.process(data, out);
+ String filledXml = out.toString();
+ //5.灏哫ML鍐呭鍐欏叆浜や欢骞舵敼涓�.docx 鏍煎紡
+ File outputFile = new File(url);
+ try(FileOutputStream fos = new FileOutputStream(outputFile);
+ OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
+ osw.write(filledXml);
+ }
+ return url;
+ }
+
+
+
}
--
Gitblit v1.9.3