From e80eae3bcd9f1ee0eecd4072f943f2519762f164 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期二, 20 十月 2026 15:18:21 +0800
Subject: [PATCH] feat: 工序添加是否领料,用于后续生产订单领料

---
 src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java |   25 ++++++
 src/main/java/com/ruoyi/production/pojo/ProductionBomStructure.java                    |    3 
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java        |   76 ++++++++++++++++--
 src/main/resources/mapper/technology/TechnologyOperationMapper.xml                     |    2 
 doc/20261020_工序是否领料与生产BOM结构领料标记.sql                                                    |  112 ++++++++++++++++++++++++++++
 src/main/java/com/ruoyi/technology/pojo/TechnologyOperation.java                       |    3 
 src/main/resources/mapper/production/ProductionBomStructureMapper.xml                  |    1 
 7 files changed, 211 insertions(+), 11 deletions(-)

diff --git "a/doc/20261020_\345\267\245\345\272\217\346\230\257\345\220\246\351\242\206\346\226\231\344\270\216\347\224\237\344\272\247BOM\347\273\223\346\236\204\351\242\206\346\226\231\346\240\207\350\256\260.sql" "b/doc/20261020_\345\267\245\345\272\217\346\230\257\345\220\246\351\242\206\346\226\231\344\270\216\347\224\237\344\272\247BOM\347\273\223\346\236\204\351\242\206\346\226\231\346\240\207\350\256\260.sql"
new file mode 100644
index 0000000..0a56f3a
--- /dev/null
+++ "b/doc/20261020_\345\267\245\345\272\217\346\230\257\345\220\246\351\242\206\346\226\231\344\270\216\347\224\237\344\272\247BOM\347\273\223\346\236\204\351\242\206\346\226\231\346\240\207\350\256\260.sql"
@@ -0,0 +1,112 @@
+-- ============================================================================
+-- 宸ュ簭澧炲姞鈥滄槸鍚﹂鏂欌�濇爣璁帮紝骞跺悓姝ュ埌鐢熶骇BOM缁撴瀯锛堢敓浜ц鍗曢鏂欏彴璐︿娇鐢級
+--
+-- 鑳屾櫙锛�
+--   鐢熶骇璁㈠崟鐨勯鏂欏彴璐﹀師鏉ユ寜 BOM 鐨勫彾瀛愯妭鐐瑰弽鎺ㄩ渶瑕侀鏂欑殑鐗╂枡锛孊OM 灞傜骇涓�澶氾紝
+--   棰嗘枡缁撴灉鍜屽疄闄呮儏鍐靛涓嶄笂锛圔OM 閲屼竴澶у爢鐗╂枡闇�瑕侀鏂欙紝绠楀嚭鏉ュ彧鍓╁嚑鏉★級銆�
+--   鐜版敼涓虹敱宸ュ簭涓婄殑鈥滄槸鍚﹂鏂欌�濇爣璁板喅瀹氶鏂欒寖鍥达細
+--     1) 宸ュ簭琛� technology_operation 澧炲姞 is_pick锛堝伐搴忕鐞�-鏂板/缂栬緫宸ュ簭 鍕鹃�夆�滄槸鍚﹂鏂欌�濓級锛�
+--     2) 鐢熶骇璁″垝涓嬪彂锛堢敓鎴愮敓浜ц鍗曞揩鐓э級鏃讹紝鎶婂伐搴忕殑 is_pick 甯﹀埌 production_bom_structure锛�
+--     3) 鐢熶骇璁㈠崟-棰嗘枡鍙拌处鎸� is_pick = 1 鐨勫伐搴忕墿鏂欏彇鏁帮紝璇诲彇鏃朵細鐢ㄥ伐搴忎富鏁版嵁鐨勬渶鏂版爣璁板埛鏂板揩鐓у�硷紝
+--        鍥犳宸ュ簭涓婅皟鏁粹�滄槸鍚﹂鏂欌�濆悗鏃犻渶閲嶆柊涓嬪彂璁″垝鍗冲彲鐢熸晥锛�
+--        production_bom_structure.is_pick 涓昏鐢ㄤ簬蹇収鐣欑棔銆佹姤琛ㄥ拰宸ュ簭琚垹闄ゅ悗鐨勫厹搴曘��
+--
+-- 鎵ц璇存槑锛�
+--   1. 鑴氭湰鍙噸澶嶆墽琛岋紝鍒楀凡瀛樺湪鏃朵細鑷姩璺宠繃锛�
+--   2. 寤鸿鍏堟墽琛屾湰鑴氭湰锛屽啀鍗囩骇绋嬪簭锛屾渶鍚庡湪宸ュ簭绠$悊閲屽嬀閫夐渶瑕侀鏂欑殑宸ュ簭锛�
+--   3. 绗� 3 姝ュ洖濉粎鐢ㄤ簬鎶婂瓨閲忚鍗旴OM蹇収閲岀殑 is_pick 鍒锋垚宸ュ簭鏈�鏂版爣璁帮紙鎶ヨ〃/杩芥函鍙e緞锛夛紝
+--      涓嶅奖鍝嶉鏂欏彴璐︾殑瀹炴椂鍙栨暟銆�
+-- ============================================================================
+
+-- ----------------------------------------------------------------------------
+-- 1. 宸ュ簭琛細澧炲姞鈥滄槸鍚﹂鏂欌�濆瓧娈�
+-- ----------------------------------------------------------------------------
+SET
+@col_exists = (
+    SELECT COUNT(1)
+    FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = DATABASE()
+      AND TABLE_NAME = 'technology_operation'
+      AND COLUMN_NAME = 'is_pick'
+);
+
+SET
+@ddl = IF(@col_exists = 0,
+    'ALTER TABLE technology_operation ADD COLUMN is_pick TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''鏄惁棰嗘枡锛�0鍚︼紝1鏄�'' AFTER is_production',
+    'SELECT ''technology_operation.is_pick 宸插瓨鍦紝璺宠繃'' AS msg');
+
+PREPARE stmt FROM @ddl;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+-- ----------------------------------------------------------------------------
+-- 2. 鐢熶骇璁㈠崟BOM缁撴瀯琛細澧炲姞鈥滄槸鍚﹂鏂欌�濆瓧娈碉紙蹇収鏉ヨ嚜宸ュ簭锛�
+-- ----------------------------------------------------------------------------
+SET
+@col_exists = (
+    SELECT COUNT(1)
+    FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = DATABASE()
+      AND TABLE_NAME = 'production_bom_structure'
+      AND COLUMN_NAME = 'is_pick'
+);
+
+SET
+@ddl = IF(@col_exists = 0,
+    'ALTER TABLE production_bom_structure ADD COLUMN is_pick TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''鏄惁棰嗘枡锛氭潵鑷伐搴忥紝0鍚︼紝1鏄�'' AFTER technology_operation_id',
+    'SELECT ''production_bom_structure.is_pick 宸插瓨鍦紝璺宠繃'' AS msg');
+
+PREPARE stmt FROM @ddl;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+-- ----------------------------------------------------------------------------
+-- 3. 瀛橀噺鐢熶骇BOM缁撴瀯鍥炲~锛氭寜宸ュ簭褰撳墠鐨勨�滄槸鍚﹂鏂欌�濇爣璁板悓姝ュ揩鐓у��
+--    棣栨鎵ц锛堝伐搴忚繕娌″紑濮嬫爣璁帮級鏃朵笉浼氭敼鍙樹换浣曟暟鎹紱
+--    鍚庣画鍦ㄥ伐搴忕鐞嗛噷鍕鹃��/鍙栨秷鈥滄槸鍚﹂鏂欌�濆悗锛屽彲鍐嶆鎵ц鏈鍙ワ紝
+--    璁╁凡缁忎笅鍙戠殑璁㈠崟BOM蹇収鍚屾鏈�鏂版爣璁帮紙鐢ㄤ簬鎶ヨ〃/杩芥函锛岄鏂欏彴璐﹁鍙栨椂鏈韩涔熶細鍙栧伐搴忔渶鏂版爣璁帮級銆�
+-- ----------------------------------------------------------------------------
+UPDATE production_bom_structure pbs
+    INNER JOIN technology_operation top1 ON top1.id = pbs.technology_operation_id
+SET pbs.is_pick = IFNULL(top1.is_pick, 0)
+WHERE IFNULL(pbs.is_pick, 0) <> IFNULL(top1.is_pick, 0);
+
+-- 鍙�夛紙鏈夐闄╋紝榛樿涓嶆墽琛岋級锛氭妸瀛橀噺宸ュ簭鍏ㄩ儴鏍囪涓洪渶瑕侀鏂欍��
+-- 娉ㄦ剰锛氭墽琛屽悗锛屾墍鏈夊巻鍙茶鍗曠殑棰嗘枡鍙拌处閮戒細鍙樻垚鈥滄寜鍏ㄩ儴宸ュ簭棰嗘枡鈥濓紝璇风‘璁ゅ彛寰勫悗鍐嶆斁寮�銆�
+-- UPDATE technology_operation SET is_pick = 1 WHERE is_pick = 0;
+
+-- ----------------------------------------------------------------------------
+-- 4. 鏍¢獙SQL锛堟寜闇�鎵ц锛屼笉褰卞搷鏁版嵁锛�
+-- ----------------------------------------------------------------------------
+-- 4.1 鏌ョ湅鍝簺宸ュ簭鍦˙OM缁撴瀯涓浣跨敤锛屽府鍔╁喅瀹氱粰鍝簺宸ュ簭寮�鍚�滄槸鍚﹂鏂欌��
+-- SELECT top1.id,
+--        top1.no,
+--        top1.name,
+--        top1.is_pick,
+--        COUNT(pbs.id) AS bom_row_count
+-- FROM technology_operation top1
+--          LEFT JOIN production_bom_structure pbs ON pbs.technology_operation_id = top1.id
+-- GROUP BY top1.id, top1.no, top1.name, top1.is_pick
+-- ORDER BY bom_row_count DESC;
+
+-- 4.2 鏌ョ湅鏌愪釜鐢熶骇璁㈠崟鐨凚OM缁撴瀯棰嗘枡鏍囪锛堟妸 :productionOrderId 鎹㈡垚瀹為檯璁㈠崟ID锛�
+-- SELECT pbs.id,
+--        pbs.parent_id,
+--        pbs.technology_operation_id,
+--        top1.name AS operation_name,
+--        pbs.product_model_id,
+--        pm.model,
+--        pbs.unit_quantity,
+--        pbs.demanded_quantity,
+--        pbs.is_pick
+-- FROM production_bom_structure pbs
+--          LEFT JOIN technology_operation top1 ON top1.id = pbs.technology_operation_id
+--          LEFT JOIN product_model pm ON pm.id = pbs.product_model_id
+-- WHERE pbs.production_order_id = :productionOrderId
+-- ORDER BY pbs.id;
+
+-- ----------------------------------------------------------------------------
+-- 5. 鍥炴粴锛堝闇�锛夛細
+-- ALTER TABLE production_bom_structure DROP COLUMN is_pick;
+-- ALTER TABLE technology_operation DROP COLUMN is_pick;
+-- ----------------------------------------------------------------------------
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionBomStructure.java b/src/main/java/com/ruoyi/production/pojo/ProductionBomStructure.java
index 5ba8d22..09bf8ae 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionBomStructure.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionBomStructure.java
@@ -40,6 +40,9 @@
     @Schema(description = "宸ュ簭id")
     private Long technologyOperationId;
 
