import { FeeBasicData } from '@/api/feecommon/feeBasicDataModel'
import { FeeItemCompute } from '@/api/feecommon/feeItemComputeModel'
import { FeeItemComputeDetails } from '@/api/feecommon/feeItemComputeDetailsModel'
import { Partition } from '@/api/feecommon/partitionModel'
import { MpsData } from '../feecommon/mpsDataModel'
import { ListIitem, PageParams } from '../base/BaseDataModel'
import { FeeApprovalStatus, FeeSetAddType, GroupOperateType } from '@/type/BaseBusinessFeeseType'

//查询参数
export interface CustomerFeeSetQueryParam {
    productId?: string,
    orgId: string | unknown
    customerIdList?: number[]
    feeSetName: string,
    feeSetType: number | any,
    createUserId?: number | any,//创建人编号
    belongUserId: number | any,//费用所属客户编号
    activeFlag: boolean | any,
    currentEffective: boolean | any,
    pageNum: number;
    pageSize: number;
    total: number;
}

//查询结果列表
export interface CustomerFeeSetList {
    list: CustomerFeeSetModle[]
}

//每行数据格式
export interface CustomerFeeSetModle {
    id: number | string,
    productId: string,
    productName: string,
    feeSetName: string,
    groupId: string,
    groupName: string,
    orgId: string,
    orgName: string,
    customerId: number,
    customerName: string,
    feeSetType: number,
    feeSetTypeName: string,
    beginDate: string,
    endDate: string,
    isLast: boolean,
    remark: string,
    activeFlag: boolean,
    createUserId: number,
    createTime: string,
    updateUserId: number,
    updateTime: string
}


//客户费用设置数据类型
export interface SubmitCustomerFeeSetModel {
    id: string,                                          //编号
    productId: string,                                   //产品编号
    productName: string,                                //产品名称
    feeSetName: string,                                 //费用设置名称
    groupId: string,                                     //分组编号
    groupName: string,                                     //分组名称
    orgId: string,                                       //分公司编号
    orgName: string,                                     //分公司名称
    customerId: string,                                  //客户编号
    customerName: string,                                  //客户名称
    feeSetType: number,                                  //费用设置类型
    feeSetTypeName?: string,                               //费用设置类型名称
    beginDate: string,                                     //生效起始时间
    endDate?: string,                                       //生效结束时间
    isLast: boolean,                                     //是否最新记录
    remark: string,                                      //备注
    activeFlag: boolean,                                   //是否激活
    createUserId: number,                                //创建人员员编号
    createTime: string,                                    //创建日期
    updateUserId: number,                                  //操作员编号
    updateTime: string,                                 //操作日期
    feeBasicData: FeeBasicData | any,                 //费用基础信息
    feeItemComputeList: FeeItemCompute[],                //费用计算信息
    feeItemComputeDetailsList: FeeItemComputeDetails[],  //费用计算明细信息
    partitionList: Partition[],                          //分区信息
    parentId: string                                     //生效日期费用父Id
    type: string; //区分新增 、 编辑
    customerIdList: number[];//客户编号
    customerNameList: string[];//客户名称
    recalculate: undefined | 0 | 1//是否重算
    /**
     * 原费用编号
     */
    originalId: string;
    /**
    * 是否建议价
    */
    recommendFeeSet: boolean | null;
    /**
     * 审批状态
     */
    feeApprovalStatus: FeeApprovalStatus.NO_APPROVAL | FeeApprovalStatus.PENDING_APPROVAL | FeeApprovalStatus.APPROVAL_BY | FeeApprovalStatus.APPROVAL_FAILED
    /**
     * 费用新增类型
     */
    feeSetAddType: FeeSetAddType.ADD | FeeSetAddType.VERSION_ADD | FeeSetAddType.RECOUNT_ADD;
}

