package com.tourguide.modules.order.dto; import com.tourguide.modules.order.entity.TourOrder; import java.math.BigDecimal; import java.time.LocalDateTime; /** 游客小程序个人订单列表项。 */ public class MiniOrderListResponse { private final Long id; private final String orderNo; private final String scenicName; private final String serviceName; private final Integer durationMinutes; private final Integer peopleCount; private final BigDecimal unitPrice; private final String priceUnit; private final BigDecimal totalAmount; private final LocalDateTime placedAt; private final String displayStatus; private MiniOrderListResponse(TourOrder order, String serviceName, Integer durationMinutes, String priceUnit, String displayStatus) { this.id = order.getId(); this.orderNo = order.getOrderNo(); this.scenicName = order.getScenicName(); this.serviceName = serviceName; this.durationMinutes = durationMinutes; this.peopleCount = order.getPeopleCount(); this.unitPrice = order.getUnitPrice(); this.priceUnit = priceUnit; this.totalAmount = order.getPaymentAmount() == null ? order.getAmount() : order.getPaymentAmount(); this.placedAt = order.getPlacedAt() == null ? order.getCreatedAt() : order.getPlacedAt(); this.displayStatus = displayStatus; } public static MiniOrderListResponse from(TourOrder order, boolean reviewed) { String orderType = order.getOrderType(); String serviceName; Integer durationMinutes; String priceUnit; if ("GROUP_PREMIUM".equals(orderType)) { serviceName = "拼团·精讲"; durationMinutes = 60; priceUnit = "人"; } else if ("PRIVATE_QUICK".equals(orderType)) { serviceName = "包团·快讲"; durationMinutes = 30; priceUnit = "团"; } else if ("PRIVATE_PREMIUM".equals(orderType)) { serviceName = "包团·精讲"; durationMinutes = 60; priceUnit = "团"; } else { serviceName = "拼团·快讲"; durationMinutes = 30; priceUnit = "人"; } return new MiniOrderListResponse( order, serviceName, durationMinutes, priceUnit, resolveDisplayStatus(order.getStatus(), reviewed)); } private static String resolveDisplayStatus(String orderStatus, boolean reviewed) { if ("PENDING_PAYMENT".equals(orderStatus)) { return "pendingPay"; } if ("PENDING_ACCEPT".equals(orderStatus) || "PENDING_MEETING".equals(orderStatus)) { return "pendingGuide"; } if ("IN_SERVICE".equals(orderStatus)) { return "serving"; } if ("COMPLETED".equals(orderStatus)) { return reviewed ? "completed" : "pendingReview"; } if ("REFUNDED".equals(orderStatus)) { return "refunded"; } return "canceled"; } public Long getId() { return id; } public String getOrderNo() { return orderNo; } public String getScenicName() { return scenicName; } public String getServiceName() { return serviceName; } public Integer getDurationMinutes() { return durationMinutes; } public Integer getPeopleCount() { return peopleCount; } public BigDecimal getUnitPrice() { return unitPrice; } public String getPriceUnit() { return priceUnit; } public BigDecimal getTotalAmount() { return totalAmount; } public LocalDateTime getPlacedAt() { return placedAt; } public String getDisplayStatus() { return displayStatus; } }