新增无码收货-间内调拨功能

This commit is contained in:
yf001217 2026-06-01 14:06:44 +08:00
parent 9ae3b4f376
commit dcbab3b27d
1 changed files with 249 additions and 0 deletions

View File

@ -6,11 +6,15 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.nflg.wms.admin.pojo.dto.PdfPageDTO;
import com.nflg.wms.admin.pojo.request.NoScanningItemDataRequest;
import com.nflg.wms.admin.pojo.request.NoScanningItemRequest;
import com.nflg.wms.admin.pojo.request.NoScanningRequest;
import com.nflg.wms.admin.pojo.request.UpdateItemNumRequest;
import com.nflg.wms.admin.repository.InMaterialScanRecordRespository;
import com.nflg.wms.admin.repository.InventoryForOutRepository;
import com.nflg.wms.admin.repository.OutMaterialScanRecordRespository;
import com.nflg.wms.admin.service.BasdeSerialNumberControllerService;
import com.nflg.wms.admin.service.NoScanningBaseControllerService;
import com.nflg.wms.admin.service.SapService;
import com.nflg.wms.admin.util.PdfGeneratorUtil;
import com.nflg.wms.admin.util.QRCodeUtil;
@ -107,6 +111,9 @@ public class TransferFactoryController extends BaseController {
@Resource
private IOptRecordService optRecordService;
@Resource
private NoScanningBaseControllerService noScanningBaseControllerService;
/**
* 查询SAP领料订单数据
*/
@ -508,6 +515,110 @@ public class TransferFactoryController extends BaseController {
return ApiResult.success();
}
/**
* 无码出库PDA使用
*/
@Transactional
@PostMapping("pda/submitForOutNoScanning")
public ApiResult<Void> submitForOutNoScanning(@Valid @RequestBody NoScanningRequest request) {
WmsTransferFactory order = transferFactoryService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("调拨单不存在");
List<WmsTransferFactoryItem> datas = transferFactoryItemService.getList(order.getId());
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(datas)).throwMessage("调拨单明细不存在");
Map<Long, WmsTransferFactoryItem> itemMap = datas.stream()
.collect(Collectors.toMap(WmsTransferFactoryItem::getId, item -> item));
List<OutMaterialScanRecord> records = new ArrayList<>();
List<WmsTransferFactoryTicketItem> ticketItems = new ArrayList<>();
WmsTransferFactoryTicket ticket = new WmsTransferFactoryTicket()
.setId(IdUtil.getSnowflakeNextId())
.setNo(serialNumberControllerService.generateSerialNumber(19))
.setLgort(request.getWarehouseNo())
.setOrderId(order.getId())
.setFinish(true)
.setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now());
for (NoScanningItemRequest item : request.getItems()) {
WmsTransferFactoryItem orderItem = itemMap.get(item.getOrderItemId());
VUtil.trueThrowBusinessError(Objects.isNull(orderItem)).throwMessage("物料" + item.getMaterialNo() + "不需要出库");
VUtil.trueThrowBusinessError(!StrUtil.equals(item.getMaterialNo(), orderItem.getMatnr()))
.throwMessage("调拨单明细与物料不匹配:" + item.getMaterialNo());
VUtil.trueThrowBusinessError(noScanningBaseControllerService.existsQrCode(orderItem.getMatnr()))
.throwMessage("物料" + orderItem.getMatnr() + "已生成二维码,不允许无码出库");
BigDecimal totalNum = item.getDatas().stream()
.peek(data -> VUtil.trueThrowBusinessError(Objects.isNull(data.getNum()) || data.getNum().compareTo(BigDecimal.ZERO) <= 0)
.throwMessage("物料" + orderItem.getMatnr() + "的无码出库数量必须大于0"))
.map(NoScanningItemDataRequest::getNum)
.reduce(BigDecimal.ZERO, BigDecimal::add);
VUtil.trueThrowBusinessError(totalNum.compareTo(orderItem.getLeft()) > 0)
.throwMessage("物料" + orderItem.getMatnr() + "的出库数量超出申请限制");
WmsTransferFactoryTicketItem ticketItem = new WmsTransferFactoryTicketItem()
.setId(IdUtil.getSnowflakeNextId())
.setTicketId(ticket.getId())
.setOrderItemId(orderItem.getId())
.setNum(totalNum);
ticketItems.add(ticketItem);
item.getDatas().forEach(data -> {
String batchNo = StrUtil.blankToDefault(data.getBatchNo(), "");
String serialNo = StrUtil.blankToDefault(data.getSerialNo(), "");
String binNo = StrUtil.blankToDefault(data.getBinNo(), "");
records.add(new OutMaterialScanRecord()
.setSource(4)
.setSourceId(order.getId())
.setSourceItemId(orderItem.getId())
.setTicketId(ticket.getId())
.setTicketItemId(ticketItem.getId())
.setMaterialNo(orderItem.getMatnr())
.setUnit(orderItem.getMeins())
.setRspos(orderItem.getRspos())
.setContent("")
.setBatchNo(batchNo)
.setSerialNo(serialNo)
.setUniqNo("NO_SCAN_" + IdUtil.getSnowflakeNextId())
.setQiTao(false)
.setFactoryNo(order.getWerks())
.setWarehouseNo(request.getWarehouseNo())
.setBinNo(binNo)
.setNum(data.getNum())
.setCreateBy(UserUtil.getUserName())
.setCreateTime(Instant.now())
);
orderItem.setLeft(orderItem.getLeft().subtract(data.getNum()));
VUtil.trueThrowBusinessError(orderItem.getLeft().compareTo(BigDecimal.ZERO) < 0)
.throwMessage("物料" + orderItem.getMatnr() + "的出库数量超出申请限制");
});
}
transferFactoryTicketItemService.saveBatch(ticketItems);
transferFactoryItemService.updateBatchById(datas);
transferFactoryService.lambdaUpdate()
.set(WmsTransferFactory::getUpdateBy, UserUtil.getUserName())
.set(WmsTransferFactory::getUpdateTime, LocalDateTime.now())
.eq(WmsTransferFactory::getId, order.getId())
.update();
transferFactoryTicketService.save(ticket);
inventoryService.out(records.stream()
.collect(Collectors.groupingBy(OutMaterialScanRecord::getKey))
.values()
.stream()
.map(list -> new InventoryOutDTO()
.setMaterialNo(list.get(0).getMaterialNo())
.setBatchNo(list.get(0).getBatchNo())
.setSerialNo(list.get(0).getSerialNo())
.setFactoryNo(list.get(0).getFactoryNo())
.setWarehouseNo(list.get(0).getWarehouseNo())
.setBinLocation(list.get(0).getBinNo())
.setNum(list.stream().map(OutMaterialScanRecord::getNum).reduce(BigDecimal.ZERO, BigDecimal::add))
).toList()
);
outMaterialScanRecordRespository.saveAll(records);
return ApiResult.success();
}
/**
* 审核出库单
*/
@ -781,6 +892,129 @@ public class TransferFactoryController extends BaseController {
return ApiResult.success();
}
/**
* 无码入库PDA使用
*/
@Transactional
@PostMapping("pda/submitForInNoScanning")
public ApiResult<Void> submitForInNoScanning(@Valid @RequestBody @NotNull NoScanningRequest request) {
TransferFactoryTicketInfoVO ticket = transferFactoryTicketService.getInfo(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("出库单不存在");
VUtil.trueThrowBusinessError(!Objects.equals(ticket.getState(), 0)).throwMessage("出库单无效");
List<OutMaterialScanRecord> records1 = outMaterialScanRecordRespository.findByTicketId(ticket.getId());
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(records1)).throwMessage("未找到出库记录");
List<TransferFactoryItemVO> ticketItems = transferFactoryTicketItemService.getList(ticket.getId());
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(ticketItems)).throwMessage("出库单明细不存在");
Set<Long> matchedIds = new HashSet<>();
List<InMaterialScanRecord> records = new ArrayList<>();
for (NoScanningItemRequest item : request.getItems()) {
TransferFactoryItemVO ticketItem = findTicketItem(ticketItems, item.getOrderItemId());
VUtil.trueThrowBusinessError(Objects.isNull(ticketItem)).throwMessage("物料" + item.getMaterialNo() + "不需要入库");
VUtil.trueThrowBusinessError(!StrUtil.equals(item.getMaterialNo(), ticketItem.getMatnr()))
.throwMessage("出库单明细与物料不匹配:" + item.getMaterialNo());
VUtil.trueThrowBusinessError(noScanningBaseControllerService.existsQrCode(ticketItem.getMatnr()))
.throwMessage("物料" + ticketItem.getMatnr() + "已生成二维码,不允许无码入库");
BigDecimal totalNum = item.getDatas().stream()
.peek(data -> VUtil.trueThrowBusinessError(Objects.isNull(data.getNum()) || data.getNum().compareTo(BigDecimal.ZERO) <= 0)
.throwMessage("物料" + ticketItem.getMatnr() + "的无码入库数量必须大于0"))
.map(NoScanningItemDataRequest::getNum)
.reduce(BigDecimal.ZERO, BigDecimal::add);
VUtil.trueThrowBusinessError(totalNum.compareTo(ticketItem.getNum()) != 0)
.throwMessage("物料" + ticketItem.getMatnr() + "的无码入库数量与出库数量不一致");
OutMaterialScanRecord outRecord = findOutRecord(records1, ticketItem);
VUtil.trueThrowBusinessError(Objects.isNull(outRecord)).throwMessage("未找到物料" + ticketItem.getMatnr() + "的出库记录");
matchedIds.add(item.getOrderItemId());
item.getDatas().forEach(data -> {
String batchNo = StrUtil.blankToDefault(data.getBatchNo(), "");
String serialNo = StrUtil.blankToDefault(data.getSerialNo(), "");
String binNo = StrUtil.blankToDefault(data.getBinNo(), "");
records.add(new InMaterialScanRecord()
.setSource(5)
.setSourceId(outRecord.getSourceId())
.setSourceItemId(outRecord.getSourceItemId())
.setTicketItemId(outRecord.getTicketItemId())
.setMaterialNo(outRecord.getMaterialNo())
.setContent(outRecord.getContent())
.setBatchNo(batchNo)
.setSerialNo(serialNo)
.setFactoryNo(ticket.getWerks())
.setWarehouseNo(request.getWarehouseNo())
.setBinNo(binNo)
.setUniqNo(outRecord.getUniqNo())
.setRspos(outRecord.getRspos())
.setNum(data.getNum())
.setCreateBy(UserUtil.getUserName())
.setCreateTime(Instant.now())
);
});
}
List<String> missedMaterials = ticketItems.stream()
.filter(item -> !matchedIds.contains(item.getId()) && !matchedIds.contains(item.getOrderItemId()))
.map(TransferFactoryItemVO::getMatnr)
.distinct()
.toList();
VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(missedMaterials))
.throwMessage("以下物料未提交无码入库信息:" + StrUtil.join(",", missedMaterials));
inventoryService.in(records.stream()
.collect(Collectors.groupingBy(InMaterialScanRecord::getKey9))
.values()
.stream()
.map(list -> new InventoryInDTO()
.setMaterialNo(list.get(0).getMaterialNo())
.setBatchNo(list.get(0).getBatchNo())
.setSerialNo(list.get(0).getSerialNo())
.setFactoryNo(list.get(0).getFactoryNo())
.setWarehouseNo(list.get(0).getWarehouseNo())
.setBinLocation(list.get(0).getBinNo())
.setNum(list.stream().map(InMaterialScanRecord::getNum).reduce(BigDecimal.ZERO, BigDecimal::add))
).toList()
);
ZWM00MB113DTO vo = sapService.zwm00_mb113(new ZWM00MB113QO()
.setIRsnum(ticket.getRsnum())
.setIUmlgo(ticket.getUmlgo())
.setT_list1(ticketItems.stream().map(item -> new ZWM00MB113LIST1QO()
.setRspos(item.getRspos())
.setMatnr(item.getMatnr())
.setErfmg(item.getNum())
.setMeins(item.getMeins())
.setWerks(ticket.getWerks())
.setLgort(request.getWarehouseNo())).toList()
)
.setT_list2(records1.stream()
.collect(Collectors.groupingBy(OutMaterialScanRecord::getKey6))
.values()
.stream()
.map(ls -> new ZWM00MB113LIST2QO()
.setRspos(ls.get(0).getRspos())
.setSernr(ls.get(0).getSerialNo())
.setFlag("X")
)
.toList()
)
);
OptRecordDTO optRecordDTO = new OptRecordDTO();
optRecordDTO.setOperationType((short)1)
.setOrderId(ticket.getNo());
optRecordService.add(optRecordDTO);
transferFactoryTicketService.lambdaUpdate()
.set(WmsTransferFactoryTicket::getMatDoc, vo.getEMblnr())
.set(WmsTransferFactoryTicket::getDocYear, vo.getEMjahr())
.set(WmsTransferFactoryTicket::getUpdateBy, UserUtil.getUserName())
.set(WmsTransferFactoryTicket::getUpdateTime, LocalDateTime.now())
.set(WmsTransferFactoryTicket::getLgort1, request.getWarehouseNo())
.set(WmsTransferFactoryTicket::getState, 1)
.eq(WmsTransferFactoryTicket::getId, ticket.getId())
.update();
inMaterialScanRecordRespository.saveAll(records);
return ApiResult.success();
}
/**
* 搜索调拨凭证
*/
@ -847,4 +1081,19 @@ public class TransferFactoryController extends BaseController {
PdfGeneratorUtil.generatePdf("厂内调拨入库单" + order.getTicketNo(), html, response);
}
private TransferFactoryItemVO findTicketItem(List<TransferFactoryItemVO> ticketItems, Long itemId) {
return ticketItems.stream()
.filter(item -> Objects.equals(item.getId(), itemId) || Objects.equals(item.getOrderItemId(), itemId))
.findFirst()
.orElse(null);
}
private OutMaterialScanRecord findOutRecord(List<OutMaterialScanRecord> records, TransferFactoryItemVO ticketItem) {
return records.stream()
.filter(record -> Objects.equals(record.getTicketItemId(), ticketItem.getId())
|| Objects.equals(record.getSourceItemId(), ticketItem.getOrderItemId()))
.findFirst()
.orElse(null);
}
}