From ec26e9a878b9478b0851fe3a98d8cca564c05cc4 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期一, 05 一月 2026 18:02:25 +0800
Subject: [PATCH] 产品工单关联对应增删改查

---
 src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java            |   15 ++
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java    |  105 +++++++++++---
 src/main/resources/mapper/production/ProductWorkOrderMapper.xml                  |   40 +++++
 src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java |   27 +++
 src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java                    |   60 ++++++-
 src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java    |   30 ++++
 src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java          |   13 +
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java           |   83 ++++++++++-
 src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java                  |   29 ++++
 9 files changed, 359 insertions(+), 43 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java b/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java
new file mode 100644
index 0000000..339ab7d
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java
@@ -0,0 +1,30 @@
+package com.ruoyi.production.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.production.dto.ProductWorkOrderDto;
+import com.ruoyi.production.service.ProductWorkOrderService;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/productWorkOrder")
+public class ProductWorkOrderController {
+
+    private ProductWorkOrderService productWorkOrderservice;
+
+
+    /**
+     * 浜у搧宸ュ崟瀹炰綋绫诲垎椤垫煡璇�
+     */
+    @ApiOperation("浜у搧宸ュ崟瀹炰綋绫诲垎椤垫煡璇�")
+    @GetMapping("/page")
+    public R page(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
+        return R.ok(productWorkOrderservice.listPage(page, productWorkOrder));
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java b/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
new file mode 100644
index 0000000..f43789e
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -0,0 +1,29 @@
+package com.ruoyi.production.dto;
+
+import com.ruoyi.production.pojo.ProductWorkOrder;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ProductWorkOrderDto extends ProductWorkOrder {
+
+    //浜у搧鍚嶇О
+    @ApiModelProperty(value = "浜у搧鍚嶇О")
+    private String productName;
+
+    //瑙勬牸
+    @ApiModelProperty(value = "瑙勬牸")
+    private String model;
+
+    //宸ュ簭
+    @ApiModelProperty(value = "宸ュ簭")
+    private String processName;
+
+    //鍗曚綅
+    @ApiModelProperty(value = "鍗曚綅")
+    private String unit;
+
+
+}
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
new file mode 100644
index 0000000..12a3963
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
@@ -0,0 +1,15 @@
+package com.ruoyi.production.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.production.dto.ProductWorkOrderDto;
+import com.ruoyi.production.pojo.ProductWorkOrder;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface ProductWorkOrderMapper extends BaseMapper<ProductWorkOrder> {
+
+    IPage<ProductWorkOrderDto> pageProductWorkOrder(Page<ProductWorkOrderDto> page, @Param("c") ProductWorkOrderDto productWorkOrder);
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java b/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
index bffa732..a217b9b 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
@@ -7,12 +7,19 @@
 import java.io.Serializable;
 import java.time.LocalDateTime;
 
+/**
+ * 浜у搧宸ュ崟瀹炰綋绫�
+ * 瀵瑰簲鏁版嵁搴撹〃锛歱roduct_work_order
+ */
 @Data
 @TableName("product_work_order")
 public class ProductWorkOrder implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
+    /**
+     * 涓婚敭id
+     */
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
@@ -23,16 +30,30 @@
     private Long productProcessRouteItemId;
 
     /**
+     * 鍒涘缓鏃堕棿
+     */
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime updateTime;
+
+    /**
      * 宸ュ崟缂栧彿
      */
-    @ApiModelProperty(value = "鐢熶骇璁㈠崟鍙�")
+    @ApiModelProperty(value = "宸ュ崟缂栧彿")
     private String workOrderNo;
 
     /**
-     * 鐢熶骇鐘舵�� 1 寰呯‘璁�  2 寰呯敓浜� 3鐢熶骇涓� 4宸茬敓浜�
+     * 鐘舵��  1 寰呯‘璁�  2 寰呯敓浜� 3鐢熶骇涓� 4宸茬敓浜�
      */
-    @ApiModelProperty(value = "鐢熶骇鐘舵�� 1 寰呯‘璁�  2 寰呯敓浜� 3鐢熶骇涓� 4宸茬敓浜�")
-    private String status;
+    @ApiModelProperty(value = "鐘舵��  1 寰呯‘璁�  2 寰呯敓浜� 3鐢熶骇涓� 4宸茬敓浜�")
+    private Integer status;
 
     /**
      * 绉熸埛id
@@ -41,14 +62,27 @@
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
 
-    //鍒涘缓鏃堕棿
-    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
-    @TableField(fill = FieldFill.INSERT)
-    private LocalDateTime createTime;
+    /**
+     * 璁″垝寮�濮嬫椂闂�
+     */
+    @ApiModelProperty(value = "璁″垝寮�濮嬫椂闂�")
+    private LocalDateTime planStartTime;
 
-    //淇敼鏃堕棿
-    @ApiModelProperty(value = "淇敼鏃堕棿")
-    @TableField(fill = FieldFill.UPDATE)
-    private LocalDateTime updateTime;
+    /**
+     * 璁″垝缁撴潫鏃堕棿
+     */
+    @ApiModelProperty(value = "璁″垝缁撴潫鏃堕棿")
+    private LocalDateTime planEndTime;
 
-}
+    /**
+     * 瀹為檯寮�濮嬫椂闂�
+     */
+    @ApiModelProperty(value = "瀹為檯寮�濮嬫椂闂�")
+    private LocalDateTime actualStartTime;
+
+    /**
+     * 瀹為檯缁撴潫鏃堕棿
+     */
+    @ApiModelProperty(value = "瀹為檯缁撴潫鏃堕棿")
+    private LocalDateTime actualEndTime;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java b/src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java
new file mode 100644
index 0000000..57c5b19
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java
@@ -0,0 +1,13 @@
+package com.ruoyi.production.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.production.dto.ProductWorkOrderDto;
+import com.ruoyi.production.pojo.ProductWorkOrder;
+
+public interface ProductWorkOrderService extends IService<ProductWorkOrder>{
+
+    IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder);
+
+}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
new file mode 100644
index 0000000..3d2d7e3
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -0,0 +1,27 @@
+package com.ruoyi.production.service.impl;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.production.dto.ProductWorkOrderDto;
+import com.ruoyi.production.mapper.ProductWorkOrderMapper;
+import com.ruoyi.production.pojo.ProductWorkOrder;
+import com.ruoyi.production.service.ProductWorkOrderService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@AllArgsConstructor
+@Transactional(rollbackFor = Exception.class)
+public class ProductWorkOrderServiceImpl extends ServiceImpl<ProductWorkOrderMapper, ProductWorkOrder> implements ProductWorkOrderService {
+
+    private ProductWorkOrderMapper productWorkOrdermapper;
+
+    @Override
+    public IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
+        return productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder);
+    }
+
+}
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 3d51cb0..620b7a1 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -4,33 +4,30 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.production.mapper.ProcessRouteItemMapper;
-import com.ruoyi.production.mapper.ProcessRouteMapper;
-import com.ruoyi.production.mapper.ProductOrderMapper;
-import com.ruoyi.production.mapper.ProductProcessRouteItemMapper;
-import com.ruoyi.production.pojo.ProcessRoute;
-import com.ruoyi.production.pojo.ProcessRouteItem;
-import com.ruoyi.production.pojo.ProductOrder;
-import com.ruoyi.production.pojo.ProductProcessRouteItem;
+import com.ruoyi.production.mapper.*;
+import com.ruoyi.production.pojo.*;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.sales.dto.InvoiceRegistrationProductDto;
 import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
