package com.ruoyi.inspect.service.impl; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.support.ExcelTypeEnum; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.enums.StaffSkillLevelType; import com.ruoyi.common.utils.excel.EasyExcelUtils; import com.ruoyi.common.utils.excel.FullCustomAutoWidthHandler; import com.ruoyi.common.utils.excel.HeaderContentRowHeightHandler; import com.ruoyi.inspect.dto.StaffCompetencyLevelEvaluateRecordDTO; import com.ruoyi.inspect.mapper.StaffCompetencyInspectItemConfigMapper; import com.ruoyi.inspect.mapper.StaffCompetencyLevelEvaluateRecordMapper; import com.ruoyi.inspect.pojo.StaffCompetencyInspectItemConfig; import com.ruoyi.inspect.pojo.StaffCompetencyLevelEvaluateRecord; import com.ruoyi.inspect.service.StaffCompetencyLevelEvaluateRecordService; import com.ruoyi.inspect.vo.StaffConfigHeaderVO; import com.ruoyi.inspect.vo.TestUserVO; import org.apache.commons.lang3.ObjectUtils; import org.apache.poi.ss.usermodel.IndexedColors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.stream.Collectors; /** * @author 27233 * @description 针对表【staff_competency_level_evaluate_record(人员能力等级评定表)】的数据库操作Service实现 * @createDate 2026-03-26 17:16:56 */ @Service public class StaffCompetencyLevelEvaluateRecordServiceImpl extends ServiceImpl implements StaffCompetencyLevelEvaluateRecordService{ @Autowired private StaffCompetencyInspectItemConfigMapper configMapper; private final static Long roleId = 4L; /** * 查询检测人员列表 * @param record * @return */ private List getTestUserList(StaffCompetencyLevelEvaluateRecordDTO record){ record.setRoleId(roleId); return baseMapper.selectTestUserList(record); } @Override public List> getPageList(StaffCompetencyLevelEvaluateRecordDTO record) { List> hashMaps = new ArrayList<>(); //查询检验项点配置列表,转换为键值对 StaffCompetencyInspectItemConfig itemConfig = new StaffCompetencyInspectItemConfig(); itemConfig.setIsEnable(Boolean.TRUE); List configs = configMapper.selectConfigList(itemConfig); Map configMaps = transformConfigList(configs); //查询检测人员列表 List testUserList = getTestUserList(record); List userIds = testUserList.stream().map(TestUserVO::getUserId).collect(Collectors.toList()); //查询人员能力考评列表 List recordVos = baseMapper.selectList(Wrappers.lambdaQuery().in(!userIds.isEmpty(),StaffCompetencyLevelEvaluateRecord::getUserId,userIds)); if(testUserList.isEmpty())return Collections.emptyList(); testUserList.forEach(u->{ HashMap map = new HashMap<>(); map.put("userName",u.getUserName()); map.put("userId",u.getUserId()); map.put("account",u.getAccount()); map.put("postName",u.getPostName()); List userRecords = recordVos.stream().filter(f -> Objects.equals(f.getUserId(), u.getUserId())).collect(Collectors.toList()); map.putAll(configMaps); if(!userRecords.isEmpty()){ userRecords.forEach(ur->{ map.put(ur.getItemConfigId().toString(),ur); }); } hashMaps.add(map); }); return hashMaps; } @Override public void exportRecords(HttpServletResponse response, StaffCompetencyLevelEvaluateRecordDTO recordDTO) { response.reset(); try { //1.组装数据 List> dataList = new ArrayList<>(); List testUserList = getTestUserList(recordDTO); List userIds = testUserList.stream().map(TestUserVO::getUserId).collect(Collectors.toList()); //查询人员能力考评列表 List recordVos = baseMapper.selectList(Wrappers.lambdaQuery().in(!userIds.isEmpty(),StaffCompetencyLevelEvaluateRecord::getUserId,userIds)); //查询启用的检验项点配置列表 List headerVOS = configMapper.selectConfigHeader(); for (int i = 0; i < testUserList.size(); i++) { TestUserVO u = testUserList.get(i); List rowData = new ArrayList<>(); rowData.add(String.valueOf(i+1)); rowData.add(u.getUserName()); rowData.add(u.getPostName()); //过滤当前人员的能力考评记录 List currentUserRecords = recordVos.stream().filter(f -> ObjectUtils.equals(f.getUserId(), u.getUserId())).collect(Collectors.toList()); headerVOS.forEach(head->{ StaffCompetencyLevelEvaluateRecord record = currentUserRecords.stream().filter(f -> ObjectUtils.equals(f.getItemConfigId(), head.getChildrenId())).findFirst().orElse(null); if(ObjectUtils.isEmpty(record)){ rowData.add(""); }else{ rowData.add(StaffSkillLevelType.getIconByValue(record.getLevel())); } }); dataList.add(rowData); } //2.导出 String fileName = "中天耐丝质量部检验员能力矩阵图"+ ExcelTypeEnum.XLSX; fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString()); response.setContentType("application/vnd.ms-excel"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); // 配置特殊列规则:第0列最大20字符,第2列最大25字符 Map columnRules = new HashMap<>(); columnRules.put(0, 15); columnRules.put(1, 24); EasyExcel.write(response.getOutputStream()) .head(getExportTableHeader(headerVOS)) .registerWriteHandler(new FullCustomAutoWidthHandler(columnRules, 15, 4)) .registerWriteHandler(new HeaderContentRowHeightHandler(35,20,4)) .registerWriteHandler(EasyExcelUtils.getStyleStrategy(IndexedColors.GREY_25_PERCENT)) .sheet("Sheet 1") .doWrite(dataList); } catch (Exception e) { throw new RuntimeException(e); } } private List> getExportTableHeader(List configHeaderVOList){ List> headerList = new ArrayList<>(); List row1 = new ArrayList<>(); row1.add("中天耐丝质量部检验员能力矩阵图"); row1.add("不了解:○;基本了解:●;熟练掌握:☆;精通:★"); row1.add("序号"); row1.add("序号"); List row2 = new ArrayList<>(); row2.add("中天耐丝质量部检验员能力矩阵图"); row2.add("不了解:○;基本了解:●;熟练掌握:☆;精通:★"); row2.add("姓名"); row2.add("姓名"); List row3 = new ArrayList<>(); row3.add("中天耐丝质量部检验员能力矩阵图"); row3.add("不了解:○;基本了解:●;熟练掌握:☆;精通:★"); row3.add("岗位"); row3.add("岗位"); headerList.add(row1); headerList.add(row2); headerList.add(row3); configHeaderVOList.forEach(f->{ List configRow = new ArrayList<>(); configRow.add("中天耐丝质量部检验员能力矩阵图"); configRow.add("不了解:○;基本了解:●;熟练掌握:☆;精通:★"); configRow.add(f.getItemName()); configRow.add(f.getChildrenItemName()); headerList.add(configRow); }); return headerList; } /** * 将配置列表转换从键值对 * @param configs 配置列表 * @return */ private Map transformConfigList(List configs) { Map hashMap = new HashMap<>(); if(!configs.isEmpty()){ configs.stream().filter(f->f.getParentId()>0).forEach(f->hashMap.put(f.getId().toString(),new StaffCompetencyLevelEvaluateRecord())); } return hashMap; } }