From 69bb4a6479653f2e27cb67ce0ab817bd40e9c791 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期三, 04 二月 2026 17:38:27 +0800
Subject: [PATCH] Merge remote-tracking branch 'refs/remotes/origin/dev_New' into jtwy

---
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java             |    5 
 src/main/resources/mapper/production/ProductWorkOrderMapper.xml                         |    8 
 src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java                |    7 
 src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java                     |    1 
 src/main/java/com/ruoyi/home/controller/HomeController.java                             |  194 +++---
 src/main/java/com/ruoyi/production/pojo/SalesLedgerProductionAccounting.java            |   20 
 src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml          |    2 
 src/main/resources/mapper/sales/ReceiptPaymentMapper.xml                                |   13 
 src/main/java/com/ruoyi/production/service/ProductOrderService.java                     |    4 
 src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java      |   18 
 src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml                             |    3 
 src/main/java/com/ruoyi/sales/pojo/SalesLedger.java                                     |    2 
 src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java                |    8 
 src/main/resources/application-zxsq.yml                                                 |  245 ++++++++
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java                          |   11 
 src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java                   |    2 
 src/main/java/com/ruoyi/production/service/ProductionProductMainService.java            |    5 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java           |   31 
 src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java                 |    6 
 src/main/resources/mapper/production/ProductOrderMapper.xml                             |   10 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java                  |   35 
 src/main/java/com/ruoyi/basic/controller/EnumController.java                            |    6 
 src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java               |   21 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java               |    5 
 src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java                |   25 
 src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java         |  367 ++++++------
 src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java            |  171 +++++
 src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java                    |    3 
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java   |   69 +
 src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java               |    8 
 src/main/java/com/ruoyi/common/enums/StockInUnQualifiedRecordTypeEnum.java              |    7 
 src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java              |    3 
 src/main/java/com/ruoyi/quality/pojo/QualityInspect.java                                |    5 
 src/main/java/com/ruoyi/stock/controller/StockInventoryController.java                  |    7 
 src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java |   14 
 src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java                |   18 
 src/main/resources/mapper/quality/QualityInspectMapper.xml                              |   39 +
 src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java                |    7 
 /dev/null                                                                               |   26 
 src/main/java/com/ruoyi/quality/controller/QualityInspectController.java                |    9 
 src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java         |   15 
 src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java            |  185 +++---
 src/main/java/com/ruoyi/production/controller/ProductOrderController.java               |   11 
 src/main/resources/mapper/production/ProductionProductMainMapper.xml                    |   16 
 src/main/java/com/ruoyi/common/enums/StockOutUnQualifiedRecordTypeEnum.java             |   21 
 src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml                        |    3 
 46 files changed, 1,096 insertions(+), 595 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 9acc594..dd7618a 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -11,9 +11,9 @@
 import com.ruoyi.approve.pojo.ApproveNode;
 import com.ruoyi.approve.pojo.ApproveProcess;
 import com.ruoyi.approve.service.IApproveNodeService;
-import com.ruoyi.approve.vo.ApproveProcessVO;
 import com.ruoyi.common.enums.FileNameType;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.device.mapper.DeviceRepairMapper;
 import com.ruoyi.device.pojo.DeviceRepair;
@@ -31,7 +31,6 @@
 import com.ruoyi.sales.pojo.SalesQuotation;
 import com.ruoyi.sales.pojo.ShippingInfo;
 import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
