From 5ddc232b8dffcb3402711874491df35fb1997d1d Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期六, 09 五月 2026 16:08:36 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_New_pro' into dev_New_pro

---
 src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java                    |    3 
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java    |   21 ++
 src/main/java/com/ruoyi/sales/mapper/ShippingProductDetailMapper.java                 |    3 
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java          |   13 -
 src/main/java/com/ruoyi/sales/service/ShippingInfoService.java                        |    3 
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                            |    1 
 src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java             |   40 ++--
 src/main/java/com/ruoyi/sales/dto/ShippingApproveDto.java                             |   15 ++
 src/main/resources/mapper/technology/TechnologyRoutingOperationMapper.xml             |    1 
 src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java                       |   17 ++
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java         |    3 
 src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java               |   13 +
 src/main/java/com/ruoyi/production/bean/vo/ProductionAccountVo.java                   |   35 ++--
 src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java     |   16 +-
 src/main/resources/mapper/sales/ShippingProductDetailMapper.xml                       |    9 +
 src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java             |    2 
 src/main/resources/mapper/production/ProductionAccountMapper.xml                      |   12 +
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java       |   10 
 src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java            |    8 -
 src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java                  |    9 +
 src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDto.java                 |   30 ++--
 src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperation.java          |    3 
 src/main/java/com/ruoyi/technology/pojo/TechnologyOperation.java                      |    2 
 src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java           |   22 ++
 src/main/java/com/ruoyi/technology/pojo/TechnologyRoutingOperation.java               |    3 
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |    1 
 src/main/resources/mapper/production/ProductionOrderRoutingOperationMapper.xml        |    1 
 src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java              |    8 
 src/main/resources/mapper/production/ProductionOperationTaskMapper.xml                |    1 
 /dev/null                                                                             |   24 ---
 src/main/java/com/ruoyi/production/bean/vo/ProductionOrderWorkOrderDetailVo.java      |    7 +
 src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java                    |    4 
 src/main/resources/mapper/production/ProductionProductMainMapper.xml                  |   12 +
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderPickServiceImpl.java   |   27 +++
 src/main/resources/mapper/production/ProductionPlanMapper.xml                         |    3 
 src/main/java/com/ruoyi/production/bean/vo/ProductionOperationTaskVo.java             |    3 
 36 files changed, 255 insertions(+), 130 deletions(-)

diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
index 3caf7cf..2c5fda3 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -183,7 +183,7 @@
                             addQualityInspect(purchaseLedger, salesLedgerProduct);
                         } else {
                             //鐩存帴鍏ュ簱
-                            stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId());
+                            stockUtils.addStockWithBatchNo(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId(),purchaseLedger.getPurchaseContractNumber()+"-"+salesLedgerProduct.getId());
                         }
                     }
                 } else if (status.equals(3)) {
@@ -211,11 +211,10 @@
             }
             salesQuotationMapper.updateById(salesQuote);
         }
-        // 鍑哄簱瀹℃壒淇敼
+        // 鍑哄簱瀹℃壒淇敼=鍙戣揣瀹℃壒
         if (approveProcess.getApproveType().equals(7)) {
-            String[] split = approveProcess.getApproveReason().split(":");
             ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
-                    .eq(ShippingInfo::getShippingNo, split[1])
+                    .eq(ShippingInfo::getShippingNo, approveProcess.getApproveReason())
                     .orderByDesc(ShippingInfo::getCreateTime)
                     .last("limit 1"));
             if (shippingInfo != null) {
@@ -228,6 +227,7 @@
                 }
                 shippingInfoMapper.updateById(shippingInfo);
             }
+            //搴撳瓨鎵e噺
 
         }
         fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVE_NODE, approveNode.getId(), approveNode.getStorageBlobDTOS());
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
index c8c6af0..bf2cdb2 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -1,6 +1,7 @@
 package com.ruoyi.approve.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -24,8 +25,10 @@
 import com.ruoyi.basic.enums.RecordTypeEnum;
 import com.ruoyi.basic.utils.FileUtil;
 import com.ruoyi.common.enums.FileNameType;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysNotice;
 import com.ruoyi.project.system.domain.SysUser;
@@ -35,8 +38,10 @@
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.sales.mapper.CommonFileMapper;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.mapper.ShippingInfoMapper;
 import com.ruoyi.sales.pojo.CommonFile;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.pojo.ShippingInfo;
 import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
 import lombok.RequiredArgsConstructor;
@@ -65,6 +70,8 @@
     private final CommonFileServiceImpl commonFileService;
     private final ISysNoticeService sysNoticeService;
     private final PurchaseLedgerMapper purchaseLedgerMapper;
+    private final SalesLedgerProductMapper salesLedgerProductMapper;
+    private final StockUtils stockUtils;
     private final ShippingInfoMapper shippingInfoMapper;
     private final ApproveNodeMapper approveNodeMapper;
     private final ApproveProcessConfigNodeService approveProcessConfigNodeService;
@@ -89,11 +96,6 @@
         if (CollectionUtils.isEmpty(sysUsers)) throw new RuntimeException("瀹℃牳鐢ㄦ埛涓嶅瓨鍦�");
         if (sysDept == null) throw new RuntimeException("閮ㄩ棬涓嶅瓨鍦�");
         if (sysUser == null) throw new RuntimeException("鐢宠浜轰笉瀛樺湪");
-//        String today = LocalDate.now().format(DATE_FORMAT);
-//        Long approveId = dailyRedisCounter.incrementAndGetByDb();
-//        String formattedCount = String.format("%03d", approveId);
-//        //娴佺▼ ID
-//        String approveID = today + formattedCount;
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
         ApproveProcess approveProcess = new ApproveProcess();
         String no = OrderUtils.countTodayByCreateTime(approveProcessMapper, "", "approve_id");
@@ -157,9 +159,19 @@
                 || !StringUtils.hasText(approveProcessVO.getApproveReason())) {
             throw new RuntimeException("瀹℃牳鐢ㄦ埛涓嶅瓨鍦�");
         }
+
         purchaseLedgerMapper.update(null, new LambdaUpdateWrapper<PurchaseLedger>()
                 .eq(PurchaseLedger::getPurchaseContractNumber, approveProcessVO.getApproveReason())
                 .set(PurchaseLedger::getApprovalStatus, 3));
+        //閲囪喘鍏ュ簱
+        PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>()
+                .eq(PurchaseLedger::getPurchaseContractNumber, approveProcessVO.getApproveReason())
+                .last("limit 1"));
+        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new QueryWrapper<SalesLedgerProduct>()
+                .lambda().eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId()).eq(SalesLedgerProduct::getType, 2));
+        for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) {
+            stockUtils.addStockWithBatchNo(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId(),purchaseLedger.getPurchaseContractNumber()+"-"+salesLedgerProduct.getId());
+        }
     }
 
     @Override
