feat(transfer): 添加调拨单审批功能和调拨类型字段

- 在WmsTransferOrder实体中添加调拨类型、审批人、审批时间和审批状态字段
- 在WmsMaterialCoil实体中添加调拨类型字段用于关联调拨信息
- 实现调拨单审批接口,支持通过或驳回操作
- 更新调拨单明细处理逻辑,确保调拨类型正确传递到钢卷信息
- 添加调拨单取消功能,可恢复调拨前的状态
- 在导出VO中增加调拨类型字段支持Excel导出
- 更新查询条件支持按调拨类型、审批状态等字段筛选
- 完善调拨流程中的数据验证和错误处理机制
This commit is contained in:
2026-04-10 09:24:42 +08:00
parent 255a6dc616
commit c8987f6fdd
15 changed files with 224 additions and 33 deletions

View File

@@ -6,6 +6,7 @@ import com.klp.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.utils.StringUtils;
import com.klp.domain.*;
import com.klp.domain.bo.WmsMaterialCoilBo;
import com.klp.domain.vo.WmsMaterialCoilVo;
@@ -40,6 +41,7 @@ public class WmsTransferOrderItemServiceImpl implements IWmsTransferOrderItemSer
private final IWmsMaterialCoilService coilService;
private final IWmsWarehouseService warehouseService;
private final WmsWarehouseMapper warehouseMapper;
private final WmsTransferOrderMapper wmsTransferOrderMapper;
/**
* 查询调拨单明细
@@ -509,50 +511,70 @@ public class WmsTransferOrderItemServiceImpl implements IWmsTransferOrderItemSer
Long orderItemId = bo.getOrderItemId();
Long coilId = bo.getCoilId();
Long itemId = bo.getItemIdAfter();
String itemType = bo.getMaterialTypeAfter() != null ? (bo.getMaterialTypeAfter() == 1 ? "raw_material" : "product") : null;
Long warehouseId = bo.getWarehouseIdAfter();
if (coilId == null) {
throw new IllegalArgumentException("coilId不能为空");
}
// 查询钢卷
WmsMaterialCoil coil = coilMapper.selectById(coilId);
if (coil == null) {
throw new IllegalArgumentException("钢卷不存在");
}
// 如果传了才修改钢卷
if (itemId != null) {
coil.setItemId(itemId);
}
if (itemType != null) {
coil.setItemType(itemType);
coil.setMaterialType(bo.getMaterialTypeAfter() == 1 ? "原料" : "成品");
}
if (warehouseId != null) {
coil.setWarehouseId(warehouseId);
}
coilMapper.updateById(coil);
// 查询调拨明细
LambdaQueryWrapper<WmsTransferOrderItem> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(true, WmsTransferOrderItem::getCoilId, coilId);
wrapper.eq(orderItemId != null, WmsTransferOrderItem::getOrderItemId, orderItemId);
wrapper.eq(transferId != null, WmsTransferOrderItem::getTransferId, transferId);
WmsTransferOrderItem item = baseMapper.selectOne(wrapper);
if (item != null) {
// 如果没传itemIdAfter则用itemIdBefore的值
item.setItemIdAfter(itemId != null ? itemId : item.getItemIdBefore());
// 如果没传materialTypeAfter则用materialTypeBefore的值
if (bo.getMaterialTypeAfter() != null) {
item.setMaterialTypeAfter(bo.getMaterialTypeAfter());
} else {
item.setMaterialTypeAfter(item.getMaterialTypeBefore());
}
// 如果没传warehouseIdAfter则用warehouseIdBefore的值
item.setWarehouseIdAfter(warehouseId != null ? warehouseId : item.getWarehouseIdBefore());
baseMapper.updateById(item);
if (item == null) {
throw new IllegalArgumentException("调拨明细不存在");
}
// 确定最终值:如果没传则使用改之前的值
Long finalItemId = itemId != null ? itemId : item.getItemIdBefore();
Long finalMaterialType = bo.getMaterialTypeAfter() != null ? bo.getMaterialTypeAfter() : item.getMaterialTypeBefore();
Long finalWarehouseId = warehouseId != null ? warehouseId : item.getWarehouseIdBefore();
String finalItemType = finalMaterialType == 1 ? "raw_material" : "product";
// 先校验itemId是否存在根据itemType
if (finalItemId != null && StringUtils.isNotBlank(finalItemType)) {
if ("raw_material".equals(finalItemType)) {
WmsRawMaterial rawMaterial = rawMaterialMapper.selectById(finalItemId);
if (rawMaterial == null) {
throw new RuntimeException("原材料不存在ID: " + finalItemId);
}
} else {
WmsProduct product = productMapper.selectById(finalItemId);
if (product == null) {
throw new RuntimeException("产品不存在ID: " + finalItemId);
}
}
}
// 更新调拨明细
item.setItemIdAfter(finalItemId);
item.setMaterialTypeAfter(finalMaterialType);
item.setWarehouseIdAfter(finalWarehouseId);
baseMapper.updateById(item);
// 更新钢卷信息
coil.setItemId(finalItemId);
coil.setItemType(finalItemType);
coil.setMaterialType(finalMaterialType == 1 ? "原料" : "成品");
coil.setWarehouseId(finalWarehouseId);
// 设置调拨类型
if (item.getTransferId() != null) {
WmsTransferOrder wmsTransferOrder = wmsTransferOrderMapper.selectById(item.getTransferId());
if (wmsTransferOrder != null) {
coil.setTransferType(wmsTransferOrder.getTransferType());
}
}
coilMapper.updateById(coil);
return true;
}
@@ -562,26 +584,43 @@ public class WmsTransferOrderItemServiceImpl implements IWmsTransferOrderItemSer
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean cancelTransfer(Long orderItemId) {
// 查询调拨明细
WmsTransferOrderItem item = baseMapper.selectById(orderItemId);
if (item == null) {
throw new IllegalArgumentException("明细记录不存在");
}
Long coilId = item.getCoilId();
if (coilId == null) {
throw new IllegalArgumentException("钢卷ID不能为空");
}
// 查询钢卷
WmsMaterialCoil coil = coilMapper.selectById(coilId);
if (coil == null) {
throw new IllegalArgumentException("钢卷不存在");
}
// 恢复到调拨前的状态
Long originalItemId = item.getItemIdBefore();
Long originalMaterialType = item.getMaterialTypeBefore();
Long originalWarehouseId = item.getWarehouseIdBefore();
WmsMaterialCoil coil = coilMapper.selectById(coilId);
if (coil != null) {
if (originalItemId != null && originalMaterialType != null) {
coil.setItemId(originalItemId);
coil.setItemType(originalMaterialType == 1 ? "raw_material" : "product");
coil.setMaterialType(originalMaterialType == 1 ? "原料" : "成品");
coil.setWarehouseId(originalWarehouseId);
coilMapper.updateById(coil);
}
if (originalWarehouseId != null) {
coil.setWarehouseId(originalWarehouseId);
}
// 清空调拨类型
coil.setTransferType(null);
coilMapper.updateById(coil);
// 逻辑删除调拨明细记录使用MyBatis-Plus的逻辑删除
baseMapper.deleteById(orderItemId);
return true;
}
}