|
|
@@ -51,6 +51,9 @@ public class FlashDeliveryApplicationService {
|
|
|
private static final Set<String> WEIGHT_RANGES = Set.of("UP_TO_5_KG", "OVER_5_TO_10_KG",
|
|
|
"OVER_10_TO_15_KG", "OVER_15_TO_20_KG");
|
|
|
private static final Set<String> DELIVERY_MODES = Set.of("NOW", "SCHEDULED");
|
|
|
+ /** 支付方式取值与主订单系统同域:4=现金、6=线下转账(027 线下转账支付)。 */
|
|
|
+ private static final String PAY_TYPE_CASH = "4";
|
|
|
+ private static final String PAY_TYPE_TRANSFER = "6";
|
|
|
private static final DateTimeFormatter PRICING_TIME_FORMAT = DateTimeFormatter.ofPattern("HH:mm");
|
|
|
private static final ZoneId TAIPEI = ZoneId.of("Asia/Taipei");
|
|
|
private static final int MAX_DISTANCE_METERS = 40_000;
|
|
|
@@ -152,6 +155,7 @@ public class FlashDeliveryApplicationService {
|
|
|
String deliveryMode = normalizeDeliveryMode(request.getDeliveryMode());
|
|
|
validateSchedule(deliveryMode, request.getScheduledPickupStartAt(), request.getScheduledPickupEndAt(), now);
|
|
|
boolean pinRequired = request.getPinRequired() == null || request.getPinRequired();
|
|
|
+ String payType = normalizePayType(request.getPayType());
|
|
|
List<String> senderImages = validateProofUrls(request.getSenderImageUrls(), false);
|
|
|
FlashDeliveryOrder order = new FlashDeliveryOrder();
|
|
|
order.setOrderNo("FD" + UUID.randomUUID().toString().replace("-", "").substring(0, 24).toUpperCase(Locale.ROOT));
|
|
|
@@ -177,6 +181,7 @@ public class FlashDeliveryApplicationService {
|
|
|
order.setEstimatedDurationSeconds(quote.route().durationSeconds());
|
|
|
order.setAmount(quote.breakdown().getAmount());
|
|
|
order.setCurrency("TWD");
|
|
|
+ order.setPayType(payType);
|
|
|
order.setPricingId(quote.pricing().getId());
|
|
|
order.setPricingVersion(quote.pricing().getConfigVersion());
|
|
|
order.setPricingStartTime(quote.pricing().getStartTime());
|
|
|
@@ -801,6 +806,7 @@ public class FlashDeliveryApplicationService {
|
|
|
view.setPickupDetailAddress(order.getPickupAddressDetail());
|
|
|
view.setDeliveryAddress(order.getDeliveryAddress());
|
|
|
view.setDeliveryDetailAddress(order.getDeliveryAddressDetail());
|
|
|
+ view.setPayType(order.getPayType());
|
|
|
view.setPickupDistanceMeters(distanceMeters(longitude, latitude,
|
|
|
order.getPickupLongitude(), order.getPickupLatitude()));
|
|
|
view.setDistanceMeters(order.getDistanceMeters());
|
|
|
@@ -878,6 +884,7 @@ public class FlashDeliveryApplicationService {
|
|
|
view.setTipAmount(order.getTipAmount());
|
|
|
view.setAmount(order.getAmount());
|
|
|
view.setCurrency(order.getCurrency());
|
|
|
+ view.setPayType(order.getPayType());
|
|
|
view.setUserNote(includeSensitiveFields ? order.getUserNote() : null);
|
|
|
view.setAcceptedAt(order.getAcceptedAt());
|
|
|
view.setPickedUpAt(order.getPickedUpAt());
|
|
|
@@ -1039,6 +1046,14 @@ public class FlashDeliveryApplicationService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /** 支付方式与主订单系统同域(4=现金、6=线下转账);闪送款项直达骑手,仅允许线下方式,缺省现金,下单后锁定。 */
|
|
|
+ private String normalizePayType(String payType) {
|
|
|
+ if (!hasText(payType)) return PAY_TYPE_CASH;
|
|
|
+ String trimmed = payType.trim();
|
|
|
+ if (PAY_TYPE_CASH.equals(trimmed) || PAY_TYPE_TRANSFER.equals(trimmed)) return trimmed;
|
|
|
+ throw fail("flash.delivery.pay.type.invalid");
|
|
|
+ }
|
|
|
+
|
|
|
private String pricingTargetTime(Date date) {
|
|
|
return PRICING_TIME_FORMAT.format(Instant.ofEpochMilli(date.getTime())
|
|
|
.atZone(TAIPEI).toLocalTime());
|