From 5d314130e6f21bd265388b5210808baeba5f2d0c Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期一, 23 三月 2026 17:57:14 +0800
Subject: [PATCH] feat: 生产报工的工序参数/BOM消耗产品查询返回、新增报工、分页查询

---
 src/main/java/com/ruoyi/production/service/impl/ProductionProductRouteItemFileServiceImpl.java  |   59 ++
 src/main/java/com/ruoyi/production/dto/ProductionRecordDto.java                                 |   51 ++
 src/main/java/com/ruoyi/production/mapper/ProductionProductRouteItemParamMapper.java            |   16 
 src/main/java/com/ruoyi/production/service/impl/ProductionRecordServiceImpl.java                |  348 +++++++++++++++
 src/main/java/com/ruoyi/production/vo/ProductionOrderRouteItemParamVo.java                      |   51 ++
 src/main/java/com/ruoyi/other/controller/TempFileController.java                                |    7 
 src/main/java/com/ruoyi/production/controller/ProductionRecordController.java                   |   48 ++
 src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemParam.java                    |  100 ++++
 src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemFileDto.java                   |   19 
 src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemFile.java                     |   68 ++
 src/main/java/com/ruoyi/production/service/IProductionProductRouteItemParamService.java         |   16 
 src/main/resources/mapper/production/ProductionProductRouteItemParamMapper.xml                  |   29 +
 src/main/java/com/ruoyi/production/service/IProductionProductRouteItemService.java              |   16 
 src/main/java/com/ruoyi/production/mapper/ProductionProductRouteItemFileMapper.java             |   16 
 src/main/java/com/ruoyi/production/vo/ProductionOrderStructureVo.java                           |   43 +
 src/main/java/com/ruoyi/production/controller/ProductionProductRouteItemFileController.java     |   37 +
 src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemParamDto.java                  |   19 
 src/main/resources/mapper/production/ProductionProductRouteItemMapper.xml                       |   18 
 src/main/java/com/ruoyi/production/service/impl/ProductionProductRouteItemParamServiceImpl.java |   20 
 src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java                            |    4 
 src/main/java/com/ruoyi/production/service/ProductionRecordService.java                         |   21 
 src/main/java/com/ruoyi/production/vo/ProductionOrderRouteItemVo.java                           |   31 +
 src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java                             |    2 
 src/main/resources/mapper/production/ProductionProductRouteItemFileMapper.xml                   |   19 
 src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java                            |   13 
 src/main/java/com/ruoyi/production/service/impl/ProductionProductRouteItemServiceImpl.java      |   20 
 src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItem.java                         |   65 ++
 src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java                              |   13 
 src/main/resources/mapper/production/ProductionProductMainMapper.xml                            |   65 +-
 src/main/java/com/ruoyi/production/controller/ProductionProductRouteItemController.java         |   20 
 src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemDto.java                       |   29 +
 src/main/java/com/ruoyi/production/vo/ProductionRecordVo.java                                   |   31 +
 src/main/java/com/ruoyi/production/service/IProductionProductRouteItemFileService.java          |   17 
 src/main/java/com/ruoyi/production/controller/ProductionProductRouteItemParamController.java    |   20 
 src/main/java/com/ruoyi/production/mapper/ProductionProductRouteItemMapper.java                 |   16 
 35 files changed, 1,322 insertions(+), 45 deletions(-)

diff --git a/src/main/java/com/ruoyi/other/controller/TempFileController.java b/src/main/java/com/ruoyi/other/controller/TempFileController.java
index 1175eb0..7160272 100644
--- a/src/main/java/com/ruoyi/other/controller/TempFileController.java
+++ b/src/main/java/com/ruoyi/other/controller/TempFileController.java
@@ -8,10 +8,7 @@
 import com.ruoyi.purchase.service.ITicketRegistrationService;
 import com.ruoyi.purchase.service.impl.TicketRegistrationServiceImpl;
 import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 
@@ -25,7 +22,7 @@
     private TicketRegistrationServiceImpl ticketRegistrationServiceImpl;
 
     @PostMapping("/upload")
