Files
klp-oa/klp-wms/src/main/java/com/klp/service/impl/WmsTransferOrderItemServiceImpl.java
砂糖 be75c1a4b8 feat(wms): add transfer remark field and re-label function
1. 新增调拨备注字段transferRemark到调拨单itemBO
2. 新增执行后重贴标签的复选框和备注输入框
3. 调整调拨确认时传递调拨备注参数
4. 注释调旧的调拨类型获取逻辑,改用传入的调拨备注作为调拨类型
2026-05-22 16:19:24 +08:00

765 lines
33 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.baomidou.mybatisplus.extension.toolkit.Db;
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);
}
return matchOrCreateFromRawMaterial(rawMaterial);
}
private Long matchOrCreateFromRawMaterial(WmsRawMaterial rawMaterial) {
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);
}
return matchOrCreateFromProduct(product);
}
private Long matchOrCreateFromProduct(WmsProduct product) {
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());
// }
// }
if (bo.getTransferRemark() != null) {
coil.setTransferType(bo.getTransferRemark());
}
coilMapper.updateById(coil);
return true;
}
/**
* 批量确认调拨
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean batchConfirmTransfer(List<WmsTransferOrderItemBo> boList) {
if (boList == null || boList.isEmpty()) {
throw new IllegalArgumentException("调拨明细列表不能为空");
}
for (WmsTransferOrderItemBo bo : boList) {
confirmTransfer(bo);
}
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;
}
/**
* 批量修改调拨单明细(仅修改有值的字段)
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void batchUpdateItems(List<WmsTransferOrderItemBo> list) {
List<WmsTransferOrderItem> entityList = list.stream().map(bo -> {
WmsTransferOrderItem entity = new WmsTransferOrderItem();
entity.setOrderItemId(bo.getOrderItemId());
if (bo.getItemIdAfter() != null) {
entity.setItemIdAfter(bo.getItemIdAfter());
}
if (bo.getMaterialTypeAfter() != null) {
entity.setMaterialTypeAfter(bo.getMaterialTypeAfter());
}
if (bo.getWarehouseIdAfter() != null) {
entity.setWarehouseIdAfter(bo.getWarehouseIdAfter());
}
return entity;
}).collect(Collectors.toList());
baseMapper.updateBatchById(entityList, entityList.size());
}
/**
* 根据钢卷列表匹配或创建物料
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Map<Long, Long> matchOrCreateItemByCoilIds(List<WmsTransferOrderItemBo> pairs) {
List<Long> coilIds = pairs.stream().map(WmsTransferOrderItemBo::getCoilId).collect(Collectors.toList());
List<WmsMaterialCoil> coils = coilMapper.selectBatchIds(coilIds);
Map<Long, WmsMaterialCoil> coilMap = coils.stream().collect(Collectors.toMap(WmsMaterialCoil::getCoilId, v -> v, (a, b) -> a));
List<Long> needConvertRaw = new ArrayList<>();
List<Long> needConvertProd = new ArrayList<>();
for (WmsTransferOrderItemBo pair : pairs) {
WmsMaterialCoil coil = coilMap.get(pair.getCoilId());
if (coil == null || Objects.equals(coil.getItemType(), pair.getItemTypeAfter())) {
continue;
}
if ("raw_material".equals(coil.getItemType())) {
needConvertRaw.add(coil.getItemId());
} else {
needConvertProd.add(coil.getItemId());
}
}
Map<Long, WmsRawMaterial> rawMaterialMap = needConvertRaw.isEmpty() ? Collections.emptyMap()
: rawMaterialMapper.selectBatchIds(needConvertRaw).stream().collect(Collectors.toMap(WmsRawMaterial::getRawMaterialId, v -> v, (a, b) -> a));
Map<Long, WmsProduct> productMap = needConvertProd.isEmpty() ? Collections.emptyMap()
: productMapper.selectBatchIds(needConvertProd).stream().collect(Collectors.toMap(WmsProduct::getProductId, v -> v, (a, b) -> a));
Map<Long, Long> result = new HashMap<>();
Map<Long, Long> conversionCache = new HashMap<>();
for (WmsTransferOrderItemBo pair : pairs) {
Long coilId = pair.getCoilId();
String itemTypeAfter = pair.getItemTypeAfter();
WmsMaterialCoil coil = coilMap.get(coilId);
if (coil == null) {
throw new IllegalArgumentException("钢卷不存在: " + coilId);
}
Long itemId;
if (Objects.equals(coil.getItemType(), itemTypeAfter)) {
itemId = coil.getItemId();
} else {
Long cached = conversionCache.get(coil.getItemId());
if (cached != null) {
itemId = cached;
} else {
Long srcItemId = coil.getItemId();
if ("raw_material".equals(coil.getItemType())) {
WmsRawMaterial raw = rawMaterialMap.get(srcItemId);
if (raw == null) throw new IllegalArgumentException("原料不存在: " + srcItemId);
itemId = matchOrCreateFromRawMaterial(raw);
} else {
WmsProduct prod = productMap.get(srcItemId);
if (prod == null) throw new IllegalArgumentException("产品不存在: " + srcItemId);
itemId = matchOrCreateFromProduct(prod);
}
conversionCache.put(srcItemId, itemId);
}
}
result.put(coilId, itemId);
}
return result;
}
}