Compare commits

...

2 Commits

Author SHA1 Message Date
曹鹏飞 adf80b96e6 Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalQMController.java
2026-04-01 09:47:52 +08:00
曹鹏飞 2a5a58b163 feat(wms): 添加退货申请和生产订单副产品管理功能
- 新增 ApplyReturnRequestItemVO 和 ApplyReturnRequestVO 数据传输对象
- 添加 InProduceOrderSurplusController 实现生产订单副产品管理功能
- 添加 NormalPGIController 实现普通物料收货单管理功能
- 实现出库入库、扫码记录、订单详情等核心业务逻辑
- 集成 SAP 接口实现数据同步和处理
- 实现 PDF 导出和条码生成功能
2026-04-01 09:44:51 +08:00
8 changed files with 133 additions and 107 deletions

View File

@ -487,7 +487,7 @@ public class InProduceOrderSurplusController extends BaseController {
List<WmsInProduceOrderSurplusItem> list = inProduceOrderSurplusItemService.getList(id);
list.forEach(it -> it.setNum(null));
Map<String, String> base = new HashMap<>();
base.put("title", "副产品退料单");
base.put("title", "返修退料单");
base.put("date", DateUtil.format(LocalDateTime.now(), "yyyy-MM-dd"));
base.put("qrcode", QRCodeUtil.generateQRCodeBase64(order.getNo(), 100, 100));
Map<String, Object> variables = new HashMap<>();
@ -495,7 +495,7 @@ public class InProduceOrderSurplusController extends BaseController {
variables.put("base", base);
variables.put("pages", PdfPageDTO.create(list, 17, new WmsInProduceOrderSurplusItem()));
String html = ThymeleafUtil.generator("/template/", "生产退料单", ".html", variables);
PdfGeneratorUtil.generatePdf("副产品退料单" + order.getNo(), html, response);
PdfGeneratorUtil.generatePdf("返修退料单" + order.getNo(), html, response);
}
/**

View File

@ -1160,7 +1160,7 @@ public class NormalPGIController extends BaseController {
VUtil.trueThrowBusinessError(!wmsPoReceipt.getSourceType().equals(1)).throwMessage("不属于无码收货的采购单");
//首先判断是否已经确认
VUtil.trueThrowBusinessError(Objects.isNull(wmsPoReceipt)).throwMessage("收货单不存在");
// VUtil.trueThrowBusinessError(Objects.isNull(wmsPoReceipt)).throwMessage("收货单不存在");
VUtil.trueThrowBusinessError(Objects.equals(wmsPoReceipt.getIsCompleted(), true)).throwMessage("此任务已入库");
@ -1207,6 +1207,8 @@ public class NormalPGIController extends BaseController {
if (CollectionUtil.isNotEmpty(scanCode)) {
scanCode.forEach(code -> {
WmsQrCodeMaster qrCodeMaster = wmsQrCodeMasterService.getByCode(code.getCodeId());
VUtil.trueThrowBusinessError(Objects.isNull(qrCodeMaster)).throwMessage("条码不存在:" + code.getCodeId());
// 库存
InventoryInDTO inventoryDTO = inventories.stream()
.filter(inventoriesDTO -> inventoriesDTO.getMaterialNo().equals(item.getItemCode())
@ -1214,6 +1216,7 @@ public class NormalPGIController extends BaseController {
&& inventoriesDTO.getSerialNo().equals(Objects.isNull(code.getSerialNumbers()) ? "" : code.getSerialNumbers())
&& inventoriesDTO.getFactoryNo().equals(wmsPoReceipt.getFactoryCode())
&& inventoriesDTO.getWarehouseNo().equals(item.getReceivedWarehouse())
&& StrUtil.equals(inventoriesDTO.getBinLocation(), qrCodeMaster.getBinLocation())
).findFirst().orElse(null);
if (Objects.isNull(inventoryDTO)) {
@ -1221,6 +1224,7 @@ public class NormalPGIController extends BaseController {
.setMaterialNo(item.getItemCode())
.setFactoryNo(wmsPoReceipt.getFactoryCode())
.setWarehouseNo(item.getReceivedWarehouse())
.setBinLocation(qrCodeMaster.getBinLocation())
.setBatchNo(Objects.isNull(code.getBatchNumber()) ? "" : code.getBatchNumber())
.setSerialNo(Objects.isNull(code.getSerialNumbers()) ? "" : code.getSerialNumbers())
.setNum(code.getCodeNum());
@ -1265,6 +1269,7 @@ public class NormalPGIController extends BaseController {
.setMaterialNo(item.getItemCode())
.setFactoryNo(wmsPoReceipt.getFactoryCode())
.setWarehouseNo(item.getReceivedWarehouse())
.setBinLocation("")
.setBatchNo("")
.setSerialNo("")
.setNum(item.getInQty());

View File

@ -42,6 +42,7 @@ import java.time.LocalDate;
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;
@ -144,6 +145,77 @@ public class NormalQMController extends BaseController {
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(request)).throwMessage("不存在待入库的物料(或此物料已入库)");
List<String> qrCodes = CollectionUtil.unionAll(
request.stream()
.filter(Objects::nonNull)
.map(QCReceiveTaskConfirmQO::getReceiveItems)
.flatMap(List::stream)
.filter(Objects::nonNull)
.map(InCostCenterBackSubmitItemQRQO::getQrCode)
.toList()
, request.stream()
.filter(Objects::nonNull)
.map(QCReceiveTaskConfirmQO::getRejectItems)
.flatMap(List::stream)
.filter(Objects::nonNull)
.map(InCostCenterBackSubmitItemQRQO::getQrCode)
.toList()
);
List<WmsQrCodeMaster> qrCodeMasters = qrCodeMasterService.getChildrenWithParent(qrCodes);
request.forEach(rit -> {
if (CollectionUtil.isNotEmpty(rit.getReceiveItems())) {
rit.getReceiveItems().forEach(item -> {
WmsQrCodeMaster p = qrCodeMasters.stream()
.filter(q -> q.getBarcodeCode().equals(item.getQrCode()))
.findFirst()
.get();
p.setProcessStage(BarCodeProcessStage.InBound.getState());
p.setFactoryCode(rit.getFactoryCode());
p.setStorageLocation(rit.getReceivedWarehouse());
p.setBinLocation(item.getBinNo());
p.setLastScanBy(UserUtil.getUserId());
p.setLastScanByname(UserUtil.getUserName());
p.setLastScanTime(LocalDateTime.now());
qrCodeMasters.stream()
.filter(q -> q.getParentBarcodeId().equals(p.getId()))
.forEach(c -> {
c.setProcessStage(p.getProcessStage());
c.setLastScanBy(UserUtil.getUserId());
c.setLastScanByname(UserUtil.getUserName());
c.setLastScanTime(LocalDateTime.now());
c.setFactoryCode(p.getFactoryCode());
c.setStorageLocation(p.getStorageLocation());
c.setBinLocation(p.getBinLocation());
// c.setReceiptItemId(p.getReceiptItemId());
});
});
}
if (CollectionUtil.isNotEmpty(rit.getRejectItems())) {
rit.getRejectItems().forEach(item -> {
WmsQrCodeMaster p = qrCodeMasters.stream()
.filter(q -> q.getBarcodeCode().equals(item.getQrCode()))
.findFirst()
.get();
p.setProcessStage(BarCodeProcessStage.Reject.getState());
p.setBinLocation(item.getBinNo());
p.setLastScanBy(UserUtil.getUserId());
p.setLastScanByname(UserUtil.getUserName());
p.setLastScanTime(LocalDateTime.now());
qrCodeMasters.stream()
.filter(q -> q.getParentBarcodeId().equals(p.getId()))
.forEach(c -> {
c.setProcessStage(p.getProcessStage());
c.setLastScanBy(UserUtil.getUserId());
c.setLastScanByname(UserUtil.getUserName());
c.setLastScanTime(LocalDateTime.now());
c.setFactoryCode(p.getFactoryCode());
c.setStorageLocation(p.getStorageLocation());
c.setBinLocation(p.getBinLocation());
// c.setReceiptItemId(p.getReceiptItemId());
});
});
}
});
//首先根据采购单的编号进行分类
List<String> poNums = request.stream()
.map(QCReceiveTaskConfirmQO::getPoNum) // 提取每个对象的 ID
@ -258,109 +330,36 @@ public class NormalQMController extends BaseController {
.setEbelp(Integer.valueOf(code.getPoLineNumber()))
.setMenge(code.getRejectQty())
.setMatDoc(code.getReceiveNum())
.setDocYear(DateTimeUtil.format(LocalDate.now(),"yyyy"))
.setDocYear(DateTimeUtil.format(LocalDate.now(), "yyyy"))
);
}
if (code.getReceiveQty().compareTo(BigDecimal.ZERO) > 0) {
// 合格品数量大于0时的处理逻辑
InventoryInDTO inventoryDTO = qcReceiveDTO.getQualifiednventories()
.stream()
.filter(inventoryDTO1 ->
inventoryDTO1.getMaterialNo().equals(code.getItemCode())
&& inventoryDTO1.getWarehouseNo().equals(item.getReceivedWarehouse())
&& inventoryDTO1.getBatchNo().equals(code.getMaterialBatch())
&& inventoryDTO1.getSerialNo().equals(code.getSerialNum())
&& inventoryDTO1.getFactoryNo().equals(code.getFactory()))
.findFirst()
.orElse(null);
if (Objects.isNull(inventoryDTO)) {
List<WmsQrCodeMaster> itemQrCodeMasters = qrCodeMasters.stream()
.filter(qr -> Objects.equals(qr.getProcessStage(), BarCodeProcessStage.InBound.getState())
&& qr.getMaterialCode().equals(code.getItemCode())
)
.toList();
Map<String, List<WmsQrCodeMaster>> qrCodeMastersMap = itemQrCodeMasters.stream()
.collect(Collectors.groupingBy(WmsQrCodeMaster::getKey1));
qrCodeMastersMap.values().forEach(vqrs -> {
WmsQrCodeMaster qf = vqrs.get(0);
qcReceiveDTO.getQualifiednventories().add(new InventoryInDTO()
.setMaterialNo(code.getItemCode())
.setFactoryNo(code.getFactory())
.setWarehouseNo(item.getReceivedWarehouse()) // 不合格仓固定
.setNum(code.getReceiveQty())
.setBatchNo(code.getMaterialBatch())
.setSerialNo(code.getSerialNum())
.setMaterialNo(qf.getMaterialCode())
.setFactoryNo(qf.getFactoryCode())
.setWarehouseNo(qf.getStorageLocation()) // 不合格仓固定
.setBinLocation(qf.getBinLocation())
.setBatchNo(qf.getBatchNo())
.setSerialNo(qf.getSerialNo())
.setNum(vqrs.stream().map(WmsQrCodeMaster::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add))
);
} else {
inventoryDTO.setNum(inventoryDTO.getNum().add(code.getReceiveQty()));
}
});
}
}
}
}
qcReceiveDTOS.add(qcReceiveDTO);
}
List<String> qrCodes = CollectionUtil.unionAll(
request.stream()
.map(QCReceiveTaskConfirmQO::getReceiveItems)
.filter(Objects::nonNull)
.flatMap(List::stream)
.map(InCostCenterBackSubmitItemQRQO::getQrCode)
.filter(Objects::nonNull)
.toList()
, request.stream()
.map(QCReceiveTaskConfirmQO::getRejectItems)
.filter(Objects::nonNull)
.flatMap(List::stream)
.map(InCostCenterBackSubmitItemQRQO::getQrCode)
.filter(Objects::nonNull)
.toList()
);
List<WmsQrCodeMaster> qrCodeMasters = qrCodeMasterService.getChildrenWithParent(qrCodes);
request.forEach(rit -> {
if (CollectionUtil.isNotEmpty(rit.getReceiveItems())) {
rit.getReceiveItems().forEach(item -> {
WmsQrCodeMaster p = qrCodeMasters.stream()
.filter(q -> q.getBarcodeCode().equals(item.getQrCode()))
.findFirst()
.get();
p.setProcessStage(BarCodeProcessStage.InBound.getState());
p.setBinLocation(item.getBinNo());
p.setLastScanBy(UserUtil.getUserId());
p.setLastScanByname(UserUtil.getUserName());
p.setLastScanTime(LocalDateTime.now());
qrCodeMasters.stream()
.filter(q -> q.getParentBarcodeId().equals(p.getId()))
.forEach(c -> {
c.setProcessStage(p.getProcessStage());
c.setLastScanBy(UserUtil.getUserId());
c.setLastScanByname(UserUtil.getUserName());
c.setLastScanTime(LocalDateTime.now());
c.setFactoryCode(p.getFactoryCode());
c.setStorageLocation(p.getStorageLocation());
c.setBinLocation(p.getBinLocation());
c.setReceiptItemId(p.getReceiptItemId());
});
});
}
if (CollectionUtil.isNotEmpty(rit.getRejectItems())) {
rit.getRejectItems().forEach(item -> {
WmsQrCodeMaster p = qrCodeMasters.stream()
.filter(q -> q.getBarcodeCode().equals(item.getQrCode()))
.findFirst()
.get();
p.setProcessStage(BarCodeProcessStage.Reject.getState());
p.setBinLocation(item.getBinNo());
p.setLastScanBy(UserUtil.getUserId());
p.setLastScanByname(UserUtil.getUserName());
p.setLastScanTime(LocalDateTime.now());
qrCodeMasters.stream()
.filter(q -> q.getParentBarcodeId().equals(p.getId()))
.forEach(c -> {
c.setProcessStage(p.getProcessStage());
c.setLastScanBy(UserUtil.getUserId());
c.setLastScanByname(UserUtil.getUserName());
c.setLastScanTime(LocalDateTime.now());
c.setFactoryCode(p.getFactoryCode());
c.setStorageLocation(p.getStorageLocation());
c.setBinLocation(p.getBinLocation());
c.setReceiptItemId(p.getReceiptItemId());
});
});
}
});
qrCodeMasterService.updateBarCode(qrCodeMasters);
normalQMControllerService.confirmReceive(qcReceiveDTOS);
return ApiResult.success();
@ -390,7 +389,7 @@ public class NormalQMController extends BaseController {
//VUtil.trueThrowBusinessError(!qcReceive.getSourceType().equals(1)).throwMessage("不属于无码收货的采购单");
//根据ID获取到任务单
List<QCReceiveTaskConfirmQO> taskConfirmQOS = new ArrayList<>();
List<InCostCenterBackSubmitItemQRQO> qrCodes=new ArrayList<>();
List<InCostCenterBackSubmitItemQRQO> qrCodes = new ArrayList<>();
for (WmsQcReceive qcReceive : qcReceives) {
List<QCTaskItemVO> tasks = normalQMControllerService.getTaskItem(qcReceive.getId());
if (CollectionUtil.isNotEmpty(tasks)) {
@ -398,7 +397,7 @@ public class NormalQMController extends BaseController {
.anyMatch(task -> task.getUnqualifiedQty().compareTo(BigDecimal.ZERO) > 0)
).throwMessage("含有质检不合格物料,请扫码入库!");
qrCodeMasterService.getByExtendIds(tasks.stream().map(QCTaskItemVO::getId).toList())
.forEach(code->{
.forEach(code -> {
qrCodes.add(new InCostCenterBackSubmitItemQRQO()
.setBinNo("")
.setQrCode(code.getBarcodeCode())
@ -457,7 +456,7 @@ public class NormalQMController extends BaseController {
zwm3A18DTO.getItem1().add(item1DTO);
} else {
item1DTO.setErfmg1(item1DTO.getErfmg1().add(code.getQualifiedQty()));
item1DTO.setErfmg2(BigDecimal.ZERO);
item1DTO.setErfmg2(BigDecimal.ZERO);
}
if (StrUtil.isNotBlank(code.getSerialNum())) {
String flag = code.getInspectionResult().equals("合格") ? "X" : "";

View File

@ -212,7 +212,7 @@ public class OutPurchaseController extends BaseController {
items.add(item);
input1.add(new ZWM3A06Input1DTO()
.setEbelp(it.getEbelp())
.setRetpo(it.getRetpo())
.setRetpo("X")
.setMatnr(it.getMatnr())
.setMaktx(it.getMaktx())
.setErfmg(item.getNum())

View File

@ -201,8 +201,8 @@ public class PurchaseReturnController extends BaseController {
User user = userService.getById(UserUtil.getUserId());
VUtil.trueThrowBusinessError(StrUtil.equals(user.getPurchasingGroup(), returnRequest.getPurchaseGroup()))
.throwMessage("无权限审核此单");
VUtil.trueThrowBusinessError(returnRequest.getApprovalStatus() == 1)
.throwMessage("此单已审核通过,不可以再此审核");
// VUtil.trueThrowBusinessError(returnRequest.getApprovalStatus() == 1)
// .throwMessage("此单已审核通过,不可以再此审核");
if (request.getApprovalStatus().equals(2)) {
VUtil.trueThrowBusinessError(returnRequest.getApprovalStatus() == 2)
@ -280,6 +280,7 @@ public class PurchaseReturnController extends BaseController {
}
//修改状态
returnRequestService.lambdaUpdate()
.set(WmsReturnRequest::getPoNumberNew, returnRequest.getPoNumberNew())
.set(WmsReturnRequest::getApprovalStatus, request.getApprovalStatus())
.set(WmsReturnRequest::getDocumentType, request.getDocumentType())
.set(WmsReturnRequest::getApproveTime, LocalDateTime.now())

View File

@ -111,12 +111,7 @@ public class ApplyReturnRequestItemVO {
private String unit;
/**
* sap过账的行号
* 新采购单行号
*/
private Integer poLineNumberNew;
/**
* 新的采购单号
*/
private String poNumberNew;
}

