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

import { AxiosInstance, AxiosRequestConfig } from "axios";
import { Singleton, ObjectFactory, Factory } from "typescript-ioc";
import { TyApiConfig } from "./Config";
import { ApiResponse, ApiRequestBase, throwIfResCodeNoSuccess, axiosInstance, generateAxiosInstance } from './TyApiCommon'

/**
 * 统一对外接口客户端
 * 
 * ```ts
 * import { Singleton, Inject } from "typescript-ioc";
 * import { IService } from "mslib"
 * import { TyApi, TyExternalApi, ApiResponse, TyExternalApiClient } from "refs/nslib";
 * 
 * export class PostCarInInfo implements IService {
 *    //去掉注释
 *    //@Inject
 *    externalApiClient:TyExternalApiClient;
 * 
 *    //去掉注释
 *    //@TyApi.Service()
 *    async doService(input: TyExternalApi.PostCarInInfoInput): Promise<ApiResponse> {
 *        //使用已封装的方法
 *        let res = await this.externalApiClient.getConfigInfo();
 *          
 *        return ApiResponse.success;
 *    }
 * }
 * ```
 */
@Singleton
export default class TyExternalApiClient {
    async post(url: string, data?: any, config?: AxiosRequestConfig): Promise<ApiResponse> {
        let axiosResponse = await axiosInstance.post<ApiResponse>(url, data, config);
        return axiosResponse.data;
    }

