loki.wu hai 1 ano
pai
achega
18b51a853a

+ 3 - 0
lib/rpc.dart

@@ -59,6 +59,9 @@ class JsonRpcProxy {
 	AIDiagnosisService get aIDiagnosis =>
 	findService(() => new AIDiagnosisService(currentHostAddress));
 
+	AppletAPIService get appletAPI =>
+	findService(() => new AppletAPIService(currentHostAddress));
+
 	ASRService get aSR =>
 	findService(() => new ASRService(currentHostAddress));
 

+ 128 - 0
lib/services/appletAPI.dart

@@ -0,0 +1,128 @@
+import 'dart:core';
+
+import 'package:fis_jsonrpc/client_base.dart';
+import 'package:fis_common/json_convert.dart';
+
+import 'appletAPI.m.dart';
+
+import 'liveConsultation.m.dart';
+
+
+class AppletAPIService extends JsonRpcClientBase {
+	AppletAPIService(
+		String host, {
+		String serviceName = "IAppletAPIService",
+		Map<String, String>? headers,
+		int? timeout,
+	}) : super(
+						host,
+						serviceName,
+						headers: headers,
+						timeout: timeout,
+				) {
+		/// 注册响应实体反序列化处理器
+		FJsonConvert.setDecoder((map) => GetUserInfoByOpenIdResult.fromJson(map));
+		FJsonConvert.setDecoder((map) => PageResult<RemedicalRecordInfo>.fromJson(map));
+		FJsonConvert.setDecoder((map) => RemedicalRecordInfo.fromJson(map));
+		FJsonConvert.setDecoder((map) => ImageData.fromJson(map));
+		FJsonConvert.setDecoder((map) => ReportInfo.fromJson(map));
+		FJsonConvert.setDecoder((map) => PageResult<ConsultationInfo>.fromJson(map));
+		FJsonConvert.setDecoder((map) => ConsultationInfo.fromJson(map));
+		FJsonConvert.setDecoder((map) => OrganBaseInfo.fromJson(map));
+		FJsonConvert.setDecoder((map) => DoctorInfo.fromJson(map));
+	}
+
+	Future<GetUserInfoByOpenIdResult> getUserInfoByOpenIdAsync(GetUserInfoByOpenIdRequest request) async {
+		var rpcRst = await call("GetUserInfoByOpenIdAsync", request);
+		var result = GetUserInfoByOpenIdResult.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<bool> bindVcloudAccountAndOpenIdAsync(BindVcloudAccountAndOpenIdRequest request) async {
+		var rpcRst = await call("BindVcloudAccountAndOpenIdAsync", request);
+		return rpcRst;
+	}
+
+	Future<PageResult<RemedicalRecordInfo>> getRemedicalRecordListAsync(GetRemedicalRecordListRequest request) async {
+		var rpcRst = await call("GetRemedicalRecordListAsync", request);
+		var result = PageResult<RemedicalRecordInfo>.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<RemedicalRecordInfo> getRemedicalRecordDetailAsync(GetRemedicalRecordDetailRequest request) async {
+		var rpcRst = await call("GetRemedicalRecordDetailAsync", request);
+		var result = RemedicalRecordInfo.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<List<ImageData>> getRemedicalDataListAsync(GetRemedicalDataListRequest request) async {
+		var rpcRst = await call("GetRemedicalDataListAsync", request);
+		var result = (rpcRst as List).map((e)=>ImageData.fromJson(e as Map<String, dynamic>)).toList();
+		return result;
+	}
+
+	Future<List<ReportInfo>> getRemedicalReportListAsync(GetRemedicalReportListRequest request) async {
+		var rpcRst = await call("GetRemedicalReportListAsync", request);
+		var result = (rpcRst as List).map((e)=>ReportInfo.fromJson(e as Map<String, dynamic>)).toList();
+		return result;
+	}
+
+	Future<ReportInfo> getReportInfoDetailAsync(GetReportDetailRequest request) async {
+		var rpcRst = await call("GetReportInfoDetailAsync", request);
+		var result = ReportInfo.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<PageResult<ConsultationInfo>> getConsultationListAsync(GetConsultationListRequest request) async {
+		var rpcRst = await call("GetConsultationListAsync", request);
+		var result = PageResult<ConsultationInfo>.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<bool> createConsultationAsync(CreateConsultationRequest request) async {
+		var rpcRst = await call("CreateConsultationAsync", request);
+		return rpcRst;
+	}
+
+	Future<List<OrganBaseInfo>> getHospitalsAsync(GetHospitalsRequest request) async {
+		var rpcRst = await call("GetHospitalsAsync", request);
+		var result = (rpcRst as List).map((e)=>OrganBaseInfo.fromJson(e as Map<String, dynamic>)).toList();
+		return result;
+	}
+
+	Future<List<DoctorInfo>> getExpertsAsync(GetExpertsRequest request) async {
+		var rpcRst = await call("GetExpertsAsync", request);
+		var result = (rpcRst as List).map((e)=>DoctorInfo.fromJson(e as Map<String, dynamic>)).toList();
+		return result;
+	}
+
+	Future<List<String>> getDeviceModelsAsync(GetDeviceModelsRequest request) async {
+		var rpcRst = await call("GetDeviceModelsAsync", request);
+		var result = (rpcRst as List).cast<String>().toList();
+		return result;
+	}
+
+	Future<List<String>> getScanLocationsAsync(GetScanLocationsRequest request) async {
+		var rpcRst = await call("GetScanLocationsAsync", request);
+		var result = (rpcRst as List).cast<String>().toList();
+		return result;
+	}
+
+	Future<ConsultationInfo> getConsultationDetailAsync(GetConsultationDetailRequest request) async {
+		var rpcRst = await call("GetConsultationDetailAsync", request);
+		var result = ConsultationInfo.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<bool> startConsultationAsync(StartConsultationRequest request) async {
+		var rpcRst = await call("StartConsultationAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> consultationHeartRateAsync(ConsultationHeartRateRequest request) async {
+		var rpcRst = await call("ConsultationHeartRateAsync", request);
+		return rpcRst;
+	}
+
+}
+

+ 1045 - 0
lib/services/appletAPI.m.dart

@@ -0,0 +1,1045 @@
+import 'liveConsultation.m.dart';
+
+import 'package:fis_jsonrpc/utils.dart';
+
+class GetUserInfoByOpenIdResult {
+	String? accountName;
+	String? hospital;
+
+	GetUserInfoByOpenIdResult({
+		this.accountName,
+		this.hospital,
+	});
+
+	factory GetUserInfoByOpenIdResult.fromJson(Map<String, dynamic> map) {
+		return GetUserInfoByOpenIdResult( 
+			accountName: map['AccountName'],
+			hospital: map['Hospital'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(accountName != null)
+			map['AccountName'] = accountName;
+		if(hospital != null)
+			map['Hospital'] = hospital;
+		return map;
+	}
+}
+
+class AppletAPIBaseRequest {
+	String? openId;
+
+	AppletAPIBaseRequest({
+		this.openId,
+	});
+
+	factory AppletAPIBaseRequest.fromJson(Map<String, dynamic> map) {
+		return AppletAPIBaseRequest( 
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(openId != null)
+			map['OpenId'] = openId;
+		return map;
+	}
+}
+
+class GetUserInfoByOpenIdRequest extends AppletAPIBaseRequest{
+
+	GetUserInfoByOpenIdRequest({
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory GetUserInfoByOpenIdRequest.fromJson(Map<String, dynamic> map) {
+		return GetUserInfoByOpenIdRequest( 
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		return map;
+	}
+}
+
+class BindVcloudAccountAndOpenIdRequest {
+	String? account;
+	String? password;
+	String? openId;
+
+	BindVcloudAccountAndOpenIdRequest({
+		this.account,
+		this.password,
+		this.openId,
+	});
+
+	factory BindVcloudAccountAndOpenIdRequest.fromJson(Map<String, dynamic> map) {
+		return BindVcloudAccountAndOpenIdRequest( 
+			account: map['Account'],
+			password: map['Password'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(account != null)
+			map['Account'] = account;
+		if(password != null)
+			map['Password'] = password;
+		if(openId != null)
+			map['OpenId'] = openId;
+		return map;
+	}
+}
+
+enum RemedicalAIDiagnosisStatusEnum {
+	Null,
+	NoObviousLesion,
+	Benign,
+	Malignant,
+	BenignAndMalignant,
+}
+
+class RemedicalRecordInfo {
+	String? remedicalRecordId;
+	String? terminalDesc;
+	String? organizationDesc;
+	DateTime? createTime;
+	String? patientId;
+	String? patientName;
+	bool reportUploadStatus;
+	RemedicalAIDiagnosisStatusEnum aIDiagnosisStatus;
+
+	RemedicalRecordInfo({
+		this.remedicalRecordId,
+		this.terminalDesc,
+		this.organizationDesc,
+		this.createTime,
+		this.patientId,
+		this.patientName,
+		this.reportUploadStatus = false,
+		this.aIDiagnosisStatus = RemedicalAIDiagnosisStatusEnum.Null,
+	});
+
+	factory RemedicalRecordInfo.fromJson(Map<String, dynamic> map) {
+		return RemedicalRecordInfo( 
+			remedicalRecordId: map['RemedicalRecordId'],
+			terminalDesc: map['TerminalDesc'],
+			organizationDesc: map['OrganizationDesc'],
+			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
+			patientId: map['PatientId'],
+			patientName: map['PatientName'],
+			reportUploadStatus: map['ReportUploadStatus'],
+			aIDiagnosisStatus: RemedicalAIDiagnosisStatusEnum.values.firstWhere((e) => e.index == map['AIDiagnosisStatus']),
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(remedicalRecordId != null)
+			map['RemedicalRecordId'] = remedicalRecordId;
+		if(terminalDesc != null)
+			map['TerminalDesc'] = terminalDesc;
+		if(organizationDesc != null)
+			map['OrganizationDesc'] = organizationDesc;
+		if(createTime != null)
+			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
+		if(patientId != null)
+			map['PatientId'] = patientId;
+		if(patientName != null)
+			map['PatientName'] = patientName;
+		map['ReportUploadStatus'] = reportUploadStatus;
+		map['AIDiagnosisStatus'] = aIDiagnosisStatus.index;
+		return map;
+	}
+}
+
+class AppletAPIPageRequest extends AppletAPIBaseRequest{
+	int pageIndex;
+	int pageSize;
+
+	AppletAPIPageRequest({
+		this.pageIndex = 0,
+		this.pageSize = 0,
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory AppletAPIPageRequest.fromJson(Map<String, dynamic> map) {
+		return AppletAPIPageRequest( 
+			pageIndex: map['PageIndex'],
+			pageSize: map['PageSize'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		map['PageIndex'] = pageIndex;
+		map['PageSize'] = pageSize;
+		return map;
+	}
+}
+
+class GetRemedicalRecordListRequest extends AppletAPIPageRequest{
+	String? keyWord;
+	DateTime? startTime;
+	DateTime? endTime;
+
+	GetRemedicalRecordListRequest({
+		this.keyWord,
+		this.startTime,
+		this.endTime,
+		int pageIndex = 0,
+		int pageSize = 0,
+		String? openId,
+	}) : super(
+			pageIndex: pageIndex,
+			pageSize: pageSize,
+			openId: openId,
+		);
+
+	factory GetRemedicalRecordListRequest.fromJson(Map<String, dynamic> map) {
+		return GetRemedicalRecordListRequest( 
+			keyWord: map['KeyWord'],
+			startTime: map['StartTime'] != null ? DateTime.parse(map['StartTime']) : null,
+			endTime: map['EndTime'] != null ? DateTime.parse(map['EndTime']) : null,
+			pageIndex: map['PageIndex'],
+			pageSize: map['PageSize'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(keyWord != null)
+			map['KeyWord'] = keyWord;
+		if(startTime != null)
+			map['StartTime'] = JsonRpcUtils.dateFormat(startTime!);
+		if(endTime != null)
+			map['EndTime'] = JsonRpcUtils.dateFormat(endTime!);
+		return map;
+	}
+}
+
+class GetRemedicalRecordDetailRequest extends AppletAPIBaseRequest{
+	String? remedicalRecordId;
+
+	GetRemedicalRecordDetailRequest({
+		this.remedicalRecordId,
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory GetRemedicalRecordDetailRequest.fromJson(Map<String, dynamic> map) {
+		return GetRemedicalRecordDetailRequest( 
+			remedicalRecordId: map['RemedicalRecordId'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(remedicalRecordId != null)
+			map['RemedicalRecordId'] = remedicalRecordId;
+		return map;
+	}
+}
+
+class ImageFile {
+	String? id;
+	String? fileUrl;
+	DateTime? createTime;
+
+	ImageFile({
+		this.id,
+		this.fileUrl,
+		this.createTime,
+	});
+
+	factory ImageFile.fromJson(Map<String, dynamic> map) {
+		return ImageFile( 
+			id: map['Id'],
+			fileUrl: map['FileUrl'],
+			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(id != null)
+			map['Id'] = id;
+		if(fileUrl != null)
+			map['FileUrl'] = fileUrl;
+		if(createTime != null)
+			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
+		return map;
+	}
+}
+
+class IReadOnlyList<T> {
+	ImageFile? item;
+
+	IReadOnlyList({
+		this.item,
+	});
+
+	factory IReadOnlyList.fromJson(Map<String, dynamic> map) {
+		return IReadOnlyList( 
+			item: map['Item'] != null ? ImageFile.fromJson(map['Item']) : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(item != null)
+			map['Item'] = item;
+		return map;
+	}
+}
+
+class ImageData {
+	String? id;
+	RemedicalFileDataTypeEnum dataType;
+	String? application;
+	String? previewFileToken;
+	DateTime? createTime;
+	IReadOnlyList<ImageFile>? files;
+
+	ImageData({
+		this.id,
+		this.dataType = RemedicalFileDataTypeEnum.VinnoVidSingle,
+		this.application,
+		this.previewFileToken,
+		this.createTime,
+		this.files,
+	});
+
+	factory ImageData.fromJson(Map<String, dynamic> map) {
+		return ImageData( 
+			id: map['Id'],
+			dataType: RemedicalFileDataTypeEnum.values.firstWhere((e) => e.index == map['DataType']),
+			application: map['Application'],
+			previewFileToken: map['PreviewFileToken'],
+			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
+			files: map['Files'] != null ? (map['Files'] as List).map((e)=>ImageFile.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(id != null)
+			map['Id'] = id;
+		map['DataType'] = dataType.index;
+		if(application != null)
+			map['Application'] = application;
+		if(previewFileToken != null)
+			map['PreviewFileToken'] = previewFileToken;
+		if(createTime != null)
+			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
+		if(files != null)
+			map['Files'] = files;
+		return map;
+	}
+}
+
+class GetRemedicalDataListRequest extends AppletAPIPageRequest{
+	String? remedicalRecordId;
+
+	GetRemedicalDataListRequest({
+		this.remedicalRecordId,
+		int pageIndex = 0,
+		int pageSize = 0,
+		String? openId,
+	}) : super(
+			pageIndex: pageIndex,
+			pageSize: pageSize,
+			openId: openId,
+		);
+
+	factory GetRemedicalDataListRequest.fromJson(Map<String, dynamic> map) {
+		return GetRemedicalDataListRequest( 
+			remedicalRecordId: map['RemedicalRecordId'],
+			pageIndex: map['PageIndex'],
+			pageSize: map['PageSize'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(remedicalRecordId != null)
+			map['RemedicalRecordId'] = remedicalRecordId;
+		return map;
+	}
+}
+
+enum AppletAPIImageType {
+	placeHolder_0,
+	Local,
+	Ob,
+	WorkSheet,
+	Remote,
+	DigitalSignature,
+	AIDiagnosis,
+}
+
+class ReportImageInfo {
+	String? examDataId;
+	String? fileUrl;
+	AppletAPIImageType type;
+
+	ReportImageInfo({
+		this.examDataId,
+		this.fileUrl,
+		this.type = AppletAPIImageType.Local,
+	});
+
+	factory ReportImageInfo.fromJson(Map<String, dynamic> map) {
+		return ReportImageInfo( 
+			examDataId: map['ExamDataId'],
+			fileUrl: map['FileUrl'],
+			type: AppletAPIImageType.values.firstWhere((e) => e.index == map['Type']),
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(examDataId != null)
+			map['ExamDataId'] = examDataId;
+		if(fileUrl != null)
+			map['FileUrl'] = fileUrl;
+		map['Type'] = type.index;
+		return map;
+	}
+}
+
+class ReportInfo {
+	String? id;
+	IReadOnlyList<ReportImageInfo>? previewImages;
+
+	ReportInfo({
+		this.id,
+		this.previewImages,
+	});
+
+	factory ReportInfo.fromJson(Map<String, dynamic> map) {
+		return ReportInfo( 
+			id: map['Id'],
+			previewImages: map['PreviewImages'] != null ? (map['PreviewImages'] as List).map((e)=>ReportImageInfo.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(id != null)
+			map['Id'] = id;
+		if(previewImages != null)
+			map['PreviewImages'] = previewImages;
+		return map;
+	}
+}
+
+class GetRemedicalReportListRequest extends AppletAPIPageRequest{
+	String? remedicalRecordId;
+
+	GetRemedicalReportListRequest({
+		this.remedicalRecordId,
+		int pageIndex = 0,
+		int pageSize = 0,
+		String? openId,
+	}) : super(
+			pageIndex: pageIndex,
+			pageSize: pageSize,
+			openId: openId,
+		);
+
+	factory GetRemedicalReportListRequest.fromJson(Map<String, dynamic> map) {
+		return GetRemedicalReportListRequest( 
+			remedicalRecordId: map['RemedicalRecordId'],
+			pageIndex: map['PageIndex'],
+			pageSize: map['PageSize'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(remedicalRecordId != null)
+			map['RemedicalRecordId'] = remedicalRecordId;
+		return map;
+	}
+}
+
+class GetReportDetailRequest extends AppletAPIPageRequest{
+	String? reportId;
+
+	GetReportDetailRequest({
+		this.reportId,
+		int pageIndex = 0,
+		int pageSize = 0,
+		String? openId,
+	}) : super(
+			pageIndex: pageIndex,
+			pageSize: pageSize,
+			openId: openId,
+		);
+
+	factory GetReportDetailRequest.fromJson(Map<String, dynamic> map) {
+		return GetReportDetailRequest( 
+			reportId: map['ReportId'],
+			pageIndex: map['PageIndex'],
+			pageSize: map['PageSize'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(reportId != null)
+			map['ReportId'] = reportId;
+		return map;
+	}
+}
+
+enum PatientGenderEnum {
+	NotFilled,
+	Male,
+	Female,
+}
+
+class VideoTokenInfo {
+	String? videoToken;
+	String? previewToken;
+
+	VideoTokenInfo({
+		this.videoToken,
+		this.previewToken,
+	});
+
+	factory VideoTokenInfo.fromJson(Map<String, dynamic> map) {
+		return VideoTokenInfo( 
+			videoToken: map['VideoToken'],
+			previewToken: map['PreviewToken'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(videoToken != null)
+			map['VideoToken'] = videoToken;
+		if(previewToken != null)
+			map['PreviewToken'] = previewToken;
+		return map;
+	}
+}
+
+class ReportPreviewPdf {
+	String? reportId;
+	DateTime? updateTime;
+	String? previewPdfUrl;
+
+	ReportPreviewPdf({
+		this.reportId,
+		this.updateTime,
+		this.previewPdfUrl,
+	});
+
+	factory ReportPreviewPdf.fromJson(Map<String, dynamic> map) {
+		return ReportPreviewPdf( 
+			reportId: map['ReportId'],
+			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
+			previewPdfUrl: map['PreviewPdfUrl'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(reportId != null)
+			map['ReportId'] = reportId;
+		if(updateTime != null)
+			map['UpdateTime'] = JsonRpcUtils.dateFormat(updateTime!);
+		if(previewPdfUrl != null)
+			map['PreviewPdfUrl'] = previewPdfUrl;
+		return map;
+	}
+}
+
+class ConsultationInfo {
+	String? consultationId;
+	String? patientName;
+	PatientGenderEnum patientSex;
+	String? patientAge;
+	DateTime? birthday;
+	String? contactInfo;
+	String? patientID;
+	String? history;
+	String? primaryDiagnosis;
+	String? hospitalId;
+	String? hospitalName;
+	String? expertId;
+	String? expertName;
+	DateTime? consultationDate;
+	String? inspectionItems;
+	String? deviceModel;
+	String? terminalId;
+	IReadOnlyList<String>? imageTokens;
+	IReadOnlyList<VideoTokenInfo>? videoInfos;
+	IReadOnlyList<ReportPreviewPdf>? reportPreviewPdfs;
+
+	ConsultationInfo({
+		this.consultationId,
+		this.patientName,
+		this.patientSex = PatientGenderEnum.NotFilled,
+		this.patientAge,
+		this.birthday,
+		this.contactInfo,
+		this.patientID,
+		this.history,
+		this.primaryDiagnosis,
+		this.hospitalId,
+		this.hospitalName,
+		this.expertId,
+		this.expertName,
+		this.consultationDate,
+		this.inspectionItems,
+		this.deviceModel,
+		this.terminalId,
+		this.imageTokens,
+		this.videoInfos,
+		this.reportPreviewPdfs,
+	});
+
+	factory ConsultationInfo.fromJson(Map<String, dynamic> map) {
+		return ConsultationInfo( 
+			consultationId: map['ConsultationId'],
+			patientName: map['PatientName'],
+			patientSex: PatientGenderEnum.values.firstWhere((e) => e.index == map['PatientSex']),
+			patientAge: map['PatientAge'],
+			birthday: map['Birthday'] != null ? DateTime.parse(map['Birthday']) : null,
+			contactInfo: map['ContactInfo'],
+			patientID: map['PatientID'],
+			history: map['History'],
+			primaryDiagnosis: map['PrimaryDiagnosis'],
+			hospitalId: map['HospitalId'],
+			hospitalName: map['HospitalName'],
+			expertId: map['ExpertId'],
+			expertName: map['ExpertName'],
+			consultationDate: map['ConsultationDate'] != null ? DateTime.parse(map['ConsultationDate']) : null,
+			inspectionItems: map['InspectionItems'],
+			deviceModel: map['DeviceModel'],
+			terminalId: map['TerminalId'],
+			imageTokens: map['ImageTokens'] != null ? map['ImageTokens'].cast<String>().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,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(consultationId != null)
+			map['ConsultationId'] = consultationId;
+		if(patientName != null)
+			map['PatientName'] = patientName;
+		map['PatientSex'] = patientSex.index;
+		if(patientAge != null)
+			map['PatientAge'] = patientAge;
+		if(birthday != null)
+			map['Birthday'] = JsonRpcUtils.dateFormat(birthday!);
+		if(contactInfo != null)
+			map['ContactInfo'] = contactInfo;
+		if(patientID != null)
+			map['PatientID'] = patientID;
+		if(history != null)
+			map['History'] = history;
+		if(primaryDiagnosis != null)
+			map['PrimaryDiagnosis'] = primaryDiagnosis;
+		if(hospitalId != null)
+			map['HospitalId'] = hospitalId;
+		if(hospitalName != null)
+			map['HospitalName'] = hospitalName;
+		if(expertId != null)
+			map['ExpertId'] = expertId;
+		if(expertName != null)
+			map['ExpertName'] = expertName;
+		if(consultationDate != null)
+			map['ConsultationDate'] = JsonRpcUtils.dateFormat(consultationDate!);
+		if(inspectionItems != null)
+			map['InspectionItems'] = inspectionItems;
+		if(deviceModel != null)
+			map['DeviceModel'] = deviceModel;
+		if(terminalId != null)
+			map['TerminalId'] = terminalId;
+		if(imageTokens != null)
+			map['ImageTokens'] = imageTokens;
+		if(videoInfos != null)
+			map['VideoInfos'] = videoInfos;
+		if(reportPreviewPdfs != null)
+			map['ReportPreviewPdfs'] = reportPreviewPdfs;
+		return map;
+	}
+}
+
+class GetConsultationListRequest extends AppletAPIPageRequest{
+	String? keyWord;
+	DateTime? startTime;
+	DateTime? endTime;
+
+	GetConsultationListRequest({
+		this.keyWord,
+		this.startTime,
+		this.endTime,
+		int pageIndex = 0,
+		int pageSize = 0,
+		String? openId,
+	}) : super(
+			pageIndex: pageIndex,
+			pageSize: pageSize,
+			openId: openId,
+		);
+
+	factory GetConsultationListRequest.fromJson(Map<String, dynamic> map) {
+		return GetConsultationListRequest( 
+			keyWord: map['KeyWord'],
+			startTime: map['StartTime'] != null ? DateTime.parse(map['StartTime']) : null,
+			endTime: map['EndTime'] != null ? DateTime.parse(map['EndTime']) : null,
+			pageIndex: map['PageIndex'],
+			pageSize: map['PageSize'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(keyWord != null)
+			map['KeyWord'] = keyWord;
+		if(startTime != null)
+			map['StartTime'] = JsonRpcUtils.dateFormat(startTime!);
+		if(endTime != null)
+			map['EndTime'] = JsonRpcUtils.dateFormat(endTime!);
+		return map;
+	}
+}
+
+class CreateConsultationRequest extends AppletAPIBaseRequest{
+	String? patientName;
+	PatientGenderEnum patientSex;
+	String? patientAge;
+	DateTime? birthday;
+	String? contactInfo;
+	String? patientID;
+	String? history;
+	String? primaryDiagnosis;
+	String? hospitalId;
+	String? expertId;
+	DateTime? consultationDate;
+	String? inspectionItems;
+	String? deviceModel;
+	String? terminalId;
+
+	CreateConsultationRequest({
+		this.patientName,
+		this.patientSex = PatientGenderEnum.NotFilled,
+		this.patientAge,
+		this.birthday,
+		this.contactInfo,
+		this.patientID,
+		this.history,
+		this.primaryDiagnosis,
+		this.hospitalId,
+		this.expertId,
+		this.consultationDate,
+		this.inspectionItems,
+		this.deviceModel,
+		this.terminalId,
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory CreateConsultationRequest.fromJson(Map<String, dynamic> map) {
+		return CreateConsultationRequest( 
+			patientName: map['PatientName'],
+			patientSex: PatientGenderEnum.values.firstWhere((e) => e.index == map['PatientSex']),
+			patientAge: map['PatientAge'],
+			birthday: map['Birthday'] != null ? DateTime.parse(map['Birthday']) : null,
+			contactInfo: map['ContactInfo'],
+			patientID: map['PatientID'],
+			history: map['History'],
+			primaryDiagnosis: map['PrimaryDiagnosis'],
+			hospitalId: map['HospitalId'],
+			expertId: map['ExpertId'],
+			consultationDate: map['ConsultationDate'] != null ? DateTime.parse(map['ConsultationDate']) : null,
+			inspectionItems: map['InspectionItems'],
+			deviceModel: map['DeviceModel'],
+			terminalId: map['TerminalId'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(patientName != null)
+			map['PatientName'] = patientName;
+		map['PatientSex'] = patientSex.index;
+		if(patientAge != null)
+			map['PatientAge'] = patientAge;
+		if(birthday != null)
+			map['Birthday'] = JsonRpcUtils.dateFormat(birthday!);
+		if(contactInfo != null)
+			map['ContactInfo'] = contactInfo;
+		if(patientID != null)
+			map['PatientID'] = patientID;
+		if(history != null)
+			map['History'] = history;
+		if(primaryDiagnosis != null)
+			map['PrimaryDiagnosis'] = primaryDiagnosis;
+		if(hospitalId != null)
+			map['HospitalId'] = hospitalId;
+		if(expertId != null)
+			map['ExpertId'] = expertId;
+		if(consultationDate != null)
+			map['ConsultationDate'] = JsonRpcUtils.dateFormat(consultationDate!);
+		if(inspectionItems != null)
+			map['InspectionItems'] = inspectionItems;
+		if(deviceModel != null)
+			map['DeviceModel'] = deviceModel;
+		if(terminalId != null)
+			map['TerminalId'] = terminalId;
+		return map;
+	}
+}
+
+class OrganBaseInfo {
+	String? organizationId;
+	String? name;
+
+	OrganBaseInfo({
+		this.organizationId,
+		this.name,
+	});
+
+	factory OrganBaseInfo.fromJson(Map<String, dynamic> map) {
+		return OrganBaseInfo( 
+			organizationId: map['OrganizationId'],
+			name: map['Name'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(organizationId != null)
+			map['OrganizationId'] = organizationId;
+		if(name != null)
+			map['Name'] = name;
+		return map;
+	}
+}
+
+class GetHospitalsRequest extends AppletAPIBaseRequest{
+
+	GetHospitalsRequest({
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory GetHospitalsRequest.fromJson(Map<String, dynamic> map) {
+		return GetHospitalsRequest( 
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		return map;
+	}
+}
+
+class DoctorInfo {
+	String? id;
+	String? displayName;
+	String? fullName;
+	String? electronSignUrl;
+
+	DoctorInfo({
+		this.id,
+		this.displayName,
+		this.fullName,
+		this.electronSignUrl,
+	});
+
+	factory DoctorInfo.fromJson(Map<String, dynamic> map) {
+		return DoctorInfo( 
+			id: map['Id'],
+			displayName: map['DisplayName'],
+			fullName: map['FullName'],
+			electronSignUrl: map['ElectronSignUrl'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(id != null)
+			map['Id'] = id;
+		if(displayName != null)
+			map['DisplayName'] = displayName;
+		if(fullName != null)
+			map['FullName'] = fullName;
+		if(electronSignUrl != null)
+			map['ElectronSignUrl'] = electronSignUrl;
+		return map;
+	}
+}
+
+class GetExpertsRequest extends AppletAPIBaseRequest{
+	String? organizationId;
+
+	GetExpertsRequest({
+		this.organizationId,
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory GetExpertsRequest.fromJson(Map<String, dynamic> map) {
+		return GetExpertsRequest( 
+			organizationId: map['OrganizationId'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(organizationId != null)
+			map['OrganizationId'] = organizationId;
+		return map;
+	}
+}
+
+class GetDeviceModelsRequest extends AppletAPIBaseRequest{
+
+	GetDeviceModelsRequest({
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory GetDeviceModelsRequest.fromJson(Map<String, dynamic> map) {
+		return GetDeviceModelsRequest( 
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		return map;
+	}
+}
+
+class GetScanLocationsRequest extends AppletAPIBaseRequest{
+
+	GetScanLocationsRequest({
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory GetScanLocationsRequest.fromJson(Map<String, dynamic> map) {
+		return GetScanLocationsRequest( 
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		return map;
+	}
+}
+
+class GetConsultationDetailRequest extends AppletAPIBaseRequest{
+	String? consultationId;
+
+	GetConsultationDetailRequest({
+		this.consultationId,
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory GetConsultationDetailRequest.fromJson(Map<String, dynamic> map) {
+		return GetConsultationDetailRequest( 
+			consultationId: map['ConsultationId'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(consultationId != null)
+			map['ConsultationId'] = consultationId;
+		return map;
+	}
+}
+
+class StartConsultationRequest extends AppletAPIBaseRequest{
+	String? consultationId;
+
+	StartConsultationRequest({
+		this.consultationId,
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory StartConsultationRequest.fromJson(Map<String, dynamic> map) {
+		return StartConsultationRequest( 
+			consultationId: map['ConsultationId'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(consultationId != null)
+			map['ConsultationId'] = consultationId;
+		return map;
+	}
+}
+
+class ConsultationHeartRateRequest extends AppletAPIBaseRequest{
+	String? consultationId;
+
+	ConsultationHeartRateRequest({
+		this.consultationId,
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory ConsultationHeartRateRequest.fromJson(Map<String, dynamic> map) {
+		return ConsultationHeartRateRequest( 
+			consultationId: map['ConsultationId'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(consultationId != null)
+			map['ConsultationId'] = consultationId;
+		return map;
+	}
+}
+
+

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

@@ -7259,6 +7259,7 @@ enum CustomerRpcCode {
 	VideosIsEmpty,
 	AlbumNameIsEmpty,
 	ClassTeacherCodeNotAddedClass,
+	UserGroupNameNotRepeat,
 }
 
 class ValidateTokenResult {

+ 17 - 12
lib/services/device.m.dart

@@ -1,8 +1,6 @@
 import 'liveConsultation.m.dart';
 import 'notification.m.dart';
 
-import 'package:fis_jsonrpc/utils.dart';
-
 import 'package:fis_common/json_convert.dart';
 
 class UploadDeviceDTO extends BaseDTO{
@@ -1940,9 +1938,11 @@ class ControlDeviceConnectRequest extends BaseControlDeviceRequest{
 
 class ControlDeviceParameterRequest extends BaseControlDeviceParameterRequest{
 	String? deviceCode;
+	String? consultationCode;
 
 	ControlDeviceParameterRequest({
 		this.deviceCode,
+		this.consultationCode,
 		List<AdditionParameterDTO >? parameters,
 		ControlDeviceParameterEnum controlType = ControlDeviceParameterEnum.Start,
 		bool isNeedSyn = false,
@@ -1957,6 +1957,7 @@ class ControlDeviceParameterRequest extends BaseControlDeviceParameterRequest{
 	factory ControlDeviceParameterRequest.fromJson(Map<String, dynamic> map) {
 		return ControlDeviceParameterRequest( 
 			deviceCode: map['DeviceCode'],
+			consultationCode: map['ConsultationCode'],
 			parameters: map['Parameters'] != null ? (map['Parameters'] as List).map((e)=>AdditionParameterDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
 			controlType: ControlDeviceParameterEnum.values.firstWhere((e) => e.index == map['ControlType']),
 			isNeedSyn: map['IsNeedSyn'],
@@ -1968,19 +1969,27 @@ class ControlDeviceParameterRequest extends BaseControlDeviceParameterRequest{
 		final map = super.toJson();
 		if(deviceCode != null)
 			map['DeviceCode'] = deviceCode;
+		if(consultationCode != null)
+			map['ConsultationCode'] = consultationCode;
 		return map;
 	}
 }
 
+enum LogTimeEnum {
+	All,
+	Today,
+	OneWeek,
+	OneMonth,
+	OneYear,
+}
+
 class GetRemoteLogRequest extends TokenRequest{
 	String? deviceCode;
-	DateTime? startTime;
-	DateTime? endTime;
+	LogTimeEnum logTime;
 
 	GetRemoteLogRequest({
 		this.deviceCode,
-		this.startTime,
-		this.endTime,
+		this.logTime = LogTimeEnum.All,
 		String? token,
 	}) : super(
 			token: token,
@@ -1989,8 +1998,7 @@ class GetRemoteLogRequest extends TokenRequest{
 	factory GetRemoteLogRequest.fromJson(Map<String, dynamic> map) {
 		return GetRemoteLogRequest( 
 			deviceCode: map['DeviceCode'],
-			startTime: map['StartTime'] != null ? DateTime.parse(map['StartTime']) : null,
-			endTime: map['EndTime'] != null ? DateTime.parse(map['EndTime']) : null,
+			logTime: LogTimeEnum.values.firstWhere((e) => e.index == map['LogTime']),
 			token: map['Token'],
 		);
 	}
@@ -1999,10 +2007,7 @@ class GetRemoteLogRequest extends TokenRequest{
 		final map = super.toJson();
 		if(deviceCode != null)
 			map['DeviceCode'] = deviceCode;
-		if(startTime != null)
-			map['StartTime'] = JsonRpcUtils.dateFormat(startTime!);
-		if(endTime != null)
-			map['EndTime'] = JsonRpcUtils.dateFormat(endTime!);
+		map['LogTime'] = logTime.index;
 		return map;
 	}
 }

+ 2 - 2
lib/services/education.dart

@@ -261,9 +261,9 @@ class EducationService extends JsonRpcClientBase {
 		return rpcRst;
 	}
 
-	Future<List<UserGroupDTO>> findUserGroupByStudentAsync(FindUserGroupByStudentRequest request) async {
+	Future<PageResult<UserGroupDTO>> findUserGroupByStudentAsync(QueryUserGroupPageRequest request) async {
 		var rpcRst = await call("FindUserGroupByStudentAsync", request);
-		var result = (rpcRst as List).map((e)=>UserGroupDTO.fromJson(e as Map<String, dynamic>)).toList();
+		var result = PageResult<UserGroupDTO>.fromJson(rpcRst as Map<String, dynamic>);
 		return result;
 	}
 

+ 137 - 26
lib/services/education.m.dart

@@ -998,6 +998,7 @@ class BaseCourseInfoDTO {
 	bool isStick;
 	int sort;
 	int playCount;
+	int signInCount;
 
 	BaseCourseInfoDTO({
 		this.code,
@@ -1030,6 +1031,7 @@ class BaseCourseInfoDTO {
 		this.isStick = false,
 		this.sort = 0,
 		this.playCount = 0,
+		this.signInCount = 0,
 	});
 
 	factory BaseCourseInfoDTO.fromJson(Map<String, dynamic> map) {
@@ -1064,6 +1066,7 @@ class BaseCourseInfoDTO {
 			isStick: map['IsStick'],
 			sort: map['Sort'],
 			playCount: map['PlayCount'],
+			signInCount: map['SignInCount'],
 		);
 	}
 
@@ -1119,6 +1122,7 @@ class BaseCourseInfoDTO {
 		map['IsStick'] = isStick;
 		map['Sort'] = sort;
 		map['PlayCount'] = playCount;
+		map['SignInCount'] = signInCount;
 		return map;
 	}
 }
@@ -1283,6 +1287,7 @@ class CourseInfoDetailDTO extends BaseCourseInfoDTO{
 		bool isStick = false,
 		int sort = 0,
 		int playCount = 0,
+		int signInCount = 0,
 	}) : super(
 			code: code,
 			name: name,
@@ -1314,6 +1319,7 @@ class CourseInfoDetailDTO extends BaseCourseInfoDTO{
 			isStick: isStick,
 			sort: sort,
 			playCount: playCount,
+			signInCount: signInCount,
 		);
 
 	factory CourseInfoDetailDTO.fromJson(Map<String, dynamic> map) {
@@ -1356,6 +1362,7 @@ class CourseInfoDetailDTO extends BaseCourseInfoDTO{
 			isStick: map['IsStick'],
 			sort: map['Sort'],
 			playCount: map['PlayCount'],
+			signInCount: map['SignInCount'],
 		);
 	}
 
@@ -3166,26 +3173,6 @@ class StudentLeaveCourseUserGroupRequest extends TokenRequest{
 	}
 }
 
-class FindUserGroupByStudentRequest extends TokenRequest{
-
-	FindUserGroupByStudentRequest({
-		String? token,
-	}) : super(
-			token: token,
-		);
-
-	factory FindUserGroupByStudentRequest.fromJson(Map<String, dynamic> map) {
-		return FindUserGroupByStudentRequest( 
-			token: map['Token'],
-		);
-	}
-
-	Map<String, dynamic> toJson() {
-		final map = super.toJson();
-		return map;
-	}
-}
-
 class StudyCompletedRequest {
 	String? courseCode;
 	String? studentCode;
@@ -3305,24 +3292,139 @@ class DeleteCourseAlbumRequest {
 	}
 }
 
-class CourseAlbumDetailDTO {
+class CourseAlbumDTO extends BaseCourseAlbumDTO{
+	String? cover;
+	List<String >? courseCodes;
+	String? introduction;
+	List<String >? courseLabelCodes;
+	String? teacherCode;
+	String? teacherName;
+	CourseViewRangeEnum viewRange;
+	Decimal? 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,
+		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: map['Price'] != null ? Decimal.fromJson(map['Price']) : null,
+			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;
+		if(price != null)
+			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,
+		Decimal? price,
+		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: map['Price'] != null ? Decimal.fromJson(map['Price']) : null,
+			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 = Map<String, dynamic>();
+		final map = super.toJson();
 		if(courseInfos != null)
 			map['CourseInfos'] = courseInfos;
 		map['StudentCount'] = studentCount;
@@ -3330,23 +3432,32 @@ class CourseAlbumDetailDTO {
 	}
 }
 
-class FindCourseAlbumByCodeRequest {
+class FindCourseAlbumByCodeRequest extends TokenRequest{
 	String? courseAlbumCode;
+	String? languageCode;
 
 	FindCourseAlbumByCodeRequest({
 		this.courseAlbumCode,
-	});
+		this.languageCode,
+		String? token,
+	}) : super(
+			token: token,
+		);
 
 	factory FindCourseAlbumByCodeRequest.fromJson(Map<String, dynamic> map) {
 		return FindCourseAlbumByCodeRequest( 
 			courseAlbumCode: map['CourseAlbumCode'],
+			languageCode: map['LanguageCode'],
+			token: map['Token'],
 		);
 	}
 
 	Map<String, dynamic> toJson() {
-		final map = Map<String, dynamic>();
+		final map = super.toJson();
 		if(courseAlbumCode != null)
 			map['CourseAlbumCode'] = courseAlbumCode;
+		if(languageCode != null)
+			map['LanguageCode'] = languageCode;
 		return map;
 	}
 }

+ 2 - 0
lib/services/index.dart

@@ -1,4 +1,5 @@
 export 'aIDiagnosis.dart';
+export 'appletAPI.dart';
 export 'aSR.dart';
 export 'authentication.dart';
 export 'connect.dart';
@@ -28,6 +29,7 @@ export 'upgrade.dart';
 export 'user.dart';
 export 'vinnoServer.dart';
 export 'aIDiagnosis.m.dart';
+export 'appletAPI.m.dart';
 export 'aSR.m.dart';
 export 'authentication.m.dart';
 export 'connect.m.dart';

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

@@ -2911,6 +2911,7 @@ class GetRemoteLogToClientNotification extends NotificationDTO{
 	String? logFileToken;
 	int rate;
 	RemoteDeviceStateEnum remoteDeviceState;
+	String? fileName;
 
 	GetRemoteLogToClientNotification({
 		NotificationTypeEnum notificationType = NotificationTypeEnum.Unknown,
@@ -2918,6 +2919,7 @@ class GetRemoteLogToClientNotification extends NotificationDTO{
 		this.logFileToken,
 		this.rate = 0,
 		this.remoteDeviceState = RemoteDeviceStateEnum.Unknown,
+		this.fileName,
 		String? code,
 		bool isResponse = false,
 	}) : super(
@@ -2933,6 +2935,7 @@ class GetRemoteLogToClientNotification extends NotificationDTO{
 			logFileToken: map['LogFileToken'],
 			rate: map['Rate'],
 			remoteDeviceState: RemoteDeviceStateEnum.values.firstWhere((e) => e.index == map['RemoteDeviceState']),
+			fileName: map['FileName'],
 			code: map['Code'],
 			isResponse: map['IsResponse'],
 		);
@@ -2946,6 +2949,8 @@ class GetRemoteLogToClientNotification extends NotificationDTO{
 			map['LogFileToken'] = logFileToken;
 		map['Rate'] = rate;
 		map['RemoteDeviceState'] = remoteDeviceState.index;
+		if(fileName != null)
+			map['FileName'] = fileName;
 		return map;
 	}
 }

+ 93 - 89
lib/services/other.m.dart

@@ -11,6 +11,7 @@ import 'organization.m.dart';
 import 'device.m.dart';
 import 'education.m.dart';
 import 'connect.m.dart';
+import 'appletAPI.m.dart';
 import 'aIDiagnosis.m.dart';
 import 'storage.m.dart';
 import 'report.m.dart';
@@ -1084,6 +1085,26 @@ class AddExaminationPaperRequest extends TokenRequest{
 	}
 }
 
+class FindUserGroupByStudentRequest extends TokenRequest{
+
+	FindUserGroupByStudentRequest({
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory FindUserGroupByStudentRequest.fromJson(Map<String, dynamic> map) {
+		return FindUserGroupByStudentRequest( 
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		return map;
+	}
+}
+
 class CourseLabelRequest extends TokenRequest{
 	String? code;
 	List<LabelLanguageConfigDTO >? labelLanguageConfigs;
@@ -7817,6 +7838,62 @@ class FindVideosByCourseCodeRequest extends TokenRequest{
 	}
 }
 
+class GetConsultationDataRequest extends AppletAPIBaseRequest{
+	String? consultationId;
+
+	GetConsultationDataRequest({
+		this.consultationId,
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory GetConsultationDataRequest.fromJson(Map<String, dynamic> map) {
+		return GetConsultationDataRequest( 
+			consultationId: map['ConsultationId'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(consultationId != null)
+			map['ConsultationId'] = consultationId;
+		return map;
+	}
+}
+
+class GetConsultationReportListRequest extends AppletAPIPageRequest{
+	String? consultationId;
+
+	GetConsultationReportListRequest({
+		this.consultationId,
+		int pageIndex = 0,
+		int pageSize = 0,
+		String? openId,
+	}) : super(
+			pageIndex: pageIndex,
+			pageSize: pageSize,
+			openId: openId,
+		);
+
+	factory GetConsultationReportListRequest.fromJson(Map<String, dynamic> map) {
+		return GetConsultationReportListRequest( 
+			consultationId: map['ConsultationId'],
+			pageIndex: map['PageIndex'],
+			pageSize: map['PageSize'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(consultationId != null)
+			map['ConsultationId'] = consultationId;
+		return map;
+	}
+}
+
 class GetOpLogsByCodesFormMasterRequest {
 	List<String >? codes;
 
@@ -8300,6 +8377,20 @@ enum MessageCategoryEnum {
 	Course,
 }
 
+enum ConsultationState {
+	Unhandled,
+	Withdrawn,
+	Handled,
+	Started,
+	WaitForReportUpload,
+	ReportUploading,
+	ReportUploaded,
+	ReportUploadFailed,
+	Expired,
+	Qualified,
+	UnQualified,
+}
+
 enum UpgradeEnum {
 	Windows,
 	Android,
@@ -9480,12 +9571,6 @@ enum LoginProcessorTypeEnum {
 	Unregistered,
 }
 
-enum PatientGenderEnum {
-	NotFilled,
-	Male,
-	Female,
-}
-
 enum AnimalGenderEnum {
 	AnimalInfoNotFilled,
 	AnimalInfoMale,
@@ -9503,14 +9588,6 @@ enum RelevanceTypeEnum {
 	Course,
 }
 
-enum RemedicalAIDiagnosisStatusEnum {
-	Null,
-	NoObviousLesion,
-	Benign,
-	Malignant,
-	BenignAndMalignant,
-}
-
 enum RemedicalApparatusTypeEnum {
 	BreastOuterUpper,
 	BreastInnerUpper,
@@ -9598,6 +9675,8 @@ enum WSConnectTypeEnum {
 	Default,
 	ConsultationSecondWindow,
 	EducationSecondWindow,
+	RemoteConnectSecondWindow,
+	AppletAPI,
 }
 
 enum ASETypeEnum {
@@ -16152,81 +16231,6 @@ class CommandResultPageSettingInfoDTO extends ListPageSettingInfoDTO{
 	}
 }
 
-class CourseAlbumDTO extends BaseCourseAlbumDTO{
-	String? cover;
-	List<String >? courseCodes;
-	String? introduction;
-	List<String >? courseLabelCodes;
-	String? teacherCode;
-	String? teacherName;
-	CourseViewRangeEnum viewRange;
-	Decimal? 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,
-		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: map['Price'] != null ? Decimal.fromJson(map['Price']) : null,
-			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;
-		if(price != null)
-			map['Price'] = price;
-		if(createTime != null)
-			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
-		map['Sort'] = sort;
-		map['IsStick'] = isStick;
-		return map;
-	}
-}
-
 class BaseCoursePageDTO {
 	String? code;
 	String? name;