diff --git a/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/feign/WmsTaskClient.java b/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/feign/WmsTaskClient.java index 5984298d0..5a80e6cbc 100644 --- a/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/feign/WmsTaskClient.java +++ b/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/feign/WmsTaskClient.java @@ -3,6 +3,7 @@ package org.springblade.wms.feign; import org.springblade.core.tool.api.R; import org.springblade.wms.pojo.dto.StGraphiteMoldOutDTO; import org.springblade.wms.pojo.entity.StGraphiteMoldOut; +import org.springblade.wms.pojo.vo.GraphiteStockKitVO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.SpringQueryMap; import org.springframework.format.annotation.DateTimeFormat; @@ -35,6 +36,8 @@ public interface WmsTaskClient { String GENERATE_PRE_OUT_ORDER = API_PREFIX + "/generatePreOutOrder"; + String GET_STOCK_AND_KIT = API_PREFIX + "/getStockAndKit"; + /** * 物料状态监控同步erp */ @@ -64,4 +67,11 @@ public interface WmsTaskClient { @PostMapping(GENERATE_PRE_OUT_ORDER) R> generatePreOutOrder(@SpringQueryMap StGraphiteMoldOutDTO dto); + /** + * 查询库存和齐套数 + */ + @PostMapping(GET_STOCK_AND_KIT) + R getStockAndKit(@RequestParam String goodsCode, + @RequestParam Integer isGraphite); + } diff --git a/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/vo/GraphiteStockKitVO.java b/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/vo/GraphiteStockKitVO.java new file mode 100644 index 000000000..f9d766522 --- /dev/null +++ b/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/vo/GraphiteStockKitVO.java @@ -0,0 +1,27 @@ +package org.springblade.wms.pojo.vo; + +import lombok.Data; + +import java.util.List; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName GraphiteStockKitVO + * @description: + * @autor: WuSiYu + * @create 2026-06-08 16:09 + **/ +@Data +public class GraphiteStockKitVO { + + /** + * 齐套数量 + */ + private Integer completeQuantity; + + /** + * (子物料/关联物料) + */ + private List stockKitGoodsDetailList; +} diff --git a/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/vo/StockKitGoodsDetailVO.java b/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/vo/StockKitGoodsDetailVO.java new file mode 100644 index 000000000..149d7c48f --- /dev/null +++ b/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/vo/StockKitGoodsDetailVO.java @@ -0,0 +1,47 @@ +package org.springblade.wms.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StockKitGoodsDetailVO + * @description: + * @autor: WuSiYu + * @create 2026-06-08 16:12 + **/ +@Data +public class StockKitGoodsDetailVO { + + /** + * 物料编号 + */ + @Schema(description = "物料编号") + private String subCode; + + /** + * 物料名称 + */ + @Schema(description = "物料名称") + private String subName; + + /** + * 单套数量 + */ + @Schema(description = "单套数量") + private Double singleQuantity; + + /** + * 库存数量 + */ + @Schema(description = "库存数量") + private Double quantity; + + /** + * 占用数量 + */ + @Schema(description = "占用数量") + private Double occupyQuantity; + +} diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGraphiteMoldOutController.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGraphiteMoldOutController.java index 88b383db0..e23921b33 100644 --- a/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGraphiteMoldOutController.java +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGraphiteMoldOutController.java @@ -23,6 +23,7 @@ import org.springblade.core.tool.utils.Func; import org.springblade.wms.excel.StGraphiteMoldOutExcel; import org.springblade.wms.pojo.dto.StGraphiteMoldOutDTO; import org.springblade.wms.pojo.entity.StGraphiteMoldOut; +import org.springblade.wms.pojo.vo.GraphiteStockKitVO; import org.springblade.wms.pojo.vo.StGraphiteMoldOutVO; import org.springblade.wms.pojo.vo.StStockInoutRecordVO; import org.springblade.wms.service.IStGraphiteMoldOutService; @@ -217,6 +218,18 @@ public class StGraphiteMoldOutController extends BladeController { return R.data(result); } + /** + * 查询库存和齐套数 + */ + @GetMapping("/getStockAndKit") + @ApiOperationSupport(order = 11) + @ApiLog("查询库存和齐套数") + @Operation(summary = "查询库存和齐套数库", description = "传入物料编号和是否石墨模查询") + public R getStockAndKit(@RequestParam String goodsCode, + @RequestParam Integer isGraphite) { + return R.data(stGraphiteMoldOutService.getStockAndKit(goodsCode, isGraphite)); + } + /** * 导出数据 */ diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/feign/WmsTaskClientImpl.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/feign/WmsTaskClientImpl.java index 82dd8b693..e6deeddaa 100644 --- a/blade-service/blade-wms/src/main/java/org/springblade/wms/feign/WmsTaskClientImpl.java +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/feign/WmsTaskClientImpl.java @@ -7,10 +7,12 @@ import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; import org.springblade.wms.pojo.dto.StGraphiteMoldOutDTO; import org.springblade.wms.pojo.entity.StGraphiteMoldOut; +import org.springblade.wms.pojo.vo.GraphiteStockKitVO; import org.springblade.wms.service.IStBuyOrderService; import org.springblade.wms.service.IStGoodsExtService; import org.springblade.wms.service.IStGraphiteMoldOutService; import org.springblade.wms.service.IStOtherReceiptRecordService; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.Date; @@ -59,4 +61,10 @@ public class WmsTaskClientImpl implements WmsTaskClient{ public R> generatePreOutOrder(StGraphiteMoldOutDTO dto) { return R.data(stGraphiteMoldOutService.generatePreOutOrder(dto)); } + + @Override + public R getStockAndKit(@RequestParam String goodsCode, + @RequestParam Integer isGraphite) { + return R.data(stGraphiteMoldOutService.getStockAndKit(goodsCode, isGraphite)); + } } diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGraphiteMoldOutService.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGraphiteMoldOutService.java index 64fcf136f..4af6ff9a5 100644 --- a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGraphiteMoldOutService.java +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGraphiteMoldOutService.java @@ -7,6 +7,7 @@ import org.springblade.core.secure.BladeUser; import org.springblade.wms.excel.StGraphiteMoldOutExcel; import org.springblade.wms.pojo.dto.StGraphiteMoldOutDTO; import org.springblade.wms.pojo.entity.StGraphiteMoldOut; +import org.springblade.wms.pojo.vo.GraphiteStockKitVO; import org.springblade.wms.pojo.vo.StGraphiteMoldOutVO; import java.util.List; @@ -48,4 +49,6 @@ public interface IStGraphiteMoldOutService extends BaseService batchGeneratePreOutOrder(List dtoList); List batchSubmitOutStock(List paramList, BladeUser user); + + GraphiteStockKitVO getStockAndKit(String goodsCode, Integer isGraphite); } diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGraphiteMoldOutServiceImpl.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGraphiteMoldOutServiceImpl.java index ce876e157..a60cc876c 100644 --- a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGraphiteMoldOutServiceImpl.java +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGraphiteMoldOutServiceImpl.java @@ -20,7 +20,9 @@ import org.springblade.wms.mapper.StRealtimeStockMapper; import org.springblade.wms.mapper.StStockInoutRecordMapper; import org.springblade.wms.pojo.dto.StGraphiteMoldOutDTO; import org.springblade.wms.pojo.entity.*; +import org.springblade.wms.pojo.vo.GraphiteStockKitVO; import org.springblade.wms.pojo.vo.StGraphiteMoldOutVO; +import org.springblade.wms.pojo.vo.StockKitGoodsDetailVO; import org.springblade.wms.service.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -409,6 +411,110 @@ public class StGraphiteMoldOutServiceImpl extends BaseServiceImpl goodsDetailList = new ArrayList<>(); + + if (isGraphite == 1) { + + DsPartEntity partOne = partClient.getPart(goodsCode, "1"); + List partRelationEntityList = partClient.getSubPart(partOne.getId()); + List allChildPartList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(partRelationEntityList)) { + // 提取所有非空的childPartId并去重(避免null和重复ID,减少查询压力) + List childPartIdList = partRelationEntityList.stream() + .map(DsPartRelationEntity::getChildPartId) // 提取子件ID + .filter(Objects::nonNull) // 过滤null的ID + .distinct() // 去重,避免重复查询 + .collect(Collectors.toList()); + + // 批量查询DS_PART表 + if (!CollectionUtils.isEmpty(childPartIdList)) { + // 调用dsPartService的批量查询方法(根据ID列表查DS_PART) + allChildPartList = partClient.batchParts(childPartIdList); + } + } + + for (DsPartEntity sub : allChildPartList) { + StockKitGoodsDetailVO goodsDetailVO = new StockKitGoodsDetailVO(); + String subCode = sub.getPartCode(); + DsPartRelationEntity dsPartRelation = stGlassCakeOutMapper.getPartQuota(goodsCode, subCode); + goodsDetailVO.setSubCode(subCode); + goodsDetailVO.setSingleQuantity(dsPartRelation.getQuota()); + goodsDetailList.add(goodsDetailVO); + } + + } else { + StockKitGoodsDetailVO otherGoodsDetail = new StockKitGoodsDetailVO(); + otherGoodsDetail.setSubCode(goodsCode); + otherGoodsDetail.setSingleQuantity(1.0); + goodsDetailList.add(otherGoodsDetail); + } + + int maxCanMakeSet = Integer.MAX_VALUE; + for (StockKitGoodsDetailVO item : goodsDetailList) { + // 查询该子件所有可用库存 + List stockList = stRealtimeStockMapper.selectMaxUsableStockByMoldAttr(item.getSubCode()); + double totalStock = 0; + double totalOccupy = 0; + double totalUsable = 0; + + // 库存非空才计算 + if (stockList != null && !stockList.isEmpty()) { + // 总库存 + totalStock = stockList.stream() + .mapToDouble(StRealtimeStock::getQuantity) + .sum(); + + // 总占用 + totalOccupy = stockList.stream() + .mapToDouble(s -> Optional.ofNullable(s.getOccupyQuantity()).orElse(0D)) + .sum(); + + // 可用库存 + totalUsable = stockList.stream() + .mapToDouble(s -> s.getQuantity() - Optional.ofNullable(s.getOccupyQuantity()).orElse(0D)) + .filter(v -> v > 0) + .sum(); + } + + // 计算可做套数(防止除零) + int subCanMake = 0; + if (item.getSingleQuantity() != null && item.getSingleQuantity() > 0) { + subCanMake = (int) Math.floor(totalUsable / item.getSingleQuantity()); + } + + // 取最小套数(齐套核心) + maxCanMakeSet = Math.min(maxCanMakeSet, subCanMake); + + // 名称(防空指针) + StGoods stGoods = stGoodsService.queryByCode(item.getSubCode()); + if (stGoods != null) { + item.setSubName(stGoods.getGoodsName()); + } + + // 赋值库存 + item.setQuantity(totalStock); + item.setOccupyQuantity(totalOccupy); + + } + // 最后边界修正:最小为0 + maxCanMakeSet = Math.max(maxCanMakeSet, 0); + + GraphiteStockKitVO graphiteStockKitVO = new GraphiteStockKitVO(); + graphiteStockKitVO.setCompleteQuantity(maxCanMakeSet); + graphiteStockKitVO.setStockKitGoodsDetailList(goodsDetailList); + + return graphiteStockKitVO; + } + @Override public List exportStGraphiteMoldOut(Wrapper queryWrapper) { List list = baseMapper.exportStGraphiteMoldOut(queryWrapper);