From 112d964cbc94154dd4ca75851231d0c477ebc571 Mon Sep 17 00:00:00 2001
From: zhuo <2089219845@qq.com>
Date: 星期二, 20 五月 2025 10:29:22 +0800
Subject: [PATCH] 其他功能合并

---
 cnas-process/src/main/resources/mapper/ProcessReportMapper.xml                                              |   11 
 cnas-process/src/main/resources/static/report-deal.docx                                                     |    0 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessDealMapper.java                                  |    3 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseServiceImpl.java                  |   22 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordAuditServiceImpl.java                   |    4 
 basic-server/src/main/resources/mapper/StructureItemParameterMapper.xml                                     |   16 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/InconsistentDistributionServiceImpl.java          |    1 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/WxCpUtils.java                                            |    2 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java              |    1 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIssueRecycleServiceImpl.java            |    2 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java       |    3 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java          |    1 
 cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java                                   |   40 +
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalMeetingServiceImpl.java                     |    1 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceImpowerServiceImpl.java                       |    1 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsTotalServiceImpl.java          |    2 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FeIlluminationServiceImpl.java                    |    3 
 basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java                          |  244 ----------
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessDeal.java                                          |    4 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalReportServiceImpl.java                      |    1 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCheckServiceImpl.java                   |    4 
 cnas-process/src/main/java/com/ruoyi/process/dto/ProcessReportDto.java                                      |   20 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessReportMapper.java                                |    5 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FeTempHumDateServiceImpl.java                     |    1 
 ruoyi-common/src/main/resources/ttf/signature.ttf                                                           |    0 
 basic-server/src/main/java/com/ruoyi/basic/service/StructureItemParameterService.java                       |   10 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java                                         |    6 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessOrderDeviceMapper.java                           |    2 
 cnas-require/src/main/java/com/ruoyi/require/task/FeTempHumDateSchedule.java                                |    8 
 cnas-process/src/main/java/com/ruoyi/process/service/QualitySuperviseManagementReviewService.java           |   34 +
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java    |    1 
 cnas-process/src/main/java/com/ruoyi/process/task/QualitySuperviseSchedule.java                             |   82 +++
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExternalApplyServiceImpl.java                 |    1 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorServiceImpl.java                    |   20 
 basic-server/src/main/java/com/ruoyi/basic/service/impl/StructureItemParameterServiceImpl.java              |  272 +++++++++++
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordTotalServiceImpl.java                   |    2 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordServiceImpl.java                 |    1 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/ForeignRegisterServiceImpl.java                   |    1 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageControlPlanListServiceImpl.java               |    1 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseManagementReviewServiceImpl.java  |   86 +++
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCancelServiceImpl.java                  |    4 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java               |    1 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceTraceabilityManagementServiceImpl.java        |    1 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCorrectServiceImpl.java                     |    1 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java                |    2 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java     |    1 
 basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java                                 |    3 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenancePlanServiceImpl.java               |    1 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java                          |    1 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRiskAssessmentResultsServiceImpl.java         |    1 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsServiceImpl.java               |    2 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessReport.java                                        |   11 
 cnas-process/src/main/resources/mapper/ProcessDealMapper.xml                                                |    4 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceRecordServiceImpl.java                        |    1 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalPlanServiceImpl.java                        |    1 
 cnas-process/src/main/resources/static/supervision-detail-record.docx                                       |    0 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FeCalibrationScheduleServiceImpl.java             |    3 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java          |    1 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExaminePlanServiceImpl.java                   |    1 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java                              |    2 
 cnas-process/src/main/resources/mapper/QualitySuperviseManagementReviewMapper.xml                           |   14 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/InternalWastesServiceImpl.java                    |    1 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderServiceImpl.java                   |    1 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java               |    1 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCheckServiceImpl.java                       |    1 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java                         |    1 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java                    |    1 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ClientSatisfactionServiceImpl.java                  |    1 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessTotaldealServiceImpl.java                  |    4 
 cnas-process/src/main/java/com/ruoyi/process/dto/ProcessDealDto.java                                        |   19 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessReportServiceImpl.java                     |   51 -
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java                      |    1 
 cnas-personnel/src/main/java/com/ruoyi/personnel/task/PersonTrainingSchedule.java                           |    4 
 cnas-process/src/main/resources/static/supervise-management-eview.docx                                      |    0 
 cnas-process/src/main/java/com/ruoyi/process/controller/ProcessReportController.java                        |    9 
 cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseManagementReviewMapper.java             |   26 +
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessSampleServiceImpl.java                     |    1 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewReportServiceImpl.java                  |    3 
 basic-server/src/main/java/com/ruoyi/basic/mapper/StructureItemParameterMapper.java                         |    8 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalImplementServiceImpl.java                   |    3 
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessReportService.java                              |    5 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordContrastServiceImpl.java         |    1 
 cnas-device/src/main/resources/mapper/DeviceMapper.xml                                                      |   16 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java |    3 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageMeetingServiceImpl.java                       |    3 
 cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseManagementReview.java                     |   63 ++
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java               |    1 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewProgramServiceImpl.java                 |    1 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java                |    1 
 cnas-process/src/main/resources/static/sample-deal.docx                                                     |    0 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FePowerStableServiceImpl.java                     |    1 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/SignatureImageUtil.java                                   |   66 ++
 cnas-process/src/main/java/com/ruoyi/process/controller/QualitySuperviseManagementReviewController.java     |   71 +++
 cnas-manage/src/main/java/com/ruoyi/manage/schedule/ManageRecordTotalSchedule.java                          |    2 
 94 files changed, 983 insertions(+), 362 deletions(-)

diff --git a/basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java b/basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java
index e927343..2f5df2e 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java
@@ -1,41 +1,26 @@
 package com.ruoyi.basic.controller;
 
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.poi.excel.ExcelUtil;
 import com.alibaba.excel.EasyExcel;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.common.core.domain.Result;
-import com.ruoyi.common.core.domain.entity.SysDictData;
-import com.ruoyi.system.service.ISysDictTypeService;
 import com.ruoyi.basic.dto.PageTestObjectDto;
 import com.ruoyi.basic.dto.ProductDTO1;
 import com.ruoyi.basic.excel.StructureTestObjectData;
 import com.ruoyi.basic.excel.StructureTestObjectListener;
 import com.ruoyi.basic.pojo.Product;
-import com.ruoyi.basic.pojo.StandardTemplate;
 import com.ruoyi.basic.pojo.StructureItemParameter;
 import com.ruoyi.basic.pojo.StructureTestObject;
 import com.ruoyi.basic.service.CapacityScopeService;
 import com.ruoyi.basic.service.ProductService;
-import com.ruoyi.basic.service.StandardTemplateService;
 import com.ruoyi.basic.service.StructureItemParameterService;
