From 3d397976d08f0359b8cfeb4e4f22403ae5d0c04f Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期六, 24 十月 2026 20:44:14 +0800
Subject: [PATCH] feat(device): 设备核查计划附件与设备使用记录联动改造

---
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java |  148 ++++++++++++++++++++++++++++++++----------------
 1 files changed, 98 insertions(+), 50 deletions(-)

diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
index f4b1b84..c8e2581 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
@@ -55,6 +55,7 @@
 import com.ruoyi.inspect.vo.TemplateConditionVo;
 import com.ruoyi.system.mapper.UserMapper;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.context.ApplicationEventPublisher;
@@ -80,6 +81,7 @@
  * @description 閽堝琛ㄣ�恑ns_order(妫�楠屼笅鍗�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
  * @createDate 2024-03-12 16:17:55
  */
+@Slf4j
 @Service
 @AllArgsConstructor
 public class InsOrderServiceImpl extends ServiceImpl<InsOrderMapper, InsOrder>
@@ -844,6 +846,7 @@
             snapshot.setTemplateId(template.getId());
             snapshot.setName(template.getName());
             snapshot.setNumber(template.getNumber());
+            snapshot.setStandardRequirement(template.getStandardRequirement());
             snapshot.setRemark(template.getRemark());
             snapshot.setThing(template.getThing());
             snapshot.setSort(selection.getSort());
@@ -1067,7 +1070,11 @@
     @Transactional(rollbackFor = Exception.class)
     public Map<String, Object> getInsOrderAndSample(Integer id, String laboratory) {
         Map<String, Object> map = new HashMap<>();
-        initializeTemplateDevicesOnFirstOpen(id);
+        try {
+            initializeTemplateDevicesOnFirstOpen(id, laboratory);
+        } catch (RuntimeException e) {
+            log.warn("妫�楠屼换鍔¢粯璁よ澶囧悓姝ュけ璐ワ紝orderId={}", id, e);
+        }
 //        InsOrder insOrder = insOrderMapper.selectById(id);
         IfsOrderVO ifsOrderVO = insOrderMapper.selectOrderInfoById(id);
         Map<Integer, List<Integer>> templateDeviceIds = insOrderTemplateDeviceMapper.selectList(
@@ -1085,6 +1092,7 @@
                                 .select(InsOrderStandardTemplate::getTemplateId,
                                         InsOrderStandardTemplate::getTemperature,
                                         InsOrderStandardTemplate::getDetectionTime,
+                                        InsOrderStandardTemplate::getDetectionEndTime,
                                         InsOrderStandardTemplate::getDetectionPlace,
                                         InsOrderStandardTemplate::getInsResult)
                                 .orderByAsc(InsOrderStandardTemplate::getSort,
@@ -1094,6 +1102,8 @@
                     condition.setTemplateId(snapshot.getTemplateId());
                     condition.setTemperature(snapshot.getTemperature());
                     condition.setDetectionTime(snapshot.getDetectionTime());
+                    condition.setDetectionEndTime(snapshot.getDetectionEndTime() == null
+                            ? snapshot.getDetectionTime() : snapshot.getDetectionEndTime());
                     condition.setDetectionPlace(snapshot.getDetectionPlace());
                     condition.setInsResult(snapshot.getInsResult());
                     condition.setDeviceIds(templateDeviceIds.getOrDefault(
@@ -1110,18 +1120,34 @@
         return map;
     }
 
-    /** 棣栨鎵撳紑妫�楠屼换鍔℃椂锛屽皢浠嶄负绌虹殑妯℃澘璁惧浠庡搴旀爣鍑嗚ˉ鍏ヨ鍗曘�� */
-    private void initializeTemplateDevicesOnFirstOpen(Integer orderId) {
+    /**
+     * 鎵撳紑妫�楠屼换鍔℃椂锛屾妸灏氭湭琚汉宸ユ敼鍔ㄨ繃鐨勬ā鏉胯澶囧悓姝ヤ负鏍囧噯搴撳綋鍓嶇粦瀹氱殑璁惧锛�
+     * 妫�楠屽憳鎵嬪姩澧炲垹杩囩殑妯℃澘浠ヤ汉宸ヤ负鍑嗭紝涓嶅啀鑷姩濉厖銆�
+     */
+    private void initializeTemplateDevicesOnFirstOpen(Integer orderId, String laboratory) {
         InsOrder order = insOrderMapper.selectById(orderId);
-        if (order == null || !DIRECT_TEMPLATE_LABORATORY.equals(order.getLaboratory())
-                || !Objects.equals(order.getTypeSource(), -1)
+        if (order == null || !Objects.equals(order.getTypeSource(), -1)
                 || !Objects.equals(order.getState(), 1)
                 || "QUALITY_MONITOR".equals(order.getTaskSource())) {
             return;
         }
+        if (StringUtils.isNotBlank(laboratory)) {
+            InsOrderState orderState = insOrderStateService.getOne(Wrappers.<InsOrderState>lambdaQuery()
+                    .eq(InsOrderState::getInsOrderId, orderId)
+                    .eq(InsOrderState::getLaboratory, laboratory)
+                    .last("limit 1"));
+            // 浠呭緟妫�銆佸湪妫�闃舵鍚屾锛涜繘鍏ュ鏍哥瓑鍚庣画鐘舵�佸悗浠ヤ繚瀛樹笅鏉ョ殑璁惧涓哄噯銆�
+            if (orderState != null && orderState.getInsState() != null
+                    && orderState.getInsState() != 0 && orderState.getInsState() != 1) {
+                return;
+            }
+        }
         List<InsOrderStandardTemplate> snapshots = insOrderStandardTemplateMapper.selectList(
                 Wrappers.<InsOrderStandardTemplate>lambdaQuery()
                         .eq(InsOrderStandardTemplate::getInsOrderId, orderId)
+                        .select(InsOrderStandardTemplate::getId,
+                                InsOrderStandardTemplate::getTemplateId,
+                                InsOrderStandardTemplate::getDeviceDefaultsInitialized)
                         .orderByAsc(InsOrderStandardTemplate::getSort, InsOrderStandardTemplate::getId)
                         .last("FOR UPDATE"));
         if (snapshots.isEmpty() || snapshots.stream().allMatch(
@@ -1129,41 +1155,57 @@
             return;
         }
 
-        Set<Integer> existingTemplateIds = insOrderTemplateDeviceMapper.selectList(
-                Wrappers.<InsOrderTemplateDevice>lambdaQuery()
-                        .eq(InsOrderTemplateDevice::getInsOrderId, orderId))
-                .stream().map(InsOrderTemplateDevice::getTemplateId)
-                .filter(Objects::nonNull).collect(Collectors.toSet());
-        boolean inspectionStarted = order.getFirstInspectDate() != null
-                || (order.getInsState() != null && order.getInsState() > 0)
-                || snapshots.stream().anyMatch(snapshot -> StringUtils.isNotBlank(snapshot.getRecordValues())
-                        || snapshot.getDetectionTime() != null || snapshot.getTemperature() != null
-                        || snapshot.getDetectionPlace() != null);
-        Map<Integer, List<Integer>> defaults = inspectionStarted ? Collections.emptyMap()
-                : findStandardDeviceDefaults(order, snapshots);
+        Map<Integer, List<InsOrderTemplateDevice>> existingDevices = insOrderTemplateDeviceMapper.selectList(
+                        Wrappers.<InsOrderTemplateDevice>lambdaQuery()
+                                .eq(InsOrderTemplateDevice::getInsOrderId, orderId)
+                                .orderByAsc(InsOrderTemplateDevice::getSort, InsOrderTemplateDevice::getId))
+                .stream().filter(relation -> relation.getTemplateId() != null)
+                .collect(Collectors.groupingBy(InsOrderTemplateDevice::getTemplateId));
+        Map<Integer, List<Integer>> defaults = findStandardDeviceDefaults(order, snapshots);
 
         for (InsOrderStandardTemplate snapshot : snapshots) {
+            // 妫�楠屽憳鎵嬪姩閫夋嫨鎴栨竻绌鸿繃鐨勬ā鏉夸互浜哄伐涓哄噯锛屼笉鍐嶅鐢ㄦ爣鍑嗗簱榛樿鍊笺��
             if (Objects.equals(snapshot.getDeviceDefaultsInitialized(), 1)) {
                 continue;
             }
             Integer templateId = snapshot.getTemplateId();
-            if (!inspectionStarted && !existingTemplateIds.contains(templateId)
-                    && defaults.containsKey(templateId)) {
-                List<Integer> deviceIds = defaults.get(templateId);
-                for (int index = 0; index < deviceIds.size(); index++) {
-                    InsOrderTemplateDevice relation = new InsOrderTemplateDevice();
-                    relation.setInsOrderId(orderId);
-                    relation.setTemplateId(templateId);
-                    relation.setDeviceId(deviceIds.get(index));
-                    relation.setSort(index);
-                    insOrderTemplateDeviceMapper.insert(relation);
-                }
+            if (templateId == null) {
+                continue;
             }
-            // 鏃犳硶鍞竴纭畾鏉ユ簮鏃朵篃鍙皾璇曡繖涓�娆★紝閬垮厤浠ュ悗鏍囧噯搴撹皟鏁存椂鎰忓鏀瑰姩璁㈠崟銆�
-            insOrderStandardTemplateMapper.update(null,
-                    Wrappers.<InsOrderStandardTemplate>lambdaUpdate()
-                            .eq(InsOrderStandardTemplate::getId, snapshot.getId())
-                            .set(InsOrderStandardTemplate::getDeviceDefaultsInitialized, 1));
+            List<InsOrderTemplateDevice> currentDevices = existingDevices.getOrDefault(
+                    templateId, Collections.emptyList());
+            // 鏃ф暟鎹病鏈夊垵濮嬪寲鏍囪锛屽凡鏈夎澶囪涓轰汉宸ラ�夋嫨锛屾爣璁板悗涓嶅啀鑷姩瑕嗙洊銆�
+            if (snapshot.getDeviceDefaultsInitialized() == null && !currentDevices.isEmpty()) {
+                insOrderStandardTemplateMapper.update(null,
+                        Wrappers.<InsOrderStandardTemplate>lambdaUpdate()
+                                .eq(InsOrderStandardTemplate::getId, snapshot.getId())
+                                .set(InsOrderStandardTemplate::getDeviceDefaultsInitialized, 1));
+                continue;
+            }
+            if (!defaults.containsKey(templateId)) {
+                continue;
+            }
+            List<Integer> standardDeviceIds = defaults.get(templateId).stream()
+                    .filter(Objects::nonNull).distinct().collect(Collectors.toList());
+            List<Integer> currentDeviceIds = currentDevices.stream()
+                    .map(InsOrderTemplateDevice::getDeviceId)
+                    .filter(Objects::nonNull).distinct().collect(Collectors.toList());
+            if (currentDeviceIds.equals(standardDeviceIds)) {
+                continue;
+            }
+            // 鏈垵濮嬪寲杩囩殑妯℃澘瀹屽叏瀵归綈鏍囧噯搴撶粦瀹氾細缁戝畾鍑犱釜灏辨樉绀哄嚑涓��
+            insOrderTemplateDeviceMapper.delete(
+                    Wrappers.<InsOrderTemplateDevice>lambdaQuery()
+                            .eq(InsOrderTemplateDevice::getInsOrderId, orderId)
+                            .eq(InsOrderTemplateDevice::getTemplateId, templateId));
+            for (int index = 0; index < standardDeviceIds.size(); index++) {
+                InsOrderTemplateDevice relation = new InsOrderTemplateDevice();
+                relation.setInsOrderId(orderId);
+                relation.setTemplateId(templateId);
+                relation.setDeviceId(standardDeviceIds.get(index));
+                relation.setSort(index);
+                insOrderTemplateDeviceMapper.insert(relation);
+            }
         }
     }
 
@@ -1184,23 +1226,29 @@
                         .isNotNull(StandardTree::getSample)
                         .isNull(StandardTree::getSampleType)
                         .isNull(StandardTree::getModel));
-                List<StandardTree> matches = candidates.stream()
-                        .filter(tree -> StringUtils.isNotBlank(tree.getSample()))
-                        .filter(tree -> {
-                            Set<Integer> boundIds = standardTreeService.selectTemplateBindings(tree.getId()).stream()
-                                    .map(StandardTreeTemplateBindingVo::getTemplateId).collect(Collectors.toSet());
-                            return boundIds.containsAll(templateIds);
-                        }).collect(Collectors.toList());
-                if (matches.size() == 1) {
-                    standardTreeId = matches.get(0).getId();
-                } else {
-                    List<StandardTree> exact = matches.stream().filter(tree ->
-                            standardTreeService.selectTemplateBindings(tree.getId()).stream()
-                                    .map(StandardTreeTemplateBindingVo::getTemplateId)
-                                    .collect(Collectors.toSet()).equals(templateIds))
-                            .collect(Collectors.toList());
-                    if (exact.size() == 1) {
-                        standardTreeId = exact.get(0).getId();
+                if (candidates.size() == 1) {
+                    // 鍚屼竴鏍囧噯缂栧彿銆佸悓涓�瀹為獙瀹ゅ彧鏈変竴涓簩绾ц妭鐐规椂鐩存帴璁ゅ畾锛�
+                    // 閬垮厤鏍囧噯搴撹皟鏁磋繃妯℃澘鍚庢棫璁㈠崟鍖归厤涓嶄笂銆�
+                    standardTreeId = candidates.get(0).getId();
+                } else if (!candidates.isEmpty()) {
+                    List<StandardTree> matches = candidates.stream()
+                            .filter(tree -> StringUtils.isNotBlank(tree.getSample()))
+                            .filter(tree -> {
+                                Set<Integer> boundIds = standardTreeService.selectTemplateBindings(tree.getId()).stream()
+                                        .map(StandardTreeTemplateBindingVo::getTemplateId).collect(Collectors.toSet());
+                                return boundIds.containsAll(templateIds);
+                            }).collect(Collectors.toList());
+                    if (matches.size() == 1) {
+                        standardTreeId = matches.get(0).getId();
+                    } else if (!matches.isEmpty()) {
+                        List<StandardTree> exact = matches.stream().filter(tree ->
+                                standardTreeService.selectTemplateBindings(tree.getId()).stream()
+                                        .map(StandardTreeTemplateBindingVo::getTemplateId)
+                                        .collect(Collectors.toSet()).equals(templateIds))
+                                .collect(Collectors.toList());
+                        if (exact.size() == 1) {
+                            standardTreeId = exact.get(0).getId();
+                        }
                     }
                 }
             }

--
Gitblit v1.9.3