import 'liveConsultation.m.dart';
import 'notification.m.dart';

import 'package:fis_common/json_convert.dart';

class ApplicationSettingInfoDTO {
	String? id;
	String? name;
	bool isPreferred;
	bool isUserDefined;
	bool isHidden;

	ApplicationSettingInfoDTO({
		this.id,
		this.name,
		this.isPreferred = false,
		this.isUserDefined = false,
		this.isHidden = false,
	});

	factory ApplicationSettingInfoDTO.fromJson(Map<String, dynamic> map) {
		return ApplicationSettingInfoDTO( 
			id: map['Id'],
			name: map['Name'],
			isPreferred: map['IsPreferred'],
			isUserDefined: map['IsUserDefined'],
			isHidden: map['IsHidden'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (id != null) {
			map['Id'] = id;
		}
		if (name != null) {
			map['Name'] = name;
		}
		map['IsPreferred'] = isPreferred;
		map['IsUserDefined'] = isUserDefined;
		map['IsHidden'] = isHidden;
		return map;
	}
}

class ProbeSettingInfoDTO {
	String? name;
	List<ApplicationSettingInfoDTO>? applications;

	ProbeSettingInfoDTO({
		this.name,
		this.applications,
	});

	factory ProbeSettingInfoDTO.fromJson(Map<String, dynamic> map) {
		return ProbeSettingInfoDTO( 
			name: map['Name'],
			applications: map['Applications'] != null ? (map['Applications'] as List).map((e)=>ApplicationSettingInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (name != null) {
			map['Name'] = name;
		}
		if (applications != null) {
			map['Applications'] = applications;
		}
		return map;
	}
}

class ProbeApplicationSettingInfoDTO {
	List<ProbeSettingInfoDTO>? probes;
	String? activeProbe;
	String? activeApplication;
	int maxNumberForApplication;
	int maxNumberForApplicationOfUserDefine;

	ProbeApplicationSettingInfoDTO({
		this.probes,
		this.activeProbe,
		this.activeApplication,
		this.maxNumberForApplication = 0,
		this.maxNumberForApplicationOfUserDefine = 0,
	});

	factory ProbeApplicationSettingInfoDTO.fromJson(Map<String, dynamic> map) {
		return ProbeApplicationSettingInfoDTO( 
			probes: map['Probes'] != null ? (map['Probes'] as List).map((e)=>ProbeSettingInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			activeProbe: map['ActiveProbe'],
			activeApplication: map['ActiveApplication'],
			maxNumberForApplication: map['MaxNumberForApplication'],
			maxNumberForApplicationOfUserDefine: map['MaxNumberForApplicationOfUserDefine'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (probes != null) {
			map['Probes'] = probes;
		}
		if (activeProbe != null) {
			map['ActiveProbe'] = activeProbe;
		}
		if (activeApplication != null) {
			map['ActiveApplication'] = activeApplication;
		}
		map['MaxNumberForApplication'] = maxNumberForApplication;
		map['MaxNumberForApplicationOfUserDefine'] = maxNumberForApplicationOfUserDefine;
		return map;
	}
}

class GetControlParametersRequest extends TokenRequest{
	String? deviceCode;

	GetControlParametersRequest({
		this.deviceCode,
		String? token,
	}) : super(
			token: token,
		);

	factory GetControlParametersRequest.fromJson(Map<String, dynamic> map) {
		return GetControlParametersRequest( 
			deviceCode: map['DeviceCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		return map;
	}
}

enum ConnectStatusEnum {
	UnConnect,
	WaitConnect,
	CompleteConnect,
	WaitDisconnect,
	CompleteDisconnect,
}

class UserRemoteConnectRequest {
	TransactionTypeEnum transactionType;
	ConnectStatusEnum statusEnum;
	String? userToken;
	String? deviceToken;
	String? userCode;
	String? roomId;
	String? deviceCode;
	LoginSource loginSource;
	bool isNeedSyn;

	UserRemoteConnectRequest({
		this.transactionType = TransactionTypeEnum.Consultion,
		this.statusEnum = ConnectStatusEnum.UnConnect,
		this.userToken,
		this.deviceToken,
		this.userCode,
		this.roomId,
		this.deviceCode,
		this.loginSource = LoginSource.PC,
		this.isNeedSyn = false,
	});

	factory UserRemoteConnectRequest.fromJson(Map<String, dynamic> map) {
		return UserRemoteConnectRequest( 
			transactionType: TransactionTypeEnum.values.firstWhere((e) => e.index == map['TransactionType']),
			statusEnum: ConnectStatusEnum.values.firstWhere((e) => e.index == map['StatusEnum']),
			userToken: map['UserToken'],
			deviceToken: map['DeviceToken'],
			userCode: map['UserCode'],
			roomId: map['RoomId'],
			deviceCode: map['DeviceCode'],
			loginSource: LoginSource.values.firstWhere((e) => e.index == map['LoginSource']),
			isNeedSyn: map['IsNeedSyn'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		map['TransactionType'] = transactionType.index;
		map['StatusEnum'] = statusEnum.index;
		if (userToken != null) {
			map['UserToken'] = userToken;
		}
		if (deviceToken != null) {
			map['DeviceToken'] = deviceToken;
		}
		if (userCode != null) {
			map['UserCode'] = userCode;
		}
		if (roomId != null) {
			map['RoomId'] = roomId;
		}
		if (deviceCode != null) {
			map['DeviceCode'] = deviceCode;
		}
		map['LoginSource'] = loginSource.index;
		map['IsNeedSyn'] = isNeedSyn;
		return map;
	}
}

class DeviceRemoteConnectRequest {
	TransactionTypeEnum transactionType;
	ConnectStatusEnum statusEnum;
	String? userToken;
	String? deviceToken;
	String? userCode;
	String? roomId;
	String? deviceCode;
	bool isNeedSyn;
	LoginSource loginSource;

	DeviceRemoteConnectRequest({
		this.transactionType = TransactionTypeEnum.Consultion,
		this.statusEnum = ConnectStatusEnum.UnConnect,
		this.userToken,
		this.deviceToken,
		this.userCode,
		this.roomId,
		this.deviceCode,
		this.isNeedSyn = false,
		this.loginSource = LoginSource.PC,
	});

	factory DeviceRemoteConnectRequest.fromJson(Map<String, dynamic> map) {
		return DeviceRemoteConnectRequest( 
			transactionType: TransactionTypeEnum.values.firstWhere((e) => e.index == map['TransactionType']),
			statusEnum: ConnectStatusEnum.values.firstWhere((e) => e.index == map['StatusEnum']),
			userToken: map['UserToken'],
			deviceToken: map['DeviceToken'],
			userCode: map['UserCode'],
			roomId: map['RoomId'],
			deviceCode: map['DeviceCode'],
			isNeedSyn: map['IsNeedSyn'],
			loginSource: LoginSource.values.firstWhere((e) => e.index == map['LoginSource']),
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		map['TransactionType'] = transactionType.index;
		map['StatusEnum'] = statusEnum.index;
		if (userToken != null) {
			map['UserToken'] = userToken;
		}
		if (deviceToken != null) {
			map['DeviceToken'] = deviceToken;
		}
		if (userCode != null) {
			map['UserCode'] = userCode;
		}
		if (roomId != null) {
			map['RoomId'] = roomId;
		}
		if (deviceCode != null) {
			map['DeviceCode'] = deviceCode;
		}
		map['IsNeedSyn'] = isNeedSyn;
		map['LoginSource'] = loginSource.index;
		return map;
	}
}

class RemoteConnectsRequest {
	List<UserRemoteConnectRequest>? userRemoteConnect;
	List<DeviceRemoteConnectRequest>? deviceRemoteConnect;

	RemoteConnectsRequest({
		this.userRemoteConnect,
		this.deviceRemoteConnect,
	});

	factory RemoteConnectsRequest.fromJson(Map<String, dynamic> map) {
		return RemoteConnectsRequest( 
			userRemoteConnect: map['UserRemoteConnect'] != null ? (map['UserRemoteConnect'] as List).map((e)=>UserRemoteConnectRequest.fromJson(e as Map<String,dynamic>)).toList() : null,
			deviceRemoteConnect: map['DeviceRemoteConnect'] != null ? (map['DeviceRemoteConnect'] as List).map((e)=>DeviceRemoteConnectRequest.fromJson(e as Map<String,dynamic>)).toList() : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (userRemoteConnect != null) {
			map['UserRemoteConnect'] = userRemoteConnect;
		}
		if (deviceRemoteConnect != null) {
			map['DeviceRemoteConnect'] = deviceRemoteConnect;
		}
		return map;
	}
}

class GetDeviceRequest extends TokenRequest{
	String? deviceCode;
	bool isNeedSyn;
	List<ConnectStatusEnum>? connectStatus;

	GetDeviceRequest({
		this.deviceCode,
		this.isNeedSyn = false,
		this.connectStatus,
		String? token,
	}) : super(
			token: token,
		);

	factory GetDeviceRequest.fromJson(Map<String, dynamic> map) {
		return GetDeviceRequest( 
			deviceCode: map['DeviceCode'],
			isNeedSyn: map['IsNeedSyn'],
			connectStatus: map['ConnectStatus'] != null ? (map['ConnectStatus'] as List).map((e)=>ConnectStatusEnum.values.firstWhere((i) => i.index == e)).toList() : null,
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		map['IsNeedSyn'] = isNeedSyn;
		if (connectStatus != null)
			map['ConnectStatus'] = connectStatus;
		return map;
	}
}

class GetDevicePrintersForUploadRequest extends TokenRequest{
	String? deviceCode;

	GetDevicePrintersForUploadRequest({
		this.deviceCode,
		String? token,
	}) : super(
			token: token,
		);

	factory GetDevicePrintersForUploadRequest.fromJson(Map<String, dynamic> map) {
		return GetDevicePrintersForUploadRequest( 
			deviceCode: map['DeviceCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		return map;
	}
}

class ExistsDevicePrinterRequest extends TokenRequest{
	String? name;

	ExistsDevicePrinterRequest({
		this.name,
		String? token,
	}) : super(
			token: token,
		);

	factory ExistsDevicePrinterRequest.fromJson(Map<String, dynamic> map) {
		return ExistsDevicePrinterRequest( 
			name: map['Name'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (name != null)
			map['Name'] = name;
		return map;
	}
}

class MigrateDevicePrinterInfo extends DevicePrinterDTO{
	bool isDelete;

	MigrateDevicePrinterInfo({
		this.isDelete = false,
		DateTime? createTime,
		DateTime? updateTime,
		String? code,
		String? name,
		String? driveModelName,
		String? description,
		String? osVersion,
		List<UploadDeviceFileInfoDTO>? fileUploadInfoList,
		int fileSize = 0,
		String? printerBrands,
		List<String>? printerModels,
		String? fileName,
	}) : super(
			code: code,
			name: name,
			driveModelName: driveModelName,
			description: description,
			osVersion: osVersion,
			fileUploadInfoList: fileUploadInfoList,
			fileSize: fileSize,
			printerBrands: printerBrands,
			printerModels: printerModels,
			fileName: fileName,
			createTime: createTime,
			updateTime: updateTime,
		);

	factory MigrateDevicePrinterInfo.fromJson(Map<String, dynamic> map) {
		return MigrateDevicePrinterInfo( 
			isDelete: map['IsDelete'],
			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
			code: map['Code'],
			name: map['Name'],
			driveModelName: map['DriveModelName'],
			description: map['Description'],
			osVersion: map['OsVersion'],
			fileUploadInfoList: map['FileUploadInfoList'] != null ? (map['FileUploadInfoList'] as List).map((e)=>UploadDeviceFileInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			fileSize: map['FileSize'],
			printerBrands: map['PrinterBrands'],
			printerModels: map['PrinterModels']?.cast<String>().toList(),
			fileName: map['FileName'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		map['IsDelete'] = isDelete;
		return map;
	}
}

class MigrateDevicePrinterRequest extends TokenRequest{
	List<MigrateDevicePrinterInfo>? migrateDevicePrinterInfos;

	MigrateDevicePrinterRequest({
		this.migrateDevicePrinterInfos,
		String? token,
	}) : super(
			token: token,
		);

	factory MigrateDevicePrinterRequest.fromJson(Map<String, dynamic> map) {
		return MigrateDevicePrinterRequest( 
			migrateDevicePrinterInfos: map['MigrateDevicePrinterInfos'] != null ? (map['MigrateDevicePrinterInfos'] as List).map((e)=>MigrateDevicePrinterInfo.fromJson(e as Map<String,dynamic>)).toList() : null,
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (migrateDevicePrinterInfos != null)
			map['MigrateDevicePrinterInfos'] = migrateDevicePrinterInfos;
		return map;
	}
}

class DevicePatchDTO extends BaseDTO{
	String? code;
	String? name;
	String? description;
	String? deviceType;
	String? softwareVersion;
	String? osVersion;
	List<UploadDeviceFileInfoDTO>? deviceFileInfoList;
	int fileSize;
	String? fileName;

	DevicePatchDTO({
		this.code,
		this.name,
		this.description,
		this.deviceType,
		this.softwareVersion,
		this.osVersion,
		this.deviceFileInfoList,
		this.fileSize = 0,
		this.fileName,
		DateTime? createTime,
		DateTime? updateTime,
	}) : super(
			createTime: createTime,
			updateTime: updateTime,
		);

	factory DevicePatchDTO.fromJson(Map<String, dynamic> map) {
		return DevicePatchDTO( 
			code: map['Code'],
			name: map['Name'],
			description: map['Description'],
			deviceType: map['DeviceType'],
			softwareVersion: map['SoftwareVersion'],
			osVersion: map['OsVersion'],
			deviceFileInfoList: map['DeviceFileInfoList'] != null ? (map['DeviceFileInfoList'] as List).map((e)=>UploadDeviceFileInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			fileSize: map['FileSize'],
			fileName: map['FileName'],
			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (code != null)
			map['Code'] = code;
		if (name != null)
			map['Name'] = name;
		if (description != null)
			map['Description'] = description;
		if (deviceType != null)
			map['DeviceType'] = deviceType;
		if (softwareVersion != null)
			map['SoftwareVersion'] = softwareVersion;
		if (osVersion != null)
			map['OsVersion'] = osVersion;
		if (deviceFileInfoList != null)
			map['DeviceFileInfoList'] = deviceFileInfoList;
		map['FileSize'] = fileSize;
		if (fileName != null)
			map['FileName'] = fileName;
		return map;
	}
}

class MigrateDevicePatchInfo extends DevicePatchDTO{
	bool isDelete;

	MigrateDevicePatchInfo({
		this.isDelete = false,
		DateTime? createTime,
		DateTime? updateTime,
		String? code,
		String? name,
		String? description,
		String? deviceType,
		String? softwareVersion,
		String? osVersion,
		List<UploadDeviceFileInfoDTO>? deviceFileInfoList,
		int fileSize = 0,
		String? fileName,
	}) : super(
			code: code,
			name: name,
			description: description,
			deviceType: deviceType,
			softwareVersion: softwareVersion,
			osVersion: osVersion,
			deviceFileInfoList: deviceFileInfoList,
			fileSize: fileSize,
			fileName: fileName,
			createTime: createTime,
			updateTime: updateTime,
		);

	factory MigrateDevicePatchInfo.fromJson(Map<String, dynamic> map) {
		return MigrateDevicePatchInfo( 
			isDelete: map['IsDelete'],
			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
			code: map['Code'],
			name: map['Name'],
			description: map['Description'],
			deviceType: map['DeviceType'],
			softwareVersion: map['SoftwareVersion'],
			osVersion: map['OsVersion'],
			deviceFileInfoList: map['DeviceFileInfoList'] != null ? (map['DeviceFileInfoList'] as List).map((e)=>UploadDeviceFileInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			fileSize: map['FileSize'],
			fileName: map['FileName'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		map['IsDelete'] = isDelete;
		return map;
	}
}

class MigrateDevicePatchRequest extends TokenRequest{
	List<MigrateDevicePatchInfo>? migrateDevicePatchInfos;

	MigrateDevicePatchRequest({
		this.migrateDevicePatchInfos,
		String? token,
	}) : super(
			token: token,
		);

	factory MigrateDevicePatchRequest.fromJson(Map<String, dynamic> map) {
		return MigrateDevicePatchRequest( 
			migrateDevicePatchInfos: map['MigrateDevicePatchInfos'] != null ? (map['MigrateDevicePatchInfos'] as List).map((e)=>MigrateDevicePatchInfo.fromJson(e as Map<String,dynamic>)).toList() : null,
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (migrateDevicePatchInfos != null)
			map['MigrateDevicePatchInfos'] = migrateDevicePatchInfos;
		return map;
	}
}

class DeviceExtendInfoDTO extends DeviceInfoDTO{
	String? organizationName;
	String? departmentName;
	bool isLiving;
	String? organizationDirectorCode;
	String? organizationDirectorUserName;
	String? organizationDirectorFullName;
	bool isEmergencyDevice;
	bool isCanRemoteMaintenance;
	bool isCanRestart;
	OrganizationPatientTypeEnum patientType;

	DeviceExtendInfoDTO({
		this.organizationName,
		this.departmentName,
		bool isOnline = false,
		this.isLiving = false,
		this.organizationDirectorCode,
		this.organizationDirectorUserName,
		this.organizationDirectorFullName,
		List<DictionaryLanguageConfigDTO>? languageConfigs,
		this.isEmergencyDevice = false,
		this.isCanRemoteMaintenance = false,
		this.isCanRestart = false,
		this.patientType = OrganizationPatientTypeEnum.Person,
		String? deviceCode,
		String? serialNumber,
		String? password,
		String? name,
		String? description,
		String? deviceModel,
		String? deviceType,
		String? headPicUrl,
		String? deviceSoftwareVersion,
		String? sDKSoftwareVersion,
		String? organizationCode,
		String? departmentCode,
		String? shortCode,
		bool isAutoShared = false,
		bool isEncryptedShow = false,
		DateTime? lastLoginTime,
		String? systemVersion,
		String? cPUModel,
		String? systemLanguage,
		List<String>? diagnosisModules,
		List<String>? reportPosterCodes,
		bool mergedChannel = false,
		int mergedVideoOutputWidth = 0,
		int mergedVideoOutputHeight = 0,
		List<VideoDeviceDTO>? videoDeviceInfos,
		DownloadModeSettingEnum downloadModeSetting = DownloadModeSettingEnum.Auto,
		bool liveOpened = false,
		bool supportRtc = false,
		String? displayName,
		SonopostVersionEnum sonopostVersion = SonopostVersionEnum.Sonopost,
		List<DataItemDTO>? deviceAttributes,
		bool isActive = false,
		String? upgradeVersionCode,
		DateTime? createTime,
		DateTime? updateTime,
	}) : super(
			deviceCode: deviceCode,
			serialNumber: serialNumber,
			password: password,
			name: name,
			description: description,
			deviceModel: deviceModel,
			deviceType: deviceType,
			headPicUrl: headPicUrl,
			deviceSoftwareVersion: deviceSoftwareVersion,
			sDKSoftwareVersion: sDKSoftwareVersion,
			organizationCode: organizationCode,
			departmentCode: departmentCode,
			shortCode: shortCode,
			isAutoShared: isAutoShared,
			isEncryptedShow: isEncryptedShow,
			lastLoginTime: lastLoginTime,
			systemVersion: systemVersion,
			cPUModel: cPUModel,
			systemLanguage: systemLanguage,
			diagnosisModules: diagnosisModules,
			reportPosterCodes: reportPosterCodes,
			mergedChannel: mergedChannel,
			mergedVideoOutputWidth: mergedVideoOutputWidth,
			mergedVideoOutputHeight: mergedVideoOutputHeight,
			videoDeviceInfos: videoDeviceInfos,
			downloadModeSetting: downloadModeSetting,
			liveOpened: liveOpened,
			supportRtc: supportRtc,
			displayName: displayName,
			sonopostVersion: sonopostVersion,
			deviceAttributes: deviceAttributes,
			isOnline: isOnline,
			isActive: isActive,
			languageConfigs: languageConfigs,
			upgradeVersionCode: upgradeVersionCode,
			createTime: createTime,
			updateTime: updateTime,
		);

	factory DeviceExtendInfoDTO.fromJson(Map<String, dynamic> map) {
		return DeviceExtendInfoDTO( 
			organizationName: map['OrganizationName'],
			departmentName: map['DepartmentName'],
			isOnline: map['IsOnline'],
			isLiving: map['IsLiving'],
			organizationDirectorCode: map['OrganizationDirectorCode'],
			organizationDirectorUserName: map['OrganizationDirectorUserName'],
			organizationDirectorFullName: map['OrganizationDirectorFullName'],
			languageConfigs: map['LanguageConfigs'] != null ? (map['LanguageConfigs'] as List).map((e)=>DictionaryLanguageConfigDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			isEmergencyDevice: map['IsEmergencyDevice'],
			isCanRemoteMaintenance: map['IsCanRemoteMaintenance'],
			isCanRestart: map['IsCanRestart'],
			patientType: OrganizationPatientTypeEnum.values.firstWhere((e) => e.index == map['PatientType']),
			deviceCode: map['DeviceCode'],
			serialNumber: map['SerialNumber'],
			password: map['Password'],
			name: map['Name'],
			description: map['Description'],
			deviceModel: map['DeviceModel'],
			deviceType: map['DeviceType'],
			headPicUrl: map['HeadPicUrl'],
			deviceSoftwareVersion: map['DeviceSoftwareVersion'],
			sDKSoftwareVersion: map['SDKSoftwareVersion'],
			organizationCode: map['OrganizationCode'],
			departmentCode: map['DepartmentCode'],
			shortCode: map['ShortCode'],
			isAutoShared: map['IsAutoShared'],
			isEncryptedShow: map['IsEncryptedShow'],
			lastLoginTime: map['LastLoginTime'] != null ? DateTime.parse(map['LastLoginTime']) : null,
			systemVersion: map['SystemVersion'],
			cPUModel: map['CPUModel'],
			systemLanguage: map['SystemLanguage'],
			diagnosisModules: map['DiagnosisModules']?.cast<String>().toList(),
			reportPosterCodes: map['ReportPosterCodes']?.cast<String>().toList(),
			mergedChannel: map['MergedChannel'],
			mergedVideoOutputWidth: map['MergedVideoOutputWidth'],
			mergedVideoOutputHeight: map['MergedVideoOutputHeight'],
			videoDeviceInfos: map['VideoDeviceInfos'] != null ? (map['VideoDeviceInfos'] as List).map((e)=>VideoDeviceDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			downloadModeSetting: DownloadModeSettingEnum.values.firstWhere((e) => e.index == map['DownloadModeSetting']),
			liveOpened: map['LiveOpened'],
			supportRtc: map['SupportRtc'],
			displayName: map['DisplayName'],
			sonopostVersion: SonopostVersionEnum.values.firstWhere((e) => e.index == map['SonopostVersion']),
			deviceAttributes: map['DeviceAttributes'] != null ? (map['DeviceAttributes'] as List).map((e)=>DataItemDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			isActive: map['IsActive'],
			upgradeVersionCode: map['UpgradeVersionCode'],
			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (organizationName != null)
			map['OrganizationName'] = organizationName;
		if (departmentName != null)
			map['DepartmentName'] = departmentName;
		map['IsLiving'] = isLiving;
		if (organizationDirectorCode != null)
			map['OrganizationDirectorCode'] = organizationDirectorCode;
		if (organizationDirectorUserName != null)
			map['OrganizationDirectorUserName'] = organizationDirectorUserName;
		if (organizationDirectorFullName != null)
			map['OrganizationDirectorFullName'] = organizationDirectorFullName;
		map['IsEmergencyDevice'] = isEmergencyDevice;
		map['IsCanRemoteMaintenance'] = isCanRemoteMaintenance;
		map['IsCanRestart'] = isCanRestart;
		map['PatientType'] = patientType.index;
		return map;
	}
}

class PageCollection<T> {
	int currentPage;
	int pageIndex;
	int pageSize;
	int dataCount;
	int totalCount;
	List<T>? pageData;

	PageCollection({
		this.currentPage = 0,
		this.pageIndex = 0,
		this.pageSize = 0,
		this.dataCount = 0,
		this.totalCount = 0,
		this.pageData,
	});

	factory PageCollection.fromJson(Map<String, dynamic> map) {
		List<T> pageDataList = [];
		if (map['PageData'] != null) {
			pageDataList.addAll(
					(map['PageData'] as List).map((e) => FJsonConvert.fromJson<T>(e)!));
		}
		return PageCollection( 
			currentPage: map['CurrentPage'],
			pageIndex: map['PageIndex'],
			pageSize: map['PageSize'],
			dataCount: map['DataCount'],
			totalCount: map['TotalCount'],
			pageData: pageDataList,
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		map['CurrentPage'] = currentPage;
		map['PageIndex'] = pageIndex;
		map['PageSize'] = pageSize;
		map['DataCount'] = dataCount;
		map['TotalCount'] = totalCount;
		if (pageData != null) {
			map['PageData'] = pageData;
		}
		return map;
	}
}

class GetPersonDeviceRequest extends PageRequest{
	String? keyWord;
	String? deviceType;
	String? deviceModel;
	List<String>? organizationCodes;
	bool? isOnline;

	GetPersonDeviceRequest({
		this.keyWord,
		this.deviceType,
		this.deviceModel,
		this.organizationCodes,
		this.isOnline,
		int pageIndex = 0,
		int pageSize = 0,
		String? token,
	}) : super(
			pageIndex: pageIndex,
			pageSize: pageSize,
			token: token,
		);

	factory GetPersonDeviceRequest.fromJson(Map<String, dynamic> map) {
		return GetPersonDeviceRequest( 
			keyWord: map['KeyWord'],
			deviceType: map['DeviceType'],
			deviceModel: map['DeviceModel'],
			organizationCodes: map['OrganizationCodes']?.cast<String>().toList(),
			isOnline: map['IsOnline'],
			pageIndex: map['PageIndex'],
			pageSize: map['PageSize'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (keyWord != null)
			map['KeyWord'] = keyWord;
		if (deviceType != null)
			map['DeviceType'] = deviceType;
		if (deviceModel != null)
			map['DeviceModel'] = deviceModel;
		if (organizationCodes != null)
			map['OrganizationCodes'] = organizationCodes;
		if (isOnline != null)
			map['IsOnline'] = isOnline;
		return map;
	}
}

class SelectItemDTO {
	String? key;
	String? value;
	String? language;

	SelectItemDTO({
		this.key,
		this.value,
		this.language,
	});

	factory SelectItemDTO.fromJson(Map<String, dynamic> map) {
		return SelectItemDTO( 
			key: map['Key'],
			value: map['Value'],
			language: map['Language'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (key != null) {
			map['Key'] = key;
		}
		if (value != null) {
			map['Value'] = value;
		}
		if (language != null) {
			map['Language'] = language;
		}
		return map;
	}
}

class GetPersonDeviceDropdownPageRequest extends PageRequest{
	String? keyWord;
	List<String>? restrictOrgCodes;
	bool isIncloudReferral;

	GetPersonDeviceDropdownPageRequest({
		this.keyWord,
		this.restrictOrgCodes,
		this.isIncloudReferral = false,
		int pageIndex = 0,
		int pageSize = 0,
		String? token,
	}) : super(
			pageIndex: pageIndex,
			pageSize: pageSize,
			token: token,
		);

	factory GetPersonDeviceDropdownPageRequest.fromJson(Map<String, dynamic> map) {
		return GetPersonDeviceDropdownPageRequest( 
			keyWord: map['KeyWord'],
			restrictOrgCodes: map['RestrictOrgCodes']?.cast<String>().toList(),
			isIncloudReferral: map['IsIncloudReferral'],
			pageIndex: map['PageIndex'],
			pageSize: map['PageSize'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (keyWord != null)
			map['KeyWord'] = keyWord;
		if (restrictOrgCodes != null)
			map['RestrictOrgCodes'] = restrictOrgCodes;
		map['IsIncloudReferral'] = isIncloudReferral;
		return map;
	}
}

class UploadDeviceDTO extends BaseDTO{
	String? serialNumber;
	String? deviceModel;
	String? deviceType;
	String? deviceSoftwareVersion;
	String? sDKSoftwareVersion;

	UploadDeviceDTO({
		this.serialNumber,
		this.deviceModel,
		this.deviceType,
		this.deviceSoftwareVersion,
		this.sDKSoftwareVersion,
		DateTime? createTime,
		DateTime? updateTime,
	}) : super(
			createTime: createTime,
			updateTime: updateTime,
		);

	factory UploadDeviceDTO.fromJson(Map<String, dynamic> map) {
		return UploadDeviceDTO( 
			serialNumber: map['SerialNumber'],
			deviceModel: map['DeviceModel'],
			deviceType: map['DeviceType'],
			deviceSoftwareVersion: map['DeviceSoftwareVersion'],
			sDKSoftwareVersion: map['SDKSoftwareVersion'],
			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (serialNumber != null)
			map['SerialNumber'] = serialNumber;
		if (deviceModel != null)
			map['DeviceModel'] = deviceModel;
		if (deviceType != null)
			map['DeviceType'] = deviceType;
		if (deviceSoftwareVersion != null)
			map['DeviceSoftwareVersion'] = deviceSoftwareVersion;
		if (sDKSoftwareVersion != null)
			map['SDKSoftwareVersion'] = sDKSoftwareVersion;
		return map;
	}
}

class CreateDeviceRequest extends UploadDeviceDTO{

	CreateDeviceRequest({
		String? serialNumber,
		String? deviceModel,
		String? deviceType,
		String? deviceSoftwareVersion,
		String? sDKSoftwareVersion,
		DateTime? createTime,
		DateTime? updateTime,
	}) : super(
			serialNumber: serialNumber,
			deviceModel: deviceModel,
			deviceType: deviceType,
			deviceSoftwareVersion: deviceSoftwareVersion,
			sDKSoftwareVersion: sDKSoftwareVersion,
			createTime: createTime,
			updateTime: updateTime,
		);

	factory CreateDeviceRequest.fromJson(Map<String, dynamic> map) {
		return CreateDeviceRequest( 
			serialNumber: map['SerialNumber'],
			deviceModel: map['DeviceModel'],
			deviceType: map['DeviceType'],
			deviceSoftwareVersion: map['DeviceSoftwareVersion'],
			sDKSoftwareVersion: map['SDKSoftwareVersion'],
			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		return map;
	}
}

class FindDeviceInfoByNameRequest extends TokenRequest{
	String? name;

	FindDeviceInfoByNameRequest({
		this.name,
		String? token,
	}) : super(
			token: token,
		);

	factory FindDeviceInfoByNameRequest.fromJson(Map<String, dynamic> map) {
		return FindDeviceInfoByNameRequest( 
			name: map['Name'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (name != null)
			map['Name'] = name;
		return map;
	}
}

class GetDeviceByShortCodeRequest extends TokenRequest{
	String? shortCode;

	GetDeviceByShortCodeRequest({
		this.shortCode,
		String? token,
	}) : super(
			token: token,
		);

	factory GetDeviceByShortCodeRequest.fromJson(Map<String, dynamic> map) {
		return GetDeviceByShortCodeRequest( 
			shortCode: map['ShortCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (shortCode != null)
			map['ShortCode'] = shortCode;
		return map;
	}
}

class PageFilterRequest extends BaseRequest{
	int currentPage;
	int pageSize;
	Map<String,String>? filter;
	bool isFuzzy;

	PageFilterRequest({
		this.currentPage = 0,
		this.pageSize = 0,
		this.filter,
		this.isFuzzy = false,
	}) : super(
		);

	factory PageFilterRequest.fromJson(Map<String, dynamic> map) {
		return PageFilterRequest( 
			currentPage: map['CurrentPage'],
			pageSize: map['PageSize'],
			filter: map['Filter']?.cast<String,String>(),
			isFuzzy: map['IsFuzzy'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		map['CurrentPage'] = currentPage;
		map['PageSize'] = pageSize;
		if (filter != null)
			map['Filter'] = filter;
		map['IsFuzzy'] = isFuzzy;
		return map;
	}
}

class BindDeviceRequest extends TokenRequest{
	String? serialNumber;
	String? name;
	String? description;
	String? headPicUrl;
	String? organizationCode;
	String? departmentCode;
	String? shortCode;
	bool isAutoShared;

	BindDeviceRequest({
		this.serialNumber,
		this.name,
		this.description,
		this.headPicUrl,
		this.organizationCode,
		this.departmentCode,
		this.shortCode,
		this.isAutoShared = false,
		String? token,
	}) : super(
			token: token,
		);

	factory BindDeviceRequest.fromJson(Map<String, dynamic> map) {
		return BindDeviceRequest( 
			serialNumber: map['SerialNumber'],
			name: map['Name'],
			description: map['Description'],
			headPicUrl: map['HeadPicUrl'],
			organizationCode: map['OrganizationCode'],
			departmentCode: map['DepartmentCode'],
			shortCode: map['ShortCode'],
			isAutoShared: map['IsAutoShared'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (serialNumber != null)
			map['SerialNumber'] = serialNumber;
		if (name != null)
			map['Name'] = name;
		if (description != null)
			map['Description'] = description;
		if (headPicUrl != null)
			map['HeadPicUrl'] = headPicUrl;
		if (organizationCode != null)
			map['OrganizationCode'] = organizationCode;
		if (departmentCode != null)
			map['DepartmentCode'] = departmentCode;
		if (shortCode != null)
			map['ShortCode'] = shortCode;
		map['IsAutoShared'] = isAutoShared;
		return map;
	}
}

class ModifyDeviceRequest extends TokenRequest{
	String? deviceCode;
	String? name;
	String? headPicUrl;
	String? departmentCode;
	bool isAutoShared;
	String? description;

	ModifyDeviceRequest({
		this.deviceCode,
		this.name,
		this.headPicUrl,
		this.departmentCode,
		this.isAutoShared = false,
		this.description,
		String? token,
	}) : super(
			token: token,
		);

	factory ModifyDeviceRequest.fromJson(Map<String, dynamic> map) {
		return ModifyDeviceRequest( 
			deviceCode: map['DeviceCode'],
			name: map['Name'],
			headPicUrl: map['HeadPicUrl'],
			departmentCode: map['DepartmentCode'],
			isAutoShared: map['IsAutoShared'],
			description: map['Description'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		if (name != null)
			map['Name'] = name;
		if (headPicUrl != null)
			map['HeadPicUrl'] = headPicUrl;
		if (departmentCode != null)
			map['DepartmentCode'] = departmentCode;
		map['IsAutoShared'] = isAutoShared;
		if (description != null)
			map['Description'] = description;
		return map;
	}
}

class UpdateDeviceRequest extends DeviceInfoDTO{
	String? token;

	UpdateDeviceRequest({
		this.token,
		String? deviceCode,
		String? serialNumber,
		String? password,
		String? name,
		String? description,
		String? deviceModel,
		String? deviceType,
		String? headPicUrl,
		String? deviceSoftwareVersion,
		String? sDKSoftwareVersion,
		String? organizationCode,
		String? departmentCode,
		String? shortCode,
		bool isAutoShared = false,
		bool isEncryptedShow = false,
		DateTime? lastLoginTime,
		String? systemVersion,
		String? cPUModel,
		String? systemLanguage,
		List<String>? diagnosisModules,
		List<String>? reportPosterCodes,
		bool mergedChannel = false,
		int mergedVideoOutputWidth = 0,
		int mergedVideoOutputHeight = 0,
		List<VideoDeviceDTO>? videoDeviceInfos,
		DownloadModeSettingEnum downloadModeSetting = DownloadModeSettingEnum.Auto,
		bool liveOpened = false,
		bool supportRtc = false,
		String? displayName,
		SonopostVersionEnum sonopostVersion = SonopostVersionEnum.Sonopost,
		List<DataItemDTO>? deviceAttributes,
		bool isOnline = false,
		bool isActive = false,
		List<DictionaryLanguageConfigDTO>? languageConfigs,
		String? upgradeVersionCode,
		DateTime? createTime,
		DateTime? updateTime,
	}) : super(
			deviceCode: deviceCode,
			serialNumber: serialNumber,
			password: password,
			name: name,
			description: description,
			deviceModel: deviceModel,
			deviceType: deviceType,
			headPicUrl: headPicUrl,
			deviceSoftwareVersion: deviceSoftwareVersion,
			sDKSoftwareVersion: sDKSoftwareVersion,
			organizationCode: organizationCode,
			departmentCode: departmentCode,
			shortCode: shortCode,
			isAutoShared: isAutoShared,
			isEncryptedShow: isEncryptedShow,
			lastLoginTime: lastLoginTime,
			systemVersion: systemVersion,
			cPUModel: cPUModel,
			systemLanguage: systemLanguage,
			diagnosisModules: diagnosisModules,
			reportPosterCodes: reportPosterCodes,
			mergedChannel: mergedChannel,
			mergedVideoOutputWidth: mergedVideoOutputWidth,
			mergedVideoOutputHeight: mergedVideoOutputHeight,
			videoDeviceInfos: videoDeviceInfos,
			downloadModeSetting: downloadModeSetting,
			liveOpened: liveOpened,
			supportRtc: supportRtc,
			displayName: displayName,
			sonopostVersion: sonopostVersion,
			deviceAttributes: deviceAttributes,
			isOnline: isOnline,
			isActive: isActive,
			languageConfigs: languageConfigs,
			upgradeVersionCode: upgradeVersionCode,
			createTime: createTime,
			updateTime: updateTime,
		);

	factory UpdateDeviceRequest.fromJson(Map<String, dynamic> map) {
		return UpdateDeviceRequest( 
			token: map['Token'],
			deviceCode: map['DeviceCode'],
			serialNumber: map['SerialNumber'],
			password: map['Password'],
			name: map['Name'],
			description: map['Description'],
			deviceModel: map['DeviceModel'],
			deviceType: map['DeviceType'],
			headPicUrl: map['HeadPicUrl'],
			deviceSoftwareVersion: map['DeviceSoftwareVersion'],
			sDKSoftwareVersion: map['SDKSoftwareVersion'],
			organizationCode: map['OrganizationCode'],
			departmentCode: map['DepartmentCode'],
			shortCode: map['ShortCode'],
			isAutoShared: map['IsAutoShared'],
			isEncryptedShow: map['IsEncryptedShow'],
			lastLoginTime: map['LastLoginTime'] != null ? DateTime.parse(map['LastLoginTime']) : null,
			systemVersion: map['SystemVersion'],
			cPUModel: map['CPUModel'],
			systemLanguage: map['SystemLanguage'],
			diagnosisModules: map['DiagnosisModules']?.cast<String>().toList(),
			reportPosterCodes: map['ReportPosterCodes']?.cast<String>().toList(),
			mergedChannel: map['MergedChannel'],
			mergedVideoOutputWidth: map['MergedVideoOutputWidth'],
			mergedVideoOutputHeight: map['MergedVideoOutputHeight'],
			videoDeviceInfos: map['VideoDeviceInfos'] != null ? (map['VideoDeviceInfos'] as List).map((e)=>VideoDeviceDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			downloadModeSetting: DownloadModeSettingEnum.values.firstWhere((e) => e.index == map['DownloadModeSetting']),
			liveOpened: map['LiveOpened'],
			supportRtc: map['SupportRtc'],
			displayName: map['DisplayName'],
			sonopostVersion: SonopostVersionEnum.values.firstWhere((e) => e.index == map['SonopostVersion']),
			deviceAttributes: map['DeviceAttributes'] != null ? (map['DeviceAttributes'] as List).map((e)=>DataItemDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			isOnline: map['IsOnline'],
			isActive: map['IsActive'],
			languageConfigs: map['LanguageConfigs'] != null ? (map['LanguageConfigs'] as List).map((e)=>DictionaryLanguageConfigDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			upgradeVersionCode: map['UpgradeVersionCode'],
			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (token != null)
			map['Token'] = token;
		return map;
	}
}

enum DictionaryTypeEnum {
	DeviceModel,
	DeviceType,
}

class CreateDictionaryItemRequest extends TokenRequest{
	DictionaryTypeEnum dictionaryType;
	String? dictionaryItemValue;
	String? parentCode;

	CreateDictionaryItemRequest({
		this.dictionaryType = DictionaryTypeEnum.DeviceModel,
		this.dictionaryItemValue,
		this.parentCode,
		String? token,
	}) : super(
			token: token,
		);

	factory CreateDictionaryItemRequest.fromJson(Map<String, dynamic> map) {
		return CreateDictionaryItemRequest( 
			dictionaryType: DictionaryTypeEnum.values.firstWhere((e) => e.index == map['DictionaryType']),
			dictionaryItemValue: map['DictionaryItemValue'],
			parentCode: map['ParentCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		map['DictionaryType'] = dictionaryType.index;
		if (dictionaryItemValue != null)
			map['DictionaryItemValue'] = dictionaryItemValue;
		if (parentCode != null)
			map['ParentCode'] = parentCode;
		return map;
	}
}

class DictionaryDTO extends BaseDTO{
	String? dictionaryCode;
	DictionaryTypeEnum dictionaryType;
	String? value;
	String? parentCode;
	List<DictionaryLanguageConfigDTO>? languageConfigs;

	DictionaryDTO({
		this.dictionaryCode,
		this.dictionaryType = DictionaryTypeEnum.DeviceModel,
		this.value,
		this.parentCode,
		this.languageConfigs,
		DateTime? createTime,
		DateTime? updateTime,
	}) : super(
			createTime: createTime,
			updateTime: updateTime,
		);

	factory DictionaryDTO.fromJson(Map<String, dynamic> map) {
		return DictionaryDTO( 
			dictionaryCode: map['DictionaryCode'],
			dictionaryType: DictionaryTypeEnum.values.firstWhere((e) => e.index == map['DictionaryType']),
			value: map['Value'],
			parentCode: map['ParentCode'],
			languageConfigs: map['LanguageConfigs'] != null ? (map['LanguageConfigs'] as List).map((e)=>DictionaryLanguageConfigDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (dictionaryCode != null)
			map['DictionaryCode'] = dictionaryCode;
		map['DictionaryType'] = dictionaryType.index;
		if (value != null)
			map['Value'] = value;
		if (parentCode != null)
			map['ParentCode'] = parentCode;
		if (languageConfigs != null)
			map['LanguageConfigs'] = languageConfigs;
		return map;
	}
}

class FindDeviceModelItemsRequest extends TokenRequest{
	DictionaryTypeEnum dictionaryType;
	String? deviceTypeCode;

	FindDeviceModelItemsRequest({
		this.dictionaryType = DictionaryTypeEnum.DeviceModel,
		this.deviceTypeCode,
		String? token,
	}) : super(
			token: token,
		);

	factory FindDeviceModelItemsRequest.fromJson(Map<String, dynamic> map) {
		return FindDeviceModelItemsRequest( 
			dictionaryType: DictionaryTypeEnum.values.firstWhere((e) => e.index == map['DictionaryType']),
			deviceTypeCode: map['DeviceTypeCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		map['DictionaryType'] = dictionaryType.index;
		if (deviceTypeCode != null)
			map['DeviceTypeCode'] = deviceTypeCode;
		return map;
	}
}

class FindDeviceTypeItemsRequest extends TokenRequest{
	DictionaryTypeEnum dictionaryType;

	FindDeviceTypeItemsRequest({
		this.dictionaryType = DictionaryTypeEnum.DeviceModel,
		String? token,
	}) : super(
			token: token,
		);

	factory FindDeviceTypeItemsRequest.fromJson(Map<String, dynamic> map) {
		return FindDeviceTypeItemsRequest( 
			dictionaryType: DictionaryTypeEnum.values.firstWhere((e) => e.index == map['DictionaryType']),
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		map['DictionaryType'] = dictionaryType.index;
		return map;
	}
}

class CreateShareDeviceToUserRequest extends TokenRequest{
	List<String>? userCodes;
	String? deviceCode;

	CreateShareDeviceToUserRequest({
		this.userCodes,
		this.deviceCode,
		String? token,
	}) : super(
			token: token,
		);

	factory CreateShareDeviceToUserRequest.fromJson(Map<String, dynamic> map) {
		return CreateShareDeviceToUserRequest( 
			userCodes: map['UserCodes']?.cast<String>().toList(),
			deviceCode: map['DeviceCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (userCodes != null)
			map['UserCodes'] = userCodes;
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		return map;
	}
}

class DeleteShareDeviceToUserRequest extends TokenRequest{
	List<String>? userCodes;
	String? deviceCode;

	DeleteShareDeviceToUserRequest({
		this.userCodes,
		this.deviceCode,
		String? token,
	}) : super(
			token: token,
		);

	factory DeleteShareDeviceToUserRequest.fromJson(Map<String, dynamic> map) {
		return DeleteShareDeviceToUserRequest( 
			userCodes: map['UserCodes']?.cast<String>().toList(),
			deviceCode: map['DeviceCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (userCodes != null)
			map['UserCodes'] = userCodes;
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		return map;
	}
}

class RemoveDeviceRelevancyRequest extends TokenRequest{
	String? organizationCode;
	String? departmentCode;
	String? deviceCode;

	RemoveDeviceRelevancyRequest({
		this.organizationCode,
		this.departmentCode,
		this.deviceCode,
		String? token,
	}) : super(
			token: token,
		);

	factory RemoveDeviceRelevancyRequest.fromJson(Map<String, dynamic> map) {
		return RemoveDeviceRelevancyRequest( 
			organizationCode: map['OrganizationCode'],
			departmentCode: map['DepartmentCode'],
			deviceCode: map['DeviceCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (organizationCode != null)
			map['OrganizationCode'] = organizationCode;
		if (departmentCode != null)
			map['DepartmentCode'] = departmentCode;
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		return map;
	}
}

class GetPersonRoleDeviceRequest extends PageRequest{
	String? keyWord;
	String? deviceType;
	String? deviceModel;

	GetPersonRoleDeviceRequest({
		this.keyWord,
		this.deviceType,
		this.deviceModel,
		int pageIndex = 0,
		int pageSize = 0,
		String? token,
	}) : super(
			pageIndex: pageIndex,
			pageSize: pageSize,
			token: token,
		);

	factory GetPersonRoleDeviceRequest.fromJson(Map<String, dynamic> map) {
		return GetPersonRoleDeviceRequest( 
			keyWord: map['KeyWord'],
			deviceType: map['DeviceType'],
			deviceModel: map['DeviceModel'],
			pageIndex: map['PageIndex'],
			pageSize: map['PageSize'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (keyWord != null)
			map['KeyWord'] = keyWord;
		if (deviceType != null)
			map['DeviceType'] = deviceType;
		if (deviceModel != null)
			map['DeviceModel'] = deviceModel;
		return map;
	}
}

class FindDevicesByOrganizationCodeRequest extends TokenRequest{
	String? organizationCode;

	FindDevicesByOrganizationCodeRequest({
		this.organizationCode,
		String? token,
	}) : super(
			token: token,
		);

	factory FindDevicesByOrganizationCodeRequest.fromJson(Map<String, dynamic> map) {
		return FindDevicesByOrganizationCodeRequest( 
			organizationCode: map['OrganizationCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (organizationCode != null)
			map['OrganizationCode'] = organizationCode;
		return map;
	}
}

class DeviceServerSettingResult {
	Map<String,String>? serverConfigList;
	bool isUploadThumbnail;
	OrganizationPatientTypeEnum patientType;
	int heartRateSeconds;
	String? notificationUrl;
	bool mergedChannel;
	int liveConsultationRateSeconds;
	int mergedVideoOutputWidth;
	int mergedVideoOutputHeight;
	bool isSelfRtcService;
	String? liveProtocol;
	TransactionStatusEnum liveProtocolType;
	String? fISWebUrl;
	int remoteControlHeartRateSeconds;

	DeviceServerSettingResult({
		this.serverConfigList,
		this.isUploadThumbnail = false,
		this.patientType = OrganizationPatientTypeEnum.Person,
		this.heartRateSeconds = 0,
		this.notificationUrl,
		this.mergedChannel = false,
		this.liveConsultationRateSeconds = 0,
		this.mergedVideoOutputWidth = 0,
		this.mergedVideoOutputHeight = 0,
		this.isSelfRtcService = false,
		this.liveProtocol,
		this.liveProtocolType = TransactionStatusEnum.Applied,
		this.fISWebUrl,
		this.remoteControlHeartRateSeconds = 0,
	});

	factory DeviceServerSettingResult.fromJson(Map<String, dynamic> map) {
		return DeviceServerSettingResult( 
			serverConfigList: map['ServerConfigList']?.cast<String,String>(),
			isUploadThumbnail: map['IsUploadThumbnail'],
			patientType: OrganizationPatientTypeEnum.values.firstWhere((e) => e.index == map['PatientType']),
			heartRateSeconds: map['HeartRateSeconds'],
			notificationUrl: map['NotificationUrl'],
			mergedChannel: map['MergedChannel'],
			liveConsultationRateSeconds: map['LiveConsultationRateSeconds'],
			mergedVideoOutputWidth: map['MergedVideoOutputWidth'],
			mergedVideoOutputHeight: map['MergedVideoOutputHeight'],
			isSelfRtcService: map['IsSelfRtcService'],
			liveProtocol: map['LiveProtocol'],
			liveProtocolType: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocolType']),
			fISWebUrl: map['FISWebUrl'],
			remoteControlHeartRateSeconds: map['RemoteControlHeartRateSeconds'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (serverConfigList != null) {
			map['ServerConfigList'] = serverConfigList;
		}
		map['IsUploadThumbnail'] = isUploadThumbnail;
		map['PatientType'] = patientType.index;
		map['HeartRateSeconds'] = heartRateSeconds;
		if (notificationUrl != null) {
			map['NotificationUrl'] = notificationUrl;
		}
		map['MergedChannel'] = mergedChannel;
		map['LiveConsultationRateSeconds'] = liveConsultationRateSeconds;
		map['MergedVideoOutputWidth'] = mergedVideoOutputWidth;
		map['MergedVideoOutputHeight'] = mergedVideoOutputHeight;
		map['IsSelfRtcService'] = isSelfRtcService;
		if (liveProtocol != null) {
			map['LiveProtocol'] = liveProtocol;
		}
		map['LiveProtocolType'] = liveProtocolType.index;
		if (fISWebUrl != null) {
			map['FISWebUrl'] = fISWebUrl;
		}
		map['RemoteControlHeartRateSeconds'] = remoteControlHeartRateSeconds;
		return map;
	}
}

class AddDeviceToOrgRequest extends TokenRequest{
	String? uniqueCode;

	AddDeviceToOrgRequest({
		this.uniqueCode,
		String? token,
	}) : super(
			token: token,
		);

	factory AddDeviceToOrgRequest.fromJson(Map<String, dynamic> map) {
		return AddDeviceToOrgRequest( 
			uniqueCode: map['UniqueCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (uniqueCode != null)
			map['UniqueCode'] = uniqueCode;
		return map;
	}
}

class DiagnosisModuleDTO extends BaseDTO{
	String? diagnosisModuleCode;
	String? diagnosisModule;
	bool enabled;

	DiagnosisModuleDTO({
		this.diagnosisModuleCode,
		this.diagnosisModule,
		this.enabled = false,
		DateTime? createTime,
		DateTime? updateTime,
	}) : super(
			createTime: createTime,
			updateTime: updateTime,
		);

	factory DiagnosisModuleDTO.fromJson(Map<String, dynamic> map) {
		return DiagnosisModuleDTO( 
			diagnosisModuleCode: map['DiagnosisModuleCode'],
			diagnosisModule: map['DiagnosisModule'],
			enabled: map['Enabled'],
			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (diagnosisModuleCode != null)
			map['DiagnosisModuleCode'] = diagnosisModuleCode;
		if (diagnosisModule != null)
			map['DiagnosisModule'] = diagnosisModule;
		map['Enabled'] = enabled;
		return map;
	}
}

class FindDeviceDiagnosisModulesRequest extends TokenRequest{
	String? deviceCode;

	FindDeviceDiagnosisModulesRequest({
		this.deviceCode,
		String? token,
	}) : super(
			token: token,
		);

	factory FindDeviceDiagnosisModulesRequest.fromJson(Map<String, dynamic> map) {
		return FindDeviceDiagnosisModulesRequest( 
			deviceCode: map['DeviceCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		return map;
	}
}

class ModifyDeviceDiagnosisModuleStateRequest extends TokenRequest{
	String? deviceCode;
	String? diagnosisModule;
	bool enabled;

	ModifyDeviceDiagnosisModuleStateRequest({
		this.deviceCode,
		this.diagnosisModule,
		this.enabled = false,
		String? token,
	}) : super(
			token: token,
		);

	factory ModifyDeviceDiagnosisModuleStateRequest.fromJson(Map<String, dynamic> map) {
		return ModifyDeviceDiagnosisModuleStateRequest( 
			deviceCode: map['DeviceCode'],
			diagnosisModule: map['DiagnosisModule'],
			enabled: map['Enabled'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		if (diagnosisModule != null)
			map['DiagnosisModule'] = diagnosisModule;
		map['Enabled'] = enabled;
		return map;
	}
}

class ReportVideoDeviceInfoResult {
	bool success;
	List<VideoDeviceDTO>? videoDeviceOutputInfos;

	ReportVideoDeviceInfoResult({
		this.success = false,
		this.videoDeviceOutputInfos,
	});

	factory ReportVideoDeviceInfoResult.fromJson(Map<String, dynamic> map) {
		return ReportVideoDeviceInfoResult( 
			success: map['Success'],
			videoDeviceOutputInfos: map['VideoDeviceOutputInfos'] != null ? (map['VideoDeviceOutputInfos'] as List).map((e)=>VideoDeviceDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		map['Success'] = success;
		if (videoDeviceOutputInfos != null) {
			map['VideoDeviceOutputInfos'] = videoDeviceOutputInfos;
		}
		return map;
	}
}

class VideoDeviceInfo {
	String? videoDeviceId;
	VideoDeviceSourceTypeEnum videoDeviceSourceType;
	int width;
	int height;
	int videoFps;
	int videoBitrate;
	int minVideoBitrate;

	VideoDeviceInfo({
		this.videoDeviceId,
		this.videoDeviceSourceType = VideoDeviceSourceTypeEnum.Desktop,
		this.width = 0,
		this.height = 0,
		this.videoFps = 0,
		this.videoBitrate = 0,
		this.minVideoBitrate = 0,
	});

	factory VideoDeviceInfo.fromJson(Map<String, dynamic> map) {
		return VideoDeviceInfo( 
			videoDeviceId: map['VideoDeviceId'],
			videoDeviceSourceType: VideoDeviceSourceTypeEnum.values.firstWhere((e) => e.index == map['VideoDeviceSourceType']),
			width: map['Width'],
			height: map['Height'],
			videoFps: map['VideoFps'],
			videoBitrate: map['VideoBitrate'],
			minVideoBitrate: map['MinVideoBitrate'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (videoDeviceId != null) {
			map['VideoDeviceId'] = videoDeviceId;
		}
		map['VideoDeviceSourceType'] = videoDeviceSourceType.index;
		map['Width'] = width;
		map['Height'] = height;
		map['VideoFps'] = videoFps;
		map['VideoBitrate'] = videoBitrate;
		map['MinVideoBitrate'] = minVideoBitrate;
		return map;
	}
}

class ReportVideoDeviceInfoRequest extends TokenRequest{
	bool liveOpened;
	bool supportRtc;
	bool mergedChannel;
	bool remoteControlOpened;
	List<VideoDeviceInfo>? videoDeviceInfos;
	bool isSync;

	ReportVideoDeviceInfoRequest({
		this.liveOpened = false,
		this.supportRtc = false,
		this.mergedChannel = false,
		this.remoteControlOpened = false,
		this.videoDeviceInfos,
		this.isSync = false,
		String? token,
	}) : super(
			token: token,
		);

	factory ReportVideoDeviceInfoRequest.fromJson(Map<String, dynamic> map) {
		return ReportVideoDeviceInfoRequest( 
			liveOpened: map['LiveOpened'],
			supportRtc: map['SupportRtc'],
			mergedChannel: map['MergedChannel'],
			remoteControlOpened: map['RemoteControlOpened'],
			videoDeviceInfos: map['VideoDeviceInfos'] != null ? (map['VideoDeviceInfos'] as List).map((e)=>VideoDeviceInfo.fromJson(e as Map<String,dynamic>)).toList() : null,
			isSync: map['IsSync'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		map['LiveOpened'] = liveOpened;
		map['SupportRtc'] = supportRtc;
		map['MergedChannel'] = mergedChannel;
		map['RemoteControlOpened'] = remoteControlOpened;
		if (videoDeviceInfos != null)
			map['VideoDeviceInfos'] = videoDeviceInfos;
		map['IsSync'] = isSync;
		return map;
	}
}

class ProbeInfoDTO {
	String? name;
	List<String>? applications;
	List<ApplicationSettingInfoDTO>? applicationInfos;

	ProbeInfoDTO({
		this.name,
		this.applications,
		this.applicationInfos,
	});

	factory ProbeInfoDTO.fromJson(Map<String, dynamic> map) {
		return ProbeInfoDTO( 
			name: map['Name'],
			applications: map['Applications']?.cast<String>().toList(),
			applicationInfos: map['ApplicationInfos'] != null ? (map['ApplicationInfos'] as List).map((e)=>ApplicationSettingInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (name != null) {
			map['Name'] = name;
		}
		if (applications != null) {
			map['Applications'] = applications;
		}
		if (applicationInfos != null) {
			map['ApplicationInfos'] = applicationInfos;
		}
		return map;
	}
}

class ProbeApplicationInfoDTO {
	List<ProbeInfoDTO>? probes;
	String? activeProbe;
	String? activeApplication;

	ProbeApplicationInfoDTO({
		this.probes,
		this.activeProbe,
		this.activeApplication,
	});

	factory ProbeApplicationInfoDTO.fromJson(Map<String, dynamic> map) {
		return ProbeApplicationInfoDTO( 
			probes: map['Probes'] != null ? (map['Probes'] as List).map((e)=>ProbeInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			activeProbe: map['ActiveProbe'],
			activeApplication: map['ActiveApplication'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (probes != null) {
			map['Probes'] = probes;
		}
		if (activeProbe != null) {
			map['ActiveProbe'] = activeProbe;
		}
		if (activeApplication != null) {
			map['ActiveApplication'] = activeApplication;
		}
		return map;
	}
}

class ControlParameterDTO {
	bool canExecute;
	List<ControlParameterDTO>? children;
	String? description;
	String? displayValue;
	String? parentDescription;
	String? valuesMapString;

	ControlParameterDTO({
		this.canExecute = false,
		this.children,
		this.description,
		this.displayValue,
		this.parentDescription,
		this.valuesMapString,
	});

	factory ControlParameterDTO.fromJson(Map<String, dynamic> map) {
		return ControlParameterDTO( 
			canExecute: map['CanExecute'],
			children: map['Children'] != null ? (map['Children'] as List).map((e)=>ControlParameterDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			description: map['Description'],
			displayValue: map['DisplayValue'],
			parentDescription: map['ParentDescription'],
			valuesMapString: map['ValuesMapString'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		map['CanExecute'] = canExecute;
		if (children != null) {
			map['Children'] = children;
		}
		if (description != null) {
			map['Description'] = description;
		}
		if (displayValue != null) {
			map['DisplayValue'] = displayValue;
		}
		if (parentDescription != null) {
			map['ParentDescription'] = parentDescription;
		}
		if (valuesMapString != null) {
			map['ValuesMapString'] = valuesMapString;
		}
		return map;
	}
}

class SendControlParameterByDeviceRequest extends TokenRequest{
	String? controlUserCode;
	ProbeApplicationInfoDTO? probeApplication;
	ControlParameterDTO? parameter;

	SendControlParameterByDeviceRequest({
		this.controlUserCode,
		this.probeApplication,
		this.parameter,
		String? token,
	}) : super(
			token: token,
		);

	factory SendControlParameterByDeviceRequest.fromJson(Map<String, dynamic> map) {
		return SendControlParameterByDeviceRequest( 
			controlUserCode: map['ControlUserCode'],
			probeApplication: map['ProbeApplication'] != null ? ProbeApplicationInfoDTO.fromJson(map['ProbeApplication']) : null,
			parameter: map['Parameter'] != null ? ControlParameterDTO.fromJson(map['Parameter']) : null,
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (controlUserCode != null)
			map['ControlUserCode'] = controlUserCode;
		if (probeApplication != null)
			map['ProbeApplication'] = probeApplication;
		if (parameter != null)
			map['Parameter'] = parameter;
		return map;
	}
}

class VideoDeviceInfoDTO {
	String? videoDeviceId;
	VideoDeviceSourceTypeEnum videoDeviceSourceType;
	LiveDataDTO? liveData;

	VideoDeviceInfoDTO({
		this.videoDeviceId,
		this.videoDeviceSourceType = VideoDeviceSourceTypeEnum.Desktop,
		this.liveData,
	});

	factory VideoDeviceInfoDTO.fromJson(Map<String, dynamic> map) {
		return VideoDeviceInfoDTO( 
			videoDeviceId: map['VideoDeviceId'],
			videoDeviceSourceType: VideoDeviceSourceTypeEnum.values.firstWhere((e) => e.index == map['VideoDeviceSourceType']),
			liveData: map['LiveData'] != null ? LiveDataDTO.fromJson(map['LiveData']) : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (videoDeviceId != null) {
			map['VideoDeviceId'] = videoDeviceId;
		}
		map['VideoDeviceSourceType'] = videoDeviceSourceType.index;
		if (liveData != null) {
			map['LiveData'] = liveData;
		}
		return map;
	}
}

class JoinDeviceLiveRoomResult extends TokenRequest{
	int roomNo;
	TransactionStatusEnum liveProtocol;
	String? deviceCode;
	bool mergedChannel;
	int mergedVideoOutputWidth;
	int mergedVideoOutputHeight;
	List<VideoDeviceInfoDTO>? videoDeviceInfos;
	int reportStateIntervalSeconds;
	bool isOldPlatform;
	bool supportRtc;

	JoinDeviceLiveRoomResult({
		this.roomNo = 0,
		this.liveProtocol = TransactionStatusEnum.Applied,
		this.deviceCode,
		this.mergedChannel = false,
		this.mergedVideoOutputWidth = 0,
		this.mergedVideoOutputHeight = 0,
		this.videoDeviceInfos,
		this.reportStateIntervalSeconds = 0,
		this.isOldPlatform = false,
		this.supportRtc = false,
		String? token,
	}) : super(
			token: token,
		);

	factory JoinDeviceLiveRoomResult.fromJson(Map<String, dynamic> map) {
		return JoinDeviceLiveRoomResult( 
			roomNo: map['RoomNo'],
			liveProtocol: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocol']),
			deviceCode: map['DeviceCode'],
			mergedChannel: map['MergedChannel'],
			mergedVideoOutputWidth: map['MergedVideoOutputWidth'],
			mergedVideoOutputHeight: map['MergedVideoOutputHeight'],
			videoDeviceInfos: map['VideoDeviceInfos'] != null ? (map['VideoDeviceInfos'] as List).map((e)=>VideoDeviceInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			reportStateIntervalSeconds: map['ReportStateIntervalSeconds'],
			isOldPlatform: map['IsOldPlatform'],
			supportRtc: map['SupportRtc'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		map['RoomNo'] = roomNo;
		map['LiveProtocol'] = liveProtocol.index;
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		map['MergedChannel'] = mergedChannel;
		map['MergedVideoOutputWidth'] = mergedVideoOutputWidth;
		map['MergedVideoOutputHeight'] = mergedVideoOutputHeight;
		if (videoDeviceInfos != null)
			map['VideoDeviceInfos'] = videoDeviceInfos;
		map['ReportStateIntervalSeconds'] = reportStateIntervalSeconds;
		map['IsOldPlatform'] = isOldPlatform;
		map['SupportRtc'] = supportRtc;
		return map;
	}
}

class JoinDeviceLiveRoomRequest extends TokenRequest{
	String? deviceCode;

	JoinDeviceLiveRoomRequest({
		this.deviceCode,
		String? token,
	}) : super(
			token: token,
		);

	factory JoinDeviceLiveRoomRequest.fromJson(Map<String, dynamic> map) {
		return JoinDeviceLiveRoomRequest( 
			deviceCode: map['DeviceCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		return map;
	}
}

class LeaveDeviceLiveRoomRequest extends TokenRequest{
	String? deviceCode;

	LeaveDeviceLiveRoomRequest({
		this.deviceCode,
		String? token,
	}) : super(
			token: token,
		);

	factory LeaveDeviceLiveRoomRequest.fromJson(Map<String, dynamic> map) {
		return LeaveDeviceLiveRoomRequest( 
			deviceCode: map['DeviceCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		return map;
	}
}

class ReportLiveViewStateRequest extends TokenRequest{
	String? deviceCode;

	ReportLiveViewStateRequest({
		this.deviceCode,
		String? token,
	}) : super(
			token: token,
		);

	factory ReportLiveViewStateRequest.fromJson(Map<String, dynamic> map) {
		return ReportLiveViewStateRequest( 
			deviceCode: map['DeviceCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		return map;
	}
}

class CreateLiveShareInfoResult extends TokenRequest{
	String? shareUrl;

	CreateLiveShareInfoResult({
		this.shareUrl,
		String? token,
	}) : super(
			token: token,
		);

	factory CreateLiveShareInfoResult.fromJson(Map<String, dynamic> map) {
		return CreateLiveShareInfoResult( 
			shareUrl: map['ShareUrl'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (shareUrl != null)
			map['ShareUrl'] = shareUrl;
		return map;
	}
}

class CreateLiveShareInfoRequest extends TokenRequest{
	String? deviceCode;

	CreateLiveShareInfoRequest({
		this.deviceCode,
		String? token,
	}) : super(
			token: token,
		);

	factory CreateLiveShareInfoRequest.fromJson(Map<String, dynamic> map) {
		return CreateLiveShareInfoRequest( 
			deviceCode: map['DeviceCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		return map;
	}
}

class JoinDeviceLiveRoomByShareResult {
	int roomNo;
	TransactionStatusEnum liveProtocol;
	String? deviceCode;
	bool mergedChannel;
	int mergedVideoOutputWidth;
	int mergedVideoOutputHeight;
	List<VideoDeviceInfoDTO>? videoDeviceInfos;
	int reportStateIntervalSeconds;
	bool isOldPlatform;
	bool supportRtc;

	JoinDeviceLiveRoomByShareResult({
		this.roomNo = 0,
		this.liveProtocol = TransactionStatusEnum.Applied,
		this.deviceCode,
		this.mergedChannel = false,
		this.mergedVideoOutputWidth = 0,
		this.mergedVideoOutputHeight = 0,
		this.videoDeviceInfos,
		this.reportStateIntervalSeconds = 0,
		this.isOldPlatform = false,
		this.supportRtc = false,
	});

	factory JoinDeviceLiveRoomByShareResult.fromJson(Map<String, dynamic> map) {
		return JoinDeviceLiveRoomByShareResult( 
			roomNo: map['RoomNo'],
			liveProtocol: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocol']),
			deviceCode: map['DeviceCode'],
			mergedChannel: map['MergedChannel'],
			mergedVideoOutputWidth: map['MergedVideoOutputWidth'],
			mergedVideoOutputHeight: map['MergedVideoOutputHeight'],
			videoDeviceInfos: map['VideoDeviceInfos'] != null ? (map['VideoDeviceInfos'] as List).map((e)=>VideoDeviceInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			reportStateIntervalSeconds: map['ReportStateIntervalSeconds'],
			isOldPlatform: map['IsOldPlatform'],
			supportRtc: map['SupportRtc'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		map['RoomNo'] = roomNo;
		map['LiveProtocol'] = liveProtocol.index;
		if (deviceCode != null) {
			map['DeviceCode'] = deviceCode;
		}
		map['MergedChannel'] = mergedChannel;
		map['MergedVideoOutputWidth'] = mergedVideoOutputWidth;
		map['MergedVideoOutputHeight'] = mergedVideoOutputHeight;
		if (videoDeviceInfos != null) {
			map['VideoDeviceInfos'] = videoDeviceInfos;
		}
		map['ReportStateIntervalSeconds'] = reportStateIntervalSeconds;
		map['IsOldPlatform'] = isOldPlatform;
		map['SupportRtc'] = supportRtc;
		return map;
	}
}

class JoinDeviceLiveRoomByShareRequest {
	String? shareCode;

	JoinDeviceLiveRoomByShareRequest({
		this.shareCode,
	});

	factory JoinDeviceLiveRoomByShareRequest.fromJson(Map<String, dynamic> map) {
		return JoinDeviceLiveRoomByShareRequest( 
			shareCode: map['ShareCode'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (shareCode != null) {
			map['ShareCode'] = shareCode;
		}
		return map;
	}
}

class LeaveDeviceLiveRoomByShareRequest {
	String? deviceCode;
	String? viewerUniqueId;

	LeaveDeviceLiveRoomByShareRequest({
		this.deviceCode,
		this.viewerUniqueId,
	});

	factory LeaveDeviceLiveRoomByShareRequest.fromJson(Map<String, dynamic> map) {
		return LeaveDeviceLiveRoomByShareRequest( 
			deviceCode: map['DeviceCode'],
			viewerUniqueId: map['ViewerUniqueId'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (deviceCode != null) {
			map['DeviceCode'] = deviceCode;
		}
		if (viewerUniqueId != null) {
			map['ViewerUniqueId'] = viewerUniqueId;
		}
		return map;
	}
}

class ReportLiveViewStateByShareRequest {
	String? deviceCode;
	String? viewerUniqueId;

	ReportLiveViewStateByShareRequest({
		this.deviceCode,
		this.viewerUniqueId,
	});

	factory ReportLiveViewStateByShareRequest.fromJson(Map<String, dynamic> map) {
		return ReportLiveViewStateByShareRequest( 
			deviceCode: map['DeviceCode'],
			viewerUniqueId: map['ViewerUniqueId'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (deviceCode != null) {
			map['DeviceCode'] = deviceCode;
		}
		if (viewerUniqueId != null) {
			map['ViewerUniqueId'] = viewerUniqueId;
		}
		return map;
	}
}

enum DeviceLiveStateEnum {
	Default,
	Pushing,
	Closed,
	Error,
	Warning,
}

class ReportLiveStateRequest extends TokenRequest{
	int roomNo;
	DeviceLiveStateEnum liveState;
	String? message;

	ReportLiveStateRequest({
		this.roomNo = 0,
		this.liveState = DeviceLiveStateEnum.Default,
		this.message,
		String? token,
	}) : super(
			token: token,
		);

	factory ReportLiveStateRequest.fromJson(Map<String, dynamic> map) {
		return ReportLiveStateRequest( 
			roomNo: map['RoomNo'],
			liveState: DeviceLiveStateEnum.values.firstWhere((e) => e.index == map['LiveState']),
			message: map['Message'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		map['RoomNo'] = roomNo;
		map['LiveState'] = liveState.index;
		if (message != null)
			map['Message'] = message;
		return map;
	}
}

class CreateLiveRoomInfoResult {
	String? userCode;
	String? userSign;
	int roomNo;
	int appId;
	bool isTrtc;
	TransactionStatusEnum liveProtocol;
	LiveDataDTO? liveData;

	CreateLiveRoomInfoResult({
		this.userCode,
		this.userSign,
		this.roomNo = 0,
		this.appId = 0,
		this.isTrtc = false,
		this.liveProtocol = TransactionStatusEnum.Applied,
		this.liveData,
	});

	factory CreateLiveRoomInfoResult.fromJson(Map<String, dynamic> map) {
		return CreateLiveRoomInfoResult( 
			userCode: map['UserCode'],
			userSign: map['UserSign'],
			roomNo: map['RoomNo'],
			appId: map['AppId'],
			isTrtc: map['IsTrtc'],
			liveProtocol: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocol']),
			liveData: map['LiveData'] != null ? LiveDataDTO.fromJson(map['LiveData']) : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (userCode != null) {
			map['UserCode'] = userCode;
		}
		if (userSign != null) {
			map['UserSign'] = userSign;
		}
		map['RoomNo'] = roomNo;
		map['AppId'] = appId;
		map['IsTrtc'] = isTrtc;
		map['LiveProtocol'] = liveProtocol.index;
		if (liveData != null) {
			map['LiveData'] = liveData;
		}
		return map;
	}
}

class CreateLiveRoomInfoRequest {
	String? deviceUniqueCode;
	String? deviceModel;
	String? deviceType;
	String? softwareVersion;

	CreateLiveRoomInfoRequest({
		this.deviceUniqueCode,
		this.deviceModel,
		this.deviceType,
		this.softwareVersion,
	});

	factory CreateLiveRoomInfoRequest.fromJson(Map<String, dynamic> map) {
		return CreateLiveRoomInfoRequest( 
			deviceUniqueCode: map['DeviceUniqueCode'],
			deviceModel: map['DeviceModel'],
			deviceType: map['DeviceType'],
			softwareVersion: map['SoftwareVersion'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (deviceUniqueCode != null) {
			map['DeviceUniqueCode'] = deviceUniqueCode;
		}
		if (deviceModel != null) {
			map['DeviceModel'] = deviceModel;
		}
		if (deviceType != null) {
			map['DeviceType'] = deviceType;
		}
		if (softwareVersion != null) {
			map['SoftwareVersion'] = softwareVersion;
		}
		return map;
	}
}

class UploadConsultationDataRequest extends TokenRequest{
	String? consultationCode;
	String? previewFileToken;
	String? fileToken;
	int fileSize;
	String? coverImageToken;
	String? applicationCategory;
	String? application;
	RemedicalFileDataTypeEnum fileDataType;
	MeasuredResultsDTO? measuredResult;
	ScanImageDTO? commentResult;

	UploadConsultationDataRequest({
		this.consultationCode,
		this.previewFileToken,
		this.fileToken,
		this.fileSize = 0,
		this.coverImageToken,
		this.applicationCategory,
		this.application,
		this.fileDataType = RemedicalFileDataTypeEnum.VinnoVidSingle,
		this.measuredResult,
		this.commentResult,
		String? token,
	}) : super(
			token: token,
		);

	factory UploadConsultationDataRequest.fromJson(Map<String, dynamic> map) {
		return UploadConsultationDataRequest( 
			consultationCode: map['ConsultationCode'],
			previewFileToken: map['PreviewFileToken'],
			fileToken: map['FileToken'],
			fileSize: map['FileSize'],
			coverImageToken: map['CoverImageToken'],
			applicationCategory: map['ApplicationCategory'],
			application: map['Application'],
			fileDataType: RemedicalFileDataTypeEnum.values.firstWhere((e) => e.index == map['FileDataType']),
			measuredResult: map['MeasuredResult'] != null ? MeasuredResultsDTO.fromJson(map['MeasuredResult']) : null,
			commentResult: map['CommentResult'] != null ? ScanImageDTO.fromJson(map['CommentResult']) : null,
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (consultationCode != null)
			map['ConsultationCode'] = consultationCode;
		if (previewFileToken != null)
			map['PreviewFileToken'] = previewFileToken;
		if (fileToken != null)
			map['FileToken'] = fileToken;
		map['FileSize'] = fileSize;
		if (coverImageToken != null)
			map['CoverImageToken'] = coverImageToken;
		if (applicationCategory != null)
			map['ApplicationCategory'] = applicationCategory;
		if (application != null)
			map['Application'] = application;
		map['FileDataType'] = fileDataType.index;
		if (measuredResult != null)
			map['MeasuredResult'] = measuredResult;
		if (commentResult != null)
			map['CommentResult'] = commentResult;
		return map;
	}
}

class DeviceControlParameterDataDTO {
	String? deviceCode;
	String? probeApplication;
	String? parameter;

	DeviceControlParameterDataDTO({
		this.deviceCode,
		this.probeApplication,
		this.parameter,
	});

	factory DeviceControlParameterDataDTO.fromJson(Map<String, dynamic> map) {
		return DeviceControlParameterDataDTO( 
			deviceCode: map['DeviceCode'],
			probeApplication: map['ProbeApplication'],
			parameter: map['Parameter'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (deviceCode != null) {
			map['DeviceCode'] = deviceCode;
		}
		if (probeApplication != null) {
			map['ProbeApplication'] = probeApplication;
		}
		if (parameter != null) {
			map['Parameter'] = parameter;
		}
		return map;
	}
}

class ControlDeviceConnectRequest extends BaseControlDeviceRequest{
	String? deviceCode;
	String? roomCode;

	ControlDeviceConnectRequest({
		this.deviceCode,
		this.roomCode,
		ControlDeviceParameterEnum controlType = ControlDeviceParameterEnum.Start,
		bool isNeedSyn = false,
		String? token,
	}) : super(
			controlType: controlType,
			isNeedSyn: isNeedSyn,
			token: token,
		);

	factory ControlDeviceConnectRequest.fromJson(Map<String, dynamic> map) {
		return ControlDeviceConnectRequest( 
			deviceCode: map['DeviceCode'],
			roomCode: map['RoomCode'],
			controlType: ControlDeviceParameterEnum.values.firstWhere((e) => e.index == map['ControlType']),
			isNeedSyn: map['IsNeedSyn'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		if (roomCode != null)
			map['RoomCode'] = roomCode;
		return map;
	}
}

class ControlDeviceParameterRequest extends BaseControlDeviceParameterRequest{
	String? deviceCode;
	String? consultationCode;

	ControlDeviceParameterRequest({
		this.deviceCode,
		this.consultationCode,
		List<AdditionParameterDTO>? parameters,
		ControlDeviceParameterEnum controlType = ControlDeviceParameterEnum.Start,
		bool isNeedSyn = false,
		String? token,
	}) : super(
			parameters: parameters,
			controlType: controlType,
			isNeedSyn: isNeedSyn,
			token: token,
		);

	factory ControlDeviceParameterRequest.fromJson(Map<String, dynamic> map) {
		return ControlDeviceParameterRequest( 
			deviceCode: map['DeviceCode'],
			consultationCode: map['ConsultationCode'],
			parameters: map['Parameters'] != null ? (map['Parameters'] as List).map((e)=>AdditionParameterDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			controlType: ControlDeviceParameterEnum.values.firstWhere((e) => e.index == map['ControlType']),
			isNeedSyn: map['IsNeedSyn'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		if (consultationCode != null)
			map['ConsultationCode'] = consultationCode;
		return map;
	}
}

enum LogTimeEnum {
	All,
	Today,
	OneWeek,
	OneMonth,
	OneYear,
}

class GetRemoteLogRequest extends TokenRequest{
	String? deviceCode;
	LogTimeEnum logTime;

	GetRemoteLogRequest({
		this.deviceCode,
		this.logTime = LogTimeEnum.All,
		String? token,
	}) : super(
			token: token,
		);

	factory GetRemoteLogRequest.fromJson(Map<String, dynamic> map) {
		return GetRemoteLogRequest( 
			deviceCode: map['DeviceCode'],
			logTime: LogTimeEnum.values.firstWhere((e) => e.index == map['LogTime']),
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		map['LogTime'] = logTime.index;
		return map;
	}
}

class RemoteLogResponseRequest extends TokenRequest{
	String? userCode;
	String? logFileToken;
	int rate;
	RemoteDeviceStateEnum remoteDeviceState;

	RemoteLogResponseRequest({
		this.userCode,
		this.logFileToken,
		this.rate = 0,
		this.remoteDeviceState = RemoteDeviceStateEnum.Unknown,
		String? token,
	}) : super(
			token: token,
		);

	factory RemoteLogResponseRequest.fromJson(Map<String, dynamic> map) {
		return RemoteLogResponseRequest( 
			userCode: map['UserCode'],
			logFileToken: map['LogFileToken'],
			rate: map['Rate'],
			remoteDeviceState: RemoteDeviceStateEnum.values.firstWhere((e) => e.index == map['RemoteDeviceState']),
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (userCode != null)
			map['UserCode'] = userCode;
		if (logFileToken != null)
			map['LogFileToken'] = logFileToken;
		map['Rate'] = rate;
		map['RemoteDeviceState'] = remoteDeviceState.index;
		return map;
	}
}

class ScanBindDeviceRequest extends TokenRequest{
	String? shortCode;
	String? headPicUrl;
	String? description;

	ScanBindDeviceRequest({
		this.shortCode,
		this.headPicUrl,
		this.description,
		String? token,
	}) : super(
			token: token,
		);

	factory ScanBindDeviceRequest.fromJson(Map<String, dynamic> map) {
		return ScanBindDeviceRequest( 
			shortCode: map['ShortCode'],
			headPicUrl: map['HeadPicUrl'],
			description: map['Description'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (shortCode != null)
			map['ShortCode'] = shortCode;
		if (headPicUrl != null)
			map['HeadPicUrl'] = headPicUrl;
		if (description != null)
			map['Description'] = description;
		return map;
	}
}

class ReportBrandModelOutputConfigRequest extends TokenRequest{
	String? brand;
	String? model;
	String? shortCode;
	int videoWidth;
	int videoHeight;

	ReportBrandModelOutputConfigRequest({
		this.brand,
		this.model,
		this.shortCode,
		this.videoWidth = 0,
		this.videoHeight = 0,
		String? token,
	}) : super(
			token: token,
		);

	factory ReportBrandModelOutputConfigRequest.fromJson(Map<String, dynamic> map) {
		return ReportBrandModelOutputConfigRequest( 
			brand: map['Brand'],
			model: map['Model'],
			shortCode: map['ShortCode'],
			videoWidth: map['VideoWidth'],
			videoHeight: map['VideoHeight'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (brand != null)
			map['Brand'] = brand;
		if (model != null)
			map['Model'] = model;
		if (shortCode != null)
			map['ShortCode'] = shortCode;
		map['VideoWidth'] = videoWidth;
		map['VideoHeight'] = videoHeight;
		return map;
	}
}

class BrandModelOutputConfigDTO {
	bool isSelect;
	int videoWidth;
	int videoHeight;

	BrandModelOutputConfigDTO({
		this.isSelect = false,
		this.videoWidth = 0,
		this.videoHeight = 0,
	});

	factory BrandModelOutputConfigDTO.fromJson(Map<String, dynamic> map) {
		return BrandModelOutputConfigDTO( 
			isSelect: map['IsSelect'],
			videoWidth: map['VideoWidth'],
			videoHeight: map['VideoHeight'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		map['IsSelect'] = isSelect;
		map['VideoWidth'] = videoWidth;
		map['VideoHeight'] = videoHeight;
		return map;
	}
}

class SyncBrandModelOutputConfigRequest extends TokenRequest{
	String? brand;
	String? model;
	String? shortCode;

	SyncBrandModelOutputConfigRequest({
		this.brand,
		this.model,
		this.shortCode,
		String? token,
	}) : super(
			token: token,
		);

	factory SyncBrandModelOutputConfigRequest.fromJson(Map<String, dynamic> map) {
		return SyncBrandModelOutputConfigRequest( 
			brand: map['Brand'],
			model: map['Model'],
			shortCode: map['ShortCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (brand != null)
			map['Brand'] = brand;
		if (model != null)
			map['Model'] = model;
		if (shortCode != null)
			map['ShortCode'] = shortCode;
		return map;
	}
}

class GetBrandsRequest extends TokenRequest{

	GetBrandsRequest({
		String? token,
	}) : super(
			token: token,
		);

	factory GetBrandsRequest.fromJson(Map<String, dynamic> map) {
		return GetBrandsRequest( 
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		return map;
	}
}

class GetModelsRequest extends TokenRequest{
	String? brand;

	GetModelsRequest({
		this.brand,
		String? token,
	}) : super(
			token: token,
		);

	factory GetModelsRequest.fromJson(Map<String, dynamic> map) {
		return GetModelsRequest( 
			brand: map['Brand'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (brand != null)
			map['Brand'] = brand;
		return map;
	}
}

class AddDevicePatchRequest extends TokenRequest{
	String? name;
	String? description;
	String? deviceType;
	String? softwareVersion;
	String? osVersion;
	List<UploadDeviceFileInfoDTO>? fileUploadInfoList;
	int fileSize;
	String? fileName;

	AddDevicePatchRequest({
		this.name,
		this.description,
		this.deviceType,
		this.softwareVersion,
		this.osVersion,
		this.fileUploadInfoList,
		this.fileSize = 0,
		this.fileName,
		String? token,
	}) : super(
			token: token,
		);

	factory AddDevicePatchRequest.fromJson(Map<String, dynamic> map) {
		return AddDevicePatchRequest( 
			name: map['Name'],
			description: map['Description'],
			deviceType: map['DeviceType'],
			softwareVersion: map['SoftwareVersion'],
			osVersion: map['OsVersion'],
			fileUploadInfoList: map['FileUploadInfoList'] != null ? (map['FileUploadInfoList'] as List).map((e)=>UploadDeviceFileInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			fileSize: map['FileSize'],
			fileName: map['FileName'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (name != null)
			map['Name'] = name;
		if (description != null)
			map['Description'] = description;
		if (deviceType != null)
			map['DeviceType'] = deviceType;
		if (softwareVersion != null)
			map['SoftwareVersion'] = softwareVersion;
		if (osVersion != null)
			map['OsVersion'] = osVersion;
		if (fileUploadInfoList != null)
			map['FileUploadInfoList'] = fileUploadInfoList;
		map['FileSize'] = fileSize;
		if (fileName != null)
			map['FileName'] = fileName;
		return map;
	}
}

class FindDevicePatchPageRequest extends PageRequest{
	String? keyword;

	FindDevicePatchPageRequest({
		this.keyword,
		int pageIndex = 0,
		int pageSize = 0,
		String? token,
	}) : super(
			pageIndex: pageIndex,
			pageSize: pageSize,
			token: token,
		);

	factory FindDevicePatchPageRequest.fromJson(Map<String, dynamic> map) {
		return FindDevicePatchPageRequest( 
			keyword: map['Keyword'],
			pageIndex: map['PageIndex'],
			pageSize: map['PageSize'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (keyword != null)
			map['Keyword'] = keyword;
		return map;
	}
}

class DeleteDevicePatchByCodeRequest extends TokenRequest{
	String? code;

	DeleteDevicePatchByCodeRequest({
		this.code,
		String? token,
	}) : super(
			token: token,
		);

	factory DeleteDevicePatchByCodeRequest.fromJson(Map<String, dynamic> map) {
		return DeleteDevicePatchByCodeRequest( 
			code: map['Code'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (code != null)
			map['Code'] = code;
		return map;
	}
}

class UpdateDevicePatchRequest extends TokenRequest{
	String? code;
	String? name;
	String? description;
	String? softwareVersion;
	String? osVersion;

	UpdateDevicePatchRequest({
		this.code,
		this.name,
		this.description,
		this.softwareVersion,
		this.osVersion,
		String? token,
	}) : super(
			token: token,
		);

	factory UpdateDevicePatchRequest.fromJson(Map<String, dynamic> map) {
		return UpdateDevicePatchRequest( 
			code: map['Code'],
			name: map['Name'],
			description: map['Description'],
			softwareVersion: map['SoftwareVersion'],
			osVersion: map['OsVersion'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (code != null)
			map['Code'] = code;
		if (name != null)
			map['Name'] = name;
		if (description != null)
			map['Description'] = description;
		if (softwareVersion != null)
			map['SoftwareVersion'] = softwareVersion;
		if (osVersion != null)
			map['OsVersion'] = osVersion;
		return map;
	}
}

class PushDevicePatchRequest extends TokenRequest{
	String? deviceCode;
	String? patchCode;
	PushDevicePatchEnum pushEnum;

	PushDevicePatchRequest({
		this.deviceCode,
		this.patchCode,
		this.pushEnum = PushDevicePatchEnum.Start,
		String? token,
	}) : super(
			token: token,
		);

	factory PushDevicePatchRequest.fromJson(Map<String, dynamic> map) {
		return PushDevicePatchRequest( 
			deviceCode: map['DeviceCode'],
			patchCode: map['PatchCode'],
			pushEnum: PushDevicePatchEnum.values.firstWhere((e) => e.index == map['PushEnum']),
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		if (patchCode != null)
			map['PatchCode'] = patchCode;
		map['PushEnum'] = pushEnum.index;
		return map;
	}
}

class FindPushDevicePatchPageRequest extends PageRequest{
	String? keyword;
	String? deviceCode;
	List<String>? findOnlyDeviceTypes;

	FindPushDevicePatchPageRequest({
		this.keyword,
		this.deviceCode,
		this.findOnlyDeviceTypes,
		int pageIndex = 0,
		int pageSize = 0,
		String? token,
	}) : super(
			pageIndex: pageIndex,
			pageSize: pageSize,
			token: token,
		);

	factory FindPushDevicePatchPageRequest.fromJson(Map<String, dynamic> map) {
		return FindPushDevicePatchPageRequest( 
			keyword: map['Keyword'],
			deviceCode: map['DeviceCode'],
			findOnlyDeviceTypes: map['FindOnlyDeviceTypes']?.cast<String>().toList(),
			pageIndex: map['PageIndex'],
			pageSize: map['PageSize'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (keyword != null)
			map['Keyword'] = keyword;
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		if (findOnlyDeviceTypes != null)
			map['FindOnlyDeviceTypes'] = findOnlyDeviceTypes;
		return map;
	}
}

class UploadDeviceDownloadPatchProgressToUserRequest extends TokenRequest{
	int progress;
	String? userCode;
	String? patchCode;
	RemoteDeviceStateEnum remoteDeviceState;

	UploadDeviceDownloadPatchProgressToUserRequest({
		this.progress = 0,
		this.userCode,
		this.patchCode,
		this.remoteDeviceState = RemoteDeviceStateEnum.Unknown,
		String? token,
	}) : super(
			token: token,
		);

	factory UploadDeviceDownloadPatchProgressToUserRequest.fromJson(Map<String, dynamic> map) {
		return UploadDeviceDownloadPatchProgressToUserRequest( 
			progress: map['Progress'],
			userCode: map['UserCode'],
			patchCode: map['PatchCode'],
			remoteDeviceState: RemoteDeviceStateEnum.values.firstWhere((e) => e.index == map['RemoteDeviceState']),
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		map['Progress'] = progress;
		if (userCode != null)
			map['UserCode'] = userCode;
		if (patchCode != null)
			map['PatchCode'] = patchCode;
		map['RemoteDeviceState'] = remoteDeviceState.index;
		return map;
	}
}

enum DeviceVersionEnum {
	All,
	SoftwareVersion,
	OsVersion,
}

class AddDevicePatchVersionRequest extends TokenRequest{
	String? version;
	DeviceVersionEnum versionTypeEnum;
	String? deviceType;

	AddDevicePatchVersionRequest({
		this.version,
		this.versionTypeEnum = DeviceVersionEnum.All,
		this.deviceType,
		String? token,
	}) : super(
			token: token,
		);

	factory AddDevicePatchVersionRequest.fromJson(Map<String, dynamic> map) {
		return AddDevicePatchVersionRequest( 
			version: map['Version'],
			versionTypeEnum: DeviceVersionEnum.values.firstWhere((e) => e.index == map['VersionTypeEnum']),
			deviceType: map['DeviceType'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (version != null)
			map['Version'] = version;
		map['VersionTypeEnum'] = versionTypeEnum.index;
		if (deviceType != null)
			map['DeviceType'] = deviceType;
		return map;
	}
}

class DevicePatchVersionDTO extends BaseDTO{
	String? version;
	DeviceVersionEnum versionTypeEnum;
	String? deviceType;
	String? code;

	DevicePatchVersionDTO({
		this.version,
		this.versionTypeEnum = DeviceVersionEnum.All,
		this.deviceType,
		this.code,
		DateTime? createTime,
		DateTime? updateTime,
	}) : super(
			createTime: createTime,
			updateTime: updateTime,
		);

	factory DevicePatchVersionDTO.fromJson(Map<String, dynamic> map) {
		return DevicePatchVersionDTO( 
			version: map['Version'],
			versionTypeEnum: DeviceVersionEnum.values.firstWhere((e) => e.index == map['VersionTypeEnum']),
			deviceType: map['DeviceType'],
			code: map['Code'],
			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (version != null)
			map['Version'] = version;
		map['VersionTypeEnum'] = versionTypeEnum.index;
		if (deviceType != null)
			map['DeviceType'] = deviceType;
		if (code != null)
			map['Code'] = code;
		return map;
	}
}

class FindDevicePatchListRequest extends TokenRequest{
	String? deviceType;
	DeviceVersionEnum versionTypeEnum;

	FindDevicePatchListRequest({
		this.deviceType,
		this.versionTypeEnum = DeviceVersionEnum.All,
		String? token,
	}) : super(
			token: token,
		);

	factory FindDevicePatchListRequest.fromJson(Map<String, dynamic> map) {
		return FindDevicePatchListRequest( 
			deviceType: map['DeviceType'],
			versionTypeEnum: DeviceVersionEnum.values.firstWhere((e) => e.index == map['VersionTypeEnum']),
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceType != null)
			map['DeviceType'] = deviceType;
		map['VersionTypeEnum'] = versionTypeEnum.index;
		return map;
	}
}

class DeleteDevicePatchVersionRequest extends TokenRequest{
	String? code;

	DeleteDevicePatchVersionRequest({
		this.code,
		String? token,
	}) : super(
			token: token,
		);

	factory DeleteDevicePatchVersionRequest.fromJson(Map<String, dynamic> map) {
		return DeleteDevicePatchVersionRequest( 
			code: map['Code'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (code != null)
			map['Code'] = code;
		return map;
	}
}

class AddDevicePrinterVersionRequest extends TokenRequest{
	String? version;
	DeviceVersionEnum versionTypeEnum;

	AddDevicePrinterVersionRequest({
		this.version,
		this.versionTypeEnum = DeviceVersionEnum.All,
		String? token,
	}) : super(
			token: token,
		);

	factory AddDevicePrinterVersionRequest.fromJson(Map<String, dynamic> map) {
		return AddDevicePrinterVersionRequest( 
			version: map['Version'],
			versionTypeEnum: DeviceVersionEnum.values.firstWhere((e) => e.index == map['VersionTypeEnum']),
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (version != null)
			map['Version'] = version;
		map['VersionTypeEnum'] = versionTypeEnum.index;
		return map;
	}
}

class DevicePrinterVersionDTO extends BaseDTO{
	String? version;
	DeviceVersionEnum versionTypeEnum;
	String? code;

	DevicePrinterVersionDTO({
		this.version,
		this.versionTypeEnum = DeviceVersionEnum.All,
		this.code,
		DateTime? createTime,
		DateTime? updateTime,
	}) : super(
			createTime: createTime,
			updateTime: updateTime,
		);

	factory DevicePrinterVersionDTO.fromJson(Map<String, dynamic> map) {
		return DevicePrinterVersionDTO( 
			version: map['Version'],
			versionTypeEnum: DeviceVersionEnum.values.firstWhere((e) => e.index == map['VersionTypeEnum']),
			code: map['Code'],
			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (version != null)
			map['Version'] = version;
		map['VersionTypeEnum'] = versionTypeEnum.index;
		if (code != null)
			map['Code'] = code;
		return map;
	}
}

class FindDevicePrinterVersionListRequest extends TokenRequest{
	DeviceVersionEnum versionTypeEnum;

	FindDevicePrinterVersionListRequest({
		this.versionTypeEnum = DeviceVersionEnum.All,
		String? token,
	}) : super(
			token: token,
		);

	factory FindDevicePrinterVersionListRequest.fromJson(Map<String, dynamic> map) {
		return FindDevicePrinterVersionListRequest( 
			versionTypeEnum: DeviceVersionEnum.values.firstWhere((e) => e.index == map['VersionTypeEnum']),
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		map['VersionTypeEnum'] = versionTypeEnum.index;
		return map;
	}
}

class DeleteDevicePrinterVersionRequest extends TokenRequest{
	String? code;

	DeleteDevicePrinterVersionRequest({
		this.code,
		String? token,
	}) : super(
			token: token,
		);

	factory DeleteDevicePrinterVersionRequest.fromJson(Map<String, dynamic> map) {
		return DeleteDevicePrinterVersionRequest( 
			code: map['Code'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (code != null)
			map['Code'] = code;
		return map;
	}
}

class AddDevicePrinterRequest extends TokenRequest{
	String? name;
	String? description;
	String? osVersion;
	List<UploadDeviceFileInfoDTO>? fileUploadInfoList;
	int fileSize;
	String? printerBrands;
	List<String>? printerModels;
	String? fileName;

	AddDevicePrinterRequest({
		this.name,
		this.description,
		this.osVersion,
		this.fileUploadInfoList,
		this.fileSize = 0,
		this.printerBrands,
		this.printerModels,
		this.fileName,
		String? token,
	}) : super(
			token: token,
		);

	factory AddDevicePrinterRequest.fromJson(Map<String, dynamic> map) {
		return AddDevicePrinterRequest( 
			name: map['Name'],
			description: map['Description'],
			osVersion: map['OsVersion'],
			fileUploadInfoList: map['FileUploadInfoList'] != null ? (map['FileUploadInfoList'] as List).map((e)=>UploadDeviceFileInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			fileSize: map['FileSize'],
			printerBrands: map['PrinterBrands'],
			printerModels: map['PrinterModels']?.cast<String>().toList(),
			fileName: map['FileName'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (name != null)
			map['Name'] = name;
		if (description != null)
			map['Description'] = description;
		if (osVersion != null)
			map['OsVersion'] = osVersion;
		if (fileUploadInfoList != null)
			map['FileUploadInfoList'] = fileUploadInfoList;
		map['FileSize'] = fileSize;
		if (printerBrands != null)
			map['PrinterBrands'] = printerBrands;
		if (printerModels != null)
			map['PrinterModels'] = printerModels;
		if (fileName != null)
			map['FileName'] = fileName;
		return map;
	}
}

class FindDevicePrinterPageRequest extends PageRequest{
	String? keyword;

	FindDevicePrinterPageRequest({
		this.keyword,
		int pageIndex = 0,
		int pageSize = 0,
		String? token,
	}) : super(
			pageIndex: pageIndex,
			pageSize: pageSize,
			token: token,
		);

	factory FindDevicePrinterPageRequest.fromJson(Map<String, dynamic> map) {
		return FindDevicePrinterPageRequest( 
			keyword: map['Keyword'],
			pageIndex: map['PageIndex'],
			pageSize: map['PageSize'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (keyword != null)
			map['Keyword'] = keyword;
		return map;
	}
}

class DeleteDevicePrinterByCodeRequest extends TokenRequest{
	String? code;

	DeleteDevicePrinterByCodeRequest({
		this.code,
		String? token,
	}) : super(
			token: token,
		);

	factory DeleteDevicePrinterByCodeRequest.fromJson(Map<String, dynamic> map) {
		return DeleteDevicePrinterByCodeRequest( 
			code: map['Code'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (code != null)
			map['Code'] = code;
		return map;
	}
}

class UpdateDevicePrinterRequest extends TokenRequest{
	String? name;
	String? description;
	String? osVersion;
	String? code;

	UpdateDevicePrinterRequest({
		this.name,
		this.description,
		this.osVersion,
		this.code,
		String? token,
	}) : super(
			token: token,
		);

	factory UpdateDevicePrinterRequest.fromJson(Map<String, dynamic> map) {
		return UpdateDevicePrinterRequest( 
			name: map['Name'],
			description: map['Description'],
			osVersion: map['OsVersion'],
			code: map['Code'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (name != null)
			map['Name'] = name;
		if (description != null)
			map['Description'] = description;
		if (osVersion != null)
			map['OsVersion'] = osVersion;
		if (code != null)
			map['Code'] = code;
		return map;
	}
}

class SetDevicePrinterRequest extends TokenRequest{
	String? deviceCode;
	DevicePrinterEnum setPrinterEnum;
	List<DevicePrinterParameter>? parameters;

	SetDevicePrinterRequest({
		this.deviceCode,
		this.setPrinterEnum = DevicePrinterEnum.GetInstalledPrinters,
		this.parameters,
		String? token,
	}) : super(
			token: token,
		);

	factory SetDevicePrinterRequest.fromJson(Map<String, dynamic> map) {
		return SetDevicePrinterRequest( 
			deviceCode: map['DeviceCode'],
			setPrinterEnum: DevicePrinterEnum.values.firstWhere((e) => e.index == map['SetPrinterEnum']),
			parameters: map['Parameters'] != null ? (map['Parameters'] as List).map((e)=>DevicePrinterParameter.fromJson(e as Map<String,dynamic>)).toList() : null,
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		map['SetPrinterEnum'] = setPrinterEnum.index;
		if (parameters != null)
			map['Parameters'] = parameters;
		return map;
	}
}

class UploadDevicePrinterRequest extends TokenRequest{
	String? userCode;
	DevicePrinterEnum setPrinterEnum;
	List<DevicePrinterParameterDTO>? devicePrinterList;
	RemoteDeviceStateEnum remoteDeviceState;

	UploadDevicePrinterRequest({
		this.userCode,
		this.setPrinterEnum = DevicePrinterEnum.GetInstalledPrinters,
		this.devicePrinterList,
		this.remoteDeviceState = RemoteDeviceStateEnum.Unknown,
		String? token,
	}) : super(
			token: token,
		);

	factory UploadDevicePrinterRequest.fromJson(Map<String, dynamic> map) {
		return UploadDevicePrinterRequest( 
			userCode: map['UserCode'],
			setPrinterEnum: DevicePrinterEnum.values.firstWhere((e) => e.index == map['SetPrinterEnum']),
			devicePrinterList: map['DevicePrinterList'] != null ? (map['DevicePrinterList'] as List).map((e)=>DevicePrinterParameterDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
			remoteDeviceState: RemoteDeviceStateEnum.values.firstWhere((e) => e.index == map['RemoteDeviceState']),
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (userCode != null)
			map['UserCode'] = userCode;
		map['SetPrinterEnum'] = setPrinterEnum.index;
		if (devicePrinterList != null)
			map['DevicePrinterList'] = devicePrinterList;
		map['RemoteDeviceState'] = remoteDeviceState.index;
		return map;
	}
}

class RestartDeviceRequest extends TokenRequest{
	String? deviceCode;
	bool isNeedSyn;

	RestartDeviceRequest({
		this.deviceCode,
		this.isNeedSyn = false,
		String? token,
	}) : super(
			token: token,
		);

	factory RestartDeviceRequest.fromJson(Map<String, dynamic> map) {
		return RestartDeviceRequest( 
			deviceCode: map['DeviceCode'],
			isNeedSyn: map['IsNeedSyn'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		map['IsNeedSyn'] = isNeedSyn;
		return map;
	}
}

class ModifyEmergencyDeviceCodeRequest extends TokenRequest{
	String? emergencyDeviceCode;

	ModifyEmergencyDeviceCodeRequest({
		this.emergencyDeviceCode,
		String? token,
	}) : super(
			token: token,
		);

	factory ModifyEmergencyDeviceCodeRequest.fromJson(Map<String, dynamic> map) {
		return ModifyEmergencyDeviceCodeRequest( 
			emergencyDeviceCode: map['EmergencyDeviceCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (emergencyDeviceCode != null)
			map['EmergencyDeviceCode'] = emergencyDeviceCode;
		return map;
	}
}

class SendCommandToDeviceRequest extends TokenRequest{
	String? deviceCode;
	String? actionType;
	String? settings;

	SendCommandToDeviceRequest({
		this.deviceCode,
		this.actionType,
		this.settings,
		String? token,
	}) : super(
			token: token,
		);

	factory SendCommandToDeviceRequest.fromJson(Map<String, dynamic> map) {
		return SendCommandToDeviceRequest( 
			deviceCode: map['DeviceCode'],
			actionType: map['ActionType'],
			settings: map['Settings'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		if (actionType != null)
			map['ActionType'] = actionType;
		if (settings != null)
			map['Settings'] = settings;
		return map;
	}
}

class SendResultToClientRequest extends TokenRequest{
	String? userCode;
	String? settings;

	SendResultToClientRequest({
		this.userCode,
		this.settings,
		String? token,
	}) : super(
			token: token,
		);

	factory SendResultToClientRequest.fromJson(Map<String, dynamic> map) {
		return SendResultToClientRequest( 
			userCode: map['UserCode'],
			settings: map['Settings'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (userCode != null)
			map['UserCode'] = userCode;
		if (settings != null)
			map['Settings'] = settings;
		return map;
	}
}

class GetResultFromServerRequest extends TokenRequest{
	String? resultCode;

	GetResultFromServerRequest({
		this.resultCode,
		String? token,
	}) : super(
			token: token,
		);

	factory GetResultFromServerRequest.fromJson(Map<String, dynamic> map) {
		return GetResultFromServerRequest( 
			resultCode: map['ResultCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (resultCode != null)
			map['ResultCode'] = resultCode;
		return map;
	}
}

class RemoteConnectStautsRequest extends TokenRequest{
	String? userCode;
	String? deviceCode;
	LoginSource loginSource;
	bool isNeedSyn;

	RemoteConnectStautsRequest({
		this.userCode,
		this.deviceCode,
		this.loginSource = LoginSource.PC,
		this.isNeedSyn = false,
		String? token,
	}) : super(
			token: token,
		);

	factory RemoteConnectStautsRequest.fromJson(Map<String, dynamic> map) {
		return RemoteConnectStautsRequest( 
			userCode: map['UserCode'],
			deviceCode: map['DeviceCode'],
			loginSource: LoginSource.values.firstWhere((e) => e.index == map['LoginSource']),
			isNeedSyn: map['IsNeedSyn'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (userCode != null)
			map['UserCode'] = userCode;
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		map['LoginSource'] = loginSource.index;
		map['IsNeedSyn'] = isNeedSyn;
		return map;
	}
}

class RemoteConnectHeartRateRequest extends TokenRequest{
	TransactionTypeEnum transactionType;
	bool isNeedSyn;

	RemoteConnectHeartRateRequest({
		this.transactionType = TransactionTypeEnum.Consultion,
		this.isNeedSyn = false,
		String? token,
	}) : super(
			token: token,
		);

	factory RemoteConnectHeartRateRequest.fromJson(Map<String, dynamic> map) {
		return RemoteConnectHeartRateRequest( 
			transactionType: TransactionTypeEnum.values.firstWhere((e) => e.index == map['TransactionType']),
			isNeedSyn: map['IsNeedSyn'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		map['TransactionType'] = transactionType.index;
		map['IsNeedSyn'] = isNeedSyn;
		return map;
	}
}

class AddUserRemoteConnectRequest extends GetDeviceRequest{
	String? roomId;
	ConnectStatusEnum statusEnum;

	AddUserRemoteConnectRequest({
		this.roomId,
		this.statusEnum = ConnectStatusEnum.UnConnect,
		String? deviceCode,
		bool isNeedSyn = false,
		List<ConnectStatusEnum>? connectStatus,
		String? token,
	}) : super(
			deviceCode: deviceCode,
			isNeedSyn: isNeedSyn,
			connectStatus: connectStatus,
			token: token,
		);

	factory AddUserRemoteConnectRequest.fromJson(Map<String, dynamic> map) {
		return AddUserRemoteConnectRequest( 
			roomId: map['RoomId'],
			statusEnum: ConnectStatusEnum.values.firstWhere((e) => e.index == map['StatusEnum']),
			deviceCode: map['DeviceCode'],
			isNeedSyn: map['IsNeedSyn'],
			connectStatus: map['ConnectStatus'] != null ? (map['ConnectStatus'] as List).map((e)=>ConnectStatusEnum.values.firstWhere((i) => i.index == e)).toList() : null,
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (roomId != null)
			map['RoomId'] = roomId;
		map['StatusEnum'] = statusEnum.index;
		return map;
	}
}

class DeviceConnectStateResult {
	String? deviceCode;
	ConnectStatusEnum connectStatus;

	DeviceConnectStateResult({
		this.deviceCode,
		this.connectStatus = ConnectStatusEnum.UnConnect,
	});

	factory DeviceConnectStateResult.fromJson(Map<String, dynamic> map) {
		return DeviceConnectStateResult( 
			deviceCode: map['DeviceCode'],
			connectStatus: ConnectStatusEnum.values.firstWhere((e) => e.index == map['ConnectStatus']),
		);
	}

	Map<String, dynamic> toJson() {
		final map = Map<String, dynamic>();
		if (deviceCode != null) {
			map['DeviceCode'] = deviceCode;
		}
		map['ConnectStatus'] = connectStatus.index;
		return map;
	}
}

class GetDeviceStateListRequest extends TokenRequest{
	List<String>? deviceCodes;

	GetDeviceStateListRequest({
		this.deviceCodes,
		String? token,
	}) : super(
			token: token,
		);

	factory GetDeviceStateListRequest.fromJson(Map<String, dynamic> map) {
		return GetDeviceStateListRequest( 
			deviceCodes: map['DeviceCodes']?.cast<String>().toList(),
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCodes != null)
			map['DeviceCodes'] = deviceCodes;
		return map;
	}
}

class DeivceCancelLogDownloadRequest extends TokenRequest{
	String? userCode;

	DeivceCancelLogDownloadRequest({
		this.userCode,
		String? token,
	}) : super(
			token: token,
		);

	factory DeivceCancelLogDownloadRequest.fromJson(Map<String, dynamic> map) {
		return DeivceCancelLogDownloadRequest( 
			userCode: map['UserCode'],
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (userCode != null)
			map['UserCode'] = userCode;
		return map;
	}
}

class ProbeApplicationSettingRequest extends TokenRequest{
	String? deviceCode;
	ProbeApplicationSettingInfoDTO? probeApplicationSetting;
	ControlDeviceParameterEnum controlType;

	ProbeApplicationSettingRequest({
		this.deviceCode,
		this.probeApplicationSetting,
		this.controlType = ControlDeviceParameterEnum.Start,
		String? token,
	}) : super(
			token: token,
		);

	factory ProbeApplicationSettingRequest.fromJson(Map<String, dynamic> map) {
		return ProbeApplicationSettingRequest( 
			deviceCode: map['DeviceCode'],
			probeApplicationSetting: map['ProbeApplicationSetting'] != null ? ProbeApplicationSettingInfoDTO.fromJson(map['ProbeApplicationSetting']) : null,
			controlType: ControlDeviceParameterEnum.values.firstWhere((e) => e.index == map['ControlType']),
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (deviceCode != null)
			map['DeviceCode'] = deviceCode;
		if (probeApplicationSetting != null)
			map['ProbeApplicationSetting'] = probeApplicationSetting;
		map['ControlType'] = controlType.index;
		return map;
	}
}

class ProbeApplicationSettingResultRequest extends TokenRequest{
	String? userCode;
	ProbeApplicationSettingInfoDTO? probeApplicationSetting;
	ControlDeviceParameterEnum controlType;

	ProbeApplicationSettingResultRequest({
		this.userCode,
		this.probeApplicationSetting,
		this.controlType = ControlDeviceParameterEnum.Start,
		String? token,
	}) : super(
			token: token,
		);

	factory ProbeApplicationSettingResultRequest.fromJson(Map<String, dynamic> map) {
		return ProbeApplicationSettingResultRequest( 
			userCode: map['UserCode'],
			probeApplicationSetting: map['ProbeApplicationSetting'] != null ? ProbeApplicationSettingInfoDTO.fromJson(map['ProbeApplicationSetting']) : null,
			controlType: ControlDeviceParameterEnum.values.firstWhere((e) => e.index == map['ControlType']),
			token: map['Token'],
		);
	}

	Map<String, dynamic> toJson() {
		final map = super.toJson();
		if (userCode != null)
			map['UserCode'] = userCode;
		if (probeApplicationSetting != null)
			map['ProbeApplicationSetting'] = probeApplicationSetting;
		map['ControlType'] = controlType.index;
		return map;
	}
}