From 4f3a98f19143865cdc1de4791e8a95d96bd40c65 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期五, 01 八月 2025 13:27:59 +0800
Subject: [PATCH] yys 密码已重置

---
 cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorServiceImpl.java |  835 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 835 insertions(+), 0 deletions(-)

diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorServiceImpl.java
new file mode 100644
index 0000000..e8da9e5
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorServiceImpl.java
@@ -0,0 +1,835 @@
+package com.ruoyi.process.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.data.Pictures;
+import com.ruoyi.common.constant.MenuJumpPathConstants;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.device.pojo.DeviceExamineRecord;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.inspect.util.XWPFDocumentUtils;
+import com.ruoyi.process.dto.QualityMonitorDetailsDto;
+import com.ruoyi.process.dto.QualityMonitorDetailsEvaluateDto;
+import com.ruoyi.process.dto.QualityMonitorDto;
+import com.ruoyi.process.excel.QualityMonitorDetailsUpload;
+import com.ruoyi.process.mapper.*;
+import com.ruoyi.process.pojo.*;
+import com.ruoyi.process.service.QualityMonitorDetailsEvaluateService;
+import com.ruoyi.process.service.QualityMonitorDetailsRatifyService;
+import com.ruoyi.process.service.QualityMonitorDetailsService;
+import com.ruoyi.process.service.QualityMonitorService;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+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.nio.file.Files;
+import java.nio.file.Paths;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝涓昏〃
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class QualityMonitorServiceImpl extends ServiceImpl<QualityMonitorMapper, QualityMonitor> implements QualityMonitorService {
+
+    @Resource
+    private QualityMonitorDetailsService qualityMonitorDetailsService;
+    @Resource
+    private QualityMonitorDetailsMapper qualityMonitorDetailsMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private QualityMonitorDetailsRatifyMapper qualityMonitorDetailsRatifyMapper;
+    @Resource
+    private QualityMonitorDetailsRatifyService qualityMonitorDetailsRatifyService;
+    @Resource
+    private QualityMonitorDetailsEvaluateMapper qualityMonitorDetailsEvaluateMapper;
+    @Resource
+    private QualityMonitorDetailsEvaluateService qualityMonitorDetailsEvaluateService;
+    @Resource
+    private QualityMonitorDetailsEvaluateFileMapper qualityMonitorDetailsEvaluateFileMapper;
+    @Resource
+    private InformationNotificationService informationNotificationService;
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+
+    /**
+     * 瀵煎叆鐩戞帶璁″垝
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean importQualityMonitor(MultipartFile file, QualityMonitor monitor) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = SecurityUtils.getUserId().intValue();
+        // 鏂囦欢鍚嶇О
+        String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
+        QualityMonitor qualityMonitor = new QualityMonitor();
+        qualityMonitor.setMonitorName(fileName);
+        qualityMonitor.setMonitorYear(monitor.getMonitorYear());
+        qualityMonitor.setWriteUserId(userId);
+        qualityMonitor.setExamineUserId(monitor.getExamineUserId());
+        qualityMonitor.setWriteTime(LocalDateTime.now());
+        baseMapper.insert(qualityMonitor);
+
+        if (monitor.getExamineUserId() == null) {
+            throw new ErrorException("缂哄皯瀹℃牳浜�");
+        }
+
+        User user = userMapper.selectById(userId);
+        // 娑堟伅鍙戦��
+        InformationNotification info = new InformationNotification();
+        // 鍙戦�佷汉
+        info.setCreateUser(user.getName());
+        info.setMessageType("6");
+        info.setTheme("CNAS璐ㄩ噺鐩戞帶璁″垝瀹℃牳閫氱煡");
+        info.setContent(fileName + "璐ㄩ噺鐩戞帶璁″垝寰呭鏍�");
+        info.setSenderId(userId);
+        // 鎺ユ敹浜�
+        info.setConsigneeId(monitor.getExamineUserId());
+        info.setJumpPath(MenuJumpPathConstants.QUALITY_MONITOR);
+        informationNotificationService.addInformationNotification(info);
+
+        // 鍙戦�佷紒涓氬井淇¢�氱煡
+        threadPoolTaskExecutor.execute(() -> {
+            // 鏌ヨ鍙戦�佷汉
+            User people = userMapper.selectById(monitor.getExamineUserId());
+            String message = "";
+            message += "CNAS璐ㄩ噺鐩戞帶璁″垝瀹℃牳閫氱煡";
+            message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戞帶璁″垝";
+            message += "\n" + fileName + "璐ㄩ噺鐩戞帶璁″垝寰呭鏍�";
+            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+            try {
+                WxCpUtils.inform(people.getAccount(), message, null);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+
+        List<QualityMonitorDetails> detailsUploadList = new ArrayList<>();
+
+        // 瀵煎叆闄勪欢鍐呭
+        try {
+            // excel瑙f瀽
+            EasyExcel.read(file.getInputStream(), QualityMonitorDetailsUpload.class, new AnalysisEventListener<QualityMonitorDetailsUpload>() {
+                @Override
+                public void invoke(QualityMonitorDetailsUpload detailsUpload, AnalysisContext analysisContext) {
+                    // 鍒ゆ柇鏄惁涓虹┖
+                    if (StringUtils.isBlank(detailsUpload.getPlannedTime())) {
+                        throw new ErrorException("璁″垝寮�灞曟椂闂翠笉鑳戒负绌�");
+                    }
+                        // 瀵硅薄澶嶅埗
+                    QualityMonitorDetails monitorDetails = new QualityMonitorDetails();
+                    BeanUtils.copyProperties(detailsUpload, monitorDetails);
+                    monitorDetails.setQualityMonitorId(qualityMonitor.getQualityMonitorId());
+
+                    detailsUploadList.add(monitorDetails);
+                }
+
+                @Override
+                public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+
+                }
+            }).sheet().doRead();
+            qualityMonitorDetailsService.saveBatch(detailsUploadList);
+
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return true;
+    }
+
+    /**
+     * 鐩戞帶璁″垝瀹℃牳
+     * @param qualityMonitor
+     * @return
+     */
+    @Override
+    public boolean examineQualityMonitor(QualityMonitor qualityMonitor) {
+        if (qualityMonitor.getRatifyUserId() == null) {
+            throw new ErrorException("缂哄皯鎵瑰噯浜�");
+        }
+
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        baseMapper.update(null, Wrappers.<QualityMonitor>lambdaUpdate()
+                .eq(QualityMonitor::getQualityMonitorId, qualityMonitor.getQualityMonitorId())
+                .set(QualityMonitor::getRatifyUserId, qualityMonitor.getRatifyUserId())
+                .set(QualityMonitor::getExamineRemark, qualityMonitor.getExamineRemark())
+                .set(QualityMonitor::getExamineStatus, qualityMonitor.getExamineStatus())
+                .set(QualityMonitor::getExamineTime, LocalDateTime.now())
+        );
+
+        QualityMonitor monitor = baseMapper.selectById(qualityMonitor.getQualityMonitorId());
+
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        // 娑堟伅鍙戦��
+        InformationNotification info = new InformationNotification();
+        // 鍙戦�佷汉
+        info.setCreateUser(user.getName());
+        info.setMessageType("6");
+        info.setTheme("CNAS璐ㄩ噺鐩戞帶璁″垝鎵瑰噯閫氱煡");
+        info.setContent(monitor.getMonitorName() + "璐ㄩ噺鐩戞帶璁″垝寰呮壒鍑�");
+        info.setSenderId(userId);
+        // 鎺ユ敹浜�
+        info.setConsigneeId(qualityMonitor.getRatifyUserId());
+        info.setJumpPath(MenuJumpPathConstants.QUALITY_MONITOR);
+        informationNotificationService.addInformationNotification(info);
+
+        // 鍙戦�佷紒涓氬井淇¢�氱煡
+        threadPoolTaskExecutor.execute(() -> {
+            // 鏌ヨ鍙戦�佷汉
+            User people = userMapper.selectById(qualityMonitor.getRatifyUserId());
+            String message = "";
+            message += "CNAS璐ㄩ噺鐩戞帶璁″垝鎵瑰噯閫氱煡";
+            message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戞帶璁″垝";
+            message += "\n" + monitor.getMonitorName() + "璐ㄩ噺鐩戞帶璁″垝寰呮壒鍑�";
+            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+            try {
+                WxCpUtils.inform(people.getAccount(), message, null);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+        return true;
+    }
+
+    /**
+     * 鐩戞帶璁″垝鎵瑰噯
+     * @param qualityMonitor
+     * @return
+     */
+    @Override
+    public boolean ratifyQualityMonitor(QualityMonitor qualityMonitor) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        baseMapper.update(null, Wrappers.<QualityMonitor>lambdaUpdate()
+                .eq(QualityMonitor::getQualityMonitorId, qualityMonitor.getQualityMonitorId())
+                .set(QualityMonitor::getRatifyRemark, qualityMonitor.getRatifyRemark())
+                .set(QualityMonitor::getRatifyStatus, qualityMonitor.getRatifyStatus())
+                .set(QualityMonitor::getRatifyTime, LocalDateTime.now())
+        );
+        return true;
+    }
+
+    /**
+     * 鐩戞帶璁″垝鍒楄〃
+     * @param page
+     * @param qualityMonitor
+     * @return
+     */
+    @Override
+    public IPage<QualityMonitorDto> pageQualityMonitor(Page page, QualityMonitor qualityMonitor) {
+        return baseMapper.pageQualityMonitor(page, QueryWrappers.queryWrappers(qualityMonitor));
+    }
+
+    /**
+     * 鐩戞帶璁″垝璇︽儏鍒楄〃
+     * @param page
+     * @param qualityMonitorDetails
+     * @return
+     */
+    @Override
+    public IPage<QualityMonitorDetailsDto> pageQualityMonitorDetail(Page page, QualityMonitorDetails qualityMonitorDetails) {
+        if (qualityMonitorDetails.getQualityMonitorId() == null) {
+            return new Page();
+        }
+        return qualityMonitorDetailsMapper.pageQualityMonitorDetail(page, QueryWrappers.queryWrappers(qualityMonitorDetails));
+    }
+
+    /**
+     * 瀵煎嚭鐩戞帶璁″垝
+     * @param qualityMonitorId
+     * @param response
+     */
+    @Override
+    public void exportQualityMonitorDetail(Integer qualityMonitorId, HttpServletResponse response) {
+        // 鏌ヨ璇︽儏
+        QualityMonitor qualityMonitor = baseMapper.selectById(qualityMonitorId);
+
+        //鑾峰彇鎻愪氦浜虹殑绛惧悕鍦板潃
+        String writeUrl = userMapper.selectById(qualityMonitor.getWriteUserId()).getSignatureUrl();
+        if (ObjectUtils.isEmpty(writeUrl) || writeUrl.equals("")) {
+            throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+        }
+
+        //鑾峰彇澶嶆牳浜虹殑绛惧悕鍦板潃
+        String examineUrl = null;
+        if (qualityMonitor.getExamineUserId() != null) {
+            examineUrl = userMapper.selectById(qualityMonitor.getExamineUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(examineUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+        String ratifyUrl = null;
+        if (qualityMonitor.getRatifyUserId() != null) {
+            ratifyUrl = userMapper.selectById(qualityMonitor.getRatifyUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(ratifyUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        // 鏌ヨ璇︽儏
+        List<QualityMonitorDetails> qualityMonitorDetails = qualityMonitorDetailsMapper.selectList(Wrappers.<QualityMonitorDetails>lambdaQuery()
+                .eq(QualityMonitorDetails::getQualityMonitorId, qualityMonitorId));
+
+        // 鍒ゆ柇鐩戞帶鐩殑涓�鏍风殑鍊�
+        AtomicInteger count = new AtomicInteger(1);
+        Map<String, List<QualityMonitorDetails>> listMap = qualityMonitorDetails.stream().collect(Collectors.groupingBy(QualityMonitorDetails::getMonitorPurpose));
+        listMap.forEach((s, details) -> {
+            // 鏌ヨ鏁伴噺瓒呰繃1鐨�
+            if (details.size() > 1) {
+                for (QualityMonitorDetails detail : details) {
+                    detail.setMonitorPurpose(detail.getMonitorPurpose() + "鈭�" + count);
+                }
+                count.getAndIncrement();
+            }
+        });
+
+        int index = 1;
+        for (QualityMonitorDetails qualityMonitorDetail : qualityMonitorDetails) {
+            qualityMonitorDetail.setIndex(index);
+            index++;
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/quality-monitor.docx");
+        String finalExamineUrl = examineUrl;
+        String finalRatifyUrl = ratifyUrl;
+        Configure configure = Configure.builder()
+                .bind("monitorDetailList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("year", qualityMonitor.getMonitorYear());
+                    put("monitorDetailList", qualityMonitorDetails);
+                    put("writeUrl", StringUtils.isNotBlank(writeUrl) ? Pictures.ofLocal(imgUrl + "/" + writeUrl).create() : null);
+                    put("examineUrl", StringUtils.isNotBlank(finalExamineUrl) ? Pictures.ofLocal(imgUrl + "/" + finalExamineUrl).create() : null);
+                    put("ratifyUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null);
+                    put("writeDateUrl", qualityMonitor.getWriteTime() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(qualityMonitor.getWriteTime())).create() : null);
+                    put("examineDateUrl", qualityMonitor.getExamineTime() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(qualityMonitor.getExamineTime())).create() : null);
+                    put("ratifyDateUrl", qualityMonitor.getRatifyTime() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(qualityMonitor.getRatifyTime())).create() : null);
+                }});
+
+        // 澶勭悊鎹㈣闂
+        XWPFDocumentUtils.updateMergeByDocument(template.getXWPFDocument());
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    qualityMonitor.getMonitorName(), "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+
+    /************************************************************  鎵瑰噯  *******************************************************************/
+
+    /**
+     * 鏌ヨ鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅
+     * @param qualityMonitorDetailsId
+     * @return
+     */
+    @Override
+    public QualityMonitorDetailsRatify getQualityMonitorRatify(Integer qualityMonitorDetailsId) {
+        QualityMonitorDetailsRatify qualityMonitorDetailsRatify;
+        // 鏌ヨ鐩戞帶閮ㄩ棬id
+        qualityMonitorDetailsRatify = qualityMonitorDetailsRatifyMapper.selectOne(Wrappers.<QualityMonitorDetailsRatify>lambdaQuery()
+                .eq(QualityMonitorDetailsRatify::getQualityMonitorDetailsId, qualityMonitorDetailsId));
+
+        if (qualityMonitorDetailsRatify == null) {
+            // 鏌ヨ璇︽儏璁″垝
+            QualityMonitorDetails qualityMonitorDetails = qualityMonitorDetailsMapper.selectById(qualityMonitorDetailsId);
+            qualityMonitorDetailsRatify = new QualityMonitorDetailsRatify();
+            qualityMonitorDetailsRatify.setQualityMonitorDetailsId(qualityMonitorDetailsId); // 璇︽儏id
+            qualityMonitorDetailsRatify.setMonitorProject(qualityMonitorDetails.getMonitorProject()); // 鐩戞帶椤圭洰
+            qualityMonitorDetailsRatify.setMonitorData(DateUtil.format(new Date(), "yyyy-MM")); // 鐩戞帶鏃堕棿
+            qualityMonitorDetailsRatify.setMonitorPurpose(qualityMonitorDetails.getMonitorPurpose()); // 鐩戞帶鐩殑
+            qualityMonitorDetailsRatify.setParticipant(qualityMonitorDetails.getParticipant()); // 鍙傚姞浜哄憳
+            qualityMonitorDetailsRatify.setBudget(qualityMonitorDetails.getBudget()); // 棰勭畻
+            qualityMonitorDetailsRatify.setInspectionDepartment(userMapper.selectUserDepartmentLimsName( SecurityUtils.getUserId().intValue()));
+        }
+
+        if (qualityMonitorDetailsRatify.getRatifyUserId() != null) {
+            qualityMonitorDetailsRatify.setRatifyName(userMapper.selectById(qualityMonitorDetailsRatify.getRatifyUserId()).getName());
+        }
+
+        return qualityMonitorDetailsRatify;
+    }
+
+    /**
+     * 鏂板鐩戞帶鎵瑰噯瀹炴柦
+     * @param qualityMonitorDetailsRatify
+     * @return
+     */
+    @Override
+    public boolean addQualityMonitorRatify(QualityMonitorDetailsRatify qualityMonitorDetailsRatify) {
+        if (qualityMonitorDetailsRatify.getQualityMonitorDetailsId() == null) {
+            throw new ErrorException("缂哄皯鐩戞帶璇︾粏淇℃伅id");
+        }
+        qualityMonitorDetailsRatifyService.saveOrUpdate(qualityMonitorDetailsRatify);
+        if (qualityMonitorDetailsRatify.getRatifyUserId() != null) {
+
+            // 鏌ヨ璇︽儏淇℃伅
+            QualityMonitorDetails monitorDetails = qualityMonitorDetailsMapper.selectById(qualityMonitorDetailsRatify.getQualityMonitorDetailsId());
+
+            Integer userId =SecurityUtils.getUserId().intValue();
+            User user = userMapper.selectById(userId);
+            // 娑堟伅鍙戦��
+            InformationNotification info = new InformationNotification();
+            // 鍙戦�佷汉
+            info.setCreateUser(user.getName());
+            info.setMessageType("6");
+            info.setTheme("CNAS璐ㄩ噺鐩戞帶瀹炴柦鎵瑰噯閫氱煡");
+            info.setContent("鐩戞帶椤圭洰涓�: " + monitorDetails.getMonitorProject() + " 璐ㄩ噺鐩戞帶瀹炴柦寰呮壒鍑�");
+            info.setSenderId(userId);
+            // 鎺ユ敹浜�
+            info.setConsigneeId(qualityMonitorDetailsRatify.getRatifyUserId());
+            info.setJumpPath(MenuJumpPathConstants.QUALITY_MONITOR);
+            informationNotificationService.addInformationNotification(info);
+
+            // 鍙戦�佷紒涓氬井淇¢�氱煡
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ鍙戦�佷汉
+                User people = userMapper.selectById(qualityMonitorDetailsRatify.getRatifyUserId());
+                String message = "";
+                message += "CNAS璐ㄩ噺鐩戞帶瀹炴柦鎵瑰噯閫氱煡";
+                message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戞帶璁″垝";
+                message += "\n" + "鐩戞帶椤圭洰涓�: " + monitorDetails.getMonitorProject() + " 璐ㄩ噺鐩戞帶瀹炴柦寰呮壒鍑�";
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(people.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+        }
+        // 娓呯┖鐘舵��
+        qualityMonitorDetailsRatifyService.update(Wrappers.<QualityMonitorDetailsRatify>lambdaUpdate()
+                .eq(QualityMonitorDetailsRatify::getDetailsRatifyId, qualityMonitorDetailsRatify.getDetailsRatifyId())
+                .set(QualityMonitorDetailsRatify::getIsFinish, null));
+        return true;
+    }
+
+    /**
+     * 鐩戞帶璁″垝璇︽儏鎵瑰噯鎰忚
+     * @param qualityMonitorDetailsRatify
+     * @return
+     */
+    @Override
+    public boolean addQualityMonitorRatifyOpinion(QualityMonitorDetailsRatify qualityMonitorDetailsRatify) {
+        LambdaUpdateWrapper<QualityMonitorDetailsRatify> wrapper = Wrappers.<QualityMonitorDetailsRatify>lambdaUpdate()
+                .eq(QualityMonitorDetailsRatify::getDetailsRatifyId, qualityMonitorDetailsRatify.getDetailsRatifyId())
+                .set(QualityMonitorDetailsRatify::getRatifyOpinion, qualityMonitorDetailsRatify.getRatifyOpinion())
+                .set(QualityMonitorDetailsRatify::getIsFinish, qualityMonitorDetailsRatify.getIsFinish());
+        // 涓�0娓呴櫎瀹℃牳浜�
+        if (qualityMonitorDetailsRatify.getIsFinish().equals(0)) {
+            wrapper.set(QualityMonitorDetailsRatify::getRatifyUserId, null);
+        }
+
+        qualityMonitorDetailsRatifyService.update(wrapper);
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅
+     *
+     * @param detailsRatifyId 鐩戞帶璁″垝璇︽儏瀹炴柦id
+     * @param response  鍝嶅簲
+     */
+    @Override
+    public void exportQualityMonitorRatify(Integer detailsRatifyId, HttpServletResponse response) {
+        QualityMonitorDetailsRatify qualityMonitorDetailsRatify = qualityMonitorDetailsRatifyMapper.selectOne(Wrappers.<QualityMonitorDetailsRatify>lambdaQuery().eq(QualityMonitorDetailsRatify::getQualityMonitorDetailsId, detailsRatifyId));
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/quality-monitor-details-ratify.docx");
+        Configure configure = Configure.builder()
+                .bind("processMethodVerifyMachineAttachmentList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("qualityMonitorDetailsRatify", qualityMonitorDetailsRatify);
+                    put("ratifyUserUrl", UserUtils.getFinalUserSignatureUrl(qualityMonitorDetailsRatify.getRatifyUserId()));
+                }});
+
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /************************************************************  璇勪环  *******************************************************************/
+
+    /**
+     * 鏌ヨ璐ㄩ噺鐩戞帶璇勪环
+     * @param qualityMonitorDetailsId
+     * @return
+     */
+    @Override
+    public QualityMonitorDetailsEvaluate getQualityMonitorEvaluate(Integer qualityMonitorDetailsId) {
+        return qualityMonitorDetailsEvaluateMapper.getQualityMonitorEvaluate(qualityMonitorDetailsId);
+    }
+
+    /**
+     * 鏂板鐩戞帶璇勪环
+     * @param qualityMonitorDetailsEvaluate
+     * @return
+     */
+    @Override
+    public boolean addQualityMonitorEvaluate(QualityMonitorDetailsEvaluate qualityMonitorDetailsEvaluate) {
+        if (qualityMonitorDetailsEvaluate.getQualityMonitorDetailsId() == null) {
+            throw new ErrorException("缂哄皯鐩戞帶璇︾粏淇℃伅id");
+        }
+        // 鏌ヨ璇︽儏淇℃伅
+        QualityMonitorDetails monitorDetails = qualityMonitorDetailsMapper.selectById(qualityMonitorDetailsEvaluate.getQualityMonitorDetailsId());
+        // 鍙戦�佹秷鎭�氱煡
+        // 鍒ゆ柇璇勫缁撹浜烘槸鍚︿负绌�
+        if (qualityMonitorDetailsEvaluate.getRatifyUserId() != null) {
+
+            Integer userId =SecurityUtils.getUserId().intValue();
+            User user = userMapper.selectById(userId);
+            // 娑堟伅鍙戦��
+            InformationNotification info = new InformationNotification();
+            // 鍙戦�佷汉
+            info.setCreateUser(user.getName());
+            info.setMessageType("6");
+            info.setTheme("CNAS璐ㄩ噺鐩戞帶璇勪环缁撹閫氱煡");
+            info.setContent("鐩戞帶椤圭洰涓�: " + monitorDetails.getMonitorProject() + " 璐ㄩ噺鐩戞帶寰呰瘎浠风粨璁�");
+            info.setSenderId(userId);
+            // 鎺ユ敹浜�
+            info.setConsigneeId(qualityMonitorDetailsEvaluate.getRatifyUserId());
+            info.setJumpPath(MenuJumpPathConstants.QUALITY_MONITOR);
+            informationNotificationService.addInformationNotification(info);
+
+            // 鍙戦�佷紒涓氬井淇¢�氱煡
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ鍙戦�佷汉
+                User people = userMapper.selectById(qualityMonitorDetailsEvaluate.getRatifyUserId());
+                String message = "";
+                message += "CNAS璐ㄩ噺鐩戞帶璇勪环缁撹閫氱煡";
+                message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戞帶璁″垝";
+                message += "\n" + "鐩戞帶椤圭洰涓�: " + monitorDetails.getMonitorProject() + " 璐ㄩ噺鐩戞帶寰呰瘎浠风粨璁�";
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(people.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+
+        } else {
+            // 鐩戞帶缁撴灉璇勪环
+            if (qualityMonitorDetailsEvaluate.getImplementUserId() != null) {
+                Integer userId =SecurityUtils.getUserId().intValue();
+                User user = userMapper.selectById(userId);
+                // 娑堟伅鍙戦��
+                InformationNotification info = new InformationNotification();
+                // 鍙戦�佷汉
+                info.setCreateUser(user.getName());
+                info.setMessageType("6");
+                info.setTheme("CNAS璐ㄩ噺鐩戞帶缁撴灉璇勪环");
+                info.setContent("鐩戞帶椤圭洰涓�: " + monitorDetails.getMonitorProject() + " 璐ㄩ噺鐩戞帶寰呰瘎浠风粨璁�");
+                info.setSenderId(userId);
+                // 鎺ユ敹浜�
+                info.setConsigneeId(qualityMonitorDetailsEvaluate.getImplementUserId());
+                info.setJumpPath(MenuJumpPathConstants.QUALITY_MONITOR);
+                informationNotificationService.addInformationNotification(info);
+
+                // 鍙戦�佷紒涓氬井淇¢�氱煡
+                threadPoolTaskExecutor.execute(() -> {
+                    // 鏌ヨ鍙戦�佷汉
+                    User people = userMapper.selectById(qualityMonitorDetailsEvaluate.getImplementUserId());
+                    String message = "";
+                    message += "CNAS璐ㄩ噺鐩戞帶缁撴灉璇勪环";
+                    message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戞帶璁″垝";
+                    message += "\n" + "鐩戞帶椤圭洰涓�: " + monitorDetails.getMonitorProject() + " 璐ㄩ噺鐩戞帶寰呰瘎浠风粨璁�";
+                    //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                    try {
+                        WxCpUtils.inform(people.getAccount(), message, null);
+                    } catch (Exception e) {
+                        throw new RuntimeException(e);
+                    }
+                });
+            }
+        }
+
+
+        return qualityMonitorDetailsEvaluateService.saveOrUpdate(qualityMonitorDetailsEvaluate);
+    }
+
+    /**
+     * 鐩戞帶璇勪环瀹℃壒鎰忚
+     * @param qualityMonitorDetailsEvaluate
+     * @return
+     */
+    @Override
+    public boolean addMonitorEvaluateOpinion(QualityMonitorDetailsEvaluate qualityMonitorDetailsEvaluate) {
+        qualityMonitorDetailsEvaluateService.update(Wrappers.<QualityMonitorDetailsEvaluate>lambdaUpdate()
+                .eq(QualityMonitorDetailsEvaluate::getDetailsEvaluateId, qualityMonitorDetailsEvaluate.getDetailsEvaluateId())
+                .set(QualityMonitorDetailsEvaluate::getRatifyOpinion, qualityMonitorDetailsEvaluate.getRatifyOpinion())
+                .set(QualityMonitorDetailsEvaluate::getRatifyTime, LocalDateTime.now())
+                .set(QualityMonitorDetailsEvaluate::getIsFinish, 1));
+        return true;
+    }
+
+    /**
+     * 鏂板鐩戞帶璇勪环闄勪欢琛�
+     * @param qualityMonitorDetailsId
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean uploadEvaluateFile(Integer qualityMonitorDetailsId, MultipartFile file) {
+        if (qualityMonitorDetailsId == null) {
+            throw new ErrorException("缂哄皯鐩戞帶璇︽儏id");
+        }
+
+        String urlString;
+        String pathName;
+        String path;
+        String filename = file.getOriginalFilename();
+        String contentType = file.getContentType();
+        QualityMonitorDetailsEvaluateFile evaluateFile = new QualityMonitorDetailsEvaluateFile();
+        evaluateFile.setDetailsEvaluateId(qualityMonitorDetailsId);
+        evaluateFile.setFileName(filename);
+        if (contentType != null && contentType.startsWith("image/")) {
+            // 鏄浘鐗�
+            path = imgUrl;
+            evaluateFile.setType(1);
+        } else {
+            // 鏄枃浠�
+            path = wordUrl;
+            evaluateFile.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));
+            evaluateFile.setFileUrl(pathName);
+            qualityMonitorDetailsEvaluateFileMapper.insert(evaluateFile);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println("闄勪欢涓婁紶閿欒");
+            return false;
+        }
+    }
+
+    /**
+     * 鏌ヨ鐩戞帶璇勪环闄勪欢鍒楄〃
+     * @return
+     */
+    @Override
+    public List<QualityMonitorDetailsEvaluateFile> getEvaluateFileList(Integer qualityMonitorDetailsId) {
+        return qualityMonitorDetailsEvaluateFileMapper.selectList(Wrappers.<QualityMonitorDetailsEvaluateFile>lambdaQuery()
+                .eq(QualityMonitorDetailsEvaluateFile::getDetailsEvaluateId, qualityMonitorDetailsId));
+    }
+
+
+    /**
+     * 瀵煎嚭鐩戞帶璇勪环
+     * @param detailsEvaluateId 鐩戞帶璇勪环id
+     */
+    @Override
+    public void exportQualityMonitorEvaluate(Integer detailsEvaluateId, HttpServletResponse response) {
+        // 鏌ヨ鐩戞帶璇勪环淇℃伅
+        QualityMonitorDetailsEvaluate qualityMonitorDetailsEvaluate = qualityMonitorDetailsEvaluateMapper.selectOne(Wrappers.<QualityMonitorDetailsEvaluate>lambdaQuery().eq(QualityMonitorDetailsEvaluate::getQualityMonitorDetailsId,detailsEvaluateId));
+        // 娓叉煋word妯℃澘瀵硅薄
+        QualityMonitorDetailsEvaluateDto qualityMonitorDetailsEvaluateDto = new QualityMonitorDetailsEvaluateDto();
+        BeanUtils.copyProperties(qualityMonitorDetailsEvaluate, qualityMonitorDetailsEvaluateDto);
+        // 鏍煎紡鍖栨椂闂�
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        qualityMonitorDetailsEvaluateDto.setRatifyTimeStr(qualityMonitorDetailsEvaluate.getRatifyTime() == null ? null : qualityMonitorDetailsEvaluate.getRatifyTime().format(dateTimeFormatter));
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/quality-monitor-evaluate.docx");
+        Configure configure = Configure.builder()
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("qualityMonitorDetailsEvaluate", qualityMonitorDetailsEvaluateDto);
+                    put("implementUserUrl", UserUtils.getFinalUserSignatureUrl(Integer.valueOf(qualityMonitorDetailsEvaluate.getImplementUserId())));
+                    put("ratifyUserUrl", UserUtils.getFinalUserSignatureUrl(qualityMonitorDetailsEvaluate.getRatifyUserId()));
+                }});
+
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /************************************************** 鐩戞帶瀹屾垚鎶ュ憡 ****************************************************************/
+
+    /**
+     * 涓婁紶鐩戞帶瀹屾垚鎶ュ憡
+     * @param file
+     * @param qualityMonitorDetailsId
+     * @return
+     */
+    @Override
+    public boolean uploadFinishReport(MultipartFile file, Integer qualityMonitorDetailsId) {
+        if (qualityMonitorDetailsId == null) {
+            throw new ErrorException("缂哄皯鐩戞帶璇︽儏id");
+        }
+        LocalDateTime now = LocalDateTime.now();
+        Integer userId =SecurityUtils.getUserId().intValue();
+        String contentType = file.getContentType();
+        String urlString;
+        String pathName;
+        try {
+            String path = wordUrl;
+            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));
+
+            // 鍒ゆ柇鏄惁鏄痯df
+            if (!contentType.contains("pdf")) {
+                wordInsertUrl(new HashMap<String, Object>() {{
+                    put("writeUrl", UserUtils.getFinalUserSignatureUrl(userId));
+                    put("writeDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(now)).create());
+                }}, wordUrl + "/" + pathName.replace("/word", wordUrl));
+            }
+
+            qualityMonitorDetailsService.update(Wrappers.<QualityMonitorDetails>lambdaUpdate()
+                    .eq(QualityMonitorDetails::getQualityMonitorDetailsId, qualityMonitorDetailsId)
+                    .set(QualityMonitorDetails::getFinishReportUrl, pathName)
+                    .set(QualityMonitorDetails::getWriteTime, now));
+
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ErrorException("鏂囦欢涓婁紶澶辫触");
+        }
+    }
+
+    /**
+     * 鎵瑰噯瀹屾垚鎶ュ憡
+     * @param qualityMonitorDetails
+     * @return
+     */
+    @Override
+    public boolean ratifyFinishReport(QualityMonitorDetails qualityMonitorDetails) {
+        LocalDateTime now = LocalDateTime.now();
+        Integer userId =SecurityUtils.getUserId().intValue();
+        LambdaUpdateWrapper<QualityMonitorDetails> wrapper = Wrappers.<QualityMonitorDetails>lambdaUpdate()
+                .eq(QualityMonitorDetails::getQualityMonitorDetailsId, qualityMonitorDetails.getQualityMonitorDetailsId())
+                .set(QualityMonitorDetails::getRatifyUserId, userId)
+                .set(QualityMonitorDetails::getRatifyRemark, qualityMonitorDetails.getRatifyRemark())
+                .set(QualityMonitorDetails::getRatifyStatus, qualityMonitorDetails.getRatifyStatus())
+                .set(QualityMonitorDetails::getRatifyTime, now);
+        if (qualityMonitorDetails.getRatifyStatus().equals(0)) {
+            wrapper.set(QualityMonitorDetails::getFinishReportUrl, null);
+        }
+        qualityMonitorDetailsMapper.update(null, wrapper);
+
+        // 娣诲姞鎵瑰噯浜�
+        QualityMonitorDetails details = qualityMonitorDetailsMapper.selectById(qualityMonitorDetails.getQualityMonitorDetailsId());
+        if (StringUtils.isNotBlank(details.getFinishReportUrl()) && !details.getFinishReportUrl().contains(".pdf")) {
+            wordInsertUrl(new HashMap<String, Object>() {{
+                put("ratifyUrl", UserUtils.getFinalUserSignatureUrl(userId));
+                put("ratifyDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(now)).create());
+            }}, wordUrl + "/" + details.getFinishReportUrl().replace("/word", wordUrl));
+        }
+        return true;
+    }
+
+    public int wordInsertUrl(Map<String, Object> map, String url) {
+        XWPFTemplate template = XWPFTemplate.compile(url).render(map);
+        try {
+            template.writeAndClose(Files.newOutputStream(Paths.get(url)));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return 1;
+    }
+
+
+}
+

--
Gitblit v1.9.3