-import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.ISalesLedgerProductService;
 import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
-import java.util.*;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -53,11 +50,14 @@
     private ProductOrderMapper productOrderMapper;
 
     private ProcessRouteItemMapper processRouteItemMapper;
+
     private ProductProcessRouteItemMapper productProcessRouteItemMapper;
-    @Autowired
+
     private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
-    @Autowired
+
     private ProcessRouteMapper processRouteMapper;
+
+    private ProductWorkOrderMapper productWorkOrderMapper;
 
     @Override
     public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
@@ -104,10 +104,10 @@
         // 1. 鍏堟煡璇㈣鍒犻櫎鐨勫瓙琛ㄨ褰曪紝鑾峰彇瀵瑰簲鐨� salesLedgerId
         List<SalesLedgerProduct> deletedProducts = salesLedgerProductMapper.selectBatchIds(Arrays.asList(ids));
         if (deletedProducts.isEmpty()) {
-            return 0; // 娌℃湁鍙垹闄ょ殑鏁版嵁
+            return 0;
         }
 
-        // 鍙兘灞炰簬澶氫釜涓昏〃锛堜絾閫氬父涓�涓帴鍙e彧澶勭悊涓�涓富琛級
+        // 鍙兘灞炰簬澶氫釜涓昏〃
         Set<Long> mainIds = deletedProducts.stream()
                 .map(SalesLedgerProduct::getSalesLedgerId)
                 .filter(Objects::nonNull)