-import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -206,7 +205,7 @@
                             purchaseLedgerServiceImpl.addQualityInspect(purchaseLedger, salesLedgerProduct);
                         }else {
                             //鐩存帴鍏ュ簱
-                            stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId());
+                            stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId());
                         }
                     }
                 } else if (status.equals(3)) {
diff --git a/src/main/java/com/ruoyi/basic/controller/EnumController.java b/src/main/java/com/ruoyi/basic/controller/EnumController.java
index b02326a..235eb26 100644
--- a/src/main/java/com/ruoyi/basic/controller/EnumController.java
+++ b/src/main/java/com/ruoyi/basic/controller/EnumController.java
@@ -1,7 +1,7 @@
 package com.ruoyi.basic.controller;
 
 import com.ruoyi.basic.utils.EnumUtils;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.EnumUtil;
 import com.ruoyi.framework.aspectj.lang.annotation.Anonymous;
 import com.ruoyi.framework.web.domain.R;
@@ -24,13 +24,13 @@
     @GetMapping("/stockRecordType")
     @Anonymous
     public R  getStockRecordTypeEnum(){
-        List<Map<String, Object>> list = EnumUtil.toList(StockQualifiedRecordTypeEnum.class);
+        List<Map<String, Object>> list = EnumUtil.toList(StockOutQualifiedRecordTypeEnum.class);
         return R.ok(list);
     }
 
     @GetMapping("/{className}")
     @Anonymous
-    public R test(@PathVariable String className){
+    public R stockRecordTypeByClassName(@PathVariable("className") String className){
         return R.ok(EnumUtils.getOptions("com.ruoyi.common.enums." + className));
     }
 }
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java b/src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java
index 8bf7123..e5c05ed 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java
@@ -25,6 +25,7 @@
 import com.ruoyi.collaborativeApproval.vo.SearchMeetingDraftVo;
 import com.ruoyi.collaborativeApproval.vo.SearchMeetingRoomVo;
 import com.ruoyi.collaborativeApproval.vo.SearchMeetingUseVo;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.project.system.domain.SysUser;
@@ -34,7 +35,9 @@
 import com.ruoyi.staff.pojo.StaffOnJob;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -83,7 +86,22 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void deleteMeetingRoom(Long id) {
+        if (id == null){
+            throw new ServiceException("鍒犻櫎浼氳瀹ゅけ璐�,浼氳瀹D涓嶈兘涓虹┖");
+        }
+
+        LocalDateTime now = LocalDateTime.now();
+        List<MeetApplication> meetApplicationList = meetApplicationMapper.selectList(Wrappers.<MeetApplication>lambdaQuery()
+                .eq(MeetApplication::getRoomId, id)
+                .gt(MeetApplication::getEndTime, now)
+                .in(MeetApplication::getStatus, Arrays.asList(0, 1)));
+
+        if (!meetApplicationList.isEmpty()){
+            throw new ServiceException("鍒犻櫎浼氳瀹ゅけ璐�,璇ヤ細璁灏氭湁鏈紑濮嬫垨杩涜涓殑鏈夋晥浼氳棰勭害");
+        }
+
         meetingRoomMapper.deleteById(id);
     }
 
diff --git a/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
new file mode 100644
index 0000000..102bcc4
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
@@ -0,0 +1,25 @@
+package com.ruoyi.common.enums;
+
+import lombok.Getter;
+
+
+@Getter
+public enum StockInQualifiedRecordTypeEnum implements BaseEnum<String> {
+
+
+    CUSTOMIZATION_STOCK_IN("0", "鍚堟牸鑷畾涔夊叆搴�"),
+    PRODUCTION_REPORT_STOCK_IN("2", "鐢熶骇鎶ュ伐-鍏ュ簱"),
+    PURCHASE_STOCK_IN("7", "閲囪喘-鍏ュ簱"),
+    QUALITYINSPECT_STOCK_IN("11", "璐ㄦ-鍚堟牸鍏ュ簱"),
+    DEFECTIVE_PASS("11", "涓嶅悎鏍�-璁╂鏀捐");
+
+
+    private final String code;
+    private final String value;
+
+    StockInQualifiedRecordTypeEnum(String code, String value) {
+        this.code = code;
+        this.value = value;
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/common/enums/StockUnQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockInUnQualifiedRecordTypeEnum.java
similarity index 60%
rename from src/main/java/com/ruoyi/common/enums/StockUnQualifiedRecordTypeEnum.java
rename to src/main/java/com/ruoyi/common/enums/StockInUnQualifiedRecordTypeEnum.java
index 8a39c56..ab6b041 100644
--- a/src/main/java/com/ruoyi/common/enums/StockUnQualifiedRecordTypeEnum.java
+++ b/src/main/java/com/ruoyi/common/enums/StockInUnQualifiedRecordTypeEnum.java
@@ -4,20 +4,19 @@
 
 
 @Getter
-public enum StockUnQualifiedRecordTypeEnum implements BaseEnum<String> {
+public enum StockInUnQualifiedRecordTypeEnum implements BaseEnum<String> {
 
 
-    PRODUCTION_SCRAP("4", "鐢熶骇鎶ュ伐-鎶ュ簾"),
     DEFECTIVE_SCRAP("5", "涓嶅悎鏍煎鐞�-鎶ュ簾"),
+    PRODUCTION_SCRAP("5", "鐢熶骇鎶ュ伐-鎶ュ簾"),
     CUSTOMIZATION_UNSTOCK_IN("9", "涓嶅悎鏍艰嚜瀹氫箟鍏ュ簱"),
-    CUSTOMIZATION_UNSTOCK_OUT("10", "涓嶅悎鏍艰嚜瀹氫箟鍑哄簱"),
     QUALITYINSPECT_UNSTOCK_IN("12", "璐ㄦ-涓嶅悎鏍煎叆搴�");
 
 
     private final String code;
     private final String value;
 
-    StockUnQualifiedRecordTypeEnum(String code, String value) {
+    StockInUnQualifiedRecordTypeEnum(String code, String value) {
         this.code = code;
         this.value = value;
     }
diff --git a/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
new file mode 100644
index 0000000..37ee471
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
@@ -0,0 +1,21 @@
+package com.ruoyi.common.enums;
+
+import lombok.Getter;
+
+
+@Getter
+public enum StockOutQualifiedRecordTypeEnum implements BaseEnum<String> {
+    CUSTOMIZATION_STOCK_OUT("1", "鍚堟牸鑷畾涔夊嚭搴�"),
+    PRODUCTION_REPORT_STOCK_OUT("3", "鐢熶骇鎶ュ伐-鍑哄簱"),
+    SALE_STOCK_OUT("8", "閿�鍞�-鍑哄簱"),
+    SALE_SHIP_STOCK_OUT("13", "閿�鍞�-鍙戣揣鍑哄簱");
+
+    private final String code;
+    private final String value;
+
+    StockOutQualifiedRecordTypeEnum(String code, String value) {
+        this.code = code;
+        this.value = value;
+    }
+
+    }
diff --git a/src/main/java/com/ruoyi/common/enums/StockOutUnQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockOutUnQualifiedRecordTypeEnum.java
new file mode 100644
index 0000000..2ee40bd
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/enums/StockOutUnQualifiedRecordTypeEnum.java
@@ -0,0 +1,21 @@
+package com.ruoyi.common.enums;
+
+import lombok.Getter;
+
+
+@Getter
+public enum StockOutUnQualifiedRecordTypeEnum implements BaseEnum<String> {
+
+
+    CUSTOMIZATION_UNSTOCK_OUT("10", "涓嶅悎鏍艰嚜瀹氫箟鍑哄簱");
+
+
+    private final String code;
+    private final String value;
+
+    StockOutUnQualifiedRecordTypeEnum(String code, String value) {
+        this.code = code;
+        this.value = value;
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/common/enums/StockQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockQualifiedRecordTypeEnum.java
deleted file mode 100644
index 50ef0c7..0000000
--- a/src/main/java/com/ruoyi/common/enums/StockQualifiedRecordTypeEnum.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.ruoyi.common.enums;
-
-import lombok.Getter;
-
-
-@Getter
-public enum StockQualifiedRecordTypeEnum implements BaseEnum<String> {
-    CUSTOMIZATION_STOCK_IN("0", "鍚堟牸鑷畾涔夊叆搴�"),
-    CUSTOMIZATION_STOCK_OUT("1", "鍚堟牸鑷畾涔夊嚭搴�"),
-    PRODUCTION_REPORT_STOCK_IN("2", "鐢熶骇鎶ュ伐-鍏ュ簱"),
-    PRODUCTION_REPORT_STOCK_OUT("3", "鐢熶骇鎶ュ伐-鍑哄簱"),
-    DEFECTIVE_PASS("6", "涓嶅悎鏍煎鐞�-璁╂鏀捐"),
-    PURCHASE_STOCK_IN("7", "閲囪喘-鍏ュ簱"),
-    SALE_STOCK_OUT("8", "閿�鍞�-鍑哄簱"),
-    QUALITYINSPECT_STOCK_IN("11", "璐ㄦ-鍚堟牸鍏ュ簱"),
-    SALE_SHIP_STOCK_OUT("13", "閿�鍞�-鍙戣揣鍑哄簱");
-
-    private final String code;
-    private final String value;
-
-    StockQualifiedRecordTypeEnum(String code, String value) {
-        this.code = code;
-        this.value = value;
-    }
-
-    }
diff --git a/src/main/java/com/ruoyi/home/controller/HomeController.java b/src/main/java/com/ruoyi/home/controller/HomeController.java
index 7cf3f95..54fde04 100644
--- a/src/main/java/com/ruoyi/home/controller/HomeController.java
+++ b/src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -69,6 +69,7 @@
         return AjaxResult.success(homeSummaryDto);
     }
 
+    /********************************************************钀ラ攢閲囪喘绫�**************************************************/
     @GetMapping("/supplierPurchaseRanking")
     @ApiOperation("渚涘簲鍟嗛噰璐帓鍚�")
     public AjaxResult supplierPurchaseRanking(@RequestParam(value = "type", defaultValue = "1") Integer type) {
@@ -80,13 +81,6 @@
     @ApiOperation("瀹㈡埛钀ユ敹璐$尞鏁板�煎垎鏋�")
     public AjaxResult customerRevenueAnalysis(@RequestParam("customerId") Long customerId, @RequestParam(value = "type", defaultValue = "1") Integer type) {
         CustomerRevenueAnalysisDto dto = homeService.customerRevenueAnalysis(customerId, type);
-        return AjaxResult.success(dto);
-    }
-
-    @GetMapping("/productCategoryDistribution")
-    @ApiOperation("浜у搧澶х被鍒嗗竷")
-    public AjaxResult productCategoryDistribution() {
-        ProductCategoryDistributionDto dto = homeService.productCategoryDistribution();
         return AjaxResult.success(dto);
     }
 
@@ -111,63 +105,23 @@
         return AjaxResult.success(list);
     }
 
-    @GetMapping("/salesPurchaseStorageProductCount")
-    @ApiOperation("閿�鍞�-閲囪喘-鍌ㄥ瓨浜у搧鏁�")
-    public AjaxResult salesPurchaseStorageProductCount(){
-        List<MapDto> list = homeService.salesPurchaseStorageProductCount();
-        return AjaxResult.success(list);
+    @GetMapping("/business")
+    @Log(title = "閿�鍞�-閲囪喘-搴撳瓨鏁版嵁", businessType = BusinessType.OTHER)
+    @ApiOperation("閿�鍞�-閲囪喘-搴撳瓨鏁版嵁")
+    public AjaxResult business(HomeBusinessDto req) {
+        HomeBusinessDto homeBusinessDto = homeService.business();
+        return AjaxResult.success(homeBusinessDto);
     }
 
-    @GetMapping("/productInOutAnalysis")
-    @ApiOperation("浜у搧鍑哄叆搴撳垎鏋�")
-    public AjaxResult productInOutAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){
-        List<Map<String, Object>> result = homeService.productInOutAnalysis(type);
-        return AjaxResult.success(result);
+    @GetMapping("/analysisCustomerContractAmounts")
+    @Log(title = "瀹㈡埛鍚堝悓閲戦鍒嗘瀽", businessType = BusinessType.OTHER)
+    @ApiOperation("瀹㈡埛鍚堝悓閲戦鍒嗘瀽")
+    public AjaxResult analysisCustomerContractAmounts(AnalysisCustomerContractAmountsDto req) {
+        AnalysisCustomerContractAmountsDto analysisCustomerContractAmounts = homeService.analysisCustomerContractAmounts();
+        return AjaxResult.success(analysisCustomerContractAmounts);
     }
 
-    @GetMapping("/productTurnoverDays")
-    @ApiOperation("浜у搧鍛ㄨ浆澶╂暟")
-    public AjaxResult productTurnoverDays(){
-        List<MapDto> list = homeService.productTurnoverDays();
-        return AjaxResult.success(list);
-    }
-
-    @GetMapping("/incomeExpenseAnalysis")
-    @ApiOperation("鏀敹瀵规瘮鍒嗘瀽")
-    public AjaxResult incomeExpenseAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type) {
-        List<Map<String, Object>> result = homeService.incomeExpenseAnalysis(type);
-        return AjaxResult.success(result);
-    }
-
-    @GetMapping("/profitTrendAnalysis")
-    @ApiOperation("鍒╂鼎瓒嬪娍鍒嗘瀽")
-    public AjaxResult profitTrendAnalysis(){
-        List<MapDto> list = homeService.profitTrendAnalysis();
-        return AjaxResult.success(list);
-    }
-
-    @GetMapping("/expenseCompositionAnalysis")
-    @ApiOperation("鏋勬垚鍒嗘瀽")
-    public AjaxResult expenseCompositionAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type) {
-        List<MapDto> list = homeService.expenseCompositionAnalysis(type);
-        return AjaxResult.success(list);
-    }
-
-    @GetMapping("/monthlyIncome")
-    @ApiOperation("鏈堝害鏀跺叆")
-    public AjaxResult monthlyIncome(){
-        MonthlyIncomeDto dto = homeService.monthlyIncome();
-        return AjaxResult.success(dto);
-    }
-
-   @GetMapping("/monthlyExpenditure")
-   @ApiOperation("鏈堝害鏀嚭")
-   public AjaxResult monthlyExpenditure(){
-        MonthlyExpenditureDto dto = homeService.monthlyExpenditure();
-        return AjaxResult.success(dto);
-   }
-   
-
+    /********************************************************鐢熶骇绫�*****************************************************/
     @GetMapping("/inputOutputAnalysis")
     @ApiOperation("鎶曞叆浜у嚭鍒嗘瀽")
     public AjaxResult inputOutputAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){
@@ -176,7 +130,7 @@
     }
 
     @GetMapping("/processOutputAnalysis")
-    @ApiOperation("宸ュ簭浜у嚭鍒嗘瀽") 
+    @ApiOperation("宸ュ簭浜у嚭鍒嗘瀽")
     public AjaxResult processOutputAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){
         List<MapDto> list = homeService.processOutputAnalysis(type);
         return AjaxResult.success(list);
@@ -202,6 +156,21 @@
         return AjaxResult.success(homeService.orderCount());
     }
 
+    @GetMapping("/progressStatistics")
+    @ApiOperation("鍚勭敓浜ц鍗曠殑瀹屾垚杩涘害缁熻")
+    public AjaxResult progressStatistics(){
+        ProductionProgressDto productionProgressDto = homeService.productionProgress();
+        return AjaxResult.success(productionProgressDto);
+    }
+
+    @GetMapping("/workInProcessTurnover")
+    @ApiOperation("鍦ㄥ埗鍝佸懆杞儏鍐�")
+    public AjaxResult workInProcessTurnover(){
+        ProductionTurnoverDto productionTurnoverDto = homeService.workInProcessTurnover();
+        return AjaxResult.success(productionTurnoverDto);
+    }
+
+    /********************************************************璐ㄩ噺绫�*****************************************************/
     @GetMapping("/rawMaterialDetection")
     @ApiOperation("鍘熸潗鏂欐娴�")
     public AjaxResult rawMaterialDetection(@RequestParam(value = "type", defaultValue = "1") Integer type){
@@ -255,42 +224,6 @@
         return AjaxResult.success(list);
     }
 
-    /********************************************************钀ラ攢閲囪喘绫�**************************************************/
-    @GetMapping("/business")
-    @Log(title = "閿�鍞�-閲囪喘-搴撳瓨鏁版嵁", businessType = BusinessType.OTHER)
-    @ApiOperation("閿�鍞�-閲囪喘-搴撳瓨鏁版嵁")
-    public AjaxResult business(HomeBusinessDto req) {
-        HomeBusinessDto homeBusinessDto = homeService.business();
-        return AjaxResult.success(homeBusinessDto);
-    }
-
-
-    @GetMapping("/analysisCustomerContractAmounts")
-    @Log(title = "瀹㈡埛鍚堝悓閲戦鍒嗘瀽", businessType = BusinessType.OTHER)
-    @ApiOperation("瀹㈡埛鍚堝悓閲戦鍒嗘瀽")
-    public AjaxResult analysisCustomerContractAmounts(AnalysisCustomerContractAmountsDto req) {
-        AnalysisCustomerContractAmountsDto analysisCustomerContractAmounts = homeService.analysisCustomerContractAmounts();
-        return AjaxResult.success(analysisCustomerContractAmounts);
-    }
-
-
-    /********************************************************鐢熶骇绫�*****************************************************/
-    @GetMapping("/progressStatistics")
-    @ApiOperation("鍚勭敓浜ц鍗曠殑瀹屾垚杩涘害缁熻")
-    public AjaxResult progressStatistics(){
-        ProductionProgressDto productionProgressDto = homeService.productionProgress();
-        return AjaxResult.success(productionProgressDto);
-    }
-    @GetMapping("/workInProcessTurnover")
-    @ApiOperation("鍦ㄥ埗鍝佸懆杞儏鍐�")
-    public AjaxResult workInProcessTurnover(){
-        ProductionTurnoverDto productionTurnoverDto = homeService.workInProcessTurnover();
-        return AjaxResult.success(productionTurnoverDto);
-    }
-
-
-    
-    /********************************************************璐ㄩ噺绫�*****************************************************/
     @GetMapping("/qualityStatistics")
     @Log(title = "璐ㄩ噺鍒嗘瀽", businessType = BusinessType.OTHER)
     @ApiOperation("璐ㄩ噺鍒嗘瀽")
@@ -299,8 +232,42 @@
         return AjaxResult.success(qualityStatisticsDto);
     }
 
-
     /********************************************************璐㈠姟绫�*****************************************************/
+    @GetMapping("/incomeExpenseAnalysis")
+    @ApiOperation("鏀敹瀵规瘮鍒嗘瀽")
+    public AjaxResult incomeExpenseAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type) {
+        List<Map<String, Object>> result = homeService.incomeExpenseAnalysis(type);
+        return AjaxResult.success(result);
+    }
+
+    @GetMapping("/profitTrendAnalysis")
+    @ApiOperation("鍒╂鼎瓒嬪娍鍒嗘瀽")
+    public AjaxResult profitTrendAnalysis(){
+        List<MapDto> list = homeService.profitTrendAnalysis();
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/expenseCompositionAnalysis")
+    @ApiOperation("鏋勬垚鍒嗘瀽")
+    public AjaxResult expenseCompositionAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type) {
+        List<MapDto> list = homeService.expenseCompositionAnalysis(type);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/monthlyIncome")
+    @ApiOperation("鏈堝害鏀跺叆")
+    public AjaxResult monthlyIncome(){
+        MonthlyIncomeDto dto = homeService.monthlyIncome();
+        return AjaxResult.success(dto);
+    }
+
+    @GetMapping("/monthlyExpenditure")
+    @ApiOperation("鏈堝害鏀嚭")
+    public AjaxResult monthlyExpenditure(){
+        MonthlyExpenditureDto dto = homeService.monthlyExpenditure();
+        return AjaxResult.success(dto);
+    }
+
     @GetMapping("/statisticsReceivablePayable")
     @Log(title = "搴旀敹搴斾粯缁熻", businessType = BusinessType.OTHER)
     @ApiOperation("搴旀敹搴斾粯缁熻")
@@ -309,17 +276,34 @@
         return AjaxResult.success(statisticsReceivablePayable);
     }
 
-
     /********************************************************浠撳偍绫�*****************************************************/
 
+    @GetMapping("/productCategoryDistribution")
+    @ApiOperation("浜у搧澶х被鍒嗗竷")
+    public AjaxResult productCategoryDistribution() {
+        ProductCategoryDistributionDto dto = homeService.productCategoryDistribution();
+        return AjaxResult.success(dto);
+    }
 
+    @GetMapping("/salesPurchaseStorageProductCount")
+    @ApiOperation("閿�鍞�-閲囪喘-鍌ㄥ瓨浜у搧鏁�")
+    public AjaxResult salesPurchaseStorageProductCount(){
+        List<MapDto> list = homeService.salesPurchaseStorageProductCount();
+        return AjaxResult.success(list);
+    }
 
+    @GetMapping("/productInOutAnalysis")
+    @ApiOperation("浜у搧鍑哄叆搴撳垎鏋�")
+    public AjaxResult productInOutAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){
+        List<Map<String, Object>> result = homeService.productInOutAnalysis(type);
+        return AjaxResult.success(result);
+    }
 
-
-
-
-
-
-
+    @GetMapping("/productTurnoverDays")
+    @ApiOperation("浜у搧鍛ㄨ浆澶╂暟")
+    public AjaxResult productTurnoverDays(){
+        List<MapDto> list = homeService.productTurnoverDays();
+        return AjaxResult.success(list);
+    }
 
 }
diff --git a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
index 8de8a83..265cbec 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -1729,8 +1729,7 @@
                     BigDecimal finishQty = item.getQuantity() != null ? item.getQuantity() : BigDecimal.ZERO;
                     BigDecimal scrapQty = item.getScrapQty() != null ? item.getScrapQty() : BigDecimal.ZERO;
 
-                    dto.setFinishQuantity(
-                            dto.getFinishQuantity() != null ? dto.getFinishQuantity().add(finishQty) : finishQty);
+                    dto.setFinishQuantity(dto.getFinishQuantity() != null ? dto.getFinishQuantity().add(finishQty) : finishQty);
                 }
             }
 
@@ -1746,9 +1745,11 @@
                     .filter(i -> i.getCreateTime() != null)
                     .collect(Collectors.groupingBy(
                             i -> i.getCreateTime().toLocalDate().toString(),
-                            Collectors.reducing(BigDecimal.ZERO,
-                                    i -> i.getQuantity() != null ? i.getQuantity() : BigDecimal.ZERO,
-                                    BigDecimal::add)));
+                            Collectors.reducing(BigDecimal.ZERO, i -> {
+                                BigDecimal qty = (i.getQuantity() != null) ? i.getQuantity() : BigDecimal.ZERO;
+                                BigDecimal scrap = (i.getScrapQty() != null) ? i.getScrapQty() : BigDecimal.ZERO;
+                                return qty.subtract(scrap);
+                            }, BigDecimal::add)));
 
             finishMap.forEach((date, qty) -> {
                 WorkOrderEfficiencyDto dto = dateMap.getOrDefault(date, new WorkOrderEfficiencyDto());
diff --git a/src/main/java/com/ruoyi/production/controller/ProductOrderController.java b/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
index 4beb89f..4cb0c68 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -87,4 +87,15 @@
     }
 
 
+    @ApiOperation("鏂板鐢熶骇璁㈠崟")
+    @PostMapping("addProductOrder")
+    public R addProductOrder(@RequestBody ProductOrder productOrder) {
+        return R.ok(productOrderService.addProductOrder(productOrder));
+    }
+
+    @ApiOperation("鍒犻櫎鐢熶骇璁㈠崟")
+    @DeleteMapping("/{ids}")
+    public R delete(@PathVariable("ids") Long[] ids) {
+        return R.ok(productOrderService.delete(ids));
+    }
 }