+import com.ruoyi.common.core.domain.Result;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.stream.Collectors;
 
 /**
  * 妫�楠岄」鐩弬鏁�(StructureItemParameter)琛ㄦ帶鍒跺眰
@@ -55,9 +40,6 @@
 
     private StructureItemParameterService structureItemParameterService;
 
-    private ISysDictTypeService dictTypeService;
-
-    private StandardTemplateService standardTemplateService;
 
     @ApiOperation(value = "鑾峰彇椤圭洰妫�楠屽弬鏁板垪琛�")
     @GetMapping("/selectItemParameterList")
@@ -154,229 +136,7 @@
     @PostMapping("/importEquipData")
     @Transactional
     public Result importEquipData(@RequestParam("file") MultipartFile file) throws Exception {
-        InputStream inputStream = file.getInputStream();
-        List<StructureItemParameter> lists = new ArrayList<>();
-        AtomicReference<String> sample = new AtomicReference<>();
-        ExcelUtil.readBySax(inputStream, -1, (i, l, list1) -> {
-            if (l == 1) {
-                sample.set(list1.get(1) + "");
-            }
-            if (l >= 1) {
-                StructureItemParameter str = new StructureItemParameter();
-                // 娴嬭瘯瀵硅薄
-                if (list1.get(1) == null) {
-                    str.setSample(null);
-                } else {
-                    String brand = (String) list1.get(1);
-                    StringBuilder builder = new StringBuilder();
-                    builder.append("[");
-                    // 浜у搧
-                    if (ObjectUtil.isNotEmpty(list1.get(2))) {
-                        String production = (String) list1.get(2);
-                        if (!production.contains("锛�")) {
-                            builder.append(String.format("[\"%s\",\"%s\"]", brand, production));
-                        } else {
-                            Arrays.stream(production.split("锛�")).forEach(item -> {
-                                builder.append(String.format("[\"%s\",\"%s\"],", brand, item));
-                            });
-                            builder.deleteCharAt(builder.length() - 1);
-                        }
-                    } else {
-                        builder.append("[");
-                        builder.append(String.format("\"%s\"", brand));
-                        builder.append("]");
-                    }
-                    builder.append("]");
-                    str.setSample(builder.toString());
-                }
-                // 妫�楠岄」
-                str.setInspectionItem(list1.get(4).toString().trim());
-                // 妫�楠岄」鑻辨枃
-                if (list1.get(5) != null) {
-                    str.setInspectionItemEn(list1.get(5).toString());
-                }
-                // 妫�楠屽瓙椤�
-                if (list1.get(6) == null) {
-                    str.setInspectionItemSubclass(null);
-                } else {
-                    str.setInspectionItemSubclass(list1.get(6).toString().trim());
-                }
-                // 妫�楠屽瓙椤硅嫳鏂�
-                if (list1.get(7) == null) {
-                    str.setInspectionItemSubclassEn(null);
-                } else {
-                    str.setInspectionItemSubclassEn(String.valueOf(list1.get(7).toString()));
-                }
-                // 妫�楠岄」鍒嗙被
-                if (list1.get(22) != null && list1.get(22) != "") {
-                    str.setInspectionItemClass(list1.get(22).toString().trim());
-                } else {
-                    str.setInspectionItemClass(null);
-                }
-                // 妫�楠岄」鍒嗙被鑻辨枃
-                if (list1.get(23) != null && list1.get(23) != "") {
-                    str.setInspectionItemClassEn(list1.get(23) + "");
-                } else {
-                    str.setInspectionItemClassEn(null);
-                }
-
-                LambdaQueryWrapper<StructureItemParameter> wrapper = Wrappers.lambdaQuery(StructureItemParameter.class)
-                        .eq(StructureItemParameter::getInspectionItem, str.getInspectionItem())
-                        .eq(StructureItemParameter::getSample, str.getSample())
-
-                        .last("limit 1");
-                // 鍒ゆ柇鏄惁鏈夋楠岄」绫诲瀷
-                if (ObjectUtils.isNotEmpty(str.getInspectionItemClass())) {
-                    wrapper.eq(StructureItemParameter::getInspectionItemClass, str.getInspectionItemClass());
-                }
-
-                // 鍒ゆ柇鏄惁鏈夋楠屽瓙椤�
-                if (ObjectUtils.isNotEmpty(str.getInspectionItemSubclass())) {
-                    wrapper.eq(StructureItemParameter::getInspectionItemSubclass, str.getInspectionItemSubclass());
-                }
-                StructureItemParameter db_str = structureItemParameterService.getOne(wrapper);
-                if (ObjectUtils.isNotEmpty(db_str)) {
-                    str.setId(db_str.getId());
-                }
-                // 鏂规硶鍚嶇О
-                if (list1.get(8) == null) {
-                    str.setMethod(null);
-                } else {
-                    StringBuffer buffer = new StringBuffer();
-                    String input = list1.get(8).toString();
-                    buffer.append("[");
-                    String[] values = input.split("锛�");
-                    for (String value : values) {
-                        buffer.append("\"").append(value.trim()).append("\",");
-                    }
-                    buffer.deleteCharAt(buffer.length() - 1);
-                    buffer.append("]");
-                    str.setMethod(buffer.toString());
-                }
-                // 璇曢獙瀹�
-                if (list1.get(9) == null) {
-                    str.setSonLaboratory(null);
-                } else {
-                    str.setSonLaboratory(list1.get(9).toString());
-                }
-                // 璁¢噺鍗曚綅
-                if (list1.get(10) == null) {
-                    str.setUnit(null);
-                } else {
-                    str.setUnit(list1.get(10).toString());
-                }
-                // 瑕佹眰鍊�
-                if (list1.get(11) == null) {
-                    str.setAskTell(null);
-                } else {
-                    str.setAskTell(list1.get(11).toString());
-                }
-                // 瑕佹眰鎻忚堪
-                if (list1.get(12) == null) {
-                    str.setAsk(null);
-                } else {
-                    str.setAsk(list1.get(12).toString());
-                }
-                // 鍗曚环
-                if (list1.get(13) == null) {
-                    str.setPrice(null);
-                } else {
-                    str.setPrice(list1.get(13) + "");
-                }
-                // 宸ユ椂绯绘暟
-                if (list1.get(14) == null) {
-                    str.setManHour(null);
-                } else {
-                    str.setManHour(Double.valueOf(list1.get(14).toString()));
-                }
-                // 宸ユ椂鍒嗙粍
-                if (list1.get(15) == null) {
-                    str.setManHourGroup(null);
-                } else {
-                    str.setManHourGroup(list1.get(15).toString());
-                }
-                // 棰勮瀹屾垚鏃堕棿
-                if (list1.get(16) == null) {
-                    str.setManDay(null);
-                } else {
-                    str.setManDay(Integer.valueOf(list1.get(16).toString()));
-                }
-                // 鏁版嵁绫诲瀷
-                String jy;
-                if (list1.get(17).toString().equals("闈為噰闆嗙被鍨�")) {
-                    jy = "0";
-                } else {
-                    jy = "1";
-                }
-                str.setInspectionItemType(jy);
-                // 妫�楠岄」绫诲瀷
-                String validateValueType = list1.get(18).toString();
-                if (ObjectUtils.isNotEmpty(validateValueType)) {
-                    List<SysDictData> enums = dictTypeService.selectDictDataByName("妫�楠屽�肩被鍨�")
-                            .stream().filter(sysDictData -> sysDictData.getDictLabel().equals(validateValueType)).collect(Collectors.toList());
-                    str.setInspectionValueType(enums.get(0).getDictValue());
-                }
-                int bsm;
-                //鐗规畩鏍囪瘑
-                if (list1.get(19).toString().equals("鍚�")) {
-                    bsm = 0;
-                } else {
-                    bsm = 1;
-                }
-                str.setBsm(bsm + "");
-                // 鏁板瓧瀛楀吀
-                if (list1.get(20) != null) {
-                    str.setDic(list1.get(20) + "");
-                } else {
-                    str.setDic(null);
-                }
-                // 鍘熷璁板綍妯℃澘
-                StandardTemplate standTempIdByName = standardTemplateService.getStandTempIdByName(String.valueOf(list1.get(21)));
-                if (standTempIdByName != null) {
-                    str.setTemplateId(standTempIdByName.getId());
-                } else {
-                    str.setTemplateId(null);
-                }
-                try {
-                    if (list1.get(24) != null) {
-                        str.setLaboratory(list1.get(24) + "");
-                    }
-                } catch (Exception e) {
-                }
-
-                // 鏉′欢
-                if (list1.get(25) == null) {
-                    str.setRadiusList(null);
-                } else {
-                    StringBuffer buffer = new StringBuffer();
-                    String input = list1.get(25).toString();
-                    buffer.append("[");
-                    String[] values = input.split("锛�");
-                    for (String value : values) {
-                        buffer.append("\"").append(value.trim()).append("\",");
-                    }
-                    buffer.deleteCharAt(buffer.length() - 1);
-                    buffer.append("]");
-                    str.setRadiusList(buffer.toString());
-                }
-                //鏀惰垂鏍囧噯
-                if (list1.get(26) == null) {
-                    str.setRates(null);
-                } else {
-                    str.setRates(list1.get(26) + "");
-                }
-
-                lists.add(str);
-            }
-        });
-//        structureItemParameterService.removeNoSample(sample.get());
-        // 濡傛灉鏁版嵁搴撻噷闈㈢殑鏁版嵁瀛樺湪閭d箞灏辨墽琛屾洿鏂版嫹璐濇搷浣�
-        try {
-            structureItemParameterService.saveOrUpdateBatch(lists);
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new RuntimeException("鏈嶅姟绔姤閿�");
-        }
+        structureItemParameterService.importEquipData(file);
         return Result.success();
     }
 
diff --git a/basic-server/src/main/java/com/ruoyi/basic/mapper/StructureItemParameterMapper.java b/basic-server/src/main/java/com/ruoyi/basic/mapper/StructureItemParameterMapper.java
index 654741a..017c66a 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/mapper/StructureItemParameterMapper.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/mapper/StructureItemParameterMapper.java
@@ -25,6 +25,12 @@
 
     List<TestItemDto> getItemTree();
 
-    int removeNoSample(@Param("sample") String sample);
+
+    /**
+     * 鏌ヨ璁惧淇℃伅
+     * @param managementNumberList
+     * @return
+     */
+    List<Integer> selectDeviceIdsByNumber(@Param("managementNumberList") List<String> managementNumberList);
 }
 
diff --git a/basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java b/basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java
index 1938e9c..847caa4 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java
@@ -120,5 +120,8 @@
     @ApiModelProperty(value = "璁惧id")
     private String deviceIds;
 
+    @ApiModelProperty(value = "鎶芥绫诲瀷, 1:鏈堝害, 2:瀛e害, 3:骞村害")
+    private String spotCheckType;
+
 }
 
diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/StructureItemParameterService.java b/basic-server/src/main/java/com/ruoyi/basic/service/StructureItemParameterService.java
index a697619..d22d250 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/StructureItemParameterService.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/StructureItemParameterService.java
@@ -2,7 +2,15 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.basic.pojo.StructureItemParameter;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
 
 public interface StructureItemParameterService extends IService<StructureItemParameter> {
-    void removeNoSample(String sample);
+
+    /**
+     * 瀵煎叆妫�楠岄」鐩�
+     * @param file
+     */
+    void importEquipData(MultipartFile file) throws IOException;
 }
diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/StructureItemParameterServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/StructureItemParameterServiceImpl.java
index 4009106..6c3275e 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/impl/StructureItemParameterServiceImpl.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/StructureItemParameterServiceImpl.java
@@ -1,14 +1,34 @@
 package com.ruoyi.basic.service.impl;
 
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.poi.excel.ExcelUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.basic.mapper.StructureItemParameterMapper;
+import com.ruoyi.basic.pojo.StandardTemplate;
 import com.ruoyi.basic.pojo.StructureItemParameter;
+import com.ruoyi.basic.service.StandardTemplateService;
 import com.ruoyi.basic.service.StructureItemParameterService;
+import com.ruoyi.common.core.domain.entity.SysDictData;
+import com.ruoyi.system.service.ISysDictTypeService;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
 
 @Service
 @AllArgsConstructor
@@ -16,9 +36,257 @@
 
     @Resource
     private StructureItemParameterMapper structureItemParameterMapper;
+    @Resource
+    private ISysDictTypeService dictTypeService;
+    @Resource
+    private StandardTemplateService standardTemplateService;
 
+    /**
+     *
+     * @param file
+     */
     @Override
