export class Package {
  /**
   * 时间戳	4byte	唯一标识，重复发送的包，时间戳需一样。
   */
  ts: number;

  /**
   * 命令码	1byte	规定发送命令标示（回复包同发送包命令码一样)
   *
   * 'A' | 'C' | 'D' | 'F' | 'n' | 'Z' | 'P' | 'V' ...
   */
  cmd: string;

  /**
   * 总包数
   */
  packageTotal: number;

  /**
   * 包序号	2byte	从0开始（如仅仅1个包，则总包为1，包序号为0
   */
  packageNo: number;

  /**
   * 数据长度	2byte	最大1024。
   */
  dataLength: number;

  /**
   * 数据内容	N byte	依数据长度而定
   */
  data: Buffer;
}

export class CmdData {
  cmd:
    | "carIn"
    | "carOut"
    | "carOutMatch"
    | "carOutNotMatch"
    | "payNotify"
    | "doorOpenNotify"
    | "carLeaveBack";
  [key: string]: any;
}

export class CarIn extends CmdData {
  /**
   * 序列号
   */
  serial: string;

  /**
   * 通道id
   */
  nodeId: string;

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

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

  /**
   * 是否开闸
   */
  isDoorOpen: string;

  /**
   * 车型
   */
  carStyle: string;

  /**
   * 车牌类型
   */
  cardType: string;

  /**
   * 原车牌类型
   */
  cardTypeOrg: string;

  /**
   * 内部车信息
   */
  cardNoInfoBase: string;

  /**
   * 无效卡原因
   */
  invalidCardReason: string;

  /**
   * 凭据类型
   */
  serialType: string;

  result: string[];
  /**
   * 同卡多车车位数
   */
  sameCardLotCount: string;

  /**
   * 同卡多车车牌
   */
  sameCardCarNos: string;

  /**
   * 加速停车收费岗亭图片显示，启用车场服务器缓存图片功能
   */
  cachePictureSecond: string;
}

export class CarOutNotMatch extends CmdData {
  /**
   * 账单标识
   */
  billId: string;

  /**
   * 是否黑名单
   */
  blacklist: string;

  /**
   * 黑名单备注信息
   */
  blacklistRemark?: string;

  /**
   * 缓存数据
   */
  cacheData?: string;

  /**
   * 车品牌
   */
  carBrand?: string;

  /**
   * 模糊匹配列表
   */
  carInList?: string;

  /**
   * 车牌号码
   */
  carNo: string;

  /**
   * 车牌颜色
   */
  carNoColor: string;

  /**
   * 出车时间
   */
  carOutTime: string;

  /**
   * 车型
   */
  carStyle: string;

  /**
   * 卡号id
   */
  cardId: string;

  /**
   * 凭据号
   */
  cardNo: string;

  /**
   * 车牌类型
   */
  cardType: string;

  /**
   * 原车牌类型
   */
  cardTypeOrg: string;

  /**
   * 空车牌匹配时间
   */
  emptyCarNoMatchTime: string;

  /**
   *
   */
  extInfo?: string;

  /**
   * 当天多次计费封顶类型 0不启用；1启用  这个字段是当天（自然天或24小内）多次进出，达到封顶后，进出不收费
   */
  feeLimit: string;

  /**
   * 封顶费用
   */
  feeLimitFee: string;

  /**
   * 封顶次数
   */
  feeLimitTime: string;

  /**
   * 历史欠费
   */
  followCarFee: string;

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

  /**
   * 卡无效原因
   */
  invalidCardReason: string;

  /**
   * 是否开闸
   */
  isDoorOpen: string;

  /**
   * 车场id
   */
  lotCode: string;

  /**
   * 主卡号
   */
  mainCardNo: string;

  /**
   * 0:不匹配
   */
  matchValue: string;

  /**
   * 通道id
   */
  nodeId: string;

  /**
   * 原车品牌
   */
  orgCarBrand: string;

  /**
   * 出车时间
   */
  outTime: string;

  /**
   * 车牌颜色
   */
  plateColor: string;

  /**
   * 识别度
   */
  recogEnable: string;

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

  /**
   * 进出凭据类型
   */
  serialType: string;
}

export class CarOutMatch extends CmdData {
  /**
   * 账单标识
   */
  billId: string;

  /**
   * 是否黑名单
   */
  blacklist: string;

  /**
   * 黑名单备注信息
   */
  blacklistRemark: string;

  /**
   * 缓存数据
   */
  cacheData: string;

  /**
   * 入场信息
   */
  carInList: any;

  /**
   * 进出凭据类型
   */
  carInSerialType: string;

  /**
   * 车牌号码
   */
  carNo: string;

  /**
   * 车牌颜色
   */
  carNoColor: string;

  /**
   * 出车时间
   */
  carOutTime: string;

  /**
   * 车型
   */
  carStyle: string;

  /**
   * 卡号id
   */
  cardId: string;

  /**
   * 凭据号
   */
  cardNo: string;

  /**
   * 车牌类型
   */
  cardType: string;

  /**
   * 原车牌类型
   */
  cardTypeOrg?: string;

  /**
   * etc余额
   */
  etcBalance?: string;

  /**
   * etc卡号
   */
  etcNo?: string;

  /**
   *
   */
  extInfo?: any;

  /**
   *
   */
  content?: any;

  /**
   *
   */
  data?: any;

  /**
   * 快速放行
   */
  fastDoorOpen: string;

  /**
   * 计费信息
   */
  fee: any;

  /**
   * 当天多次计费封顶类型 0不启用；1启用  这个字段是当天（自然天或24小内）多次进出，达到封顶后，进出不收费
   */
  feeLimit: string;

  /**
   * 封顶费用
   */
  feeLimitFee: string;

  /**
   * 封顶次数
   */
  feeLimitTime: string;

  /**
   * 历史欠费
   */
  followCarFee: string;

  /**
   * 图片名
   */
  imgName: string;

  /**
   * 是否开闸
   */
  isDoorOpen: string;

  /**
   * 通道id
   */
  nodeId: string;

  /**
   * 进出记录
   */
  inOutRecord?: any;

  /**
   * 卡无效原因
   */
  invalidCardReason: string;

  /**
   * 车场id
   */
  lotCode: string;

  /**
   * 主卡号
   */
  mainCardNo: string;

  /**
   * 0:不匹配
   */
  matchValue: string;

  /**
   * 出车时间
   */
  outTime: string;

  /**
   * 车牌颜色
   */
  plateColor: string;

  /**
   * 识别度
   */
  recogEnable: string;

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

  /**
   * 进出凭据类型
   */
  serialType: string;

  /**
   * 停车时长
   */
  timeLong: string;
}

export class DoorOpenNotify extends CmdData {
  /**
   * 序列号
   */
  serial: string;

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

  /**
   * 通道id
   */
  nodeId: string;

  /**
   * 图片名称
   */
  imgName?: string;

  /**
   * 车牌
   */
  carNo: string;

  /**
   * 凭据号
   */
  cardNo: string;
}
