完成打包收货的逻辑

This commit is contained in:
zhangke 2026-03-06 17:36:56 +08:00
parent 4a1909a745
commit b3c74d6a28
17 changed files with 708 additions and 136 deletions

View File

@ -10,10 +10,7 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil;
import com.nflg.wms.admin.pojo.dto.QCMaterialSyncDTO;
import com.nflg.wms.admin.pojo.dto.ZWM3A17DTO;
import com.nflg.wms.admin.pojo.dto.ZWM3A17Item1DTO;
import com.nflg.wms.admin.pojo.dto.ZWM3A17Item2DTO;
import com.nflg.wms.admin.pojo.dto.*;
import com.nflg.wms.admin.repository.SrmMaterialReceiptNoScanCodesRepository;
import com.nflg.wms.admin.repository.SrmMaterialReceiptScanCodesRepository;
import com.nflg.wms.admin.service.BasdeSerialNumberControllerService;
@ -118,6 +115,8 @@ public class NormalPGIController extends BaseController {
@Resource
private IWmsOutProduceTicketItemService outProduceTicketItemService;
@Resource
private IWmsWarehouseService wmsWarehouseService;
//收货单分页
/**
@ -287,7 +286,7 @@ public class NormalPGIController extends BaseController {
*/
@GetMapping("PDA/task")
@ApiMark(moduleName = "送货单管理", apiName = "普通物料上架任务")
public ApiResult<List<PoReceiveTaskVO>> takeDelivery(@RequestParam(required = false) String orederNo) {
public ApiResult<List<PoReceiveTaskVO>> getTakeDelivery(@RequestParam(required = false) String orederNo) {
List<WmsPoReceipt> wmsPoReceipts = wmsPoReceiptItemService.getTask(orederNo);
return ApiResult.success(wmsPoReceipts
.stream()
@ -501,6 +500,41 @@ public class NormalPGIController extends BaseController {
return sapSyncParamsDTOS;
}
/**
* 收货直接入库的未启用储位管理
*
* @return
*/
private void setPoReceiveByIn(SrmMaterialReceiptQO item,
List<WmsPoReceiptItem> wmsPoReceiptItems,
Long receiveId,
SAPSyncParamsDTO materialInfoInOrder,
Long receiveItemId
) {
WmsPoReceiptItem receiptItem = new WmsPoReceiptItem()
.setId(receiveItemId)
.setLineNumber(item.getLineNumber())
.setItemCode(item.getItemCode())
.setUomCode(materialInfoInOrder.getMeins())
.setCreateUserId(UserUtil.getUserId())
.setCreateUserName(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now())
.setReceiptNum(item.getReceiptNum())
.setReceivedWarehouse(materialInfoInOrder.getWarehouseNo())
.setStorageLocation("")
.setInQty(item.getReceiptNum())
.setNoteNum(item.getNoteNum())
.setItemName(materialInfoInOrder.getMaktx())
.setCrossQty(new BigDecimal(0))
.setPoLineNumber(item.getPoLineNumber())
.setPoNum(item.getPoNum())
.setReceiveId(receiveId)
.setOrderItemId(item.getId())
.setMaterialDoc("")
.setMaterialDocYear("");
wmsPoReceiptItems.add(receiptItem);
}
private void setPoReceive(SrmMaterialReceiptQO item,
List<WmsPoReceiptItem> wmsPoReceiptItems,
@ -1341,7 +1375,8 @@ public class NormalPGIController extends BaseController {
@ApiMark(moduleName = "打包扫码", apiName = "通过打包码获取到打包码的信息")
public ApiResult<List<PDAOrderItemVO>> getPackageContents(@Valid @RequestBody PackingPDASearchQO request) {
// 首先判断当前包是否已经收货了
PacageScanVO pacageScanVO = wmsPackageService.getPackageInfo(request.getPackageCode());
WmsPackage pacageScanVO = wmsPackageService.lambdaQuery().eq(WmsPackage::getPackageCode, request.getPackageCode())
.one();
VUtil.trueThrowBusinessError(ObjectUtil.isNull(pacageScanVO)).throwMessage("打包码不存在");
VUtil.trueThrowBusinessError(pacageScanVO.getPackageStatus() == 0).throwMessage("此打包码尚未打包");
VUtil.trueThrowBusinessError(pacageScanVO.getPackageStatus() == 2).throwMessage("此打包码已完成收货");
@ -1358,58 +1393,280 @@ public class NormalPGIController extends BaseController {
@PostMapping("takeDeliveryConfirmUnScan")
@ApiMark(moduleName = "无需扫码收货", apiName = "无需扫码收货")
public ApiResult<Void> takeDeliveryConfirmUnScan(@Valid @RequestBody PendingUnScanningQO request) {
// VUtil.trueThrowBusinessError(request.getBarcodeIds().stream().distinct().count() != request.getBarcodeIds().size()).throwMessage("存在重复的码");
// // 重新验证所有码的合法性 1是否是已打包未收货的状态2是否全部是已启用储位管理的状态
// List<PacageScanVO> pacageScanVO = wmsPackageService.getPackageInfos(request.getBarcodeIds());
// VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(pacageScanVO)).throwMessage("打包码不存在");
//
// long count = pacageScanVO.stream()
// .filter(pkg -> Objects.equals(pkg.getPackageStatus(), (short) 0))
// .count();
// VUtil.trueThrowBusinessError(count >= 0).throwMessage("存在尚未打包的码");
// long count1 = pacageScanVO.stream()
// .filter(pkg -> Objects.equals(pkg.getPackageStatus(), (short) 2))
// .count();
// VUtil.trueThrowBusinessError(count1 >= 0).throwMessage("存在已经收货的码");
//
// long count2 = pacageScanVO.stream()
// .filter(pkg -> Objects.equals(pkg.getIsCounting(), 1))
// .count();
// VUtil.trueThrowBusinessError(count2 >= 0).throwMessage("存在必须扫码的包装");
// List<PendingScanningItemDTO> items = wmsPackageService.getScanningItems(request.getBarcodeIds());
// //对箱码要做出来将箱码换成对应的物料码
// List<Long> materialCodes = items.stream().filter(item -> Objects.equals(item.getPackagingType(), 1))
// .map(item -> item.getBarcodeId())
// .distinct()
// .collect(Collectors.toList());
//// List<WmsQrCodeMaster> qrCodeMasters = wmsQrCodeMasterService.getByMaterialCodes(materialCodes);
//// if(CollectionUtil.isEmpty(materialCodes))
//// {
//// //计算箱内物料的数量并判断是否是打包状态
////
////
////
//// }
//
//
// //根据包装信息获取对应的物料收货信息
// List<SrmMaterialReceiptQO> receiptQOS = new ArrayList<>();
// //首先要对上面的信息 按照 srmId进行分组汇总quantity
//
// for (PendingScanningItemDTO item : items) {
// SrmMaterialReceiptQO qo = new SrmMaterialReceiptQO()
// .setNoteNum(item.getDeliveryNo())
// .setLineNumber(item.getDeliveryLineNo())
// .setPoNum(item.getPoNumber())
// .setPoLineNumber(item.getPoLineNumber())
// .setItemCode(item.getMaterialCode())
// .setId(item.getSrmId())
// .setReceiptNum(item.getQuantity());
//
// // .setScanCodes(item.getScanCodes());
// }
// 首先判断当前包是否已经收货了
WmsPackage pacageScanVO = wmsPackageService.lambdaQuery().eq(WmsPackage::getPackageCode, request.getPackageCode())
.one();
VUtil.trueThrowBusinessError(ObjectUtil.isNull(pacageScanVO)).throwMessage("打包码不存在");
VUtil.trueThrowBusinessError(pacageScanVO.getPackageStatus() == 0).throwMessage("此打包码尚未打包");
VUtil.trueThrowBusinessError(pacageScanVO.getPackageStatus() == 2).throwMessage("此打包码已完成收货");
List<PDAOrderItemVO> pdaOrderVO = normalPGIControllerService.getPackageContents(request.getPackageCode());
// 无码的时候要判断仓库只有所有仓库都是支持大码一键收货的情况
List<String> warehouseCodes = pdaOrderVO.stream().map(PDAOrderItemVO::getReceivedWarehouse).distinct().collect(Collectors.toList());
List<WmsWarehouse> warehouseList = wmsWarehouseService.lambdaQuery()
.in(WmsWarehouse::getNo, warehouseCodes)
.eq(WmsWarehouse::getBigBoxFastReceipt, false)
.list();
if (CollectionUtil.isNotEmpty(warehouseList)) {
List<String> warehouseNoList = warehouseList.stream().map(WmsWarehouse::getName).collect(Collectors.toList());
VUtil.trueThrowBusinessError(true).throwMessage("仓库[" + warehouseNoList.stream().collect(Collectors.joining(";")) + "]");
}
return ApiResult.success();
List<WmsPackageItemDetailDTO> dtos = wmsPackageService.getPackageItemDetails(request.getPackageCode());
//对中码进行一个操作
List<Long> parentIds = dtos.stream().filter(dto -> dto.getPackagingType() == 0)
.map(WmsPackageItemDetailDTO::getBarcodeId).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(parentIds)) {
List<WmsQrCodeMaster> childMasters = wmsQrCodeMasterService.lambdaQuery()
.in(WmsQrCodeMaster::getParentBarcodeId, parentIds).list();
childMasters.forEach(child -> {
WmsPackageItemDetailDTO dto = new WmsPackageItemDetailDTO();
dto.setBarcodeId(child.getId());
dto.setMaterialCode(child.getMaterialCode());
dto.setPackagingType(child.getPackagingType());
dto.setBatchNo(child.getBatchNo());
dto.setSerialNo(child.getSerialNo());
dto.setQuantity(child.getQuantity());
dto.setPackagingType(child.getPackagingType());
WmsPackageItemDetailDTO parentDto = dtos.stream()
.filter(dto1 -> dto1.getBarcodeId().equals(child.getParentBarcodeId())).findFirst().get();
dto.setSrmOrderItemId(parentDto.getSrmOrderItemId());
dto.setPackageItemId(parentDto.getPackageItemId());
dtos.add(dto);
});
}
List<SrmReceiptQO> receipts = new ArrayList<>();
//根据送货单号进行排序
List<String> orderNos = pdaOrderVO.stream().map(PDAOrderItemVO::getDeliveryNo).distinct().collect(Collectors.toList());
for (String orderNo : orderNos) {
SrmReceiptQO qo = new SrmReceiptQO();
qo.setDeliveryNo(orderNo);
//根据送货单号查找送货单的送货详情
List<PDAOrderItemVO> items = pdaOrderVO.stream().filter(item -> item.getDeliveryNo().equals(orderNo)).collect(Collectors.toList());
List<SrmMaterialReceiptQO> receiptQOS = new ArrayList<>();
for (PDAOrderItemVO item : items) {
SrmMaterialReceiptQO qoItem = new SrmMaterialReceiptQO()
.setId(item.getId())
.setNoteNum(item.getDeliveryNo())
.setLineNumber(item.getLineNumber())
.setPoNum(item.getPoNum())
.setPoLineNumber(item.getPoLineNumber())
.setItemCode(item.getItemCode())
.setReceivedWarehouse(item.getReceivedWarehouse())
.setUomCode(item.getUomCode())
.setReceiptNum(item.getDeliveryQty());
List<PDAScanCodeQO> scanCodes = new ArrayList<>();
List<WmsPackageItemDetailDTO> dtos1 = dtos.stream()
.filter(dto -> dto.getSrmOrderItemId().equals(item.getId())).collect(Collectors.toList());
for (WmsPackageItemDetailDTO dto : dtos1) {
PDAScanCodeQO scanCode = new PDAScanCodeQO();
scanCode.setCodeContent(dto.getBarcodeId().toString() + dto.getPackagingType().toString());
scanCode.setCodeNum(dto.getQuantity());
scanCode.setBatchNumber(dto.getBatchNo());
scanCode.setSerialNumbers(dto.getSerialNo());
scanCode.setCodeId(dto.getBarcodeCode());
scanCodes.add(scanCode);
}
qoItem.setScanCodes(scanCodes);
receiptQOS.add(qoItem);
}
qo.setReceiptQOS(receiptQOS);
}
//开始收货
GoodReceipt(receipts, pacageScanVO.getId());
return ApiResult.success();
}
private void GoodReceipt(List<SrmReceiptQO> receipts, Long packageId) {
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(receipts)).throwMessage("收货参数为空");
List<GoodReceiptDTO> dtos = new ArrayList<>();
for (SrmReceiptQO request : receipts) {
List<WmsPoReceiptItem> wmsPoReceiptItems = new ArrayList<>();
List<WmsQcReceiveItem> wmsQcReceiveItems = new ArrayList<>();
List<SrmMaterialReceiptScanCodes> srmMaterialReceiptScanCodes = new ArrayList<>();
List<QCMaterialSyncDTO> qcMaterialSyncDTOS = new ArrayList<>();
List<InventoryDTO> inventories = new ArrayList<>();
List<ZWM3A17DTO> zwm3A17DTOS = new ArrayList<>();
List<WmsQrCodeMaster> qrCodes = new ArrayList<>();
WmsSrmOrder order = wmsSrmOrderService.lambdaQuery().eq(WmsSrmOrder::getNoteNum, request.getDeliveryNo()).one();
VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("收货单不存在");
List<SAPSyncParamsDTO> sapSyncParamsDTOS = getSapSyncParamsDTOS(request.getReceiptQOS(), order);
WmsPoReceipt wmsPoReceipt = new WmsPoReceipt()
.setCreateTime(LocalDateTime.now())
.setId(IdUtil.getSnowflakeNextId())
.setOrderNo(order.getNoteNum())
.setCreateUserName(UserUtil.getUserName())
.setCreateUserId(UserUtil.getUserId())
.setFactoryCode(order.getIuCode())
.setSourceType(0)
.setIsCompleted(false);
WmsQcReceive wmsQcReceive = new WmsQcReceive()
.setCreateTime(LocalDateTime.now())
.setId(IdUtil.getSnowflakeNextId())
.setIsCompleted((short) 0)
.setOrderNo(order.getNoteNum())
.setCreateUserName(UserUtil.getUserName())
.setFactoryCode(order.getIuCode())
.setIsCheck(false)
.setSourceType(0)
.setCreateUserId(UserUtil.getUserId());
for (SrmMaterialReceiptQO item : request.getReceiptQOS()) {
if (item.getReceiptNum().equals(BigDecimal.ZERO)) {
continue;
}
SAPSyncParamsDTO materialInfoInOrder = sapSyncParamsDTOS.stream()
.filter(sapSyncParamsDTO ->
sapSyncParamsDTO.getEbeln().equals(item.getPoNum())
&& sapSyncParamsDTO.getEbelp().equals(item.getPoLineNumber()))
.findFirst()
.orElse(null);
//数量验证(判断收货数量是否大于了未收数量)
VUtil.trueThrowBusinessError(item.getReceiptNum().compareTo(materialInfoInOrder.getTransportNum()) > 0).throwMessage("物料收货数量[" + item.getReceiptNum() + "]大于了未收数量[" + materialInfoInOrder.getTransportNum() + "],订单号:" + item.getPoNum());
Long orderItemId = IdUtil.getSnowflakeNextId();
//序列号和批次号验证
List<SrmMaterialReceiptScanCodes> codes = normalPGIControllerService.validateScanCodes(item, materialInfoInOrder, orderItemId);
if (CollectionUtil.isNotEmpty(codes)) {
srmMaterialReceiptScanCodes.addAll(codes);
}
boolean isQuality = materialInfoInOrder.getKzkri().equals("X");
if (isQuality) {
setQcMaterialSyncDto(qcMaterialSyncDTOS, item, order, codes, materialInfoInOrder, wmsQcReceiveItems, wmsQcReceive.getId(), orderItemId);
for (PDAScanCodeQO code : item.getScanCodes()) {
// 处理条码
WmsQrCodeMaster qrCodeMaster = wmsQrCodeMasterService.lambdaQuery()
.eq(WmsQrCodeMaster::getBarcodeCode, code.getCodeId())
.one();
VUtil.trueThrowBusinessError(Objects.isNull(qrCodeMaster)).throwMessage("无效码【" + code.getCodeId() + "");
qrCodeMaster.setLastScanTime(LocalDateTime.now());
qrCodeMaster.setLastScanBy(UserUtil.getUserId());
qrCodeMaster.setLastScanByname(UserUtil.getUserName());
qrCodeMaster.setProcessStage(BarCodeProcessStage.Checking.getState());
qrCodeMaster.setReceiptItemId(orderItemId);
qrCodes.add(qrCodeMaster);
}
} else {
WmsWarehouse warehouse = wmsWarehouseService.lambdaQuery().eq(WmsWarehouse::getNo, item.getReceivedWarehouse()).one();
if (!warehouse.getIsDisableLocation()) {
//设置收货明细项
setPoReceiveByIn(item, wmsPoReceiptItems, wmsPoReceipt.getId(), materialInfoInOrder, orderItemId);
//设置SAP过账接口
ZWM3A17DTO zwm3A17DTO = zwm3A17DTOS.stream()
.filter(zwm3A17DTO1 -> zwm3A17DTO1.getEbeln().equals(item.getPoNum()))
.findFirst()
.orElse(null);
if (Objects.isNull(zwm3A17DTO)) {
zwm3A17DTO = new ZWM3A17DTO()
.setEbeln(item.getPoNum())
.setUsnam(UserUtil.getUserName())
.setReceiveId(orderItemId)
.setItem1(new ArrayList<>())
.setItem2(new ArrayList<>());
zwm3A17DTOS.add(zwm3A17DTO);
}
List<ZWM3A17Item1DTO> item1 = zwm3A17DTO.getItem1();
List<ZWM3A17Item2DTO> item2 = zwm3A17DTO.getItem2();
for (PDAScanCodeQO code : item.getScanCodes()) {
// 处理条码
WmsQrCodeMaster qrCodeMaster = wmsQrCodeMasterService.lambdaQuery()
.eq(WmsQrCodeMaster::getBarcodeCode, code.getCodeId())
.one();
VUtil.trueThrowBusinessError(Objects.isNull(qrCodeMaster)).throwMessage("无效码【" + code.getCodeId() + "");
qrCodeMaster.setLastScanTime(LocalDateTime.now());
qrCodeMaster.setLastScanBy(UserUtil.getUserId());
qrCodeMaster.setLastScanByname(UserUtil.getUserName());
qrCodeMaster.setProcessStage(BarCodeProcessStage.InBound.getState());
qrCodeMaster.setReceiptItemId(orderItemId);
qrCodes.add(qrCodeMaster);
if (qrCodeMaster.getPackagingType().equals(1)) {
continue;
}
// 库存
InventoryDTO inventoryDTO = inventories.stream()
.filter(inventoriesDTO -> inventoriesDTO.getMaterialNo().equals(item.getItemCode())
&& inventoriesDTO.getBatchNo().equals(code.getBatchNumber())
&& inventoriesDTO.getSerialNo().equals(code.getSerialNumbers())
&& inventoriesDTO.getFactoryNo().equals(wmsPoReceipt.getFactoryCode())
&& inventoriesDTO.getWarehouseNo().equals(item.getReceivedWarehouse())
).findFirst().orElse(null);
if (Objects.isNull(inventoryDTO)) {
inventoryDTO = new InventoryDTO()
.setMaterialNo(item.getItemCode())
.setFactoryNo(wmsPoReceipt.getFactoryCode())
.setWarehouseNo(item.getReceivedWarehouse())
.setBatchNo(code.getBatchNumber())
.setSerialNo(code.getSerialNumbers())
.setNum(code.getCodeNum());
inventories.add(inventoryDTO);
} else {
inventoryDTO.setNum(inventoryDTO.getNum().add(code.getCodeNum()));
}
ZWM3A17Item1DTO ietm1Dto = item1.stream()
.filter(dto1 ->
dto1.getEBELP().equals(item.getPoLineNumber())
&& dto1.getMATNR().equals(item.getItemCode())
&& dto1.getMeins().equals(item.getUomCode())
&& dto1.getCHARG().equals(code.getBatchNumber())
&& dto1.getWERKS().equals(wmsPoReceipt.getFactoryCode())
&& dto1.getLGORT().equals(item.getReceivedWarehouse())
).findFirst().orElse(null);
if (Objects.isNull(ietm1Dto)) {
item1.add(new ZWM3A17Item1DTO()
.setEBELP(item.getPoLineNumber())
.setMATNR(item.getItemCode())
.setERFMG(code.getCodeNum())
.setMEINS(item.getUomCode())
.setCHARG(code.getBatchNumber())
.setWERKS(wmsPoReceipt.getFactoryCode())
.setLGORT(item.getReceivedWarehouse())
.setKZKRI("")
);
} else {
ietm1Dto.setERFMG(ietm1Dto.getERFMG().add(code.getCodeNum()));
}
item2.add(new ZWM3A17Item2DTO()
.setEBELP(item.getPoLineNumber())
.setFLAG("")
.setSERNR(code.getSerialNumbers()));
}
//...................
} else {
setPoReceive(item, wmsPoReceiptItems, wmsPoReceipt.getId(), materialInfoInOrder, orderItemId);
for (PDAScanCodeQO code : item.getScanCodes()) {
// 处理条码
WmsQrCodeMaster qrCodeMaster = wmsQrCodeMasterService.lambdaQuery()
.eq(WmsQrCodeMaster::getBarcodeCode, code.getCodeId())
.one();
VUtil.trueThrowBusinessError(Objects.isNull(qrCodeMaster)).throwMessage("无效码【" + code.getCodeId() + "");
qrCodeMaster.setLastScanTime(LocalDateTime.now());
qrCodeMaster.setLastScanBy(UserUtil.getUserId());
qrCodeMaster.setLastScanByname(UserUtil.getUserName());
qrCodeMaster.setStorageLocation(materialInfoInOrder.getWarehouseNo());
qrCodeMaster.setProcessStage(BarCodeProcessStage.Received.getState());
qrCodeMaster.setReceiptItemId(orderItemId);
qrCodes.add(qrCodeMaster);
}
}
}
//=========
}
GoodReceiptDTO dto = new GoodReceiptDTO()
.setWmsPoReceipt(wmsPoReceipt)
.setWmsQcReceive(wmsQcReceive)
.setWmsPoReceiptItems(wmsPoReceiptItems)
.setWmsQcReceiveItems(wmsQcReceiveItems)
.setSrmMaterialReceiptScanCodes(srmMaterialReceiptScanCodes)
.setOrderId(order.getId())
.setInventories(inventories)
.setZwm3A17DTOS(zwm3A17DTOS)
.setQrCodes(qrCodes)
.setQcMaterialSyncDTOS(qcMaterialSyncDTOS);
dtos.add(dto);
}
normalPGIControllerService.takeDeliveryByPackage(dtos, packageId);
}
/**
@ -1419,7 +1676,29 @@ return ApiResult.success();
*/
@PostMapping("takeDeliveryConfirmByScan")
@ApiMark(moduleName = "需扫码收货", apiName = "需扫码收货")
public ApiResult<Void> takeDeliveryConfirmByScan(@Valid @RequestBody List<PendingScanningQO> request) {
public ApiResult<Void> takeDeliveryConfirmByScan(@Valid @RequestBody GoodReceiptQO request) {
// 首先判断当前包是否已经收货了
WmsPackage pacageScanVO = wmsPackageService.lambdaQuery().eq(WmsPackage::getPackageCode, request.getPackageCode())
.one();
VUtil.trueThrowBusinessError(ObjectUtil.isNull(pacageScanVO)).throwMessage("打包码不存在");
VUtil.trueThrowBusinessError(pacageScanVO.getPackageStatus() == 0).throwMessage("此打包码尚未打包");
VUtil.trueThrowBusinessError(pacageScanVO.getPackageStatus() == 2).throwMessage("此打包码已完成收货");
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(request.getItems())).throwMessage("没有收货的物料信息");
List<SrmReceiptQO> receipts = new ArrayList<>();
List<String> orderNos = request.getItems().stream().map(it -> it.getNoteNum()).distinct().toList();
for (String orderNo : orderNos) {
SrmReceiptQO receipt = new SrmReceiptQO();
receipt.setDeliveryNo(orderNo);
List<SrmMaterialReceiptQO> items = request.getItems().stream().filter(it -> it.getNoteNum().equals(orderNo)).toList();
for (SrmMaterialReceiptQO item : items) {
// 盘点是否有条码
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(item.getScanCodes())).throwMessage("[" + item.getItemCode() + "]没有码信息");
}
receipt.setReceiptQOS(items);
receipts.add(receipt);
}
GoodReceipt(receipts, pacageScanVO.getId());
return ApiResult.success();
}
}

View File

@ -310,7 +310,7 @@ public class QrCodeMasterController extends BaseController {
// 查询子条形码并累加其数量
List<WmsQrCodeMaster> qrCodeMasters = qrCodeMasterService.lambdaQuery()
.eq(WmsQrCodeMaster::getParentBarcodeId, qrCodeMaster.getId())
.eq(WmsQrCodeMaster::getProcessStage, request.getProcessStage())
.in(WmsQrCodeMaster::getProcessStage, request.getProcessStage())
.list();
VUtil.trueThrowBusinessError(ObjectUtil.isNull(qrCodeMasters))
.throwMessage("此箱[" + request.getPackageCode() + "]为空箱");

View File

@ -0,0 +1,63 @@
package com.nflg.wms.admin.pojo.dto;
import com.nflg.wms.common.pojo.document.SrmMaterialReceiptScanCodes;
import com.nflg.wms.common.pojo.dto.InventoryDTO;
import com.nflg.wms.repository.entity.*;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
public class GoodReceiptDTO {
/**
* 采购收货单 单头
*/
private WmsPoReceipt wmsPoReceipt;
/**
* 质检收货单 单头
*/
private WmsQcReceive wmsQcReceive;
/**
* 采购收货单 单行
*/
private List<WmsPoReceiptItem> wmsPoReceiptItems;
/**
* 质检收货单 单行
*/
private List<WmsQcReceiveItem> wmsQcReceiveItems;
/**
* 扫描码
*/
private List<SrmMaterialReceiptScanCodes> srmMaterialReceiptScanCodes;
/**
* 质检同步数据到SAP
*/
private List<QCMaterialSyncDTO> qcMaterialSyncDTOS;
/**
* 采购单ID
*/
private Long orderId;
/**
* 库存数据
*/
private List<InventoryDTO> inventories;
/**
*同步库存到SAP的数据
*/
private List<ZWM3A17DTO> zwm3A17DTOS;
/**
* 条码数据
*/
private List<WmsQrCodeMaster> qrCodes;
}

View File

@ -20,6 +20,11 @@ public class ZWM3A17DTO {
*/
private String usnam;
/**
* 收货单ID
*/
private Long receiveId;
private List<ZWM3A17Item1DTO> item1 = new ArrayList<>();
private List<ZWM3A17Item2DTO> item2 = new ArrayList<>();

View File

@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Pair;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.nflg.wms.admin.pojo.dto.GoodReceiptDTO;
import com.nflg.wms.admin.pojo.dto.QCMaterialSyncDTO;
import com.nflg.wms.admin.pojo.dto.ZWM3A17DTO;
import com.nflg.wms.admin.repository.SrmMaterialReceiptNoScanCodesRepository;
@ -104,6 +105,12 @@ public class NormalPGIControllerService {
@Resource
private IWmsPackageService wmsPackageService;
@Resource
private IWmsQrCodeMasterService qrCodeMasterService;
@Resource
private IWmsPackageItemService wmsPackageItemService;
/**
* 根据订单编号获取订单详情信息包括订单头信息和订单行项目信息
* <p>
@ -544,61 +551,78 @@ public class NormalPGIControllerService {
}
public List<PDAOrderItemVO> getPackageContents(@NotNull @NotBlank String packageCode) {
// List<PackagePOItemDTO> packagePOItems = wmsPackageService.getPackagePOItems(packageCode);
// VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(packagePOItems)).throwMessage("获取打包物料信息异常");
//
//
// // 根据订单编号查询订单主表信息
// WmsSrmOrder order = wmsSrmOrderService.lambdaQuery().eq(WmsSrmOrder::getNoteNum, orderNo)
// .eq(WmsSrmOrder::getIsCompleted, false).one();
// VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("此收货单[" + orderNo + "] 单号无效");
//
// PDAOrderVO pdaOrderVO = new PDAOrderVO();
// // 设置订单头基本信息
// pdaOrderVO.setNoteNum(order.getNoteNum());
// pdaOrderVO.setSupplierNum(order.getSupplierNum());
// pdaOrderVO.setSupplierName(order.getSupplierName());
//
// // 查询订单行项目列表
// List<WmsSrmOrderItem> orderItemList = wmsSrmOrderItemService.lambdaQuery()
// .eq(WmsSrmOrderItem::getOrderId, order.getId())
// .list();
// VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(orderItemList)).throwMessage("此收货单[" + orderNo + "] 已完成收货,无需再次操作");
//
// List<PDAOrderItemVO> orderItemVOList = new ArrayList<>();
// // 遍历订单行项目填充详细信息并从 SAP 获取补充数据
// for (WmsSrmOrderItem item : orderItemList) {
// PDAOrderItemVO itemVO = new PDAOrderItemVO();
// itemVO.setId(item.getId());
// itemVO.setPoLineNumber(item.getPoLineNumber());
// itemVO.setPoNum(item.getPoNum());
// itemVO.setItemCode(item.getItemCode());
// itemVO.setItemName(item.getItemName());
// itemVO.setIsQuality(item.getIsQuality());
// itemVO.setOrderQty(item.getOrderQty());
// itemVO.setUomCode(item.getUomCode());
// itemVO.setLineNumber(item.getLineNumber());
// itemVO.setDeliveryQty(item.getDeliveryQty().subtract(item.getReceiptQty()));
// // SAP 系统获取物料相关信息
// SAPSyncParamsDTO syncParamsDTO = sapCommonService.getMaterialInfoInOrder(item.getPoNum(),
// order.getSupplierNum(), item.getItemCode(), item.getPoLineNumber());
// if (Objects.nonNull(syncParamsDTO)) {
// itemVO.setItemName(syncParamsDTO.getMaktx());
// itemVO.setUomCode(syncParamsDTO.getMeins());
// itemVO.setOrderQty(syncParamsDTO.getMenge());
// itemVO.setReceivedWarehouse(syncParamsDTO.getWarehouseNo());
// itemVO.setBinNos(syncParamsDTO.getBinNos());
// itemVO.setLbprt(syncParamsDTO.getLbprt());
// itemVO.setTransportNum(syncParamsDTO.getTransportNum());
// // 判断是否质检
// boolean isQuality = "X".equals(syncParamsDTO.getKzkri());
// itemVO.setIsQuality(isQuality);
// orderItemVOList.add(itemVO);
// }
// }
// // 设置订单行项目列表到返回对象中
// pdaOrderVO.setOrderItemVOList(orderItemVOList);
// return pdaOrderVO;
return null;
List<PackagePOItemDTO> packagePOItems = wmsPackageService.getPackagePOItems(packageCode);
VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(packagePOItems)).throwMessage("此大包中的物料已完成收货");
List<PDAOrderItemVO> orderItemVOList = new ArrayList<>();
// 遍历订单行项目填充详细信息并从 SAP 获取补充数据
for (PackagePOItemDTO item : packagePOItems) {
PDAOrderItemVO itemVO = new PDAOrderItemVO();
itemVO.setId(item.getSrmOrderId());
itemVO.setPoLineNumber(item.getPoLineNumber());
itemVO.setPoNum(item.getPoNumber());
itemVO.setItemCode(item.getMaterialCode());
itemVO.setItemName(item.getMaterialDescription());
itemVO.setOrderQty(item.getOrderQty());
// itemVO.setUomCode(item.getUomCode());
itemVO.setLineNumber(item.getDeliveryLineNo());
itemVO.setDeliveryQty(item.getPackingQuantity());
itemVO.setDeliveryNo(item.getDeliveryNo());
// SAP 系统获取物料相关信息
SAPSyncParamsDTO syncParamsDTO = sapCommonService.getMaterialInfoInOrder(item.getPoNumber(),
item.getSupplierCode(), item.getMaterialCode(), item.getPoLineNumber());
if (Objects.nonNull(syncParamsDTO)) {
itemVO.setItemName(syncParamsDTO.getMaktx());
itemVO.setUomCode(syncParamsDTO.getMeins());
itemVO.setOrderQty(syncParamsDTO.getMenge());
itemVO.setReceivedWarehouse(syncParamsDTO.getWarehouseNo());
itemVO.setBinNos(syncParamsDTO.getBinNos());
itemVO.setLbprt(syncParamsDTO.getLbprt());
itemVO.setTransportNum(syncParamsDTO.getTransportNum());
// 判断是否质检
boolean isQuality = "X".equals(syncParamsDTO.getKzkri());
itemVO.setIsQuality(isQuality);
orderItemVOList.add(itemVO);
}
}
return orderItemVOList;
}
@Transactional
public void takeDeliveryByPackage(List<GoodReceiptDTO> dtos, Long packageId) {
for (GoodReceiptDTO dto : dtos) {
//收货
takeDelivery(dto.getWmsPoReceipt(), dto.getWmsQcReceive(), dto.getWmsPoReceiptItems(), dto.getWmsQcReceiveItems()
, dto.getSrmMaterialReceiptScanCodes(), dto.getQcMaterialSyncDTOS(), dto.getOrderId()
);
//入库
if (CollectionUtil.isNotEmpty(dto.getInventories())) {
inventoryService.in(dto.getInventories());
}
//过账SAP
if (CollectionUtil.isNotEmpty(dto.getZwm3A17DTOS())) {
for (ZWM3A17DTO zwm3A17DTO : dto.getZwm3A17DTOS()) {
Pair<Pair<String, String>, Pair<String, String>> returnDto = sapService.zwm3a17(zwm3A17DTO);
wmsPoReceiptItemService.lambdaUpdate()
.eq(WmsPoReceiptItem::getPoNum, zwm3A17DTO.getEbeln())
.eq(WmsPoReceiptItem::getReceiveId, zwm3A17DTO.getReceiveId())
.set(WmsPoReceiptItem::getMaterialDoc, returnDto.getKey().getKey())
.set(WmsPoReceiptItem::getMaterialDocYear, returnDto.getValue().getValue())
.update();
}
}
//编码管理
if (CollectionUtil.isNotEmpty(dto.getQrCodes())) {
qrCodeMasterService.updateBarCode(dto.getQrCodes());
// 修改包装项的收货状态
if (Objects.nonNull(packageId) && packageId > 0) {
List<String> codeIds = dto.getQrCodes().stream().map(WmsQrCodeMaster::getBarcodeCode).toList();
wmsPackageItemService.lambdaUpdate()
.eq(WmsPackageItem::getPackageId, packageId)
.in(WmsPackageItem::getBarcodeCode, codeIds)
.set(WmsPackageItem::getPackageStatus, (short) 2);
}
}
}
}
}

View File

@ -12,11 +12,12 @@ public enum BarCodeProcessStage {
Packaged((short) 1, "已装箱"),
UnLoaded((short) 2, "未打包"),
Loaded((short) 3, "已打包"),
Received ((short) 4, "已收货"),
Received((short) 4, "已收货"),
Checking((short) 5, "质检中"),
InBound((short) 6, "已入库"),
OutBound((short) 7, "已出库"), //已被使用只有退库的时候才会被重新激活
Hold((short) 8, "已挂起");// 用于仓库转储出库之后此二维码还需要继续使用用一个特殊的状态标记
Hold((short) 8, "已挂起"),
Checked((short) 9, "质检已完成"); // 用于仓库转储出库之后此二维码还需要继续使用用一个特殊的状态标记
private final short state;
private final String description;

View File

@ -10,6 +10,22 @@ import java.time.LocalDateTime;
@Data
@Accessors(chain = true)
public class PackagePOItemDTO {
/**
* 包码
*/
private String packageCode;
/**
* 送货单项ID
*/
private Long srmOrderId;
/**
* 供应商编号
*/
private String supplierCode;
/**
* 物料编号
*/
@ -37,13 +53,19 @@ public class PackagePOItemDTO {
private String poNumber;
/**
* 仓库
* 采购单行号
*/
private String storageLocation;
private String poLineNumber;
/**
* 送货单单号
*/
private String deliveryNo;
/**
* 送货单行号
*/
private String deliveryLineNo;
}

View File

@ -0,0 +1,56 @@
package com.nflg.wms.common.pojo.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
@Data
@Accessors(chain = true)
public class WmsPackageItemDetailDTO {
/* *
* 条码ID
*/
private Long barcodeId;
/**
* 包装项ID
*/
private Long packageItemId;
/**
* 条码编号
*/
private String barcodeCode;
/**
* 订单项ID
*/
private Long srmOrderItemId;
/**
* 条码编号
*/
/**
* 物料编号
*/
private String materialCode;
/**
* 包装类型 0 为箱子1 为物料码
*/
private Short packagingType;
/**
* 批次编号
*/
private String batchNo;
/**
* 序列编号
*/
private String serialNo;
/**
* 数量
*/
private BigDecimal quantity;
}

View File

@ -0,0 +1,21 @@
package com.nflg.wms.common.pojo.qo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
public class GoodReceiptQO {
/**
* 打包码编号
*/
private String packageCode;
/**
* 扫码记录
*/
private List<SrmMaterialReceiptQO> items;
}

View File

@ -28,4 +28,8 @@ public class PendingScanningQO {
*/
private BigDecimal pendingScanQuantity;
/**
* 仓库编号
*/
private String warehouseCode;
}

View File

@ -18,7 +18,7 @@ public class SrmMaterialReceiptQO {
/**
* 送货单行ID
*/
private Long id;
private Long id;
/**
* 订单编号
@ -52,11 +52,19 @@ public class SrmMaterialReceiptQO {
@NotNull
private BigDecimal receiptNum;
/**
* 收货仓库
*/
private String receivedWarehouse;
/**
* 扫码记录
*/
private List<PDAScanCodeQO> scanCodes;
/**
* 物料单位
*/
private String uomCode;
}

View File

@ -0,0 +1,22 @@
package com.nflg.wms.common.pojo.qo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.ArrayList;
import java.util.List;
@Data
@Accessors(chain = true)
public class SrmReceiptQO {
/**
* 送货单号
*/
private String deliveryNo;
/**
* 收货明细
*/
private List<SrmMaterialReceiptQO> receiptQOS;
}

View File

@ -1,8 +1,11 @@
package com.nflg.wms.common.pojo.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.nflg.wms.common.pojo.qo.PDAScanCodeQO;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class PDAOrderItemVO {
@ -78,4 +81,9 @@ public class PDAOrderItemVO {
*/
private BigDecimal transportNum;
/**
* 送货单单号
*/
private String deliveryNo;
}

View File

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.PackagePOItemDTO;
import com.nflg.wms.common.pojo.dto.PendingScanningItemDTO;
import com.nflg.wms.common.pojo.dto.WmsPackageItemDetailDTO;
import com.nflg.wms.common.pojo.qo.PackingQO;
import com.nflg.wms.common.pojo.qo.PackingSearchQO;
import com.nflg.wms.common.pojo.vo.*;
@ -42,4 +43,6 @@ public interface WmsPackageMapper extends BaseMapper<WmsPackage> {
List<PendingScanningItemDTO> getScanningItems(List<Long> barcodeIds);
List<PackagePOItemDTO> getPackagePOItems(String packageCode);
List<WmsPackageItemDetailDTO> getPackageItemDetails(String packageCode);
}

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.PackagePOItemDTO;
import com.nflg.wms.common.pojo.dto.PendingScanningItemDTO;
import com.nflg.wms.common.pojo.dto.WmsPackageItemDetailDTO;
import com.nflg.wms.common.pojo.qo.PackingQO;
import com.nflg.wms.common.pojo.qo.PackingSearchQO;
import com.nflg.wms.common.pojo.vo.*;
@ -51,4 +52,6 @@ public interface IWmsPackageService extends IService<WmsPackage> {
List<PendingScanningItemDTO> getScanningItems(List<Long> barcodeIds);
List<PackagePOItemDTO> getPackagePOItems(@NotNull @NotBlank String packageCode);
List<WmsPackageItemDetailDTO> getPackageItemDetails(String packageCode);
}

View File

@ -8,6 +8,7 @@ import com.nflg.wms.common.constant.BarCodeProcessStage;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.PackagePOItemDTO;
import com.nflg.wms.common.pojo.dto.PendingScanningItemDTO;
import com.nflg.wms.common.pojo.dto.WmsPackageItemDetailDTO;
import com.nflg.wms.common.pojo.qo.PackingQO;
import com.nflg.wms.common.pojo.qo.PackingSearchQO;
import com.nflg.wms.common.pojo.vo.*;
@ -143,5 +144,10 @@ public class WmsPackageServiceImpl extends ServiceImpl<WmsPackageMapper, WmsPack
return baseMapper.getPackagePOItems(packageCode);
}
@Override
public List<WmsPackageItemDetailDTO> getPackageItemDetails(String packageCode) {
return baseMapper.getPackageItemDetails(packageCode);
}
}

View File

@ -178,20 +178,67 @@
</select>
<select id="getPackagePOItems" resultType="com.nflg.wms.common.pojo.dto.PackagePOItemDTO">
select
c.material_code,
c.material_description,
e.delivery_qty-e.receipt_qty as order_qty,
case when c.packaging_type = 0 then c.po_number else d.po_number end as po_number,
case when c.packaging_type = 0 then c.delivery_no else d.delivery_no end as delivery_no,
case when c.packaging_type = 0 then c.quantity else sum(d.quantity) end as packing_quantity
from wms_package a left join wms_package_item b on a.id=b.package_id
left join wms_qr_code_master c on b.barcode_code = c.barcode_code
left join wms_qr_code_master d on c.id = d.parent_barcode_id
left join wms_srm_order_item e on b.srm_order_item_id=e.id
where a.package_code=#{packageCode}
group by c.material_code,
c.material_description,
e.delivery_qty,e.receipt_qty,c.packaging_type,c.po_number,d.po_number,c.delivery_no,d.delivery_no,c.quantity
select a.material_code,
a.material_description,
a.order_qty,
a.po_number,
a.delivery_no,
a.delivery_line_no,
a.po_line_number,
a.srm_order_item_id,
a.package_code,
a.supplier_code,
sum(a.packing_quantity) as packing_quantity
from (select f.supplier_code,
a.package_code,
b.srm_order_item_id,
c.material_code,
c.material_description,
e.delivery_qty - e.receipt_qty as order_qty,
case when c.packaging_type = 0 then c.po_number else d.po_number end as po_number,
case
when c.packaging_type = 0 then c.po_line_number
else d.po_line_number end as po_line_number,
case
when c.packaging_type = 0 then c.delivery_line_no
else d.delivery_line_no end as delivery_line_no,
case when c.packaging_type = 0 then c.delivery_no else d.delivery_no end as delivery_no,
case
when c.packaging_type = 0 then c.quantity
else sum(d.quantity) end as packing_quantity
from wms_package a
inner join wms_package_item b on a.id = b.package_id
left join wms_qr_code_master c on b.barcode_code = c.barcode_code
left join wms_qr_code_master d on c.id = d.parent_barcode_id and d.process_stage = 1
left join wms_srm_order_item e on b.srm_order_item_id = e.id
left join user_supplier f on a.supplier_id = f."id"
where a.package_code = #{packageCode} and b.package_status = 0
group by c.material_code,
c.material_description,
e.delivery_qty, e.receipt_qty, c.packaging_type, c.po_number, d.po_number, c.delivery_no,
d.delivery_no, c.delivery_line_no, d.delivery_line_no, c.po_line_number, d.po_line_number,
b.srm_order_item_id, a.package_code,
f.supplier_code, c.quantity) a
GROUP BY a.material_code,
a.material_description, a.order_qty, a.po_number, a.delivery_no, a.delivery_line_no, a.po_line_number,
a.srm_order_item_id, a.package_code,
a.supplier_code
</select>
<select id="getPackageItemDetails" resultType="com.nflg.wms.common.pojo.dto.WmsPackageItemDetailDTO">
select b.id as barcodeId,
a.id as package_item_id,
a.srm_order_item_id,
a.barcode_code,
b.material_code,
b.packaging_type,
b.batch_no,
b.serial_no,
b.quantity
from wms_package_item a
inner join wms_package c on a.package_id = c.id
inner join wms_qr_code_master b on a.barcode_code = b.barcode_code
where a.package_status = 0
and c.package_code = #{packageCode}
</select>
</mapper>