仓库管理修改

liweidong
wusiyu 4 days ago
parent e7432d334c
commit e06110e88b
  1. 4
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.java
  2. 41
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.xml
  3. 33
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGlassCakeOutServiceImpl.java
  4. 23
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGraphiteMoldOutServiceImpl.java

@ -101,7 +101,7 @@ public interface StRealtimeStockMapper extends BaseMapper<StRealtimeStock> {
void insertStockLock(StRealtimeStockLock lock);
StRealtimeStock selectMaxUsableStockByCakeAttr(String isPrint, BigDecimal powderWeight, String materialNo, BigDecimal thickness, String goodsCode);
List<StRealtimeStock> selectMaxUsableStockByCakeAttr(String isPrint, BigDecimal powderWeight, String materialNo, BigDecimal thickness, String goodsCode);
List<StStorehouseVO> findStorehouseByGoodsCode(String goodsCode);
@ -109,6 +109,6 @@ public interface StRealtimeStockMapper extends BaseMapper<StRealtimeStock> {
// Object[] queryByShIdAndSlId(String goodsCode, Double quantity, Long shId, Long slId);
StRealtimeStock selectMaxUsableStockByMoldAttr(String goodsCode);
List<StRealtimeStock> selectMaxUsableStockByMoldAttr(String goodsCode);
}

@ -605,15 +605,13 @@
</insert>
<select id="selectMaxUsableStockByCakeAttr" resultType="org.springblade.wms.pojo.entity.StRealtimeStock">
SELECT t.*
FROM (
SELECT s.*
FROM ST_REALTIME_STOCK s
INNER JOIN ST_GOODS g ON s.goods_id = g.id
-- 原有:左连接锁料表,保留工单关联(必须加,否则查错锁料量)
LEFT JOIN ST_REALTIME_STOCK_LOCK l ON s.id = l.rls_id
-- 调整:goods_code从关联的STGOODS表匹配,而非库存表
WHERE g.goods_code = #{goodsCode}
SELECT s.*
FROM ST_REALTIME_STOCK s
INNER JOIN ST_GOODS g ON s.goods_id = g.id
-- 原有:左连接锁料表,保留工单关联(必须加,否则查错锁料量)
LEFT JOIN ST_REALTIME_STOCK_LOCK l ON s.id = l.rls_id
-- 调整:goods_code从关联的STGOODS表匹配,而非库存表
WHERE g.goods_code = #{goodsCode}
<if test="materialNo == null">
AND s.material_no IS NULL
</if>
@ -641,10 +639,9 @@
<if test="isPrint != null">
AND s.print_mark = #{isPrint}
</if>
-- 原有:按可用量(库存数量-已占用数量)倒序,空占用按0计算
ORDER BY (s.quantity - NVL(l.occupy_quantity, 0)) DESC
) t
WHERE ROWNUM = 1
-- 原有:按可用量(库存数量-已占用数量)倒序,空占用按0计算
ORDER BY (s.quantity - NVL(s.occupy_quantity, 0)) DESC, s.create_time ASC
</select>
<select id="findStorehouseByGoodsCode" resultType="org.springblade.wms.pojo.vo.StStorehouseVO">
@ -677,17 +674,13 @@
</select>
<select id="selectMaxUsableStockByMoldAttr" resultType="org.springblade.wms.pojo.entity.StRealtimeStock">
SELECT *
FROM (
SELECT s.*
FROM st_realtime_stock s
LEFT JOIN st_goods g ON s.goods_id = g.id AND g.is_deleted = 0
WHERE g.goods_code = #{goodsCode}
AND s.is_deleted = 0
AND s.stop_use = 0
ORDER BY s.create_time ASC
)
WHERE ROWNUM = 1
SELECT s.*
FROM st_realtime_stock s
LEFT JOIN st_goods g ON s.goods_id = g.id AND g.is_deleted = 0
WHERE g.goods_code = #{goodsCode}
AND s.is_deleted = 0
AND s.stop_use = 0
ORDER BY (s.quantity - s.occupy_quantity) DESC, s.create_time ASC
</select>
<!-- <select id="queryByShIdAndSlId" resultType="java.lang.Object">-->

@ -85,9 +85,9 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap
// throw new RuntimeException("工单【" + dto.getWoCode() + "】未查到生产订单ID");
// }
YieldOrder faYieldOrder = baseMapper.getByYieldOrder(dto.getYoCode());
YieldOrder faYieldOrder = baseMapper.getByYoCode(dto.getCardNo());
if (faYieldOrder == null) {
throw new RuntimeException("根据生产订单ID【" + dto.getYoCode() + "】未查询到生产订单信息");
throw new RuntimeException("根据流程卡号【" + dto.getCardNo() + "】未查询到生产订单信息");
}
List<YieldOrder> yieldOrderList = baseMapper.getYieldOrderList(faYieldOrder.getId(),"12003");
@ -201,26 +201,21 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap
List<StRealtimeStock> 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;
List<StRealtimeStock> allUsableStockList = stRealtimeStockMapper.selectMaxUsableStockByCakeAttr(
isPrint, powderWeight, materialNo, thickness, goodsCode);
for (StRealtimeStock stock : allUsableStockList) {
double occupy = Optional.ofNullable(stock.getOccupyQuantity()).orElse(0D);
double usableQty = stock.getQuantity() - occupy;
if (usableQty <= 0) {
break;
continue;
}
candidateStockList.add(maxStock);
candidateStockList.add(stock);
totalUsable += usableQty;
if (totalUsable >= requireQty) {
break; // 已凑够
break;
}
}
@ -414,17 +409,13 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap
// ============ 第三步:无数据 → 新增一条待出库数据 ============
StGlassCakeOutDTO dto = new StGlassCakeOutDTO();
dto.setCardNo(cardNo);
// WorkOrder workOrder = baseMapper.getByWoCode(dto.getCardNo());
YieldOrder yieldOrder = baseMapper.getByYoCode(dto.getCardNo());
dto.setYoCode(yieldOrder.getYoCode());
List<StGlassCakeOut> stGlassCakeOutList = this.generatePreOutOrder(dto);
if (!CollectionUtils.isEmpty(stGlassCakeOutList)) {
for (StGlassCakeOut waitOut : stGlassCakeOutList) {
// 3.1 从待出库对象中获取关联库存的唯一标识(比如商品ID/物料编码)
Long productId = waitOut.getId(); // 替换成你实际的关联字段
// 3.1 从待出库对象中获取关联库存的唯一标识
Long productId = waitOut.getId();
StRealtimeStock stock = stRealtimeStockService.getById(waitOut.getRlsId());
// 3.3 给待出库对象补充库存字段(关键:直接赋值)

@ -72,21 +72,16 @@ public class StGraphiteMoldOutServiceImpl extends BaseServiceImpl<StGraphiteMold
List<StRealtimeStock> candidateStockList = new ArrayList<>();
double totalUsable = 0.0;
while (true) {
StRealtimeStock maxStock = stRealtimeStockMapper.selectMaxUsableStockByMoldAttr(goodsCode);
if (maxStock == null) {
break;
}
double occupyQty = Optional.ofNullable(maxStock.getOccupyQuantity()).orElse(0D);
double usableQty = maxStock.getQuantity() - occupyQty;
List<StRealtimeStock> allUsableStockList = stRealtimeStockMapper.selectMaxUsableStockByMoldAttr(goodsCode);
for (StRealtimeStock stock : allUsableStockList) {
double occupy = Optional.ofNullable(stock.getOccupyQuantity()).orElse(0D);
double usableQty = stock.getQuantity() - occupy;
if (usableQty <= 0) {
break;
continue;
}
candidateStockList.add(maxStock);
candidateStockList.add(stock);
totalUsable += usableQty;
if (totalUsable >= requireQty) {
@ -94,9 +89,9 @@ public class StGraphiteMoldOutServiceImpl extends BaseServiceImpl<StGraphiteMold
}
}
if (totalUsable < requireQty - 0.001) {
throw new ServiceException("石墨模【" + goodsCode + "】库存不足,无法生成!需求数量:" + requireQty + ",可用库存:" + totalUsable);
}
// if (totalUsable < requireQty - 0.001) {
// throw new ServiceException("石墨模【" + goodsCode + "】库存不足,无法生成!需求数量:" + requireQty + ",可用库存:" + totalUsable);
// }
double remainingQty = requireQty;
for (StRealtimeStock maxStock : candidateStockList) {

Loading…
Cancel
Save