From 74a29854bb8ff92d2ff2fcb55fa5028609ec6a33 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期二, 14 七月 2026 15:26:47 +0800
Subject: [PATCH] 采购删除导致审批报错+发货台账导入关联销售台账+生成出库记录

---
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java |   61 ++++++++------
 src/main/java/com/ruoyi/sales/service/impl/WeighingRecordServiceImpl.java     |   71 +++++++++++++++++
 src/main/java/com/ruoyi/sales/pojo/WeighingRecord.java                        |    3 
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java  |   10 +-
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                    |    3 
 src/main/java/com/ruoyi/sales/service/IWeighingRecordService.java             |    4 +
 src/main/java/com/ruoyi/sales/controller/WeighingRecordController.java        |   35 +++++++-
 src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java     |    3 
 8 files changed, 152 insertions(+), 38 deletions(-)

diff --git a/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
index 5e8fe53..57b123d 100644
--- a/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
+++ b/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
@@ -9,7 +9,8 @@
     PRODUCTION_REPORT_STOCK_OUT("3", "鐢熶骇鎶ュ伐-鍑哄簱"),
     SALE_STOCK_OUT("8", "閿�鍞�-鍑哄簱"),
     PURCHASE_RETURN_STOCK_OUT("9", "閲囪喘閫�璐�"),
-    SALE_SHIP_STOCK_OUT("13", "閿�鍞�-鍙戣揣鍑哄簱");
+    SALE_SHIP_STOCK_OUT("13", "閿�鍞�-鍙戣揣鍑哄簱"),
+    WEIGHBRIDGE_OUT("33", "纾呭崟鍑哄簱");
 
     private final String code;
     private final String value;
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index e3ad55a..0155e1b 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -232,7 +232,7 @@
         purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId());
         purchaseLedger.setRecorderName(sysUser.getNickName());
         purchaseLedger.setPhoneNumber(sysUser.getPhonenumber());
-        purchaseLedger.setApprovalStatus(1);
+        purchaseLedger.setApprovalStatus(3);
 
         List<SalesLedgerProduct> productList = Optional.ofNullable(purchaseLedgerDto.getProductData()).orElse(Collections.emptyList());
         // 3. 鏂板鎴栨洿鏂颁富琛�
@@ -849,7 +849,9 @@
                 if(salesLedger1 != null){
                     salesLedger.setSalesLedgerId(salesLedger1.getId());
                 }
-                // 閲囪喘瀹℃牳
+                // 璁剧疆涓哄緟瀹℃壒鐘舵��
+                salesLedger.setApprovalStatus(3);
+                /* // 閲囪喘瀹℃牳 - 宸插簾寮冿紝涓嶅啀鍙戣捣瀹℃壒娴佺▼
                 // 閫氳繃鏄电О鑾峰彇鐢ㄦ埛ID
                 String[] split = salesLedger.getApproveUserIds().split("锛�");
                 List<Long> ids = new ArrayList<>();
@@ -862,7 +864,7 @@
                 }
                 // 灏嗛泦鍚堣浆涓哄瓧绗︿覆锛岄殧寮�
                 String collect = ids.stream().map(Object::toString).collect(Collectors.joining(","));
-                salesLedger.setApproveUserIds(collect);
+                salesLedger.setApproveUserIds(collect); */
                 purchaseLedgerMapper.insert(salesLedger);
 
                 for (PurchaseLedgerProductImportDto salesLedgerProductImportDto : salesLedgerProductImportDtos) {
@@ -933,7 +935,7 @@
                     salesLedgerProductMapper.insert(salesLedgerProduct);
                 }
                 // 閲囪喘瀹℃牳
-                addApproveByPurchase(loginUser,salesLedger);
+//                addApproveByPurchase(loginUser,salesLedger);
             }
 
             return AjaxResult.success("瀵煎叆鎴愬姛");
diff --git a/src/main/java/com/ruoyi/sales/controller/WeighingRecordController.java b/src/main/java/com/ruoyi/sales/controller/WeighingRecordController.java
index 9fd3351..9b47705 100644
--- a/src/main/java/com/ruoyi/sales/controller/WeighingRecordController.java
+++ b/src/main/java/com/ruoyi/sales/controller/WeighingRecordController.java
@@ -16,11 +16,14 @@
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.ArrayList;
 import java.util.List;
