3 天以前 2d107e5c57fccb1ae1bfcc8b59389fbd0e2c67a5
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;
@@ -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 {