From 0b7c77568b6a47c4c824130d6f5288b0bab5cdef Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期一, 11 五月 2026 16:01:06 +0800
Subject: [PATCH] feat: 扫码出库修改为发货
---
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | 77 ++++++++++++++++++++++++++++++++++++++
1 files changed, 77 insertions(+), 0 deletions(-)
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 7f5c9ac..ff32a36 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -31,6 +31,7 @@
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.EnumUtil;
+import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -2145,9 +2146,13 @@
if (salesLedger.getDeliveryStatus() != null && salesLedger.getDeliveryStatus() == 5) {
throw new ServiceException("鍑哄簱澶辫触,璇ラ攢鍞鍗曞凡鍙戣揣");
}
+ if (salesLedger.getDeliveryStatus() != null && salesLedger.getDeliveryStatus() == 2) {
+ throw new ServiceException("鍑哄簱澶辫触,璇ラ攢鍞鍗曞凡鍙戣捣鍙戣揣瀹℃壒,璇峰厛瀹屾垚瀹℃壒");
+ }
if (CollectionUtils.isEmpty(dto.getSalesLedgerProductList())) {
throw new ServiceException("閿�鍞鍗曞嚭搴撳け璐�,鍑哄簱浜у搧涓嶈兘涓虹┖");
}
+ String scanShippingNo = OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SCAN");
int saleType = SaleEnum.SALE.getCode();
Map<Long, BigDecimal> outboundQtyByLineId = new LinkedHashMap<>();
for (SalesLedgerProduct line : dto.getSalesLedgerProductList()) {
@@ -2180,6 +2185,11 @@
if (dbProduct.getProductModelId() == null) {
throw new ServiceException("鍑哄簱澶辫触,浜у搧瑙勬牸鏈淮鎶�,鏃犳硶鍑哄簱");
}
+ BigDecimal orderQty = defaultDecimal(dbProduct.getQuantity());
+ BigDecimal prevShipped = defaultDecimal(dbProduct.getShippedQuantity());
+ if (prevShipped.add(outboundThisLine).compareTo(orderQty) > 0) {
+ throw new ServiceException("鍑哄簱澶辫触,鏈鍑哄簱鍚庣疮璁″彂璐ф暟閲忎笉鑳藉ぇ浜庤浜у搧璁㈠崟鏁伴噺");
+ }
stockUtils.assertQualifiedAvailable(dbProduct.getProductModelId(), outboundThisLine);
StockInventoryDto stockInventoryDto = new StockInventoryDto();
@@ -2203,7 +2213,74 @@
});
boolean allLinesFull = ledgerAllProducts.stream().allMatch(p -> Objects.equals(p.getProductStockStatus(), 2));
salesLedger.setStockStatus(allLinesFull ? 2 : (anyInbound ? 1 : 0));
+ List<SalesLedgerProduct> saleLines = ledgerAllProducts.stream()
+ .filter(p -> Objects.equals(p.getType(), saleType))
+ .collect(Collectors.toList());
+ boolean allDelivered = !saleLines.isEmpty() && saleLines.stream().allMatch(p -> {
+ BigDecimal q = defaultDecimal(p.getQuantity());
+ BigDecimal s = defaultDecimal(p.getShippedQuantity());
+ return q.compareTo(BigDecimal.ZERO) <= 0 || s.compareTo(q) >= 0;
+ });
+ if (allDelivered) {
+ salesLedger.setDeliveryStatus(5);
+ } else {
+ boolean anyLineShipped = saleLines.stream()
+ .anyMatch(p -> defaultDecimal(p.getShippedQuantity()).compareTo(BigDecimal.ZERO) > 0);
+ if (anyLineShipped) {
+ salesLedger.setDeliveryStatus(6);
+ }
+ }
baseMapper.updateById(salesLedger);
+ syncShippingLedgerAfterQualifiedScan(ledgerId, scanShippingNo);
+ }
+
+ /**
+ * 鎵爜鍚堟牸鍑哄簱鍚庡悓姝ュ彂璐у彴璐﹁褰�
+ */
+ private void syncShippingLedgerAfterQualifiedScan(Long ledgerId, String shippingBatchNo) {
+ if (shippingBatchNo == null) {
+ shippingBatchNo = OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SCAN");
+ }
+ int saleType = SaleEnum.SALE.getCode();
+ List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(
+ Wrappers.<SalesLedgerProduct>lambdaQuery()
+ .eq(SalesLedgerProduct::getSalesLedgerId, ledgerId)
+ .eq(SalesLedgerProduct::getType, saleType));
+ Date now = new Date();
+ for (SalesLedgerProduct p : products) {
+ if (p.getShippedQuantity() == null || p.getShippedQuantity().compareTo(BigDecimal.ZERO) <= 0) {
+ continue;
+ }
+ ShippingInfo row = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
+ .eq(ShippingInfo::getSalesLedgerProductId, p.getId())
+ .orderByDesc(ShippingInfo::getId)
+ .last("LIMIT 1"));
+ BigDecimal lineQty = defaultDecimal(p.getQuantity());
+ BigDecimal shipped = defaultDecimal(p.getShippedQuantity());
+ boolean lineFullyShipped = lineQty.compareTo(BigDecimal.ZERO) <= 0 || shipped.compareTo(lineQty) >= 0;
+ String lineShipStatus = lineFullyShipped ? "宸插彂璐�" : "閮ㄥ垎鍙戣揣";
+
+ if (row == null) {
+ ShippingInfo insert = new ShippingInfo();
+ insert.setSalesLedgerId(ledgerId);
+ insert.setSalesLedgerProductId(p.getId());
+ insert.setShippingNo(shippingBatchNo);
+ insert.setType("鎵爜鍑哄簱");
+ insert.setStatus(lineShipStatus);
+ insert.setShippingDate(now);
+ shippingInfoMapper.insert(insert);
+ } else {
+ if (!StringUtils.hasText(row.getType())) {
+ row.setType("鎵爜鍑哄簱");
+ }
+ row.setStatus(lineShipStatus);
+ row.setShippingDate(now);
+ if (!StringUtils.hasText(row.getShippingNo())) {
+ row.setShippingNo(shippingBatchNo);
+ }
+ shippingInfoMapper.updateById(row);
+ }
+ }
}
@Override
--
Gitblit v1.9.3