diff --git a/src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java b/src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java
index d4265bf..bd3610c 100644
--- a/src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java
+++ b/src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java
@@ -1,93 +1,92 @@
-package com.ruoyi.production.controller;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.framework.aspectj.lang.annotation.Log;
-import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.production.dto.ProcessSchedulingDto;
-import com.ruoyi.production.dto.ProductionReportDto;
-import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto;
-import com.ruoyi.production.dto.SalesLedgerWorkDto;
-import com.ruoyi.production.pojo.SalesLedgerWork;
-import com.ruoyi.production.service.SalesLedgerWorkService;
-import com.ruoyi.production.service.impl.SalesLedgerWorkServiceImpl;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-
-/**
- * @author :yys
- * @date : 2025/7/21 14:43
- */
-@RestController
-@Api(tags = "鐢熶骇鎶ュ伐(鎺掍骇璁板綍)")
-@RequestMapping("/salesLedger/work")
-@Deprecated // 鏍囪璇ョ被宸插純鐢�
-public class SalesLedgerWorkController extends BaseController {
-
-
-    @Autowired
-    private SalesLedgerWorkServiceImpl salesLedgerWorkService;
-
-    @GetMapping("/listPage")
-    @Log(title = "鐢熶骇鎶ュ伐-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
-    @ApiOperation("鐢熶骇鎶ュ伐-鍒嗛〉鏌ヨ")
-    public AjaxResult listPage(Page page, SalesLedgerWorkDto salesLedgerWorkDto) {
-        IPage<SalesLedgerWorkDto> listPage = salesLedgerWorkService.listPage(page, salesLedgerWorkDto);
-        return AjaxResult.success(listPage);
-    }
-
-    /**
-     * 瀵煎嚭
-     * @param response
-     */
-    @PostMapping("/export")
-    @ApiOperation("鐢熶骇绠$悊-鐢熶骇鎶ュ伐-瀵煎嚭")
-    public void export(HttpServletResponse response) {
-        Page page = new Page(-1,-1);
-        SalesLedgerWorkDto salesLedgerSchedulingDto = new SalesLedgerWorkDto();
-        IPage<SalesLedgerWorkDto> result = salesLedgerWorkService.listPage(page,salesLedgerSchedulingDto);
-        result.getRecords().forEach(item -> {
-            item.setDaiNum(item.getFinishedNum().subtract(item.getSchedulingNum()));
-            item.setStatusName(item.getStatus().toString());
-        });
-        ExcelUtil<SalesLedgerWorkDto> util = new ExcelUtil<>(SalesLedgerWorkDto.class);
-        util.exportExcel(response, result.getRecords(), "宸ュ簭鎺掍骇");
-    }
-
-    @GetMapping("/list")
-    @Log(title = "鐢熶骇鎶ュ伐-鏌ヨ", businessType = BusinessType.OTHER)
-    @ApiOperation("鐢熶骇鎶ュ伐-鏌ヨ")
-    public AjaxResult list(@RequestParam("id") Long id) {
-        List<ProductionReportDto> list = salesLedgerWorkService.getList(id);
-        return AjaxResult.success(list);
-    }
-
-    @PostMapping("/productionReport")
-    @Log(title = "鐢熶骇绠$悊-鐢熶骇鎶ュ伐", businessType = BusinessType.INSERT)
-    @ApiOperation("鐢熶骇绠$悊-鐢熶骇鎶ュ伐")
-    @Transactional(rollbackFor = Exception.class)
-    public AjaxResult productionReport(@RequestBody ProductionReportDto productionReportDto) {
-        int result = salesLedgerWorkService.productionReport(productionReportDto);
-        return AjaxResult.success(result);
-    }
-
-
-    @PostMapping("/productionReportUpdate")
-    @Log(title = "鐢熶骇绠$悊-鐢熶骇鎶ュ伐-淇敼", businessType = BusinessType.UPDATE)
-    @ApiOperation("鐢熶骇绠$悊-鐢熶骇鎶ュ伐-淇敼")
-    @Transactional(rollbackFor = Exception.class)
-    public AjaxResult productionReportUpdate(@RequestBody ProductionReportDto productionReportDto) {
-        int result = salesLedgerWorkService.productionReportUpdate(productionReportDto);
-        return AjaxResult.success(result);
-    }
-
-}
+//package com.ruoyi.production.controller;
+//
+//import com.baomidou.mybatisplus.core.metadata.IPage;
+//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+//import com.ruoyi.common.utils.poi.ExcelUtil;
+//import com.ruoyi.framework.aspectj.lang.annotation.Log;
+//import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+//import com.ruoyi.framework.web.controller.BaseController;
+//import com.ruoyi.framework.web.domain.AjaxResult;
+//import com.ruoyi.production.dto.ProcessSchedulingDto;
+//import com.ruoyi.production.dto.ProductionReportDto;
+//import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto;
+//import com.ruoyi.production.dto.SalesLedgerWorkDto;
+//import com.ruoyi.production.pojo.SalesLedgerWork;
+//import com.ruoyi.production.service.SalesLedgerWorkService;
+//import io.swagger.annotations.Api;
+//import io.swagger.annotations.ApiOperation;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.transaction.annotation.Transactional;
+//import org.springframework.web.bind.annotation.*;
+//
+//import javax.servlet.http.HttpServletResponse;
+//import java.util.List;
+//
+///**
+// * @author :yys
+// * @date : 2025/7/21 14:43
+// */
+//@RestController
+//@Api(tags = "鐢熶骇鎶ュ伐(鎺掍骇璁板綍)")
+//@RequestMapping("/salesLedger/work")
+//@Deprecated // 鏍囪璇ョ被宸插純鐢�
+//public class SalesLedgerWorkController extends BaseController {
+//
+//
+//    @Autowired
+//    private SalesLedgerWorkServiceImpl salesLedgerWorkService;
+//
+//    @GetMapping("/listPage")
+//    @Log(title = "鐢熶骇鎶ュ伐-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
+//    @ApiOperation("鐢熶骇鎶ュ伐-鍒嗛〉鏌ヨ")
+//    public AjaxResult listPage(Page page, SalesLedgerWorkDto salesLedgerWorkDto) {
+//        IPage<SalesLedgerWorkDto> listPage = salesLedgerWorkService.listPage(page, salesLedgerWorkDto);
+//        return AjaxResult.success(listPage);
+//    }
+//
+//    /**
+//     * 瀵煎嚭
+//     * @param response
+//     */
+//    @PostMapping("/export")
+//    @ApiOperation("鐢熶骇绠$悊-鐢熶骇鎶ュ伐-瀵煎嚭")
+//    public void export(HttpServletResponse response) {
+//        Page page = new Page(-1,-1);
+//        SalesLedgerWorkDto salesLedgerSchedulingDto = new SalesLedgerWorkDto();
+//        IPage<SalesLedgerWorkDto> result = salesLedgerWorkService.listPage(page,salesLedgerSchedulingDto);
+//        result.getRecords().forEach(item -> {
+//            item.setDaiNum(item.getFinishedNum().subtract(item.getSchedulingNum()));
+//            item.setStatusName(item.getStatus().toString());
+//        });
+//        ExcelUtil<SalesLedgerWorkDto> util = new ExcelUtil<>(SalesLedgerWorkDto.class);
+//        util.exportExcel(response, result.getRecords(), "宸ュ簭鎺掍骇");
+//    }
+//
+//    @GetMapping("/list")
+//    @Log(title = "鐢熶骇鎶ュ伐-鏌ヨ", businessType = BusinessType.OTHER)
+//    @ApiOperation("鐢熶骇鎶ュ伐-鏌ヨ")
+//    public AjaxResult list(@RequestParam("id") Long id) {
+//        List<ProductionReportDto> list = salesLedgerWorkService.getList(id);
+//        return AjaxResult.success(list);
+//    }
+//
+//    @PostMapping("/productionReport")
+//    @Log(title = "鐢熶骇绠$悊-鐢熶骇鎶ュ伐", businessType = BusinessType.INSERT)
+//    @ApiOperation("鐢熶骇绠$悊-鐢熶骇鎶ュ伐")
+//    @Transactional(rollbackFor = Exception.class)
+//    public AjaxResult productionReport(@RequestBody ProductionReportDto productionReportDto) {
+//        int result = salesLedgerWorkService.productionReport(productionReportDto);
+//        return AjaxResult.success(result);
+//    }
+//
+//
+//    @PostMapping("/productionReportUpdate")
+//    @Log(title = "鐢熶骇绠$悊-鐢熶骇鎶ュ伐-淇敼", businessType = BusinessType.UPDATE)
+//    @ApiOperation("鐢熶骇绠$悊-鐢熶骇鎶ュ伐-淇敼")
+//    @Transactional(rollbackFor = Exception.class)
+//    public AjaxResult productionReportUpdate(@RequestBody ProductionReportDto productionReportDto) {
+//        int result = salesLedgerWorkService.productionReportUpdate(productionReportDto);
+//        return AjaxResult.success(result);
+//    }
+//
+//}
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
index 9d39a77..d637f7d 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
@@ -20,4 +20,6 @@
     ProductWorkOrderDto getProductWorkOrderFlowCard(@Param("id") Long id);
 
     List<ProductWorkOrderDto> selectWorkOrderStartStats(@Param("startDate") String startDate, @Param("endDate") String endDate);
+
+    ProductWorkOrder selectMax(@Param("datePrefix") String datePrefix);
 }
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java
index 818b6f1..e63e032 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java
@@ -10,6 +10,7 @@
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.ArrayList;
 import java.util.List;
 
 @Mapper
@@ -30,4 +31,6 @@
     ProductOrder getOrderByMainId(@Param("productMainId") Long productMainId);
 
     IPage<ProductionProductMainDto> listProductionDetails(@Param("ew") SalesLedgerProductionAccountingDto salesLedgerProductionAccountingDto, Page page);
+
+    ArrayList<Long> listMain(List<Long> idList);
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
index c938170..82bece9 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
@@ -24,6 +24,7 @@
     private BigDecimal quantity;
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
 
     @ApiModelProperty(value = "绉熸埛ID")
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java
index 2889bdd..f78df35 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java
@@ -20,10 +20,11 @@
     @ApiModelProperty(value = "浜у搧id")
     private Long productModelId;
 
-    @ApiModelProperty(value = "鎶ュ伐鏁伴噺")
+    @ApiModelProperty(value = "鎶ュ伐鏁伴噺(鎬绘暟閲�)")
     private BigDecimal quantity;
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
 
     @ApiModelProperty(value = "绉熸埛ID")
diff --git a/src/main/java/com/ruoyi/production/pojo/SalesLedgerProductionAccounting.java b/src/main/java/com/ruoyi/production/pojo/SalesLedgerProductionAccounting.java
index b410df7..cb56f29 100644
--- a/src/main/java/com/ruoyi/production/pojo/SalesLedgerProductionAccounting.java
+++ b/src/main/java/com/ruoyi/production/pojo/SalesLedgerProductionAccounting.java
@@ -23,24 +23,9 @@
     private Long id;
 
     /**
-     * 閿�鍞帓浜�-鎶ュ伐琛╥d
+     * 鎶ュ伐琛╥d
      */
