package com.tourguide.modules.order.dto;
|
|
import com.tourguide.modules.order.entity.TourOrder;
|
import com.tourguide.modules.operation.entity.ScenicMeetingPoint;
|
import java.math.BigDecimal;
|
import java.time.LocalDateTime;
|
import java.util.Collections;
|
import java.util.List;
|
|
/** 导游端订单列表与详情返回对象,仅暴露导游工作台需要的订单信息。 */
|
public class GuideOrderResponse {
|
private final Long id;
|
private final String orderNo;
|
private final Long scenicSpotId;
|
private final String scenicName;
|
private final String scenicShortName;
|
private final Long meetingPointId;
|
private final String meetingPointName;
|
private final String meetingPointAddress;
|
private final BigDecimal meetingPointLongitude;
|
private final BigDecimal meetingPointLatitude;
|
private final String serviceName;
|
private final Integer durationMinutes;
|
private final Integer quantity;
|
private final String status;
|
private final LocalDateTime receiveTime;
|
private final LocalDateTime receiveStartTime;
|
private final LocalDateTime lectureStartTime;
|
private final LocalDateTime lectureEndTime;
|
private final LocalDateTime completedAt;
|
private final BigDecimal earningAmount;
|
private final String customerPhone;
|
private final List<Customer> customers;
|
|
private GuideOrderResponse(TourOrder order, Integer configuredDurationMinutes, ScenicMeetingPoint meetingPoint) {
|
this.id = order.getId();
|
this.orderNo = order.getOrderNo();
|
this.scenicSpotId = order.getScenicSpotId();
|
this.scenicName = order.getScenicName();
|
this.scenicShortName = shortScenicName(order.getScenicName());
|
this.meetingPointId = order.getMeetingPointId() != null
|
? order.getMeetingPointId() : meetingPoint == null ? null : meetingPoint.getId();
|
this.meetingPointName = valueOrFallback(order.getMeetingPointName(),
|
meetingPoint == null ? null : meetingPoint.getPointName());
|
this.meetingPointAddress = meetingPoint == null ? null : meetingPoint.getAddress();
|
this.meetingPointLongitude = meetingPoint == null ? null : meetingPoint.getLongitude();
|
this.meetingPointLatitude = meetingPoint == null ? null : meetingPoint.getLatitude();
|
this.serviceName = serviceName(order);
|
this.durationMinutes = durationMinutes(configuredDurationMinutes, order.getOrderType());
|
this.quantity = order.getPeopleCount() == null ? 0 : order.getPeopleCount();
|
this.status = guideStatus(order.getStatus());
|
this.receiveTime = firstPresent(order.getAcceptedAt(), order.getPlacedAt(), order.getCreatedAt());
|
this.receiveStartTime = this.receiveTime;
|
this.lectureStartTime = firstPresent(order.getServiceStartedAt(), order.getArrivedAt());
|
this.lectureEndTime = order.getCompletedAt();
|
this.completedAt = order.getCompletedAt();
|
this.earningAmount = order.getGuideEarningAmount();
|
this.customerPhone = order.getVisitorMobile();
|
this.customers = Collections.singletonList(new Customer(
|
1,
|
order.getVisitorMobile(),
|
this.quantity,
|
firstPresent(order.getAcceptedAt(), order.getPlacedAt(), order.getCreatedAt())));
|
}
|
|
public static GuideOrderResponse from(TourOrder order) {
|
return from(order, null, null);
|
}
|
|
public static GuideOrderResponse from(TourOrder order, Integer configuredDurationMinutes) {
|
return from(order, configuredDurationMinutes, null);
|
}
|
|
public static GuideOrderResponse from(TourOrder order, Integer configuredDurationMinutes,
|
ScenicMeetingPoint meetingPoint) {
|
return new GuideOrderResponse(order, configuredDurationMinutes, meetingPoint);
|
}
|
|
private static String guideStatus(String orderStatus) {
|
if ("IN_SERVICE".equals(orderStatus)) { return "serving"; }
|
if ("COMPLETED".equals(orderStatus)) { return "completed"; }
|
if ("CANCELLED".equals(orderStatus) || "REFUNDED".equals(orderStatus)) { return "canceled"; }
|
return "accepted";
|
}
|
|
private static String serviceName(TourOrder order) {
|
if (order.getPackageName() != null && !order.getPackageName().trim().isEmpty()) {
|
return order.getPackageName();
|
}
|
if ("GROUP_PREMIUM".equals(order.getOrderType())) { return "拼团 · 精讲"; }
|
if ("PRIVATE_QUICK".equals(order.getOrderType())) { return "包团 · 快讲"; }
|
if ("PRIVATE_PREMIUM".equals(order.getOrderType())) { return "包团 · 精讲"; }
|
return "拼团 · 快讲";
|
}
|
|
private static Integer durationMinutes(Integer configuredDurationMinutes, String orderType) {
|
if (configuredDurationMinutes != null && configuredDurationMinutes > 0) {
|
return configuredDurationMinutes;
|
}
|
if ("GROUP_PREMIUM".equals(orderType) || "PRIVATE_PREMIUM".equals(orderType)) {
|
return 60;
|
}
|
return 30;
|
}
|
|
private static String shortScenicName(String scenicName) {
|
if (scenicName == null || scenicName.trim().isEmpty()) {
|
return "";
|
}
|
return scenicName.replace("景区", "");
|
}
|
|
private static String valueOrFallback(String value, String fallback) {
|
return value == null || value.trim().isEmpty() ? fallback : value;
|
}
|
|
private static LocalDateTime firstPresent(LocalDateTime first, LocalDateTime second) {
|
return first == null ? second : first;
|
}
|
|
private static LocalDateTime firstPresent(LocalDateTime first, LocalDateTime second, LocalDateTime third) {
|
return firstPresent(firstPresent(first, second), third);
|
}
|
|
public Long getId() { return id; }
|
public String getOrderNo() { return orderNo; }
|
public Long getScenicSpotId() { return scenicSpotId; }
|
public String getScenicName() { return scenicName; }
|
public String getScenicShortName() { return scenicShortName; }
|
public Long getMeetingPointId() { return meetingPointId; }
|
public String getMeetingPointName() { return meetingPointName; }
|
public String getMeetingPointAddress() { return meetingPointAddress; }
|
public BigDecimal getMeetingPointLongitude() { return meetingPointLongitude; }
|
public BigDecimal getMeetingPointLatitude() { return meetingPointLatitude; }
|
public String getServiceName() { return serviceName; }
|
public Integer getDurationMinutes() { return durationMinutes; }
|
public Integer getQuantity() { return quantity; }
|
public String getStatus() { return status; }
|
public LocalDateTime getReceiveTime() { return receiveTime; }
|
public LocalDateTime getReceiveStartTime() { return receiveStartTime; }
|
public LocalDateTime getLectureStartTime() { return lectureStartTime; }
|
public LocalDateTime getLectureEndTime() { return lectureEndTime; }
|
public LocalDateTime getCompletedAt() { return completedAt; }
|
public BigDecimal getEarningAmount() { return earningAmount; }
|
public String getCustomerPhone() { return customerPhone; }
|
public List<Customer> getCustomers() { return customers; }
|
|
public static class Customer {
|
private final int no;
|
private final String phone;
|
private final int people;
|
private final LocalDateTime time;
|
|
public Customer(int no, String phone, int people, LocalDateTime time) {
|
this.no = no;
|
this.phone = phone;
|
this.people = people;
|
this.time = time;
|
}
|
|
public int getNo() { return no; }
|
public String getPhone() { return phone; }
|
public int getPeople() { return people; }
|
public LocalDateTime getTime() { return time; }
|
}
|
}
|