+    @Schema(description = "鏄惁棰嗘枡 鏉ユ簮宸ュ簭鐨勨�滄槸鍚﹂鏂欌�濇爣璁帮紝棰嗘枡鍙拌处鍙鍙栨爣璁颁簡棰嗘枡鐨勫伐搴忕墿鏂�")
+    private Boolean isPick;
+
     @Schema(description = "鐢熶骇璁㈠崟BOMid")
     private Long productionOrderBomId;
 
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java
index acad3ef..eca8cb3 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java
@@ -131,10 +131,15 @@
         List<ProductionBomStructure> updateList = new ArrayList<>();
         Map<String, ProductionBomStructure> tempEntityMap = new HashMap<>();
 
+        Map<Long, Boolean> operationPickMap = loadOperationPickMap(flatDtoList.stream()
+                .map(ProductionBomStructureDto::getTechnologyOperationId)
+                .collect(Collectors.toList()));
+
         for (ProductionBomStructureDto item : flatDtoList) {
             ProductionBomStructure entity = new ProductionBomStructure();
             BeanUtils.copyProperties(item, entity);
             entity.setProductionOrderBomId(orderBomId);
+            entity.setIsPick(operationPickMap.getOrDefault(item.getTechnologyOperationId(), Boolean.FALSE));
             if (item.getId() == null) {
                 entity.setParentId(null);
                 insertList.add(entity);
@@ -853,6 +858,26 @@
         return technologyOperationMapper.selectById(technologyOperationId);
     }
 
+    /**
+     * 鎵归噺璇诲彇宸ュ簭鐨勨�滄槸鍚﹂鏂欌�濇爣璁帮紝淇濊瘉鐢熶骇BOM缁撴瀯涓殑棰嗘枡鏍囪涓庡伐搴忎富鏁版嵁涓�鑷淬��
+     */
+    private Map<Long, Boolean> loadOperationPickMap(List<Long> technologyOperationIds) {
+        if (technologyOperationIds == null || technologyOperationIds.isEmpty()) {
+            return Collections.emptyMap();
+        }
+        Set<Long> operationIdSet = technologyOperationIds.stream()
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+        if (operationIdSet.isEmpty()) {
+            return Collections.emptyMap();
+        }
+        return technologyOperationMapper.selectBatchIds(operationIdSet).stream()
+                .filter(item -> item != null && item.getId() != null)
+                .collect(Collectors.toMap(TechnologyOperation::getId,
+                        item -> Boolean.TRUE.equals(item.getIsPick()),
+                        (left, right) -> left));
+    }
+
     private String generateNextTaskNo() {
         String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
         ProductionOperationTask latestTask = productionOperationTaskMapper.selectOne(
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
index defce97..43a89a6 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -371,6 +371,9 @@
         productionOrderBomMapper.insert(orderBom);
 
         Map<Long, Long> idMap = new HashMap<>();
+        Map<Long, Boolean> operationPickMap = loadOperationPickMap(structureList.stream()
+                .map(TechnologyBomStructure::getOperationId)
+                .collect(Collectors.toList()));
         for (TechnologyBomStructure source : structureList) {
             // 瀛愯妭鐐� parentId 闇�瑕佹槧灏勬垚鏂板揩鐓ц妭鐐� id锛屾墠鑳戒繚鐣欏師濮� BOM 灞傜骇銆�
             ProductionBomStructure target = new ProductionBomStructure();
@@ -379,6 +382,7 @@
             target.setParentId(source.getParentId() == null ? null : idMap.get(source.getParentId()));
             target.setProductModelId(source.getProductModelId());
             target.setTechnologyOperationId(source.getOperationId());
+            target.setIsPick(operationPickMap.getOrDefault(source.getOperationId(), Boolean.FALSE));
             target.setUnitQuantity(source.getUnitQuantity());
             target.setDemandedQuantity(defaultDecimal(orderQuantity)
                     .multiply(defaultDecimal(source.getUnitQuantity())));
@@ -387,6 +391,26 @@
             idMap.put(source.getId(), target.getId());
         }
         return orderBom;
+    }
+
+    /**
+     * 鎵归噺璇诲彇宸ュ簭鐨勨�滄槸鍚﹂鏂欌�濇爣璁帮紝閬垮厤BOM蹇収閫愯鏌ヨ宸ュ簭琛ㄣ��
+     */
+    private Map<Long, Boolean> loadOperationPickMap(List<Long> technologyOperationIds) {
+        if (technologyOperationIds == null || technologyOperationIds.isEmpty()) {
+            return Collections.emptyMap();
+        }
+        Set<Long> operationIdSet = technologyOperationIds.stream()
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+        if (operationIdSet.isEmpty()) {
+            return Collections.emptyMap();
+        }
+        return technologyOperationMapper.selectBatchIds(operationIdSet).stream()
+                .filter(item -> item != null && item.getId() != null)
+                .collect(Collectors.toMap(TechnologyOperation::getId,
+                        item -> Boolean.TRUE.equals(item.getIsPick()),
+                        (left, right) -> left));
     }
 
     private void clearProductionSnapshot(Long productionOrderId) {
@@ -1076,32 +1100,62 @@
             }
         }
 
-        // 鏀堕泦璁㈠崟鎴愬搧瑙勬牸ID锛氬寘鍚敓浜ц鍗曟垚鍝佽鏍间笌BOM鏍硅妭鐐硅鏍硷紝鐢ㄤ簬鎺掗櫎鈥滆嚜宸扁�濊繖涓�鐗╂枡
+        // production_bom_structure.is_pick 鏄敓浜ц鍒掍笅鍙戞椂鐨勫伐搴忛鏂欐爣璁板揩鐓э紱
+        // 棰嗘枡鍙拌处璇诲彇鏃朵互宸ュ簭涓绘暟鎹殑鏈�鏂版爣璁颁负鍑嗭紝淇濊瘉宸ュ簭涓婄殑鈥滄槸鍚﹂鏂欌�濊皟鏁村悗鏃犻渶閲嶆柊涓嬪彂鍗冲彲鐢熸晥锛�
+        // 宸ュ簭宸茶鍒犻櫎鏃朵繚鐣欏揩鐓у�硷紝閬垮厤鍘嗗彶璁㈠崟鐨勯鏂欒寖鍥翠涪澶便��
+        Map<Long, Boolean> operationPickMap = loadOperationPickMap(bomStructureList.stream()
+                .filter(Objects::nonNull)
+                .map(ProductionBomStructureVo::getTechnologyOperationId)
+                .collect(Collectors.toList()));
+        for (ProductionBomStructureVo structure : bomStructureList) {
+            if (structure == null || structure.getTechnologyOperationId() == null) {
+                continue;
+            }
+            Boolean latestPick = operationPickMap.get(structure.getTechnologyOperationId());
+            if (latestPick != null) {
+                structure.setIsPick(latestPick);
+            }
+        }
+
+        // 鏀堕泦璁㈠崟鎴愬搧瑙勬牸ID锛氱敓浜ц鍗曟垚鍝佽鏍� + 璁㈠崟BOM蹇収鐨勬牴鑺傜偣瑙勬牸锛岀敤浜庢帓闄も�滆嚜宸扁�濊繖涓�鐗╂枡銆�
+        // 娉ㄦ剰锛欱OM缁撴瀯閲岄鏂欑墿鏂欐湰韬篃鍙兘鏄� parent_id 涓虹┖鐨勭嫭绔嬭妭鐐癸紝杩欓噷涓嶈兘鍐嶆妸鎵�鏈夋牴鑺傜偣閮藉綋鎴愭垚鍝佹帓闄わ紝
+        // 鍚﹀垯鈥滈鏂欌�濆伐搴忎笅鐨勭墿鏂欎細琚暣浣撹繃婊ゆ帀銆�
         Set<Long> finishedProductModelIds = new HashSet<>();
         if (productionOrder != null && productionOrder.getProductModelId() != null) {
             finishedProductModelIds.add(productionOrder.getProductModelId());
         }
-        bomStructureList.stream()
-                .filter(s -> s != null && (s.getParentId() == null || s.getParentId() == 0))
-                .map(ProductionBomStructureVo::getProductModelId)
-                .filter(Objects::nonNull)
-                .forEach(finishedProductModelIds::add);
+        if (orderBom.getProductModelId() != null) {
+            finishedProductModelIds.add(orderBom.getProductModelId());
+        }
 
         // 鏀堕泦鎵�鏈夎寮曠敤涓虹埗绾х殑鑺傜偣ID锛欱OM浠庢渶鍚庝竴閬撳伐搴忓線閲岄厤缃墠涓�閬撳伐搴忥紝
-        // 涓棿鑺傜偣鏄笂涓�閬撳伐搴忕殑浜у嚭锛堣嚜鍒讹級锛屽彧鏈夋瘡鏉″垎鏀渶閲屽眰鐨勫彾瀛愯妭鐐规墠鏄湡姝i渶瑕侀鐢ㄧ殑鐗╂枡銆�
+        // 涓棿鑺傜偣鏄笂涓�閬撳伐搴忕殑浜у嚭锛堣嚜鍒讹級锛屾棫鍙e緞鍙湁姣忔潯鍒嗘敮鏈�閲屽眰鐨勫彾瀛愯妭鐐规墠鏄湡姝i渶瑕侀鐢ㄧ殑鐗╂枡銆�
         Set<Long> parentNodeIds = bomStructureList.stream()
                 .filter(s -> s != null && s.getParentId() != null && s.getParentId() != 0)
                 .map(ProductionBomStructureVo::getParentId)
                 .filter(Objects::nonNull)
                 .collect(Collectors.toSet());
 
-        // 杩囨护鍑哄彾瀛愯妭鐐癸紙瀹為檯棰嗘枡椤癸級锛氶潪鏍硅妭鐐广�侀潪涓棿鑺傜偣锛屽苟鎺掗櫎涓庤鍗曟垚鍝佸悓瑙勬牸鐨勭墿鏂欙紙鑷埗鎴愬搧鏃犻渶棰嗘枡锛�
-        List<ProductionBomStructureVo> childStructureList = bomStructureList.stream()
-                .filter(s -> s != null && s.getParentId() != null && s.getParentId() != 0)
-                .filter(s -> s.getId() == null || !parentNodeIds.contains(s.getId()))
+        // 棰嗘枡鑼冨洿浠ュ伐搴忕殑鈥滄槸鍚﹂鏂欌�濇爣璁颁负鍑嗭細鍙湁鏍囪浜嗛鏂欑殑宸ュ簭锛屽叾娑堣�楃殑鐗╂枡鎵嶈繘鍏ラ鏂欏彴璐︺��
+        // 娉ㄦ剰锛氶鏂欑墿鏂欏湪BOM缁撴瀯涓彲鑳芥槸鐙珛鑺傜偣锛坧arent_id 涓虹┖锛夛紝鎵�浠ヨ繖閲屼笉闄愬埗灞傜骇锛屽彧鐪嬪伐搴忔爣璁帮紱
+        // 鍙帓闄や笌璁㈠崟鎴愬搧鍚岃鏍肩殑鐗╂枡锛堟垚鍝佹湰韬棤闇�棰嗘枡锛夈��
+        List<ProductionBomStructureVo> markedPickStructureList = bomStructureList.stream()
+                .filter(s -> s != null && Boolean.TRUE.equals(s.getIsPick()))
                 .filter(s -> s.getProductModelId() == null || !finishedProductModelIds.contains(s.getProductModelId()))
                 .collect(Collectors.toList());
 
+        // 瀹為檯棰嗘枡椤癸細浼樺厛浣跨敤宸ュ簭棰嗘枡鏍囪锛�
+        // 鍏煎鍘嗗彶鏁版嵁锛氬綋璇ヨ鍗旴OM缁撴瀯閲屾病鏈変换浣曞伐搴忔爣璁伴鏂欐椂锛屽洖閫�涓哄師鏉ョ殑鈥滃彾瀛愯妭鐐归鏂欌�濊鍒欙紝
+        // 閬垮厤灏氭湭鍚敤鈥滄槸鍚﹂鏂欌�濇爣璁扮殑瀹㈡埛鎵撳紑棰嗘枡鍙拌处鏃舵暟鎹獊鐒朵负绌恒��
+        List<ProductionBomStructureVo> childStructureList = markedPickStructureList;
+        if (childStructureList.isEmpty()) {
+            childStructureList = bomStructureList.stream()
+                    .filter(s -> s != null && s.getParentId() != null && s.getParentId() != 0)
+                    .filter(s -> s.getId() == null || !parentNodeIds.contains(s.getId()))
+                    .filter(s -> s.getProductModelId() == null || !finishedProductModelIds.contains(s.getProductModelId()))
+                    .collect(Collectors.toList());
+        }
+
         // 閬嶅巻澶勭悊鏁版嵁骞剁粍瑁呯粨鏋�
         List<Long> productModelIds = childStructureList.stream()
                 .map(ProductionBomStructureVo::getProductModelId)
diff --git a/src/main/java/com/ruoyi/technology/pojo/TechnologyOperation.java b/src/main/java/com/ruoyi/technology/pojo/TechnologyOperation.java
index 1915946..61a0f03 100644
--- a/src/main/java/com/ruoyi/technology/pojo/TechnologyOperation.java
+++ b/src/main/java/com/ruoyi/technology/pojo/TechnologyOperation.java
@@ -65,4 +65,7 @@
 
     @Schema(description = "鏄惁鐢熶骇")
     private Boolean isProduction;
+
+    @Schema(description = "鏄惁棰嗘枡 鏍囪璇ュ伐搴忔槸鍚﹂渶瑕侀鏂�")
+    private Boolean isPick;
 }
diff --git a/src/main/resources/mapper/production/ProductionBomStructureMapper.xml b/src/main/resources/mapper/production/ProductionBomStructureMapper.xml
index c116f6f..4923b88 100644
--- a/src/main/resources/mapper/production/ProductionBomStructureMapper.xml
+++ b/src/main/resources/mapper/production/ProductionBomStructureMapper.xml
@@ -9,6 +9,7 @@
         <result column="production_order_id" property="productionOrderId" />
         <result column="product_model_id" property="productModelId" />
         <result column="technology_operation_id" property="technologyOperationId" />
+        <result column="is_pick" property="isPick" />
         <result column="production_order_bom_id" property="productionOrderBomId" />
         <result column="unit_quantity" property="unitQuantity" />
         <result column="demanded_quantity" property="demandedQuantity" />
diff --git a/src/main/resources/mapper/technology/TechnologyOperationMapper.xml b/src/main/resources/mapper/technology/TechnologyOperationMapper.xml
index f6adc74..d50ccd4 100644
--- a/src/main/resources/mapper/technology/TechnologyOperationMapper.xml
+++ b/src/main/resources/mapper/technology/TechnologyOperationMapper.xml
@@ -12,6 +12,8 @@
         <result column="remark" property="remark" />
         <result column="salary_quota" property="salaryQuota" />
         <result column="is_quality" property="isQuality" />
+        <result column="is_production" property="isProduction" />
+        <result column="is_pick" property="isPick" />
         <result column="type" property="type" />
         <result column="device_ledger_id" property="deviceLedgerId" />
         <result column="create_user" property="createUser" />

--
Gitblit v1.9.3