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 < 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 < 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