Files
klp-oa/klp-wms/src/main/java/com/klp/service/impl/WmsTransferOrderItemServiceImpl.java
Joshi 57b07885e3 refactor(wms): 优化调拨订单和钢卷信息更新逻辑
- 使用LambdaUpdateWrapper替代直接对象更新,支持显式设置NULL值
- 在审批通过时设置调拨状态为1
- 修复钢卷信息批量更新逻辑,使用updateBatchById提高性能
- 添加调拨后物料ID和类型校验,确保数据一致性
- 批量更新调拨明细的isTransferred字段标记为已调拨
- 过滤条件从调拨前值改为调拨后值进行验证
- 添加空值检查避免无效更新操作
2026-04-10 15:07:29 +08:00

648 lines
28 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.klp.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.klp.common.core.page.TableDataInfo;
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.conditions.update.LambdaUpdateWrapper;
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;
import com.klp.mapper.*;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.domain.bo.WmsTransferOrderItemBo;
import com.klp.domain.vo.WmsTransferOrderItemVo;
import com.klp.service.IWmsTransferOrderItemService;
import com.klp.service.IWmsMaterialCoilService;
import com.klp.service.IWmsWarehouseService;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
/**
* 调拨单明细Service业务层处理
*
* @author klp
* @date 2026-03-27
*/
@RequiredArgsConstructor
@Service
public class WmsTransferOrderItemServiceImpl implements IWmsTransferOrderItemService {
private final WmsTransferOrderItemMapper baseMapper;
private final WmsRawMaterialMapper rawMaterialMapper;
private final WmsProductMapper productMapper;
private final WmsMaterialCoilMapper coilMapper;
private final IWmsMaterialCoilService coilService;
private final IWmsWarehouseService warehouseService;
private final WmsWarehouseMapper warehouseMapper;
private final WmsTransferOrderMapper wmsTransferOrderMapper;
/**
* 查询调拨单明细
*/
@Override
public WmsTransferOrderItemVo queryById(Long itemId){
WmsTransferOrderItemVo vo = baseMapper.selectVoById(itemId);
if (vo != null) {
fillDetailInfo(vo);
}
return vo;
}
/**
* 查询调拨单明细列表
*/
@Override
public TableDataInfo<WmsTransferOrderItemVo> queryPageList(WmsTransferOrderItemBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<WmsTransferOrderItem> lqw = buildQueryWrapper(bo);
Page<WmsTransferOrderItemVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
List<WmsTransferOrderItemVo> records = result.getRecords();
fillBatchInfo(records);
return TableDataInfo.build(result);
}
/**
* 查询调拨单明细列表
*/
@Override
public List<WmsTransferOrderItemVo> queryList(WmsTransferOrderItemBo bo) {
LambdaQueryWrapper<WmsTransferOrderItem> lqw = buildQueryWrapper(bo);
List<WmsTransferOrderItemVo> list = baseMapper.selectVoList(lqw);
fillBatchInfo(list);
return list;
}
private void fillBatchInfo(List<WmsTransferOrderItemVo> list) {
if (list == null || list.isEmpty()) {
return;
}
// 收集所有需要的ID
List<Long> coilIds = list.stream()
.map(WmsTransferOrderItemVo::getCoilId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
// 收集改之前物料ID
List<Long> itemIdsBefore = list.stream()
.map(WmsTransferOrderItemVo::getItemIdBefore)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
// 2. 收集改之后物料ID
List<Long> itemIdsAfter = list.stream()
.map(WmsTransferOrderItemVo::getItemIdAfter)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
// 3. 收集改前仓库ID
List<Long> warehouseIdsBefore = list.stream()
.map(WmsTransferOrderItemVo::getWarehouseIdBefore)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
// 4. 收集改后仓库ID
List<Long> warehouseIdsAfter = list.stream()
.map(WmsTransferOrderItemVo::getWarehouseIdAfter)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
// 5. 合并所有仓库ID和物料ID逻辑完全一致
List<Long> warehouseIds = new ArrayList<>();
warehouseIds.addAll(warehouseIdsBefore);
warehouseIds.addAll(warehouseIdsAfter);
// 批量查询钢卷
Map<Long, WmsMaterialCoilVo> coilMap = new HashMap<>();
if (!coilIds.isEmpty()) {
String coilIdsStr = String.join(",", coilIds.stream().map(String::valueOf).collect(Collectors.toList()));
WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo();
coilBo.setCoilIds(coilIdsStr);
List<WmsMaterialCoilVo> coilList = coilService.queryList(coilBo);
coilMap = coilList.stream().collect(Collectors.toMap(WmsMaterialCoilVo::getCoilId, v -> v, (a, b) -> a));
}
// 批量查询原料
List<Long> allItemIds = new ArrayList<>(itemIdsBefore);
allItemIds.addAll(itemIdsAfter);
List<Long> rawMaterialIds = allItemIds.stream().distinct().collect(Collectors.toList());
Map<Long, WmsRawMaterial> rawMaterialMap = new HashMap<>();
if (!rawMaterialIds.isEmpty()) {
List<WmsRawMaterial> rawMaterials = rawMaterialMapper.selectBatchIds(rawMaterialIds);
rawMaterialMap = rawMaterials.stream().collect(Collectors.toMap(WmsRawMaterial::getRawMaterialId, v -> v, (a, b) -> a));
}
// 批量查询产品
List<Long> productIds = allItemIds.stream().distinct().collect(Collectors.toList());
Map<Long, WmsProduct> productMap = new HashMap<>();
if (!productIds.isEmpty()) {
List<WmsProduct> products = productMapper.selectBatchIds(productIds);
productMap = products.stream().collect(Collectors.toMap(WmsProduct::getProductId, v -> v, (a, b) -> a));
}
Map<Long, String> warehouseNameMap = new HashMap<>();
if (!warehouseIds.isEmpty()) {
// 批量查
List<WmsWarehouse> warehouseList = warehouseMapper.selectBatchIds(warehouseIds);
warehouseNameMap = warehouseList.stream()
.collect(Collectors.toMap(
WmsWarehouse::getWarehouseId,
WmsWarehouse::getWarehouseName,
(a, b) -> a
));
}
// 填充数据
for (WmsTransferOrderItemVo vo : list) {
// 钢卷信息
WmsMaterialCoilVo coilVo = coilMap.get(vo.getCoilId());
if (coilVo != null) {
vo.setCoil(coilVo);
}
// 改之前物料信息
fillMaterialInfoByMap(vo, vo.getItemIdBefore(), vo.getMaterialTypeBefore(), "Before", rawMaterialMap, productMap);
// 改之后物料信息
fillMaterialInfoByMap(vo, vo.getItemIdAfter(), vo.getMaterialTypeAfter(), "After", rawMaterialMap, productMap);
// 库区名称
vo.setWarehouseNameBefore(warehouseNameMap.get(vo.getWarehouseIdBefore()));
vo.setWarehouseNameAfter(warehouseNameMap.get(vo.getWarehouseIdAfter()));
// 物料类型名称
vo.setMaterialTypeBeforeName(vo.getMaterialTypeBefore() != null ? (vo.getMaterialTypeBefore() == 1 ? "原料" : "成品") : null);
vo.setMaterialTypeAfterName(vo.getMaterialTypeAfter() != null ? (vo.getMaterialTypeAfter() == 1 ? "原料" : "成品") : null);
}
}
private void fillMaterialInfoByMap(WmsTransferOrderItemVo vo, Long itemId, Long materialType, String suffix,
Map<Long, WmsRawMaterial> rawMaterialMap, Map<Long, WmsProduct> productMap) {
if (itemId == null || materialType == null) {
return;
}
if (materialType == 1) {
WmsRawMaterial raw = rawMaterialMap.get(itemId);
if (raw != null) {
if ("Before".equals(suffix)) {
vo.setMaterialNameBefore(raw.getRawMaterialName());
vo.setSpecificationBefore(raw.getSpecification());
vo.setMaterialBefore(raw.getMaterial());
vo.setSurfaceTreatmentBefore(raw.getSurfaceTreatmentDesc());
vo.setManufacturerBefore(raw.getManufacturer());
vo.setZincLayerBefore(raw.getZincLayer());
} else if ("After".equals(suffix)) {
vo.setMaterialNameAfter(raw.getRawMaterialName());
vo.setSpecificationAfter(raw.getSpecification());
vo.setMaterialAfter(raw.getMaterial());
vo.setSurfaceTreatmentAfter(raw.getSurfaceTreatmentDesc());
vo.setManufacturerAfter(raw.getManufacturer());
vo.setZincLayerAfter(raw.getZincLayer());
}
}
} else if (materialType == 2) {
WmsProduct product = productMap.get(itemId);
if (product != null) {
if ("Before".equals(suffix)) {
vo.setMaterialNameBefore(product.getProductName());
vo.setSpecificationBefore(product.getSpecification());
vo.setMaterialBefore(product.getMaterial());
vo.setSurfaceTreatmentBefore(product.getSurfaceTreatmentDesc());
vo.setManufacturerBefore(product.getManufacturer());
vo.setZincLayerBefore(product.getZincLayer());
} else if ("After".equals(suffix)) {
vo.setMaterialNameAfter(product.getProductName());
vo.setSpecificationAfter(product.getSpecification());
vo.setMaterialAfter(product.getMaterial());
vo.setSurfaceTreatmentAfter(product.getSurfaceTreatmentDesc());
vo.setManufacturerAfter(product.getManufacturer());
vo.setZincLayerAfter(product.getZincLayer());
}
}
}
}
private void fillDetailInfo(WmsTransferOrderItemVo vo) {
// 填充改之前物料信息
fillMaterialInfoBefore(vo, vo.getItemIdBefore(), vo.getMaterialTypeBefore(), "Before");
// 填充改之后物料信息
fillMaterialInfoAfter(vo, vo.getItemIdAfter(), vo.getMaterialTypeAfter(), "After");
// 填充库区名称
if (vo.getWarehouseIdBefore() != null) {
try {
vo.setWarehouseNameBefore(warehouseService.queryById(vo.getWarehouseIdBefore()).getWarehouseName());
} catch (Exception e) {
// 忽略
}
}
if (vo.getWarehouseIdAfter() != null) {
try {
vo.setWarehouseNameAfter(warehouseService.queryById(vo.getWarehouseIdAfter()).getWarehouseName());
} catch (Exception e) {
// 忽略
}
}
// 填充物料类型名称
vo.setMaterialTypeBeforeName(vo.getMaterialTypeBefore() != null ? (vo.getMaterialTypeBefore() == 1 ? "原料" : "成品") : null);
vo.setMaterialTypeAfterName(vo.getMaterialTypeAfter() != null ? (vo.getMaterialTypeAfter() == 1 ? "原料" : "成品") : null);
}
private void fillMaterialInfoAfter(WmsTransferOrderItemVo vo, Long itemIdAfter, Long materialTypeAfter, String after) {
if (itemIdAfter == null || materialTypeAfter == null) {
return;
}
if (materialTypeAfter == 1) {
WmsRawMaterial raw = rawMaterialMapper.selectById(itemIdAfter);
if (raw != null) {
vo.setMaterialNameAfter(raw.getRawMaterialName());
vo.setSpecificationAfter(raw.getSpecification());
vo.setMaterialAfter(raw.getMaterial());
vo.setSurfaceTreatmentAfter(raw.getSurfaceTreatmentDesc());
vo.setManufacturerAfter(raw.getManufacturer());
vo.setZincLayerAfter(raw.getZincLayer());
}
} else if (materialTypeAfter == 2) {
WmsProduct product = productMapper.selectById(itemIdAfter);
if (product != null) {
vo.setMaterialNameAfter(product.getProductName());
vo.setSpecificationAfter(product.getSpecification());
vo.setMaterialAfter(product.getMaterial());
vo.setSurfaceTreatmentAfter(product.getSurfaceTreatmentDesc());
vo.setManufacturerAfter(product.getManufacturer());
vo.setZincLayerAfter(product.getZincLayer());
}
}
}
private void fillMaterialInfoBefore(WmsTransferOrderItemVo vo, Long itemId, Long materialType, String suffix) {
if (itemId == null || materialType == null) {
return;
}
if (materialType == 1) {
WmsRawMaterial raw = rawMaterialMapper.selectById(itemId);
if (raw != null) {
vo.setMaterialNameBefore(raw.getRawMaterialName());
vo.setSpecificationBefore(raw.getSpecification());
vo.setMaterialBefore(raw.getMaterial());
vo.setSurfaceTreatmentBefore(raw.getSurfaceTreatmentDesc());
vo.setManufacturerBefore(raw.getManufacturer());
vo.setZincLayerBefore(raw.getZincLayer());
}
} else if (materialType == 2) {
WmsProduct product = productMapper.selectById(itemId);
if (product != null) {
vo.setMaterialNameBefore(product.getProductName());
vo.setSpecificationBefore(product.getSpecification());
vo.setMaterialBefore(product.getMaterial());
vo.setSurfaceTreatmentBefore(product.getSurfaceTreatmentDesc());
vo.setManufacturerBefore(product.getManufacturer());
vo.setZincLayerBefore(product.getZincLayer());
}
}
}
private LambdaQueryWrapper<WmsTransferOrderItem> buildQueryWrapper(WmsTransferOrderItemBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<WmsTransferOrderItem> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getTransferId() != null, WmsTransferOrderItem::getTransferId, bo.getTransferId());
lqw.eq(bo.getCoilId() != null, WmsTransferOrderItem::getCoilId, bo.getCoilId());
lqw.eq(bo.getItemIdBefore() != null, WmsTransferOrderItem::getItemIdBefore, bo.getItemIdBefore());
lqw.eq(bo.getItemIdAfter() != null, WmsTransferOrderItem::getItemIdAfter, bo.getItemIdAfter());
lqw.eq(bo.getMaterialTypeBefore() != null, WmsTransferOrderItem::getMaterialTypeBefore, bo.getMaterialTypeBefore());
lqw.eq(bo.getMaterialTypeAfter() != null, WmsTransferOrderItem::getMaterialTypeAfter, bo.getMaterialTypeAfter());
lqw.eq(bo.getWarehouseIdBefore() != null, WmsTransferOrderItem::getWarehouseIdBefore, bo.getWarehouseIdBefore());
lqw.eq(bo.getWarehouseIdAfter() != null, WmsTransferOrderItem::getWarehouseIdAfter, bo.getWarehouseIdAfter());
lqw.eq(bo.getIsTransferred() != null, WmsTransferOrderItem::getIsTransferred, bo.getIsTransferred());
return lqw;
}
/**
* 新增调拨单明细
*/
@Override
public Boolean insertByBo(WmsTransferOrderItemBo bo) {
WmsTransferOrderItem add = BeanUtil.toBean(bo, WmsTransferOrderItem.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setOrderItemId(add.getOrderItemId());
}
return flag;
}
/**
* 修改调拨单明细
*/
@Override
public Boolean updateByBo(WmsTransferOrderItemBo bo) {
WmsTransferOrderItem update = BeanUtil.toBean(bo, WmsTransferOrderItem.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(WmsTransferOrderItem entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除调拨单明细
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 根据itemId和itemType匹配或新增物料
* itemType: raw_material-原料, product-成品
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Long matchOrCreateMaterial(Long itemId, String itemType) {
if (Objects.equals(itemType, "raw_material")) {
return matchOrCreateFromRawMaterial(itemId);
} else if (Objects.equals(itemType, "product")) {
return matchOrCreateFromProduct(itemId);
}
throw new IllegalArgumentException("无效的itemType: " + itemType);
}
private Long matchOrCreateFromRawMaterial(Long itemId) {
WmsRawMaterial rawMaterial = rawMaterialMapper.selectById(itemId);
if (rawMaterial == null) {
throw new IllegalArgumentException("原料不存在: " + itemId);
}
LambdaQueryWrapper<WmsProduct> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(WmsProduct::getProductName, rawMaterial.getRawMaterialName())
.eq(WmsProduct::getSpecification, rawMaterial.getSpecification())
.eq(WmsProduct::getManufacturer, rawMaterial.getManufacturer())
.eq(WmsProduct::getMaterial, rawMaterial.getMaterial())
.eq(WmsProduct::getSurfaceTreatmentDesc, rawMaterial.getSurfaceTreatmentDesc())
.eq(WmsProduct::getZincLayer, rawMaterial.getZincLayer())
.last("LIMIT 1");
WmsProduct existProduct = productMapper.selectOne(wrapper);
if (existProduct != null) {
return existProduct.getProductId();
}
WmsProduct newProduct = new WmsProduct();
newProduct.setProductName(rawMaterial.getRawMaterialName());
newProduct.setSpecification(rawMaterial.getSpecification());
newProduct.setManufacturer(rawMaterial.getManufacturer());
newProduct.setMaterial(rawMaterial.getMaterial());
newProduct.setSurfaceTreatmentDesc(rawMaterial.getSurfaceTreatmentDesc());
newProduct.setZincLayer(rawMaterial.getZincLayer());
newProduct.setDelFlag(0);
productMapper.insert(newProduct);
return newProduct.getProductId();
}
private Long matchOrCreateFromProduct(Long itemId) {
WmsProduct product = productMapper.selectById(itemId);
if (product == null) {
throw new IllegalArgumentException("产品不存在: " + itemId);
}
LambdaQueryWrapper<WmsRawMaterial> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(WmsRawMaterial::getRawMaterialName, product.getProductName())
.eq(WmsRawMaterial::getSpecification, product.getSpecification())
.eq(WmsRawMaterial::getManufacturer, product.getManufacturer())
.eq(WmsRawMaterial::getMaterial, product.getMaterial())
.eq(WmsRawMaterial::getSurfaceTreatmentDesc, product.getSurfaceTreatmentDesc())
.eq(WmsRawMaterial::getZincLayer, product.getZincLayer())
.last("LIMIT 1");
WmsRawMaterial existRawMaterial = rawMaterialMapper.selectOne(wrapper);
if (existRawMaterial != null) {
return existRawMaterial.getRawMaterialId();
}
WmsRawMaterial newRawMaterial = new WmsRawMaterial();
newRawMaterial.setRawMaterialName(product.getProductName());
newRawMaterial.setSpecification(product.getSpecification());
newRawMaterial.setManufacturer(product.getManufacturer());
newRawMaterial.setMaterial(product.getMaterial());
newRawMaterial.setSurfaceTreatmentDesc(product.getSurfaceTreatmentDesc());
newRawMaterial.setZincLayer(product.getZincLayer());
newRawMaterial.setDelFlag(0);
rawMaterialMapper.insert(newRawMaterial);
return newRawMaterial.getRawMaterialId();
}
/**
* 批量新增调拨单明细
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean batchInsert(WmsTransferOrderItemBo bo) {
Long transferId = bo.getTransferId();
List<Long> coilIds = bo.getCoilIds();
if (transferId == null || coilIds == null || coilIds.isEmpty()) {
throw new IllegalArgumentException("transferId和coilIds不能为空");
}
// 检查同一调拨单下是否已存在相同的coilId
LambdaQueryWrapper<WmsTransferOrderItem> existWrapper = new LambdaQueryWrapper<>();
existWrapper.eq(WmsTransferOrderItem::getTransferId, transferId)
.in(WmsTransferOrderItem::getCoilId, coilIds);
List<WmsTransferOrderItem> existItems = baseMapper.selectList(existWrapper);
if (!existItems.isEmpty()) {
List<Long> existCoilIds = existItems.stream()
.map(WmsTransferOrderItem::getCoilId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
List<WmsMaterialCoil> wmsMaterialCoils = coilMapper.selectBatchIds(existCoilIds);
throw new IllegalArgumentException("当前钢卷号" + wmsMaterialCoils.stream().map(WmsMaterialCoil::getCurrentCoilNo).collect(Collectors.joining(",")) + " 已在该调拨单中存在");
}
List<WmsMaterialCoil> coils = coilMapper.selectBatchIds(coilIds);
if (coils.isEmpty()) {
throw new IllegalArgumentException("钢卷不存在");
}
List<WmsTransferOrderItem> items = new ArrayList<>();
for (WmsMaterialCoil coil : coils) {
WmsTransferOrderItem item = new WmsTransferOrderItem();
item.setTransferId(transferId);
item.setCoilId(coil.getCoilId());
item.setItemIdBefore(coil.getItemId());
// 根据 itemType 设置 materialType: raw_material -> 1, product -> 2
if ("raw_material".equals(coil.getItemType())) {
item.setMaterialTypeBefore(1L);
} else if ("product".equals(coil.getItemType())) {
item.setMaterialTypeBefore(2L);
}
item.setWarehouseIdBefore(coil.getWarehouseId());
items.add(item);
}
return baseMapper.insertBatch(items);
}
/**
* 确认调拨
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean confirmTransfer(WmsTransferOrderItemBo bo) {
Long transferId = bo.getTransferId();
Long orderItemId = bo.getOrderItemId();
Long coilId = bo.getCoilId();
Long itemId = bo.getItemIdAfter();
Long warehouseId = bo.getWarehouseIdAfter();
if (coilId == null) {
throw new IllegalArgumentException("coilId不能为空");
}
// 查询钢卷
WmsMaterialCoil coil = coilMapper.selectById(coilId);
if (coil == null) {
throw new IllegalArgumentException("钢卷不存在");
}
// 查询调拨明细
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) {
throw new IllegalArgumentException("调拨明细不存在");
}
// 校验调拨单审批状态
if (item.getTransferId() != null) {
WmsTransferOrder wmsTransferOrder = wmsTransferOrderMapper.selectById(item.getTransferId());
if (wmsTransferOrder == null) {
throw new IllegalArgumentException("调拨单不存在");
}
// 审批状态: 0-待审批 1-已通过 2-已驳回
if (wmsTransferOrder.getApproveStatus() == null || wmsTransferOrder.getApproveStatus() != 2) {
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);
item.setIsTransferred(1); // 标记为已调拨
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;
}
/**
* 取消调拨
*/
@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();
// 使用 UpdateWrapper 显式更新字段包括NULL值
LambdaUpdateWrapper<WmsMaterialCoil> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(WmsMaterialCoil::getCoilId, coilId);
// 设置需要更新的字段
if (originalItemId != null && originalMaterialType != null) {
updateWrapper.set(WmsMaterialCoil::getItemId, originalItemId);
updateWrapper.set(WmsMaterialCoil::getItemType, originalMaterialType == 1 ? "raw_material" : "product");
updateWrapper.set(WmsMaterialCoil::getMaterialType, originalMaterialType == 1 ? "原料" : "成品");
}
if (originalWarehouseId != null) {
updateWrapper.set(WmsMaterialCoil::getWarehouseId, originalWarehouseId);
}
// 清空调拨类型显式设置为NULL
updateWrapper.set(WmsMaterialCoil::getTransferType, null);
coilMapper.update(null, updateWrapper);
// 逻辑删除调拨明细记录使用MyBatis-Plus的逻辑删除
baseMapper.deleteById(orderItemId);
return true;
}
}