-    public void removeNoSample(String sample) {
-        structureItemParameterMapper.removeNoSample("\""+sample+"\"");
+    public void importEquipData(MultipartFile file) throws IOException {
+        InputStream inputStream = file.getInputStream();
+        List<StructureItemParameter> lists = new ArrayList<>();
+        AtomicReference<String> sample = new AtomicReference<>();
+        ExcelUtil.readBySax(inputStream, -1, (i, l, list1) -> {
+            if (l == 1) {
+                sample.set(list1.get(1) + "");
+            }
+            if (l >= 1) {
+                StructureItemParameter str = new StructureItemParameter();
+                // 娴嬭瘯瀵硅薄
+                if (list1.get(1) == null) {
+                    str.setSample(null);
+                } else {
+                    String brand = (String) list1.get(1);
+                    StringBuilder builder = new StringBuilder();
+                    builder.append("[");
+                    // 浜у搧
+                    if (ObjectUtil.isNotEmpty(list1.get(2))) {
+                        String production = (String) list1.get(2);
+                        if (!production.contains("锛�")) {
+                            builder.append(String.format("[\"%s\",\"%s\"]", brand, production));
+                        } else {
+                            Arrays.stream(production.split("锛�")).forEach(item -> {
+                                builder.append(String.format("[\"%s\",\"%s\"],", brand, item));
+                            });
+                            builder.deleteCharAt(builder.length() - 1);
+                        }
+                    } else {
+                        builder.append("[");
+                        builder.append(String.format("\"%s\"", brand));
+                        builder.append("]");
+                    }
+                    builder.append("]");
+                    str.setSample(builder.toString());
+                }
+                // 妫�楠岄」
+                str.setInspectionItem(list1.get(4).toString().trim());
+                // 妫�楠岄」鑻辨枃
+                if (list1.get(5) != null) {
+                    str.setInspectionItemEn(list1.get(5).toString());
+                }
+                // 妫�楠屽瓙椤�
+                if (list1.get(6) == null) {
+                    str.setInspectionItemSubclass(null);
+                } else {
+                    str.setInspectionItemSubclass(list1.get(6).toString().trim());
+                }
+                // 妫�楠屽瓙椤硅嫳鏂�
+                if (list1.get(7) == null) {
+                    str.setInspectionItemSubclassEn(null);
+                } else {
+                    str.setInspectionItemSubclassEn(String.valueOf(list1.get(7).toString()));
+                }
+                // 妫�楠岄」鍒嗙被
+                if (list1.get(22) != null && list1.get(22) != "") {
+                    str.setInspectionItemClass(list1.get(22).toString().trim());
+                } else {
+                    str.setInspectionItemClass(null);
+                }
+                // 妫�楠岄」鍒嗙被鑻辨枃
+                if (list1.get(23) != null && list1.get(23) != "") {
+                    str.setInspectionItemClassEn(list1.get(23) + "");
+                } else {
+                    str.setInspectionItemClassEn(null);
+                }
+
+                LambdaQueryWrapper<StructureItemParameter> wrapper = Wrappers.lambdaQuery(StructureItemParameter.class)
+                        .eq(StructureItemParameter::getInspectionItem, str.getInspectionItem())
+                        .eq(StructureItemParameter::getSample, str.getSample())
+
+                        .last("limit 1");
+                // 鍒ゆ柇鏄惁鏈夋楠岄」绫诲瀷
+                if (ObjectUtils.isNotEmpty(str.getInspectionItemClass())) {
+                    wrapper.eq(StructureItemParameter::getInspectionItemClass, str.getInspectionItemClass());
+                }
+
+                // 鍒ゆ柇鏄惁鏈夋楠屽瓙椤�
+                if (ObjectUtils.isNotEmpty(str.getInspectionItemSubclass())) {
+                    wrapper.eq(StructureItemParameter::getInspectionItemSubclass, str.getInspectionItemSubclass());
+                }
+                StructureItemParameter db_str = this.getOne(wrapper);
+                if (ObjectUtils.isNotEmpty(db_str)) {
+                    str.setId(db_str.getId());
+                }
+                // 鏂规硶鍚嶇О
+                if (list1.get(8) == null) {
+                    str.setMethod(null);
+                } else {
+                    StringBuffer buffer = new StringBuffer();
+                    String input = list1.get(8).toString();
+                    buffer.append("[");
+                    String[] values = input.split("锛�");
+                    for (String value : values) {
+                        buffer.append("\"").append(value.trim()).append("\",");
+                    }
+                    buffer.deleteCharAt(buffer.length() - 1);
+                    buffer.append("]");
+                    str.setMethod(buffer.toString());
+                }
+                // 璇曢獙瀹�
+                if (list1.get(9) == null) {
+                    str.setSonLaboratory(null);
+                } else {
+                    str.setSonLaboratory(list1.get(9).toString());
+                }
+                // 璁¢噺鍗曚綅
+                if (list1.get(10) == null) {
+                    str.setUnit(null);
+                } else {
+                    str.setUnit(list1.get(10).toString());
+                }
+                // 瑕佹眰鍊�
+                if (list1.get(11) == null) {
+                    str.setAskTell(null);
+                } else {
+                    str.setAskTell(list1.get(11).toString());
+                }
+                // 瑕佹眰鎻忚堪
+                if (list1.get(12) == null) {
+                    str.setAsk(null);
+                } else {
+                    str.setAsk(list1.get(12).toString());
+                }
+                // 鍗曚环
+                if (list1.get(13) == null) {
+                    str.setPrice(null);
+                } else {
+                    str.setPrice(list1.get(13) + "");
+                }
+                // 宸ユ椂绯绘暟
+                if (list1.get(14) == null) {
+                    str.setManHour(null);
+                } else {
+                    str.setManHour(Double.valueOf(list1.get(14).toString()));
+                }
+                // 宸ユ椂鍒嗙粍
+                if (list1.get(15) == null) {
+                    str.setManHourGroup(null);
+                } else {
+                    str.setManHourGroup(list1.get(15).toString());
+                }
+                // 棰勮瀹屾垚鏃堕棿
+                if (list1.get(16) == null) {
+                    str.setManDay(null);
+                } else {
+                    str.setManDay(Integer.valueOf(list1.get(16).toString()));
+                }
+                // 鏁版嵁绫诲瀷
+                String jy;
+                if (list1.get(17).toString().equals("闈為噰闆嗙被鍨�")) {
+                    jy = "0";
+                } else {
+                    jy = "1";
+                    // 缁戝畾璁惧
+                    if (list1.get(28) == null) {
+                        str.setRates(null);
+                    } else {
+                        // 鏌ヨ璁惧淇℃伅
+                        List<String> managementNumberList = StrUtil.split(list1.get(28).toString(), '锛�');
+                        if (CollectionUtils.isNotEmpty(managementNumberList)) {
+                            List<Integer> deviceIds = structureItemParameterMapper.selectDeviceIdsByNumber(managementNumberList);
+                            if (CollectionUtils.isNotEmpty(deviceIds)) {
+                                str.setDeviceIds(CollUtil.join(deviceIds, ","));
+                            }
+                        }
+                    }
+
+                }
+                str.setInspectionItemType(jy);
+                // 妫�楠岄」绫诲瀷
+                String validateValueType = list1.get(18).toString();
+                if (ObjectUtils.isNotEmpty(validateValueType)) {
+                    List<SysDictData> enums = dictTypeService.selectDictDataByName("妫�楠屽�肩被鍨�")
+                            .stream().filter(sysDictData -> sysDictData.getDictLabel().equals(validateValueType)).collect(Collectors.toList());
+                    str.setInspectionValueType(enums.get(0).getDictValue());
+                }
+                int bsm;
+                //鐗规畩鏍囪瘑
+                if (list1.get(19).toString().equals("鍚�")) {
+                    bsm = 0;
+                } else {
+                    bsm = 1;
+                }
+                str.setBsm(bsm + "");
+                // 鏁板瓧瀛楀吀
+                if (list1.get(20) != null) {
+                    str.setDic(list1.get(20) + "");
+                } else {
+                    str.setDic(null);
+                }
+                // 鍘熷璁板綍妯℃澘
+                StandardTemplate standTempIdByName = standardTemplateService.getStandTempIdByName(String.valueOf(list1.get(21)));
+                if (standTempIdByName != null) {
+                    str.setTemplateId(standTempIdByName.getId());
+                } else {
+                    str.setTemplateId(null);
+                }
+                try {
+                    if (list1.get(24) != null) {
+                        str.setLaboratory(list1.get(24) + "");
+                    }
+                } catch (Exception e) {
+                }
+
+                // 鏉′欢
+                if (list1.get(25) == null) {
+                    str.setRadiusList(null);
+                } else {
+                    StringBuffer buffer = new StringBuffer();
+                    String input = list1.get(25).toString();
+                    buffer.append("[");
+                    String[] values = input.split("锛�");
+                    for (String value : values) {
+                        buffer.append("\"").append(value.trim()).append("\",");
+                    }
+                    buffer.deleteCharAt(buffer.length() - 1);
+                    buffer.append("]");
+                    str.setRadiusList(buffer.toString());
+                }
+                //鏀惰垂鏍囧噯
+                if (list1.get(26) == null) {
+                    str.setRates(null);
+                } else {
+                    str.setRates(list1.get(26) + "");
+                }
+                // 鎶芥牱绫诲瀷
+                String spotCheckType = list1.get(27).toString();
+                if (ObjectUtils.isNotEmpty(spotCheckType)) {
+                    List<SysDictData> enums = dictTypeService.selectDictDataByName("鎶芥绫诲瀷")
+                            .stream().filter(sysDictData -> sysDictData.getDictLabel().equals(spotCheckType)).collect(Collectors.toList());
+                    str.setSpotCheckType(enums.get(0).getDictValue());
+                }
+                lists.add(str);
+            }
+        });
+        try {
+            this.saveOrUpdateBatch(lists);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("鏈嶅姟绔姤閿�");
+        }
     }
 }
diff --git a/basic-server/src/main/resources/mapper/StructureItemParameterMapper.xml b/basic-server/src/main/resources/mapper/StructureItemParameterMapper.xml
index b0139da..c18b8e7 100644
--- a/basic-server/src/main/resources/mapper/StructureItemParameterMapper.xml
+++ b/basic-server/src/main/resources/mapper/StructureItemParameterMapper.xml
@@ -3,11 +3,7 @@
         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.basic.mapper.StructureItemParameterMapper">
-    <delete id="removeNoSample">
-        delete
-        from structure_item_parameter
-        where sample like concat('%', #{sample}, '%')
-    </delete>
+
     <select id="selectItemParameterList" resultType="com.ruoyi.basic.pojo.StructureItemParameter">
         select * from (select A.id,
         inspection_item,
@@ -41,7 +37,8 @@
         code,
         radius_list,
         rates,
-        device_ids
+        device_ids,
+        spot_check_type
         from (select *,
         CASE
         WHEN INSTR(sample, ',') > 0 THEN
@@ -109,6 +106,13 @@
         from structure_test_object sto
                  left join product p on p.object_id = sto.id
     </select>
+    <select id="selectDeviceIdsByNumber" resultType="java.lang.Integer">
+        select id from device
+        where management_number in
+        <foreach item="item" collection="managementNumberList" open="(" separator="),(" close=")">
+            #{item}
+        </foreach>
+    </select>
 
     <resultMap id="itemDto" type="com.ruoyi.basic.dto.TestItemDto">
         <result column="sId" property="id"/>
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java
index 92a8b2d..be50081 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java
@@ -36,5 +36,11 @@
     List<Map<String, Object>> treeDevice(@Param("deviceName") String deviceName);
 
     DeviceDto selectDeviceByCode(Integer id);
+
+    /**
+     * 鏌ヨ鍒拌揪鏍″噯鏈夋晥鏈熺殑璁惧-鎻愬墠5澶�
+     * @return
+     */
+    List<Device> selectOverdueDevice();
 }
 
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java
index 911c0e5..2cdb61e 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java
@@ -151,6 +151,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java
index 60d610e..6eeecb6 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java
@@ -181,6 +181,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java
index 8fb4089..15b21ef 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java
@@ -144,6 +144,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java
index 20eba63..acf6965 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java
@@ -301,6 +301,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExaminePlanServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExaminePlanServiceImpl.java
index db70678..23b2af1 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExaminePlanServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExaminePlanServiceImpl.java
@@ -304,6 +304,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordContrastServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordContrastServiceImpl.java
index 2b2343b..27ec286 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordContrastServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordContrastServiceImpl.java
@@ -185,6 +185,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordServiceImpl.java
index bf1136c..7f2d705 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordServiceImpl.java
@@ -229,6 +229,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExternalApplyServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExternalApplyServiceImpl.java
index f6085b2..901948b 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExternalApplyServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExternalApplyServiceImpl.java
@@ -153,6 +153,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceImpowerServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceImpowerServiceImpl.java
index b42a809..c190fa1 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceImpowerServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceImpowerServiceImpl.java
@@ -290,6 +290,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java
index 1a3f00a..e9e9b18 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java
@@ -215,6 +215,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java
index 47ec658..5493187 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java
@@ -135,6 +135,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenancePlanServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenancePlanServiceImpl.java
index 0823576..d4c7fcb 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenancePlanServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenancePlanServiceImpl.java
@@ -196,6 +196,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceRecordServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceRecordServiceImpl.java
index b38cc3d..15b388b 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceRecordServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceRecordServiceImpl.java
@@ -138,6 +138,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java
index 910617a..3fe7006 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java
@@ -170,6 +170,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
index 0cb7415..c743869 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
@@ -353,6 +353,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
@@ -488,6 +489,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java
index 4d4a481..412e97d 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java
@@ -151,6 +151,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceTraceabilityManagementServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceTraceabilityManagementServiceImpl.java
index 818d22d..fd4acd1 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceTraceabilityManagementServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceTraceabilityManagementServiceImpl.java
@@ -281,6 +281,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java b/cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java
index 7ead8cb..b1009fc 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java
@@ -3,7 +3,9 @@
 import com.ruoyi.common.core.domain.entity.User;
 import com.ruoyi.common.utils.WxCpUtils;
 import com.ruoyi.device.dto.DeviceRecordDto;
+import com.ruoyi.device.mapper.DeviceMapper;
 import com.ruoyi.device.mapper.DeviceRecordMapper;
+import com.ruoyi.device.pojo.Device;
 import com.ruoyi.device.pojo.DeviceRecord;
 import com.ruoyi.system.mapper.UserMapper;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -20,6 +22,9 @@
  */
 @Component
 public class DeviceRecordSchedule {
+
+    @Resource
+    private DeviceMapper deviceMapper;
     @Resource
     private DeviceRecordMapper deviceRecordMapper;
     @Resource
@@ -31,7 +36,7 @@
      * 鎻愰啋濉啓璁惧浣跨敤璁板綍
      */
 //    @Scheduled(cron = "0/5 * * * * *")
-    @Scheduled(cron = "0 0 9 * * 6") // 姣忓懆鍏墽琛屼竴娆�
+//    @Scheduled(cron = "0 0 9 * * 6") // 姣忓懆鍏墽琛屼竴娆�
     public void task1() {
         // 鏌ヨ鏈~鍐欑殑璁惧浣跨敤璁板綍
         List<DeviceRecordDto> deviceRecords = deviceRecordMapper.selectNotFilled();
@@ -58,8 +63,41 @@
 
             });
         });
