完善库存管理,现在问题就是出入库移库以及撤回操作都是某个主表id带着的所有详情记录一并操作并不能单个修改,比如撤回某一条详情,如果想实现这一功能需要修改主表status字段和详情表添加status字段

This commit is contained in:
2025-07-19 14:34:48 +08:00
parent d28578d106
commit 0018513683
4 changed files with 151 additions and 26 deletions

View File

@@ -9,15 +9,20 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.klp.domain.bo.WmsStockIoDetailBo;
import com.klp.domain.vo.WmsStockIoDetailVo;
import com.klp.domain.WmsStockIoDetail;
import com.klp.domain.WmsStockIo;
import com.klp.mapper.WmsStockIoDetailMapper;
import com.klp.mapper.WmsStockIoMapper;
import com.klp.service.IWmsStockIoDetailService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.Date;
import com.klp.common.exception.ServiceException;
/**
* 出入库单明细Service业务层处理
@@ -30,6 +35,7 @@ import java.util.Collection;
public class WmsStockIoDetailServiceImpl implements IWmsStockIoDetailService {
private final WmsStockIoDetailMapper baseMapper;
private final WmsStockIoMapper stockIoMapper;
/**
* 查询出入库单明细
@@ -75,12 +81,35 @@ public class WmsStockIoDetailServiceImpl implements IWmsStockIoDetailService {
* 新增出入库单明细
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(WmsStockIoDetailBo bo) {
// 检查主表状态,已审核的单据不能添加明细
WmsStockIo stockIo = stockIoMapper.selectById(bo.getStockIoId());
if (stockIo != null && stockIo.getStatus() >= 2) {
throw new ServiceException("已审核的单据不能修改明细");
}
WmsStockIoDetail add = BeanUtil.toBean(bo, WmsStockIoDetail.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setDetailId(add.getDetailId());
// 检查主表状态,如果有明细且状态为草稿,则自动变为待审核
if (stockIo != null && stockIo.getStatus() == 0) {
// 检查是否有明细
Long detailCount = baseMapper.selectCount(
new LambdaQueryWrapper<WmsStockIoDetail>()
.eq(WmsStockIoDetail::getStockIoId, bo.getStockIoId())
);
if (detailCount > 0) {
// 自动更新状态为待审核
stockIo.setStatus(1);
stockIo.setUpdateTime(new Date());
stockIoMapper.updateById(stockIo);
}
}
}
return flag;
}
@@ -90,6 +119,12 @@ public class WmsStockIoDetailServiceImpl implements IWmsStockIoDetailService {
*/
@Override
public Boolean updateByBo(WmsStockIoDetailBo bo) {
// 检查主表状态,已审核的单据不能修改明细
WmsStockIo stockIo = stockIoMapper.selectById(bo.getStockIoId());
if (stockIo != null && stockIo.getStatus() >= 2) {
throw new ServiceException("已审核的单据不能修改明细");
}
WmsStockIoDetail update = BeanUtil.toBean(bo, WmsStockIoDetail.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
@@ -106,10 +141,51 @@ public class WmsStockIoDetailServiceImpl implements IWmsStockIoDetailService {
* 批量删除出入库单明细
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
// 获取要删除的明细对应的主表ID检查状态
List<WmsStockIoDetail> details = baseMapper.selectBatchIds(ids);
if (details != null && !details.isEmpty()) {
// 检查主表状态,已审核的单据不能删除明细
for (WmsStockIoDetail detail : details) {
WmsStockIo stockIo = stockIoMapper.selectById(detail.getStockIoId());
if (stockIo != null && stockIo.getStatus() >= 2) {
throw new ServiceException("已审核的单据不能修改明细");
}
}
// 按主表ID分组
Map<Long, List<WmsStockIoDetail>> stockIoIdMap = details.stream()
.collect(java.util.stream.Collectors.groupingBy(WmsStockIoDetail::getStockIoId));
boolean flag = baseMapper.deleteBatchIds(ids) > 0;
if (flag) {
// 检查每个主表是否还有其他明细
for (Long stockIoId : stockIoIdMap.keySet()) {
Long remainingCount = baseMapper.selectCount(
new LambdaQueryWrapper<WmsStockIoDetail>()
.eq(WmsStockIoDetail::getStockIoId, stockIoId)
);
// 如果没有明细了,状态回退为草稿
if (remainingCount == 0) {
WmsStockIo stockIo = stockIoMapper.selectById(stockIoId);
if (stockIo != null && stockIo.getStatus() == 1) {
stockIo.setStatus(0);
stockIo.setUpdateTime(new Date());
stockIoMapper.updateById(stockIo);
}
}
}
}
return flag;
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -171,7 +171,6 @@ public class WmsStockIoServiceImpl implements IWmsStockIoService {
* 撤销出入库/移库单,库存回滚
*/
@Override
@RepeatSubmit()
@Transactional(rollbackFor = Exception.class)
public Boolean cancelStockIo(Long stockIoId) {
WmsStockIo stockIo = baseMapper.selectById(stockIoId);
@@ -204,8 +203,8 @@ public class WmsStockIoServiceImpl implements IWmsStockIoService {
throw new ServiceException("未知的出入库类型");
}
}
// 更新单据状态为已撤销3
stockIo.setStatus(3);
// 更新单据状态为待审核1
stockIo.setStatus(1);
baseMapper.updateById(stockIo);
return true;
}
@@ -247,7 +246,7 @@ public class WmsStockIoServiceImpl implements IWmsStockIoService {
if (stockIo == null) {
throw new ServiceException("单据不存在");
}
// 状态流转验证
if (stockIo.getStatus() == 0 && status == 1) {
// 草稿 -> 已提交:需要检查是否有明细
@@ -262,7 +261,7 @@ public class WmsStockIoServiceImpl implements IWmsStockIoService {
} else {
throw new ServiceException("状态流转不允许");
}
stockIo.setStatus(status);
return baseMapper.updateById(stockIo) > 0;
}