diff --git a/backend/src/main/java/com/linhelp/delivery/DeliveryAssignmentService.java b/backend/src/main/java/com/linhelp/delivery/DeliveryAssignmentService.java index 903d551..b7e7488 100644 --- a/backend/src/main/java/com/linhelp/delivery/DeliveryAssignmentService.java +++ b/backend/src/main/java/com/linhelp/delivery/DeliveryAssignmentService.java @@ -62,6 +62,7 @@ public class DeliveryAssignmentService { task.setBizType(BIZ_TYPE_GOODS_ORDER); task.setBizOrderId(order.getId()); task.setBizOrderNo(order.getOrderNo()); + ensureNotAssigned(task.getBizType(), task.getBizOrderId()); enrichAddressContact(task, order.getUserId(), order.getAddressId()); task.setAmountCent(order.getPayableAmountCent()); task.setRemark(order.getRemark()); @@ -82,6 +83,7 @@ public class DeliveryAssignmentService { task.setBizType(BIZ_TYPE_EXPRESS_ORDER); task.setBizOrderId(order.getId()); task.setBizOrderNo(order.getOrderNo()); + ensureNotAssigned(task.getBizType(), task.getBizOrderId()); task.setContactName(order.getContactName()); task.setContactPhone(order.getContactPhone()); task.setAddress(order.getDeliveryAddress()); @@ -107,6 +109,7 @@ public class DeliveryAssignmentService { task.setBizType(BIZ_TYPE_GROUP_BUY_ORDER); task.setBizOrderId(order.getId()); task.setBizOrderNo(order.getOrderNo()); + ensureNotAssigned(task.getBizType(), task.getBizOrderId()); enrichAddressContact(task, order.getUserId(), order.getAddressId()); task.setAmountCent(order.getAmountCent()); task.setRemark(order.getRemark()); @@ -171,6 +174,14 @@ public class DeliveryAssignmentService { return task; } + private void ensureNotAssigned(String bizType, Long bizOrderId) { + for (DeliveryOrderResponse task : tasks.values()) { + if (bizType.equals(task.getBizType()) && bizOrderId.equals(task.getBizOrderId())) { + throw new BizException("订单已派单"); + } + } + } + private void enrichAddressContact(DeliveryOrderResponse task, Long userId, Long addressId) { if (addressId == null) { return; diff --git a/backend/src/test/java/com/linhelp/delivery/DeliveryAssignmentServiceTests.java b/backend/src/test/java/com/linhelp/delivery/DeliveryAssignmentServiceTests.java index 8fc8f50..d20bdd0 100644 --- a/backend/src/test/java/com/linhelp/delivery/DeliveryAssignmentServiceTests.java +++ b/backend/src/test/java/com/linhelp/delivery/DeliveryAssignmentServiceTests.java @@ -69,6 +69,18 @@ class DeliveryAssignmentServiceTests { .hasMessageContaining("自提订单无需派单"); } + @Test + void cannotAssignSameGoodsOrderTwice() { + TestFixture fixture = new TestFixture(); + GoodsOrderResponse order = fixture.preparedDeliveryOrder(); + DeliveryUserResponse rider = fixture.rider(); + + fixture.assignmentService.assignGoodsOrder(order.getId(), rider.getId()); + + assertThatThrownBy(() -> fixture.assignmentService.assignGoodsOrder(order.getId(), rider.getId())) + .hasMessageContaining("订单已派单"); + } + private static class TestFixture { private final ProductService productService = new ProductService(); private final GoodsOrderService goodsOrderService = new GoodsOrderService(productService);