-    public AjaxResult uploadFile(MultipartFile file, Integer type) {
+    public AjaxResult uploadFile(MultipartFile file, @RequestParam(required = false) Integer type) {
         try {
             return AjaxResult.success(tempFileService.uploadFile(file, type));
         } catch (Exception e) {
diff --git a/src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java b/src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java
index b8e0e2a..11e94e6 100644
--- a/src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java
+++ b/src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java
@@ -165,7 +165,7 @@
         }
     }
 
-//    @Scheduled(cron = "0 0 3 * * ?") // 姣忓ぉ鍑屾櫒3鐐规墽琛�
+    @Scheduled(cron = "0 0 3 * * ?") // 姣忓ぉ鍑屾櫒3鐐规墽琛�
     public void cleanupExpiredTempFiles() {
         LambdaQueryWrapper<TempFile> wrapper = new LambdaQueryWrapper<>();
         wrapper.lt(TempFile::getExpireTime, LocalDateTime.now()); // expireTime < 褰撳墠鏃堕棿
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionProductRouteItemController.java b/src/main/java/com/ruoyi/production/controller/ProductionProductRouteItemController.java
new file mode 100644
index 0000000..979f033
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/controller/ProductionProductRouteItemController.java
@@ -0,0 +1,20 @@
+package com.ruoyi.production.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忚〃(鍖呭惈宀椾綅浜哄憳+璁惧寮傚父澶勭疆+宸ヨ壓浜哄憳浜ゅ緟) 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-23
+ */
+@RestController
+@RequestMapping("/production-product-route-item")
+public class ProductionProductRouteItemController {
+
+}
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionProductRouteItemFileController.java b/src/main/java/com/ruoyi/production/controller/ProductionProductRouteItemFileController.java
new file mode 100644
index 0000000..6cbbdd3
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/controller/ProductionProductRouteItemFileController.java
@@ -0,0 +1,37 @@
+package com.ruoyi.production.controller;
+
+
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.production.service.IProductionProductRouteItemFileService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忛檮浠惰〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-23
+ */
+@RestController
+@RequestMapping("/productionProductRouteItemFile")
+public class ProductionProductRouteItemFileController {
+
+    @Autowired
+    private IProductionProductRouteItemFileService productionProductRouteItemFileService;
+
+
+    @DeleteMapping("/{fileId}")
+    @ApiOperation("鐢熶骇鎶ュ伐-鍒犻櫎闄勪欢")
+    public AjaxResult deleteFile(@PathVariable Long fileId) {
+        productionProductRouteItemFileService.deleteFile(fileId);
+        return AjaxResult.success();
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionProductRouteItemParamController.java b/src/main/java/com/ruoyi/production/controller/ProductionProductRouteItemParamController.java
new file mode 100644
index 0000000..63e991f
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/controller/ProductionProductRouteItemParamController.java
@@ -0,0 +1,20 @@
+package com.ruoyi.production.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 鐢熶骇鎶ュ伐璁板綍宸ュ簭鐨勫弬鏁版槑缁嗚〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-23
+ */
+@RestController
+@RequestMapping("/production-product-route-item-param")
+public class ProductionProductRouteItemParamController {
+
+}
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionRecordController.java b/src/main/java/com/ruoyi/production/controller/ProductionRecordController.java
new file mode 100644
index 0000000..dd77ee0
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/controller/ProductionRecordController.java
@@ -0,0 +1,48 @@
+package com.ruoyi.production.controller;
+
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.production.dto.ProductionRecordDto;
+import com.ruoyi.production.service.ProductionRecordService;
+import com.ruoyi.production.vo.ProductionRecordVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <br>
+ * 鐢熶骇鎶ュ伐璁板綍鎺у埗灞�
+ * </br>
+ *
+ * @author deslrey
+ * @since 2026/03/23
+ */
+@RestController
+@RequestMapping("/productionRecord")
+@ApiModel(value = "ProductionRecordController", description = "鐢熶骇鎶ュ伐璁板綍鎺у埗灞�")
+public class ProductionRecordController {
+
+    @Autowired
+    private ProductionRecordService productionRecordService;
+
+
+    @GetMapping("/add/{productOrderId}")
+    @ApiOperation("鐢熶骇鎶ュ伐-鏍规嵁鐢熶骇璁㈠崟ID鑾峰彇宸ヨ壓璺嚎鐨勫伐搴忋�丅OM")
+    public AjaxResult productRouteItem(@PathVariable Long productOrderId) {
+        ProductionRecordVo vo = productionRecordService.productRouteItem(productOrderId);
+        return AjaxResult.success(vo);
+    }
+
+
+    @PostMapping("/add")
+    @ApiOperation("鐢熶骇鎶ュ伐-鏂板")
+    public AjaxResult addProductionRecordService(@RequestBody ProductionRecordDto dto) {
+        productionRecordService.addProductionRecordService(dto);
+        return AjaxResult.success();
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java b/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
index 9e5e121..0ee4fe9 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
@@ -6,13 +6,14 @@
 import com.ruoyi.production.pojo.ProductionProductMain;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
-import java.time.LocalDateTime;
 
 @Data
+@EqualsAndHashCode(callSuper = true)
 @ExcelIgnoreUnannotated
 public class ProductionProductMainDto extends ProductionProductMain {
     @ApiModelProperty(value = "宸ュ崟缂栧彿")
@@ -61,5 +62,15 @@
     private BigDecimal workHours;
     private BigDecimal wages;
 
+    @ApiModelProperty(value = "鐢熶骇璁㈠崟鍙�")
+    @Excel(name = "鐢熶骇璁㈠崟鍙�")
+    private String npsNo;
 
+    @ApiModelProperty(value = "浜у搧缂栫爜")
+    @Excel(name = "浜у搧缂栫爜")
+    private String materialCode;
+
+    @ApiModelProperty(value = "浜у嚭鏂归噺")
+    @Excel(name = "浜у嚭鏂归噺")
+    private BigDecimal totalQuantity;
 }
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemDto.java b/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemDto.java
new file mode 100644
index 0000000..10dc1b7
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemDto.java
@@ -0,0 +1,29 @@
+package com.ruoyi.production.dto;
+
+import com.ruoyi.production.pojo.ProductionProductRouteItem;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * <br>
+ * 鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忚〃(鍖呭惈宀椾綅浜哄憳+璁惧寮傚父澶勭疆+宸ヨ壓浜哄憳浜ゅ緟)Dto
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/23 11:01
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ProductionProductRouteItemDto extends ProductionProductRouteItem {
+
+    @ApiModelProperty("宸ュ簭缁戝畾鐨勫弬鏁颁俊鎭�")
+    private List<ProductionProductRouteItemParamDto> productionProductRouteItemParamDtoList;
+
+    @ApiModelProperty("宸ュ簭涓存椂闄勪欢ID")
+    private List<String> files;
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemFileDto.java b/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemFileDto.java
new file mode 100644
index 0000000..f0d8de3
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemFileDto.java
@@ -0,0 +1,19 @@
+package com.ruoyi.production.dto;
+
+import com.ruoyi.production.pojo.ProductionProductRouteItemFile;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <br>
+ * 鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忛檮浠惰〃Dto
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/23 11:01
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ProductionProductRouteItemFileDto extends ProductionProductRouteItemFile {
+}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemParamDto.java b/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemParamDto.java
new file mode 100644
index 0000000..0070d90
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/ProductionProductRouteItemParamDto.java
@@ -0,0 +1,19 @@
+package com.ruoyi.production.dto;
+
+import com.ruoyi.production.pojo.ProductionProductRouteItemParam;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <br>
+ * 鐢熶骇鎶ュ伐璁板綍宸ュ簭鐨勫弬鏁版槑缁嗚〃Dto
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/23 11:01
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ProductionProductRouteItemParamDto extends ProductionProductRouteItemParam {
+}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionRecordDto.java b/src/main/java/com/ruoyi/production/dto/ProductionRecordDto.java
new file mode 100644
index 0000000..dd3d900
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/ProductionRecordDto.java
@@ -0,0 +1,51 @@
+package com.ruoyi.production.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <br>
+ * 鐢熶骇鎶ュ伐璁板綍Dto
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/23 10:30
+ */
+@Data
+@ApiModel(value = "ProductionRecordDto", description = "鐢熶骇鎶ュ伐璁板綍Dto")
+public class ProductionRecordDto {
+
+    @ApiModelProperty("鐢熶骇璁㈠崟ID")
+    private Long productOrderId;
+
+    @ApiModelProperty("浜у搧ID")
+    private Long productId;
+
+    @ApiModelProperty(value = "宀椾綅浜哄憳")
+    private String postName;
+
+    @ApiModelProperty(value = "鐝")
+    private String schedule;
+
+    @ApiModelProperty(value = "鐝鏃ユ湡")
+    private LocalDateTime reportingTime;
+
+    @ApiModelProperty("鍚堟牸鏁伴噺")
+    private BigDecimal qualifiedQuantity;
+
+    @ApiModelProperty("涓嶅悎鏍兼暟閲�")
+    private BigDecimal unqualifiedQuantity;
+
+    @ApiModelProperty("浜у嚭鏁伴噺")
+    private BigDecimal quantity;
+
+    @ApiModelProperty("宸ヨ壓璺嚎缁戝畾鐨勫伐搴�")
+    private List<ProductionProductRouteItemDto> productionProductRouteItemDtoList;
+
+}
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductionProductRouteItemFileMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductionProductRouteItemFileMapper.java
new file mode 100644
index 0000000..8fc1b49
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/mapper/ProductionProductRouteItemFileMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.production.mapper;
+
+import com.ruoyi.production.pojo.ProductionProductRouteItemFile;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忛檮浠惰〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-23
+ */
+public interface ProductionProductRouteItemFileMapper extends BaseMapper<ProductionProductRouteItemFile> {
+
+}
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductionProductRouteItemMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductionProductRouteItemMapper.java
new file mode 100644
index 0000000..389e54a
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/mapper/ProductionProductRouteItemMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.production.mapper;
+
+import com.ruoyi.production.pojo.ProductionProductRouteItem;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忚〃(鍖呭惈宀椾綅浜哄憳+璁惧寮傚父澶勭疆+宸ヨ壓浜哄憳浜ゅ緟) Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-23
+ */
+public interface ProductionProductRouteItemMapper extends BaseMapper<ProductionProductRouteItem> {
+
+}
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductionProductRouteItemParamMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductionProductRouteItemParamMapper.java
new file mode 100644
index 0000000..7fe92f4
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/mapper/ProductionProductRouteItemParamMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.production.mapper;
+
+import com.ruoyi.production.pojo.ProductionProductRouteItemParam;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 鐢熶骇鎶ュ伐璁板綍宸ュ簭鐨勫弬鏁版槑缁嗚〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-23
+ */
+public interface ProductionProductRouteItemParamMapper extends BaseMapper<ProductionProductRouteItemParam> {
+
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
index d385f37..2761bc8 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
@@ -33,7 +33,6 @@
     private Long workOrderId;
 
     @ApiModelProperty(value = "鐢熶骇璁㈠崟id")
-    @TableField(exist = false)
     private Long productOrderId;
 
     @ApiModelProperty(value = "鎶ュ伐鐘舵��")
@@ -55,4 +54,16 @@
     @ApiModelProperty(value = "绉熸埛ID")
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
+
+    @ApiModelProperty(value = "宀椾綅浜哄憳")
+    private String postName;
+
+    @ApiModelProperty(value = "鐝")
+    private String schedule;
+
+    @ApiModelProperty(value = "鐝鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime reportingTime;
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java
index f78df35..17e7612 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java
@@ -20,7 +20,7 @@
     @ApiModelProperty(value = "浜у搧id")
     private Long productModelId;
 
-    @ApiModelProperty(value = "鎶ュ伐鏁伴噺(鎬绘暟閲�)")
+    @ApiModelProperty(value = "鍚堟牸鏁伴噺")
     private BigDecimal quantity;
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
@@ -31,6 +31,6 @@
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
 
-    @ApiModelProperty(value = "鎶ュ簾鏁伴噺")
+    @ApiModelProperty(value = "涓嶅悎鏍兼暟閲�")
     private BigDecimal scrapQty;
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItem.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItem.java
new file mode 100644
index 0000000..fab108a
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItem.java
@@ -0,0 +1,65 @@
+package com.ruoyi.production.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忚〃(鍖呭惈宀椾綅浜哄憳+璁惧寮傚父澶勭疆+宸ヨ壓浜哄憳浜ゅ緟)
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("production_product_route_item")
+@ApiModel(value = "ProductionProductRouteItem瀵硅薄", description = "鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忚〃(鍖呭惈宀椾綅浜哄憳+璁惧寮傚父澶勭疆+宸ヨ壓浜哄憳浜ゅ緟)")
+public class ProductionProductRouteItem implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "涓婚敭ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "鎶ュ伐涓昏〃ID")
+    private Long productMainId;
+
+    @ApiModelProperty(value = "宀椾綅浜哄憳")
+    private String postName;
+
+    @ApiModelProperty(value = "璁惧寮傚父")
+    private String equipmentMalfunction;
+
+    @ApiModelProperty(value = "璁惧澶勭疆")
+    private String equipmentDisposal;
+
+    @ApiModelProperty(value = "宸ヨ壓浜哄憳浜や唬")
+    private String processExplained;
+
+    @ApiModelProperty(value = "宸ュ簭ID")
+    private Long processId;
+
+    @ApiModelProperty(value = "鍒涘缓鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "鏇存柊鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "绉熸埛ID")
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemFile.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemFile.java
new file mode 100644
index 0000000..26df9ee
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemFile.java
@@ -0,0 +1,68 @@
+package com.ruoyi.production.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忛檮浠惰〃
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("production_product_route_item_file")
+@ApiModel(value="ProductionProductRouteItemFile瀵硅薄", description="鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忛檮浠惰〃")
+public class ProductionProductRouteItemFile implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "涓婚敭ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忚〃ID")
+    private Long productionProductRouteItemId;
+
+    @ApiModelProperty(value = "鏂囦欢鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty(value = "鏂囦欢璁块棶鍦板潃")
+    private String fileUrl;
+
+    @ApiModelProperty(value = "鏂囦欢澶у皬")
+    private Long fileSize;
+
+    @ApiModelProperty(value = "鏂囦欢鍚庣紑")
+    private String fileSuffix;
+
+    @ApiModelProperty(value = "涓婁紶鑰�")
+    private String createUser;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "淇敼鑰�")
+    private LocalDateTime updateUser;
+
+    @ApiModelProperty(value = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "绉熸埛ID")
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemParam.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemParam.java
new file mode 100644
index 0000000..938c9d2
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductRouteItemParam.java
@@ -0,0 +1,100 @@
+package com.ruoyi.production.pojo;
+
+import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 鐢熶骇鎶ュ伐璁板綍宸ュ簭鐨勫弬鏁版槑缁嗚〃
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("production_product_route_item_param")
+@ApiModel(value = "ProductionProductRouteItemParam瀵硅薄", description = "鐢熶骇鎶ュ伐璁板綍宸ュ簭鐨勫弬鏁版槑缁嗚〃")
+public class ProductionProductRouteItemParam implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "涓婚敭ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忚〃ID")
+    private Long productionProductRouteItemId;
+
+    @ApiModelProperty(value = "鍙傛暟鍚嶇О")
+    private String paramName;
+
+    @ApiModelProperty(value = "鍙傛暟绫诲瀷(1鏁板瓧 2鏂囨湰 3涓嬫媺閫夋嫨 4鏃堕棿)")
+    private Integer paramType;
+
+    @ApiModelProperty(value = "鍙傛暟鏍煎紡")
+    private String paramFormat;
+
+    @ApiModelProperty(value = "鍊兼ā寮�(1鍗曞�� 2鍖洪棿)")
+    private Integer valueMode;
+
+    @ApiModelProperty(value = "鏍囧噯鍊�")
+    private String standardValue;
+
+    @ApiModelProperty(value = "鏈�灏忓��")
+    private BigDecimal minValue;
+
+    @ApiModelProperty(value = "鏈�澶у��")
+    private BigDecimal maxValue;
+
+    @ApiModelProperty(value = "浜у搧ID")
+    private Long productId;
+
+    @ApiModelProperty(value = "浜у搧鎶曞叆鍊�")
+    private BigDecimal productValue;
+
+    @ApiModelProperty(value = "BOM ID")
+    private BigDecimal bomId;
+
+    @ApiModelProperty(value = "鍗曚綅")
+    private String unit;
+
+    @ApiModelProperty(value = "鏄惁蹇呭~(0鍚� 1鏄�)")
+    private Boolean isRequired;
+
+    @ApiModelProperty(value = "鍙傛暟鎺掑簭")
+    private Integer sourceSort;
+
+    @ApiModelProperty(value = "浜у搧绫诲瀷")
+    private Long dictCode;
+
+    @ApiModelProperty(value = "涓婁紶鑰�")
+    private Long createUser;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "淇敼鑰�")
+    private Long updateUser;
+
+    @ApiModelProperty(value = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "绉熸埛ID")
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+}
diff --git a/src/main/java/com/ruoyi/production/service/IProductionProductRouteItemFileService.java b/src/main/java/com/ruoyi/production/service/IProductionProductRouteItemFileService.java
new file mode 100644
index 0000000..6b8fb5b
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/IProductionProductRouteItemFileService.java
@@ -0,0 +1,17 @@
+package com.ruoyi.production.service;
+
+import com.ruoyi.production.pojo.ProductionProductRouteItemFile;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忛檮浠惰〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-23
+ */
+public interface IProductionProductRouteItemFileService extends IService<ProductionProductRouteItemFile> {
+
+    void deleteFile(Long fileId);
+}
diff --git a/src/main/java/com/ruoyi/production/service/IProductionProductRouteItemParamService.java b/src/main/java/com/ruoyi/production/service/IProductionProductRouteItemParamService.java
new file mode 100644
index 0000000..c11851c
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/IProductionProductRouteItemParamService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.production.service;
+
+import com.ruoyi.production.pojo.ProductionProductRouteItemParam;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 鐢熶骇鎶ュ伐璁板綍宸ュ簭鐨勫弬鏁版槑缁嗚〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-23
+ */
+public interface IProductionProductRouteItemParamService extends IService<ProductionProductRouteItemParam> {
+
+}
diff --git a/src/main/java/com/ruoyi/production/service/IProductionProductRouteItemService.java b/src/main/java/com/ruoyi/production/service/IProductionProductRouteItemService.java
new file mode 100644
index 0000000..0627076
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/IProductionProductRouteItemService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.production.service;
+
+import com.ruoyi.production.pojo.ProductionProductRouteItem;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忚〃(鍖呭惈宀椾綅浜哄憳+璁惧寮傚父澶勭疆+宸ヨ壓浜哄憳浜ゅ緟) 鏈嶅姟绫�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-23
+ */
+public interface IProductionProductRouteItemService extends IService<ProductionProductRouteItem> {
+
+}
diff --git a/src/main/java/com/ruoyi/production/service/ProductionRecordService.java b/src/main/java/com/ruoyi/production/service/ProductionRecordService.java
new file mode 100644
index 0000000..0e520af
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/ProductionRecordService.java
@@ -0,0 +1,21 @@
+package com.ruoyi.production.service;
+
+import com.ruoyi.production.dto.ProductionRecordDto;
+import com.ruoyi.production.vo.ProductionRecordVo;
+
+/**
+ * <br>
+ * 鐢熶骇鎶ュ伐璁板綍Service
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/23 10:22
+ */
+public interface ProductionRecordService {
+
+    ProductionRecordVo productRouteItem(Long productOrderId);
+
+    void addProductionRecordService(ProductionRecordDto dto);
+
+}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductRouteItemFileServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductRouteItemFileServiceImpl.java
new file mode 100644
index 0000000..515187f
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductRouteItemFileServiceImpl.java
@@ -0,0 +1,59 @@
+package com.ruoyi.production.service.impl;
+
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.production.pojo.ProductionProductRouteItemFile;
+import com.ruoyi.production.mapper.ProductionProductRouteItemFileMapper;
+import com.ruoyi.production.service.IProductionProductRouteItemFileService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.nio.file.Files;
+
+/**
+ * <p>
+ * 鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忛檮浠惰〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-23
+ */
+@Slf4j
+@Service
+public class ProductionProductRouteItemFileServiceImpl extends ServiceImpl<ProductionProductRouteItemFileMapper, ProductionProductRouteItemFile> implements IProductionProductRouteItemFileService {
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteFile(Long fileId) {
+        if (fileId == null) {
+            throw new ServiceException("闄勪欢鍒犻櫎澶辫触,鏁版嵁涓嶈兘涓虹┖");
+        }
+        ProductionProductRouteItemFile productionProductRouteItemFile = baseMapper.selectById(fileId);
+        if (productionProductRouteItemFile == null) {
+            throw new ServiceException("闄勪欢鍒犻櫎澶辫触,闄勪欢涓嶅瓨鍦�");
+        }
+
+        String fileUrl = productionProductRouteItemFile.getFileUrl();
+        if (fileUrl != null) {
+            try {
+                java.nio.file.Path path = java.nio.file.Paths.get(fileUrl);
+
+                if (Files.exists(path)) {
+                    Files.delete(path);
+                } else {
+                    log.warn("鏂囦欢涓嶅瓨鍦紝鏃犻渶鍒犻櫎: {}", fileUrl);
+                }
+
+            } catch (Exception e) {
+                log.error("鍒犻櫎鏂囦欢澶辫触: {}", fileUrl, e);
+                throw new ServiceException("闄勪欢鍒犻櫎澶辫触,鐗╃悊鏂囦欢鍒犻櫎寮傚父");
+            }
+        }
+        int result = baseMapper.deleteById(fileId);
+        if (result == 0) {
+            throw new ServiceException("闄勪欢鍒犻櫎澶辫触,鏁版嵁搴撳垹闄ゅけ璐�");
+        }
+    }
+}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductRouteItemParamServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductRouteItemParamServiceImpl.java
new file mode 100644
index 0000000..7c5cc88
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductRouteItemParamServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.production.service.impl;
+
+import com.ruoyi.production.pojo.ProductionProductRouteItemParam;
+import com.ruoyi.production.mapper.ProductionProductRouteItemParamMapper;
+import com.ruoyi.production.service.IProductionProductRouteItemParamService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 鐢熶骇鎶ュ伐璁板綍宸ュ簭鐨勫弬鏁版槑缁嗚〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-23
+ */
+@Service
+public class ProductionProductRouteItemParamServiceImpl extends ServiceImpl<ProductionProductRouteItemParamMapper, ProductionProductRouteItemParam> implements IProductionProductRouteItemParamService {
+
+}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductRouteItemServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductRouteItemServiceImpl.java
new file mode 100644
index 0000000..5d15063
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductRouteItemServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.production.service.impl;
+
+import com.ruoyi.production.pojo.ProductionProductRouteItem;
+import com.ruoyi.production.mapper.ProductionProductRouteItemMapper;
+import com.ruoyi.production.service.IProductionProductRouteItemService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 鐢熶骇鎶ュ伐璁板綍鐨勫伐搴忚〃(鍖呭惈宀椾綅浜哄憳+璁惧寮傚父澶勭疆+宸ヨ壓浜哄憳浜ゅ緟) 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author deslrey
+ * @since 2026-03-23
+ */
+@Service
+public class ProductionProductRouteItemServiceImpl extends ServiceImpl<ProductionProductRouteItemMapper, ProductionProductRouteItem> implements IProductionProductRouteItemService {
+
+}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionRecordServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionRecordServiceImpl.java
new file mode 100644
index 0000000..45d43d1
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionRecordServiceImpl.java
@@ -0,0 +1,348 @@
+package com.ruoyi.production.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.other.mapper.TempFileMapper;
+import com.ruoyi.other.pojo.TempFile;
+import com.ruoyi.production.dto.ProductionProductRouteItemDto;
+import com.ruoyi.production.dto.ProductionProductRouteItemParamDto;
+import com.ruoyi.production.dto.ProductionRecordDto;
+import com.ruoyi.production.enums.ProductOrderStatusEnum;
+import com.ruoyi.production.pojo.*;
+import com.ruoyi.production.service.*;
+import com.ruoyi.production.vo.ProductionOrderRouteItemParamVo;
+import com.ruoyi.production.vo.ProductionOrderRouteItemVo;
+import com.ruoyi.production.vo.ProductionOrderStructureVo;
+import com.ruoyi.production.vo.ProductionRecordVo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+/**
+ * <br>
+ * 鐢熶骇鎶ュ伐璁板綍Service瀹炵幇绫�
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/23 10:23
+ */
+@Slf4j
+@Service
+public class ProductionRecordServiceImpl implements ProductionRecordService {
+
+    @Value("${file.upload-dir}")
+    private String uploadDir;
+
+    @Autowired
+    private ProductionProductMainService productionProductMainService;
+
+    @Autowired
+    private ProductionProductInputService productionProductInputService;
+
+    @Autowired
+    private ProductionProductOutputService productionProductOutputService;
+
+    @Autowired
+    private IProductionProductRouteItemService productionProductRouteItemService;
+
+    @Autowired
+    private IProductionProductRouteItemParamService productionProductRouteItemParamService;
+
+    @Autowired
+    private IProductionProductRouteItemFileService productionProductRouteItemFileService;
+
+    @Autowired
+    private ProductOrderService productOrderService;
+
+    @Autowired
+    private IProductionOrderRouteItemService productionOrderRouteItemService;
+
+    @Autowired
+    private IProductionOrderRouteItemParamService productionOrderRouteItemParamService;
+
+    @Autowired
+    private IProductionOrderStructureService productionOrderStructureService;
+
+    @Autowired
+    private ProductProcessService productProcessService;
+
+    @Autowired
+    private ProductMaterialSkuService productMaterialSkuService;
+
+    @Autowired
+    private ProductMaterialService productMaterialService;
+
+    @Autowired
+    private TempFileMapper tempFileMapper;
+
+    @Override
+    public ProductionRecordVo productRouteItem(Long productOrderId) {
+        if (productOrderId == null) {
+            throw new ServiceException("璇烽�夋嫨鐢熶骇璁㈠崟鍐嶆柊澧炴姤宸�");
+        }
+
+        //  鏌ヨ鍑虹敓浜ц鍗曠粦瀹氱殑宸ヨ壓璺嚎
+        ProductOrder productOrder = productOrderService.getById(productOrderId);
+        if (productOrder == null) {
+            throw new ServiceException("鏈煡璇㈠埌璇ョ敓浜ц鍗曠殑淇℃伅");
+        }
+        //  閫氳繃宸ヨ壓璺嚎鏌ヨ鍑虹粦瀹氱殑宸ュ簭鍙婂弬鏁�
+        List<ProductionOrderRouteItem> productionOrderRouteItemList = productionOrderRouteItemService.list(new LambdaQueryWrapper<ProductionOrderRouteItem>()
+                .eq(ProductionOrderRouteItem::getOrderId, productOrderId)
+                .eq(ProductionOrderRouteItem::getRouteId, productOrder.getRouteId()));
+
+        if (productionOrderRouteItemList == null || productionOrderRouteItemList.isEmpty()) {
+            throw new ServiceException("璇ョ敓浜ц鍗曠粦瀹氱殑宸ヨ壓璺嚎鏃犲伐搴�");
+        }
+
+        ProductionRecordVo productionRecordVo = new ProductionRecordVo();
+        productionRecordVo.setProductOrderId(productOrderId);
+        productionRecordVo.setProductRouteId(productOrder.getRouteId());
+
+        List<ProductionOrderRouteItemVo> productionOrderRouteItemVoList = new ArrayList<>();
+
+        //  鏍规嵁缁戝畾鐨勫伐搴忔煡璇㈠嚭宸ュ簭鍙傛暟鍙夿OM闇�瑕佹秷鑰楃殑浜у搧
+        for (ProductionOrderRouteItem orderRouteItem : productionOrderRouteItemList) {
+            ProductionOrderRouteItemVo productionOrderRouteItemVo = new ProductionOrderRouteItemVo();
+            productionOrderRouteItemVo.setProcessId(orderRouteItem.getProcessId());
+
+            if (orderRouteItem.getProcessId() != null) {
+                ProductProcess process = productProcessService.getById(orderRouteItem.getProcessId());
+                if (process != null) {
+                    productionOrderRouteItemVo.setProcessName(process.getName());
+                }
+            }
+
+            List<ProductionOrderRouteItemParam> orderRouteItemParamList = productionOrderRouteItemParamService.list(new LambdaQueryWrapper<ProductionOrderRouteItemParam>()
+                    .eq(ProductionOrderRouteItemParam::getOrderId, productOrderId)
+                    .eq(ProductionOrderRouteItemParam::getRouteItemId, orderRouteItem.getId()));
+
+            if (orderRouteItemParamList != null && !orderRouteItemParamList.isEmpty()) {
+                List<ProductionOrderRouteItemParamVo> paraVoList = orderRouteItemParamList.stream().map(param -> {
+                    ProductionOrderRouteItemParamVo paraVo = new ProductionOrderRouteItemParamVo();
+                    BeanUtils.copyProperties(param, paraVo);
+                    paraVo.setParamFormat(DateUtils.toUpperCasePattern(paraVo.getParamFormat()));
+                    return paraVo;
+                }).collect(Collectors.toList());
+                productionOrderRouteItemVo.setOrderRouteItemParaVos(paraVoList);
+            }
+
+            List<ProductionOrderStructure> orderStructureList = productionOrderStructureService.list(new LambdaQueryWrapper<ProductionOrderStructure>()
+                    .eq(ProductionOrderStructure::getOrderId, productOrderId)
+                    .eq(ProductionOrderStructure::getProcessId, orderRouteItem.getProcessId()));
+
+            if (orderStructureList != null && !orderStructureList.isEmpty()) {
+                List<ProductionOrderStructureVo> structureVoList = orderStructureList.stream().map(struct -> {
+                    ProductionOrderStructureVo structureVo = new ProductionOrderStructureVo();
+                    BeanUtils.copyProperties(struct, structureVo);
+                    //  鏌ヨ鍑轰骇鍝佺殑鍚嶇О/妯″瀷
+                    ProductMaterialSku productMaterialSku = productMaterialSkuService.getById(structureVo.getProductModelId());
+                    ProductMaterial productMaterial = productMaterialService.getById(productMaterialSku.getProductId());
+                    structureVo.setProductName(productMaterial.getProductName());
+                    structureVo.setModel(productMaterialSku.getModel());
+                    return structureVo;
+                }).collect(Collectors.toList());
+                productionOrderRouteItemVo.setOrderStructureVos(structureVoList);
+            }
+
+            //  姣忎竴涓伐搴忕殑鍙傛暟銆丅OM娑堣�椾骇鍝�
+            productionOrderRouteItemVoList.add(productionOrderRouteItemVo);
+        }
+
+        productionRecordVo.setProductionOrderRouteItemVos(productionOrderRouteItemVoList);
+        return productionRecordVo;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addProductionRecordService(ProductionRecordDto dto) {
+        if (dto == null) {
+            throw new ServiceException("鎶ュ伐澶辫触,鏁版嵁涓嶈兘涓虹┖");
+        }
+        if (dto.getProductOrderId() == null) {
+            throw new ServiceException("鎶ュ伐澶辫触,鐢熶骇璁㈠崟ID涓嶈兘涓虹┖");
+        }
+        if (dto.getProductId() == null) {
+            throw new ServiceException("鎶ュ伐澶辫触,浜у搧淇℃伅涓嶈兘涓虹┖");
+        }
+        if (StringUtils.isEmpty(dto.getPostName()) || StringUtils.isEmpty(dto.getSchedule())) {
+            throw new ServiceException("鎶ュ伐澶辫触,宀椾綅浜哄憳/鐝淇℃伅涓嶈兘涓虹┖");
+        }
+
+        //  鏇存柊鐢熶骇璁㈠崟鏁版嵁
+        ProductOrder productOrder = productOrderService.getById(dto.getProductOrderId());
+        if (productOrder == null) {
+            throw new ServiceException("鎶ュ伐澶辫触,鐢熶骇璁㈠崟涓嶅瓨鍦�");
+        }
+
+        //  褰撳墠鎶ュ伐鍚堟牸鏁伴噺
+        BigDecimal qualifiedQty = dto.getQualifiedQuantity() == null ? BigDecimal.ZERO : dto.getQualifiedQuantity();
+        //  宸插畬鎴愭暟閲�
+        BigDecimal completeQty = productOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productOrder.getCompleteQuantity();
+        //  绱姞(鍙畻鍚堟牸)
+        BigDecimal newCompleteQty = completeQty.add(qualifiedQty);
+        productOrder.setCompleteQuantity(newCompleteQty);
+        //  闇�姹傛暟閲�
+        BigDecimal totalQty = productOrder.getQuantity() == null ? BigDecimal.ZERO : productOrder.getQuantity();
+        // 鍓╀綑鍙姤宸ユ暟閲�
+        BigDecimal remainQty = totalQty.subtract(completeQty);
+        //  鏈鎶ュ伐涓嶈兘瓒呰繃鍓╀綑鏁伴噺
+        if (qualifiedQty.compareTo(remainQty) > 0) {
+            throw new ServiceException("鎶ュ伐澶辫触锛屾湰娆℃姤宸ユ暟閲忎笉鑳藉ぇ浜庡墿浣欏彲鎶ュ伐鏁伴噺");
+        }
+        //  璁剧疆寮�濮嬫椂闂达紙绗竴娆℃姤宸ワ級
+        if (productOrder.getStartTime() == null) {
+            productOrder.setStartTime(LocalDateTime.now());
+        }
+        //  鐘舵�佸垽鏂�
+        if (newCompleteQty.compareTo(totalQty) >= 0 && totalQty.compareTo(BigDecimal.ZERO) > 0) {
+            productOrder.setStatus(ProductOrderStatusEnum.FINISHED.getCode());
+            productOrder.setEndTime(LocalDateTime.now());
+        } else {
+            productOrder.setStatus(ProductOrderStatusEnum.RUNNING.getCode());
+        }
+        boolean update = productOrderService.updateById(productOrder);
+        if (!update) {
+            throw new ServiceException("鎶ュ伐澶辫触,鐢熶骇璁㈠崟鏇存柊澶辫触");
+        }
+
+        //  瀹屾垚鎶ュ伐涓昏〃-鎶曞叆琛�-浜у嚭琛ㄦ暟鎹�
+        ProductionProductMain productionProductMain = new ProductionProductMain();
+        productionProductMain.setProductNo("BG" + UUID.randomUUID());
+        productionProductMain.setProductOrderId(dto.getProductOrderId());
+        productionProductMain.setSchedule(dto.getSchedule());
+        boolean result = productionProductMainService.save(productionProductMain);
+        if (!result) {
+            throw new ServiceException("鎶ュ伐澶辫触,鏁版嵁瀛樺偍澶辫触");
+        }
+
+        ProductionProductInput productionProductInput = new ProductionProductInput();
+        productionProductInput.setProductMainId(productionProductMain.getId());
+        productionProductInput.setProductModelId(dto.getProductId());
+        productionProductInput.setQuantity(dto.getQuantity());
+        result = productionProductInputService.save(productionProductInput);
+        if (!result) {
+            throw new ServiceException("鎶ュ伐澶辫触,鐢熶骇鎶曞叆瀛樺偍澶辫触");
+        }
+
+        ProductionProductOutput productionProductOutput = new ProductionProductOutput();
+        productionProductOutput.setProductMainId(productionProductMain.getId());
+        productionProductOutput.setProductModelId(dto.getProductId());
+        productionProductOutput.setQuantity(dto.getQualifiedQuantity());
+        productionProductOutput.setScrapQty(dto.getUnqualifiedQuantity());
+        result = productionProductOutputService.save(productionProductOutput);
+        if (!result) {
+            throw new ServiceException("鎶ュ伐澶辫触,鐢熶骇浜у嚭瀛樺偍澶辫触");
+        }
+
+        //  澶勭悊宸ュ簭
+        List<ProductionProductRouteItemDto> productionProductRouteItemDtoList = dto.getProductionProductRouteItemDtoList();
+        if (productionProductRouteItemDtoList == null || productionProductRouteItemDtoList.isEmpty()) {
+            throw new ServiceException("鎶ュ伐澶辫触,宸ュ簭鍙傛暟涓嶈兘涓虹┖");
+        }
+        for (ProductionProductRouteItemDto productRouteItemDto : productionProductRouteItemDtoList) {
+            //  澶勭悊宸ュ簭涓昏〃
+            ProductionProductRouteItem productRouteItemEntity = new ProductionProductRouteItem();
+            BeanUtils.copyProperties(productRouteItemDto, productRouteItemEntity, "id");
+            productRouteItemEntity.setProductMainId(productionProductMain.getId());
+            productionProductRouteItemService.save(productRouteItemEntity);
+
+            //  澶勭悊鍙傛暟鍙婃秷鑰椾骇鍝�
+            List<ProductionProductRouteItemParamDto> productionProductRouteItemParamDtoList = productRouteItemDto.getProductionProductRouteItemParamDtoList();
+            if (productionProductRouteItemParamDtoList != null && !productionProductRouteItemParamDtoList.isEmpty()) {
+                for (ProductionProductRouteItemParamDto productRouteItemParamDto : productionProductRouteItemParamDtoList) {
+                    ProductionProductRouteItemParam paramEntity = new ProductionProductRouteItemParam();
+                    BeanUtils.copyProperties(productRouteItemParamDto, paramEntity, "id");
+                    paramEntity.setProductionProductRouteItemId(productRouteItemEntity.getId());
+                    if (paramEntity.getProductId() != null) {
+                    } else {
+                        ProductionOrderRouteItemParam productionOrderRouteItemParam = productionOrderRouteItemParamService.getById(productRouteItemParamDto.getId());
+                        paramEntity.setParamName(productionOrderRouteItemParam.getParamName());
+                        paramEntity.setParamType(productionOrderRouteItemParam.getParamType());
+                        paramEntity.setParamFormat(productionOrderRouteItemParam.getParamFormat());
+                        paramEntity.setValueMode(productionOrderRouteItemParam.getValueMode());
+                    }
+
+                    productionProductRouteItemParamService.save(paramEntity);
+                }
+            }
+
+            //  澶勭悊宸ュ簭涓婁紶鐨勯檮浠�
+            List<String> files = productRouteItemDto.getFiles();
+            if (files != null && !files.isEmpty()) {
+                for (String tempId : files) {
+                    TempFile tempFile = tempFileMapper.selectById(tempId);
+                    if (tempFile == null) {
+                        log.warn("鏈壘鍒颁复鏃舵枃浠惰褰�: {}", tempId);
+                        continue;
+                    }
+
+                    try {
+                        //  姝e紡鐩綍璺緞锛堟寜鏃ユ湡鍒嗙粍锛�
+                        String formalDir = uploadDir + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE);
+                        Path formalDirPath = Paths.get(formalDir);
+                        if (!Files.exists(formalDirPath)) {
+                            Files.createDirectories(formalDirPath);
+                        }
+
+                        //  姝e紡鏂囦欢鍚�
+                        String originalFilename = tempFile.getOriginalName();
+                        String fileExtension = FilenameUtils.getExtension(originalFilename);
+                        String formalFilename = productRouteItemEntity.getId() + "_" +
+                                System.currentTimeMillis() + "_" +
+                                UUID.randomUUID().toString().substring(0, 8) +
+                                (StringUtils.hasText(fileExtension) ? "." + fileExtension : "");
+
+                        Path formalFilePath = formalDirPath.resolve(formalFilename);
+
+                        //  鏂囦欢杩佺Щ (澶嶅埗+鍒犻櫎)
+                        Files.copy(Paths.get(tempFile.getTempPath()), formalFilePath, StandardCopyOption.REPLACE_EXISTING);
+                        Files.deleteIfExists(Paths.get(tempFile.getTempPath()));
+
+                        //  淇濆瓨鎶ュ伐闄勪欢璁板綍
+                        ProductionProductRouteItemFile fileEntity = new ProductionProductRouteItemFile();
+                        fileEntity.setProductionProductRouteItemId(productRouteItemEntity.getId());
+                        fileEntity.setFileName(originalFilename);
+                        fileEntity.setFileUrl(formalFilePath.toString());
+                        fileEntity.setFileSuffix(fileExtension);
+                        fileEntity.setFileSize(Files.size(formalFilePath));
+                        fileEntity.setCreateTime(LocalDateTime.now());
+                        fileEntity.setTenantId(SecurityUtils.getLoginUser().getTenantId());
+                        productionProductRouteItemFileService.save(fileEntity);
+
+                        //  鍒犻櫎涓存椂鏂囦欢璁板綍
+                        tempFileMapper.deleteById(tempId);
+                        log.info("宸ュ簭闄勪欢杩佺Щ鎴愬姛: {} -> {}", tempFile.getTempPath(), formalFilePath);
+
+                    } catch (IOException e) {
+                        log.error("宸ュ簭闄勪欢杩佺Щ澶辫触: {}", tempFile.getTempPath(), e);
+                        throw new ServiceException("宸ュ簭闄勪欢澶勭悊寮傚父: " + e.getMessage());
+                    }
+                }
+            }
+        }
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/production/vo/ProductionOrderRouteItemParamVo.java b/src/main/java/com/ruoyi/production/vo/ProductionOrderRouteItemParamVo.java
new file mode 100644
index 0000000..8e8c76f
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/vo/ProductionOrderRouteItemParamVo.java
@@ -0,0 +1,51 @@
+package com.ruoyi.production.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <br>
+ *
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/23 13:05
+ */
+@Data
+public class ProductionOrderRouteItemParamVo {
+
+    @ApiModelProperty(value = "涓婚敭ID")
+    private Long id;
+
+    @ApiModelProperty(value = "鍙傛暟鍞竴鏍囪瘑")
+    private String paramKey;
+
+    @ApiModelProperty(value = "鍙傛暟鍚嶇О")
+    private String paramName;
+
+    @ApiModelProperty(value = "鍙傛暟绫诲瀷(1鏁板瓧 2鏂囨湰 3涓嬫媺閫夋嫨 4鏃堕棿)")
+    private Integer paramType;
+
+    @ApiModelProperty(value = "鍙傛暟鏍煎紡")
+    private String paramFormat;
+
+    @ApiModelProperty(value = "鍊兼ā寮�(1鍗曞�� 2鍖洪棿)")
+    private Integer valueMode;
+
+    @ApiModelProperty(value = "鍗曚綅")
+    private String unit;
+
+    @ApiModelProperty(value = "鏍囧噯鍊�")
+    private String standardValue;
+
+    @ApiModelProperty(value = "姝よ矾绾胯妭鐐硅瀹氱殑鏍囧噯鏈�灏忓��")
+    private java.math.BigDecimal minValue;
+
+    @ApiModelProperty(value = "姝よ矾绾胯妭鐐硅瀹氱殑鏍囧噯鏈�澶у��")
+    private java.math.BigDecimal maxValue;
+
+    @ApiModelProperty(value = "鏄惁蹇呭~")
+    private Boolean isRequired;
+}
diff --git a/src/main/java/com/ruoyi/production/vo/ProductionOrderRouteItemVo.java b/src/main/java/com/ruoyi/production/vo/ProductionOrderRouteItemVo.java
new file mode 100644
index 0000000..6f414f4
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/vo/ProductionOrderRouteItemVo.java
@@ -0,0 +1,31 @@
+package com.ruoyi.production.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * <br>
+ * 鐢熶骇璁㈠崟缁戝畾鐨勫伐鑹鸿矾绾�--宸ュ簭琛╒o
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/23 12:00
+ */
+@Data
+public class ProductionOrderRouteItemVo {
+
+    @ApiModelProperty(value = "宸ュ簭id")
+    private Long processId;
+
+    @ApiModelProperty(value = "宸ュ簭鍚嶇О")
+    private String processName;
+
+    @ApiModelProperty("宸ュ簭缁戝畾鐨勫弬鏁板垪琛�")
+    private List<ProductionOrderRouteItemParamVo> orderRouteItemParaVos;
+
+    @ApiModelProperty("BOM鍐呭伐搴忛渶瑕佹秷鑰楃殑浜у搧鍒楄〃")
+    private List<ProductionOrderStructureVo> orderStructureVos;
+}
diff --git a/src/main/java/com/ruoyi/production/vo/ProductionOrderStructureVo.java b/src/main/java/com/ruoyi/production/vo/ProductionOrderStructureVo.java
new file mode 100644
index 0000000..6050f4b
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/vo/ProductionOrderStructureVo.java
@@ -0,0 +1,43 @@
+package com.ruoyi.production.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * <br>
+ *
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/23 13:05
+ */
+@Data
+public class ProductionOrderStructureVo {
+
+    @ApiModelProperty(value = "涓婚敭ID")
+    private Long id;
+
+    @ApiModelProperty(value = "浜у搧id")
+    private Long productModelId;
+
+    @ApiModelProperty(value = "浜у搧鍚嶇О")
+    private String productName;
+
+    @ApiModelProperty(value = "浜у搧妯″瀷")
+    private String model;
+
+    @ApiModelProperty(value = "鍗曚綅浜у嚭闇�瑕佹暟閲�")
+    private BigDecimal unitQuantity;
+
+//    @ApiModelProperty(value = "闇�姹傛暟閲�")
+//    private java.math.BigDecimal demandedQuantity;
+
+    @ApiModelProperty(value = "鍗曚綅")
+    private String unit;
+
+    @ApiModelProperty(value = "bom鐨刬d")
+    private Long bomId;
+}
diff --git a/src/main/java/com/ruoyi/production/vo/ProductionRecordVo.java b/src/main/java/com/ruoyi/production/vo/ProductionRecordVo.java
new file mode 100644
index 0000000..f6c27b9
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/vo/ProductionRecordVo.java
@@ -0,0 +1,31 @@
+package com.ruoyi.production.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * <br>
+ * 鐢熶骇鎶ュ伐璁板綍Vo
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/23 11:36
+ */
+@Data
+@ApiModel(value = "ProductionRecordVo", description = "鐢熶骇鎶ュ伐璁板綍Vo")
+public class ProductionRecordVo {
+
+    @ApiModelProperty("鐢熶骇璁㈠崟ID")
+    private Long productOrderId;
+
+    @ApiModelProperty("宸ヨ壓璺嚎ID")
+    private Long productRouteId;
+
+    @ApiModelProperty("宸ヨ壓璺嚎缁戝畾鐨勫伐搴�")
+    private List<ProductionOrderRouteItemVo> productionOrderRouteItemVos;
+
+}
diff --git a/src/main/resources/mapper/production/ProductionProductMainMapper.xml b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
index a122e90..4bebe89 100644
--- a/src/main/resources/mapper/production/ProductionProductMainMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -10,48 +10,43 @@
         <result property="tenantId" column="tenant_id"/>
         <result property="createTime" column="create_time"/>
         <result property="status" column="status"/>
+        <result property="postName" column="post_name"/>
+        <result property="schedule" column="schedule"/>
+        <result property="reportingTime" column="reporting_time"/>
     </resultMap>
 
     <select id="listPageProductionProductMainDto" resultType="com.ruoyi.production.dto.ProductionProductMainDto">
         select ppm.*,
-        pwo.work_order_no as workOrderNo,
-        pwo.status as workOrderStatus,
-        u.nick_name as nickName,
-        p.product_name as productName,
-        pp.name as process,
-        pm.model as productModelName,
-        ppo.quantity,
-        ppo.scrap_qty,
-        pm.unit,
-        sl.sales_contract_no salesContractNo
+        po.nps_no as npsNo,
+        pms.material_code as materialCode,
+        pm.product_name as productName,
+        pms.model as productModelName,
+        IFNULL(ppo.quantity, 0) as totalQuantity,
+        IFNULL(ppo.scrap_qty, 0) as scrapQty,
+        IFNULL(ppo.quantity, 0) as quantity
         from
         production_product_main ppm
-        left join product_work_order pwo on pwo.id = ppm.work_order_id
-        left join product_process_route_item ppri on ppri.id = pwo.product_process_route_item_id
-        left join product_process pp on pp.id = ppri.process_id
-        left join product_order po on po.id = pwo.product_order_id
-        left join production_product_output ppo on ppm.id = ppo.product_main_id
-        left join product_model pm on pm.id = ppo.product_model_id
-        left join product p on p.id = pm.product_id
-        left join sales_ledger sl on sl.id = po.sales_ledger_id
-        left join sys_user u on u.user_id = ppm.user_id
+        left join production_product_output ppo on ppo.product_main_id = ppm.id
+        left join production_product_input ppi on ppi.product_main_id = ppm.id
+        left join product_order po on po.id = ppm.product_order_id
+        left join product_order_plan pop on po.id = pop.product_order_id
+        left join production_plan pp on pop.production_plan_id = pp.id
+        left join product_material_sku pms on pp.product_material_sku_id = pms.id
+        left join product_material pm on pm.id = pms.product_id
         <where>
-            <if test="c.nickName != null and c.nickName != ''">
-                and u.nick_name like concat('%',#{c.nickName},'%')
+            <if test="c.npsNo != null and c.npsNo != ''">
+                AND po.nps_no like concat('%', #{c.npsNo}, '%')
             </if>
-            <if test="c.workOrderNo != null and c.workOrderNo != ''">
-                and pwo.work_order_no like concat('%',#{c.workOrderNo},'%')
+            <if test="c.schedule != null and c.schedule != ''">
+                AND ppm.schedule like concat('%', #{c.schedule}, '%')
             </if>
-            <if test="c.workOrderStatus != null and c.workOrderStatus != ''">
-                and pwo.status = #{c.workOrderStatus}
-            </if>
-            <if test="c.status != null and c.status != ''">
-                and ppm.status = #{c.status}
+            <if test="c.productName != null and c.productName != ''">
+                AND pm.product_name like concat('%', #{c.productName}, '%')
             </if>
         </where>
-        order by ppm.id
-
+        order by ppm.id desc
     </select>
+
     <select id="getOrderByMainId" resultType="com.ruoyi.production.pojo.ProductOrder">
         select po.*
         from product_order po
@@ -86,11 +81,11 @@
             <if test="ew.schedulingUserName != null and ew.schedulingUserName !=''">
                 and slpa.scheduling_user_name = #{ew.schedulingUserName}
             </if>
-            <if test="ew.entryDate != null " >
+            <if test="ew.entryDate != null ">
                 and slpa.scheduling_date >= #{ew.entryDate}
                 and slpa.scheduling_date &lt; DATE_ADD(#{ew.entryDate}, INTERVAL 1 DAY)
             </if>
-            <if test="ew.entryDateStart != null and ew.entryDateEnd != null" >
+            <if test="ew.entryDateStart != null and ew.entryDateEnd != null">
                 and slpa.scheduling_date >= #{ew.entryDateStart}
                 and slpa.scheduling_date &lt; date_add(#{ew.entryDateEnd}, INTERVAL 1 DAY)
             </if>
@@ -98,9 +93,9 @@
     </select>
     <select id="listMain" resultType="java.lang.Long">
         SELECT ppm.id FROM production_product_main ppm
-            left join product_work_order pwo on pwo.id = ppm.work_order_id
-                  left join product_order po on po.id = pwo.product_order_id
-                  left join sales_ledger sl on sl.id = po.sales_ledger_id
+        left join product_work_order pwo on pwo.id = ppm.work_order_id
+        left join product_order po on po.id = pwo.product_order_id
+        left join sales_ledger sl on sl.id = po.sales_ledger_id
         <where>
             <if test="idList != null and idList.size() > 0">
                 and sl.id in
diff --git a/src/main/resources/mapper/production/ProductionProductRouteItemFileMapper.xml b/src/main/resources/mapper/production/ProductionProductRouteItemFileMapper.xml
new file mode 100644
index 0000000..29638eb
--- /dev/null
+++ b/src/main/resources/mapper/production/ProductionProductRouteItemFileMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.production.mapper.ProductionProductRouteItemFileMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductionProductRouteItemFile">
+        <id column="id" property="id" />
+        <result column="production_product_route_item_id" property="productionProductRouteItemId" />
+        <result column="file_name" property="fileName" />
+        <result column="file_url" property="fileUrl" />
+        <result column="file_size" property="fileSize" />
+        <result column="file_suffix" property="fileSuffix" />
+        <result column="create_user" property="createUser" />
+        <result column="create_time" property="createTime" />
+        <result column="update_user" property="updateUser" />
+        <result column="update_time" property="updateTime" />
+        <result column="tenant_id" property="tenantId" />
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/production/ProductionProductRouteItemMapper.xml b/src/main/resources/mapper/production/ProductionProductRouteItemMapper.xml
new file mode 100644
index 0000000..bae946b
--- /dev/null
+++ b/src/main/resources/mapper/production/ProductionProductRouteItemMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.production.mapper.ProductionProductRouteItemMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductionProductRouteItem">
+        <id column="id" property="id"/>
+        <result column="product_main_id" property="productMainId"/>
+        <result column="post_name" property="postName"/>
+        <result column="equipment_malfunction" property="equipmentMalfunction"/>
+        <result column="equipment_disposal" property="equipmentDisposal"/>
+        <result column="process_explained" property="processExplained"/>
+        <result column="process_id" property="processId"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="tenant_id" property="tenantId"/>
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/production/ProductionProductRouteItemParamMapper.xml b/src/main/resources/mapper/production/ProductionProductRouteItemParamMapper.xml
new file mode 100644
index 0000000..51578df
--- /dev/null
+++ b/src/main/resources/mapper/production/ProductionProductRouteItemParamMapper.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.production.mapper.ProductionProductRouteItemParamMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductionProductRouteItemParam">
+        <id column="id" property="id"/>
+        <result column="production_product_route_item_id" property="productionProductRouteItemId"/>
+        <result column="param_name" property="paramName"/>
+        <result column="param_type" property="paramType"/>
+        <result column="param_format" property="paramFormat"/>
+        <result column="value_mode" property="valueMode"/>
+        <result column="standard_value" property="standardValue"/>
+        <result column="min_value" property="minValue"/>
+        <result column="max_value" property="maxValue"/>
+        <result column="product_id" property="productId"/>
+        <result column="bom_id" property="bomId"/>
+        <result column="product_value" property="productValue"/>
+        <result column="unit" property="unit"/>
+        <result column="is_required" property="isRequired"/>
+        <result column="source_sort" property="sourceSort"/>
+        <result column="dict_code" property="dictCode"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="tenant_id" property="tenantId"/>
+    </resultMap>
+
+</mapper>

--
Gitblit v1.9.3