From 92d8d06d8ae38c407715a5e9389691b446413e0a Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 27 三月 2026 10:06:09 +0800
Subject: [PATCH] yys 1.生产逻辑修改

---
 src/main/java/com/ruoyi/project/system/mapper/SysUserDeptMapper.java                   |    5 
 src/main/java/com/ruoyi/production/service/ProductProcessRouteService.java             |    4 
 src/main/java/com/ruoyi/production/service/ProductStructureRecordService.java          |   16 +
 src/main/java/com/ruoyi/production/dto/ProductOrderDto.java                            |    4 
 src/main/java/com/ruoyi/production/service/ProductOrderService.java                    |    5 
 src/main/java/com/ruoyi/production/dto/ProcessRouteItemDto.java                        |    2 
 src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java       |    9 
 src/main/java/com/ruoyi/production/controller/ProductStructureController.java          |    6 
 src/main/java/com/ruoyi/production/pojo/ProductStructureRecord.java                    |   61 +++
 src/main/java/com/ruoyi/production/pojo/ProcessRoute.java                              |   11 
 src/main/java/com/ruoyi/dto/FileDto.java                                               |   17 +
 src/main/java/com/ruoyi/production/dto/ProcessRouteDto.java                            |    3 
 src/main/resources/mapper/production/ProcessRouteMapper.xml                            |   14 
 src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java                       |    5 
 src/main/resources/mapper/basic/ProductModelMapper.xml                                 |    7 
 src/main/resources/mapper/production/ProductOrderMapper.xml                            |   10 
 src/main/java/com/ruoyi/basic/dto/ProductAndModelDto.java                              |    9 
 src/main/resources/mapper/production/ProcessRouteItemMapper.xml                        |    3 
 src/main/java/com/ruoyi/production/service/ProcessRouteService.java                    |    2 
 src/main/java/com/ruoyi/basic/pojo/ProductModel.java                                   |    3 
 src/main/java/com/ruoyi/production/controller/ProductProcessController.java            |   21 +
 src/main/java/com/ruoyi/basic/controller/ProductController.java                        |    3 
 src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java           |  111 +++++-
 src/main/java/com/ruoyi/CodeGenerator.java                                             |    2 
 src/main/java/com/ruoyi/common/enums/FileNameType.java                                 |    4 
 src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java                  |    8 
 src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java                |   26 +
 src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java                  |    8 
 src/main/java/com/ruoyi/production/pojo/ProductOrder.java                              |   21 +
 src/main/java/com/ruoyi/production/controller/ProductOrderController.java              |    9 
 src/main/java/com/ruoyi/production/mapper/ProductProcessRouteMapper.java               |    4 
 src/main/java/com/ruoyi/production/controller/ProductStructureRecordController.java    |   18 +
 src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java                   |   31 +
 src/main/java/com/ruoyi/production/dto/SysDeptAndUserDto.java                          |   58 +++
 src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java           |   39 ++
 src/main/resources/mapper/production/ProductWorkOrderMapper.xml                        |    2 
 src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java                          |   13 
 src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteServiceImpl.java    |    4 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java          |    2 
 src/main/java/com/ruoyi/production/controller/ProcessRouteController.java              |    2 
 src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java         |   71 ++++
 src/main/java/com/ruoyi/basic/dto/ProductModelDto.java                                 |    4 
 src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java                     |   11 
 src/main/java/com/ruoyi/production/service/impl/ProductStructureRecordServiceImpl.java |   20 +
 src/main/java/com/ruoyi/production/pojo/ProductProcess.java                            |    2 
 src/main/java/com/ruoyi/basic/service/IProductModelService.java                        |    3 
 src/main/resources/mapper/system/SysUserDeptMapper.xml                                 |    3 
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java  |   18 
 src/main/resources/mapper/production/ProductBomMapper.xml                              |    7 
 src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java             |  126 ++++---
 src/main/java/com/ruoyi/production/mapper/ProductStructureRecordMapper.java            |   18 +
 src/main/java/com/ruoyi/production/pojo/ProductProcessRoute.java                       |    3 
 src/main/java/com/ruoyi/production/service/ProductStructureService.java                |    1 
 src/main/resources/mapper/production/ProductStructureRecordMapper.xml                  |   19 +
 src/main/resources/mapper/production/ProductStructureMapper.xml                        |    8 
 src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java                       |   11 
 src/main/resources/mapper/system/SysUserMapper.xml                                     |   11 
 src/main/resources/mapper/system/SysDeptMapper.xml                                     |   14 
 src/main/resources/mapper/production/ProductProcessRouteMapper.xml                     |    5 
 59 files changed, 796 insertions(+), 141 deletions(-)

diff --git a/src/main/java/com/ruoyi/CodeGenerator.java b/src/main/java/com/ruoyi/CodeGenerator.java
index f6c6d72..79f8799 100644
--- a/src/main/java/com/ruoyi/CodeGenerator.java
+++ b/src/main/java/com/ruoyi/CodeGenerator.java
@@ -23,7 +23,7 @@
     public static String database_username = "root";
     public static String database_password= "123456";
     public static String author = "鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃";
