From 7a838ed69de1d9593fe6b37f9b5caafb5f8d0cbf Mon Sep 17 00:00:00 2001 From: lxp <1928192722@qq.com> Date: 星期一, 10 三月 2025 14:48:45 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev --- cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java | 331 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 331 insertions(+), 0 deletions(-) diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java new file mode 100644 index 0000000..b81a69f --- /dev/null +++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java @@ -0,0 +1,331 @@ +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.inspect.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.AllArgsConstructor; +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 org.apache.poi.xwpf.usermodel.XWPFDocument; + +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; + +/** + * <p> + * 鐩戠潱璁″垝 - 鐖� 鏈嶅姟瀹炵幇绫� + * </p> + * + * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃 + * @since 2024-10-09 04:14:45 + */ +@Service +@Slf4j +@Transactional(rollbackFor = Exception.class) +public class PersonSupervisePlanServiceImpl extends ServiceImpl<PersonSupervisePlanMapper, PersonSupervisePlan> 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<PersonSupervisePlanDto> yearPlanDtoIPage(Page page, String organizationPerson, Integer departId) { + IPage<PersonSupervisePlanDto> personSupervisePlanDtoIPage = baseMapper.pageByPerson(page, organizationPerson, departId); + List<PersonSupervisePlanDto> 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<List<String>> 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<String> 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<String> list : tableData) { + // 杩涜娣诲姞 + addPersonSupervisePlanDetails(list,personSupervisePlan.getId()); + if(StringUtils.isEmpty(name) && NumberUtil.isInteger(list.get(0))) { + String supervisePerson = list.get(4); // 琚洃鐫d汉鍛� + name = supervisePerson; + } + } + // 鏍规嵁娣诲姞鏁版嵁琚洃鐫d汉 鏉ュ垽鏂鏂囦欢鏄摢涓儴闂ㄧ殑 + String departLimsId = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName, name)).get(0).getDepartLimsId(); + if(StringUtils.isNotEmpty(departLimsId) && departLimsId.contains("18")) { + baseMapper.update(null,new LambdaUpdateWrapper<PersonSupervisePlan>() + .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<PersonSupervisePlan>() + .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<String> 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); // 琚洃鐫d汉鍛� + name = supervisePerson; + } + } + } + // 鏍规嵁娣诲姞鏁版嵁琚洃鐫d汉 鏉ュ垽鏂鏂囦欢鏄摢涓儴闂ㄧ殑 + String departLimsId = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName, name)).get(0).getDepartLimsId(); + if(StringUtils.isNotEmpty(departLimsId) && departLimsId.contains("18")) { + baseMapper.update(null,new LambdaUpdateWrapper<PersonSupervisePlan>() + .set(PersonSupervisePlan::getDepartId,18) + .eq(PersonSupervisePlan::getId,personSupervisePlan.getId())); + } else if (StringUtils.isNotEmpty(departLimsId) && departLimsId.contains("19")) { + baseMapper.update(null,new LambdaUpdateWrapper<PersonSupervisePlan>() + .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<String> 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); // 琚洃鐫d汉鍛� + 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); // 鐖秈d + personSupervisePlanDetailsMapper.insert(personSupervisePlanDetails); + } + } + + + + /** + * 瀵煎嚭浜哄憳鐩戠潱璁″垝 + * @param id + * @param response + */ + @Override + public void exportSuperVisePlan(Integer id, HttpServletResponse response) { + Map<String, Object> 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<PersonSupervisePlanDetails> detailedDtos = personSupervisePlanDetailsService.list(Wrappers.<PersonSupervisePlanDetails>lambdaQuery() + .eq(PersonSupervisePlanDetails::getPlanId, id)); + + + // 鏌ヨ鐩戠潱璁板綍 + List<PersonSupervisionRecord> personSupervisionRecords = personSupervisionRecordMapper.selectList(new LambdaQueryWrapper<PersonSupervisionRecord>() + .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<String, Object>() {{ + 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("瀵煎嚭澶辫触"); + } + } +} -- Gitblit v1.9.3