diff --git a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
index f561b49..5356500 100644
--- a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
+++ b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -81,6 +81,23 @@
     }
 
     /**
+     * 鍚堟牸鍏ュ簱甯︽壒娆″彿
+     * @param productModelId
+     * @param quantity
+     * @param recordType
+     * @param recordId
+     */
+    public void addStockWithBatchNo(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) {
+        StockInventoryDto stockInventoryDto = new StockInventoryDto();
+        stockInventoryDto.setRecordId(recordId);
+        stockInventoryDto.setRecordType(String.valueOf(recordType));
+        stockInventoryDto.setQualitity(quantity);
+        stockInventoryDto.setProductModelId(productModelId);
+        stockInventoryDto.setBatchNo(batchNo);
+        stockInventoryService.addStockInRecordOnly(stockInventoryDto);
+    }
+
+    /**
      * 鍚堟牸鍑哄簱
      *
      * @param productModelId
diff --git a/src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDto.java b/src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDto.java
index 91b97ef..5bd2fd1 100644
--- a/src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDto.java
+++ b/src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDto.java
@@ -9,54 +9,54 @@
 import java.time.LocalDate;
 
 @Data
-@Schema(name = "ProductionAccountDto", description = "production account query dto")
+@Schema(name = "ProductionAccountDto", description = "鐢熶骇鏍哥畻鏌ヨ鍙傛暟")
 public class ProductionAccountDto extends ProductionAccount {
 
-    @Schema(description = "sales contract no")
+    @Schema(description = "閿�鍞悎鍚屽彿")
     private String salesContractNo;
 
-    @Schema(description = "customer contract no")
+    @Schema(description = "瀹㈡埛鍚堝悓鍙�")
     private String customerContractNo;
 
-    @Schema(description = "project name")
+    @Schema(description = "椤圭洰鍚嶇О")
     private String projectName;
 
-    @Schema(description = "customer name")
+    @Schema(description = "瀹㈡埛鍚嶇О")
     private String customerName;
 
-    @Schema(description = "product category")
+    @Schema(description = "浜у搧绫诲埆")
     private String productCategory;
 
-    @Schema(description = "specification model")
+    @Schema(description = "瑙勬牸鍨嬪彿")
     private String specificationModel;
 
-    @Schema(description = "scheduling user id")
+    @Schema(description = "鎺掍骇浜哄憳ID")
     private Long schedulingUserId;
 
-    @Schema(description = "scheduling user name")
+    @Schema(description = "鎺掍骇浜哄憳鍚嶇О")
     private String schedulingUserName;
 
-    @Schema(description = "process")
+    @Schema(description = "宸ュ簭")
     private String process;
 
-    @Schema(description = "date type(day/month)")
+    @Schema(description = "鏃ユ湡绫诲瀷锛堟寜澶�/鎸夋湀锛�")
     private String dateType;
 
-    @Schema(description = "day query date")
+    @Schema(description = "鎸夊ぉ鏌ヨ鏃ユ湡")
     @JsonFormat(pattern = "yyyy-MM-dd")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate entryDate;
 
-    @Schema(description = "date range")
+    @Schema(description = "鏃ユ湡鑼冨洿")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate[] dateRange;
 
-    @Schema(description = "start date")
+    @Schema(description = "寮�濮嬫棩鏈�")
     @JsonFormat(pattern = "yyyy-MM-dd")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate entryDateStart;
 
-    @Schema(description = "end date")
+    @Schema(description = "缁撴潫鏃ユ湡")
     @JsonFormat(pattern = "yyyy-MM-dd")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate entryDateEnd;
diff --git a/src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java b/src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java
index 60ab542..c4363a8 100644
--- a/src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java
+++ b/src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java
@@ -52,4 +52,7 @@
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate requiredDateEnd;
 
+    @Schema(description = "閿�鍞悎鍚屽彿")
+    private String salesContractNo;
+
 }
diff --git a/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java b/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
index 9fc8d86..cbac4b5 100644
--- a/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
+++ b/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
@@ -12,63 +12,63 @@
 
 @EqualsAndHashCode(callSuper = true)
 @Data
-@Schema(name = "ProductionProductMainDto", description = "production report query dto")
+@Schema(name = "ProductionProductMainDto", description = "鐢熶骇鎶ュ伐鏌ヨ鍙傛暟")
 public class ProductionProductMainDto extends ProductionProductMain {
 
-    @Schema(description = "product process route item id")
+    @Schema(description = "浜у搧宸ヨ壓璺嚎宸ュ簭ID")
     private Long productProcessRouteItemId;
 
-    @Schema(description = "production report id")
+    @Schema(description = "鎶ュ伐ID")
     private Long productMainId;
 
-    @Schema(description = "tenant id")
+    @Schema(description = "绉熸埛ID")
     private Long tenantId;
 
-    @Schema(description = "work order no")
+    @Schema(description = "宸ュ崟缂栧彿")
     private String workOrderNo;
 
-    @Schema(description = "work order status")
+    @Schema(description = "宸ュ崟鐘舵��")
     private String workOrderStatus;
 
-    @Schema(description = "nick name")
+    @Schema(description = "鏄电О")
     private String nickName;
 
-    @Schema(description = "quantity")
+    @Schema(description = "鏁伴噺")
     private BigDecimal quantity;
 
-    @Schema(description = "scrap quantity")
+    @Schema(description = "鎶ュ簾鏁伴噺")
     private BigDecimal scrapQty;
 
-    @Schema(description = "product name")
+    @Schema(description = "浜у搧鍚嶇О")
     private String productName;
 
-    @Schema(description = "product model name")
+    @Schema(description = "浜у搧瑙勬牸鍨嬪彿")
     private String productModelName;
 
-    @Schema(description = "unit")
+    @Schema(description = "鍗曚綅")
     private String unit;
 
-    @Schema(description = "sales contract no")
+    @Schema(description = "閿�鍞悎鍚屽彿")
     private String salesContractNo;
 
-    @Schema(description = "scheduling date")
+    @Schema(description = "鎺掍骇鏃ユ湡")
     private LocalDate schedulingDate;
 
-    @Schema(description = "scheduling user name")
+    @Schema(description = "鎺掍骇浜哄憳鍚嶇О")
     private String schedulingUserName;
 
-    @Schema(description = "customer name")
+    @Schema(description = "瀹㈡埛鍚嶇О")
     private String customerName;
 
-    @Schema(description = "process")
+    @Schema(description = "宸ュ簭")
     private String process;
 
-    @Schema(description = "salary quota")
+    @Schema(description = "宸ヨ祫瀹氶")
     private BigDecimal workHours;
 
-    @Schema(description = "wages")
+    @Schema(description = "宸ヨ祫")
     private BigDecimal wages;
 
-    @Schema(description = "operation param list")
+    @Schema(description = "宸ュ簭鍙傛暟鍒楄〃")
     private List<ProductionOrderRoutingOperationParam> productionOperationParamList;
 }
diff --git a/src/main/java/com/ruoyi/production/bean/vo/ProductionAccountVo.java b/src/main/java/com/ruoyi/production/bean/vo/ProductionAccountVo.java
index 5d86e7c..68bcb23 100644
--- a/src/main/java/com/ruoyi/production/bean/vo/ProductionAccountVo.java
+++ b/src/main/java/com/ruoyi/production/bean/vo/ProductionAccountVo.java
@@ -8,52 +8,55 @@
 import java.time.LocalDate;
 
 @Data
-@Schema(name = "ProductionAccountVo", description = "production account page result")
+@Schema(name = "ProductionAccountVo", description = "鐢熶骇鏍哥畻鍒嗛〉缁撴灉")
 public class ProductionAccountVo {
 
-    @Schema(description = "customer contract no")
+    @Schema(description = "瀹㈡埛鍚堝悓鍙�")
     private String customerContractNo;
 
-    @Schema(description = "project name")
+    @Schema(description = "椤圭洰鍚嶇О")
     private String projectName;
 
-    @Schema(description = "customer name")
+    @Schema(description = "瀹㈡埛鍚嶇О")
     private String customerName;
 
-    @Schema(description = "product category")
+    @Schema(description = "浜у搧绫诲埆")
     private String productCategory;
 
-    @Schema(description = "specification model")
+    @Schema(description = "瑙勬牸鍨嬪彿")
     private String specificationModel;
 
-    @Schema(description = "unit")
+    @Schema(description = "鍗曚綅")
     private String unit;
 
-    @Schema(description = "scheduling user id")
+    @Schema(description = "鎺掍骇浜哄憳ID")
     private Long schedulingUserId;
 
-    @Schema(description = "scheduling user name")
+    @Schema(description = "鎺掍骇浜哄憳鍚嶇О")
     private String schedulingUserName;
 
-    @Schema(description = "wages")
+    @Schema(description = "宸ヨ祫")
     private BigDecimal wages;
 
-    @Schema(description = "finished quantity")
+    @Schema(description = "瀹屾垚鏁伴噺")
     private BigDecimal finishedNum;
 
-    @Schema(description = "salary quota")
+    @Schema(description = "宸ヨ祫瀹氶")
     private BigDecimal workHours;
 
-    @Schema(description = "output rate")
+    @Schema(description = "宸ユ椂")
+    private BigDecimal workHour;
+
+    @Schema(description = "浜у嚭鐜�")
     private String outputRate;
 
-    @Schema(description = "process")
+    @Schema(description = "宸ュ簭")
     private String process;
 
-    @Schema(description = "scheduling date")
+    @Schema(description = "鎺掍骇鏃ユ湡")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private LocalDate schedulingDate;
 
-    @Schema(description = "scheduling month(yyyy-MM)")
+    @Schema(description = "鎺掍骇鏈堜唤(yyyy-MM)")
     private String schedulingMonth;
 }
diff --git a/src/main/java/com/ruoyi/production/bean/vo/ProductionOperationTaskVo.java b/src/main/java/com/ruoyi/production/bean/vo/ProductionOperationTaskVo.java
index 6c7c5a7..9929f19 100644
--- a/src/main/java/com/ruoyi/production/bean/vo/ProductionOperationTaskVo.java
+++ b/src/main/java/com/ruoyi/production/bean/vo/ProductionOperationTaskVo.java
@@ -46,4 +46,7 @@
 
     @Schema(description = "鏄惁缁撴潫锛�")
     private Boolean endOrder;
+
+    @Schema(description = "绫诲瀷 鍖哄垎璁℃椂鍜岃浠�(0璁℃椂1璁′欢)")
+    private Integer type;
 }
diff --git a/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderWorkOrderDetailVo.java b/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderWorkOrderDetailVo.java
index 2a0571d..646d3cb 100644
--- a/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderWorkOrderDetailVo.java
+++ b/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderWorkOrderDetailVo.java
@@ -9,6 +9,7 @@
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 @Data
@@ -42,6 +43,9 @@
         @Schema(description = "鎶ュ伐涓讳俊鎭�")
         private ProductionProductMain reportMain;
 
+        @Schema(description = "宸ユ椂")
+        private BigDecimal workHour;
+
         @Schema(description = "鎶ュ伐浜у嚭鏄庣粏")
         private List<ProductionProductOutput> reportOutputList;
 
@@ -62,6 +66,9 @@
         @Schema(description = "鎶ュ伐涓讳俊鎭�")
         private ProductionProductMain reportMain;
 
+        @Schema(description = "宸ユ椂")
+        private BigDecimal workHour;
+
         @Schema(description = "璐ㄦ涓讳俊鎭�")
         private QualityInspect inspect;
 
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperation.java b/src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperation.java
index fc36725..d784109 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperation.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperation.java
@@ -67,4 +67,7 @@
 
     @Schema(description = "宸ュ簭琛╥d")
     private Long technologyOperationId;
+
+    @Schema(description = "绫诲瀷 鍖哄垎璁℃椂鍜岃浠讹紝0璁℃椂锛�1璁′欢")
+    private Integer type;
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
index 0fa00eb..9de89fb 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
@@ -7,6 +7,7 @@
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 @Data
@@ -56,4 +57,7 @@
     @TableField(fill = FieldFill.INSERT)
     private Long deptId;
 
+    @Schema(description = "宸ユ椂")
+    private BigDecimal workHour;
+
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderPickServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderPickServiceImpl.java
index 598ae6b..554b95e 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderPickServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderPickServiceImpl.java
@@ -430,7 +430,7 @@
         BigDecimal totalReturnQty = oldReturnQty.add(currentReturnQty);
         if (currentReturnQty.compareTo(BigDecimal.ZERO) > 0) {
             String returnBatchNo = resolveInventoryBatchNoFromStored(oldPick.getBatchNo());
-            addInventory(oldPick.getId(), oldPick.getProductModelId(), returnBatchNo, currentReturnQty, FEED_RETURN_IN_RECORD_TYPE);
+            addInventoryRecordOnly(oldPick.getId(), oldPick.getProductModelId(), returnBatchNo, currentReturnQty, FEED_RETURN_IN_RECORD_TYPE);
         }
 
         BigDecimal actualQty = defaultDecimal(oldPick.getQuantity())
@@ -737,6 +737,31 @@
         }
     }
 
+    private void addInventoryRecordOnly(Long recordId,
+                                        Long productModelId,
+                                        String batchNo,
+                                        BigDecimal quantity,
+                                        String stockInRecordType) {
+        // 浠呰褰曞叆搴撶敵璇凤紝涓嶅仛瀹℃牳閫氳繃銆�
+        BigDecimal addQuantity = defaultDecimal(quantity);
+        if (addQuantity.compareTo(BigDecimal.ZERO) <= 0) {
+            return;
+        }
+        try {
+            StockInventoryDto stockInventoryDto = new StockInventoryDto();
+            stockInventoryDto.setProductModelId(productModelId);
+            stockInventoryDto.setBatchNo(batchNo);
+            stockInventoryDto.setQualitity(addQuantity);
+            stockInventoryDto.setRecordType(stockInRecordType);
+            stockInventoryDto.setRecordId(recordId == null ? 0L : recordId);
+            stockInventoryService.addStockInRecordOnly(stockInventoryDto);
+        } catch (ServiceException ex) {
+            throw ex;
+        } catch (Exception ex) {
+            throw new ServiceException("閫�鏂欏叆搴撹褰曚繚瀛樺け璐ワ細" + ex.getMessage());
+        }
+    }
+
     private List<ProductionOrderPickDto> resolvePickItems(ProductionOrderPickDto dto) {
         // 瑙f瀽鏂板鍦烘櫙鐨勯鏂欐槑缁嗛泦鍚堛��
         if (dto == null) {
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
index 6ef6a44..344800c 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -188,7 +188,6 @@
             ProductionOrder update = new ProductionOrder();
             update.setId(productionOrder.getId());
             update.setTechnologyRoutingId(targetRoutingId);
-        // 鎸佷箙鍖栨垨杈撳嚭澶勭悊缁撴灉
             if (!this.updateById(update)) {
                 throw new ServiceException("缁戝畾宸ヨ壓璺嚎澶辫触");
             }
@@ -228,6 +227,7 @@
         clearProductionSnapshot(productionOrderId);
         ProductionOrderBom orderBom = syncProductionOrderBomSnapshot(productionOrder, technologyRouting);
 
+        //鐢熶骇璁㈠崟宸ヨ壓璺嚎琛�
         ProductionOrderRouting orderRouting = new ProductionOrderRouting();
         orderRouting.setProductionOrderId(productionOrder.getId());
         orderRouting.setTechnologyRoutingId(technologyRouting.getId());
@@ -236,7 +236,6 @@
         orderRouting.setDescription(technologyRouting.getDescription());
         orderRouting.setBomId(technologyRouting.getBomId());
         orderRouting.setOrderBomId(orderBom == null ? null : orderBom.getId());
-        // 鎸佷箙鍖栨垨杈撳嚭澶勭悊缁撴灉
         productionOrderRoutingMapper.insert(orderRouting);
 
         int syncedParamCount = 0;
@@ -271,6 +270,7 @@
             targetOperation.setIsQuality(sourceOperation.getIsQuality());
             targetOperation.setOperationName(operationNameMap.get(sourceOperation.getTechnologyOperationId()));
             targetOperation.setTechnologyOperationId(sourceOperation.getTechnologyOperationId());
+            targetOperation.setType(sourceOperation.getType());
             productionOrderRoutingOperationMapper.insert(targetOperation);
 
             boolean isLastOperation = lastDragSort != null && Objects.equals(sourceOperation.getDragSort(), lastDragSort);
@@ -745,8 +745,8 @@
                 : workOrderPage.getRecords().stream()
                 .filter(Objects::nonNull)
                 .sorted(Comparator.comparing(ProductionOperationTaskVo::getId, Comparator.nullsLast(Comparator.naturalOrder())))
-                .collect(Collectors.toList());
-        if (workOrderList == null || workOrderList.isEmpty()) {
+                .toList();
+        if (workOrderList.isEmpty()) {
             detailVo.setWorkOrderList(Collections.emptyList());
             return detailVo;
         }
@@ -868,6 +868,7 @@
 
                 ProductionOrderWorkOrderDetailVo.ReportDetail reportDetail = new ProductionOrderWorkOrderDetailVo.ReportDetail();
                 reportDetail.setReportMain(reportMain);
+                reportDetail.setWorkHour(reportMain.getWorkHour());
                 reportDetail.setReportOutputList(reportOutputMap.getOrDefault(reportMainId, Collections.emptyList()));
                 reportDetail.setReportParamList(reportParamMap.getOrDefault(reportMainId, Collections.emptyList()));
                 reportDetailList.add(reportDetail);
@@ -878,6 +879,7 @@
                     inspectDetail.setReportId(reportMainId);
                     inspectDetail.setReportNo(reportMain.getProductNo());
                     inspectDetail.setReportMain(reportMain);
+                    inspectDetail.setWorkHour(reportMain.getWorkHour());
                     inspectDetail.setInspect(inspect);
                     inspectDetail.setInspectParamList(inspectParamMap.getOrDefault(inspect.getId(), Collections.emptyList()));
                     inspectDetail.setInspectFileList(inspectFileMap.getOrDefault(inspect.getId(), Collections.emptyList()));
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 175dd30..808e75d 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -275,6 +275,7 @@
         productionProductMain.setUserName(user == null ? dto.getUserName() : user.getNickName());
         productionProductMain.setProductionOperationTaskId(taskId);
         productionProductMain.setStatus(0);
+        productionProductMain.setWorkHour(dto.getWorkHour());
         productionProductMainMapper.insert(productionProductMain);
         syncOperationParamInputValue(dto, routingOperation.getId(), productionProductMain.getId());
 
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index 91fb7b9..cdf80f9 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -173,23 +173,14 @@
             }
             purchaseLedgerMapper.updateById(purchaseLedger);
         }
-        // 6.閲囪喘瀹℃牳鏂板锛涘鎵圭鐞嗘湭閰嶇疆閲囪喘瀹℃壒浜烘椂锛屽鎵规湇鍔′細鑷姩缃负瀹℃壒閫氳繃銆�
-        addApproveByPurchase(loginUser, purchaseLedger);
 
         // 4. 澶勭悊瀛愯〃鏁版嵁
         List<SalesLedgerProduct> productList = purchaseLedgerDto.getProductData();
         if (productList != null && !productList.isEmpty()) {
             handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType());
         }
-        //鏂板鍘熸潗鏂欐楠�  瀹℃壒涔嬪悗鎵嶇敓鎴愭楠�
-//        if (productList != null) {
-//            for (SalesLedgerProduct saleProduct : productList) {
-//                //鏄惁鎺ㄩ�佽川妫�锛屽鏋渢rue灏辨坊鍔�
-//                if (saleProduct.getIsChecked()) {
-//                    addQualityInspect(purchaseLedger, saleProduct);
-//                }
-//            }
-//        }
+        // 6.閲囪喘瀹℃牳鏂板锛涘鎵圭鐞嗘湭閰嶇疆閲囪喘瀹℃壒浜烘椂锛屽鎵规湇鍔′細鑷姩缃负瀹℃壒閫氳繃銆�
+        addApproveByPurchase(loginUser, purchaseLedger);
         // 5. 杩佺Щ涓存椂鏂囦欢鍒版寮忕洰褰�
         fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.PURCHASE_LEDGER, purchaseLedger.getId(), purchaseLedgerDto.getStorageBlobDTOS());
         return 1;
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java
index e91f692..b5003ae 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java
@@ -4,25 +4,33 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+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.AccountIncome;
 import com.ruoyi.account.service.AccountIncomeService;
 import com.ruoyi.common.enums.SaleEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.framework.security.LoginUser;
+import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.purchase.dto.PurchaseReturnOrderDto;
 import com.ruoyi.purchase.dto.PurchaseReturnOrderProductsDto;
+import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.mapper.PurchaseReturnOrderProductsMapper;
 import com.ruoyi.purchase.mapper.PurchaseReturnOrdersMapper;
+import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.purchase.pojo.PurchaseReturnOrderProducts;
 import com.ruoyi.purchase.pojo.PurchaseReturnOrders;
 import com.ruoyi.purchase.service.PurchaseReturnOrdersService;
 import com.ruoyi.purchase.vo.PurchaseReturnDetailsVo;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.purchase.dto.PurchaseReturnOrderHasAllInfoDto;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.ISalesLedgerService;
+import com.ruoyi.stock.mapper.StockOutRecordMapper;
+import com.ruoyi.stock.pojo.StockOutRecord;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -48,6 +56,10 @@
     private final PurchaseReturnOrderProductsMapper purchaseReturnOrderProductsMapper;
     private final ISalesLedgerService salesLedgerService;
     private final AccountIncomeService accountIncomeService;
+    private final StockUtils stockUtils;
+    private final SalesLedgerProductMapper salesLedgerProductMapper;
+    private final PurchaseLedgerMapper purchaseLedgerMapper;
+    private final StockOutRecordMapper stockOutRecordMapper;
 
     @Override
     public IPage<PurchaseReturnOrderHasAllInfoDto> listPage(Page page, PurchaseReturnOrderDto purchaseReturnOrderDto) {
@@ -67,6 +79,10 @@
                 // 杩欓噷涓烘柊澧炲洜姝d涓簄ull
                 purchaseReturnOrderProductsDto.setId(null);
                 purchaseReturnOrderProductsMapper.insert(purchaseReturnOrderProductsDto);
+                //搴撳瓨闇�瑕佸嚭搴�(閲囪喘閫�璐�)
+                PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(purchaseReturnOrderDto.getPurchaseLedgerId());
+                SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(purchaseReturnOrderProductsDto.getSalesLedgerProductId());
+                stockUtils.substractStock(salesLedgerProduct.getProductModelId(), purchaseReturnOrderProductsDto.getReturnQuantity(), StockOutQualifiedRecordTypeEnum.PURCHASE_RETURN_STOCK_OUT.getCode(), purchaseReturnOrderDto.getId(), purchaseLedger.getPurchaseContractNumber()+"-"+salesLedgerProduct.getId());
             }
         }else {
             throw new RuntimeException("璇烽�夋嫨閫�璐у晢鍝�");
@@ -120,7 +136,10 @@
         LambdaUpdateWrapper<PurchaseReturnOrderProducts> updateWrapper = new LambdaUpdateWrapper<>();
         updateWrapper.eq(PurchaseReturnOrderProducts::getPurchaseReturnOrderId, id);
         purchaseReturnOrderProductsMapper.delete(updateWrapper);
-
+        //(閲囪喘閫�璐х殑鏁版嵁闇�瑕佸垹鎺�)
+        stockOutRecordMapper.delete(Wrappers.<StockOutRecord>lambdaQuery()
+                .eq(StockOutRecord::getRecordType,StockOutQualifiedRecordTypeEnum.PURCHASE_RETURN_STOCK_OUT.getCode())
+                .eq(StockOutRecord::getRecordId, id));
         // 璐㈠姟
         LambdaUpdateWrapper<AccountIncome> updateWrapperAccountIncome = new LambdaUpdateWrapper<>();
         updateWrapperAccountIncome.eq(AccountIncome::getBusinessId, id);
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
index 411291c..a4c1106 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
@@ -71,7 +71,6 @@
         if (CollUtil.isEmpty(list)) {
             return AjaxResult.success(list);
         }
-        //
         List<Long> productIds = list.stream().map(SalesLedgerProduct::getId).collect(Collectors.toList());
         List<SimpleReturnOrderGroupDto> groupListByProductIds = purchaseReturnOrderProductsMapper.getReturnOrderGroupListByProductIds(productIds);
         Map<Long, BigDecimal> returnOrderGroupDtoMap = groupListByProductIds.stream().collect(Collectors.toMap(SimpleReturnOrderGroupDto::getSalesLedgerProductId, item -> item.getSumReturnQuantity()));
@@ -83,13 +82,6 @@
             if (item.getFutureTicketsAmount().compareTo(BigDecimal.ZERO) == 0) {
                 item.setFutureTicketsAmount(BigDecimal.ZERO);
             }
-//            ProcurementPageDto procurementDto = new ProcurementPageDto();
-//            procurementDto.setSalesLedgerProductId(item.getId());
-//            procurementDto.setProductCategory(item.getProductCategory());
-//            IPage<ProcurementPageDtoCopy> result = procurementRecordService.listPageCopyByProduction(new Page<>(1,-1), procurementDto);
-//            BigDecimal stockQuantity = stockUtils.getStockQuantity(item.getProductModelId()).get("stockQuantity");
-
-//                ProcurementPageDtoCopy procurementDtoCopy = result.getRecords().get(0);
             if (item.getApproveStatus() != 2) {
                 if (item.getHasSufficientStock() == 0) {
                     item.setApproveStatus(0);
diff --git a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
deleted file mode 100644
index 8c95270..0000000
--- a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package com.ruoyi.sales.controller;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
-import com.ruoyi.common.exception.ServiceException;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.procurementrecord.utils.StockUtils;
-import com.ruoyi.sales.mapper.ShipmentApprovalMapper;
-import com.ruoyi.sales.pojo.SalesLedgerProduct;
-import com.ruoyi.sales.pojo.ShipmentApproval;
-import com.ruoyi.sales.service.ISalesLedgerProductService;
-import com.ruoyi.sales.service.ShipmentApprovalService;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.Operation;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.AllArgsConstructor;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-@RestController
-@RequestMapping("/shipmentApproval")
-@Tag(name = "鍙戣揣瀹℃壒绠$悊")
-@AllArgsConstructor
-public class ShipmentApprovalController extends BaseController {
-
-    private final ShipmentApprovalService shipmentApprovalService;
-    private final ShipmentApprovalMapper shipmentApprovalMapper;
-    private final ISalesLedgerProductService salesLedgerProductService;
-    private final StockUtils stockUtils;
-
-    @GetMapping("/listPage")
-    @Operation(summary = "鍙戣揣瀹℃壒鍒楄〃")
-    public AjaxResult listPage(Page page, ShipmentApproval req) {
-        IPage<ShipmentApproval> listPage = shipmentApprovalService.listPage(page,req);
-        return AjaxResult.success(listPage);
-    }
-
-    @PostMapping("/update")
-    @Operation(summary = "鍙戣揣瀹℃壒,鏇存柊鍙戣揣瀹℃壒鐘舵��")
-    @Transactional(rollbackFor = Exception.class)
-    public AjaxResult update(@RequestBody ShipmentApproval req) {
-
-        //  鏌ヨ鍙戣揣瀹℃壒
-        ShipmentApproval shipmentApproval = shipmentApprovalMapper.selectById(req.getId());
-        if (shipmentApproval == null) {
-            return AjaxResult.error("鍙戣揣瀹℃壒涓嶅瓨鍦�");
-        }
-
-        //  鏇存柊鍙戣揣瀹℃壒鐘舵��
-        shipmentApproval.setApproveStatus(req.getApproveStatus());
-        boolean update = shipmentApprovalService.updateById(shipmentApproval);
-        if (!update) {
-            //  浜嬪姟鍥炴粴
-            throw new ServiceException("鍙戣揣瀹℃壒鏇存柊澶辫触");
-        }
-        //  鏌ヨ鍏宠仈鐨勯攢鍞彴璐︿骇鍝�
-        SalesLedgerProduct salesLedgerProduct = salesLedgerProductService.getById(shipmentApproval.getSalesLedgerProductId());
-        if (salesLedgerProduct == null) {
-            //  鎶涘紓甯镐簨鍔″洖婊�
-            throw new ServiceException("閿�鍞彴璐︿笉瀛樺湪锛屽鎵瑰洖婊�");
-        }
-
-        //  鍚屾鏇存柊閿�鍞彴璐︿骇鍝佺殑瀹℃壒鐘舵��
-        salesLedgerProduct.setApproveStatus(req.getApproveStatus());
-        salesLedgerProductService.updateById(salesLedgerProduct);
-
-        //  瀹℃壒閫氳繃
-        if (req.getApproveStatus() == 3) {
-//            // 鏌ヨ閲囪喘鍏ュ簱璁板綍
-//            LambdaQueryWrapper<ProcurementRecordStorage> lambdaQueryWrapper = new LambdaQueryWrapper<ProcurementRecordStorage>()
-//                    .eq(ProcurementRecordStorage::getSalesLedgerProductId, req.getSalesLedgerProductId());
-//            ProcurementRecordStorage procurementRecordStorage = procurementRecordStorageService.getOne(lambdaQueryWrapper);
-//
-//            if (procurementRecordStorage == null) {
-//                // 淇濊瘉鍓嶉潰鐨勪慨鏀瑰叏閮ㄥ洖婊�
-//                throw new ServiceException("閲囪喘璁板綍涓嶅瓨鍦紝瀹℃壒鍥炴粴");
-//            }
-
-
-            //鍑哄簱
-            stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
-        }
-
-        return AjaxResult.success();
-    }
-
-
-
-    /**
-     * 瀵煎嚭鍙戣揣淇℃伅绠$悊
-     */
-    @PostMapping("/export")
-    @Operation(summary = "瀵煎嚭鍙戣揣瀹℃壒")
-    public void export(HttpServletResponse response) {
-        List<ShipmentApproval> list = shipmentApprovalService.list();
-        ExcelUtil<ShipmentApproval> util = new ExcelUtil<ShipmentApproval>(ShipmentApproval.class);
-        util.exportExcel(response, list, "鍙戣揣瀹℃壒");
-    }
-
-}
diff --git a/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java b/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
index 458be2d..0257f2a 100644
--- a/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
+++ b/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
@@ -61,7 +61,7 @@
         ApproveProcessVO approveProcessVO = new ApproveProcessVO();
         approveProcessVO.setApproveType(7);
         approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
