调整打包收货的逻辑

This commit is contained in:
zhangke 2026-03-06 08:37:02 +08:00
parent a4f3dff2e1
commit 4a1909a745
15 changed files with 250 additions and 55 deletions

View File

@ -1274,7 +1274,8 @@ public class NormalPGIController extends BaseController {
* @param request
* @return
*/
@PostMapping("scanPackage")
@Deprecated
@PostMapping("scanPackage1")
@ApiMark(moduleName = "打包扫码", apiName = "通过打包码获取到打包码的信息")
public ApiResult<PacageScanVO> scanPackage(@Valid @RequestBody PackingPDASearchQO request) {
// 首先判断当前包是否已经收货了
@ -1291,6 +1292,7 @@ public class NormalPGIController extends BaseController {
* @param request
* @return
*/
@Deprecated
@PostMapping("getPackageOrders")
@ApiMark(moduleName = "获取打包码对应的送货单信息", apiName = "获取打包码对应的送货单信息")
public ApiResult<List<PacagePoVO>> getPackageOrders(@Valid @RequestBody FilterIdQO request) {
@ -1302,6 +1304,7 @@ public class NormalPGIController extends BaseController {
* @param request
* @return
*/
@Deprecated
@PostMapping("getPackageOrderItems")
@ApiMark(moduleName = "根据送货单单号和大码的ID获取到具体的物料信息", apiName = "根据送货单单号和大码的ID获取到具体的物料信息")
public ApiResult<List<PacagePoItemVO>> getPackageOrderItems(@Valid @RequestBody PackagePoSearchQO request) {
@ -1313,6 +1316,7 @@ public class NormalPGIController extends BaseController {
* @param request id= 大码的ID
* @return
*/
@Deprecated
@PostMapping("getPendingScanningItems")
@ApiMark(moduleName = "根据送货单单号和大码的ID获取到具体的物料信息", apiName = "根据送货单单号和大码的ID获取到具体的物料信息")
public ApiResult<List<PendingScanningVO>> getPendingScanningItems(@Valid @RequestBody FilterIdQO request) {
@ -1327,63 +1331,92 @@ public class NormalPGIController extends BaseController {
return ApiResult.success(list);
}
/**
* 通过打包码获取到物料信息
* @param request
* @return
*/
@PostMapping("scanPackage")
@ApiMark(moduleName = "打包扫码", apiName = "通过打包码获取到打包码的信息")
public ApiResult<List<PDAOrderItemVO>> getPackageContents(@Valid @RequestBody PackingPDASearchQO request) {
// 首先判断当前包是否已经收货了
PacageScanVO pacageScanVO = wmsPackageService.getPackageInfo(request.getPackageCode());
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());
return ApiResult.success(pdaOrderVO);
}
/**
* 确认收货(无需扫码)
* @param request
* @return
*/
@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))
// {
// //计算箱内物料的数量并判断是否是打包状态
// 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());
// }
//根据包装信息获取对应的物料收货信息
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());
}
return ApiResult.success();
}
/**
* 确认收货(需扫码)
* @param request
* @return
*/
@PostMapping("takeDeliveryConfirmByScan")
@ApiMark(moduleName = "需扫码收货", apiName = "需扫码收货")
public ApiResult<Void> takeDeliveryConfirmByScan(@Valid @RequestBody List<PendingScanningQO> request) {

View File

@ -379,6 +379,7 @@ public class PackingController extends BaseController {
item.setDeliveryNo(qo.getDeliveryNo());
item.setDeliveryLineNo(qo.getDeliveryLineNo());
item.setSrmOrderItemId(qo.getSrmOrderItemId());
item.setPackageStatus((short)0);
item.setCreateUserId(UserUtil.getUserId());
item.setCreateUserName(UserUtil.getUserName());
item.setCreateTime(LocalDateTime.now());

View File

@ -301,7 +301,7 @@ public class QrCodeMasterController extends BaseController {
public ApiResult<QrCodeVO> scan(@Valid @RequestBody QRCodeSearchQO request) {
WmsQrCodeMaster qrCodeMaster = qrCodeMasterService.lambdaQuery()
.eq(WmsQrCodeMaster::getBarcodeCode, request.getPackageCode())
.eq(WmsQrCodeMaster::getProcessStage, request.getProcessStage())
.in(WmsQrCodeMaster::getProcessStage, request.getProcessStage())
.one();
//判断是否为有效码
VUtil.trueThrowBusinessError(ObjectUtil.isNull(qrCodeMaster)).throwMessage("无效码");

View File

@ -20,6 +20,8 @@ import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.*;
import com.nflg.wms.repository.service.*;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.data.redis.core.StringRedisTemplate;
@ -99,6 +101,9 @@ public class NormalPGIControllerService {
@Resource
private IWmsQcReceiveItemService wmsQcReceiveItemService;
@Resource
private IWmsPackageService wmsPackageService;
/**
* 根据订单编号获取订单详情信息包括订单头信息和订单行项目信息
* <p>
@ -111,6 +116,7 @@ public class NormalPGIControllerService {
* @throws Exception 查询或业务处理过程中可能抛出的异常
*/
public PDAOrderVO getOrderItemByOrderNo(@RequestParam String orderNo) {
/// TODO
// 根据订单编号查询订单主表信息
WmsSrmOrder order = wmsSrmOrderService.lambdaQuery().eq(WmsSrmOrder::getNoteNum, orderNo)
.eq(WmsSrmOrder::getIsCompleted, false).one();
@ -537,4 +543,62 @@ public class NormalPGIControllerService {
return srmToken;
}
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;
}
}

View File

@ -0,0 +1,49 @@
package com.nflg.wms.common.pojo.dto;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@Accessors(chain = true)
public class PackagePOItemDTO {
/**
* 物料编号
*/
private String materialCode;
/**
* 物料描述
*/
private String materialDescription;
/**
* 送货单数量
*/
private BigDecimal orderQty;
/**
* 打包数量
*/
private BigDecimal packingQuantity;
/**
* 采购单号
*/
private String poNumber;
/**
* 仓库
*/
private String storageLocation;
/**
* 送货单单号
*/
private String deliveryNo;
}

View File

@ -14,7 +14,17 @@ public class PendingScanningQO {
private Long barcodeId;
/**
* 待扫数量
* 物料二维码的编码
*/
private String barcodeCode;
/**
* 条码类型(物料码箱码) 0 物料码1 箱码
*/
private Short packagingType;
/**
* 扫码数量
*/
private BigDecimal pendingScanQuantity;

View File

@ -9,7 +9,7 @@ import java.util.List;
@Accessors(chain = true)
public class PendingUnScanningQO {
/**
* 包装物ID
* 包装的二维码编号
*/
private List<Long> barcodeIds;
private String packageCode;
}

View File

@ -5,6 +5,8 @@ import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
public class QRCodeSearchQO {
@ -26,5 +28,5 @@ public class QRCodeSearchQO {
* OutBound((short) 7, "已出库"), //已被使用只有退库的时候才会被重新激活
* Hold((short) 8, "已挂起");// 用于仓库转储出库之后此二维码还需要继续使用用一个特殊的状态标记
*/
private Short processStage;
private List<Short> processStage;
}

View File

@ -42,7 +42,7 @@ public class WmsPackage implements Serializable {
private Short packageType;
/**
* 状态 0 未打包1 已打包2 已收货
* 状态 0 未打包1 已打包2 已收货3 部分收货
*/
private Short packageStatus;

View File

@ -67,7 +67,12 @@ public class WmsPackageItem implements Serializable {
private String deliveryLineNo;
/**
* SRM送货单对应的ID号,对应扫描的时候返回的id
* SRM送货单对应的ID号
*/
private Long srmOrderItemId;
/**
* 状态 0 未收货2 已收货
*/
private Short packageStatus;
}

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.qo.PackingQO;
import com.nflg.wms.common.pojo.qo.PackingSearchQO;
@ -39,4 +40,6 @@ public interface WmsPackageMapper extends BaseMapper<WmsPackage> {
List<PacageScanVO> getPackageInfos(List<Long> barcodeIds);
List<PendingScanningItemDTO> getScanningItems(List<Long> barcodeIds);
List<PackagePOItemDTO> getPackagePOItems(String packageCode);
}

View File

@ -2,6 +2,7 @@ package com.nflg.wms.repository.service;
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.qo.PackingQO;
import com.nflg.wms.common.pojo.qo.PackingSearchQO;
@ -11,6 +12,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.wms.repository.entity.WmsPackageItem;
import com.nflg.wms.repository.entity.WmsQrCodeMaster;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.util.List;
@ -47,4 +49,6 @@ public interface IWmsPackageService extends IService<WmsPackage> {
List<PacageScanVO> getPackageInfos(List<Long> barcodeIds);
List<PendingScanningItemDTO> getScanningItems(List<Long> barcodeIds);
List<PackagePOItemDTO> getPackagePOItems(@NotNull @NotBlank String packageCode);
}

View File

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.qo.PackingQO;
import com.nflg.wms.common.pojo.qo.PackingSearchQO;
@ -137,5 +138,10 @@ public class WmsPackageServiceImpl extends ServiceImpl<WmsPackageMapper, WmsPack
return baseMapper.getScanningItems(barcodeIds);
}
@Override
public List<PackagePOItemDTO> getPackagePOItems(String packageCode) {
return baseMapper.getPackagePOItems(packageCode);
}
}

View File

@ -176,4 +176,22 @@
#{id}
</foreach>
</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>
</mapper>

View File

@ -33,7 +33,7 @@ public class CodeGeneratorTest {
)
.strategyConfig(builder -> {
builder
.addInclude("wms_warehouse") //只生成指定表
.addInclude("wms_package") //只生成指定表
.entityBuilder().idType(IdType.ASSIGN_ID)
.enableLombok()
.enableChainModel()