| | |
| | | private WarehouseAreasItemService warehouseAreasItemService; |
| | | @Autowired |
| | | private ConfigService configService; |
| | | @Autowired |
| | | private TaskItemService taskItemService; |
| | | @Autowired |
| | | private TaskService taskService; |
| | | |
| | | /** |
| | | * 云仓改单/取消前:任务明细已关联该单据且主任务未逻辑删除则不允许 |
| | | */ |
| | | private void assertWkOrderNoLinkedTask(Long wkOrderId) { |
| | | if (wkOrderId == null) { |
| | | return; |
| | | } |
| | | List<TaskItem> links = taskItemService.list(new LambdaQueryWrapper<TaskItem>() |
| | | .select(TaskItem::getTaskId) |
| | | .and(w -> w.eq(TaskItem::getOrderId, wkOrderId) |
| | | .or(o -> o.eq(TaskItem::getSourceId, wkOrderId) |
| | | .eq(TaskItem::getOrderType, OrderType.ORDER_OUT.type)))); |
| | | if (links.isEmpty()) { |
| | | return; |
| | | } |
| | | Set<Long> taskIds = links.stream().map(TaskItem::getTaskId).filter(Objects::nonNull).collect(Collectors.toSet()); |
| | | if (taskIds.isEmpty()) { |
| | | return; |
| | | } |
| | | if (taskService.count(new LambdaQueryWrapper<Task>().in(Task::getId, taskIds)) > 0) { |
| | | throw new CoolException("该单据已生成任务,不可修改、取消或删除!!"); |
| | | } |
| | | } |
| | | |
| | | /** 与取消接口一致:入库未执行、出库任务初始 */ |
| | | private static final List<Short> WK_ORDER_UNEXECUTED_EXCE_STATUSES = Collections.unmodifiableList( |
| | | Arrays.asList( |
| | | AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val, |
| | | AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val)); |
| | | |
| | | private void assertWkOrderExceStatusUnexecuted(WkOrder order, String actionVerb) { |
| | | if (!WK_ORDER_UNEXECUTED_EXCE_STATUSES.contains(order.getExceStatus())) { |
| | | throw new CoolException("仅未执行状态的单据可" + actionVerb + "!!"); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @author Ryan |
| | |
| | | WkOrder order = asnOrderService.getOne(new LambdaQueryWrapper<WkOrder>() |
| | | .eq(WkOrder::getPoCode, syncOrder.getOrderInternalCode())); |
| | | if (!Objects.isNull(order)) { |
| | | // 仅未执行状态可被 order/add 修改(入库未执行、出库任务初始) |
| | | List<Short> editableStatus = Arrays.asList(AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val |
| | | ,AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val |
| | | ,AsnExceStatus.ASN_EXCE_STATUS_RECEIPT_DONE.val |
| | | , AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val); |
| | | if (!editableStatus.contains(order.getExceStatus())) { |
| | | throw new CoolException("仅未执行状态的单据可修改!!"); |
| | | } |
| | | assertWkOrderNoLinkedTask(order.getId()); |
| | | assertWkOrderExceStatusUnexecuted(order, "修改"); |
| | | // 存在则修改(1 和 2 均走此处),组托校验在 mergeOrderWithPakin/updateOrderNoPakin 内 |
| | | long pakinCount = waitPakinItemService.count(new LambdaQueryWrapper<WaitPakinItem>() |
| | | .eq(WaitPakinItem::getAsnId, order.getId()).eq(WaitPakinItem::getDeleted, 0)); |
| | |
| | | /** |
| | | * @author Ryan |
| | | * @date 2025/8/20 |
| | | * @description: 单据修改--收货通知单/出库单/盘点单 |
| | | * @description: 单据修改--收货通知单/出库单/盘点单(对外接口已由 syncCheckOrder 承接时可不调用) |
| | | * @version 1.0 |
| | | */ |
| | | @Override |
| | | @Transactional(timeout = 60, rollbackFor = Exception.class) |
| | | public R syncOrderUpdate(List<SyncOrderParams> orders) { |
| | | orders.forEach(order -> { |
| | | List<Short> list = Arrays.asList(AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val, |
| | | AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val); |
| | | WkOrder wkOrder = asnOrderService.getOne(new LambdaQueryWrapper<WkOrder>() |
| | | .in(WkOrder::getExceStatus, list) |
| | | .eq(WkOrder::getCode, order.getOrderNo())); |
| | | if (Objects.isNull(wkOrder)) { |
| | | throw new CoolException("请确认单据:" + order.getOrderNo() + "是否已经执行或是否同步!!"); |
| | | } |
| | | assertWkOrderNoLinkedTask(wkOrder.getId()); |
| | | assertWkOrderExceStatusUnexecuted(wkOrder, "修改"); |
| | | order.getOrderItems().forEach(orderItem -> { |
| | | WkOrderItem wkOrderItem = asnOrderItemService.getOne(new LambdaUpdateWrapper<WkOrderItem>() |
| | | .eq(WkOrderItem::getMatnrCode, orderItem.getMatnr()) |
| | |
| | | throw new CoolException("单据不存在,无法取消!!请提供单据内码(orderInternalCode)或单号(orderNo)。"); |
| | | } |
| | | final WkOrder finalWkOrder = wkOrder; |
| | | assertWkOrderNoLinkedTask(finalWkOrder.getId()); |
| | | // 已组托不可取消 |
| | | long pakinCount = waitPakinItemService.count(new LambdaQueryWrapper<WaitPakinItem>() |
| | | .eq(WaitPakinItem::getAsnId, finalWkOrder.getId())); |
| | | if (pakinCount > 0) { |
| | | throw new CoolException("单据已组托,仅未组托状态可取消,请先解除组托!!"); |
| | | } |
| | | // 仅未执行状态可取消(入库未执行、出库任务初始) |
| | | List<Short> list = Arrays.asList(AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val, |
| | | AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val); |
| | | if (!list.contains(finalWkOrder.getExceStatus())) { |
| | | throw new CoolException("仅未执行状态的单据可取消!!"); |
| | | } |
| | | assertWkOrderExceStatusUnexecuted(finalWkOrder, "取消"); |
| | | order.getOrderItems().forEach(orderItem -> { |
| | | if (!asnOrderItemService.remove(new LambdaQueryWrapper<WkOrderItem>() |
| | | .eq(WkOrderItem::getMatnrCode, orderItem.getMatnr()) |