feat(wms): 新增采购退库功能并优化出库流程

- 在OutAssistanceController、OutCostCenterController、OutProduceController中修改二维码查询条件,将processStage的查询从ne改为eq
- 注释掉多个控制器中设置factoryCode、storageLocation、binLocation为空的操作
- 在OutPurchaseController中新增Zwm3a09VO导入和相关服务依赖注入
- 新增search接口用于查询申请单数据,支持PDA使用场景
- 修改OutPurchaseController中的processStage查询逻辑
- 在保存操作后更新退料申请项的剩余数量和出库状态
- 在PurchaseReturnController中为退料申请项添加left字段初始化
- 在QrCodeMasterController中注释掉PO和交货单信息复制逻辑
- 修复ScanRecordController中groupBy方法使用的key字段
- 优化TransferCompanyController和TransferFactoryController中的位置信息清空逻辑
- 为WmsReturnRequestItem实体添加left字段存储剩余数量
- 为ZWM3A05ItemVO和ZWM3A05VO添加链式访问器和必要验证注解
This commit is contained in:
曹鹏飞 2026-03-19 19:20:27 +08:00
parent 65ab089569
commit a55d503c83
12 changed files with 114 additions and 29 deletions

View File

@ -227,7 +227,7 @@ public class OutAssistanceController extends BaseController {
.map(QRCodeQO::getContent)
.collect(Collectors.toSet());
List<WmsQrCodeMaster> qrCodeMasters = CollectionUtil.isEmpty(allQrCodes) ? Collections.emptyList() : qrCodeMasterService.lambdaQuery()
.ne(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState())
.eq(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState())
.in(WmsQrCodeMaster::getBarcodeCode, allQrCodes)
.list();
request.getItems().forEach(qitem -> {
@ -292,9 +292,9 @@ public class OutAssistanceController extends BaseController {
pti.setNum(pti.getNum().add(qrCodeMaster.getQuantity()));
VUtil.trueThrowBusinessError(item.getLeft().compareTo(BigDecimal.ZERO) < 0)
.throwMessage("物料" + materialNo + "的领取数量超出申请限制");
qrCodeMaster.setFactoryCode("");
qrCodeMaster.setStorageLocation("");
qrCodeMaster.setBinLocation("");
// qrCodeMaster.setFactoryCode("");
// qrCodeMaster.setStorageLocation("");
// qrCodeMaster.setBinLocation("");
qrCodeMaster.setProcessStage(BarCodeProcessStage.OutBound.getState());
qrCodeMaster.setLastScanBy(UserUtil.getUserId());
qrCodeMaster.setLastScanByname(UserUtil.getUserName());

View File

@ -225,7 +225,7 @@ public class OutCostCenterController extends BaseController {
.map(QRCodeQO::getContent)
.collect(Collectors.toSet());
List<WmsQrCodeMaster> qrCodeMasters = CollectionUtil.isEmpty(allQrCodes) ? Collections.emptyList() : qrCodeMasterService.lambdaQuery()
.ne(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState())
.eq(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState())
.in(WmsQrCodeMaster::getBarcodeCode, allQrCodes)
.list();
request.getItems().forEach(qitem -> {
@ -286,9 +286,9 @@ public class OutCostCenterController extends BaseController {
pti.setNum(pti.getNum().add(qrCodeMaster.getQuantity()));
VUtil.trueThrowBusinessError(item.getLeft().compareTo(BigDecimal.ZERO) < 0)
.throwMessage("物料" + materialNo + "的领取数量超出申请限制");
qrCodeMaster.setFactoryCode("");
qrCodeMaster.setStorageLocation("");
qrCodeMaster.setBinLocation("");
// qrCodeMaster.setFactoryCode("");
// qrCodeMaster.setStorageLocation("");
// qrCodeMaster.setBinLocation("");
qrCodeMaster.setProcessStage(BarCodeProcessStage.OutBound.getState());
qrCodeMaster.setLastScanBy(UserUtil.getUserId());
qrCodeMaster.setLastScanByname(UserUtil.getUserName());

View File

@ -338,7 +338,7 @@ public class OutProduceController extends BaseController {
.map(QRCodeQO::getContent)
.collect(Collectors.toSet());
List<WmsQrCodeMaster> qrCodeMasters = CollectionUtil.isEmpty(allQrCodes) ? Collections.emptyList() : qrCodeMasterService.lambdaQuery()
.ne(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState())
.eq(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState())
.in(WmsQrCodeMaster::getBarcodeCode, allQrCodes)
.list();
// boolean enableOutScanChild = paramConfigService.getEnableOutScanChild();
@ -408,9 +408,9 @@ public class OutProduceController extends BaseController {
pti.setNum(pti.getNum().add(qrCodeMaster.getQuantity()));
VUtil.trueThrowBusinessError(item.getNum().compareTo(item.getSqsl()) > 0)
.throwMessage("物料" + materialNo + "的领取数量超出申请限制");
qrCodeMaster.setFactoryCode("");
qrCodeMaster.setStorageLocation("");
qrCodeMaster.setBinLocation("");
// qrCodeMaster.setFactoryCode("");
// qrCodeMaster.setStorageLocation("");
// qrCodeMaster.setBinLocation("");
qrCodeMaster.setProcessStage(BarCodeProcessStage.OutBound.getState());
qrCodeMaster.setLastScanBy(UserUtil.getUserId());
qrCodeMaster.setLastScanByname(UserUtil.getUserName());

View File

@ -21,15 +21,11 @@ import com.nflg.wms.common.pojo.qo.QRCodeQO;
import com.nflg.wms.common.pojo.vo.OutPurchaseVO;
import com.nflg.wms.common.pojo.vo.ZWM3A05ItemVO;
import com.nflg.wms.common.pojo.vo.ZWM3A05VO;
import com.nflg.wms.common.pojo.vo.Zwm3a09VO;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.WmsOutPurchase;
import com.nflg.wms.repository.entity.WmsOutPurchaseItem;
import com.nflg.wms.repository.entity.WmsQrCodeMaster;
import com.nflg.wms.repository.service.IWmsInventoryService;
import com.nflg.wms.repository.service.IWmsOutPurchaseItemService;
import com.nflg.wms.repository.service.IWmsOutPurchaseService;
import com.nflg.wms.repository.service.IWmsQrCodeMasterService;
import com.nflg.wms.repository.entity.*;
import com.nflg.wms.repository.service.*;
import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
@ -74,6 +70,12 @@ public class OutPurchaseController extends BaseController {
@Resource
private IWmsQrCodeMasterService qrCodeMasterService;
@Resource
private IWmsReturnRequestService returnRequestService;
@Resource
private IWmsReturnRequestItemService returnRequestItemService;
// /**
// * 获取采购退库信息PDA使用
// * @return 要退库的物料信息列表
@ -87,6 +89,42 @@ public class OutPurchaseController extends BaseController {
// return ApiResult.success(result);
// }
/**
* 查询申请单数据PDA使用
* @param no 退料申请单编号
*/
@GetMapping("search")
public ApiResult<List<ZWM3A05VO>> search(@RequestParam String no) {
WmsReturnRequest order = returnRequestService.lambdaQuery()
.eq(WmsReturnRequest::getApprovalStatus, 1)
.ne(WmsReturnRequest::getOutStatus, 1)
.eq(WmsReturnRequest::getApplicationNo, no)
.one();
VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("申请单无效");
List<WmsReturnRequestItem> items = returnRequestItemService.lambdaQuery()
.eq(WmsReturnRequestItem::getApplicationId, order.getId())
.gt(WmsReturnRequestItem::getLeft, 0)
.list();
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(items)).throwMessage("所有物料均已完成");
ZWM3A05VO vo = new ZWM3A05VO()
.setPurchaseOrderId(order.getId())
.setLifnr(order.getSupplierCode())
.setEbeln(order.getPoNum())
.setItems(
items.stream()
.map(it -> new ZWM3A05ItemVO()
.setPurchaseOrderItemId(it.getId())
.setMatnr(it.getMaterialCode())
.setMaktx(it.getMaterialDescription())
.setTemng(it.getLeft())
.setMeins(it.getUnit())
.setLgort(it.getStorageLocation())
)
.toList()
);
return ApiResult.success(List.of(vo));
}
/**
* 保存PDA使用
* @param request 采购退库信息
@ -106,7 +144,7 @@ public class OutPurchaseController extends BaseController {
.map(QRCodeQO::getContent)
.collect(Collectors.toSet());
List<WmsQrCodeMaster> qrCodeMasters = CollectionUtil.isEmpty(allQrCodes) ? Collections.emptyList() : qrCodeMasterService.lambdaQuery()
.ne(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState())
.eq(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState())
.in(WmsQrCodeMaster::getBarcodeCode, allQrCodes)
.list();
request.getItems().forEach(it -> {
@ -129,9 +167,9 @@ public class OutPurchaseController extends BaseController {
VUtil.trueThrowBusinessError(!check(qrCodeMaster, it.getCharg(), it.getSernrs()))
.throwMessage("物料" + it.getMatnr() + "包含不符合批次号和序列号的扫码记录");
item.setNum(item.getNum().add(qrCodeMaster.getQuantity()));
qrCodeMaster.setFactoryCode("");
qrCodeMaster.setStorageLocation("");
qrCodeMaster.setBinLocation("");
// qrCodeMaster.setFactoryCode("");
// qrCodeMaster.setStorageLocation("");
// qrCodeMaster.setBinLocation("");
qrCodeMaster.setProcessStage(BarCodeProcessStage.OutBound.getState());
qrCodeMaster.setLastScanBy(UserUtil.getUserId());
qrCodeMaster.setLastScanByname(UserUtil.getUserName());
@ -246,6 +284,28 @@ public class OutPurchaseController extends BaseController {
.setNum(list.stream().map(OutMaterialScanRecord::getNum).reduce(BigDecimal.ZERO, BigDecimal::add))
).toList()
);
request.getItems().forEach(it -> {
WmsReturnRequestItem item = returnRequestItemService.getById(it.getPurchaseOrderItemId());
item.setLeft(item.getLeft().subtract(it.getTemng()));
VUtil.trueThrowBusinessError(item.getLeft().compareTo(BigDecimal.ZERO) < 0)
.throwMessage("物料" + it.getMatnr() + "的扫码数量大于退货数量");
returnRequestItemService.updateById(item);
});
if (returnRequestItemService.lambdaQuery()
.eq(WmsReturnRequestItem::getApplicationId, request.getPurchaseOrderId())
.gt(WmsReturnRequestItem::getLeft, 0)
.exists()
) {
returnRequestService.lambdaUpdate()
.set(WmsReturnRequest::getOutStatus, 2)
.eq(WmsReturnRequest::getId, request.getPurchaseOrderId())
.update();
} else {
returnRequestService.lambdaUpdate()
.set(WmsReturnRequest::getOutStatus, 1)
.eq(WmsReturnRequest::getId, request.getPurchaseOrderId())
.update();
}
Pair<String, String> result = sapService.zwm3A06(request.getEbeln(), input1, input2);
outPurchaseService.lambdaUpdate()
.set(WmsOutPurchase::getMatDoc, result.getKey())

View File

@ -325,7 +325,8 @@ public class PurchaseReturnController extends BaseController {
.setMaterialDescription(purchaseReturnDTO.getMaterialDescription())
.setRequestQuantity(purchaseReturnDTO.getRequestQuantity())
.setOutboundStatus(Short.valueOf("0"))
.setUnit(purchaseReturnDTO.getUnit());
.setUnit(purchaseReturnDTO.getUnit())
.setLeft(purchaseReturnDTO.getRequestQuantity());
returnRequestItems.add(returnRequestItem);
}
}

View File

@ -190,6 +190,10 @@ public class QrCodeMasterController extends BaseController {
smallQrCodeMaster.setLastScanBy(UserUtil.getUserId());
smallQrCodeMaster.setLastScanByname(UserUtil.getUserName());
}
// qrCodeMaster.setPoNumber(smallQrCodeMasters.get(0).getPoNumber());
// qrCodeMaster.setPoLineNumber(smallQrCodeMasters.get(0).getPoLineNumber());
// qrCodeMaster.setDeliveryNo(smallQrCodeMasters.get(0).getDeliveryNo());
// qrCodeMaster.setDeliveryLineNo(smallQrCodeMasters.get(0).getDeliveryLineNo());
qrCodeMaster.setQuantity(smallQrCodeMasters.stream().map(WmsQrCodeMaster::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add));
qrCodeMaster.setLastScanTime(LocalDateTime.now());
qrCodeMaster.setLastScanBy(UserUtil.getUserId());

View File

@ -136,7 +136,7 @@ public class ScanRecordController extends BaseController {
return tv;
});
v.stream()
.collect(Collectors.groupingBy(OutMaterialScanRecord::getKey8))
.collect(Collectors.groupingBy(OutMaterialScanRecord::getKey9))
.forEach((key, vv) -> {
vo.getItems().add(new OutDifferenceItemVO()
.setRecommendbatchNo("")

View File

@ -323,8 +323,8 @@ public class TransferCompanyController extends BaseController {
pti.setNum(pti.getNum().add(qrCodeMaster.getQuantity()));
VUtil.trueThrowBusinessError(item.getLeft().compareTo(BigDecimal.ZERO) < 0)
.throwMessage("物料" + materialNo + "的出库数量超出申请限制");
qrCodeMaster.setStorageLocation("");
qrCodeMaster.setBinLocation("");
// qrCodeMaster.setStorageLocation("");
// qrCodeMaster.setBinLocation("");
qrCodeMaster.setProcessStage(BarCodeProcessStage.OutBound.getState());
qrCodeMaster.setLastScanBy(UserUtil.getUserId());
qrCodeMaster.setLastScanByname(UserUtil.getUserName());

View File

@ -320,8 +320,8 @@ public class TransferFactoryController extends BaseController {
item.setLeft(item.getLeft().subtract(qrCodeMaster.getQuantity()));
VUtil.trueThrowBusinessError(item.getLeft().compareTo(BigDecimal.ZERO) < 0)
.throwMessage("物料" + materialNo + "的出库数量超出申请限制");
qrCodeMaster.setStorageLocation("");
qrCodeMaster.setBinLocation("");
// qrCodeMaster.setStorageLocation("");
// qrCodeMaster.setBinLocation("");
qrCodeMaster.setProcessStage(BarCodeProcessStage.OutBound.getState());
qrCodeMaster.setLastScanBy(UserUtil.getUserId());
qrCodeMaster.setLastScanByname(UserUtil.getUserName());

View File

@ -6,15 +6,23 @@ import com.nflg.wms.common.pojo.qo.QRCodeQO;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@Data
@Accessors(chain = true)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ZWM3A05ItemVO {
/**
* 申请单项ID
*/
@NotNull
private Long purchaseOrderItemId;
/**
* 采购凭证的项目编号
*/

View File

@ -3,6 +3,7 @@ package com.nflg.wms.common.pojo.vo;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.experimental.Accessors;
@ -29,6 +30,12 @@ public class ZWM3A05VO {
@NotBlank
private String werks;
/**
* 申请单ID
*/
@NotNull
private Long purchaseOrderId;
@Valid
@NotEmpty
private List<ZWM3A05ItemVO> items = new ArrayList<>();

View File

@ -77,6 +77,11 @@ public class WmsReturnRequestItem implements Serializable {
*/
private BigDecimal requestQuantity;
/**
* 剩余数量
*/
private BigDecimal left;
/**
* 出库状态
*/