@@ -116,12 +116,40 @@
         // 2. 鎵ц鍒犻櫎鎿嶄綔
         int result = salesLedgerProductMapper.deleteBatchIds(Arrays.asList(ids));
         //鍒犻櫎瀵瑰簲鐨勭敓浜ц鍗�
-        for (Long id : ids) {
-            ProductOrder productOrder = productOrderMapper.selectOne(new LambdaQueryWrapper<ProductOrder>().eq(ProductOrder::getProductModelId, id));
-            if (productOrder != null) {
-                productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>().eq(ProductProcessRouteItem::getRouteId, productOrder.getId()));
-                productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>().eq(ProductOrder::getProductModelId, id));
+        //鎵归噺鏌ヨproductOrder
+        List<ProductOrder> productOrders = productOrderMapper.selectList(
+                new LambdaQueryWrapper<ProductOrder>()
+                        .in(ProductOrder::getProductModelId, ids)
+        );
+
+        if (!CollectionUtils.isEmpty(productOrders)) {
+            List<Long> orderIds = productOrders.stream()
+                    .map(ProductOrder::getId)
+                    .collect(Collectors.toList());
+
+            // 鎵归噺鏌ヨprocessRouteItems
+            List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList(
+                    new LambdaQueryWrapper<ProductProcessRouteItem>()
+                            .in(ProductProcessRouteItem::getRouteId, orderIds)
+            );
+
+            if (!CollectionUtils.isEmpty(allRouteItems)) {
+                List<Long> routeItemIds = allRouteItems.stream()
+                        .map(ProductProcessRouteItem::getId)
+                        .collect(Collectors.toList());
+
+                // 鎵归噺鍒犻櫎workOrder
+                productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>()
+                                .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds));
             }
+
+            // 鎵归噺鍒犻櫎processRouteItem
+            productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>()
+                            .in(ProductProcessRouteItem::getRouteId, orderIds));
+
+            // 鎵归噺鍒犻櫎productOrder
+            productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
+                    .in(ProductOrder::getProductModelId, ids));
         }
 
         // 3. 瀵规瘡涓富琛↖D杩涜閲戦鏇存柊
