/**
 * 统一对外接口模块
 * 收费系统统一对外接口协议文档.docx
 */

import { AxiosInstance } from "axios";
import { Singleton } from "typescript-ioc";
import { ApiResponse, ApiRequestBase, throwIfResCodeNoSuccess, axiosInstance } from './TyApiCommon';

/**
 * 统一对外接口客户端
 */
@Singleton
export default class TyExternalApiClient {
    /**
     * 2.0.1获取平台配置信息
     * 获取appid配置信息
     */
    async getConfigInfo(request?: GetConfigInfoRequest): Promise<GetConfigInfoResponse> {
        let config: any = { apiDesc: '2.0.1获取平台配置信息' };
        let axiosResponse = await axiosInstance.post<ApiResponse<GetConfigInfoResponse>>('/config/platform/GetConfigInfo', request || new GetConfigInfoRequest(), config);
        throwIfResCodeNoSuccess(axiosResponse.data);

        return axiosResponse.data.data;
    }

    /**
     * 2.1.3车场终端设备查询接口
     * 获取车场终端设备信息列表
     */
    async getDeviceList(request?: GetDeviceListRequest): Promise<{
        deviceList: {
            /**
             * 设备编码（此设备编号为设备的id（数据库主键））
             */
            deviceCode: string;

            /**
             * 设备Ip
             */
            deviceIp: string;

            /**
             * 设备名称
             */
            deviceName: string;

            /**
             * 设备类型 详见参数枚举1.6.6
             */
            deviceType: number;
        }[]
    }> {
        let config: any = { apiDesc: '2.1.3车场终端设备查询接口' };
        let axiosResponse = await axiosInstance.post<ApiResponse<string>>('/api/wec/GetDeviceList', request || new GetDeviceListRequest(), config);
        throwIfResCodeNoSuccess(axiosResponse.data);

        return axiosResponse.data.data ? JSON.parse(axiosResponse.data.data) : axiosResponse.data.data;
    }

    /**
     * 2.1.5通道信息
     * 获取通道信息
     */
    async getParkingNode(request: GetParkingNodeRequest): Promise<GetParkingNodeResponse> {
        let config: any = { apiDesc: '2.1.5通道信息' };
        let axiosResponse = await axiosInstance.post<ApiResponse<string>>('/api/wec/GetParkingNode', request, config);
        throwIfResCodeNoSuccess(axiosResponse.data);

        return axiosResponse.data.data ? JSON.parse(axiosResponse.data.data) : axiosResponse.data.data;
    }

    /**
     * 2.2.1固定车新增接口
     */
    async addCarCardNo(request: AddCarCardNoRequest): Promise<ApiResponse<string>> {
        let config: any = { apiDesc: '2.2.1固定车新增接口' };
        let axiosResponse = await axiosInstance.post<ApiResponse<string>>('/api/wec/AddCarCardNo', request, config);

        return axiosResponse.data;
    }

    /**
     * 2.2.2固定车查询接口
     */
    async getCarCardInfo(request: GetCarCardInfoRequest): Promise<GetCarCardInfoResponse> {
        let config: any = { apiDesc: '2.2.2固定车查询接口' };
        let axiosResponse = await axiosInstance.post<ApiResponse<string>>('/api/wec/GetCarCardInfo', request, config);
        throwIfResCodeNoSuccess(axiosResponse.data);

        return axiosResponse.data.data ? JSON.parse(axiosResponse.data.data) : axiosResponse.data.data;
    }

