FulfillmentModels.java

package com.ecommerce.fulfillment.application.model;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

import java.math.BigDecimal;
import java.time.Instant;
import java.util.List;

public final class FulfillmentModels {

    private FulfillmentModels() {
    }

    public record DeliveryAddress(
            @JsonSerialize(using = ToStringSerializer.class)
            Long sourceAddressId,
            String recipientName,
            String phone,
            String province,
            String provinceCode,
            String city,
            String cityCode,
            String district,
            String districtCode,
            String detailAddress,
            String postalCode
    ) {
    }

    public record OrderPaidCommand(
            String eventId,
            String orderNo,
            Long userId,
            DeliveryAddress deliveryAddress
    ) {
    }

    public record ShipCommand(String carrier, String trackingNo, String operatorId) {
    }

    public record AddTraceCommand(
            String externalEventId,
            String nodeType,
            String description,
            String locationName,
            BigDecimal longitude,
            BigDecimal latitude,
            Instant occurredAt,
            String operatorId
    ) {
    }

    public record LogisticsTraceView(
            String externalEventId,
            String nodeType,
            String description,
            String locationName,
            BigDecimal longitude,
            BigDecimal latitude,
            Instant occurredAt
    ) {
    }

    public record ShipmentPositionView(
            String fulfillmentNo,
            String orderNo,
            String externalEventId,
            String nodeType,
            String locationName,
            BigDecimal longitude,
            BigDecimal latitude,
            Instant occurredAt
    ) {
    }

    public record NearbyShipmentPositionView(
            String fulfillmentNo,
            String orderNo,
            @JsonSerialize(using = ToStringSerializer.class)
            Long userId,
            String status,
            String nodeType,
            String locationName,
            BigDecimal longitude,
            BigDecimal latitude,
            BigDecimal distanceMeters,
            Instant occurredAt
    ) {
    }

    public record GeoCacheRebuildView(int scanned, int cached) {
    }

    public record FulfillmentStatusHistoryView(
            String fromStatus,
            String toStatus,
            String command,
            String reason,
            String operatorType,
            String operatorId,
            Instant createdAt
    ) {
    }

    public record FulfillmentView(
            String fulfillmentNo,
            String orderNo,
            @JsonSerialize(using = ToStringSerializer.class)
            Long userId,
            DeliveryAddress deliveryAddress,
            String status,
            String carrier,
            String trackingNo,
            List<FulfillmentStatusHistoryView> history,
            List<LogisticsTraceView> traces,
            int version,
            Instant createdAt,
            Instant updatedAt,
            Instant pickedAt,
            Instant packedAt,
            Instant shippedAt,
            Instant signedAt
    ) {
        public FulfillmentView {
            history = List.copyOf(history);
            traces = List.copyOf(traces);
        }
    }

    public record AfterSaleApprovedItem(
            int lineNo,
            @JsonSerialize(using = ToStringSerializer.class)
            Long skuId,
            long quantity,
            BigDecimal refundableAmount
    ) {
    }

    public record AfterSaleApprovedCommand(
            String eventId,
            String afterSaleNo,
            String orderNo,
            @JsonSerialize(using = ToStringSerializer.class)
            Long userId,
            @JsonSerialize(using = ToStringSerializer.class)
            Long warehouseId,
            String reservationNo,
            BigDecimal refundAmount,
            List<AfterSaleApprovedItem> items
    ) {
        public AfterSaleApprovedCommand {
            items = List.copyOf(items);
        }
    }

    public record SubmitReturnShipmentCommand(
            String carrier,
            String trackingNo
    ) {
    }

    public record ReturnItemView(
            int lineNo,
            @JsonSerialize(using = ToStringSerializer.class)
            Long skuId,
            long quantity,
            BigDecimal refundableAmount
    ) {
    }

    public record ReturnReceiptView(
            String returnReceiptNo,
            String afterSaleNo,
            String orderNo,
            @JsonSerialize(using = ToStringSerializer.class)
            Long userId,
            @JsonSerialize(using = ToStringSerializer.class)
            Long warehouseId,
            String reservationNo,
            String status,
            BigDecimal refundAmount,
            String carrier,
            String trackingNo,
            String inspectionRemark,
            List<ReturnItemView> items,
            int version,
            Instant createdAt,
            Instant updatedAt,
            Instant shippedAt,
            Instant receivedAt,
            Instant inspectedAt
    ) {
        public ReturnReceiptView {
            items = List.copyOf(items);
        }
    }
}