src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -1113,13 +1113,13 @@ throw new BaseException("理论入库数量必须大于0"); } BigDecimal approvedStockInNum = getApprovedPurchaseStockInNum( BigDecimal occupiedStockInNum = getOccupiedPurchaseStockInNum( purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber(), salesLedgerProduct.getId(), salesLedgerProduct.getProductModelId() ); BigDecimal remainingStockInNum = salesLedgerProduct.getQuantity().subtract(approvedStockInNum); BigDecimal remainingStockInNum = salesLedgerProduct.getQuantity().subtract(occupiedStockInNum); if (remainingStockInNum.compareTo(BigDecimal.ZERO) <= 0) { throw new BaseException("产品【" + productModel.getModel() + "】已完成入库"); } @@ -1151,15 +1151,17 @@ return count; } private BigDecimal getApprovedPurchaseStockInNum(Long purchaseLedgerId, String purchaseContractNumber, Long productId, Long productModelId) { private BigDecimal getOccupiedPurchaseStockInNum(Long purchaseLedgerId, String purchaseContractNumber, Long productId, Long productModelId) { if (purchaseLedgerId == null || productId == null || productModelId == null || !StringUtils.hasText(purchaseContractNumber)) { return BigDecimal.ZERO; } List<StockInRecord> stockRecords = findDirectStockRecords(purchaseLedgerId, purchaseContractNumber, productModelId, productId); return stockRecords.stream() .filter(Objects::nonNull) .filter(item -> ReviewStatusEnum.APPROVED.getCode().equals(item.getApprovalStatus())) .map(StockInRecord::getStockInNum) .filter(item -> item.getApprovalStatus() == null || ReviewStatusEnum.PENDING_REVIEW.getCode().equals(item.getApprovalStatus()) || ReviewStatusEnum.APPROVED.getCode().equals(item.getApprovalStatus())) .map(item -> item.getTheoryStockInNum() != null ? item.getTheoryStockInNum() : item.getStockInNum()) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); } src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -186,6 +186,10 @@ // 可用数量 quantity - returnQuality @TableField(exist = false) private BigDecimal availableQuality; // 待入库数量 quantity - 已审批理论入库 - 待审批理论入库 @TableField(exist = false) private BigDecimal pendingInboundQuantity; @Schema(description = "创建用户") @TableField(fill = FieldFill.INSERT) private Integer createUser; src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -60,6 +60,9 @@ @Override @Transactional(rollbackFor = Exception.class) public int add(StockInRecordDto stockInRecordDto) { if (stockInRecordDto.getCreateTime() == null) { stockInRecordDto.setCreateTime(LocalDateTime.now()); } String no = OrderUtils.countTodayByCreateTime(stockInRecordMapper, "RK","inbound_batches", stockInRecordDto.getCreateTime() != null ? stockInRecordDto.getCreateTime() : LocalDateTime.now()); stockInRecordDto.setInboundBatches(no); StockInRecord stockInRecord = new StockInRecord(); src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -63,6 +63,9 @@ @Override public int add(StockOutRecordDto stockOutRecordDto) { if (stockOutRecordDto.getCreateTime() == null) { stockOutRecordDto.setCreateTime(LocalDateTime.now()); } String no = OrderUtils.countTodayByCreateTime(stockOutRecordMapper, "CK","outbound_batches", stockOutRecordDto.getCreateTime() != null ? stockOutRecordDto.getCreateTime() : LocalDateTime.now()); stockOutRecordDto.setOutboundBatches(no); if (StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode().equals(stockOutRecordDto.getRecordType())){ src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -44,6 +44,15 @@ (IFNULL(T1.quantity, 0) - IFNULL(t3.shipped_quantity, 0)) as no_quantity, IFNULL(t5.pending_approval_quantity, 0) as pending_approval_quantity, CASE WHEN T1.type != 2 THEN NULL ELSE GREATEST( IFNULL(T1.quantity, 0) - IFNULL(t4.approved_stock_in_num, 0) - IFNULL(t4.pending_stock_in_num, 0), 0 ) END AS pending_inbound_quantity, CASE WHEN IFNULL(t3.shipped_quantity, 0) = 0 AND IFNULL(t5.pending_approval_quantity, 0) = 0 THEN '待发货' WHEN IFNULL(t3.shipped_quantity, 0) = 0 AND IFNULL(t5.pending_approval_quantity, 0) > 0 THEN '审批中' WHEN (IFNULL(T1.quantity, 0) - IFNULL(t3.shipped_quantity, 0)) > 0 THEN '部分发货' @@ -51,8 +60,8 @@ END as shippingStatus, CASE WHEN T1.type != 2 THEN NULL WHEN IFNULL(t4.approved_stock_in_num, 0) <= 0 THEN '待入库' WHEN IFNULL(t4.approved_stock_in_num, 0) >= IFNULL(T1.quantity, 0) THEN '完全入库' WHEN IFNULL(t4.approved_stock_in_num, 0) + IFNULL(t4.pending_stock_in_num, 0) <= 0 THEN '待入库' WHEN IFNULL(t4.approved_stock_in_num, 0) + IFNULL(t4.pending_stock_in_num, 0) >= IFNULL(T1.quantity, 0) THEN '完全入库' ELSE '入库中' END AS stock_in_approval_status FROM @@ -109,10 +118,12 @@ ) t3 ON t3.sales_ledger_product_id = T1.id LEFT JOIN ( SELECT rel.sales_ledger_product_id, IFNULL(SUM(rel.stock_in_num), 0) AS approved_stock_in_num IFNULL(SUM(rel.approved_stock_in_num), 0) AS approved_stock_in_num, IFNULL(SUM(rel.pending_stock_in_num), 0) AS pending_stock_in_num FROM ( SELECT slp.id AS sales_ledger_product_id, sir.stock_in_num CASE WHEN COALESCE(sir.approval_status, 0) = 1 THEN COALESCE(sir.theory_stock_in_num, sir.stock_in_num) ELSE 0 END AS approved_stock_in_num, CASE WHEN COALESCE(sir.approval_status, 0) = 0 THEN COALESCE(sir.theory_stock_in_num, sir.stock_in_num) ELSE 0 END AS pending_stock_in_num FROM stock_in_record sir INNER JOIN sales_ledger_product slp ON slp.type = 2 @@ -122,12 +133,13 @@ (sir.batch_no IS NOT NULL AND sir.batch_no LIKE CONCAT('%-', slp.id)) OR (sir.batch_no IS NULL AND sir.product_model_id = slp.product_model_id) ) WHERE sir.approval_status = 1 WHERE COALESCE(sir.approval_status, 0) IN (0, 1) UNION ALL SELECT slp.id AS sales_ledger_product_id, sir.stock_in_num CASE WHEN COALESCE(sir.approval_status, 0) = 1 THEN COALESCE(sir.theory_stock_in_num, sir.stock_in_num) ELSE 0 END AS approved_stock_in_num, CASE WHEN COALESCE(sir.approval_status, 0) = 0 THEN COALESCE(sir.theory_stock_in_num, sir.stock_in_num) ELSE 0 END AS pending_stock_in_num FROM stock_in_record sir INNER JOIN quality_inspect qi ON TRIM(sir.record_type) = '10' @@ -136,7 +148,7 @@ ON slp.type = 2 AND slp.sales_ledger_id = qi.purchase_ledger_id AND slp.product_model_id = qi.product_model_id WHERE sir.approval_status = 1 WHERE COALESCE(sir.approval_status, 0) IN (0, 1) ) rel GROUP BY rel.sales_ledger_product_id ) t4 ON t4.sales_ledger_product_id = T1.id