+
+import static com.ruoyi.framework.datasource.DynamicDataSourceContextHolder.log;
 
 /**
  * 杩囩璁板綍锛堢鍗曞彴璐︼級Controller
@@ -74,11 +77,15 @@
             // 鍘婚噸妫�鏌�
             List<WeighingRecord> newRecordList = new ArrayList<>();
             int duplicateCount = 0;
+            int matchedCount = 0;
+            int unmatchedCount = 0;
 
             for (WeighingRecord record : weighingRecordList) {
                 LambdaQueryWrapper<WeighingRecord> wrapper = new LambdaQueryWrapper<>();
                 wrapper.eq(WeighingRecord::getSerialNo, record.getSerialNo());
-
+                if (ObjectUtils.isEmpty(record.getSpecification())) {
+                    record.setSpecification("/");
+                }
                 long count = weighingRecordService.count(wrapper);
                 if (count == 0) {
                     newRecordList.add(record);
@@ -91,13 +98,33 @@
                 return R.fail("鎵�鏈夋暟鎹兘宸插瓨鍦紝鍏�" + duplicateCount + "鏉¢噸澶嶆暟鎹�");
             }
 
-            // 鎵归噺鎻掑叆鏂版暟鎹�
-            weighingRecordService.saveBatch(newRecordList);
+            // 鎵归噺鎻掑叆鏂版暟鎹苟鎵ц鍑哄簱鎿嶄綔
+            for (WeighingRecord record : newRecordList) {
+                // 鍏堜繚瀛樼鍗曡褰曪紝鑾峰彇ID
+                weighingRecordService.save(record);
 
-            String message = String.format("瀵煎叆鎴愬姛锛�%d鏉★紝璺宠繃閲嶅锛�%d鏉�", newRecordList.size(), duplicateCount);
+
+                // 鏍规嵁瀹㈡埛銆佷骇鍝佸悕绉般�佽鏍煎尮閰嶉攢鍞彴璐﹀苟鍑哄簱
+                Long productId = weighingRecordService.matchAndOutStock(
+                        record.getReceiveUnit(),      // 鏀惰揣鍗曚綅=瀹㈡埛
+                        record.getGoodsName(),        // 璐у悕=浜у搧鍚嶇О
+                        record.getSpecification(),    // 瑙勬牸鍨嬪彿
+                        record.getNetWeight(),       // 鍑�閲�=鏁伴噺
+                        record.getId()               // 纾呭崟ID浣滀负鍏宠仈璁板綍ID
+                );
+                if (productId != null) {
+                    matchedCount++;
+                } else {
+                    unmatchedCount++;
+                }
+            }
+
+            String message = String.format("瀵煎叆鎴愬姛锛�%d鏉★紝璺宠繃閲嶅锛�%d鏉★紝鍖归厤鍑哄簱锛�%d鏉★紝鏈尮閰嶏細%d鏉�",
+                    newRecordList.size(), duplicateCount, matchedCount, unmatchedCount);
             return R.ok(message);
 
         } catch (Exception e) {
+            log.error("纾呭崟瀵煎叆澶辫触锛歿}", e.getMessage());
             return R.fail("瀵煎叆澶辫触锛�" + e.getMessage());
         }
     }
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index a52c2b4..4c28c1f 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -12,7 +12,6 @@
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
-import java.util.Date;
 
 /**
  * 浜у搧淇℃伅瀵硅薄 sales_ledger_product
@@ -206,7 +205,7 @@
     @Excel(name = "鍙戣揣鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
     @TableField(exist = false)
     @JsonFormat(pattern = "yyyy-MM-dd")
-    private Date shippingDate;
+    private LocalDateTime shippingDate;
 
     @TableField(exist = false)
     @ApiModelProperty(value = "鍙戣揣鐘舵��")
diff --git a/src/main/java/com/ruoyi/sales/pojo/WeighingRecord.java b/src/main/java/com/ruoyi/sales/pojo/WeighingRecord.java
index 14ed2c3..6c5e082 100644
--- a/src/main/java/com/ruoyi/sales/pojo/WeighingRecord.java
+++ b/src/main/java/com/ruoyi/sales/pojo/WeighingRecord.java
@@ -87,4 +87,7 @@
     @ApiModelProperty(value = "绉熸埛ID")
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
+
+
+    private Long recordId;
 }
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/sales/service/IWeighingRecordService.java b/src/main/java/com/ruoyi/sales/service/IWeighingRecordService.java
index 19eb505..6c1ce03 100644
--- a/src/main/java/com/ruoyi/sales/service/IWeighingRecordService.java
+++ b/src/main/java/com/ruoyi/sales/service/IWeighingRecordService.java
@@ -5,6 +5,10 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.sales.pojo.WeighingRecord;
 
+import java.math.BigDecimal;
+
 public interface IWeighingRecordService extends IService<WeighingRecord> {
     IPage<WeighingRecord> listPage(Page<WeighingRecord> page, WeighingRecord weighingRecord);
+
+    Long matchAndOutStock(String receiveUnit, String goodsName, String specification, BigDecimal netWeight, Long id);
 }
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 4042a3e..c21e1ae 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -27,7 +27,9 @@
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.pojo.ShippingInfo;
+import com.ruoyi.sales.pojo.WeighingRecord;
 import com.ruoyi.sales.service.ISalesLedgerProductService;
+import com.ruoyi.sales.service.IWeighingRecordService;
 import com.ruoyi.stock.mapper.StockInventoryMapper;
 import com.ruoyi.stock.pojo.StockInventory;
 import lombok.AllArgsConstructor;
@@ -88,13 +90,14 @@
     private StockUtils stockUtils;
 
 
-
     @Autowired
     private ProductStructureMapper productStructureMapper;
     @Autowired
     private StockInventoryMapper stockInventoryMapper;
     @Autowired
     private ProductOrderServiceImpl productOrderServiceImpl;
+    @Autowired
+    private IWeighingRecordService iWeighingRecordService;
 
     @Override
     public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
@@ -107,20 +110,23 @@
 //        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)) {
             salesLedgerProducts.forEach(item -> {
                 // 鍙戣揣淇℃伅
-                ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
-                        .eq(ShippingInfo::getSalesLedgerProductId, item.getId())
-                        .orderByDesc(ShippingInfo::getCreateTime)
-                        .last("limit 1"));
-                if(shippingInfo != null){
-                    item.setShippingDate(shippingInfo.getShippingDate());
-                    item.setShippingCarNumber(shippingInfo.getShippingCarNumber());
-                    item.setShippingStatus(shippingInfo.getStatus());
-                    item.setExpressCompany(shippingInfo.getExpressCompany());
-                    item.setExpressNumber(shippingInfo.getExpressNumber());
+                List<WeighingRecord> list = iWeighingRecordService.list(new QueryWrapper<WeighingRecord>().lambda().eq(WeighingRecord::getRecordId, item.getId()).orderByDesc(WeighingRecord::getCreateTime));
+                if (!list.isEmpty()) {
+                    BigDecimal reduce = list.stream().map(WeighingRecord::getNetWeight).collect(Collectors.toList()).stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+                    item.setShippingDate(list.get(0).getSecondWeighTime());
+                    item.setShippingCarNumber(list.get(0).getCarNo());
+                    if (reduce.compareTo(BigDecimal.ZERO) == 0) {
+                        item.setShippingStatus("鏈彂璐�");
+                    } else if (reduce.compareTo(item.getQuantity()) < 0) {
+                        item.setShippingStatus("閮ㄥ垎鍙戣揣");
+                    } else {
+                        item.setShippingStatus("宸插彂璐�");
+                    }
                 }
+                item.setShippingStatus("鏈彂璐�");
             });
             // 寮�绁�
             InvoiceRegistrationProductDto invoiceRegistrationProductDto = new InvoiceRegistrationProductDto();
@@ -134,8 +140,8 @@
                     BigDecimal noInvoiceNum = BigDecimal.ZERO;
                     BigDecimal noInvoiceAmount = 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());
                         }
                     }
@@ -169,7 +175,7 @@
         //鍒犻櫎鍙戣揣淇℃伅
         List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>()
                 .in(ShippingInfo::getSalesLedgerProductId, Arrays.asList(ids)));
-        if(!CollectionUtils.isEmpty(shippingInfos)){
+        if (!CollectionUtils.isEmpty(shippingInfos)) {
             shippingInfoService.delete(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList()));
         }
 
@@ -296,12 +302,12 @@
         BigDecimal ticketsTotal = salesLedgerProduct.getTicketsTotal() != null ? salesLedgerProduct.getTicketsTotal() : BigDecimal.ZERO;
 
         // 寰呭洖娆撅紝浠樻
-        if(salesLedgerProduct.getType().equals(1)){
+        if (salesLedgerProduct.getType().equals(1)) {
             salesLedgerProduct.setPendingInvoiceTotal(totalPrice.subtract(invoiceTotal));
             //鏈紑绁ㄦ暟閲�+閲戦
             salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity());
             salesLedgerProduct.setNoInvoiceAmount(totalPrice);
-        }else{
+        } else {
             salesLedgerProduct.setPendingTicketsTotal(totalPrice.subtract(ticketsTotal));
             // 鏈潵绁ㄦ暟閲�+閲戦
             salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity());
@@ -376,7 +382,7 @@
         List<ProcessRoute> processRoutes = processRouteMapper.selectList(new QueryWrapper<ProcessRoute>().lambda()
                 .eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId())
                 .orderByDesc(ProcessRoute::getCreateTime));
-        if (processRoutes.size()>0){
+        if (processRoutes.size() > 0) {
             ProcessRoute processRoute = processRoutes.get(0);
             //鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎涓昏〃
             ProductProcessRoute productProcessRoute = new ProductProcessRoute();
@@ -413,7 +419,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());
@@ -434,7 +440,7 @@
      * 鍒犻櫎鐢熶骇鏁版嵁
      */
     public void deleteProductionData(List<Long> productIds) {
-        if (productIds == null || productIds.isEmpty()){
+        if (productIds == null || productIds.isEmpty()) {
             return;
         }
         //鎵归噺鏌ヨproductOrder
@@ -533,9 +539,9 @@
             // 鍒ゆ柇鐘舵��
             BigDecimal taxInclusiveTotalPrice = item.getTaxInclusiveTotalPrice();
             BigDecimal invoiceTotal = item.getInvoiceTotal();
-            if(taxInclusiveTotalPrice != null && invoiceTotal != null && taxInclusiveTotalPrice.compareTo(invoiceTotal) == 0){
+            if (taxInclusiveTotalPrice != null && invoiceTotal != null && taxInclusiveTotalPrice.compareTo(invoiceTotal) == 0) {
                 item.setStatusName("宸插畬鎴愪粯娆�");
-            }else{
+            } else {
                 item.setStatusName("鏈畬鎴愪粯娆�");
             }
         });
@@ -549,9 +555,9 @@
             // 鍒ゆ柇鐘舵��
             BigDecimal taxInclusiveTotalPrice = item.getTaxInclusiveTotalPrice();
             BigDecimal ticketsTotal = item.getTicketsTotal();
-            if(taxInclusiveTotalPrice != null && ticketsTotal != null && taxInclusiveTotalPrice.compareTo(ticketsTotal) == 0){
+            if (taxInclusiveTotalPrice != null && ticketsTotal != null && taxInclusiveTotalPrice.compareTo(ticketsTotal) == 0) {
                 item.setStatusName("宸插畬鎴愪粯娆�");
-            }else{
+            } else {
                 item.setStatusName("鏈畬鎴愪粯娆�");
             }
         });
