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/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java |  193 +++++++++++++++++++++--------------------------
 1 files changed, 87 insertions(+), 106 deletions(-)

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 1b0aee8..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
@@ -46,6 +46,7 @@
 import com.ruoyi.inspect.service.*;
 import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
 import com.ruoyi.inspect.util.PreserveReportPicturePlaceholderHandler;
+import com.ruoyi.inspect.util.ReportSignaturePictureUtils;
 import com.ruoyi.inspect.vo.InsOrderPlanTaskSwitchVo;
 import com.ruoyi.inspect.vo.InsOrderPlanVO;
 import com.ruoyi.inspect.vo.InsSampleUserVO;
@@ -74,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.*;
@@ -273,11 +275,11 @@
         // 鏌ヨ璁㈠崟Id
         InsOrder order = insOrderMapper.selectFirstSubmit(dto.getId());
         if (order == null) {
-            return BeanUtil.isEmpty(insProducts) ? null : insProducts;
+            return BeanUtil.isEmpty(insProducts) ? Collections.emptyList() : insProducts;
         }
         insProducts = mergeDirectTemplateSnapshots(order, dto.getId(), dto.getLaboratory(), insProducts);
         if (BeanUtil.isEmpty(insProducts)) {
-            return null;
+            return Collections.emptyList();
         }
         getTemplateThing(order, insProducts, dto.getLaboratory());
         return insProducts;
@@ -299,14 +301,6 @@
         if (snapshots.isEmpty()) {
             return source;
         }
-        InsSample sample = insSampleMapper.selectById(sampleId);
-        boolean directTemplateOrder = source.stream()
-                .anyMatch(product -> product.getTemplateRowIndex() != null)
-                || isDirectTemplateSample(order, sample);
-        if (!directTemplateOrder) {
-            return source;
-        }
-
         Map<Integer, List<InsProduct>> productsByTemplate = source.stream()
                 .filter(product -> product.getTemplateId() != null)
                 .collect(Collectors.groupingBy(InsProduct::getTemplateId, LinkedHashMap::new, Collectors.toList()));
@@ -1217,13 +1211,12 @@
                 .last("FOR UPDATE"));
         boolean isInspectionReport = Objects.equals(INSPECTION_REPORT, reportType);
         registerInsResults = isInspectionReport && Boolean.TRUE.equals(registerInsResults);
-        // 1. 鍒ゆ柇鏄惁鏈夐噸澶嶇紪鍙�, 鏈夐噸澶嶇紪鍙峰仛鎻愰啋
+        // 1. 濮旀墭缂栧彿鍏ㄥ眬鍞竴锛屾彁浜ゅ鏍告椂鍐嶆鏍¢獙锛岄槻姝㈠苟鍙戞垨鍘嗗彶鏁版嵁缁曡繃鐢熸垚鏍¢獙銆�
         Long codeCount = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
-                .ne(InsOrder::getState, -1)
-                .ne(InsOrder::getIfsInventoryId, order.getIfsInventoryId())
+                .ne(InsOrder::getId, orderId)
                 .eq(InsOrder::getEntrustCode, order.getEntrustCode()));
         if (codeCount > 0) {
-            throw new ErrorException("褰撳墠缂栧彿鏈夐噸澶�, 璇峰厛鍘讳慨鏀归噸澶嶇紪鍙�");
+            throw new ErrorException("鏍峰搧/濮旀墭鍗曞凡瀛樺湪锛岃纭鏍峰搧缂栧彿");
         }
 
         // 2. 鍒ゆ柇璇ヨ鍗曟槸鍚︽槸绗竴娆$敓浜�(鍚庣画鎶ュ憡鐢熸垚鍙彇绗竴娆℃彁浜ゆ椂闂�)
