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