// 分区设置信息
export interface ZipCodeBelongAreaList {
    startZipCode: string //起始邮编
    endZipCode: string //结束邮编
    zipCodeRegex: string //邮编正则表达式
    address: string, //地址
    isDefault: string //默认取值区间
    longStartZipCode: string //起始邮编(邮编转)
    longEndZipCode: string //结束邮编(邮编转)
}
export interface PortWithZipCodeList {
    portCode: string //口岸编号
    haveZipCodeArea: string// 是否有邮编信息
    zipCodeBelongAreaList: ZipCodeBelongAreaList[],//邮编列表
    zipCodeLengthList: string //区间邮编长度
}
export interface CountryInfoList {
    countryId: string //国家/地区编号
    haveZipCodeArea: string //是否有邮编信息
    zipCodeBelongAreaList: ZipCodeBelongAreaList[],//邮编列表
    ZipCodeLengthList: string//区间邮编长度
}
export interface PartitionList {
    id: string //分区编号
    feeId: string//费用编号
    partitionName: string //分区名称
    orderNumber: string //序号
    partitionType: string //分区类型PartitionType
    portWithZipCodeList: PortWithZipCodeList[],//口岸分区
    countryInfoList: CountryInfoList[],//国家/地区分区
    remark: string,
}

/**
 * 费用基础信息
 */

export interface MpsCountExpressionsList {
    unitType: string//单位类型UnitType
    formula: string//公式
    formulaExplain: string//公式说明
}
// 费用设置基础数据
export interface FeeBasicDataDto {
    currencyCode: string//最终计费货币符号
    compareCustomsCurrencyCode: string//报关比对货币
    minWeight: string//最小重量
    maxWeight: string//最大重量
    weightRound: string//重量取整
    // bulkProductionMinWeight: string//大货起始重量
    // bulkProductionWeightRound: string//大货取整重量
    bigGoodsBeginWeight: string//大货起始重量
    compareType: number//大货比价类型
    feeItemIdList: number[]//比对费用（科目）编号
    firstWeight: string//首重重量
    continuousWeight: string//续重重量
    lightFlag?: boolean//是否计抛
    weightRatio: number//计泡系数
    mpsData: MpsData// 点击：一票多件按钮
    weightRateModelList: WeightRateModel[]//计抛系数列表
}
// 计抛系数模型
export interface WeightRateModel {
    /**
     * 计费偏远判断标志
     */
    remoteFlag: number;

    /**
     * 计抛系数
     */
    weightRatio?: number;
}

// 特殊参数
export interface PartitionSpecialParametersList {
    feeItemId: string | number
    specialParametersId: string
    partitionId: string
    setValue: string | 0
}

// 客户分组查询参数
export interface CustomerGroupParam {
    id: string//分组编号
    customerId: string//客户编号
    orgId: string//分公司编号
    groupName: string//分组名称
    productId: string//产品编号
    groupOperateType: GroupOperateType.ADD_FEE | GroupOperateType.EDIT_FEE | GroupOperateType.ADD_FEE_VERSION | GroupOperateType.RE_COUNT_FEE //分组操作类型
}
// 分组分页查询参数
export interface CustomerGroupPageParam extends PageParams {
    productId?: string//产品编号
    orgId?: string//分公司编号
    groupName?: string//分组名称
    /**
     * 客户编号
     */
    customerIdList?: number[];
}
/**
 * 查看分组版本列表
 */
export interface CustomerGroupParams {
    /**
     * 同一分组编号
     */
    groupId: string;

    /**
     * 客户分组版本号（年月日时分秒）
     */
    customerGroupVersion: string;

    /**
     * 是否有下拉数据
     */
    haveSumRecord: boolean;
}
/**
 * 客户分组result
 */
export interface CustomerGroupDto {
    /**
     * 编号
     */
    id: string;

    /**
     * 分公司编号
     */
    orgId: string;

    /**
     * 分组名称
     */
    groupName: string;

    /**
     * 客户编号
     */
    customerIdList: number[];

    /**
     * 客户名称
     */
    customerNameList: number[];

    /**
     * 创建日期
     */
    CreateDate: Date | string;

    /**
     * 创建人编号
     */
    createUserId: number;

    /**
     * 产品编号
     */
    productId: string;

    /**
     * 产品名称
     */
    productName: string;

    /**
     * 全部产品
     */
    isAllProduct: boolean;

    /**
     * 同一分组编号
     */
    groupId: string;

    /**
     * 客户分组版本号（年月日时分秒）
     */
    customerGroupVersion: string;

    /**
     * 是否有下拉数据
     */
    haveSumRecord: boolean;
}

