新增无码出库-配件发货功能

This commit is contained in:
yf001217 2026-06-01 10:01:28 +08:00
parent bc93e904fe
commit 332f6ec2af
1 changed files with 133 additions and 0 deletions

View File

@ -7,9 +7,13 @@ import cn.hutool.core.lang.Pair;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.nflg.wms.admin.pojo.request.NoScanningItemDataRequest;
import com.nflg.wms.admin.pojo.request.NoScanningItemRequest;
import com.nflg.wms.admin.pojo.request.NoScanningRequest;
import com.nflg.wms.admin.repository.InventoryForOutRepository;
import com.nflg.wms.admin.repository.OutMaterialScanRecordRespository;
import com.nflg.wms.admin.service.ComponentOutboundControllerService;
import com.nflg.wms.admin.service.NoScanningBaseControllerService;
import com.nflg.wms.admin.service.SapService;
import com.nflg.wms.common.constant.BarCodeProcessStage;
import com.nflg.wms.common.pojo.ApiResult;
@ -37,6 +41,7 @@ import java.time.Instant;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@ -85,6 +90,9 @@ public class ComponentOutboundController extends BaseController {
@Resource
private IOptRecordService optRecordService;
@Resource
private NoScanningBaseControllerService noScanningBaseControllerService;
/**
* 零部件的出库单列表
* @param request 零部件出库单搜索条件参数对象包含分页信息和搜索条件
@ -394,6 +402,103 @@ public class ComponentOutboundController extends BaseController {
return ApiResult.success();
}
/**
* 无码确认出库单
* @param request 无码确认出库参数
*/
@Transactional
@PostMapping("pda/confirmNoScanning")
public ApiResult<Void> confirmPdaNoScanning(@Valid @RequestBody NoScanningRequest request) {
WmsComponentPacking packing = wmscomponentPackingService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(packing)).throwMessage("此装箱单不存在");
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(request.getItems())).throwMessage("无发货详情信息");
List<WmsComponentPackingItem> packingItems = wmsComponentPackingItemService.lambdaQuery()
.eq(WmsComponentPackingItem::getPackingId, packing.getId())
.list();
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(packingItems)).throwMessage("无法找到有效的装箱单详情");
Map<Long, WmsComponentPackingItem> packingItemMap = packingItems.stream()
.collect(Collectors.toMap(WmsComponentPackingItem::getId, item -> item));
WmsComponentOutbound outbound = setWmsComponentOutbound(packing).setFinish(true);
List<WmsComponentOutboundItem> outboundItems = new ArrayList<>();
List<InventoryOutDTO> inventories = new ArrayList<>();
List<OutMaterialScanRecord> records = new ArrayList<>();
ZWM3A20DTO zwm3a20DTO = new ZWM3A20DTO()
.setItSernrPatch(new ArrayList<>())
.setItem(new ArrayList<>())
.setItSernr(new ArrayList<>())
.setItLipsItem(new ArrayList<>())
.setIType("A")
.setIvDelivery(packing.getVbelv());
for (NoScanningItemRequest item : request.getItems()) {
WmsComponentPackingItem packingItem = packingItemMap.get(item.getOrderItemId());
VUtil.trueThrowBusinessError(Objects.isNull(packingItem)).throwMessage("无效的装箱单明细");
VUtil.trueThrowBusinessError(!StrUtil.equals(item.getMaterialNo(), packingItem.getIdnrk()))
.throwMessage("装箱单明细与物料不匹配:" + item.getMaterialNo());
VUtil.trueThrowBusinessError(noScanningBaseControllerService.existsQrCode(packingItem.getIdnrk()))
.throwMessage("物料" + packingItem.getIdnrk() + "已生成二维码,不允许无码出库");
WmsComponentOutboundItem outboundItem = setWmsComponentOutboundItem(packing, packingItem, outbound, request.getWarehouseNo());
outboundItems.add(outboundItem);
BigDecimal totalNum = item.getDatas().stream()
.peek(data -> VUtil.trueThrowBusinessError(Objects.isNull(data.getNum()) || data.getNum().compareTo(BigDecimal.ZERO) <= 0)
.throwMessage("物料" + packingItem.getIdnrk() + "的无码出库数量必须大于0"))
.map(NoScanningItemDataRequest::getNum)
.reduce(BigDecimal.ZERO, BigDecimal::add);
VUtil.trueThrowBusinessError(outboundItem.getOutQty().compareTo(totalNum) != 0)
.throwMessage("物料[" + outboundItem.getIdnrk() + "]的出库数量[" + totalNum + "]不等于装箱数量[" + outboundItem.getOutQty() + "]");
List<ScanCodeQO> scanCodesGroup = new ArrayList<>();
for (NoScanningItemDataRequest data : item.getDatas()) {
String batchNo = StrUtil.blankToDefault(data.getBatchNo(), "");
String serialNo = StrUtil.blankToDefault(data.getSerialNo(), "");
String binNo = StrUtil.blankToDefault(data.getBinNo(), "");
records.add(new OutMaterialScanRecord()
.setSource(7)
.setSourceId(packing.getId())
.setSourceItemId(outboundItem.getPackingItemId())
.setTicketId(outbound.getId())
.setTicketItemId(outboundItem.getId())
.setMaterialNo(outboundItem.getIdnrk())
.setContent("")
.setBatchNo(batchNo)
.setSerialNo(serialNo)
.setUniqNo("")
.setQiTao(true)
.setFactoryNo(packing.getFactoryNo())
.setWarehouseNo(outboundItem.getLgort())
.setBinNo(binNo)
.setNum(data.getNum())
.setCreateBy(UserUtil.getUserName())
.setCreateTime(Instant.now())
);
setInventoryOutDTO(inventories, outboundItem.getIdnrk(), packing.getFactoryNo(),
outboundItem.getLgort(), binNo, batchNo, serialNo, data.getNum());
ScanCodeQO codeItem = scanCodesGroup.stream()
.filter(code -> StrUtil.equals(code.getBatchNumber(), batchNo)
&& StrUtil.equals(code.getSerialNumbers(), serialNo))
.findFirst()
.orElse(null);
if (Objects.isNull(codeItem)) {
scanCodesGroup.add(new ScanCodeQO()
.setBatchNumber(batchNo)
.setSerialNumbers(serialNo)
.setCodeNum(data.getNum()));
} else {
codeItem.setCodeNum(codeItem.getCodeNum().add(data.getNum()));
}
}
buildZwm3a20DTO(zwm3a20DTO, scanCodesGroup, outboundItem);
}
componentOutboundControllerService.confirmPda(outbound, outboundItems, records, zwm3a20DTO, inventories);
return ApiResult.success();
}
/**
* 审核出库单
*/
@ -642,6 +747,34 @@ public class ComponentOutboundController extends BaseController {
return outboundItem;
}
private WmsComponentOutboundItem setWmsComponentOutboundItem(WmsComponentPacking packing,
WmsComponentPackingItem packingItem,
WmsComponentOutbound outbound,
String warehouseNo
) {
return new WmsComponentOutboundItem()
.setId(IdUtil.getSnowflakeNextId())
.setPackingItemId(packingItem.getId())
.setItemIndex(packingItem.getItemIndex())
.setVbeln(packing.getVbeln())
.setPosnr(packingItem.getPosnr())
.setIdnrk(packingItem.getIdnrk())
.setOjtxb(packingItem.getOjtxb())
.setMeins(packingItem.getMeins())
.setMenge(packingItem.getMenge())
.setAtwrt(packingItem.getAtwrt())
.setZatwrt(packingItem.getZatwrt())
.setZxiah(packingItem.getZxiah())
.setZtext(packingItem.getZtext())
.setPotx2(packingItem.getPotx2())
.setPmenge(packingItem.getPmenge())
.setLgpbe(packingItem.getLgpbe())
.setLgort(StrUtil.blankToDefault(warehouseNo, packingItem.getLgort()))
.setLgobe(packingItem.getLgobe())
.setOutQty(packingItem.getMenge())
.setOutboundId(outbound.getId());
}
/*
组装库存信息
*/