/// 用车申请单,对应 [OA_VEHICLE] 表。 /// /// 字段名采用 camelCase,fromJson 将大写下划线映射。 /// 瞬态字段:applicantName、salName、deptName、isAuditApproved。 class VehicleApplyModel { final String ycNo; // 用车申请单号 (YC_NO) final DateTime? ycDd; // 申请日期 (YC_DD) final String salNo; // 申请人 (SAL_NO) final String dep; // 所属部门 (DEP) final String reason; // 用车事由 (REASON) final String originAdr; // 始发地地址 (ORIGIN_ADR) final double? originLongitude; // 始发地经度 (ORIGIN_LONGITUDE) final double? originLatitude; // 始发地纬度 (ORIGIN_LATITUDE) final String destAdr; // 目的地地址 (DEST_ADR) final double? destLongitude; // 目的地经度 (DEST_LONGITUDE) final double? destLatitude; // 目的地纬度 (DEST_LATITUDE) final int passengerCount; // 同行人数 (PASSENGER_COUNT) final String passengerName; // 同行人姓名 (PASSENGER_NAME) final String licensePlate; // 车牌号 (LICENSEPLATE) final String vehicleType; // 车辆类型 (VEHICLE_TYPE) final String brand; // 品牌型号 (BRAND) final int odometerBegin; // 出发前里程表读数 (ODOMETER_BEGIN) final int seats; // 核定座位数 (SEATS) final String driverName; // 默认驾驶员 (DRIVER_NAME) final DateTime? startTime; // 预计出车时间 (START_TIME) final DateTime? endTime; // 预计还车时间 (END_TIME) final String usr; // 录入人 (USR) final DateTime? recordDd; // 录入日期 (RECORD_DD) final String chkMan; // 审核人 (CHK_MAN) final DateTime? clsDate; // 终审日期 (CLS_DATE) // ── 还车登记字段 ── final bool isReturn; // 是否已还车 (IS_RETURN: 'T'/'F') final DateTime? returnTime; // 实际归还时间 (RETURN_TIME) final int odometerEnd; // 还车里程表读数 (ODOMETER_END) final double amtn; // 路桥费/停车费等实际费用 (AMTN 28,8) final String remark; // 费用明细备注 (REMARK) final String usrCheck; // 验车人 (USR_CHECK) final DateTime? checkDd; // 验车日期 (CHECK_DD) // ── 瞬态字段(API 从 ERP 实时查询,非存储) ── final String applicantName; final String salName; final String deptName; final bool isAuditApproved; const VehicleApplyModel({ this.ycNo = '', this.ycDd, this.salNo = '', this.dep = '', this.reason = '', this.originAdr = '', this.originLongitude, this.originLatitude, this.destAdr = '', this.destLongitude, this.destLatitude, this.passengerCount = 1, this.passengerName = '', this.licensePlate = '', this.vehicleType = '', this.brand = '', this.odometerBegin = 0, this.seats = 0, this.driverName = '', this.startTime, this.endTime, this.usr = '', this.recordDd, this.chkMan = '', this.clsDate, this.isReturn = false, this.returnTime, this.odometerEnd = 0, this.amtn = 0.0, this.remark = '', this.usrCheck = '', this.checkDd, this.applicantName = '', this.salName = '', this.deptName = '', this.isAuditApproved = false, }); factory VehicleApplyModel.fromJson(Map json) { return VehicleApplyModel( ycNo: json['YC_NO'] as String? ?? '', ycDd: json['YC_DD'] != null ? DateTime.tryParse(json['YC_DD'] as String) : null, salNo: json['SAL_NO'] as String? ?? '', dep: json['DEP'] as String? ?? '', reason: json['REASON'] as String? ?? '', originAdr: json['ORIGIN_ADR'] as String? ?? '', originLongitude: (json['ORIGIN_LONGITUDE'] as num?)?.toDouble(), originLatitude: (json['ORIGIN_LATITUDE'] as num?)?.toDouble(), destAdr: json['DEST_ADR'] as String? ?? '', destLongitude: (json['DEST_LONGITUDE'] as num?)?.toDouble(), destLatitude: (json['DEST_LATITUDE'] as num?)?.toDouble(), passengerCount: json['PASSENGER_COUNT'] as int? ?? 1, passengerName: json['PASSENGER_NAME'] as String? ?? '', licensePlate: json['LICENSEPLATE'] as String? ?? '', vehicleType: json['VEHICLE_TYPE'] as String? ?? '', brand: json['BRAND'] as String? ?? '', odometerBegin: json['ODOMETER_BEGIN'] as int? ?? 0, seats: json['SEATS'] as int? ?? 0, driverName: json['DRIVER_NAME'] as String? ?? '', startTime: json['START_TIME'] != null ? DateTime.tryParse(json['START_TIME'] as String) : null, endTime: json['END_TIME'] != null ? DateTime.tryParse(json['END_TIME'] as String) : null, usr: json['USR'] as String? ?? '', recordDd: json['RECORD_DD'] != null ? DateTime.tryParse(json['RECORD_DD'] as String) : null, chkMan: json['CHK_MAN'] as String? ?? '', clsDate: json['CLS_DATE'] != null ? DateTime.tryParse(json['CLS_DATE'] as String) : null, isReturn: json['IS_RETURN'] == 'T', returnTime: json['RETURN_TIME'] != null ? DateTime.tryParse(json['RETURN_TIME'] as String) : null, odometerEnd: json['ODOMETER_END'] as int? ?? 0, amtn: (json['AMTN'] as num?)?.toDouble() ?? 0.0, remark: json['REMARK'] as String? ?? '', usrCheck: json['USR_CHECK'] as String? ?? '', checkDd: json['CHECK_DD'] != null ? DateTime.tryParse(json['CHECK_DD'] as String) : null, applicantName: json['SAL_NAME'] as String? ?? json['applicantName'] as String? ?? json['SAL_NO'] as String? ?? '', salName: json['SAL_NAME'] as String? ?? json['salName'] as String? ?? '', deptName: json['DEP_NAME'] as String? ?? json['deptName'] as String? ?? json['DEP'] as String? ?? '', isAuditApproved: (json['clsDate'] != null && (json['clsDate'] as String).isNotEmpty) || (json['CHK_MAN'] as String?)?.isNotEmpty == true, ); } Map toJson() => { 'YC_NO': ycNo, 'YC_DD': ycDd?.toIso8601String(), 'SAL_NO': salNo, 'DEP': dep, 'REASON': reason, 'ORIGIN_ADR': originAdr, 'ORIGIN_LONGITUDE': originLongitude, 'ORIGIN_LATITUDE': originLatitude, 'DEST_ADR': destAdr, 'DEST_LONGITUDE': destLongitude, 'DEST_LATITUDE': destLatitude, 'PASSENGER_COUNT': passengerCount, 'PASSENGER_NAME': passengerName, 'LICENSEPLATE': licensePlate, 'VEHICLE_TYPE': vehicleType, 'BRAND': brand, 'ODOMETER_BEGIN': odometerBegin, 'SEATS': seats, 'DRIVER_NAME': driverName, 'START_TIME': startTime?.toIso8601String(), 'END_TIME': endTime?.toIso8601String(), 'USR': usr, 'RECORD_DD': recordDd?.toIso8601String(), 'CHK_MAN': chkMan, 'CLS_DATE': clsDate?.toIso8601String(), 'IS_RETURN': isReturn ? 'T' : 'F', 'RETURN_TIME': returnTime?.toIso8601String(), 'ODOMETER_END': odometerEnd, 'AMTN': amtn, 'REMARK': remark, 'USR_CHECK': usrCheck, 'CHECK_DD': checkDd?.toIso8601String(), }; VehicleApplyModel copyWith({ String? ycNo, DateTime? ycDd, String? salNo, String? dep, String? reason, String? originAdr, double? originLongitude, double? originLatitude, String? destAdr, double? destLongitude, double? destLatitude, int? passengerCount, String? passengerName, String? licensePlate, String? vehicleType, String? brand, int? odometerBegin, int? seats, String? driverName, DateTime? startTime, DateTime? endTime, String? usr, DateTime? recordDd, String? chkMan, DateTime? clsDate, bool? isReturn, DateTime? returnTime, int? odometerEnd, double? amtn, String? remark, String? usrCheck, DateTime? checkDd, String? applicantName, String? salName, String? deptName, bool? isAuditApproved, }) { return VehicleApplyModel( ycNo: ycNo ?? this.ycNo, ycDd: ycDd ?? this.ycDd, salNo: salNo ?? this.salNo, dep: dep ?? this.dep, reason: reason ?? this.reason, originAdr: originAdr ?? this.originAdr, originLongitude: originLongitude ?? this.originLongitude, originLatitude: originLatitude ?? this.originLatitude, destAdr: destAdr ?? this.destAdr, destLongitude: destLongitude ?? this.destLongitude, destLatitude: destLatitude ?? this.destLatitude, passengerCount: passengerCount ?? this.passengerCount, passengerName: passengerName ?? this.passengerName, licensePlate: licensePlate ?? this.licensePlate, vehicleType: vehicleType ?? this.vehicleType, brand: brand ?? this.brand, odometerBegin: odometerBegin ?? this.odometerBegin, seats: seats ?? this.seats, driverName: driverName ?? this.driverName, startTime: startTime ?? this.startTime, endTime: endTime ?? this.endTime, usr: usr ?? this.usr, recordDd: recordDd ?? this.recordDd, chkMan: chkMan ?? this.chkMan, clsDate: clsDate ?? this.clsDate, isReturn: isReturn ?? this.isReturn, returnTime: returnTime ?? this.returnTime, odometerEnd: odometerEnd ?? this.odometerEnd, amtn: amtn ?? this.amtn, remark: remark ?? this.remark, usrCheck: usrCheck ?? this.usrCheck, checkDd: checkDd ?? this.checkDd, applicantName: applicantName ?? this.applicantName, salName: salName ?? this.salName, deptName: deptName ?? this.deptName, isAuditApproved: isAuditApproved ?? this.isAuditApproved, ); } }