我的实战操作编程思路

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;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值