package com.ylx.massage.domain;

import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.ylx.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;

/**
 * 订单实体类
 * <p>
 * 对应数据库表 t_order，用于存储按摩服务订单的完整信息。
 * 包含订单基本信息、服务项目信息、用户信息、技师信息、支付信息、
 * 状态流转信息等多个维度的业务数据。
 *
 * 订单状态流转：
 * -1(待付款) → 0(待接单) → 1(已接单) → 6(已出发) → 2(已到达) → 3(服务中) → 4(待评价) → 5(已完成)
 * 特殊状态：-2(已取消)、-3(已拒绝)
 * </p>
 *
 * @author YJR
 * @version 1.0
 * @since 2023-12-30
 */
@Getter
@Setter
@Accessors(chain = true)
@TableName(value = "t_order", autoResultMap = true)
@ApiModel(value = "TOrder", description = "订单实体类")
public class TOrder implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 订单ID
     * 主键，唯一标识订单记录
     */
    @TableId("c_id")
    @ApiModelProperty("订单ID")
    private String cId;

    /**
     * 订单号
     * 系统生成的唯一订单编号，用于订单查询和标识
     */
    @Excel(name = "订单号")
    @TableField("order_no")
    @ApiModelProperty("订单号")
    private String orderNo;

    /**
     * 父订单号
     * 用于升级订单场景，记录原订单号
     */
    @TableField("parent_no")
    @ApiModelProperty("父订单号")
    private String parentNo;

    /**
     * 支付类型
     * 1-微信支付 2-余额支付 3-现金支付
     */
    @TableField("pay_type")
    @ApiModelProperty("支付类型:1微信支付 2:余额支付 3:现金支付")
    private Integer payType;

    /**
     * 订单类型
     * 0-普通订单 1-加钟订单 2-升级订单
     */
    @TableField("order_type")
    @ApiModelProperty("订单类型:0普通订单,1加钟订单,2升级订单")
    private Integer orderType;

    /**
     * 是否为虚拟技师订单
     * 0-否 1-是
     */
    @TableField("virtual_order_flag")
    @ApiModelProperty("是否为虚拟技师订单:0否,1是")
    private Integer virtualOrderFlag;

    /**
     * 虚拟技师订单分配情况（0：真实订单 1：未分配 2：已分配）
     */
    @TableField("virtual_order_allocation")
    @ApiModelProperty("虚拟技师订单分配情况（0：真实订单 1：未分配 2：已分配）")
    private Integer virtualOrderAllocation;

    /**
     * 技师ID
     */
    @TableField("c_js_id")
    @ApiModelProperty("技师ID")
    private String cJsId;

    /**
     * 老技师ID
     * 用于记录原技师信息，在换技师场景下使用
     */
    @TableField("old_js_id")
    @ApiModelProperty("老技师ID")
    private String oldJsId;



    /**
     * 超时原因
     * 订单超时的原因说明
     */
    @TableField("timeout_cause")
    @ApiModelProperty("超时原因")
    private String timeoutCause;

    /**
     * 音频
     * 订单相关的音频文件路径
     */
    @TableField("tape")
    @ApiModelProperty("音频")
    private String tape;

    /**
     * 车费
     * 根据距离和时段计算的车费金额
     */
    @TableField("fare")
    @ApiModelProperty("车费")
    private BigDecimal fare;

    /**
     * 距离
     * 技师与用户之间的距离，单位：公里
     */
    @TableField("distance")
    @ApiModelProperty("距离")
    private BigDecimal distance;


    /**
     * 优惠金额
     * 使用优惠券或其他优惠减免的金额
     */
    @TableField("preferential")
    @ApiModelProperty("优惠金额")
    private BigDecimal preferential;

    /**
     * 差价
     * 升级订单时，需要补交的差价金额
     */
    @TableField("price_difference")
    @ApiModelProperty("差价")
    private BigDecimal priceDifference;



    /**
     * 用户OpenID
     * 微信用户的唯一标识
     */
    @TableField("c_open_id")
    @ApiModelProperty("用户OpenID")
    private String cOpenId;

    /**
     * 经度
     * 用户地址的经度坐标
     */
    @ApiModelProperty("经度")
    private Double longitude;

    /**
     * 纬度
     * 用户地址的纬度坐标
     */
    @ApiModelProperty("纬度")
    private Double latitude;

    /**
     * 出发经度
     * 技师出发位置的经度
     */
    @ApiModelProperty("出发经度")
    private BigDecimal departLongitude;

    /**
     * 出发纬度
     * 技师出发位置的纬度
     */
    @ApiModelProperty("出发纬度")
    private BigDecimal departLatitude;

    /**
     * 到达经度
     * 技师到达用户位置的经度
     */
    @ApiModelProperty("到达经度")
    private BigDecimal arrivalLongitude;

    /**
     * 到达纬度
     * 技师到达用户位置的纬度
     */
    @ApiModelProperty("到达纬度")
    private BigDecimal arrivalLatitude;

    /**
     * 到达照片
     * 技师到达现场后拍摄的照片URL
     */
    @ApiModelProperty("到达照片")
    private String arrivalPhoto;

    /**
     * 出发时间
     * 技师出发前往用户地址的时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    @ApiModelProperty("出发时间")
    private Date departTime;

    /**
     * 支付时间
     * 用户完成支付的时间
     */
    @ApiModelProperty("支付时间")
    private Date payTime;

    /**
     * 详细地址
     * 用户提供的服务地址
     */
    @ApiModelProperty("详细地址")
    private String address;

    /**
     * 地址名称
     * 地址的别名或名称标识
     */
    @ApiModelProperty("地址名称")
    private String name;

    /**
     * 技师的接单时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    @ApiModelProperty("接单时间")
    private LocalDateTime acceptanceTime;

    /**
     * 到达时间
     * 技师到达用户地址的时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    @ApiModelProperty("到达时间")
    private LocalDateTime reachTime;

    /**
     * 开始服务时间
     * 技师开始提供服务的时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    @ApiModelProperty("开始服务时间")
    private LocalDateTime startTime;

    /**
     * 开始服务时间字符串
     */
    @TableField(exist = false)
    private String startTimeStr;

    /**
     * 结束时间
     * 技师完成服务的时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    @ApiModelProperty("结束时间")
    private LocalDateTime endTime;

    @TableField(exist = false)
    private String endTimeStr;

    /**
     * 拒接原因
     * 技师拒绝接单的原因说明
     */
    @ApiModelProperty("拒接原因")
    private String reasonRefusal;

    /**
     * 领取优惠券ID
     */
    @TableField("coupon_receive_id")
    @ApiModelProperty("领取优惠券ID")
    private String couponReceiveId;

    /**
     * 订单明细
     * JSON格式，包含服务项目的详细信息
     */
    @TableField(value = "c_goods", typeHandler = FastjsonTypeHandler.class)
    @ApiModelProperty("订单明细")
    private JSONArray cGoods;

    /**
     * 订单金额
     * 服务项目的基础金额总和
     */
    @TableField("d_total_money")
    @ApiModelProperty("订单金额")
    private BigDecimal dTotalMoney;

    /**
     * 总价
     * 订单最终金额 = 订单金额 + 车费 - 优惠金额
     */
    @Excel(name = "订单金额")
    @TableField("total_price")
    @ApiModelProperty("总价")
    private BigDecimal totalPrice;

    /**
     * 订单状态
     * -1-待付款 0-待接单 1-已接单 2-已到达 3-服务中 4-待评价（已完成）
     * 5-已完成（已评价） 6-已出发 -2-已取消 -3-已拒绝
     * 7：退单待审核 8：退单审核通过
     */
    @TableField("n_status")
    @ApiModelProperty("订单状态: -1待付款 0待接单 1已接单 6已出发 2已到达 3服务中 4待评价 5已完成 7：退单待审核 8：退单审核通过  -2已取消 -3已拒绝")
    private Integer nStatus;

    /**
     * 备注地址
     * 地址的补充说明或地标信息
     */
    @ApiModelProperty("备注地址")
    private String atlasAdd;

    /**
     * 地址
     * 用户提供的服务地址（冗余字段）
     */
    @TableField("c_address")
    @ApiModelProperty("地址")
    private String cAddress;


    /**
     * 用户姓名
     * 下单用户的真实姓名
     */
    @Excel(name = "用户姓名")
    @TableField("c_name")
    @ApiModelProperty("用户姓名")
    private String cName;

    /**
     * 用户电话
     * 下单用户的联系电话
     */
    @Excel(name = "用户电话")
    @TableField("c_phone")
    @ApiModelProperty("用户电话")
    private String cPhone;

    /**
     * 备注
     * 用户填写的订单备注信息
     */
    @TableField("c_note")
    @ApiModelProperty("备注")
    private String cNote;

    /**
     * 支付截止时间
     * 订单需要完成支付的截止时间
     */
    @TableField("c_time")
    @ApiModelProperty("支付截止时间")
    private String cTime;

    /**
     * 推荐者ID
     * 推荐用户的OpenID，用于分销统计
     */
    @TableField("c_tj_open_id")
    @ApiModelProperty("推荐者ID")
    private String cTjOpenId;

    /**
     * 部门ID
     * 订单所属的部门/城市标识
     */
    @TableField("dept_id")
    @ApiModelProperty("部门ID")
    private String deptId;

    /**
     * 部门名称
     * 订单所属的城市名称
     */
    @TableField("dept_name")
    @ApiModelProperty("部门名称")
    private String deptName;

    /**
     * 创建时间
     * 订单创建的时间
     */
    @Excel(name = "创建时间")
    @TableField("dt_create_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    @ApiModelProperty("创建时间")
    private LocalDateTime dtCreateTime;

    /**
     * 逻辑删除标记
     * 0-未删除（有效记录） 1-已删除
     */
    @ApiModelProperty("是否删除:0否1是")
    @TableLogic
    private Integer isDelete;


    /**
     * 技师信息
     * 非数据库字段，用于关联查询技师信息
     */
    @TableField(exist = false)
    @ApiModelProperty("技师信息")
    private TJs js;

    /**
     * 老技师信息
     * 非数据库字段，用于关联查询原技师信息
     */
    @TableField(exist = false)
    @ApiModelProperty("老技师信息")
    private TJs oldJs;

    /**
     * 剩余支付时间
     * 非数据库字段，用于计算订单支付的剩余时间（秒）
     */
    @TableField(exist = false)
    @ApiModelProperty("剩余支付时间(秒)")
    private Long remainingTime;

    /**
     * 技师姓名
     * 非数据库字段，用于关联查询技师姓名
     */
    @Excel(name = "技师姓名")
    @TableField(exist = false)
    @ApiModelProperty("技师姓名")
    private String jsName;

    /**
     * 技师昵称
     * 非数据库字段，用于关联查询技师昵称
     */
    @TableField(exist = false)
    @ApiModelProperty("技师昵称")
    @JsonProperty("cNickName")
    private String cNickName;

    /**
     * 技师电话
     * 非数据库字段，用于关联查询技师电话
     */
    @Excel(name = "技师电话")
    @TableField(exist = false)
    @ApiModelProperty("技师电话")
    private String jsPhone;

    /**
     * 用户信息
     * 非数据库字段，用于关联查询微信用户信息
     */
    @TableField(exist = false)
    @ApiModelProperty("用户信息")
    private TWxUser wxUser;

    /**
     * 订单状态名称
     * 非数据库字段，用于展示订单状态的文本描述
     */
    @TableField(exist = false)
    @Excel(name = "订单状态名称")
    @ApiModelProperty("订单状态名称")
    private String statusName;


    /**
     * 服务时长（分钟）
     */
    @TableField(exist = false)
    private String serviceDuration;

    public String getcId() {
        return cId;
    }

    public void setcId(String cId) {
        this.cId = cId;
    }

    public String getcJsId() {
        return cJsId;
    }

    public void setcJsId(String cJsId) {
        this.cJsId = cJsId;
    }

    public String getcOpenId() {
        return cOpenId;
    }

    public void setcOpenId(String cOpenId) {
        this.cOpenId = cOpenId;
    }

    public void setDepartLongitude(BigDecimal departLongitude) {
        this.departLongitude = departLongitude;
    }

    public BigDecimal getDepartLongitude() {
        return departLongitude;
    }

    public void setArrivalLongitude(BigDecimal arrivalLongitude) {
        this.arrivalLongitude = arrivalLongitude;
    }

    public BigDecimal getArrivalLongitude() {
        return arrivalLongitude;
    }

    public void setArrivalPhoto(String arrivalPhoto) {
        this.arrivalPhoto = arrivalPhoto;
    }

    public String getArrivalPhoto() {
        return arrivalPhoto;
    }

    public void setDepartTime(Date departTime) {
        this.departTime = departTime;
    }

    public Date getDepartTime() {
        return departTime;
    }

    public void setDepartLatitude(BigDecimal departLatitude) {
        this.departLatitude = departLatitude;
    }

    public BigDecimal getDepartLatitude() {
        return departLatitude;
    }

    public void setArrivalLatitude(BigDecimal arrivalLatitude) {
        this.arrivalLatitude = arrivalLatitude;
    }

    public BigDecimal getArrivalLatitude() {
        return arrivalLatitude;
    }

    public JSONArray getcGoods() {
        return cGoods;
    }

    public void setcGoods(JSONArray cGoods) {
        this.cGoods = cGoods;
    }

    public BigDecimal getdTotalMoney() {
        return dTotalMoney;
    }

    public void setdTotalMoney(BigDecimal dTotalMoney) {
        this.dTotalMoney = dTotalMoney;
    }

    public Integer getnStatus() {
        return nStatus;
    }

    public void setnStatus(Integer nStatus) {
        this.nStatus = nStatus;
    }

    public String getcAddress() {
        return cAddress;
    }

    public void setcAddress(String cAddress) {
        this.cAddress = cAddress;
    }

    public String getcName() {
        return cName;
    }

    public void setcName(String cName) {
        this.cName = cName;
    }

    public String getcPhone() {
        return cPhone;
    }

    public void setcPhone(String cPhone) {
        this.cPhone = cPhone;
    }

    public String getcNote() {
        return cNote;
    }

    public void setcNote(String cNote) {
        this.cNote = cNote;
    }

    public String getcTime() {
        return cTime;
    }

    public void setcTime(String cTime) {
        this.cTime = cTime;
    }

    public String getcTjOpenId() {
        return cTjOpenId;
    }

    public void setcTjOpenId(String cTjOpenId) {
        this.cTjOpenId = cTjOpenId;
    }

    public LocalDateTime getDtCreateTime() {
        return dtCreateTime;
    }

    public void setDtCreateTime(LocalDateTime dtCreateTime) {
        this.dtCreateTime = dtCreateTime;
    }

    public TJs getJs() {
        return js;
    }

    public void setJs(TJs js) {
        this.js = js;
    }

    public TWxUser getWxUser() {
        return wxUser;
    }

    public void setWxUser(TWxUser wxUser) {
        this.wxUser = wxUser;
    }
}
