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 io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.dom4j.tree.DefaultText;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

/**
 * 技师信息实体类
 * <p>
 * 该类用于映射技师表(t_js)，存储技师的基本信息、资质证书、服务状态、位置信息等。
 * 支持技师的注册、审核、上岗、接单等业务流程。
 * </p>
 *
 * @author ylx
 * @version 1.0
 * @since 2024-01-01
 */
@Getter
@Setter
@Accessors(chain = true)
@TableName(value = "t_js", autoResultMap = true)
@ApiModel(value = "TJs", description = "技师信息实体")
public class TJs implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键ID
     */
    @TableId("id")
    @ApiModelProperty("主键ID")
    private String id;

    /**
     * 微信OpenID
     * 用于关联微信用户身份
     */
    @TableField("c_open_id")
    @ApiModelProperty("微信OpenID")
    private String cOpenId;

    /**
     * 所在城市
     */
    @TableField("city")
    @ApiModelProperty("所在城市")
    private String city;

    /**
     * 技师等级
     * 表示技师的专业级别
     */
    @TableField("js_grade")
    @ApiModelProperty("技师等级")
    private Integer jsGrade;

    /**
     * 技师视频介绍
     * 存储视频文件的URL地址
     */
    @ApiModelProperty("技师视频介绍")
    private String cVideo;

    /**
     * 可预约项目编号列表
     */
    @TableField(value = "c_bh_list")
    @ApiModelProperty("可预约项目编号列表")
    private String cBhList;

    /**
     * 生活照图片列表
     * 以JSONArray格式存储，包含技师的生活照片URL
     */
    @TableField(value = "c_img_list", typeHandler = FastjsonTypeHandler.class)
    @ApiModelProperty("生活照图片列表")
    private JSONArray cImgList;

    /**
     * 身份证图片列表
     * 以JSONArray格式存储，包含身份证正反面照片
     */
    @TableField(value = "c_sfz_img", typeHandler = FastjsonTypeHandler.class)
    @ApiModelProperty("身份证图片列表")
    private JSONArray cSfzImg;

    /**
     * 性别
     * 0-女，1-男
     */
    @TableField("n_sex")
    @ApiModelProperty("性别 0-女 1-男")
    private Integer nSex;

    /**
     * 技师昵称
     * 显示给用户看的昵称
     */
    @TableField("c_nick_name")
    @ApiModelProperty("昵称")
    private String cNickName;

    /**
     * 头像URL
     * 技师头像图片地址
     */
    @TableField("c_portrait")
    @ApiModelProperty("头像URL")
    private String cPortrait;

    /**
     * 技师真实姓名
     * 技师身份证真实姓名
     */
    @TableField("c_name")
    @ApiModelProperty("真实姓名")
    private String cName;

    /**
     * 技师联系电话
     * 技师手机号码
     */
    @TableField("c_phone")
    @ApiModelProperty("联系电话")
    private String cPhone;

    /**
     * 居住地址
     * 技师常住地址
     */
    @TableField("c_address")
    @ApiModelProperty("居住地址")
    private String cAddress;

    /**
     * 健康证图片URL
     * 用于证明技师身体健康状况
     */
    @TableField("health_certificate")
    @ApiModelProperty("健康证图片URL")
    private String healthCertificate;

    /**
     * 营业执照图片URL
     * 个体工商户营业执照
     */
    @TableField("business_license")
    @ApiModelProperty("营业执照图片URL")
    private String businessLicense;

    /**
     * 按摩师资格证图片URL
     * 专业技能认证证书
     */
    @TableField("certification")
    @ApiModelProperty("按摩师资格证图片URL")
    private String certification;

    /**
     * 无犯罪记录证明图片URL
     * 用于背景调查
     */
    @TableField("no_crime")
    @ApiModelProperty("无犯罪记录证明图片URL")
    private String noCrime;

    /**
     * 部门ID
     * 关联的部门/机构标识
     */
    @TableField("dept_id")
    @ApiModelProperty("部门ID")
    private String deptId;

    /**
     * 白天免车费公里数
     * 白天时段（如6:00-18:00）免收车费的距离上限
     */
    @TableField("daytime_mileage")
    @ApiModelProperty("白天免车费公里数")
    private BigDecimal daytimeMileage;

    /**
     * 夜间免车费公里数
     * 夜间时段（如18:00-6:00）免收车费的距离上限
     */
    @TableField("nigth_mileage")
    @ApiModelProperty("夜间免车费公里数")
    private BigDecimal nigthMileage;

    /**
     * 技师个人简介
     * 技师自我介绍文字描述
     */
    @TableField("c_jianjie")
    @ApiModelProperty("个人简介")
    private String cJianjie;

    /**
     * 评分
     * 用户对技师的评分，通常为1-5分
     */
    @TableField("n_star")
    @ApiModelProperty("评分")
    private Integer nStar;

    /**
     * 佣金比例
     * 技师从订单金额中获取的佣金百分比
     */
    @TableField("n_bili")
    @ApiModelProperty("佣金比例")
    private Integer nBili;

    /**
     * 经度
     * 技师当前位置的经度坐标
     */
    @TableField("longitude")
    @ApiModelProperty("经度")
    private BigDecimal longitude;

    /**
     * 纬度
     * 技师当前位置的纬度坐标
     */
    @TableField("latitude")
    @ApiModelProperty("纬度")
    private BigDecimal latitude;

    /**
     * 已服务数量
     * 技师累计完成的订单总数
     */
    @TableField("n_num")
    @ApiModelProperty("已服务订单数量")
    private Integer nNum;

    /**
     * 技师类型
     * 0-真实技师（真实存在的技师）
     * 1-虚拟技师（用于模拟服务场景）
     */
    @TableField("tech_type")
    @ApiModelProperty("技师类型 0-真实技师 1-虚拟技师")
    private Integer techType;

    /**
     * 服务状态
     * 0-可服务（空闲可接单）
     * 1-服务中（正在服务无法接单）
     * 2-不可服务（临时无法接单）
     */
    @TableField("n_status")
    @ApiModelProperty("服务状态 0-可服务 1-服务中 2-不可服务")
    private Integer nStatus;

    /**
     * 上岗状态
     * -1-未上岗（未通过审核或已下岗）
     * 0-已上岗（可接单状态）
     * 1-已申请上岗（待审核）
     */
    @TableField("n_status2")
    @ApiModelProperty("上岗状态 -1-未上岗 0-已上岗 1-已申请")
    private Integer nStatus2;

    /**
     * 审核状态
     * 0-待审核（初始状态）
     * 1-已通过（审核通过）
     * 2-驳回（审核不通过）
     * 3-拉黑（被封禁）
     */
    @TableField("n_tong")
    @ApiModelProperty("审核状态 0-待审核 1-已通过 2-驳回 3-拉黑")
    private Integer nTong;

    /**
     * 注册时间
     * 技师首次注册的时间
     */
    @TableField("c_time")
    @ApiModelProperty("注册时间")
    private Date cTime;

    /**
     * 是否带头像框标识
     * 0-否，1-是（用于特殊标识或VIP展示）
     */
    @TableField("n_b1")
    @ApiModelProperty("是否带头像框 0-否 1-是")
    private Integer nB1;

    /**
     * 是否新技师标识
     * 0-否，1-是（用于新人推荐）
     */
    @TableField("n_b2")
    @ApiModelProperty("是否新技师 0-否 1-是")
    private Integer nB2;

    /**
     * 是否有热度标识
     * 0-否，1-是（用于热门技师推荐）
     */
    @TableField("n_b3")
    @ApiModelProperty("是否有热度 0-否 1-是")
    private Integer nB3;

    /**
     * 创建时间
     * 记录创建的时间戳
     */
    @TableField("dt_create_time")
    @ApiModelProperty("创建时间")
    private LocalDateTime dtCreateTime;

    /**
     * 地址名称
     * 位置名称（如某某小区、某某大厦）
     */
    @TableField("name")
    @ApiModelProperty("地址名称")
    private String name;

    /**
     * 详细地址
     * 完整的街道地址信息
     */
    @TableField("address")
    @ApiModelProperty("详细地址")
    private String address;

    /**
     * 退回原因
     * 审核被驳回时填写的原因说明
     */
    @TableField("reason_refusal")
    @ApiModelProperty("审核驳回原因")
    private String reasonRefusal;

    /**
     * 逻辑删除标识
     * 0-未删除，1-已删除
     */
    @ApiModelProperty("逻辑删除标识 0-未删除 1-已删除")
    @TableLogic
    private Integer isDelete;

    /**
     * 收藏数量
     * 当前技师被用户收藏的总次数（非持久化字段）
     */
    @TableField(exist = false)
    @ApiModelProperty("收藏数量")
    private Integer number;

    /**
     * 点赞数量
     * 用户对技师的点赞数
     */
    @ApiModelProperty("点赞数量")
    private Integer nZan;

    /**
     * 当前用户是否收藏
     * 用于前端显示收藏状态（非持久化字段）
     */
    @TableField(exist = false)
    @ApiModelProperty("当前用户是否收藏")
    private Boolean isCollection;

    /**
     * 技师距离
     * 当前用户与技师之间的距离，单位：公里（非持久化字段）
     */
    @TableField(exist = false)
    @ApiModelProperty("技师距离（公里）")
    private BigDecimal distance = BigDecimal.valueOf(10000L);

    /**
     * 页面类型
     * 1-技师页，2-审核页（用于区分不同展示场景）
     */
    @TableField(exist = false)
    @ApiModelProperty("页面类型 1-技师 2-审核")
    private Integer pageType;

    /**
     * 技师服务项目列表
     * 关联查询的服务项目信息（非持久化字段）
     */
    @TableField(exist = false)
    @ApiModelProperty("技师服务项目列表")
    private List<TXiangmu> projects;

    /**
     * 技师评价列表
     * 关联查询的用户评价信息（非持久化字段）
     */
    @TableField(exist = false)
    @ApiModelProperty("技师评价列表")
    private List<TComment> comments;

    /**
     * 技师推广二维码Ticket
     * 用于生成技师专属推广二维码
     */
    @ApiModelProperty("技师推广二维码Ticket")
    private String ticket;

    /**
     * 虚拟订单数量
     */
    @TableField("virtual_order_number")
    @ApiModelProperty("虚拟订单数量")
    private Integer virtualOrderNumber;

    /**
     * 录音
     * 用于存储技师的录音文件路径
     */
    @TableField("recording")
    @ApiModelProperty("录音")
    private String recording;

    /**
     * 录像
     * 用于存储技师的视频录音文件路径
     */
    @TableField("video_recording")
    @ApiModelProperty("录像")
    private String videoRecording;

    /**
     * 承诺书
     * 用于存储技师的服务承诺描述
     */
    @TableField("commitment")
    @ApiModelProperty("承诺书")
    private String commitment;

    /**
     * 虚拟技师数量
     */
    @TableField("virtual_tech_number")
    @ApiModelProperty("虚拟技师数量")
    private Integer virtualTechNumber;

    @ApiModelProperty("可服务三级地区code，逗号分隔")
    private String serviceAreaCodes;

    @ApiModelProperty("前端选中的地区完整JSON")
    private String serviceAreaJson;

    public String getcVideo() {
        return cVideo;
    }

    public void setcVideo(String cVideo) {
        this.cVideo = cVideo;
    }


    public String getcOpenId() {
        return cOpenId;
    }

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

    public String getcBhList() {
        return cBhList;
    }

    public void setcBhList(String cBhList) {
        this.cBhList = cBhList;
    }

    public JSONArray getcImgList() {
        return cImgList;
    }

    public void setcImgList(JSONArray cImgList) {
        this.cImgList = cImgList;
    }

    public JSONArray getcSfzImg() {
        return cSfzImg;
    }

    public void setcSfzImg(JSONArray cSfzImg) {
        this.cSfzImg = cSfzImg;
    }

    public Integer getnSex() {
        return nSex;
    }

    public void setnSex(Integer nSex) {
        this.nSex = nSex;
    }

    public String getcNickName() {
        return cNickName;
    }

    public void setcNickName(String cNickName) {
        this.cNickName = cNickName;
    }

    public String getcPortrait() {
        return cPortrait;
    }

    public void setcPortrait(String cPortrait) {
        this.cPortrait = cPortrait;
    }

    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 getcAddress() {
        return cAddress;
    }

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

    public String getcJianjie() {
        return cJianjie;
    }

    public void setcJianjie(String cJianjie) {
        this.cJianjie = cJianjie;
    }

    public Integer getnStar() {
        return nStar;
    }

    public void setnStar(Integer nStar) {
        this.nStar = nStar;
    }

    public Integer getnBili() {
        return nBili;
    }

    public void setnBili(Integer nBili) {
        this.nBili = nBili;
    }

    public Integer getnNum() {
        return nNum;
    }

    public void setnNum(Integer nNum) {
        this.nNum = nNum;
    }

    public Integer getnStatus() {
        return nStatus;
    }

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

    public Integer getnStatus2() {
        return nStatus2;
    }

    public void setnStatus2(Integer nStatus2) {
        this.nStatus2 = nStatus2;
    }

    public Integer getnTong() {
        return nTong;
    }

    public void setnTong(Integer nTong) {
        this.nTong = nTong;
    }

    public Date getcTime() {
        return cTime;
    }

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

    public Integer getnB1() {
        return nB1;
    }

    public void setnB1(Integer nB1) {
        this.nB1 = nB1;
    }

    public Integer getnB2() {
        return nB2;
    }

    public void setnB2(Integer nB2) {
        this.nB2 = nB2;
    }

    public Integer getnB3() {
        return nB3;
    }

    public void setnB3(Integer nB3) {
        this.nB3 = nB3;
    }

    public LocalDateTime getDtCreateTime() {
        return dtCreateTime;
    }

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

    public Integer getNumber() {
        return number;
    }

    public void setNumber(Integer number) {
        this.number = number;
    }


    public String getServiceAreaCodes() {
        return serviceAreaCodes;
    }

    public void setServiceAreaCodes(String serviceAreaCodes) {
        this.serviceAreaCodes = serviceAreaCodes;
    }

    public String getServiceAreaJson() {
        return serviceAreaJson;
    }

    public void setServiceAreaJson(String serviceAreaJson) {
        this.serviceAreaJson = serviceAreaJson;
    }
}