@@ -161,12 +189,45 @@
             ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()));
             if (processRoute != null) {
                 List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
+                // 鐢熸垚褰撳墠鏃ユ湡鐨勫墠缂�锛氬勾鏈堟棩
+                String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
                 for (ProcessRouteItem processRouteItem : processRouteItems) {
                     ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
-                    productProcessRouteItem.setProductModelId(productOrder.getProductModelId());
+                    productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
                     productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
                     productProcessRouteItem.setRouteId(productOrder.getId());
-                    productProcessRouteItemMapper.insert(productProcessRouteItem);
+                    int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
+                    if (insert > 0) {
+                        // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
+                        QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>();
+                        queryWrapper.likeRight("work_order_no", datePrefix)
+                                .orderByDesc("work_order_no")
+                                .last("LIMIT 1");
+
+                        ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper);
+
+                        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 = String.format("%s%03d", datePrefix, sequenceNumber);
+                        ProductWorkOrder productWorkOrder = new ProductWorkOrder();
+                        productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
+                        productWorkOrder.setWorkOrderNo(workOrderNoStr);
+                        productWorkOrder.setStatus(1);
+
+                        productWorkOrderMapper.insert(productWorkOrder);
+                    }
+
                 }
                 productOrder.setRouteId(processRoute.getId());
                 productOrderMapper.updateById(productOrder);
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index 06d6437..6517eaa 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -9,7 +9,6 @@
 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.account.pojo.AccountExpense;
 import com.ruoyi.account.pojo.AccountIncome;
 import com.ruoyi.account.service.AccountIncomeService;
 import com.ruoyi.basic.mapper.CustomerMapper;
@@ -99,6 +98,8 @@
     private final ProcessRouteItemMapper processRouteItemMapper;
 
     private final ProductProcessRouteItemMapper productProcessRouteItemMapper;
+
+    private final ProductWorkOrderMapper productWorkOrderMapper;
 
     @Autowired
     private SysDeptMapper sysDeptMapper;
@@ -371,6 +372,42 @@
         productWrapper.in(SalesLedgerProduct::getSalesLedgerId, idList);
         salesLedgerProductMapper.delete(productWrapper);
 
+        //鎵归噺鏌ヨproductOrder
+        List<ProductOrder> productOrders = productOrderMapper.selectList(
+                new LambdaQueryWrapper<ProductOrder>()
+                        .in(ProductOrder::getProductModelId, idList)
+        );
+
+        if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) {
+            List<Long> orderIds = productOrders.stream()
+                    .map(ProductOrder::getId)
+                    .collect(Collectors.toList());
+
+            // 鎵归噺鏌ヨprocessRouteItems
+            List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList(
+                    new LambdaQueryWrapper<ProductProcessRouteItem>()
+                            .in(ProductProcessRouteItem::getRouteId, orderIds)
+            );
+
+            if (!org.springframework.util.CollectionUtils.isEmpty(allRouteItems)) {
+                List<Long> routeItemIds = allRouteItems.stream()
+                        .map(ProductProcessRouteItem::getId)
+                        .collect(Collectors.toList());
+
+                // 鎵归噺鍒犻櫎workOrder
+                productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>()
+                        .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds));
+            }
+
+            // 鎵归噺鍒犻櫎processRouteItem
+            productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>()
+                    .in(ProductProcessRouteItem::getRouteId, orderIds));
+
+            // 鎵归噺鍒犻櫎productOrder
+            productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
+                    .in(ProductOrder::getProductModelId, idList));
+        }
+
         LambdaQueryWrapper<InvoiceRegistrationProduct> wrapper = new LambdaQueryWrapper<>();
         wrapper.in(InvoiceRegistrationProduct::getSalesLedgerId, idList);
         List<InvoiceRegistrationProduct> invoiceRegistrationProducts = invoiceRegistrationProductMapper.selectList(wrapper);
@@ -596,12 +633,43 @@
                 ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()));
                 if (processRoute != null) {
                     List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
+                    // 鐢熸垚褰撳墠鏃ユ湡鐨勫墠缂�锛氬勾鏈堟棩
+                    String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
                     for (ProcessRouteItem processRouteItem : processRouteItems) {
                         ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
-                        productProcessRouteItem.setProductModelId(productOrder.getProductModelId());
+                        productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
                         productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
                         productProcessRouteItem.setRouteId(productOrder.getId());
-                        productProcessRouteItemMapper.insert(productProcessRouteItem);
+                        int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
+                        if (insert > 0) {
+                            // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
+                            QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>();
+                            queryWrapper.likeRight("work_order_no", datePrefix)
+                                    .orderByDesc("work_order_no")
+                                    .last("LIMIT 1");
+
+                            ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper);
+
+                            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 = String.format("%s%03d", datePrefix, sequenceNumber);
+                            ProductWorkOrder productWorkOrder = new ProductWorkOrder();
+                            productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
+                            productWorkOrder.setWorkOrderNo(workOrderNoStr);
+                            productWorkOrder.setStatus(1);
+                            productWorkOrderMapper.insert(productWorkOrder);
+                        }
                     }
                     productOrder.setRouteId(processRoute.getId());
                     productOrderMapper.updateById(productOrder);