-    private Long salesLedgerWorkId;
-
-    /**
-     * 閿�鍞帓浜ц〃id
-     */
-    private Long salesLedgerSchedulingId;
-
-    /**
-     * 閿�鍞彴璐d
-     */
-    private Long salesLedgerId;
-
-    /**
-     * 閿�鍞骇鍝乮d
-     */
-    private Long salesLedgerProductId;
+    private Long productMainId;
 
     /**
      * 鐢熶骇浜篿d
@@ -101,6 +86,5 @@
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
 
-    private Long ProductMainId;
 
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductOrderService.java b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
index 78a3de1..5a714a6 100644
--- a/src/main/java/com/ruoyi/production/service/ProductOrderService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -21,4 +21,8 @@
     List<ProcessRoute> listProcessRoute(Long productModelId);
 
     List<ProductStructureDto> listProcessBom(Long orderId);
+
+    Boolean addProductOrder(ProductOrder productOrder);
+
+    Boolean delete(Long[] id);
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductionProductMainService.java b/src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
index af6e414..72d868c 100644
--- a/src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
@@ -6,10 +6,15 @@
 import com.ruoyi.production.dto.ProductionProductMainDto;
 import com.ruoyi.production.pojo.ProductionProductMain;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public interface ProductionProductMainService extends IService<ProductionProductMain> {
     IPage<ProductionProductMainDto> listPageProductionProductMainDto(Page page, ProductionProductMainDto productionProductMainDto);
 
     Boolean addProductMain(ProductionProductMainDto productionProductMainDto);
 
     Boolean removeProductMain(Long id);
+
+    ArrayList<Long> listMain(List<Long> idList);
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
index a6fdd11..2ef08c1 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -1,22 +1,29 @@
 package com.ruoyi.production.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.production.dto.ProductBomDto;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
+import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.dto.ProductOrderDto;
 import com.ruoyi.production.dto.ProductStructureDto;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
-import com.ruoyi.production.service.ProcessRouteService;
 import com.ruoyi.production.service.ProductOrderService;
+import com.ruoyi.quality.mapper.QualityInspectMapper;
+import com.ruoyi.quality.pojo.QualityInspect;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 public class ProductOrderServiceImpl extends ServiceImpl<ProductOrderMapper, ProductOrder> implements ProductOrderService {
@@ -39,6 +46,23 @@
     @Autowired
     private ProductWorkOrderMapper productWorkOrderMapper;
 
+    @Autowired
+    private ProductionProductMainMapper productionProductMainMapper;
+
+    @Autowired
+    private ProductionProductOutputMapper productionProductOutputMapper;
+
+    @Autowired
+    private ProductionProductInputMapper productionProductInputMapper;
+
+    @Autowired
+    private QualityInspectMapper qualityInspectMapper;
+
+    @Autowired
+    private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
+
+    @Autowired
+    private StockUtils stockUtils;
 
     @Override
     public IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder) {
@@ -69,11 +93,7 @@
             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);
+                ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
                 int sequenceNumber = 1; // 榛樿搴忓彿
                 if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
                     String lastNo = lastWorkOrder.getWorkOrderNo().toString();
@@ -87,7 +107,7 @@
                     }
                 }
                 // 鐢熸垚瀹屾暣鐨勫伐鍗曞彿
-                String workOrderNoStr ="GD"+ String.format("%s%03d", datePrefix, sequenceNumber);
+                String workOrderNoStr = "GD" + String.format("%s%03d", datePrefix, sequenceNumber);
                 ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                 productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                 productWorkOrder.setProductOrderId(productOrder.getId());
@@ -110,4 +130,139 @@
     public List<ProductStructureDto> listProcessBom(Long orderId) {
         return productOrderMapper.listProcessBom(orderId);
     }
+
+    @Override
+    public Boolean addProductOrder(ProductOrder productOrder) {
+        String string = generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
+        productOrder.setNpsNo(string);
+        productOrder.setCompleteQuantity(BigDecimal.ZERO);
+        this.save(productOrder);
+        if (ObjectUtils.isNotEmpty(productOrder.getRouteId())) {
+            this.bindingRoute(productOrder);
+        }
+        return true;
+    }
+
+    @Override
+    public Boolean delete(Long[] ids) {
+
+        //鎵归噺鏌ヨproductOrder
+        List<ProductOrder> productOrders = productOrderMapper.selectList(
+                new LambdaQueryWrapper<ProductOrder>()
+                        .in(ProductOrder::getId, ids)
+        );
+        if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) {
+
+
+            // 鎵归噺鏌ヨprocessRouteItems
+            List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList(
+                    new LambdaQueryWrapper<ProductProcessRouteItem>()
+                            .in(ProductProcessRouteItem::getProductOrderId, ids)
+            );
+
+            if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(allRouteItems)) {
+                // 鑾峰彇瑕佸垹闄ょ殑宸ュ簭椤笽D
+                List<Long> routeItemIds = allRouteItems.stream()
+                        .map(ProductProcessRouteItem::getId)
+                        .collect(Collectors.toList());
+
+                // 鏌ヨ鍏宠仈鐨勫伐鍗旾D
+                List<ProductWorkOrder> workOrders = productWorkOrderMapper.selectList(
+                        new LambdaQueryWrapper<ProductWorkOrder>()
+                                .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds)
+                );
+                if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(workOrders)) {
+                    List<Long> workOrderIds = workOrders.stream()
+                            .map(ProductWorkOrder::getId)
+                            .collect(Collectors.toList());
+
+                    // 鏌ヨ鍏宠仈鐨勭敓浜т富琛↖D
+                    List<ProductionProductMain> productMains = productionProductMainMapper.selectList(
+                            new LambdaQueryWrapper<ProductionProductMain>()
+                                    .in(ProductionProductMain::getWorkOrderId, workOrderIds)
+                    );
+                    List<Long> productMainIds = productMains.stream()
+                            .map(ProductionProductMain::getId)
+                            .collect(Collectors.toList());
+
+                    // 鍒犻櫎浜у嚭琛ㄣ�佹姇鍏ヨ〃鏁版嵁
+                    if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(productMainIds)) {
+                        productionProductOutputMapper.deleteByProductMainIds(productMainIds);
+                        productionProductInputMapper.deleteByProductMainIds(productMainIds);
+                        List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(
+                                new LambdaQueryWrapper<QualityInspect>()
+                                        .in(QualityInspect::getProductMainId, productMainIds)
+                        );
+                        //鍒犻櫎鍑哄簱璁板綍
+                        for (Long productMainId : productMainIds) {
+                            //鍒犻櫎鐢熶骇鍑哄簱璁板綍
+                            stockUtils.deleteStockOutRecord(productMainId, StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
+                            //鍒犻櫎鎶ュ簾鐨勫叆搴撹褰�
+                            stockUtils.deleteStockInRecord(productMainId, StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
+                        }
+                        qualityInspects.forEach(qualityInspect -> {
+                            //inspectState=1 宸叉彁浜� 涓嶈兘鍒犻櫎
+                            if (qualityInspect.getInspectState() == 1) {
+                                throw new RuntimeException("宸叉彁浜ょ殑妫�楠屽崟涓嶈兘鍒犻櫎");
+                            }
+                        });
+                        qualityInspectMapper.deleteByProductMainIds(productMainIds);
+                        salesLedgerProductionAccountingMapper.delete(new LambdaQueryWrapper<SalesLedgerProductionAccounting>()
+                                .in(SalesLedgerProductionAccounting::getProductMainId, productMainIds));
+                    }
+
+                    // 鍒犻櫎鐢熶骇涓昏〃鏁版嵁
+                    productionProductMainMapper.deleteByWorkOrderIds(workOrderIds);
+
+                    // 鍒犻櫎宸ュ崟鏁版嵁
+                    productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>()
+                            .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds));
+                }
+            }
+            // 鎵归噺鍒犻櫎processRouteItem
+            productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>()
+                    .in(ProductProcessRouteItem::getProductOrderId, ids));
+
+            // 鎵归噺鍒犻櫎productProcessRoute
+            productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>()
+                    .in(ProductProcessRoute::getProductOrderId, ids));
+
+            // 鎵归噺鍒犻櫎productOrder
+            productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
+                    .in(ProductOrder::getId, ids));
+        }
+        return true;
+    }
+
+    //鑾峰彇褰撳墠鐢熶骇璁㈠崟鍙�
+    public String getMaxOrderNoByDate(String datePrefix) {
+        QueryWrapper<ProductOrder> queryWrapper = new QueryWrapper<>();
+        // 鍖归厤浠� SC + 鏃ユ湡寮�澶寸殑璁㈠崟鍙�
+        queryWrapper.likeRight("nps_no", "SC" + datePrefix);
+        // 鎸夎鍗曞彿鍊掑簭鎺掑垪
+        queryWrapper.orderByDesc("nps_no");
+        queryWrapper.last("LIMIT 1");
+
+        ProductOrder latestOrder = this.getOne(queryWrapper);
+        return latestOrder != null ? latestOrder.getNpsNo() : null;
+    }
+
+    public String generateNextOrderNo(String datePrefix) {
+        String maxOrderNo = getMaxOrderNoByDate(datePrefix);
+        int sequence = 1; // 榛樿璧峰搴忓彿
+        if (maxOrderNo != null && !maxOrderNo.isEmpty()) {
+            // 鎻愬彇娴佹按鍙烽儴鍒嗭紙鍋囪鏍煎紡涓� SC + 鏃ユ湡 + 娴佹按鍙凤級
+            String sequenceStr = maxOrderNo.substring(("SC" + datePrefix).length());
+            try {
+                sequence = Integer.parseInt(sequenceStr) + 1;
+            } catch (NumberFormatException e) {
+                // 寮傚父鎯呭喌涓嬮噸缃负1
+                sequence = 1;
+            }
+        }
+        // 鐢熸垚鏂拌鍗曞彿
+        return "SC" + datePrefix + String.format("%04d", sequence);
+    }
+
+
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
index 7f73d6b..c5fbac0 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
@@ -101,14 +101,12 @@
 //                    // 鍒犻櫎璐ㄦ
 //                    qualityInspectMapper.delete(new LambdaQueryWrapper<QualityInspect>()
 //                            .eq(QualityInspect::getProductMainId, mainId));
+                    salesLedgerProductionAccountingMapper.delete(new LambdaQueryWrapper<SalesLedgerProductionAccounting>()
+                            .eq(SalesLedgerProductionAccounting::getProductMainId, main.getId()));
                 }
             }
             // 鏌ヨ璁㈠崟 + 鍒犻櫎鏍哥畻
-            ProductOrder productOrder = productOrderMapper.selectById(productOrderId);
-            if (productOrder != null && productOrder.getSalesLedgerId() != null) {
-                salesLedgerProductionAccountingMapper.delete(new LambdaQueryWrapper<SalesLedgerProductionAccounting>()
-                        .eq(SalesLedgerProductionAccounting::getSalesLedgerId, productOrder.getSalesLedgerId()));
-            }
+
             // 鍒犻櫎鍏宠仈宸ュ崟
             productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>()
                     .eq(ProductWorkOrder::getProductProcessRouteItemId, routeItemId));
@@ -144,11 +142,7 @@
         String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
         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);
+            ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
             int sequenceNumber = 1; // 榛樿搴忓彿
             if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
                 String lastNo = lastWorkOrder.getWorkOrderNo().toString();
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 8ac0c7e..7a67d50 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -11,8 +11,10 @@
 import com.ruoyi.basic.mapper.ProductModelMapper;
 import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.basic.pojo.ProductModel;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.dto.ProductStructureDto;
@@ -24,6 +26,7 @@
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.quality.mapper.*;
 import com.ruoyi.quality.pojo.*;
+import com.ruoyi.quality.service.IQualityInspectService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -33,6 +36,7 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -41,6 +45,7 @@
 @Transactional(rollbackFor = Exception.class)
 public class ProductionProductMainServiceImpl extends ServiceImpl<ProductionProductMainMapper, ProductionProductMain> implements ProductionProductMainService {
 
+    private IQualityInspectService qualityInspectService;
     private ProductionProductMainMapper productionProductMainMapper;
 
 
@@ -148,7 +153,7 @@
             productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
             productionProductInput.setProductMainId(productionProductMain.getId());
             productionProductInputMapper.insert(productionProductInput);
-            stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId());
+            stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId());
 
         }
         /*鏂板鎶ュ伐浜у嚭琛�*/
@@ -202,7 +207,7 @@
                 }
             }else {
                 //鐩存帴鍏ュ簱
-                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productionProductOutput.getQuantity(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
+                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productionProductOutput.getQuantity(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
             }
             /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
             ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
@@ -229,10 +234,7 @@
             productOrderMapper.updateById(productOrder);
             /*娣诲姞鐢熶骇鏍哥畻*/
             SalesLedgerProductionAccounting salesLedgerProductionAccounting = SalesLedgerProductionAccounting.builder()
-                    .salesLedgerWorkId(productionProductMain.getId())
-                    .salesLedgerSchedulingId(0L)
-                    .salesLedgerId(productOrder.getSalesLedgerId())
-                    .salesLedgerProductId(productOrder.getSaleLedgerProductId())
+                    .productMainId(productionProductMain.getId())
                     .schedulingUserId(user.getUserId())
                     .schedulingUserName(user.getNickName())
                     .finishedNum(productQty)
@@ -246,13 +248,14 @@
         //濡傛灉鎶ュ簾鏁伴噺>0,闇�瑕佽繘鍏ユ姤搴熺殑搴撳瓨
         if (ObjectUtils.isNotEmpty(dto.getScrapQty())) {
             if (dto.getScrapQty().compareTo(BigDecimal.ZERO) > 0) {
-                stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
+                stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
             }
         }
         return true;
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean removeProductMain(Long id) {
         ProductionProductMain productionProductMain = productionProductMainMapper.selectById(id);
         //璇ユ姤宸ュ搴旂殑宸ヨ壓璺嚎璇︽儏
@@ -261,20 +264,39 @@
         /*鍒犻櫎鏍哥畻*/
         salesLedgerProductionAccountingMapper.delete(
                 new LambdaQueryWrapper<SalesLedgerProductionAccounting>()
-                        .eq(SalesLedgerProductionAccounting::getSalesLedgerWorkId, productionProductMain.getId())
+                        .eq(SalesLedgerProductionAccounting::getProductMainId, productionProductMain.getId())
         );
         /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
         ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId());
-        productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().subtract(productionProductOutput.getQuantity()));
-        productWorkOrder.setActualEndTime(null);
-        productWorkOrderMapper.updateById(productWorkOrder);
+        if (productWorkOrder != null && productionProductOutput != null) {
+            BigDecimal outputQty = productionProductOutput.getQuantity() == null ? BigDecimal.ZERO : productionProductOutput.getQuantity();
+            BigDecimal scrapQty = productionProductOutput.getScrapQty() == null ? BigDecimal.ZERO : productionProductOutput.getScrapQty();
+            BigDecimal completeQty = productWorkOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productWorkOrder.getCompleteQuantity();
+
+            BigDecimal validQuantity = outputQty.subtract(scrapQty);
+
+            productWorkOrder.setCompleteQuantity(completeQty.subtract(validQuantity));
+            productWorkOrder.setActualEndTime(null);
+            productWorkOrderMapper.updateById(productWorkOrder);
+        } else {
+            throw new ServiceException("鎿嶄綔澶辫触锛氬伐鍗曚俊鎭垨浜у嚭璁板綍涓嶅瓨鍦�");
+        }
+
         //鍒ゆ柇鏄惁鏄渶鍚庝竴閬撳伐搴�
         List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
-        if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
+        if (productProcessRouteItem.getDragSort() != null && productProcessRouteItems != null && productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
             ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
-            productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().subtract(productionProductOutput.getQuantity()));
-            productOrder.setEndTime(null);
-            productOrderMapper.updateById(productOrder);
+            if (productOrder != null) {
+                BigDecimal orderCompleteQty = productOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productOrder.getCompleteQuantity();
+                BigDecimal outputQty = productionProductOutput.getQuantity() != null
+                        ? productionProductOutput.getQuantity() : BigDecimal.ZERO;
+
+                productOrder.setCompleteQuantity(orderCompleteQty.subtract(outputQty));
+                productOrder.setEndTime(null);
+                productOrderMapper.updateById(productOrder);
+            } else {
+                throw new ServiceException("鍏宠仈鐨勭敓浜ц鍗曚笉瀛樺湪");
+            }
         }
         //鍒犻櫎璐ㄦ
         qualityInspectMapper.selectList(
@@ -285,7 +307,9 @@
                     new LambdaQueryWrapper<QualityInspectParam>()
                             .eq(QualityInspectParam::getInspectId, q.getId()));
             qualityInspectMapper.deleteById(q.getId());
+                stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
         });
+
         // 鍒犻櫎浜у嚭璁板綍
         productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>()
                 .eq(ProductionProductOutput::getProductMainId, productionProductMain.getId()));
@@ -293,13 +317,18 @@
         productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>()
                 .eq(ProductionProductInput::getProductMainId, productionProductMain.getId()));
         //鍒犻櫎鎶ュ簾鐨勫叆搴撹褰�
-        stockUtils.deleteStockInRecord(productionProductMain.getId(), StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
+        stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
         //鍒犻櫎涓嶉渶瑕佽川妫�鐨勫悎鏍煎叆搴�
-        stockUtils.deleteStockInRecord(productionProductMain.getId(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode());
+        stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode());
         //鍒犻櫎鎶曞叆瀵瑰簲鐨勫嚭搴撹褰�
-        stockUtils.deleteStockOutRecord(productionProductMain.getId(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
+        stockUtils.deleteStockOutRecord(productionProductMain.getId(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
         // 鍒犻櫎涓昏〃
         productionProductMainMapper.deleteById(productionProductMain.getId());
         return true;
     }
+
+    @Override
+    public ArrayList<Long> listMain(List<Long> idList) {
+        return productionProductMainMapper.listMain(idList);
+    }
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java
index 2135a8b..6573b73 100644
--- a/src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java
@@ -1,185 +1,182 @@
-package com.ruoyi.production.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-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.common.utils.SecurityUtils;
-import com.ruoyi.framework.security.LoginUser;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.procurementrecord.dto.Details;
-import com.ruoyi.procurementrecord.dto.ProcurementAddDto;
-import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd;
-import com.ruoyi.procurementrecord.service.impl.ProcurementRecordOutServiceImpl;
-import com.ruoyi.procurementrecord.service.impl.ProcurementRecordServiceImpl;
-import com.ruoyi.production.dto.ProductionReportDto;
-import com.ruoyi.production.dto.SalesLedgerWorkDto;
-import com.ruoyi.production.mapper.SalesLedgerProductionAccountingMapper;
-import com.ruoyi.production.mapper.SalesLedgerWorkMapper;
-import com.ruoyi.production.pojo.SalesLedgerProductionAccounting;
-import com.ruoyi.production.pojo.SalesLedgerWork;
-import com.ruoyi.production.service.SalesLedgerProductionAccountingService;
-import com.ruoyi.production.service.SalesLedgerWorkService;
-import com.ruoyi.project.system.domain.SysUser;
-import com.ruoyi.project.system.mapper.SysUserMapper;
-import com.ruoyi.sales.mapper.LossMapper;
-import com.ruoyi.sales.pojo.Loss;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.BeanUtils;
-import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
-
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author :yys
- * @date : 2025/7/21 14:40
- */
-@Service
-@RequiredArgsConstructor
-@Slf4j
-public class SalesLedgerWorkServiceImpl extends ServiceImpl<SalesLedgerWorkMapper, SalesLedgerWork> implements SalesLedgerWorkService {
-
-    private final SalesLedgerWorkMapper salesLedgerWorkMapper;
-
-    private final SysUserMapper sysUserMapper;
-
-    private final LossMapper lossMapper;
-
-    private final SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
-
-    @Override
-    public IPage<SalesLedgerWorkDto> listPage(Page page, SalesLedgerWorkDto salesLedgerWorkDto) {
-        IPage<SalesLedgerWorkDto> iPage = salesLedgerWorkMapper.listPage(page, salesLedgerWorkDto);
-        List<Loss> losses = lossMapper.selectList(null);
-        if(!CollectionUtils.isEmpty(losses)){
-            iPage.getRecords().forEach(item -> {
-                String[] split = item.getSpecificationModel().split("\\*");
-                if(split.length == 2 && isNumeric(split[1]) && isNumeric(split[0])){
-                    // 璁$畻鎹熻�楋紙100000浠h〃 鎹熻�楃殑 100 鍜� 鍗曚綅杞崲鐨�1000锛�
-                    BigDecimal divide = new BigDecimal(split[0])
-                            .multiply(new BigDecimal(split[1]))
-                            .multiply(item.getFinishedNum())
-                            .multiply(losses.get(0).getRate())
-                            .divide(new BigDecimal(100000), 2, RoundingMode.HALF_UP);
-                    item.setLoss(divide.toString());
-                }
-
-            });
-        }
-        return iPage;
-    }
-
-    public static boolean isNumeric(String str) {
-        if (str == null || str.isEmpty()) {
-            return false;
-        }
-        // 閬嶅巻瀛楃涓茬殑姣忎釜瀛楃锛屾鏌ユ槸鍚︿负鏁板瓧
-        for (int i = 0; i < str.length(); i++) {
-            if (!Character.isDigit(str.charAt(i))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private final ProcurementRecordServiceImpl procurementRecordService;
-
-    @Override
-    public int productionReport(ProductionReportDto productionReportDto) {
-        SalesLedgerWork salesLedgerWork = salesLedgerWorkMapper.selectById(productionReportDto.getId());
-        SysUser sysUser = sysUserMapper.selectUserById(productionReportDto.getSchedulingUserId());
-        if (salesLedgerWork == null) throw new RuntimeException("鎶ュ伐鏁版嵁涓嶅瓨鍦�");
-        if (salesLedgerWork.getStatus() == 3) throw new RuntimeException("鎶ュ伐宸插畬鎴�");
-        if (sysUser == null) throw new RuntimeException("鐢熶骇浜轰笉瀛樺湪");
-        salesLedgerWork.setFinishedNum(salesLedgerWork.getFinishedNum().add(productionReportDto.getFinishedNum()));
-        if(salesLedgerWork.getSchedulingNum().compareTo(salesLedgerWork.getFinishedNum()) <= 0){
-            salesLedgerWork.setStatus(3);
-        }else{
-            salesLedgerWork.setStatus(2);
-        }
-        salesLedgerWorkMapper.updateById(salesLedgerWork);
-        // 鏂板鎶ュ伐鏁版嵁
-        SalesLedgerProductionAccounting.SalesLedgerProductionAccountingBuilder builder = SalesLedgerProductionAccounting.builder()
-                .salesLedgerWorkId(salesLedgerWork.getId())
-                .salesLedgerSchedulingId(salesLedgerWork.getSalesLedgerSchedulingId())
-                .salesLedgerId(salesLedgerWork.getSalesLedgerId())
-                .salesLedgerProductId((long)salesLedgerWork.getSalesLedgerProductId())
-                .schedulingUserId(sysUser.getUserId())
-                .schedulingUserName(sysUser.getNickName())
-                .finishedNum(productionReportDto.getFinishedNum())
-                .workHours(salesLedgerWork.getWorkHours())
-                .process(salesLedgerWork.getProcess())
-                .schedulingDate(LocalDate.parse(productionReportDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE));
-        salesLedgerProductionAccountingMapper.insert(builder.build());
-        // 鐢熶骇鎶ュ伐鎴愬姛 -> 鍏ュ簱
-        LoginUser loginUser = SecurityUtils.getLoginUser();
-        ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto();
-        procurementRecordOutAdd.setType(2);
-        procurementRecordOutAdd.setTypeName("鐢熶骇鍏ュ簱");
-        procurementRecordOutAdd.setNickName(loginUser.getNickName());
-        List<Details> details = new ArrayList<>();
-        Details details1 = new Details();
-        details1.setInboundQuantity(productionReportDto.getFinishedNum());
-        details1.setId(Integer.parseInt(salesLedgerWork.getSalesLedgerProductId().toString()));
-        details1.setUnitPrice(productionReportDto.getUnitPrice());
-        details1.setTotalPrice(productionReportDto.getTotalPrice());
-        details.add(details1);
-        procurementRecordOutAdd.setDetails(details);
-        procurementRecordService.add(procurementRecordOutAdd);
-
-        return 0;
-    }
-
-    @Override
-    public int productionReportUpdate(ProductionReportDto productionReportDto) {
-        SalesLedgerProductionAccounting salesLedgerProductionAccounting = salesLedgerProductionAccountingMapper.selectById(productionReportDto.getId());
-        if(salesLedgerProductionAccounting == null) throw new RuntimeException("鎶ュ伐鏁版嵁涓嶅瓨鍦�");
-        SysUser sysUser = sysUserMapper.selectUserById(productionReportDto.getSchedulingUserId());
-        if(sysUser == null) throw new RuntimeException("鐢熶骇浜轰笉瀛樺湪");
-        salesLedgerProductionAccounting.setFinishedNum(productionReportDto.getFinishedNum());
-        salesLedgerProductionAccounting.setSchedulingUserId(sysUser.getUserId());
-        salesLedgerProductionAccounting.setSchedulingUserName(sysUser.getNickName());
-        salesLedgerProductionAccounting.setSchedulingDate(LocalDate.parse(productionReportDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE));
-        salesLedgerProductionAccountingMapper.updateById(salesLedgerProductionAccounting);
-
-        // 鏇存柊鎶ュ伐鏁版嵁
-        SalesLedgerWork salesLedgerWork = salesLedgerWorkMapper.selectById(salesLedgerProductionAccounting.getSalesLedgerWorkId());
-        if(salesLedgerWork == null) throw new RuntimeException("鎶ュ伐鏁版嵁涓嶅瓨鍦�");
-        salesLedgerWork.setFinishedNum(productionReportDto.getFinishedNum());
-        if(salesLedgerWork.getSchedulingNum().compareTo(salesLedgerWork.getFinishedNum()) <= 0){
-            salesLedgerWork.setStatus(3);
-        }else{
-            salesLedgerWork.setStatus(2);
-        }
-        salesLedgerWork.setSchedulingUserId(sysUser.getUserId());
-        salesLedgerWork.setSchedulingUserName(sysUser.getNickName());
-        salesLedgerWork.setSchedulingDate(LocalDate.parse(productionReportDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE));
-        salesLedgerWorkMapper.updateById(salesLedgerWork);
-        return 0;
-    }
-
-    @Override
-    public List<ProductionReportDto> getList(Long id) {
-        SalesLedgerWork salesLedgerWork = salesLedgerWorkMapper.selectById(id);
-        if(salesLedgerWork == null) throw new RuntimeException("鎶ュ伐鏁版嵁涓嶅瓨鍦�");
-        LambdaQueryWrapper<SalesLedgerProductionAccounting> salesLedgerProductionAccountingLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        salesLedgerProductionAccountingLambdaQueryWrapper.eq(SalesLedgerProductionAccounting::getSalesLedgerWorkId, id);
-        List<SalesLedgerProductionAccounting> salesLedgerProductionAccountingList = salesLedgerProductionAccountingMapper.selectList(salesLedgerProductionAccountingLambdaQueryWrapper);
-        if(CollectionUtils.isEmpty(salesLedgerProductionAccountingList)) throw new RuntimeException("娌℃湁鐢熶骇璁板綍鏁版嵁");
-        return salesLedgerProductionAccountingList.stream().map(salesLedgerProductionAccounting -> {
-            ProductionReportDto productionReportDto = new ProductionReportDto();
-            BeanUtils.copyProperties(salesLedgerProductionAccounting, productionReportDto);
-            productionReportDto.setSchedulingDate(salesLedgerProductionAccounting.getSchedulingDate().format(DateTimeFormatter.ISO_LOCAL_DATE));
-            productionReportDto.setSchedulingNum(salesLedgerWork.getSchedulingNum());
-            return productionReportDto;
-        }).collect(Collectors.toList());
-    }
-}
+//package com.ruoyi.production.service.impl;
+//
+//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+//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.common.utils.SecurityUtils;
+//import com.ruoyi.framework.security.LoginUser;
+//import com.ruoyi.framework.web.domain.AjaxResult;
+//import com.ruoyi.procurementrecord.dto.Details;
+//import com.ruoyi.procurementrecord.dto.ProcurementAddDto;
+//import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd;
+//import com.ruoyi.procurementrecord.service.impl.ProcurementRecordOutServiceImpl;
+//import com.ruoyi.procurementrecord.service.impl.ProcurementRecordServiceImpl;
+//import com.ruoyi.production.dto.ProductionReportDto;
+//import com.ruoyi.production.dto.SalesLedgerWorkDto;
+//import com.ruoyi.production.mapper.SalesLedgerProductionAccountingMapper;
+//import com.ruoyi.production.mapper.SalesLedgerWorkMapper;
+//import com.ruoyi.production.pojo.SalesLedgerProductionAccounting;
+//import com.ruoyi.production.pojo.SalesLedgerWork;
+//import com.ruoyi.production.service.SalesLedgerProductionAccountingService;
+//import com.ruoyi.production.service.SalesLedgerWorkService;
+//import com.ruoyi.project.system.domain.SysUser;
+//import com.ruoyi.project.system.mapper.SysUserMapper;
+//import com.ruoyi.sales.mapper.LossMapper;
+//import com.ruoyi.sales.pojo.Loss;
+//import lombok.RequiredArgsConstructor;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.BeanUtils;
+//import org.springframework.stereotype.Service;
+//import org.springframework.util.CollectionUtils;
+//
+//import java.math.BigDecimal;
+//import java.math.RoundingMode;
+//import java.time.LocalDate;
+//import java.time.format.DateTimeFormatter;
+//import java.util.ArrayList;
+//import java.util.List;
+//import java.util.stream.Collectors;
+//
+///**
+// * @author :yys
+// * @date : 2025/7/21 14:40
+// */
+//@Service
+//@RequiredArgsConstructor
+//@Slf4j
+//public class SalesLedgerWorkServiceImpl extends ServiceImpl<SalesLedgerWorkMapper, SalesLedgerWork> implements SalesLedgerWorkService {
+//
+//    private final SalesLedgerWorkMapper salesLedgerWorkMapper;
+//
+//    private final SysUserMapper sysUserMapper;
+//
+//    private final LossMapper lossMapper;
+//
+//    private final SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
+//
+//    @Override
+//    public IPage<SalesLedgerWorkDto> listPage(Page page, SalesLedgerWorkDto salesLedgerWorkDto) {
+//        IPage<SalesLedgerWorkDto> iPage = salesLedgerWorkMapper.listPage(page, salesLedgerWorkDto);
+//        List<Loss> losses = lossMapper.selectList(null);
+//        if(!CollectionUtils.isEmpty(losses)){
+//            iPage.getRecords().forEach(item -> {
+//                String[] split = item.getSpecificationModel().split("\\*");
+//                if(split.length == 2 && isNumeric(split[1]) && isNumeric(split[0])){
+//                    // 璁$畻鎹熻�楋紙100000浠h〃 鎹熻�楃殑 100 鍜� 鍗曚綅杞崲鐨�1000锛�
+//                    BigDecimal divide = new BigDecimal(split[0])
+//                            .multiply(new BigDecimal(split[1]))
+//                            .multiply(item.getFinishedNum())
+//                            .multiply(losses.get(0).getRate())
+//                            .divide(new BigDecimal(100000), 2, RoundingMode.HALF_UP);
+//                    item.setLoss(divide.toString());
+//                }
+//
+//            });
+//        }
+//        return iPage;
+//    }
+//
+//    public static boolean isNumeric(String str) {
+//        if (str == null || str.isEmpty()) {
+//            return false;
+//        }
+//        // 閬嶅巻瀛楃涓茬殑姣忎釜瀛楃锛屾鏌ユ槸鍚︿负鏁板瓧
+//        for (int i = 0; i < str.length(); i++) {
+//            if (!Character.isDigit(str.charAt(i))) {
+//                return false;
+//            }
+//        }
+//        return true;
+//    }
+//
+//    private final ProcurementRecordServiceImpl procurementRecordService;
+//
+//    @Override
+//    public int productionReport(ProductionReportDto productionReportDto) {
+//        SalesLedgerWork salesLedgerWork = salesLedgerWorkMapper.selectById(productionReportDto.getId());
+//        SysUser sysUser = sysUserMapper.selectUserById(productionReportDto.getSchedulingUserId());
+//        if (salesLedgerWork == null) throw new RuntimeException("鎶ュ伐鏁版嵁涓嶅瓨鍦�");
+//        if (salesLedgerWork.getStatus() == 3) throw new RuntimeException("鎶ュ伐宸插畬鎴�");
+//        if (sysUser == null) throw new RuntimeException("鐢熶骇浜轰笉瀛樺湪");
+//        salesLedgerWork.setFinishedNum(salesLedgerWork.getFinishedNum().add(productionReportDto.getFinishedNum()));
+//        if(salesLedgerWork.getSchedulingNum().compareTo(salesLedgerWork.getFinishedNum()) <= 0){
+//            salesLedgerWork.setStatus(3);
+//        }else{
+//            salesLedgerWork.setStatus(2);
+//        }
+//        salesLedgerWorkMapper.updateById(salesLedgerWork);
+//        // 鏂板鎶ュ伐鏁版嵁
+//        SalesLedgerProductionAccounting.SalesLedgerProductionAccountingBuilder builder = SalesLedgerProductionAccounting.builder()
+//                .productMainId(null)
+//                .schedulingUserId(sysUser.getUserId())
+//                .schedulingUserName(sysUser.getNickName())
+//                .finishedNum(productionReportDto.getFinishedNum())
+//                .workHours(salesLedgerWork.getWorkHours())
+//                .process(salesLedgerWork.getProcess())
+//                .schedulingDate(LocalDate.parse(productionReportDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE));
+//        salesLedgerProductionAccountingMapper.insert(builder.build());
+//        // 鐢熶骇鎶ュ伐鎴愬姛 -> 鍏ュ簱
+//        LoginUser loginUser = SecurityUtils.getLoginUser();
+//        ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto();
+//        procurementRecordOutAdd.setType(2);
+//        procurementRecordOutAdd.setTypeName("鐢熶骇鍏ュ簱");
+//        procurementRecordOutAdd.setNickName(loginUser.getNickName());
+//        List<Details> details = new ArrayList<>();
+//        Details details1 = new Details();
+//        details1.setInboundQuantity(productionReportDto.getFinishedNum());
+//        details1.setId(Integer.parseInt(salesLedgerWork.getSalesLedgerProductId().toString()));
+//        details1.setUnitPrice(productionReportDto.getUnitPrice());
+//        details1.setTotalPrice(productionReportDto.getTotalPrice());
+//        details.add(details1);
+//        procurementRecordOutAdd.setDetails(details);
+//        procurementRecordService.add(procurementRecordOutAdd);
+//
+//        return 0;
+//    }
+//
+//    @Override
+//    public int productionReportUpdate(ProductionReportDto productionReportDto) {
+//        SalesLedgerProductionAccounting salesLedgerProductionAccounting = salesLedgerProductionAccountingMapper.selectById(productionReportDto.getId());
+//        if(salesLedgerProductionAccounting == null) throw new RuntimeException("鎶ュ伐鏁版嵁涓嶅瓨鍦�");
+//        SysUser sysUser = sysUserMapper.selectUserById(productionReportDto.getSchedulingUserId());
+//        if(sysUser == null) throw new RuntimeException("鐢熶骇浜轰笉瀛樺湪");
+//        salesLedgerProductionAccounting.setFinishedNum(productionReportDto.getFinishedNum());
+//        salesLedgerProductionAccounting.setSchedulingUserId(sysUser.getUserId());
+//        salesLedgerProductionAccounting.setSchedulingUserName(sysUser.getNickName());
+//        salesLedgerProductionAccounting.setSchedulingDate(LocalDate.parse(productionReportDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE));
+//        salesLedgerProductionAccountingMapper.updateById(salesLedgerProductionAccounting);
+//
+//        // 鏇存柊鎶ュ伐鏁版嵁
+//        SalesLedgerWork salesLedgerWork = salesLedgerWorkMapper.selectById(salesLedgerProductionAccounting.getSalesLedgerWorkId());
+//        if(salesLedgerWork == null) throw new RuntimeException("鎶ュ伐鏁版嵁涓嶅瓨鍦�");
+//        salesLedgerWork.setFinishedNum(productionReportDto.getFinishedNum());
+//        if(salesLedgerWork.getSchedulingNum().compareTo(salesLedgerWork.getFinishedNum()) <= 0){
+//            salesLedgerWork.setStatus(3);
+//        }else{
+//            salesLedgerWork.setStatus(2);
+//        }
+//        salesLedgerWork.setSchedulingUserId(sysUser.getUserId());
+//        salesLedgerWork.setSchedulingUserName(sysUser.getNickName());
+//        salesLedgerWork.setSchedulingDate(LocalDate.parse(productionReportDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE));
+//        salesLedgerWorkMapper.updateById(salesLedgerWork);
+//        return 0;
+//    }
+//
+//    @Override
+//    public List<ProductionReportDto> getList(Long id) {
+//        SalesLedgerWork salesLedgerWork = salesLedgerWorkMapper.selectById(id);
+//        if(salesLedgerWork == null) throw new RuntimeException("鎶ュ伐鏁版嵁涓嶅瓨鍦�");
+//        LambdaQueryWrapper<SalesLedgerProductionAccounting> salesLedgerProductionAccountingLambdaQueryWrapper = new LambdaQueryWrapper<>();
+//        salesLedgerProductionAccountingLambdaQueryWrapper.eq(SalesLedgerProductionAccounting::getSalesLedgerWorkId, id);
+//        List<SalesLedgerProductionAccounting> salesLedgerProductionAccountingList = salesLedgerProductionAccountingMapper.selectList(salesLedgerProductionAccountingLambdaQueryWrapper);
+//        if(CollectionUtils.isEmpty(salesLedgerProductionAccountingList)) throw new RuntimeException("娌℃湁鐢熶骇璁板綍鏁版嵁");
+//        return salesLedgerProductionAccountingList.stream().map(salesLedgerProductionAccounting -> {
+//            ProductionReportDto productionReportDto = new ProductionReportDto();
+//            BeanUtils.copyProperties(salesLedgerProductionAccounting, productionReportDto);
+//            productionReportDto.setSchedulingDate(salesLedgerProductionAccounting.getSchedulingDate().format(DateTimeFormatter.ISO_LOCAL_DATE));
+//            productionReportDto.setSchedulingNum(salesLedgerWork.getSchedulingNum());
+//            return productionReportDto;
+//        }).collect(Collectors.toList());
+//    }
+//}
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java b/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
index 3348a8e..39f90eb 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -2,21 +2,18 @@
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
-import com.ruoyi.procurementrecord.service.impl.ProcurementRecordServiceImpl;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.quality.dto.QualityInspectDto;
 import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.pojo.QualityInspectFile;
 import com.ruoyi.quality.pojo.QualityInspectParam;
-import com.ruoyi.quality.pojo.QualityUnqualified;
 import com.ruoyi.quality.service.IQualityInspectFileService;
 import com.ruoyi.quality.service.IQualityInspectParamService;
 import com.ruoyi.quality.service.IQualityInspectService;
-import com.ruoyi.quality.service.IQualityUnqualifiedService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
@@ -74,7 +71,7 @@
         .in(QualityInspectFile::getInspectId,ids));
         //鍒犻櫎鍏ュ簱璁板綍
         for (Integer id : ids) {
-            stockUtils.deleteStockInRecord(Long.valueOf(id), StockQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
+            stockUtils.deleteStockInRecord(Long.valueOf(id), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
         }
         //鍒犻櫎妫�楠屽崟
         return AjaxResult.success(qualityInspectService.removeBatchByIds(ids));
diff --git a/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java b/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
index 0fd11d8..9d23429 100644
--- a/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
+++ b/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -152,4 +152,9 @@
     @ApiModelProperty("鍏宠仈妫�娴嬫爣鍑嗕富琛╥d")
     private Long testStandardId;
 
+
+    @TableField(exist = false)
+    private String workOrderNo;
+    @TableField(exist = false)
+    private String purchaseContractNo;
 }
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
index 07f070e..2111b99 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -8,7 +8,8 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.deepoove.poi.XWPFTemplate;
 import com.deepoove.poi.config.Configure;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
@@ -93,7 +94,7 @@
             qualityUnqualifiedMapper.insert(qualityUnqualified);
         } else {
             //鍚堟牸鐩存帴鍏ュ簱
-            stockUtils.addStock(qualityInspect.getProductModelId(), qualityInspect.getQuantity(), StockQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId());
+            stockUtils.addStock(qualityInspect.getProductModelId(), qualityInspect.getQuantity(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId());
         }
         qualityInspect.setInspectState(1);//宸叉彁浜�
         return qualityInspectMapper.updateById(qualityInspect);
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
index 68c819c..5e98fa8 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -7,8 +7,9 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.procurementrecord.utils.StockUtils;
@@ -98,11 +99,7 @@
                             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);
+                                ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
                                 int sequenceNumber = 1; // 榛樿搴忓彿
                                 if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
                                     String lastNo = lastWorkOrder.getWorkOrderNo().toString();
@@ -130,11 +127,11 @@
                     break;
                 case "鎶ュ簾":
                     //璋冪敤涓嶅悎鏍煎簱瀛樻帴鍙� 鍏ヤ笉鍚堟牸搴�
-                    stockUtils.addUnStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId());
+                    stockUtils.addUnStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId());
                     break;
                 case "璁╂鏀捐":
                     //璋冪敤鎻愪氦鍚堟牸鐨勬帴鍙�
-                    stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
+                    stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
                     qualityInspect.setCheckResult("鍚堟牸");
                     qualityInspectService.submit(qualityInspect);
                     break;
diff --git a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
index 39bdbf2..49548e1 100644
--- a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
+++ b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -1,29 +1,18 @@
 package com.ruoyi.sales.controller;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.google.common.math.LongMath;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
+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.dto.ProcurementAddDto;
-import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd;
-import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
-import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
-import com.ruoyi.procurementrecord.service.ProcurementRecordOutService;
-import com.ruoyi.procurementrecord.service.ProcurementRecordService;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.sales.mapper.ShipmentApprovalMapper;
-import com.ruoyi.sales.mapper.ShippingInfoMapper;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.pojo.ShipmentApproval;
-import com.ruoyi.sales.pojo.ShippingInfo;
 import com.ruoyi.sales.service.ISalesLedgerProductService;
 import com.ruoyi.sales.service.ShipmentApprovalService;
-import com.ruoyi.sales.service.ShippingInfoService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -31,9 +20,6 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
-import java.math.BigDecimal;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
 import java.util.List;
 
 @RestController
@@ -101,7 +87,7 @@
 
 
             //鍑哄簱
-            stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
+            stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
         }
 
         return AjaxResult.success();
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
index 35ac5f5..672fe75 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -37,7 +37,7 @@
     /**
      * 瀹㈡埛鍚堝悓鍙�
      */
-    @Excel(name = "瀹㈡埛鍚堝悓鍙�")
+    @Excel(name = "瀹㈡埛鍚堝悓鍙�", type = Excel.Type.IMPORT)
     private String customerContractNo;
 
 
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 f596e88..09fba03 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -5,16 +5,15 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum;
-import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.dto.ProductStructureDto;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
+import com.ruoyi.production.service.impl.ProductOrderServiceImpl;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
@@ -25,7 +24,6 @@
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.mapper.ShippingInfoMapper;
-import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.pojo.ShippingInfo;
@@ -92,6 +90,8 @@
     private ProductStructureMapper productStructureMapper;
     @Autowired
     private StockInventoryMapper stockInventoryMapper;
+    @Autowired
+    private ProductOrderServiceImpl productOrderServiceImpl;
 
     @Override
     public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
@@ -228,9 +228,7 @@
             /*鍒犻櫎瀵瑰簲鐨勭敓浜ф暟鎹苟閲嶆柊鏂板*/
             deleteProductionData(Arrays.asList(salesLedgerProduct.getId()));
             // 鍒犻櫎鐢熶骇鏍哥畻鏁版嵁
-            LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>();
-            reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, salesLedgerId);
-            salesLedgerProductionAccountingMapper.delete(reportWrapper);
+
             addProductionData(salesLedgerProduct);
         }
 
@@ -272,7 +270,8 @@
         productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
         productOrder.setProductModelId(salesLedgerProduct.getProductModelId());
         productOrder.setSaleLedgerProductId(salesLedgerProduct.getId());
-        productOrder.setNpsNo("SC" + String.format("%08d", salesLedgerProduct.getId()));
+        String string = productOrderServiceImpl.generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
+        productOrder.setNpsNo(string);
         productOrder.setQuantity(salesLedgerProduct.getQuantity());//闇�姹傛暟閲�
         productOrder.setCompleteQuantity(BigDecimal.ZERO);//瀹屾垚鏁伴噺
         productOrderMapper.insert(productOrder);
@@ -303,13 +302,7 @@
                 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);
