Browse Source

更新接口

loki.wu 1 năm trước cách đây
mục cha
commit
d0643f0a9a

+ 13 - 0
lib/services/aIDiagnosis.dart

@@ -22,6 +22,7 @@ class AIDiagnosisService extends JsonRpcClientBase {
 				) {
 		/// 注册响应实体反序列化处理器
 		FJsonConvert.setDecoder((map) => DiagnosisImageResult.fromJson(map));
+		FJsonConvert.setDecoder((map) => CarotidResultDTO.fromJson(map));
 		FJsonConvert.setDecoder((map) => DiagnosisReportResult.fromJson(map));
 		FJsonConvert.setDecoder((map) => GetDiagnosisConclusionResult.fromJson(map));
 		FJsonConvert.setDecoder((map) => GetDiagnosisEnumItemsResult.fromJson(map));
@@ -43,6 +44,18 @@ class AIDiagnosisService extends JsonRpcClientBase {
 		return result;
 	}
 
+	Future<DiagnosisImageResult> getDiagnosisImageResultByAIResultAsync(GetDiagnosisImageResultByAIResultRequest request) async {
+		var rpcRst = await call("GetDiagnosisImageResultByAIResultAsync", request);
+		var result = DiagnosisImageResult.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<CarotidResultDTO> getCarotidResultAsync(GetCarotidResultRequest request) async {
+		var rpcRst = await call("GetCarotidResultAsync", request);
+		var result = CarotidResultDTO.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
 	Future<DiagnosisReportResult> diagnosisReportAsync(DiagnosisReportRequest request) async {
 		var rpcRst = await call("DiagnosisReportAsync", request);
 		var result = DiagnosisReportResult.fromJson(rpcRst as Map<String, dynamic>);

+ 92 - 0
lib/services/aIDiagnosis.m.dart

@@ -1,5 +1,7 @@
 import 'liveConsultation.m.dart';
 
+import 'package:fis_jsonrpc/utils.dart';
+
 class AIDiagnosisRect {
 	int right;
 	int bottom;
@@ -284,6 +286,96 @@ class DiagnosisImageRequest extends TokenRequest{
 	}
 }
 
+class GetDiagnosisImageResultByAIResultRequest {
+	String? fileUrl;
+	String? relationCode;
+	DateTime? createTime;
+	DateTime? updateTime;
+	String? aiResult;
+
+	GetDiagnosisImageResultByAIResultRequest({
+		this.fileUrl,
+		this.relationCode,
+		this.createTime,
+		this.updateTime,
+		this.aiResult,
+	});
+
+	factory GetDiagnosisImageResultByAIResultRequest.fromJson(Map<String, dynamic> map) {
+		return GetDiagnosisImageResultByAIResultRequest( 
+			fileUrl: map['FileUrl'],
+			relationCode: map['RelationCode'],
+			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
+			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
+			aiResult: map['AiResult'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(fileUrl != null)
+			map['FileUrl'] = fileUrl;
+		if(relationCode != null)
+			map['RelationCode'] = relationCode;
+		if(createTime != null)
+			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
+		if(updateTime != null)
+			map['UpdateTime'] = JsonRpcUtils.dateFormat(updateTime!);
+		if(aiResult != null)
+			map['AiResult'] = aiResult;
+		return map;
+	}
+}
+
+class GetCarotidResultRequest {
+	String? remedicalCode;
+	String? surfaceToken;
+	String? mdlToken;
+	CarotidScanTypeEnum carotidScanType;
+	CarotidScanDirectionEnum carotidScanDirection;
+	List<MeasureImageFileDTO >? measureImageFiles;
+	String? measureResult;
+
+	GetCarotidResultRequest({
+		this.remedicalCode,
+		this.surfaceToken,
+		this.mdlToken,
+		this.carotidScanType = CarotidScanTypeEnum.CarotidLeft,
+		this.carotidScanDirection = CarotidScanDirectionEnum.TopToBottom,
+		this.measureImageFiles,
+		this.measureResult,
+	});
+
+	factory GetCarotidResultRequest.fromJson(Map<String, dynamic> map) {
+		return GetCarotidResultRequest( 
+			remedicalCode: map['RemedicalCode'],
+			surfaceToken: map['SurfaceToken'],
+			mdlToken: map['MdlToken'],
+			carotidScanType: CarotidScanTypeEnum.values.firstWhere((e) => e.index == map['CarotidScanType']),
+			carotidScanDirection: CarotidScanDirectionEnum.values.firstWhere((e) => e.index == map['CarotidScanDirection']),
+			measureImageFiles: map['MeasureImageFiles'] != null ? (map['MeasureImageFiles'] as List).map((e)=>MeasureImageFileDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			measureResult: map['MeasureResult'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(remedicalCode != null)
+			map['RemedicalCode'] = remedicalCode;
+		if(surfaceToken != null)
+			map['SurfaceToken'] = surfaceToken;
+		if(mdlToken != null)
+			map['MdlToken'] = mdlToken;
+		map['CarotidScanType'] = carotidScanType.index;
+		map['CarotidScanDirection'] = carotidScanDirection.index;
+		if(measureImageFiles != null)
+			map['MeasureImageFiles'] = measureImageFiles;
+		if(measureResult != null)
+			map['MeasureResult'] = measureResult;
+		return map;
+	}
+}
+
 class DiagnosisPerImageDTO extends AIDiagnosisPerImageDTO{
 	String? remedicalCode;
 	RemedicalFileDataTypeEnum dataType;

+ 1 - 1
lib/services/authentication.m.dart

@@ -4261,7 +4261,7 @@ enum CustomerRpcCode {
 	OperatorNoJoined,
 	RemedicalCodesIsEmpty,
 	MeasureDataIsEmpty,
-	placeHolder_4067,
+	CanNotCollect,
 	placeHolder_4068,
 	placeHolder_4069,
 	placeHolder_4070,

+ 4 - 0
lib/services/device.m.dart

@@ -834,6 +834,7 @@ class DeviceServerSettingResult {
 	bool isSelfRtcService;
 	int remoteControlAskTimeoutSec;
 	String? liveProtocol;
+	TransactionStatusEnum liveProtocolType;
 
 	DeviceServerSettingResult({
 		this.serverConfigList,
@@ -848,6 +849,7 @@ class DeviceServerSettingResult {
 		this.isSelfRtcService = false,
 		this.remoteControlAskTimeoutSec = 0,
 		this.liveProtocol,
+		this.liveProtocolType = TransactionStatusEnum.Applied,
 	});
 
 	factory DeviceServerSettingResult.fromJson(Map<String, dynamic> map) {
@@ -864,6 +866,7 @@ class DeviceServerSettingResult {
 			isSelfRtcService: map['IsSelfRtcService'],
 			remoteControlAskTimeoutSec: map['RemoteControlAskTimeoutSec'],
 			liveProtocol: map['LiveProtocol'],
+			liveProtocolType: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocolType']),
 		);
 	}
 
@@ -884,6 +887,7 @@ class DeviceServerSettingResult {
 		map['RemoteControlAskTimeoutSec'] = remoteControlAskTimeoutSec;
 		if(liveProtocol != null)
 			map['LiveProtocol'] = liveProtocol;
+		map['LiveProtocolType'] = liveProtocolType.index;
 		return map;
 	}
 }

+ 21 - 9
lib/services/education.dart

@@ -23,11 +23,10 @@ class EducationService extends JsonRpcClientBase {
 				) {
 		/// 注册响应实体反序列化处理器
 		FJsonConvert.setDecoder((map) => CourseLabelDTO.fromJson(map));
-		FJsonConvert.setDecoder((map) => PageResult<CourseCommonInfoDTO>.fromJson(map));
-		FJsonConvert.setDecoder((map) => CourseCommonInfoDTO.fromJson(map));
+		FJsonConvert.setDecoder((map) => PageResult<CourseInfoDetailDTO>.fromJson(map));
 		FJsonConvert.setDecoder((map) => CourseInfoDetailDTO.fromJson(map));
-		FJsonConvert.setDecoder((map) => PageResult<MyCoursePageDTO>.fromJson(map));
-		FJsonConvert.setDecoder((map) => MyCoursePageDTO.fromJson(map));
+		FJsonConvert.setDecoder((map) => PageResult<CourseAlbumDTO>.fromJson(map));
+		FJsonConvert.setDecoder((map) => CourseAlbumDTO.fromJson(map));
 		FJsonConvert.setDecoder((map) => PageResult<UserGroupDTO>.fromJson(map));
 		FJsonConvert.setDecoder((map) => UserGroupDTO.fromJson(map));
 		FJsonConvert.setDecoder((map) => PageResult<VideoInfoDTO>.fromJson(map));
@@ -45,6 +44,8 @@ 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) => PageResult<CourseCommonInfoDTO>.fromJson(map));
+		FJsonConvert.setDecoder((map) => CourseCommonInfoDTO.fromJson(map));
 		FJsonConvert.setDecoder((map) => CourseAlbumExtendDTO.fromJson(map));
 		FJsonConvert.setDecoder((map) => BaseCourseAlbumDTO.fromJson(map));
 		FJsonConvert.setDecoder((map) => UserGroupStudentsDTO.fromJson(map));
@@ -63,9 +64,9 @@ class EducationService extends JsonRpcClientBase {
 		return rpcRst;
 	}
 
-	Future<PageResult<CourseCommonInfoDTO>> findCoursePagesAsync(FindCoursePagesRequest request) async {
+	Future<PageResult<CourseInfoDetailDTO>> findCoursePagesAsync(FindCoursePagesRequest request) async {
 		var rpcRst = await call("FindCoursePagesAsync", request);
-		var result = PageResult<CourseCommonInfoDTO>.fromJson(rpcRst as Map<String, dynamic>);
+		var result = PageResult<CourseInfoDetailDTO>.fromJson(rpcRst as Map<String, dynamic>);
 		return result;
 	}
 
@@ -85,9 +86,15 @@ class EducationService extends JsonRpcClientBase {
 		return result;
 	}
 
-	Future<PageResult<MyCoursePageDTO>> findMyCoursePagesAsync(FindMyCoursePagesRequest request) async {
+	Future<PageResult<CourseInfoDetailDTO>> findMyCoursePagesAsync(FindMyCoursePagesRequest request) async {
 		var rpcRst = await call("FindMyCoursePagesAsync", request);
-		var result = PageResult<MyCoursePageDTO>.fromJson(rpcRst as Map<String, dynamic>);
+		var result = PageResult<CourseInfoDetailDTO>.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<PageResult<CourseAlbumDTO>> findMyAlbumPagesAsync(FindMyCoursePagesRequest request) async {
+		var rpcRst = await call("FindMyAlbumPagesAsync", request);
+		var result = PageResult<CourseAlbumDTO>.fromJson(rpcRst as Map<String, dynamic>);
 		return result;
 	}
 
@@ -134,7 +141,7 @@ class EducationService extends JsonRpcClientBase {
 		return rpcRst;
 	}
 
-	Future<String> signUpCourseAsync(SignUpCourseRequest request) async {
+	Future<bool> signUpCourseAsync(SignUpCourseRequest request) async {
 		var rpcRst = await call("SignUpCourseAsync", request);
 		return rpcRst;
 	}
@@ -340,5 +347,10 @@ class EducationService extends JsonRpcClientBase {
 		return result;
 	}
 
+	Future<bool> sendInteractiveBoardDataAsync(SendLiveInteractiveBoardDataRequest request) async {
+		var rpcRst = await call("SendInteractiveBoardDataAsync", request);
+		return rpcRst;
+	}
+
 }
 

+ 473 - 406
lib/services/education.m.dart

@@ -309,354 +309,15 @@ class ApplyCourseRequest extends TokenRequest{
 	}
 }
 
-class BaseCourseAlbumDTO {
-	String? code;
-	String? name;
-
-	BaseCourseAlbumDTO({
-		this.code,
-		this.name,
-	});
-
-	factory BaseCourseAlbumDTO.fromJson(Map<String, dynamic> map) {
-		return BaseCourseAlbumDTO( 
-			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;
-	}
-}
-
-enum CourseViewRangeEnum {
-	All,
-	Domestic,
-	Overseas,
-}
-
-class BaseUserGroupDTO extends BaseDTO{
-	String? code;
-	String? name;
-	String? shortCode;
-
-	BaseUserGroupDTO({
-		this.code,
-		this.name,
-		this.shortCode,
-		DateTime? createTime,
-		DateTime? updateTime,
-	}) : super(
-			createTime: createTime,
-			updateTime: updateTime,
-		);
-
-	factory BaseUserGroupDTO.fromJson(Map<String, dynamic> map) {
-		return BaseUserGroupDTO( 
-			code: map['Code'],
-			name: map['Name'],
-			shortCode: map['ShortCode'],
-			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(shortCode != null)
-			map['ShortCode'] = shortCode;
-		return map;
-	}
-}
-
-class CourseCommonInfoDTO extends BaseCourseAlbumDTO{
-	String? cover;
-	String? introduction;
-	List<String >? courseLabels;
-	String? teacherCode;
-	String? teacherName;
-	CourseViewRangeEnum viewRange;
-	double price;
-	CourseTypeEnum courseType;
-	List<BaseUserGroupDTO >? userGroupList;
-	List<BaseCourseAlbumDTO >? courseAlbumList;
-
-	CourseCommonInfoDTO({
-		this.cover,
-		this.introduction,
-		this.courseLabels,
-		this.teacherCode,
-		this.teacherName,
-		this.viewRange = CourseViewRangeEnum.All,
-		this.price = 0,
-		this.courseType = CourseTypeEnum.Unknown,
-		this.userGroupList,
-		this.courseAlbumList,
-		String? code,
-		String? name,
-	}) : super(
-			code: code,
-			name: name,
-		);
-
-	factory CourseCommonInfoDTO.fromJson(Map<String, dynamic> map) {
-		return CourseCommonInfoDTO( 
-			cover: map['Cover'],
-			introduction: map['Introduction'],
-			courseLabels: map['CourseLabels'] != null ? map['CourseLabels'].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()),
-			courseType: CourseTypeEnum.values.firstWhere((e) => e.index == map['CourseType']),
-			userGroupList: map['UserGroupList'] != null ? (map['UserGroupList'] as List).map((e)=>BaseUserGroupDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
-			courseAlbumList: map['CourseAlbumList'] != null ? (map['CourseAlbumList'] as List).map((e)=>BaseCourseAlbumDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
-			code: map['Code'],
-			name: map['Name'],
-		);
-	}
-
-	Map<String, dynamic> toJson() {
-		final map = super.toJson();
-		if(cover != null)
-			map['Cover'] = cover;
-		if(introduction != null)
-			map['Introduction'] = introduction;
-		if(courseLabels != null)
-			map['CourseLabels'] = courseLabels;
-		if(teacherCode != null)
-			map['TeacherCode'] = teacherCode;
-		if(teacherName != null)
-			map['TeacherName'] = teacherName;
-		map['ViewRange'] = viewRange.index;
-		map['Price'] = price;
-		map['CourseType'] = courseType.index;
-		if(userGroupList != null)
-			map['UserGroupList'] = userGroupList;
-		if(courseAlbumList != null)
-			map['CourseAlbumList'] = courseAlbumList;
-		return map;
-	}
-}
-
-class FindCoursePagesRequest extends PageRequest{
-	String? keyword;
-	List<String >? courseLabels;
-	DateTime? startTime;
-	DateTime? endTime;
-	String? teacherCode;
-	String? languageCode;
-
-	FindCoursePagesRequest({
-		this.keyword,
-		this.courseLabels,
-		this.startTime,
-		this.endTime,
-		this.teacherCode,
-		this.languageCode,
-		int pageIndex = 0,
-		int pageSize = 0,
-		String? token,
-	}) : super(
-			pageIndex: pageIndex,
-			pageSize: pageSize,
-			token: token,
-		);
-
-	factory FindCoursePagesRequest.fromJson(Map<String, dynamic> map) {
-		return FindCoursePagesRequest( 
-			keyword: map['Keyword'],
-			courseLabels: map['CourseLabels'] != null ? map['CourseLabels'].cast<String>().toList() : null,
-			startTime: map['StartTime'] != null ? DateTime.parse(map['StartTime']) : null,
-			endTime: map['EndTime'] != null ? DateTime.parse(map['EndTime']) : null,
-			teacherCode: map['TeacherCode'],
-			languageCode: map['LanguageCode'],
-			pageIndex: map['PageIndex'],
-			pageSize: map['PageSize'],
-			token: map['Token'],
-		);
-	}
-
-	Map<String, dynamic> toJson() {
-		final map = super.toJson();
-		if(keyword != null)
-			map['Keyword'] = keyword;
-		if(courseLabels != null)
-			map['CourseLabels'] = courseLabels;
-		if(startTime != null)
-			map['StartTime'] = JsonRpcUtils.dateFormat(startTime!);
-		if(endTime != null)
-			map['EndTime'] = JsonRpcUtils.dateFormat(endTime!);
-		if(teacherCode != null)
-			map['TeacherCode'] = teacherCode;
-		if(languageCode != null)
-			map['LanguageCode'] = languageCode;
-		return map;
-	}
-}
-
-class DeleteCourseByCodeRequest extends TokenRequest{
-	String? code;
-
-	DeleteCourseByCodeRequest({
-		this.code,
-		String? token,
-	}) : super(
-			token: token,
-		);
-
-	factory DeleteCourseByCodeRequest.fromJson(Map<String, dynamic> map) {
-		return DeleteCourseByCodeRequest( 
-			code: map['Code'],
-			token: map['Token'],
-		);
-	}
-
-	Map<String, dynamic> toJson() {
-		final map = super.toJson();
-		if(code != null)
-			map['Code'] = code;
-		return map;
-	}
-}
-
-class UpdateCourseRequest extends TokenRequest{
-	String? code;
-	String? name;
-	String? courseIntro;
-	String? teacherCode;
-	String? poster;
-	DateTime? startTime;
-	int duration;
-	CourseTypeEnum courseType;
-	CourseAudienceTypeEnum audienceType;
-	String? coursewareToken;
-	List<String >? caseLabelCodes;
-	List<String >? courseLabelCodes;
-	List<String >? userGroupCodes;
-	double price;
-	List<String >? courseVideoCodes;
-	List<String >? bindExams;
-	List<String >? assistants;
-	List<String >? experts;
-	bool isAgentCourse;
-	List<String >? courseAlbumCodes;
-	CourseAppearTypeEnum courseAppearType;
-	List<String >? courseMaterialCodes;
-
-	UpdateCourseRequest({
-		this.code,
-		this.name,
-		this.courseIntro,
-		this.teacherCode,
-		this.poster,
-		this.startTime,
-		this.duration = 0,
-		this.courseType = CourseTypeEnum.Unknown,
-		this.audienceType = CourseAudienceTypeEnum.Unknown,
-		this.coursewareToken,
-		this.caseLabelCodes,
-		this.courseLabelCodes,
-		this.userGroupCodes,
-		this.price = 0,
-		this.courseVideoCodes,
-		this.bindExams,
-		this.assistants,
-		this.experts,
-		this.isAgentCourse = false,
-		this.courseAlbumCodes,
-		this.courseAppearType = CourseAppearTypeEnum.Unknown,
-		this.courseMaterialCodes,
-		String? token,
-	}) : super(
-			token: token,
-		);
-
-	factory UpdateCourseRequest.fromJson(Map<String, dynamic> map) {
-		return UpdateCourseRequest( 
-			code: map['Code'],
-			name: map['Name'],
-			courseIntro: map['CourseIntro'],
-			teacherCode: map['TeacherCode'],
-			poster: map['Poster'],
-			startTime: map['StartTime'] != null ? DateTime.parse(map['StartTime']) : null,
-			duration: map['Duration'],
-			courseType: CourseTypeEnum.values.firstWhere((e) => e.index == map['CourseType']),
-			audienceType: CourseAudienceTypeEnum.values.firstWhere((e) => e.index == map['AudienceType']),
-			coursewareToken: map['CoursewareToken'],
-			caseLabelCodes: map['CaseLabelCodes'] != null ? map['CaseLabelCodes'].cast<String>().toList() : null,
-			courseLabelCodes: map['CourseLabelCodes'] != null ? map['CourseLabelCodes'].cast<String>().toList() : null,
-			userGroupCodes: map['UserGroupCodes'] != null ? map['UserGroupCodes'].cast<String>().toList() : null,
-			price: double.parse(map['Price'].toString()),
-			courseVideoCodes: map['CourseVideoCodes'] != null ? map['CourseVideoCodes'].cast<String>().toList() : null,
-			bindExams: map['BindExams'] != null ? map['BindExams'].cast<String>().toList() : null,
-			assistants: map['Assistants'] != null ? map['Assistants'].cast<String>().toList() : null,
-			experts: map['Experts'] != null ? map['Experts'].cast<String>().toList() : null,
-			isAgentCourse: map['IsAgentCourse'],
-			courseAlbumCodes: map['CourseAlbumCodes'] != null ? map['CourseAlbumCodes'].cast<String>().toList() : null,
-			courseAppearType: CourseAppearTypeEnum.values.firstWhere((e) => e.index == map['CourseAppearType']),
-			courseMaterialCodes: map['CourseMaterialCodes'] != null ? map['CourseMaterialCodes'].cast<String>().toList() : null,
-			token: map['Token'],
-		);
-	}
-
-	Map<String, dynamic> toJson() {
-		final map = super.toJson();
-		if(code != null)
-			map['Code'] = code;
-		if(name != null)
-			map['Name'] = name;
-		if(courseIntro != null)
-			map['CourseIntro'] = courseIntro;
-		if(teacherCode != null)
-			map['TeacherCode'] = teacherCode;
-		if(poster != null)
-			map['Poster'] = poster;
-		if(startTime != null)
-			map['StartTime'] = JsonRpcUtils.dateFormat(startTime!);
-		map['Duration'] = duration;
-		map['CourseType'] = courseType.index;
-		map['AudienceType'] = audienceType.index;
-		if(coursewareToken != null)
-			map['CoursewareToken'] = coursewareToken;
-		if(caseLabelCodes != null)
-			map['CaseLabelCodes'] = caseLabelCodes;
-		if(courseLabelCodes != null)
-			map['CourseLabelCodes'] = courseLabelCodes;
-		if(userGroupCodes != null)
-			map['UserGroupCodes'] = userGroupCodes;
-		map['Price'] = price;
-		if(courseVideoCodes != null)
-			map['CourseVideoCodes'] = courseVideoCodes;
-		if(bindExams != null)
-			map['BindExams'] = bindExams;
-		if(assistants != null)
-			map['Assistants'] = assistants;
-		if(experts != null)
-			map['Experts'] = experts;
-		map['IsAgentCourse'] = isAgentCourse;
-		if(courseAlbumCodes != null)
-			map['CourseAlbumCodes'] = courseAlbumCodes;
-		map['CourseAppearType'] = courseAppearType.index;
-		if(courseMaterialCodes != null)
-			map['CourseMaterialCodes'] = courseMaterialCodes;
-		return map;
-	}
+enum CourseViewRangeEnum {
+	All,
+	Domestic,
+	Overseas,
 }
 
 enum CourseExaminationTypeEnum {
 	Practice,
-	Release,
+	Exam,
 }
 
 class BaseCourseExaminationDTO {
@@ -1115,6 +776,44 @@ class BaseCourseInfoDTO {
 	}
 }
 
+class BaseUserGroupDTO extends BaseDTO{
+	String? code;
+	String? name;
+	String? shortCode;
+
+	BaseUserGroupDTO({
+		this.code,
+		this.name,
+		this.shortCode,
+		DateTime? createTime,
+		DateTime? updateTime,
+	}) : super(
+			createTime: createTime,
+			updateTime: updateTime,
+		);
+
+	factory BaseUserGroupDTO.fromJson(Map<String, dynamic> map) {
+		return BaseUserGroupDTO( 
+			code: map['Code'],
+			name: map['Name'],
+			shortCode: map['ShortCode'],
+			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(shortCode != null)
+			map['ShortCode'] = shortCode;
+		return map;
+	}
+}
+
 enum UploadFileTypeEnum {
 	Unknown,
 	EXE,
@@ -1226,6 +925,32 @@ class VideoInfoDTO {
 	}
 }
 
+class BaseCourseAlbumDTO {
+	String? code;
+	String? name;
+
+	BaseCourseAlbumDTO({
+		this.code,
+		this.name,
+	});
+
+	factory BaseCourseAlbumDTO.fromJson(Map<String, dynamic> map) {
+		return BaseCourseAlbumDTO( 
+			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 CourseInfoDetailDTO extends BaseCourseInfoDTO{
 	List<StudentInfoDTO >? students;
 	List<BaseLabelInfoDTO >? caseLabels;
@@ -1233,6 +958,7 @@ class CourseInfoDetailDTO extends BaseCourseInfoDTO{
 	List<BaseUserGroupDTO >? userGroups;
 	List<VideoInfoDTO >? courseVideos;
 	List<VideoInfoDTO >? courseMaterials;
+	List<BaseCourseAlbumDTO >? courseAlbums;
 	bool needPay;
 	StudentCourseStatusEnum signCourseStatus;
 	bool isPay;
@@ -1244,6 +970,7 @@ class CourseInfoDetailDTO extends BaseCourseInfoDTO{
 		this.userGroups,
 		this.courseVideos,
 		this.courseMaterials,
+		this.courseAlbums,
 		this.needPay = false,
 		this.signCourseStatus = StudentCourseStatusEnum.All,
 		this.isPay = false,
@@ -1324,6 +1051,7 @@ class CourseInfoDetailDTO extends BaseCourseInfoDTO{
 			userGroups: map['UserGroups'] != null ? (map['UserGroups'] as List).map((e)=>BaseUserGroupDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
 			courseVideos: map['CourseVideos'] != null ? (map['CourseVideos'] as List).map((e)=>VideoInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
 			courseMaterials: map['CourseMaterials'] != null ? (map['CourseMaterials'] as List).map((e)=>VideoInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			courseAlbums: map['CourseAlbums'] != null ? (map['CourseAlbums'] as List).map((e)=>BaseCourseAlbumDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
 			needPay: map['NeedPay'],
 			signCourseStatus: StudentCourseStatusEnum.values.firstWhere((e) => e.index == map['SignCourseStatus']),
 			isPay: map['IsPay'],
@@ -1377,6 +1105,8 @@ class CourseInfoDetailDTO extends BaseCourseInfoDTO{
 			map['CourseVideos'] = courseVideos;
 		if(courseMaterials != null)
 			map['CourseMaterials'] = courseMaterials;
+		if(courseAlbums != null)
+			map['CourseAlbums'] = courseAlbums;
 		map['NeedPay'] = needPay;
 		map['SignCourseStatus'] = signCourseStatus.index;
 		map['IsPay'] = isPay;
@@ -1384,6 +1114,211 @@ class CourseInfoDetailDTO extends BaseCourseInfoDTO{
 	}
 }
 
+class FindCoursePagesRequest extends PageRequest{
+	String? keyword;
+	List<String >? courseLabels;
+	DateTime? startTime;
+	DateTime? endTime;
+	String? teacherCode;
+	String? languageCode;
+
+	FindCoursePagesRequest({
+		this.keyword,
+		this.courseLabels,
+		this.startTime,
+		this.endTime,
+		this.teacherCode,
+		this.languageCode,
+		int pageIndex = 0,
+		int pageSize = 0,
+		String? token,
+	}) : super(
+			pageIndex: pageIndex,
+			pageSize: pageSize,
+			token: token,
+		);
+
+	factory FindCoursePagesRequest.fromJson(Map<String, dynamic> map) {
+		return FindCoursePagesRequest( 
+			keyword: map['Keyword'],
+			courseLabels: map['CourseLabels'] != null ? map['CourseLabels'].cast<String>().toList() : null,
+			startTime: map['StartTime'] != null ? DateTime.parse(map['StartTime']) : null,
+			endTime: map['EndTime'] != null ? DateTime.parse(map['EndTime']) : null,
+			teacherCode: map['TeacherCode'],
+			languageCode: map['LanguageCode'],
+			pageIndex: map['PageIndex'],
+			pageSize: map['PageSize'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(keyword != null)
+			map['Keyword'] = keyword;
+		if(courseLabels != null)
+			map['CourseLabels'] = courseLabels;
+		if(startTime != null)
+			map['StartTime'] = JsonRpcUtils.dateFormat(startTime!);
+		if(endTime != null)
+			map['EndTime'] = JsonRpcUtils.dateFormat(endTime!);
+		if(teacherCode != null)
+			map['TeacherCode'] = teacherCode;
+		if(languageCode != null)
+			map['LanguageCode'] = languageCode;
+		return map;
+	}
+}
+
+class DeleteCourseByCodeRequest extends TokenRequest{
+	String? code;
+
+	DeleteCourseByCodeRequest({
+		this.code,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory DeleteCourseByCodeRequest.fromJson(Map<String, dynamic> map) {
+		return DeleteCourseByCodeRequest( 
+			code: map['Code'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(code != null)
+			map['Code'] = code;
+		return map;
+	}
+}
+
+class UpdateCourseRequest extends TokenRequest{
+	String? code;
+	String? name;
+	String? courseIntro;
+	String? teacherCode;
+	String? poster;
+	DateTime? startTime;
+	int duration;
+	CourseTypeEnum courseType;
+	CourseAudienceTypeEnum audienceType;
+	String? coursewareToken;
+	List<String >? caseLabelCodes;
+	List<String >? courseLabelCodes;
+	List<String >? userGroupCodes;
+	double price;
+	List<String >? courseVideoCodes;
+	List<String >? bindExams;
+	List<String >? assistants;
+	List<String >? experts;
+	bool isAgentCourse;
+	List<String >? courseAlbumCodes;
+	CourseAppearTypeEnum courseAppearType;
+	List<String >? courseMaterialCodes;
+
+	UpdateCourseRequest({
+		this.code,
+		this.name,
+		this.courseIntro,
+		this.teacherCode,
+		this.poster,
+		this.startTime,
+		this.duration = 0,
+		this.courseType = CourseTypeEnum.Unknown,
+		this.audienceType = CourseAudienceTypeEnum.Unknown,
+		this.coursewareToken,
+		this.caseLabelCodes,
+		this.courseLabelCodes,
+		this.userGroupCodes,
+		this.price = 0,
+		this.courseVideoCodes,
+		this.bindExams,
+		this.assistants,
+		this.experts,
+		this.isAgentCourse = false,
+		this.courseAlbumCodes,
+		this.courseAppearType = CourseAppearTypeEnum.Unknown,
+		this.courseMaterialCodes,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory UpdateCourseRequest.fromJson(Map<String, dynamic> map) {
+		return UpdateCourseRequest( 
+			code: map['Code'],
+			name: map['Name'],
+			courseIntro: map['CourseIntro'],
+			teacherCode: map['TeacherCode'],
+			poster: map['Poster'],
+			startTime: map['StartTime'] != null ? DateTime.parse(map['StartTime']) : null,
+			duration: map['Duration'],
+			courseType: CourseTypeEnum.values.firstWhere((e) => e.index == map['CourseType']),
+			audienceType: CourseAudienceTypeEnum.values.firstWhere((e) => e.index == map['AudienceType']),
+			coursewareToken: map['CoursewareToken'],
+			caseLabelCodes: map['CaseLabelCodes'] != null ? map['CaseLabelCodes'].cast<String>().toList() : null,
+			courseLabelCodes: map['CourseLabelCodes'] != null ? map['CourseLabelCodes'].cast<String>().toList() : null,
+			userGroupCodes: map['UserGroupCodes'] != null ? map['UserGroupCodes'].cast<String>().toList() : null,
+			price: double.parse(map['Price'].toString()),
+			courseVideoCodes: map['CourseVideoCodes'] != null ? map['CourseVideoCodes'].cast<String>().toList() : null,
+			bindExams: map['BindExams'] != null ? map['BindExams'].cast<String>().toList() : null,
+			assistants: map['Assistants'] != null ? map['Assistants'].cast<String>().toList() : null,
+			experts: map['Experts'] != null ? map['Experts'].cast<String>().toList() : null,
+			isAgentCourse: map['IsAgentCourse'],
+			courseAlbumCodes: map['CourseAlbumCodes'] != null ? map['CourseAlbumCodes'].cast<String>().toList() : null,
+			courseAppearType: CourseAppearTypeEnum.values.firstWhere((e) => e.index == map['CourseAppearType']),
+			courseMaterialCodes: map['CourseMaterialCodes'] != null ? map['CourseMaterialCodes'].cast<String>().toList() : null,
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(code != null)
+			map['Code'] = code;
+		if(name != null)
+			map['Name'] = name;
+		if(courseIntro != null)
+			map['CourseIntro'] = courseIntro;
+		if(teacherCode != null)
+			map['TeacherCode'] = teacherCode;
+		if(poster != null)
+			map['Poster'] = poster;
+		if(startTime != null)
+			map['StartTime'] = JsonRpcUtils.dateFormat(startTime!);
+		map['Duration'] = duration;
+		map['CourseType'] = courseType.index;
+		map['AudienceType'] = audienceType.index;
+		if(coursewareToken != null)
+			map['CoursewareToken'] = coursewareToken;
+		if(caseLabelCodes != null)
+			map['CaseLabelCodes'] = caseLabelCodes;
+		if(courseLabelCodes != null)
+			map['CourseLabelCodes'] = courseLabelCodes;
+		if(userGroupCodes != null)
+			map['UserGroupCodes'] = userGroupCodes;
+		map['Price'] = price;
+		if(courseVideoCodes != null)
+			map['CourseVideoCodes'] = courseVideoCodes;
+		if(bindExams != null)
+			map['BindExams'] = bindExams;
+		if(assistants != null)
+			map['Assistants'] = assistants;
+		if(experts != null)
+			map['Experts'] = experts;
+		map['IsAgentCourse'] = isAgentCourse;
+		if(courseAlbumCodes != null)
+			map['CourseAlbumCodes'] = courseAlbumCodes;
+		map['CourseAppearType'] = courseAppearType.index;
+		if(courseMaterialCodes != null)
+			map['CourseMaterialCodes'] = courseMaterialCodes;
+		return map;
+	}
+}
+
 class FindCourseByCodeRequest extends TokenRequest{
 	String? code;
 	String? languageCode;
@@ -1414,73 +1349,13 @@ class FindCourseByCodeRequest extends TokenRequest{
 	}
 }
 
-class MyCoursePageDTO {
-	String? code;
-	String? courseOrAlbumCode;
-	CourseAppearTypeEnum courseAppearType;
-	CourseTypeEnum courseType;
-	String? name;
-	String? teacherName;
-	List<String >? courseLabelNames;
-	bool isPay;
-	DateTime? createTime;
-
-	MyCoursePageDTO({
-		this.code,
-		this.courseOrAlbumCode,
-		this.courseAppearType = CourseAppearTypeEnum.Unknown,
-		this.courseType = CourseTypeEnum.Unknown,
-		this.name,
-		this.teacherName,
-		this.courseLabelNames,
-		this.isPay = false,
-		this.createTime,
-	});
-
-	factory MyCoursePageDTO.fromJson(Map<String, dynamic> map) {
-		return MyCoursePageDTO( 
-			code: map['Code'],
-			courseOrAlbumCode: map['CourseOrAlbumCode'],
-			courseAppearType: CourseAppearTypeEnum.values.firstWhere((e) => e.index == map['CourseAppearType']),
-			courseType: CourseTypeEnum.values.firstWhere((e) => e.index == map['CourseType']),
-			name: map['Name'],
-			teacherName: map['TeacherName'],
-			courseLabelNames: map['CourseLabelNames'] != null ? map['CourseLabelNames'].cast<String>().toList() : null,
-			isPay: map['IsPay'],
-			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
-		);
-	}
-
-	Map<String, dynamic> toJson() {
-		final map = Map<String, dynamic>();
-		if(code != null)
-			map['Code'] = code;
-		if(courseOrAlbumCode != null)
-			map['CourseOrAlbumCode'] = courseOrAlbumCode;
-		map['CourseAppearType'] = courseAppearType.index;
-		map['CourseType'] = courseType.index;
-		if(name != null)
-			map['Name'] = name;
-		if(teacherName != null)
-			map['TeacherName'] = teacherName;
-		if(courseLabelNames != null)
-			map['CourseLabelNames'] = courseLabelNames;
-		map['IsPay'] = isPay;
-		if(createTime != null)
-			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
-		return map;
-	}
-}
-
 class FindMyCoursePagesRequest extends PageRequest{
 	String? keyword;
 	StudentCourseStatusEnum queryStatus;
-	CourseAppearTypeEnum courseAppearType;
 
 	FindMyCoursePagesRequest({
 		this.keyword,
 		this.queryStatus = StudentCourseStatusEnum.All,
-		this.courseAppearType = CourseAppearTypeEnum.Unknown,
 		int pageIndex = 0,
 		int pageSize = 0,
 		String? token,
@@ -1494,7 +1369,6 @@ class FindMyCoursePagesRequest extends PageRequest{
 		return FindMyCoursePagesRequest( 
 			keyword: map['Keyword'],
 			queryStatus: StudentCourseStatusEnum.values.firstWhere((e) => e.index == map['QueryStatus']),
-			courseAppearType: CourseAppearTypeEnum.values.firstWhere((e) => e.index == map['CourseAppearType']),
 			pageIndex: map['PageIndex'],
 			pageSize: map['PageSize'],
 			token: map['Token'],
@@ -1506,7 +1380,80 @@ class FindMyCoursePagesRequest extends PageRequest{
 		if(keyword != null)
 			map['Keyword'] = keyword;
 		map['QueryStatus'] = queryStatus.index;
-		map['CourseAppearType'] = courseAppearType.index;
+		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;
 	}
 }
@@ -3256,6 +3203,84 @@ class DeleteCourseAlbumRequest {
 	}
 }
 
+class CourseCommonInfoDTO extends BaseCourseAlbumDTO{
+	String? cover;
+	String? introduction;
+	List<String >? courseLabels;
+	String? teacherCode;
+	String? teacherName;
+	CourseViewRangeEnum viewRange;
+	double price;
+	CourseTypeEnum courseType;
+	List<BaseUserGroupDTO >? userGroupList;
+	List<BaseCourseAlbumDTO >? courseAlbumList;
+	StudentCourseStatusEnum signCourseStatus;
+	bool isPay;
+
+	CourseCommonInfoDTO({
+		this.cover,
+		this.introduction,
+		this.courseLabels,
+		this.teacherCode,
+		this.teacherName,
+		this.viewRange = CourseViewRangeEnum.All,
+		this.price = 0,
+		this.courseType = CourseTypeEnum.Unknown,
+		this.userGroupList,
+		this.courseAlbumList,
+		this.signCourseStatus = StudentCourseStatusEnum.All,
+		this.isPay = false,
+		String? code,
+		String? name,
+	}) : super(
+			code: code,
+			name: name,
+		);
+
+	factory CourseCommonInfoDTO.fromJson(Map<String, dynamic> map) {
+		return CourseCommonInfoDTO( 
+			cover: map['Cover'],
+			introduction: map['Introduction'],
+			courseLabels: map['CourseLabels'] != null ? map['CourseLabels'].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()),
+			courseType: CourseTypeEnum.values.firstWhere((e) => e.index == map['CourseType']),
+			userGroupList: map['UserGroupList'] != null ? (map['UserGroupList'] as List).map((e)=>BaseUserGroupDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			courseAlbumList: map['CourseAlbumList'] != null ? (map['CourseAlbumList'] as List).map((e)=>BaseCourseAlbumDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			signCourseStatus: StudentCourseStatusEnum.values.firstWhere((e) => e.index == map['SignCourseStatus']),
+			isPay: map['IsPay'],
+			code: map['Code'],
+			name: map['Name'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(cover != null)
+			map['Cover'] = cover;
+		if(introduction != null)
+			map['Introduction'] = introduction;
+		if(courseLabels != null)
+			map['CourseLabels'] = courseLabels;
+		if(teacherCode != null)
+			map['TeacherCode'] = teacherCode;
+		if(teacherName != null)
+			map['TeacherName'] = teacherName;
+		map['ViewRange'] = viewRange.index;
+		map['Price'] = price;
+		map['CourseType'] = courseType.index;
+		if(userGroupList != null)
+			map['UserGroupList'] = userGroupList;
+		if(courseAlbumList != null)
+			map['CourseAlbumList'] = courseAlbumList;
+		map['SignCourseStatus'] = signCourseStatus.index;
+		map['IsPay'] = isPay;
+		return map;
+	}
+}
+
 class CourseAlbumExtendDTO extends BaseCourseAlbumDTO{
 	List<CourseInfoDetailDTO >? courseInfos;
 	int studentCount;
@@ -3270,6 +3295,8 @@ class CourseAlbumExtendDTO extends BaseCourseAlbumDTO{
 	DateTime? createTime;
 	int sort;
 	bool isStick;
+	StudentCourseStatusEnum signCourseStatus;
+	bool isPay;
 
 	CourseAlbumExtendDTO({
 		this.courseInfos,
@@ -3285,6 +3312,8 @@ class CourseAlbumExtendDTO extends BaseCourseAlbumDTO{
 		this.createTime,
 		this.sort = 0,
 		this.isStick = false,
+		this.signCourseStatus = StudentCourseStatusEnum.All,
+		this.isPay = false,
 		String? code,
 		String? name,
 	}) : super(
@@ -3307,6 +3336,8 @@ class CourseAlbumExtendDTO extends BaseCourseAlbumDTO{
 			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
 			sort: map['Sort'],
 			isStick: map['IsStick'],
+			signCourseStatus: StudentCourseStatusEnum.values.firstWhere((e) => e.index == map['SignCourseStatus']),
+			isPay: map['IsPay'],
 			code: map['Code'],
 			name: map['Name'],
 		);
@@ -3335,6 +3366,8 @@ class CourseAlbumExtendDTO extends BaseCourseAlbumDTO{
 			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
 		map['Sort'] = sort;
 		map['IsStick'] = isStick;
+		map['SignCourseStatus'] = signCourseStatus.index;
+		map['IsPay'] = isPay;
 		return map;
 	}
 }
@@ -3603,4 +3636,38 @@ class GetUserPagesRequest extends PageRequest{
 	}
 }
 
+class SendLiveInteractiveBoardDataRequest extends TokenRequest{
+	String? roomId;
+	bool isClear;
+	String? boardData;
+
+	SendLiveInteractiveBoardDataRequest({
+		this.roomId,
+		this.isClear = false,
+		this.boardData,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory SendLiveInteractiveBoardDataRequest.fromJson(Map<String, dynamic> map) {
+		return SendLiveInteractiveBoardDataRequest( 
+			roomId: map['RoomId'],
+			isClear: map['IsClear'],
+			boardData: map['BoardData'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(roomId != null)
+			map['RoomId'] = roomId;
+		map['IsClear'] = isClear;
+		if(boardData != null)
+			map['BoardData'] = boardData;
+		return map;
+	}
+}
+
 

+ 5 - 0
lib/services/liveConsultation.dart

@@ -360,5 +360,10 @@ class LiveConsultationService extends JsonRpcClientBase {
 		return rpcRst;
 	}
 
+	Future<bool> syncBatchConsultationAsync(SyncBatchConsultationRequest syncBatchConsultationRequest) async {
+		var rpcRst = await call("SyncBatchConsultationAsync", syncBatchConsultationRequest);
+		return rpcRst;
+	}
+
 }
 

+ 145 - 0
lib/services/liveConsultation.m.dart

@@ -4915,4 +4915,149 @@ class ControlDeviceResponseRequest extends BaseControlDeviceRequest{
 	}
 }
 
+enum FollowUpVisitStatusEnum {
+	Unknown,
+	PendingVisit,
+	VisitCompleted,
+}
+
+class SyncConsultationRequest {
+	String? consultationCode;
+	DateTime? createTime;
+	DateTime? updateTime;
+	String? applyOrganizationCode;
+	String? applyUserCode;
+	String? expertOrganizationCode;
+	String? expertUserCode;
+	String? deviceCode;
+	String? scanUser;
+	List<DataItemDTO >? patientInfo;
+	String? scanPosition;
+	DateTime? consultationTime;
+	DateTime? consultationTimeEnd;
+	TransactionStatusEnum consultationStatus;
+	List<ConsultationFileDTO >? consultationFileList;
+	String? rejectReason;
+	String? description;
+	String? diseases;
+	String? primaryDiagnosis;
+	EvaluateGradeEnum evaluateGradeEnum;
+	FollowUpVisitStatusEnum followUpVisitStatus;
+
+	SyncConsultationRequest({
+		this.consultationCode,
+		this.createTime,
+		this.updateTime,
+		this.applyOrganizationCode,
+		this.applyUserCode,
+		this.expertOrganizationCode,
+		this.expertUserCode,
+		this.deviceCode,
+		this.scanUser,
+		this.patientInfo,
+		this.scanPosition,
+		this.consultationTime,
+		this.consultationTimeEnd,
+		this.consultationStatus = TransactionStatusEnum.Applied,
+		this.consultationFileList,
+		this.rejectReason,
+		this.description,
+		this.diseases,
+		this.primaryDiagnosis,
+		this.evaluateGradeEnum = EvaluateGradeEnum.UnSet,
+		this.followUpVisitStatus = FollowUpVisitStatusEnum.Unknown,
+	});
+
+	factory SyncConsultationRequest.fromJson(Map<String, dynamic> map) {
+		return SyncConsultationRequest( 
+			consultationCode: map['ConsultationCode'],
+			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
+			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
+			applyOrganizationCode: map['ApplyOrganizationCode'],
+			applyUserCode: map['ApplyUserCode'],
+			expertOrganizationCode: map['ExpertOrganizationCode'],
+			expertUserCode: map['ExpertUserCode'],
+			deviceCode: map['DeviceCode'],
+			scanUser: map['ScanUser'],
+			patientInfo: map['PatientInfo'] != null ? (map['PatientInfo'] as List).map((e)=>DataItemDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			scanPosition: map['ScanPosition'],
+			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']),
+			consultationFileList: map['ConsultationFileList'] != null ? (map['ConsultationFileList'] as List).map((e)=>ConsultationFileDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			rejectReason: map['RejectReason'],
+			description: map['Description'],
+			diseases: map['Diseases'],
+			primaryDiagnosis: map['PrimaryDiagnosis'],
+			evaluateGradeEnum: EvaluateGradeEnum.values.firstWhere((e) => e.index == map['EvaluateGradeEnum']),
+			followUpVisitStatus: FollowUpVisitStatusEnum.values.firstWhere((e) => e.index == map['FollowUpVisitStatus']),
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(consultationCode != null)
+			map['ConsultationCode'] = consultationCode;
+		if(createTime != null)
+			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
+		if(updateTime != null)
+			map['UpdateTime'] = JsonRpcUtils.dateFormat(updateTime!);
+		if(applyOrganizationCode != null)
+			map['ApplyOrganizationCode'] = applyOrganizationCode;
+		if(applyUserCode != null)
+			map['ApplyUserCode'] = applyUserCode;
+		if(expertOrganizationCode != null)
+			map['ExpertOrganizationCode'] = expertOrganizationCode;
+		if(expertUserCode != null)
+			map['ExpertUserCode'] = expertUserCode;
+		if(deviceCode != null)
+			map['DeviceCode'] = deviceCode;
+		if(scanUser != null)
+			map['ScanUser'] = scanUser;
+		if(patientInfo != null)
+			map['PatientInfo'] = patientInfo;
+		if(scanPosition != null)
+			map['ScanPosition'] = scanPosition;
+		if(consultationTime != null)
+			map['ConsultationTime'] = JsonRpcUtils.dateFormat(consultationTime!);
+		if(consultationTimeEnd != null)
+			map['ConsultationTimeEnd'] = JsonRpcUtils.dateFormat(consultationTimeEnd!);
+		map['ConsultationStatus'] = consultationStatus.index;
+		if(consultationFileList != null)
+			map['ConsultationFileList'] = consultationFileList;
+		if(rejectReason != null)
+			map['RejectReason'] = rejectReason;
+		if(description != null)
+			map['Description'] = description;
+		if(diseases != null)
+			map['Diseases'] = diseases;
+		if(primaryDiagnosis != null)
+			map['PrimaryDiagnosis'] = primaryDiagnosis;
+		map['EvaluateGradeEnum'] = evaluateGradeEnum.index;
+		map['FollowUpVisitStatus'] = followUpVisitStatus.index;
+		return map;
+	}
+}
+
+class SyncBatchConsultationRequest {
+	List<SyncConsultationRequest >? syncConsultations;
+
+	SyncBatchConsultationRequest({
+		this.syncConsultations,
+	});
+
+	factory SyncBatchConsultationRequest.fromJson(Map<String, dynamic> map) {
+		return SyncBatchConsultationRequest( 
+			syncConsultations: map['SyncConsultations'] != null ? (map['SyncConsultations'] as List).map((e)=>SyncConsultationRequest.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(syncConsultations != null)
+			map['SyncConsultations'] = syncConsultations;
+		return map;
+	}
+}
+
 

+ 46 - 0
lib/services/notification.m.dart

@@ -95,6 +95,7 @@ enum NotificationTypeEnum {
 	RejectMeetingNotification,
 	StartEducationHeartRateToDeviceNotification,
 	AcceptMeetingNotification,
+	SendLiveInteractiveBoardDataNotification,
 }
 
 class NotificationDTO {
@@ -1976,6 +1977,51 @@ class NetworkErrCourseNotification extends NotificationDTO{
 	}
 }
 
+class SendLiveInteractiveBoardDataNotification extends NotificationDTO{
+	String? courseCode;
+	bool isClear;
+	String? userCode;
+	String? boardData;
+
+	SendLiveInteractiveBoardDataNotification({
+		NotificationTypeEnum notificationType = NotificationTypeEnum.Unknown,
+		this.courseCode,
+		this.isClear = false,
+		this.userCode,
+		this.boardData,
+		String? code,
+		bool isResponse = false,
+	}) : super(
+			notificationType: notificationType,
+			code: code,
+			isResponse: isResponse,
+		);
+
+	factory SendLiveInteractiveBoardDataNotification.fromJson(Map<String, dynamic> map) {
+		return SendLiveInteractiveBoardDataNotification( 
+			notificationType: NotificationTypeEnum.values.firstWhere((e) => e.index == map['NotificationType']),
+			courseCode: map['CourseCode'],
+			isClear: map['IsClear'],
+			userCode: map['UserCode'],
+			boardData: map['BoardData'],
+			code: map['Code'],
+			isResponse: map['IsResponse'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(courseCode != null)
+			map['CourseCode'] = courseCode;
+		map['IsClear'] = isClear;
+		if(userCode != null)
+			map['UserCode'] = userCode;
+		if(boardData != null)
+			map['BoardData'] = boardData;
+		return map;
+	}
+}
+
 class SwitchLiveCourseVideoNotification extends NotificationDTO{
 	String? courseCode;
 	bool opened;

+ 3 - 0
lib/services/notificationdecoder.dart

@@ -124,6 +124,9 @@ class NotificationDecoder {
 		_builders.add(NotificationTypeEnum.NetworkErrCourseNotification,
 				(map) => NetworkErrCourseNotification.fromJson(map));
 
+		_builders.add(NotificationTypeEnum.SendInteractiveBoardDataNotification,
+				(map) => SendLiveInteractiveBoardDataNotification.fromJson(map));
+
 		_builders.add(NotificationTypeEnum.SwitchLiveCourseVideoNotification,
 				(map) => SwitchLiveCourseVideoNotification.fromJson(map));
 

+ 4 - 0
lib/services/organization.m.dart

@@ -748,6 +748,7 @@ class ServerSettingResult {
 	String? cMSUrl;
 	bool isSelfRtcService;
 	String? liveProtocol;
+	TransactionStatusEnum liveProtocolType;
 
 	ServerSettingResult({
 		this.serverLangugeList,
@@ -759,6 +760,7 @@ class ServerSettingResult {
 		this.cMSUrl,
 		this.isSelfRtcService = false,
 		this.liveProtocol,
+		this.liveProtocolType = TransactionStatusEnum.Applied,
 	});
 
 	factory ServerSettingResult.fromJson(Map<String, dynamic> map) {
@@ -772,6 +774,7 @@ class ServerSettingResult {
 			cMSUrl: map['CMSUrl'],
 			isSelfRtcService: map['IsSelfRtcService'],
 			liveProtocol: map['LiveProtocol'],
+			liveProtocolType: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocolType']),
 		);
 	}
 
@@ -791,6 +794,7 @@ class ServerSettingResult {
 		map['IsSelfRtcService'] = isSelfRtcService;
 		if(liveProtocol != null)
 			map['LiveProtocol'] = liveProtocol;
+		map['LiveProtocolType'] = liveProtocolType.index;
 		return map;
 	}
 }

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1088 - 727
lib/services/other.m.dart


+ 13 - 0
lib/services/patient.m.dart

@@ -437,6 +437,9 @@ class GetRecordsPageDTO {
 	bool isReferral;
 	ReferralStatusEnum referralStatus;
 	bool canCreateReport;
+	String? deviceCode;
+	bool isCollecting;
+	bool canCollcetImg;
 
 	GetRecordsPageDTO({
 		this.createTime,
@@ -453,6 +456,9 @@ class GetRecordsPageDTO {
 		this.isReferral = false,
 		this.referralStatus = ReferralStatusEnum.Wait,
 		this.canCreateReport = false,
+		this.deviceCode,
+		this.isCollecting = false,
+		this.canCollcetImg = false,
 	});
 
 	factory GetRecordsPageDTO.fromJson(Map<String, dynamic> map) {
@@ -471,6 +477,9 @@ class GetRecordsPageDTO {
 			isReferral: map['IsReferral'],
 			referralStatus: ReferralStatusEnum.values.firstWhere((e) => e.index == map['ReferralStatus']),
 			canCreateReport: map['CanCreateReport'],
+			deviceCode: map['DeviceCode'],
+			isCollecting: map['IsCollecting'],
+			canCollcetImg: map['CanCollcetImg'],
 		);
 	}
 
@@ -498,6 +507,10 @@ class GetRecordsPageDTO {
 		map['IsReferral'] = isReferral;
 		map['ReferralStatus'] = referralStatus.index;
 		map['CanCreateReport'] = canCreateReport;
+		if(deviceCode != null)
+			map['DeviceCode'] = deviceCode;
+		map['IsCollecting'] = isCollecting;
+		map['CanCollcetImg'] = canCollcetImg;
 		return map;
 	}
 }

+ 10 - 0
lib/services/recordInfo.dart

@@ -78,5 +78,15 @@ class RecordInfoService extends JsonRpcClientBase {
 		return result;
 	}
 
+	Future<bool> checkCollectingImgAsync(CheckCollectingImgRequest request) async {
+		var rpcRst = await call("CheckCollectingImgAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> startCollectingImgAsync(StartStartCollectingImgRequest request) async {
+		var rpcRst = await call("StartCollectingImgAsync", request);
+		return rpcRst;
+	}
+
 }
 

+ 59 - 0
lib/services/recordInfo.m.dart

@@ -132,6 +132,8 @@ class QueryRecordResult {
 	List<PatientInfoExt >? patientInfoExtList;
 	DiagnosisStatusEnum diagnosisStatus;
 	List<DiagnosisInfoDTO >? diagnosisInfos;
+	bool isCollecting;
+	DateTime? startCollectingTime;
 
 	QueryRecordResult({
 		this.createTime,
@@ -146,6 +148,8 @@ class QueryRecordResult {
 		this.patientInfoExtList,
 		this.diagnosisStatus = DiagnosisStatusEnum.NotRequired,
 		this.diagnosisInfos,
+		this.isCollecting = false,
+		this.startCollectingTime,
 	});
 
 	factory QueryRecordResult.fromJson(Map<String, dynamic> map) {
@@ -162,6 +166,8 @@ class QueryRecordResult {
 			patientInfoExtList: map['PatientInfoExtList'] != null ? (map['PatientInfoExtList'] as List).map((e)=>PatientInfoExt.fromJson(e as Map<String,dynamic>)).toList() : null,
 			diagnosisStatus: DiagnosisStatusEnum.values.firstWhere((e) => e.index == map['DiagnosisStatus']),
 			diagnosisInfos: map['DiagnosisInfos'] != null ? (map['DiagnosisInfos'] as List).map((e)=>DiagnosisInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			isCollecting: map['IsCollecting'],
+			startCollectingTime: map['StartCollectingTime'] != null ? DateTime.parse(map['StartCollectingTime']) : null,
 		);
 	}
 
@@ -188,6 +194,9 @@ class QueryRecordResult {
 		map['DiagnosisStatus'] = diagnosisStatus.index;
 		if(diagnosisInfos != null)
 			map['DiagnosisInfos'] = diagnosisInfos;
+		map['IsCollecting'] = isCollecting;
+		if(startCollectingTime != null)
+			map['StartCollectingTime'] = JsonRpcUtils.dateFormat(startCollectingTime!);
 		return map;
 	}
 }
@@ -443,4 +452,54 @@ class FindRemedicalMeasuredInfoRequest extends TokenRequest{
 	}
 }
 
+class CheckCollectingImgRequest extends TokenRequest{
+	String? deviceCode;
+
+	CheckCollectingImgRequest({
+		this.deviceCode,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory CheckCollectingImgRequest.fromJson(Map<String, dynamic> map) {
+		return CheckCollectingImgRequest( 
+			deviceCode: map['DeviceCode'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(deviceCode != null)
+			map['DeviceCode'] = deviceCode;
+		return map;
+	}
+}
+
+class StartStartCollectingImgRequest extends TokenRequest{
+	String? recordCode;
+
+	StartStartCollectingImgRequest({
+		this.recordCode,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory StartStartCollectingImgRequest.fromJson(Map<String, dynamic> map) {
+		return StartStartCollectingImgRequest( 
+			recordCode: map['RecordCode'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(recordCode != null)
+			map['RecordCode'] = recordCode;
+		return map;
+	}
+}
+
 

+ 25 - 0
lib/services/remedical.dart

@@ -125,6 +125,11 @@ class RemedicalService extends JsonRpcClientBase {
 		return result;
 	}
 
+	Future<String> getCollcetingRecordCodeAsync(TokenRequest request) async {
+		var rpcRst = await call("GetCollcetingRecordCodeAsync", request);
+		return rpcRst;
+	}
+
 	Future<MeasureApplicationDTO> getMeasureApplicationAsync(GetMeasureApplicationRequest request) async {
 		var rpcRst = await call("GetMeasureApplicationAsync", request);
 		var result = MeasureApplicationDTO.fromJson(rpcRst as Map<String, dynamic>);
@@ -298,5 +303,25 @@ class RemedicalService extends JsonRpcClientBase {
 		return rpcRst;
 	}
 
+	Future<bool> syncBatchRemedicalRecordsAsync(SyncBatchRemedicalRecordRequest request) async {
+		var rpcRst = await call("SyncBatchRemedicalRecordsAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> syncBatchUploadRemedicalDatasAsync(SyncBatchUploadRemedicalDatasRequest request) async {
+		var rpcRst = await call("SyncBatchUploadRemedicalDatasAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> syncBatchAIResultAsync(SyncBatchAIResultRequest request) async {
+		var rpcRst = await call("SyncBatchAIResultAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> syncBatchCarotidResultAsync(SyncBatchCarotidResultRequest request) async {
+		var rpcRst = await call("SyncBatchCarotidResultAsync", request);
+		return rpcRst;
+	}
+
 }
 

+ 273 - 0
lib/services/remedical.m.dart

@@ -4,6 +4,7 @@ import 'notification.m.dart';
 import 'organization.m.dart';
 import 'patient.m.dart';
 import 'education.m.dart';
+import 'aIDiagnosis.m.dart';
 
 import 'package:fis_jsonrpc/utils.dart';
 
@@ -460,6 +461,7 @@ class QueryExamListItemResult {
 	List<DataItemDTO >? ageInfo;
 	String? sex;
 	List<String >? associatedExamCodes;
+	DateTime? createTime;
 
 	QueryExamListItemResult({
 		this.examCode,
@@ -468,6 +470,7 @@ class QueryExamListItemResult {
 		this.ageInfo,
 		this.sex,
 		this.associatedExamCodes,
+		this.createTime,
 	});
 
 	factory QueryExamListItemResult.fromJson(Map<String, dynamic> map) {
@@ -478,6 +481,7 @@ class QueryExamListItemResult {
 			ageInfo: map['AgeInfo'] != null ? (map['AgeInfo'] as List).map((e)=>DataItemDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
 			sex: map['Sex'],
 			associatedExamCodes: map['AssociatedExamCodes'] != null ? map['AssociatedExamCodes'].cast<String>().toList() : null,
+			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
 		);
 	}
 
@@ -495,6 +499,8 @@ class QueryExamListItemResult {
 			map['Sex'] = sex;
 		if(associatedExamCodes != null)
 			map['AssociatedExamCodes'] = associatedExamCodes;
+		if(createTime != null)
+			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
 		return map;
 	}
 }
@@ -1572,6 +1578,8 @@ class RecordInfoDTO extends BaseDTO{
 	List<String >? associatedExamCodes;
 	DiagnosisStatusEnum diagnosisStatus;
 	List<DiagnosisInfoDTO >? diagnosisInfos;
+	bool isCollecting;
+	DateTime? startCollectingTime;
 
 	RecordInfoDTO({
 		this.recordCode,
@@ -1591,6 +1599,8 @@ class RecordInfoDTO extends BaseDTO{
 		this.associatedExamCodes,
 		this.diagnosisStatus = DiagnosisStatusEnum.NotRequired,
 		this.diagnosisInfos,
+		this.isCollecting = false,
+		this.startCollectingTime,
 		DateTime? createTime,
 		DateTime? updateTime,
 	}) : super(
@@ -1617,6 +1627,8 @@ class RecordInfoDTO extends BaseDTO{
 			associatedExamCodes: map['AssociatedExamCodes'] != null ? map['AssociatedExamCodes'].cast<String>().toList() : null,
 			diagnosisStatus: DiagnosisStatusEnum.values.firstWhere((e) => e.index == map['DiagnosisStatus']),
 			diagnosisInfos: map['DiagnosisInfos'] != null ? (map['DiagnosisInfos'] as List).map((e)=>DiagnosisInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			isCollecting: map['IsCollecting'],
+			startCollectingTime: map['StartCollectingTime'] != null ? DateTime.parse(map['StartCollectingTime']) : null,
 			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
 			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
 		);
@@ -1655,6 +1667,9 @@ class RecordInfoDTO extends BaseDTO{
 		map['DiagnosisStatus'] = diagnosisStatus.index;
 		if(diagnosisInfos != null)
 			map['DiagnosisInfos'] = diagnosisInfos;
+		map['IsCollecting'] = isCollecting;
+		if(startCollectingTime != null)
+			map['StartCollectingTime'] = JsonRpcUtils.dateFormat(startCollectingTime!);
 		return map;
 	}
 }
@@ -3172,4 +3187,262 @@ class SaveRemedicalAISelectedInfoRequest extends TokenRequest{
 	}
 }
 
+class SyncRemedicalRecordRequest {
+	String? code;
+	String? organizationCode;
+	String? deviceCode;
+	bool isUploadReport;
+	List<DataItemDTO >? patientInfo;
+	DiagnosisStatusEnum diagnosisStatus;
+	List<DiagnosisInfoDTO >? aIDiagnosisInfos;
+	DateTime? createTime;
+	DateTime? updateTime;
+	String? creator;
+
+	SyncRemedicalRecordRequest({
+		this.code,
+		this.organizationCode,
+		this.deviceCode,
+		this.isUploadReport = false,
+		this.patientInfo,
+		this.diagnosisStatus = DiagnosisStatusEnum.NotRequired,
+		this.aIDiagnosisInfos,
+		this.createTime,
+		this.updateTime,
+		this.creator,
+	});
+
+	factory SyncRemedicalRecordRequest.fromJson(Map<String, dynamic> map) {
+		return SyncRemedicalRecordRequest( 
+			code: map['Code'],
+			organizationCode: map['OrganizationCode'],
+			deviceCode: map['DeviceCode'],
+			isUploadReport: map['IsUploadReport'],
+			patientInfo: map['PatientInfo'] != null ? (map['PatientInfo'] as List).map((e)=>DataItemDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			diagnosisStatus: DiagnosisStatusEnum.values.firstWhere((e) => e.index == map['DiagnosisStatus']),
+			aIDiagnosisInfos: map['AIDiagnosisInfos'] != null ? (map['AIDiagnosisInfos'] as List).map((e)=>DiagnosisInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
+			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
+			creator: map['Creator'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(code != null)
+			map['Code'] = code;
+		if(organizationCode != null)
+			map['OrganizationCode'] = organizationCode;
+		if(deviceCode != null)
+			map['DeviceCode'] = deviceCode;
+		map['IsUploadReport'] = isUploadReport;
+		if(patientInfo != null)
+			map['PatientInfo'] = patientInfo;
+		map['DiagnosisStatus'] = diagnosisStatus.index;
+		if(aIDiagnosisInfos != null)
+			map['AIDiagnosisInfos'] = aIDiagnosisInfos;
+		if(createTime != null)
+			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
+		if(updateTime != null)
+			map['UpdateTime'] = JsonRpcUtils.dateFormat(updateTime!);
+		if(creator != null)
+			map['Creator'] = creator;
+		return map;
+	}
+}
+
+class SyncBatchRemedicalRecordRequest {
+	List<SyncRemedicalRecordRequest >? remedicalRecordList;
+
+	SyncBatchRemedicalRecordRequest({
+		this.remedicalRecordList,
+	});
+
+	factory SyncBatchRemedicalRecordRequest.fromJson(Map<String, dynamic> map) {
+		return SyncBatchRemedicalRecordRequest( 
+			remedicalRecordList: map['RemedicalRecordList'] != null ? (map['RemedicalRecordList'] as List).map((e)=>SyncRemedicalRecordRequest.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(remedicalRecordList != null)
+			map['RemedicalRecordList'] = remedicalRecordList;
+		return map;
+	}
+}
+
+class SyncUploadRemedicalDataRequest {
+	String? code;
+	DateTime? createTime;
+	DateTime? updateTime;
+	String? examCode;
+	String? previewFileToken;
+	String? fileToken;
+	int fileSize;
+	String? coverImageToken;
+	String? applicationCategory;
+	String? application;
+	RemedicalFileDataTypeEnum fileDataType;
+	ImageLocationDTO? imageLocation;
+
+	SyncUploadRemedicalDataRequest({
+		this.code,
+		this.createTime,
+		this.updateTime,
+		this.examCode,
+		this.previewFileToken,
+		this.fileToken,
+		this.fileSize = 0,
+		this.coverImageToken,
+		this.applicationCategory,
+		this.application,
+		this.fileDataType = RemedicalFileDataTypeEnum.VinnoVidSingle,
+		this.imageLocation,
+	});
+
+	factory SyncUploadRemedicalDataRequest.fromJson(Map<String, dynamic> map) {
+		return SyncUploadRemedicalDataRequest( 
+			code: map['Code'],
+			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
+			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
+			examCode: map['ExamCode'],
+			previewFileToken: map['PreviewFileToken'],
+			fileToken: map['FileToken'],
+			fileSize: map['FileSize'],
+			coverImageToken: map['CoverImageToken'],
+			applicationCategory: map['ApplicationCategory'],
+			application: map['Application'],
+			fileDataType: RemedicalFileDataTypeEnum.values.firstWhere((e) => e.index == map['FileDataType']),
+			imageLocation: map['ImageLocation'] != null ? ImageLocationDTO.fromJson(map['ImageLocation']) : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(code != null)
+			map['Code'] = code;
+		if(createTime != null)
+			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
+		if(updateTime != null)
+			map['UpdateTime'] = JsonRpcUtils.dateFormat(updateTime!);
+		if(examCode != null)
+			map['ExamCode'] = examCode;
+		if(previewFileToken != null)
+			map['PreviewFileToken'] = previewFileToken;
+		if(fileToken != null)
+			map['FileToken'] = fileToken;
+		map['FileSize'] = fileSize;
+		if(coverImageToken != null)
+			map['CoverImageToken'] = coverImageToken;
+		if(applicationCategory != null)
+			map['ApplicationCategory'] = applicationCategory;
+		if(application != null)
+			map['Application'] = application;
+		map['FileDataType'] = fileDataType.index;
+		if(imageLocation != null)
+			map['ImageLocation'] = imageLocation;
+		return map;
+	}
+}
+
+class SyncBatchUploadRemedicalDatasRequest {
+	List<SyncUploadRemedicalDataRequest >? syncUploadRemedicalDataList;
+
+	SyncBatchUploadRemedicalDatasRequest({
+		this.syncUploadRemedicalDataList,
+	});
+
+	factory SyncBatchUploadRemedicalDatasRequest.fromJson(Map<String, dynamic> map) {
+		return SyncBatchUploadRemedicalDatasRequest( 
+			syncUploadRemedicalDataList: map['SyncUploadRemedicalDataList'] != null ? (map['SyncUploadRemedicalDataList'] as List).map((e)=>SyncUploadRemedicalDataRequest.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(syncUploadRemedicalDataList != null)
+			map['SyncUploadRemedicalDataList'] = syncUploadRemedicalDataList;
+		return map;
+	}
+}
+
+class SyncAIResultRequest {
+	String? remedicalCode;
+	String? diagnosisResult;
+	DateTime? createTime;
+	DateTime? updateTime;
+
+	SyncAIResultRequest({
+		this.remedicalCode,
+		this.diagnosisResult,
+		this.createTime,
+		this.updateTime,
+	});
+
+	factory SyncAIResultRequest.fromJson(Map<String, dynamic> map) {
+		return SyncAIResultRequest( 
+			remedicalCode: map['RemedicalCode'],
+			diagnosisResult: map['DiagnosisResult'],
+			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
+			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(remedicalCode != null)
+			map['RemedicalCode'] = remedicalCode;
+		if(diagnosisResult != null)
+			map['DiagnosisResult'] = diagnosisResult;
+		if(createTime != null)
+			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
+		if(updateTime != null)
+			map['UpdateTime'] = JsonRpcUtils.dateFormat(updateTime!);
+		return map;
+	}
+}
+
+class SyncBatchAIResultRequest {
+	List<SyncAIResultRequest >? syncAIResultList;
+
+	SyncBatchAIResultRequest({
+		this.syncAIResultList,
+	});
+
+	factory SyncBatchAIResultRequest.fromJson(Map<String, dynamic> map) {
+		return SyncBatchAIResultRequest( 
+			syncAIResultList: map['SyncAIResultList'] != null ? (map['SyncAIResultList'] as List).map((e)=>SyncAIResultRequest.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(syncAIResultList != null)
+			map['SyncAIResultList'] = syncAIResultList;
+		return map;
+	}
+}
+
+class SyncBatchCarotidResultRequest {
+	List<GetCarotidResultRequest >? syncCarotidResultRequest;
+
+	SyncBatchCarotidResultRequest({
+		this.syncCarotidResultRequest,
+	});
+
+	factory SyncBatchCarotidResultRequest.fromJson(Map<String, dynamic> map) {
+		return SyncBatchCarotidResultRequest( 
+			syncCarotidResultRequest: map['SyncCarotidResultRequest'] != null ? (map['SyncCarotidResultRequest'] as List).map((e)=>GetCarotidResultRequest.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(syncCarotidResultRequest != null)
+			map['SyncCarotidResultRequest'] = syncCarotidResultRequest;
+		return map;
+	}
+}
+
 

+ 5 - 0
lib/services/report.dart

@@ -295,5 +295,10 @@ class ReportService extends JsonRpcClientBase {
 		return rpcRst;
 	}
 
+	Future<bool> syncBatchReportInfoAsync(SyncBatchReportInfoRequest request) async {
+		var rpcRst = await call("SyncBatchReportInfoAsync", request);
+		return rpcRst;
+	}
+
 }
 

+ 113 - 0
lib/services/report.m.dart

@@ -3,6 +3,8 @@ import 'remedical.m.dart';
 import 'liveConsultation.m.dart';
 import 'notification.m.dart';
 
+import 'package:fis_jsonrpc/utils.dart';
+
 enum ReportTemplateStatusTypeEnum {
 	Unpublished,
 	Published,
@@ -1637,4 +1639,115 @@ class RefreshReportPosterRequest extends TokenRequest{
 	}
 }
 
+class SyncReportInfoRequest {
+	String? reportCode;
+	DateTime? createTime;
+	DateTime? updateTime;
+	String? recordCode;
+	String? reportUserCode;
+	String? patientCode;
+	String? patientName;
+	String? deviceCode;
+	String? reportTemplateJson;
+	String? reportDatasJson;
+	List<String >? reportLabels;
+	List<String >? platformLabels;
+	List<String >? diagnosisLabels;
+	DiagnosisOrganEnum reportOrgan;
+	List<ReportPreviewDTO >? reportPreviewList;
+
+	SyncReportInfoRequest({
+		this.reportCode,
+		this.createTime,
+		this.updateTime,
+		this.recordCode,
+		this.reportUserCode,
+		this.patientCode,
+		this.patientName,
+		this.deviceCode,
+		this.reportTemplateJson,
+		this.reportDatasJson,
+		this.reportLabels,
+		this.platformLabels,
+		this.diagnosisLabels,
+		this.reportOrgan = DiagnosisOrganEnum.Null,
+		this.reportPreviewList,
+	});
+
+	factory SyncReportInfoRequest.fromJson(Map<String, dynamic> map) {
+		return SyncReportInfoRequest( 
+			reportCode: map['ReportCode'],
+			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
+			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
+			recordCode: map['RecordCode'],
+			reportUserCode: map['ReportUserCode'],
+			patientCode: map['PatientCode'],
+			patientName: map['PatientName'],
+			deviceCode: map['DeviceCode'],
+			reportTemplateJson: map['ReportTemplateJson'],
+			reportDatasJson: map['ReportDatasJson'],
+			reportLabels: map['ReportLabels'] != null ? map['ReportLabels'].cast<String>().toList() : null,
+			platformLabels: map['PlatformLabels'] != null ? map['PlatformLabels'].cast<String>().toList() : null,
+			diagnosisLabels: map['DiagnosisLabels'] != null ? map['DiagnosisLabels'].cast<String>().toList() : null,
+			reportOrgan: DiagnosisOrganEnum.values.firstWhere((e) => e.index == map['ReportOrgan']),
+			reportPreviewList: map['ReportPreviewList'] != null ? (map['ReportPreviewList'] as List).map((e)=>ReportPreviewDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(reportCode != null)
+			map['ReportCode'] = reportCode;
+		if(createTime != null)
+			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
+		if(updateTime != null)
+			map['UpdateTime'] = JsonRpcUtils.dateFormat(updateTime!);
+		if(recordCode != null)
+			map['RecordCode'] = recordCode;
+		if(reportUserCode != null)
+			map['ReportUserCode'] = reportUserCode;
+		if(patientCode != null)
+			map['PatientCode'] = patientCode;
+		if(patientName != null)
+			map['PatientName'] = patientName;
+		if(deviceCode != null)
+			map['DeviceCode'] = deviceCode;
+		if(reportTemplateJson != null)
+			map['ReportTemplateJson'] = reportTemplateJson;
+		if(reportDatasJson != null)
+			map['ReportDatasJson'] = reportDatasJson;
+		if(reportLabels != null)
+			map['ReportLabels'] = reportLabels;
+		if(platformLabels != null)
+			map['PlatformLabels'] = platformLabels;
+		if(diagnosisLabels != null)
+			map['DiagnosisLabels'] = diagnosisLabels;
+		map['ReportOrgan'] = reportOrgan.index;
+		if(reportPreviewList != null)
+			map['ReportPreviewList'] = reportPreviewList;
+		return map;
+	}
+}
+
+class SyncBatchReportInfoRequest {
+	List<SyncReportInfoRequest >? syncReportInfos;
+
+	SyncBatchReportInfoRequest({
+		this.syncReportInfos,
+	});
+
+	factory SyncBatchReportInfoRequest.fromJson(Map<String, dynamic> map) {
+		return SyncBatchReportInfoRequest( 
+			syncReportInfos: map['SyncReportInfos'] != null ? (map['SyncReportInfos'] as List).map((e)=>SyncReportInfoRequest.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(syncReportInfos != null)
+			map['SyncReportInfos'] = syncReportInfos;
+		return map;
+	}
+}
+
 

+ 9 - 0
lib/services/user.m.dart

@@ -1176,19 +1176,27 @@ class BatchInsertUserRequest extends TokenRequest{
 	}
 }
 
+enum MigrateRecordType {
+	Default,
+	MigrateDataCenter,
+}
+
 class MigrateRecordDTO {
 	DateTime? startTime;
 	DateTime? endTime;
+	MigrateRecordType type;
 
 	MigrateRecordDTO({
 		this.startTime,
 		this.endTime,
+		this.type = MigrateRecordType.Default,
 	});
 
 	factory MigrateRecordDTO.fromJson(Map<String, dynamic> map) {
 		return MigrateRecordDTO( 
 			startTime: map['StartTime'] != null ? DateTime.parse(map['StartTime']) : null,
 			endTime: map['EndTime'] != null ? DateTime.parse(map['EndTime']) : null,
+			type: MigrateRecordType.values.firstWhere((e) => e.index == map['Type']),
 		);
 	}
 
@@ -1198,6 +1206,7 @@ class MigrateRecordDTO {
 			map['StartTime'] = JsonRpcUtils.dateFormat(startTime!);
 		if(endTime != null)
 			map['EndTime'] = JsonRpcUtils.dateFormat(endTime!);
+		map['Type'] = type.index;
 		return map;
 	}
 }

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác