From 569df4daf76eb586f1add62707d0ffa2b7ff20f2 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期五, 04 九月 2026 13:11:05 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_business' into dev_business

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java                         |    9 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/dto/MesWmTransactionSaveReqDTO.java                          |   15 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderBomService.java                                |    9 +
 yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/unit/MdmUnitMeasureController.java                                 |   22 +-
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java                             |    3 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java                                                        |    1 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderBomServiceImpl.java                            |    5 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessSaveReqVO.java              |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java                         |   10 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeServiceImpl.java                             |    7 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueLineMapper.java                          |    5 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineService.java                             |    9 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineRespVO.java             |    3 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnissue/MesWmReturnIssueLineMapper.java                            |    5 
 workbench-current-state.png                                                                                                                    |    0 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java                                      |   10 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java                                      |   11 +
 yudao-server/src/main/resources/application-local.yaml                                                                                         |    2 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java                                |   10 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueLineDO.java                           |    7 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueService.java                               |   10 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueMapper.java                              |    8 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLineReturnableRespVO.java |   39 ++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineSaveReqVO.java          |    3 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java                                 |   11 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineService.java                           |    9 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java                                    |   14 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java                           |    5 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueLineController.java               |   10 +
 yudao-server/src/main/resources/application-yzfx.yaml                                                                                          |   27 ---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderBomController.java                    |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java                                      |   17 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java                             |   18 ++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java                       |   97 +++++++++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/MesWmTransactionServiceImpl.java                             |   16 +
 35 files changed, 361 insertions(+), 78 deletions(-)

diff --git a/workbench-current-state.png b/workbench-current-state.png
new file mode 100644
index 0000000..87bb2b2
--- /dev/null
+++ b/workbench-current-state.png
Binary files differ
diff --git a/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/unit/MdmUnitMeasureController.java b/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/unit/MdmUnitMeasureController.java
index 2f5ec2c..fded63a 100644
--- a/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/unit/MdmUnitMeasureController.java
+++ b/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/unit/MdmUnitMeasureController.java
@@ -46,14 +46,14 @@
 
     @PostMapping("/create")
     @Operation(summary = "鍒涘缓璁¢噺鍗曚綅")
-    @PreAuthorize("@ss.hasPermission('mdm:unit-measure:create')")
+    @PreAuthorize("@ss.hasPermission('mdm:unit:create')")
     public CommonResult<Long> createUnitMeasure(@Valid @RequestBody MdmUnitMeasureSaveReqVO createReqVO) {
         return success(unitMeasureService.createUnitMeasure(createReqVO));
     }
 
     @PutMapping("/update")
     @Operation(summary = "鏇存柊璁¢噺鍗曚綅")
