预出库扣减库存逻辑

This commit is contained in:
2026-03-12 15:46:52 +08:00
parent ef0c52b6df
commit 87de67a188

View File

@@ -125,13 +125,13 @@ public class RkRecordServiceImpl implements IRkRecordService
rkRecord.setUpdateTime(DateUtils.getNowDate());
/* ====================== 2. 查询原记录(唯一可信来源) ====================== */
/* ====================== 2. 查询原记录 ====================== */
RkRecord oldRecord = rkRecordMapper.selectRkRecordById(rkRecord.getId());
if (oldRecord == null) {
throw new RuntimeException("原出入库记录不存在");
}
/* ====================== 3. 获取并校验库存ID(必须来自 oldRecord ====================== */
/* ====================== 3. 获取库存ID ====================== */
Long rkInfoId = oldRecord.getRkInfoId();
if (rkInfoId == null) {
throw new RuntimeException("出入库记录未关联库存,禁止修改");
@@ -145,7 +145,7 @@ public class RkRecordServiceImpl implements IRkRecordService
String bizType = rkRecord.getBizType();
/* =========================================================
* 【A】入库记录修改bizType = 0
* 【A】入库记录修改
* ========================================================= */
if ("0".equals(bizType)) {
@@ -159,7 +159,6 @@ public class RkRecordServiceImpl implements IRkRecordService
BigDecimal diff = newInQty.subtract(oldInQty);
/* ---------- 供应计划处理 ---------- */
Long gysJhId = oldRecord.getGysJhId();
if (gysJhId != null) {
@@ -182,11 +181,11 @@ public class RkRecordServiceImpl implements IRkRecordService
gysJh.setRealQty(newPlanRealQty);
if (newPlanRealQty.compareTo(BigDecimal.ZERO) == 0) {
gysJh.setStatus("0"); // 未到货
gysJh.setStatus("0");
} else if (planQty != null && newPlanRealQty.compareTo(planQty) >= 0) {
gysJh.setStatus("1"); // 已入库
gysJh.setStatus("1");
} else {
gysJh.setStatus("2"); // 部分入库
gysJh.setStatus("2");
}
gysJh.setWlNo(rkRecord.getWlNo());
@@ -202,9 +201,8 @@ public class RkRecordServiceImpl implements IRkRecordService
gysJhMapper.updateGysJh(gysJh);
}
/* ---------- 同步库存(明确字段,禁止 BeanUtils ---------- */
String scene = "";
// 库位校验
if (StringUtils.isNotBlank(info.getPcode())) {
PcdeDetail pcde = pcdeDetailMapper.selectByPcodeAndWarehouse(
rkRecord.getPcode(),
@@ -213,12 +211,15 @@ public class RkRecordServiceImpl implements IRkRecordService
if (pcde == null) {
throw new RuntimeException("库位不存在:" + info.getPcode());
}
info.setPcodeId(pcde.getEncodedId());
if(StringUtils.isNotBlank(pcde.getScene())){
if (StringUtils.isNotBlank(pcde.getScene())) {
scene = pcde.getScene();
info.setScene(scene);
}
}
info.setRealQty(newInQty);
info.setWlNo(rkRecord.getWlNo());
info.setWlMs(rkRecord.getWlMs());
@@ -235,26 +236,24 @@ public class RkRecordServiceImpl implements IRkRecordService
}
/* =========================================================
* 【B】出库记录修改bizType = 1
* 【B】出库记录修改修改逻辑
* ========================================================= */
if ("1".equals(bizType)) {
BigDecimal oldOutQty = oldRecord.getRealQty();
BigDecimal newOutQty = rkRecord.getRealQty();
BigDecimal stockQty = info.getRealQty();
if (oldOutQty == null || newOutQty == null || stockQty == null) {
if (newOutQty == null || stockQty == null) {
throw new RuntimeException("数量数据异常,无法修改出库记录");
}
BigDecimal diff = newOutQty.subtract(oldOutQty);
BigDecimal newStockQty = stockQty.subtract(diff);
/* 关键修改:直接用 newOutQty 计算库存 */
BigDecimal newStockQty = stockQty.subtract(newOutQty);
if (newStockQty.compareTo(BigDecimal.ZERO) < 0) {
throw new RuntimeException("库存不足,无法修改出库数量");
}
info.setRealQty(newStockQty);
info.setIsChuku(newStockQty.compareTo(BigDecimal.ZERO) == 0 ? "1" : "0");
info.setWlNo(rkRecord.getWlNo());
@@ -277,8 +276,8 @@ public class RkRecordServiceImpl implements IRkRecordService
throw new RuntimeException("同步更新库存表失败");
}
/* ====================== 5. 最后更新 rk_record ====================== */
rkRecord.setRkInfoId(rkInfoId); // 强制回填,防止被置空
/* ====================== 5. 更新记录表 ====================== */
rkRecord.setRkInfoId(rkInfoId);
int rows = rkRecordMapper.updateRkRecord(rkRecord);
if (rows <= 0) {
throw new RuntimeException("更新出入库记录失败");
@@ -286,6 +285,7 @@ public class RkRecordServiceImpl implements IRkRecordService
return rows;
}
@Override
@Transactional(rollbackFor = Exception.class)
public int deleteRkRecordByIds(Long[] ids) {