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/QualitySuperviseServiceImpl.java | 1267 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1,267 insertions(+), 0 deletions(-)

diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseServiceImpl.java
new file mode 100644
index 0000000..e8c52f0
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseServiceImpl.java
@@ -0,0 +1,1267 @@
+package com.ruoyi.process.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+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.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.PictureRenderData;
+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.process.dto.QualitySuperviseDetailsAccordingDto;
+import com.ruoyi.process.dto.QualitySuperviseDetailsCorrectDto;
+import com.ruoyi.process.dto.QualitySuperviseDetailsDto;
+import com.ruoyi.process.excel.QualitySuperviseDetailsUpload;
+import com.ruoyi.process.mapper.*;
+import com.ruoyi.process.pojo.*;
+import com.ruoyi.process.service.QualitySuperviseDetailsService;
+import com.ruoyi.process.service.QualitySuperviseService;
+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.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.YearMonth;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 璐ㄩ噺鐩戠潱涓昏〃
+ *
+ * @author zhuo
+ * @since 2024-11-07
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class QualitySuperviseServiceImpl extends ServiceImpl<QualitySuperviseMapper, QualitySupervise> implements QualitySuperviseService {
+
+    @Resource
+    private QualitySuperviseDetailsService qualitySuperviseDetailsService;
+    @Resource
+    private QualitySuperviseDetailsMapper qualitySuperviseDetailsMapper;
+    @Resource
+    private QualitySuperviseDetailsRecordMapper qualitySuperviseDetailsRecordMapper;
+    @Resource
+    private QualitySuperviseDetailsAccordingMapper qualitySuperviseDetailsAccordingMapper;
+    @Resource
+    private QualitySuperviseDetailsCorrectMapper qualitySuperviseDetailsCorrectMapper;
+    @Resource
+    private QualitySuperviseDetailsCorrectFileMapper qualitySuperviseDetailsCorrectFileMapper;
+    @Resource
+    private InformationNotificationService informationNotificationService;
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Resource
+    private UserMapper userMapper;
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    /**
+     * 瀵煎叆鐩戠潱璁″垝
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean importQualitySupervise(MultipartFile file, QualitySupervise supervise) {
+        if (supervise.getRatifyUserId() == null) {
+            throw new ErrorException("缂哄皯鎵瑰噯浜�");
+        }
+        User ratifyUser = userMapper.selectById(supervise.getRatifyUserId());
+
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+
+        // 鏂囦欢鍚嶇О
+        String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
+        QualitySupervise qualitySupervise = new QualitySupervise();
+        qualitySupervise.setSuperviseName(fileName);
+        qualitySupervise.setSuperviseYear(supervise.getSuperviseYear());
+        qualitySupervise.setRecordUserIds(supervise.getRecordUserIds());
+        qualitySupervise.setWriteUserId(userId);
+        qualitySupervise.setWriteUserName(user.getName());
+        qualitySupervise.setWriteTime(LocalDateTime.now());
+        qualitySupervise.setRatifyUserId(supervise.getRatifyUserId());
+        qualitySupervise.setRatifyUserName(ratifyUser.getName());
+        baseMapper.insert(qualitySupervise);
+
+        // 娑堟伅鍙戦��
+        InformationNotification info = new InformationNotification();
+        // 鍙戦�佷汉
+        info.setCreateUser(user.getName());
+        info.setMessageType("6");
+        info.setTheme("CNAS璐ㄩ噺鐩戠潱璁″垝瀹℃牳閫氱煡");
+        info.setContent("鎮ㄦ湁涓�鏉¤川閲忕洃鐫h鍒掑緟鎵瑰噯");
+        info.setSenderId(userId);
+        // 鎺ユ敹浜�
+        info.setConsigneeId(supervise.getRatifyUserId());
+        info.setJumpPath(MenuJumpPathConstants.QUALITY_SUPERVISE);
+        informationNotificationService.addInformationNotification(info);
+
+        // 鍙戦�佷紒涓氬井淇¢�氱煡
+        threadPoolTaskExecutor.execute(() -> {
+            // 鏌ヨ鍙戦�佷汉
+            User people = userMapper.selectById(supervise.getRatifyUserId());
+            String message = "";
+            message += "CNAS璐ㄩ噺鐩戠潱璁″垝鎵瑰噯閫氱煡";
+            message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戠潱璁″垝";
+            message += "\n" + fileName + "璐ㄩ噺鐩戠潱璁″垝寰呮壒鍑�";
+            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+            try {
+                WxCpUtils.inform(people.getAccount(), message, null);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+
+        List<QualitySuperviseDetails> detailsUploadList = new ArrayList<>();
+
+        // 瀵煎叆闄勪欢鍐呭
+        try {
+            // excel瑙f瀽
+            EasyExcel.read(file.getInputStream(), QualitySuperviseDetailsUpload.class, new AnalysisEventListener<QualitySuperviseDetailsUpload>() {
+                @Override
+                public void invoke(QualitySuperviseDetailsUpload detailsUpload, AnalysisContext analysisContext) {
+                    // 鍒ゆ柇鏄惁涓虹┖
+                    if (StringUtils.isBlank(detailsUpload.getSuperviseTime())) {
+                        throw new ErrorException("鐩戠潱鏃ユ湡涓嶈兘涓虹┖");
+                    }
+                    // 瀵硅薄澶嶅埗
+                    QualitySuperviseDetails superviseDetails = new QualitySuperviseDetails();
+                    BeanUtils.copyProperties(detailsUpload, superviseDetails);
+                    superviseDetails.setSuperviseId(qualitySupervise.getSuperviseId());
+
+                    User user = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                            .eq(User::getName, superviseDetails.getSupervisee()));
+                    if (ObjectUtils.isEmpty(user)) {
+                        throw new ErrorException("鏈壘鍒拌鐩戠潱鍛橈細" + superviseDetails.getSupervisee());
+                    }
+                    superviseDetails.setSupervisedUserId(user.getId());
+                    // 鏍煎紡鍖栨椂闂�
+                    superviseDetails.setSuperviseTime(detailsUpload.getSuperviseTime());
+
+                    detailsUploadList.add(superviseDetails);
+                }
+
+                @Override
+                public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+
+                }
+            }).sheet().doRead();
+            qualitySuperviseDetailsService.saveBatch(detailsUploadList);
+
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return true;
+    }
+
+    /**
+     * 鐩戠潱璁″垝鎵瑰噯
+     * @param qualitySupervise
+     * @return
+     */
+    @Override
+    public boolean ratifyQualitySupervise(QualitySupervise qualitySupervise) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        baseMapper.update(null, Wrappers.<QualitySupervise>lambdaUpdate()
+                .eq(QualitySupervise::getSuperviseId, qualitySupervise.getSuperviseId())
+                .set(QualitySupervise::getRatifyRemark, qualitySupervise.getRatifyRemark())
+                .set(QualitySupervise::getRatifyStatus, qualitySupervise.getRatifyStatus())
+                .set(QualitySupervise::getRatifyTime, LocalDateTime.now())
+        );
+        return true;
+    }
+
+    /**
+     * 鐩戠潱璁″垝鍒楄〃
+     * @param page
+     * @param qualitySupervise
+     * @return
+     */
+    @Override
+    public IPage<QualitySupervise> pageQualitySupervise(Page page, QualitySupervise qualitySupervise) {
+        return baseMapper.pageQualitySupervise(page, QueryWrappers.queryWrappers(qualitySupervise));
+    }
+
+    /**
+     * 鐩戠潱璁″垝璇︽儏鍒楄〃
+     * @return
+     */
+    @Override
+    public IPage<QualitySuperviseDetailsDto> pageQualitySuperviseDetail(Page page, QualitySuperviseDetailsDto qualitySuperviseDetails) {
+        if (qualitySuperviseDetails.getSuperviseId() == null) {
+            return new Page();
+        }
+        Integer causeType = qualitySuperviseDetails.getCauseType();
+        qualitySuperviseDetails.setCauseType(null);
+        return qualitySuperviseDetailsMapper.pageQualitySuperviseDetail(page, QueryWrappers.queryWrappers(qualitySuperviseDetails), causeType);
+    }
+
+    /**
+     * 鏌ヨ璇ヨ鍒掔洃鐫e憳
+     * @param superviseDetailsId
+     * @return
+     */
+    @Override
+    public List<Map<String, String>> getRecordUser(Integer superviseDetailsId) {
+        List<Map<String, String>> recordUser = baseMapper.getRecordUser(superviseDetailsId);
+        return baseMapper.getRecordUser(superviseDetailsId);
+    }
+
+    /**
+     * 瀵煎嚭鐩戠潱璁″垝
+     * @param superviseId
+     * @param response
+     */
+    @Override
+    public void exportQualitySupervise(Integer superviseId, HttpServletResponse response) {
+        QualitySupervise qualitySupervise = baseMapper.selectById(superviseId);
+        //鑾峰彇鎻愪氦浜虹殑绛惧悕鍦板潃
+        String writeUrl = userMapper.selectById(qualitySupervise.getWriteUserId()).getSignatureUrl();
+        if (ObjectUtils.isEmpty(writeUrl) || writeUrl.equals("")) {
+            throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+        }
+
+        //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+        String ratifyUrl = null;
+        if (qualitySupervise.getRatifyUserId() != null) {
+            ratifyUrl = userMapper.selectById(qualitySupervise.getRatifyUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(ratifyUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        // 瀹氫箟涓�涓泦鍚堝瓨鏀句汉鍛樼鍚�
+        ArrayList<PictureRenderData> recordUserDataList = new ArrayList<>();
+        // TODO:纭鏈�澶氫細鏈�5涓汉
+        String recordUserIds = qualitySupervise.getRecordUserIds();
+        if (StringUtils.isNotBlank(recordUserIds)) {
+            // 瀵逛汉鍛榠d瀛楃涓茶繘琛屽垎鍓叉垚鏁扮粍
+            String[] userIds = recordUserIds.split(",");
+            // 寰幆鑾峰彇浜哄憳绛惧悕
+            for (String userIdStr : userIds) {
+                // 杞崲涓篿nt绫诲瀷
+                Integer userId = Integer.valueOf(userIdStr);
+                // 鑾峰彇浜哄憳绛惧悕瀵硅薄
+                PictureRenderData finalUserSignatureUrl = UserUtils.getFinalUserSignatureUrl(userId);
+                // 灏嗕汉鍛樼鍚嶅璞℃坊鍔犲埌闆嗗悎涓�
+                recordUserDataList.add(finalUserSignatureUrl);
+            }
+        }
+
+        // 鍒ゆ柇闆嗗悎闀垮害锛屽苟琛ull鍒�2涓�
+        while (recordUserDataList.size() < 2) {
+            recordUserDataList.add(null);
+        }
+
+        // 鏌ヨ璇︽儏
+        List<QualitySuperviseDetails> qualitySuperviseDetails = qualitySuperviseDetailsMapper.selectList(Wrappers.<QualitySuperviseDetails>lambdaQuery()
+                .eq(QualitySuperviseDetails::getSuperviseId, superviseId));
+
+        int index = 1;
+        for (QualitySuperviseDetails qualitySuperviseDetail : qualitySuperviseDetails) {
+            qualitySuperviseDetail.setIndex(index);
+            index++;
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/quality-supervise.docx");
+        String finalRatifyUrl = ratifyUrl;
+        Configure configure = Configure.builder()
+                .bind("superviseDetailList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("year", qualitySupervise.getSuperviseYear());
+                    put("superviseDetailList", qualitySuperviseDetails);
+                    put("writeUrl", StringUtils.isNotBlank(writeUrl) ? Pictures.ofLocal(imgUrl + "/" + writeUrl).create() : null);
+                    put("ratifyUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null);
+                    put("writeDateUrl", qualitySupervise.getWriteTime() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(qualitySupervise.getWriteTime())).create() : null);
+                    put("ratifyDateUrl", qualitySupervise.getRatifyTime() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(qualitySupervise.getRatifyTime())).create() : null);
+                    put("recordUserUrl1", recordUserDataList.get(0));
+                    put("recordUserUrl2", recordUserDataList.get(1));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    qualitySupervise.getSuperviseName(), "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 superviseDetailsId
+     * @return
+     */
+    @Override
+    public QualitySuperviseDetailsRecord getSuperviseDetailRecord(Integer superviseDetailsId) {
+        QualitySuperviseDetailsRecord detailsRecord;
+        detailsRecord = qualitySuperviseDetailsRecordMapper.selectOne(Wrappers.<QualitySuperviseDetailsRecord>lambdaQuery()
+                .eq(QualitySuperviseDetailsRecord::getSuperviseDetailsId, superviseDetailsId));
+
+        // 鏌ヨ涓婁竴涓湀绗竴鏉$殑璁板綍淇℃伅, 鍒ゆ柇琚洃鐫d汉鍘诲彟澶栦竴涓�
+        if (detailsRecord == null) {
+            // 鏌ヨ璇︽儏淇℃伅
+            QualitySuperviseDetails qualitySuperviseDetails = qualitySuperviseDetailsMapper.selectById(superviseDetailsId);
+            // 鏌ヨ涓婁竴涓湀绗竴鏉$殑璁板綍淇℃伅, 鍒ゆ柇琚洃鐫d汉鍘诲彟澶栦竴涓�
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.M");
+            YearMonth yearMonth = YearMonth.parse(qualitySuperviseDetails.getSuperviseTime(), formatter);
+            YearMonth previousYearMonth = yearMonth.minusMonths(1);
+
+            LocalDate startDate = previousYearMonth.atDay(1);
+            LocalDate endDate = previousYearMonth.atEndOfMonth();
+
+            LocalDateTime startDateTime = startDate.atStartOfDay();
+            LocalDateTime endDateTime = endDate.atTime(23, 59, 59);
+
+            DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+            // 鑾峰彇寮�濮嬫椂闂村拰缁撴潫鏃堕棿
+            String startDateTimeStr = startDateTime.format(outputFormatter);
+            String endDateTimeStr = endDateTime.format(outputFormatter);
+
+            QualitySuperviseDetailsRecord laseRecord = qualitySuperviseDetailsRecordMapper.selectOne(Wrappers.<QualitySuperviseDetailsRecord>lambdaQuery()
+                    .between(QualitySuperviseDetailsRecord::getCreateTime, startDateTimeStr, endDateTimeStr)
+                    .isNotNull(QualitySuperviseDetailsRecord::getSupervisor)
+                    .last("limit 1"));
+
+            String supervisor = null;
+
+            if (laseRecord != null) {
+                // 鏌ヨ璁″垝鑾峰彇鍙︿竴涓洃鐫e憳
+                QualitySupervise qualitySupervise = baseMapper.selectById(qualitySuperviseDetails.getSuperviseId());
+                if (StringUtils.isNotBlank(qualitySupervise.getRecordUserIds())) {
+                    List<String> recordUserIds = StrUtil.split(qualitySupervise.getRecordUserIds(), ',');
+                    List<User> users = userMapper.selectList(Wrappers.<User>lambdaQuery()
+                            .in(User::getId, recordUserIds));
+                    if (CollectionUtils.isNotEmpty(users) && users.size() == 2) {
+                        // 鍒ゆ柇鏄惁涓�鏍�, 涓�鏍疯幏鍙栧彟澶栦竴涓�
+                        if (users.get(0).getName().equals(laseRecord.getSupervisor())) {
+                            supervisor = users.get(1).getName();
+                        } else {
+                            supervisor = users.get(0).getName();
+                        }
+
+                    }
+                }
+            }
+
+            detailsRecord = new QualitySuperviseDetailsRecord();
+            detailsRecord.setSuperviseDetailsId(superviseDetailsId);
+            detailsRecord.setTestMember(qualitySuperviseDetails.getSupervisee());
+            detailsRecord.setSupervisor(supervisor);
+
+            detailsRecord.setPersonnel(SecurityUtils.getLoginUser().getUser().getNickName() + "鏈夌浉搴旀娴嬪憳鐨勪笂宀楄瘉");
+            detailsRecord.setEnvironment("娓╁害锛�()鈩� 婀垮害锛�()%");
+            detailsRecord.setInspectionRecord("妫�娴嬩汉鍛�" + SecurityUtils.getLoginUser().getUser().getNickName() + "杩涜妫�娴嬭褰曪紝璁板綍鍐呭鐪熷疄鏈夋晥");
+            detailsRecord.setExaminingReport("鐢�" + SecurityUtils.getLoginUser().getUser().getNickName() + "鍑虹ず鐨勬娴嬫姤鍛婄鍚堣鑼冭姹�");
+            detailsRecord.setSupervisionEvaluation("妫�娴嬫寜鐓ц姹傝繘琛岋紝鍒ゅ畾涓烘弧鎰�");
+            detailsRecord.setHandlingAdvice("/");
+
+        }
+        // 娣诲姞鎵瑰噯浜哄悕绉�
+        if (detailsRecord.getRatifyUserId() != null) {
+            User user = userMapper.selectById(detailsRecord.getRatifyUserId());
+            detailsRecord.setRatifyUserName(user.getName());
+        }
+        return detailsRecord;
+    }
+
+    /**
+     * 鏂板鐩戠潱璁板綍淇℃伅
+     * @param qualitySuperviseDetailsRecord
+     * @return
+     */
+    @Override
+    public boolean addSuperviseDetailRecord(QualitySuperviseDetailsRecord qualitySuperviseDetailsRecord) {
+        if (qualitySuperviseDetailsRecord.getSuperviseDetailsId() == null) {
+            throw new ErrorException("缂哄皯鐩戠潱璇︾粏淇℃伅id");
+        }
+        if (qualitySuperviseDetailsRecord.getSuperviseDetailsRecordId() == null) {
+            qualitySuperviseDetailsRecordMapper.insert(qualitySuperviseDetailsRecord);
+        } else {
+            qualitySuperviseDetailsRecordMapper.updateById(qualitySuperviseDetailsRecord);
+        }
+
+        if (qualitySuperviseDetailsRecord.getRatifyUserId() != null) {
+
+            // 鏌ヨ璇︽儏淇℃伅
+            QualitySuperviseDetails superviseDetails = qualitySuperviseDetailsMapper.selectById(qualitySuperviseDetailsRecord.getSuperviseDetailsId());
+
+            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("鐩戠潱椤圭洰涓�: " + superviseDetails.getSuperviseProject() + " 鐩戠潱璁板綍寰呭鎵�");
+            info.setSenderId(userId);
+            // 鎺ユ敹浜�
+            info.setConsigneeId(qualitySuperviseDetailsRecord.getRatifyUserId());
+            info.setJumpPath(MenuJumpPathConstants.QUALITY_SUPERVISE);
+            informationNotificationService.addInformationNotification(info);
+
+            // 鍙戦�佷紒涓氬井淇¢�氱煡
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ鍙戦�佷汉
+                User people = userMapper.selectById(qualitySuperviseDetailsRecord.getRatifyUserId());
+                String message = "";
+                message += "CNAS璐ㄩ噺鐩戠潱璁板綍瀹℃壒閫氱煡";
+                message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戠潱璁″垝";
+                message += "\n" + "鐩戠潱椤圭洰涓�: " + superviseDetails.getSuperviseProject() + " 鐩戠潱璁板綍寰呭鎵�";
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(people.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+        }
+        // 娓呯┖鐘舵��
+        qualitySuperviseDetailsRecordMapper.update(null, Wrappers.<QualitySuperviseDetailsRecord>lambdaUpdate()
+                .eq(QualitySuperviseDetailsRecord::getSuperviseDetailsRecordId, qualitySuperviseDetailsRecord.getSuperviseDetailsRecordId())
+                .set(QualitySuperviseDetailsRecord::getIsFinish, null));
+
+        return true;
+    }
+
+    /**
+     * 鐩戠潱璁板綍鎵瑰噯
+     * @param qualitySuperviseDetailsRecord
+     * @return
+     */
+    @Override
+    public boolean addSuperviseRecordOpinion(QualitySuperviseDetailsRecord qualitySuperviseDetailsRecord) {
+        if (qualitySuperviseDetailsRecord.getIsFinish() == null) {
+            throw new RuntimeException("缂哄皯璁板綍缁撴灉鐘舵��");
+        }
+
+        LambdaUpdateWrapper<QualitySuperviseDetailsRecord> wrapper = Wrappers.<QualitySuperviseDetailsRecord>lambdaUpdate()
+                .eq(QualitySuperviseDetailsRecord::getSuperviseDetailsId, qualitySuperviseDetailsRecord.getSuperviseDetailsId())
+                .set(QualitySuperviseDetailsRecord::getRatifyOpinion, qualitySuperviseDetailsRecord.getRatifyOpinion())
+                .set(QualitySuperviseDetailsRecord::getIsAccording, qualitySuperviseDetailsRecord.getIsAccording())
+                .set(QualitySuperviseDetailsRecord::getIsFinish, qualitySuperviseDetailsRecord.getIsFinish());
+
+        // 涓�0娓呴櫎瀹℃牳浜�
+        if (qualitySuperviseDetailsRecord.getIsFinish().equals(0)) {
+            wrapper.set(QualitySuperviseDetailsRecord::getRatifyUserId, null)
+                    .set(QualitySuperviseDetailsRecord::getRatifyTime, null);
+        } else {
+            wrapper.set(QualitySuperviseDetailsRecord::getRatifyTime, LocalDateTime.now());
+        }
+
+        qualitySuperviseDetailsRecordMapper.update(null, wrapper);
+
+
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭鐩戠潱璁板綍琛�
+     * @param superviseDetailsId
+     * @param response
+     */
+    @Override
+    public void exportSuperviseDetailRecord(Integer superviseDetailsId, HttpServletResponse response) {
+        QualitySuperviseDetailsRecord recordDto = qualitySuperviseDetailsRecordMapper.selectSuperviseDetailRecord(superviseDetailsId);
+
+        // 鏌ヨ妫�娴嬩汉鍛�
+        User tserUser = new User();
+        if (StringUtils.isNotBlank(recordDto.getTestMember())) {
+            tserUser = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                    .eq(User::getName, recordDto.getTestMember())
+                    .last("limit 1"));
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/supervision-detail-record.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        User finalTserUser = tserUser;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("supervision", recordDto);
+                    put("testMemberUrl", UserUtils.getFinalUserSignatureUrl(finalTserUser.getId()));
+                    put("supervisoruUrl", UserUtils.getFinalUserSignatureUrl(recordDto.getSupervisor()));
+                    put("technicalDirectorUrl", UserUtils.getFinalUserSignatureUrl(recordDto.getRatifyUserId()));
+                    put("technicalDirectorDateUrl", recordDto.getRatifyTime() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(recordDto.getRatifyTime())).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /*************************************************  涓嶅悎鏍煎伐浣滄帶鍒跺崟 ********************************************************/
+
+    /**
+     * 鏂板鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @param detailsAccording
+     * @return
+     */
+    @Override
+    public boolean addSuperviseDetailAccording(QualitySuperviseDetailsAccording detailsAccording) {
+        QualitySuperviseDetailsAccording according = new QualitySuperviseDetailsAccording();
+        // 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅鍜岄儴闂�
+        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+        String departmentLimsName = userMapper.selectUserDepartmentLimsName(user.getId());
+        switch (detailsAccording.getFlowType()) {
+            // 涓嶇鍚堝伐浣滄儏鍐佃褰�
+            case 0:
+                if (detailsAccording.getSuperviseDetailsId() == null) {
+                    throw new ErrorException("缂哄皯璐ㄩ噺鐩戠潱璇︽儏Id");
+                }
+                according.setSuperviseDetailsId(detailsAccording.getSuperviseDetailsId());
+                according.setOccurrenceDepartment(detailsAccording.getOccurrenceDepartment());//鍙戠敓閮ㄩ棬
+                according.setHeadDepartment(detailsAccording.getHeadDepartment());//閮ㄩ棬璐熻矗浜�
+                according.setFindWay(detailsAccording.getFindWay());//鍙戠幇閫斿緞
+                according.setRecordDetail(detailsAccording.getRecordDetail());//涓嶇鍚堣褰曡缁�
+                according.setRecordAccording(detailsAccording.getRecordAccording());//涓嶅悎鏍艰褰曚緷鎹�
+
+                according.setFoundDepartment(departmentLimsName);//鍙戠幇閮ㄩ棬
+                according.setRecordUserId(user.getId());//璁板綍浜篿d
+                according.setRecordUserName(user.getName());//璁板綍浜�
+                according.setRecordTime(LocalDate.now());//璁板綍鏃堕棿
+
+                // 澶勭悊浜轰俊鎭�
+                User actionsUser = userMapper.selectById(detailsAccording.getActionsUserId());
+                String actionsDepartmentLims = userMapper.selectUserDepartmentLimsName(actionsUser.getId());
+
+                according.setResponsibleDepartment(actionsDepartmentLims);//璐d换閮ㄩ棬
+                according.setActionsUserId(actionsUser.getId());//澶勭悊浜篿d
+                according.setActionsUserName(actionsUser.getName());//澶勭悊浜�
+
+                according.setSupervisedUserId(detailsAccording.getSupervisedUserId());//琚洃鐫d汉id
+                // 琚洃鐫d汉
+                User supervisedUser = userMapper.selectById(detailsAccording.getSupervisedUserId());
+                according.setSupervisedUserName(supervisedUser.getName());//琚洃鐫d汉
+                according.setActionsTime(detailsAccording.getSupervisedTime());//琚洃鐫f椂闂�
+                qualitySuperviseDetailsAccordingMapper.insert(according);
+                break;
+
+            // 1澶勭悊鎺柦
+            case 1:
+                according.setSuperviseDetailsAccordingId(detailsAccording.getSuperviseDetailsAccordingId());
+                according.setEliminateMeasure(detailsAccording.getEliminateMeasure());//娓呴櫎涓嶇鍚堟帾鏂�
+                according.setActionsTime(LocalDate.now());//澶勭悊鏃堕棿
+
+                // 绾犳璐熻矗浜轰俊鎭�
+                User correctsUser = userMapper.selectById(detailsAccording.getCorrectUserId());
+
+                according.setCorrectUserId(correctsUser.getId());//绾犳璐熻矗浜篿d
+                according.setCorrectUserName(correctsUser.getName());//绾犳璐熻矗浜�
+
+                qualitySuperviseDetailsAccordingMapper.updateById(according);
+                break;
+
+            // 绾犳鎺柦
+            case 2:
+                according.setSuperviseDetailsAccordingId(detailsAccording.getSuperviseDetailsAccordingId());
+                according.setCorrectContent(detailsAccording.getCorrectContent());//绾犳鎺柦鍐呭
+                according.setIsCorrect(detailsAccording.getIsCorrect());//鏄惁绾犳澶勭悊
+                according.setCorrectTime(LocalDate.now());//绾犳濉啓鏃堕棿
+
+                // 璐ㄩ噺璐熻矗浜�
+                User qualityUser = userMapper.selectById(detailsAccording.getQualityManagerUserId());
+                according.setQualityManagerUserId(qualityUser.getId());//璐ㄩ噺璐熻矗浜篿d
+                according.setQualityManagerUserName(qualityUser.getName());//璐ㄩ噺璐熻矗浜�
+
+                qualitySuperviseDetailsAccordingMapper.updateById(according);
+                break;
+
+            //鏄惁閫氱煡瀹㈡埛鍙仮澶嶅伐浣�
+            case 3:
+                according.setSuperviseDetailsAccordingId(detailsAccording.getSuperviseDetailsAccordingId());
+                according.setNotifyCustomer(detailsAccording.getNotifyCustomer());//閫氱煡瀹㈡埛
+                according.setBackToWork(detailsAccording.getBackToWork());//鍥炲宸ヤ綔
+
+                according.setQualityManagerTime(LocalDate.now());//鏃ユ湡
+                according.setIsFinish(1);
+                qualitySuperviseDetailsAccordingMapper.updateById(according);
+                break;
+        }
+        return true;
+    }
+
+    /**
+     * (瑁呭娴佺▼)鏂板鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @param detailsAccording
+     * @return
+     */
+    @Override
+    public boolean addEquipSuperviseDetailAccording(QualitySuperviseDetailsAccording detailsAccording) {
+        if (detailsAccording.getSuperviseDetailsId() == null) {
+            throw new ErrorException("缂哄皯璐ㄩ噺鐩戠潱璇︽儏Id");
+        }
+
+        // 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅鍜岄儴闂�
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        String departmentLimsName = userMapper.selectUserDepartmentLimsName(user.getId());
+        detailsAccording.setFoundDepartment(departmentLimsName);//鍙戠幇閮ㄩ棬
+        detailsAccording.setRecordUserId(user.getId());//璁板綍浜篿d
+        detailsAccording.setRecordUserName(user.getName());//璁板綍浜�
+        // 琚洃鐫d汉
+        User supervisedUser = userMapper.selectById(detailsAccording.getSupervisedUserId());
+        detailsAccording.setSupervisedUserName(supervisedUser.getName());//琚洃鐫�
+
+        if (detailsAccording.getSuperviseDetailsAccordingId() == null) {
+            qualitySuperviseDetailsAccordingMapper.insert(detailsAccording);
+        } else {
+            qualitySuperviseDetailsAccordingMapper.updateById(detailsAccording);
+        }
+
+        if (detailsAccording.getApproverUserId() != null) {
+            // 鏌ヨ璇︽儏淇℃伅
+            QualitySuperviseDetails superviseDetails = qualitySuperviseDetailsMapper.selectById(detailsAccording.getSuperviseDetailsId());
+
+            // 娑堟伅鍙戦��
+            InformationNotification info = new InformationNotification();
+            // 鍙戦�佷汉
+            info.setCreateUser(user.getName());
+            info.setMessageType("6");
+            info.setTheme("CNAS璐ㄩ噺鐩戠潱涓嶅悎鏍兼帶鍒跺崟濉啓閫氱煡");
+            info.setContent("鐩戠潱椤圭洰涓�: " + superviseDetails.getSuperviseProject() + " 鐩戠潱涓嶅悎鏍兼帶鍒跺崟寰呭~鍐�");
+            info.setSenderId(userId);
+            // 鎺ユ敹浜�
+            info.setConsigneeId(detailsAccording.getApproverUserId());
+            info.setJumpPath(MenuJumpPathConstants.QUALITY_SUPERVISE);
+            informationNotificationService.addInformationNotification(info);
+
+            // 鍙戦�佷紒涓氬井淇¢�氱煡
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ鍙戦�佷汉
+                User people = userMapper.selectById(detailsAccording.getApproverUserId());
+                String message = "";
+                message += "CNAS璐ㄩ噺鐩戠潱璁板綍瀹℃壒閫氱煡";
+                message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戠潱璁″垝";
+                message += "\n" + "鐩戠潱椤圭洰涓�: " + superviseDetails.getSuperviseProject() + " 鐩戠潱涓嶅悎鏍兼帶鍒跺崟寰呭~鍐�";
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(people.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+        }
+
+        // 娓呯┖鐘舵��
+        qualitySuperviseDetailsAccordingMapper.update(null, Wrappers.<QualitySuperviseDetailsAccording>lambdaUpdate()
+                .eq(QualitySuperviseDetailsAccording::getSuperviseDetailsAccordingId, detailsAccording.getSuperviseDetailsAccordingId())
+                .set(QualitySuperviseDetailsAccording::getIsFinish, null));
+
+        return true;
+    }
+
+    /**
+     * (瑁呭娴佺▼)鎵瑰噯鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * 鎵瑰噯瀹屾垚鍚庣粺涓�濉啓涓変釜娴佺▼浜篿d鍜岄儴闂�
+     * @param detailsAccording
+     * @return
+     */
+    @Override
+    public boolean approverEquipSuperviseDetailAccording(QualitySuperviseDetailsAccording detailsAccording) {
+        if (detailsAccording.getIsFinish() == null) {
+            throw new RuntimeException("缂哄皯鎵瑰噯鐘舵��");
+        }
+
+        QualitySuperviseDetailsAccording according = new QualitySuperviseDetailsAccording();
+        according.setSuperviseDetailsAccordingId(detailsAccording.getSuperviseDetailsAccordingId());
+
+        if (detailsAccording.getIsFinish().equals(1)) {
+            // 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅鍜岄儴闂�
+            User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+            String departmentLimsName = userMapper.selectUserDepartmentLimsName(user.getId());
+
+            according.setResponsibleDepartment(departmentLimsName);//璐d换閮ㄩ棬
+            according.setActionsUserId(user.getId());//澶勭悊浜篿d
+            according.setActionsUserName(user.getName());//澶勭悊浜�
+
+            according.setCorrectUserId(user.getId());//绾犳璐熻矗浜篿d
+            according.setCorrectUserName(user.getName());//绾犳璐熻矗浜�
+
+            according.setQualityManagerUserId(user.getId());//璐ㄩ噺璐熻矗浜篿d
+            according.setQualityManagerUserName(user.getName());//璐ㄩ噺璐熻矗浜�
+        } else {
+            qualitySuperviseDetailsAccordingMapper.update(null, Wrappers.<QualitySuperviseDetailsAccording>lambdaUpdate()
+                    .eq(QualitySuperviseDetailsAccording::getSuperviseDetailsAccordingId, detailsAccording.getSuperviseDetailsAccordingId())
+                    .set(QualitySuperviseDetailsAccording::getResponsibleDepartment, null)
+                    .set(QualitySuperviseDetailsAccording::getActionsUserId, null)
+                    .set(QualitySuperviseDetailsAccording::getActionsUserName, null)
+                    .set(QualitySuperviseDetailsAccording::getCorrectUserId, null)
+                    .set(QualitySuperviseDetailsAccording::getCorrectUserName, null)
+                    .set(QualitySuperviseDetailsAccording::getQualityManagerUserId, null)
+                    .set(QualitySuperviseDetailsAccording::getQualityManagerUserName, null)
+                    .set(QualitySuperviseDetailsAccording::getApproverUserId, null));
+        }
+
+        according.setIsFinish(detailsAccording.getIsFinish());
+        qualitySuperviseDetailsAccordingMapper.updateById(according);
+        return true;
+    }
+
+    /**
+     * 鏌ヨ鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @param superviseDetailsId
+     * @return
+     */
+    @Override
+    public QualitySuperviseDetailsAccording getSuperviseDetailAccording(Integer superviseDetailsId) {
+        QualitySuperviseDetailsAccording detailsAccording;
+
+        detailsAccording = qualitySuperviseDetailsAccordingMapper.selectOne(Wrappers.<QualitySuperviseDetailsAccording>lambdaQuery()
+                .eq(QualitySuperviseDetailsAccording::getSuperviseDetailsId, superviseDetailsId));
+
+        if (detailsAccording == null) {
+            detailsAccording = new QualitySuperviseDetailsAccording();
+            // 鏌ヨ鐩戠潱璁″垝璇︽儏
+            QualitySuperviseDetails superviseDetails = qualitySuperviseDetailsMapper.selectById(superviseDetailsId);
+            superviseDetails.setSuperviseDetailsId(superviseDetailsId);
+            detailsAccording.setSupervisedUserId(superviseDetails.getSupervisedUserId());
+            detailsAccording.setSupervisedUserName(superviseDetails.getSupervisee());
+        }
+        return detailsAccording;
+    }
+
+    /**
+     * 鏌ヨ涓嶇鍚堥」
+     * @param page
+     * @param detailsAccording
+     * @return
+     */
+    @Override
+    public IPage<QualitySuperviseDetailsAccording> pageSuperviseDetailAccording(Page page, QualitySuperviseDetailsAccording detailsAccording) {
+        return qualitySuperviseDetailsAccordingMapper.pageSuperviseDetailAccording(page, QueryWrappers.queryWrappers(detailsAccording));
+    }
+
+    /**
+     * 瀵煎嚭鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @param superviseDetailAccordingId
+     * @param response
+     */
+    @Override
+    public void superviseDetailAccordingExport(Integer superviseDetailAccordingId, HttpServletResponse response) {
+        QualitySuperviseDetailsAccordingDto exportDto = qualitySuperviseDetailsAccordingMapper.selectSuperviseDetailsAccording(superviseDetailAccordingId);
+        // 鍙戠幇閮ㄩ棬
+        String discovererUrl = null;
+        if (exportDto.getRecordUserId() != null) {
+            discovererUrl = userMapper.selectById(exportDto.getRecordUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(discovererUrl)) {
+                throw new ErrorException("鎵句笉鍒板彂鐜伴儴闂ㄤ汉鐨勭鍚�");
+            }
+        }
+
+        // 澶勭悊鎺柦璐熻矗浜�
+        String responsibleUrl = null;
+        if (exportDto.getCorrectUserId() != null) {
+            responsibleUrl = userMapper.selectById(exportDto.getCorrectUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(responsibleUrl)) {
+                throw new ErrorException("鎵句笉鍒板鐞嗘帾鏂借礋璐d汉鐨勭鍚�");
+            }
+        }
+
+        // 鎶�鏈礋璐d汉
+        String correctiveUrl = null;
+        if (exportDto.getQualityManagerUserId() != null) {
+            correctiveUrl = userMapper.selectById(exportDto.getQualityManagerUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(correctiveUrl)) {
+                throw new ErrorException("鎵句笉鍒版妧鏈礋璐d汉鐨勭鍚�");
+            }
+        }
+
+        // 璐ㄩ噺璐熻矗浜�
+        String qualityUrl = null;
+        if (exportDto.getQualityManagerUserId() != null) {
+            qualityUrl = userMapper.selectById(exportDto.getQualityManagerUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(qualityUrl)) {
+                throw new ErrorException("鎵句笉鍒拌川閲忚礋璐d汉鐨勭鍚�");
+            }
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/supervision-detail-according.docx");
+        ConfigureBuilder builder = Configure.builder();
+        String finalDiscovererUrl = discovererUrl;
+        String finalResponsibleUrl = responsibleUrl;
+        String finalCorrectiveUrl = correctiveUrl;
+        String finalQualityUrl = qualityUrl;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("control", exportDto);
+                    put("discovererUrl", StringUtils.isNotBlank(finalDiscovererUrl) ? Pictures.ofLocal(imgUrl + "/" + finalDiscovererUrl).create() : null);
+                    put("responsibleUrl", StringUtils.isNotBlank(finalResponsibleUrl) ? Pictures.ofLocal(imgUrl + "/" + finalResponsibleUrl).create() : null);
+                    put("correctiveUrl", StringUtils.isNotBlank(finalCorrectiveUrl) ? Pictures.ofLocal(imgUrl + "/" + finalCorrectiveUrl).create() : null);
+                    put("qualityUrl", StringUtils.isNotBlank(finalQualityUrl) ? Pictures.ofLocal(imgUrl + "/" + finalQualityUrl).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /*************************************************  绾犳鎺柦澶勭悊鍗� ********************************************************/
+
+
+    @Override
+    public boolean addSuperviseDetailCorrect(QualitySuperviseDetailsCorrect detailsCorrect) {
+        QualitySuperviseDetailsCorrect correct = new QualitySuperviseDetailsCorrect();
+        // 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅鍜岄儴闂�
+        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+        String departmentLimsName = userMapper.selectUserDepartmentLimsName(user.getId());
+
+        switch (detailsCorrect.getFlowType()) {
+            // 涓嶅悎鏍兼彁鍑�
+            case 0:
+                if (detailsCorrect.getSuperviseDetailsId() == null) {
+                    throw new ErrorException("缂哄皯璐ㄩ噺鐩戠潱璇︽儏Id");
+                }
+                correct.setSuperviseDetailsId(detailsCorrect.getSuperviseDetailsId());
+                correct.setRaiseResult(detailsCorrect.getRaiseResult());//涓嶅悎鏍艰〃杩�
+                correct.setVdeRaiseResult(detailsCorrect.getVdeRaiseResult());//vde涓撳鍙戠幇
+                correct.setRaiseDepartment(departmentLimsName);//鎻愬嚭閮ㄩ棬
+                correct.setRaiseUserId(user.getId());//鎻愬嚭浜篿d
+                correct.setRaiseUserName(user.getName());// 鎻愬嚭浜�
+                correct.setRaiseTime(LocalDate.now());// 鎻愬嚭鏃堕棿
+
+                // 鍘熷洜鍒嗘瀽浜轰俊鎭�
+                User causeUser = userMapper.selectById(detailsCorrect.getCauseUserId());
+                String causeDepartmentLims = userMapper.selectUserDepartmentLimsName(causeUser.getId());
+
+                correct.setCauseDepartment(causeDepartmentLims);//鍘熷洜鍒嗘瀽璐d换閮ㄩ棬
+                correct.setCauseUserId(causeUser.getId());//1鍘熷洜鍒嗘瀽浜篿d
+                correct.setCauseUserName(causeUser.getName());// 1鍘熷洜鍒嗘瀽浜�
+                qualitySuperviseDetailsCorrectMapper.insert(correct);
+
+                break;
+
+            // 鍘熷洜鍒嗘瀽
+            case 1:
+                correct.setSuperviseDetailsCorrectId(detailsCorrect.getSuperviseDetailsCorrectId());
+                correct.setCauseResult(detailsCorrect.getCauseResult());//鍘熷洜鍒嗘瀽
+                correct.setCauseTime(LocalDate.now());// 1鍘熷洜鍒嗘瀽鏃堕棿
+
+                // 绾犳浜轰俊鎭�
+                User correctUser = userMapper.selectById(detailsCorrect.getCorrectUserId());
+                String correctUserDepartmentLims = userMapper.selectUserDepartmentLimsName(correctUser.getId());
+
+                correct.setCorrectDepartment(correctUserDepartmentLims);//2绾犳璐d换閮ㄩ棬
+                correct.setCorrectUserId(correctUser.getId());//2绾犳浜篿d
+                correct.setCorrectUserName(correctUser.getName());// 2绾犳浜�
+                qualitySuperviseDetailsCorrectMapper.updateById(correct);
+                break;
+
+            // 绾犳鎺柦
+            case 2:
+                correct.setSuperviseDetailsCorrectId(detailsCorrect.getSuperviseDetailsCorrectId());
+                correct.setCorrectResult(detailsCorrect.getCorrectResult());//2绾犳鎺柦
+                correct.setRaiseDepartmentAffirm(detailsCorrect.getRaiseDepartmentAffirm());//2鎻愬嚭閮ㄩ棬纭
+                correct.setCorrectTime(LocalDate.now());// 2绾犳鏃堕棿
+
+                // 楠岃瘉浜轰俊鎭�
+                User validationUser = userMapper.selectById(detailsCorrect.getValidationUserId());
+                String validationUserDepartmentLims = userMapper.selectUserDepartmentLimsName(validationUser.getId());
+
+                correct.setValidationDepartment(validationUserDepartmentLims);//3楠岃瘉閮ㄩ棬
+                correct.setValidationUserId(validationUser.getId());//3楠岃瘉浜篿d
+                correct.setValidationUserName(validationUser.getName());// 3楠岃瘉浜�
+                qualitySuperviseDetailsCorrectMapper.updateById(correct);
+                break;
+
+            // 楠岃瘉缁撴灉
+            case 3:
+                correct.setSuperviseDetailsCorrectId(detailsCorrect.getSuperviseDetailsCorrectId());
+                correct.setValidationResult(detailsCorrect.getValidationResult());//3楠岃瘉缁撴灉
+                correct.setValidationTime(LocalDate.now());// 3楠岃瘉鏃堕棿
+                correct.setIsFinish(1);
+                qualitySuperviseDetailsCorrectMapper.updateById(correct);
+                break;
+        }
+
+        return true;
+    }
+
+    /**
+     * (瑁呭娴佺▼)鏂板鐩戠潱绾犳澶勭悊淇℃伅
+     * @return
+     */
+    @Override
+    public boolean addEquipSuperviseDetailCorrect(QualitySuperviseDetailsCorrect detailsCorrect) {
+        if (detailsCorrect.getSuperviseDetailsId() == null) {
+            throw new ErrorException("缂哄皯璐ㄩ噺鐩戠潱璇︽儏Id");
+        }
+        // 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅鍜岄儴闂�
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        String departmentLimsName = userMapper.selectUserDepartmentLimsName(user.getId());
+
+        detailsCorrect.setRaiseDepartment(departmentLimsName);//鎻愬嚭閮ㄩ棬
+        detailsCorrect.setRaiseUserId(user.getId());//鎻愬嚭浜篿d
+        detailsCorrect.setRaiseUserName(user.getName());// 鎻愬嚭浜�
+        if (detailsCorrect.getSuperviseDetailsCorrectId() == null) {
+            qualitySuperviseDetailsCorrectMapper.insert(detailsCorrect);
+        } else {
+            qualitySuperviseDetailsCorrectMapper.updateById(detailsCorrect);
+        }
+
+        if (detailsCorrect.getApproverUserId() != null) {
+            // 鏌ヨ璇︽儏淇℃伅
+            QualitySuperviseDetails superviseDetails = qualitySuperviseDetailsMapper.selectById(detailsCorrect.getSuperviseDetailsId());
+
+            // 娑堟伅鍙戦��
+            InformationNotification info = new InformationNotification();
+            // 鍙戦�佷汉
+            info.setCreateUser(user.getName());
+            info.setMessageType("6");
+            info.setTheme("CNAS璐ㄩ噺鐩戠潱绾犳鎺柦濉啓閫氱煡");
+            info.setContent("鐩戠潱椤圭洰涓�: " + superviseDetails.getSuperviseProject() + " 鐩戠潱绾犳鎺柦寰呭~鍐�");
+            info.setSenderId(userId);
+            // 鎺ユ敹浜�
+            info.setConsigneeId(detailsCorrect.getApproverUserId());
+            info.setJumpPath(MenuJumpPathConstants.QUALITY_SUPERVISE);
+            informationNotificationService.addInformationNotification(info);
+
+            // 鍙戦�佷紒涓氬井淇¢�氱煡
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ鍙戦�佷汉
+                User people = userMapper.selectById(detailsCorrect.getApproverUserId());
+                String message = "";
+                message += "CNAS璐ㄩ噺鐩戠潱绾犳鎺柦濉啓閫氱煡";
+                message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戠潱璁″垝";
+                message += "\n" + "鐩戠潱椤圭洰涓�: " + superviseDetails.getSuperviseProject() + " 鐩戠潱绾犳鎺柦寰呭~鍐�";
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(people.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+        }
+
+        // 娓呯┖鐘舵��
+        qualitySuperviseDetailsCorrectMapper.update(null, Wrappers.<QualitySuperviseDetailsCorrect>lambdaUpdate()
+                .eq(QualitySuperviseDetailsCorrect::getSuperviseDetailsCorrectId, detailsCorrect.getSuperviseDetailsCorrectId())
+                .set(QualitySuperviseDetailsCorrect::getIsFinish, null));
+        return true;
+    }
+
+    /**
+     * (瑁呭娴佺▼)鎵瑰噯鐩戠潱绾犳澶勭悊淇℃伅
+     * @return
+     */
+    @Override
+    public boolean approveEquipSuperviseDetailCorrect(QualitySuperviseDetailsCorrect detailsCorrect) {
+        if (detailsCorrect.getIsFinish() == null) {
+            throw new RuntimeException("缂哄皯鎵瑰噯鐘舵��");
+        }
+
+        QualitySuperviseDetailsCorrect correct = new QualitySuperviseDetailsCorrect();
+        // 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅鍜岄儴闂�
+        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+        String departmentLimsName = userMapper.selectUserDepartmentLimsName(user.getId());
+        correct.setSuperviseDetailsCorrectId(detailsCorrect.getSuperviseDetailsCorrectId());
+
+        if (detailsCorrect.getIsFinish().equals(1)) {
+            correct.setCauseDepartment(departmentLimsName);//鍘熷洜鍒嗘瀽璐d换閮ㄩ棬
+            correct.setCauseUserId(user.getId());//1鍘熷洜鍒嗘瀽浜篿d
+            correct.setCauseUserName(user.getName());// 1鍘熷洜鍒嗘瀽浜�
+
+            correct.setCorrectDepartment(departmentLimsName);//2绾犳璐d换閮ㄩ棬
+            correct.setCorrectUserId(user.getId());//2绾犳浜篿d
+            correct.setCorrectUserName(user.getName());// 2绾犳浜�
+
+            correct.setValidationDepartment(departmentLimsName);//3楠岃瘉閮ㄩ棬
+            correct.setValidationUserId(user.getId());//3楠岃瘉浜篿d
+            correct.setValidationUserName(user.getName());// 3楠岃瘉浜�
+        } else {
+            qualitySuperviseDetailsCorrectMapper.update(null, Wrappers.<QualitySuperviseDetailsCorrect>lambdaUpdate()
+                    .eq(QualitySuperviseDetailsCorrect::getSuperviseDetailsCorrectId, detailsCorrect.getSuperviseDetailsCorrectId())
+                    .set(QualitySuperviseDetailsCorrect::getCauseDepartment, null)
+                    .set(QualitySuperviseDetailsCorrect::getCauseUserId, null)
+                    .set(QualitySuperviseDetailsCorrect::getCauseUserName, null)
+                    .set(QualitySuperviseDetailsCorrect::getCorrectDepartment, null)
+                    .set(QualitySuperviseDetailsCorrect::getCorrectUserId, null)
+                    .set(QualitySuperviseDetailsCorrect::getCorrectUserName, null)
+                    .set(QualitySuperviseDetailsCorrect::getValidationDepartment, null)
+                    .set(QualitySuperviseDetailsCorrect::getValidationUserId, null)
+                    .set(QualitySuperviseDetailsCorrect::getValidationUserName, null)
+                    .set(QualitySuperviseDetailsCorrect::getApproverUserId, null)
+            );
+        }
+
+        correct.setIsFinish(detailsCorrect.getIsFinish());
+        qualitySuperviseDetailsCorrectMapper.updateById(correct);
+
+        return true;
+    }
+
+    /**
+     * 鏌ヨ鐩戠潱绾犳澶勭悊
+     * @param superviseDetailsId
+     * @return
+     */
+    @Override
+    public QualitySuperviseDetailsCorrect getSuperviseDetailCorrect(Integer superviseDetailsId) {
+        QualitySuperviseDetailsCorrect detailsCorrect;
+
+        detailsCorrect = qualitySuperviseDetailsCorrectMapper.selectOne(Wrappers.<QualitySuperviseDetailsCorrect>lambdaQuery()
+                .eq(QualitySuperviseDetailsCorrect::getSuperviseDetailsId, superviseDetailsId));
+
+        if (detailsCorrect == null) {
+            detailsCorrect = new QualitySuperviseDetailsCorrect();
+            detailsCorrect.setSuperviseDetailsId(superviseDetailsId);
+        }
+        return detailsCorrect;
+    }
+
+    /**
+     * 鏌ヨ鐩戠潱绾犳鎺柦鍒楄〃
+     * @param page
+     * @param detailsCorrect
+     * @return
+     */
+    @Override
+    public IPage<QualitySuperviseDetailsCorrect> pageSuperviseDetailCorrect(Page page, QualitySuperviseDetailsCorrect detailsCorrect) {
+        return qualitySuperviseDetailsCorrectMapper.pageSuperviseDetailAccording(page, QueryWrappers.queryWrappers(detailsCorrect));
+    }
+
+    /**
+     * 鏂板鐩戠潱绾犳鎺柦闄勪欢
+     * @param superviseDetailsCorrectId
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean uploadSuperviseDetailCorrectFile(Integer superviseDetailsCorrectId, MultipartFile file) {
+        if (superviseDetailsCorrectId == null) {
+            throw new ErrorException("缂哄皯绾犳鎺柦id");
+        }
+
+        String urlString;
+        String pathName;
+        String path;
+        String filename = file.getOriginalFilename();
+        String contentType = file.getContentType();
+        QualitySuperviseDetailsCorrectFile superviseDetailsCorrectFile = new QualitySuperviseDetailsCorrectFile();
+        superviseDetailsCorrectFile.setSuperviseDetailsCorrectId(superviseDetailsCorrectId);
+        superviseDetailsCorrectFile.setFileName(filename);
+        if (contentType != null && contentType.startsWith("image/")) {
+            // 鏄浘鐗�
+            path = imgUrl;
+            superviseDetailsCorrectFile.setType(1);
+        } else {
+            // 鏄枃浠�
+            path = wordUrl;
+            superviseDetailsCorrectFile.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));
+            superviseDetailsCorrectFile.setFileUrl(pathName);
+            qualitySuperviseDetailsCorrectFileMapper.insert(superviseDetailsCorrectFile);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ErrorException(e.getMessage());
+        }
+    }
+
+    /**
+     * 鏌ヨ鐩戠潱绾犳鎺柦闄勪欢
+     * @param superviseDetailsCorrectId
+     * @return
+     */
+    @Override
+    public List<QualitySuperviseDetailsCorrectFile> getSuperviseDetailCorrectFileList(Integer superviseDetailsCorrectId) {
+        return qualitySuperviseDetailsCorrectFileMapper.selectList(Wrappers.<QualitySuperviseDetailsCorrectFile>lambdaQuery()
+                .eq(QualitySuperviseDetailsCorrectFile::getSuperviseDetailsCorrectId, superviseDetailsCorrectId));
+    }
+
+    /**
+     * 瀵煎嚭鐩戠潱绾犳鎺柦
+     * @param superviseDetailsCorrectId
+     * @param response
+     */
+    @Override
+    public void exportSuperviseDetaillCorrect(Integer superviseDetailsCorrectId, HttpServletResponse response) {
+        QualitySuperviseDetailsCorrect detailsCorrect = qualitySuperviseDetailsCorrectMapper.selectById(superviseDetailsCorrectId);
+        QualitySuperviseDetailsCorrectDto detailsCorrectDto = new QualitySuperviseDetailsCorrectDto();
+        BeanUtils.copyProperties(detailsCorrect, detailsCorrectDto);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        // 鎻愬嚭鏃堕棿
+        detailsCorrectDto.setRaiseTimeString(detailsCorrectDto.getRaiseTime() != null
+                ? detailsCorrectDto.getRaiseTime().format(formatter) : null);
+        // 鍘熷洜鍒嗘瀽鏃堕棿
+        detailsCorrectDto.setCauseTimeString(detailsCorrectDto.getCauseTime() != null
+                ? detailsCorrectDto.getCauseTime().format(formatter) : null);
+
+        // 绾犳鏃堕棿
+        detailsCorrectDto.setCorrectTimeString(detailsCorrectDto.getCorrectTime() != null
+                ? detailsCorrectDto.getCorrectTime().format(formatter) : null);
+
+        // 楠岃瘉鏃堕棿
+        detailsCorrectDto.setValidationTimeString(detailsCorrectDto.getValidationTime() != null
+                ? detailsCorrectDto.getValidationTime().format(formatter) : null);
+
+
+        // 鎻愬嚭浜虹鍚�
+        String raiseUrl = null;
+        if (detailsCorrectDto.getRaiseUserId() != null) {
+            raiseUrl = userMapper.selectById(detailsCorrectDto.getRaiseUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(raiseUrl)) {
+                throw new ErrorException("鎵句笉鍒版彁鍑轰汉鐨勭鍚�");
+            }
+        }
+
+        // 鍘熷洜鍒嗘瀽浜�
+        String causeUrl = null;
+        if (detailsCorrectDto.getCauseUserId() != null) {
+            causeUrl = userMapper.selectById(detailsCorrectDto.getCauseUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(causeUrl)) {
+                throw new ErrorException("鎵句笉鍒板師鍥犲垎鏋愪汉鐨勭鍚�");
+            }
+        }
+
+        // 绾犳浜�
+        String correctUrl = null;
+        if (detailsCorrectDto.getCorrectUserId() != null) {
+            correctUrl = userMapper.selectById(detailsCorrectDto.getCorrectUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(correctUrl)) {
+                throw new ErrorException("鎵句笉鍒扮籂姝d汉鐨勭鍚�");
+            }
+        }
+
+        // 楠岃瘉浜�
+        String validationUrl = null;
+        if (detailsCorrectDto.getValidationUserId() != null) {
+            validationUrl = userMapper.selectById(detailsCorrectDto.getValidationUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(validationUrl)) {
+                throw new ErrorException("鎵句笉鍒伴獙璇佷汉鐨勭鍚�");
+            }
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/supervise-detail-correct.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        String finalRaiseUrl = raiseUrl;
+        String finalCauseUrl = causeUrl;
+        String finalCorrectUrl = correctUrl;
+        String finalValidationUrl = validationUrl;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("correct", detailsCorrectDto);
+                    put("raiseUrl", StringUtils.isNotBlank(finalRaiseUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRaiseUrl).create() : null);
+                    put("causeUrl", StringUtils.isNotBlank(finalCauseUrl) ? Pictures.ofLocal(imgUrl + "/" + finalCauseUrl).create() : null);
+                    put("correctUrl", StringUtils.isNotBlank(finalCorrectUrl) ? Pictures.ofLocal(imgUrl + "/" + finalCorrectUrl).create() : null);
+                    put("validationUrl", StringUtils.isNotBlank(finalValidationUrl) ? Pictures.ofLocal(imgUrl + "/" + finalValidationUrl).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+    }
+}
+

--
Gitblit v1.9.3