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 | 184 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 182 insertions(+), 2 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 ba96498..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;
@@ -49,6 +50,13 @@
import com.ruoyi.purchase.dto.SimpleReturnOrderGroupDto;
import com.ruoyi.purchase.mapper.PurchaseReturnOrderProductsMapper;
import com.ruoyi.quality.mapper.QualityInspectMapper;
+import com.ruoyi.quality.mapper.QualityInspectParamMapper;
+import com.ruoyi.quality.mapper.QualityTestStandardMapper;
+import com.ruoyi.quality.mapper.QualityTestStandardParamMapper;
+import com.ruoyi.quality.pojo.QualityInspect;
+import com.ruoyi.quality.pojo.QualityInspectParam;
+import com.ruoyi.quality.pojo.QualityTestStandard;
+import com.ruoyi.quality.pojo.QualityTestStandardParam;
import com.ruoyi.sales.dto.*;
import com.ruoyi.sales.mapper.*;
import com.ruoyi.sales.pojo.*;
@@ -139,6 +147,9 @@
private final ProductionProductOutputMapper productionProductOutputMapper;
private final ProductionProductInputMapper productionProductInputMapper;
private final QualityInspectMapper qualityInspectMapper;
+ private final QualityInspectParamMapper qualityInspectParamMapper;
+ private final QualityTestStandardMapper qualityTestStandardMapper;
+ private final QualityTestStandardParamMapper qualityTestStandardParamMapper;
private final RedisTemplate<String, String> redisTemplate;
private final ISalesLedgerProductProcessService salesLedgerProductProcessService;
@@ -714,9 +725,9 @@
product.setRegisterDate(LocalDateTime.now());
// 鍙戣揣淇℃伅
ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>().eq(ShippingInfo::getSalesLedgerProductId, product.getId()).orderByDesc(ShippingInfo::getCreateTime).last("limit 1"));
- product.setShippingCarNumber(shippingInfo.getShippingCarNumber());
- product.setShippingDate(shippingInfo.getShippingDate());
if (shippingInfo != null) {
+ product.setShippingCarNumber(shippingInfo.getShippingCarNumber());
+ product.setShippingDate(shippingInfo.getShippingDate());
product.setShippingStatus(shippingInfo.getStatus());
}
}
@@ -2135,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()) {
@@ -2170,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();
@@ -2193,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
@@ -2314,10 +2401,28 @@
if (dbProduct.getProductModelId() == null) {
throw new ServiceException("瀵煎叆澶辫触,璁㈠崟缂栧彿[" + orderNo + "]浜у搧瑙勬牸鏈淮鎶�,鏃犳硶琛ュ綍鍑哄簱");
}
+ // 鍘嗗彶宸插彂璐цˉ褰曪細鐩存帴鍐欏叆鍏ュ簱+鍑哄簱璁板綍
+ stockUtils.addStock(
+ ledger.getId(),
+ dbProduct.getId(),
+ dbProduct.getProductModelId(),
+ allocQty,
+ StockInQualifiedRecordTypeEnum.SALE_STOCK_IN.getCode(),
+ dbProduct.getId()
+ );
+ stockUtils.substractStock(
+ ledger.getId(),
+ dbProduct.getId(),
+ dbProduct.getProductModelId(),
+ allocQty,
+ StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(),
+ dbProduct.getId()
+ );
BigDecimal oldShipped = defaultDecimal(dbProduct.getShippedQuantity());
BigDecimal newShipped = oldShipped.add(allocQty);
dbProduct.setStockedQuantity(defaultDecimal(dbProduct.getQuantity()));
dbProduct.setShippedQuantity(newShipped);
+ dbProduct.setApproveStatus(3);
updateProductStockStatus(dbProduct);
dbProduct.fillRemainingQuantity();
updateProductShipStatus(dbProduct);
@@ -2336,6 +2441,7 @@
throw new ServiceException("瀵煎叆澶辫触,璁㈠崟缂栧彿[" + orderNo + "]瀛樺湪閲嶅鍙戣揣璁板綍,璇峰嬁閲嶅瀵煎叆");
}
shippingInfoMapper.insert(shippingInfo);
+ createShippingQualityInspect(ledger, dbProduct, row, allocQty);
}
}
@@ -2345,9 +2451,16 @@
BigDecimal shipped = defaultDecimal(p.getShippedQuantity());
return shipped.compareTo(qty) >= 0;
});
+ boolean anyInbound = CollectionUtils.isNotEmpty(latestProducts) && latestProducts.stream().anyMatch(p -> defaultDecimal(p.getStockedQuantity()).compareTo(BigDecimal.ZERO) > 0);
+ boolean allInbound = CollectionUtils.isNotEmpty(latestProducts) && latestProducts.stream().allMatch(p -> {
+ BigDecimal qty = defaultDecimal(p.getQuantity());
+ BigDecimal stocked = defaultDecimal(p.getStockedQuantity());
+ return qty.compareTo(BigDecimal.ZERO) <= 0 || stocked.compareTo(qty) >= 0;
+ });
if (allShipped && rowList.get(0).getReportDate() != null) {
ledger.setDeliveryDate(DateUtils.toLocalDate(rowList.get(0).getReportDate()));
}
+ ledger.setStockStatus(allInbound ? 2 : (anyInbound ? 1 : 0));
ledger.setDeliveryStatus(allShipped ? 5 : 1);
salesLedgerMapper.updateById(ledger);
}
@@ -2832,4 +2945,71 @@
String subCategory = StringUtils.hasText(row.getProductSubCategory()) ? row.getProductSubCategory().trim() : "";
return ledgerId + "|" + subCategory + "|" + shippingNo + "|" + dateStr + "|" + defaultDecimal(row.getQuantity());
}
+
+ private void createShippingQualityInspect(SalesLedger ledger, SalesLedgerProduct dbProduct, SalesShippingImportDto row, BigDecimal inspectQty) {
+ if (ledger == null || dbProduct == null || inspectQty == null || inspectQty.compareTo(BigDecimal.ZERO) <= 0) {
+ return;
+ }
+ Date checkDate = row.getReportDate() != null ? row.getReportDate() : new Date();
+ QualityInspect qualityInspect = new QualityInspect();
+ qualityInspect.setInspectType(2);
+ qualityInspect.setCheckTime(checkDate);
+ qualityInspect.setCustomer(StringUtils.hasText(ledger.getCustomerName()) ? ledger.getCustomerName() : row.getCustomerName());
+ qualityInspect.setCheckName(StringUtils.hasText(row.getCreator()) ? row.getCreator().trim() : null);
+ qualityInspect.setProductId(dbProduct.getProductId());
+ qualityInspect.setProductName(dbProduct.getProductCategory());
+ qualityInspect.setModel(dbProduct.getSpecificationModel());
+ qualityInspect.setUnit(resolveInspectUnit(dbProduct));
+ qualityInspect.setQuantity(inspectQty);
+ qualityInspect.setCheckResult("鍚堟牸");
+ qualityInspect.setInspectState(1);
+ qualityInspect.setApprovalStatus(1);
+ qualityInspect.setProductModelId(dbProduct.getProductModelId());
+
+ QualityTestStandard selectedStandard = null;
+ if (dbProduct.getProductId() != null) {
+ List<QualityTestStandard> standards = qualityTestStandardMapper.getQualityTestStandardByProductId(dbProduct.getProductId(), 2, null);
+ if (CollectionUtils.isNotEmpty(standards)) {
+ selectedStandard = standards.get(0);
+ qualityInspect.setTestStandardId(selectedStandard.getId());
+ }
+ }
+ qualityInspectMapper.insert(qualityInspect);
+
+ if (selectedStandard == null || selectedStandard.getId() == null) {
+ return;
+ }
+ List<QualityTestStandardParam> standardParams = qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery().eq(QualityTestStandardParam::getTestStandardId, selectedStandard.getId()));
+ if (CollectionUtils.isEmpty(standardParams)) {
+ return;
+ }
+ List<QualityInspectParam> inspectParams = standardParams.stream().map(item -> {
+ QualityInspectParam param = new QualityInspectParam();
+ param.setInspectId(qualityInspect.getId());
+ param.setParameterItem(item.getParameterItem());
+ param.setUnit(item.getUnit());
+ param.setStandardValue(item.getStandardValue());
+ param.setControlValue(item.getControlValue());
+ param.setTestValue("鏃犵憰鐤�");
+ return param;
+ }).collect(Collectors.toList());
+ inspectParams.forEach(qualityInspectParamMapper::insert);
+ }
+
+ private String resolveInspectUnit(SalesLedgerProduct dbProduct) {
+ if (dbProduct == null) {
+ return null;
+ }
+ if (StringUtils.hasText(dbProduct.getUnit())) {
+ return dbProduct.getUnit();
+ }
+ if (dbProduct.getProductModelId() == null) {
+ return null;
+ }
+ ProductModel productModel = productModelMapper.selectById(dbProduct.getProductModelId());
+ if (productModel == null || !StringUtils.hasText(productModel.getUnit())) {
+ return null;
+ }
+ return productModel.getUnit();
+ }
}
--
Gitblit v1.9.3