    /**
     * 2.0.1获取平台配置信息
     * 获取appid配置信息
     */
    async getConfigInfo(request?: any): 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.1获取停车场列表
     */
    async getParkingLotList(request: {
        pageIndex: any;
        pageSize: any;
    }): Promise<{
        pageIndex: any;
        pageSize: any;
        totalCount: number;
        parkingList: any;
    }> {
        let config: any = { apiDesc: '2.1.1获取停车场列表' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/wec/GetParkingLotList', request, config);
        throwIfResCodeNoSuccess(axiosResponse.data);

        return axiosResponse.data.data;
    }

    /**
     * 2.1.2停车场信息查询接口
     */
    async getParkingLotInfo(request: {
        /**
         * 车场id
         */
        parkId: any
    }): Promise<{
        /**
         * 车场id
         */
        parkId: any
        /**
         * 车场名称
         */
        parkName: string
        /**
         * 总车位数
         */
        totalSpaceNum: number
    }> {
        let config: any = { apiDesc: '2.1.2停车场信息查询接口' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/wec/GetParkingLotInfo', request, 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 getAllParkingNodes(parkId: any): Promise<any[]> {
        let request = new GetParkingNodeRequest();
        request.pageIndex = 1;
        request.pageSize = 100;
        request.parkId = parkId;

        let nodes = [];
        while (true) {
            let apiResponse = await this.getParkingNode(request);
            if (!apiResponse.nodeList || apiResponse.nodeList.length === 0) break;

            nodes = nodes.concat(apiResponse.nodeList);

            if (apiResponse.nodeList.length < request.pageSize) break;
            request.pageIndex = request.pageIndex + 1;
        }

        return nodes;
    }

    /**
     * 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) : null;
    }

    /**
     * 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.4固定车删除接口
     */
    async delCarCardInfo(request: DelCarCardInfoRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.2.4固定车删除接口' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('api/wec/DelCarCardInfo', 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.2.9固定车退款接口
     */
    async refundCarCardFee(request: RefundCarCardFeeRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.2.9固定车退款接口' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('api/wec/RefundCarCardFee', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.2.10固定车审核
     */
    async auditCardRecharge(request: AuditCardRechargeRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.2.10固定车审核' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('api/wec/AuditCardRecharge', request, config);
        return axiosResponse.data;
    }

    /**
 * 2.2.11固定车充值开票
 */
    async rechargeInvoice(request: RechargeInvoiceRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.2.11固定车充值开票' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('api/wec/RechargeInvoice', request, config);
        return axiosResponse.data;
    }

    /**
 * 2.2.12内部车注销恢复
 */
    async modifyCardStatus(request: ModifyCardStatusRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.2.12内部车注销恢复' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('api/wec/ModifyCardStatus', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.3.1查询进出记录
     */
    async getCarInoutInfo(request: {
        parkId: any;
        plateNo?: string;
        cardNo?: string;
        pageIndex: number;
        pageSize: number;
        startTime?: string;
        endTime?: string;
        capFlag?: number;
        passType?: number;
    }): Promise<{
        totalCount: number;
        detailList: any;
    }> {
        let config: any = { apiDesc: '2.3.2查询缴费记录' };
        let axiosResponse = await axiosInstance.post<ApiResponse<string>>('/api/wec/GetCarInoutInfo', request, config);
        throwIfResCodeNoSuccess(axiosResponse.data);
        return axiosResponse.data.data ? JSON.parse(axiosResponse.data.data) : null;
    }

    /**
     * 2.3.2查询缴费记录
     */
    async getParkingPaymentList(request: {
        parkId: any;
        plateNo?: string;
        cardNo?: string;
        inTime?: string;
        outTime?: string;
        pageIndex: number;
        pageSize: number;
        startTime?: string;
        endTime?: string;
        payMethod?: number;
    }): Promise<{
        totalCount: number;
        plateList: any;
    }> {
        let config: any = { apiDesc: '2.3.2查询缴费记录' };
        let axiosResponse = await axiosInstance.post<ApiResponse<string>>('/api/wec/GetParkingPaymentList', request, config);
        throwIfResCodeNoSuccess(axiosResponse.data);
        return axiosResponse.data.data ? JSON.parse(axiosResponse.data.data) : null;
    }

    /**
     * 2.3.4获取缴费记录上报所需要的数据
     */
    async getUploadPayList(request: {
        parkId: any;
        /**
         * 支付ID，收费系统6.0不支持此参数
         */
        payDetailId?: string;
        syncBeginTime: string;
        syncEndTime: string;
    }): Promise<{
        payList: any;
    }> {
        let config: any = { apiDesc: '2.3.4获取缴费记录上报所需要的数据' };
        let axiosResponse = await axiosInstance.post<ApiResponse<string>>('/api/wec/GetUploadPayList', request, config);
        throwIfResCodeNoSuccess(axiosResponse.data);
        return axiosResponse.data.data ? JSON.parse(axiosResponse.data.data) : null;
    }

    /**
     * 2.4.1用户车位预订
     * 
     * 返回的是json字符串，需要手动转对象
     */
    async reserveSpace(request: ReserveSpaceRequest): Promise<ApiResponse> {
        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.4.4预订车位查询接口
    */
    async getReservableInfo(request: GetReservableInfoRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.4.4预订车位查询接口' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/find/GetReservableInfo', request, config);
        return axiosResponse.data;
    }
    /**
     * 2.5.1账单查询/费用查询
     * 
     * data是json字符串(如果有值),需要进行转换
     */
    async getParkingPaymentInfo(request: GetParkingPaymentInfoRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.5.1账单查询/费用查询' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/wec/GetParkingPaymentInfo', 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.3查询订单状态
     */
    async getOrderStatus(request: {
        parkId: any;
        orderNo: string;
    }): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.5.3查询订单状态' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/wec/GetOrderStatus', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.5.4充电桩抵扣
     */
    async syncChargePilePay(request: SyncChargePilePayRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.5.4充电桩抵扣' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/wec/SyncChargePilePay', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.5.5无牌车扫出入口二维码进出场
     */
    async unlicensedCarInout(request: UnlicensedCarInoutRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.5.5无牌车扫出入口二维码进出场' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/wec/UnlicensedCarInout', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.5.6车辆无感支付签约变更通知接口
     */
    async signing(request: SigningRequest): 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.5.17 获取计费详情
   */
    async getFeeDetail(request: GetFeeDetailReq): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.5.17 获取计费详情' };
        let axiosResponse = await axiosInstance.post<ApiResponse<GetFeeDetailRes>>('/api/wec/GetFeeDetail', 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.6.6获取车辆图片信息
     */
    async getParkingImg(request: {
        parkId: any;
        imgName: string;
        type: number;
    }): Promise<{
        imgUrl: string;
    }> {
        let config: any = { apiDesc: '2.6.6获取车辆图片信息' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/wec/GetParkingImg', request, config);

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

    /**
     * 2.6.9查询车辆当前所在车场
     */
    async getCarLocatePartId(request: {
        plateNo: string;
    }): Promise<{
        parkId: any;
    }> {
        let config: any = { apiDesc: '2.6.9查询车辆当前所在车场' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/config/platform/GetCarLocatePartId', request, config);

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

    /**
     * 2.6.10区域剩余车位查询
     */
    async getAreaFreeSpaceNum(request: {
        parkId: any;
    }): Promise<{
        areaInfo: any;
    }> {
        let config: any = { apiDesc: '2.6.10区域剩余车位查询' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/wec/GetAreaFreeSpaceNum', request, config);
        return axiosResponse.data.data ? JSON.parse(axiosResponse.data.data) : axiosResponse.data.data;
    }

    /**
     * 2.6.16根据通道获取当前车辆(地感车辆信息)
     */
    async getNodeCarInfo(request: GetNodeCarInfoRequest): Promise<{
        carPlateNum: string;
        capTime: string;
        serial: string;
        imgName: string;//图片地址
        carNoColor: string;//车牌颜色
    }> {
        let config: any = { apiDesc: '2.6.16根据通道获取当前车辆(地感车辆信息)' };
        let axiosResponse = await axiosInstance.post<ApiResponse<string>>('/api/wec/GetNodeCarInfo', request, config);
        //throwIfResCodeNoSuccess(axiosResponse.data);
        if (axiosResponse.data.resCode != '0') throw axiosResponse.data.resMsg;
        return axiosResponse.data.data ? JSON.parse(axiosResponse.data.data) : axiosResponse.data.data;
    }

    /**
     * 2.7.1空闲车位修改
     */
    async modifyFreeSpace(request: {
        parkId: any;
        areaCode?: any;
        freeSpaceNum: number;
    }): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.7.1空闲车位修改' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/control/ModifyFreeSpace', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.7.2道闸控制
     */
    async gateControl(request: {
        parkId: any;
        nodeId: any;
        type: any;
    }): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.7.2道闸控制' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/control/GateControl', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.7.3显示屏推送
     */
    async pushScreenMsg(request: {
        parkId: any;
        deviceType: any;
        deviceCode: any;
        showInfo: string;
    }): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.7.3显示屏推送' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/control/PushScreenMsg', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.7.4车牌修改
     */
    async modifyCarNo(request: {
        parkId: any;
        oldplateNo: string;
        plateNo: string;
    }): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.7.4车牌修改' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/control/ModifyCarNo', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.7.5远程开闸
     */
    async remoteOpen(request: RemoteOpenRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.7.5远程开闸' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/control/RemoteOpen', request, config);
        return axiosResponse.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.7.11显示屏推送扩展接口（LED全彩屏)
     */
    async pushLedScreenMsg(request: {
        parkId: any;
        deviceType: any;
        deviceCode: any;
        msgInfo: string;
    }): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.7.11显示屏推送扩展接口（LED全彩屏)' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/control/PushLedScreenMsg', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.7.12显示屏推送扩展接口（LCD）
     */
    async pushLcdScreenMsg(request: {
        parkId: any;
        deviceType: any;
        deviceCode: any;
        scene: number;
        msgInfo: string;
    }): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.7.12显示屏推送扩展接口（LCD）' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/control/PushLcdScreenMsg', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.7.13显示屏推送扩展接口（LED单红屏）
     */
    async pushSrsScreenMsg(request: {
        parkId: any;
        deviceType: any;
        deviceCode: any;
        msgMode?: number;
        msgInfo: string;
    }): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.7.13显示屏推送扩展接口（LED单红屏）' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/control/PushSrsScreenMsg', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.7.14显示屏推送扩展接口（LED单红屏-剩余车位）
     */
    async pushSrsScreenLotMsg(request: {
        parkId: any;
        deviceType: any;
        deviceCode: any;
        freeLots: string;
    }): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.7.14显示屏推送扩展接口（LED单红屏-剩余车位）' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/control/PushSrsScreenLotMsg', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.7.15新增虚拟进出场
     */
    async addVirtualTraffic(request: AddVirtualTrafficRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.7.15新增虚拟进出场' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/traffic/AddVirtualTraffic', request, config);

        return axiosResponse.data;
    }

    /**
     * 2.7.16进出场重新抓拍接口
     */
    async recapture(request: RecaptureRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.7.16进出场重新抓拍接口' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/traffic/Recapture', request, config);

        return axiosResponse.data;
    }

    /**
     * 2.8.1新增黑名单车牌信息
     */
    async addCarBlackInfo(request: AddCarBlackInfoRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.8.1新增黑名单车牌信息' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/blacklist/AddCarBlackInfo', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.8.3删除黑名单车牌信息
     */
    async delCarBlackInfo(request: DelCarBlackInfoRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.8.3删除黑名单车牌信息' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/blacklist/DelCarBlackInfo', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.9.1锁车接口
     */
    async lockCarplate(request: LockCarplateRequest): 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: UnlockCarplateRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.9.2解锁接口' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/api/card/UnlockCarplate', request, config);
        return axiosResponse.data;
    }

    /**
     * 2.10.9车位图片URL接口
     */
    async getCarImageUrl(request: any) {
        let config: any = { apiDesc: '2.10.9车位图片URL接口' };
        let axiosResponse = await axiosInstance.post<ApiResponse<string>>('findCar/GetCarImageUrl', 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(request: GetMyBaseInfoRequest, 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', request, config);
        throwIfResCodeNoSuccess(axiosResponse.data);

        return axiosResponse.data.data;
    }

    /**
     * 2.15.4停车场与角色关系查询
     */
    async findLotRoles(request: FindLotRolesRequest): Promise<FindLotRolesResponse> {
        let config: any = { apiDesc: '2.15.4停车场与角色关系查询' };
        let axiosResponse = await axiosInstance.post<ApiResponse<FindLotRolesResponse>>('/unity/service/open/role/findLotRoles', request, config);
        throwIfResCodeNoSuccess(axiosResponse.data);

        return axiosResponse.data.data;
    }

    /**
     * 2.15.8停车场与用户关系查询
     */
    async findListByLotIdPage(request: FindListByLotIdPageRequest): Promise<FindListByLotIdPageResponse> {
        let config: any = { apiDesc: '2.15.8停车场与用户关系查询' };
        let axiosResponse = await axiosInstance.post<ApiResponse<FindListByLotIdPageResponse>>('/unity/service/open/user/findListByLotIdPage', request, config);
        throwIfResCodeNoSuccess(axiosResponse.data);

        return axiosResponse.data.data;
    }

    /**
     * 2.15.12 外部系统日志保存
     */
    async saveLog(request: SaveLogRequest): Promise<ApiResponse> {
        let config: any = { apiDesc: '2.15.12 外部系统日志保存' };
        let axiosResponse = await axiosInstance.post<ApiResponse>('/unity/log/saveLog', request, config);
        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?: { stcParkId: string, [prop: string]: any }[];
}

export class GetParkingPaymentInfoRequest 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: any;

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

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

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

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

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

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

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

export class SyncChargePilePayRequest extends ApiRequestBase {
    orderNo: string;
    plateNo: string;
    startTime: string;
    endTime: string;
    stationId: string;
    stationName: string;
    deviceId: string;
    deviceName: string;
    spaceNo: string;
    power: number;
    elecMoney: number;
    seviceMoney: number;
    totalMoney: number;
    freeType: number;
    freeMoney: number;
    freeTime: number;
}

export class UnlicensedCarInoutRequest extends ApiRequestBase {
    /**
     * 设备标识 0-设备编码 1-设备Ip
     */
    deviceType: 0 | 1;

    deviceCode: string;
    cardNo: string;
}

export class SigningRequest 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: number;

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

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

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

    /**
     * 车牌颜色 详见参数枚举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.5设备状态上报
 */
export class PostDeviceStateInput extends DataPushBase {
    deviceCode: any;
    deviceIp: string;
    deviceName: string;
    deviceType: number;
    status: any;
    remark: string;
    statusTime: string;
}

/**
 * 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;
        /**
         * 备注
         */
        remark?: string;
        /**
         * 车牌状态，1=启用，2=禁用
         */
        plateState?: number;
    }[];

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

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

    /**
     * 创建时间，yyyy-MM-dd HH:mm:ss
     */
    createTime: string;
    /**
     * 内部车状态，1=启用，2=注销
     */
    state: number;
    /**
     * 操作人员
     */
    userName: string;
}

/**
 * 
 * 进出车位上报
 */
export class PostBusInOutInput extends DataPushBase {
    carList: any;
    /*
    plateNo: string;
    //plateColor: string;
    busNumber: string;
    areaName: string;
    mapName: string;
    stopTime: string;
    stopFlag: string;
    imgName: string;
    */
}

/**
 * 3.2.10车场交班信息上报
 */
export class PostShiftWorkInfoInput extends DataPushBase {
    /**
     * 交班ID （车场自定义）
     */
    exchangeCode: string;

    /**
     * 收费员
     */
    chargeMan: string;

    /**
     * 交班时间，yyyy-MM-dd HH:mm:ss
     * 
     * 退机时间
     */
    exchangeTime: string;

    /**
     * 上岗时间，yyyy-MM-dd HH:mm:ss
     * 
     * 上机时间
     */
    startTime: string;

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

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

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

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

    /**
     * 卡片状态：1：启用，2：注销， 0：全部
    默认是1（只支持6X）
     */
    state?: 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: string;

    /**
     * 操作人姓名
     */
    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（数据库主键））
             */
        deviceCode: string;

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

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

        /**
         * 设备类型 详见参数枚举1.6.6
         */
        deviceType: 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 GetNodeCarInfoRequest extends ApiRequestBase {
    /**
     * nodeId、nodeIp二选一
     */
    nodeId?: any;

    /**
     * nodeId、nodeIp二选一
     */
    nodeIp?: string;
}

export class GetCarInfoByNodeIdResponse {
    /**
     * 车牌号 
     */
    carPlateNum: string;

    /**
     * 抓拍时间
     */
    capTime: string;

    /**
     * 序列号
     */
    serial: string;
}

export class RemoteOpenRequest extends ApiRequestBase {
    nodeId: any;
    plateNo?: string;

    /**
     * 放行类型
     */
    type: number;

    /**
     * 放行说明
     */
    remark?: string;
}

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

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

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

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

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

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

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

    /**
     * 入场通道id
     */
    nodeId?: number;

    /**
     车辆图片
     */
    imgName?: string;

    /**
     * 相机识别值
     */
    recogEnable: number;

    /**
     * 免进出场时间（yyyy-MM-dd HH:mm:ss）
     */
    carTime: string;

    /**
    * 放行类型
    */
    abnormal: number;

    /**
     * 车型类型
     */
    carStyle: number;

    /**
   * 来源车场
   */
    fromLotCode: string;

    /**
    * 车牌颜色
    */
    plateNoColor: string;
}

/**
 * 2.7.16进出场重新抓拍接口入参
 */
export class RecaptureRequest extends ApiRequestBase {
    /**
     * 唯一记录ID
     */
    uniqCode?: string;
    /**
     * 入场通道id
     */
    nodeId?: number;
    /**
     摄像唯一编号
     */
    cameraId?: string;
}

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

    /**
     * 原因备注
     */
    remark;

    /**
     * 车场Id
     */
    parkId: any;

    /**
     * 限制类型
     */
    readonly type = 3;
}

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

    /**
     * 原因备注
     */
    remark;

    /**
     * 车场Id
     */
    parkId: any;
}

export class LockCarplateRequest extends ApiRequestBase {
    plateNo: string;
}

export class UnlockCarplateRequest 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 FindLotRolesRequest extends ApiRequestBase {
    pageIndex: number;
    pageSize: number;
}

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

export class SaveLogRequest extends ApiRequestBase {
    /**
     * 是否批量操作 0否 1是
     */
    batchOperation?: string;

    /**
     * ip地址 例：127.0.0.1 可传可不传
     */
    ipAddress?: string;

    /**
     * 车场Id
     */
    lotId: string;

    /**
     * mdcLogId 发送方系统的日志ID方便捞数据、可传可不传
     */
    mdcLogId?: string;

    /**
     * 操作模块 主功能模块 例：电子抵扣券
     */
    module: string;

    /**
     * 操作内容
     */
    operationContent?: string;

    /**
     * 操作来源 例：云助手、移动岗亭、云平台、抵扣券（直接存文字）例 ：抵扣券
     */
    operationSource: string;

    /**
     * 操作状态 成功true失败false 例：true
     */
    operationStatus: boolean;

    /**
     * 操作时间 不传
     */
    operationTime?: string;

    /**
     * 操作类型 例：新增、删除、更新、导入、审核（直接存文字） 例：新增
     */
    operationType: string;

    /**
     * 操作人 操作人名称
     */
    operator?: string;

    /**
     * 操作人 操作人ID
     */
    operatorId?: string;

    /**
     * 子操作模块 具体功能模块 例：新增抵扣券
     */
    subModule: string;
}

export class FindListByLotIdPageResponse {
    totalItems: number;
    totalPages: number;
    list: {
        /**
 * 创建时间
 */
        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 FindLotRolesResponse {
    totalItems: number;
    totalPages: number;
    list: {
        /**
         * 创建人
         */
        createdBy?: string;

        /**
         * 创建人名称
         */
        createdByName?: string;

        /**
         * 创建时间
         */
        createdTime?: string;

        /**
         * 是否删除
         */
        deleted?: number;

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

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

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

        /**
         * 模板id
         */
        tempId?: string;

        /**
         * 更新人
         */
        updatedBy?: string;

        /**
         * 更新人名称
         */
        updatedByName?: string;

        /**
         * 更新时间
         */
        updatedTime?: string;
    }[]
}

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: string;
    userName: string;

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

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

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

export class DelCarCardInfoRequest extends ApiRequestBase {
    /**
     * 卡片Id
     */
    cardId: string;
}

/**
 * 3.2.8车场固定车充值信息上报
 */
export class PostCarCardChargeInfoInput extends DataPushBase {
    /**
     * 卡片id
     */
    cardId: number;
    /**
 * 订单号 
 */
    orderNo: string;
    /**
 * 卡片类型  
 */
    carType: number;
    /**
 * 支付渠道 
 */
    payChannel: number;
    /**
 * 充值方式 
 */
    chargeMethod: number;
    /**
* 充值天数次数钱数
*/
    chargeNumber: number;
    /**
 * 支付金额  
 */
    amount: number;
    /**
 * 免费额度 
 */
    freeNumber: number;
    /**
 * 充值开始时间 
 */
    validFrom: string;
    /**
 * 充值结束时间 
 */
    validTo: string;
    /**
 * 创建时间 
 */
    createTime: string;
    /**
 * 备注 
 */
    remark: string;
    /**
 * 0充值1退款 
 */
    rechargeType: number;
    /**
 * 0=删除 1=新增 2=更新 
 */
    operationType: number;
    /**
 * 操作人员 
 */
    operator: string;
    /**
 * 支付来源 
 */
    paySource: string;
}


/**
 * 3.2.30 特殊订单上报
 */
export class PostSpecPayNotifyInput extends DataPushBase {
    /**
     * 车牌号
     */
    carNo?: string;

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

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

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

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

    /**
     * 支付来源 详见参数枚举 1.6.5
     */
    paySource?: number;

    /**
     * 收费终端，详见参数枚举1.6.4
     */
    payChannel?: number;

    /**
     * 付款方式，详见参数枚举 1.6.3
     */
    payMethod?: number;

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

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

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

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

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

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

    /**
     * 车辆扩展信息，json对象
     */
    externJson?: string;

    /**
     * 0-有效账单，1-重复支付无效账单（6x才支持，模板v1.0.1及以上版本才支持此字段）
     */
    effectData?: number;

    /**
     * 0-初始账单，1-修改账单（金额可能发生变化，如后付费）（6x才支持，模板v1.0.2版本才支持此字段---暂未实现）
     */
    modifyFlag?: number;

    /**
     * 订单类型：详细见枚举
     */
    orderType?: number;
}

/**
 * 3.3.1车场进出场压地感上报
 */
export class PostCarCaptureInfoInput extends DataPushBase {
    /**
 * 车牌号
 */
    plateNo: string;

    /**
     * 抓拍场时间：格式yyyy-MM-dd HH:mm:ss
     */
    capTime: string;

    /**
     * 出入口id
     */
    nodeId: string;

    /**
     * IP
     */
    nodeIP: string;

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

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

    /**
     * 进出车流水号
     */
    billId: string;

    /**
     * 序列号
     */
    serial: string;

    /**
     * 图片URL；不一定有值，如果无值，根据imgName那么调用2.6.6接口获取
     */
    imgUrl?: string;

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

    /**
     * 入场数据扩展信息，json object对象
     */
    carInfoExt?: {
        plateColor?: string;
        vehicleBrand?: string;
        vehicleModel?: string;
    };
}

export class PayCarCardFeeRequest extends ApiRequestBase {
    userId: string;
    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 RefundCarCardFeeRequest extends ApiRequestBase {
    userId: string;
    userName: string;
    cardId: number;
    orderNo: string;
    /**
     * 固定车类型 详见参数枚举 1.6.2
     */
    carType: number;
    /**
     * 支付渠道,详见参数枚举 1.6.3
     */
    payChannel: number;
    /**
 * 支付金额（单位：分）
 */
    amount: number;
    /**
 * 退款方式,(0 钱(单位:分),1 月,2 天,3 小时,4次)
 */
    refundMethod: number;
    /**
 * 充值车的充值月数或天数或次数或金额
 */
    refundNumber: number;
    /**
 * 充值开始时间建议00:00:00(yyyy-MM-dd HH:mm:ss）
 */
    validFrom: string;

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

export class AuditCardRechargeRequest extends ApiRequestBase {
    userId: string;
    userName: string;
    /**
     * 审核类型，1:内部车添加，2:内部车充值
     */
    auditType: number;
    cardId: any;
    orderNo: string;
    /**
     * 审核状态，1:通过，2:不通过
     */
    auditStatus: number;
    auditRemark: string;
}
export class RechargeInvoiceRequest extends ApiRequestBase {
    userId?: string;
    userName?: string;
    orderNo: string;
    /**
     * 开票类型 0 未开票 1 电子发票 2 纸质发票
     */
    invoiceState: string;
}
export class ModifyCardStatusRequest extends ApiRequestBase {
    /**
     * 状态, 1=恢复 0=注销
     */
    cardId: any;
    flag: string;
    userId?: string;
    userName?: string;
}
/**
 * 2.4.1用户车位预订
 */
export class ReserveSpaceRequest extends ApiRequestBase {
    /**
     * 车牌号(6位车牌号)
     */
    plateNo?: string;
    /**
     * 取票号 （添加时和车牌二选一（6.x才支持））
     */
    cardNo?: string;
    /**
 * 隐藏参数-文档没有-可自带订单号来操作
 */
    orderNo?: string;
    /**
     * 类型： 0：车位 1：区域 
     */
    type: 0 | 1;
    /**
     * 选定的车位/区域ID
     */
    addrId: any;
    /**
     * 预订入场时间
     */
    enterTime: string;
    /**
     * 预约离场时间 若为null，车场默认停车4小时
     */
    leaveTime: string;
    /**
     * 用户名
     */
    userName?: string;
    /**
     * 联系电话
     */
    tel?: string;
    /**
     * 预订失效时间
     */
    failureTime: string;
    /**
     * 0：只允许进出一次1：允许多次进出场(必传)
     */
    flag: '0' | '1';
    /**
     * 是否允许场内预约(非必传)1：允许
     */
    flag2?: string;
    /**
     * 商户名称
     */
    merchantName?: string;
    /**
     * 备注
     */
    remark?: string;
    /**
     * 车牌类型 默认100（标准预约车）6x才需要传此参数--6x必须填写
     */
    cardType: number;
    /**
     * 预约金额
     */
    bookingAmount: number;
    /**
     * 支付方式
     */
    payMethod: number;
    /**
     * 授权方式
     */
    bookingType: string;
}

/**
 * 2.4.2修改预约车有效期
 */
export class ReserveSpaceChangeTimeRequest extends ApiRequestBase {
    orderNo: string;
    enterTime: string;
    leaveTime: string;
    failureTime: string;
    flag?: string;
}
/**
 * 2.4.3车位预订取消接口
 */
export class CancelReserveSpaceRequest extends ApiRequestBase {
    /**
     * 预约订单号
     */
    orderNo: string;
}
/**
 * 2.4.4预订车位查询接口
 */
export class GetReservableInfoRequest extends ApiRequestBase {

    enterTime: string;
    leaveTime?: string;
}

/**
 * 2.5.17 获取计费详情 请求参数
 */
export class GetFeeDetailReq extends ApiRequestBase {
    orderNo: string;
}

/**
 * 2.5.17 获取计费详情 返回参数
 */
export class GetFeeDetailRes {
    /**
  * 计费详情列表
  */
    feeList: {

        /**
         * 开始时段 (yyyy-MM-dd HH:mm:ss)
         */
        st: string,
        /**
 * 结束时段  (yyyy-MM-dd HH:mm:ss)
 */
        et: string,
        /**
 * 区域名称
 */
        an: string,
        /**
* 总时长(秒)
*/
        tl: number,

        /**
* 总金额(分)
*/
        tm: number,

        /**
* 计费规则名称
*/
        fn: string,

        /**
* 时段明细
*/
        dl: {

            /**
* 时长(秒 )
*/
            tl: number,

            /**
* 金额(分)
*/
            tm: number,

            /**
* 计费规则单位时长(秒)
注:若无计费规则,该值为 ‘-’
*/
            fl: number,

            /**
* 计费规则单位金额(分)
注:若无计费规则,该值为 ‘-’
*/
            fm: number,

            /**
* 备注信息
*/
            rm: string
        }[]

    }[]
}

/**
 * 3.2.12设备告警信息上报
 */
export class PostDeviceAlarmInfoInput extends DataPushBase {
    /**
 * 设备编码
 */
    deviceCode: string;

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

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

    /**
     * 设备类型,详见参数枚举1.6.12
     */
    deviceType: number;

    /**
     * 故障类型
     */
    alarmType: number;

    /**
     * 故障类型名称
     */
    alarmName: string;

    /**
     * 设备状态码 1:出现告警 0：恢复
     */
    status: string;

    /**
     * 故障描述
     */
    remark: string;

    /**
     * 故障/恢复时间
     */
    statusTime: string;

    /**
     * 推送告警等级 1：一级响应 P0 2：二级响应 P1 3：三级响应 P2 4：四级响应 P3
     */
    alarmLevel?: string;
}

export { TyExternalApiClient }