From 444409ba734d4457f9109f0b71422b83fed60cd6 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期四, 24 九月 2026 11:14:20 +0800
Subject: [PATCH] refactor(inspect): 重构设备列表查询和报告生成逻辑

---
 inspect-server/src/main/resources/mapper/InsOrderMapper.xml                              |   10 +
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java                |   15 +++
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderTemplateDeviceMapper.java  |   15 ---
 inspect-server/src/main/resources/static/inspection-report-template-v2.docx              |    0 
 inspect-server/src/main/resources/static/detection-report-template-v2.docx               |    0 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java |  130 ++++++++++++--------------------
 inspect-server/src/main/resources/mapper/InsOrderTemplateDeviceMapper.xml                |   23 +++++
 7 files changed, 95 insertions(+), 98 deletions(-)

diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
index 3876924..d1662ae 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
@@ -37,7 +37,8 @@
 
     IPage<SampleProductDto2> selectSampleAndProductByOrderId(@Param("page") IPage<SampleProductDto2> page, @Param("ew") QueryWrapper<SampleProductDto2> ew, @Param("id") Integer id);
 
-    List<Map<String, String>> selectDeviceList(@Param("managementNumbers") Set<String> managementNumbers);
+    List<Map<String, String>> selectDeviceListByIds(@Param("deviceIds") Set<Integer> deviceIds);
+
     List<SampleDefectsFatherVo> selectSampleDefects(Page page, @Param("inspectionItems") String inspectionItems, @Param("orderNumber") String orderNumber);
 
     String getStandardMethodCode(@Param("id") Integer id);
@@ -56,6 +57,7 @@
 
     /**
      * 鏌ヨ妫�楠岀粨鏋�
+     *
      * @param ids
      * @return
      */
@@ -63,6 +65,7 @@
 
     /**
      * 鑾峰彇鎵归噺妫�楠岀殑鎬绘暟
+     *
      * @param id
      * @return
      */
@@ -70,6 +73,7 @@
 
     /**
      * 鑾峰彇绾胯姱棰滆壊
+     *
      * @param id
      * @return
      */
@@ -84,6 +88,7 @@
 
     /**
      * 鍙煡璇㈤粯璁ょ涓�涓殑浜у搧
+     *
      * @param id
      * @return
      */
@@ -91,6 +96,7 @@
 
     /**
      * 鏌ヨ鏃ュ巻鍥�
+     *
      * @param
      * @return
      */
@@ -112,6 +118,7 @@
 
     /**
      * 鎴愬搧鏍囩鎵撳嵃
+     *
      * @param ids
      * @return
      */
@@ -119,6 +126,7 @@
 
     /**
      * 澶栬喘浜у搧鏍囩鎵撳嵃
+     *
      * @param ids
      * @return
      */
@@ -126,12 +134,14 @@
 
     /**
      * 鏌ヨ瀵煎嚭淇℃伅
+     *
      * @return
      */
     List<SampleOrderDto> rawAllInsOrderExport(@Param("ew") QueryWrapper<SampleOrderDto> ew, @Param("laboratory") String laboratory, @Param("isOrderAll") String isOrderAll);
 
     /**
      * 鏍规嵁璁㈠崟鏌ヨ璇曢獙瀹�
+     *
      * @param insOrderId
      * @return
      */
@@ -139,6 +149,7 @@
 
     /**
      * 鏌ヨ璁㈠崟淇℃伅
+     *
      * @param insSampleId
      * @return
      */
@@ -146,6 +157,7 @@
 
     /**
      * 鏍规嵁璁㈠崟id鏌ヨ璁㈠崟瀵煎嚭淇℃伅
+     *
      * @param orderIds
      * @return
      */
