1、BOM头校验,具有父子关系的一堆的对象进行校验
目的:如果有一个子对象没有他亲生父对象,否则抛错
现在多个流水对象,流水表中有两个字段(PARENT_INPUT_DETAIL_ID,INPUT_DETAIL_ID),两字段都是入库明细表的id。流水和明细表是一对一。如果该流水表的PARENT_INPUT_DETAIL_ID字段不是空的并且不是null,那么说明这个流水对象是父对象,否则就是子对象。关系就是子对象中的PARENT_INPUT_DETAIL_ID值就对应它父亲的INPUT_DETAIL_ID,如果这个子对象没有匹配到它父亲的INPUT_DETAIL_ID,那么就抛错。
//校验是否有主Bom
private void checkBom(ImportMaterialRequQuery importMaterialRequQuery) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//校验
List<StockApplyDetailQuery> stockApplyDetailQuerieChk = importMaterialRequQuery.getStockApplyDetailItem();
Map<String, String> mapParent = new HashMap<String, String>();
Map<String, String> mapSon = new HashMap<String, String>();
StringBuilder inputWasteId = new StringBuilder();
//筛选父和子bom
if ((stockApplyDetailQuerieChk != null) && (stockApplyDetailQuerieChk.size() > 0)) {
for (StockApplyDetailQuery stockApplyDetailQuery : stockApplyDetailQuerieChk) {
Optional<InputWasteBook> byId = inputWasteBookDao.findById(stockApplyDetailQuery.getWastebookId());
InputWasteBook inputWasteBook = byId.orElseThrow(() -> new StockParseException("未查询到流水"));
inputWasteId.append(inputWasteBook.getId()).append(", ");
//父对象
if (inputWasteBook.getParentInputDetailId() == null || "0".equals(inputWasteBook.getParentInputDetailId())) {
mapParent.put(inputWasteBook.getInputDetailId(), "");
} else {
mapSon.put(inputWasteBook.getInputDetailId(), inputWasteBook.getParentInputDetailId());
}
}
}
for (String key : mapSon.keySet()) {
String son = mapSon.get(key);
if (!mapParent.containsKey(son)){
System.out.println("==========申请明细中没有BOM头数据!当前时间:" + sdf.format(new Date()) + ", " + inputWasteId);
throw new StockParseException("申请明细中没有BOM头数据!");
}
}
}
实现方式:
用两个map分别装父和子类,然后进行匹配。
Map<INPUT_DETAIL_ID, ""> mapParent
Map<INPUT_DETAIL_ID, PARENT_INPUT_DETAIL_ID> mapSon
2、多条数据,第一次出现从零set接收数量,否则在原接收数量基础上相加再set
400个入库明细,分页为20页每页20个,如果poLinePriKey第一次就从0开始set接收数量,否则就在原来基础上set。
3、需求。三个入库流水分别剩余数量为3,8,4。现在申请明细有三个分别需要申请9,3,3。
申请的数量和库存的数量正好相等,可以申请。
第一个申请需要在第一个库存拿3个,第二个库存拿6个。
第二个申请需要在第二个库存拿2个,第三个库存拿1个。
第三个申请在第三个库存直接拿三个。
public List<ApplyDetail> addNewDetail(Apply apply, Map<String, IfPickingLine60Detail> lineDetailMap,
Map<String, List<InputWasteBook>> inputWasteListMap) {
List<ApplyDetail> applyDetailList = new ArrayList<>();
//用于存储每个流水使用的amount
Map<String, BigDecimal> inputWasteBookIdMap = new HashMap<>();
for (Map.Entry<String, IfPickingLine60Detail> entry : lineDetailMap.entrySet()) {
String key = entry.getKey();
IfPickingLine60Detail ifPickingLine60Detail = entry.getValue();
List<InputWasteBook> inputWasteBookList = inputWasteListMap.get(key);
BigDecimal pickingAmount = new BigDecimal(ifPickingLine60Detail.getPickingAmount());//100
BigDecimal sumAmount = new BigDecimal("0");
for (InputWasteBook inputWasteBook : inputWasteBookList) {
BigDecimal preAmount = inputWasteBookIdMap.get(inputWasteBook.getId()) == null ? BigDecimal.ZERO : inputWasteBookIdMap.get(inputWasteBook.getId());
BigDecimal usAbleAmount = inputWasteBook.getAmount().subtract(inputWasteBook.getPreAmount().add(preAmount)).subtract(inputWasteBook.getBeyondPreAmount());
BigDecimal amount;
if (usAbleAmount.compareTo(BigDecimal.ZERO) == 0) {
continue;
}
if (pickingAmount.compareTo(sumAmount.add(usAbleAmount)) >= 0) { // 领料数量大于等于 已领用数量+可用数量
amount = usAbleAmount;
//inputWasteBook.setPreAmount(inputWasteBook.getPreAmount().add(amount));
inputWasteBookIdMap.put(inputWasteBook.getId(), inputWasteBookIdMap.get(inputWasteBook.getId()) == null ? amount : inputWasteBookIdMap.get(inputWasteBook.getId()).add(amount));
} else { // 领料数量小于可用数量
amount = pickingAmount.subtract(sumAmount);
//inputWasteBook.setPreAmount(inputWasteBook.getPreAmount().add(amount));
inputWasteBookIdMap.put(inputWasteBook.getId(), inputWasteBookIdMap.get(inputWasteBook.getId()) == null ? amount : inputWasteBookIdMap.get(inputWasteBook.getId()).add(amount));
}
// 设置领用申请明细
applyDetailList.add(modifyApplyDetail(inputWasteBook, ifPickingLine60Detail, apply, amount));
sumAmount = sumAmount.add(usAbleAmount);
if (pickingAmount.compareTo(sumAmount) <= 0) {
break;
}
}
//另一种思路是用修改后的list把map中的lsit给覆盖掉 //inputWasteListMap.put(key, inputWasteBookList);
}
if (!applyDetailList.isEmpty()) {
List<ApplyPreempt> applyPreempts = applyDetailList.stream().map(applyDetail -> applyDetailCmdService.buildStockPreempt(applyDetail)).collect(Collectors.toList());
applyPreempts.forEach(applyPreempt -> applyPreemptCmdService.createApplyPreempt(applyPreempt, false));
}
return applyDetailList;
}