-
+                    ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
                     int sequenceNumber = 1; // 榛樿搴忓彿
                     if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
                         String lastNo = lastWorkOrder.getWorkOrderNo().toString();
@@ -396,9 +389,9 @@
                         //鍒犻櫎鍑哄簱璁板綍
                         for (Long productMainId : productMainIds) {
                             //鍒犻櫎鐢熶骇鍑哄簱璁板綍
-                            stockUtils.deleteStockOutRecord(productMainId, StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
+                            stockUtils.deleteStockOutRecord(productMainId, StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
                             //鍒犻櫎鎶ュ簾鐨勫叆搴撹褰�
-                            stockUtils.deleteStockInRecord(productMainId, StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
+                            stockUtils.deleteStockInRecord(productMainId, StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
                         }
                         qualityInspects.forEach(qualityInspect -> {
                             //inspectState=1 宸叉彁浜� 涓嶈兘鍒犻櫎
@@ -407,6 +400,8 @@
                             }
                         });
                         qualityInspectMapper.deleteByProductMainIds(productMainIds);
+                        salesLedgerProductionAccountingMapper.delete(new LambdaQueryWrapper<SalesLedgerProductionAccounting>()
+                                .in(SalesLedgerProductionAccounting::getProductMainId, productMainIds));
                     }
 
                     // 鍒犻櫎鐢熶骇涓昏〃鏁版嵁
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 c80ea78..3a42fc7 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -25,6 +25,8 @@
 import com.ruoyi.other.pojo.TempFile;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
+import com.ruoyi.production.service.ProductionProductMainService;
+import com.ruoyi.production.service.impl.ProductionProductMainServiceImpl;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
@@ -146,7 +148,9 @@
     private ProductMapper productMapper;
     @Autowired
     private ProductStructureMapper productStructureMapper;
-;
+    @Autowired
+    private ProductionProductMainService productionProductMainService;
+    ;
 
     @Override
     public List<SalesLedger> selectSalesLedgerList(SalesLedgerDto salesLedgerDto) {
@@ -178,7 +182,7 @@
                     .eq(ShippingInfo::getSalesLedgerProductId, product.getId())
                     .orderByDesc(ShippingInfo::getCreateTime)
                     .last("limit 1"));
-            if(shippingInfo != null){
+            if (shippingInfo != null) {
                 product.setShippingStatus(shippingInfo.getStatus());
             }
         }
@@ -350,7 +354,7 @@
 //            // 浜у搧澶х被鏁版嵁
 //            List<Product> productList = productMapper.selectList(new LambdaQueryWrapper<Product>().in(Product::getProductName,
 //                    salesLedgerProductImportDtoList.stream().map(SalesLedgerImportDto::getProductCategory).collect(Collectors.toList())));
-            List<Map<String,Object>> list = productModelMapper.getProductAndModelList();
+            List<Map<String, Object>> list = productModelMapper.getProductAndModelList();
             // 褰曞叆浜烘暟鎹�
             List<SysUser> sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>().in(SysUser::getNickName,
                     salesLedgerImportDtoList.stream().map(SalesLedgerImportDto::getEntryPerson).collect(Collectors.toList())));
@@ -358,7 +362,7 @@
                 SalesLedger salesLedger1 = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>()
                         .eq(SalesLedger::getSalesContractNo, salesLedgerImportDto.getSalesContractNo())
                         .last("LIMIT 1"));
-                if(salesLedger1 != null){
+                if (salesLedger1 != null) {
                     continue;
                 }
                 SalesLedger salesLedger = new SalesLedger();
@@ -391,7 +395,7 @@
                     throw new RuntimeException("閿�鍞崟鍙�:" + salesLedgerImportDto.getSalesContractNo() + ",鏃犲搴斾骇鍝佹暟鎹紒");
                 salesLedger.setContractAmount(salesLedgerProductImportDtos.stream()
                         .map(SalesLedgerProductImportDto::getTaxInclusiveTotalPrice)
-                        .reduce(BigDecimal.ZERO,BigDecimal::add));
+                        .reduce(BigDecimal.ZERO, BigDecimal::add));
                 salesLedgerMapper.insert(salesLedger);
 
 
@@ -553,25 +557,20 @@
         // 鍒犻櫎鍙戣揣鍙拌处璁板綍
         List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>()
                 .in(ShippingInfo::getSalesLedgerId, idList));
-        if(CollectionUtils.isNotEmpty(shippingInfos)){
+        if (CollectionUtils.isNotEmpty(shippingInfos)) {
             shippingInfoServiceImpl.delete(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList()));
         }
         // 鍒犻櫎闄勪欢琛�
         commonFileService.deleteByBusinessIds(idList, FileNameType.SALE.getValue());
 
         // 鍒犻櫎鐢熶骇绠℃帶鏁版嵁
-        // 鍒犻櫎鐢熶骇璁㈠崟鏁版嵁
-        LambdaQueryWrapper<SalesLedgerScheduling> in = new LambdaQueryWrapper<SalesLedgerScheduling>()
-                .in(SalesLedgerScheduling::getSalesLedgerId, idList);
-        salesLedgerSchedulingMapper.delete(in);
-        // 鍒犻櫎鐢熶骇娲惧伐鏁版嵁
-        LambdaQueryWrapper<SalesLedgerWork> workOrderWrapper = new LambdaQueryWrapper<>();
-        workOrderWrapper.in(SalesLedgerWork::getSalesLedgerId, idList);
-        salesLedgerWorkMapper.delete(workOrderWrapper);
-        // 鍒犻櫎鐢熶骇鏍哥畻鏁版嵁
-        LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>();
-        reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, idList);
-        salesLedgerProductionAccountingMapper.delete(reportWrapper);
+        //鏌ヨ鐢熶骇鎶ュ伐id
+        ArrayList<Long> mainIdList = productionProductMainService.listMain(idList);
+        if (CollectionUtils.isNotEmpty(mainIdList)) {
+            mainIdList.stream().forEach(mainId -> {
+                productionProductMainService.removeProductMain(mainId);
+            });
+        }
         // 2. 鍐嶅垹闄や富琛ㄦ暟鎹�
         return salesLedgerMapper.deleteBatchIds(idList);
     }
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 ea372b0..019320a 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -7,7 +7,7 @@
 import com.ruoyi.approve.pojo.ApproveProcess;
 import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
 import com.ruoyi.common.enums.FileNameType;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.other.service.impl.TempFileServiceImpl;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.sales.dto.ShippingInfoDto;
@@ -66,7 +66,7 @@
         //鎵e噺搴撳瓨
         if(!"宸插彂璐�".equals(byId.getStatus())){
             SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(byId.getSalesLedgerProductId());
-            stockUtils.substractStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
+            stockUtils.substractStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
         }
         byId.setExpressNumber(req.getExpressNumber());
         byId.setExpressCompany(req.getExpressCompany());
@@ -90,7 +90,7 @@
         // 鎵e凡鍙戣揣搴撳瓨
         for (ShippingInfo shippingInfo : shippingInfos) {
             if("宸插彂璐�".equals(shippingInfo.getStatus())) {
-                stockUtils.deleteStockOutRecord(shippingInfo.getId(), StockQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode());
+                stockUtils.deleteStockOutRecord(shippingInfo.getId(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode());
             }
         }
         // 鍒犻櫎鍙戣揣瀹℃壒
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
index f4bd009..70f638e 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
@@ -2,7 +2,8 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
@@ -46,7 +47,7 @@
     @PostMapping("/addstockInventory")
     @ApiOperation("鏂板搴撳瓨")
     public R addstockInventory(@RequestBody StockInventoryDto stockInventoryDto) {
-        stockInventoryDto.setRecordType(String.valueOf(StockQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode()));
+        stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode()));
         stockInventoryDto.setRecordId(0L);
         return R.ok(stockInventoryService.addstockInventory(stockInventoryDto));
     }
@@ -55,7 +56,7 @@
     @PostMapping("/subtractStockInventory")
     @ApiOperation("鎵e噺搴撳瓨")
     public R subtractStockInventory(@RequestBody StockInventoryDto stockInventoryDto) {
-        stockInventoryDto.setRecordType(String.valueOf(StockQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_OUT.getCode()));
+        stockInventoryDto.setRecordType(String.valueOf(StockOutQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_OUT.getCode()));
         stockInventoryDto.setRecordId(0L);
         return R.ok(stockInventoryService.subtractStockInventory(stockInventoryDto));
     }
diff --git a/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java b/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
index 43714ca..39401c4 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
@@ -2,7 +2,8 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutUnQualifiedRecordTypeEnum;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
@@ -37,7 +38,7 @@
     @PostMapping("/addstockUninventory")
     @ApiOperation("鏂板搴撳瓨")
     public R addstockUninventory(@RequestBody StockUninventoryDto stockUninventoryDto) {
-        stockUninventoryDto.setRecordType(String.valueOf(StockUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode()));
+        stockUninventoryDto.setRecordType(String.valueOf(StockInUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode()));
         stockUninventoryDto.setRecordId(0L);
         return R.ok(stockUninventoryService.addStockUninventory(stockUninventoryDto));
     }
@@ -46,7 +47,7 @@
     @PostMapping("/subtractstockUninventory")
     @ApiOperation("鎵e噺搴撳瓨")
     public R subtractstockUninventory(@RequestBody StockUninventoryDto stockUninventoryDto) {
-        stockUninventoryDto.setRecordType(String.valueOf(StockUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
+        stockUninventoryDto.setRecordType(String.valueOf(StockOutUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
         stockUninventoryDto.setRecordId(0L);
         return R.ok(stockUninventoryService.subtractStockUninventory(stockUninventoryDto));
     }
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
index ce6241a..30e545f 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -4,8 +4,8 @@
 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.common.enums.StockQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.EnumUtil;
 import com.ruoyi.common.utils.OrderUtils;
@@ -102,9 +102,9 @@
         List<StockInRecordExportData> list = stockInRecordMapper.listStockInRecordExportData(stockInRecordDto);
         for (StockInRecordExportData stockInRecordExportData : list) {
             if (stockInRecordExportData.getType().equals("0")) {
-                stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
+                stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockOutQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
             }else {
-                stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockUnQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
+                stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockInUnQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
             }
         }
         ExcelUtil<StockInRecordExportData> util = new ExcelUtil<>(StockInRecordExportData.class);
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
index 4c89975..5cb6dda 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -5,7 +5,8 @@
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
@@ -127,7 +128,7 @@
                             item.getSpecificationModel().equals(dto.getModel())) {
                         StockInventoryDto stockInventoryDto = new StockInventoryDto();
                         stockInventoryDto.setRecordId(0L);
-                        stockInventoryDto.setRecordType(StockQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode());
+                        stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode());
                         stockInventoryDto.setQualitity(dto.getQualitity());
                         stockInventoryDto.setRemark(dto.getRemark());
                         stockInventoryDto.setWarnNum(dto.getWarnNum());
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
index f46f4c0..e01fe5d 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -4,8 +4,8 @@
 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.common.enums.StockQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.EnumUtil;
 import com.ruoyi.common.utils.OrderUtils;
@@ -105,9 +105,9 @@
         List<StockOutRecordExportData> list = stockOutRecordMapper.listStockOutRecordExportData(stockOutRecordDto);
         for (StockOutRecordExportData stockInRecordExportData : list) {
             if (stockInRecordExportData.getType().equals("0")) {
-                stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
+                stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockOutQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
             }else {
-                stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockUnQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
+                stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockInUnQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
             }
         }
         ExcelUtil<StockOutRecordExportData> util = new ExcelUtil<>(StockOutRecordExportData.class);
diff --git a/src/main/resources/application-zxsq.yml b/src/main/resources/application-zxsq.yml
new file mode 100644
index 0000000..8ec1cb6
--- /dev/null
+++ b/src/main/resources/application-zxsq.yml
@@ -0,0 +1,245 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9005
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: jxc
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-zxsq?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+    #    host: 127.0.0.1
+    host: 172.17.0.1
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 1
+    # 瀵嗙爜
+    #    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/mapper/production/ProductOrderMapper.xml b/src/main/resources/mapper/production/ProductOrderMapper.xml
index 2581105..fdcb54e 100644
--- a/src/main/resources/mapper/production/ProductOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -17,8 +17,9 @@
         select po.*,
         sl.sales_contract_no,
         sl.customer_name,
-        slp.product_category,
-        slp.specification_model,
+        p.product_name as product_category,
+        pm.model as specification_model,
+        pm.unit,
         ppr.process_route_code,
         pb.bom_no,
         ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus,
@@ -38,6 +39,8 @@
         FROM shipping_info
         GROUP BY sales_ledger_id
         ) shipping_status_counts ON sl.id = shipping_status_counts.sales_ledger_id
+            left join product_model pm on po.product_model_id = pm.id
+            left join product p on pm.product_id = p.id
         left join sales_ledger_product slp on po.sale_ledger_product_id = slp.id
         left join product_process_route ppr on po.id = ppr.product_order_id
         left join product_bom pb on pb.id = ppr.bom_id
@@ -66,8 +69,7 @@
         select pr.*
         from process_route pr
                  left join product_model pm on pr.product_model_id = pm.id
-                 left join sales_ledger_product slp on pm.id = slp.product_model_id
-        where slp.id = #{productModelId}
+        where pm.id = #{productModelId}
     </select>
     <select id="listProcessBom" resultType="com.ruoyi.production.dto.ProductStructureDto">
         select ps.id,
diff --git a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
index fef6bef..14b883e 100644
--- a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -87,4 +87,12 @@
             actual_start_time &gt;= #{startDate}
             AND actual_start_time &lt;= #{endDate}
     </select>
+    <select id="selectMax" resultType="com.ruoyi.production.pojo.ProductWorkOrder">
+        SELECT SUBSTRING(work_order_no, 3) as work_order_no
+        FROM product_work_order
+        WHERE SUBSTRING(work_order_no, 3) like concat(#{datePrefix},'%')
+        order by work_order_no  desc
+        limit 1
+        ;
+    </select>
 </mapper>
diff --git a/src/main/resources/mapper/production/ProductionProductMainMapper.xml b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
index 1cfc0d8..9c3bf3d 100644
--- a/src/main/resources/mapper/production/ProductionProductMainMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -71,7 +71,7 @@
         slpa.work_hours * slpa.finished_num AS wages
         FROM
         production_product_main ppm
-        LEFT JOIN sales_ledger_production_accounting slpa ON slpa.sales_ledger_work_id = ppm.id
+        LEFT JOIN sales_ledger_production_accounting slpa ON slpa.product_main_id = ppm.id
         LEFT JOIN production_product_output ppo ON ppm.id = ppo.product_main_id
         LEFT JOIN product_work_order pwo ON pwo.id = ppm.work_order_id
         LEFT JOIN product_order po ON po.id = pwo.product_order_id
@@ -93,6 +93,20 @@
             </if>
         </where>
     </select>
+    <select id="listMain" resultType="java.lang.Long">
+        SELECT ppm.id FROM production_product_main ppm
+            left join product_work_order pwo on pwo.id = ppm.work_order_id
+                  left join product_order po on po.id = pwo.product_order_id
+                  left join sales_ledger sl on sl.id = po.sales_ledger_id
+        <where>
+            <if test="idList != null and idList.size() > 0">
+                and sl.id in
+                <foreach item="id" collection="idList" open="(" separator="," close=")">
+                    #{id}
+                </foreach>
+            </if>
+        </where>
+    </select>
 
     <delete id="deleteByWorkOrderIds" parameterType="java.util.List">
         DELETE FROM production_product_main
diff --git a/src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml b/src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml
index 3535b77..fdbe7cc 100644
--- a/src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml
+++ b/src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml
@@ -68,7 +68,7 @@
         '%'
         ) as output_rate
         FROM sales_ledger_production_accounting slpa
-        LEFT JOIN production_product_main ppm ON slpa.sales_ledger_work_id = ppm.id
+        LEFT JOIN production_product_main ppm ON slpa.product_main_id = ppm.id
         LEFT JOIN production_product_output ppout ON ppm.id = ppout.product_main_id
         <where>
             <if test="ew.schedulingUserName != null and ew.schedulingUserName !=''">
diff --git a/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml b/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
index b8defca..c5c007e 100644
--- a/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
+++ b/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
@@ -199,6 +199,7 @@
         </where>
         GROUP BY T1.supplier_name
     </select>
+
     <select id="supplierNameListPageDetails" resultType="com.ruoyi.purchase.dto.PaymentRegistrationDto">
         SELECT
         T1.supplier_id,
@@ -209,7 +210,7 @@
         T1.purchase_contract_number,
         T2.payment_date
         FROM purchase_ledger T1
-        LEFT JOIN payment_registration T2 ON T1.id = T2.purchase_ledger_id
+        INNER JOIN payment_registration T2 ON T1.id = T2.purchase_ledger_id
         <where>
             T1.supplier_id = #{req.supplierId}
             <if test="req.supplierName != null and req.supplierName != '' ">
diff --git a/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml b/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
index 6cbad29..98c2675 100644
--- a/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
+++ b/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
@@ -28,7 +28,8 @@
         pl.approve_user_ids,
         sm.is_white,
         pl.approval_status,
-        pl.payment_method
+        pl.payment_method,
+        pl.remarks
         from purchase_ledger pl
         left join sales_ledger_product slp on slp.sales_ledger_id = pl.id and slp.type=2
         left join product_record pr on pl.id = pr.purchase_ledger_id
diff --git a/src/main/resources/mapper/quality/QualityInspectMapper.xml b/src/main/resources/mapper/quality/QualityInspectMapper.xml
index 0efab8c..48fb369 100644
--- a/src/main/resources/mapper/quality/QualityInspectMapper.xml
+++ b/src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -3,30 +3,49 @@
 <mapper namespace="com.ruoyi.quality.mapper.QualityInspectMapper">
     <select id="qualityInspectListPage" resultType="com.ruoyi.quality.pojo.QualityInspect">
         SELECT
-        *
-        FROM quality_inspect
-        where
+        qi.*,
+        <choose>
+            <when test="qualityInspect.inspectType == 0">
+                pl.purchase_contract_number as purchase_contract_no
+            </when>
+            <otherwise>
+                pwo.work_order_no
+            </otherwise>
+        </choose>
+        FROM
+        quality_inspect qi
+        <choose>
+            <when test="qualityInspect.inspectType == 0 ">
+                LEFT JOIN purchase_ledger pl ON pl.id = qi.purchase_ledger_id
+            </when>
+            <otherwise>
+                LEFT JOIN production_product_main ppm ON qi.product_main_id = ppm.id
+                LEFT JOIN product_work_order pwo ON ppm.work_order_id = pwo.id
+            </otherwise>
+        </choose>
+        WHERE
         inspect_type=#{qualityInspect.inspectType}
         <if test="qualityInspect.supplier != null and qualityInspect.supplier != '' ">
-            AND supplier like concat('%',#{qualityInspect.supplier},'%')
+            AND qi.supplier like concat('%',#{qualityInspect.supplier},'%')
         </if>
         <if test="qualityInspect.customer != null and qualityInspect.customer != '' ">
-            AND customer like concat('%',#{qualityInspect.customer},'%')
+            AND qi.customer like concat('%',#{qualityInspect.customer},'%')
         </if>
         <if test="qualityInspect.process != null and qualityInspect.process != '' ">
-            AND process like concat('%',#{qualityInspect.process},'%')
+            AND qi.process like concat('%',#{qualityInspect.process},'%')
         </if>
         <if test="qualityInspect.productName != null and qualityInspect.productName != '' ">
-            AND product_name like concat('%',#{qualityInspect.productName},'%')
+            AND qi.product_name like concat('%',#{qualityInspect.productName},'%')
         </if>
         <if test="qualityInspect.entryDateStart != null and qualityInspect.entryDateStart != '' ">
-            AND check_time &gt;= DATE_FORMAT(#{qualityInspect.entryDateStart},'%Y-%m-%d')
+            AND qi.check_time &gt;= DATE_FORMAT(#{qualityInspect.entryDateStart},'%Y-%m-%d')
         </if>
         <if test="qualityInspect.entryDateEnd != null and qualityInspect.entryDateEnd != '' ">
-            AND check_time &lt;= DATE_FORMAT(#{qualityInspect.entryDateEnd},'%Y-%m-%d')
+            AND qi.check_time &lt;= DATE_FORMAT(#{qualityInspect.entryDateEnd},'%Y-%m-%d')
         </if>
-        ORDER BY check_time DESC
+        ORDER BY qi.check_time DESC
     </select>
+
     <select id="qualityInspectExport" resultType="com.ruoyi.quality.pojo.QualityInspect">
         SELECT
         *
diff --git a/src/main/resources/mapper/sales/ReceiptPaymentMapper.xml b/src/main/resources/mapper/sales/ReceiptPaymentMapper.xml
index 91fd041..355402e 100644
--- a/src/main/resources/mapper/sales/ReceiptPaymentMapper.xml
+++ b/src/main/resources/mapper/sales/ReceiptPaymentMapper.xml
@@ -432,22 +432,23 @@
         </where>
 
     </select>
+
     <select id="invoiceLedgerSalesAccount" resultType="com.ruoyi.sales.dto.InvoiceLedgerDto">
         SELECT
         T1.sales_contract_no,
-        SUM(contract_amount) AS invoice_total,
-        IFNULL( SUM(T2.receipt_payment_amount) , 0 ) AS receipt_payment_amount,
-        IFNULL((IFNULL(SUM(contract_amount),0)  - IFNULL(SUM(T2.receipt_payment_amount),0)),0) AS unReceipt_payment_amount,
+        T1.contract_amount AS invoice_total,
+        IFNULL(SUM(T2.receipt_payment_amount), 0) AS receipt_payment_amount,
+        IFNULL((T1.contract_amount - IFNULL(SUM(T2.receipt_payment_amount), 0)), 0) AS unReceipt_payment_amount,
         T2.receipt_payment_date
         FROM sales_ledger T1
-        LEFT JOIN receipt_payment T2 ON T1.id = T2.sales_ledger_id
+        INNER JOIN receipt_payment T2 ON T1.id = T2.sales_ledger_id
         <where>
             T1.customer_id = #{invoiceLedgerDto.customerId}
             <if test="invoiceLedgerDto.searchText != null and invoiceLedgerDto.searchText != '' ">
-                T1.customer_name LIKE CONCAT ('%',#{invoiceLedgerDto.searchText},'%')
+                AND T1.customer_name LIKE CONCAT ('%', #{invoiceLedgerDto.searchText}, '%')
             </if>
         </where>
-        GROUP BY T1.sales_contract_no,T2.receipt_payment_date
+        GROUP BY T1.id, T1.sales_contract_no, T1.contract_amount, T2.receipt_payment_date
     </select>
 
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.3