新增无码收货-间内调拨功能
This commit is contained in:
parent
9ae3b4f376
commit
dcbab3b27d
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue