package org.dromara.payment.bill.domain.vo;

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

import com.alibaba.excel.annotation.ExcelIgnore;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.sensitive.annotation.Sensitive;
import org.dromara.common.sensitive.core.SensitiveStrategy;
import org.dromara.payment.bill.domain.MerBillDetail;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;

import java.io.Serial;
import java.io.Serializable;
import java.util.Date;



/**
 * 账单明细视图对象 mer_bill_detail
 *
 * @author LionLi
 * @date 2024-04-08
 */
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = MerBillDetail.class)
public class MerBillDetailVo implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;


    /**
     * 添加时间
     */
    @ExcelProperty(value = "添加时间")
    private Date addTime;



    /**
     * 主键
     */
//    @ExcelProperty(value = "主键")
    @ExcelIgnore
    private Long id;

    /**
     * 项目子编号
     */
    @ExcelProperty(value = "项目子编号")
    private String cno;

    /**
     * 流水号(系统内部编号)
     */
    @ExcelProperty(value = "订单号")
    private String busNo;

    /**
     * 账单批次号
     */
    @ExcelProperty(value = "账单批次号")
    private String billNo;


    @ExcelProperty(value = "企业名称")
    private String  merName;

    @ExcelProperty(value = "服务商名称")
    private String  sydName;


    /**
     * 结算通道
     */
    @ExcelProperty(value = "结算通道")
    private String passage;


    /**
     * 账单id
     */
//    @ExcelProperty(value = "账单id")
    @ExcelIgnore
    private Long billId;

    /**
     * 自雇者id
     */
//    @ExcelProperty(value = "自雇者id")
    @ExcelIgnore
    private Long workerId;

    /**
     * 姓名
     */
    @ExcelProperty(value = "收款人")
    private String workerName;

    /**
     * 身份证号
     */
    @ExcelProperty(value = "身份证号")
    @Sensitive(strategy = SensitiveStrategy.ID_CARD)
    private String cardId;


    /**
     * 银行账号
     */
    @ExcelProperty(value = "结算账户")
    private String bankCard;

    /**
     * 手机号
     */
    @ExcelProperty(value = "手机号")
    @Sensitive(strategy = SensitiveStrategy.PHONE)
    private String workerPhone;

    /**
     * 自雇者报名id
     */
//    @ExcelProperty(value = "自雇者报名id")
    @ExcelIgnore
    private Long workerEnrollId;



    /**
     * 银行类型（字典）
     */
    @ExcelProperty(value = "银行类型", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "字=典")
    private String bankType;


    /**
     * 银行账户id
     */
    @ExcelIgnore
    private Integer bankAccId;

    /**
     * 开户行
     */
//    @ExcelProperty(value = "开户行")
    @ExcelIgnore
    private String bankCheque;


    /**
     * 账单金额(个人应得)
     */
    @ExcelIgnore
    private Long money;

    public String getMoneyStr() {
        return StringUtils.fenToYuanFormatter(this.money);
    }
    @ExcelProperty(value = "交易金额(元)")
    private String moneyStr;

    /**
     * 个税
     */
//    @ExcelProperty(value = "个税")
    @ExcelIgnore
    private Long raise;

    /**
     * 实收金额(账单金额-个人承担的服务费)（到手金额）
     */
//    @ExcelProperty(value = "实收金额(账单金额-个人承担的服务费)", converter = ExcelDictConvert.class)
//    @ExcelDictFormat(readConverterExp = "到=手金额")

    @ExcelIgnore
    private Long amount;

    public String getAmountStr() {
        return StringUtils.fenToYuanFormatter(this.amount);
    }

    @ExcelProperty(value="打款金额(元)")
    private String amountStr;

    /**
     * 支付结果（0:待支付 1:成功 2:失败 3:支付中 4:已取消）
     */
    @ExcelProperty(value = "打款状态", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "0=待支付,1=成功,2=失败,3=支付中,4=已取消")
    private Integer payStatus;

    /**
     * 支付时间
     */
    @ExcelProperty(value = "支付时间")
    private Date payTime;

    /**
     * 支付结果备注
     */
    @ExcelProperty(value = "备注")
    private String payRemark;

    /**
     * B2C回执单地址
     */
//    @ExcelProperty(value = "B2C回执单地址")
    @ExcelIgnore
    private String payReceipt;

    /**
     * 服务费(分)
     */
//    @ExcelProperty(value = "服务费(分)")
    @ExcelIgnore
    private Long serviceChargeMoney;


    /**
     * 交易号(银行流水号)
     */
    @ExcelProperty(value = "交易号(银行流水号)")
    private String bankNo;

    /**
     * 计算代理费金额（公司开票金额C/个人应得金额P）
     */
//    @ExcelProperty(value = "计算代理费金额", converter = ExcelDictConvert.class)
//    @ExcelDictFormat(readConverterExp = "公=司开票金额C/个人应得金额P")
    @ExcelIgnore
    private Long agentMoney;

    /**
     * 是否退款（0:否 1:是）
     */
//    @ExcelProperty(value = "是否退款", converter = ExcelDictConvert.class)
//    @ExcelDictFormat(readConverterExp = "0=:否,1=:是")
    @ExcelIgnore
    private Integer isRefund;

    /**
     * 退款时间
     */
//    @ExcelProperty(value = "退款时间")
    @ExcelIgnore
    private Date refundTime;

    /**
     * 三方订单号
     */
//    @ExcelProperty(value = "三方订单号")
    @ExcelIgnore
    private String outNo;

    /**
     * 是否三方订单（0:否 1:是）
     */
//    @ExcelProperty(value = "是否三方订单", converter = ExcelDictConvert.class)
//    @ExcelDictFormat(readConverterExp = "0=:否,1=:是")
    @ExcelIgnore
    private Long isOut;



    /**
     * 项目id
     */
//    @ExcelProperty(value = "项目id")
    @ExcelIgnore
    private Long taskId;

    /**
     * 项目编号
     */
//    @ExcelProperty(value = "项目编号")
    @ExcelIgnore
    private String taskNo;

    /**
     * 结算中心id
     */
//    @ExcelProperty(value = "结算中心id")
    @ExcelIgnore
    private Long sydId;

    /**
     * 结算中心编号
     */
//    @ExcelProperty(value = "结算中心编号")
    @ExcelIgnore
    private String sydNo;

    /**
     * 运营商编号
     */
//    @ExcelProperty(value = "运营商编号")
    @ExcelIgnore
    private String opNo;

    /**
     * 运营商id
     */
//    @ExcelProperty(value = "运营商id")
    @ExcelIgnore
    private Long opId;

    /**
     * 代理商id
     */
//    @ExcelProperty(value = "代理商id")
    @ExcelIgnore
    private Long channelId;

    /**
     * 代理商编号
     */
//    @ExcelProperty(value = "代理商编号")
    @ExcelIgnore
    private String channelNo;

    /**
     * 代理商上下级关系编码
     */
//    @ExcelProperty(value = "代理商上下级关系编码")
    @ExcelIgnore
    private String channelCode;

    /**
     * 商户id
     */
//    @ExcelProperty(value = "商户id")
    @ExcelIgnore
    private Long merId;

    /**
     * 商户编号
     */
//    @ExcelProperty(value = "商户编号")
    @ExcelIgnore
    private String merNo;

    /**
     * 业务类型(1:委托代征，2:自然人代开，3:个体户注册 4:临时税务登记 5：资金代发 6：派遣&外包
     */
//    @ExcelProperty(value = "业务类型(1:委托代征，2:自然人代开，3:个体户注册 4:临时税务登记 5：资金代发 6：派遣&外包")\
    @ExcelIgnore
    private Integer busType;

    /**
     * B2B回执单地址
     */
//    @ExcelProperty(value = "B2B回执单地址")
    @ExcelIgnore
    private String payReceiptB2b;

    @ExcelProperty(value = "计费模式", converter = ExcelDictConvert.class)
    @ExcelDictFormat(readConverterExp = "1=个人应得计费,2=开票金额计费")
//    @ExcelIgnore
    private Integer chargeMode;

    /**
     * 产品编号
     */
    @ExcelProperty(value = "产品编号")
//    @ExcelIgnore
    private String proNo;

    public String getShServiceChargeRateStr() {
        return StringUtils.perStr(this.shServiceChargeRate);
    }

    @ExcelProperty(value = "产品费率")
    private String  shServiceChargeRateStr;
    /**
     * 计费模式(1:个人应得计费、2:开票金额计费)
     */
//    @ExcelProperty(value = "计费模式(1:个人应得计费、2:开票金额计费)")
////    @ExcelIgnore
//    private Integer chargeMode;

    /**
     * 运营商服务费率
     */
//    @ExcelProperty(value = "运营商服务费率")
    @ExcelIgnore
    private BigDecimal opServiceChargeRate;


    public String getOpServiceChargeRateStr() {
        return StringUtils.perStr(this.opServiceChargeRate);
    }

    @ExcelProperty(value = "运营商服务费率")
    private String opServiceChargeRateStr;

    /**
     * 运营商分润(分)
     */
