package com.ruoyi.personnel.service.impl; import cn.hutool.core.util.NumberUtil; import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; 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.data.Pictures; import com.ruoyi.common.core.domain.entity.User; import com.ruoyi.common.utils.DateImageUtil; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.exception.ErrorException; import com.ruoyi.framework.util.HackLoopTableRenderPolicy; import com.ruoyi.personnel.dto.PersonSupervisePlanDto; import com.ruoyi.personnel.excel.PersonSupervisePlanDetailsListener; import com.ruoyi.personnel.excel.PersonSupervisePlanDetailsUpload; import com.ruoyi.personnel.mapper.PersonSupervisePlanDetailsMapper; import com.ruoyi.personnel.mapper.PersonSupervisePlanMapper; import com.ruoyi.personnel.mapper.PersonSupervisionRecordMapper; import com.ruoyi.personnel.pojo.PersonSupervisePlan; import com.ruoyi.personnel.pojo.PersonSupervisePlanDetails; import com.ruoyi.personnel.pojo.PersonSupervisionRecord; import com.ruoyi.personnel.service.PersonSupervisePlanDetailsService; import com.ruoyi.personnel.service.PersonSupervisePlanService; import com.ruoyi.system.mapper.UserMapper; import lombok.extern.slf4j.Slf4j; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.usermodel.*; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableCell; import org.apache.poi.xwpf.usermodel.XWPFTableRow; 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.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** *

* 监督计划 - 父 服务实现类 *

