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

View File

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

View File

@ -338,7 +338,7 @@ public class OutProduceController extends BaseController {
.map(QRCodeQO::getContent) .map(QRCodeQO::getContent)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
List<WmsQrCodeMaster> qrCodeMasters = CollectionUtil.isEmpty(allQrCodes) ? Collections.emptyList() : qrCodeMasterService.lambdaQuery() 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) .in(WmsQrCodeMaster::getBarcodeCode, allQrCodes)
.list(); .list();
// boolean enableOutScanChild = paramConfigService.getEnableOutScanChild(); // boolean enableOutScanChild = paramConfigService.getEnableOutScanChild();
@ -408,9 +408,9 @@ public class OutProduceController extends BaseController {
pti.setNum(pti.getNum().add(qrCodeMaster.getQuantity())); pti.setNum(pti.getNum().add(qrCodeMaster.getQuantity()));
VUtil.trueThrowBusinessError(item.getNum().compareTo(item.getSqsl()) > 0) VUtil.trueThrowBusinessError(item.getNum().compareTo(item.getSqsl()) > 0)
.throwMessage("物料" + materialNo + "的领取数量超出申请限制"); .throwMessage("物料" + materialNo + "的领取数量超出申请限制");
qrCodeMaster.setFactoryCode(""); // qrCodeMaster.setFactoryCode("");
qrCodeMaster.setStorageLocation(""); // qrCodeMaster.setStorageLocation("");
qrCodeMaster.setBinLocation(""); // qrCodeMaster.setBinLocation("");
qrCodeMaster.setProcessStage(BarCodeProcessStage.OutBound.getState()); qrCodeMaster.setProcessStage(BarCodeProcessStage.OutBound.getState());
qrCodeMaster.setLastScanBy(UserUtil.getUserId()); qrCodeMaster.setLastScanBy(UserUtil.getUserId());
qrCodeMaster.setLastScanByname(UserUtil.getUserName()); 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.OutPurchaseVO;
import com.nflg.wms.common.pojo.vo.ZWM3A05ItemVO; import com.nflg.wms.common.pojo.vo.ZWM3A05ItemVO;
import com.nflg.wms.common.pojo.vo.ZWM3A05VO; 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.UserUtil;
import com.nflg.wms.common.util.VUtil; import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.WmsOutPurchase; import com.nflg.wms.repository.entity.*;
import com.nflg.wms.repository.entity.WmsOutPurchaseItem; import com.nflg.wms.repository.service.*;
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.starter.BaseController; import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.validation.Valid; import jakarta.validation.Valid;
@ -74,6 +70,12 @@ public class OutPurchaseController extends BaseController {
@Resource @Resource
private IWmsQrCodeMasterService qrCodeMasterService; private IWmsQrCodeMasterService qrCodeMasterService;
@Resource
private IWmsReturnRequestService returnRequestService;
@Resource
private IWmsReturnRequestItemService returnRequestItemService;
// /** // /**
// * 获取采购退库信息PDA使用 // * 获取采购退库信息PDA使用
// * @return 要退库的物料信息列表 // * @return 要退库的物料信息列表
@ -87,6 +89,42 @@ public class OutPurchaseController extends BaseController {
// return ApiResult.success(result); // 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使用 * 保存PDA使用
* @param request 采购退库信息 * @param request 采购退库信息
@ -106,7 +144,7 @@ public class OutPurchaseController extends BaseController {
.map(QRCodeQO::getContent) .map(QRCodeQO::getContent)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
List<WmsQrCodeMaster> qrCodeMasters = CollectionUtil.isEmpty(allQrCodes) ? Collections.emptyList() : qrCodeMasterService.lambdaQuery() 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) .in(WmsQrCodeMaster::getBarcodeCode, allQrCodes)
.list(); .list();
request.getItems().forEach(it -> { request.getItems().forEach(it -> {
@ -129,9 +167,9 @@ public class OutPurchaseController extends BaseController {
VUtil.trueThrowBusinessError(!check(qrCodeMaster, it.getCharg(), it.getSernrs())) VUtil.trueThrowBusinessError(!check(qrCodeMaster, it.getCharg(), it.getSernrs()))
.throwMessage("物料" + it.getMatnr() + "包含不符合批次号和序列号的扫码记录"); .throwMessage("物料" + it.getMatnr() + "包含不符合批次号和序列号的扫码记录");
item.setNum(item.getNum().add(qrCodeMaster.getQuantity())); item.setNum(item.getNum().add(qrCodeMaster.getQuantity()));
qrCodeMaster.setFactoryCode(""); // qrCodeMaster.setFactoryCode("");
qrCodeMaster.setStorageLocation(""); // qrCodeMaster.setStorageLocation("");
qrCodeMaster.setBinLocation(""); // qrCodeMaster.setBinLocation("");
qrCodeMaster.setProcessStage(BarCodeProcessStage.OutBound.getState()); qrCodeMaster.setProcessStage(BarCodeProcessStage.OutBound.getState());
qrCodeMaster.setLastScanBy(UserUtil.getUserId()); qrCodeMaster.setLastScanBy(UserUtil.getUserId());
qrCodeMaster.setLastScanByname(UserUtil.getUserName()); qrCodeMaster.setLastScanByname(UserUtil.getUserName());
@ -246,6 +284,28 @@ public class OutPurchaseController extends BaseController {
.setNum(list.stream().map(OutMaterialScanRecord::getNum).reduce(BigDecimal.ZERO, BigDecimal::add)) .setNum(list.stream().map(OutMaterialScanRecord::getNum).reduce(BigDecimal.ZERO, BigDecimal::add))
).toList() ).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); Pair<String, String> result = sapService.zwm3A06(request.getEbeln(), input1, input2);
outPurchaseService.lambdaUpdate() outPurchaseService.lambdaUpdate()
.set(WmsOutPurchase::getMatDoc, result.getKey()) .set(WmsOutPurchase::getMatDoc, result.getKey())

View File

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

View File

@ -190,6 +190,10 @@ public class QrCodeMasterController extends BaseController {
smallQrCodeMaster.setLastScanBy(UserUtil.getUserId()); smallQrCodeMaster.setLastScanBy(UserUtil.getUserId());
smallQrCodeMaster.setLastScanByname(UserUtil.getUserName()); 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.setQuantity(smallQrCodeMasters.stream().map(WmsQrCodeMaster::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add));
qrCodeMaster.setLastScanTime(LocalDateTime.now()); qrCodeMaster.setLastScanTime(LocalDateTime.now());
qrCodeMaster.setLastScanBy(UserUtil.getUserId()); qrCodeMaster.setLastScanBy(UserUtil.getUserId());

View File

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

View File

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

View File

@ -320,8 +320,8 @@ public class TransferFactoryController extends BaseController {
item.setLeft(item.getLeft().subtract(qrCodeMaster.getQuantity())); item.setLeft(item.getLeft().subtract(qrCodeMaster.getQuantity()));
VUtil.trueThrowBusinessError(item.getLeft().compareTo(BigDecimal.ZERO) < 0) VUtil.trueThrowBusinessError(item.getLeft().compareTo(BigDecimal.ZERO) < 0)
.throwMessage("物料" + materialNo + "的出库数量超出申请限制"); .throwMessage("物料" + materialNo + "的出库数量超出申请限制");
qrCodeMaster.setStorageLocation(""); // qrCodeMaster.setStorageLocation("");
qrCodeMaster.setBinLocation(""); // qrCodeMaster.setBinLocation("");
qrCodeMaster.setProcessStage(BarCodeProcessStage.OutBound.getState()); qrCodeMaster.setProcessStage(BarCodeProcessStage.OutBound.getState());
qrCodeMaster.setLastScanBy(UserUtil.getUserId()); qrCodeMaster.setLastScanBy(UserUtil.getUserId());
qrCodeMaster.setLastScanByname(UserUtil.getUserName()); 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.NotNull;
import jakarta.validation.constraints.Positive; import jakarta.validation.constraints.Positive;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@Data @Data
@Accessors(chain = true)
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
public class ZWM3A05ItemVO { 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.Valid;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
@ -29,6 +30,12 @@ public class ZWM3A05VO {
@NotBlank @NotBlank
private String werks; private String werks;
/**
* 申请单ID
*/
@NotNull
private Long purchaseOrderId;
@Valid @Valid
@NotEmpty @NotEmpty
private List<ZWM3A05ItemVO> items = new ArrayList<>(); private List<ZWM3A05ItemVO> items = new ArrayList<>();

View File

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