diff --git a/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StGlassCakeOut.java b/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StGlassCakeOut.java index 5c3afd14..e8eb2ab0 100644 --- a/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StGlassCakeOut.java +++ b/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StGlassCakeOut.java @@ -33,6 +33,11 @@ public class StGlassCakeOut extends TenantEntity { */ @Schema(description = "出库凭证信息") private Long sirId; + /** + * 部件生产单号 + */ + @TableField(value = "YO_CODE") + private String yoCode; /** * 车间订单号 */ @@ -128,6 +133,11 @@ public class StGlassCakeOut extends TenantEntity { */ @Schema(description = "备注") private String memo; + /** + * 领料人ID + */ + @Schema(description = "领料人ID") + private Long picker; /** * 是否印字 */ diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java index ecaed52e..87e4782d 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java @@ -975,7 +975,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl { StGlassCakeOut getBySirId(Long sirId); WorkOrder getByWoCode(String cardNo); + + YieldOrder getByYoCode(String cardNo); } diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGlassCakeOutMapper.xml b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGlassCakeOutMapper.xml index 603e47db..750d7abb 100644 --- a/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGlassCakeOutMapper.xml +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGlassCakeOutMapper.xml @@ -204,4 +204,10 @@ WHERE card_no = #{cardNo} + + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGlassCakeOutServiceImpl.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGlassCakeOutServiceImpl.java index 43831ecb..5ad5c740 100644 --- a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGlassCakeOutServiceImpl.java +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGlassCakeOutServiceImpl.java @@ -12,7 +12,6 @@ import org.springblade.desk.dashboard.feign.IPartClient; import org.springblade.desk.dashboard.pojo.entity.DsPartEntity; import org.springblade.desk.dashboard.pojo.entity.DsPartRelationEntity; import org.springblade.desk.order.pojo.entity.YieldOrder; -import org.springblade.desk.produce.pojo.entity.WorkOrder; import org.springblade.wms.excel.StGlassCakeOutExcel; import org.springblade.wms.mapper.StGlassCakeOutMapper; import org.springblade.wms.mapper.StOtherReceiptRecordMapper; @@ -56,14 +55,7 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl selectStGlassCakeOutPage(IPage page, StGlassCakeOutVO stGlassCakeOut) { return page.setRecords(baseMapper.selectStGlassCakeOutPage(page, stGlassCakeOut)); @@ -84,24 +76,24 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl partRelationEntityList = partClient.getSubPart(partOne.getId()); @@ -191,32 +183,79 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl candidateStockList = new ArrayList<>(); + double totalUsable = 0.0; + // 循环查询所有可用库存,累加可用量,直到凑够 or 无库存 + while (true) { + StRealtimeStock maxStock = stRealtimeStockMapper.selectMaxUsableStockByCakeAttr( + isPrint, powderWeight, materialNo, thickness, goodsCode); + + if (maxStock == null) { + break; // 没有更多库存了 + } + + double occupyQty = Optional.ofNullable(maxStock.getOccupyQuantity()).orElse(0D); + double usableQty = maxStock.getQuantity() - occupyQty; + + if (usableQty <= 0) { + break; + } + + candidateStockList.add(maxStock); + totalUsable += usableQty; + + if (totalUsable >= requireQty) { + break; // 已凑够 + } + } + + // ===================== 不够则直接抛异常,不生成任何单据 ===================== + if (totalUsable < requireQty - 0.001) { + System.out.println("玻璃饼[编码:" + goodsCode + "]库存不足,跳过生成!需求:" + requireQty + ",可分配:" + totalUsable); + // 跳过当前这条,继续下一条玻璃饼 continue; } - Double requireQty = workOrder.getMakeQty()*glassCake.getQuota(); + // ===================== 走到这里 = 库存足够,开始真正生成预出库 ===================== + double remainingQty = requireQty; + for (StRealtimeStock maxStock : candidateStockList) { + if (remainingQty <= 0.001) { + break; + } + + double occupyQty = Optional.ofNullable(maxStock.getOccupyQuantity()).orElse(0D); + double usableQty = maxStock.getQuantity() - occupyQty; + double actualTake = Math.min(usableQty, remainingQty); // StRealtimeStockLock stockLock = stRealtimeStockMapper.selectByRlsId(maxStock.getId()); // ========== 库存充足性校验:可用量 >= 预出库目标数量才生成 ========== - Double stockQty; - if (maxStock != null && maxStock.getOccupyQuantity() != null) { - stockQty = maxStock.getQuantity() - maxStock.getOccupyQuantity(); - } else { - stockQty = maxStock.getQuantity(); - } - if (stockQty == null || stockQty.compareTo(requireQty) < 0) { - throw new ServiceException(String.format("工作订单号:%s,玻璃饼号: %s,库存不足无法生成预出库单!", - dto.getWoCode(), maxStock.getGoodsId())); - } +// Double stockQty; +// if (maxStock != null && maxStock.getOccupyQuantity() != null) { +// stockQty = maxStock.getQuantity() - maxStock.getOccupyQuantity(); +// } else { +// stockQty = maxStock.getQuantity(); +// } +// if (stockQty == null || stockQty.compareTo(requireQty) < 0) { +// throw new ServiceException(String.format("工作订单号:%s,玻璃饼号: %s,库存不足无法生成预出库单!", +// dto.getWoCode(), maxStock.getGoodsId())); +// } // ========== 库存充足:构建该玻璃饼的预出库实体 ========== StGlassCakeOut preOutStock = new StGlassCakeOut(); // 关联玻璃饼信息 - preOutStock.setWoCode(workOrder.getWoCode()); +// preOutStock.setWoCode(workOrder.getWoCode()); + preOutStock.setYoCode(yieldOrder.getYoCode()); preOutStock.setCardNo(dto.getCardNo()); - preOutStock.setQuantity(workOrder.getMakeQty()); + preOutStock.setQuantity(yieldOrder.getYpQty()); preOutStock.setPartCode(partOne.getPartCode()); preOutStock.setPartName(partOne.getPartName()); @@ -251,16 +290,24 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl stGlassCakeOutList = this.generatePreOutOrder(dto); if (!CollectionUtils.isEmpty(stGlassCakeOutList)) { @@ -459,6 +507,7 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl redisTemplate; + + // 7天过期时间(秒) + private static final long EXPIRE_SEVEN_DAYS = 7 * 24 * 60 * 60; + + // Redis 键前缀 + private static final String REDIS_KEY_MOLD = "stock:reissue:limit:mold:"; + private static final String REDIS_KEY_GLASS = "stock:reissue:limit:glass:"; @Override @@ -688,7 +702,7 @@ public class StRealtimeStockServiceImpl extends BaseServiceImpl