* * @author 芯导软件(江苏)有限公司 * @since 2024-10-09 04:14:45 */ @Service @Slf4j @Transactional(rollbackFor = Exception.class) public class PersonSupervisePlanServiceImpl extends ServiceImpl implements PersonSupervisePlanService { @Resource private PersonSupervisePlanDetailsService personSupervisePlanDetailsService; @Resource private PersonSupervisePlanDetailsMapper personSupervisePlanDetailsMapper; @Resource private PersonSupervisionRecordMapper personSupervisionRecordMapper; @Value("${file.path}") private String imgUrl; @Autowired private UserMapper userMapper; public IPage yearPlanDtoIPage(Page page, String organizationPerson, Integer departId) { IPage personSupervisePlanDtoIPage = baseMapper.pageByPerson(page, organizationPerson, departId); List records = personSupervisePlanDtoIPage.getRecords(); for(PersonSupervisePlanDto a : records) { a.setCurrentId(SecurityUtils.getUserId().intValue()); } return personSupervisePlanDtoIPage; } @Override public void yearPlanDetailImport(MultipartFile file ,String suffix) { // 年度计划父级新增数据 PersonSupervisePlan personSupervisePlan = new PersonSupervisePlan(); String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf(".")); personSupervisePlan.setFileName(fileName); personSupervisePlan.setOrganizationPersonId(SecurityUtils.getUserId().intValue()); personSupervisePlan.setOrganizationDate(LocalDateTime.now()); baseMapper.insert(personSupervisePlan); List> tableData = new ArrayList<>(); String name = ""; // 年度计划详情 新增 try { if(suffix.toLowerCase().contains("xls")) { PersonSupervisePlanDetailsListener personSupervisePlanDetailsListener = new PersonSupervisePlanDetailsListener(personSupervisePlanDetailsService); personSupervisePlanDetailsListener.setPlanId(personSupervisePlan.getId()); EasyExcel.read(file.getInputStream(), PersonSupervisePlanDetailsUpload.class, personSupervisePlanDetailsListener).sheet().doRead(); }else if(suffix.toLowerCase().equals("doc")) { try(InputStream inputStream = file.getInputStream(); HWPFDocument doc = new HWPFDocument(inputStream)) { // 获取文档的 Range Range range = doc.getRange(); // 遍历所有表格 TableIterator tableIterator = new TableIterator(range); while (tableIterator.hasNext()) { Table table = tableIterator.next(); // 遍历表格的每一行 for (int rowIdx = 0; rowIdx < table.numRows(); rowIdx++) { TableRow row = table.getRow(rowIdx); List rowData = new ArrayList<>(); // 遍历行中的每个单元格 for (int cellIdx = 0; cellIdx < row.numCells(); cellIdx++) { TableCell cell = row.getCell(cellIdx); String text = cell.text().trim(); rowData.add(text); } tableData.add(rowData); } } for (List list : tableData) { // 进行添加 addPersonSupervisePlanDetails(list,personSupervisePlan.getId()); if(StringUtils.isEmpty(name) && NumberUtil.isInteger(list.get(0))) { String supervisePerson = list.get(4); // 被监督人员 name = supervisePerson; } } // 根据添加数据被监督人 来判断该文件是哪个部门的 String departLimsId = userMapper.selectList(new LambdaQueryWrapper().eq(User::getName, name)).get(0).getDepartLimsId(); if(StringUtils.isNotEmpty(departLimsId) && departLimsId.contains("18")) { baseMapper.update(null,new LambdaUpdateWrapper() .set(PersonSupervisePlan::getDepartId,18) .set(PersonSupervisePlan::getOrganizationPersonId,12) // 通信的是刘晨 (编制人) .eq(PersonSupervisePlan::getId,personSupervisePlan.getId())); } else if (StringUtils.isNotEmpty(departLimsId) && departLimsId.contains("19")) { baseMapper.update(null,new LambdaUpdateWrapper() .set(PersonSupervisePlan::getDepartId,19) .set(PersonSupervisePlan::getOrganizationPersonId,41) // 电力的是吴明华 (编制人) .eq(PersonSupervisePlan::getId,personSupervisePlan.getId())); } log.info("读取文件: {}",tableData); }catch (Exception e) { throw new ErrorException("导入失败"+ e); } }else if(suffix.toLowerCase().equals("docx")) { try(InputStream fileInputStream = file.getInputStream();XWPFDocument xwpfDocument = new XWPFDocument(fileInputStream)) { // 遍历所有表格 for(XWPFTable table : xwpfDocument.getTables()) { // 遍历每一行 for(XWPFTableRow row : table.getRows()) { List list = new ArrayList<>(); // 遍历每一个单元格 for(XWPFTableCell cell : row.getTableCells()) { String text = cell.getText(); list.add(text); } log.info("读取每一行的内容: {}",list); // 进行添加 addPersonSupervisePlanDetails(list,personSupervisePlan.getId()); if(StringUtils.isEmpty(name) && NumberUtil.isInteger(list.get(0))) { String supervisePerson = list.get(4); // 被监督人员 name = supervisePerson; } } } // 根据添加数据被监督人 来判断该文件是哪个部门的 String departLimsId = userMapper.selectList(new LambdaQueryWrapper().eq(User::getName, name)).get(0).getDepartLimsId(); if(StringUtils.isNotEmpty(departLimsId) && departLimsId.contains("18")) { baseMapper.update(null,new LambdaUpdateWrapper() .set(PersonSupervisePlan::getDepartId,18) .eq(PersonSupervisePlan::getId,personSupervisePlan.getId())); } else if (StringUtils.isNotEmpty(departLimsId) && departLimsId.contains("19")) { baseMapper.update(null,new LambdaUpdateWrapper() .set(PersonSupervisePlan::getDepartId,18) .eq(PersonSupervisePlan::getId,personSupervisePlan.getId())); } }catch (Exception e){ throw new ErrorException("导入失败"+e); } } } catch (IOException e) { e.printStackTrace(); } } public void addPersonSupervisePlanDetails(List list,Integer planId) { if(NumberUtil.isInteger(list.get(0)) ) { String superviseDate = list.get(1); // 监督日期 String superviseDes = list.get(2); // 监督目的 String superviseProject = list.get(3); // 监督项目 String supervisePerson = list.get(4); // 被监督人员 String superviseReason = list.get(5); // 监督原因 String remarks = list.get(6); // 备注 PersonSupervisePlanDetails personSupervisePlanDetails = new PersonSupervisePlanDetails(); LocalDate localDate = null; String[] parts = superviseDate.split("\\."); if (parts.length == 2) { try { // 获取年份 int year = Integer.parseInt(parts[0]); // 获取月份 int month = Integer.parseInt(parts[1]); // 创建 LocalDate 对象,日期设为该月第一天 localDate = LocalDate.of(year, month, 1); } catch (NumberFormatException e) { throw new ErrorException("输入的字符串无法转换为有效的年份或月份: " + e.getMessage()); } } personSupervisePlanDetails.setSuperviseDate(localDate); personSupervisePlanDetails.setSuperviseDes(superviseDes); personSupervisePlanDetails.setSuperviseProject(superviseProject); personSupervisePlanDetails.setSupervisePerson(supervisePerson); personSupervisePlanDetails.setSuperviseReason(superviseReason); personSupervisePlanDetails.setRemarks(remarks); personSupervisePlanDetails.setPlanId(planId); // 父id personSupervisePlanDetailsMapper.insert(personSupervisePlanDetails); } } /** * 导出人员监督计划 * @param id * @param response */ @Override public void exportSuperVisePlan(Integer id, HttpServletResponse response) { Map data = new HashMap<>(); data.put("year",""); data.put("supervisor",""); // 查询详情 PersonSupervisePlan personSupervisePlan = baseMapper.selectById(id); //获取提交人的签名地址 String organizationUrl = userMapper.selectById(personSupervisePlan.getOrganizationPersonId()).getSignatureUrl(); if (StringUtils.isBlank(organizationUrl)) { throw new ErrorException("找不到检验人的签名"); } //获取批准人的签名地址 String approvalUrl = null; if (personSupervisePlan.getApprovalId() != null) { approvalUrl = userMapper.selectById(personSupervisePlan.getApprovalId()).getSignatureUrl(); if (StringUtils.isBlank(approvalUrl)) { throw new ErrorException("找不到批准人的签名"); } } // 查询详情 List detailedDtos = personSupervisePlanDetailsService.list(Wrappers.lambdaQuery() .eq(PersonSupervisePlanDetails::getPlanId, id)); // 查询监督记录 List personSupervisionRecords = personSupervisionRecordMapper.selectList(new LambdaQueryWrapper() .orderByAsc(PersonSupervisionRecord::getId)); if(CollectionUtils.isNotEmpty(personSupervisionRecords)) { Integer supervisorId = personSupervisionRecords.get(0).getSupervisorId(); String name = userMapper.selectById(supervisorId).getName(); data.put("supervisor",name); } int index = 1; for (PersonSupervisePlanDetails detailedDto : detailedDtos) { detailedDto.setIndex(index); index++; DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); String format = detailedDto.getSuperviseDate().format(dateTimeFormatter); detailedDto.setSuperviseDateString(format); int year = detailedDto.getSuperviseDate().getYear(); data.put("year",year); } System.out.println("data: " + data); // 获取路径 InputStream inputStream = this.getClass().getResourceAsStream("/static/super-vise-plan.docx"); Configure configure = Configure.builder() .bind("supervisePlanDetailsList", new HackLoopTableRenderPolicy()) .build(); String finalApprovalUrl = approvalUrl; XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render( new HashMap() {{ put("data",data); put("supervisePlanDetailsList", detailedDtos); put("organizationUrl", StringUtils.isNotBlank(organizationUrl) ? Pictures.ofLocal(imgUrl + "/" + organizationUrl).create() : null); put("approvalUrl", StringUtils.isNotBlank(finalApprovalUrl) ? Pictures.ofLocal(imgUrl + "/" + finalApprovalUrl).create() : null); put("writeDateUrl", personSupervisePlan.getOrganizationDate() != null ? Pictures.ofStream(DateImageUtil.createDateImage(personSupervisePlan.getOrganizationDate())).create() : null); put("ratifyDateUrl", personSupervisePlan.getApprovalDate() != null ? Pictures.ofStream(DateImageUtil.createDateImage(personSupervisePlan.getApprovalDate())).create() : null); }}); try { response.setContentType("application/msword"); String fileName = URLEncoder.encode( "人员监督计划导出", "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("导出失败"); } } }