package com.tourism.webadmin.back.model;

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.tourism.common.core.annotation.*;
import com.tourism.common.core.base.model.BaseModel;
import com.tourism.common.core.upload.UploadStoreTypeEnum;
import com.tourism.webadmin.back.model.constant.Enable;
import com.tourism.webadmin.back.model.constant.Success;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 拼团设置主表实体对象。
 *
 * @author 吃饭睡觉
 * @date 2024-09-06
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName(value = "tour_project_group_purchase")
public class TourProjectGroupPurchase extends BaseModel {

    /**
     * 主键id。
     */
    @TableId(value = "id")
    private Long id;

    /**
     * 项目id。
     */
    @TableField(value = "project_id")
    private Long projectId;

    /**
     * 拼团结束时间。
     */
    @TableField(value = "end_time")
    private Date endTime;

    /**
     * 出行开始时间。
     */
    @TableField(value = "travel_start_time")
    private Date travelStartTime;

    /**
     * 出行结束时间。
     */
    @TableField(value = "travel_end_time")
    private Date travelEndTime;

    /**
     * 拼团状态(0禁用，1启用)。
     */
    @TableField(value = "state")
    private Integer state;

    /**
     * 逻辑删除标记字段(1: 正常 -1: 已删除)。
     */
    @TableLogic
    @TableField(value = "data_state")
    private Integer dataState;

    /**
     * 拼团人数上限。
     */
    @TableField(value = "max_count")
    private Integer maxCount;

    /**
     * 成人价格。
     */
    @TableField(value = "adult_price")
    private BigDecimal adultPrice;

    /**
     * 儿童价格。
     */
    @TableField(value = "children_price")
    private BigDecimal childrenPrice;

    /**
     * 显示顺序。
     */
    @TableField(value = "show_order")
    private Integer showOrder;

    /**
     * 关联字段(与从表)。
     */
    @TableField(value = "code")
    private Long code;

    /**
     * 当前拼团的人数。
     */
    @TableField(value = "now_count")
    private Integer nowCount;

    /**
     * 拼团是否成功(0.正在拼团;1.成功)。
     */
    @TableField(value = "success")
    private Integer success;

    /**
     * 拼团标题。
     */
    @TableField(value = "title")
    private String title;

    /**
     * 图片url。
     */
    @UploadFlagColumn(storeType = UploadStoreTypeEnum.HUAWEI_OBS_SYSTEM)
    @TableField(value = "image")
    private String image;

    /**
     * 价格单位。
     */
    @TableField(value = "price_unit")
    private String priceUnit;

    /**
     * 成人原价。
     */
    @TableField(value = "original_price")
    private BigDecimal originalPrice;

    /**
     * 儿童原价。
     */
    @TableField(value = "original_child_price")
    private BigDecimal originalChildPrice;

    /**
     * 返利价格/人。
     */
    @TableField(value = "single_rebate")
    private BigDecimal singleRebate;

    /**
     * endTime 范围过滤起始值(>=)。
     */
    @TableField(exist = false)
    private String endTimeStart;

    /**
     * endTime 范围过滤结束值(<=)。
     */
    @TableField(exist = false)
    private String endTimeEnd;

    /**
     * travelStartTime 范围过滤起始值(>=)。
     */
    @TableField(exist = false)
    private String travelStartTimeStart;

    /**
     * travelStartTime 范围过滤结束值(<=)。
     */
    @TableField(exist = false)
    private String travelStartTimeEnd;

    /**
     * travelEndTime 范围过滤起始值(>=)。
     */
    @TableField(exist = false)
    private String travelEndTimeStart;

    /**
     * travelEndTime 范围过滤结束值(<=)。
     */
    @TableField(exist = false)
    private String travelEndTimeEnd;

    /**
     * maxCount 范围过滤起始值(>=)。
     */
    @TableField(exist = false)
    private Integer maxCountStart;

    /**
     * maxCount 范围过滤结束值(<=)。
     */
    @TableField(exist = false)
    private Integer maxCountEnd;

    /**
     * adultPrice 范围过滤起始值(>=)。
     */
    @TableField(exist = false)
    private BigDecimal adultPriceStart;

    /**
     * adultPrice 范围过滤结束值(<=)。
     */
    @TableField(exist = false)
    private BigDecimal adultPriceEnd;

    /**
     * childrenPrice 范围过滤起始值(>=)。
     */
    @TableField(exist = false)
    private BigDecimal childrenPriceStart;

    /**
     * childrenPrice 范围过滤结束值(<=)。
     */
    @TableField(exist = false)
    private BigDecimal childrenPriceEnd;

    @RelationOneToOne(
            masterIdField = "projectId",
            slaveModelClass = TourismProject.class,
            slaveIdField = "id")
    @TableField(exist = false)
    private TourismProject tourismProject;

    @RelationDict(
            masterIdField = "projectId",
            equalOneToOneRelationField = "tourismProject",
            slaveModelClass = TourismProject.class,
            slaveIdField = "id",
            slaveNameField = "projectTitle")
    @TableField(exist = false)
    private Map<String, Object> projectIdDictMap;

    @RelationConstDict(
            masterIdField = "state",
            constantDictClass = Enable.class)
    @TableField(exist = false)
    private Map<String, Object> stateDictMap;



    @RelationOneToMany(
            masterIdField = "code",
            slaveModelClass = TourProjectGroupPurchaseDetail.class,
            slaveIdField = "groupPurchaseCode")
    @TableField(exist = false)
    private List<TourProjectGroupPurchase> tourProjectGroupPurchaseList;

    /**
     * 距离结束时间的天数。
     */
    @TableField(exist = false)
    private String diffDaysToEnd;

    @RelationConstDict(
            masterIdField = "success",
            constantDictClass = Success.class)
    @TableField(exist = false)
    private Map<String, Object> successDictMap;
    /**
     * 当前价格
     */
    @TableField(value = "now_price")
    private BigDecimal nowPrice;
    /**
     * 当前人数儿童价格
     */
    @TableField(value = "now_child_price")
    private BigDecimal nowChildPrice;
    /**
     * 下个阶段价格
     */
    @TableField(value = "next_price")
    private BigDecimal nextPrice;
    /**
     * 距离下个阶段还需要多少人
     */
    @TableField(value = "next_stage_num")
    private Integer nextStageNum;
}