    /**
     * 2.2.3固定车修改接口
     */
    async modifyCarCardNo(request: ModifyCarCardNoRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.2.3固定车修改接口' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/wec/ModifyCarCardNo', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.2.6固定车充值接口
     */
    async payCarCardFee(request: PayCarCardFeeRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.2.6固定车充值接口' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/wec/PayCarCardFee', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.4.1用户车位预订
     */
    async reserveSpace(request: ReserveSpaceRequest): Promise<ApiResponse<string>> {
        let config: any = { apiDesc: '2.4.1用户车位预订' };
        let axiosResponse = await axiosInstance.post<ApiResponse<string>>('/api/find/ReserveSpace', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.4.2修改预约车有效期
     */
    async reserveSpace_ChangeTime(request: ReserveSpaceChangeTimeRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.4.2修改预约车有效期' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/find/ReserveSpace_ChangeTime', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.4.3车位预订取消接口
     */
    async cancelReserveSpace(request: CancelReserveSpaceRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.4.3车位预订取消接口' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/find/CancelReserveSpace', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.5.2停车费支付
     */
    async payParkingFee(request: PayParkingFeeRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.5.2停车费支付' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/wec/PayParkingFee', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.5.6车辆无感支付签约变更通知接口
     */
    async signing(request: NosenseSigningRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.5.6车辆无感支付签约变更通知接口' };
        let axiosResponse = await axiosInstance.post<ApiResponse<string>>('/api/nosense/Signing', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.6.2剩余车位查询
     */
    async getFreeSpaceNum(request: GetFreeSpaceNumRequest): Promise<GetFreeSpaceNumResponse> {
        let config: any = { apiDesc: '2.6.2剩余车位查询' };
        let axiosResponse = await axiosInstance.post<ApiResponse<string>>('/api/wec/GetFreeSpaceNum', request, config);
        throwIfResCodeNoSuccess(axiosResponse.data);

        return JSON.parse(axiosResponse.data.data);
    }

    /**
     * 2.6.3设备状态查询
     */
    async getDeviceStatus(request?: GetDeviceStatusRequest): Promise<{
        /**
         * 设备编码（此设备编号为设备的id（数据库主键））
         */
        deviceCode: string;
        deviceIp: string;
        deviceName: string;
        deviceType: string;
        deviceStatus: string;
        deviceTime: string
    }[]> {
        let config: any = { apiDesc: '2.6.3设备状态查询' };
        let axiosResponse = await axiosInstance.post<ApiResponse<string>>('/api/wec/GetDeviceStatus', request || new GetDeviceStatusRequest(), config);
        throwIfResCodeNoSuccess(axiosResponse.data);

        return axiosResponse.data.data ? JSON.parse(axiosResponse.data.data) : axiosResponse.data.data;
    }

    /**
     * 2.7.6修改场内车数据
     */
    async modifyCarInfo(request: ModifyCarInfoRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.7.6修改场内车数据' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/control/ModifyCarInfo', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.9.1锁车接口
     */
    async lockCarplate(request: LockCarplateReuqest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.9.1锁车接口' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/card/LockCarplate', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.9.2解锁接口
     */
    async unlockCarplate(request: UnlockCarplateReuqest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.9.2解锁接口' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/card/UnlockCarplate', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.14.9获取当前用户信息
     */
    async queryCurrentUser(token: string, request?: QueryCurrentUserRequest): Promise<QueryCurrentUserResponse> {
        let config = {
            headers: {
                'kt-token': token,
                'Cookie': 'mer=' + token,
                'content-type': 'application/json;charset=UTF-8',
                'access-control-allow-credentials': true,
                'access-control-allow-headers': 'Origin,Content-Type,Accept,token,X-Requested-With,cookie,lotId',
            },
            apiDesc: '2.14.9获取当前用户信息'
        };

        let axiosResponse = await axiosInstance.post<ApiResponse<string>>('/mercoupon/unity/queryCurrentUser', request || new QueryCurrentUserRequest(), config);
        throwIfResCodeNoSuccess(axiosResponse.data);

        return axiosResponse.data.data ? JSON.parse(axiosResponse.data.data) : axiosResponse.data.data;
    }

    /**
     * 2.14.12 根据抵扣劵号查询抵扣明细
     */
    async queryRecordById(request: QueryRecordByIdRequest): Promise<QueryRecordByIdResponse> {
        let config: any = { apiDesc: '2.14.12 根据抵扣劵号查询抵扣明细' };
        let axiosResponse = await axiosInstance.post<ApiResponse<QueryRecordByIdResponse>>('/kosCouponConsole/service/open/queryRecordById', request, config);
        throwIfResCodeNoSuccess(axiosResponse.data);

        return axiosResponse.data.data;
    }

    /**
     * 2.15.10获取用户信息
     */
    async getMyBaseInfo(token: string): Promise<GetMyBaseInfoReponse> {
        let config = { headers: { 'kt-token': token }, apiDesc: '2.15.10获取用户信息' };
        let axiosResponse = await axiosInstance.post<ApiResponse<GetMyBaseInfoReponse>>('/unity/service/open/user/getMyBaseInfo', new GetMyBaseInfoRequest(), config);
        throwIfResCodeNoSuccess(axiosResponse.data);

        return axiosResponse.data.data;
    }

    /**
     * 第三方充值抵扣券
     */
    async recharge3rdByUnity(request: Recharge3rdByUnityRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '第三方充值抵扣券' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/mercoupon/unity/recharge3rdByUnity', request, config);
        return axiosResponse.data;
    }

    /**
     * 查看车场商户信息
     */
    async queryLotMer4Unity(request: QueryLotMer4UnityRequest): Promise<{
        id: string;
        name: string;
    }[]> {
        let config: any = { apiDesc: '查看车场商户信息' };
        let axiosResponse = await axiosInstance.post<ApiResponse<string>>('/mercoupon/unity/queryLotMer4Unity', request, config);
        throwIfResCodeNoSuccess(axiosResponse.data);

        return axiosResponse.data.data ? JSON.parse(axiosResponse.data.data) : axiosResponse.data.data;
    }
}

export class GetConfigInfoRequest extends ApiRequestBase {

}

export class GetConfigInfoResponse {
    /**
     * appid 配置信息
     */
    config?: string;

    /**
     * 已授权车场扩展配置
     */
    parkConfig?: any[];
}

export class GetParkingPaymentInfoReuqest extends ApiRequestBase {
    /**
     * 车牌号
     */
    plateNo?: string;

    /**
     * 入场取票号/无牌车入场的卡号
     */
    cardNo?: string;

    /**
     设备编码(出口) 设备编码仅支持出口有停放车辆,并识别正确的情况不支持无牌车 
     */
    deviceCode?: string;

    /**
     * 免费时长（秒）
     */
    freeTime: number;

    /**
     * 免费金额（单位:分）
     */
    freeMoney: number;
}

export class PayParkingFeeRequest extends ApiRequestBase {
    /**
     * 车场账单号，不允许为空
     */
    orderNo: string;

    /**
     * 应付金额
     */
    payableAmount: number;

    /**
     * 缴费时间, 'yyyy-mm-dd hh:mi:ss'
     */
    payTime: string;

    /**
     * 支付金额(不包含减免部分),单位为分，不允许为空
     */
    amount: number;

    /**
     * 收费终端，详见参数枚举1.6.4
     */
    payType: string;

    /**
     * 付款方式，详见参数枚举 1.6.3(针对amount的支付方式)
     */
    payMethod: string;

    /**
     * 减免总金额（单位 分）
     */
    freeMoney: number;

    /**
     * 减免总时长（单位 秒）
     */
    freeTime: number;

    /**
     * 车场是否离线(6.x系统无感支付及后付费用必须传.6.x支持、5.x不支持)：1、表示车辆已经离场
     */
    isCarLeave: string;

    /**
     * json数组字符串（如果freeMoney或freeTime大于零时， 不能为空）
     */
    freeDetail: string;

    /**
     * 商户订单号 非必填,主要用与后期本地数据和支付平台直接对账使用.
     */
    outOrderNo: string;

    /**
     * 支付扩展信息，json对象
     */
    paymentExt: string;
}

export class NosenseSigningRequest extends ApiRequestBase {
    plateNo: string;

    /**
     * 是否签约无感支付0：否（解约）；1：是
     */
    signed: 0 | 1;

    /**
     * 无感付款方式，详见参数枚举 1.6.3
     */
    payMethod: number;
    inTime: string;
}

/**
 * 数据上报基类
 */
class DataPushBase {
    appId: string;

    /**
     * 验证码
     */
    key: string;

    parkId: number;

    /**
     * 时间戳
     */
    ts: string;

    /**
     * 每次请求的唯一标识
     */
    reqId: string;
}

export class PostPaymentInput extends DataPushBase {
    plateNo: string;
    orderNo: string;

    /**
     * 应收金额（单位：分）
     */
    money: number;

    /**
     * 进场时间
     */
    entryTime: string;

    /**
     * 停车时长（秒）
     */
    elapsedTime: string;

    /**
     * 固定车类型  详见参数枚举 1.6.2
     */
    carType?: string;

    /**
     * 车辆类型 详见参数枚举1.6.8
     */
    carStyle?: string;

    /**
     * 出口编号
     */
    leaveNodeId?: string;

    /**
     * 车牌颜色 详见参数枚举1.6.11（白、黑、灰等）
     */
    plateColor?: string;
}

/**
 * 3.2.1
 * 进场上报
 */
export class PostCarInInfoInput extends DataPushBase {
    /**
     * 出入场唯一记录ID
     */
    trafficId: string;

    /**
     * 车牌号(全)
     */
    plateNo: string;

    /**
     * 入场取票号/无牌车入场的卡号
     */
    cardNo?: string;

    /**
     * 入场时间
     */
    entryTime: string;

    /**
     * 卡片类型  详见参数枚举 1.6.2
     */
    carType: number;

    /**
     * 入口名称（6.x系统取值是：通道名称 +“- ”+ 通道id；5.x系统取值是：通道名称（后续也需要调整成6.x一样，对接方需要兼容）
     */
    entryPlace: string;

    /**
     * 出口抓拍图片名称
     */
    imgName: string;

    /**
     * 图片地址
     */
    imgInfo: string;

    /**
     * 场中场标识（0=否 1=是）
     */
    area?: number;

    /**
     * 车牌修正标识（0=否 1=是）
     */
    modifyLpnFlag?: number;

    /**
     * 识别可信度
     */
    recognitionCredibility?: string;

    /**
     * 放行类型 ，详见参数枚举1.6.10
     */
    passType?: number;

    /**
     * 放行说明
     */
    passRemark?: string;

    /**
     * 剩余车位
     */
    freeLots?: number;

    /**
     * 总车位
     */
    totalLots?: number;

    /**
     * 入场数据扩展信息，json对象
     */
    carInExt?: {
        /**
         * 车牌颜色 详见参数枚举1.6.11（白、黑、灰等）
         */
        plateColor?: string;

        /**
         * 车辆品牌（奥迪、宝马、奔驰等）
         */
        vehicleBrand?: string;

        /**
         * 车辆型号（大型车，小型车，摩托车等现只有6x才有此值）
         */
        vehicleModel?: string;

        /**
         * 固定车过期天数
         */
        carExpireDay?: number;

        /**
         * 扩展字符串（6x才存在的参数）
         */
        extinfo?: string;
    };
}

/**
 * 3.2.2
 * 出场上报
 */
export class PostCarOutInfoInput extends DataPushBase {
    /**
     * 出入场唯一记录ID
     */
    trafficId: string;

    /**
    * 车牌号
    */
    plateNo: string;

    /**
     * 入场取票号/无牌车入场的卡号
     */
    cardNo: string;

    /**
     * 入场时间
     */
    entryTime?: string;

    /**
     * 出场时间
     */
    leaveTime?: string;

    /**
     * 卡片类型 详见参数枚举1.6.2
     */
    carType?: number;

    /**
     * 出口名称（6.x系统取值是：通道名称 +“- ”+ 通道id；5.x系统取值是：通道名称（后续也需要调整成6.x一样，对接方需要兼容）
     */
    leavePlace?: string;

    /**
     * 出口抓拍图片名称
     */
    imgName?: string;

    /**
     * 图片信息类型：2=图片URL（可公网访问地址）
     */
    imgType: number;

    /**
     * 图片URL
     */
    imgInfo: string;

    /**
     * 场中场标识（0=否 1=是）
     */
    area: number;

    /**
     * 识别可信度
     */
    recognitionCredibility: string;

    /**
     * 放行类型，详见参数枚举1.6.10
     */
    passType: number;

    /**
     * 放行说明
     */
    passRemark: string;

    /**
     * 剩余车位
     */
    freeLots: number;

    /**
     * 总车位
     */
    totalLots: number;

    /**
     * 支付信息，json对象
     */
    payMentInfo?: {
        /**
         * 应收总金额（单位分）
         */
        totalMoney?: number;

        /**
         * 实收总金额（单位分）
         */
        paidMoney?: number;

        /**
         * 抵扣时长（单位秒）
         */
        freeTime?: number;

        /**
         * 抵扣金额（单位分）
         */
        freeMoney?: number;

        /**
         * 后付费出场（0=否 1=是）
         */
        isPostPay: number;
    };

    /**
     * 车辆扩展信息，json对象（不参与签名）
     */
    carExtInfo?: {
        /**
         * 车牌颜色 详见参数枚举1.6.11（白、黑、灰等）
         */
        plateColor: string;

        /**
         * 车辆品牌（奥迪、宝马、奔驰等）
         */
        vehicleBrand: string;

        /**
         * 车辆型号（大型车，小型车，摩托车等现只有6x才有此值）
         */
        vehicleModel: string;

        /**
         * 扩展字符串（6x才存在的参数）
         */
        extinfo: string;
    };
}

/**
 * 3.2.3缴费记录上报
 */
export class PostPayFeeInfoInput extends DataPushBase {
    /**
     * 车牌号
     */
    plateNo?: string;

    /**
     * 入场取票号/无牌车入场的卡号
     */
    cardNo?: string;

    /**
     * 主账单id
     */
    billId: string;

    /**
     * 入场时间
     */
    entryTime: string;

    /**
     * 支付时间
     */
    payTime: string;

    /**
     * 支付来源 详见参数枚举 1.6.5
     * 对应dict表PAY_SOURCE
     */
    paySource: number;

    /**
     * 收费终端，详见参数枚举1.6.4
     * 对应dict表PAY_CHANNEL
     */
    payType: number;

    /**
     * 付款方式，详见参数枚举 1.6.3
     * 对应dict表PAY_METHOD
     */
    payMethod: number;

    /**
     * 应收总金额（单位分）
     */
    totalMoney: number;

    /**
     * 实收总金额（单位分）
     */
    paidMoney: number;

    /**
     * 抵扣时长（单位秒）
     */
    freeTime: number;

    /**
     * 抵扣金额（单位分）
     */
    freeMoney: number;

    /**
     * 车场订单号
     */
    orderNo?: string;

    /**
     * 支付定单号
     */
    paymentOrderNo?: string;

    /**
     * 车牌颜色 详见参数枚举1.6.11（白、黑、灰等）
     */
    plateColor?: string;

    /**
     * 获取优惠金额，单位分
     * 不能直接从字段freeMoney取
     * @param input 
     * @returns 
     */
    static getFreeMoney(input: PostPayFeeInfoInput) {
        return ([1010, 1012, 1013, 1014].includes(input.payMethod) ? input.paidMoney : 0) + input.freeMoney;
    }

    /**
     * 获取实收金额，单位分
     * 不能直接从字段paidMoney取
     * @param input 
     */
    static getPaidMoney(input: PostPayFeeInfoInput) {
        return [1010, 1012, 1013, 1014].includes(input.payMethod) ? 0 : input.paidMoney;
    }
}

/**
 * 3.2.4空闲车位上报
 */
export class PostFreeParkingSpaceInput extends DataPushBase {
    /**
     * 总剩余车位数
     */
    freeSpaceNum: number;

    /**
     * 总车位数
     */
    totalSpaceNum: number;

    areaInfo: [{
        areaCode: string;
        areaName: string;

        /**
         * 区域剩余车位数
         */
        areaFreeSpaceNum: number;
    }]
}

/**
 * 3.2.6修改车牌信息上报
 */
export class PostModifyPlateNoInput extends DataPushBase {
    /**
     * 出入场唯一记录ID
     */
    trafficId: string;
    oldPlateNo: string;
    newPlateNo: string;
    remark: string;
}

/**
 * 3.2.7车场固定车信息上报
 */
export class PostCarCardInfoInput extends DataPushBase {
    /**
     * 卡片id
     */
    cardId: number;

    /**
     * 卡片名称  
     */
    cardName: string;

    /**
     * 户主名  
     */
    useName?: string;

    /**
     * 用户手机号
     */
    tel?: string;

    /**
     * 房间号
     */
    roomId?: string;

    /**
     * 备注
     */
    remak?: string;

    /**
     * 车位数量
     */
    lotCount?: string;

    /**
     * 未过期车位数量
     */
    validCount?: string;
    carLotList: {
        /**
         * 车位ID
         */
        id: number;

        /**
         * 车位名称
         */
        lotName?: string;

        /**
         * 固定车类型  详见参数枚举 1.6.2
         */
        carType: number;

        /**
         * 车牌类型名称
         */
        carTypeName: string;

        /**
         * 区域名称
         */
        areaName: string;

        /**
         * 区域id
         */
        areaId: string;

        /**
         * 有效期开始时间（没有有效期时为空）
         */
        beginTime?: string;

        /**
         * 有效期结束时间（没有有效期时为空）
         */
        endTime?: string;

        /**
         * 占用车位个数
         */
        lotCount: number;

        /**
         * 卡内余额(充值车：分，计次车：次)
         */
        validValue: number;
    }

    plateNoInfo: {
        id: number;

        /**
         * 车牌号
         */
        plateNo: string;

        /**
         * ETC号/卡号
         */
        etcNo: string;

    }[];

    /**
     * 审核状态(0:未审核,1:审核,2:审核不通过)默认为1
     */
    cardState: number;

    /**
     * 操作标识 0=删除 1=新增 2=更新
     */
    operationType: number;

    /**
     * 创建时间，yyyy-MM-dd HH:mm:ss
     */
    createTime: string;
}

export class GetCarCardInfoRequest extends ApiRequestBase {
    /**
     * 车牌号
     */
    plateNo?: string;

    /**
     * 卡片id
     */
    cardId?: number;
}

export class GetCarCardInfoResponse {
    /**
     * 卡片id
     */
    cardId?: number;

    /**
     * 卡片名称  
     */
    cardName?: string;

    /**
     * 户主名  
     */
    useName?: string;

    /**
     * 房间号
     */
    roomId?: string;

    /**
     * 否
     */
    remak?: string;

    /**
     * 车位数量
     */
    lotCount?: string;

    /**
     * 未过期车位数量
     */
    validCount?: string;

    /**
     * 车主电话
     */
    tel?: string;

    /**
     * 车牌号，多个车牌号用，隔开
     */
    fullCarNoStr?: string;

    /**
     * 联系地址
     */
    contact?: string;

    /**
     * 辅助信息
     */
    assist?: string;

    /**
     * 车位信息 array字符串
     */
    carLotList: string;

    /**
     * 车牌列表 json数组字符串
     */
    plateNoInfo: string;

    /**
     * 最后一次更新时间yyyy-MM-dd 00:00:00
     */
    lastUpdateTime: string;

    /**
     * 审核状态(0:未审核,1:审核,2:审核不通过（注销）)默认为1
     */
    cardState: number;
}

export class AddCarCardNoRequest extends ApiRequestBase {
    /**
     * 操作人id
     */
    userId: number;

    /**
     * 操作人姓名
     */
    userName: string;

    /**
     * 车主信息Object字符串
     */
    cardInfo: string;

    /**
     * 车位信息 array字符串
     */
    carLotList: string;

    /**
     * 车牌列表 json数组字符串
     */
    plateNoInfo: string;
}

export class GetParkingNodeRequest extends ApiRequestBase {
    pageIndex: number;
    pageSize: number;
}

export class GetParkingNodeResponse {
    pageIndex: number;
    pageSize: number;
    totalCount: number;
    nodeList: {
        /**
         *  通道编号 ,
         */
        id?: number;

        /**
         *  通道IP地址 ,
         */
        nodeIp?: string;

        /**
         * 通道名称 ,
         */
        nodeName?: string;

        /**
         * 使用类别, 详见参数枚举1.6.7
         */
        useType?: number;

        /**
         * 区域编号（新增数据）
         */
        areaCode?: number;
    }[];
}

export class GetDeviceListRequest extends ApiRequestBase {
    deviceType?: number = 0;
}

export class GetFreeSpaceNumRequest extends ApiRequestBase {
}

export class GetFreeSpaceNumResponse {
    /**
     * 车场id
     */
    parkId: number;

    /**
     * string
     */
    parkName: string;

    /**
     * 总车位数
     */
    totalNum: number;

    /**
     * 空闲车位数
     */
    freeSpaceNum: number;
}

export class GetDeviceStatusRequest extends ApiRequestBase {
    deviceType?: number = 0;
}

export class ModifyCarInfoRequest extends ApiRequestBase {
    /**
     * 车牌号码 必填
     */
    plateNo?: string;

    /**
     * 入场取票号/无牌车入场的卡号
     */
    cardNo?: string;

    /**
     * 修改后的入场取票号/卡号
     */
    newCardNo?: string;

    /**
     * 车辆类型 详见参数枚举1.6.8
     */
    carStyle?: string;

    /**
     * 车颜色 黑、白、蓝、红等
     */
    carColor?: string;

    /**
     * 备注
     */
    remark?: string;
}

export class LockCarplateReuqest extends ApiRequestBase {
    plateNo: string;
}

export class UnlockCarplateReuqest extends ApiRequestBase {
    plateNo: string;
}

export class QueryCurrentUserRequest extends ApiRequestBase {
}

export class QueryCurrentUserResponse {
    /**
     * 
     */
    createDate?: string;

    /**
     * 
     */
    createId?: string;

    /**
     * 
     */
    createSystem?: string;

    /**
     * 
     */
    deleted?: number;

    /**
     * 
     */
    lotId?: string;

    /**
     * 
     */
    merId?: string;

    /**
     * 
     */
    merName?: string;

    /**
     * 
     */
    password?: string;

    /**
     * 
     */
    permissions?: string;

    /**
     * 
     */
    realName?: string;

    /**
     * 
     */
    remark?: string;

    /**
     * 
     */
    sessionId?: string;

    /**
     * 
     */
    status?: number;

    /**
     * 
     */
    stcId?: string;

    /**
     * 
     */
    userAgent?: string;

    /**
     * 
     */
    userId?: number;

    /**
     * 
     */
    userName?: string;

    /**
     * 
     */
    userRole?: string;

    /**
     * 
     */
    version?: string;
}

export class QueryRecordByIdRequest extends ApiRequestBase {
    recordId: string;
}

export class QueryRecordByIdResponse {
    /**
     * 抵用券名称
     */
    couponName?: string;

    /**
     * 抵用券Id
     */
    couponId?: string;

    /**
     * 抵扣券类别 1金额 2时间 3全免 4折扣 5访客券
     */
    couponType?: string;

    /**
     * 使用张数
     */
    amount?: number;

    /**
     * 车牌
     */
    carPlateNum?: string;

    /**
     * 抵扣折度
     */
    discountRate?: number;

    /**
     * 图片地址
     */
    imgUrl?: string;

    /**
     * 创建时间
     */
    createTime?: Date;

    /**
     * 商户id
     */
    merId?: string;

    /**
     * 商户名称
     */
    merName?: string;

    /**
     * 记录Id
     */
    recordId?: string;

    /**
     * 备注
     */
    remark?: string;

    /**
     * 发券方式 1扫一扫发放 2输车牌 3固定二维码
     */
    useType?: string;

    /**
     * 发放人
     */
    realName?: string;

    /**
     * 操作人
     */
    userName?: string;

    /**
     * 全免抵扣时长（分钟）
     */
    totalDeduTime?: number;

    /**
     * 抵用金额
     */
    totalMoney?: number;

    /**
     * 抵用时间
     */
    totalTime?: number;
}

export class Recharge3rdByUnityRequest extends ApiRequestBase {
    /**
     * 抵用券id
     */
    couponId: string;
    merId: string;
    password: string;

    /**
     * 抵扣张数
     */
    totalNum: number;
    userName: string;
}

export class QueryLotMer4UnityRequest extends ApiRequestBase {
}

export class GetMyBaseInfoRequest extends ApiRequestBase {
}

export class GetMyBaseInfoReponse {
    /**
     * 创建时间
     */
    createdTime?: string;

    /**
     * 登录名
     */
    loginName?: string;

    /**
     * 邮箱
     */
    mail?: string;

    /**
     * 名称
     */
    name?: string;

    /**
     * 昵称
     */
    nickname?: string;

    /**
     * 密码
     */
    passwd?: string;

    /**
     * 备注
     */
    remarks?: string;

    /**
     * 角色id
     */
    roleIds?: string;

    /**
     * 角色名称
     */
    roleNames?: string;

    /**
     * 状态
     */
    state?: string;

    /**
     * 电脑
     */
    tel?: string;

    /**
     * 用户id
     */
    userId?: string;

    /**
     * 用户头像
     */
    userImgAddr?: string;
}

export class ModifyCarCardNoRequest extends ApiRequestBase {
    userId: number;
    userName: string;

    /**
     * 车主信息 object字符串
     */
    cardInfo: string;

    /**
     * 车位信息 array字符串
     */
    carLotList: string;

    /**
     * 车牌列表 json数组字符串
     * 单独传递一个id就算是删除车牌
     */
    plateNoInfo: string;
}

export class PayCarCardFeeRequest extends ApiRequestBase {
    userId: number;
    userName: string;
    cardId: number;

    orderNo: string;

    /**
     * 固定车类型 详见参数枚举 1.6.2
     */
    carType: number;

    /**
     * 支付渠道,详见参数枚举 1.6.3
     */
    payChannel: number;

    /**
     * 充值方式,(0 钱(单位:分),1 月,2 天,3 小时,4次)
     */
    chargeMethod: number;

    /**
     * 充值车的充值月数或天数或次数或金额
     */
    chargeNumber: number;

    /**
     * 支付金额（单位：分）
     */
    amount: number;

    /**
     * 免费赠送的月数或天数或次数
     */
    freeNumber: number;

    /**
     * 充值开始时间建议00:00:00(yyyy-MM-dd HH:mm:ss）
     */
    validFrom: string;

    /**
     * 充值结束时间建议23:59:59(yyyy-MM-dd HH:mm:ss）
     */
    validTo: string;
    createTime: string;
    remark: string;
}

export class ReserveSpaceRequest extends ApiRequestBase {
    /**
     * 车牌号(6位车牌号)
     */
    plateNo?: string;

    /**
     * 取票号 （添加时和车牌二选一（6.x才支持））
     */
    cardNo?: string;

    /**
     * 类型： 0：车位 1：区域 
     */
    type: 0 | 1;

    /**
     * 选定的车位/区域ID
     */
    addrId: number;

    /**
     * 预订入场时间
     */
    enterTime: string;

    /**
     * 预约离场时间 若为null，车场默认停车4小时
     */
    leaveTime: string;

    /**
     * 用户名
     */
    userName?: string;

    /**
     * 联系电话
     */
    tel: string;

    /**
     * 预订失效时间
     */
    failureTime: string;

    /**
     * 0：只允许进出一次1：允许多次进出场(必传)
     */
    flag: number;

    /**
     * 是否允许场内预约(非必传)1：允许
     */
    flag2?: number;

    /**
     * 商户名称
     */
    merchantName?: string;

    /**
     * 备注
     */
    remark?: string;

    /**
     * 车牌类型 默认100（标准预约车）6x才需要传此参数--6x必须填写
     */
    cardType: number;
}

export class ReserveSpaceChangeTimeRequest extends ApiRequestBase {
    orderNo: string;
    enterTime: string;
    leaveTime: string;
    failureTime: string;
    flag?: string;
}

export class CancelReserveSpaceRequest extends ApiRequestBase {
    /**
     * 预约订单号
     */
    orderNo: string;
}

export { TyExternalApiClient }