//    @ExcelProperty(value = "运营商分润(分)")
    @ExcelIgnore
    private Long opServiceChargeMoney;

    public String getOpServiceChargeMoneyStr() {
        return StringUtils.fenToYuanFormatter(this.opServiceChargeMoney);
    }
    @ExcelProperty(value = "运营商分润")
    private String opServiceChargeMoneyStr ;

    /**
     * 运营商名称
     */
    @ExcelProperty(value = "运营商名称")
//    @ExcelIgnore
    private String opName;

    /**
     * 孵化中心名称
     */
    @ExcelProperty(value = "孵化中心名称")
//    @ExcelIgnore
    private String fhzxChannelName;

    /**
     * 孵化中心服务费率
     */
//    @ExcelProperty(value = "孵化中心服务费率")
    @ExcelIgnore
    private BigDecimal fhzxServiceChargeRate;


    public String getFhzxServiceChargeRateStr() {
        return StringUtils.perStr(this.fhzxServiceChargeRate);
    }
    @ExcelProperty(value = "孵化中心服务费率")
    private String fhzxServiceChargeRateStr;


    /**
     * 孵化中心收益(分)
     */
//    @ExcelProperty(value = "孵化中心收益(分)")
    @ExcelIgnore
    private Long fhzxServiceChargeMoney;

    public String getFhzxServiceChargeMoneyStr() {
        return StringUtils.fenToYuanFormatter(this.fhzxServiceChargeMoney);
    }
    @ExcelProperty(value = "孵化中心收益")
    private String fhzxServiceChargeMoneyStr;

    /**
     * 孵化中心id
     */
//    @ExcelProperty(value = "孵化中心id")
    @ExcelIgnore
    private Long fhzxChannelId;


    /**
     * 总监名称
     */
    @ExcelProperty(value = "总监名称")
//    @ExcelIgnore
    private String zjChannelName;

    /**
     * 总监服务费率
     */
//    @ExcelProperty(value = "总监服务费率")
    @ExcelIgnore
    private BigDecimal zjServiceChargeRate;

    public String getZjServiceChargeRateStr() {
        return StringUtils.perStr(this.zjServiceChargeRate);
    }

    @ExcelProperty(value = "总监服务费率")
    private String zjServiceChargeRateStr;

    /**
     * 总监收益(分)
     */
//    @ExcelProperty(value = "总监收益(分)")
    @ExcelIgnore
    private Long zjServiceChargeMoney;

    public String getZjServiceChargeMoneyStr() {
        return StringUtils.fenToYuanFormatter(this.zjServiceChargeMoney);
    }

    @ExcelProperty(value = "总监收益")
    private String zjServiceChargeMoneyStr;

    /**
     * 总监id
     */
//    @ExcelProperty(value = "总监id")
    @ExcelIgnore
    private Long zjChannelId;

    /**
     * 业务员名称
     */
    @ExcelProperty(value = "业务员名称")
//    @ExcelIgnore
    private String ywyChannelName;


    /**
     * 业务员服务费率
     */
//    @ExcelProperty(value = "业务员服务费率")
    @ExcelIgnore
    private BigDecimal ywyServiceChargeRate;

    public String getYwyServiceChargeRateStr() {
        return StringUtils.perStr(this.ywyServiceChargeRate);
    }
    @ExcelProperty(value = "业务员服务费率")
    private String ywyServiceChargeRateStr;


    /**
     * 业务员收益(分)
     */
//    @ExcelProperty(value = "业务员收益(分)")
    @ExcelIgnore
    private Long ywyServiceChargeMoney;


    public String getYwyServiceChargeMoneyStr() {
        return StringUtils.fenToYuanFormatter(this.ywyServiceChargeMoney);
    }

    @ExcelProperty(value = "业务员收益")
    private String ywyServiceChargeMoneyStr;

    /**
     * 业务员id
     */
//    @ExcelProperty(value = "业务员id")
    @ExcelIgnore
    private Long ywyChannelId;


    /**
     * 分润状态(1:冻结中 2:待解冻 3:分润成功 4:分润撤消 5:分润异常)
     */
//    @ExcelProperty(value = "分润状态(1:冻结中 2:待解冻 3:分润成功 4:分润撤消 5:分润异常)")
    @ExcelIgnore
    private Integer channelHalveStatus;

    /**
     * 转账附言
     */
    @ExcelProperty(value = "银行附言")
    private String billRemark;

    /**
     * 平台分润(分)
     */
    @ExcelIgnore
    private Long ptServiceChargeMoney;

    /**
     * 平台分润状态（0:待支付 1:成功 2:失败 3:支付中）
     */
    @ExcelIgnore
    private Integer ptHalveStatus;

    /**
     * 平台分润失败原因
     */
    @ExcelIgnore
    private String ptHalveRemark;

    @ExcelIgnore
    private BigDecimal shServiceChargeRate;
}