@@ -1985,13 +1978,13 @@
                 || report.getExamineTime() != null;
         if (submitted) {
             User writer = getReportSigner(report.getWriteUserId(), "缂栧埗浜�");
-            marks.put("writeUrl", Pictures.ofLocal(imgUrl + "/" + writer.getSignatureUrl()).create());
+            marks.put("writeUrl", ReportSignaturePictureUtils.create(imgUrl, writer.getSignatureUrl()));
             marks.put("writeDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(report.getWriteTime())).create());
-            marks.put("insUrl", Pictures.ofLocal(imgUrl + "/" + writer.getSignatureUrl()).create());
+            marks.put("insUrl", ReportSignaturePictureUtils.create(imgUrl, writer.getSignatureUrl()));
         }
         if (Objects.equals(report.getIsExamine(), 1)) {
             User examiner = getReportSigner(report.getExamineUserId(), "瀹℃牳浜�");
-            marks.put("examineUrl", Pictures.ofLocal(imgUrl + "/" + examiner.getSignatureUrl()).create());
+            marks.put("examineUrl", ReportSignaturePictureUtils.create(imgUrl, examiner.getSignatureUrl()));
             marks.put("examineDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(report.getExamineTime())).create());
         }
         return marks;
@@ -2536,13 +2529,18 @@
         enterFactoryReport.setLotBatchNo(ifsInventoryQuantity.getUpdateBatchNo());
 
         // 妫�娴嬩緷鎹�
-        Set<String> standardMethod = new HashSet<>();
+        Set<String> standardMethod = new LinkedHashSet<>();
         StringBuilder standardMethod2 = new StringBuilder();
-        standardMethod.add(baseMapper.getStandardMethodCode(insSample.getStandardMethodListId()));
+        String reportStandardMethod = baseMapper.getStandardMethodReportText(insSample.getStandardMethodListId());
+        if (StringUtils.isNotBlank(reportStandardMethod)) {
+            standardMethod.add(reportStandardMethod);
+        }
         for (String s : standardMethod) {
             standardMethod2.append("銆�").append(s);
         }
-        standardMethod2.replace(0, 1, "");
+        if (standardMethod2.length() > 0) {
+            standardMethod2.deleteCharAt(0);
+        }
 
         // 鏍峰搧绫诲瀷
         String orderType = iSysDictTypeService.selectLabelByDict(DictDataConstants.CHECK_TYPE, insOrder.getOrderType());
@@ -3214,8 +3212,7 @@
         insReport.setReportType(reportType);
         boolean showResult = Objects.equals(reportType, INSPECTION_REPORT);
         List<Map<String, Object>> tables = new ArrayList<>();
-        Set<String> standardMethod = new HashSet<>();
-        Set<String> deviceSet = new HashSet<>();
+        Set<String> standardMethod = new LinkedHashSet<>();
         Set<String> models = new HashSet<>();
         // 鏌ヨ妫�楠岄」鏁伴噺
         AtomicInteger productSize = new AtomicInteger();
@@ -3227,21 +3224,12 @@
         /*鍩虹鎶ュ憡(鏍规嵁缁樺埗鐨勫師濮嬭褰曟ā鐗堝舰鎴�)*/
         samples.forEach(a -> {
             models.add(a.getModel());
-            String standardMethodCode = baseMapper.getStandardMethodCode(a.getStandardMethodListId());
-            if (StrUtil.isNotBlank(a.getSpecialStandardMethod())) {
-                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);
-                        }
-                    }
+            String standardMethodCode = baseMapper.getStandardMethodReportText(a.getStandardMethodListId());
+            if (StrUtil.isNotBlank(standardMethodCode)) {
+                if (StrUtil.isNotBlank(a.getSpecialStandardMethod())) {
+                    standardMethodCode = standardMethodCode + "+" + a.getSpecialStandardMethod();
                 }
+                standardMethod.add(standardMethodCode);
             }
             // 鐩寸粦妯℃澘鐨勬娴嬫姤鍛娿�佹楠屾姤鍛婇兘浣跨敤鏂扮増鍥哄畾缁撴灉琛岋紝涓嶅啀杩涘叆鏃х増妫�楠岄」琛ㄦ牸閫昏緫銆�
             // 鐩寸粦妯℃澘涓殑鎵胯浇璁板綍娌℃湁鏃ф楠岄」瀛楁锛岃繘鍏ユ棫閫昏緫浼氬湪鏍煎紡鍖栨椂浜х敓绌烘寚閽堛��
@@ -3272,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());
                 }
@@ -3449,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) {
@@ -3563,26 +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();
-        }
-
-        String insTime = firstInspectDate.format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�")) + "-"
-                + submitTime.format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�"));
-
-        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);
@@ -3620,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());
@@ -3636,11 +3583,8 @@
                 productionDate = insOrder.getProductionDate().format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�"));
             }
             batchNo = defaultReportText(insOrder.getProductionBatch(), "/");
-            standardMethodText = templateSnapshots.stream()
-                    .map(InsOrderStandardTemplate::getRemark)
-                    .filter(StringUtils::isNotBlank)
-                    .distinct()
-                    .collect(Collectors.joining("锛�"));
+            standardMethodText = defaultReportText(
+                    baseMapper.getStandardMethodReportTextByCode(insOrder.getSample()), insOrder.getSample());
         }
         boolean containsOrganicChlorine = detectionResultRows.stream()
                 .map(row -> row.get("itemName"))
@@ -3943,16 +3887,26 @@
         if (CollectionUtils.isEmpty(deviceList)) {
             return "/";
         }
-        Set<String> lines = new LinkedHashSet<>();
-        int sequence = 1;
+        Set<String> equipmentItems = new LinkedHashSet<>();
         for (Map<String, String> device : deviceList) {
             String name = getMapText(device, "deviceName", "device_name");
             String managementNumber = getMapText(device, "managementNumber", "management_number");
-            String line = sequence++ + ". " + defaultReportText(name, "/");
-            if (StringUtils.isNotBlank(managementNumber)) {
-                line += "锛�" + managementNumber;
+            if (StringUtils.isBlank(name) || "/".equals(name.trim())) {
+                continue;
             }
-            lines.add(line);
+            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<>();
+        for (int i = 0; i < items.size(); i++) {
+            String punctuation = i == items.size() - 1 ? "銆�" : "锛�";
+            lines.add((i + 1) + ". " + items.get(i) + punctuation);
         }
         return String.join("\n", lines);
     }
@@ -3973,7 +3927,7 @@
                 .collect(Collectors.toList());
 
         String temperature = formatConditionRange(temperatures, order.getTemperature(), "鈩�");
-        String humidity = formatConditionRange(humidities, order.getHumidity(), "%");
+        String humidity = formatConditionRange(humidities, order.getHumidity(), "%RH");
         return Stream.of(temperature, humidity)
                 .filter(StringUtils::isNotBlank)
                 .collect(Collectors.joining(" "));
@@ -4046,6 +4000,33 @@
         return StringUtils.isNotBlank(fallback) ? fallback : "/";
     }
 
+    private static String formatReportTestDate(List<LocalDate> detectionDates) {
+        if (CollectionUtils.isEmpty(detectionDates)) {
+            return "/";
+        }
+        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);
+    }
+
     /**
      * 璁$畻琛ㄦ牸鍒楀搴�
      *

--
Gitblit v1.9.3