@@ -659,12 +727,12 @@
 
             return datePart + String.format("%03d", nextSequence);
         } finally {
-            // 3. 閲婃斁閿侊紙浣跨敤Lua鑴氭湰淇濊瘉鍘熷瓙鎬э紝閬垮厤璇垹鍏朵粬绾跨▼鐨勯攣锛�
+            // 3. 閲婃斁閿�
             String luaScript = "if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('DEL', KEYS[1]) else return 0 end";
             redisTemplate.execute(
                     new DefaultRedisScript<>(luaScript, Long.class),
                     Collections.singletonList(lockKey),
-                    lockValue // 鍙湁鎸佹湁鐩稿悓鍊肩殑绾跨▼鎵嶈兘鍒犻櫎閿�
+                    lockValue
             );
         }
     }
@@ -673,7 +741,7 @@
         if (sequences.isEmpty()) {
             return 1;
         }
-        // 鎺掑簭鍚庢煡鎵剧涓�涓己澶辩殑姝f暣鏁帮紙涓庡師閫昏緫涓�鑷达級
+        // 鎺掑簭鍚庢煡鎵剧涓�涓己澶辩殑姝f暣鏁�
         sequences.sort(Integer::compareTo);
         int next = 1;
         for (int seq : sequences) {
@@ -703,14 +771,13 @@
                 .filter(Objects::nonNull)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
 
-        // 鏋勯�犱富琛ㄦ洿鏂板璞★紙鏀寔浠绘剰涓昏〃绫诲瀷锛�
+        // 鏋勯�犱富琛ㄦ洿鏂板璞�
         try {
             S entity = mainEntityClass.getDeclaredConstructor().newInstance();
             Field idField = mainEntityClass.getDeclaredField("id");
             idField.setAccessible(true);
             idField.set(entity, mainId);
 
-            // 璁剧疆 contractAmount 瀛楁锛屾敞鎰忚繖閲屽亣璁惧瓧娈靛悕涓� "contractAmount"
             Field amountField = mainEntityClass.getDeclaredField("contractAmount");
             amountField.setAccessible(true);
             amountField.set(entity, totalAmount);
diff --git a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
new file mode 100644
index 0000000..e1fdbd6
--- /dev/null
+++ b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -0,0 +1,40 @@
+<?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.ProductWorkOrderMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductWorkOrder">
+        <result column="id" property="id"/>
+        <result column="product_process_route_item_id" property="productProcessRouteItemId"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="work_order_no" property="workOrderNo"/>
+        <result column="status" property="status"/>
+        <result column="tenant_id" property="tenantId"/>
+        <result column="actual_end_time" property="planStartTime"/>
+        <result column="plan_end_time" property="planEndTime"/>
+        <result column="actual_start_time" property="actualStartTime"/>
+        <result column="actualEndTime" property="actualEndTime"/>
+    </resultMap>
+
+    <select id="pageProductWorkOrder" resultType="com.ruoyi.production.dto.ProductWorkOrderDto">
+        SELECT
+        pwo.*,
+        pp.NAME as processName,
+        pm.model,
+        pm.unit,
+        p.product_name AS productName
+        FROM
+        `product_work_order` pwo
+        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_model pm ON pm.id = ppri.product_model_id
+        LEFT JOIN product p ON p.id = pm.product_id
+        <where>
+            <if test="c.workOrderNo != null and c.workOrderNo != ''">
+                pwo.work_order_no like concat('%',#{c.workOrderNo},'%')
+            </if>
+        </where>
+    </select>
+</mapper>

--
Gitblit v1.9.3