+    }
 
 
+    /**
+     * 姣忓ぉ9鐐规墽琛屼竴娆� 闄や簡鏄熸湡澶�
+     * 鍒ゆ柇鏄惁鏈夎澶囧埌杈炬牎鍑嗘湁鏁堟湡
+     */
+//    @Scheduled(cron = "0/5 * * * * *")
+//    @Scheduled(cron = "0 0 9 * * 1-6") // 姣忓ぉ9鐐规墽琛屼竴娆� 闄や簡鏄熸湡澶�
+    public void task2() {
+        // 鏌ヨ鍒拌揪鏍″噯鏈夋晥鏈熺殑璁惧-鎻愬墠5澶�
+        List<Device> deviceList = deviceMapper.selectOverdueDevice();
+        Map<Integer, List<Device>> userPersonIdMap = deviceList.stream().collect(Collectors.groupingBy(Device::getEquipmentManager));
+        userPersonIdMap.forEach((userId, recordList) -> {
+            threadPoolTaskExecutor.execute(() -> {
+                // 浼佷笟寰俊閫氱煡濉啓璁惧浣跨敤璁板綍
+                User user = userMapper.selectById(userId);
+                String message = "";
+                message += "璁惧浣跨敤璁板綍鏈~鍐欐彁閱掗�氱煡";
+                for (Device deviceRecord : recordList) {
+                    message += "\n璁惧鍚嶇О缂栧彿: " + deviceRecord.getDeviceName() + "-" + deviceRecord.getManagementNumber();
+                    message += "\n濮旀墭缂栧彿: " + deviceRecord.getSampleCode();
+                    message += "\n";
+                }
+                message += "\n璇峰幓濉啓璁惧浣跨敤璁板綍";
+
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(user.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+
+            });
+        });
     }
 
 }
diff --git a/cnas-device/src/main/resources/mapper/DeviceMapper.xml b/cnas-device/src/main/resources/mapper/DeviceMapper.xml
index 33fd802..2c2436a 100644
--- a/cnas-device/src/main/resources/mapper/DeviceMapper.xml
+++ b/cnas-device/src/main/resources/mapper/DeviceMapper.xml
@@ -142,6 +142,7 @@
     <resultMap id="deviceNameMap" type="map">
         <result property="value" column="id"/>
         <result property="label" column="device_name"/>
+        <result property="activationDate" column="activation_date"/>
         <result property="managementNumber" column="management_number"/>
     </resultMap>
 
@@ -152,7 +153,8 @@
         case when d.storage_point is null || d.storage_point ='' then '鍏朵粬' else d.storage_point end as storage_point,
         d.device_name,
         d.management_number,
-        null as value
+        null as value,
+        d.activation_date
         from device d
         LEFT JOIN laboratory l ON l.id = d.subordinate_departments_id
         <where>
