diff --git a/backend/src/main/java/com/linhelp/delivery/DeliveryAssignmentService.java b/backend/src/main/java/com/linhelp/delivery/DeliveryAssignmentService.java index 8c64999..21ce837 100644 --- a/backend/src/main/java/com/linhelp/delivery/DeliveryAssignmentService.java +++ b/backend/src/main/java/com/linhelp/delivery/DeliveryAssignmentService.java @@ -9,6 +9,8 @@ import com.linhelp.express.ExpressOrderResponse; import com.linhelp.express.ExpressOrderService; import com.linhelp.order.GoodsOrderResponse; import com.linhelp.order.GoodsOrderService; +import com.linhelp.user.AddressResponse; +import com.linhelp.user.UserAddressService; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -27,15 +29,18 @@ public class DeliveryAssignmentService { private final DeliveryUserService deliveryUserService; private final GoodsOrderService goodsOrderService; private final ExpressOrderService expressOrderService; + private final UserAddressService addressService; private final AtomicLong ids = new AtomicLong(1L); private final Map tasks = new LinkedHashMap(); public DeliveryAssignmentService(DeliveryUserService deliveryUserService, GoodsOrderService goodsOrderService, - ExpressOrderService expressOrderService) { + ExpressOrderService expressOrderService, + UserAddressService addressService) { this.deliveryUserService = deliveryUserService; this.goodsOrderService = goodsOrderService; this.expressOrderService = expressOrderService; + this.addressService = addressService; } public synchronized DeliveryOrderResponse assignGoodsOrder(Long goodsOrderId, Long riderId) { @@ -51,7 +56,7 @@ public class DeliveryAssignmentService { task.setBizType(BIZ_TYPE_GOODS_ORDER); task.setBizOrderId(order.getId()); task.setBizOrderNo(order.getOrderNo()); - task.setAddress(order.getAddressId() == null ? null : "地址ID " + order.getAddressId()); + enrichGoodsContact(task, order); task.setAmountCent(order.getPayableAmountCent()); task.setRemark(order.getRemark()); tasks.put(task.getId(), task); @@ -147,6 +152,34 @@ public class DeliveryAssignmentService { return task; } + private void enrichGoodsContact(DeliveryOrderResponse task, GoodsOrderResponse order) { + if (order.getAddressId() == null) { + return; + } + AddressResponse address = addressService.detailMine(order.getUserId(), order.getAddressId()); + task.setContactName(address.getContactName()); + task.setContactPhone(address.getPhone()); + task.setAddress(buildDeliveryAddress(address)); + } + + private String buildDeliveryAddress(AddressResponse address) { + StringBuilder builder = new StringBuilder(); + append(builder, address.getBuilding()); + append(builder, address.getRoom()); + append(builder, address.getDetail()); + return builder.toString(); + } + + private void append(StringBuilder builder, String value) { + if (value == null || value.trim().isEmpty()) { + return; + } + if (builder.length() > 0) { + builder.append(' '); + } + builder.append(value); + } + private DeliveryOrderResponse require(Long id) { DeliveryOrderResponse task = tasks.get(id); if (task == null) { diff --git a/backend/src/test/java/com/linhelp/delivery/DeliveryAssignmentServiceTests.java b/backend/src/test/java/com/linhelp/delivery/DeliveryAssignmentServiceTests.java index 7908fb6..0d015cb 100644 --- a/backend/src/test/java/com/linhelp/delivery/DeliveryAssignmentServiceTests.java +++ b/backend/src/test/java/com/linhelp/delivery/DeliveryAssignmentServiceTests.java @@ -8,6 +8,9 @@ import com.linhelp.order.GoodsOrderResponse; import com.linhelp.order.GoodsOrderService; import com.linhelp.product.ProductService; import com.linhelp.product.ProductSkuResponse; +import com.linhelp.user.AddressRequest; +import com.linhelp.user.AddressResponse; +import com.linhelp.user.UserAddressService; import org.junit.jupiter.api.Test; import java.util.Collections; @@ -27,6 +30,9 @@ class DeliveryAssignmentServiceTests { assertThat(task.getBizType()).isEqualTo(DeliveryAssignmentService.BIZ_TYPE_GOODS_ORDER); assertThat(task.getStatus()).isEqualTo(DeliveryTaskStatus.ASSIGNED); assertThat(task.getRiderId()).isEqualTo(rider.getId()); + assertThat(task.getContactName()).isEqualTo("李女士"); + assertThat(task.getContactPhone()).isEqualTo("13800001000"); + assertThat(task.getAddress()).isEqualTo("1号楼 1201 东门旁"); } @Test @@ -43,8 +49,9 @@ class DeliveryAssignmentServiceTests { private final ProductService productService = new ProductService(); private final GoodsOrderService goodsOrderService = new GoodsOrderService(productService); private final DeliveryUserService deliveryUserService = new DeliveryUserService(); + private final UserAddressService addressService = new UserAddressService(); private final DeliveryAssignmentService assignmentService = - new DeliveryAssignmentService(deliveryUserService, goodsOrderService, null); + new DeliveryAssignmentService(deliveryUserService, goodsOrderService, null, addressService); private GoodsOrderResponse preparedDeliveryOrder() { return preparedOrder(DeliveryMethod.IMMEDIATE, 1L); @@ -55,12 +62,13 @@ class DeliveryAssignmentServiceTests { } private GoodsOrderResponse preparedOrder(DeliveryMethod deliveryMethod, Long addressId) { + Long resolvedAddressId = addressId == null ? null : address().getId(); ProductSkuResponse sku = productService.createDemoSku(1L, 1L, 1L, "500g", 990, 5); CreateGoodsOrderRequest request = new CreateGoodsOrderRequest(); request.setTenantId(1L); request.setCommunityId(1L); request.setMerchantId(1L); - request.setAddressId(addressId); + request.setAddressId(resolvedAddressId); request.setDeliveryMethod(deliveryMethod); request.setItems(Collections.singletonList(new CreateGoodsOrderItemRequest(1L, sku.getId(), 1))); GoodsOrderResponse order = goodsOrderService.create(1L, request); @@ -68,6 +76,18 @@ class DeliveryAssignmentServiceTests { return goodsOrderService.markPrepared(order.getId()); } + private AddressResponse address() { + AddressRequest request = new AddressRequest(); + request.setTenantId(1L); + request.setCommunityId(1L); + request.setContactName("李女士"); + request.setPhone("13800001000"); + request.setBuilding("1号楼"); + request.setRoom("1201"); + request.setDetail("东门旁"); + return addressService.create(1L, request); + } + private DeliveryUserResponse rider() { DeliveryUserRequest request = new DeliveryUserRequest(); request.setTenantId(1L); diff --git a/backend/src/test/java/com/linhelp/delivery/RiderTaskServiceTests.java b/backend/src/test/java/com/linhelp/delivery/RiderTaskServiceTests.java index f31fdc9..31d5fe4 100644 --- a/backend/src/test/java/com/linhelp/delivery/RiderTaskServiceTests.java +++ b/backend/src/test/java/com/linhelp/delivery/RiderTaskServiceTests.java @@ -9,6 +9,9 @@ import com.linhelp.order.GoodsOrderResponse; import com.linhelp.order.GoodsOrderService; import com.linhelp.product.ProductService; import com.linhelp.product.ProductSkuResponse; +import com.linhelp.user.AddressRequest; +import com.linhelp.user.AddressResponse; +import com.linhelp.user.UserAddressService; import org.junit.jupiter.api.Test; import java.util.Collections; @@ -60,18 +63,20 @@ class RiderTaskServiceTests { private final ProductService productService = new ProductService(); private final GoodsOrderService goodsOrderService = new GoodsOrderService(productService); private final DeliveryUserService deliveryUserService = new DeliveryUserService(); + private final UserAddressService addressService = new UserAddressService(); private final DeliveryAssignmentService assignmentService = - new DeliveryAssignmentService(deliveryUserService, goodsOrderService, null); + new DeliveryAssignmentService(deliveryUserService, goodsOrderService, null, addressService); private final RiderTaskService riderTaskService = new RiderTaskService(assignmentService, goodsOrderService, null); private GoodsOrderResponse preparedDeliveryOrder() { ProductSkuResponse sku = productService.createDemoSku(1L, 1L, 1L, "500g", 990, 5); CreateGoodsOrderRequest request = new CreateGoodsOrderRequest(); + AddressResponse address = address(); request.setTenantId(1L); request.setCommunityId(1L); request.setMerchantId(1L); - request.setAddressId(1L); + request.setAddressId(address.getId()); request.setDeliveryMethod(DeliveryMethod.IMMEDIATE); request.setItems(Collections.singletonList(new CreateGoodsOrderItemRequest(1L, sku.getId(), 1))); GoodsOrderResponse order = goodsOrderService.create(1L, request); @@ -79,6 +84,18 @@ class RiderTaskServiceTests { return goodsOrderService.markPrepared(order.getId()); } + private AddressResponse address() { + AddressRequest request = new AddressRequest(); + request.setTenantId(1L); + request.setCommunityId(1L); + request.setContactName("李女士"); + request.setPhone("13800001000"); + request.setBuilding("1号楼"); + request.setRoom("1201"); + request.setDetail("东门旁"); + return addressService.create(1L, request); + } + private DeliveryUserResponse rider(Long userId, String name) { DeliveryUserRequest request = new DeliveryUserRequest(); request.setTenantId(1L);