-    public static String model = "sales"; // 妯″潡
+    public static String model = "production"; // 妯″潡
     public static String setParent = "com.ruoyi."+ model; // 鍖呰矾寰�
     public static String tablePrefix = ""; // 璁剧疆杩囨护琛ㄥ墠缂�
     public static void main(String[] args) {
diff --git a/src/main/java/com/ruoyi/basic/controller/ProductController.java b/src/main/java/com/ruoyi/basic/controller/ProductController.java
index 1bd2dbd..22dc714 100644
--- a/src/main/java/com/ruoyi/basic/controller/ProductController.java
+++ b/src/main/java/com/ruoyi/basic/controller/ProductController.java
@@ -26,6 +26,7 @@
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.util.List;
 
 @RestController
@@ -76,7 +77,7 @@
      */
     @Log(title = "浜у搧瑙勬牸鍨嬪彿", businessType = BusinessType.INSERT)
     @PostMapping("/addOrEditProductModel")
-    public AjaxResult addOrEditProductModel(@RequestBody ProductModelDto productModelDto) {
+    public AjaxResult addOrEditProductModel(@RequestBody ProductModelDto productModelDto) throws IOException {
         return toAjax(productModelService.addOrEditProductModel(productModelDto));
     }
 
diff --git a/src/main/java/com/ruoyi/basic/dto/ProductAndModelDto.java b/src/main/java/com/ruoyi/basic/dto/ProductAndModelDto.java
index 8c1865f..91758cf 100644
--- a/src/main/java/com/ruoyi/basic/dto/ProductAndModelDto.java
+++ b/src/main/java/com/ruoyi/basic/dto/ProductAndModelDto.java
@@ -2,8 +2,11 @@
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import com.ruoyi.sales.pojo.CommonFile;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+
+import java.util.List;
 
 /**
  * @author :yys
@@ -12,6 +15,12 @@
 @Data
 public class ProductAndModelDto {
 
+    private List<CommonFile> SalesLedgerFiles;
+
+    private Long routeId;
+
+    private String routeName;
+
     /**
      * 瑙勬牸id
      */
diff --git a/src/main/java/com/ruoyi/basic/dto/ProductModelDto.java b/src/main/java/com/ruoyi/basic/dto/ProductModelDto.java
index ab4020e..67b25e1 100644
--- a/src/main/java/com/ruoyi/basic/dto/ProductModelDto.java
+++ b/src/main/java/com/ruoyi/basic/dto/ProductModelDto.java
@@ -2,6 +2,7 @@
 
 import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.production.dto.ProductStructureDto;
+import com.ruoyi.sales.pojo.CommonFile;
 import lombok.Data;
 
 import java.util.List;
@@ -11,4 +12,7 @@
     private List<ProductStructureDto> productStructureList;
 
     private String productName;
+
+    private List<String> tempFileIds;
+    private List<CommonFile> SalesLedgerFiles;
 }
diff --git a/src/main/java/com/ruoyi/basic/pojo/ProductModel.java b/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
index 95669da..8b88d82 100644
--- a/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
+++ b/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -20,6 +20,9 @@
     @TableId(type = IdType.AUTO)
     private Long id;
 
+    @ApiModelProperty(value = "宸ヨ壓璺嚎id")
+    private Long routeId;
+
     /**
      * 鍏宠仈浜у搧id
      */
diff --git a/src/main/java/com/ruoyi/basic/service/IProductModelService.java b/src/main/java/com/ruoyi/basic/service/IProductModelService.java
index f254612..1952821 100644
--- a/src/main/java/com/ruoyi/basic/service/IProductModelService.java
+++ b/src/main/java/com/ruoyi/basic/service/IProductModelService.java
@@ -8,6 +8,7 @@
 import com.ruoyi.basic.pojo.ProductModel;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.List;
 
 
@@ -19,7 +20,7 @@
  */
 public interface IProductModelService extends IService<ProductModel> {
 
-    int addOrEditProductModel(ProductModelDto productModelDto);
+    int addOrEditProductModel(ProductModelDto productModelDto) throws IOException;
 
     int delProductModel(Long[] ids);
 
diff --git a/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
index 26715f3..51437ec 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
@@ -16,14 +16,19 @@
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.other.mapper.TempFileMapper;
+import com.ruoyi.other.service.impl.TempFileServiceImpl;
+import com.ruoyi.sales.mapper.CommonFileMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
 import lombok.AllArgsConstructor;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.AbstractMap;
@@ -45,9 +50,12 @@
     private final ProductMapper productMapper;
     private final SalesLedgerProductMapper salesLedgerProductMapper;
     private ProductModelMapper productModelMapper;
+    private final CommonFileServiceImpl commonFileService;
+
+    private final TempFileServiceImpl tempFileService;
 
     @Override
-    public int addOrEditProductModel(ProductModelDto productModelDto) {
+    public int addOrEditProductModel(ProductModelDto productModelDto) throws IOException {
         if(StringUtils.isEmpty(productModelDto.getProductName())){
             throw new RuntimeException("浜у搧鍚嶇О涓嶈兘涓虹┖");
         }
@@ -63,16 +71,23 @@
             ProductModel productModel = new ProductModel();
             BeanUtils.copyProperties(productModelDto,productModel);
             productModel.setProductId(product.getId());
-            return productModelMapper.insert(productModel);
+            productModelMapper.insert(productModel);
+            if(CollectionUtils.isNotEmpty(productModelDto.getTempFileIds())){
+                commonFileService.migrateTempFilesToFormal(productModel.getId(), productModelDto.getTempFileIds());
+            }
+            return 1;
         } else {
             Product product1 = productMapper.selectById(productModelDto.getProductId());
             if(product1 != null){
                 product1.setProductName(productModelDto.getProductName());
                 productMapper.updateById(product1);
             }
-
+            if(CollectionUtils.isNotEmpty(productModelDto.getTempFileIds())){
+                commonFileService.migrateTempFilesToFormal(productModelDto.getId(), productModelDto.getTempFileIds());
+            }
             return productModelMapper.updateById(productModelDto);
         }
+
     }
 
 
@@ -116,11 +131,6 @@
         try {
             ExcelUtil<ProductModelExcelCopyDto> productModelExcelUtil = new ExcelUtil<>(ProductModelExcelCopyDto.class);
             List<ProductModelExcelCopyDto> productModelList = productModelExcelUtil.importExcel(file.getInputStream());
-//            List<Product> productList = productMapper.selectList(new LambdaQueryWrapper<Product>()
-//                    .isNull(Product::getParentId));
-//            if(CollectionUtils.isEmpty(productList)) {
-//                throw new RuntimeException("璇峰厛娣诲姞鐖剁骇浜у搧");
-//            }
             if(CollectionUtils.isNotEmpty(productModelList)){
                 // 2. 鎸変骇鍝佸悕绉�,鍥剧焊缂栧彿鍒嗙粍
                 Map<Map.Entry<String, String>, List<ProductModelExcelCopyDto>> groupedByProductNameAndDrawingNumber =
diff --git a/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
index cb737f3..2a2b9eb 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
@@ -12,14 +12,17 @@
 import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.basic.service.IProductService;
+import com.ruoyi.common.enums.FileNameType;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
 import lombok.AllArgsConstructor;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -32,6 +35,8 @@
     private ProductMapper productMapper;
 
     private ProductModelMapper productModelMapper;
+
+    private final CommonFileServiceImpl commonFileService;
 
     @Override
     public List<ProductTreeDto> selectProductList(ProductDto productDto) {
@@ -64,7 +69,11 @@
 
     @Override
     public AjaxResult listPage(Page page, ProductAndModelDto productDto) {
-        return AjaxResult.success(productModelMapper.listPage(page, productDto));
+        IPage<ProductAndModelDto> productAndModelDtoIPage = productModelMapper.listPage(page, productDto);
+        productAndModelDtoIPage.getRecords().forEach(item -> {
+            item.setSalesLedgerFiles(commonFileService.getFileListByBusinessId(item.getId(), FileNameType.PRODUCT_MODEL.getValue()));
+        });
+        return AjaxResult.success(productAndModelDtoIPage);
     }
 
 
diff --git a/src/main/java/com/ruoyi/common/enums/FileNameType.java b/src/main/java/com/ruoyi/common/enums/FileNameType.java
index 7afc045..ea5acc1 100644
--- a/src/main/java/com/ruoyi/common/enums/FileNameType.java
+++ b/src/main/java/com/ruoyi/common/enums/FileNameType.java
@@ -14,7 +14,9 @@
     SHIP(9),//鍙戣揣鍙拌处
     INSPECTION_PRODUCTION_BEFORE(10),
     INSPECTION_PRODUCTION_AFTER(11),
-    INSPECTION(12);//宸℃ 鐢熶骇鍓�
+    INSPECTION(12),//宸℃ 鐢熶骇鍓�
+    PRODUCT_MODEL(13),// 浜у搧鍨嬪彿鍥剧焊
+    PRODUCT_ORDER(14); //鐢熶骇璁㈠崟
 
     private final int value;
 
diff --git a/src/main/java/com/ruoyi/dto/FileDto.java b/src/main/java/com/ruoyi/dto/FileDto.java
new file mode 100644
index 0000000..376d1a2
--- /dev/null
+++ b/src/main/java/com/ruoyi/dto/FileDto.java
@@ -0,0 +1,17 @@
+package com.ruoyi.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.sales.pojo.CommonFile;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FileDto {
+
+    @TableField(exist = false)
+    private List<String> tempFileIds;
+    @TableField(exist = false)
+    private List<CommonFile> SalesLedgerFiles;
+
+}
diff --git a/src/main/java/com/ruoyi/production/controller/ProcessRouteController.java b/src/main/java/com/ruoyi/production/controller/ProcessRouteController.java
index 50ac4a8..9a96c3c 100644
--- a/src/main/java/com/ruoyi/production/controller/ProcessRouteController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProcessRouteController.java
@@ -37,7 +37,7 @@
     @ApiOperation("淇敼宸ヨ壓璺嚎")
     @PutMapping ()
     public R update(@RequestBody  ProcessRoute processRoute) {
-        return R.ok(processRouteService.updateById(processRoute));
+        return R.ok(processRouteService.updateProcessRoute(processRoute));
     }
     @ApiOperation("鍒犻櫎宸ヨ壓璺嚎")
     @DeleteMapping("/{ids}")
diff --git a/src/main/java/com/ruoyi/production/controller/ProductOrderController.java b/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
index 9acc6b1..48f39e9 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -16,6 +16,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.List;
 
@@ -32,6 +33,12 @@
     @GetMapping("page")
     public R page(ProductOrderDto productOrder, Page page) {
         return R.ok(productOrderService.pageProductOrder(page, productOrder));
+    }
+
+    @ApiOperation("宸ュ崟寮�濮嬪拰鏆傚仠")
+    @PostMapping("/startOrPause")
+    public R startOrPause(@RequestBody ProductOrderDto productOrder) {
+        return R.ok(productOrderService.startOrPause(productOrder));
     }
 
     @ApiOperation("缁戝畾宸ヨ壓璺嚎")
@@ -89,7 +96,7 @@
 
     @ApiOperation("鏂板鐢熶骇璁㈠崟")
     @PostMapping("/addProductOrder")
-    public R addProductOrder(@RequestBody ProductOrder productOrder) {
+    public R addProductOrder(@RequestBody ProductOrder productOrder) throws IOException {
         return R.ok(productOrderService.addProductOrder(productOrder));
     }
 
diff --git a/src/main/java/com/ruoyi/production/controller/ProductProcessController.java b/src/main/java/com/ruoyi/production/controller/ProductProcessController.java
index c25f2cc..d578d78 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductProcessController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductProcessController.java
@@ -11,6 +11,7 @@
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.oA.pojo.OaProject;
 import com.ruoyi.production.dto.ProductProcessDto;
+import com.ruoyi.production.dto.SysDeptAndUserDto;
 import com.ruoyi.production.pojo.ProductProcess;
 import com.ruoyi.production.service.impl.ProductProcessServiceImpl;
 import io.swagger.annotations.Api;
@@ -33,6 +34,26 @@
     @Autowired
     private ProductProcessServiceImpl productProcessService;
 
+    /**
+     * 鑾峰彇閮ㄩ棬鐢ㄦ埛鏍�
+     */
+    @GetMapping("/listDeptUserTree")
+    @ApiOperation("鑾峰彇閮ㄩ棬鐢ㄦ埛鏍�")
+    public AjaxResult listDeptUserTree() {
+        List<SysDeptAndUserDto> list = productProcessService.listDeptUserTree();
+        if (CollectionUtils.isEmpty(list)) {
+            return AjaxResult.warn("鏆傛棤鏁版嵁");
+        }
+        return AjaxResult.success(list);
+    }
+
+
+    /**
+     * 鍒嗛〉鏌ヨ宸ュ簭
+     * @param page
+     * @param productProcessDto
+     * @return
+     */
     @GetMapping("/listPage")
     @Log(title = "宸ュ簭-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
     @ApiOperation("宸ュ簭-鍒嗛〉鏌ヨ")
diff --git a/src/main/java/com/ruoyi/production/controller/ProductStructureController.java b/src/main/java/com/ruoyi/production/controller/ProductStructureController.java
index 89ead6d..c6bb3c4 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductStructureController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductStructureController.java
@@ -26,6 +26,12 @@
     private ProductStructureService productStructureService;
 
 
+    @ApiOperation("BOM瀛愰泦鍒楄〃(鏃犵埗绾�)")
+    @GetMapping("/listBybomIdIsParent/{bomId}")
+    public R listBybomIdIsParent(@PathVariable("bomId") Integer bomId){
+        return R.ok(productStructureService.listBybomIdIsParent(bomId));
+    }
+
     @ApiOperation("鏂板BOM瀛愰泦")
     @PostMapping()
     public R addOrUpdate(@RequestBody ProductStructureDto productStructureDto){
diff --git a/src/main/java/com/ruoyi/production/controller/ProductStructureRecordController.java b/src/main/java/com/ruoyi/production/controller/ProductStructureRecordController.java
new file mode 100644
index 0000000..5aa17e4
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/controller/ProductStructureRecordController.java
@@ -0,0 +1,18 @@
+package com.ruoyi.production.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟-鐗╂枡娓呭崟琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-03-26 10:34:23
+ */
+@RestController
+@RequestMapping("/productStructureRecord")
+public class ProductStructureRecordController {
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/ProcessRouteDto.java b/src/main/java/com/ruoyi/production/dto/ProcessRouteDto.java
index 62b9ad3..c1cdaf6 100644
--- a/src/main/java/com/ruoyi/production/dto/ProcessRouteDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProcessRouteDto.java
@@ -17,4 +17,7 @@
     private String drawingNumber;
 
     private String bomNo;
+
+    @ApiModelProperty("宸ュ簭鍚嶇О")
+    private String processName;
 }
diff --git a/src/main/java/com/ruoyi/production/dto/ProcessRouteItemDto.java b/src/main/java/com/ruoyi/production/dto/ProcessRouteItemDto.java
index d30ba92..be36456 100644
--- a/src/main/java/com/ruoyi/production/dto/ProcessRouteItemDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProcessRouteItemDto.java
@@ -28,6 +28,8 @@
 
     private Long productId;
 
+    private String userPower;
+
 
     private String model;
 }
diff --git a/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java b/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
index 068f344..92eef03 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
@@ -1,6 +1,7 @@
 package com.ruoyi.production.dto;
 
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import com.ruoyi.production.pojo.ProductOrder;
@@ -64,4 +65,7 @@
     @ApiModelProperty(value = "搴撳瓨鏁伴噺")
     @Excel(name = "搴撳瓨鏁伴噺")
     private BigDecimal inventoryQuantity;
+
+    @ApiModelProperty(value = "鎿嶄綔 1-寮�濮� 2-鏆傚仠")
+    private Integer operation;
 }
diff --git a/src/main/java/com/ruoyi/production/dto/SysDeptAndUserDto.java b/src/main/java/com/ruoyi/production/dto/SysDeptAndUserDto.java
new file mode 100644
index 0000000..7b9dbf4
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/SysDeptAndUserDto.java
@@ -0,0 +1,58 @@
+package com.ruoyi.production.dto;
+
+
+import com.ruoyi.project.system.domain.SysDept;
+import com.ruoyi.project.system.domain.SysUser;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SysDeptAndUserDto{
+
+    /** 閮ㄩ棬ID */
+    private Long deptId;
+
+    /** 鐖堕儴闂↖D */
+    private Long parentId;
+
+    /** 绁栫骇鍒楄〃 */
+    private String ancestors;
+
+    /** 閮ㄩ棬鍚嶇О */
+    private String deptName;
+
+    /** 鏄剧ず椤哄簭 */
+    private Integer orderNum;
+
+    /** 璐熻矗浜� */
+    private String leader;
+
+    /** 鑱旂郴鐢佃瘽 */
+    private String phone;
+
+    /** 閭 */
+    private String email;
+
+    /** 閮ㄩ棬鐘舵��:0姝e父,1鍋滅敤 */
+    private String status;
+
+    /** 鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛� */
+    private String delFlag;
+
+    /** 鐖堕儴闂ㄥ悕绉� */
+    private String parentName;
+
+    /** 閮ㄩ棬缂栧彿 */
+    private String deptNick;
+
+    /** 鍛樺伐鏁伴噺 */
+    private Integer staffCount;
+
+    /** 閮ㄩ棬涓嬬殑鐢ㄦ埛鍒楄〃 */
+    private List<SysUser> userList;
+
+    /** 瀛愰儴闂ㄥ垪琛� */
+    private List<SysDeptAndUserDto> childrenList;
+
+}
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductProcessRouteMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductProcessRouteMapper.java
index 06ae748..832c2f7 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductProcessRouteMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductProcessRouteMapper.java
@@ -6,6 +6,8 @@
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * <p>
  *  Mapper 鎺ュ彛
@@ -17,5 +19,5 @@
 @Mapper
 public interface ProductProcessRouteMapper extends BaseMapper<ProductProcessRoute> {
 
-    ProcessRouteDto listMain(@Param("orderId") Long orderId);
+    List<ProcessRouteDto> listMain(@Param("orderId") Long orderId);
 }
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java
index bd59242..c93b4b6 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java
@@ -13,7 +13,13 @@
 @Mapper
 public interface ProductStructureMapper  extends BaseMapper<ProductStructure> {
 
-    List<ProductStructureDto> listBybomId(@Param("bomId") Integer bomId);
+    /**
+     * 鏌ヨBOM瀛愰泦
+     * @param bomId
+     * @param isParent 鏄惁闇�瑕佺埗绾� true 杩斿洖瀛愮骇 false 杩斿洖瀛愮埗绾�
+     * @return
+     */
+    List<ProductStructureDto> listBybomId(@Param("bomId") Integer bomId,@Param("isParent") boolean isParent);
 
     List<ProductStructureDto> listBybomAndProcess(@Param("bomId") Integer bomId, @Param("processId") Long processId);
 }
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductStructureRecordMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductStructureRecordMapper.java
new file mode 100644
index 0000000..9d9ae23
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/mapper/ProductStructureRecordMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.production.mapper;
+
+import com.ruoyi.production.pojo.ProductStructureRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟-鐗╂枡娓呭崟琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-03-26 10:34:23
+ */
+@Mapper
+public interface ProductStructureRecordMapper extends BaseMapper<ProductStructureRecord> {
+
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProcessRoute.java b/src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
index fe661b3..30f366e 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
@@ -8,11 +8,16 @@
 import lombok.Data;
 
 import java.time.LocalDateTime;
+import java.util.List;
 
 @TableName("process_route")
 @Data
 @ApiModel(value = "processRoute", description = "宸ヨ壓璺嚎涓昏〃")
 public class ProcessRoute {
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "宸ヨ壓璺嚎鏄庣粏")
+    private List<ProcessRouteItem> processRouteItems;
 
     @ApiModelProperty(value = "搴忓彿")
     private Long id;
@@ -23,6 +28,9 @@
 
     @ApiModelProperty(value = "鎻忚堪")
     private String description;
+
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
 
     @ApiModelProperty(value = "绉熸埛ID")
     @TableField(fill = FieldFill.INSERT)
@@ -39,6 +47,9 @@
     @ApiModelProperty(value = "宸ヨ壓璺嚎缂栫爜")
     private String processRouteCode;
 
+    @ApiModelProperty(value = "宸ヨ壓璺嚎鍚嶇О")
+    private String processRouteName;
+
     @ApiModelProperty(value = "BOM鐨処D")
     private Integer bomId;
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductOrder.java b/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
index 5286cd3..e6739fa 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.dto.FileDto;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiModelProperty;
@@ -10,11 +11,21 @@
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.List;
 
 @Data
 @TableName("product_order")
-public class ProductOrder  implements Serializable {
+public class ProductOrder extends FileDto implements Serializable {
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鐢熶骇浠诲姟")
+    private List<ProductProcessRouteItem> processRouteItems;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鐗╂枡娓呭崟")
+    private List<ProductStructureRecord> productStructureRecords;
 
     private static final long serialVersionUID = 1L;
 
@@ -101,6 +112,14 @@
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime endTime;
 
+    @ApiModelProperty("浜や粯鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd",shape = JsonFormat.Shape.STRING,timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "浜や粯鏃ユ湡")
+    private LocalDate deliveryDate;
 
+    @ApiModelProperty("鐘舵�� 寰呯敓浜� 鐢熶骇涓� 宸插畬鎴�")
+    @Excel(name = "鐘舵��")
+    private String status;
 
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductProcess.java b/src/main/java/com/ruoyi/production/pojo/ProductProcess.java
index 1462c49..4c70400 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductProcess.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductProcess.java
@@ -42,6 +42,8 @@
     @Excel(name = "澶囨敞")
     private String remark;
 
+    @Excel(name = "鐢ㄦ埛鏉冮檺(,闅斿紑)")
+    private String userPower;
 
     /**
      * 宸ヨ祫瀹氶
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductProcessRoute.java b/src/main/java/com/ruoyi/production/pojo/ProductProcessRoute.java
index 5d7ab56..7a221bf 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductProcessRoute.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductProcessRoute.java
@@ -7,12 +7,15 @@
 import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
 import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * <p>
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java b/src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java
index d84a7ce..6e585c0 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java
@@ -1,9 +1,12 @@
 package com.ruoyi.production.pojo;
 
 import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 
 @Data
@@ -12,6 +15,22 @@
 
     @TableId(type = IdType.AUTO)
     private Long id;
+
+    /**
+     * 璁″垝寮�濮嬫椂闂�
+     */
+    @ApiModelProperty(value = "璁″垝寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate planStartTime;
+
+    /**
+     * 璁″垝缁撴潫鏃堕棿
+     */
+    @ApiModelProperty(value = "璁″垝缁撴潫鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate planEndTime;
 
     @ApiModelProperty(value = "鐢熶骇璁㈠崟id(product_order_id)")
     private Long productOrderId;
@@ -39,6 +58,16 @@
     private Integer dragSort;
 
     @ApiModelProperty(value ="鏄惁璐ㄦ")
-    private Boolean isQuality;
+    private Boolean isQuality = false;
+
+    /**
+     * 鐢ㄦ埛鏉冮檺
+     */
+    @ApiModelProperty(value = "鐢ㄦ埛鎶ュ伐鏉冮檺")
+    private String userPower;
+
+    @ApiModelProperty(value = "璁″垝鏁�")
+    private Integer planNum;
+
 
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductStructureRecord.java b/src/main/java/com/ruoyi/production/pojo/ProductStructureRecord.java
new file mode 100644
index 0000000..c585866
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/pojo/ProductStructureRecord.java
@@ -0,0 +1,61 @@
+package com.ruoyi.production.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟-鐗╂枡娓呭崟琛�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-03-26 10:34:23
+ */
+@Getter
+@Setter
+@TableName("product_structure_record")
+@ApiModel(value = "ProductStructureRecord瀵硅薄", description = "鐢熶骇璁㈠崟-鐗╂枡娓呭崟琛�")
+public class ProductStructureRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("鐖惰妭鐐笽D")
+    private Long parentId;
+
+    @ApiModelProperty("浜у搧id")
+    private Long productModelId;
+
+    @ApiModelProperty("鐢熶骇璁㈠崟id")
+    private Long productOrderId;
+
+    @ApiModelProperty("宸ュ簭id")
+    private Long processId;
+
+    @ApiModelProperty("鍗曚綅浜у嚭闇�瑕佹暟閲�")
+    private BigDecimal unitQuantity;
+
+    @ApiModelProperty("闇�姹傛暟閲�")
+    private BigDecimal demandedQuantity;
+
+    @ApiModelProperty("鍗曚綅")
+    private String unit;
+
+    @ApiModelProperty("绉熸埛id")
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+    @ApiModelProperty("bom鐨刬d")
+    private Long bomId;
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java b/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
index 4efc694..c666bfe 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
@@ -65,9 +65,9 @@
     private String workOrderNo;
 
     /**
-     * 鐘舵��  1 寰呯‘璁�  2 寰呯敓浜� 3鐢熶骇涓� 4宸插畬鎴�
+     * 鐘舵��  1 寰呯‘璁�  2 寰呯敓浜� 3鐢熶骇涓�
      */
-    @ApiModelProperty(value = "鐘舵��  1 寰呯‘璁�  2 寰呯敓浜� 3鐢熶骇涓� 4宸插畬鎴�")
+    @ApiModelProperty(value = "鐘舵��  1 寰呯‘璁�  2 寰呯敓浜� 3宸插畬鎴�")
     private Integer status;
 
     /**
@@ -121,5 +121,14 @@
     @ApiModelProperty(value = "瀹屾垚鏁伴噺")
     private BigDecimal completeQuantity;
 
+    /**
+     * 鐢ㄦ埛鏉冮檺
+     */
+    @ApiModelProperty(value = "鐢ㄦ埛鎶ュ伐鏉冮檺")
+    private String userPower;
+
+    @ApiModelProperty(value = "璁″垝鏁�")
+    private Integer planNum;
+
 
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProcessRouteService.java b/src/main/java/com/ruoyi/production/service/ProcessRouteService.java
index 6b408cf..6bb9723 100644
--- a/src/main/java/com/ruoyi/production/service/ProcessRouteService.java
+++ b/src/main/java/com/ruoyi/production/service/ProcessRouteService.java
@@ -16,4 +16,6 @@
     Integer saveProcessRoute(ProcessRoute processRoute);
 
     int batchDelete(List<Long> ids);
+
+    int updateProcessRoute(ProcessRoute processRoute);
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductOrderService.java b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
index 5a714a6..cc722d2 100644
--- a/src/main/java/com/ruoyi/production/service/ProductOrderService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -9,6 +9,7 @@
 import com.ruoyi.production.pojo.ProcessRoute;
 import com.ruoyi.production.pojo.ProductOrder;
 
+import java.io.IOException;
 import java.util.List;
 
 
@@ -22,7 +23,9 @@
 
     List<ProductStructureDto> listProcessBom(Long orderId);
 
-    Boolean addProductOrder(ProductOrder productOrder);
+    Boolean addProductOrder(ProductOrder productOrder) throws IOException;
 
     Boolean delete(Long[] id);
+
+    Object startOrPause(ProductOrderDto productOrder);
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductProcessRouteService.java b/src/main/java/com/ruoyi/production/service/ProductProcessRouteService.java
index 238aa1e..44d3ced 100644
--- a/src/main/java/com/ruoyi/production/service/ProductProcessRouteService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductProcessRouteService.java
@@ -4,6 +4,8 @@
 import com.ruoyi.production.pojo.ProductProcessRoute;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * <p>
  *  鏈嶅姟绫�
@@ -14,5 +16,5 @@
  */
 public interface ProductProcessRouteService extends IService<ProductProcessRoute> {
 
-    ProcessRouteDto listMain(Long orderId);
+    List<ProcessRouteDto> listMain(Long orderId);
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductStructureRecordService.java b/src/main/java/com/ruoyi/production/service/ProductStructureRecordService.java
new file mode 100644
index 0000000..a03737e
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/ProductStructureRecordService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.production.service;
+
+import com.ruoyi.production.pojo.ProductStructureRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟-鐗╂枡娓呭崟琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-03-26 10:34:23
+ */
+public interface ProductStructureRecordService extends IService<ProductStructureRecord> {
+
+}
diff --git a/src/main/java/com/ruoyi/production/service/ProductStructureService.java b/src/main/java/com/ruoyi/production/service/ProductStructureService.java
index ebdddb1..2fa2056 100644
--- a/src/main/java/com/ruoyi/production/service/ProductStructureService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductStructureService.java
@@ -14,4 +14,5 @@
 
     List<ProductStructureDto> listBybomId(Integer bomId);
 
+    List<ProductStructureDto> listBybomIdIsParent(Integer bomId);
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
index b3beded..7a6b54b 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
@@ -1,9 +1,12 @@
 package com.ruoyi.production.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.production.dto.ProcessRouteDto;
 import com.ruoyi.production.mapper.ProcessRouteItemMapper;
 import com.ruoyi.production.mapper.ProcessRouteMapper;
@@ -47,12 +50,23 @@
 
     @Override
     public Integer saveProcessRoute(ProcessRoute processRoute) {
+        String nickName = SecurityUtils.getLoginUser().getNickName();
+        processRoute.setCreateBy(nickName);
         this.save(processRoute);
-        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-        String idStr = String.format("%06d", processRoute.getId());
-        String newProductCode = "GYLX" + dateStr + idStr;
-        // 鏇存柊鏁版嵁搴撲腑鐨刾roductCode
-        processRoute.setProcessRouteCode(newProductCode);
+        // 鏂板瀛愯〃鏁版嵁
+        if(CollectionUtils.isNotEmpty(processRoute.getProcessRouteItems())){
+            for (ProcessRouteItem processRouteItem : processRoute.getProcessRouteItems()) {
+                processRouteItem.setRouteId(processRoute.getId());
+                processRouteItemMapper.insert(processRouteItem);
+            }
+        }
+        if(StringUtils.isEmpty(processRoute.getProcessRouteCode())){
+            String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+            String idStr = String.format("%06d", processRoute.getId());
+            String newProductCode = "GYLX" + dateStr + idStr;
+            // 鏇存柊鏁版嵁搴撲腑鐨刾roductCode
+            processRoute.setProcessRouteCode(newProductCode);
+        }
         return processRouteMapper.updateById(processRoute);
     }
 
@@ -60,11 +74,24 @@
     public int batchDelete(List<Long> ids) {
         //鍏堝垽鏂槸鍚﹀凡缁忓紩鐢ㄤ簡
         List<ProductOrder> productOrders = productOrderMapper.selectList(Wrappers.<ProductOrder>lambdaQuery().in(ProductOrder::getRouteId, ids));
-        if (productOrders.size()>0){
+        if (CollectionUtils.isNotEmpty(productOrders)){
             throw new RuntimeException("璇ュ伐鑹鸿矾绾跨敓浜у凡寮曠敤锛屼笉鑳藉垹闄�");
         }
         //鍒犻櫎宸ヨ壓璺嚎璇︽儏
         processRouteItemMapper.delete(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getRouteId, ids));
         return processRouteMapper.deleteBatchIds(ids);
     }
+
+    @Override
+    public int updateProcessRoute(ProcessRoute processRoute) {
+        this.updateById(processRoute);
+        processRouteItemMapper.delete(Wrappers.<ProcessRouteItem>lambdaQuery().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
+        if(CollectionUtils.isNotEmpty(processRoute.getProcessRouteItems())){
+            for (ProcessRouteItem processRouteItem : processRoute.getProcessRouteItems()) {
+                processRouteItem.setRouteId(processRoute.getId());
+                processRouteItemMapper.insert(processRouteItem);
+            }
+        }
+        return 1;
+    }
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java
index 2554b5e..982b0c2 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.basic.pojo.Product;
@@ -97,6 +98,53 @@
         return AjaxResult.error();
     }
 
+    /**
+     * 閫掑綊淇濆瓨 BOM锛氬厛淇濆瓨鐖堕」 鈫� 淇濆瓨瀛愰」 鈫� 寤虹珛鍏崇郴 鈫� 閫掑綊瀛愰」鐨勫瓙椤�
+     * @param children 褰撳墠鐖堕」鐨勫瓙椤瑰垪琛�
+     * @return 淇濆瓨鍚庣殑鐖堕」浜у搧ID
+     */
+    private void saveBomRecursive(List<BomImportDto> children,ProductBom bom,ProductModel rootModel,Map<String, Long> processMap) {
+        // 1. 鑾峰彇children涓瓙椤逛骇鍝佺紪鍙蜂负绌虹殑鏁版嵁
+        List<BomImportDto> parentChildren = children
+                .stream()
+                .filter(child -> StringUtils.isEmpty(child.getChildCode()))
+                .collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(parentChildren)){
+            throw new ServiceException("璇烽�夋嫨鐖堕」浜у搧缂栧彿");
+        }
+        BomImportDto parentId = parentChildren.get(0); // 鐖剁骇鏁版嵁
+        ProductStructure rootNode = new ProductStructure();
+        rootNode.setBomId(bom.getId());
+        rootNode.setParentId(null); // 椤跺眰娌℃湁鐖惰妭鐐�
+        rootNode.setProductModelId(rootModel.getId());
+        rootNode.setUnitQuantity(BigDecimal.ONE);
+        rootNode.setUnit(rootModel.getUnit());
+        productStructureService.save(rootNode);
+
+        // 2. 閬嶅巻瀛愰」锛岄�愪釜澶勭悊
+        for (BomImportDto child : children) {
+            //  璺宠繃娌℃湁瀛愰」鐨勭埗椤�
+            if(StringUtils.isEmpty(child.getChildCode())){
+                continue;
+            }
+            //  鑾峰彇瀛愰」妯″瀷淇℃伅
+            ProductModel childModel = findModel(child.getChildName(), child.getChildSpec());
+
+            //  鎻掑叆缁撴瀯琛�
+            ProductStructure node = new ProductStructure();
+            node.setBomId(bom.getId());
+            node.setParentId(rootNode.getId()); // 鐖惰妭鐐笽D
+            node.setProductModelId(childModel.getId());
+            node.setUnitQuantity(child.getUnitQty());
+            node.setUnit(childModel.getUnit());
+            if (processMap.containsKey(child.getProcess())) {
+                node.setProcessId(processMap.get(child.getProcess()));
+            }
+            productStructureService.save(node);
+        }
+    }
+
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public AjaxResult uploadBom(MultipartFile file) {
@@ -120,67 +168,25 @@
         handleProcess(list);
         Map<String, Long> processMap = productProcessService.list().stream()
                 .collect(Collectors.toMap(ProductProcess::getName, ProductProcess::getId, (k1, k2) -> k1));
-
-        //  鍒涘缓 BOM 鏁版嵁
-        BomImportDto first = list.get(0);
-        ProductModel rootModel = findModel(first.getParentName(), first.getParentSpec());
-        ProductBom bom = new ProductBom();
-        bom.setProductModelId(rootModel.getId());
-        bom.setVersion("1.0");
-        productBomMapper.insert(bom);
-        bom.setBomNo("BM." + String.format("%05d", bom.getId()));
-        productBomMapper.updateById(bom);
-
-        // 璁板綍宸茬粡鎻掑叆缁撴瀯鐨勮妭鐐癸細Key = "鍚嶇О+瑙勬牸", Value = structure_id
-        Map<String, Long> treePathMap = new HashMap<>();
-
-        for (int i = 0; i < list.size(); i++) {
-            BomImportDto dto = list.get(i);
-            String parentKey = dto.getParentName() + "|" + dto.getParentSpec();
-            String childKey = dto.getChildName() + "|" + dto.getChildSpec();
-
-            //澶勭悊鏍硅妭鐐�,绗竴琛屼笖瀛愰」涓虹┖
-            if (i == 0 && StringUtils.isBlank(dto.getChildName())) {
-                ProductStructure rootNode = new ProductStructure();
-                rootNode.setBomId(bom.getId());
-                rootNode.setParentId(null); // 椤跺眰娌℃湁鐖惰妭鐐�
-                rootNode.setProductModelId(rootModel.getId());
-                rootNode.setUnitQuantity(BigDecimal.ONE);
-                rootNode.setUnit(rootModel.getUnit());
-                productStructureService.save(rootNode);
-
-                treePathMap.put(parentKey, rootNode.getId());
-                continue;
-            }
-
-            //  澶勭悊瀛愬眰绾ц妭鐐�
-            //  鎵惧埌鐖惰妭鐐瑰湪鏁版嵁搴撻噷鐨� ID
-            Long parentStructureId = treePathMap.get(parentKey);
-            if (parentStructureId == null) {
-                // 濡傛灉 Map 閲屾壘涓嶅埌锛岃鏄� Excel 椤哄簭涔变簡鎴栬�呮暟鎹湁璇�
-                throw new ServiceException("瀵煎叆澶辫触: 鐖堕」[" + dto.getParentName() + "]蹇呴』鍦ㄥ叾瀛愰」涔嬪墠瀹氫箟");
-            }
-
-            //  鑾峰彇瀛愰」妯″瀷淇℃伅
-            ProductModel childModel = findModel(dto.getChildName(), dto.getChildSpec());
-
-            //  鎻掑叆缁撴瀯琛�
-            ProductStructure node = new ProductStructure();
-            node.setBomId(bom.getId());
-            node.setParentId(parentStructureId); // 鐖惰妭鐐笽D
-            node.setProductModelId(childModel.getId());
-            node.setUnitQuantity(dto.getUnitQty());
-            node.setUnit(childModel.getUnit());
-            if (processMap.containsKey(dto.getProcess())) {
-                node.setProcessId(processMap.get(dto.getProcess()));
-            }
-            productStructureService.save(node);
-
-            //  鎶婂綋鍓嶅瓙椤硅褰曞埌 Map,浣滀负浠ュ悗鏇存繁灞傜骇鐨勭埗椤规煡鎵句緷鎹�
-            //  鍚屼竴鐖堕」涓嬬殑鍚屽悕瀛愰」涓嶉渶瑕侀噸澶嶈褰�
-            treePathMap.put(childKey, node.getId());
+        // 1. 鎸夌埗椤圭紪鐮佸垎缁�
+        Map<String, List<BomImportDto>> parentMap = list.stream()
+                .filter(bom -> StringUtils.isNotBlank(bom.getParentCode()))
+                .collect(Collectors.groupingBy(BomImportDto::getParentCode));
+        // 2. 閬嶅巻鎵�鏈夌埗椤癸紝閫掑綊淇濆瓨
+        for (Map.Entry<String, List<BomImportDto>> entry : parentMap.entrySet()) {
+            //  鍒涘缓 BOM 鏁版嵁
+            BomImportDto first = entry.getValue().get(0);
+            ProductModel rootModel = findModel(first.getParentName(), first.getParentSpec());
+            ProductBom bom = new ProductBom();
+            bom.setProductModelId(rootModel.getId());
+            bom.setVersion("1.0");
+            productBomMapper.insert(bom);
+            bom.setBomNo("BM." + String.format("%05d", bom.getId()));
+            productBomMapper.updateById(bom);
+            // 澶勭悊bom瀛愯〃鏁版嵁
+            List<BomImportDto> children = entry.getValue();
+            saveBomRecursive(children,bom,rootModel,processMap);
         }
-
         return AjaxResult.success("BOM瀵煎叆鎴愬姛");
     }
 
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
index 6d46f7c..fe78782 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -3,11 +3,15 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.enums.FileNameType;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.dto.ProductOrderDto;
 import com.ruoyi.production.dto.ProductStructureDto;
@@ -16,14 +20,20 @@
 import com.ruoyi.production.service.ProductOrderService;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
 import com.ruoyi.quality.pojo.QualityInspect;
+import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.service.impl.StockInventoryServiceImpl;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.io.File;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -38,6 +48,9 @@
 
     @Autowired
     private ProductProcessRouteMapper productProcessRouteMapper;
+
+    @Autowired
+    private ProductStructureRecordMapper productStructureRecordMapper;
 
     @Autowired
     private ProcessRouteItemMapper processRouteItemMapper;
@@ -69,6 +82,9 @@
     @Autowired
     private StockInventoryServiceImpl stockInventoryService;
 
+    @Autowired
+    private CommonFileServiceImpl commonFileService;
+
     @Override
     public IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder) {
         IPage<ProductOrderDto> productOrderDtoIPage = productOrderMapper.pageProductOrder(page, productOrder);
@@ -82,6 +98,9 @@
             if(stockInventoryDtoIPage.getTotal() > 0){
                 productOrderDto.setInventoryQuantity(stockInventoryDtoIPage.getRecords().get(0).getQualitity());
             }
+            // 闄勪欢
+            productOrderDto.setSalesLedgerFiles(commonFileService.getFileListByBusinessId(productOrderDto.getId()
+            , FileNameType.PRODUCT_ORDER.getValue()));
         });
         return productOrderDtoIPage;
     }
@@ -96,46 +115,58 @@
         productProcessRoute.setProductOrderId(productOrder.getId());
         productProcessRoute.setBomId(processRoute.getBomId());
         productProcessRouteMapper.insert(productProcessRoute);
+        // 缁戝畾鐢熶骇bom娓呭崟
+        List<ProductStructureRecord> productStructureDtos = productOrder.getProductStructureRecords();
+        productStructureDtos.forEach(item ->{
+            item.setProductOrderId(productOrder.getId());
+            productStructureRecordMapper.insert(item);
+        });
         //鏂板鐢熶骇璁㈠崟涓嬬殑宸ヨ壓璺嚎瀛愯〃
-        List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
+        List<ProductProcessRouteItem> processRouteItems = productOrder.getProcessRouteItems();
         // 鐢熸垚褰撳墠鏃ユ湡鐨勫墠缂�锛氬勾鏈堟棩
         String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-        for (ProcessRouteItem processRouteItem : processRouteItems) {
-            ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
-            productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
-            productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
+        for (ProductProcessRouteItem productProcessRouteItem : processRouteItems) {
+            productProcessRouteItem.setProductModelId(productOrder.getProductModelId());
             productProcessRouteItem.setProductOrderId(productOrder.getId());
             productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
-            productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
             int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
             if (insert > 0) {
                 // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
                 ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
-                int sequenceNumber = 1; // 榛樿搴忓彿
-                if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
-                    String lastNo = lastWorkOrder.getWorkOrderNo().toString();
-                    if (lastNo.startsWith(datePrefix)) {
-                        String seqStr = lastNo.substring(datePrefix.length());
-                        try {
-                            sequenceNumber = Integer.parseInt(seqStr) + 1;
-                        } catch (NumberFormatException e) {
-                            sequenceNumber = 1;
-                        }
-                    }
-                }
-                // 鐢熸垚瀹屾暣鐨勫伐鍗曞彿
-                String workOrderNoStr = "GD" + String.format("%s%03d", datePrefix, sequenceNumber);
+                String workOrderNoStr = getWorkOrderNoStr(lastWorkOrder, datePrefix); // 宸ュ崟鍙�
                 ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                 productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                 productWorkOrder.setProductOrderId(productOrder.getId());
                 ProductOrder order = productOrderMapper.selectById(productOrder.getId());
                 productWorkOrder.setPlanQuantity(order.getQuantity());
                 productWorkOrder.setWorkOrderNo(workOrderNoStr);
+                productWorkOrder.setPlanStartTime(productProcessRouteItem.getPlanStartTime());
+                productWorkOrder.setPlanEndTime(productProcessRouteItem.getPlanEndTime());
                 productWorkOrder.setStatus(1);
+                productWorkOrder.setUserPower(productProcessRouteItem.getUserPower());
                 productWorkOrderMapper.insert(productWorkOrder);
             }
         }
         return productOrderMapper.updateById(productOrder);
+    }
+
+    @NotNull
+    private static String getWorkOrderNoStr(ProductWorkOrder lastWorkOrder, String datePrefix) {
+        int sequenceNumber = 1; // 榛樿搴忓彿
+        if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
+            String lastNo = lastWorkOrder.getWorkOrderNo();
+            if (lastNo.startsWith(datePrefix)) {
+                String seqStr = lastNo.substring(datePrefix.length());
+                try {
+                    sequenceNumber = Integer.parseInt(seqStr) + 1;
+                } catch (NumberFormatException e) {
+                    sequenceNumber = 1;
+                }
+            }
+        }
+        // 鐢熸垚瀹屾暣鐨勫伐鍗曞彿
+        String workOrderNoStr = "GD" + String.format("%s%03d", datePrefix, sequenceNumber);
+        return workOrderNoStr;
     }
 
     @Override
@@ -149,20 +180,24 @@
     }
 
     @Override
-    public Boolean addProductOrder(ProductOrder productOrder) {
+    public Boolean addProductOrder(ProductOrder productOrder) throws IOException {
         String string = generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
         productOrder.setNpsNo(string);
         productOrder.setCompleteQuantity(BigDecimal.ZERO);
+        productOrder.setStatus("寰呯敓浜�");
         this.save(productOrder);
         if (ObjectUtils.isNotEmpty(productOrder.getRouteId())) {
             this.bindingRoute(productOrder);
+        }
+        if(CollectionUtils.isNotEmpty(productOrder.getTempFileIds())){
+            commonFileService.migrateTempFilesToFormal(productOrder.getId(), productOrder.getTempFileIds());
         }
         return true;
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean delete(Long[] ids) {
-
         //鎵归噺鏌ヨproductOrder
         List<ProductOrder> productOrders = productOrderMapper.selectList(
                 new LambdaQueryWrapper<ProductOrder>()
@@ -247,10 +282,42 @@
             // 鎵归噺鍒犻櫎productOrder
             productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
                     .in(ProductOrder::getId, ids));
+            // 鍒犻櫎闄勪欢
+            commonFileService.deleteByBusinessIds(Arrays.asList(ids), FileNameType.PRODUCT_ORDER.getValue());
+            // 鍒犻櫎鐢熶骇璁㈠崟-鐗╂枡娓呭崟
+            productStructureRecordMapper.delete(new LambdaQueryWrapper<ProductStructureRecord>()
+                    .in(ProductStructureRecord::getProductOrderId, ids));
         }
+
         return true;
     }
 
+    @Override
+    public Object startOrPause(ProductOrderDto item) {
+        ProductOrder productOrder = productOrderMapper.selectById(item.getId());
+        if(productOrder == null){
+            throw new ServiceException("鐢熶骇璁㈠崟涓嶅瓨鍦�");
+        }
+        int i;
+        if(item.getOperation().equals(1)){
+            i = 2;
+        } else {
+            i = 1;
+        }
+        productOrder.setStatus(item.getOperation() == 1 ? "鐢熶骇涓�" : "寰呯敓浜�");
+        productOrderMapper.updateById(productOrder);
+        List<ProductWorkOrder> productWorkOrders = productWorkOrderMapper.selectList(new LambdaQueryWrapper<ProductWorkOrder>()
+                .eq(ProductWorkOrder::getProductOrderId, productOrder.getId()));
+        if(CollectionUtils.isNotEmpty(productWorkOrders)){
+
+            productWorkOrders.forEach(productWorkOrder -> {
+                productWorkOrder.setStatus(i);
+                productWorkOrderMapper.updateById(productWorkOrder);
+            });
+        }
+        return "鎿嶄綔鎴愬姛";
+    }
+
     //鑾峰彇褰撳墠鐢熶骇璁㈠崟鍙�
     public String getMaxOrderNoByDate(String datePrefix) {
         QueryWrapper<ProductOrder> queryWrapper = new QueryWrapper<>();
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteServiceImpl.java
index f5b2e92..ebcf896 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteServiceImpl.java
@@ -8,6 +8,8 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * <p>
  *  鏈嶅姟瀹炵幇绫�
@@ -23,7 +25,7 @@
     private ProductProcessRouteMapper productProcessRouteMapper;
 
     @Override
-    public ProcessRouteDto listMain(Long orderId) {
+    public List<ProcessRouteDto> listMain(Long orderId) {
         return productProcessRouteMapper.listMain(orderId);
     }
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
index 3be9086..4aa7cdb 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
@@ -9,6 +9,7 @@
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.production.dto.ProductProcessDto;
+import com.ruoyi.production.dto.SysDeptAndUserDto;
 import com.ruoyi.production.mapper.ProcessRouteItemMapper;
 import com.ruoyi.production.mapper.ProductProcessMapper;
 import com.ruoyi.production.mapper.ProductProcessRouteItemMapper;
@@ -16,12 +17,18 @@
 import com.ruoyi.production.pojo.ProductProcess;
 import com.ruoyi.production.pojo.ProductProcessRouteItem;
 import com.ruoyi.production.service.ProductProcessService;
+import com.ruoyi.project.system.domain.SysDept;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysDeptMapper;
+import com.ruoyi.project.system.mapper.SysUserDeptMapper;
+import com.ruoyi.project.system.mapper.SysUserMapper;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.ArrayList;
 import java.util.List;
 
 @Service
@@ -32,6 +39,13 @@
     private ProcessRouteItemMapper processRouteItemMapper;
     @Autowired
     private ProductProcessRouteItemMapper productProcessRouteItemMapper;
+
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
+    @Autowired
+    private SysUserDeptMapper sysUserDeptMapper;
+    @Autowired
+    private SysUserMapper sysUserMapper;
 
     @Override
     public IPage<ProductProcessDto> listPage(Page page, ProductProcessDto productProcessDto) {
@@ -89,4 +103,61 @@
         productProcessMapper.deleteBatchIds(ids);
         return null;
     }
+
+    public List<SysDeptAndUserDto> listDeptUserTree() {
+       return buildDeptUserTree();
+    }
+
+
+    /**
+     * 鏋勫缓瀹屾暣鐨勯儴闂�-鐢ㄦ埛鏍戝舰缁撴瀯
+     */
+    public List<SysDeptAndUserDto> buildDeptUserTree() {
+        // 1. 鏌ヨ鎵�鏈夋牴閮ㄩ棬锛坧arent_id = 0锛�
+        List<SysDeptAndUserDto> rootDeptList = sysDeptMapper.selectChildrenDeptByParentId(0L);
+
+        // 2. 閫掑綊鏋勫缓姣忎釜鏍归儴闂ㄧ殑瀛愯妭鐐癸紝骞舵寕杞界敤鎴�
+        for (SysDeptAndUserDto rootDept : rootDeptList) {
+            buildChildrenDept(rootDept);
+            loadDeptUser(rootDept);
+        }
+
+        return rootDeptList;
+    }
+
+    /**
+     * 閫掑綊鏋勫缓瀛愰儴闂�
+     */
+    private void buildChildrenDept(SysDeptAndUserDto parentDept) {
+        // 鏌ヨ褰撳墠閮ㄩ棬鐨勫瓙閮ㄩ棬
+        List<SysDeptAndUserDto> childrenDept = sysDeptMapper.selectChildrenDeptByParentId(parentDept.getDeptId());
+        if (childrenDept == null || childrenDept.isEmpty()) {
+            parentDept.setChildrenList(new ArrayList<>());
+            return;
+        }
+
+        // 涓烘瘡涓瓙閮ㄩ棬閫掑綊鏋勫缓涓嬬骇锛屽苟鎸傝浇鐢ㄦ埛
+        for (SysDeptAndUserDto childDept : childrenDept) {
+            buildChildrenDept(childDept);
+            loadDeptUser(childDept);
+        }
+
+        parentDept.setChildrenList(childrenDept);
+    }
+
+    /**
+     * 涓洪儴闂ㄥ姞杞藉叧鑱旂殑鐢ㄦ埛
+     */
+    private void loadDeptUser(SysDeptAndUserDto dept) {
+        // 鏌ヨ閮ㄩ棬鍏宠仈鐨勭敤鎴稩D
+        List<Long> userIdList = sysUserDeptMapper.selectUserIdByDeptId(dept.getDeptId());
+        if (userIdList == null || userIdList.isEmpty()) {
+            dept.setUserList(new ArrayList<>());
+            return;
+        }
+
+        // 鏍规嵁鐢ㄦ埛ID鏌ヨ鐢ㄦ埛淇℃伅
+        List<SysUser> userList = sysUserMapper.selectUserListByIds(userIdList);
+        dept.setUserList(userList);
+    }
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductStructureRecordServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductStructureRecordServiceImpl.java
new file mode 100644
index 0000000..59f4b6f
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductStructureRecordServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.production.service.impl;
+
+import com.ruoyi.production.pojo.ProductStructureRecord;
+import com.ruoyi.production.mapper.ProductStructureRecordMapper;
+import com.ruoyi.production.service.ProductStructureRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 鐢熶骇璁㈠崟-鐗╂枡娓呭崟琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-03-26 10:34:23
+ */
+@Service
+public class ProductStructureRecordServiceImpl extends ServiceImpl<ProductStructureRecordMapper, ProductStructureRecord> implements ProductStructureRecordService {
+
+}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
index 381b642..703bbe4 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
@@ -129,9 +129,11 @@
     }
 
 
+
+
     @Override
     public List<ProductStructureDto> listBybomId(Integer bomId) {
-        List<ProductStructureDto> list = productStructureMapper.listBybomId(bomId);
+        List<ProductStructureDto> list = productStructureMapper.listBybomId(bomId,false);
 
         Map<Long, ProductStructureDto> map = new HashMap<>();
         for (ProductStructureDto node : list) {
@@ -154,4 +156,9 @@
         return tree;
     }
 
+    @Override
+    public List<ProductStructureDto> listBybomIdIsParent(Integer bomId) {
+        return productStructureMapper.listBybomId(bomId,true);
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index e24045c..301db75 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -97,6 +98,13 @@
         if (productProcessRouteItem == null) {
             throw new RuntimeException("宸ヨ壓璺嚎椤逛笉瀛樺湪");
         }
+        // 鑾峰彇璁㈠崟鐨勫凡瀹屾垚宸ュ崟
+        List<ProductWorkOrder> productWorkOrderList = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery()
+                .eq(ProductWorkOrder::getProductOrderId, productProcessRouteItem.getProductOrderId())
+                .eq(ProductWorkOrder::getStatus, 3));
+        if(CollectionUtils.isEmpty(productWorkOrderList)){
+            productWorkOrderList = new ArrayList<>();
+        }
         //褰撳墠鍏蜂綋宸ュ簭
         ProductProcess productProcess = productProcessMapper.selectById(productProcessRouteItem.getProcessId());
         //宸ヨ壓璺嚎涓綋鍓嶅伐搴忓搴旂殑浜у嚭瑙勬牸鍨嬪彿
@@ -150,7 +158,7 @@
 
             ProductionProductInput productionProductInput = new ProductionProductInput();
             productionProductInput.setProductModelId(productStructureDto.getProductModelId());
-            productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
+            productionProductInput.setQuantity(dto.getQuantity());
             productionProductInput.setProductMainId(productionProductMain.getId());
             productionProductInputMapper.insert(productionProductInput);
             stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId());
@@ -173,7 +181,7 @@
                 //瀵瑰簲鐨勮繃绋嬫鎴栬�呭嚭鍘傛
                 int inspectType = 1;
                 String process = productProcess.getName();//宸ュ簭
-                if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
+                if (productWorkOrderList.size() == productProcessRouteItems.size() - 1) {
                     //鏈�鍚庝竴閬撳伐搴忕敓鎴愬嚭鍘傛
                     inspectType = 2;
                     process = null;
@@ -214,21 +222,25 @@
             productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(productQty));
             if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())) {
                 productWorkOrder.setActualStartTime(LocalDate.now());//瀹為檯寮�濮嬫椂闂�
+                productWorkOrder.setStatus(2);
             }
             if (productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) == 0) {
                 productWorkOrder.setActualEndTime(LocalDate.now());//瀹為檯缁撴潫鏃堕棿
+                productWorkOrder.setStatus(3);
             }
             productWorkOrderMapper.updateById(productWorkOrder);
             //鐢熶骇璁㈠崟
             ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
             if (ObjectUtils.isNull(productOrder.getStartTime())) {
                 productOrder.setStartTime(LocalDateTime.now());//寮�濮嬫椂闂�
+                productOrder.setStatus("鐢熶骇涓�");
             }
-            if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
+            if (productWorkOrderList.size() == productProcessRouteItems.size() - 1) {
                 //濡傛灉鏄渶鍚庝竴閬撳伐搴忔姤宸ヤ箣鍚庣敓浜ц鍗曞畬鎴愭暟閲�+
                 productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().add(productQty));
                 if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) == 0) {
                     productOrder.setEndTime(LocalDateTime.now());//缁撴潫鏃堕棿
+                    productOrder.setStatus("宸插畬鎴�");
                 }
             }
             productOrderMapper.updateById(productOrder);
diff --git a/src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java b/src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java
index 942a700..6691511 100644
--- a/src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java
+++ b/src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java
@@ -2,6 +2,7 @@
 
 import java.util.List;
 
+import com.ruoyi.production.dto.SysDeptAndUserDto;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import com.ruoyi.project.system.domain.SysDept;
@@ -125,4 +126,14 @@
      * @return
      */
     Long maxLevelDeptId(Long deptId);
+
+    /**
+     * 鏌ヨ鎵�鏈夋湁鏁堥儴闂紙鏈垹闄ゃ�佺姸鎬佹甯革級
+     */
+    List<SysDeptAndUserDto> selectAllDept();
+
+    /**
+     * 鏍规嵁閮ㄩ棬ID鏌ヨ瀛愰儴闂�
+     */
+    List<SysDeptAndUserDto> selectChildrenDeptByParentId(@Param("parentId") Long parentId);
 }
diff --git a/src/main/java/com/ruoyi/project/system/mapper/SysUserDeptMapper.java b/src/main/java/com/ruoyi/project/system/mapper/SysUserDeptMapper.java
index d6bed98..7db2e41 100644
--- a/src/main/java/com/ruoyi/project/system/mapper/SysUserDeptMapper.java
+++ b/src/main/java/com/ruoyi/project/system/mapper/SysUserDeptMapper.java
@@ -12,4 +12,9 @@
 public interface SysUserDeptMapper extends BaseMapper<SysUserDept> {
 
     List<SysUserDeptVo> userLoginFacotryList(@Param("userDeptVo") SysUserDeptVo userDeptVo);
+
+    /**
+     * 鏍规嵁閮ㄩ棬ID鏌ヨ鍏宠仈鐨勭敤鎴稩D鍒楄〃
+     */
+    List<Long> selectUserIdByDeptId(@Param("deptId") Long deptId);
 }
diff --git a/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java b/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
index 5507b3f..c99371f 100644
--- a/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
+++ b/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
@@ -156,4 +156,9 @@
     List<Long> getUserByRole(@Param("role") String role);
 
     List<Long> getUserByPerms(@Param("perms") List<String> perms);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鍒楄〃鏌ヨ鐢ㄦ埛淇℃伅
+     */
+    List<SysUser> selectUserListByIds(@Param("userIds") List<Long> userIds);
 }
