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/approve/service/impl/ApproveNodeServiceImpl.java | 6 --
src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java | 2
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java | 17 ++++++--
src/main/java/com/ruoyi/sales/service/ShippingInfoService.java | 1
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | 77 ++++++++++++++++++++++++++++++++++++++
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java | 4 +-
src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java | 4 +-
7 files changed, 95 insertions(+), 16 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 ee1d11d..c42eeab 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -30,7 +30,6 @@
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.SalesQuotation;
import com.ruoyi.sales.pojo.ShippingInfo;
-import com.ruoyi.sales.service.ShippingInfoService;
import com.ruoyi.sales.service.ISalesLedgerService;
import com.ruoyi.quality.service.IQualityInspectService;
import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
@@ -90,9 +89,6 @@
@Autowired
private SalesLedgerMapper salesLedgerMapper;
- @Autowired
- @Lazy
- private ShippingInfoService shippingInfoService;
@Autowired
@Lazy
private ISalesLedgerService salesLedgerService;
@@ -273,7 +269,7 @@
if (salesLedger != null) {
if(status.equals(2)){
- // 瀹℃壒瀹屾垚 -> 淇敼鐘舵�佷负瀹℃牳閫氳繃锛屼笉鎵i櫎搴撳瓨 (鎵i櫎搴撳瓨绉昏嚦鍙戣揣鍙拌处琛ュ厖淇℃伅闃舵)
+ // 瀹℃壒瀹屾垚 -> 淇敼鐘舵�佷负瀹℃牳閫氳繃锛屼笉鎵i櫎搴撳瓨锛堟墸闄ゅ簱瀛樺湪鍙戣揣鍙拌处琛ュ厖淇℃伅锛�
updateSalesLedgerDeliveryStatus(salesLedger.getId(), 4);
updateShippingInfoStatusByOrder(salesLedger.getId(), "瀹℃牳閫氳繃");
} else if(status.equals(3)){
diff --git a/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java b/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
index 5bc6aa7..c276c69 100644
--- a/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
+++ b/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
@@ -129,7 +129,7 @@
// 涓鸿鍗曚笅鐨勬瘡涓�涓骇鍝佺敓鎴愬彂璐у彴璐﹁褰� (鏄剧ず鍗曚釜浜у搧)
List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
.eq(SalesLedgerProduct::getSalesLedgerId, salesLedger.getId()));
-
+
if (CollectionUtils.isNotEmpty(products)) {
for (SalesLedgerProduct product : products) {
ShippingInfo si = new ShippingInfo();
@@ -137,7 +137,7 @@
si.setSalesLedgerProductId(product.getId());
si.setShippingNo(shNo);
si.setStatus("寰呭鏍�");
- si.setType(req.getType()); // 鏉ユ簮/绫诲瀷
+ si.setType(req.getType());
shippingInfoService.save(si);
}
}
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java b/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
index daf8781..0cc1692 100644
--- a/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -61,7 +61,7 @@
@ApiModelProperty(value = "浜よ揣鏃ユ湡")
private LocalDate deliveryDate;
- @ApiModelProperty(value = "鏄惁鍙戣揣")
+ @ApiModelProperty(value = "鍙戣揣鐘舵�侊細1-鏈彂璐э紝2-瀹℃壒涓紝3-瀹℃壒涓嶉�氳繃锛�4-瀹℃壒閫氳繃锛�5-宸插彂璐э紝6-閮ㄥ垎鍙戣揣")
private Integer deliveryStatus;
@ApiModelProperty(value = "鍏ュ簱鐘舵��")
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
index 692cbfc..f18db96 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -144,9 +144,9 @@
private LocalDate deliveryDate;
/**
- * 鍙戣揣鐘舵�侊細1-鏈彂璐э紝2-瀹℃壒涓紝3-瀹℃壒涓嶉�氳繃锛�4-瀹℃壒閫氳繃锛�5-宸插彂璐�
+ * 鍙戣揣鐘舵�侊細1-鏈彂璐э紝2-瀹℃壒涓紝3-瀹℃壒涓嶉�氳繃锛�4-瀹℃壒閫氳繃锛�5-宸插彂璐э紝6-閮ㄥ垎鍙戣揣锛堝鎵爜鍒嗘壒鍙戣揣鏈弧鍗曪級
*/
- @ApiModelProperty("鍙戣揣鐘舵�侊細1-鏈彂璐э紝2-瀹℃壒涓紝3-瀹℃壒涓嶉�氳繃锛�4-瀹℃壒閫氳繃锛�5-宸插彂璐�")
+ @ApiModelProperty("鍙戣揣鐘舵�侊細1-鏈彂璐э紝2-瀹℃壒涓紝3-瀹℃壒涓嶉�氳繃锛�4-瀹℃壒閫氳繃锛�5-宸插彂璐э紝6-閮ㄥ垎鍙戣揣")
private Integer deliveryStatus;
/**
diff --git a/src/main/java/com/ruoyi/sales/service/ShippingInfoService.java b/src/main/java/com/ruoyi/sales/service/ShippingInfoService.java
index df07489..2aa1a13 100644
--- a/src/main/java/com/ruoyi/sales/service/ShippingInfoService.java
+++ b/src/main/java/com/ruoyi/sales/service/ShippingInfoService.java
@@ -21,7 +21,6 @@
boolean deductStock(ShippingInfoDto req) throws IOException;
-
boolean delete(List<Long> ids);
List<SalesLedgerProductDto> getReturnManagementDtoById( Long shippingId);
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
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 c062391..851684f 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -92,11 +92,19 @@
salesLedgerProductMapper.updateById(salesLedgerProduct);
}
}
- byId.setExpressNumber(req.getExpressNumber());
- byId.setExpressCompany(req.getExpressCompany());
+ if (req.getExpressNumber() != null) {
+ byId.setExpressNumber(req.getExpressNumber());
+ }
+ if (req.getExpressCompany() != null) {
+ byId.setExpressCompany(req.getExpressCompany());
+ }
+ if (req.getShippingCarNumber() != null) {
+ byId.setShippingCarNumber(req.getShippingCarNumber());
+ }
+ if (req.getShippingDate() != null) {
+ byId.setShippingDate(req.getShippingDate());
+ }
byId.setStatus("宸插彂璐�");
- byId.setShippingCarNumber(req.getShippingCarNumber());
- byId.setShippingDate(req.getShippingDate());
boolean update = this.updateById(byId);
// 鏇存柊璁㈠崟鐘舵�佷负 5-宸插彂璐� (濡傛灉鎵�鏈夊彂璐ц褰曢兘宸插彂璐�)
@@ -117,7 +125,6 @@
}
return update;
}
-
@Override
public boolean delete(List<Long> ids) {
--
Gitblit v1.9.3