// 添加或者编辑分组参数
export interface AddEditCustomerGroup {
    id: string | unknown
    /**
     * 分公司编号
     */
    orgId: string
    /**
     * 分组名称
     */
    groupName: string | unknown
    /**
     * 客户id列表
     */
    customerIdList: string & number[]
    /**
     * 产品编号
     */
    productId: string
    /**
     * 产品名称
     */
    productName: string
    /**
     * 是否创建全部产品的标识
     */
    isAllProduct: boolean
    /**
     * 同一目录树分组编号
     */
    treeGroupId: string;
    /**
     * 是否父分组
     */
    isParentFlag: boolean
}
// 判断分组客户操作类型参数
export interface CustomerGroupOperateType {
    /**
     * 分组编号
     */
    id: string | unknown;
    /**
     * 客户编号
     */
    customerIdList: number[];
}
// 查询当前生效记录的其他费用
export interface ListByParentId {
    id: string,
    parentId: string
}
// 参数分组所属的客户
export interface GroupQueryCustomer {
    /**
     * 分组编号
     */
    id?: string
    /**
     * 同一目录树分组编号
     */
    treeGroupId?: string
    /**
     * 是否父分组
     */
    isParentFlag?: boolean
    /**
     * 产品编号
     */
    productId?: string
    /**
     * 分公司编号
     */
    orgId?: string
    /**
     * 是否包含所有产品
     */
    isIncludeAllProduct?: boolean;
    /**
     * 展开查询
     */
    expandFlag?: boolean;
}

// 查询费用参数
export interface CustomerFeeQueryParam {
    /** 产品编号列表 */
    productIdList: string[],
    /** 作业机构编号 */
    orgId: string,
    /** 客户编号 */
    customerId: string,
    /** 费用设置类型 */
    feeSetType: string,
    /** 包装类型 */
    packageType: string,
    /** 当前日期 */
    currentDate: Date,
    /** 目的地址信息 */
    destinationAddress: DestinationAddressParam,
    /** 费用特殊计费标志 */
    feeItemSpecialFlag?: number,
    /** 重量体积列表 */
    weightVolumeList: WeightVolume[],
    /** 报关货币代码 */
    compareCustomsCurrencyCode?: string,
    /** 报关费用 */
    customsFees?: number,
    /** 报关货币代码 */
    customsCode?: string,
    /** 是否计抛 */
    lightFlag?: boolean,
    /** 计抛系数 */
    weightRatio?: number,
    /**品名数量 */
    productNumber: number,
    /**费用查询类型 */
    feeQueryType?: number
    /**订单编号 */
    orderId?: string
}

/**
 * 过滤分组的参数
 */
export interface CustomerFilterGroupParams {
    /**
     * 分组编号
     */
    id?: string
    /**
     * 分公司编号
     */
    orgId?: string | unknown
    /**
     * 产品编号
     */
    productId?: string
    /**
     * 同一目录树分组编号
     */
    treeGroupId?: string
    /**
     * 是否父分组
     */
    isParentFlag: boolean
}

export interface DestinationAddressParam {
    /** 口岸编号 */
    portCode: string,
    /** 国家/地区编号 */
    countryCode: string,
    /** 邮编 */
    zipCode: string,
    /** 目的地址 */
    address: string,
}
export interface WeightVolume {
    /** 重量 */
    weight: number,
    /** 体积 */
    volume: number,
    /** 长度 */
    length: number,
    /** 宽度 */
    width: number,
    /** 高度 */
    height: number,
}

export interface OrderFeeQueryParam {
    orderId: string | number//订单号
}
export interface OrderFeeQueryResult {
    productIdList: string[]//产品编号列表
    currentDate: string//当期日期	
    customerId: string//客户编号	
    destinationAddress: object//目的地址信息列表	
    feeItemSpecialFlagList: number[]//特殊费用编号列表	
    feeSetType: number//费用类型	
    orgId: string//分公司编号	
    packageType: number//包装类型	
    weightVolumeList: Recordable[]//重量体积	
    compareCustomsCurrencyCode: string//报关对比货币	
    customsFees: number//报关费用	
    lightFlag: boolean//是否计抛	
    weightRatio: number//计抛系数	
    productNumber: number//品名数量	
    specialPackageNumber: number//异形包装数量	
    customsPageNumber: number//报关页数	
    feeQueryType: number//费用查询类型	
    orderId: string//订单编号
}

// 客户费用拷贝参数
export interface CustomerFeeSetCopy {
    id: string//费用设置编号
    targetIds: string[]//目标费用编号
}

/**
 * 客户费用比对结果
 */
export interface CustomerFeeSetCompareVersionDto {
    /**
     * 产品编号(结算价)
     */
    productId: string;