-    @PreAuthorize("@ss.hasPermission('mdm:unit-measure:update')")
+    @PreAuthorize("@ss.hasPermission('mdm:unit:update')")
     public CommonResult<Boolean> updateUnitMeasure(@Valid @RequestBody MdmUnitMeasureSaveReqVO updateReqVO) {
         unitMeasureService.updateUnitMeasure(updateReqVO);
         return success(true);
@@ -63,7 +63,7 @@
     @Operation(summary = "鏇存柊璁¢噺鍗曚綅鐘舵��")
     @Parameter(name = "id", description = "缂栧彿", required = true, example = "1")
     @Parameter(name = "status", description = "鐘舵��", required = true, example = "0")
-    @PreAuthorize("@ss.hasPermission('mdm:unit-measure:update')")
+    @PreAuthorize("@ss.hasPermission('mdm:unit:update')")
     public CommonResult<Boolean> updateUnitMeasureStatus(@RequestParam("id") Long id, @RequestParam("status") Integer status) {
         unitMeasureService.updateUnitMeasureStatus(id, status);
         return success(true);
@@ -72,7 +72,7 @@
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎璁¢噺鍗曚綅")
     @Parameter(name = "id", description = "缂栧彿", required = true, example = "1")
-    @PreAuthorize("@ss.hasPermission('mdm:unit-measure:delete')")
+    @PreAuthorize("@ss.hasPermission('mdm:unit:delete')")
     public CommonResult<Boolean> deleteUnitMeasure(@RequestParam("id") Long id) {
         unitMeasureService.deleteUnitMeasure(id);
         return success(true);
@@ -81,21 +81,21 @@
     @GetMapping("/get")
     @Operation(summary = "鑾峰緱璁¢噺鍗曚綅")
     @Parameter(name = "id", description = "缂栧彿", required = true, example = "1")
-    @PreAuthorize("@ss.hasPermission('mdm:unit-measure:query')")
+    @PreAuthorize("@ss.hasPermission('mdm:unit:query')")
     public CommonResult<MdmUnitMeasureDO> getUnitMeasure(@RequestParam("id") Long id) {
         return success(unitMeasureService.getUnitMeasure(id));
     }
 
     @GetMapping("/page")
     @Operation(summary = "鑾峰緱璁¢噺鍗曚綅鍒嗛〉")
-    @PreAuthorize("@ss.hasPermission('mdm:unit-measure:query')")
+    @PreAuthorize("@ss.hasPermission('mdm:unit:query')")
     public CommonResult<PageResult<MdmUnitMeasureDO>> getUnitMeasurePage(@Valid MdmUnitMeasurePageReqVO pageReqVO) {
         return success(unitMeasureService.getUnitMeasurePage(pageReqVO));
     }
 
     @GetMapping("/list")
     @Operation(summary = "鑾峰緱璁¢噺鍗曚綅鍒楄〃")
-    @PreAuthorize("@ss.hasPermission('mdm:unit-measure:query')")
+    @PreAuthorize("@ss.hasPermission('mdm:unit:query')")
     public CommonResult<List<MdmUnitMeasureDO>> getUnitMeasureList() {
         return success(unitMeasureService.getUnitMeasureList(null));
     }
@@ -103,14 +103,14 @@
     @GetMapping("/list-by-ids")
     @Operation(summary = "鑾峰緱璁¢噺鍗曚綅鍒楄〃")
     @Parameter(name = "ids", description = "缂栧彿鍒楄〃", required = true, example = "1,2,3")
-    @PreAuthorize("@ss.hasPermission('mdm:unit-measure:query')")
+    @PreAuthorize("@ss.hasPermission('mdm:unit:query')")
     public CommonResult<List<MdmUnitMeasureDO>> getUnitMeasureListByIds(@RequestParam("ids") List<Long> ids) {
         return success(unitMeasureService.getUnitMeasureList(ids));
     }
 
     @GetMapping("/export-excel")
     @Operation(summary = "瀵煎嚭璁¢噺鍗曚綅 Excel")
-    @PreAuthorize("@ss.hasPermission('mdm:unit-measure:export')")
+    @PreAuthorize("@ss.hasPermission('mdm:unit:export')")
     @ApiAccessLog(operateType = EXPORT)
     public void exportUnitMeasureExcel(@Valid MdmUnitMeasurePageReqVO pageReqVO,
                                        HttpServletResponse response) throws IOException {
@@ -138,7 +138,7 @@
 
     @GetMapping("/get-import-template")
     @Operation(summary = "鑾峰緱瀵煎叆璁¢噺鍗曚綅妯℃澘")
-    @PreAuthorize("@ss.hasPermission('mdm:unit-measure:import')")
+    @PreAuthorize("@ss.hasPermission('mdm:unit:import')")
     public void importTemplate(HttpServletResponse response) throws IOException {
         List<MdmUnitMeasureImportExcelVO> list = Arrays.asList(
                 MdmUnitMeasureImportExcelVO.builder().code("PC").name("鐗�").primaryFlag(true).changeRate(new java.math.BigDecimal("1")).status(0).remark("绀轰緥锛氫富鍗曚綅").build(),
@@ -153,7 +153,7 @@
             @Parameter(name = "file", description = "Excel 鏂囦欢", required = true),
             @Parameter(name = "updateSupport", description = "鏄惁鏀寔鏇存柊锛岄粯璁や负 false", example = "true")
     })
-    @PreAuthorize("@ss.hasPermission('mdm:unit-measure:import')")
+    @PreAuthorize("@ss.hasPermission('mdm:unit:import')")
     public CommonResult<MdmUnitMeasureImportRespVO> importExcel(@RequestParam("file") MultipartFile file,
                                                                 @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception {
         List<MdmUnitMeasureImportExcelVO> list = ExcelUtils.read(file, MdmUnitMeasureImportExcelVO.class);
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessSaveReqVO.java
index 4df7990..2b6e861 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessSaveReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessSaveReqVO.java
@@ -17,15 +17,13 @@
     @NotNull(message = "宸ヨ壓璺嚎缂栧彿涓嶈兘涓虹┖")
     private Long routeId;
 
-    @Schema(description = "宸ュ簭缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotNull(message = "宸ュ簭缂栧彿涓嶈兘涓虹┖")
+    @Schema(description = "宸ュ簭缂栧彿", example = "1")
     private Long processId;
 
     @Schema(description = "宸ヨ壓鍙傛暟妯℃澘缂栧彿", example = "1")
     private Long paramTemplateId;
 
-    @Schema(description = "搴忓彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotNull(message = "搴忓彿涓嶈兘涓虹┖")
+    @Schema(description = "搴忓彿", example = "1")
     private Integer sort;
 
     @Schema(description = "涓庝笅涓�閬撳伐搴忓叧绯�", example = "0")
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderBomController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderBomController.java
index 2f2795d..5bc87c5 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderBomController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkOrderBomController.java
@@ -245,7 +245,9 @@
             }
             List<MesProWorkOrderBomDO> items = new ArrayList<>();
             for (MesProWorkOrderBomDO bom : bomList) {
-                if (bom.getProcessId().equals(process.getProcessId())) {
+                // 璺宠繃鏃犲伐搴忕紪鍙风殑鎶曟枡琛岋紙宸ュ崟 BOM 涓粎鎸夊伐搴忕淮鎶ゆ姇鏂欐槑缁嗭紝鏃犲伐搴忕殑琛屼笉鍙備笌灞曞紑锛�
+                // 涓� getProcessId 鍙兘涓� null锛岀洿鎺� equals 浼� NPE锛�
+                if (Objects.equals(bom.getProcessId(), process.getProcessId())) {
                     items.add(bom);
                 }
             }
@@ -263,7 +265,7 @@
         // 3. 浠ユ渶鍚庝竴閬撳伐搴忕殑鎶曟枡涓鸿捣鐐�
         Map<Long, BigDecimal> currentLayer = new LinkedHashMap<>();
         for (MesProWorkOrderBomDO bom : bomList) {
-            if (bom.getProcessId().equals(lastProcess.getProcessId())) {
+            if (Objects.equals(bom.getProcessId(), lastProcess.getProcessId())) {
                 currentLayer.merge(bom.getItemId(), bom.getQuantity(), BigDecimal::add);
             }
         }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java
index 469076d..d5d48f8 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java
@@ -2,6 +2,9 @@
 
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
 import cn.idev.excel.annotation.ExcelProperty;
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -26,7 +29,8 @@
     private String name;
 
     @Schema(description = "IPQC 妫�楠岀被鍨�", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @ExcelProperty("妫�楠岀被鍨�")
+    @ExcelProperty(value = "妫�楠岀被鍨�", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MES_IPQC_TYPE)
     private Integer type;
 
     @Schema(description = "妫�楠屾ā鏉� ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
@@ -89,9 +93,11 @@
     private String itemName;
 
     @Schema(description = "瑙勬牸鍨嬪彿", example = "100mm*50mm")
+    @ExcelProperty("瑙勬牸鍨嬪彿")
     private String itemSpecification;
 
     @Schema(description = "鍗曚綅鍚嶇О", example = "涓�")
+    @ExcelProperty("鍗曚綅")
     private String unitName;
 
     // ========== 鏁伴噺 ==========
@@ -143,7 +149,8 @@
     // ========== 妫�楠� ==========
 
     @Schema(description = "妫�娴嬬粨鏋�", example = "1")
-    @ExcelProperty("妫�娴嬬粨鏋�")
+    @ExcelProperty(value = "妫�娴嬬粨鏋�", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MES_QC_CHECK_RESULT)
     private Integer checkResult;
 
     @Schema(description = "妫�娴嬫棩鏈�")
@@ -158,7 +165,8 @@
     private String inspectorNickname;
 
     @Schema(description = "鐘舵��", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
-    @ExcelProperty("鐘舵��")
+    @ExcelProperty(value = "鐘舵��", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MES_ORDER_STATUS)
     private Integer status;
 
     @Schema(description = "澶囨敞", example = "澶囨敞")
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java
index 0c19e1c..5605641 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java
@@ -2,6 +2,9 @@
 
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
 import cn.idev.excel.annotation.ExcelProperty;
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -48,6 +51,7 @@
     private Long vendorId;
 
     @Schema(description = "渚涘簲鍟嗙畝绉�", example = "渚涘簲鍟咥")
+    @ExcelProperty("渚涘簲鍟嗙畝绉�")
     private String vendorNickname;
 
     @Schema(description = "渚涘簲鍟嗘壒娆″彿", example = "VB20250101")
@@ -114,7 +118,8 @@
     // ========== 妫�楠� ==========
 
     @Schema(description = "妫�娴嬬粨鏋�", example = "1")
-    @ExcelProperty("妫�娴嬬粨鏋�")
+    @ExcelProperty(value = "妫�娴嬬粨鏋�", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MES_QC_CHECK_RESULT)
     private Integer checkResult;
 
     @Schema(description = "鏉ユ枡鏃ユ湡")
@@ -133,7 +138,8 @@
     private String inspectorNickname;
 
     @Schema(description = "鐘舵��", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
-    @ExcelProperty("鐘舵��")
+    @ExcelProperty(value = "鐘舵��", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MES_ORDER_STATUS)
     private Integer status;
 
     @Schema(description = "澶囨敞", example = "澶囨敞")
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java
index 79d9bed..18f5e14 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java
@@ -2,6 +2,9 @@
 
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
 import cn.idev.excel.annotation.ExcelProperty;
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -69,9 +72,11 @@
     private String itemName;
 
     @Schema(description = "瑙勬牸鍨嬪彿", example = "100mm*50mm")
+    @ExcelProperty("瑙勬牸鍨嬪彿")
     private String itemSpecification;
 
     @Schema(description = "鍗曚綅鍚嶇О", example = "涓�")
+    @ExcelProperty("鍗曚綅")
     private String unitName;
 
     // ========== 鏁伴噺 ==========
@@ -121,7 +126,8 @@
     // ========== 妫�楠� ==========
 
     @Schema(description = "妫�娴嬬粨鏋�", example = "1")
-    @ExcelProperty("妫�娴嬬粨鏋�")
+    @ExcelProperty(value = "妫�娴嬬粨鏋�", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MES_QC_CHECK_RESULT)
     private Integer checkResult;
 
     @Schema(description = "鍑鸿揣鏃ユ湡")
@@ -140,7 +146,8 @@
     private String inspectorNickname;
 
     @Schema(description = "鐘舵��", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
-    @ExcelProperty("鐘舵��")
+    @ExcelProperty(value = "鐘舵��", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MES_ORDER_STATUS)
     private Integer status;
 
     @Schema(description = "澶囨敞", example = "澶囨敞")
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java
index d6cf184..d32c8b9 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java
@@ -2,6 +2,9 @@
 
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
 import cn.idev.excel.annotation.ExcelProperty;
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -31,6 +34,8 @@
     // ========== 鏉ユ簮鍗曟嵁 ==========
 
     @Schema(description = "鏉ユ簮鍗曟嵁绫诲瀷", example = "116")
+    @ExcelProperty(value = "鏉ユ簮鍗曟嵁绫诲瀷", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MES_QC_SOURCE_DOC_TYPE)
     private Integer sourceDocType;
 
     @Schema(description = "鏉ユ簮鍗曟嵁 ID", example = "200")
@@ -40,12 +45,14 @@
     private Long sourceLineId;
 
     @Schema(description = "鏉ユ簮鍗曟嵁缂栫爜", example = "RT20250101001")
+    @ExcelProperty("鏉ユ簮鍗曟嵁缂栫爜")
     private String sourceDocCode;
 
     // ========== 妫�楠岀被鍨� ==========
 
     @Schema(description = "妫�楠岀被鍨�", example = "1")
-    @ExcelProperty("妫�楠岀被鍨�")
+    @ExcelProperty(value = "妫�楠岀被鍨�", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MES_RQC_TYPE)
     private Integer type;
 
     // ========== 鐗╂枡 ==========
@@ -62,9 +69,11 @@
     private String itemName;
 
     @Schema(description = "瑙勬牸鍨嬪彿", example = "100mm*50mm")
+    @ExcelProperty("瑙勬牸鍨嬪彿")
     private String itemSpecification;
 
     @Schema(description = "鍗曚綅鍚嶇О", example = "涓�")
+    @ExcelProperty("鍗曚綅")
     private String unitName;
 
     @Schema(description = "鎵规鍙�", example = "BATCH001")
@@ -108,7 +117,8 @@
     // ========== 妫�楠� ==========
 
     @Schema(description = "妫�娴嬬粨鏋�", example = "1")
-    @ExcelProperty("妫�娴嬬粨鏋�")
+    @ExcelProperty(value = "妫�娴嬬粨鏋�", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MES_QC_CHECK_RESULT)
     private Integer checkResult;
 
     @Schema(description = "妫�娴嬫棩鏈�")
@@ -123,7 +133,8 @@
     private String inspectorNickname;
 
     @Schema(description = "鐘舵��", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
-    @ExcelProperty("鐘舵��")
+    @ExcelProperty(value = "鐘舵��", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MES_ORDER_STATUS)
     private Integer status;
 
     @Schema(description = "澶囨敞", example = "澶囨敞")
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueLineController.java
index 4547c0c..42a1e39 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueLineController.java
@@ -8,6 +8,7 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueBomItemRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLineRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLineReturnableRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLineSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
@@ -155,6 +156,15 @@
         return success(result);
     }
 
+    @GetMapping("/returnable-list")
+    @Operation(summary = "鑾峰緱棰嗘枡鍑哄簱鍗曞彲閫�鏂欒鍒楄〃",
+            description = "杩斿洖鎸囧畾宸ュ崟涓嬪凡瀹屾垚棰嗘枡鍗曠殑鍙��鏂欒锛屽彲閫�鏁伴噺 = 宸查鏁伴噺 - 宸查��鏁伴噺")
+    @Parameter(name = "workOrderId", description = "鐢熶骇宸ュ崟ID", required = true, example = "1")
+    @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:query')")
+    public CommonResult<List<MesWmProductIssueLineReturnableRespVO>> getReturnableList(@RequestParam("workOrderId") Long workOrderId) {
+        return success(issueLineService.getReturnableList(workOrderId));
+    }
+
     // ==================== 鎷兼帴 VO ====================
 
     private List<MesWmProductIssueLineRespVO> buildRespVOList(List<MesWmProductIssueLineDO> list) {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLineReturnableRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLineReturnableRespVO.java
new file mode 100644
index 0000000..7ddfa62
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLineReturnableRespVO.java
@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 棰嗘枡鍑哄簱鍗曡鍙��鍒楄〃 Response VO")
+@Data
+public class MesWmProductIssueLineReturnableRespVO {
+
+    @Schema(description = "棰嗘枡鍗曡ID", example = "1")
+    private Long id;
+
+    @Schema(description = "鐗╂枡ID", example = "1")
+    private Long itemId;
+
+    @Schema(description = "鐗╂枡缂栫爜", example = "M001")
+    private String itemCode;
+
+    @Schema(description = "鐗╂枡鍚嶇О", example = "閽㈡澘")
+    private String itemName;
+
+    @Schema(description = "瑙勬牸鍨嬪彿", example = "10mm*100mm")
+    private String specification;
+
+    @Schema(description = "璁¢噺鍗曚綅鍚嶇О", example = "鍗冨厠")
+    private String unitMeasureName;
+
+    @Schema(description = "鍙��鏁伴噺", example = "30.00")
+    private BigDecimal quantity;
+
+    @Schema(description = "鎵规ID", example = "1")
+    private Long batchId;
+
+    @Schema(description = "鎵规鍙�", example = "BATCH20260101001")
+    private String batchCode;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineRespVO.java
index 3962f79..de54ebf 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineRespVO.java
@@ -16,6 +16,9 @@
     @Schema(description = "閫�鏂欏崟 ID", example = "1")
     private Long issueId;
 
+    @Schema(description = "棰嗘枡鍗曡 ID", example = "1")
+    private Long issueLineId;
+
     @Schema(description = "鐢熶骇浠诲姟 ID", example = "1")
     private Long taskId;
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineSaveReqVO.java
index 197efe5..4a9f422 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineSaveReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/vo/line/MesWmReturnIssueLineSaveReqVO.java
@@ -18,6 +18,9 @@
     @NotNull(message = "閫�鏂欏崟 ID 涓嶈兘涓虹┖")
     private Long issueId;
 
+    @Schema(description = "棰嗘枡鍗曡 ID", example = "1")
+    private Long issueLineId;
+
     @Schema(description = "鐢熶骇浠诲姟 ID", example = "1")
     private Long taskId;
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueLineDO.java
index 11c07fa..9f986ba 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueLineDO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnissue/MesWmReturnIssueLineDO.java
@@ -39,6 +39,13 @@
      */
     private Long issueId;
     /**
+     * 棰嗘枡鍗曡 ID
+     *
+     * 鍏宠仈 {@link cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueLineDO#getId()}
+     * 鐢ㄤ簬杩借釜閫�鏂欐潵婧�
+     */
+    private Long issueLineId;
+    /**
      * 鐢熶骇浠诲姟 ID
      *
      * 鍏宠仈 {@link MesProTaskDO#getId()}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueLineMapper.java
index 1d3ae22..70e8993 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueLineMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueLineMapper.java
@@ -7,6 +7,7 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueLineDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -29,6 +30,10 @@
         return selectList(MesWmProductIssueLineDO::getIssueId, issueId);
     }
 
+    default List<MesWmProductIssueLineDO> selectListByIssueIds(Collection<Long> issueIds) {
+        return selectList(MesWmProductIssueLineDO::getIssueId, issueIds);
+    }
+
     default void deleteByIssueId(Long issueId) {
         delete(MesWmProductIssueLineDO::getIssueId, issueId);
     }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueMapper.java
index 7634eaf..9b72cd6 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueMapper.java
@@ -7,6 +7,8 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+
 /**
  * MES 棰嗘枡鍑哄簱鍗� Mapper
  */
@@ -29,4 +31,10 @@
         return selectOne(MesWmProductIssueDO::getCode, code);
     }
 
+    default List<MesWmProductIssueDO> selectListByWorkOrderIdAndStatus(Long workOrderId, Integer status) {
+        return selectList(new LambdaQueryWrapperX<MesWmProductIssueDO>()
+                .eq(MesWmProductIssueDO::getWorkOrderId, workOrderId)
+                .eq(MesWmProductIssueDO::getStatus, status));
+    }
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnissue/MesWmReturnIssueLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnissue/MesWmReturnIssueLineMapper.java
index 6e9397c..935d8fd 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnissue/MesWmReturnIssueLineMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnissue/MesWmReturnIssueLineMapper.java
@@ -10,6 +10,7 @@
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -31,6 +32,10 @@
         return selectList(MesWmReturnIssueLineDO::getIssueId, issueId);
     }
 
+    default List<MesWmReturnIssueLineDO> selectListByIssueLineIds(Collection<Long> issueLineIds) {
+        return selectList(MesWmReturnIssueLineDO::getIssueLineId, issueLineIds);
+    }
+
     default void deleteByIssueId(Long issueId) {
         delete(MesWmReturnIssueLineDO::getIssueId, issueId);
     }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java
index 0fd3d74..71b6607 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java
@@ -76,6 +76,7 @@
     String MES_DEFECT_LEVEL = "mes_defect_level"; // MES 缂洪櫡绛夌骇
     String MES_QC_TYPE = "mes_qc_type"; // MES 妫�娴嬬绫伙紙IQC/IPQC/OQC/RQC锛�
     String MES_IPQC_TYPE = "mes_ipqc_type"; // MES IPQC 妫�楠岀被鍨�
+    String MES_RQC_TYPE = "mes_rqc_type"; // MES 閫�璐ф楠岀被鍨�
     String MES_ORDER_STATUS = "mes_order_status"; // MES 鍗曟嵁鐘舵�侊紙IQC/IPQC/OQC/RQC 閫氱敤锛�
     String MES_QC_CHECK_RESULT = "mes_qc_check_result"; // MES 妫�娴嬬粨鏋�
     String MES_QC_SOURCE_DOC_TYPE = "mes_qc_source_doc_type"; // MES 鏉ユ簮鍗曟嵁绫诲瀷
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
index 016e10a..d3f2a0a 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
@@ -296,16 +296,17 @@
             throw exception(PRO_FEEDBACK_UNCHECK_QUANTITY_EXISTS, feedback.getUncheckQuantity());
         }
 
-        // 3. 鐗╂枡娑堣�楋細鍊掑啿宸ュ簭鎸� BOM 鑷姩鎵f枡锛涢潪鍊掑啿宸ュ簭璺宠繃锛堢墿鏂欒蛋鎵嬪伐棰嗘枡/鎶曟枡锛�
+        // 3. 鐗╂枡娑堣�楋細鍊掑啿宸ュ簭鎸夋湰宸ュ簭鎶曟枡 BOM 鑷姩鎵f枡锛涢潪鍊掑啿宸ュ簭璺宠繃锛堢墿鏂欒蛋鎵嬪伐棰嗘枡/鎶曟枡锛�
         boolean backflushFlag = routeProcess != null && Boolean.TRUE.equals(routeProcess.getBackflushFlag());
         if (backflushFlag) {
-            // 3.1 鏍¢獙鍊掑啿宸ュ簭蹇呴』閰嶇疆 BOM 娑堣�楋紝閬垮厤闈欓粯涓嶆墸鏂�
-            List<MesProWorkOrderBomDO> boms = workOrderBomService.getWorkOrderBomListByWorkOrderId(
-                    feedback.getWorkOrderId());
+            // 3.1 鏍¢獙鍊掑啿宸ュ簭蹇呴』閰嶇疆鏈伐搴忕殑鎶曟枡 BOM锛岄伩鍏嶉潤榛樹笉鎵f枡
+            //     锛堝彧鏍¢獙褰撳墠鎶ュ伐宸ュ簭鐨勬姇鏂欙紝鍏朵粬宸ュ簭鎶曟枡鐢卞悇鑷伐搴忔姤宸ユ椂鎵i櫎锛�
+            List<MesProWorkOrderBomDO> boms = workOrderBomService.getWorkOrderBomListByWorkOrderIdAndProcessId(
+                    feedback.getWorkOrderId(), feedback.getProcessId());
             if (CollUtil.isEmpty(boms)) {
                 throw exception(PRO_FEEDBACK_BACKFLUSH_BOM_REQUIRED);
             }
-            // 3.2 鐢熸垚娑堣�楄褰曞苟鎵ц鎵e噺锛圔OM 脳 鎶ュ伐鏁伴噺锛孎IFO 鎵g嚎杈瑰簱锛�
+            // 3.2 鐢熸垚娑堣�楄褰曞苟鎵ц鎵e噺锛堟湰宸ュ簭鎶曟枡鐢ㄩ噺姣斾緥 脳 鎶ュ伐鏁伴噺锛孎IFO 鎵g嚎杈瑰簱锛�
             MesWmItemConsumeDO itemConsume = itemConsumeService.generateItemConsume(feedback);
             if (itemConsume != null) {
                 itemConsumeService.finishItemConsume(itemConsume.getId());
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java
index f88d950..4957169 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java
@@ -81,8 +81,14 @@
     public void updateRouteProcess(MesProRouteProcessSaveReqVO updateReqVO) {
         // 1.0 宸插惎鐢ㄧ殑宸ヨ壓璺嚎锛屼笉鍏佽鎿嶄綔
         routeService.validateRouteNotEnable(updateReqVO.getRouteId());
-        // 1.1 鏍¢獙瀛樺湪
-        validateRouteProcessExists(updateReqVO.getId());
+        // 1.1 鏍¢獙瀛樺湪锛涢儴鍒嗘洿鏂帮紙濡備粎璋冩暣浜у嚭浜у搧锛夋椂鏈紶鐨勫繀濉瓧娈电敤鐜版湁鍊煎洖濉�
+        MesProRouteProcessDO existing = validateRouteProcessExists(updateReqVO.getId());
+        if (updateReqVO.getProcessId() == null) {
+            updateReqVO.setProcessId(existing.getProcessId());
+        }
+        if (updateReqVO.getSort() == null) {
+            updateReqVO.setSort(existing.getSort());
+        }
         // 1.2 鏍¢獙宸ヨ壓璺嚎銆佸伐搴忓瓨鍦�
         validateRouteAndProcessExists(updateReqVO.getRouteId(), updateReqVO.getProcessId());
         // 1.3 鏍¢獙鍞竴鎬�
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderBomService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderBomService.java
index d1e8201..8f4d87b 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderBomService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderBomService.java
@@ -63,6 +63,15 @@
     List<MesProWorkOrderBomDO> getWorkOrderBomListByWorkOrderId(Long workOrderId);
 
     /**
+     * 鏍规嵁宸ュ崟缂栧彿涓庡伐搴忕紪鍙疯幏寰� BOM 鍒楄〃锛堝�掑啿鎵f枡鎸夋姤宸ュ伐搴忕殑鎶曟枡鏄庣粏杩囨护锛�
+     *
+     * @param workOrderId 宸ュ崟缂栧彿
+     * @param processId   宸ュ簭缂栧彿
+     * @return BOM 鍒楄〃
+     */
+    List<MesProWorkOrderBomDO> getWorkOrderBomListByWorkOrderIdAndProcessId(Long workOrderId, Long processId);
+
+    /**
      * 鏍规嵁宸ュ崟缂栧彿鍒犻櫎 BOM
      *
      * @param workOrderId 宸ュ崟缂栧彿
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderBomServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderBomServiceImpl.java
index 464ee46..1dc45b3 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderBomServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderBomServiceImpl.java
@@ -116,6 +116,11 @@
     }
 
     @Override
+    public List<MesProWorkOrderBomDO> getWorkOrderBomListByWorkOrderIdAndProcessId(Long workOrderId, Long processId) {
+        return workOrderBomMapper.selectListByWorkOrderIdAndProcessId(workOrderId, processId);
+    }
+
+    @Override
     public void deleteWorkOrderBomByWorkOrderId(Long workOrderId) {
         workOrderBomMapper.deleteByWorkOrderId(workOrderId);
     }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeServiceImpl.java
index 51bf769..949b1f6 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeServiceImpl.java
@@ -78,9 +78,10 @@
         if (feedback.getWorkOrderId() == null) {
             throw exception(PRO_FEEDBACK_ROUTE_PROCESS_INVALID);
         }
-        // 1.2 鏌ヨ宸ュ崟 BOM 鐗╂枡鍒楄〃锛堝�掑啿鎸夊伐鍗曟姇鏂欙紝闈炲伐鑹鸿矾绾匡級
-        List<MesProWorkOrderBomDO> boms = workOrderBomService.getWorkOrderBomListByWorkOrderId(
-                feedback.getWorkOrderId());
+        // 1.2 鏌ヨ璇ュ�掑啿宸ュ簭鐨勬姇鏂� BOM 鍒楄〃锛堟寜鎶ュ伐宸ュ簭杩囨护锛屽彧鎵e綋鍓嶅伐搴忕殑鎶曟枡鏄庣粏锛�
+        //     閬垮厤鎶婂叾浠栧伐搴忕殑鎶曟枡涓�骞舵墸闄ゅ鑷村鎵g墿鏂欙級
+        List<MesProWorkOrderBomDO> boms = workOrderBomService.getWorkOrderBomListByWorkOrderIdAndProcessId(
+                feedback.getWorkOrderId(), feedback.getProcessId());
         if (CollUtil.isEmpty(boms)) {
             return null;
         }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java
index aead9ee..f58e2a5 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java
@@ -117,6 +117,24 @@
                                                   Long batchId, String batchCode, Long vendorId, LocalDateTime receiptTime);
 
     /**
+     * 鍒涘缓鏂扮殑搴撳瓨璁板綍锛堜笉鏌ユ壘宸叉湁璁板綍锛屽缁堝垱寤烘柊璁板綍锛�
+     *
+     * 鐢ㄤ簬閫�鏂欑瓑鍦烘櫙锛岄渶瑕佷负姣忔閫�鏂欏垱寤虹嫭绔嬬殑搴撳瓨璁板綍
+     *
+     * @param itemId      鐗╂枡缂栧彿
+     * @param warehouseId 浠撳簱缂栧彿
+     * @param locationId  搴撳尯缂栧彿
+     * @param areaId      搴撲綅缂栧彿
+     * @param batchId     鎵规缂栧彿
+     * @param batchCode   鎵规鍙�
+     * @param vendorId    渚涘簲鍟嗙紪鍙�
+     * @param receiptTime 鍏ュ簱鏃堕棿锛堜负绌哄垯榛樿褰撳墠鏃堕棿锛�
+     * @return 鏂板垱寤虹殑搴撳瓨璁板綍
+     */
+    MesWmMaterialStockDO createMaterialStock(Long itemId, Long warehouseId, Long locationId, Long areaId,
+                                              Long batchId, String batchCode, Long vendorId, LocalDateTime receiptTime);
+
+    /**
      * 鎸夌粍鍚堥敭鏌ユ壘搴撳瓨璁板綍锛堝彧鏌ヤ笉鍒涘缓锛�
      *
      * @param itemId      鐗╂枡缂栧彿
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
index 1aa86c9..4f368d9 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
@@ -203,6 +203,13 @@
         }
 
         // 2. 涓嶅瓨鍦ㄥ垯鏂板缓
+        return createMaterialStock(itemId, warehouseId, locationId, areaId, batchId, batchCode, vendorId, receiptTime);
+    }
+
+    @Override
+    public MesWmMaterialStockDO createMaterialStock(Long itemId, Long warehouseId, Long locationId, Long areaId,
+                                                     Long batchId, String batchCode, Long vendorId, LocalDateTime receiptTime) {
+        // 濮嬬粓鍒涘缓鏂板簱瀛樿褰�
         MesMdmItemDO item = mdmItemService.validateItemExists(itemId);
         MesWmMaterialStockDO newStock = MesWmMaterialStockDO.builder()
                 .itemId(itemId).itemTypeId(item.getCategoryId())
@@ -213,7 +220,7 @@
                 .frozen(false)
                 .build();
         materialStockMapper.insert(newStock);
-        // 3. 閲嶆柊鏌ヨ锛岀‘淇濇嬁鍒版暟鎹簱鐢熸垚鐨勫畬鏁磋褰曪紙id銆乧reateTime 绛夛級
+        // 閲嶆柊鏌ヨ锛岀‘淇濇嬁鍒版暟鎹簱鐢熸垚鐨勫畬鏁磋褰曪紙id銆乧reateTime 绛夛級
         MesWmMaterialStockDO inserted = materialStockMapper.selectById(newStock.getId());
         return inserted != null ? inserted : newStock;
     }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineService.java
index ab9b47d..27115c6 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineService.java
@@ -2,6 +2,7 @@
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLinePageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLineReturnableRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLineSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueLineDO;
 import jakarta.validation.Valid;
@@ -74,4 +75,12 @@
      */
     MesWmProductIssueLineDO validateProductIssueLineExists(Long id);
 
+    /**
+     * 鑾峰彇鎸囧畾宸ュ崟涓嬪凡瀹屾垚棰嗘枡鍗曠殑鍙��鏂欒鍒楄〃
+     *
+     * @param workOrderId 鐢熶骇宸ュ崟ID
+     * @return 鍙��鏂欒鍒楄〃锛堝彲閫�鏁伴噺 > 0锛�
+     */
+    List<MesWmProductIssueLineReturnableRespVO> getReturnableList(Long workOrderId);
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java
index 4ed4684..6b5141b 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java
@@ -2,25 +2,41 @@
 
 import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
+import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLinePageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLineRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLineReturnableRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLineSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueLineDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.productissue.MesWmProductIssueLineMapper;
-import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
+import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductIssueStatusEnum;
+import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService;
+import cn.iocoder.yudao.module.mes.service.wm.productissue.MesWmProductIssueDetailService;
+import cn.iocoder.yudao.module.mes.service.wm.productissue.MesWmProductIssueLineService;
+import cn.iocoder.yudao.module.mes.service.wm.productissue.MesWmProductIssueService;
+import cn.iocoder.yudao.module.mes.service.wm.returnissue.MesWmReturnIssueLineService;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCT_ISSUE_LINE_ITEM_NOT_IN_BOM;
-import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCT_ISSUE_LINE_NOT_EXISTS;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
 
 /**
  * MES 棰嗘枡鍑哄簱鍗曡 Service 瀹炵幇绫�
@@ -36,12 +52,17 @@
     @Lazy
     private MesWmProductIssueService issueService;
     @Resource
-    private MesMdmItemService mdmItemService;
+    private MesMdItemService mdmItemService;
     @Resource
-    private MesProWorkOrderBomService workOrderBomService;
+    @Lazy
+    private MesWmReturnIssueLineService returnIssueLineService;
+    @Resource
+    private MesMdUnitMeasureService unitMeasureService;
     @Resource
     @Lazy
     private MesWmProductIssueDetailService issueDetailService;
+    @Resource
+    private MesProWorkOrderBomService workOrderBomService;
 
     @Override
     public Long createProductIssueLine(MesWmProductIssueLineSaveReqVO createReqVO) {
@@ -114,7 +135,7 @@
         // 鏍¢獙鐗╂枡鍦ㄥ伐鍗� BOM 涓�
         validateItemInWorkOrderBom(reqVO.getIssueId(), reqVO.getItemId());
         // 鏍¢獙鐗╂枡瀛樺湪
-        mdmItemService.mesValidateItemExists(reqVO.getItemId());
+        mdmItemService.validateItemExists(reqVO.getItemId());
     }
 
     private void validateItemInWorkOrderBom(Long issueId, Long itemId) {
@@ -132,4 +153,68 @@
         }
     }
 
+    @Override
+    public List<MesWmProductIssueLineReturnableRespVO> getReturnableList(Long workOrderId) {
+        // 1. 鏌ヨ璇ュ伐鍗曚笅宸插畬鎴愮殑棰嗘枡鍗�
+        List<MesWmProductIssueDO> finishedIssues = issueService.getFinishedIssuesByWorkOrderId(workOrderId);
+        if (CollUtil.isEmpty(finishedIssues)) {
+            return Collections.emptyList();
+        }
+
+        // 2. 鑾峰彇杩欎簺棰嗘枡鍗曠殑鎵�鏈夎
+        List<Long> issueIds = CollectionUtils.convertList(finishedIssues, MesWmProductIssueDO::getId);
+        List<MesWmProductIssueLineDO> lines = issueLineMapper.selectListByIssueIds(issueIds);
+        if (CollUtil.isEmpty(lines)) {
+            return Collections.emptyList();
+        }
+
+        // 3. 鎵归噺鏌ヨ宸查��鏁伴噺锛堟寜 issueLineId 姹囨�伙級
+        List<Long> lineIds = CollectionUtils.convertList(lines, MesWmProductIssueLineDO::getId);
+        List<MesWmReturnIssueLineDO> returnLines = returnIssueLineService.getReturnIssueLineListByIssueLineIds(lineIds);
+        // 鎸� issueLineId 姹囨�婚��鏂欐暟閲�
+        Map<Long, BigDecimal> returnedQtyMap = new java.util.HashMap<>();
+        for (MesWmReturnIssueLineDO returnLine : returnLines) {
+            if (returnLine.getIssueLineId() != null && returnLine.getQuantity() != null) {
+                returnedQtyMap.merge(returnLine.getIssueLineId(), returnLine.getQuantity(), BigDecimal::add);
+            }
+        }
+
+        // 4. 鎵归噺鏌ヨ鐗╂枡鍜屽崟浣嶄俊鎭�
+        Map<Long, MesMdItemDO> itemMap = mdmItemService.getItemMap(
+                CollectionUtils.convertSet(lines, MesWmProductIssueLineDO::getItemId));
+        Map<Long, MesMdUnitMeasureDO> unitMap = unitMeasureService.getUnitMeasureMap(
+                CollectionUtils.convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+
+        // 5. 缁勮缁撴灉锛岃繃婊ゅ彲閫�鏁伴噺 > 0 鐨勮
+        List<MesWmProductIssueLineReturnableRespVO> result = new ArrayList<>();
+        for (MesWmProductIssueLineDO line : lines) {
+            BigDecimal issuedQty = line.getQuantity() != null ? line.getQuantity() : BigDecimal.ZERO;
+            BigDecimal returnedQty = returnedQtyMap.getOrDefault(line.getId(), BigDecimal.ZERO);
+            BigDecimal returnableQty = issuedQty.subtract(returnedQty);
+
+            if (returnableQty.compareTo(BigDecimal.ZERO) > 0) {
+                MesWmProductIssueLineReturnableRespVO vo = new MesWmProductIssueLineReturnableRespVO();
+                vo.setId(line.getId());
+                vo.setItemId(line.getItemId());
+                vo.setBatchId(line.getBatchId());
+                vo.setQuantity(returnableQty);
+
+                // 濉厖鐗╂枡淇℃伅
+                MesMdItemDO item = itemMap.get(line.getItemId());
+                if (item != null) {
+                    vo.setItemCode(item.getCode());
+                    vo.setItemName(item.getName());
+                    vo.setSpecification(item.getSpecification());
+                    // 濉厖鍗曚綅淇℃伅
+                    MesMdUnitMeasureDO unit = unitMap.get(item.getUnitMeasureId());
+                    vo.setUnitMeasureName(unit != null ? unit.getName() : null);
+                }
+
+                result.add(vo);
+            }
+        }
+
+        return result;
+    }
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueService.java
index 3ed9ecb..719ac56 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueService.java
@@ -6,6 +6,8 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDO;
 import jakarta.validation.Valid;
 
+import java.util.List;
+
 /**
  * MES 棰嗘枡鍑哄簱鍗� Service 鎺ュ彛
  */
@@ -101,4 +103,12 @@
      */
     Boolean checkProductIssueQuantity(Long id);
 
+    /**
+     * 鑾峰彇鎸囧畾宸ュ崟涓嬪凡瀹屾垚鐨勯鏂欏崟鍒楄〃
+     *
+     * @param workOrderId 鐢熶骇宸ュ崟ID
+     * @return 宸插畬鎴愮殑棰嗘枡鍗曞垪琛�
+     */
+    List<MesWmProductIssueDO> getFinishedIssuesByWorkOrderId(Long workOrderId);
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java
index ee24926..3164436 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java
@@ -410,4 +410,9 @@
         }
     }
 
+    @Override
+    public List<MesWmProductIssueDO> getFinishedIssuesByWorkOrderId(Long workOrderId) {
+        return issueMapper.selectListByWorkOrderIdAndStatus(workOrderId, MesWmProductIssueStatusEnum.FINISHED.getStatus());
+    }
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineService.java
index 3657104..f7f175e 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineService.java
@@ -8,6 +8,7 @@
 import jakarta.validation.Valid;
 
 import java.math.BigDecimal;
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -104,4 +105,12 @@
     void updateReturnIssueLineWhenRqcFinish(Long sourceLineId, Long sourceDocId, Integer checkResult,
                                             BigDecimal qualifiedQuantity, BigDecimal unqualifiedQuantity);
 
+    /**
+     * 鏍规嵁棰嗘枡鍗曡ID鍒楄〃鑾峰彇閫�鏂欏崟琛屽垪琛�
+     *
+     * @param issueLineIds 棰嗘枡鍗曡ID鍒楄〃
+     * @return 閫�鏂欏崟琛屽垪琛�
+     */
+    List<MesWmReturnIssueLineDO> getReturnIssueLineListByIssueLineIds(Collection<Long> issueLineIds);
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java
index 8d1d856..4d93f66 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java
@@ -20,6 +20,8 @@
 import org.springframework.validation.annotation.Validated;
 
 import java.math.BigDecimal;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 
@@ -205,4 +207,12 @@
         }
     }
 
+    @Override
+    public List<MesWmReturnIssueLineDO> getReturnIssueLineListByIssueLineIds(Collection<Long> issueLineIds) {
+        if (CollUtil.isEmpty(issueLineIds)) {
+            return Collections.emptyList();
+        }
+        return issueLineMapper.selectListByIssueLineIds(issueLineIds);
+    }
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java
index c84bcc0..a00a8fd 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java
@@ -268,12 +268,13 @@
                 }
             }
 
-            // 2.3 鍏ヤ笂鏋剁洰鏍囦粨搴擄紙搴撳瓨澧炲姞锛�
+            // 2.3 鍏ヤ笂鏋剁洰鏍囦粨搴擄紙搴撳瓨澧炲姞锛夆�� 濮嬬粓鍒涘缓鏂扮殑搴撳瓨璁板綍锛屼笉鏇存柊宸叉湁璁板綍
             wmTransactionService.createTransaction(new MesWmTransactionSaveReqDTO()
                     .setType(MesWmTransactionTypeEnum.IN.getType()).setItemId(detail.getItemId())
                     .setQuantity(detail.getQuantity()) // 搴撳瓨澧炲姞锛堥��鏂欏洖浠擄級
                     .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode())
                     .setWarehouseId(targetWarehouseId).setLocationId(targetLocationId).setAreaId(targetAreaId)
+                    .setForceCreateNewStock(true) // 寮哄埗鍒涘缓鏂板簱瀛樿褰�
                     .setBizType(MesBizTypeConstants.WM_RETURN_ISSUE).setBizId(issue.getId())
                     .setBizCode(issue.getCode()).setBizLineId(detail.getLineId())
                     .setRelatedTransactionId(outTransactionId)); // 鍏宠仈鍑哄簱浜嬪姟
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/MesWmTransactionServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/MesWmTransactionServiceImpl.java
index 031dc5d..775a75e 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/MesWmTransactionServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/MesWmTransactionServiceImpl.java
@@ -81,6 +81,8 @@
         MesWmMaterialStockDO materialStock;
         MesWmTransactionTypeEnum transactionType = MesWmTransactionTypeEnum.valueOf(reqDTO.getType());
         boolean isInbound = transactionType != null && transactionType.isInbound();
+        boolean forceCreateNewStock = Boolean.TRUE.equals(reqDTO.getForceCreateNewStock());
+
         if (reqDTO.getMaterialStockId() != null) {
             // 浼犲叆浜� materialStockId锛岀洿鎺ヤ娇鐢�
             materialStock = materialStockService.getMaterialStock(reqDTO.getMaterialStockId());
@@ -95,10 +97,16 @@
                 throw exception(WM_MATERIAL_STOCK_SELECTION_MISMATCH);
             }
         } else if (isInbound) {
-            // 鍏ュ簱浜嬪姟锛氭壘涓嶅埌鍒欒嚜鍔ㄥ垱寤哄簱瀛樿褰�
-            materialStock = materialStockService.getOrCreateMaterialStock(
-                    reqDTO.getItemId(), reqDTO.getWarehouseId(), reqDTO.getLocationId(), reqDTO.getAreaId(),
-                    reqDTO.getBatchId(), reqDTO.getBatchCode(), reqDTO.getVendorId(), reqDTO.getReceiptTime());
+            // 鍏ュ簱浜嬪姟锛氭牴鎹� forceCreateNewStock 鏍囧織鍐冲畾鏄垱寤烘柊璁板綍杩樻槸鏌ユ壘/鍒涘缓
+            if (forceCreateNewStock) {
+                materialStock = materialStockService.createMaterialStock(
+                        reqDTO.getItemId(), reqDTO.getWarehouseId(), reqDTO.getLocationId(), reqDTO.getAreaId(),
+                        reqDTO.getBatchId(), reqDTO.getBatchCode(), reqDTO.getVendorId(), reqDTO.getReceiptTime());
+            } else {
+                materialStock = materialStockService.getOrCreateMaterialStock(
+                        reqDTO.getItemId(), reqDTO.getWarehouseId(), reqDTO.getLocationId(), reqDTO.getAreaId(),
+                        reqDTO.getBatchId(), reqDTO.getBatchCode(), reqDTO.getVendorId(), reqDTO.getReceiptTime());
+            }
         } else {
             // 鍑哄簱浜嬪姟锛氬簱瀛樿褰曞繀椤诲凡瀛樺湪锛屼笉鍏佽鑷姩鍒涘缓锛堥櫎闈� checkFlag=false 鍏佽璐熷簱瀛橈級
             materialStock = materialStockService.getMaterialStockByCompositeKey(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/dto/MesWmTransactionSaveReqDTO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/dto/MesWmTransactionSaveReqDTO.java
index d0ae46a..62e95c8 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/dto/MesWmTransactionSaveReqDTO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/dto/MesWmTransactionSaveReqDTO.java
@@ -107,14 +107,23 @@
     private Long materialStockId;
 
     /**
-     * 鍏宠仈浜嬪姟 ID锛堟垚瀵逛簨鍔′腑锛屽叆搴撲簨鍔″叧鑱斿嚭搴撲簨鍔★級
+     * 鍏宠仈浜嬪姟 ID
      */
     private Long relatedTransactionId;
 
-    // ===== 鍙�夋帶鍒讹紙闈炲瓨鍌ㄥ瓧娈碉級 =====
+    /**
+     * 鏄惁寮哄埗鍒涘缓鏂板簱瀛樿褰曪紙浠呭叆搴撲簨鍔℃湁鏁堬級
+     *
+     * 涓� true 鏃讹紝鍏ュ簱浜嬪姟濮嬬粓鍒涘缓鏂扮殑搴撳瓨璁板綍锛屼笉鏌ユ壘宸叉湁璁板綍
+     * 鐢ㄤ簬閫�鏂欑瓑鍦烘櫙锛岄渶瑕佷负姣忔閫�鏂欏垱寤虹嫭绔嬬殑搴撳瓨璁板綍
+     */
+    private Boolean forceCreateNewStock;
 
     /**
-     * 鏄惁鏍¢獙搴撳瓨鍏呰冻锛堥粯璁� true锛涚嚎杈瑰簱娑堣�楃瓑鍦烘櫙璁� false 鍏佽璐熷簱瀛橈級
+     * 鏄惁鏍¢獙搴撳瓨鍏呰冻锛堜粎鍑哄簱浜嬪姟鏈夋晥锛�
+     *
+     * 涓� true锛堥粯璁わ級鏃讹紝鍑哄簱鏁伴噺涓嶈兘瓒呰繃鐜版湁搴撳瓨
+     * 涓� false 鏃讹紝鍏佽璐熷簱瀛橈紙濡傝櫄鎷熺嚎杈瑰簱鍦烘櫙锛�
      */
     private Boolean checkFlag;
 
diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml
index 45e498f..c169c66 100644
--- a/yudao-server/src/main/resources/application-local.yaml
+++ b/yudao-server/src/main/resources/application-local.yaml
@@ -74,7 +74,7 @@
     redis:
       host: localhost # 鍦板潃
       port: 6379 # 绔彛
-      database: 0 # 鏁版嵁搴撶储寮�
+      database: 5 # 鏁版嵁搴撶储寮�
 #      password: # 瀵嗙爜锛屽缓璁敓浜х幆澧冨紑鍚�
 
 --- #################### 瀹氭椂浠诲姟鐩稿叧閰嶇疆 ####################
diff --git a/yudao-server/src/main/resources/application-yzfx.yaml b/yudao-server/src/main/resources/application-yzfx.yaml
index a9c5d64..dffb1bd 100644
--- a/yudao-server/src/main/resources/application-yzfx.yaml
+++ b/yudao-server/src/main/resources/application-yzfx.yaml
@@ -65,33 +65,10 @@
       primary: master
       datasource:
         master:
-          url: jdbc:mysql://172.17.0.1:9002/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 杩炴帴鐨勭ず渚�
-          #          url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 杩炴帴鐨勭ず渚�
-          #          url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 杩炴帴鐨勭ず渚�
-          #          url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 杩炴帴鐨勭ず渚�
-          #          url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true;useUnicode=true;characterEncoding=utf-8 # SQLServer 杩炴帴鐨勭ず渚�
-          #          url: jdbc:dm://127.0.0.1:5236?schema=RUOYI_VUE_PRO # DM 杩炴帴鐨勭ず渚�
-          #          url: jdbc:kingbase8://127.0.0.1:54321/test  # 浜哄ぇ閲戜粨 KingbaseES 杩炴帴鐨勭ず渚�
-          #          url: jdbc:postgresql://127.0.0.1:5432/postgres # OpenGauss 杩炴帴鐨勭ず渚�
-          #          url: jdbc:postgresql://127.0.0.1:5866/ruoyi-vue-pro # 鐎氶珮 HighGo 杩炴帴鐨勭ず渚�
+#          url: jdbc:mysql://172.17.0.1:9002/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 杩炴帴鐨勭ず渚�
+          url: jdbc:mysql://42.63.70.231:9002/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 杩炴帴鐨勭ず渚�
           username: root
           password: yzfx@123456..
-          #          username: sa # SQL Server 杩炴帴鐨勭ず渚�
-          #          password: Yudao@2024 # SQL Server 杩炴帴鐨勭ず渚�
-          #          username: SYSDBA # DM 杩炴帴鐨勭ず渚�
-          #          password: SYSDBA001 # DM 杩炴帴鐨勭ず渚�
-          #          username: root # OpenGauss 杩炴帴鐨勭ず渚�
-          #          password: Yudao@2024 # OpenGauss 杩炴帴鐨勭ず渚�
-          #          username: root # 鐎氶珮 HighGo 杩炴帴鐨勭ず渚�
-          #          password: 123456 # 鐎氶珮 HighGo 杩炴帴鐨勭ず渚�
-#        tdengine: # IoT 鏁版嵁搴擄紙闇�瑕� IoT 鐗╄仈缃戝啀寮�鍚櫌锛侊級
-#          lazy: true # 寮�鍚噿鍔犺浇锛屼繚璇佸惎鍔ㄩ�熷害
-#          url: jdbc:TAOS-WS://127.0.0.1:6041/ruoyi_vue_pro?varcharAsString=true&enableAutoReconnect=true # 鍙傝锛歨ttps://t.zsxq.com/qaX9c锛屽紑鍚� TDengine WebSocket 鑷姩閲嶈繛
-#          driver-class-name: com.taosdata.jdbc.ws.WebSocketDriver
-#          username: root
-#          password: taosdata
-#          druid:
-#            validation-query: SELECT SERVER_STATUS() # TDengine 鏁版嵁婧愮殑鏈夋晥鎬ф鏌� SQL
 
   # Redis 閰嶇疆銆俁edisson 榛樿鐨勯厤缃冻澶熶娇鐢紝涓�鑸笉闇�瑕佽繘琛岃皟浼�
   data:

--
Gitblit v1.9.3