| | |
| | | } |
| | | |
| | | int allocateCount = 0; |
| | | int erpReportCount = 0; |
| | | List<String> errors = new ArrayList<>(); |
| | | Set<String> affectedOrderNos = new HashSet<>(); |
| | | Map<String, OpenApiOrder> orderCache = new HashMap<>(); |
| | | |
| | | for (int i = 0; i < mappedDataArray.size(); i++) { |
| | | JSONObject row = mappedDataArray.getJSONObject(i); |
| | |
| | | doneQty = doneQty.setScale(2, RoundingMode.HALF_UP); |
| | | |
| | | try { |
| | | int singleAllocated = allocateMergedDoneQty(orderNo, matnrCode, batch, doneQty); |
| | | int singleAllocated = allocateMergedDoneQty(orderNo, matnrCode, batch, doneQty, orderCache); |
| | | allocateCount += singleAllocated; |
| | | erpReportCount += reportReadyLinesToErp(orderNo); |
| | | refreshOrderFinishStatus(orderNo); |
| | | affectedOrderNos.add(orderNo); |
| | | } catch (Exception e) { |
| | | log.error("处理回传失败,orderNo={}, matnr={}, batch={}", orderNo, matnrCode, batch, e); |
| | | errors.add("第" + (i + 1) + "行处理失败:" + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | // 反映射后组装ReportParams,参照旧链路上报ERP |
| | | // 循环结束后,每个受影响订单只刷新一次状态 |
| | | for (String orderNo : affectedOrderNos) { |
| | | refreshOrderFinishStatus(orderNo); |
| | | } |
| | | |
| | | // 反映射后组装ReportParams,参照旧链路上报ERP(一次性整单上报) |
| | | try { |
| | | ReportParams erpReportParams = buildReportParamsFromMappedData(mappedRoot, mappedDataArray); |
| | | CommonResponse erpResp = wmsErpService.reportOrders(erpReportParams); |
| | |
| | | |
| | | Map<String, Object> result = new HashMap<>(); |
| | | result.put("allocatedCount", allocateCount); |
| | | result.put("erpReportCount", erpReportCount); |
| | | return CommonResponse.ok(result); |
| | | } |
| | | |
| | |
| | | return event; |
| | | } |
| | | |
| | | private int allocateMergedDoneQty(String orderNo, String matnrCode, String batch, BigDecimal mergedDoneQty) { |
| | | OpenApiOrder order = openApiOrderMapper.selectOne(new LambdaQueryWrapper<OpenApiOrder>() |
| | | .eq(OpenApiOrder::getCode, orderNo) |
| | | .last("limit 1")); |
| | | private int allocateMergedDoneQty(String orderNo, String matnrCode, String batch, BigDecimal mergedDoneQty, Map<String, OpenApiOrder> orderCache) { |
| | | OpenApiOrder order = orderCache.computeIfAbsent(orderNo, k -> |
| | | openApiOrderMapper.selectOne(new LambdaQueryWrapper<OpenApiOrder>() |
| | | .eq(OpenApiOrder::getCode, k) |
| | | .last("limit 1"))); |
| | | if (Objects.isNull(order)) { |
| | | throw new CoolException("未找到订单:" + orderNo); |
| | | } |
| | |
| | | openApiOrderItemMapMapper.updateById(row); |
| | | openApiOrderItemMapper.update(null, new LambdaUpdateWrapper<OpenApiOrderItem>() |
| | | .eq(OpenApiOrderItem::getId, row.getSourceItemId()) |
| | | .setSql("qty = IFNULL(qty,0) + " + toAllocate)); |
| | | .setSql("qty = IFNULL(qty,0) + " + toAllocate.toPlainString())); |
| | | remaining = remaining.subtract(toAllocate).setScale(2, RoundingMode.HALF_UP); |
| | | allocateRows++; |
| | | } |
| | |
| | | .eq(OpenApiOrderItemMap::getOrderId, order.getId()) |
| | | .orderByAsc(OpenApiOrderItemMap::getSeqNo) |
| | | .orderByAsc(OpenApiOrderItemMap::getId)); |
| | | int successCount = 0; |
| | | |
| | | // 批量查询所有 sourceItemId 对应的 OpenApiOrderItem,消除 N+1 |
| | | List<Long> itemIds = mappings.stream() |
| | | .map(OpenApiOrderItemMap::getSourceItemId) |
| | | .filter(Objects::nonNull) |
| | | .distinct() |
| | | .toList(); |
| | | Map<Long, OpenApiOrderItem> itemMap = new HashMap<>(); |
| | | if (!itemIds.isEmpty()) { |
| | | List<OpenApiOrderItem> items = openApiOrderItemMapper.selectBatchIds(itemIds); |
| | | for (OpenApiOrderItem item : items) { |
| | | itemMap.put(item.getId(), item); |
| | | } |
| | | } |
| | | |
| | | int successCount = 0; |
| | | for (OpenApiOrderItemMap mapping : mappings) { |
| | | BigDecimal allocatedQty = defaultQty(mapping.getAllocatedQty()); |
| | | BigDecimal reportedQty = defaultQty(mapping.getReportedQty()); |
| | |
| | | continue; |
| | | } |
| | | |
| | | OpenApiOrderItem item = openApiOrderItemMapper.selectById(mapping.getSourceItemId()); |
| | | OpenApiOrderItem item = itemMap.get(mapping.getSourceItemId()); |
| | | if (Objects.isNull(item)) { |
| | | continue; |
| | | } |