diff --git a/src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java
index f3aac49..aa01361 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.enums.FileNameType;
 import com.ruoyi.other.mapper.TempFileMapper;
 import com.ruoyi.other.pojo.TempFile;
 import com.ruoyi.sales.mapper.CommonFileMapper;
@@ -138,13 +139,6 @@
             Path formalFilePath = formalDirPath.resolve(formalFilename);
 
             try {
-                // 鎵ц鏂囦欢杩佺Щ锛堜娇鐢ㄥ師瀛愭搷浣滅‘淇濆畨鍏ㄦ�э級
-//                Files.move(
-//                        Paths.get(tempFile.getTempPath()),
-//                        formalFilePath,
-//                        StandardCopyOption.REPLACE_EXISTING,
-//                        StandardCopyOption.ATOMIC_MOVE
-//                );
                 // 鍘熷瓙绉诲姩澶辫触锛屼娇鐢ㄥ鍒�+鍒犻櫎
                 Files.copy(Paths.get(tempFile.getTempPath()), formalFilePath, StandardCopyOption.REPLACE_EXISTING);
                 Files.deleteIfExists(Paths.get(tempFile.getTempPath()));
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
index ade3d09..5f8a9a0 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -499,7 +499,7 @@
         if (processRoute == null) {
             return R.fail("璇峰厛璁剧疆宸ヨ壓璺嚎");
         }
-        List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomId(processRoute.getBomId());
+        List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomId(processRoute.getBomId(),false);
         if (productStructureDtos.isEmpty()) {
             return R.fail("璇峰厛璁剧疆浜у搧缁撴瀯");
         }
diff --git a/src/main/resources/mapper/basic/ProductModelMapper.xml b/src/main/resources/mapper/basic/ProductModelMapper.xml
index 9768e8f..89954e5 100644
--- a/src/main/resources/mapper/basic/ProductModelMapper.xml
+++ b/src/main/resources/mapper/basic/ProductModelMapper.xml
@@ -113,9 +113,12 @@
                pm.model as  model,
                pm.unit as unit,
                pm.drawing_number as drawingNumber,
-               pm.product_type as productType
+               pm.product_type as productType,
+               pr.id as routeId,
+               pr.process_route_name as routeName
         from product_model pm
-                 left join product p on p.id = pm.product_id
+                left join product p on p.id = pm.product_id
+                left join process_route pr on pr.id = pm.route_id
         <where>
             <if test="req.productName != null and req.productName != ''">
                 and p.product_name like concat('%',#{req.productName},'%')
diff --git a/src/main/resources/mapper/production/ProcessRouteItemMapper.xml b/src/main/resources/mapper/production/ProcessRouteItemMapper.xml
index 7e43b07..ce5016d 100644
--- a/src/main/resources/mapper/production/ProcessRouteItemMapper.xml
+++ b/src/main/resources/mapper/production/ProcessRouteItemMapper.xml
@@ -22,7 +22,8 @@
                pm.model,
                p.product_name,
                pm.unit,
-               pm.drawing_number
+               pm.drawing_number,
+               pp.user_power
         from
             process_route_item pri
                 left join product_model pm on pri.product_model_id = pm.id
diff --git a/src/main/resources/mapper/production/ProcessRouteMapper.xml b/src/main/resources/mapper/production/ProcessRouteMapper.xml
index 40a5b7f..e06ce32 100644
--- a/src/main/resources/mapper/production/ProcessRouteMapper.xml
+++ b/src/main/resources/mapper/production/ProcessRouteMapper.xml
@@ -13,8 +13,10 @@
     </resultMap>
 
     <select id="pageProcessRouteDto" resultType="com.ruoyi.production.dto.ProcessRouteDto">
-        select ps.*, p.product_name,pm.product_id,pm.model,pb.bom_no,pm.drawing_number
+        select ps.*, p.product_name,pm.product_id,pm.model,pb.bom_no,pm.drawing_number,group_concat(pp.name) as processName
         from process_route ps
+        left join process_route_item ppi on ps.id = ppi.route_id
+        left join product_process pp on ppi.process_id = pp.id
         left join product_bom pb on ps.bom_id = pb.id
         left join product_model pm on ps.product_model_id = pm.id
         left join product p on pm.product_id = p.id
@@ -22,7 +24,17 @@
             <if test="c.model != null and c.model != ''">
                 and pm.model like concat('%',#{c.model},'%')
             </if>
+            <if test="c.processRouteCode != null and c.processRouteCode != ''">
+                and ps.process_route_code like concat('%',#{c.processRouteCode},'%')
+            </if>
+            <if test="c.processRouteName != null and c.processRouteName != ''">
+                and ps.process_route_name like concat('%',#{c.processRouteName},'%')
+            </if>
+            <if test="c.processName != null and c.processName != ''">
+                and pp.name like concat('%',#{c.processName},'%')
+            </if>
         </where>
+        group by ps.id
         order by ps.id asc
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/production/ProductBomMapper.xml b/src/main/resources/mapper/production/ProductBomMapper.xml
index 0f2c27d..4bb8f1e 100644
--- a/src/main/resources/mapper/production/ProductBomMapper.xml
+++ b/src/main/resources/mapper/production/ProductBomMapper.xml
@@ -25,10 +25,13 @@
         left join product p on pm.product_id = p.id)A
         where 1=1
         <if test="c.productModelName != null">
-            and productModelName = #{c.productModelName}
+            and product_model_name = #{c.productModelName}
+        </if>
+        <if test="c.productModelId != null">
+            and product_model_id = #{c.productModelId}
         </if>
         <if test="c.productName != null">
-            and productName = #{c.productName}
+            and product_name = #{c.productName}
         </if>
         <if test="c.bomNo != null">
             and bom_no = #{c.bomNo}
diff --git a/src/main/resources/mapper/production/ProductOrderMapper.xml b/src/main/resources/mapper/production/ProductOrderMapper.xml
index ab4e290..0bf376b 100644
--- a/src/main/resources/mapper/production/ProductOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -77,23 +77,21 @@
                ps.product_model_id,
                ps.process_id,
                ps.unit_quantity,
-               ps.unit_quantity * po.quantity as demandedQuantity,
+               ps.demanded_quantity as demandedQuantity,
                ps.unit,
                p.product_name,
                pm.drawing_number,
                pp.name as  process_name,
                pm.product_id,
-               pm.model,
-               pb.bom_no
+               pm.model
         from
-            product_structure ps
+            product_structure_record ps
                 left join product_model pm on ps.product_model_id = pm.id
                 left join product p on pm.product_id = p.id
                 left join product_process pp on ps.process_id = pp.id
-                left join product_bom pb on ps.bom_id = pb.id
                 left join product_process_route ppr on ps.bom_id = ppr.bom_id
                 left join product_order po on po.id = ppr.product_order_id
-        where ppr.product_order_id = #{orderId}
+        where ps.product_order_id = #{orderId}
         order by ps.id
     </select>
 
diff --git a/src/main/resources/mapper/production/ProductProcessRouteMapper.xml b/src/main/resources/mapper/production/ProductProcessRouteMapper.xml
index fe47270..5d0f63a 100644
--- a/src/main/resources/mapper/production/ProductProcessRouteMapper.xml
+++ b/src/main/resources/mapper/production/ProductProcessRouteMapper.xml
@@ -15,12 +15,15 @@
         <result column="product_order_id" property="productOrderId"/>
     </resultMap>
     <select id="listMain" resultType="com.ruoyi.production.dto.ProcessRouteDto">
-        select ppr.*, p.product_name, pm.product_id, pm.model, pb.bom_no,pm.drawing_number
+        select ppr.*, p.product_name, pm.product_id, pm.model, pb.bom_no,pm.drawing_number,pp.name as processName
         from product_process_route ppr
+                 left join product_process_route_item ppri on ppr.id = ppri.product_route_id
+                 left join product_process pp on pp.id = ppri.process_id
                  left join product_bom pb on ppr.bom_id = pb.id
                  left join product_model pm on ppr.product_model_id = pm.id
                  left join product p on pm.product_id = p.id
         where ppr.product_order_id = #{orderId}
+        group by ppri.id
     </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/production/ProductStructureMapper.xml b/src/main/resources/mapper/production/ProductStructureMapper.xml
index aae9668..edabbfa 100644
--- a/src/main/resources/mapper/production/ProductStructureMapper.xml
+++ b/src/main/resources/mapper/production/ProductStructureMapper.xml
@@ -26,6 +26,9 @@
                 left join product_bom pb on ps.bom_id = pb.id
                 left join product_process pp on ps.process_id = pp.id
         where ps.bom_id = #{bomId}
+        <if test="isParent">
+           and ps.parent_id is not null
+        </if>
         order by ps.id
     </select>
     <select id="listBybomAndProcess" resultType="com.ruoyi.production.dto.ProductStructureDto">
@@ -36,12 +39,11 @@
                pm.model,
                pm.drawing_number
         from
-            product_structure ps
+            product_structure_record ps
                 left join product_model pm on ps.product_model_id = pm.id
                 left join product p on pm.product_id = p.id
                 left join product_process pp on ps.process_id = pp.id
-        where ps.bom_id = #{bomId}
-        and ps.process_id=#{processId}
+        where ps.process_id=#{processId}
         order by ps.id
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/production/ProductStructureRecordMapper.xml b/src/main/resources/mapper/production/ProductStructureRecordMapper.xml
new file mode 100644
index 0000000..254518a
--- /dev/null
+++ b/src/main/resources/mapper/production/ProductStructureRecordMapper.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.ProductStructureRecordMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductStructureRecord">
+        <id column="id" property="id" />
+        <result column="parent_id" property="parentId" />
+        <result column="product_model_id" property="productModelId" />
+        <result column="product_order_id" property="productOrderId" />
+        <result column="process_id" property="processId" />
+        <result column="unit_quantity" property="unitQuantity" />
+        <result column="demanded_quantity" property="demandedQuantity" />
+        <result column="unit" property="unit" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="bom_id" property="bomId" />
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
index b35349b..39c429a 100644
--- a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -39,7 +39,7 @@
         LEFT JOIN product_process pp ON pp.id = ppri.process_id
         LEFT JOIN product_model pm ON pm.id = ppri.product_model_id
         LEFT JOIN product p ON p.id = pm.product_id
-        where 1=1
+        where pwo.status != 1
             <if test="c.workOrderNo != null and c.workOrderNo != ''">
                and pwo.work_order_no like concat('%',#{c.workOrderNo},'%')
             </if>
diff --git a/src/main/resources/mapper/system/SysDeptMapper.xml b/src/main/resources/mapper/system/SysDeptMapper.xml
index afc1130..d202f4b 100644
--- a/src/main/resources/mapper/system/SysDeptMapper.xml
+++ b/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -183,5 +183,19 @@
 		FROM DepartmentHierarchy
 		WHERE parent_id = 100;
 	</select>
+    <select id="selectAllDept" resultType="com.ruoyi.production.dto.SysDeptAndUserDto">
+		SELECT dept_id, parent_id, ancestors, dept_name, order_num, leader, phone, email,
+			   status, del_flag, create_by, create_time, update_by, update_time, dept_nick
+		FROM sys_dept
+		WHERE del_flag = '0' AND status = '0'
+		ORDER BY order_num ASC
+	</select>
+	<select id="selectChildrenDeptByParentId" resultType="com.ruoyi.production.dto.SysDeptAndUserDto">
+		SELECT dept_id, parent_id, ancestors, dept_name, order_num, leader, phone, email,
+			   status, del_flag, create_by, create_time, update_by, update_time, dept_nick
+		FROM sys_dept
+		WHERE parent_id = #{parentId} AND del_flag = '0' AND status = '0'
+		ORDER BY order_num ASC
+	</select>
 
 </mapper> 
\ No newline at end of file
diff --git a/src/main/resources/mapper/system/SysUserDeptMapper.xml b/src/main/resources/mapper/system/SysUserDeptMapper.xml
index 7caa57e..8097988 100644
--- a/src/main/resources/mapper/system/SysUserDeptMapper.xml
+++ b/src/main/resources/mapper/system/SysUserDeptMapper.xml
@@ -24,4 +24,7 @@
             </if>
         </where>
     </select>
+    <select id="selectUserIdByDeptId" resultType="java.lang.Long">
+        SELECT user_id FROM sys_user_dept WHERE dept_id = #{deptId}
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/system/SysUserMapper.xml b/src/main/resources/mapper/system/SysUserMapper.xml
index d837b7e..5a87de1 100644
--- a/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/src/main/resources/mapper/system/SysUserMapper.xml
@@ -297,5 +297,16 @@
 			)
 		</if>
 	</select>
+    <select id="selectUserListByIds" resultType="com.ruoyi.project.system.domain.SysUser">
+		SELECT user_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar,
+		password, status, del_flag, login_ip, login_date, create_by, create_time,
+		update_by, update_time, remark, tenant_id
+		FROM sys_user
+		WHERE user_id IN
+		<foreach collection="userIds" item="userId" open="(" separator="," close=")">
+			#{userId}
+		</foreach>
+		AND del_flag = '0' AND status = '0'
+	</select>
 
 </mapper>

--
Gitblit v1.9.3