@@ -592,6 +598,7 @@
             throw new RuntimeException("鍔ㄦ�佹洿鏂颁富琛ㄩ噾棰濆け璐�", e);
         }
     }
+
     @Override
     public R judgmentInventory(SalesLedgerProduct salesLedgerProduct) {
         //鑾峰彇浜у搧鏈�鏂扮殑宸ヨ壓璺嚎
@@ -610,7 +617,7 @@
 
             //鎵�闇�鏁伴噺
             BigDecimal multiply = salesLedgerProduct.getQuantity().multiply(productStructureDto.getUnitQuantity());
-            BigDecimal subtract =stockInventory.getQualitity().subtract(stockInventory.getLockedQuantity()).subtract(multiply).divide(BigDecimal.ONE, 2, RoundingMode.CEILING);
+            BigDecimal subtract = stockInventory.getQualitity().subtract(stockInventory.getLockedQuantity()).subtract(multiply).divide(BigDecimal.ONE, 2, RoundingMode.CEILING);
             if (subtract.compareTo(BigDecimal.ZERO) <= 0) {
                 count++;
                 stringBuffer.append(productStructureDto.getProductName())
@@ -621,9 +628,9 @@
                         .append(System.lineSeparator());
             }
         }
-        if (count>0) {
+        if (count > 0) {
             return R.fail(stringBuffer.toString());
-        }else {
+        } else {
             return R.ok();
         }
     }