@@ -160,7 +162,6 @@
                 and device_name like concat('%',#{deviceName},'%')
             </if>
         </where>
-        order by l.laboratory_name desc, d.storage_point desc
     </select>
 
     <select id="selectDeviceByCode" resultType="com.ruoyi.device.dto.DeviceDto">
@@ -181,4 +182,15 @@
                  u1.name,
                  u2.name
     </select>
+
+    <!-- 鏌ヨ鍒拌揪鏍″噯鏈夋晥鏈熺殑璁惧-鎻愬墠5澶� -->
+    <select id="selectOverdueDevice" resultType="com.ruoyi.device.pojo.Device">
+        SELECT *
+        FROM device
+        WHERE
+        -- 绛涢�夊嚭 activation_date 鍦ㄥ綋鍓嶆棩鏈熷墠浜斿ぉ鍐呯殑鏁版嵁
+        activation_date BETWEEN now() AND now() + INTERVAL 5 DAY
+        -- 绛涢�夊嚭 activation_date 宸茬粡瓒呰繃褰撳墠鏃ユ湡鐨勬暟鎹�
+        OR activation_date &lt; now()
+    </select>
 </mapper>
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/schedule/ManageRecordTotalSchedule.java b/cnas-manage/src/main/java/com/ruoyi/manage/schedule/ManageRecordTotalSchedule.java
index 6cd870e..040406a 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/schedule/ManageRecordTotalSchedule.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/schedule/ManageRecordTotalSchedule.java
@@ -20,7 +20,7 @@
     @Resource
     private ManageRecordIntervalsTotalService manageRecordIntervalsTotalService;
 
-    @Scheduled(cron = "0 0 2 1 1 ?") //姣忓勾1鏈�1鍙�2鐐�
+//    @Scheduled(cron = "0 0 2 1 1 ?") //姣忓勾1鏈�1鍙�2鐐�
     public void manageRecordTotal() {
         ManageRecordTotal manageRecordTotal = new ManageRecordTotal();
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ClientSatisfactionServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ClientSatisfactionServiceImpl.java
index a2269d3..a6b39e2 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ClientSatisfactionServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ClientSatisfactionServiceImpl.java
@@ -161,6 +161,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCheckServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCheckServiceImpl.java
index a076745..44726d6 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCheckServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCheckServiceImpl.java
@@ -221,6 +221,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCorrectServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCorrectServiceImpl.java
index 79f778d..f9cc9c8 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCorrectServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCorrectServiceImpl.java
@@ -310,6 +310,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalImplementServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalImplementServiceImpl.java
index 1aaab47..2aa7200 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalImplementServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalImplementServiceImpl.java
@@ -54,7 +54,7 @@
 
     @Resource
     private InternalImplementDetailService internalImplementDetailService;
-    
+
     @Resource
     private UserMapper userMapper;
     @Value("${file.path}")
@@ -228,6 +228,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalMeetingServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalMeetingServiceImpl.java
index b153746..c26a0e1 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalMeetingServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalMeetingServiceImpl.java
@@ -191,6 +191,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalPlanServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalPlanServiceImpl.java
index 782d78c..ab95821 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalPlanServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalPlanServiceImpl.java
@@ -248,6 +248,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalReportServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalReportServiceImpl.java
index 310858b..c41aa1d 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalReportServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalReportServiceImpl.java
@@ -155,6 +155,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageControlPlanListServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageControlPlanListServiceImpl.java
index 0b72764..5de6af3 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageControlPlanListServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageControlPlanListServiceImpl.java
@@ -120,6 +120,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageMeetingServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageMeetingServiceImpl.java
index ee7d236..2e9402a 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageMeetingServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageMeetingServiceImpl.java
@@ -38,7 +38,7 @@
  * 鏈嶅姟瀹炵幇绫�
  * </p>
  *
- * @author 
+ * @author
  * @since 2024-11-11 09:33:47
  */
 @Service
@@ -152,6 +152,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordAuditServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordAuditServiceImpl.java
index 96de123..f25de5a 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordAuditServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordAuditServiceImpl.java
@@ -43,7 +43,7 @@
  * 鏂囦欢淇鐢宠瀹℃壒璁板綍 鏈嶅姟瀹炵幇绫�
  * </p>
  *
- * @author 
+ * @author
  * @since 2024-11-14 10:29:18
  */
 @Service
@@ -155,6 +155,8 @@
             OutputStream outputStream = new FileOutputStream(file);
             IOUtils.copy(inputStream, outputStream);
             url = file.getAbsolutePath();
+            inputStream.close();
+            outputStream.close();
         } catch (FileNotFoundException e) {
             throw new ErrorException("鎵句笉鍒版ā鏉挎枃浠�");
         } catch (IOException e) {
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCancelServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCancelServiceImpl.java
index 8e275d8..0d1fa80 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCancelServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCancelServiceImpl.java
@@ -46,7 +46,7 @@
  * 浣滃簾鏂囦欢閿�榄傝褰� 鏈嶅姟瀹炵幇绫�
  * </p>
  *
- * @author 
+ * @author
  * @since 2024-11-13 01:27:22
  */
 @Service
@@ -90,6 +90,8 @@
             OutputStream outputStream = new FileOutputStream(file);
             IOUtils.copy(inputStream, outputStream);
             url = file.getAbsolutePath();
+            inputStream.close();
+            outputStream.close();
         } catch (FileNotFoundException e) {
             throw new ErrorException("鎵句笉鍒版ā鏉挎枃浠�");
         } catch (IOException e) {
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCheckServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCheckServiceImpl.java
index 6262781..3c1afed 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCheckServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCheckServiceImpl.java
@@ -48,7 +48,7 @@
  * 鏂囦欢瀹℃壒璁板綍(鍚慨璁㈠悗鍐嶆瀹℃壒璁板綍) 鏈嶅姟瀹炵幇绫�
  * </p>
  *
- * @author 
+ * @author
  * @since 2024-11-12 02:31:36
  */
 @Service
@@ -100,6 +100,8 @@
             OutputStream outputStream = new FileOutputStream(file);
             IOUtils.copy(inputStream, outputStream);
             url = file.getAbsolutePath();
+            inputStream.close();
+            outputStream.close();
         } catch (FileNotFoundException e) {
             throw new ErrorException("鎵句笉鍒版ā鏉挎枃浠�");
         } catch (IOException e) {
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsServiceImpl.java
index 1a4ccb0..2fc9087 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsServiceImpl.java
@@ -76,6 +76,8 @@
             OutputStream outputStream = new FileOutputStream(file);
             IOUtils.copy(inputStream, outputStream);
             url = file.getAbsolutePath();
+            inputStream.close();
+            outputStream.close();
         } catch (FileNotFoundException e) {
             throw new ErrorException("鎵句笉鍒版ā鏉挎枃浠�");
         } catch (IOException e) {
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsTotalServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsTotalServiceImpl.java
index 25d1c94..045c232 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsTotalServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsTotalServiceImpl.java
@@ -130,6 +130,8 @@
             OutputStream outputStream = new FileOutputStream(file);
             IOUtils.copy(inputStream, outputStream);
             url = file.getAbsolutePath();
+            inputStream.close();
+            outputStream.close();
         } catch (FileNotFoundException e) {
             throw new ErrorException("鎵句笉鍒版ā鏉挎枃浠�");
         } catch (IOException e) {
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIssueRecycleServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIssueRecycleServiceImpl.java
index c04acc4..ca78c93 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIssueRecycleServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIssueRecycleServiceImpl.java
@@ -78,6 +78,8 @@
             OutputStream outputStream = new FileOutputStream(file);
             IOUtils.copy(inputStream, outputStream);
             url = file.getAbsolutePath();
+            inputStream.close();
+            outputStream.close();
         } catch (FileNotFoundException e) {
             throw new ErrorException("鎵句笉鍒版ā鏉挎枃浠�");
         } catch (IOException e) {
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordTotalServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordTotalServiceImpl.java
index 53da1f2..0b54543 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordTotalServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordTotalServiceImpl.java
@@ -131,6 +131,8 @@
             OutputStream outputStream = new FileOutputStream(file);
             IOUtils.copy(inputStream, outputStream);
             url = file.getAbsolutePath();
+            inputStream.close();
+            outputStream.close();
         } catch (FileNotFoundException e) {
             throw new ErrorException("鎵句笉鍒版ā鏉挎枃浠�");
         } catch (IOException e) {
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewProgramServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewProgramServiceImpl.java
index d033c97..261f878 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewProgramServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewProgramServiceImpl.java
@@ -107,6 +107,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewReportServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewReportServiceImpl.java
index 887c79f..0302e6b 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewReportServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewReportServiceImpl.java
@@ -33,7 +33,7 @@
  * 绠$悊璇勫鎶ュ憡 鏈嶅姟瀹炵幇绫�
  * </p>
  *
- * @author 
+ * @author
  * @since 2024-11-12 04:44:39
  */
 @Service
@@ -128,6 +128,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRiskAssessmentResultsServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRiskAssessmentResultsServiceImpl.java
index dd7a9cb..f351249 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRiskAssessmentResultsServiceImpl.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRiskAssessmentResultsServiceImpl.java
@@ -115,6 +115,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java
index 33077b3..877bee4 100644
--- a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java
@@ -246,6 +246,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java
index 9a80942..c532a7d 100644
--- a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java
@@ -105,6 +105,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java
index 225f3cc..90202d7 100644
--- a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java
@@ -105,6 +105,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java
index 3e4f0b4..51a207f 100644
--- a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java
@@ -39,7 +39,7 @@
  * 浜哄憳鑳藉姏 鏈嶅姟瀹炵幇绫�
  * </p>
  *
- * @author 
+ * @author
  * @since 2024-10-10 11:26:18
  */
 @Service
@@ -103,6 +103,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java
index fee084e..756b68e 100644
--- a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java
@@ -31,7 +31,7 @@
  * 浠昏亴鎺堟潈璁板綍 鏈嶅姟瀹炵幇绫�
  * </p>
  *
- * @author 
+ * @author
  * @since 2024-10-09 10:48:17
  */
 @Service
@@ -123,6 +123,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java
index 7dfe566..5c4887c 100644
--- a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java
@@ -117,6 +117,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java
index a573627..481683b 100644
--- a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java
@@ -288,6 +288,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
@@ -364,6 +365,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/task/PersonTrainingSchedule.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/task/PersonTrainingSchedule.java
index 4e87b34..9c770fa 100644
--- a/cnas-personnel/src/main/java/com/ruoyi/personnel/task/PersonTrainingSchedule.java
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/task/PersonTrainingSchedule.java
@@ -28,10 +28,10 @@
     private ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
     /**
-     * 鎻愰啋濉啓璁惧浣跨敤璁板綍
+     * 鎻愰啋濉啓浜哄憳鍩硅璁板綍
      */
 //    @Scheduled(cron = "0/5 * * * * *")
-    @Scheduled(cron = "0 0 9 1 * *") // 姣忔湀涓�鍙锋墽琛�
+//    @Scheduled(cron = "0 0 9 1,15 * *") // 姣忔湀涓�鍙锋墽琛�
     public void task1() {
         // 鏌ヨ褰撴湀鍩硅璁″垝
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.M");
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessReportController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessReportController.java
index 76a2db2..1c683bf 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessReportController.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessReportController.java
@@ -34,7 +34,7 @@
 
     @ApiOperation(value = "鏌ヨ妫�楠屾姤鍛婂彂鏀剧櫥璁板垪琛�")
     @GetMapping("/pageProcessReport")
-    public Result pageProcessReport(ProcessReport processReport , Page page) {
+    public Result pageProcessReport(ProcessReportDto processReport , Page page) {
         return Result.success(processReportService.pageProcessReport(page, processReport));
     }
 
@@ -64,11 +64,8 @@
 
     @ApiOperation(value = "瀵煎嚭妫�楠屾姤鍛婂彂鏀剧櫥璁拌〃")
     @GetMapping("/exportProcessReport")
-    public void exportProcessReport(String ids, HttpServletResponse response) {
-        List<Integer> list = Arrays.stream(ids.split(","))
-                .map(Integer::parseInt)
-                .collect(Collectors.toList());
-        processReportService.exportProcessReport(list, response);
+    public void exportProcessReport(ProcessReportDto dto, HttpServletResponse response) {
+        processReportService.exportProcessReport(dto, response);
     }
 
 }
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/QualitySuperviseManagementReviewController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/QualitySuperviseManagementReviewController.java
new file mode 100644
index 0000000..5595608
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/QualitySuperviseManagementReviewController.java
@@ -0,0 +1,71 @@
+package com.ruoyi.process.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.process.pojo.QualitySupervise;
+import com.ruoyi.process.pojo.QualitySuperviseManagementReview;
+import com.ruoyi.process.service.QualitySuperviseManagementReviewService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璐ㄩ噺鐩戠潱绠$悊璇勫杈撳叆鏉愭枡 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2025-05-07 10:46:11
+ */
+@RestController
+@RequestMapping("/managementReview")
+@Api(tags = "璐ㄩ噺鐩戠潱绠$悊璇勫杈撳叆鏉愭枡")
+@AllArgsConstructor
+public class QualitySuperviseManagementReviewController {
+
+    private QualitySuperviseManagementReviewService qualitySuperviseManagementReviewService;
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @return
+     */
+    @ApiOperation(value = "鍒嗛〉鏌ヨ")
+    @GetMapping("/pageManagementReview")
+    public Result<IPage<QualitySuperviseManagementReview>> pageManagementReview(QualitySuperviseManagementReview managementReview, Page page) {
+        return Result.success(qualitySuperviseManagementReviewService.pageManagementReview(page, managementReview));
+    }
+
+    /**
+     * 鏂板鎴栦慨鏀�
+     * @return
+     */
+    @ApiOperation(value = "鏂板鎴栦慨鏀�")
+    @PostMapping("/saveOrUpdateManagementReview")
+    public Result saveOrUpdateManagementReview(@RequestBody QualitySuperviseManagementReview managementReview) {
+        return Result.success(qualitySuperviseManagementReviewService.saveOrUpdate(managementReview));
+    }
+
+    /**
+     * 鍒犻櫎
+     * @return
+     */
+    @ApiOperation(value = "鍒犻櫎")
+    @DeleteMapping("/deleteManagementReview")
+    public Result deleteManagementReview(Integer managementReviewId) {
+        return Result.success(qualitySuperviseManagementReviewService.removeById(managementReviewId));
+    }
+
+    /**
+     * 瀵煎嚭
+     * @return
+     */
+    @ApiOperation(value = "瀵煎嚭")
+    @GetMapping("/exportManagementReview")
+    public void exportManagementReview(Integer managementReviewId,HttpServletResponse response) {
+        qualitySuperviseManagementReviewService.exportManagementReview(managementReviewId, response);
+    }
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessDealDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessDealDto.java
new file mode 100644
index 0000000..b3c0a0c
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessDealDto.java
@@ -0,0 +1,19 @@
+package com.ruoyi.process.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.process.pojo.ProcessDeal;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2025/4/23
+ */
+@Data
+public class ProcessDealDto extends ProcessDeal {
+    @ApiModelProperty("搴忓彿")
+    private String indexs;
+
+    @ApiModelProperty("鏃堕棿")
+    private String dealTimeStr;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessReportDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessReportDto.java
index d54e1fd..d33d255 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessReportDto.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessReportDto.java
@@ -1,12 +1,30 @@
 package com.ruoyi.process.dto;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.deepoove.poi.data.PictureRenderData;
+import com.ruoyi.process.pojo.ProcessReport;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.util.List;
 
 @Data
 //瀵煎嚭
-public class ProcessReportDto {
+public class ProcessReportDto extends ProcessReport {
 
     private List<Integer> ids;
+
+    @ApiModelProperty("鍙戦�佷汉濮撳悕")
+    private String sendUserName;
+
+    @ApiModelProperty("鍙戦�佷汉鍦板潃")
+    private String sendUserUrl;
+
+    @ApiModelProperty("鍙戦�佷汉绛惧悕")
+    private PictureRenderData sendUserRender;
+
+    @ApiModelProperty("绛炬敹绛惧悕")
+    private PictureRenderData signatoryRender;
+
+
 }
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessDealMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessDealMapper.java
index 9af6989..82913de 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessDealMapper.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessDealMapper.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.dto.ProcessDealDto;
 import com.ruoyi.process.pojo.ProcessDeal;
 import org.apache.ibatis.annotations.Param;
 
@@ -21,6 +22,6 @@
 
     IPage<ProcessDeal> pageProcessDeal(Page page, @Param("ew") QueryWrapper<ProcessDeal> queryWrappers);
 
-    List<ProcessDeal> selectDeal(@Param("id") Integer id);
+    List<ProcessDealDto> selectDeal(@Param("id") Integer id);
 
 }
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessOrderDeviceMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessOrderDeviceMapper.java
index 80e4b76..03a5302 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessOrderDeviceMapper.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessOrderDeviceMapper.java
@@ -21,7 +21,7 @@
 
     Set<String> selectDeviceNumber(@Param("inspectionOrderId") Integer inspectionOrderId);
 
-    List<Integer> selectDeviceIdsByNumbers(@Param("orderDeviceNumbers") Set<String> orderDeviceNumbers);
+    List<Integer> selectDeviceIdsByNumbers(@Param("deviceNumbers") Set<String> deviceNumbers);
 
     IPage<ProcessOrderDevice> deviceRecordPage(@Param("deviceId") Integer deviceId, @Param("page") Page page, @Param("sampleCode") String sampleCode, @Param("managementNumber") String managementNumber);
 }
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessReportMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessReportMapper.java
index 56d946b..75bd9ac 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessReportMapper.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessReportMapper.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.dto.ProcessReportDto;
 import com.ruoyi.process.pojo.ProcessReport;
 import org.apache.ibatis.annotations.Param;
 
@@ -19,7 +20,7 @@
  */
 public interface ProcessReportMapper extends BaseMapper<ProcessReport> {
 
-    IPage<ProcessReport> pageProcessReport(Page page, @Param("ew") QueryWrapper<ProcessReport> queryWrappers);
+    IPage<ProcessReportDto> pageProcessReport(Page page, @Param("ew") QueryWrapper<ProcessReportDto> queryWrappers);
 
-    List<ProcessReport> getIds(@Param("ids") List<Integer> ids);
+    List<ProcessReportDto> exportProcessReport();
 }
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseManagementReviewMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseManagementReviewMapper.java
new file mode 100644
index 0000000..7a0ae0c
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseManagementReviewMapper.java
@@ -0,0 +1,26 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.pojo.QualitySuperviseManagementReview;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璐ㄩ噺鐩戠潱绠$悊璇勫杈撳叆鏉愭枡 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2025-05-07 10:46:11
+ */
+public interface QualitySuperviseManagementReviewMapper extends BaseMapper<QualitySuperviseManagementReview> {
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page
+     * @return
+     */
+    IPage<QualitySuperviseManagementReview> pageManagementReview(@Param("page") Page page, @Param("ew") QueryWrapper<QualitySuperviseManagementReview> ew);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessDeal.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessDeal.java
index 078e04e..721c609 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessDeal.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessDeal.java
@@ -65,8 +65,4 @@
 
     @ApiModelProperty("鍏宠仈鐨勬牱鍝佹帴鏀秈d")
     private Integer processSampleId;
-
-    @ApiModelProperty("搴忓彿")
-    @TableField(select = false,exist = false)
-    private String indexs;
 }
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessReport.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessReport.java
index 4be9719..478721d 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessReport.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessReport.java
@@ -54,19 +54,8 @@
 
     @ApiModelProperty("鍙戦�佷汉")
     private Integer sendUser;
-
-    @TableField(select = false,exist = false)
-    private String sendUserName;
-
     @ApiModelProperty("绛炬敹浜�")
     private String signatory;
-
-
-    @TableField(select = false,exist = false)
-    private String signatoryUrl;
-
-    @TableField(select = false,exist = false)
-    private String signatoryName;
 
     @ApiModelProperty("澶囨敞")
     private String remark;
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseManagementReview.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseManagementReview.java
new file mode 100644
index 0000000..50b45a4
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseManagementReview.java
@@ -0,0 +1,63 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 璐ㄩ噺鐩戠潱绠$悊璇勫杈撳叆鏉愭枡
+ * </p>
+ *
+ * @author
+ * @since 2025-05-07 10:46:11
+ */
+@Getter
+@Setter
+@TableName("cnas_quality_supervise_management_review")
+@ApiModel(value = "QualitySuperviseManagementReview瀵硅薄", description = "璐ㄩ噺鐩戠潱绠$悊璇勫杈撳叆鏉愭枡")
+public class QualitySuperviseManagementReview implements Serializable {
+
+    @TableId(value = "management_review_id", type = IdType.AUTO)
+    private Integer managementReviewId;
+
+    @ApiModelProperty("鏂囦欢鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty("璁″垝鍐呭")
+    private String implementationContent;
+
+    @ApiModelProperty("鍔ㄦ�佸唴瀹�")
+    private String dynamicContent;
+
+    @ApiModelProperty("鐩戠潱浜�")
+    private String supervisor;
+
+    @ApiModelProperty("璐ㄩ噺璇勫鏃ユ湡")
+    private LocalDate superviseDate;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessReportService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessReportService.java
index 5ae2987..faf5c48 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessReportService.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessReportService.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.dto.ProcessReportDto;
 import com.ruoyi.process.pojo.ProcessReport;
 
 import javax.servlet.http.HttpServletResponse;
@@ -19,7 +20,7 @@
  */
 public interface ProcessReportService extends IService<ProcessReport> {
 
-    IPage<ProcessReport> pageProcessReport(Page page, ProcessReport processReport);
+    IPage<ProcessReportDto> pageProcessReport(Page page, ProcessReportDto processReport);
 
-    void exportProcessReport(List<Integer> ids, HttpServletResponse response);
+    void exportProcessReport(ProcessReportDto dto, HttpServletResponse response);
 }
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/QualitySuperviseManagementReviewService.java b/cnas-process/src/main/java/com/ruoyi/process/service/QualitySuperviseManagementReviewService.java
new file mode 100644
index 0000000..92ad08f
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/QualitySuperviseManagementReviewService.java
@@ -0,0 +1,34 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.pojo.QualitySuperviseManagementReview;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璐ㄩ噺鐩戠潱绠$悊璇勫杈撳叆鏉愭枡 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2025-05-07 10:46:11
+ */
+public interface QualitySuperviseManagementReviewService extends IService<QualitySuperviseManagementReview> {
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page
+     * @param managementReview
+     * @return
+     */
+    IPage<QualitySuperviseManagementReview> pageManagementReview(Page page, QualitySuperviseManagementReview managementReview);
+
+    /**
+     * 瀵煎嚭
+     * @param managementReviewId
+     * @param response
+     */
+    void exportManagementReview(Integer managementReviewId, HttpServletResponse response);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/InconsistentDistributionServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/InconsistentDistributionServiceImpl.java
index b4cbbed..c6dba83 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/InconsistentDistributionServiceImpl.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/InconsistentDistributionServiceImpl.java
@@ -221,6 +221,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderServiceImpl.java
index ae6b0b4..9b18aec 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderServiceImpl.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderServiceImpl.java
@@ -401,6 +401,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java
index ada2339..0e8426d 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java
@@ -345,6 +345,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessReportServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessReportServiceImpl.java
index a92b478..5bca8b2 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessReportServiceImpl.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessReportServiceImpl.java
@@ -3,6 +3,7 @@
 import cn.hutool.core.lang.UUID;
 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.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.deepoove.poi.XWPFTemplate;
@@ -13,14 +14,15 @@
 import com.ruoyi.common.core.domain.entity.User;
 import com.ruoyi.common.utils.QueryWrappers;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.SignatureImageUtil;
 import com.ruoyi.framework.exception.ErrorException;
 import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.process.dto.ProcessReportDto;
 import com.ruoyi.process.mapper.ProcessReportMapper;
 import com.ruoyi.process.pojo.ProcessReport;
 import com.ruoyi.process.service.ProcessReportService;
 import com.ruoyi.system.mapper.UserMapper;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.xwpf.usermodel.*;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -52,45 +54,32 @@
 
     @Resource
     private ProcessReportMapper processReportMapper;
-
-
-    @Value("${wordUrl}")
-    private String wordUrl;
+    @Value("${file.path}")
+    private String imgUrl;
 
     @Resource
     private UserMapper userMapper;
 
     @Override
-    public IPage<ProcessReport> pageProcessReport(Page page, ProcessReport processReport) {
-        //todo 浠呯湅鎴�
-        IPage<ProcessReport> processReportIPage = processReportMapper.pageProcessReport(page, QueryWrappers.queryWrappers(processReport));
-//        for (ProcessReport record : processReportIPage.getRecords()) {
-//            List<String> name = new ArrayList<>();
-//            for (String s : record.getSignatory().split(",")) {
-//                User user = userMapper.selectById(Integer.parseInt(s));
-//                name.add(user.getName());
-//            }
-//            String signatoryName = name.stream().collect(Collectors.joining(","));
-//            record.setSignatoryName(signatoryName);
-//        }
+    public IPage<ProcessReportDto> pageProcessReport(Page page, ProcessReportDto processReport) {
+        IPage<ProcessReportDto> processReportIPage = processReportMapper.pageProcessReport(page, QueryWrappers.queryWrappers(processReport));
 
         return processReportIPage;
     }
 
     @Override
-    public void exportProcessReport(List<Integer> ids, HttpServletResponse response) {
-        List<ProcessReport> processReports = processReportMapper.getIds(ids);
-//        for (ProcessReport record : processReports) {
-//            List<String> name = new ArrayList<>();
-//            if(StringUtils.isNotBlank(record.getSignatory())){
-//                for (String s : record.getSignatory().split(",")) {
-//                    User user = userMapper.selectById(Integer.parseInt(s));
-//                    name.add(user.getName());
-//                }
-//                String signatoryName = name.stream().collect(Collectors.joining(","));
-//                record.setSignatoryName(signatoryName);
-//            }
-//        }
+    public void exportProcessReport(ProcessReportDto dto, HttpServletResponse response) {
+        List<ProcessReportDto> processReports = processReportMapper.exportProcessReport();
+        for (ProcessReportDto processReport : processReports) {
+            // 鍙戦�佷汉鐢熸垚绛惧悕鍥剧墖
+            processReport.setSendUserRender(StringUtils.isNotBlank(processReport.getSendUserUrl())
+                    ? Pictures.ofLocal(imgUrl + "/" + processReport.getSendUserUrl()).create() : null);
+
+            // 绛炬敹浜虹敓鎴愬浘鐗�
+            processReport.setSignatoryRender(StringUtils.isNotBlank(processReport.getSignatory())
+                    ? Pictures.ofStream(SignatureImageUtil.saveImageToFile(processReport.getSignatory())).create() : null);
+        }
+
         // 鑾峰彇璺緞
         InputStream inputStream = this.getClass().getResourceAsStream("/static/report-deal.docx");
         Configure configure = Configure.builder()
@@ -110,6 +99,8 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessSampleServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessSampleServiceImpl.java
index f4dd8a7..0d7eebe 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessSampleServiceImpl.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessSampleServiceImpl.java
@@ -61,6 +61,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessTotaldealServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessTotaldealServiceImpl.java
index 7e7bad5..ee516b8 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessTotaldealServiceImpl.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessTotaldealServiceImpl.java
@@ -17,6 +17,7 @@
 import com.ruoyi.framework.exception.ErrorException;
 import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
 import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.process.dto.ProcessDealDto;
 import com.ruoyi.process.mapper.InspectionOrderMapper;
 import com.ruoyi.process.mapper.ProcessDealMapper;
 import com.ruoyi.process.mapper.ProcessSampleMapper;
@@ -185,7 +186,7 @@
 
     @Override
     public void exportProcessTotaldeal(Integer id, HttpServletResponse response) {
-        List<ProcessDeal> sampleDealDtos = processDealMapper.selectDeal(id);
+        List<ProcessDealDto> sampleDealDtos = processDealMapper.selectDeal(id);
         ProcessTotaldeal processTotaldeal = processTotaldealMapper.selectById(id);
 
         // 鑾峰彇璺緞
@@ -210,6 +211,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
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
index b8f2d71..e8da9e5 100644
--- 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
@@ -373,6 +373,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
@@ -519,6 +520,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
@@ -732,6 +734,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
@@ -751,11 +754,9 @@
         if (qualityMonitorDetailsId == null) {
             throw new ErrorException("缂哄皯鐩戞帶璇︽儏id");
         }
-        QualityMonitorDetails qualityMonitorDetails = qualityMonitorDetailsService.getOne(Wrappers.<QualityMonitorDetails>lambdaUpdate()
-                .eq(QualityMonitorDetails::getQualityMonitorDetailsId, qualityMonitorDetailsId));
         LocalDateTime now = LocalDateTime.now();
         Integer userId =SecurityUtils.getUserId().intValue();
-
+        String contentType = file.getContentType();
         String urlString;
         String pathName;
         try {
@@ -768,10 +769,13 @@
             urlString = realpath + "/" + pathName;
             file.transferTo(new File(urlString));
 
-            wordInsertUrl(new HashMap<String, Object>() {{
-                put("writeUrl", UserUtils.getFinalUserSignatureUrl(userId));
-                put("writeDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(now)).create());
-            }}, wordUrl + "/" + pathName.replace("/word", wordUrl));
+            // 鍒ゆ柇鏄惁鏄痯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)
@@ -807,7 +811,7 @@
 
         // 娣诲姞鎵瑰噯浜�
         QualityMonitorDetails details = qualityMonitorDetailsMapper.selectById(qualityMonitorDetails.getQualityMonitorDetailsId());
-        if (StringUtils.isNotBlank(details.getFinishReportUrl())) {
+        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());
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseManagementReviewServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseManagementReviewServiceImpl.java
new file mode 100644
index 0000000..69d3a2c
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseManagementReviewServiceImpl.java
@@ -0,0 +1,86 @@
+package com.ruoyi.process.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.Pictures;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.process.dto.QualitySuperviseDetailsCorrectDto;
+import com.ruoyi.process.pojo.QualitySuperviseDetailsCorrect;
+import com.ruoyi.process.pojo.QualitySuperviseManagementReview;
+import com.ruoyi.process.mapper.QualitySuperviseManagementReviewMapper;
+import com.ruoyi.process.service.QualitySuperviseManagementReviewService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璐ㄩ噺鐩戠潱绠$悊璇勫杈撳叆鏉愭枡 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2025-05-07 10:46:11
+ */
+@Service
+public class QualitySuperviseManagementReviewServiceImpl extends ServiceImpl<QualitySuperviseManagementReviewMapper, QualitySuperviseManagementReview> implements QualitySuperviseManagementReviewService {
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page
+     * @param managementReview
+     * @return
+     */
+    @Override
+    public IPage<QualitySuperviseManagementReview> pageManagementReview(Page page, QualitySuperviseManagementReview managementReview) {
+        return baseMapper.pageManagementReview(page, QueryWrappers.queryWrappers(managementReview));
+    }
+
+    /**
+     * 瀵煎嚭
+     * @param managementReviewId
+     * @param response
+     */
+    @Override
+    public void exportManagementReview(Integer managementReviewId, HttpServletResponse response) {
+        QualitySuperviseManagementReview managementReview = baseMapper.selectById(managementReviewId);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/supervise-management-eview.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("managementReview", managementReview);
+                    put("superviseDateStr", managementReview.getSuperviseDate() == null ? null : managementReview.getSuperviseDate().format(formatter));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    managementReview.getFileName(), "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("瀵煎嚭澶辫触");
+        }
+    }
+}
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
index df1d601..e8c52f0 100644
--- 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
@@ -335,6 +335,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
@@ -524,25 +525,25 @@
     public void exportSuperviseDetailRecord(Integer superviseDetailsId, HttpServletResponse response) {
         QualitySuperviseDetailsRecord recordDto = qualitySuperviseDetailsRecordMapper.selectSuperviseDetailRecord(superviseDetailsId);
 
-        //鑾峰彇鎶�鏈礋璐d汉鐨勭鍚嶅湴鍧�
-        String ratifyUrl = null;
-        if (recordDto.getRatifyUserId() != null) {
-            ratifyUrl = userMapper.selectById(recordDto.getRatifyUserId()).getSignatureUrl();
-            if (StringUtils.isBlank(ratifyUrl)) {
-                throw new ErrorException("鎵句笉鍒版妧鏈礋璐d汉鐨勭鍚�");
-            }
+        // 鏌ヨ妫�娴嬩汉鍛�
+        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);
-        String finalRatifyUrl = ratifyUrl;
+        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", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null);
+                    put("technicalDirectorUrl", UserUtils.getFinalUserSignatureUrl(recordDto.getRatifyUserId()));
                     put("technicalDirectorDateUrl", recordDto.getRatifyTime() != null ?
                             Pictures.ofStream(DateImageUtil.createDateImage(recordDto.getRatifyTime())).create() : null);
                 }});
@@ -557,6 +558,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
@@ -875,6 +877,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
@@ -1253,6 +1256,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-process/src/main/java/com/ruoyi/process/task/QualitySuperviseSchedule.java b/cnas-process/src/main/java/com/ruoyi/process/task/QualitySuperviseSchedule.java
index 0c35317..82e0d83 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/task/QualitySuperviseSchedule.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/task/QualitySuperviseSchedule.java
@@ -1,23 +1,33 @@
 package com.ruoyi.process.task;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 
 import com.ruoyi.common.core.domain.entity.User;
 import com.ruoyi.common.utils.WxCpUtils;
 import com.ruoyi.process.mapper.QualitySuperviseDetailsMapper;
+import com.ruoyi.process.mapper.QualitySuperviseDetailsRecordMapper;
+import com.ruoyi.process.mapper.QualitySuperviseManagementReviewMapper;
 import com.ruoyi.process.pojo.QualitySuperviseDetails;
+import com.ruoyi.process.pojo.QualitySuperviseDetailsRecord;
+import com.ruoyi.process.pojo.QualitySuperviseManagementReview;
 import com.ruoyi.system.mapper.UserMapper;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
- * 鍩硅璁″垝浣跨敤鎻愰啋璁板綍鎻愰啋
+ * 璐ㄩ噺鐩戠潱濉啓鎻愰啋
  */
 @Component
 public class QualitySuperviseSchedule {
@@ -27,12 +37,16 @@
     private UserMapper userMapper;
     @Resource
     private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Resource
+    private QualitySuperviseManagementReviewMapper qualitySuperviseManagementReviewMapper;
+    @Resource
+    private QualitySuperviseDetailsRecordMapper qualitySuperviseDetailsRecordMapper;
 
     /**
-     * 鎻愰啋濉啓璁惧浣跨敤璁板綍
+     * 璐ㄩ噺鐩戠潱濉啓鎻愰啋
      */
 //    @Scheduled(cron = "0/5 * * * * *")
-    @Scheduled(cron = "0 0 9 1 * *") // 姣忔湀1鍙锋墽琛�
+//    @Scheduled(cron = "0 0 9 1 * *") // 姣忔湀1鍙锋墽琛�
     public void task1() {
         // 鏌ヨ褰撴湀鐩戠潱璁″垝
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.M");
@@ -63,4 +77,66 @@
         }
     }
 
+
+    /**
+     * 姣忔湀28鍙疯嚜鍔ㄧ敓鎴愯川閲忕洃鐫f�荤粨
+     */
+//    @Scheduled(cron = "0/5 * * * * *")
+//    @Scheduled(cron = "0 0 9 28 * *") // 姣忔湀28鍙锋墽琛�
+    public void task2() {
+        LocalDateTime now = LocalDateTime.now();
+        // 鏌ヨ褰撴湀鐩戠潱璁″垝
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.M");
+        String format = now.format(formatter);
+        List<QualitySuperviseDetails> qualitySuperviseDetails = qualitySuperviseDetailsMapper.selectList(Wrappers.<QualitySuperviseDetails>lambdaQuery()
+                .eq(QualitySuperviseDetails::getSuperviseTime, format));
+
+        // 鏍规嵁瀹氭湡鐩戠潱鍜屽姩鎬佺洃鐫e尯鍒�
+        Map<String, List<QualitySuperviseDetails>> superviseReasonMap = qualitySuperviseDetails.stream().collect(Collectors.groupingBy(QualitySuperviseDetails::getSuperviseReason));
+
+        // 鑾峰彇褰撴湀鏃ユ湡
+        DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy骞碝M鏈�");
+        String format2 = now.format(formatter2);
+
+        // 鑾峰彇璁″垝鍐呭
+        String implementationSupervisee = "";
+                List<QualitySuperviseDetails> implementationList = superviseReasonMap.get("瀹氭湡鐩戠潱");
+        if (CollectionUtils.isNotEmpty(implementationList)) {
+            // 鑾峰彇瀹氭湡鐩戠潱浜哄憳淇℃伅
+            List<String> collect = implementationList.stream().map(QualitySuperviseDetails::getSupervisee).collect(Collectors.toList());
+            implementationSupervisee = CollUtil.join(collect, ",");
+        }
+        String implementationContent = "宸ヤ綔涓弗鏍兼寜鐓у勾搴﹁川閲忕洃鐫e伐浣滆鍒掕繘琛屾墽琛屻�倇}瀵箋}杩涜涓�娆″畾鏈熺洃鐫c�傚湪鐩戠潱杩囩▼涓紝娌℃湁鍙戠幇涓嶇鍚堢殑鐜拌薄銆傛楠屽憳鑳界啛缁冪殑鎸夌収瑙勫畾鐨勮姹傝繘琛岃澶囩殑鎿嶄綔锛屽浜庢爣鍑嗚兘鐔熻锛屾墍浣跨敤鐨勮澶囧潎鍦ㄦ牎鍑嗗懆鏈熷唴锛岃兘娓呮瀹屾暣鐨勭殑璁板綍鍘熷鏁版嵁骞跺嚭鍏锋姤鍛婏紱鍦ㄨ瘯楠岀幆澧冩柟闈紝鑳藉涓ユ牸鐨勬寜鐓ф爣鍑嗘墽琛屻��";
+        String formatImplementationContent = StrUtil.format(implementationContent, format2, implementationSupervisee);
+
+        //鑾峰彇鍔ㄦ�佸唴瀹�
+        String dynamicSupervisee = "";
+        List<QualitySuperviseDetails> dynamicList = superviseReasonMap.get("鍔ㄦ�佺洃鐫�");
+        if (CollectionUtils.isNotEmpty(dynamicList)) {
+            List<String> collect = dynamicList.stream()
+                    .map(details ->  StrUtil.format("瀵箋}鍔ㄦ�佺洃鐫�1娆″湪鐩戠潱杩囩▼涓�", details.getSupervisee())).collect(Collectors.toList());
+            dynamicSupervisee = CollUtil.join(collect, "锛�");
+        }
+        String dynamicContent = "鍦ㄤ繚璇佽川閲忕洃鐫h鍒掔殑鍚屾椂锛屼篃鍧氭寔鎸夌収棰嗗瑕佹眰鍔犲己涓嶅畾鏈熺洃鐫e姩浣溿�倇}浠絳}锛屾病鏈夊彂鐜颁笉绗﹀悎鐨勭幇璞°�傛楠屽憳鑳界啛缁冪殑鎸夌収瑙勫畾鐨勮姹傝繘琛岃澶囩殑鎿嶄綔锛屽浜庢爣鍑嗚兘鐔熻锛屾墍浣跨敤鐨勮澶囧潎鍦ㄦ牎鍑嗗懆鏈熷唴锛岃兘娓呮瀹屾暣鐨勭殑璁板綍鍘熷鏁版嵁骞跺嚭鍏锋姤鍛婏紱鍦ㄨ瘯楠岀幆澧冩柟闈紝鑳藉涓ユ牸鐨勬寜鐓ф爣鍑嗘墽琛屻��";
+        String formatdynamicContent = StrUtil.format(dynamicContent, format2, dynamicSupervisee);
+
+        // 鑾峰彇鐩戠潱鍛樹俊鎭�
+        QualitySuperviseDetails superviseDetails = qualitySuperviseDetails.get(0);
+        QualitySuperviseDetailsRecord detailsRecord = qualitySuperviseDetailsRecordMapper.selectOne(Wrappers.<QualitySuperviseDetailsRecord>lambdaQuery()
+                .eq(QualitySuperviseDetailsRecord::getSuperviseDetailsId, superviseDetails.getSuperviseDetailsId())
+                .last("limit 1"));
+        String supervisor = detailsRecord.getSupervisor();
+
+        // 鍒涘缓璇勫瀵硅薄
+        QualitySuperviseManagementReview managementReview = new QualitySuperviseManagementReview();
+        String yearDate = now.format(DateTimeFormatter.ofPattern("yyyy骞�"));
+        String monthDate = now.format(DateTimeFormatter.ofPattern("MM鏈�"));
+        managementReview.setFileName(StrUtil.format("{}绠$悊璇勫杈撳叆鏉愭枡锛坽}锛塤{}", yearDate, supervisor, monthDate));
+        managementReview.setImplementationContent(formatImplementationContent);
+        managementReview.setDynamicContent(formatdynamicContent);
+        managementReview.setSupervisor(supervisor);
+        managementReview.setSuperviseDate(LocalDate.now());
+        qualitySuperviseManagementReviewMapper.insert(managementReview);
+    }
+
 }
diff --git a/cnas-process/src/main/resources/mapper/ProcessDealMapper.xml b/cnas-process/src/main/resources/mapper/ProcessDealMapper.xml
index 282eaa7..037afa8 100644
--- a/cnas-process/src/main/resources/mapper/ProcessDealMapper.xml
+++ b/cnas-process/src/main/resources/mapper/ProcessDealMapper.xml
@@ -24,7 +24,7 @@
         </if>
     </select>
 
-    <select id="selectDeal" resultType="com.ruoyi.process.pojo.ProcessDeal">
+    <select id="selectDeal" resultType="com.ruoyi.process.dto.ProcessDealDto">
         select ROW_NUMBER() OVER (ORDER BY id) AS indexs,
                id,
                sample_name,
@@ -32,7 +32,7 @@
                sample_supplier,
                num,
                deal_method,
-               deal_time
+               DATE_FORMAT(deal_time, '%Y-%m-%d') dealTimeStr
         from cnas_process_deal
         where totaldeal_id = #{id}
     </select>
diff --git a/cnas-process/src/main/resources/mapper/ProcessReportMapper.xml b/cnas-process/src/main/resources/mapper/ProcessReportMapper.xml
index 8770f50..62e82d0 100644
--- a/cnas-process/src/main/resources/mapper/ProcessReportMapper.xml
+++ b/cnas-process/src/main/resources/mapper/ProcessReportMapper.xml
@@ -18,7 +18,7 @@
         <result column="update_user" property="updateUser"/>
         <result column="update_time" property="updateTime"/>
     </resultMap>
-    <select id="pageProcessReport" resultType="com.ruoyi.process.pojo.ProcessReport">
+    <select id="pageProcessReport" resultType="com.ruoyi.process.dto.ProcessReportDto">
         select * from (select cpr.* ,
         u1.name sendUserName
         from cnas_process_report cpr
@@ -27,16 +27,11 @@
             ${ew.customSqlSegment}
         </if>
     </select>
-    <select id="getIds" resultType="com.ruoyi.process.pojo.ProcessReport">
+    <select id="exportProcessReport" resultType="com.ruoyi.process.dto.ProcessReportDto">
         select ROW_NUMBER() OVER (ORDER BY cpr.id) AS indexs,
         cpr.* ,
-        u1.name sendUserName
+        u1.signature_url sendUserUrl
         from cnas_process_report cpr
         left join user u1 on send_user=u1.id
-        where 1=1
-        and cpr.id in
-        <foreach collection="ids" separator="," item="id" open="(" close=")">
-            #{id}
-        </foreach>
     </select>
 </mapper>
diff --git a/cnas-process/src/main/resources/mapper/QualitySuperviseManagementReviewMapper.xml b/cnas-process/src/main/resources/mapper/QualitySuperviseManagementReviewMapper.xml
new file mode 100644
index 0000000..ff901d2
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/QualitySuperviseManagementReviewMapper.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.process.mapper.QualitySuperviseManagementReviewMapper">
+
+
+    <select id="pageManagementReview" resultType="com.ruoyi.process.pojo.QualitySuperviseManagementReview">
+        select *
+        from cnas_quality_supervise_management_review
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/cnas-process/src/main/resources/static/report-deal.docx b/cnas-process/src/main/resources/static/report-deal.docx
index b3c8eb7..7f515a5 100644
--- a/cnas-process/src/main/resources/static/report-deal.docx
+++ b/cnas-process/src/main/resources/static/report-deal.docx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/sample-deal.docx b/cnas-process/src/main/resources/static/sample-deal.docx
index 9401b21..7cc0d8b 100644
--- a/cnas-process/src/main/resources/static/sample-deal.docx
+++ b/cnas-process/src/main/resources/static/sample-deal.docx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/supervise-management-eview.docx b/cnas-process/src/main/resources/static/supervise-management-eview.docx
new file mode 100644
index 0000000..7dcdc48
--- /dev/null
+++ b/cnas-process/src/main/resources/static/supervise-management-eview.docx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/supervision-detail-record.docx b/cnas-process/src/main/resources/static/supervision-detail-record.docx
index f31bced..24cab26 100644
--- a/cnas-process/src/main/resources/static/supervision-detail-record.docx
+++ b/cnas-process/src/main/resources/static/supervision-detail-record.docx
Binary files differ
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeCalibrationScheduleServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeCalibrationScheduleServiceImpl.java
index 4153bc4..afd4e2b 100644
--- a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeCalibrationScheduleServiceImpl.java
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeCalibrationScheduleServiceImpl.java
@@ -50,7 +50,6 @@
         Configure configure = Configure.builder()
                 .bind("feCalibrationSchedule", new HackLoopTableRenderPolicy())
                 .build();
-        FeCalibrationSchedule feCalibrationSchedule = size > 0 ? feCalibrationSchedules.get(0) : null;
         XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                 new HashMap<String, Object>() {{
                     put("feCalibrationSchedule", feCalibrationSchedules);
@@ -67,6 +66,8 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeIlluminationServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeIlluminationServiceImpl.java
index 956656b..2c0621d 100644
--- a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeIlluminationServiceImpl.java
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeIlluminationServiceImpl.java
@@ -36,7 +36,7 @@
  * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐓у害璁板綍琛� 鏈嶅姟瀹炵幇绫�
  * </p>
  *
- * @author 
+ * @author
  * @since 2024-11-07 04:15:57
  */
 @Service
@@ -115,6 +115,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FePowerStableServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FePowerStableServiceImpl.java
index e0d6456..07ba8f3 100644
--- a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FePowerStableServiceImpl.java
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FePowerStableServiceImpl.java
@@ -115,6 +115,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeTempHumDateServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeTempHumDateServiceImpl.java
index be94840..87597fd 100644
--- a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeTempHumDateServiceImpl.java
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeTempHumDateServiceImpl.java
@@ -121,6 +121,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/ForeignRegisterServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/ForeignRegisterServiceImpl.java
index 3a7afa6..c8f4f0e 100644
--- a/cnas-require/src/main/java/com/ruoyi/require/service/impl/ForeignRegisterServiceImpl.java
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/ForeignRegisterServiceImpl.java
@@ -93,6 +93,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/InternalWastesServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/InternalWastesServiceImpl.java
index e760974..cbe5f27 100644
--- a/cnas-require/src/main/java/com/ruoyi/require/service/impl/InternalWastesServiceImpl.java
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/InternalWastesServiceImpl.java
@@ -159,6 +159,7 @@
             template.write(os);
             os.flush();
             os.close();
+            inputStream.close();
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException("瀵煎嚭澶辫触");
diff --git a/cnas-require/src/main/java/com/ruoyi/require/task/FeTempHumDateSchedule.java b/cnas-require/src/main/java/com/ruoyi/require/task/FeTempHumDateSchedule.java
index b721c1d..abead17 100644
--- a/cnas-require/src/main/java/com/ruoyi/require/task/FeTempHumDateSchedule.java
+++ b/cnas-require/src/main/java/com/ruoyi/require/task/FeTempHumDateSchedule.java
@@ -86,7 +86,7 @@
      * 鑾峰彇娓╁害婀垮害
      */
 //    @Scheduled(cron = "0/5 * * * * *")
-    @Scheduled(cron = "0 0 9 * * 1-6") // 姣忓ぉ9鐐规墽琛屼竴娆� 闄や簡鏄熸湡澶�
+//    @Scheduled(cron = "0 0 9 * * 1-6") // 姣忓ぉ9鐐规墽琛屼竴娆� 闄や簡鏄熸湡澶�
     public void task1() {
         checkLaboratoriesSchedule();
         // 鏍规嵁鏃堕棿闄嶅簭锛岃幏鍙栧埌鏈�鏂扮殑涓�鏉℃暟鎹�
@@ -183,7 +183,7 @@
      * 鑾峰彇娓╁害婀垮害
      */
 //    @Scheduled(cron = "0/5 * * * * *")
-    @Scheduled(cron = "0 0 14 * * 1-5") // 姣忓ぉ14鐐规墽琛屼竴娆� 闄や簡鏄熸湡鍏拰鏄熸湡澶�
+//    @Scheduled(cron = "0 0 14 * * 1-5") // 姣忓ぉ14鐐规墽琛屼竴娆� 闄や簡鏄熸湡鍏拰鏄熸湡澶�
     public void task2() {
 
         // 妫�鏌ュ疄楠屽鏄惁鏈変换鍔� 濡傛灉娌℃湁鏂板浠诲姟
@@ -295,7 +295,7 @@
      * 鑾峰彇娓╁害婀垮害
      */
 //    @Scheduled(cron = "0/5 * * * * *")
-    @Scheduled(cron = "0 0 9 * * 7") //
+//    @Scheduled(cron = "0 0 9 * * 7") //
     public void task3() {
         checkLaboratoriesSchedule();
 
@@ -338,7 +338,7 @@
      *
      */
 //    @Scheduled(cron = "0/5 * * * * *")
-    @Scheduled(cron = "0 0 16 * * 1-6") // 姣忓ぉ15鐐规墽琛屼竴娆� 闄や簡鏄熸湡澶�
+//    @Scheduled(cron = "0 0 16 * * 1-6") // 姣忓ぉ15鐐规墽琛屼竴娆� 闄や簡鏄熸湡澶�
     public void affirmTempHum() {
         // 鏌ヨ鏈夋棩鏈熶絾鏄湭濉啓鍚嶅瓧鐨�
         List<FeTempHumRecordDto> feTempHumRecordList = feTempHumRecordMapper.selectNoaffirm(LocalDate.now());
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SignatureImageUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SignatureImageUtil.java
new file mode 100644
index 0000000..15365c4
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SignatureImageUtil.java
@@ -0,0 +1,66 @@
+package com.ruoyi.common.utils;
+
+import org.springframework.core.io.ClassPathResource;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.font.FontRenderContext;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.io.*;
+
+/**
+ * @Author zhuo
+ * @Date 2025/5/7
+ */
+public class SignatureImageUtil {
+
+    /**
+     * 鏍规嵁涓枃瀵煎嚭绛惧悕鍥剧墖
+     * @param text
+     * @return
+     * @throws IOException
+     * @throws FontFormatException
+     */
+    public static InputStream saveImageToFile(String text){
+        // 鑾峰彇瀛椾綋搴�
+        Font font = null;
+        try (InputStream is = new ClassPathResource("/ttf/signature.ttf").getInputStream()) {
+            font = Font.createFont(Font.TRUETYPE_FONT, is).deriveFont(50f);
+        } catch (FontFormatException | IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        int width = 100; // 鍥剧墖鐨勫搴�
+        int height = 50; // 鍥剧墖鐨勯珮搴�
+
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D g2d = image.createGraphics();
+
+        g2d.setFont(font);
+
+        // 璁剧疆鏂囧瓧棰滆壊涓洪粦鑹�
+        g2d.setColor(Color.black);
+
+        // 璁剧疆鏂囧瓧鍦ㄥ浘鐗囦腑鐨勪綅缃�
+        FontRenderContext context = g2d.getFontRenderContext();
+        Rectangle2D bounds = font.getStringBounds(text, context);
+        double x = (width - bounds.getWidth()) / 2;
+        double y = (height - bounds.getHeight()) / 2;
+        double ascent = -bounds.getY();
+        double baseY = y + ascent;
+        g2d.drawString(text, (int) x, (int) baseY);
+        g2d.dispose();
+
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+
+        try {
+            ImageIO.write(image, "png", os);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        return new ByteArrayInputStream(os.toByteArray());
+    }
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/WxCpUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/WxCpUtils.java
index 3a49995..32266bf 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/WxCpUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/WxCpUtils.java
@@ -93,7 +93,7 @@
 	}
 
 	/**
-	 * todo:鎺ㄩ�佺兢娑堟伅
+	 * 鎺ㄩ�佺兢娑堟伅
 	 *
 	 * @param webHook 浼佷笟寰俊鏈哄櫒浜哄湴鍧�
 	 * @param content 鏁版嵁
diff --git a/ruoyi-common/src/main/resources/ttf/signature.ttf b/ruoyi-common/src/main/resources/ttf/signature.ttf
new file mode 100644
index 0000000..dd7cd59
--- /dev/null
+++ b/ruoyi-common/src/main/resources/ttf/signature.ttf
Binary files differ

--
Gitblit v1.9.3