Merge remote-tracking branch 'origin/master'

liweidong
李涛 1 week ago
commit 51f85b50fa
  1. 2
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StGoodsExt.java
  2. 10
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StStockInoutRecord.java
  3. 3
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGlassCakeOutMapper.java
  4. 6
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGlassCakeOutMapper.xml
  5. 4
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsExtMapper.java
  6. 32
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsExtMapper.xml
  7. 4
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.java
  8. 14
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.xml
  9. 2
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStRealtimeStockService.java
  10. 10
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGlassCakeOutServiceImpl.java
  11. 5
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGoodsExtServiceImpl.java
  12. 40
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StRealtimeStockServiceImpl.java

@ -32,7 +32,7 @@ public class StGoodsExt extends BaseEntity {
* 季度月使用量均值
*/
@Schema(description = "季度月使用量均值")
private Long useAverage;
private Double useAverage;
/**
* 一级库存
*/

@ -180,6 +180,11 @@ public class StStockInoutRecord extends TenantEntity {
*/
@Schema(description = "单价")
private Double unitPrice;
/**
* 流程卡号
*/
@Schema(description = "流程卡号")
private String cardNo;
/**
* 是否印字
@ -204,8 +209,8 @@ public class StStockInoutRecord extends TenantEntity {
public static final Short IN_TYPE = 0;
public static final Short OUT_TYPE = 1;
/*1:采购入库,2.生产入库,3:其他入库,4调拨入库,5erp转移入库,7生产退料
11:配额出库,12:其他出库,13:领料出库 15刀具出库*/
/*1:采购入库,2.生产入库,3:其他入库,4调拨入库,5erp转移入库,7生产退料
11:配额出库,12:其他出库,13:领料出库 15刀具出库,16玻璃饼出库,17石墨模出库*/
public static final Short INOUT_SOURCE_PURCHASE_RECEIPT = 1;
public static final Short INOUT_SOURCE_PRODUCE_PURCHASE_RECEIPT = 2;
public static final Short INOUT_SOURCE_OTHER_PURCHASE_RECEIPT = 3;
@ -217,6 +222,7 @@ public class StStockInoutRecord extends TenantEntity {
public static final Short INOUT_SOURCE_ASSIGN_OUT = 13;
public static final Short INOUT_SOURCE_TOOl_OUT = 15;
public static final Short INOUT_SOURCE_GLASS_CAKE_OUT = 16;
public static final Short INOUT_SOURCE_GRAPHITE_MOLD_OUT = 17;
}

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
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;
@ -53,5 +54,7 @@ public interface StGlassCakeOutMapper extends BaseMapper<StGlassCakeOut> {
YieldOrder getByYieldOrder(String yoCode);
List<YieldOrder> getYieldOrderList(Long id, String yieldType);
DsPartRelationEntity getPartQuota(String partCode, String goodsCode);
}

@ -225,4 +225,10 @@
AND YIELD_TYPE = #{yieldType}
</select>
<select id="getPartQuota" resultType="org.springblade.desk.dashboard.pojo.entity.DsPartRelationEntity">
select * from DS_PART_RELATION where is_deleted = 0
and PART_CODE = #{partCode}
and CHILD_PART_CODE = #{subCode}
</select>
</mapper>

@ -43,5 +43,9 @@ public interface StGoodsExtMapper extends BaseMapper<StGoodsExt> {
IPage<StGoodsExtVO> selectGoodsExtWithGoods(IPage<StGoodsExtVO> page, @Param("ew") QueryWrapper<StGoodsExt> queryWrapper);
StGoodsExt getGoodsExt(Double invqty1j, Double planqty, Long goodsId);
StGoodsExt selectWithAvgMonth(Long goodsId);
Double getPlanQty(Long goodsId);
}

@ -118,5 +118,37 @@
SELECT * FROM ST_GOODS_EXT ${ew.customSqlSegment}
</select>
<select id="selectWithAvgMonth" resultType="org.springblade.wms.pojo.vo.StGoodsExtVO">
SELECT
g.id AS goodsId,
g.goods_code AS goodsCode,
-- 90天内出库总数量
NVL(SUM(s.quantity), 0) AS totalOutQuantity,
-- 月均出库数量 = 总出库 / 3
ROUND(NVL(SUM(s.quantity), 0) / 3, 2) AS useAverage
FROM ST_STOCK_INOUT_RECORD s
-- 关联物料表
LEFT JOIN st_goods g ON s.goods_id = g.id
-- 条件:只查 出库 + 近90天
WHERE s.IN_OUT_TYPE = 1
AND s.create_time >= SYSDATE - 90
AND s.is_deleted = 0
AND s.goods_id = #{goodsId}
-- 按物料分组
GROUP BY g.id, g.goods_code
</select>
<select id="getPlanQty" resultType="java.lang.Double">
SELECT NVL(SUM(sur_draw_qty), 0) AS planQty
FROM ST_BUY_ORDER
WHERE goods_id = #{goodsId}
AND is_deleted = 0
</select>
</mapper>

@ -106,5 +106,9 @@ public interface StRealtimeStockMapper extends BaseMapper<StRealtimeStock> {
List<StStorehouseVO> findStorehouseByGoodsCode(String goodsCode);
StRealtimeStock getByGoodsCodeAndShIdAndSlId(String goodsCode, Long shId, Long slId);
// Object[] queryByShIdAndSlId(String goodsCode, Double quantity, Long shId, Long slId);
StRealtimeStock selectMaxUsableStockByMoldAttr(String goodsCode);
}

@ -676,6 +676,20 @@
AND g.is_deleted = 0
</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>
<!-- <select id="queryByShIdAndSlId" resultType="java.lang.Object">-->
<!-- SELECT-->
<!-- a.ID,-->

@ -108,5 +108,7 @@ public interface IStRealtimeStockService extends BaseService<StRealtimeStock> {
* @return
*/
StGoodStatisVO getGoodsByCode(String partCode);
// Object[] queryByShIdAndSlId(String goodsCode, Double quantity, Long shId, Long slId);
}

@ -10,6 +10,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.BladeUser;
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.wms.excel.StGlassCakeOutExcel;
import org.springblade.wms.mapper.StGlassCakeOutMapper;
@ -163,7 +164,8 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap
String materialNo = glassCake.getMaterial(); // 材料号
BigDecimal thickness = glassCake.getFormingThickness(); // 成型厚度
String goodsCode = glassCake.getPartCode();
// Double quota = glassCake.getQuota();
DsPartRelationEntity dsPartRelation = baseMapper.getPartQuota(faYieldOrder.getPartCode(), goodsCode);
// 空值校验:核心属性为空则无法匹配库存,直接跳过
if (goodsCode == null) {
@ -192,7 +194,7 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap
// continue;
// }
Double requireQty = faYieldOrder.getYpQty()*glassCake.getQuota();
Double requireQty = faYieldOrder.getYpQty() * dsPartRelation.getQuota();
System.out.println("玻璃饼编码:" + goodsCode + ",总需求:" + requireQty);
// =====================【校验】总可用库存是否足够 =====================
@ -302,7 +304,7 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap
StRealtimeStockLock lock = new StRealtimeStockLock();
lock.setId(IdUtil.getSnowflake().nextId());
lock.setRlsId(maxStock.getId());
lock.setWoNo(preOutStock.getWoCode());
lock.setWoNo(preOutStock.getCardNo());
// lock.setOccupyQuantity(preOutStock.getRequireQty());
// 锁本次扣的数量
lock.setOccupyQuantity(actualTake);
@ -546,7 +548,7 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap
inoutRecord.setInOutReason("玻璃饼出库");
inoutRecord.setInOutDate(nowDate);
// 业务信息
inoutRecord.setWoCode(outEntity.getWoCode());
inoutRecord.setWoCode(outEntity.getCardNo());
inoutRecord.setUserId(userId);
// 租户/创建人基础字段(继承TenantEntity)
inoutRecord.setUserId(param.getPicker());

@ -99,9 +99,12 @@ public class StGoodsExtServiceImpl extends BaseServiceImpl<StGoodsExtMapper, StG
continue;
}
StGoodsExt goodsExt = baseMapper.getGoodsExt(vo.getInvqty1j(),vo.getPlanqty(),goodsId);
StGoodsExt goodsAvg = baseMapper.selectWithAvgMonth(goodsId);
Double planQty = baseMapper.getPlanQty(goodsId);
ext.setFirstStore(vo.getInvqty1j());
ext.setLastStore(goodsExt.getLastStore());
ext.setPlanQty(vo.getPlanqty());
ext.setUseAverage(goodsAvg.getUseAverage());
ext.setPlanQty(planQty);
ext.setGoodsStatus(goodsExt.getGoodsStatus());
// ext.setUpdateTime(new Date());
// ext.setUpdateUser(AuthUtil.getUserId());

@ -388,8 +388,8 @@ public class StRealtimeStockServiceImpl extends BaseServiceImpl<StRealtimeStockM
}// 新增:玻璃饼出库独立分支(与其他出库/刀具出库平级)
else if (StStockInoutRecord.INOUT_SOURCE_GLASS_CAKE_OUT.equals(inout.getInOutSource())) {
// 玻璃饼出库专属:预占用校验(规则与原有一致)
if (StringUtils.isNotBlank(inout.getWoCode()) && stock.getId() != null) {
if (!this.checkRealTimeLock(inout.getWoCode(), stock.getId().toString())) {
if (StringUtils.isNotBlank(inout.getCheckNo()) && stock.getId() != null) {
if (!this.checkRealTimeLock(inout.getCheckNo(), stock.getId().toString())) {
StGlassCakeOut stGlassCakeOut = stGlassCakeOutMapper.getBySirId(inout.getId());
if (StringUtils.isNotBlank(stGlassCakeOut.getMemo())) {
// 仅备注含"补"字时跳过预占用校验
@ -418,6 +418,32 @@ public class StRealtimeStockServiceImpl extends BaseServiceImpl<StRealtimeStockM
if (warnMsg4 != null) {
warnMsgList.add(warnMsg4);
}
} else if (StStockInoutRecord.INOUT_SOURCE_GRAPHITE_MOLD_OUT.equals(inout.getInOutSource())) {
// 石墨模出库:校验预占用锁库 + 扣减库存逻辑
if (StringUtils.isNotBlank(inout.getCheckNo()) && stock.getId() != null) {
if (!this.checkRealTimeLock(inout.getCheckNo(), stock.getId().toString())) {
throw new ServiceException("石墨模出库需匹配预占用,此工作订单无预占用!");
}
}
// 校验可用库存
Double surplusQuantity =
stGoods.getCurrentQuantity() + stGoods.getOnthewayQuantity() - stGoods.getLockQuantity();
if (surplusQuantity < quantity) {
throw new ServiceException(stGoods.getGoodsCode() + "可用库存不足,石墨模出库失败");
}
// 扣减库存
stGoodsService.addCurQuantity(inout.getGoodsId(), BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue());
// 最低库存预警
String warnMsg = checkAndWarnMinStock(stGoods, inout.getGoodsId(), quantity);
if (warnMsg != null) {
warnMsgList.add(warnMsg);
}
// 补货触发
String warnMsg2 = checkAndTriggerReissue(stGoods, inout.getGoodsId(), quantity);
if (warnMsg2 != null) {
warnMsgList.add(warnMsg2);
}
}
// else if (StStockInoutRecord.INOUT_SOURCE_ASSIGN_OUT.equals(inout.getInOutSource())) {
// if (!stock.getMoldBaseMaterial()) {
@ -532,9 +558,10 @@ public class StRealtimeStockServiceImpl extends BaseServiceImpl<StRealtimeStockM
BigDecimal.valueOf(quantity))
.doubleValue();
if (StrUtil.isNotBlank(inout.getWoCode()) && newOccupy >= 0) {
String lockNo = StrUtil.isNotBlank(inout.getWoCode()) ? inout.getWoCode() : inout.getCardNo();
if (StrUtil.isNotBlank(lockNo) && newOccupy >= 0) {
db.setOccupyQuantity(newOccupy);
this.updateRealTimeLock(inout.getWoCode(), db.getId(), quantity);
this.updateRealTimeLock(lockNo, db.getId(), quantity);
// NumberUtil.add(
// BigDecimal.valueOf(newOccupy),
// BigDecimal.valueOf(quantity)
@ -976,6 +1003,11 @@ public class StRealtimeStockServiceImpl extends BaseServiceImpl<StRealtimeStockM
}
}
// @Override
// public Object[] queryByShIdAndSlId(String goodsCode, Double quantity, Long shId, Long slId) {
// return baseMapper.queryByShIdAndSlId(goodsCode, quantity, shId, slId);
// }
@Override
public List<StRealtimeStockExcel> exportStRealtimeStock(Wrapper<StRealtimeStock> queryWrapper) {
List<StRealtimeStockExcel> stRealtimeStockList = baseMapper.exportStRealtimeStock(queryWrapper);

Loading…
Cancel
Save