    /**
     * 产品名称(结算价)
     */
    productName: string;

    /**
     * 费用设置名称(结算价)
     */
    feeSetName: string;

    /**
     * 生效起始时间(结算价)
     */

    beginDate: string;
    /**
     * 生效结束时间(结算价)
     */
    endDate: string;

    /**
     * 比对结果
     */
    customerFeeSetCompareDtoList: CustomerFeeSetCompareDto[];
}
export interface CustomerFeeSetCompareDto {
    /**
     * 返回结果标志 0 (提醒)，1（终止操作） FeeCompareResult
     */
    feeCompareResult: number;

    /**
     * 异常类型名称
     */
    feeCompareResultName: string;
    /**
     * 产品编号
     */
    productId: number;

    /**
     * 产品名称
     */
    productName: string;

    /**
     * 费用设置名称
     */
    feeSetName: string;

    /**
     * 费用设置类型  FeeSetType
     */
    feeSetType: number;

    /**
     * 作业机构编号
     */
    orgId: string;

    /**
     * 作业机构名称
     */
    orgName: string;

    /**
     * 客户编号
     */
    customerId: number;

    /**
     * 客户名称
     */
    customerName: string;

    /**
     * 费用类型名称
     */
    feeSetTypeName: string;

    /**
     * 生效起始时间
     */

    beginDate: string;
    /**
     * 生效结束时间
     */
    endDate: string;

    /**
     * 业务员
     */
    salesMan: string;

    /**
     * 费用（科目）编号
     */
    feeItemId: number;

    /**
     * 费用名称
     */
    feeItemName: string;

    /**
     * 包装类型 PackageType
     */
    packageType: number;

    /**
     * 包装类型 PackageType
     */
    packageTypeName: string;

    /**
     * 原起始重量
     */
    originalBeginWeight: number;

    /**
     * 原始结束重量
     */
    originalEndWeight: number;

    /**
     * 分区编号
     */
    partitionId: number;

    /**
     * 分区名称
     */
    partitionName: string;

    /**
     * 提供单价(客户价)
     */
    offerPrice: number;

    /**
     * 结算价
     */
    organizationOfferPrice: number;

    /**
     * 折扣标准(结算价对客户)
     */
    discount: number;

    /**
     * 价格差异
     */
    priceVariance: number;

    /**
     * 提示信息
     */
    message: string;    
}

export type PartialCustomerFeeSetCompareDto = Partial<CustomerFeeSetCompareVersionDto>

/**
 * 激活前检查参数
 */
export interface ActiveBeforeCheckParam {
    /**
     * 费用编号
     */
    id: string;

    /**
     * 产品编号
     */
    productId: string;

    /**
     * 生效起始时间
     */
    beginDate: string;

    /**
     * 生效结束时间
     */
    endDate: string;
}


/**
 * 客户费用接管人员实体
 */
export interface CustomerFeeSetAdministratorDto {
    /**
     * 编号
     *
     * @mbg.generated
     */
    id: number;

    /**
     * 费用设置编号
     *
     * @mbg.generated
     */
    feeSetId: string;

    /**
     * 费用设置名称
     *
     * @mbg.generated
     */
    feeSetName: string;

    /**
     * 消息通知人员编号
     *
     * @mbg.generated
     */
    successorId: number;

    /**
     * 消息通知人员名称
     */
    successorName: string;

    /**
     * 被接管人员编号
     *
     * @mbg.generated
     */
    userId: number;

    /**
     * 消息通知人员类型 0 业务负责人 1 管理人员
     */
    notifyUserType: number;

    /**
     * 创建人编号
     *
     * @mbg.generated
     */
    createUserId: number;

    /**
     * 创建人名
     *
     * @mbg.generated
     */
    createUserName: string;

    /**
     * 创建时间
     *
     * @mbg.generated
     */
    createTime: string;

    /**
     * 手机号
     */
    mobile: string;

    /**
     * 注册邮箱
     *
     */
    email: string;
}
/**
 * 客户费用接管人员查询参数
 */
export interface CustomerFeeSetAdministratorParam extends PageParams {

    /**
     * 费用设置编号
     *
     * @mbg.generated
     */
    feeSetId?: string;

    /**
     * 费用设置名称
     *
     * @mbg.generated
     */
    feeSetName?: string;

    /**
     * 消息通知人员类型 0 业务负责人 1 管理人员
     */
    notifyUserType?: number;

