From 80b9620794286b61718a84ec1c2447893189646a Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期四, 03 九月 2026 17:04:02 +0800
Subject: [PATCH] fix(report): 修复检测报告生成和数据同步问题 - 调整样品发送时间排序为降序显示最新数据 - 完善检验项目同步逻辑支持多层级节点配置管理

---
 basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java |   63 +++++++++++++++++++------------
 1 files changed, 39 insertions(+), 24 deletions(-)

diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java
index 4bc4557..53da251 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java
@@ -257,53 +257,57 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Map<String, Object> selectStandardProductListByMethodId(Integer id, String tree) {
+        // 灏嗏�滃伐鍘� - 瀹為獙瀹� - 鏍峰搧绫诲埆 - 鏍峰搧 - 鍨嬪彿鈥濊矾寰勬媶鎴愬悇绾ц妭鐐广��
         String[] trees = tree.split(" - ");
-        // 鍒ゆ柇鏄惁鎷栨嫿
+        // 鍥涚骇鍙婁互涓婅妭鐐归渶瑕佹寜鏁版嵁搴撲腑宸蹭繚瀛樼殑 sort 鎺掑簭杩斿洖銆�
         boolean isDrag = false;
+        // 瀛樻斁鏍规嵁缁撴瀯鍙傛暟琛ㄩ噸鏂扮敓鎴愮殑妫�楠岄」鐩��
         List<StandardProductList> list = new ArrayList<>();
         if (trees.length == 3) {
+            // 涓夌骇鑺傜偣鍙畾浣嶅埌鏍峰搧绫诲埆锛岄渶瑕佺户缁睍寮�璇ョ被鍒笅鐨勬牱鍝佸拰鍨嬪彿銆�
             List<StandardTree> treeList = new ArrayList<>();
             StandardTree standardTree = new StandardTree();
             standardTree.setFactory(trees[0]);
             standardTree.setLaboratory(trees[1]);
             standardTree.setSampleType(trees[2]);
+            // 鏌ヨ璇ユ牱鍝佺被鍒叧鑱旂殑浜у搧锛堟牱鍝侊級鍚嶇О銆�
             List<ProductDto> pList = standardTreeMapper.selectPList(trees[2]);
-            if (pList.size() == 0 || pList.get(0) == null) {
+            if (pList.isEmpty() || pList.get(0) == null) {
+                // 娌℃湁浜у搧鏃讹紝鐩存帴浣跨敤璇ュ疄楠屽鍜屾牱鍝佺被鍒凡閰嶇疆鐨勬爣鍑嗘爲鑺傜偣銆�
                 List<StandardTree> treeList1 = standardTreeMapper.selectList(Wrappers.<StandardTree>lambdaQuery().eq(StandardTree::getLaboratory, trees[1]).eq(StandardTree::getSampleType, trees[2]));
-                if (treeList1.size() == 0) {
+                if (treeList1.isEmpty()) {
+                    // 鏍囧噯鏍戜篃涓嶅瓨鍦ㄦ椂锛屼繚鐣欎笁绾ц妭鐐逛綔涓哄厹搴曟煡璇㈡潯浠躲��
                     treeList.add(standardTree);
                 } else {
                     treeList.addAll(treeList1);
                 }
             } else {
+                // 鎸変骇鍝侀�愪釜鏌ユ壘宸查厤缃殑鍨嬪彿锛涙湭閰嶇疆鏃跺垱寤轰竴涓彧鏈夋牱鍝佷俊鎭殑鍏滃簳鑺傜偣銆�
                 for (ProductDto p : pList) {
                     standardTree.setSample(p.getName());
                     List<StandardTree> treeList1 = standardTreeMapper.selectList(Wrappers.<StandardTree>lambdaQuery().eq(StandardTree::getLaboratory, trees[1]).eq(StandardTree::getSampleType, trees[2]).eq(StandardTree::getSample, p.getName()));
-                    if (treeList1.size() == 0) {
+                    if (treeList1.isEmpty()) {
                         treeList.add(JSON.parseObject(JSON.toJSONString(standardTree), StandardTree.class));
                     } else {
                         treeList.addAll(treeList1);
                     }
                 }
             }
+            // 涓烘瘡涓睍寮�鍚庣殑鈥滄牱鍝� + 鍨嬪彿鈥濊妭鐐规煡璇㈤�傜敤鐨勬楠岄」鐩��
             for (StandardTree standardTree2 : treeList) {
                 String tree2 = trees[0] + " - " + trees[1] + " - " + trees[2] + " - " + standardTree2.getSample() + " - " + standardTree2.getModel();
+                // 鏌ヨ閫傜敤浜庢牱鍝佺被鍒殑閫氱敤椤圭洰鍙婂綋鍓嶆牱鍝�/鍨嬪彿鐨勯」鐩��
                 list.addAll(standardTreeMapper.selectStandardProductListByTree("\"" + trees[2] + "\"", standardTree2.getSample(), standardTree2.getModel(), tree2, trees[1]));
+                // 鏌ヨ鍚屾椂闄愬畾鏍峰搧绫诲埆鍜屾牱鍝佸悕绉扮殑椤圭洰銆�
                 list.addAll(standardTreeMapper.selectStandardProductListByTree2("\"" + trees[2] + "\",\"" + standardTree2.getSample() + "\"", standardTree2.getSample(), standardTree2.getModel(), tree2, trees[1]));
             }
         } else if (trees.length == 4) {
-            // 鍒ゆ柇绗洓灞傛槸鍚︽湁鍨嬪彿
-            Long count = standardProductListMapper.selectCount(Wrappers.<StandardProductList>lambdaQuery()
-                    .eq(StandardProductList::getStandardMethodListId, id)
-                    .isNull(StandardProductList::getModel)
-                    .like(StandardProductList::getTree, tree));
-            if (count == 0) {
-                isDrag = true;
-            }
-
+            // 鍥涚骇鑺傜偣宸插畾浣嶅埌鏍峰搧锛屽悗缁寜宸蹭繚瀛樼殑 sort 鎺掑簭杩斿洖銆�
             isDrag = true;
+            // 鏌ヨ璇ユ牱鍝佸凡閰嶇疆鐨勫瀷鍙疯妭鐐广��
             List<StandardTree> treeList = standardTreeMapper.selectList(Wrappers.<StandardTree>lambdaQuery().eq(StandardTree::getLaboratory, trees[1]).eq(StandardTree::getSampleType, trees[2]).eq(StandardTree::getSample, trees[3]));
-            if (treeList.size() == 0) {
+            if (treeList.isEmpty()) {
+                // 娌℃湁鍨嬪彿閰嶇疆鏃讹紝鍒涘缓涓嶅惈鍨嬪彿鐨勮妭鐐癸紝浠嶅彲鏌ヨ閫氱敤椤圭洰銆�
                 StandardTree standardTree = new StandardTree();
                 standardTree.setFactory(trees[0]);
                 standardTree.setLaboratory(trees[1]);
@@ -311,37 +315,41 @@
                 standardTree.setSample(trees[3]);
                 treeList.add(standardTree);
             }
+            // 閽堝鏍峰搧鐨勬瘡涓瀷鍙凤紝鍚堝苟閫氱敤椤圭洰鍜屾牱鍝佷笓灞為」鐩��
             for (StandardTree standardTree : treeList) {
                 String str = tree + " - " + standardTree.getModel();
                 list.addAll(standardTreeMapper.selectStandardProductListByTree("\"" + trees[2] + "\"", standardTree.getSample(), standardTree.getModel(), str, trees[1]));
                 list.addAll(standardTreeMapper.selectStandardProductListByTree2("\"" + trees[2] + "\",\"" + trees[3] + "\"", standardTree.getSample(), standardTree.getModel(), str, trees[1]));
             }
         } else {
+            // 浜旂骇鑺傜偣宸叉槑纭牱鍝佸拰鍨嬪彿锛岀洿鎺ユ煡璇㈣鑺傜偣閫傜敤鐨勯」鐩��
             isDrag = true;
             list.addAll(standardTreeMapper.selectStandardProductListByTree("\"" + trees[2] + "\"", trees[3].equals("null") ? null : trees[3], trees[4], tree, trees[1]));
             list.addAll(standardTreeMapper.selectStandardProductListByTree2("\"" + trees[2] + "\",\"" + trees[3] + "\"", trees[3].equals("null") ? null : trees[3], trees[4], tree, trees[1]));
         }
+        // 涓烘柊鐢熸垚鐨勯」鐩鍏堝垎閰嶉洩鑺� ID锛涘尮閰嶅埌鏃ч厤缃悗浼氭浛鎹负鏃ц褰� ID銆�
         for (StandardProductList productList : list) {
             productList.setId(IdWorker.getId());
         }
         List<StandardProductList> standardProductLists;
 
         if (isDrag) {
+            // 鏌ヨ褰撳墠鑺傜偣鍙婂叾瀛愯妭鐐圭殑鏃ч厤缃紝骞舵寜 sort 璇诲彇浠ヤ繚鐣欐嫋鎷藉悗鐨勯『搴忋��
             standardProductLists = standardProductListMapper.selectList(Wrappers.<StandardProductList>lambdaQuery()
                     .eq(StandardProductList::getStandardMethodListId, id)
                     .like(StandardProductList::getTree, tree)
                     .orderByAsc(StandardProductList::getSort));
-            // 鍒ゆ柇鏄惁鏈夋病鏈夊簭鍙风殑, 娌℃湁搴忓彿閲嶇疆
-            boolean b = standardProductLists.stream().anyMatch(standardProductList -> standardProductList.getSort() == null);
         } else {
+            // 涓夌骇鑺傜偣娌℃湁鎷栨嫿椤哄簭锛屽彧璇诲彇鐢ㄤ簬瑕嗙洊榛樿鍊肩殑鏃ч厤缃��
             standardProductLists = standardProductListMapper.selectList(Wrappers.<StandardProductList>lambdaQuery()
                     .eq(StandardProductList::getStandardMethodListId, id)
                     .like(StandardProductList::getTree, tree));
         }
 
+        // 灏嗘棫椤圭洰涓汉宸ョ淮鎶ょ殑閰嶇疆瑕嗙洊鍒版湰娆¢噸鏂扮敓鎴愮殑瀵瑰簲椤圭洰銆�
         for (StandardProductList sp : standardProductLists) {
             for (StandardProductList pl : list) {
-                // 鍒ゆ柇鏉′欢鏄惁鍙湁涓�涓�, 鏈変竴涓殑璇濋粯璁ょ涓�涓�
+                // 鍗婂緞鍊欓�夊�煎彧鏈変竴涓椂锛屽皢鍏朵綔涓洪粯璁ゅ崐寰勩��
                 String radiusList = pl.getRadiusList();
                 if (StringUtils.isNotBlank(radiusList) && !radiusList.equals("null") && !radiusList.equals("\"\"")) {
                     JSONArray jsonArray = JSON.parseArray(radiusList);
@@ -350,15 +358,17 @@
                         pl.setRadius(radius.get(0));
                     }
                 }
+                // 浠ユ楠岄」鐩�佸瓙椤广�佸瀷鍙枫�佹牱鍝佸拰缁撴瀯鍙傛暟 ID 鍒ゆ柇鏂版棫椤圭洰鏄惁瀵瑰簲銆�
                 if (Objects.equals(sp.getInspectionItem(), pl.getInspectionItem())
                         && Objects.equals((sp.getInspectionItemSubclass() == null) ? "" : sp.getInspectionItemSubclass(), pl.getInspectionItemSubclass() == null ? "" : pl.getInspectionItemSubclass())
 //                        && Objects.equals(sp.getSample(), pl.getSample())
                         && Objects.equals(sp.getModel(), pl.getModel())
                         && sp.getTree().indexOf(pl.getSample() == null ? "null" : pl.getSample()) > -1
                         && Objects.equals(sp.getStructureItemParameterId(), pl.getStructureItemParameterId())) {
+                    // 澶嶇敤鏃� ID 鍜屾帓搴忥紝纭繚鏈鍚屾鍚庡師鏈夐厤缃粛鍏宠仈鍒板悓涓�鏉¢」鐩褰曘��
                     pl.setId(sp.getId());
-                    // 娣诲姞鎺掑簭瀛楁
                     pl.setSort(sp.getSort());
+                    // 鏃ц褰曞瓨鍦ㄥ�兼椂浼樺厛淇濈暀锛涚姸鎬佷负绌烘椂鎸夋爣鍑� ID 璁剧疆榛樿鐘舵�併��
                     if (sp.getState() != null && !sp.getState().equals("")) {
                         pl.setState(sp.getState());
                     } else {
@@ -405,18 +415,21 @@
             }
         }
 
+        // 璁板綍鏈鍚屾鐨勫垱寤轰汉鍜屾洿鏂颁汉銆�
         Integer userId = SecurityUtils.getUserId().intValue();
         if (trees.length == 5) {
+            // 浜旂骇鑺傜偣鍙噸寤哄綋鍓嶇簿纭矾寰勭殑鏁版嵁銆�
             standardProductListMapper.delete(Wrappers.<StandardProductList>lambdaUpdate()
                     .eq(StandardProductList::getStandardMethodListId, id)
                     .eq(StandardProductList::getTree, tree));
         } else {
+            // 涓夌骇銆佸洓绾ц妭鐐归噸寤哄綋鍓嶈矾寰勫強鍏舵墍鏈夊瓙鑺傜偣鐨勬暟鎹��
             standardProductListMapper.delete(Wrappers.<StandardProductList>lambdaUpdate()
                     .eq(StandardProductList::getStandardMethodListId, id)
                     .like(StandardProductList::getTree, tree));
         }
 
-
+        // 琛ラ綈鎵归噺淇濆瓨鎵�闇�鐨勬爲鑺傜偣銆佺敤鎴峰拰妫�楠屾爣鍑嗗瓧娈点��
         List<StandardProductList> productLists = list.stream().map(a -> {
             a.setFactory(trees[0]);
             a.setLaboratory(trees[1]);
@@ -426,11 +439,12 @@
             a.setStandardMethodListId(id);
             return a;
         }).collect(Collectors.toList());
-//            this.saveBatch(productLists);
-        // 鎵归噺娣诲姞鏍囧噯
-        baseMapper.saveBatchProductLists(productLists);
+        if (CollectionUtils.isNotEmpty(productLists)) {
+            // 鎵归噺鍐欏叆閲嶆柊鐢熸垚鍚庣殑妫�楠岄」鐩��
+            baseMapper.saveBatchProductLists(productLists);
+        }
 
-
+        // 鍏堟寜宸ユ椂鍒嗙粍涓殑鏁板瓧鍗囧簭鎺掑垪锛涚┖鍒嗙粍鎺掑埌鏈�鍚庛��
         Collections.sort(list, (o1, o2) -> {
             String field1 = o1.getManHourGroup();
             String field2 = o2.getManHourGroup();
@@ -450,12 +464,13 @@
                 return Integer.compare(num1, num2);
             }
         });
-          // 鎸夌収绱㈠紩鎺掑簭
         if (isDrag) {
+            // 鍥涚骇銆佷簲绾ц妭鐐规渶缁堟寜宸蹭繚瀛樼殑鎷栨嫿鎺掑簭瑕嗙洊宸ユ椂鍒嗙粍鎺掑簭銆�
             list.sort((o1, o2) -> (o1.getSort() == null ? 0 : o1.getSort())
                     - (o2.getSort() == null ? 0 : o2.getSort()));
         }
 
+        // 鎸夊墠绔害瀹氳繑鍥為」鐩垪琛ㄥ拰鏁伴噺銆�
         Map<String, Object> map = new HashMap<>();
         map.put("productList", list);
         map.put("total", list.size());

--
Gitblit v1.9.3