diff --git a/src/main/java/com/ruoyi/sales/service/impl/WeighingRecordServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/WeighingRecordServiceImpl.java
index e1a4d06..b909f95 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/WeighingRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/WeighingRecordServiceImpl.java
@@ -4,13 +4,22 @@
 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.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.sales.mapper.SalesLedgerMapper;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.mapper.WeighingRecordMapper;
+import com.ruoyi.sales.pojo.SalesLedger;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.pojo.WeighingRecord;
 import com.ruoyi.sales.service.IWeighingRecordService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
 
 @Service
 @Slf4j
@@ -18,6 +27,9 @@
 public class WeighingRecordServiceImpl extends ServiceImpl<WeighingRecordMapper, WeighingRecord> implements IWeighingRecordService {
 
     private final WeighingRecordMapper weighingRecordMapper;
+    private final SalesLedgerProductMapper salesLedgerProductMapper;
+    private final SalesLedgerMapper salesLedgerMapper;
+    private final StockUtils stockUtils;
 
     @Override
     public IPage<WeighingRecord> listPage(Page<WeighingRecord> page, WeighingRecord weighingRecord) {
@@ -43,4 +55,63 @@
                 WeighingRecord::getShipUnit, weighingRecord.getShipUnit());
         return weighingRecordMapper.selectPage(page, queryWrapper);
     }
