package com.ruoyi.staff.service.impl; 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.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 lombok.AllArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; import java.util.*; import java.util.function.Function; @Service @AllArgsConstructor @Transactional(rollbackFor = Exception.class) public class StaffJoinLeaveRecordServiceImpl extends ServiceImpl implements IStaffJoinLeaveRecordService { private StaffJoinLeaveRecordMapper staffJoinLeaveRecordMapper; private StaffOnJobMapper staffOnJobMapper; //分页查询 @Override public IPage staffJoinLeaveRecordListPage(Page page, StaffJoinLeaveRecord staffJoinLeaveRecord) { return staffJoinLeaveRecordMapper.staffJoinLeaveRecordListPage(page,staffJoinLeaveRecord); } //导出 @Override public void staffJoinLeaveRecordExport(HttpServletResponse response, StaffJoinLeaveRecord staffJoinLeaveRecord) { List staffJoinLeaveRecords =staffJoinLeaveRecordMapper.staffJoinLeaveRecordList(staffJoinLeaveRecord); ExcelUtil util = new ExcelUtil(StaffJoinLeaveRecord.class); util.exportExcel(response, staffJoinLeaveRecords, staffJoinLeaveRecord.getStaffState()==0?"员工离职":"员工入职"+"导出"); } //新增入职/离职 @Override public int add(StaffJoinLeaveRecord staffJoinLeaveRecord) { String[] ignoreProperties = {"id"};//排除id属性 List staffOnJobs = staffOnJobMapper.selectList(Wrappers.lambdaQuery().eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo())); if (staffJoinLeaveRecord.getStaffState()==1){ /*入职*/ //(根据员工编号判断是否已经新增到在职表里面,如果已经有就更新,没有就新增) if (staffOnJobs.size()>0){ StaffOnJob staffOnJob = staffOnJobs.get(0); //先比较到期日期,这里选用到期日期最久的 if (staffJoinLeaveRecord.getContractEndTime().compareTo(staffOnJob.getContractExpireTime())>0) { BeanUtils.copyProperties(staffJoinLeaveRecord,staffOnJob,ignoreProperties); staffOnJobMapper.updateById(staffOnJob); } }else { StaffOnJob staffOnJob = new StaffOnJob(); BeanUtils.copyProperties(staffJoinLeaveRecord,staffOnJob,ignoreProperties); staffOnJob.setContractExpireTime(staffJoinLeaveRecord.getContractEndTime()); staffOnJobMapper.insert(staffOnJob); } }else { /*离职*/ //根据员工编号找到对应的数据将状态变更 if (staffOnJobs.size()>0){ StaffOnJob staffOnJob = staffOnJobs.get(0); staffOnJob.setStaffState(staffJoinLeaveRecord.getStaffState()); staffOnJobMapper.updateById(staffOnJob); }else { throw new BaseException("没有找到"+staffJoinLeaveRecord.getStaffNo()+"编号的员工,无法新增离职!!!"); } } return staffJoinLeaveRecordMapper.insert(staffJoinLeaveRecord); } //删除入职/离职 @Override public int delStaffJoinLeaveRecord(List ids) { List staffJoinLeaveRecords = staffJoinLeaveRecordMapper.selectBatchIds(ids); for (StaffJoinLeaveRecord staffJoinLeaveRecord : staffJoinLeaveRecords) { //先判断是入职还是离职 if (staffJoinLeaveRecord.getStaffState()==1){ /*入职*/ //如果是入职,需要先根据员工编号判断该员工是否还有其他入职信息 List joinLeaveRecords = staffJoinLeaveRecordMapper.selectList(Wrappers.lambdaQuery() .eq(StaffJoinLeaveRecord::getStaffState, 1) .eq(StaffJoinLeaveRecord::getStaffNo, staffJoinLeaveRecord.getStaffNo()) .ne(StaffJoinLeaveRecord::getId, staffJoinLeaveRecord.getId())); if (joinLeaveRecords.size()>0){ //还需要判断该员工是否有离职信息 List leaveRecords = staffJoinLeaveRecordMapper.selectList(Wrappers.lambdaQuery() .eq(StaffJoinLeaveRecord::getStaffState, 0) .eq(StaffJoinLeaveRecord::getStaffNo, staffJoinLeaveRecord.getStaffNo())); // 如果有那在职表仅做更新不删除,如果没有其他入职信息,那么在职表需同步删除 if (leaveRecords.size()>0){ //如果有离职信息,判断离职数量和入职数量毕竟,如果入职数量大于离职 if (joinLeaveRecords.size()>leaveRecords.size()){ //该员工就还是在职 //先比较到期日期,这里选用到期日期最久的 Optional max = joinLeaveRecords.stream().max(Comparator.comparing(StaffJoinLeaveRecord::getContractEndTime)); staffOnJobMapper.update(null,Wrappers.lambdaUpdate() .eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo()) .set(StaffOnJob::getContractTerm, max.get().getContractTerm()) .set(StaffOnJob::getContractExpireTime, max.get().getContractEndTime())); }else { //该员工属于离职 staffOnJobMapper.update(null,Wrappers.lambdaUpdate() .eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo()) .set(StaffOnJob::getStaffState, 0)); } }else { //如果没有离职信息那么就比较到期日期,这里选用到期日期最久的 Optional max = joinLeaveRecords.stream().max(Comparator.comparing(StaffJoinLeaveRecord::getContractEndTime)); staffOnJobMapper.update(null,Wrappers.lambdaUpdate() .eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo()) .set(StaffOnJob::getContractTerm, max.get().getContractTerm()) .set(StaffOnJob::getContractExpireTime, max.get().getContractEndTime())); } }else { staffOnJobMapper.delete(Wrappers.lambdaQuery().eq(StaffOnJob::getStaffNo,staffJoinLeaveRecord.getStaffNo())); } }else { /*离职*/ //先查询在职表是否有这个,如果有,就将该员工的状态变更为在职 List staffOnJobs = staffOnJobMapper.selectList(Wrappers.lambdaQuery().eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo())); if (staffOnJobs.size()>0){ StaffOnJob staffOnJob = staffOnJobs.get(0); staffOnJob.setStaffState(1); staffOnJobMapper.updateById(staffOnJob); }else { throw new BaseException("没有找到"+staffJoinLeaveRecord.getStaffNo()+"编号的员工,请检查是否有脏数据!!!"); } } staffJoinLeaveRecordMapper.deleteById(staffJoinLeaveRecord); } return 0; } //修改入职/离职 @Override public int updateStaffJoinLeaveRecord(StaffJoinLeaveRecord staffJoinLeaveRecord) { String[] ignoreProperties = {"id"};//排除id属性 List staffOnJobs = staffOnJobMapper.selectList(Wrappers.lambdaQuery().eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo())); if (staffJoinLeaveRecord.getStaffState()==1){ /*入职*/ StaffOnJob job = staffOnJobMapper.selectList(Wrappers.lambdaQuery() .eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo())).get(0); //如果更改的合同到期时间更久则更新,如果没有就不用更新 if (staffJoinLeaveRecord.getContractEndTime().compareTo(job.getContractExpireTime())>0) { BeanUtils.copyProperties(staffJoinLeaveRecord,job,ignoreProperties); staffOnJobMapper.updateById(job); } }else { /*离职*/ //离职的编辑不会影响在职表 } return staffJoinLeaveRecordMapper.updateById(staffJoinLeaveRecord); } }