package com.ruoyi.personnel.service.impl; import cn.hutool.core.lang.UUID; 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.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; 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.deepoove.poi.config.ConfigureBuilder; import com.deepoove.poi.data.*; import com.deepoove.poi.data.style.*; import com.ruoyi.common.core.domain.entity.DepartmentLims; import com.ruoyi.common.core.domain.entity.User; import com.ruoyi.common.core.dto.DepartmentDto; import com.ruoyi.common.core.dto.UserPageDto; import com.ruoyi.common.utils.QueryWrappers; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.exception.ErrorException; import com.ruoyi.framework.util.HeaderToken; import com.ruoyi.personnel.dto.PersonBasicInfoDto; import com.ruoyi.personnel.mapper.*; import com.ruoyi.personnel.pojo.*; import com.ruoyi.personnel.service.PersonBasicInfoService; import com.ruoyi.system.mapper.DepartmentLimsMapper; import com.ruoyi.system.mapper.UserMapper; import lombok.extern.slf4j.Slf4j; import org.apache.poi.openxml4j.util.ZipSecureFile; import org.apache.poi.xwpf.usermodel.*; 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.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.nio.file.Files; import java.nio.file.Paths; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.Period; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author 江苏鵷雏网络科技有限公司 * @since 2024-08-30 09:19:57 */ @Service @Slf4j @Transactional(rollbackFor = Exception.class) public class PersonBasicInfoServiceImpl extends ServiceImpl implements PersonBasicInfoService { @Resource private DepartmentLimsMapper departmentMapper; @Resource private PersonTrainingFileMapper fileMapper; @Resource private HeaderToken headerToken; @Value("${wordUrl}") private String wordUrl; @Value("${file.path}") private String imgUrl; @Value("${excelUrl}") private String excelUrl; @Resource private UserMapper userMapper; @Resource private AnnexMapper annexMapper; @Resource private PersonTrackRecordMapper personTrackRecordMapper; @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.setDepartment(personBasicInfoDto.getDepartment()); 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 { personBasicInfo.setId(one.getId()); 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) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); 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, user.getId())); //工作经历 List personTrackRecordList = personTrackRecordMapper.selectList(Wrappers.lambdaQuery().eq(PersonTrackRecord::getUserId, user.getId())); List rows = new ArrayList<>(); //表格行数 int hang = 10 + (Math.max(annexList.size() - 1, 0)) + (Math.max(personTrackRecordList.size()-1 , 0)); for (int i = 0; i < hang; i++) { RowRenderData rowRenderData = new RowRenderData(); RowStyle rowStyle = new RowStyle(); rowStyle.setHeight(40); rowRenderData.setRowStyle(rowStyle); List cells = new ArrayList<>(); //表格列数 for (int j = 0; j < 6; j++) { CellRenderData cellRenderData = new CellRenderData(); CellStyle cellStyle = new CellStyle(); cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER); cellRenderData.setCellStyle(cellStyle); List paragraphRenderDataList = new ArrayList<>(); ParagraphRenderData paragraphRenderData = new ParagraphRenderData(); ParagraphStyle paragraphStyle = new ParagraphStyle(); paragraphStyle.setAlign(ParagraphAlignment.CENTER); paragraphRenderData.setParagraphStyle(paragraphStyle); List renderData = new ArrayList<>(); TextRenderData textRenderData = new TextRenderData(); Style style = new Style(); style.setFontFamily("宋体"); style.setColor("000000"); textRenderData.setStyle(style); if (i==0) { //第一行 if (j==0) { //第一列 textRenderData.setText("姓名@Name"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j==1) { //第二列 textRenderData.setText(user.getName()); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j==2 || j==3) { textRenderData.setText("性别@Gender ∑1"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getSex())?personBasicInfo.getSex():" ")+"∑2"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } else if (i==1) { //第二行 if (j==0) { //第一列 textRenderData.setText("年龄@Age"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j==1) { //第二列 textRenderData.setText(ObjectUtils.isNotEmpty(user.getAge())?user.getAge()+"":" "); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j==2 || j==3) { textRenderData.setText("工作时间@Working time ∑3"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getEntryTime())?personBasicInfo.getEntryTime():" ")+"∑4"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } else if (i==2) { //第三行 if (j==0) { //第一列 textRenderData.setText("所学专业@Majors studied"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j==1) { //第二列 textRenderData.setText(ObjectUtils.isNotEmpty(personBasicInfo.getMajor1())?personBasicInfo.getMajor1():" "); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j==2 || j==3) { textRenderData.setText("文化程度@Education ∑5"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getOfficialAcademicRedentials())?personBasicInfo.getOfficialAcademicRedentials():" ")+"∑6"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } else if (i==3) { //第四行 if (j==0) { //第一列 textRenderData.setText("毕业时间@Graducation time"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j==1) { //第二列 textRenderData.setText(ObjectUtils.isNotEmpty(personBasicInfo.getGraduationTime1())?personBasicInfo.getGraduationTime1()+"":" "); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j==2 || j==3) { textRenderData.setText("毕业学校@Graduation school ∑7"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getGraduatedInstitutions1())?personBasicInfo.getGraduatedInstitutions1():" ")+"∑8"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } else if (i==4){ //第五行 if (j==0){ //第一列 textRenderData.setText("岗位@Position"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getPost())?personBasicInfo.getPost()+"":" " )+"∑9"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } else if (i==5){ //第六行 textRenderData.setText("学历、检测专业资格、职称证书登记表@Education, testing professional qualifications, professional title certificate registration form ∑10"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (i==6){ if (j==0){ textRenderData.setText("证件号@ID number"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j==1){ textRenderData.setText("发证单位@Issuing unit"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j==2){ textRenderData.setText("级别@Level"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j==3){ textRenderData.setText("有效期@Expiration date"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j==4){ textRenderData.setText("复印件@Copy"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { textRenderData.setText("原件@Original"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } else if (i==hang-1){ //最后一行 if (j==0){ textRenderData.setText("备注@Remark"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getRemarks())?personBasicInfo.getRemarks()+"":" " )+"∑11"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } else { if (annexList.size() == 0) { if (i == 7) { textRenderData.setText(" "); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } else { if (i >= 7 && i < 8 + (Math.max(annexList.size() - 1, 0))) { if (j == 0) { textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getIdNumber()) ? annexList.get(i - 7).getIdNumber() : " "); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 1) { textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getIssueUnit()) ? annexList.get(i - 7).getIssueUnit() : " "); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 2) { textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getLevel()) ? annexList.get(i - 7).getLevel() : " "); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 3) { textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getPeriodValidity()) ? annexList.get(i - 7).getPeriodValidity() : " "); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else if (j == 4) { textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getCopy()) ? annexList.get(i - 7).getCopy() : " "); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getOriginal()) ? annexList.get(i - 7).getOriginal() : " "); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } } if (personTrackRecordList.size() == 0) { if (i == 8 + (Math.max(annexList.size() - 1, 0))) { if (j == 0) { textRenderData.setText("主要工作经历@Main work experience"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { textRenderData.setText(" ∑" + i + "5"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } } else { if (i >= 8 + (Math.max(annexList.size() - 1, 0)) && i < hang - 1) { if (j == 0) { textRenderData.setText("主要工作经历@Main work experience ∑2"+j); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } else { String startTime = personTrackRecordList.get(i - (8 + (Math.max(annexList.size() - 1, 0)))).getStartTime().format(formatter); String endTime="/"; try{ endTime = personTrackRecordList.get(i - (8 + (Math.max(annexList.size() - 1, 0)))).getEndTime().format(formatter); }catch (Exception e){ } String placeWork = personTrackRecordList.get(i - (8 + (Math.max(annexList.size() - 1, 0)))).getPlaceWork(); String department = personTrackRecordList.get(i - (8 + (Math.max(annexList.size() - 1, 0)))).getDepartment(); String post = personTrackRecordList.get(i - (8 + (Math.max(annexList.size() - 1, 0)))).getPost(); textRenderData.setText(startTime+","+endTime+","+placeWork+","+department+","+post+"∑" + i + "5"); renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } } } } } rowRenderData.setCells(cells); if (rowRenderData.getCells().size() != 0) { rows.add(rowRenderData); } } TableRenderData tableRenderData = new TableRenderData(); tableRenderData.setRows(rows); int countSize = tableRenderData.getRows().get(0).getCells().size(); for (RowRenderData row : tableRenderData.getRows()) { if (row.getCells().size() != countSize) { throw new ErrorException("每行单元格不相等"); } } TableStyle tableStyle = new TableStyle(); tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH); tableStyle.setAlign(TableRowAlign.CENTER); BorderStyle borderStyle = new BorderStyle(); borderStyle.setColor("000000"); borderStyle.setType(XWPFTable.XWPFBorderType.THICK); borderStyle.setSize(14); tableStyle.setLeftBorder(borderStyle); tableStyle.setTopBorder(borderStyle); tableStyle.setRightBorder(borderStyle); tableStyle.setBottomBorder(borderStyle); tableRenderData.setTableStyle(tableStyle); InputStream inputStream = this.getClass().getResourceAsStream("/static/person-deal.docx"); ConfigureBuilder builder = Configure.builder(); builder.useSpringEL(true); XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render( new HashMap() {{ put("createTime", user.getCreateTime().format(formatter)); put("person", tableRenderData); }}); String name = UUID.randomUUID()+ user.getName()+ "_人员档案卡" + ".docx"; try { template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name))); } catch (IOException e) { throw new RuntimeException(e); } String path = wordUrl + "/" + name; // 处理合并单元格的问题 try { ZipSecureFile.setMinInflateRatio(0.0001); FileInputStream stream = new FileInputStream(path); XWPFDocument document = new XWPFDocument(stream); List xwpfTables = document.getTables(); for (int i = 0; i < xwpfTables.size(); i++) { Set set1 = new HashSet<>(); Map> maps = new HashMap<>(); for (int j = 0; j < xwpfTables.get(i).getRows().size(); j++) { for (int k = 0; k < xwpfTables.get(i).getRows().get(j).getTableCells().size(); k++) { if (xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().indexOf("∑") > -1) { String[] split = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("∑"); if (set1.add(split[1])) { Map map = new HashMap<>(); map.put("sr", j); map.put("sc", k); map.put("er", j + 0); map.put("ec", k + 0); maps.put(split[1], map); } else { Map map1 = maps.get(split[1]); if (j == map1.get("sr")) { map1.put("ec", map1.get("ec") + 1); } else if (k == map1.get("sc")) { map1.put("er", map1.get("er") + 1); } } String str = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("∑")[0]; xwpfTables.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0); xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setText(str); xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getParagraphArray(0).setAlignment(ParagraphAlignment.CENTER); } } } // 单元格排序, 避免格式错乱 List>> entries = new ArrayList<>(maps.entrySet()); entries.sort((o1, o2) -> o1.getValue().get("sc") - o2.getValue().get("sc")); // 按照顺序添加进集合 List list = new ArrayList<>(); for (Map.Entry> entry : entries) { list.add(entry.getKey()); } for (int a = list.size() - 1; a >= 0; a--) { Map v = maps.get(list.get(a)); for (int j = 0; j < v.get("er") - v.get("sr") + 1; j++) { if (v.get("ec") > v.get("sc")) { try { mergeCellsHorizontally(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec")); // TableTools.mergeCellsHorizonal(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec")); } catch (Exception e) { } } } if (v.get("er") > v.get("sr")) { try { mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er")); // TableTools.mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er")); } catch (Exception e) { } } } } FileOutputStream fileOutputStream = new FileOutputStream(path); document.write(fileOutputStream); fileOutputStream.close(); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } //处理中英文换行的问题 try { FileInputStream stream1 = new FileInputStream(path); XWPFDocument document1 = new XWPFDocument(stream1); List xwpfTables1 = document1.getTables(); for (int i = 0; i < xwpfTables1.size(); i++) { for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) { for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) { if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) { String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText(); String[] split = text.split("@"); xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0); XWPFParagraph xwpfParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph(); XWPFRun run = xwpfParagraph.createRun(); run.setText(split[0]); if (ObjectUtils.isNotNull(split[1])) { run.addBreak(); run.setText(split[1]); } xwpfParagraph.setAlignment(ParagraphAlignment.CENTER); } } } } FileOutputStream fileOutputStream1 = new FileOutputStream(path); document1.write(fileOutputStream1); fileOutputStream1.close(); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } return name; } /** * 设备校准附件上传 * @param file * @param suffix * @param id */ @Override public void saveDeviceCalibrationFile(MultipartFile file, String suffix, Integer id) { String name = file.getOriginalFilename(); UUID uuid = UUID.randomUUID(); String fileName = uuid + name; String path = ""; // 根据后缀判断属于什么类型 if(suffix.toLowerCase().contains("xls")) { path = excelUrl; } else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) { path = wordUrl; } else { path = imgUrl; } File file1 = new File(path); if(!file1.exists()) { file1.mkdir(); } try { File file2 = new File(file1, fileName); file.transferTo(file2); // 保存数据库 PersonTrainingFile personTrainingFile = new PersonTrainingFile(); personTrainingFile.setDetailId(id); personTrainingFile.setFileUrl("/" + fileName); personTrainingFile.setFileName(file.getOriginalFilename()); personTrainingFile.setCreateUser(SecurityUtils.getUserId().intValue()); personTrainingFile.setCreateTime(LocalDateTime.now()); personTrainingFile.setEnumAttachmentType(com.ruoyi.personnel.enumeration.AttachmentType.getTypeValue(1)); fileMapper.insert(personTrainingFile); } catch (IOException e) { throw new RuntimeException(e); } } /** * 查看设备校准附件 * @param id * @return */ @Override public List getDeviceCalibrationFile(Integer id) { List personTrainingFiles = fileMapper.selectList(new LambdaQueryWrapper() .eq(PersonTrainingFile::getDetailId, id) .eq(PersonTrainingFile::getEnumAttachmentType, com.ruoyi.personnel.enumeration.AttachmentType.getTypeValue(1))); if(CollectionUtils.isNotEmpty(personTrainingFiles)) { for(PersonTrainingFile a : personTrainingFiles) { // 设置mime int i = a.getFileUrl().lastIndexOf("."); String contentType = getContentType(a.getFileUrl().substring(i + 1)); a.setMime(contentType); } } return personTrainingFiles; } @Override public void delDeviceCalibrationFile(Integer id) { fileMapper.deleteById(id); } @Override public void downLoadDeviceCalibrationFile(Integer id, HttpServletResponse response) { PersonTrainingFile personTrainingFile = fileMapper.selectById(id); String fileName = personTrainingFile.getFileName(); int i = fileName.lastIndexOf("."); String suffix = fileName.substring(i); String path = ""; // 根据后缀获取相应的路径 if(suffix.toLowerCase().contains("xls")) { path = excelUrl; } else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) { path = wordUrl; } else { path = imgUrl; } path = path + personTrainingFile.getFileUrl(); File file = new File(path); try(FileInputStream fileInputStream = new FileInputStream(file); ServletOutputStream outputStream = response.getOutputStream()) { String contentType = getContentType(suffix); // 设置响应头 response.setContentType(contentType); response.setHeader("Content-disposition", "attachment;filename=" + fileName + suffix); byte[] bytes = new byte[1024]; int len; while ((len = fileInputStream.read(bytes)) != -1) { outputStream.write(bytes,0,len); outputStream.flush(); } }catch (Exception e) { throw new ErrorException("下载失败"); } } @Override public void getEmployees(Integer departId) { List employees = headerToken.getEmployees(); List users = userMapper.selectList(new LambdaQueryWrapper().eq(User::getStatus, 0) .like(User::getDepartLimsId,String.valueOf(departId))); if(CollectionUtils.isNotEmpty(users)) { for (User user : users) { if(CollectionUtils.isNotEmpty(employees)) { for (Map map : employees) { if(map.get("employeeID").toString().equals(user.getAccount())) { employeeAddOrUpdate(map,user.getId()); } } } } } } @Override public void getEmployee(Integer userId) { User user = userMapper.selectById(userId); Map employee = headerToken.getEmployee(user.getAccount()); if(Objects.nonNull(user)) { employeeAddOrUpdate(employee,user.getId()); } } public void employeeAddOrUpdate(Map map,Integer userId) { PersonBasicInfo personBasicInfo = baseMapper.selectOne(new LambdaQueryWrapper() .eq(PersonBasicInfo::getUserId, userId)); if(Objects.isNull(personBasicInfo)) { personBasicInfo = new PersonBasicInfo(); } // 将为null的值改为"" map = updateMap(map); // 人事系统未包含字段 // personBasicInfo.setEmergencyContactPhone(null); // 紧急联系人电话 // personBasicInfo.setLastUpdateTime(null); // 最后更新时间 // personBasicInfo.setCurrentState(""); // 当前状态 // personBasicInfo.setCurrentPosition(""); // 当前职务 // personBasicInfo.setProfessionalTitle(""); //职称 // personBasicInfo.setPersonnelClassification(""); //人员分类 // personBasicInfo.setOfficialAcademicRedentials(""); // 最高学历 // personBasicInfo.setGraduationTime1(null); // 毕业时间 // personBasicInfo.setGraduationTime2(null); // 毕业时间2 // personBasicInfo.setGraduatedInstitutions2(""); // 毕业院校2 // personBasicInfo.setMajor1(""); // 专业1 // personBasicInfo.setMajor2(""); // 专业2 // personBasicInfo.setEndPlannedInternship(null); // 计划实习结束 // personBasicInfo.setDesktopPicture(""); // 桌面图片 // personBasicInfo.setAttachmentInformation(""); // 附件资料 // personBasicInfo.setRemarks(""); // 备注 // personBasicInfo.setPostType(""); // 岗位类别 // personBasicInfo.setCurrentAddress(""); // 现居住地址 // personBasicInfo.setCurrentDetailAddress(""); // 现居住详细地址 // personBasicInfo.setServiceAddress(""); // 送达地址 // personBasicInfo.setServiceDetailAddress(""); // 送达详细地址 // personBasicInfo.setNcre(""); // 计算机等级 // personBasicInfo.setHighestDegree(""); // 最高学位 // personBasicInfo.setFullTime(null); // 是否属于全日制 // personBasicInfo.setEnroll(null); // 是否属于中天 // 进行一个赋值 personBasicInfo.setUserId(userId); // 用户id if(StringUtils.isNotEmpty(map.get("dateOfJoiningTheCompany").toString())) { LocalDate parse = LocalDate.parse(map.get("dateOfJoiningTheCompany").toString()); personBasicInfo.setEntryTime(parse); // 入职时间 } if(StringUtils.isNotEmpty(map.get("dateOfBirth").toString())) { LocalDate parse1 = LocalDate.parse(map.get("dateOfBirth").toString()); personBasicInfo.setDateBirth(parse1); //出生日期 } if(StringUtils.isNotEmpty(map.get("dateOfConversionToFullTime").toString())) { personBasicInfo.setEndPracticalPractice(LocalDate.parse(map.get("dateOfConversionToFullTime").toString())); // 实际实习结束 (转正日期) } if(StringUtils.isNotEmpty(map.get("dateOfResignation").toString())) { personBasicInfo.setDateDeparture(LocalDate.parse(map.get("dateOfResignation").toString())); // 离职日期 } if(StringUtils.isNotEmpty(map.get("dateOfJoiningTheGroup").toString())) { personBasicInfo.setGroupTime(LocalDate.parse(map.get("dateOfJoiningTheGroup").toString())); // 入集团时间 } if(StringUtils.isNotEmpty(map.get("dateOfJoiningTheCompany").toString())) { personBasicInfo.setTrialStartTime(LocalDate.parse(map.get("dateOfJoiningTheCompany").toString())); // 试用开始时间 入职时间 } if(StringUtils.isNotEmpty(map.get("dateOfConversionToFullTime").toString())) { personBasicInfo.setTrialEndTime(LocalDate.parse(map.get("dateOfConversionToFullTime").toString())); // 试用结束时间 转正时间 } if(StringUtils.isNotEmpty(map.get("idValidityPeriod").toString())) { personBasicInfo.setValidityPeriod(LocalDate.parse(map.get("idValidityPeriod").toString())); // 证件有效期 } if(StringUtils.isNotEmpty(map.get("dateOfJoiningTheCommunistPartyOrCommunistYouthLeague").toString())) { personBasicInfo.setDumplingTime(LocalDate.parse(map.get("dateOfJoiningTheCommunistPartyOrCommunistYouthLeague").toString())); // 入党/团时间 } if(StringUtils.isNotEmpty(map.get("dateOfJoiningTheCompany").toString())) { personBasicInfo.setUnitTime(LocalDate.parse(map.get("dateOfJoiningTheCompany").toString())); // 入单位时间 } personBasicInfo.setDepartmentCode(map.get("departmentCode").toString()); // 部门编号 personBasicInfo.setPost(map.get("position").toString()); // 岗位 personBasicInfo.setSex(map.get("gender").toString()); //性别 personBasicInfo.setIdentityCard(map.get("idNumber").toString()); // 身份证号码 personBasicInfo.setNation(map.get("nation").toString()); // 民族 personBasicInfo.setPoliticalStatus(map.get("politicalAffiliation").toString()); // 政治面貌 personBasicInfo.setGraduatedInstitutions1(""); // 毕业院校1 personBasicInfo.setTelephone(map.get("phoneNumber").toString()); // 手机号码 personBasicInfo.setJobNumber(map.get("employeeID").toString()); // 工号 人员编号 personBasicInfo.setSubordinateNumber(map.get("employeeSubID").toString()); // 员工子编号 personBasicInfo.setCorporateName(map.get("companyId").toString()); // 公司名称 所属组织编码 personBasicInfo.setPostCode(map.get("positionCode").toString()); // 岗位编号 personBasicInfo.setPostName(map.get("position").toString()); // 岗位名称 personBasicInfo.setReportingTo(map.get("directSupervisorID").toString()); // 直接上级 personBasicInfo.setLaborRelations(map.get("employmentStatus").toString()); // 劳动关系 personBasicInfo.setNativePlace(map.get("hometown").toString()); // 籍贯 personBasicInfo.setIdType(map.get("idType").toString()); // 证件类型 personBasicInfo.setMaritalStatus(map.get("maritalStatus").toString()); // 婚姻状况 personBasicInfo.setIdAddress(map.get("idAddress").toString()); // 证件地址 personBasicInfo.setIdDetailAddress(map.get("detailedResidentialAddress").toString()); // 身份证详细地址 personBasicInfo.setRetiredSoldiers(map.get("militaryServiceStatus").toString()); // 是否是退伍军人 personBasicInfo.setCornet(map.get("shortPhoneNumber").toString()); // 短号 personBasicInfo.setOfficePhone(map.get("officePhone").toString()); // 办公电话 personBasicInfo.setCollegeStudents(map.get("yearOfGraduation").toString()); // xxx届大学生 personBasicInfo.setEmergencyContact(map.get("emergencyContactName").toString()); // 紧急联系人 personBasicInfo.setCompanyEmail(map.get("companyEmail").toString()); // 公司邮箱 if(Objects.nonNull(personBasicInfo.getDateBirth())) { Period period = Period.between(personBasicInfo.getDateBirth(), LocalDate.now()); int years = period.getYears(); personBasicInfo.setPersonBasicInfoAge(years); } if(Objects.isNull(personBasicInfo.getId()) ) { log.info("新增"); baseMapper.insert(personBasicInfo); }else { log.info("更新"); baseMapper.updateById(personBasicInfo); } } public Map updateMap(Map map) { Iterator> iterator = map.entrySet().iterator(); while (iterator.hasNext()){ Map.Entry entry = iterator.next(); if(Objects.isNull(entry.getValue()) || entry.getValue().equals("null")) { entry.setValue(""); } } return map; } /** * 递归查询子节点 * @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); } } } // 根据文件扩展名获取 MIME 类型 private String getContentType(String fileExtension) { switch (fileExtension) { case "jpg": case "jpeg": return "image/jpeg"; case "png": return "image/png"; case "gif": return "image/gif"; case "pdf": return "application/pdf"; case "doc": return "application/msword"; case "docx": return "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; case "xls": return "application/vnd.ms-excel"; case "xlsx": return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; case "ppt": case "pptx": return "application/vnd.ms-powerpoint"; default: return "application/octet-stream"; // 默认二进制流 } } }