@@ -153,6 +165,7 @@
 
     /**
      * 鏌ヨ褰撳墠鏃堕棿鏄惁鏈夎妫�娴嬮」鐨勬娊鏍疯鍒掕鍗�
+     *
      * @param itmeId    鏍峰搧Id
      * @param startTime 寮�濮嬫椂闂�
      * @param endTime   缁撴潫鏃堕棿
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderTemplateDeviceMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderTemplateDeviceMapper.java
index 899d52c..9a3951a 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderTemplateDeviceMapper.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderTemplateDeviceMapper.java
@@ -4,26 +4,13 @@
 import com.ruoyi.inspect.pojo.InsOrderTemplateDevice;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
-import org.apache.ibatis.annotations.Select;
 
 import java.util.List;
 
 @Mapper
 public interface InsOrderTemplateDeviceMapper extends BaseMapper<InsOrderTemplateDevice> {
 
-    @Select({"<script>",
-            "select id from device where id in",
-            "<foreach collection='deviceIds' item='deviceId' open='(' separator=',' close=')'>",
-            "#{deviceId}",
-            "</foreach>",
-            "</script>"})
     List<Integer> selectExistingDeviceIds(@Param("deviceIds") List<Integer> deviceIds);
 
-    @Select("select distinct d.management_number " +
-            "from ins_order_template_device otd " +
-            "join device d on d.id = otd.device_id " +
-            "where otd.ins_order_id = #{orderId} " +
-            "and d.management_number is not null and d.management_number <> '' " +
-            "order by d.management_number")
-    List<String> selectManagementNumbersByOrderId(@Param("orderId") Integer orderId);
+    List<Integer> selectDeviceIdsByOrderId(@Param("orderId") Integer orderId);
 }
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
index 5cfeb47..3394113 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
@@ -75,6 +75,7 @@
 import java.nio.file.Paths;
 import java.text.DecimalFormat;
 import java.text.SimpleDateFormat;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -3212,7 +3213,6 @@
         boolean showResult = Objects.equals(reportType, INSPECTION_REPORT);
         List<Map<String, Object>> tables = new ArrayList<>();
         Set<String> standardMethod = new LinkedHashSet<>();
-        Set<String> deviceSet = new HashSet<>();
         Set<String> models = new HashSet<>();
         // 鏌ヨ妫�楠岄」鏁伴噺
         AtomicInteger productSize = new AtomicInteger();
@@ -3230,17 +3230,6 @@
                     standardMethodCode = standardMethodCode + "+" + a.getSpecialStandardMethod();
                 }
                 standardMethod.add(standardMethodCode);
-            }
-            for (InsProduct b : a.getInsProduct()) {
-                if (b.getInsProductResult() != null) {
-                    List<JSONObject> jsonObjects = JSON.parseArray(b.getInsProductResult().getEquipValue(), JSONObject.class);
-                    for (JSONObject jsonObject : jsonObjects) {
-                        if (!"".equals(jsonObject.get("v") + "")) {
-                            List<String> v = StrUtil.split(jsonObject.get("v") + "", "锛�");
-                            deviceSet.addAll(v);
-                        }
-                    }
-                }
             }
             // 鐩寸粦妯℃澘鐨勬娴嬫姤鍛娿�佹楠屾姤鍛婇兘浣跨敤鏂扮増鍥哄畾缁撴灉琛岋紝涓嶅啀杩涘叆鏃х増妫�楠岄」琛ㄦ牸閫昏緫銆�
             // 鐩寸粦妯℃澘涓殑鎵胯浇璁板綍娌℃湁鏃ф楠岄」瀛楁锛岃繘鍏ユ棫閫昏緫浼氬湪鏍煎紡鍖栨椂浜х敓绌烘寚閽堛��
@@ -3271,28 +3260,6 @@
                 }
 
                 max = a.getQuantity();
-                // 瀛e害妫�楠岄渶瑕佽繘鍘傛楠岀殑璁惧
-                // 鏌ヨ鏄惁鏈夎繘鍘傛楠�
-                InsOrder order = insOrderMapper.selectOne(Wrappers.<InsOrder>lambdaQuery()
-                        .eq(InsOrder::getIfsInventoryId, insOrder.getIfsInventoryId())
-                        .ne(InsOrder::getState, -1)
-                        .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY)
-                        .ne(InsOrder::getId, insOrder.getId())
-                        .last("limit 1"));
-                if (order != null) {
-                    List<SampleProductDto> sampleProductDtos = insSampleMapper.selectSampleProductListByOrderId(order.getId());
-                    for (InsProduct b : sampleProductDtos.get(0).getInsProduct()) {
-                        if (b.getInsProductResult() != null) {
-                            List<JSONObject> jsonObjects = JSON.parseArray(b.getInsProductResult().getEquipValue(), JSONObject.class);
-                            for (JSONObject jsonObject : jsonObjects) {
-                                if (!"".equals(jsonObject.get("v") + "")) {
-                                    List<String> v = StrUtil.split(jsonObject.get("v") + "", "锛�");
-                                    deviceSet.addAll(v);
-                                }
-                            }
-                        }
-                    }
-                }
                 if (StringUtils.isBlank(insOrder.getSampleView())) {
                     insOrder.setSampleView(insOrder.getSample());
                 }
@@ -3448,20 +3415,13 @@
         tables.forEach(table -> {
             table.put("tableSize", tables.size() + 1);
         });
-        // 鏂拌鍗曟寜妯℃澘閫夋嫨璁惧锛涙棫璁㈠崟娌℃湁妯℃澘璁惧鍏崇郴鏃跺洖閫�鍒拌鍗曠骇璁惧璁板綍銆�
-        Set<String> reportDeviceNumbers = insOrderTemplateDeviceMapper
-                .selectManagementNumbersByOrderId(orderId).stream()
-                .filter(StringUtils::isNotBlank)
+        // 鎶ュ憡鍙睍绀烘楠屽崟鍚勬ā鏉块�夋嫨鐨勮澶囷紝骞舵寜璁惧ID鍘婚噸銆�
+        Set<Integer> reportDeviceIds = insOrderTemplateDeviceMapper
+                .selectDeviceIdsByOrderId(orderId).stream()
+                .filter(Objects::nonNull)
                 .collect(Collectors.toCollection(LinkedHashSet::new));
-        if (reportDeviceNumbers.isEmpty()) {
-            reportDeviceNumbers.addAll(insOrderDeviceRecordMapper.selectDeviceNumber(orderId).stream()
-                    .map(InsOrderDeviceRecordDto::getManagementNumber)
-                    .filter(StringUtils::isNotBlank)
-                    .collect(Collectors.toList()));
-        }
-        reportDeviceNumbers.addAll(deviceSet);
-        List<Map<String, String>> deviceList = reportDeviceNumbers.isEmpty()
-                ? new ArrayList<>() : insOrderMapper.selectDeviceList(reportDeviceNumbers);
+        List<Map<String, String>> deviceList = reportDeviceIds.isEmpty()
+                ? new ArrayList<>() : insOrderMapper.selectDeviceListByIds(reportDeviceIds);
         if (CollectionUtils.isNotEmpty(deviceList)) {
             int count = 1;
             for (Map<String, String> stringMap : deviceList) {
@@ -3562,28 +3522,18 @@
             sendTime = reportInventory.getDeclareDate();
         }
 
-        // 妫�娴嬫棩鏈燂細棣栨淇濆瓨妯℃澘鍊兼椂闂�-棣栨鎻愪氦鏃堕棿
+        // 妫�娴嬫棩鏈燂細姹囨�绘楠屽崟鍚勬ā鏉垮~鍐欑殑妫�娴嬫椂闂达紝鏃ユ湡鐩稿悓鏄剧ず涓�涓紝鍚﹀垯鏄剧ず鏈�鏃╄嚦鏈�鏅氥��
         LocalDateTime now = LocalDateTime.now();
-        // 鎻愪氦鏃堕棿
-        LocalDateTime submitTime = LocalDateTime.now();
-        // 鍒ゆ柇鏄惁鏈夋彁浜ゆ椂闂�
-        if (insOrder.getFirstSubmitDate() != null) {
-            submitTime = insOrder.getFirstSubmitDate();
-        }
-
-        LocalDateTime firstInspectDate = insOrder.getFirstInspectDate();
-        // 瀛楁涓婄嚎鍓嶇殑鍘嗗彶璁㈠崟娌跨敤鍘熸潵鐨勪笅鍙戞椂闂达紝閬垮厤鏀瑰彉鏃㈡湁鎶ュ憡鍙e緞銆�
-        if (firstInspectDate == null) {
-            firstInspectDate = insOrder.getSendTime();
-        }
-        if (firstInspectDate == null) {
-            firstInspectDate = submitTime;
-        }
-
-        String insTime = formatReportTestDate(firstInspectDate, submitTime);
-
-        String insTimeEn = monthNames[firstInspectDate.getMonthValue() - 1] + " " + firstInspectDate.format(DateTimeFormatter.ofPattern("dd, yyyy")) + "-"
-                + monthNames[submitTime.getMonthValue() - 1] + " " + submitTime.format(DateTimeFormatter.ofPattern("dd, yyyy"));
+        List<InsOrderStandardTemplate> templateSnapshots = insOrderStandardTemplateService.list(
+                Wrappers.<InsOrderStandardTemplate>lambdaQuery()
+                        .eq(InsOrderStandardTemplate::getInsOrderId, orderId)
+                        .orderByAsc(InsOrderStandardTemplate::getSort, InsOrderStandardTemplate::getId));
+        List<LocalDate> detectionDates = templateSnapshots.stream()
+                .map(InsOrderStandardTemplate::getDetectionTime)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+        String insTime = formatReportTestDate(detectionDates);
+        String insTimeEn = formatReportTestDateEn(detectionDates, monthNames);
 
         // 妫�楠岀幆澧冿細浼樺厛姹囨�诲悇妯℃澘濉啓鐨勬俯婀垮害锛屾姤鍛婂睍绀哄叏閮ㄦā鏉跨殑鏈�灏忓�煎埌鏈�澶у�笺��
         String environment = buildReportEnvironment(orderId, insOrder);
@@ -3621,10 +3571,6 @@
             batchNo = defaultReportText(reportInventory.getUpdateBatchNo(), reportInventory.getLotBatchNo());
         }
         // 鏂拌仛鐩寸粦妯℃澘璁㈠崟锛氭姤鍛婁俊鎭彇濮旀墭淇℃伅鍜岃鍗曟ā鏉垮揩鐓э紝涓嶅啀鍙栬兘鍔涜寖鍥存爣鍑嗘柟娉曘��
-        List<InsOrderStandardTemplate> templateSnapshots = insOrderStandardTemplateService.list(
-                Wrappers.<InsOrderStandardTemplate>lambdaQuery()
-                        .eq(InsOrderStandardTemplate::getInsOrderId, orderId)
-                        .orderByAsc(InsOrderStandardTemplate::getSort, InsOrderStandardTemplate::getId));
         boolean newJuTemplateOrder = !templateSnapshots.isEmpty() && directTemplateOrder;
         if (newJuTemplateOrder) {
             productName = defaultReportText(insOrder.getSampleView(), insOrder.getSample());
@@ -3945,11 +3891,16 @@
         for (Map<String, String> device : deviceList) {
             String name = getMapText(device, "deviceName", "device_name");
             String managementNumber = getMapText(device, "managementNumber", "management_number");
-            String item = defaultReportText(name, "/");
-            if (StringUtils.isNotBlank(managementNumber)) {
-                item += "锛�" + managementNumber;
+            if (StringUtils.isBlank(name) || "/".equals(name.trim())) {
+                continue;
             }
+            String number = StringUtils.isBlank(managementNumber) || "/".equals(managementNumber.trim())
+                    ? "鍑哄巶缂栧彿" : managementNumber.trim();
+            String item = name.trim() + "锛�" + number;
             equipmentItems.add(item);
+        }
+        if (equipmentItems.isEmpty()) {
+            return "/";
         }
         List<String> items = new ArrayList<>(equipmentItems);
         List<String> lines = new ArrayList<>();
@@ -4049,12 +4000,31 @@
         return StringUtils.isNotBlank(fallback) ? fallback : "/";
     }
 
-    private static String formatReportTestDate(LocalDateTime startTime, LocalDateTime endTime) {
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
-        if (startTime.toLocalDate().equals(endTime.toLocalDate())) {
-            return startTime.format(formatter);
+    private static String formatReportTestDate(List<LocalDate> detectionDates) {
+        if (CollectionUtils.isEmpty(detectionDates)) {
+            return "/";
         }
-        return startTime.format(formatter) + "鑷�" + endTime.format(formatter);
+        LocalDate startDate = Collections.min(detectionDates);
+        LocalDate endDate = Collections.max(detectionDates);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
+        if (startDate.equals(endDate)) {
+            return startDate.format(formatter);
+        }
+        return startDate.format(formatter) + "鑷�" + endDate.format(formatter);
+    }
+
+    private static String formatReportTestDateEn(List<LocalDate> detectionDates, String[] monthNames) {
+        if (CollectionUtils.isEmpty(detectionDates)) {
+            return "/";
+        }
+        LocalDate startDate = Collections.min(detectionDates);
+        LocalDate endDate = Collections.max(detectionDates);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd, yyyy");
+        String startText = monthNames[startDate.getMonthValue() - 1] + " " + startDate.format(formatter);
+        if (startDate.equals(endDate)) {
+            return startText;
+        }
+        return startText + "-" + monthNames[endDate.getMonthValue() - 1] + " " + endDate.format(formatter);
     }
 
     /**
diff --git a/inspect-server/src/main/resources/mapper/InsOrderMapper.xml b/inspect-server/src/main/resources/mapper/InsOrderMapper.xml
index dbd6da9..798924f 100644
--- a/inspect-server/src/main/resources/mapper/InsOrderMapper.xml
+++ b/inspect-server/src/main/resources/mapper/InsOrderMapper.xml
@@ -241,7 +241,7 @@
         </if>
     </select>
 
-    <select id="selectDeviceList" resultType="java.util.Map">
+    <select id="selectDeviceListByIds" resultType="java.util.Map">
         select device_name,
                en_device_name,
                specification_model,
@@ -249,10 +249,14 @@
                date_format(activation_date,'%Y-%m-%d')
         latest_traceability
         from device
-        where device.management_number in
-        <foreach collection="managementNumbers" index="index" open="(" separator="," close=")" item="val">
+        where device.id in
+        <foreach collection="deviceIds" index="index" open="(" separator="," close=")" item="val">
             #{val}
         </foreach>
+        order by field(device.id,
+        <foreach collection="deviceIds" index="index" separator="," item="val">
+            #{val}
+        </foreach>)
     </select>
 
     <update id="updateStatus">
diff --git a/inspect-server/src/main/resources/mapper/InsOrderTemplateDeviceMapper.xml b/inspect-server/src/main/resources/mapper/InsOrderTemplateDeviceMapper.xml
new file mode 100644
index 0000000..3ccd014
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/InsOrderTemplateDeviceMapper.xml
@@ -0,0 +1,23 @@
+<?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.inspect.mapper.InsOrderTemplateDeviceMapper">
+
+    <select id="selectExistingDeviceIds" resultType="java.lang.Integer">
+        select id
+        from device
+        where id in
+        <foreach collection="deviceIds" item="deviceId" open="(" separator="," close=")">
+            #{deviceId}
+        </foreach>
+    </select>
+
+    <select id="selectDeviceIdsByOrderId" resultType="java.lang.Integer">
+        select otd.device_id
+        from ins_order_template_device otd
+        where otd.ins_order_id = #{orderId}
+          and otd.device_id is not null
+        group by otd.device_id
+        order by min(otd.sort), otd.device_id
+    </select>
+
+</mapper>
diff --git a/inspect-server/src/main/resources/static/detection-report-template-v2.docx b/inspect-server/src/main/resources/static/detection-report-template-v2.docx
index eb4dc66..81ec55c 100644
--- a/inspect-server/src/main/resources/static/detection-report-template-v2.docx
+++ b/inspect-server/src/main/resources/static/detection-report-template-v2.docx
Binary files differ
diff --git a/inspect-server/src/main/resources/static/inspection-report-template-v2.docx b/inspect-server/src/main/resources/static/inspection-report-template-v2.docx
index 045bf37..2c2a1a7 100644
--- a/inspect-server/src/main/resources/static/inspection-report-template-v2.docx
+++ b/inspect-server/src/main/resources/static/inspection-report-template-v2.docx
Binary files differ

--
Gitblit v1.9.3