+
+    /**
+     * 鏍规嵁瀹㈡埛銆佷骇鍝佸悕绉般�佽鏍煎瀷鍙峰尮閰嶉攢鍞彴璐︿骇鍝佸苟鍑哄簱
+     * @param receiveUnit 鏀惰揣鍗曚綅锛堝鎴峰悕绉帮級
+     * @param goodsName 璐у悕锛堜骇鍝佸悕绉帮級
+     * @param specification 瑙勬牸
+     * @param quantity 鏁伴噺锛堝噣閲嶏級
+     * @param recordId 纾呭崟璁板綍ID锛堜綔涓哄叧鑱旇褰旾D锛�
+     * @return 鍖归厤鍒扮殑閿�鍞彴璐︿骇鍝両D锛屾湭鍖归厤杩斿洖null
+     */
+    public Long matchAndOutStock(String receiveUnit, String goodsName, String specification, BigDecimal quantity, Long recordId) {
+        // 1. 鏌ヨ鎵�鏈夐攢鍞彴璐︿骇鍝侊紙鍙煡璇㈡湭鍙戣揣鐨勶級
+        LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SalesLedgerProduct::getType, 1);  // 閿�鍞被鍨�
+        List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(queryWrapper);
+        if (productList == null || productList.isEmpty()) {
+            log.warn("鏈壘鍒版湭鍙戣揣鐨勯攢鍞彴璐︿骇鍝佹暟鎹�");
+            return null;
+        }
+
+        // 2. 閬嶅巻鍖归厤锛氬鎴峰悕绉� + 浜у搧澶х被 + 瑙勬牸鍨嬪彿
+        for (SalesLedgerProduct product : productList) {
+            // 鑾峰彇瀵瑰簲鐨勯攢鍞彴璐︿富琛ㄤ俊鎭�
+            SalesLedger salesLedger = salesLedgerMapper.selectById(product.getSalesLedgerId());
+            if (salesLedger == null) {
+                continue;
+            }
+
+            // 鍖归厤鏉′欢锛氭敹璐у崟浣�=瀹㈡埛鍚嶇О锛岃揣鍚�=浜у搧澶х被锛岃鏍�=瑙勬牸鍨嬪彿
+            boolean customerMatch = receiveUnit != null && receiveUnit.equals(salesLedger.getCustomerName());
+            boolean goodsMatch = goodsName != null && goodsName.equals(product.getProductCategory());
+            boolean specMatch = specification != null && specification.equals(product.getSpecificationModel());
+
+            if (customerMatch && goodsMatch && specMatch) {
+                // 3. 鍖归厤鎴愬姛锛屾墽琛屽嚭搴�
+                try {
+                    WeighingRecord weighingRecord = new WeighingRecord();
+                    weighingRecord.setRecordId(product.getId());
+                    weighingRecord.setId(recordId);
+                    this.updateById(weighingRecord);
+                    stockUtils.substractStock(
+                            product.getProductModelId(),
+                            quantity,
+                            StockOutQualifiedRecordTypeEnum.WEIGHBRIDGE_OUT.getCode(),  // 纾呭崟鍑哄簱绫诲瀷
+                            recordId             // 纾呭崟ID浣滀负鍏宠仈璁板綍ID
+                    );
+                    log.info("纾呭崟鍑哄簱鎴愬姛锛氬鎴�={}, 浜у搧={}, 瑙勬牸={}, 鏁伴噺={}, 纾呭崟ID={}",
+                            receiveUnit, goodsName, specification, quantity, recordId);
+                    return product.getId();
+                } catch (Exception e) {
+                    log.error("纾呭崟鍑哄簱澶辫触锛歿}", e.getMessage());
+                    throw new RuntimeException("鍑哄簱澶辫触锛�" + e.getMessage());
+                }
+            }
+        }
+
+        log.warn("鏈尮閰嶅埌閿�鍞彴璐︿骇鍝侊細瀹㈡埛={}, 浜у搧={}, 瑙勬牸={}", receiveUnit, goodsName, specification);
+        return null;
+    }
 }

--
Gitblit v1.9.3