    /**
     * 费用设置编号
     */
    feeSetIdList?: string[];

    /**
     * 是否包含管理员
     */
    includeManage?: boolean;
}

/**
 * 加载结算价参数
 */
export interface LoadOperatingOrganizationFeeParams {
    /**
     * 产品编号
     */
    productId: string;

   /**
     * 生效起始时间
     */
    beginDate: string | Date;
    
    /**
     * 生效结束时间
     */
    endDate: string | Date;

   /**
     * 分公司编号
     */
    orgId: string;

    /**
     * 客户编号
     */
    customerId: number;

    /**
     * 客户编号
     */
    customerIdList: number[];
    /**
     * 费用设置类型  FeeSetType
     */
    feeSetType?: number;
    /**
     * 是否建议价
     */
    recommendFeeSet?: boolean;
}

/**
 * 终止结束时间
 */
export interface StopEndDateParams {
    /**
     * 编号
     */
    id?: string;      
    /**
     * 生效日期费用父Id
     */
    parentId?: string;   
    /**
     * 生效结束时间
     */
    endDate?: string | Date;

    /**
     * 终止结束时间
     */
    stopEndDate?: string | Date;
    /**
     * 费用设置类型  FeeSetType
     */
    feeSetType?: number;
}

/**
 * 检查分组参数
 */
export interface CheckCustomerGroupParam {
    /**
     * 编号
     */
    id: string;
    /**
     * 产品编号
     */
    productId?: string;

    /**
     * 客户编号
     */
    customerId?: string;

    /**
     * 分公司编号
     */
    orgId?: string;

    /**
     * 分组名称
     */
    groupName?: string;

    /**
     * 分组编号
     */
    idList?: string[];

    /**
     * 创建人编号
     */
    createUserId?: number;

    /**
     * 过滤ID
     */
    filterId?: string;

    /**
     * 客户编号
     */
    customerIdList?: number[];

    /**
     * 确定过滤分公司
     */
    filterOrgId?: boolean;
}

/**
 * 费用拷贝参数
 */
export interface CopyParam {
    /**
     * 编号
     */
    id: string;

    /**
     * 目标费用编号
     */
    targetIds: string[];

    /**
     * 费项拷贝比例
     */
    feeItemCopyProportionList: FeeItemCopyProportion[];
}
/**
 * 费项拷贝比例
 */
export interface FeeItemCopyProportion {
    /**
     * 费用（科目）编号
     */
    feeItemId: number;

    /**
     * 比例值
     */
    proportionValue: string;
}

/**
 * 客户设置分组
 */
export type CustomerSetGroupState = {
    /**
     * 客户选择类型操作
     */
    radioCustomer: number
    customerCheckedOptions: ListIitem[]
    /**
     * 分公司id
     */
    orgId: string | unknown
    /**
     * 产品编号
     */
    productId: string | unknown
    /**
     * 产品名称
     */
    productName: string | unknown
    /**
     * 全部产品
     */
    isAllProduct?: boolean
    /**
     * 是否校验分公司
     */
    isVerifyOrgId: boolean
    /**
     * 分组id
     */
    groupId: number | unknown
    /**
     * 同一目录树分组编号
     */
    treeGroupId?: string;
    /**
     * 是否父分组
     */
    isParentFlag: boolean
    /**
     * 分组名称
     */
    groupName: string | unknown
    /**
     * 客户列表id
     */
    customerIdList: string[]
    /**
     * 分组名称
     */
    customerNameList: string[]
    /**
     * 单个客户
     */
    downCustomerKey: unknown//单个选择客户
    /**
     * 是否全选客户
     */
    checkAllCustomer: boolean
    /**
     * 是否取消全选
     */
    isCheckAllCustomer: boolean
    /**
     * 右侧显示对应文本内容
     */
    inputCustomerZoning: string
    /**
     * 复选框列表数据
     */
    checkCustomerList: Recordable
    /**
     * 是否新增分组名
     */
    isGroupName: boolean
    /**
     * 是否校验分组名称
     */
    isVerifyGroupName: boolean
    /**
     * 分组加载loading
     */
    groupLoading: boolean,
    /**
     * 默认过滤已有分组客户
     */
    groupFilter?: boolean,
    /**
     * 是否校验产品名称
     */
    isVerifyProductId?: boolean
    /**
     * 是否最新数据
     */
    isLastData?: boolean
}