-        approveProcessVO.setApproveReason(req.getType() + ":" +sh);
+        approveProcessVO.setApproveReason(sh);//鍙戣揣缂栧彿
         approveProcessVO.setApproveUserIds(req.getApproveUserIds());
         approveProcessVO.setApproveUser(loginUser.getUserId());
         approveProcessVO.setApproveTime(LocalDate.now().toString());
@@ -122,7 +122,14 @@
     }
 
     @GetMapping("/getDateil/{id}")
+    @Operation(summary = "閫氳繃id鏌ヨ璇︽儏")
     public R getDateil(@PathVariable("id") Long id) {
         return R.ok(shippingInfoService.getDetail(id));
     }
+
+    @GetMapping("/getDateilByShippingNo")
+    @Operation(summary = "閫氳繃鍙戣揣鍗曞彿鏌ヨ璇︽儏")
+    public R getDateilByShippingNo(String shippingNo) {
+        return R.ok(shippingInfoService.getDateilByShippingNo(shippingNo));
+    }
 }
diff --git a/src/main/java/com/ruoyi/sales/dto/ShippingApproveDto.java b/src/main/java/com/ruoyi/sales/dto/ShippingApproveDto.java
new file mode 100644
index 0000000..693016b
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/dto/ShippingApproveDto.java
@@ -0,0 +1,15 @@
+package com.ruoyi.sales.dto;
+
+import com.ruoyi.sales.pojo.ShippingInfo;
+import lombok.Data;
+
+import java.util.List;
+
+//鍙戣揣瀹℃壒鏌ョ湅璇︽儏
+@Data
+public class ShippingApproveDto {
+
+    private ShippingInfo shippingInfo;
+
+    private List<ShippingProductDetailDto> shippingProductDetailDtoList;
+}
diff --git a/src/main/java/com/ruoyi/sales/mapper/ShipmentApprovalMapper.java b/src/main/java/com/ruoyi/sales/mapper/ShipmentApprovalMapper.java
deleted file mode 100644
index c3bf397..0000000
--- a/src/main/java/com/ruoyi/sales/mapper/ShipmentApprovalMapper.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.ruoyi.sales.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.sales.pojo.ShipmentApproval;
-import com.ruoyi.sales.pojo.ShippingInfo;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-
-public interface ShipmentApprovalMapper extends BaseMapper<ShipmentApproval> {
-    IPage<ShipmentApproval> listPage(Page page,@Param("req") ShipmentApproval req);
-
-}
diff --git a/src/main/java/com/ruoyi/sales/mapper/ShippingProductDetailMapper.java b/src/main/java/com/ruoyi/sales/mapper/ShippingProductDetailMapper.java
index f564ba1..a679e0e 100644
--- a/src/main/java/com/ruoyi/sales/mapper/ShippingProductDetailMapper.java
+++ b/src/main/java/com/ruoyi/sales/mapper/ShippingProductDetailMapper.java
@@ -4,6 +4,7 @@
 import com.ruoyi.sales.dto.ShippingProductDetailDto;
 import com.ruoyi.sales.pojo.ShippingProductDetail;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -19,4 +20,6 @@
 public interface ShippingProductDetailMapper extends BaseMapper<ShippingProductDetail> {
 
     List<ShippingProductDetailDto> getDetail(Long id);
+
+    List<ShippingProductDetailDto> getDateilByShippingNo(@Param("shippingNo") String shippingNo);
 }
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index c909871..fa528a9 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -257,5 +257,6 @@
     private Boolean isProduction;
 
     @TableField(exist = false)
