package com.ruoyi.personnel.service.impl; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; 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.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.ruoyi.common.core.domain.entity.DepartmentDto; import com.ruoyi.common.core.domain.entity.DepartmentLims; import com.ruoyi.common.core.domain.entity.User; import com.ruoyi.common.utils.QueryWrappers; import com.ruoyi.framework.exception.ErrorException; import com.ruoyi.inspect.util.HackLoopTableRenderPolicy; import com.ruoyi.personnel.dto.PersonBasicInfoDto; import com.ruoyi.personnel.dto.PersonBasicInfoWorkDto; import com.ruoyi.personnel.dto.UserPageDto; import com.ruoyi.personnel.mapper.AnnexMapper; import com.ruoyi.personnel.mapper.PersonBasicInfoFileMapper; import com.ruoyi.personnel.mapper.PersonBasicInfoMapper; import com.ruoyi.personnel.mapper.PersonBasicInfoWorkMapper; import com.ruoyi.personnel.pojo.Annex; import com.ruoyi.personnel.pojo.PersonBasicInfo; import com.ruoyi.personnel.pojo.PersonBasicInfoFile; import com.ruoyi.personnel.pojo.PersonBasicInfoWork; import com.ruoyi.personnel.service.PersonBasicInfoService; import com.ruoyi.system.mapper.DepartmentLimsMapper; import com.ruoyi.system.mapper.UserMapper; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; 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.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author 江苏鵷雏网络科技有限公司 * @since 2024-08-30 09:19:57 */ @Service @Transactional(rollbackFor = Exception.class) public class PersonBasicInfoServiceImpl extends ServiceImpl implements PersonBasicInfoService { @Autowired private DepartmentLimsMapper departmentMapper; @Value("${file.path}") private String imgUrl; @Value("${wordUrl}") private String wordUrl; @Resource private UserMapper userMapper; @Resource private AnnexMapper annexMapper; @Resource private PersonBasicInfoFileMapper personBasicInfoFileMapper; @Resource private PersonBasicInfoWorkMapper personBasicInfoWorkMapper; @Override public List selectCNSAPersonTree() { List departments = departmentMapper.selectDepartment(); List limsUser = baseMapper.selectLimsUser(); departments.addAll(limsUser); //获取父节点 return departments.stream().filter(m -> m.getFatherId() == null).peek( (m) -> m.setChildren(getChildren(m, departments)) ).collect(Collectors.toList()); } @Override public Map getCNASPersonnelInfo(Integer userId) { Map map = new HashMap<>(); Map> childrenMap = new HashMap<>(); List deptS = departmentMapper.selectList(null); for (DepartmentLims dept : deptS) { if(!Objects.isNull(dept.getFatherId())) { if(!childrenMap.containsKey(dept.getFatherId())) { childrenMap.put(dept.getFatherId(),new ArrayList<>()); } childrenMap.get(dept.getFatherId()).add(dept); } } // 父节点 List deptF = new ArrayList<>(); for (DepartmentLims dept : deptS) { if(Objects.isNull(dept.getFatherId())) { deptF.add(buildTree(dept,childrenMap)); } } map.put("department",deptF); map.put("PersonBasicInfoDto",baseMapper.getCNASPersonnelInfo(userId)); map.put("annexList",annexMapper.selectList(new LambdaQueryWrapper().eq(Annex::getUserId,userId))); return map; } private DepartmentLims buildTree(DepartmentLims departmentLims, Map> childrenMap) { if(childrenMap.containsKey(departmentLims.getId())) { departmentLims.setChildren(childrenMap.get(departmentLims.getId())); for (DepartmentLims departmentLims1 : departmentLims.getChildren()) { buildTree(departmentLims1,childrenMap); } } return departmentLims; } @Override public void saveCNASPersonnelInfo(PersonBasicInfoDto personBasicInfoDto) { User user = new User(); user.setId(personBasicInfoDto.getUserId()); user.setAccount(personBasicInfoDto.getAccount()); user.setName(personBasicInfoDto.getName()); user.setNameEn(personBasicInfoDto.getNameEn()); user.setAge(personBasicInfoDto.getAge()); user.setPhone(personBasicInfoDto.getPhone()); user.setEmail(personBasicInfoDto.getEmail()); user.setSignatureUrl(personBasicInfoDto.getSignatureUrl()); user.setPictureUrl(personBasicInfoDto.getPictureUrl()); user.setDepartLimsId(personBasicInfoDto.getDepartLimsId()); userMapper.updateById(user); PersonBasicInfo personBasicInfo = JSONObject.parseObject(JSON.toJSONString(personBasicInfoDto), PersonBasicInfo.class); PersonBasicInfo one = baseMapper.selectOne(new LambdaQueryWrapper() .eq(PersonBasicInfo::getUserId, personBasicInfoDto.getUserId())); if(Objects.isNull(one)) { baseMapper.insert(personBasicInfo); }else { baseMapper.updateById(personBasicInfo); } } @Override public IPage> basicInformationOfPersonnelSelectPage(Page page, String name, Integer departmentId) { return baseMapper.selectPersonBasecInfoAndUser(page, name, departmentId); } @Override public void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception { ArrayList data = new ArrayList<>(); List list = userMapper.selectList(null); for (User user : list) { PersonBasicInfoDto personBasicInfoDto = new PersonBasicInfoDto(); PersonBasicInfo personBasicInfo = baseMapper.selectOne(Wrappers.lambdaQuery().eq(PersonBasicInfo::getUserId, user.getId())); if (ObjectUtils.isNotEmpty(personBasicInfo)) { BeanUtils.copyProperties(personBasicInfo, personBasicInfoDto); } personBasicInfoDto.setName(user.getName()); personBasicInfoDto.setAccount(user.getAccount()); personBasicInfoDto.setPhone(ObjectUtils.isNotEmpty(user.getPhone()) ? user.getPhone() : " "); data.add(personBasicInfoDto); } response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("UTF-8"); String fileName = URLEncoder.encode("人员基本信息列表导出", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); try { // 新建ExcelWriter ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build(); WriteSheet mainSheet = EasyExcel.writerSheet(0, "人员基本信息导出").head(PersonBasicInfoDto.class).build(); excelWriter.write(data, mainSheet); // 关闭流 excelWriter.finish(); } catch (IOException e) { throw new RuntimeException("导出失败"); } } @Override public String exportPersonBasicInfoById(Integer id, HttpServletResponse response) { Map userMap = baseMapper.selectexportPersonBasic(id); User user = userMapper.selectById(id); PersonBasicInfo personBasicInfo = baseMapper.selectOne(Wrappers.lambdaQuery().eq(PersonBasicInfo::getUserId, user.getId())); if (ObjectUtils.isEmpty(personBasicInfo)){ throw new ErrorException("该用户的基本信息没有录入,暂无法导出"); } // 证件 List annexList = annexMapper.selectList(Wrappers.lambdaQuery() .eq(Annex::getUserId, id)); // 工作经历 List personBasicInfoWorks = personBasicInfoWorkMapper.selectList(Wrappers.lambdaQuery() .eq(PersonBasicInfoWork::getUserId, id)); List workList = personBasicInfoWorks.stream().map(basicInfoWork -> { PersonBasicInfoWorkDto personBasicInfoWorkDto = new PersonBasicInfoWorkDto(); personBasicInfoWorkDto.setWorkExperience(basicInfoWork.getWorkExperience()); personBasicInfoWorkDto.setFill("主要工作经历\nMain work experience∑1"); return personBasicInfoWorkDto; }).collect(Collectors.toList()); // 检查列表长度并填充空对象 while (annexList.size() < 10) { annexList.add(new Annex()); } // 检查列表长度并填充空对象 while (workList.size() < 4) { workList.add(new PersonBasicInfoWorkDto()); } // 获取路径 InputStream inputStream = this.getClass().getResourceAsStream("/static/person-basic-info.docx"); Configure configure = Configure.builder() .bind("annexList", new HackLoopTableRenderPolicy()) .bind("workList", new HackLoopTableRenderPolicy()) .build(); XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render( new HashMap() {{ put("user", userMap); put("annexList", annexList); put("workList", workList); }}); try { response.setContentType("application/msword"); String fileName = URLEncoder.encode( userMap.get("name") + "人员档案", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx"); OutputStream os = response.getOutputStream(); template.write(os); os.flush(); os.close(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("导出失败"); } return null; } /** * 人员培训基本信息附件新增 * @param userId * @param file * @return */ @Override public boolean uploadBasicInfoFile(Integer userId, MultipartFile file) { if (userId == null) { throw new ErrorException("缺少人员id"); } String urlString; String pathName; String path; String filename = file.getOriginalFilename(); String contentType = file.getContentType(); PersonBasicInfoFile personBasicInfoFile = new PersonBasicInfoFile(); personBasicInfoFile.setUserId(userId); personBasicInfoFile.setFileName(filename); if (contentType != null && contentType.startsWith("image/")) { // 是图片 path = imgUrl; personBasicInfoFile.setType(1); } else { // 是文件 path = wordUrl; personBasicInfoFile.setType(2); } try { File realpath = new File(path); if (!realpath.exists()) { realpath.mkdirs(); } pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + file.getOriginalFilename(); urlString = realpath + "/" + pathName; file.transferTo(new File(urlString)); personBasicInfoFile.setFileUrl(pathName); personBasicInfoFileMapper.insert(personBasicInfoFile); return true; } catch (Exception e) { e.printStackTrace(); System.err.println("附件上传错误"); return false; } } /** * 递归查询子节点 * @param root 根节点 * @param all 所有节点 * @return 根节点信息 */ private List getChildren(DepartmentDto root, List all) { if (ObjectUtils.isNotEmpty(root.getId())) { return all.stream().filter(m -> Objects.equals(m.getFatherId(), root.getId())).peek( (m) -> m.setChildren(getChildren(m, all)) ).collect(Collectors.toList()); } else { return Collections.emptyList(); } } // 水平合并单元格 private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) { for (int i = fromCol; i <= toCol; i++) { if (i == fromCol) { table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART); } else { table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE); } } } // 垂直合并单元格 private static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) { for (int i = fromRow; i <= toRow; i++) { if (i == fromRow) { table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART); } else { table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE); } } } }