gavin.chen hai 1 ano
pai
achega
34608cc3ce

+ 13 - 0
lib/services/appletAPI.dart

@@ -34,6 +34,7 @@ class AppletAPIService extends JsonRpcClientBase {
 		FJsonConvert.setDecoder((map) => StartConsultationResult.fromJson(map));
 		FJsonConvert.setDecoder((map) => CancelStartConsultationResult.fromJson(map));
 		FJsonConvert.setDecoder((map) => ExitConsultationResult.fromJson(map));
+		FJsonConvert.setDecoder((map) => DownloadFileResult.fromJson(map));
 	}
 
 	Future<GetUserInfoByOpenIdResult> getUserInfoByOpenIdAsync(GetUserInfoByOpenIdRequest request) async {
@@ -71,6 +72,12 @@ class AppletAPIService extends JsonRpcClientBase {
 		return result;
 	}
 
+	Future<List<ReportInfo>> getConsultationReportListAsync(GetConsultationReportListRequest request) async {
+		var rpcRst = await call("GetConsultationReportListAsync", request);
+		var result = (rpcRst as List).map((e)=>ReportInfo.fromJson(e as Map<String, dynamic>)).toList();
+		return result;
+	}
+
 	Future<String> createConsultationAsync(CreateConsultationRequest request) async {
 		var rpcRst = await call("CreateConsultationAsync", request);
 		return rpcRst;
@@ -128,5 +135,11 @@ class AppletAPIService extends JsonRpcClientBase {
 		return rpcRst;
 	}
 
+	Future<DownloadFileResult> downloadFileAsync(DownloadFileRequest request) async {
+		var rpcRst = await call("DownloadFileAsync", request);
+		var result = DownloadFileResult.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
 }
 

+ 120 - 7
lib/services/appletAPI.m.dart

@@ -4,27 +4,32 @@ import 'notification.m.dart';
 import 'package:fis_jsonrpc/utils.dart';
 
 class GetUserInfoByOpenIdResult {
-	String? accountName;
+	String? nickName;
 	String? hospital;
+	String? userId;
 
 	GetUserInfoByOpenIdResult({
-		this.accountName,
+		this.nickName,
 		this.hospital,
+		this.userId,
 	});
 
 	factory GetUserInfoByOpenIdResult.fromJson(Map<String, dynamic> map) {
 		return GetUserInfoByOpenIdResult( 
-			accountName: map['AccountName'],
+			nickName: map['NickName'],
 			hospital: map['Hospital'],
+			userId: map['UserId'],
 		);
 	}
 
 	Map<String, dynamic> toJson() {
 		final map = Map<String, dynamic>();
-		if(accountName != null)
-			map['AccountName'] = accountName;
+		if(nickName != null)
+			map['NickName'] = nickName;
 		if(hospital != null)
 			map['Hospital'] = hospital;
+		if(userId != null)
+			map['UserId'] = userId;
 		return map;
 	}
 }
@@ -444,6 +449,32 @@ enum PatientGenderEnum {
 	Female,
 }
 
+class ImageTokenInfo {
+	String? imageToken;
+	String? previewToken;
+
+	ImageTokenInfo({
+		this.imageToken,
+		this.previewToken,
+	});
+
+	factory ImageTokenInfo.fromJson(Map<String, dynamic> map) {
+		return ImageTokenInfo( 
+			imageToken: map['ImageToken'],
+			previewToken: map['PreviewToken'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(imageToken != null)
+			map['ImageToken'] = imageToken;
+		if(previewToken != null)
+			map['PreviewToken'] = previewToken;
+		return map;
+	}
+}
+
 class VideoTokenInfo {
 	String? videoToken;
 	String? previewToken;
@@ -514,6 +545,8 @@ class ConsultationInfo {
 	String? primaryDiagnosis;
 	String? hospitalId;
 	String? hospitalName;
+	String? applyHospitalId;
+	String? applyHospitalName;
 	String? expertId;
 	String? expertName;
 	DateTime? consultationDate;
@@ -521,7 +554,7 @@ class ConsultationInfo {
 	String? scanDoctorName;
 	String? deviceModel;
 	String? terminalId;
-	List<String >? imageTokens;
+	List<ImageTokenInfo >? imageTokens;
 	List<VideoTokenInfo >? videoInfos;
 	List<ReportPreviewPdf >? reportPreviewPdfs;
 
@@ -538,6 +571,8 @@ class ConsultationInfo {
 		this.primaryDiagnosis,
 		this.hospitalId,
 		this.hospitalName,
+		this.applyHospitalId,
+		this.applyHospitalName,
 		this.expertId,
 		this.expertName,
 		this.consultationDate,
@@ -564,6 +599,8 @@ class ConsultationInfo {
 			primaryDiagnosis: map['PrimaryDiagnosis'],
 			hospitalId: map['HospitalId'],
 			hospitalName: map['HospitalName'],
+			applyHospitalId: map['ApplyHospitalId'],
+			applyHospitalName: map['ApplyHospitalName'],
 			expertId: map['ExpertId'],
 			expertName: map['ExpertName'],
 			consultationDate: map['ConsultationDate'] != null ? DateTime.parse(map['ConsultationDate']) : null,
@@ -571,7 +608,7 @@ class ConsultationInfo {
 			scanDoctorName: map['ScanDoctorName'],
 			deviceModel: map['DeviceModel'],
 			terminalId: map['TerminalId'],
-			imageTokens: map['ImageTokens'] != null ? map['ImageTokens'].cast<String>().toList() : null,
+			imageTokens: map['ImageTokens'] != null ? (map['ImageTokens'] as List).map((e)=>ImageTokenInfo.fromJson(e as Map<String,dynamic>)).toList() : null,
 			videoInfos: map['VideoInfos'] != null ? (map['VideoInfos'] as List).map((e)=>VideoTokenInfo.fromJson(e as Map<String,dynamic>)).toList() : null,
 			reportPreviewPdfs: map['ReportPreviewPdfs'] != null ? (map['ReportPreviewPdfs'] as List).map((e)=>ReportPreviewPdf.fromJson(e as Map<String,dynamic>)).toList() : null,
 		);
@@ -601,6 +638,10 @@ class ConsultationInfo {
 			map['HospitalId'] = hospitalId;
 		if(hospitalName != null)
 			map['HospitalName'] = hospitalName;
+		if(applyHospitalId != null)
+			map['ApplyHospitalId'] = applyHospitalId;
+		if(applyHospitalName != null)
+			map['ApplyHospitalName'] = applyHospitalName;
 		if(expertId != null)
 			map['ExpertId'] = expertId;
 		if(expertName != null)
@@ -666,6 +707,31 @@ class GetConsultationListRequest extends AppletAPIPageRequest{
 	}
 }
 
+class GetConsultationReportListRequest extends AppletAPIBaseRequest{
+	String? consultationId;
+
+	GetConsultationReportListRequest({
+		this.consultationId,
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory GetConsultationReportListRequest.fromJson(Map<String, dynamic> map) {
+		return GetConsultationReportListRequest( 
+			consultationId: map['ConsultationId'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(consultationId != null)
+			map['ConsultationId'] = consultationId;
+		return map;
+	}
+}
+
 class CreateConsultationRequest extends AppletAPIBaseRequest{
 	String? patientName;
 	PatientGenderEnum patientSex;
@@ -1297,4 +1363,51 @@ class ConsultationHeartRateRequest extends AppletAPIBaseRequest{
 	}
 }
 
+class DownloadFileResult {
+	List<int>? fileBytes;
+
+	DownloadFileResult({
+		this.fileBytes,
+	});
+
+	factory DownloadFileResult.fromJson(Map<String, dynamic> map) {
+		final fileBytesData = map['FileBytes'];
+		return DownloadFileResult( 
+			fileBytes: fileBytesData != null ? (fileBytesData as List).map((e) => e as int).toList(): null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(fileBytes != null)
+			map['FileBytes'] = fileBytes;
+		return map;
+	}
+}
+
+class DownloadFileRequest extends AppletAPIBaseRequest{
+	String? fileToken;
+
+	DownloadFileRequest({
+		this.fileToken,
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory DownloadFileRequest.fromJson(Map<String, dynamic> map) {
+		return DownloadFileRequest( 
+			fileToken: map['FileToken'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(fileToken != null)
+			map['FileToken'] = fileToken;
+		return map;
+	}
+}
+
 

+ 7 - 0
lib/services/device.dart

@@ -46,6 +46,7 @@ class DeviceService extends JsonRpcClientBase {
 		FJsonConvert.setDecoder((map) => DeviceConnectStateResult.fromJson(map));
 		FJsonConvert.setDecoder((map) => ProbeApplicationSettingInfoDTO.fromJson(map));
 		FJsonConvert.setDecoder((map) => RemoteConnectsRequest.fromJson(map));
+		FJsonConvert.setDecoder((map) => DevicePrinterParameterDTO.fromJson(map));
 	}
 
 	Future<bool> heartRateAsync(TokenRequest request) async {
@@ -497,5 +498,11 @@ class DeviceService extends JsonRpcClientBase {
 		return rpcRst;
 	}
 
+	Future<List<DevicePrinterParameterDTO>> getDevicePrintersForUploadAsync(GetDevicePrintersForUploadRequest request) async {
+		var rpcRst = await call("GetDevicePrintersForUploadAsync", request);
+		var result = (rpcRst as List).map((e)=>DevicePrinterParameterDTO.fromJson(e as Map<String, dynamic>)).toList();
+		return result;
+	}
+
 }
 

+ 33 - 54
lib/services/device.m.dart

@@ -1288,50 +1288,6 @@ class SendControlParameterByDeviceRequest extends TokenRequest{
 	}
 }
 
-class LiveDataDTO {
-	int width;
-	int height;
-	String? rtmpPushUrl;
-	String? rtmpPullUrl;
-	String? httpPullUrl;
-	String? hlsPullUrl;
-
-	LiveDataDTO({
-		this.width = 0,
-		this.height = 0,
-		this.rtmpPushUrl,
-		this.rtmpPullUrl,
-		this.httpPullUrl,
-		this.hlsPullUrl,
-	});
-
-	factory LiveDataDTO.fromJson(Map<String, dynamic> map) {
-		return LiveDataDTO( 
-			width: map['Width'],
-			height: map['Height'],
-			rtmpPushUrl: map['RtmpPushUrl'],
-			rtmpPullUrl: map['RtmpPullUrl'],
-			httpPullUrl: map['HttpPullUrl'],
-			hlsPullUrl: map['HlsPullUrl'],
-		);
-	}
-
-	Map<String, dynamic> toJson() {
-		final map = Map<String, dynamic>();
-		map['Width'] = width;
-		map['Height'] = height;
-		if(rtmpPushUrl != null)
-			map['RtmpPushUrl'] = rtmpPushUrl;
-		if(rtmpPullUrl != null)
-			map['RtmpPullUrl'] = rtmpPullUrl;
-		if(httpPullUrl != null)
-			map['HttpPullUrl'] = httpPullUrl;
-		if(hlsPullUrl != null)
-			map['HlsPullUrl'] = hlsPullUrl;
-		return map;
-	}
-}
-
 class VideoDeviceInfoDTO {
 	String? videoDeviceId;
 	VideoDeviceSourceTypeEnum videoDeviceSourceType;
@@ -1364,7 +1320,7 @@ class VideoDeviceInfoDTO {
 
 class JoinDeviceLiveRoomResult extends TokenRequest{
 	int roomNo;
-	String? liveProtocol;
+	TransactionStatusEnum liveProtocol;
 	String? deviceCode;
 	bool mergedChannel;
 	int mergedVideoOutputWidth;
@@ -1374,7 +1330,7 @@ class JoinDeviceLiveRoomResult extends TokenRequest{
 
 	JoinDeviceLiveRoomResult({
 		this.roomNo = 0,
-		this.liveProtocol,
+		this.liveProtocol = TransactionStatusEnum.Applied,
 		this.deviceCode,
 		this.mergedChannel = false,
 		this.mergedVideoOutputWidth = 0,
@@ -1389,7 +1345,7 @@ class JoinDeviceLiveRoomResult extends TokenRequest{
 	factory JoinDeviceLiveRoomResult.fromJson(Map<String, dynamic> map) {
 		return JoinDeviceLiveRoomResult( 
 			roomNo: map['RoomNo'],
-			liveProtocol: map['LiveProtocol'],
+			liveProtocol: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocol']),
 			deviceCode: map['DeviceCode'],
 			mergedChannel: map['MergedChannel'],
 			mergedVideoOutputWidth: map['MergedVideoOutputWidth'],
@@ -1403,8 +1359,7 @@ class JoinDeviceLiveRoomResult extends TokenRequest{
 	Map<String, dynamic> toJson() {
 		final map = super.toJson();
 		map['RoomNo'] = roomNo;
-		if(liveProtocol != null)
-			map['LiveProtocol'] = liveProtocol;
+		map['LiveProtocol'] = liveProtocol.index;
 		if(deviceCode != null)
 			map['DeviceCode'] = deviceCode;
 		map['MergedChannel'] = mergedChannel;
@@ -1544,7 +1499,7 @@ class CreateLiveShareInfoRequest extends TokenRequest{
 
 class JoinDeviceLiveRoomByShareResult {
 	int roomNo;
-	String? liveProtocol;
+	TransactionStatusEnum liveProtocol;
 	String? deviceCode;
 	bool mergedChannel;
 	int mergedVideoOutputWidth;
@@ -1554,7 +1509,7 @@ class JoinDeviceLiveRoomByShareResult {
 
 	JoinDeviceLiveRoomByShareResult({
 		this.roomNo = 0,
-		this.liveProtocol,
+		this.liveProtocol = TransactionStatusEnum.Applied,
 		this.deviceCode,
 		this.mergedChannel = false,
 		this.mergedVideoOutputWidth = 0,
@@ -1566,7 +1521,7 @@ class JoinDeviceLiveRoomByShareResult {
 	factory JoinDeviceLiveRoomByShareResult.fromJson(Map<String, dynamic> map) {
 		return JoinDeviceLiveRoomByShareResult( 
 			roomNo: map['RoomNo'],
-			liveProtocol: map['LiveProtocol'],
+			liveProtocol: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocol']),
 			deviceCode: map['DeviceCode'],
 			mergedChannel: map['MergedChannel'],
 			mergedVideoOutputWidth: map['MergedVideoOutputWidth'],
@@ -1579,8 +1534,7 @@ class JoinDeviceLiveRoomByShareResult {
 	Map<String, dynamic> toJson() {
 		final map = Map<String, dynamic>();
 		map['RoomNo'] = roomNo;
-		if(liveProtocol != null)
-			map['LiveProtocol'] = liveProtocol;
+		map['LiveProtocol'] = liveProtocol.index;
 		if(deviceCode != null)
 			map['DeviceCode'] = deviceCode;
 		map['MergedChannel'] = mergedChannel;
@@ -3635,4 +3589,29 @@ class RemoteConnectsRequest {
 	}
 }
 
+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;
+	}
+}
+
 

+ 5 - 4
lib/services/education.dart

@@ -6,6 +6,7 @@ import 'package:fis_common/json_convert.dart';
 import 'education.m.dart';
 
 import 'liveConsultation.m.dart';
+import 'notification.m.dart';
 
 
 class EducationService extends JsonRpcClientBase {
@@ -44,7 +45,7 @@ class EducationService extends JsonRpcClientBase {
 		FJsonConvert.setDecoder((map) => LiveCourseBaseResult.fromJson(map));
 		FJsonConvert.setDecoder((map) => LiveCourseMember.fromJson(map));
 		FJsonConvert.setDecoder((map) => RemoteExaminationPageDTO.fromJson(map));
-		FJsonConvert.setDecoder((map) => CourseAlbumDetailDTO.fromJson(map));
+		FJsonConvert.setDecoder((map) => CourseAlbumExtendDTO.fromJson(map));
 		FJsonConvert.setDecoder((map) => BaseCourseAlbumDTO.fromJson(map));
 		FJsonConvert.setDecoder((map) => UserGroupStudentsDTO.fromJson(map));
 		FJsonConvert.setDecoder((map) => PageResult<UserExtendDTO>.fromJson(map));
@@ -218,7 +219,7 @@ class EducationService extends JsonRpcClientBase {
 		return result;
 	}
 
-	Future<LiveCourseBaseResult> leaveLiveCourseAsync(JoinLiveCourseRequest request) async {
+	Future<LiveCourseBaseResult> leaveLiveCourseAsync(LeaveLiveCourseRequest request) async {
 		var rpcRst = await call("LeaveLiveCourseAsync", request);
 		var result = LiveCourseBaseResult.fromJson(rpcRst as Map<String, dynamic>);
 		return result;
@@ -295,9 +296,9 @@ class EducationService extends JsonRpcClientBase {
 		return result;
 	}
 
-	Future<CourseAlbumDetailDTO> findCourseAlbumByCodeAsync(FindCourseAlbumByCodeRequest request) async {
+	Future<CourseAlbumExtendDTO> findCourseAlbumByCodeAsync(FindCourseAlbumByCodeRequest request) async {
 		var rpcRst = await call("FindCourseAlbumByCodeAsync", request);
-		var result = CourseAlbumDetailDTO.fromJson(rpcRst as Map<String, dynamic>);
+		var result = CourseAlbumExtendDTO.fromJson(rpcRst as Map<String, dynamic>);
 		return result;
 	}
 

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 369 - 432
lib/services/education.m.dart


+ 12 - 33
lib/services/liveConsultation.m.dart

@@ -172,13 +172,6 @@ class UserBaseDTO extends BaseDTO{
 	}
 }
 
-enum UserStatusEnum {
-	placeHolder_0,
-	NotOnline,
-	IsBusy,
-	Idle,
-}
-
 class OrganizationExpertDTO extends UserBaseDTO{
 	List<String >? fieldList;
 	UserStatusEnum userStatus;
@@ -502,17 +495,6 @@ class FindAssistantExpertsRequest extends TokenRequest{
 	}
 }
 
-enum TransactionStatusEnum {
-	placeHolder_0,
-	Applied,
-	Withdrawn,
-	Rejected,
-	ToStart,
-	InProgress,
-	PendingReport,
-	End,
-}
-
 enum EvaluateGradeEnum {
 	UnSet,
 	Dissatisfaction,
@@ -2188,7 +2170,7 @@ class InitiateLiveConsultationResult {
 	String? consultationCode;
 	String? initiatorCode;
 	int roomNo;
-	String? liveProtocol;
+	TransactionStatusEnum liveProtocol;
 	int appId;
 	String? userSign;
 	List<LiveConsultationMember >? memberLiveDatas;
@@ -2197,7 +2179,7 @@ class InitiateLiveConsultationResult {
 		this.consultationCode,
 		this.initiatorCode,
 		this.roomNo = 0,
-		this.liveProtocol,
+		this.liveProtocol = TransactionStatusEnum.Applied,
 		this.appId = 0,
 		this.userSign,
 		this.memberLiveDatas,
@@ -2208,7 +2190,7 @@ class InitiateLiveConsultationResult {
 			consultationCode: map['ConsultationCode'],
 			initiatorCode: map['InitiatorCode'],
 			roomNo: map['RoomNo'],
-			liveProtocol: map['LiveProtocol'],
+			liveProtocol: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocol']),
 			appId: map['AppId'],
 			userSign: map['UserSign'],
 			memberLiveDatas: map['MemberLiveDatas'] != null ? (map['MemberLiveDatas'] as List).map((e)=>LiveConsultationMember.fromJson(e as Map<String,dynamic>)).toList() : null,
@@ -2222,8 +2204,7 @@ class InitiateLiveConsultationResult {
 		if(initiatorCode != null)
 			map['InitiatorCode'] = initiatorCode;
 		map['RoomNo'] = roomNo;
-		if(liveProtocol != null)
-			map['LiveProtocol'] = liveProtocol;
+		map['LiveProtocol'] = liveProtocol.index;
 		map['AppId'] = appId;
 		if(userSign != null)
 			map['UserSign'] = userSign;
@@ -2449,7 +2430,7 @@ class JoinLiveConsultationResult {
 	String? consultationCode;
 	String? userCode;
 	int roomNo;
-	String? liveProtocol;
+	TransactionStatusEnum liveProtocol;
 	int appId;
 	String? userSign;
 	List<LiveConsultationMember >? memberLiveDatas;
@@ -2459,7 +2440,7 @@ class JoinLiveConsultationResult {
 		this.consultationCode,
 		this.userCode,
 		this.roomNo = 0,
-		this.liveProtocol,
+		this.liveProtocol = TransactionStatusEnum.Applied,
 		this.appId = 0,
 		this.userSign,
 		this.memberLiveDatas,
@@ -2471,7 +2452,7 @@ class JoinLiveConsultationResult {
 			consultationCode: map['ConsultationCode'],
 			userCode: map['UserCode'],
 			roomNo: map['RoomNo'],
-			liveProtocol: map['LiveProtocol'],
+			liveProtocol: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocol']),
 			appId: map['AppId'],
 			userSign: map['UserSign'],
 			memberLiveDatas: map['MemberLiveDatas'] != null ? (map['MemberLiveDatas'] as List).map((e)=>LiveConsultationMember.fromJson(e as Map<String,dynamic>)).toList() : null,
@@ -2486,8 +2467,7 @@ class JoinLiveConsultationResult {
 		if(userCode != null)
 			map['UserCode'] = userCode;
 		map['RoomNo'] = roomNo;
-		if(liveProtocol != null)
-			map['LiveProtocol'] = liveProtocol;
+		map['LiveProtocol'] = liveProtocol.index;
 		map['AppId'] = appId;
 		if(userSign != null)
 			map['UserSign'] = userSign;
@@ -2582,7 +2562,7 @@ class AcceptLiveConsultationResult {
 	String? consultationCode;
 	String? userCode;
 	int roomNo;
-	String? liveProtocol;
+	TransactionStatusEnum liveProtocol;
 	int appId;
 	String? userSign;
 	List<LiveConsultationMember >? memberLiveDatas;
@@ -2592,7 +2572,7 @@ class AcceptLiveConsultationResult {
 		this.consultationCode,
 		this.userCode,
 		this.roomNo = 0,
-		this.liveProtocol,
+		this.liveProtocol = TransactionStatusEnum.Applied,
 		this.appId = 0,
 		this.userSign,
 		this.memberLiveDatas,
@@ -2604,7 +2584,7 @@ class AcceptLiveConsultationResult {
 			consultationCode: map['ConsultationCode'],
 			userCode: map['UserCode'],
 			roomNo: map['RoomNo'],
-			liveProtocol: map['LiveProtocol'],
+			liveProtocol: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocol']),
 			appId: map['AppId'],
 			userSign: map['UserSign'],
 			memberLiveDatas: map['MemberLiveDatas'] != null ? (map['MemberLiveDatas'] as List).map((e)=>LiveConsultationMember.fromJson(e as Map<String,dynamic>)).toList() : null,
@@ -2619,8 +2599,7 @@ class AcceptLiveConsultationResult {
 		if(userCode != null)
 			map['UserCode'] = userCode;
 		map['RoomNo'] = roomNo;
-		if(liveProtocol != null)
-			map['LiveProtocol'] = liveProtocol;
+		map['LiveProtocol'] = liveProtocol.index;
 		map['AppId'] = appId;
 		if(userSign != null)
 			map['UserSign'] = userSign;

+ 266 - 89
lib/services/notification.m.dart

@@ -1170,6 +1170,66 @@ class DeviceLiveFinishedNotification extends NotificationDTO{
 	}
 }
 
+enum TransactionStatusEnum {
+	placeHolder_0,
+	Applied,
+	Withdrawn,
+	Rejected,
+	ToStart,
+	InProgress,
+	PendingReport,
+	End,
+	Embedded,
+	Common,
+	Tencent,
+	TRTC,
+	VRTC,
+}
+
+class LiveData {
+	int height;
+	int width;
+	String? rtmpPushUrl;
+	String? rtmpPullUrl;
+	String? httpPullUrl;
+	String? hlsPullUrl;
+
+	LiveData({
+		this.height = 0,
+		this.width = 0,
+		this.rtmpPushUrl,
+		this.rtmpPullUrl,
+		this.httpPullUrl,
+		this.hlsPullUrl,
+	});
+
+	factory LiveData.fromJson(Map<String, dynamic> map) {
+		return LiveData( 
+			height: map['Height'],
+			width: map['Width'],
+			rtmpPushUrl: map['RtmpPushUrl'],
+			rtmpPullUrl: map['RtmpPullUrl'],
+			httpPullUrl: map['HttpPullUrl'],
+			hlsPullUrl: map['HlsPullUrl'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		map['Height'] = height;
+		map['Width'] = width;
+		if(rtmpPushUrl != null)
+			map['RtmpPushUrl'] = rtmpPushUrl;
+		if(rtmpPullUrl != null)
+			map['RtmpPullUrl'] = rtmpPullUrl;
+		if(httpPullUrl != null)
+			map['HttpPullUrl'] = httpPullUrl;
+		if(hlsPullUrl != null)
+			map['HlsPullUrl'] = hlsPullUrl;
+		return map;
+	}
+}
+
 class VideoDeviceOutputInfo {
 	String? videoDeviceId;
 	VideoDeviceSourceTypeEnum videoDeviceSourceType;
@@ -1179,6 +1239,7 @@ class VideoDeviceOutputInfo {
 	int videoBitrate;
 	int minVideoBitrate;
 	String? videoDeviceSign;
+	LiveData? liveData;
 
 	VideoDeviceOutputInfo({
 		this.videoDeviceId,
@@ -1189,6 +1250,7 @@ class VideoDeviceOutputInfo {
 		this.videoBitrate = 0,
 		this.minVideoBitrate = 0,
 		this.videoDeviceSign,
+		this.liveData,
 	});
 
 	factory VideoDeviceOutputInfo.fromJson(Map<String, dynamic> map) {
@@ -1201,6 +1263,7 @@ class VideoDeviceOutputInfo {
 			videoBitrate: map['VideoBitrate'],
 			minVideoBitrate: map['MinVideoBitrate'],
 			videoDeviceSign: map['VideoDeviceSign'],
+			liveData: map['LiveData'] != null ? LiveData.fromJson(map['LiveData']) : null,
 		);
 	}
 
@@ -1216,6 +1279,8 @@ class VideoDeviceOutputInfo {
 		map['MinVideoBitrate'] = minVideoBitrate;
 		if(videoDeviceSign != null)
 			map['VideoDeviceSign'] = videoDeviceSign;
+		if(liveData != null)
+			map['LiveData'] = liveData;
 		return map;
 	}
 }
@@ -1223,7 +1288,7 @@ class VideoDeviceOutputInfo {
 class StartLiveToDeviceNotification extends NotificationDTO{
 	String? liveRoomCode;
 	int roomNo;
-	String? liveProtocol;
+	TransactionStatusEnum liveProtocol;
 	int appId;
 	bool mergedChannel;
 	int mergedVideoOutputWidth;
@@ -1234,7 +1299,7 @@ class StartLiveToDeviceNotification extends NotificationDTO{
 		NotificationTypeEnum notificationType = NotificationTypeEnum.Unknown,
 		this.liveRoomCode,
 		this.roomNo = 0,
-		this.liveProtocol,
+		this.liveProtocol = TransactionStatusEnum.Applied,
 		this.appId = 0,
 		this.mergedChannel = false,
 		this.mergedVideoOutputWidth = 0,
@@ -1253,7 +1318,7 @@ class StartLiveToDeviceNotification extends NotificationDTO{
 			notificationType: NotificationTypeEnum.values.firstWhere((e) => e.index == map['NotificationType']),
 			liveRoomCode: map['LiveRoomCode'],
 			roomNo: map['RoomNo'],
-			liveProtocol: map['LiveProtocol'],
+			liveProtocol: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocol']),
 			appId: map['AppId'],
 			mergedChannel: map['MergedChannel'],
 			mergedVideoOutputWidth: map['MergedVideoOutputWidth'],
@@ -1269,8 +1334,7 @@ class StartLiveToDeviceNotification extends NotificationDTO{
 		if(liveRoomCode != null)
 			map['LiveRoomCode'] = liveRoomCode;
 		map['RoomNo'] = roomNo;
-		if(liveProtocol != null)
-			map['LiveProtocol'] = liveProtocol;
+		map['LiveProtocol'] = liveProtocol.index;
 		map['AppId'] = appId;
 		map['MergedChannel'] = mergedChannel;
 		map['MergedVideoOutputWidth'] = mergedVideoOutputWidth;
@@ -1487,7 +1551,14 @@ enum LiveMemberEnum {
 	Device,
 }
 
-enum LiveConsultationMemberStatus {
+enum UserStatusEnum {
+	placeHolder_0,
+	NotOnline,
+	IsBusy,
+	Idle,
+}
+
+enum LiveMemberStatus {
 	Default,
 	Accepted,
 	Rejected,
@@ -1495,27 +1566,27 @@ enum LiveConsultationMemberStatus {
 	Left,
 }
 
-class LiveData {
-	int height;
+class LiveDataDTO {
 	int width;
+	int height;
 	String? rtmpPushUrl;
 	String? rtmpPullUrl;
 	String? httpPullUrl;
 	String? hlsPullUrl;
 
-	LiveData({
-		this.height = 0,
+	LiveDataDTO({
 		this.width = 0,
+		this.height = 0,
 		this.rtmpPushUrl,
 		this.rtmpPullUrl,
 		this.httpPullUrl,
 		this.hlsPullUrl,
 	});
 
-	factory LiveData.fromJson(Map<String, dynamic> map) {
-		return LiveData( 
-			height: map['Height'],
+	factory LiveDataDTO.fromJson(Map<String, dynamic> map) {
+		return LiveDataDTO( 
 			width: map['Width'],
+			height: map['Height'],
 			rtmpPushUrl: map['RtmpPushUrl'],
 			rtmpPullUrl: map['RtmpPullUrl'],
 			httpPullUrl: map['HttpPullUrl'],
@@ -1525,8 +1596,8 @@ class LiveData {
 
 	Map<String, dynamic> toJson() {
 		final map = Map<String, dynamic>();
-		map['Height'] = height;
 		map['Width'] = width;
+		map['Height'] = height;
 		if(rtmpPushUrl != null)
 			map['RtmpPushUrl'] = rtmpPushUrl;
 		if(rtmpPullUrl != null)
@@ -1539,73 +1610,73 @@ class LiveData {
 	}
 }
 
-class LiveConsultationMember {
+class LiveCourseMember {
 	String? id;
 	String? name;
 	LiveMemberEnum memberType;
 	String? headImageToken;
-	bool isOnline;
+	UserStatusEnum userStatusType;
 	bool mute;
 	bool videoOpend;
-	bool isInitiator;
-	bool isBusy;
-	LiveConsultationMemberStatus status;
+	bool isTeacher;
+	bool isExpertUser;
+	bool isAssistantUser;
+	LiveMemberStatus status;
 	String? loginServerUrl;
 	LoginSource loginSource;
+	LiveDataDTO? liveData;
+	List<VideoDeviceOutputInfo >? videoDeviceInfos;
+	bool isControllingParameter;
 	bool mergedChannel;
 	int mergedVideoOutputWidth;
 	int mergedVideoOutputHeight;
-	LiveData? liveData;
-	List<VideoDeviceOutputInfo >? videoDeviceInfos;
-	bool isControllingParameter;
-	int sortNumber;
-	int sortLevel;
+	TransactionStatusEnum liveProtocol;
 
-	LiveConsultationMember({
+	LiveCourseMember({
 		this.id,
 		this.name,
 		this.memberType = LiveMemberEnum.User,
 		this.headImageToken,
-		this.isOnline = false,
+		this.userStatusType = UserStatusEnum.NotOnline,
 		this.mute = false,
 		this.videoOpend = false,
-		this.isInitiator = false,
-		this.isBusy = false,
-		this.status = LiveConsultationMemberStatus.Default,
+		this.isTeacher = false,
+		this.isExpertUser = false,
+		this.isAssistantUser = false,
+		this.status = LiveMemberStatus.Default,
 		this.loginServerUrl,
 		this.loginSource = LoginSource.PC,
-		this.mergedChannel = false,
-		this.mergedVideoOutputWidth = 0,
-		this.mergedVideoOutputHeight = 0,
 		this.liveData,
 		this.videoDeviceInfos,
 		this.isControllingParameter = false,
-		this.sortNumber = 0,
-		this.sortLevel = 0,
+		this.mergedChannel = false,
+		this.mergedVideoOutputWidth = 0,
+		this.mergedVideoOutputHeight = 0,
+		this.liveProtocol = TransactionStatusEnum.Applied,
 	});
 
-	factory LiveConsultationMember.fromJson(Map<String, dynamic> map) {
-		return LiveConsultationMember( 
+	factory LiveCourseMember.fromJson(Map<String, dynamic> map) {
+		return LiveCourseMember( 
 			id: map['Id'],
 			name: map['Name'],
 			memberType: LiveMemberEnum.values.firstWhere((e) => e.index == map['MemberType']),
 			headImageToken: map['HeadImageToken'],
-			isOnline: map['IsOnline'],
+			userStatusType: UserStatusEnum.values.firstWhere((e) => e.index == map['UserStatusType']),
 			mute: map['Mute'],
 			videoOpend: map['VideoOpend'],
-			isInitiator: map['IsInitiator'],
-			isBusy: map['IsBusy'],
-			status: LiveConsultationMemberStatus.values.firstWhere((e) => e.index == map['Status']),
+			isTeacher: map['IsTeacher'],
+			isExpertUser: map['IsExpertUser'],
+			isAssistantUser: map['IsAssistantUser'],
+			status: LiveMemberStatus.values.firstWhere((e) => e.index == map['Status']),
 			loginServerUrl: map['LoginServerUrl'],
 			loginSource: LoginSource.values.firstWhere((e) => e.index == map['LoginSource']),
+			liveData: map['LiveData'] != null ? LiveDataDTO.fromJson(map['LiveData']) : null,
+			videoDeviceInfos: map['VideoDeviceInfos'] != null ? (map['VideoDeviceInfos'] as List).map((e)=>VideoDeviceOutputInfo.fromJson(e as Map<String,dynamic>)).toList() : null,
+			isControllingParameter: map['IsControllingParameter'],
 			mergedChannel: map['MergedChannel'],
 			mergedVideoOutputWidth: map['MergedVideoOutputWidth'],
 			mergedVideoOutputHeight: map['MergedVideoOutputHeight'],
-			liveData: map['LiveData'] != null ? LiveData.fromJson(map['LiveData']) : null,
-			videoDeviceInfos: map['VideoDeviceInfos'] != null ? (map['VideoDeviceInfos'] as List).map((e)=>VideoDeviceOutputInfo.fromJson(e as Map<String,dynamic>)).toList() : null,
-			isControllingParameter: map['IsControllingParameter'],
-			sortNumber: map['SortNumber'],
-			sortLevel: map['SortLevel'],
+			liveProtocol: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocol']),
 		);
 	}
 
@@ -1618,32 +1689,32 @@ class LiveConsultationMember {
 		map['MemberType'] = memberType.index;
 		if(headImageToken != null)
 			map['HeadImageToken'] = headImageToken;
-		map['IsOnline'] = isOnline;
+		map['UserStatusType'] = userStatusType.index;
 		map['Mute'] = mute;
 		map['VideoOpend'] = videoOpend;
-		map['IsInitiator'] = isInitiator;
-		map['IsBusy'] = isBusy;
+		map['IsTeacher'] = isTeacher;
+		map['IsExpertUser'] = isExpertUser;
+		map['IsAssistantUser'] = isAssistantUser;
 		map['Status'] = status.index;
 		if(loginServerUrl != null)
 			map['LoginServerUrl'] = loginServerUrl;
 		map['LoginSource'] = loginSource.index;
-		map['MergedChannel'] = mergedChannel;
-		map['MergedVideoOutputWidth'] = mergedVideoOutputWidth;
-		map['MergedVideoOutputHeight'] = mergedVideoOutputHeight;
 		if(liveData != null)
 			map['LiveData'] = liveData;
 		if(videoDeviceInfos != null)
 			map['VideoDeviceInfos'] = videoDeviceInfos;
 		map['IsControllingParameter'] = isControllingParameter;
-		map['SortNumber'] = sortNumber;
-		map['SortLevel'] = sortLevel;
+		map['MergedChannel'] = mergedChannel;
+		map['MergedVideoOutputWidth'] = mergedVideoOutputWidth;
+		map['MergedVideoOutputHeight'] = mergedVideoOutputHeight;
+		map['LiveProtocol'] = liveProtocol.index;
 		return map;
 	}
 }
 
 class HeartRateJoinCourseNotification extends NotificationDTO{
 	String? courseCode;
-	LiveConsultationMember? joiner;
+	LiveCourseMember? joiner;
 
 	HeartRateJoinCourseNotification({
 		NotificationTypeEnum notificationType = NotificationTypeEnum.Unknown,
@@ -1661,7 +1732,7 @@ class HeartRateJoinCourseNotification extends NotificationDTO{
 		return HeartRateJoinCourseNotification( 
 			notificationType: NotificationTypeEnum.values.firstWhere((e) => e.index == map['NotificationType']),
 			courseCode: map['CourseCode'],
-			joiner: map['Joiner'] != null ? LiveConsultationMember.fromJson(map['Joiner']) : null,
+			joiner: map['Joiner'] != null ? LiveCourseMember.fromJson(map['Joiner']) : null,
 			code: map['Code'],
 			isResponse: map['IsResponse'],
 		);
@@ -1679,7 +1750,7 @@ class HeartRateJoinCourseNotification extends NotificationDTO{
 
 class HeartRateLeaveCourseNotification extends NotificationDTO{
 	String? courseCode;
-	LiveConsultationMember? leaverInfo;
+	LiveCourseMember? leaverInfo;
 
 	HeartRateLeaveCourseNotification({
 		NotificationTypeEnum notificationType = NotificationTypeEnum.Unknown,
@@ -1697,7 +1768,7 @@ class HeartRateLeaveCourseNotification extends NotificationDTO{
 		return HeartRateLeaveCourseNotification( 
 			notificationType: NotificationTypeEnum.values.firstWhere((e) => e.index == map['NotificationType']),
 			courseCode: map['CourseCode'],
-			leaverInfo: map['LeaverInfo'] != null ? LiveConsultationMember.fromJson(map['LeaverInfo']) : null,
+			leaverInfo: map['LeaverInfo'] != null ? LiveCourseMember.fromJson(map['LeaverInfo']) : null,
 			code: map['Code'],
 			isResponse: map['IsResponse'],
 		);
@@ -1716,14 +1787,14 @@ class HeartRateLeaveCourseNotification extends NotificationDTO{
 class InviteLiveCourseNotification extends NotificationDTO{
 	String? courseCode;
 	int roomNo;
-	String? liveProtocol;
-	LiveConsultationMember? initiator;
+	TransactionStatusEnum liveProtocol;
+	LiveCourseMember? initiator;
 
 	InviteLiveCourseNotification({
 		NotificationTypeEnum notificationType = NotificationTypeEnum.Unknown,
 		this.courseCode,
 		this.roomNo = 0,
-		this.liveProtocol,
+		this.liveProtocol = TransactionStatusEnum.Applied,
 		this.initiator,
 		String? code,
 		bool isResponse = false,
@@ -1738,8 +1809,8 @@ class InviteLiveCourseNotification extends NotificationDTO{
 			notificationType: NotificationTypeEnum.values.firstWhere((e) => e.index == map['NotificationType']),
 			courseCode: map['CourseCode'],
 			roomNo: map['RoomNo'],
-			liveProtocol: map['LiveProtocol'],
-			initiator: map['Initiator'] != null ? LiveConsultationMember.fromJson(map['Initiator']) : null,
+			liveProtocol: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocol']),
+			initiator: map['Initiator'] != null ? LiveCourseMember.fromJson(map['Initiator']) : null,
 			code: map['Code'],
 			isResponse: map['IsResponse'],
 		);
@@ -1750,8 +1821,7 @@ class InviteLiveCourseNotification extends NotificationDTO{
 		if(courseCode != null)
 			map['CourseCode'] = courseCode;
 		map['RoomNo'] = roomNo;
-		if(liveProtocol != null)
-			map['LiveProtocol'] = liveProtocol;
+		map['LiveProtocol'] = liveProtocol.index;
 		if(initiator != null)
 			map['Initiator'] = initiator;
 		return map;
@@ -1760,7 +1830,7 @@ class InviteLiveCourseNotification extends NotificationDTO{
 
 class JoinLiveCourseNotification extends NotificationDTO{
 	String? courseCode;
-	LiveConsultationMember? joiner;
+	LiveCourseMember? joiner;
 
 	JoinLiveCourseNotification({
 		NotificationTypeEnum notificationType = NotificationTypeEnum.Unknown,
@@ -1778,7 +1848,7 @@ class JoinLiveCourseNotification extends NotificationDTO{
 		return JoinLiveCourseNotification( 
 			notificationType: NotificationTypeEnum.values.firstWhere((e) => e.index == map['NotificationType']),
 			courseCode: map['CourseCode'],
-			joiner: map['Joiner'] != null ? LiveConsultationMember.fromJson(map['Joiner']) : null,
+			joiner: map['Joiner'] != null ? LiveCourseMember.fromJson(map['Joiner']) : null,
 			code: map['Code'],
 			isResponse: map['IsResponse'],
 		);
@@ -1796,7 +1866,7 @@ class JoinLiveCourseNotification extends NotificationDTO{
 
 class LeaveLiveCourseNotification extends NotificationDTO{
 	String? courseCode;
-	LiveConsultationMember? leaverInfo;
+	LiveCourseMember? leaverInfo;
 
 	LeaveLiveCourseNotification({
 		NotificationTypeEnum notificationType = NotificationTypeEnum.Unknown,
@@ -1814,7 +1884,7 @@ class LeaveLiveCourseNotification extends NotificationDTO{
 		return LeaveLiveCourseNotification( 
 			notificationType: NotificationTypeEnum.values.firstWhere((e) => e.index == map['NotificationType']),
 			courseCode: map['CourseCode'],
-			leaverInfo: map['LeaverInfo'] != null ? LiveConsultationMember.fromJson(map['LeaverInfo']) : null,
+			leaverInfo: map['LeaverInfo'] != null ? LiveCourseMember.fromJson(map['LeaverInfo']) : null,
 			code: map['Code'],
 			isResponse: map['IsResponse'],
 		);
@@ -1833,7 +1903,7 @@ class LeaveLiveCourseNotification extends NotificationDTO{
 class MuteLiveCourseNotification extends NotificationDTO{
 	String? courseCode;
 	bool mute;
-	LiveConsultationMember? muterInfo;
+	LiveCourseMember? muterInfo;
 
 	MuteLiveCourseNotification({
 		NotificationTypeEnum notificationType = NotificationTypeEnum.Unknown,
@@ -1853,7 +1923,7 @@ class MuteLiveCourseNotification extends NotificationDTO{
 			notificationType: NotificationTypeEnum.values.firstWhere((e) => e.index == map['NotificationType']),
 			courseCode: map['CourseCode'],
 			mute: map['Mute'],
-			muterInfo: map['MuterInfo'] != null ? LiveConsultationMember.fromJson(map['MuterInfo']) : null,
+			muterInfo: map['MuterInfo'] != null ? LiveCourseMember.fromJson(map['MuterInfo']) : null,
 			code: map['Code'],
 			isResponse: map['IsResponse'],
 		);
@@ -1872,7 +1942,7 @@ class MuteLiveCourseNotification extends NotificationDTO{
 
 class NetworkErrCourseNotification extends NotificationDTO{
 	String? courseCode;
-	LiveConsultationMember? networkErrMemberInfo;
+	LiveCourseMember? networkErrMemberInfo;
 
 	NetworkErrCourseNotification({
 		NotificationTypeEnum notificationType = NotificationTypeEnum.Unknown,
@@ -1890,7 +1960,7 @@ class NetworkErrCourseNotification extends NotificationDTO{
 		return NetworkErrCourseNotification( 
 			notificationType: NotificationTypeEnum.values.firstWhere((e) => e.index == map['NotificationType']),
 			courseCode: map['CourseCode'],
-			networkErrMemberInfo: map['NetworkErrMemberInfo'] != null ? LiveConsultationMember.fromJson(map['NetworkErrMemberInfo']) : null,
+			networkErrMemberInfo: map['NetworkErrMemberInfo'] != null ? LiveCourseMember.fromJson(map['NetworkErrMemberInfo']) : null,
 			code: map['Code'],
 			isResponse: map['IsResponse'],
 		);
@@ -1909,7 +1979,7 @@ class NetworkErrCourseNotification extends NotificationDTO{
 class SwitchLiveCourseVideoNotification extends NotificationDTO{
 	String? courseCode;
 	bool opened;
-	LiveConsultationMember? switcherInfo;
+	LiveCourseMember? switcherInfo;
 
 	SwitchLiveCourseVideoNotification({
 		NotificationTypeEnum notificationType = NotificationTypeEnum.Unknown,
@@ -1929,7 +1999,7 @@ class SwitchLiveCourseVideoNotification extends NotificationDTO{
 			notificationType: NotificationTypeEnum.values.firstWhere((e) => e.index == map['NotificationType']),
 			courseCode: map['CourseCode'],
 			opened: map['Opened'],
-			switcherInfo: map['SwitcherInfo'] != null ? LiveConsultationMember.fromJson(map['SwitcherInfo']) : null,
+			switcherInfo: map['SwitcherInfo'] != null ? LiveCourseMember.fromJson(map['SwitcherInfo']) : null,
 			code: map['Code'],
 			isResponse: map['IsResponse'],
 		);
@@ -2404,13 +2474,13 @@ class RejectApplyConsultationNotification extends NotificationDTO{
 
 class StartConsolutionHeartRateToDeviceNotification extends NotificationDTO{
 	String? liveRoomCode;
-	String? liveProtocol;
+	TransactionStatusEnum liveProtocol;
 	int intervalSeconds;
 
 	StartConsolutionHeartRateToDeviceNotification({
 		NotificationTypeEnum notificationType = NotificationTypeEnum.Unknown,
 		this.liveRoomCode,
-		this.liveProtocol,
+		this.liveProtocol = TransactionStatusEnum.Applied,
 		this.intervalSeconds = 0,
 		String? code,
 		bool isResponse = false,
@@ -2424,7 +2494,7 @@ class StartConsolutionHeartRateToDeviceNotification extends NotificationDTO{
 		return StartConsolutionHeartRateToDeviceNotification( 
 			notificationType: NotificationTypeEnum.values.firstWhere((e) => e.index == map['NotificationType']),
 			liveRoomCode: map['LiveRoomCode'],
-			liveProtocol: map['LiveProtocol'],
+			liveProtocol: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocol']),
 			intervalSeconds: map['IntervalSeconds'],
 			code: map['Code'],
 			isResponse: map['IsResponse'],
@@ -2435,8 +2505,7 @@ class StartConsolutionHeartRateToDeviceNotification extends NotificationDTO{
 		final map = super.toJson();
 		if(liveRoomCode != null)
 			map['LiveRoomCode'] = liveRoomCode;
-		if(liveProtocol != null)
-			map['LiveProtocol'] = liveProtocol;
+		map['LiveProtocol'] = liveProtocol.index;
 		map['IntervalSeconds'] = intervalSeconds;
 		return map;
 	}
@@ -2444,13 +2513,13 @@ class StartConsolutionHeartRateToDeviceNotification extends NotificationDTO{
 
 class StartEducationHeartRateToDeviceNotification extends NotificationDTO{
 	String? liveRoomCode;
-	String? liveProtocol;
+	TransactionStatusEnum liveProtocol;
 	int intervalSeconds;
 
 	StartEducationHeartRateToDeviceNotification({
 		NotificationTypeEnum notificationType = NotificationTypeEnum.Unknown,
 		this.liveRoomCode,
-		this.liveProtocol,
+		this.liveProtocol = TransactionStatusEnum.Applied,
 		this.intervalSeconds = 0,
 		String? code,
 		bool isResponse = false,
@@ -2464,7 +2533,7 @@ class StartEducationHeartRateToDeviceNotification extends NotificationDTO{
 		return StartEducationHeartRateToDeviceNotification( 
 			notificationType: NotificationTypeEnum.values.firstWhere((e) => e.index == map['NotificationType']),
 			liveRoomCode: map['LiveRoomCode'],
-			liveProtocol: map['LiveProtocol'],
+			liveProtocol: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocol']),
 			intervalSeconds: map['IntervalSeconds'],
 			code: map['Code'],
 			isResponse: map['IsResponse'],
@@ -2475,8 +2544,7 @@ class StartEducationHeartRateToDeviceNotification extends NotificationDTO{
 		final map = super.toJson();
 		if(liveRoomCode != null)
 			map['LiveRoomCode'] = liveRoomCode;
-		if(liveProtocol != null)
-			map['LiveProtocol'] = liveProtocol;
+		map['LiveProtocol'] = liveProtocol.index;
 		map['IntervalSeconds'] = intervalSeconds;
 		return map;
 	}
@@ -3822,6 +3890,116 @@ class CloseLiveConsultationNotification extends NotificationDTO{
 	}
 }
 
+enum LiveConsultationMemberStatus {
+	Default,
+	Accepted,
+	Rejected,
+	Joined,
+	Left,
+}
+
+class LiveConsultationMember {
+	String? id;
+	String? name;
+	LiveMemberEnum memberType;
+	String? headImageToken;
+	bool isOnline;
+	bool mute;
+	bool videoOpend;
+	bool isInitiator;
+	bool isBusy;
+	LiveConsultationMemberStatus status;
+	String? loginServerUrl;
+	LoginSource loginSource;
+	bool mergedChannel;
+	int mergedVideoOutputWidth;
+	int mergedVideoOutputHeight;
+	LiveData? liveData;
+	List<VideoDeviceOutputInfo >? videoDeviceInfos;
+	bool isControllingParameter;
+	int sortNumber;
+	int sortLevel;
+
+	LiveConsultationMember({
+		this.id,
+		this.name,
+		this.memberType = LiveMemberEnum.User,
+		this.headImageToken,
+		this.isOnline = false,
+		this.mute = false,
+		this.videoOpend = false,
+		this.isInitiator = false,
+		this.isBusy = false,
+		this.status = LiveConsultationMemberStatus.Default,
+		this.loginServerUrl,
+		this.loginSource = LoginSource.PC,
+		this.mergedChannel = false,
+		this.mergedVideoOutputWidth = 0,
+		this.mergedVideoOutputHeight = 0,
+		this.liveData,
+		this.videoDeviceInfos,
+		this.isControllingParameter = false,
+		this.sortNumber = 0,
+		this.sortLevel = 0,
+	});
+
+	factory LiveConsultationMember.fromJson(Map<String, dynamic> map) {
+		return LiveConsultationMember( 
+			id: map['Id'],
+			name: map['Name'],
+			memberType: LiveMemberEnum.values.firstWhere((e) => e.index == map['MemberType']),
+			headImageToken: map['HeadImageToken'],
+			isOnline: map['IsOnline'],
+			mute: map['Mute'],
+			videoOpend: map['VideoOpend'],
+			isInitiator: map['IsInitiator'],
+			isBusy: map['IsBusy'],
+			status: LiveConsultationMemberStatus.values.firstWhere((e) => e.index == map['Status']),
+			loginServerUrl: map['LoginServerUrl'],
+			loginSource: LoginSource.values.firstWhere((e) => e.index == map['LoginSource']),
+			mergedChannel: map['MergedChannel'],
+			mergedVideoOutputWidth: map['MergedVideoOutputWidth'],
+			mergedVideoOutputHeight: map['MergedVideoOutputHeight'],
+			liveData: map['LiveData'] != null ? LiveData.fromJson(map['LiveData']) : null,
+			videoDeviceInfos: map['VideoDeviceInfos'] != null ? (map['VideoDeviceInfos'] as List).map((e)=>VideoDeviceOutputInfo.fromJson(e as Map<String,dynamic>)).toList() : null,
+			isControllingParameter: map['IsControllingParameter'],
+			sortNumber: map['SortNumber'],
+			sortLevel: map['SortLevel'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(id != null)
+			map['Id'] = id;
+		if(name != null)
+			map['Name'] = name;
+		map['MemberType'] = memberType.index;
+		if(headImageToken != null)
+			map['HeadImageToken'] = headImageToken;
+		map['IsOnline'] = isOnline;
+		map['Mute'] = mute;
+		map['VideoOpend'] = videoOpend;
+		map['IsInitiator'] = isInitiator;
+		map['IsBusy'] = isBusy;
+		map['Status'] = status.index;
+		if(loginServerUrl != null)
+			map['LoginServerUrl'] = loginServerUrl;
+		map['LoginSource'] = loginSource.index;
+		map['MergedChannel'] = mergedChannel;
+		map['MergedVideoOutputWidth'] = mergedVideoOutputWidth;
+		map['MergedVideoOutputHeight'] = mergedVideoOutputHeight;
+		if(liveData != null)
+			map['LiveData'] = liveData;
+		if(videoDeviceInfos != null)
+			map['VideoDeviceInfos'] = videoDeviceInfos;
+		map['IsControllingParameter'] = isControllingParameter;
+		map['SortNumber'] = sortNumber;
+		map['SortLevel'] = sortLevel;
+		return map;
+	}
+}
+
 class ChangeConsultationNotification extends NotificationDTO{
 	String? consultationCode;
 	int roomNo;
@@ -4168,14 +4346,14 @@ class HeartRateLeaveConsultationNotification extends NotificationDTO{
 class InviteLiveConsultationNotification extends NotificationDTO{
 	String? consultationCode;
 	int roomNo;
-	String? liveProtocol;
+	TransactionStatusEnum liveProtocol;
 	LiveConsultationMember? initiator;
 
 	InviteLiveConsultationNotification({
 		NotificationTypeEnum notificationType = NotificationTypeEnum.Unknown,
 		this.consultationCode,
 		this.roomNo = 0,
-		this.liveProtocol,
+		this.liveProtocol = TransactionStatusEnum.Applied,
 		this.initiator,
 		String? code,
 		bool isResponse = false,
@@ -4190,7 +4368,7 @@ class InviteLiveConsultationNotification extends NotificationDTO{
 			notificationType: NotificationTypeEnum.values.firstWhere((e) => e.index == map['NotificationType']),
 			consultationCode: map['ConsultationCode'],
 			roomNo: map['RoomNo'],
-			liveProtocol: map['LiveProtocol'],
+			liveProtocol: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocol']),
 			initiator: map['Initiator'] != null ? LiveConsultationMember.fromJson(map['Initiator']) : null,
 			code: map['Code'],
 			isResponse: map['IsResponse'],
@@ -4202,8 +4380,7 @@ class InviteLiveConsultationNotification extends NotificationDTO{
 		if(consultationCode != null)
 			map['ConsultationCode'] = consultationCode;
 		map['RoomNo'] = roomNo;
-		if(liveProtocol != null)
-			map['LiveProtocol'] = liveProtocol;
+		map['LiveProtocol'] = liveProtocol.index;
 		if(initiator != null)
 			map['Initiator'] = initiator;
 		return map;

+ 1758 - 4
lib/services/other.m.dart

@@ -543,17 +543,17 @@ class Stream extends MarshalByRefObject{
 	}
 }
 
-class DownloadFileResult {
+class DownloadFileResult2 {
 	Stream? merageFileStream;
 	int fileSize;
 
-	DownloadFileResult({
+	DownloadFileResult2({
 		this.merageFileStream,
 		this.fileSize = 0,
 	});
 
-	factory DownloadFileResult.fromJson(Map<String, dynamic> map) {
-		return DownloadFileResult( 
+	factory DownloadFileResult2.fromJson(Map<String, dynamic> map) {
+		return DownloadFileResult2( 
 			merageFileStream: map['MerageFileStream'] != null ? Stream.fromJson(map['MerageFileStream']) : null,
 			fileSize: map['FileSize'],
 		);
@@ -8359,6 +8359,14 @@ enum BusinessModuleEnum {
 	RemoteControl,
 }
 
+enum ChannelDescriptionEnum {
+	DeskChannel,
+	TerminalChannel,
+	CameraChannel,
+	TerminalTestChannel,
+	NoneChannel,
+}
+
 enum QueryCMSTemplateStatusTypeEnum {
 	UnPublished,
 	Published,
@@ -8391,6 +8399,14 @@ enum QueryStatisticsBannerTypeEnum {
 	Download,
 }
 
+enum CourseAvailabilityEnum {
+	Public,
+	Limited,
+	Fee,
+	Invitation,
+	Meeting,
+}
+
 enum LogEventLevel {
 	Verbose,
 	Debug,
@@ -8453,6 +8469,12 @@ enum AIThyroidLabelEnum {
 	DiffuseDisease,
 }
 
+enum DiseaseConclusion {
+	NoConclusion,
+	Positive,
+	Negative,
+}
+
 enum FollowUpVisitStatusEnum {
 	Unknown,
 	PendingVisit,
@@ -9528,6 +9550,20 @@ enum AnimalGenderEnum {
 	AnimalInfoFemale,
 }
 
+enum QualifiedState {
+	UnSet,
+	Qualified,
+	UnQualified,
+}
+
+enum QualityType {
+	None,
+	Qualified,
+	InformationUnCompleted,
+	ImageNotClear,
+	PositiveSiteNotClear,
+}
+
 enum RegionGradeEnum {
 	Country,
 	Province,
@@ -16183,6 +16219,1724 @@ class CommandResultPageSettingInfoDTO extends ListPageSettingInfoDTO{
 	}
 }
 
+class AdminView {
+	String? code;
+	String? name;
+
+	AdminView({
+		this.code,
+		this.name,
+	});
+
+	factory AdminView.fromJson(Map<String, dynamic> map) {
+		return AdminView( 
+			code: map['Code'],
+			name: map['Name'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(code != null)
+			map['Code'] = code;
+		if(name != null)
+			map['Name'] = name;
+		return map;
+	}
+}
+
+class CaseLabelView {
+	String? code;
+	String? name;
+
+	CaseLabelView({
+		this.code,
+		this.name,
+	});
+
+	factory CaseLabelView.fromJson(Map<String, dynamic> map) {
+		return CaseLabelView( 
+			code: map['Code'],
+			name: map['Name'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(code != null)
+			map['Code'] = code;
+		if(name != null)
+			map['Name'] = name;
+		return map;
+	}
+}
+
+class ChannelDataView {
+	String? channelId;
+	String? downLoadUrl;
+	String? upLoadUrl;
+	ChannelDescriptionEnum description;
+	String? httpUrl;
+	String? hlsUrl;
+
+	ChannelDataView({
+		this.channelId,
+		this.downLoadUrl,
+		this.upLoadUrl,
+		this.description = ChannelDescriptionEnum.DeskChannel,
+		this.httpUrl,
+		this.hlsUrl,
+	});
+
+	factory ChannelDataView.fromJson(Map<String, dynamic> map) {
+		return ChannelDataView( 
+			channelId: map['ChannelId'],
+			downLoadUrl: map['DownLoadUrl'],
+			upLoadUrl: map['UpLoadUrl'],
+			description: ChannelDescriptionEnum.values.firstWhere((e) => e.index == map['Description']),
+			httpUrl: map['HttpUrl'],
+			hlsUrl: map['HlsUrl'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(channelId != null)
+			map['ChannelId'] = channelId;
+		if(downLoadUrl != null)
+			map['DownLoadUrl'] = downLoadUrl;
+		if(upLoadUrl != null)
+			map['UpLoadUrl'] = upLoadUrl;
+		map['Description'] = description.index;
+		if(httpUrl != null)
+			map['HttpUrl'] = httpUrl;
+		if(hlsUrl != null)
+			map['HlsUrl'] = hlsUrl;
+		return map;
+	}
+}
+
+class CommentView {
+	String? userCode;
+	String? userName;
+	double score;
+	String? description;
+
+	CommentView({
+		this.userCode,
+		this.userName,
+		this.score = 0,
+		this.description,
+	});
+
+	factory CommentView.fromJson(Map<String, dynamic> map) {
+		return CommentView( 
+			userCode: map['UserCode'],
+			userName: map['UserName'],
+			score: double.parse(map['Score'].toString()),
+			description: map['Description'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(userCode != null)
+			map['UserCode'] = userCode;
+		if(userName != null)
+			map['UserName'] = userName;
+		map['Score'] = score;
+		if(description != null)
+			map['Description'] = description;
+		return map;
+	}
+}
+
+class UserView {
+	String? code;
+	String? name;
+	String? organizationCode;
+	String? organizationName;
+
+	UserView({
+		this.code,
+		this.name,
+		this.organizationCode,
+		this.organizationName,
+	});
+
+	factory UserView.fromJson(Map<String, dynamic> map) {
+		return UserView( 
+			code: map['Code'],
+			name: map['Name'],
+			organizationCode: map['OrganizationCode'],
+			organizationName: map['OrganizationName'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(code != null)
+			map['Code'] = code;
+		if(name != null)
+			map['Name'] = name;
+		if(organizationCode != null)
+			map['OrganizationCode'] = organizationCode;
+		if(organizationName != null)
+			map['OrganizationName'] = organizationName;
+		return map;
+	}
+}
+
+class StudentView extends UserView{
+	bool isNoSpeaking;
+	bool isAssistant;
+	List<int>? smallHeadImage;
+	bool isPay;
+	StudentCourseStatusEnum signCourseStatus;
+
+	StudentView({
+		this.isNoSpeaking = false,
+		this.isAssistant = false,
+		this.smallHeadImage,
+		this.isPay = false,
+		this.signCourseStatus = StudentCourseStatusEnum.All,
+		String? code,
+		String? name,
+		String? organizationCode,
+		String? organizationName,
+	}) : super(
+			code: code,
+			name: name,
+			organizationCode: organizationCode,
+			organizationName: organizationName,
+		);
+
+	factory StudentView.fromJson(Map<String, dynamic> map) {
+		final smallHeadImageData = map['SmallHeadImage'];
+		return StudentView( 
+			isNoSpeaking: map['IsNoSpeaking'],
+			isAssistant: map['IsAssistant'],
+			smallHeadImage: smallHeadImageData != null ? (smallHeadImageData as List).map((e) => e as int).toList(): null,
+			isPay: map['IsPay'],
+			signCourseStatus: StudentCourseStatusEnum.values.firstWhere((e) => e.index == map['SignCourseStatus']),
+			code: map['Code'],
+			name: map['Name'],
+			organizationCode: map['OrganizationCode'],
+			organizationName: map['OrganizationName'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		map['IsNoSpeaking'] = isNoSpeaking;
+		map['IsAssistant'] = isAssistant;
+		if(smallHeadImage != null)
+			map['SmallHeadImage'] = smallHeadImage;
+		map['IsPay'] = isPay;
+		map['SignCourseStatus'] = signCourseStatus.index;
+		return map;
+	}
+}
+
+class CourseAlbumView {
+	String? code;
+	String? name;
+	String? teacherCode;
+	String? teacherName;
+	String? cover;
+	String? introduction;
+	List<String >? courseLabelCodes;
+	CourseViewRangeEnum viewRange;
+	double price;
+	List<StudentView >? students;
+	int sort;
+	bool isStick;
+
+	CourseAlbumView({
+		this.code,
+		this.name,
+		this.teacherCode,
+		this.teacherName,
+		this.cover,
+		this.introduction,
+		this.courseLabelCodes,
+		this.viewRange = CourseViewRangeEnum.All,
+		this.price = 0,
+		this.students,
+		this.sort = 0,
+		this.isStick = false,
+	});
+
+	factory CourseAlbumView.fromJson(Map<String, dynamic> map) {
+		return CourseAlbumView( 
+			code: map['Code'],
+			name: map['Name'],
+			teacherCode: map['TeacherCode'],
+			teacherName: map['TeacherName'],
+			cover: map['Cover'],
+			introduction: map['Introduction'],
+			courseLabelCodes: map['CourseLabelCodes'] != null ? map['CourseLabelCodes'].cast<String>().toList() : null,
+			viewRange: CourseViewRangeEnum.values.firstWhere((e) => e.index == map['ViewRange']),
+			price: double.parse(map['Price'].toString()),
+			students: map['Students'] != null ? (map['Students'] as List).map((e)=>StudentView.fromJson(e as Map<String,dynamic>)).toList() : null,
+			sort: map['Sort'],
+			isStick: map['IsStick'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(code != null)
+			map['Code'] = code;
+		if(name != null)
+			map['Name'] = name;
+		if(teacherCode != null)
+			map['TeacherCode'] = teacherCode;
+		if(teacherName != null)
+			map['TeacherName'] = teacherName;
+		if(cover != null)
+			map['Cover'] = cover;
+		if(introduction != null)
+			map['Introduction'] = introduction;
+		if(courseLabelCodes != null)
+			map['CourseLabelCodes'] = courseLabelCodes;
+		map['ViewRange'] = viewRange.index;
+		map['Price'] = price;
+		if(students != null)
+			map['Students'] = students;
+		map['Sort'] = sort;
+		map['IsStick'] = isStick;
+		return map;
+	}
+}
+
+class CustomerLabelView {
+	String? code;
+	String? name;
+
+	CustomerLabelView({
+		this.code,
+		this.name,
+	});
+
+	factory CustomerLabelView.fromJson(Map<String, dynamic> map) {
+		return CustomerLabelView( 
+			code: map['Code'],
+			name: map['Name'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(code != null)
+			map['Code'] = code;
+		if(name != null)
+			map['Name'] = name;
+		return map;
+	}
+}
+
+class DeviceView {
+	String? code;
+	String? name;
+	String? description;
+	String? uniqueCode;
+	String? organizationCode;
+	String? organizationName;
+	String? deviceType;
+	String? deviceModel;
+
+	DeviceView({
+		this.code,
+		this.name,
+		this.description,
+		this.uniqueCode,
+		this.organizationCode,
+		this.organizationName,
+		this.deviceType,
+		this.deviceModel,
+	});
+
+	factory DeviceView.fromJson(Map<String, dynamic> map) {
+		return DeviceView( 
+			code: map['Code'],
+			name: map['Name'],
+			description: map['Description'],
+			uniqueCode: map['UniqueCode'],
+			organizationCode: map['OrganizationCode'],
+			organizationName: map['OrganizationName'],
+			deviceType: map['DeviceType'],
+			deviceModel: map['DeviceModel'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(code != null)
+			map['Code'] = code;
+		if(name != null)
+			map['Name'] = name;
+		if(description != null)
+			map['Description'] = description;
+		if(uniqueCode != null)
+			map['UniqueCode'] = uniqueCode;
+		if(organizationCode != null)
+			map['OrganizationCode'] = organizationCode;
+		if(organizationName != null)
+			map['OrganizationName'] = organizationName;
+		if(deviceType != null)
+			map['DeviceType'] = deviceType;
+		if(deviceModel != null)
+			map['DeviceModel'] = deviceModel;
+		return map;
+	}
+}
+
+class DiagnosisView {
+	DiagnosisOrganEnum organ;
+	DiagnosisConclusionEnum diagnosisStatus;
+
+	DiagnosisView({
+		this.organ = DiagnosisOrganEnum.Null,
+		this.diagnosisStatus = DiagnosisConclusionEnum.NotRequired,
+	});
+
+	factory DiagnosisView.fromJson(Map<String, dynamic> map) {
+		return DiagnosisView( 
+			organ: DiagnosisOrganEnum.values.firstWhere((e) => e.index == map['Organ']),
+			diagnosisStatus: DiagnosisConclusionEnum.values.firstWhere((e) => e.index == map['DiagnosisStatus']),
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		map['Organ'] = organ.index;
+		map['DiagnosisStatus'] = diagnosisStatus.index;
+		return map;
+	}
+}
+
+class FileView {
+	RemedicalFileDataTypeEnum dataType;
+	String? originalUrl;
+	String? cdnUrl;
+	int fileSize;
+	String? fileName;
+	String? previewUrl;
+	String? converUrl;
+
+	FileView({
+		this.dataType = RemedicalFileDataTypeEnum.VinnoVidSingle,
+		this.originalUrl,
+		this.cdnUrl,
+		this.fileSize = 0,
+		this.fileName,
+		this.previewUrl,
+		this.converUrl,
+	});
+
+	factory FileView.fromJson(Map<String, dynamic> map) {
+		return FileView( 
+			dataType: RemedicalFileDataTypeEnum.values.firstWhere((e) => e.index == map['DataType']),
+			originalUrl: map['OriginalUrl'],
+			cdnUrl: map['CdnUrl'],
+			fileSize: map['FileSize'],
+			fileName: map['FileName'],
+			previewUrl: map['PreviewUrl'],
+			converUrl: map['ConverUrl'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		map['DataType'] = dataType.index;
+		if(originalUrl != null)
+			map['OriginalUrl'] = originalUrl;
+		if(cdnUrl != null)
+			map['CdnUrl'] = cdnUrl;
+		map['FileSize'] = fileSize;
+		if(fileName != null)
+			map['FileName'] = fileName;
+		if(previewUrl != null)
+			map['PreviewUrl'] = previewUrl;
+		if(converUrl != null)
+			map['ConverUrl'] = converUrl;
+		return map;
+	}
+}
+
+class ImageLocationView {
+	String? group;
+	String? position;
+	String? quadrant;
+
+	ImageLocationView({
+		this.group,
+		this.position,
+		this.quadrant,
+	});
+
+	factory ImageLocationView.fromJson(Map<String, dynamic> map) {
+		return ImageLocationView( 
+			group: map['Group'],
+			position: map['Position'],
+			quadrant: map['Quadrant'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(group != null)
+			map['Group'] = group;
+		if(position != null)
+			map['Position'] = position;
+		if(quadrant != null)
+			map['Quadrant'] = quadrant;
+		return map;
+	}
+}
+
+class RemoteDiagnosisFileView extends FileView{
+	String? code;
+	String? application;
+	ImageLocationView? imageLocationInfo;
+	List<CommentView >? commentInfos;
+
+	RemoteDiagnosisFileView({
+		this.code,
+		this.application,
+		this.imageLocationInfo,
+		this.commentInfos,
+		RemedicalFileDataTypeEnum dataType = RemedicalFileDataTypeEnum.VinnoVidSingle,
+		String? originalUrl,
+		String? cdnUrl,
+		int fileSize = 0,
+		String? fileName,
+		String? previewUrl,
+		String? converUrl,
+	}) : super(
+			dataType: dataType,
+			originalUrl: originalUrl,
+			cdnUrl: cdnUrl,
+			fileSize: fileSize,
+			fileName: fileName,
+			previewUrl: previewUrl,
+			converUrl: converUrl,
+		);
+
+	factory RemoteDiagnosisFileView.fromJson(Map<String, dynamic> map) {
+		return RemoteDiagnosisFileView( 
+			code: map['Code'],
+			application: map['Application'],
+			imageLocationInfo: map['ImageLocationInfo'] != null ? ImageLocationView.fromJson(map['ImageLocationInfo']) : null,
+			commentInfos: map['CommentInfos'] != null ? (map['CommentInfos'] as List).map((e)=>CommentView.fromJson(e as Map<String,dynamic>)).toList() : null,
+			dataType: RemedicalFileDataTypeEnum.values.firstWhere((e) => e.index == map['DataType']),
+			originalUrl: map['OriginalUrl'],
+			cdnUrl: map['CdnUrl'],
+			fileSize: map['FileSize'],
+			fileName: map['FileName'],
+			previewUrl: map['PreviewUrl'],
+			converUrl: map['ConverUrl'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(code != null)
+			map['Code'] = code;
+		if(application != null)
+			map['Application'] = application;
+		if(imageLocationInfo != null)
+			map['ImageLocationInfo'] = imageLocationInfo;
+		if(commentInfos != null)
+			map['CommentInfos'] = commentInfos;
+		return map;
+	}
+}
+
+class LiveConsultationFileView extends FileView{
+	String? userCode;
+	String? userName;
+	String? type;
+	ConsultationFileTypeEnum consultationFileType;
+	String? remedicalCode;
+	String? remedicalMeasureCode;
+
+	LiveConsultationFileView({
+		this.userCode,
+		this.userName,
+		this.type,
+		this.consultationFileType = ConsultationFileTypeEnum.Screenshot,
+		this.remedicalCode,
+		this.remedicalMeasureCode,
+		RemedicalFileDataTypeEnum dataType = RemedicalFileDataTypeEnum.VinnoVidSingle,
+		String? originalUrl,
+		String? cdnUrl,
+		int fileSize = 0,
+		String? fileName,
+		String? previewUrl,
+		String? converUrl,
+	}) : super(
+			dataType: dataType,
+			originalUrl: originalUrl,
+			cdnUrl: cdnUrl,
+			fileSize: fileSize,
+			fileName: fileName,
+			previewUrl: previewUrl,
+			converUrl: converUrl,
+		);
+
+	factory LiveConsultationFileView.fromJson(Map<String, dynamic> map) {
+		return LiveConsultationFileView( 
+			userCode: map['UserCode'],
+			userName: map['UserName'],
+			type: map['Type'],
+			consultationFileType: ConsultationFileTypeEnum.values.firstWhere((e) => e.index == map['ConsultationFileType']),
+			remedicalCode: map['RemedicalCode'],
+			remedicalMeasureCode: map['RemedicalMeasureCode'],
+			dataType: RemedicalFileDataTypeEnum.values.firstWhere((e) => e.index == map['DataType']),
+			originalUrl: map['OriginalUrl'],
+			cdnUrl: map['CdnUrl'],
+			fileSize: map['FileSize'],
+			fileName: map['FileName'],
+			previewUrl: map['PreviewUrl'],
+			converUrl: map['ConverUrl'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(userCode != null)
+			map['UserCode'] = userCode;
+		if(userName != null)
+			map['UserName'] = userName;
+		if(type != null)
+			map['Type'] = type;
+		map['ConsultationFileType'] = consultationFileType.index;
+		if(remedicalCode != null)
+			map['RemedicalCode'] = remedicalCode;
+		if(remedicalMeasureCode != null)
+			map['RemedicalMeasureCode'] = remedicalMeasureCode;
+		return map;
+	}
+}
+
+class GroupView {
+	String? code;
+	String? name;
+
+	GroupView({
+		this.code,
+		this.name,
+	});
+
+	factory GroupView.fromJson(Map<String, dynamic> map) {
+		return GroupView( 
+			code: map['Code'],
+			name: map['Name'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(code != null)
+			map['Code'] = code;
+		if(name != null)
+			map['Name'] = name;
+		return map;
+	}
+}
+
+class PatientView {
+	String? code;
+	String? name;
+	String? identityCardId;
+	String? mobile;
+	String? gender;
+	String? age;
+
+	PatientView({
+		this.code,
+		this.name,
+		this.identityCardId,
+		this.mobile,
+		this.gender,
+		this.age,
+	});
+
+	factory PatientView.fromJson(Map<String, dynamic> map) {
+		return PatientView( 
+			code: map['Code'],
+			name: map['Name'],
+			identityCardId: map['IdentityCardId'],
+			mobile: map['Mobile'],
+			gender: map['Gender'],
+			age: map['Age'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(code != null)
+			map['Code'] = code;
+		if(name != null)
+			map['Name'] = name;
+		if(identityCardId != null)
+			map['IdentityCardId'] = identityCardId;
+		if(mobile != null)
+			map['Mobile'] = mobile;
+		if(gender != null)
+			map['Gender'] = gender;
+		if(age != null)
+			map['Age'] = age;
+		return map;
+	}
+}
+
+class OrganizationView {
+	String? code;
+	String? name;
+	String? departmentCode;
+	String? departmentName;
+	String? description;
+	String? logoUrl;
+	String? countryCode;
+	String? countryName;
+	String? provinceCode;
+	String? provinceName;
+	String? cityCode;
+	String? cityName;
+
+	OrganizationView({
+		this.code,
+		this.name,
+		this.departmentCode,
+		this.departmentName,
+		this.description,
+		this.logoUrl,
+		this.countryCode,
+		this.countryName,
+		this.provinceCode,
+		this.provinceName,
+		this.cityCode,
+		this.cityName,
+	});
+
+	factory OrganizationView.fromJson(Map<String, dynamic> map) {
+		return OrganizationView( 
+			code: map['Code'],
+			name: map['Name'],
+			departmentCode: map['DepartmentCode'],
+			departmentName: map['DepartmentName'],
+			description: map['Description'],
+			logoUrl: map['LogoUrl'],
+			countryCode: map['CountryCode'],
+			countryName: map['CountryName'],
+			provinceCode: map['ProvinceCode'],
+			provinceName: map['ProvinceName'],
+			cityCode: map['CityCode'],
+			cityName: map['CityName'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(code != null)
+			map['Code'] = code;
+		if(name != null)
+			map['Name'] = name;
+		if(departmentCode != null)
+			map['DepartmentCode'] = departmentCode;
+		if(departmentName != null)
+			map['DepartmentName'] = departmentName;
+		if(description != null)
+			map['Description'] = description;
+		if(logoUrl != null)
+			map['LogoUrl'] = logoUrl;
+		if(countryCode != null)
+			map['CountryCode'] = countryCode;
+		if(countryName != null)
+			map['CountryName'] = countryName;
+		if(provinceCode != null)
+			map['ProvinceCode'] = provinceCode;
+		if(provinceName != null)
+			map['ProvinceName'] = provinceName;
+		if(cityCode != null)
+			map['CityCode'] = cityCode;
+		if(cityName != null)
+			map['CityName'] = cityName;
+		return map;
+	}
+}
+
+class ICollection<T> {
+	int count;
+	bool isReadOnly;
+
+	ICollection({
+		this.count = 0,
+		this.isReadOnly = false,
+	});
+
+	factory ICollection.fromJson(Map<String, dynamic> map) {
+		return ICollection( 
+			count: map['Count'],
+			isReadOnly: map['IsReadOnly'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		map['Count'] = count;
+		map['IsReadOnly'] = isReadOnly;
+		return map;
+	}
+}
+
+class ReportConclusionView {
+	String? reportId;
+	String? diseaseName;
+	DiseaseConclusion diseaseConclusion;
+
+	ReportConclusionView({
+		this.reportId,
+		this.diseaseName,
+		this.diseaseConclusion = DiseaseConclusion.NoConclusion,
+	});
+
+	factory ReportConclusionView.fromJson(Map<String, dynamic> map) {
+		return ReportConclusionView( 
+			reportId: map['ReportId'],
+			diseaseName: map['DiseaseName'],
+			diseaseConclusion: DiseaseConclusion.values.firstWhere((e) => e.index == map['DiseaseConclusion']),
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(reportId != null)
+			map['ReportId'] = reportId;
+		if(diseaseName != null)
+			map['DiseaseName'] = diseaseName;
+		map['DiseaseConclusion'] = diseaseConclusion.index;
+		return map;
+	}
+}
+
+class LiveConsultationDTO extends BaseDTO{
+	String? code;
+	UserView? doctorInfo;
+	UserView? expertInfo;
+	PatientView? patientInfo;
+	OrganizationView? primaryHosptial;
+	OrganizationView? centralHospital;
+	DeviceView? deviceInfo;
+	String? checkPoint;
+	ConsultationState state;
+	String? consultationNumber;
+	String? queuingNumber;
+	QualityType qualityType;
+	FollowUpVisitStatusEnum followUpVisitStatus;
+	bool isNeedFollowUpVisit;
+	EvaluateGradeEnum evaluateGrade;
+	ICollection<LiveConsultationFileView>? fileInfos;
+	ICollection<ReportConclusionView>? reportConclusionInfos;
+	List<DataItemDTO >? patientDatas;
+	OrganizationPatientTypeEnum patientType;
+	String? scanPosition;
+	String? scanUserCode;
+	String? scanUserName;
+	String? operateUserCode;
+	String? operateUserName;
+	DateTime? consultationTime;
+	DateTime? consultationTimeEnd;
+	TransactionStatusEnum consultationStatus;
+	String? rejectReason;
+	String? location;
+	List<ConsultationMemberDTO >? consultationMembers;
+	String? description;
+	List<ConsultationReminderDTO >? consultationReminders;
+	String? approverCode;
+	ConsultationReportMode reportMode;
+	String? diseases;
+	String? primaryDiagnosis;
+	String? initiatorCode;
+	bool isEmergency;
+	String? emergencyCode;
+
+	LiveConsultationDTO({
+		this.code,
+		this.doctorInfo,
+		this.expertInfo,
+		this.patientInfo,
+		this.primaryHosptial,
+		this.centralHospital,
+		this.deviceInfo,
+		this.checkPoint,
+		this.state = ConsultationState.Unhandled,
+		this.consultationNumber,
+		this.queuingNumber,
+		this.qualityType = QualityType.None,
+		this.followUpVisitStatus = FollowUpVisitStatusEnum.Unknown,
+		this.isNeedFollowUpVisit = false,
+		this.evaluateGrade = EvaluateGradeEnum.UnSet,
+		this.fileInfos,
+		this.reportConclusionInfos,
+		this.patientDatas,
+		this.patientType = OrganizationPatientTypeEnum.Person,
+		this.scanPosition,
+		this.scanUserCode,
+		this.scanUserName,
+		this.operateUserCode,
+		this.operateUserName,
+		this.consultationTime,
+		this.consultationTimeEnd,
+		this.consultationStatus = TransactionStatusEnum.Applied,
+		this.rejectReason,
+		this.location,
+		this.consultationMembers,
+		this.description,
+		this.consultationReminders,
+		this.approverCode,
+		this.reportMode = ConsultationReportMode.ExpertReport,
+		this.diseases,
+		this.primaryDiagnosis,
+		this.initiatorCode,
+		this.isEmergency = false,
+		this.emergencyCode,
+		DateTime? createTime,
+		DateTime? updateTime,
+	}) : super(
+			createTime: createTime,
+			updateTime: updateTime,
+		);
+
+	factory LiveConsultationDTO.fromJson(Map<String, dynamic> map) {
+		return LiveConsultationDTO( 
+			code: map['Code'],
+			doctorInfo: map['DoctorInfo'] != null ? UserView.fromJson(map['DoctorInfo']) : null,
+			expertInfo: map['ExpertInfo'] != null ? UserView.fromJson(map['ExpertInfo']) : null,
+			patientInfo: map['PatientInfo'] != null ? PatientView.fromJson(map['PatientInfo']) : null,
+			primaryHosptial: map['PrimaryHosptial'] != null ? OrganizationView.fromJson(map['PrimaryHosptial']) : null,
+			centralHospital: map['CentralHospital'] != null ? OrganizationView.fromJson(map['CentralHospital']) : null,
+			deviceInfo: map['DeviceInfo'] != null ? DeviceView.fromJson(map['DeviceInfo']) : null,
+			checkPoint: map['CheckPoint'],
+			state: ConsultationState.values.firstWhere((e) => e.index == map['State']),
+			consultationNumber: map['ConsultationNumber'],
+			queuingNumber: map['QueuingNumber'],
+			qualityType: QualityType.values.firstWhere((e) => e.index == map['QualityType']),
+			followUpVisitStatus: FollowUpVisitStatusEnum.values.firstWhere((e) => e.index == map['FollowUpVisitStatus']),
+			isNeedFollowUpVisit: map['IsNeedFollowUpVisit'],
+			evaluateGrade: EvaluateGradeEnum.values.firstWhere((e) => e.index == map['EvaluateGrade']),
+			patientDatas: map['PatientDatas'] != null ? (map['PatientDatas'] as List).map((e)=>DataItemDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			patientType: OrganizationPatientTypeEnum.values.firstWhere((e) => e.index == map['PatientType']),
+			scanPosition: map['ScanPosition'],
+			scanUserCode: map['ScanUserCode'],
+			scanUserName: map['ScanUserName'],
+			operateUserCode: map['OperateUserCode'],
+			operateUserName: map['OperateUserName'],
+			consultationTime: map['ConsultationTime'] != null ? DateTime.parse(map['ConsultationTime']) : null,
+			consultationTimeEnd: map['ConsultationTimeEnd'] != null ? DateTime.parse(map['ConsultationTimeEnd']) : null,
+			consultationStatus: TransactionStatusEnum.values.firstWhere((e) => e.index == map['ConsultationStatus']),
+			rejectReason: map['RejectReason'],
+			location: map['Location'],
+			consultationMembers: map['ConsultationMembers'] != null ? (map['ConsultationMembers'] as List).map((e)=>ConsultationMemberDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			description: map['Description'],
+			consultationReminders: map['ConsultationReminders'] != null ? (map['ConsultationReminders'] as List).map((e)=>ConsultationReminderDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			approverCode: map['ApproverCode'],
+			reportMode: ConsultationReportMode.values.firstWhere((e) => e.index == map['ReportMode']),
+			diseases: map['Diseases'],
+			primaryDiagnosis: map['PrimaryDiagnosis'],
+			initiatorCode: map['InitiatorCode'],
+			isEmergency: map['IsEmergency'],
+			emergencyCode: map['EmergencyCode'],
+			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(doctorInfo != null)
+			map['DoctorInfo'] = doctorInfo;
+		if(expertInfo != null)
+			map['ExpertInfo'] = expertInfo;
+		if(patientInfo != null)
+			map['PatientInfo'] = patientInfo;
+		if(primaryHosptial != null)
+			map['PrimaryHosptial'] = primaryHosptial;
+		if(centralHospital != null)
+			map['CentralHospital'] = centralHospital;
+		if(deviceInfo != null)
+			map['DeviceInfo'] = deviceInfo;
+		if(checkPoint != null)
+			map['CheckPoint'] = checkPoint;
+		map['State'] = state.index;
+		if(consultationNumber != null)
+			map['ConsultationNumber'] = consultationNumber;
+		if(queuingNumber != null)
+			map['QueuingNumber'] = queuingNumber;
+		map['QualityType'] = qualityType.index;
+		map['FollowUpVisitStatus'] = followUpVisitStatus.index;
+		map['IsNeedFollowUpVisit'] = isNeedFollowUpVisit;
+		map['EvaluateGrade'] = evaluateGrade.index;
+		if(fileInfos != null)
+			map['FileInfos'] = fileInfos;
+		if(reportConclusionInfos != null)
+			map['ReportConclusionInfos'] = reportConclusionInfos;
+		if(patientDatas != null)
+			map['PatientDatas'] = patientDatas;
+		map['PatientType'] = patientType.index;
+		if(scanPosition != null)
+			map['ScanPosition'] = scanPosition;
+		if(scanUserCode != null)
+			map['ScanUserCode'] = scanUserCode;
+		if(scanUserName != null)
+			map['ScanUserName'] = scanUserName;
+		if(operateUserCode != null)
+			map['OperateUserCode'] = operateUserCode;
+		if(operateUserName != null)
+			map['OperateUserName'] = operateUserName;
+		if(consultationTime != null)
+			map['ConsultationTime'] = JsonRpcUtils.dateFormat(consultationTime!);
+		if(consultationTimeEnd != null)
+			map['ConsultationTimeEnd'] = JsonRpcUtils.dateFormat(consultationTimeEnd!);
+		map['ConsultationStatus'] = consultationStatus.index;
+		if(rejectReason != null)
+			map['RejectReason'] = rejectReason;
+		if(location != null)
+			map['Location'] = location;
+		if(consultationMembers != null)
+			map['ConsultationMembers'] = consultationMembers;
+		if(description != null)
+			map['Description'] = description;
+		if(consultationReminders != null)
+			map['ConsultationReminders'] = consultationReminders;
+		if(approverCode != null)
+			map['ApproverCode'] = approverCode;
+		map['ReportMode'] = reportMode.index;
+		if(diseases != null)
+			map['Diseases'] = diseases;
+		if(primaryDiagnosis != null)
+			map['PrimaryDiagnosis'] = primaryDiagnosis;
+		if(initiatorCode != null)
+			map['InitiatorCode'] = initiatorCode;
+		map['IsEmergency'] = isEmergency;
+		if(emergencyCode != null)
+			map['EmergencyCode'] = emergencyCode;
+		return map;
+	}
+}
+
+class TeacherView extends UserView{
+	String? introduction;
+	List<int>? smallAvatar;
+
+	TeacherView({
+		this.introduction,
+		this.smallAvatar,
+		String? code,
+		String? name,
+		String? organizationCode,
+		String? organizationName,
+	}) : super(
+			code: code,
+			name: name,
+			organizationCode: organizationCode,
+			organizationName: organizationName,
+		);
+
+	factory TeacherView.fromJson(Map<String, dynamic> map) {
+		final smallAvatarData = map['SmallAvatar'];
+		return TeacherView( 
+			introduction: map['Introduction'],
+			smallAvatar: smallAvatarData != null ? (smallAvatarData as List).map((e) => e as int).toList(): null,
+			code: map['Code'],
+			name: map['Name'],
+			organizationCode: map['OrganizationCode'],
+			organizationName: map['OrganizationName'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(introduction != null)
+			map['Introduction'] = introduction;
+		if(smallAvatar != null)
+			map['SmallAvatar'] = smallAvatar;
+		return map;
+	}
+}
+
+class AudienceView extends UserView{
+	int totalMinutes;
+	List<GroupView >? groupInfos;
+
+	AudienceView({
+		this.totalMinutes = 0,
+		this.groupInfos,
+		String? code,
+		String? name,
+		String? organizationCode,
+		String? organizationName,
+	}) : super(
+			code: code,
+			name: name,
+			organizationCode: organizationCode,
+			organizationName: organizationName,
+		);
+
+	factory AudienceView.fromJson(Map<String, dynamic> map) {
+		return AudienceView( 
+			totalMinutes: map['TotalMinutes'],
+			groupInfos: map['GroupInfos'] != null ? (map['GroupInfos'] as List).map((e)=>GroupView.fromJson(e as Map<String,dynamic>)).toList() : null,
+			code: map['Code'],
+			name: map['Name'],
+			organizationCode: map['OrganizationCode'],
+			organizationName: map['OrganizationName'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		map['TotalMinutes'] = totalMinutes;
+		if(groupInfos != null)
+			map['GroupInfos'] = groupInfos;
+		return map;
+	}
+}
+
+class OnlineVideoDTO {
+	String? code;
+	String? name;
+	String? creatorCode;
+	String? creatorName;
+	UploadFileTypeEnum fodderType;
+	bool isPublic;
+	CourseViewRangeEnum viewRange;
+	String? videoToken;
+	String? vodFileId;
+	String? poster;
+	int duration;
+	double videoSize;
+	int playCount;
+	String? srcFileToken;
+
+	OnlineVideoDTO({
+		this.code,
+		this.name,
+		this.creatorCode,
+		this.creatorName,
+		this.fodderType = UploadFileTypeEnum.Unknown,
+		this.isPublic = false,
+		this.viewRange = CourseViewRangeEnum.All,
+		this.videoToken,
+		this.vodFileId,
+		this.poster,
+		this.duration = 0,
+		this.videoSize = 0,
+		this.playCount = 0,
+		this.srcFileToken,
+	});
+
+	factory OnlineVideoDTO.fromJson(Map<String, dynamic> map) {
+		return OnlineVideoDTO( 
+			code: map['Code'],
+			name: map['Name'],
+			creatorCode: map['CreatorCode'],
+			creatorName: map['CreatorName'],
+			fodderType: UploadFileTypeEnum.values.firstWhere((e) => e.index == map['FodderType']),
+			isPublic: map['IsPublic'],
+			viewRange: CourseViewRangeEnum.values.firstWhere((e) => e.index == map['ViewRange']),
+			videoToken: map['VideoToken'],
+			vodFileId: map['VodFileId'],
+			poster: map['Poster'],
+			duration: map['Duration'],
+			videoSize: double.parse(map['VideoSize'].toString()),
+			playCount: map['PlayCount'],
+			srcFileToken: map['SrcFileToken'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(code != null)
+			map['Code'] = code;
+		if(name != null)
+			map['Name'] = name;
+		if(creatorCode != null)
+			map['CreatorCode'] = creatorCode;
+		if(creatorName != null)
+			map['CreatorName'] = creatorName;
+		map['FodderType'] = fodderType.index;
+		map['IsPublic'] = isPublic;
+		map['ViewRange'] = viewRange.index;
+		if(videoToken != null)
+			map['VideoToken'] = videoToken;
+		if(vodFileId != null)
+			map['VodFileId'] = vodFileId;
+		if(poster != null)
+			map['Poster'] = poster;
+		map['Duration'] = duration;
+		map['VideoSize'] = videoSize;
+		map['PlayCount'] = playCount;
+		if(srcFileToken != null)
+			map['SrcFileToken'] = srcFileToken;
+		return map;
+	}
+}
+
+class OnlineTrainingDTO extends BaseDTO{
+	String? code;
+	String? name;
+	String? information;
+	double price;
+	CourseStatusEnum state;
+	CourseViewRangeEnum viewRange;
+	CourseAudienceTypeEnum audienceType;
+	DateTime? starTime;
+	int duration;
+	DateTime? deadline;
+	ApplyStateEnum applyState;
+	String? poster;
+	TeacherView? teacher;
+	ICollection<StudentView>? students;
+	String? conversationId;
+	ICollection<ChannelDataView>? channelDatas;
+	AdminView? createAdmin;
+	ICollection<AdminView>? owners;
+	bool teacherState;
+	bool startCourseInAdvance;
+	DateTime? actualStartTime;
+	DateTime? actualEndTime;
+	List<UserView >? assistantInfos;
+	List<UserView >? guestInfos;
+	String? credentialCode;
+	String? courseNotice;
+	List<UserView >? meetingMemberInfos;
+	CourseAvailabilityEnum availability;
+	List<UserView >? authorizedUserInfos;
+	List<GroupView >? authorizedGroupInfos;
+	List<AudienceView >? audienceInfos;
+	List<CaseLabelView >? caseLabelInfos;
+	String? coursewareToken;
+	CourseTypeEnum courseType;
+	ICollection<StudentView>? experts;
+	List<CustomerLabelView >? courseLabelInfos;
+	bool isAgentCourse;
+	bool isStick;
+	int sort;
+	List<OnlineVideoDTO >? courseVideoInfos;
+	CourseAppearTypeEnum courseAppearType;
+	List<CourseAlbumView >? courseAlbumInfos;
+	int playCount;
+
+	OnlineTrainingDTO({
+		this.code,
+		this.name,
+		this.information,
+		this.price = 0,
+		this.state = CourseStatusEnum.Unknown,
+		this.viewRange = CourseViewRangeEnum.All,
+		this.audienceType = CourseAudienceTypeEnum.Unknown,
+		this.starTime,
+		this.duration = 0,
+		this.deadline,
+		this.applyState = ApplyStateEnum.NotApply,
+		this.poster,
+		this.teacher,
+		this.students,
+		this.conversationId,
+		this.channelDatas,
+		this.createAdmin,
+		this.owners,
+		this.teacherState = false,
+		this.startCourseInAdvance = false,
+		this.actualStartTime,
+		this.actualEndTime,
+		this.assistantInfos,
+		this.guestInfos,
+		this.credentialCode,
+		this.courseNotice,
+		this.meetingMemberInfos,
+		this.availability = CourseAvailabilityEnum.Public,
+		this.authorizedUserInfos,
+		this.authorizedGroupInfos,
+		this.audienceInfos,
+		this.caseLabelInfos,
+		this.coursewareToken,
+		this.courseType = CourseTypeEnum.Unknown,
+		this.experts,
+		this.courseLabelInfos,
+		this.isAgentCourse = false,
+		this.isStick = false,
+		this.sort = 0,
+		this.courseVideoInfos,
+		this.courseAppearType = CourseAppearTypeEnum.Unknown,
+		this.courseAlbumInfos,
+		this.playCount = 0,
+		DateTime? createTime,
+		DateTime? updateTime,
+	}) : super(
+			createTime: createTime,
+			updateTime: updateTime,
+		);
+
+	factory OnlineTrainingDTO.fromJson(Map<String, dynamic> map) {
+		return OnlineTrainingDTO( 
+			code: map['Code'],
+			name: map['Name'],
+			information: map['Information'],
+			price: double.parse(map['Price'].toString()),
+			state: CourseStatusEnum.values.firstWhere((e) => e.index == map['State']),
+			viewRange: CourseViewRangeEnum.values.firstWhere((e) => e.index == map['ViewRange']),
+			audienceType: CourseAudienceTypeEnum.values.firstWhere((e) => e.index == map['AudienceType']),
+			starTime: map['StarTime'] != null ? DateTime.parse(map['StarTime']) : null,
+			duration: map['Duration'],
+			deadline: map['Deadline'] != null ? DateTime.parse(map['Deadline']) : null,
+			applyState: ApplyStateEnum.values.firstWhere((e) => e.index == map['ApplyState']),
+			poster: map['Poster'],
+			teacher: map['Teacher'] != null ? TeacherView.fromJson(map['Teacher']) : null,
+			conversationId: map['ConversationId'],
+			createAdmin: map['CreateAdmin'] != null ? AdminView.fromJson(map['CreateAdmin']) : null,
+			teacherState: map['TeacherState'],
+			startCourseInAdvance: map['StartCourseInAdvance'],
+			actualStartTime: map['ActualStartTime'] != null ? DateTime.parse(map['ActualStartTime']) : null,
+			actualEndTime: map['ActualEndTime'] != null ? DateTime.parse(map['ActualEndTime']) : null,
+			assistantInfos: map['AssistantInfos'] != null ? (map['AssistantInfos'] as List).map((e)=>UserView.fromJson(e as Map<String,dynamic>)).toList() : null,
+			guestInfos: map['GuestInfos'] != null ? (map['GuestInfos'] as List).map((e)=>UserView.fromJson(e as Map<String,dynamic>)).toList() : null,
+			credentialCode: map['CredentialCode'],
+			courseNotice: map['CourseNotice'],
+			meetingMemberInfos: map['MeetingMemberInfos'] != null ? (map['MeetingMemberInfos'] as List).map((e)=>UserView.fromJson(e as Map<String,dynamic>)).toList() : null,
+			availability: CourseAvailabilityEnum.values.firstWhere((e) => e.index == map['Availability']),
+			authorizedUserInfos: map['AuthorizedUserInfos'] != null ? (map['AuthorizedUserInfos'] as List).map((e)=>UserView.fromJson(e as Map<String,dynamic>)).toList() : null,
+			authorizedGroupInfos: map['AuthorizedGroupInfos'] != null ? (map['AuthorizedGroupInfos'] as List).map((e)=>GroupView.fromJson(e as Map<String,dynamic>)).toList() : null,
+			audienceInfos: map['AudienceInfos'] != null ? (map['AudienceInfos'] as List).map((e)=>AudienceView.fromJson(e as Map<String,dynamic>)).toList() : null,
+			caseLabelInfos: map['CaseLabelInfos'] != null ? (map['CaseLabelInfos'] as List).map((e)=>CaseLabelView.fromJson(e as Map<String,dynamic>)).toList() : null,
+			coursewareToken: map['CoursewareToken'],
+			courseType: CourseTypeEnum.values.firstWhere((e) => e.index == map['CourseType']),
+			courseLabelInfos: map['CourseLabelInfos'] != null ? (map['CourseLabelInfos'] as List).map((e)=>CustomerLabelView.fromJson(e as Map<String,dynamic>)).toList() : null,
+			isAgentCourse: map['IsAgentCourse'],
+			isStick: map['IsStick'],
+			sort: map['Sort'],
+			courseVideoInfos: map['CourseVideoInfos'] != null ? (map['CourseVideoInfos'] as List).map((e)=>OnlineVideoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			courseAppearType: CourseAppearTypeEnum.values.firstWhere((e) => e.index == map['CourseAppearType']),
+			courseAlbumInfos: map['CourseAlbumInfos'] != null ? (map['CourseAlbumInfos'] as List).map((e)=>CourseAlbumView.fromJson(e as Map<String,dynamic>)).toList() : null,
+			playCount: map['PlayCount'],
+			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(information != null)
+			map['Information'] = information;
+		map['Price'] = price;
+		map['State'] = state.index;
+		map['ViewRange'] = viewRange.index;
+		map['AudienceType'] = audienceType.index;
+		if(starTime != null)
+			map['StarTime'] = JsonRpcUtils.dateFormat(starTime!);
+		map['Duration'] = duration;
+		if(deadline != null)
+			map['Deadline'] = JsonRpcUtils.dateFormat(deadline!);
+		map['ApplyState'] = applyState.index;
+		if(poster != null)
+			map['Poster'] = poster;
+		if(teacher != null)
+			map['Teacher'] = teacher;
+		if(students != null)
+			map['Students'] = students;
+		if(conversationId != null)
+			map['ConversationId'] = conversationId;
+		if(channelDatas != null)
+			map['ChannelDatas'] = channelDatas;
+		if(createAdmin != null)
+			map['CreateAdmin'] = createAdmin;
+		if(owners != null)
+			map['Owners'] = owners;
+		map['TeacherState'] = teacherState;
+		map['StartCourseInAdvance'] = startCourseInAdvance;
+		if(actualStartTime != null)
+			map['ActualStartTime'] = JsonRpcUtils.dateFormat(actualStartTime!);
+		if(actualEndTime != null)
+			map['ActualEndTime'] = JsonRpcUtils.dateFormat(actualEndTime!);
+		if(assistantInfos != null)
+			map['AssistantInfos'] = assistantInfos;
+		if(guestInfos != null)
+			map['GuestInfos'] = guestInfos;
+		if(credentialCode != null)
+			map['CredentialCode'] = credentialCode;
+		if(courseNotice != null)
+			map['CourseNotice'] = courseNotice;
+		if(meetingMemberInfos != null)
+			map['MeetingMemberInfos'] = meetingMemberInfos;
+		map['Availability'] = availability.index;
+		if(authorizedUserInfos != null)
+			map['AuthorizedUserInfos'] = authorizedUserInfos;
+		if(authorizedGroupInfos != null)
+			map['AuthorizedGroupInfos'] = authorizedGroupInfos;
+		if(audienceInfos != null)
+			map['AudienceInfos'] = audienceInfos;
+		if(caseLabelInfos != null)
+			map['CaseLabelInfos'] = caseLabelInfos;
+		if(coursewareToken != null)
+			map['CoursewareToken'] = coursewareToken;
+		map['CourseType'] = courseType.index;
+		if(experts != null)
+			map['Experts'] = experts;
+		if(courseLabelInfos != null)
+			map['CourseLabelInfos'] = courseLabelInfos;
+		map['IsAgentCourse'] = isAgentCourse;
+		map['IsStick'] = isStick;
+		map['Sort'] = sort;
+		if(courseVideoInfos != null)
+			map['CourseVideoInfos'] = courseVideoInfos;
+		map['CourseAppearType'] = courseAppearType.index;
+		if(courseAlbumInfos != null)
+			map['CourseAlbumInfos'] = courseAlbumInfos;
+		map['PlayCount'] = playCount;
+		return map;
+	}
+}
+
+class QualifiedView {
+	QualifiedState qualifiedState;
+	QualityType qualityType;
+
+	QualifiedView({
+		this.qualifiedState = QualifiedState.UnSet,
+		this.qualityType = QualityType.None,
+	});
+
+	factory QualifiedView.fromJson(Map<String, dynamic> map) {
+		return QualifiedView( 
+			qualifiedState: QualifiedState.values.firstWhere((e) => e.index == map['QualifiedState']),
+			qualityType: QualityType.values.firstWhere((e) => e.index == map['QualityType']),
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		map['QualifiedState'] = qualifiedState.index;
+		map['QualityType'] = qualityType.index;
+		return map;
+	}
+}
+
+class ScreenshotView {
+	String? createUserCode;
+	String? createUserName;
+	String? prelDiagnosis;
+	String? examDoctor;
+
+	ScreenshotView({
+		this.createUserCode,
+		this.createUserName,
+		this.prelDiagnosis,
+		this.examDoctor,
+	});
+
+	factory ScreenshotView.fromJson(Map<String, dynamic> map) {
+		return ScreenshotView( 
+			createUserCode: map['CreateUserCode'],
+			createUserName: map['CreateUserName'],
+			prelDiagnosis: map['PrelDiagnosis'],
+			examDoctor: map['ExamDoctor'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(createUserCode != null)
+			map['CreateUserCode'] = createUserCode;
+		if(createUserName != null)
+			map['CreateUserName'] = createUserName;
+		if(prelDiagnosis != null)
+			map['PrelDiagnosis'] = prelDiagnosis;
+		if(examDoctor != null)
+			map['ExamDoctor'] = examDoctor;
+		return map;
+	}
+}
+
+class RemoteDiagnosisDTO extends BaseDTO{
+	String? code;
+	String? examId;
+	OrganizationView? organizationInfo;
+	DeviceView? deviceInfo;
+	PatientView? patientInfo;
+	ScreenshotView? screenshotInfo;
+	QualifiedView? qualifiedInfo;
+	List<DiagnosisView >? diagnosisInfos;
+	List<String >? shareUserCodes;
+	String? customDoctor;
+	String? customOrganzation;
+	String? equipmentSN;
+	List<RemoteDiagnosisFileView >? fileInfos;
+	RecordStatusEnum recordStatus;
+	String? creatorCode;
+	String? tags;
+	RecordCreateTypeEnum createType;
+	List<DataItemDTO >? patientDataInfo;
+	List<PatientInfoExt >? patientInfoExtList;
+	String? patientType;
+	List<String >? readUsers;
+	List<String >? associatedExamCodes;
+
+	RemoteDiagnosisDTO({
+		this.code,
+		this.examId,
+		this.organizationInfo,
+		this.deviceInfo,
+		this.patientInfo,
+		this.screenshotInfo,
+		this.qualifiedInfo,
+		this.diagnosisInfos,
+		this.shareUserCodes,
+		this.customDoctor,
+		this.customOrganzation,
+		this.equipmentSN,
+		this.fileInfos,
+		this.recordStatus = RecordStatusEnum.NotScanned,
+		this.creatorCode,
+		this.tags,
+		this.createType = RecordCreateTypeEnum.Reservation,
+		this.patientDataInfo,
+		this.patientInfoExtList,
+		this.patientType,
+		this.readUsers,
+		this.associatedExamCodes,
+		DateTime? createTime,
+		DateTime? updateTime,
+	}) : super(
+			createTime: createTime,
+			updateTime: updateTime,
+		);
+
+	factory RemoteDiagnosisDTO.fromJson(Map<String, dynamic> map) {
+		return RemoteDiagnosisDTO( 
+			code: map['Code'],
+			examId: map['ExamId'],
+			organizationInfo: map['OrganizationInfo'] != null ? OrganizationView.fromJson(map['OrganizationInfo']) : null,
+			deviceInfo: map['DeviceInfo'] != null ? DeviceView.fromJson(map['DeviceInfo']) : null,
+			patientInfo: map['PatientInfo'] != null ? PatientView.fromJson(map['PatientInfo']) : null,
+			screenshotInfo: map['ScreenshotInfo'] != null ? ScreenshotView.fromJson(map['ScreenshotInfo']) : null,
+			qualifiedInfo: map['QualifiedInfo'] != null ? QualifiedView.fromJson(map['QualifiedInfo']) : null,
+			diagnosisInfos: map['DiagnosisInfos'] != null ? (map['DiagnosisInfos'] as List).map((e)=>DiagnosisView.fromJson(e as Map<String,dynamic>)).toList() : null,
+			shareUserCodes: map['ShareUserCodes'] != null ? map['ShareUserCodes'].cast<String>().toList() : null,
+			customDoctor: map['CustomDoctor'],
+			customOrganzation: map['CustomOrganzation'],
+			equipmentSN: map['EquipmentSN'],
+			fileInfos: map['FileInfos'] != null ? (map['FileInfos'] as List).map((e)=>RemoteDiagnosisFileView.fromJson(e as Map<String,dynamic>)).toList() : null,
+			recordStatus: RecordStatusEnum.values.firstWhere((e) => e.index == map['RecordStatus']),
+			creatorCode: map['CreatorCode'],
+			tags: map['Tags'],
+			createType: RecordCreateTypeEnum.values.firstWhere((e) => e.index == map['CreateType']),
+			patientDataInfo: map['PatientDataInfo'] != null ? (map['PatientDataInfo'] as List).map((e)=>DataItemDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			patientInfoExtList: map['PatientInfoExtList'] != null ? (map['PatientInfoExtList'] as List).map((e)=>PatientInfoExt.fromJson(e as Map<String,dynamic>)).toList() : null,
+			patientType: map['PatientType'],
+			readUsers: map['ReadUsers'] != null ? map['ReadUsers'].cast<String>().toList() : null,
+			associatedExamCodes: map['AssociatedExamCodes'] != null ? map['AssociatedExamCodes'].cast<String>().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(code != null)
+			map['Code'] = code;
+		if(examId != null)
+			map['ExamId'] = examId;
+		if(organizationInfo != null)
+			map['OrganizationInfo'] = organizationInfo;
+		if(deviceInfo != null)
+			map['DeviceInfo'] = deviceInfo;
+		if(patientInfo != null)
+			map['PatientInfo'] = patientInfo;
+		if(screenshotInfo != null)
+			map['ScreenshotInfo'] = screenshotInfo;
+		if(qualifiedInfo != null)
+			map['QualifiedInfo'] = qualifiedInfo;
+		if(diagnosisInfos != null)
+			map['DiagnosisInfos'] = diagnosisInfos;
+		if(shareUserCodes != null)
+			map['ShareUserCodes'] = shareUserCodes;
+		if(customDoctor != null)
+			map['CustomDoctor'] = customDoctor;
+		if(customOrganzation != null)
+			map['CustomOrganzation'] = customOrganzation;
+		if(equipmentSN != null)
+			map['EquipmentSN'] = equipmentSN;
+		if(fileInfos != null)
+			map['FileInfos'] = fileInfos;
+		map['RecordStatus'] = recordStatus.index;
+		if(creatorCode != null)
+			map['CreatorCode'] = creatorCode;
+		if(tags != null)
+			map['Tags'] = tags;
+		map['CreateType'] = createType.index;
+		if(patientDataInfo != null)
+			map['PatientDataInfo'] = patientDataInfo;
+		if(patientInfoExtList != null)
+			map['PatientInfoExtList'] = patientInfoExtList;
+		if(patientType != null)
+			map['PatientType'] = patientType;
+		if(readUsers != null)
+			map['ReadUsers'] = readUsers;
+		if(associatedExamCodes != null)
+			map['AssociatedExamCodes'] = associatedExamCodes;
+		return map;
+	}
+}
+
+class CourseAlbumDTO extends BaseCourseAlbumDTO{
+	String? cover;
+	List<String >? courseCodes;
+	String? introduction;
+	List<String >? courseLabelCodes;
+	String? teacherCode;
+	String? teacherName;
+	CourseViewRangeEnum viewRange;
+	double price;
+	DateTime? createTime;
+	int sort;
+	bool isStick;
+
+	CourseAlbumDTO({
+		this.cover,
+		this.courseCodes,
+		this.introduction,
+		this.courseLabelCodes,
+		this.teacherCode,
+		this.teacherName,
+		this.viewRange = CourseViewRangeEnum.All,
+		this.price = 0,
+		this.createTime,
+		this.sort = 0,
+		this.isStick = false,
+		String? code,
+		String? name,
+	}) : super(
+			code: code,
+			name: name,
+		);
+
+	factory CourseAlbumDTO.fromJson(Map<String, dynamic> map) {
+		return CourseAlbumDTO( 
+			cover: map['Cover'],
+			courseCodes: map['CourseCodes'] != null ? map['CourseCodes'].cast<String>().toList() : null,
+			introduction: map['Introduction'],
+			courseLabelCodes: map['CourseLabelCodes'] != null ? map['CourseLabelCodes'].cast<String>().toList() : null,
+			teacherCode: map['TeacherCode'],
+			teacherName: map['TeacherName'],
+			viewRange: CourseViewRangeEnum.values.firstWhere((e) => e.index == map['ViewRange']),
+			price: double.parse(map['Price'].toString()),
+			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
+			sort: map['Sort'],
+			isStick: map['IsStick'],
+			code: map['Code'],
+			name: map['Name'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(cover != null)
+			map['Cover'] = cover;
+		if(courseCodes != null)
+			map['CourseCodes'] = courseCodes;
+		if(introduction != null)
+			map['Introduction'] = introduction;
+		if(courseLabelCodes != null)
+			map['CourseLabelCodes'] = courseLabelCodes;
+		if(teacherCode != null)
+			map['TeacherCode'] = teacherCode;
+		if(teacherName != null)
+			map['TeacherName'] = teacherName;
+		map['ViewRange'] = viewRange.index;
+		map['Price'] = price;
+		if(createTime != null)
+			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
+		map['Sort'] = sort;
+		map['IsStick'] = isStick;
+		return map;
+	}
+}
+
+class CourseAlbumDetailDTO extends CourseAlbumDTO{
+	List<CourseInfoDetailDTO >? courseInfos;
+	int studentCount;
+
+	CourseAlbumDetailDTO({
+		this.courseInfos,
+		this.studentCount = 0,
+		String? cover,
+		List<String >? courseCodes,
+		String? introduction,
+		List<String >? courseLabelCodes,
+		String? teacherCode,
+		String? teacherName,
+		CourseViewRangeEnum viewRange = CourseViewRangeEnum.All,
+		double price = 0,
+		DateTime? createTime,
+		int sort = 0,
+		bool isStick = false,
+		String? code,
+		String? name,
+	}) : super(
+			cover: cover,
+			courseCodes: courseCodes,
+			introduction: introduction,
+			courseLabelCodes: courseLabelCodes,
+			teacherCode: teacherCode,
+			teacherName: teacherName,
+			viewRange: viewRange,
+			price: price,
+			createTime: createTime,
+			sort: sort,
+			isStick: isStick,
+			code: code,
+			name: name,
+		);
+
+	factory CourseAlbumDetailDTO.fromJson(Map<String, dynamic> map) {
+		return CourseAlbumDetailDTO( 
+			courseInfos: map['CourseInfos'] != null ? (map['CourseInfos'] as List).map((e)=>CourseInfoDetailDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			studentCount: map['StudentCount'],
+			cover: map['Cover'],
+			courseCodes: map['CourseCodes'] != null ? map['CourseCodes'].cast<String>().toList() : null,
+			introduction: map['Introduction'],
+			courseLabelCodes: map['CourseLabelCodes'] != null ? map['CourseLabelCodes'].cast<String>().toList() : null,
+			teacherCode: map['TeacherCode'],
+			teacherName: map['TeacherName'],
+			viewRange: CourseViewRangeEnum.values.firstWhere((e) => e.index == map['ViewRange']),
+			price: double.parse(map['Price'].toString()),
+			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
+			sort: map['Sort'],
+			isStick: map['IsStick'],
+			code: map['Code'],
+			name: map['Name'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(courseInfos != null)
+			map['CourseInfos'] = courseInfos;
+		map['StudentCount'] = studentCount;
+		return map;
+	}
+}
+
 class BaseCoursePageDTO {
 	String? code;
 	String? name;

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio