From 3bd356cdf09bc2e67dfe0ce9e6dc1b4dfe0e1bec Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期二, 20 一月 2026 13:16:14 +0800
Subject: [PATCH] feat(production): 新增入库添加产品规格型号id,销售台账添加产品校验库存是否充足

---
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java            |   59 +++++++++++++++++++++++++++--
 src/main/java/com/ruoyi/sales/service/ISalesLedgerProductService.java                    |    3 +
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java                        |    3 +
 src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java                |    2 
 src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml                  |   33 ++++++++--------
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java |    3 +
 src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java               |   10 ++++
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java             |    3 +
 src/main/java/com/ruoyi/procurementrecord/dto/Details.java                               |    2 +
 9 files changed, 94 insertions(+), 24 deletions(-)

diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/Details.java b/src/main/java/com/ruoyi/procurementrecord/dto/Details.java
index b2e5a21..2af2db0 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/Details.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/Details.java
@@ -13,4 +13,6 @@
     private Integer id;
     private BigDecimal inboundQuantity;
     private BigDecimal warnNum;
+    private Long productModelId;
+
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
index d8004b4..4bfa9ee 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
@@ -93,4 +93,7 @@
     @Excel(name = "涓嶅惈绋庢�讳环")
     private BigDecimal taxExclusiveTotalPrice;
 
+
+    private Long productModelId;
+
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
index 28cee3c..d3bd7c0 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -76,4 +76,7 @@
      */
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
+
+
+    private Long productModelId;
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
index 6e103b4..19010f4 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -417,7 +417,8 @@
                     .createUser(loginUser.getUserId())
                     .updateTime(LocalDateTime.now())
                     .updateUser(loginUser.getUserId())
-                    .createBy(procurementDto.getNickName());
+                    .createBy(procurementDto.getNickName())
+                    .productModelId(detail.getProductModelId());
             this.save(procurementRecordBuilder.build());
             // 鍏ュ簱鎴愬姛鍑忔帀閲囪喘鏁伴噺
 //            LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<>();
diff --git a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
index 6a507bc..4dfe300 100644
--- a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
@@ -190,7 +190,7 @@
     public AjaxResult listPage(Page page, PurchaseLedgerDto purchaseLedger) {
         IPage<PurchaseLedgerDto> purchaseLedgerDtoIPage = purchaseLedgerService.selectPurchaseLedgerListPage(page ,purchaseLedger);
         //杩囨护鎺塧pprovalStatus=3鐨勮褰�
-        purchaseLedgerDtoIPage.getRecords().removeIf(purchaseLedgerDto -> purchaseLedgerDto.getApprovalStatus() == 3);
+        purchaseLedgerDtoIPage.getRecords().removeIf(purchaseLedgerDto -> Integer.valueOf(3).equals(purchaseLedgerDto.getApprovalStatus()));
         return AjaxResult.success(purchaseLedgerDtoIPage);
     }
 
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
index 4c38a59..2b9e466 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
@@ -3,6 +3,7 @@
 import javax.servlet.http.HttpServletResponse;
 
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.ISalesLedgerProductService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,7 +18,6 @@
 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.framework.web.page.TableDataInfo;
 
 import java.util.List;
 
@@ -33,6 +33,8 @@
 {
     @Autowired
     private ISalesLedgerProductService salesLedgerProductService;
+
+
 
     /**
      * 鏌ヨ浜у搧淇℃伅鍒楄〃
@@ -87,4 +89,10 @@
         }
         return toAjax(salesLedgerProductService.deleteSalesLedgerProductByIds(ids));
     }
+
+    //鏍规嵁浜у搧id鑾峰彇bom鍒ゆ柇搴撳瓨鏄惁鍏呰冻
+    @GetMapping("/judgmentInventory")
+    public R judgmentInventory(SalesLedgerProduct salesLedgerProduct) {
+      return  salesLedgerProductService.judgmentInventory(salesLedgerProduct);
+    }
 }
diff --git a/src/main/java/com/ruoyi/sales/service/ISalesLedgerProductService.java b/src/main/java/com/ruoyi/sales/service/ISalesLedgerProductService.java
index ccc28a7..3c439cf 100644
--- a/src/main/java/com/ruoyi/sales/service/ISalesLedgerProductService.java
+++ b/src/main/java/com/ruoyi/sales/service/ISalesLedgerProductService.java
@@ -1,6 +1,7 @@
 package com.ruoyi.sales.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 
 import java.util.List;
@@ -20,4 +21,6 @@
     int deleteSalesLedgerProductByIds(Long[] ids);
 
     int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct);
+
+    R judgmentInventory(SalesLedgerProduct salesLedgerProduct);
 }
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 ba02f28..d0e7ea8 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -4,13 +4,19 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.production.dto.ProductStructureDto;
+import com.ruoyi.production.mapper.ProcessRouteMapper;
+import com.ruoyi.production.mapper.ProductBomMapper;
+import com.ruoyi.production.mapper.ProductStructureMapper;
+import com.ruoyi.production.pojo.ProcessRoute;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.sales.dto.InvoiceRegistrationProductDto;
 import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
-import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.ISalesLedgerProductService;
@@ -41,9 +47,17 @@
     private SalesLedgerMapper salesLedgerMapper;
 
     private PurchaseLedgerMapper purchaseLedgerMapper;
+    private StockUtils stockUtils;
 
     @Autowired
     private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
+
+    @Autowired
+    private ProcessRouteMapper processRouteMapper;
+    @Autowired
+    private ProductBomMapper productBomMapper;
+    @Autowired
+    private ProductStructureMapper productStructureMapper;
 
     @Override
     public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
@@ -56,18 +70,18 @@
 //        queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerProduct.getSalesLedgerId())
 //                .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType());
         List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectSalesLedgerProductList(salesLedgerProduct);
-        if(!CollectionUtils.isEmpty(salesLedgerProducts)){
+        if (!CollectionUtils.isEmpty(salesLedgerProducts)) {
             InvoiceRegistrationProductDto invoiceRegistrationProductDto = new InvoiceRegistrationProductDto();
             invoiceRegistrationProductDto.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId().intValue());
             List<InvoiceRegistrationProductDto> invoiceRegistrationProductDtoList = invoiceRegistrationProductMapper.invoiceRegistrationProductList(invoiceRegistrationProductDto);
             // 缁熻寮�绁ㄧ櫥璁颁骇鍝佺殑宸插紑绁ㄦ暟/宸插紑绁ㄩ噾棰�
-            if(!CollectionUtils.isEmpty(invoiceRegistrationProductDtoList)){
+            if (!CollectionUtils.isEmpty(invoiceRegistrationProductDtoList)) {
                 for (SalesLedgerProduct ledgerProduct : salesLedgerProducts) {
                     BigDecimal invoiceNum = BigDecimal.ZERO;
                     BigDecimal invoiceAmount = BigDecimal.ZERO;
                     for (InvoiceRegistrationProductDto registrationProductDto : invoiceRegistrationProductDtoList) {
-                        if(ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()){
-                            invoiceNum =  invoiceNum.add(registrationProductDto.getInvoiceNum());
+                        if (ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()) {
+                            invoiceNum = invoiceNum.add(registrationProductDto.getInvoiceNum());
                             invoiceAmount = invoiceAmount.add(registrationProductDto.getInvoiceAmount());
                         }
                     }
@@ -165,6 +179,41 @@
         return result;
     }
 
+    @Override
+    public R judgmentInventory(SalesLedgerProduct salesLedgerProduct) {
+        //鑾峰彇浜у搧鏈�鏂扮殑宸ヨ壓璺嚎
+        ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()).orderByDesc(ProcessRoute::getCreateTime).last("LIMIT 1"));
+        if (processRoute == null) {
+            return R.fail("璇峰厛璁剧疆宸ヨ壓璺嚎");
+        }
+        List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomId(processRoute.getBomId());
+        if (productStructureDtos.isEmpty()) {
+            return R.fail("璇峰厛璁剧疆浜у搧缁撴瀯");
+        }
+        int count = 0;
+        StringBuilder stringBuffer = new StringBuilder();
+        for (ProductStructureDto productStructureDto : productStructureDtos) {
+            BigDecimal stockQuantity = stockUtils.getStockQuantity(productStructureDto.getProductModelId()).get("stockQuantity");
+            //鎵�闇�鏁伴噺
+            BigDecimal multiply = salesLedgerProduct.getQuantity().multiply(productStructureDto.getUnitQuantity());
+            BigDecimal subtract =stockQuantity.subtract(multiply);
+            if (subtract.compareTo(BigDecimal.ZERO) <= 0) {
+                count++;
+                stringBuffer.append(productStructureDto.getProductName())
+                        .append("-")
+                        .append(productStructureDto.getModel())
+                        .append("搴撳瓨涓嶈冻锛屽皯")
+                        .append(subtract)
+                        .append(System.lineSeparator());
+            }
+        }
+        if (count>0) {
+            return R.fail(stringBuffer.toString());
+        }else {
+            return R.ok();
+        }
+    }
+
     /**
      * 閫氱敤鏂规硶锛氭牴鎹富琛↖D鍜屽瓙琛ㄥ垪琛紝鏇存柊涓昏〃鐨勫悎鍚岄噾棰�
      */
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
index 14fe896..08faec0 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -4,22 +4,23 @@
 
     <select id="listProcurementBySalesLedgerId" resultType="com.ruoyi.procurementrecord.dto.ProcurementDto">
         select
-            t1.supplier_name,
-            t2.product_category,
-            t2.id,
-            t3.id as recordId,
-            t2.specification_model,
-            t2.unit,
-            t2.quantity,
-            t2.min_stock,
-            t2.warn_num,
-            t2.quantity as quantity0,
-            t2.tax_rate,
-            t2.tax_inclusive_unit_price,
-            t2.tax_inclusive_total_price,
-            t2.tax_exclusive_total_price,
-            t3.inbound_num as quantityStock
-        from  purchase_ledger t1
+        t1.supplier_name,
+        t2.product_category,
+        t2.id,
+        t3.id as recordId,
+        t2.specification_model,
+        t2.unit,
+        t2.quantity,
+        t2.min_stock,
+        t2.warn_num,
+        t2.quantity as quantity0,
+        t2.tax_rate,
+        t2.tax_inclusive_unit_price,
+        t2.tax_inclusive_total_price,
+        t2.tax_exclusive_total_price,
+        t3.inbound_num as quantityStock,
+        t2.product_model_id
+        from purchase_ledger t1
         left join sales_ledger_product t2 on t1.id = t2.sales_ledger_id
         left join procurement_record_storage t3 on t2.id = t3.sales_ledger_product_id
         where t1.purchase_contract_number = #{req.purchaseContractNumber}

--
Gitblit v1.9.3