+    @Schema(description = "寰呭彂璐ф暟閲�")
     private BigDecimal noQuantity;
 }
diff --git a/src/main/java/com/ruoyi/sales/pojo/ShipmentApproval.java b/src/main/java/com/ruoyi/sales/pojo/ShipmentApproval.java
deleted file mode 100644
index 6399728..0000000
--- a/src/main/java/com/ruoyi/sales/pojo/ShipmentApproval.java
+++ /dev/null
@@ -1,355 +0,0 @@
-package com.ruoyi.sales.pojo;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ruoyi.framework.aspectj.lang.annotation.Excel;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.math.BigDecimal;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.List;
-
-@Data
-@TableName("shipment_approval")
-public class ShipmentApproval {
-    @TableId(type = IdType.AUTO)
-    private Long id;
-    @Schema(description = "鍙戣揣淇℃伅id")
-    private Long shippingInfoId;
-    @Schema(description = "閿�鍞彴璐d")
-    private Long salesLedgerId;
-    @Schema(description = "閿�鍞姤浠蜂骇鍝佽〃id")
-    private Long salesLedgerProductId;
-     @Schema(description = "鐢宠閮ㄩ棬id")
-    private Long approveDeptId;
-
-    @Schema(description = "鐢宠閮ㄩ棬鍚嶇О")
-    @Excel(name = "鐢宠閮ㄩ棬")
-    private String approveDeptName;
-     @Schema(description = "瀹℃壒鐢ㄦ埛id")
-    private Integer approveUserId;
-    @Schema(description = "瀹℃壒鐢ㄦ埛鍚嶇О")
-    @Excel(name = "瀹℃壒鐢ㄦ埛")
-    private String approveUserNames;
-
-    /**
-     * 瀹℃壒鐘舵��
-     */
-    @Schema(description = "瀹℃壒鐘舵�侊細0鏈嚭搴�,1宸插嚭搴�,2寰呭鏍�,3瀹℃牳瀹屾垚,4瀹℃牳澶辫触")
-    @Excel(name = "瀹℃壒鐘舵��", readConverterExp = "0=鏈嚭搴�,1=宸插嚭搴�,2=寰呭鏍�,3=瀹℃牳瀹屾垚,4=瀹℃牳澶辫触")
-    private Integer approveStatus;
-
-    @Schema(description = "鍒涘缓鏃堕棿")
-    @TableField(fill = FieldFill.INSERT)
-    private LocalDateTime createTime;
-
-    @Schema(description = "淇敼鏃堕棿")
-    @TableField(fill = FieldFill.INSERT_UPDATE)
-    private LocalDateTime updateTime;
-
-    @Schema(description = "鍒涘缓鐢ㄦ埛")
-    @TableField(fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Integer createUser;
-
-    @Schema(description = "淇敼鐢ㄦ埛")
-    @TableField(fill = FieldFill.INSERT_UPDATE)
-    private Integer updateUser;
-
-    @Schema(description = "绉熸埛ID")
-    @TableField(fill = FieldFill.INSERT)
-    private Long tenantId;
-
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "鍙戣揣鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
-    @TableField(exist = false)
-    private Date shippingDate;
-
-    @Excel(name = "鍙戣揣杞︾墝鍙�")
-    @TableField(exist = false)
-    private String shippingCarNumber;
-
-    /**
-     * 棰勮鏁伴噺
-     */
-
-    @TableField(exist = false)
-    private BigDecimal warnNum;
-
-    /**
-     * 浜у搧澶х被
-     */
-    @Excel(name = "浜у搧澶х被")
-    @TableField(exist = false)
-    private String productCategory;
-
-    /**
-     * 瑙勬牸鍨嬪彿
-     */
-    @Excel(name = "瑙勬牸鍨嬪彿")
-    @TableField(exist = false)
-    private String specificationModel;
-
-    /**
-     * 鍗曚綅
-     */
-    @Excel(name = "鍗曚綅")
-    @TableField(exist = false)
-    private String unit;
-
-    /**
-     * 鏁伴噺
-     */
-    @Excel(name = "鏁伴噺")
-    @TableField(exist = false)
-    private BigDecimal quantity;
-    @Excel(name = "鏈�浣庡簱瀛樻暟閲�")
-    @TableField(exist = false)
-    private BigDecimal minStock;
-    /**
-     * 绋庣巼
-     */
-    @Excel(name = "绋庣巼")
-    @TableField(exist = false)
-    private BigDecimal taxRate;
-
-    /**
-     * 鍚◣鍗曚环
-     */
-    @Excel(name = "鍚◣鍗曚环")
-    @TableField(exist = false)
-    private BigDecimal taxInclusiveUnitPrice;
-
-    /**
-     * 鍚◣鎬讳环
-     */
-    @Excel(name = "鍚◣鎬讳环")
-    @TableField(exist = false)
-    private BigDecimal taxInclusiveTotalPrice;
-
-    /**
-     * 涓嶅惈绋庢�讳环
-     */
-    @Excel(name = "涓嶅惈绋庢�讳环")
-    @TableField(exist = false)
-    private BigDecimal taxExclusiveTotalPrice;
-
-    /**
-     * 鍙戠エ绫诲瀷
-     */
-
-    @TableField(exist = false)
-    private String invoiceType;
-
-    /**
-     * 鍙拌处绫诲瀷 1.閿�鍞� 2锛岄噰璐�
-     */
-    @TableField(exist = false)
-    private Integer type;
-
-    /**
-     * 鏈鏉ョエ鏁�
-     */
-    @TableField(exist = false)
-    private BigDecimal ticketsNum;
-
-    /**
-     * 鏈鏉ョエ閲戦(鍏�)
-     */
-    @TableField(exist = false)
-    private BigDecimal ticketsAmount;
-
-    /**
-     * 鏈潵绁ㄦ暟
-     */
-    @TableField(exist = false)
-    private BigDecimal futureTickets;
-
-    /**
-     * 鏈潵绁ㄩ噾棰�(鍏�)
-     */
-    @TableField(exist = false)
-    private BigDecimal futureTicketsAmount;
-
-    @Schema(description = "寮�绁ㄦ暟")
-    @TableField(exist = false)
-    private BigDecimal invoiceNum;
-
-    @Schema(description = "鏈紑绁ㄦ暟")
-    @TableField(exist = false)
-    private BigDecimal noInvoiceNum;
-
-    @Schema(description = "寮�绁ㄩ噾棰�")
-    @TableField(exist = false)
-    private BigDecimal invoiceAmount;
-
-    @Schema(description = "鏈紑绁ㄩ噾棰�")
-    @TableField(exist = false)
-    private BigDecimal noInvoiceAmount;
-
-    @Schema(description = "鏈寮�绁ㄦ暟")
-    @TableField(exist = false)
-    private BigDecimal currentInvoiceNum;
-
-    @TableField(exist = false)
-    @Schema(description = "鏈寮�绁ㄩ噾棰�")
-    private BigDecimal currentInvoiceAmount;
-
-    /**
-     *  浜у搧id
-     */
-    @TableField(exist = false)
-    private Long productId;
-
-    /**
-     * 浜у搧瑙勬牸id
-     */
-    @TableField(exist = false)
-    private Long productModelId;
-
-    @Schema(description = "鍒濆鏈紑绁ㄦ暟")
-    @TableField(exist = false)
-    private BigDecimal originalNoInvoiceNum;
-
-    @Schema(description = "涓存椂鏈紑绁ㄦ暟")
-    @TableField(exist = false)
-    private BigDecimal tempNoInvoiceNum;
-
-    @Schema(description = "涓存椂鏈紑绁ㄩ噾棰�")
-    @TableField(exist = false)
-    private BigDecimal tempnoInvoiceAmount;
-
-    @Schema(description = "涓存椂鏈潵绁ㄦ暟")
-    @TableField(exist = false)
-    private BigDecimal tempFutureTickets;
-
-    @Schema(description = "涓存椂鏈潵绁ㄩ噾棰�")
-    @TableField(exist = false)
-    private BigDecimal tempFutureTicketsAmount;
-
-    @Schema(description = "鐧昏浜�")
-    @TableField(exist = false)
-    private String register;
-
-    @Schema(description = "鐧昏鏃ユ湡")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @Excel(name = "鐧昏鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
-    @TableField(exist = false)
-    private LocalDateTime registerDate;
-    /**
-     * 閿�鍞悎鍚屽彿
-     */
-    @Excel(name = "閿�鍞悎鍚屽彿")
-    @TableField(exist = false)
-    private String salesContractNo;
-
-    /**
-     * 瀹㈡埛鍚堝悓鍙�
-     */
-    @Excel(name = "瀹㈡埛鍚堝悓鍙�")
-    @TableField(exist = false)
-    private String customerContractNo;
-
-
-    /**
-     * 椤圭洰鍚嶇О
-     */
-    @Excel(name = "椤圭洰鍚嶇О")
-    @TableField(exist = false)
-    private String projectName;
-
-    /**
-     * 褰曞叆鏃ユ湡
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    @TableField(exist = false)
-    private Date entryDate;
-
-    /**
-     * 涓氬姟鍛�
-     */
-    @Excel(name = "涓氬姟鍛�")
-    @TableField(exist = false)
-    private String salesman;
-
-    @TableField(exist = false)
-    private Long customerId;
-
-    /**
-     * 瀹㈡埛鍚嶇О
-     */
-    @Excel(name = "瀹㈡埛鍚嶇О")
-    @TableField(exist = false)
-    private String customerName;
-
-    /**
-     * 褰曞叆浜�
-     */
-    @TableField(exist = false)
-    private String entryPerson;
-
-    @TableField(exist = false)
-    @Schema(description = "褰曞叆浜�")
-    @Excel(name = "褰曞叆浜�")
-    private String entryPersonName;
-
-    /**
-     * 澶囨敞
-     */
-    @Excel(name = "澶囨敞")
-    @TableField(exist = false)
-    private String remarks;
-
-    /**
-     * 闄勪欢鏉愭枡锛屽瓨鍌ㄦ枃浠跺悕绛夌浉鍏充俊鎭�
-     */
-    @TableField(exist = false)
-    private String attachmentMaterials;
-
-
-    /**
-     * 鍚堝悓閲戦锛堜骇鍝佸惈绋庢�讳环锛�
-     */
-    @Excel(name = "鍚堝悓閲戦")
-    @TableField(exist = false)
-    private BigDecimal contractAmount;
-
-    @TableField(exist = false)
-    @Schema(description = "鏈紑绁ㄩ噾棰�(鍏�)")
-    @Excel(name = "鏈紑绁ㄩ噾棰�")
-    private BigDecimal noInvoiceAmountTotal = BigDecimal.ZERO;
-
-    @Schema(description = "绛捐鏃ユ湡")
-    @TableField(exist = false)
-    private LocalDate executionDate;
-
-    @TableField(exist = false)
-    @Schema(description = "宸插紑绁ㄩ噾棰�(鍏�)")
-    @Excel(name = "宸插紑绁ㄩ噾棰�")
-    private BigDecimal invoiceTotal = BigDecimal.ZERO;
-
-    @TableField(exist = false)
-    @Schema(description = "鍥炴閲戦")
-    private BigDecimal receiptPaymentAmountTotal = BigDecimal.ZERO;
-
-    @TableField(exist = false)
-    @Schema(description = "寰呭洖娆鹃噾棰�")
-    private BigDecimal noReceiptAmount = BigDecimal.ZERO;
-
-    @Schema(description = "浠樻鏂瑰紡")
-    @TableField(exist = false)
-    private String paymentMethod;
-
-    @TableField(exist = false)
-    @Schema(description = "鐢熶骇鐘舵��")
-    private String productionStatus = "鏈紑濮�";
-
-    @TableField(fill = FieldFill.INSERT)
-    private Long deptId;
-}
diff --git a/src/main/java/com/ruoyi/sales/service/ShipmentApprovalService.java b/src/main/java/com/ruoyi/sales/service/ShipmentApprovalService.java
deleted file mode 100644
index 6af2c00..0000000
--- a/src/main/java/com/ruoyi/sales/service/ShipmentApprovalService.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.ruoyi.sales.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.sales.pojo.ShipmentApproval;
-import com.ruoyi.sales.pojo.ShippingInfo;
-
-
-public interface ShipmentApprovalService extends IService<ShipmentApproval>{
-    IPage<ShipmentApproval> listPage(Page page, ShipmentApproval req);
-
-}
diff --git a/src/main/java/com/ruoyi/sales/service/ShippingInfoService.java b/src/main/java/com/ruoyi/sales/service/ShippingInfoService.java
index c3e8a0c..69e8245 100644
--- a/src/main/java/com/ruoyi/sales/service/ShippingInfoService.java
+++ b/src/main/java/com/ruoyi/sales/service/ShippingInfoService.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.sales.dto.SalesLedgerProductDto;
+import com.ruoyi.sales.dto.ShippingApproveDto;
 import com.ruoyi.sales.dto.ShippingInfoDto;
 import com.ruoyi.sales.dto.ShippingProductDetailDto;
 import com.ruoyi.sales.pojo.ShippingInfo;
@@ -28,4 +29,6 @@
     boolean add(ShippingInfoDto req);
 
     List<ShippingProductDetailDto> getDetail(Long id);
+
+    ShippingApproveDto getDateilByShippingNo(String shippingNo);
 }
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 37e06bb..8ce023b 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -101,9 +101,6 @@
 
     @Override
     public List<SalesLedgerProduct> selectSalesLedgerProductList(SalesLedgerProduct salesLedgerProduct) {
-//        LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
-//        queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerProduct.getSalesLedgerId())
-//                .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType());
         List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectSalesLedgerProductList(salesLedgerProduct);
         if(!CollectionUtils.isEmpty(salesLedgerProducts)){
             salesLedgerProducts.forEach(item -> {
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
index 1ec6a8d..f06cad0 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
@@ -61,6 +61,8 @@
     public boolean add(SalesQuotationDto salesQuotationDto) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         SalesQuotation salesQuotation = new SalesQuotation();
+        BeanUtils.copyProperties(salesQuotationDto, salesQuotation);
+        salesQuotation.setId(null);
         Customer customer = customerMapper.selectById(Long.valueOf(salesQuotationDto.getCustomerId()));
         if (ObjectUtils.isNotEmpty(customer))  {
             salesQuotation.setCustomer(customer.getCustomerName());
diff --git a/src/main/java/com/ruoyi/sales/service/impl/ShipmentApprovalServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/ShipmentApprovalServiceImpl.java
deleted file mode 100644
index 9c358e7..0000000
--- a/src/main/java/com/ruoyi/sales/service/impl/ShipmentApprovalServiceImpl.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.ruoyi.sales.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.sales.mapper.ShipmentApprovalMapper;
-import com.ruoyi.sales.pojo.ShipmentApproval;
-import com.ruoyi.sales.service.ShipmentApprovalService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-/**
- * @author :yys
- * @date : 2025/10/22 9:33
- */
-@Service
-@Slf4j
-@RequiredArgsConstructor
-public class ShipmentApprovalServiceImpl extends ServiceImpl<ShipmentApprovalMapper, ShipmentApproval> implements ShipmentApprovalService {
-
-    private final ShipmentApprovalMapper shipmentApprovalMapper;
-
-    @Override
-    public IPage<ShipmentApproval> listPage(Page page, ShipmentApproval req) {
-        IPage<ShipmentApproval> listPage = shipmentApprovalMapper.listPage(page, req);
-        return listPage;
-    }
-}
diff --git a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
index 545ac7d..ba17fe9 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -13,6 +13,7 @@
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.sales.dto.SalesLedgerProductDto;
+import com.ruoyi.sales.dto.ShippingApproveDto;
 import com.ruoyi.sales.dto.ShippingInfoDto;
 import com.ruoyi.sales.dto.ShippingProductDetailDto;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
@@ -68,7 +69,6 @@
         }
         //鎵e噺搴撳瓨
         if(!"宸插彂璐�".equals(byId.getStatus())){
-//            SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(byId.getSalesLedgerProductId());
             List<ShippingProductDetail> shippingProductDetails = shippingProductDetailMapper.selectList(new LambdaQueryWrapper<ShippingProductDetail>().eq(ShippingProductDetail::getShippingInfoId, req.getId()));
             if (CollectionUtils.isEmpty(shippingProductDetails)) {
                 throw new RuntimeException("鍙戣揣淇℃伅涓嶅瓨鍦�");
@@ -141,4 +141,15 @@
     public List<ShippingProductDetailDto> getDetail(Long id) {
         return shippingProductDetailMapper.getDetail(id);
     }
+
+    @Override
+    public ShippingApproveDto getDateilByShippingNo(String shippingNo) {
+        ShippingApproveDto shippingApproveDto = new ShippingApproveDto();
+        ShippingInfo shippingInfo = new ShippingInfo();
+        shippingInfo.setShippingNo(shippingNo);
+        shippingApproveDto.setShippingInfo(shippingInfoMapper.listPage(new Page(1, -1),shippingInfo).getRecords().get(0));
+        List<ShippingProductDetailDto> dateilByShippingNo = shippingProductDetailMapper.getDateilByShippingNo(shippingNo);
+        shippingApproveDto.setShippingProductDetailDtoList(dateilByShippingNo);
+        return shippingApproveDto;
+    }
 }
diff --git a/src/main/java/com/ruoyi/technology/pojo/TechnologyOperation.java b/src/main/java/com/ruoyi/technology/pojo/TechnologyOperation.java
index 061169b..1915946 100644
--- a/src/main/java/com/ruoyi/technology/pojo/TechnologyOperation.java
+++ b/src/main/java/com/ruoyi/technology/pojo/TechnologyOperation.java
@@ -49,7 +49,7 @@
     @Schema(description = "鏄惁璐ㄦ")
     private Boolean isQuality;
 
-    @Schema(description = "绫诲瀷 鍖哄垎璁℃椂鍜岃浠�")
+    @Schema(description = "绫诲瀷 鍖哄垎璁℃椂鍜岃浠讹紝0璁℃椂锛�1璁′欢")
     private Integer type;
 
     @Schema(description = "璁惧id")
diff --git a/src/main/java/com/ruoyi/technology/pojo/TechnologyRoutingOperation.java b/src/main/java/com/ruoyi/technology/pojo/TechnologyRoutingOperation.java
index f91f1e1..93ae801 100644
--- a/src/main/java/com/ruoyi/technology/pojo/TechnologyRoutingOperation.java
+++ b/src/main/java/com/ruoyi/technology/pojo/TechnologyRoutingOperation.java
@@ -58,4 +58,7 @@
     @Schema(description = "閮ㄩ棬ID")
     @TableField(fill = FieldFill.INSERT)
     private Long deptId;
+
+    @Schema(description = "绫诲瀷 鍖哄垎璁℃椂鍜岃浠讹紝0璁℃椂锛�1璁′欢")
+    private Integer type;
 }
diff --git a/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java b/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
index 4079f84..0eff194 100644
--- a/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
+++ b/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
@@ -143,7 +143,10 @@
             routingOperation.setProductModelId(resolveOutputProductModelId(bomStructure, structureById, technologyRouting.getProductModelId()));
             routingOperation.setTechnologyOperationId(bomStructure.getOperationId());
             routingOperation.setDragSort(dragSort++);
-            routingOperation.setIsQuality(getOperationQuality(bomStructure.getOperationId()));
+            TechnologyOperation technologyOperation = getOperation(bomStructure.getOperationId());
+            routingOperation.setIsQuality(technologyOperation != null ? technologyOperation.getIsQuality() : null);
+            routingOperation.setIsProduction(technologyOperation != null ? technologyOperation.getIsProduction() : null);
+            routingOperation.setType(technologyOperation != null ? technologyOperation.getType() : null);
             technologyRoutingOperationMapper.insert(routingOperation);
             syncRoutingOperationParams(routingOperation.getId(), bomStructure.getOperationId());
         }
@@ -204,12 +207,11 @@
         }
     }
 
-    /**
-     * 璐ㄦ鏍囪瘑浠ュ伐搴忓熀纭�琛ㄥ畾涔変负鍑嗐��
-     */
-    private Boolean getOperationQuality(Long operationId) {
-        TechnologyOperation technologyOperation = technologyOperationMapper.selectById(operationId);
-        return technologyOperation != null ? technologyOperation.getIsQuality() : null;
+    private TechnologyOperation getOperation(Long operationId) {
+        if (operationId == null) {
+            return null;
+        }
+        return technologyOperationMapper.selectById(operationId);
     }
 
     private String buildProcessRouteCode(Long id) {
diff --git a/src/main/resources/mapper/production/ProductionAccountMapper.xml b/src/main/resources/mapper/production/ProductionAccountMapper.xml
index 2841854..4be1c23 100644
--- a/src/main/resources/mapper/production/ProductionAccountMapper.xml
+++ b/src/main/resources/mapper/production/ProductionAccountMapper.xml
@@ -29,15 +29,19 @@
         pa.scheduling_user_id as schedulingUserId,
         pa.scheduling_user_name as schedulingUserName,
         cast(sum(
-            ifnull(pa.work_hours, 0) * ifnull(pa.finished_num, 0) *
             case
-                when substring_index(pm.model, '*', -1) regexp '^[0-9]+(\\.[0-9]+)?$'
-                then cast(substring_index(pm.model, '*', -1) as decimal(18,4))
-                else 1
+                when poro.type = 0 then ifnull(pa.work_hours, 0) * ifnull(ppm.work_hour, 0)
+                else ifnull(pa.work_hours, 0) * ifnull(pa.finished_num, 0) *
+                     case
+                         when substring_index(pm.model, '*', -1) regexp '^[0-9]+(\\.[0-9]+)?$'
+                         then cast(substring_index(pm.model, '*', -1) as decimal(18,4))
+                         else 1
+                     end
             end
         ) as decimal(18,4)) as wages,
         cast(sum(ifnull(pa.finished_num, 0)) as decimal(18,4)) as finishedNum,
         cast(sum(ifnull(pa.work_hours, 0)) as decimal(18,4)) as workHours,
+        cast(sum(ifnull(ppm.work_hour, 0)) as decimal(18,4)) as workHour,
         case
             when sum(ifnull(ppo.quantity, 0) + ifnull(ppo.scrapQty, 0)) = 0 then '0%'
             else concat(
diff --git a/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml b/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
index 577bcfd..6db5455 100644
--- a/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
+++ b/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
@@ -29,6 +29,7 @@
                pm.model as model,
                pm.unit as unit,
                poro.operation_name as operationName,
+               poro.type as type,
                IFNULL(scrapStat.scrapQty, 0) AS scrapQty,
         ROUND(IFNULL(pot.complete_quantity, 0) / NULLIF(pot.plan_quantity, 0) * 100, 2) AS completionStatus,
         CASE
diff --git a/src/main/resources/mapper/production/ProductionOrderRoutingOperationMapper.xml b/src/main/resources/mapper/production/ProductionOrderRoutingOperationMapper.xml
index 55739db..4d63797 100644
--- a/src/main/resources/mapper/production/ProductionOrderRoutingOperationMapper.xml
+++ b/src/main/resources/mapper/production/ProductionOrderRoutingOperationMapper.xml
@@ -13,6 +13,7 @@
         <result column="update_time" property="updateTime" />
         <result column="drag_sort" property="dragSort" />
         <result column="is_quality" property="isQuality" />
+        <result column="type" property="type" />
         <result column="create_user" property="createUser" />
         <result column="dept_id" property="deptId" />
     </resultMap>
diff --git a/src/main/resources/mapper/production/ProductionPlanMapper.xml b/src/main/resources/mapper/production/ProductionPlanMapper.xml
index a389d32..69ccd36 100644
--- a/src/main/resources/mapper/production/ProductionPlanMapper.xml
+++ b/src/main/resources/mapper/production/ProductionPlanMapper.xml
@@ -53,6 +53,9 @@
                 <if test="c.requiredDateStart != null and c.requiredDateEnd != null">
                     and pp.required_date between #{c.requiredDateStart} and #{c.requiredDateEnd}
                 </if>
+                <if test="c.salesContractNo != null and c.salesContractNo != ''">
+                    and sl.sales_contract_no like concat('%', #{c.salesContractNo}, '%')
+                </if>
             </if>
         </where>
         ORDER BY COALESCE(pp.id) DESC
diff --git a/src/main/resources/mapper/production/ProductionProductMainMapper.xml b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
index 5a78a5b..df585f9 100644
--- a/src/main/resources/mapper/production/ProductionProductMainMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -100,13 +100,17 @@
                ifnull(ppo.scrap_qty, 0) as scrapQty,
                date(pa.scheduling_date) as schedulingDate,
                pa.scheduling_user_name as schedulingUserName,
+               cast(ifnull(ppm.work_hour, 0) as decimal(18,4)) as workHour,
                cast(ifnull(pa.work_hours, 0) as decimal(18,4)) as workHours,
                cast(
-                   ifnull(pa.work_hours, 0) * ifnull(pa.finished_num, 0) *
                    case
-                       when substring_index(pm.model, '*', -1) regexp '^[0-9]+(\\.[0-9]+)?$'
-                       then cast(substring_index(pm.model, '*', -1) as decimal(18,4))
-                       else 1
+                       when poro.type = 0 then ifnull(pa.work_hours, 0) * ifnull(ppm.work_hour, 0)
+                       else ifnull(pa.work_hours, 0) * ifnull(pa.finished_num, 0) *
+                            case
+                                when substring_index(pm.model, '*', -1) regexp '^[0-9]+(\\.[0-9]+)?$'
+                                then cast(substring_index(pm.model, '*', -1) as decimal(18,4))
+                                else 1
+                            end
                    end
                    as decimal(18,4)
                ) as wages
diff --git a/src/main/resources/mapper/sales/ShipmentApprovalMapper.xml b/src/main/resources/mapper/sales/ShipmentApprovalMapper.xml
deleted file mode 100644
index 68cd664..0000000
--- a/src/main/resources/mapper/sales/ShipmentApprovalMapper.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?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.sales.mapper.ShipmentApprovalMapper">
-
-    <select id="listPage" resultType="com.ruoyi.sales.pojo.ShipmentApproval">
-        SELECT *,
-        si.shipping_car_number,
-        T2.nick_name AS entry_person_name
-        FROM shipment_approval sa
-                 LEFT JOIN shipping_info si ON sa.shipping_info_id = si.id
-                 LEFT JOIN sales_ledger sl ON sa.sales_ledger_id = sl.id
-                 LEFT JOIN sales_ledger_product slp ON sa.sales_ledger_product_id = slp.id and slp.type = 1
-                 LEFT JOIN sys_user T2 ON sl.entry_person = T2.user_id
-        <where>
-            1=1
-            <if test="req.approveStatus != null and req.approveStatus != '' ">
-                AND  sa.approve_status = #{req.approveStatus}
-            </if>
-            <if test="req.salesContractNo != null and req.salesContractNo != '' ">
-                AND  sl.sales_contract_no LIKE CONCAT('%',#{req.salesContractNo},'%')
-            </if>
-        </where>
-    </select>
-</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/sales/ShippingProductDetailMapper.xml b/src/main/resources/mapper/sales/ShippingProductDetailMapper.xml
index 464af10..15a6168 100644
--- a/src/main/resources/mapper/sales/ShippingProductDetailMapper.xml
+++ b/src/main/resources/mapper/sales/ShippingProductDetailMapper.xml
@@ -18,5 +18,14 @@
                  left join product p on p.id = pm.product_id
         where spd.shipping_info_id = #{id}
     </select>
+    <select id="getDateilByShippingNo" resultType="com.ruoyi.sales.dto.ShippingProductDetailDto">
+         select si.batch_no, pm.model as specification_model, p.product_name, spd.quantity as delivery_quantity
+         from shipping_product_detail spd
+                  left join shipping_info sp on sp.id = spd.shipping_info_id
+                  left join stock_inventory si on si.id = spd.stock_inventory_id
+                  left join product_model pm on pm.id = si.product_model_id
+                  left join product p on p.id = pm.product_id
+         where sp.shipping_no = #{shippingNo}
+    </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/technology/TechnologyRoutingOperationMapper.xml b/src/main/resources/mapper/technology/TechnologyRoutingOperationMapper.xml
index 1bbb25c..26053b8 100644
--- a/src/main/resources/mapper/technology/TechnologyRoutingOperationMapper.xml
+++ b/src/main/resources/mapper/technology/TechnologyRoutingOperationMapper.xml
@@ -12,6 +12,7 @@
         <result column="update_time" property="updateTime" />
         <result column="drag_sort" property="dragSort" />
         <result column="is_quality" property="isQuality" />
+        <result column="type" property="type" />
         <result column="create_user" property="createUser" />
         <result column="dept_id" property="deptId" />
     </resultMap>

--
Gitblit v1.9.3