View File

@ -99,4 +99,9 @@ public class ApplyReturnRequestVO {
* 0 PC端1 PDA端
*/
private Short dataSource;
/**
* 新的采购单号
*/
private String poNumberNew;
}

View File

@ -1,5 +1,6 @@
package com.nflg.wms.repository.entity;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Getter;
import lombok.Setter;
@ -14,6 +15,7 @@ import java.time.LocalDateTime;
* <p>
*
* </p>
*
* @author 代码生成器生成
* @since 2026
*/
@ -74,11 +76,19 @@ public class WmsQrCodeMaster implements Serializable {
*/
private String batchNo;
public String getBatchNo() {
return StrUtil.isBlank(batchNo) ? "" : batchNo;
}
/**
* 序列号
*/
private String serialNo;
public String getSerialNo() {
return StrUtil.isBlank(serialNo) ? "" : serialNo;
}
/**
* 供应商编号
*/
@ -109,6 +119,10 @@ public class WmsQrCodeMaster implements Serializable {
*/
private String binLocation;
public String getBinLocation() {
return StrUtil.isBlank(binLocation) ? "" : binLocation;
}
/**
* 最后扫描时间
*/
@ -190,6 +204,13 @@ public class WmsQrCodeMaster implements Serializable {
private String key;
public String getKey() {
return factoryCode + "|" + storageLocation + "|";
return factoryCode + "|" + storageLocation;
}
@TableField(exist = false)
private String key1;
public String getKey1() {
return factoryCode + "|" + storageLocation + "|" + getBinLocation() + "|" + getBatchNo() + "|" + getSerialNo();
}
}