浏览代码

更新接口

loki.wu 1 年之前
父节点
当前提交
95edf72bba

+ 3 - 0
lib/rpc.dart

@@ -110,6 +110,9 @@ class JsonRpcProxy {
 	RankService get rank =>
 	findService(() => new RankService(currentHostAddress));
 
+	RecognitionService get recognition =>
+	findService(() => new RecognitionService(currentHostAddress));
+
 	RecordInfoService get recordInfo =>
 	findService(() => new RecordInfoService(currentHostAddress));
 

+ 25 - 0
lib/services/appletAPI.dart

@@ -39,6 +39,31 @@ class AppletAPIService extends JsonRpcClientBase {
 		FJsonConvert.setDecoder((map) => ReportResultInfo.fromJson(map));
 	}
 
+	Future<bool> serviceIsExist() async {
+		var rpcRst = await call("ServiceIsExist", );
+		return rpcRst;
+	}
+
+	Future<bool> liveMemberLeaveAsync(LiveMemberLeaveRequest request) async {
+		var rpcRst = await call("LiveMemberLeaveAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> liveMemberRejectAsync(LiveMemberRejectRequest request) async {
+		var rpcRst = await call("LiveMemberRejectAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> liveMemberAcceptAsync(LiveMemberAcceptRequest request) async {
+		var rpcRst = await call("LiveMemberAcceptAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> liveMemberTimeoutAsync(LiveMemberTimeoutRequest request) async {
+		var rpcRst = await call("LiveMemberTimeoutAsync", request);
+		return rpcRst;
+	}
+
 	Future<GetUserInfoByOpenIdResult> getUserInfoByOpenIdAsync(GetUserInfoByOpenIdRequest request) async {
 		var rpcRst = await call("GetUserInfoByOpenIdAsync", request);
 		var result = GetUserInfoByOpenIdResult.fromJson(rpcRst as Map<String, dynamic>);

+ 137 - 36
lib/services/appletAPI.m.dart

@@ -3,6 +3,143 @@ import 'notification.m.dart';
 
 import 'package:fis_jsonrpc/utils.dart';
 
+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 LiveMemberLeaveRequest extends AppletAPIBaseRequest{
+	String? consultationId;
+
+	LiveMemberLeaveRequest({
+		this.consultationId,
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory LiveMemberLeaveRequest.fromJson(Map<String, dynamic> map) {
+		return LiveMemberLeaveRequest( 
+			consultationId: map['ConsultationId'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (consultationId != null)
+			map['ConsultationId'] = consultationId;
+		return map;
+	}
+}
+
+class LiveMemberRejectRequest extends AppletAPIBaseRequest{
+	String? consultationId;
+	String? userId;
+
+	LiveMemberRejectRequest({
+		this.consultationId,
+		this.userId,
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory LiveMemberRejectRequest.fromJson(Map<String, dynamic> map) {
+		return LiveMemberRejectRequest( 
+			consultationId: map['ConsultationId'],
+			userId: map['UserId'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (consultationId != null)
+			map['ConsultationId'] = consultationId;
+		if (userId != null)
+			map['UserId'] = userId;
+		return map;
+	}
+}
+
+class LiveMemberAcceptRequest extends AppletAPIBaseRequest{
+	String? consultationId;
+	String? userId;
+
+	LiveMemberAcceptRequest({
+		this.consultationId,
+		this.userId,
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory LiveMemberAcceptRequest.fromJson(Map<String, dynamic> map) {
+		return LiveMemberAcceptRequest( 
+			consultationId: map['ConsultationId'],
+			userId: map['UserId'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (consultationId != null)
+			map['ConsultationId'] = consultationId;
+		if (userId != null)
+			map['UserId'] = userId;
+		return map;
+	}
+}
+
+class LiveMemberTimeoutRequest extends AppletAPIBaseRequest{
+	String? consultationId;
+	String? userId;
+
+	LiveMemberTimeoutRequest({
+		this.consultationId,
+		this.userId,
+		String? openId,
+	}) : super(
+			openId: openId,
+		);
+
+	factory LiveMemberTimeoutRequest.fromJson(Map<String, dynamic> map) {
+		return LiveMemberTimeoutRequest( 
+			consultationId: map['ConsultationId'],
+			userId: map['UserId'],
+			openId: map['OpenId'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (consultationId != null)
+			map['ConsultationId'] = consultationId;
+		if (userId != null)
+			map['UserId'] = userId;
+		return map;
+	}
+}
+
 class GetUserInfoByOpenIdResult {
 	String? nickName;
 	String? hospital;
@@ -37,28 +174,6 @@ class GetUserInfoByOpenIdResult {
 	}
 }
 
-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({
@@ -2065,20 +2180,6 @@ class ReportMeasureElementMessage {
 	}
 }
 
-enum QualifiedState {
-	UnSet,
-	Qualified,
-	UnQualified,
-}
-
-enum QualityType {
-	None,
-	Qualified,
-	InformationUnCompleted,
-	ImageNotClear,
-	PositiveSiteNotClear,
-}
-
 class ReportResultInfo {
 	String? id;
 	List<ReportImageInfo>? previewImages;

+ 5 - 0
lib/services/authentication.dart

@@ -98,6 +98,11 @@ class AuthenticationService extends JsonRpcClientBase {
 		return result;
 	}
 
+	Future<bool> refreshBlackInfosAsync(TokenRequest request) async {
+		var rpcRst = await call("RefreshBlackInfosAsync", request);
+		return rpcRst;
+	}
+
 	Future<bool> setTokenInstallVersionAsync(SetTokenInstallVersionRequest request) async {
 		var rpcRst = await call("SetTokenInstallVersionAsync", request);
 		return rpcRst;

+ 18 - 11
lib/services/authentication.m.dart

@@ -1088,9 +1088,9 @@ enum CustomerRpcCode {
 	EmergencyExpertNotFound,
 	DeviceLiveClosed,
 	DeviceInOtherConsultation,
-	placeHolder_862,
-	placeHolder_863,
-	placeHolder_864,
+	ConsultationReportQualityControlled,
+	ConsultationOtherReportQualityControlled,
+	ConsultationReportNotQualityControl,
 	placeHolder_865,
 	placeHolder_866,
 	placeHolder_867,
@@ -3303,7 +3303,7 @@ enum CustomerRpcCode {
 	OrgShortCodeError,
 	DeviceNameExisted,
 	AddDeviceAccountFailed,
-	placeHolder_3077,
+	AdminOldPasswordError,
 	placeHolder_3078,
 	placeHolder_3079,
 	placeHolder_3080,
@@ -4295,13 +4295,13 @@ enum CustomerRpcCode {
 	MeasureDataIsEmpty,
 	CanNotCollect,
 	NoDeleteRecordFeature,
-	placeHolder_4069,
-	placeHolder_4070,
-	placeHolder_4071,
-	placeHolder_4072,
-	placeHolder_4073,
-	placeHolder_4074,
-	placeHolder_4075,
+	NoUserGroupsFeature,
+	RecordImgQualityControlled,
+	RecordOtherImgQualityControlled,
+	RecordImgNotQualityControl,
+	RecordReportQualityControlled,
+	RecordOtherReportQualityControlled,
+	RecordReportNotQualityControl,
 	placeHolder_4076,
 	placeHolder_4077,
 	placeHolder_4078,
@@ -7306,6 +7306,13 @@ enum CustomerRpcCode {
 	UserAndDeviceNoSameOrganization,
 	FISVinnoNotAddParentOrg,
 	DeviceNotSupport,
+	CourseLabelENNameRepeat,
+	CourseLabelCNNameRepeat,
+	CourseLabelRUNameRepeat,
+	CourseLabelESNameRepeat,
+	CourseVideoDurationNotZero,
+	CourseVisitorNameIsUsed,
+	CourseVisitorRecordSaveFail,
 }
 
 class ValidateTokenResult {

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

@@ -1676,10 +1676,10 @@ class DeviceServerSettingResult {
 	int mergedVideoOutputWidth;
 	int mergedVideoOutputHeight;
 	bool isSelfRtcService;
-	int remoteControlAskTimeoutSec;
 	String? liveProtocol;
 	TransactionStatusEnum liveProtocolType;
 	String? fISWebUrl;
+	int remoteControlHeartRateSeconds;
 
 	DeviceServerSettingResult({
 		this.serverConfigList,
@@ -1692,10 +1692,10 @@ class DeviceServerSettingResult {
 		this.mergedVideoOutputWidth = 0,
 		this.mergedVideoOutputHeight = 0,
 		this.isSelfRtcService = false,
-		this.remoteControlAskTimeoutSec = 0,
 		this.liveProtocol,
 		this.liveProtocolType = TransactionStatusEnum.Applied,
 		this.fISWebUrl,
+		this.remoteControlHeartRateSeconds = 0,
 	});
 
 	factory DeviceServerSettingResult.fromJson(Map<String, dynamic> map) {
@@ -1710,10 +1710,10 @@ class DeviceServerSettingResult {
 			mergedVideoOutputWidth: map['MergedVideoOutputWidth'],
 			mergedVideoOutputHeight: map['MergedVideoOutputHeight'],
 			isSelfRtcService: map['IsSelfRtcService'],
-			remoteControlAskTimeoutSec: map['RemoteControlAskTimeoutSec'],
 			liveProtocol: map['LiveProtocol'],
 			liveProtocolType: TransactionStatusEnum.values.firstWhere((e) => e.index == map['LiveProtocolType']),
 			fISWebUrl: map['FISWebUrl'],
+			remoteControlHeartRateSeconds: map['RemoteControlHeartRateSeconds'],
 		);
 	}
 
@@ -1733,7 +1733,6 @@ class DeviceServerSettingResult {
 		map['MergedVideoOutputWidth'] = mergedVideoOutputWidth;
 		map['MergedVideoOutputHeight'] = mergedVideoOutputHeight;
 		map['IsSelfRtcService'] = isSelfRtcService;
-		map['RemoteControlAskTimeoutSec'] = remoteControlAskTimeoutSec;
 		if (liveProtocol != null) {
 			map['LiveProtocol'] = liveProtocol;
 		}
@@ -1741,6 +1740,7 @@ class DeviceServerSettingResult {
 		if (fISWebUrl != null) {
 			map['FISWebUrl'] = fISWebUrl;
 		}
+		map['RemoteControlHeartRateSeconds'] = remoteControlHeartRateSeconds;
 		return map;
 	}
 }

+ 41 - 0
lib/services/education.dart

@@ -52,6 +52,9 @@ class EducationService extends JsonRpcClientBase {
 		FJsonConvert.setDecoder((map) => PageResult<UserExtendDTO>.fromJson(map));
 		FJsonConvert.setDecoder((map) => UserExtendDTO.fromJson(map));
 		FJsonConvert.setDecoder((map) => UserBaseDTO.fromJson(map));
+		FJsonConvert.setDecoder((map) => PageResult<CourseBrowsedRecordDTO>.fromJson(map));
+		FJsonConvert.setDecoder((map) => CourseBrowsedRecordDTO.fromJson(map));
+		FJsonConvert.setDecoder((map) => CourseVisitorsStatisticResult.fromJson(map));
 	}
 
 	Future<List<CourseLabelDTO>> getCourseLabelsAsync(QueryCourseLabelListRequest request) async {
@@ -402,5 +405,43 @@ class EducationService extends JsonRpcClientBase {
 		return rpcRst;
 	}
 
+	Future<String> saveCourseBrowsedRecordAsync(CourseBrowsedRecordRequest request) async {
+		var rpcRst = await call("SaveCourseBrowsedRecordAsync", request);
+		return rpcRst;
+	}
+
+	Future<PageResult<CourseBrowsedRecordDTO>> queryCourseBrowsedRecordsAsync(QueryBrowsedRecordPageRequest request) async {
+		var rpcRst = await call("QueryCourseBrowsedRecordsAsync", request);
+		var result = PageResult<CourseBrowsedRecordDTO>.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<bool> visitorHeartRateAsync(QueryBrowsedRecordRequest request) async {
+		var rpcRst = await call("VisitorHeartRateAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> visitorLeaveLiveCourseAsync(QueryBrowsedRecordRequest request) async {
+		var rpcRst = await call("VisitorLeaveLiveCourseAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> setCourseLiveProhibitionAsync(CourseLiveProhibitionRequest request) async {
+		var rpcRst = await call("SetCourseLiveProhibitionAsync", request);
+		return rpcRst;
+	}
+
+	Future<CourseVisitorsStatisticResult> queryCourseBrowsedCountAsync(QueryBrowsedRecordRequest request) async {
+		var rpcRst = await call("QueryCourseBrowsedCountAsync", request);
+		var result = CourseVisitorsStatisticResult.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<CourseBrowsedRecordDTO> getCourseBrowsedRecordByRelevanceCodeAsync(QueryBrowsedRecordRequest request) async {
+		var rpcRst = await call("GetCourseBrowsedRecordByRelevanceCodeAsync", request);
+		var result = CourseBrowsedRecordDTO.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
 }
 

+ 410 - 4
lib/services/education.m.dart

@@ -50,16 +50,19 @@ enum LabelTypeEnum {
 class LabelLanguageConfigDTO {
 	String? name;
 	String? languageCode;
+	bool isShow;
 
 	LabelLanguageConfigDTO({
 		this.name,
 		this.languageCode,
+		this.isShow = false,
 	});
 
 	factory LabelLanguageConfigDTO.fromJson(Map<String, dynamic> map) {
 		return LabelLanguageConfigDTO( 
 			name: map['Name'],
 			languageCode: map['LanguageCode'],
+			isShow: map['IsShow'],
 		);
 	}
 
@@ -71,12 +74,14 @@ class LabelLanguageConfigDTO {
 		if (languageCode != null) {
 			map['LanguageCode'] = languageCode;
 		}
+		map['IsShow'] = isShow;
 		return map;
 	}
 }
 
 class CourseLabelDTO extends BaseLabelInfoDTO{
 	String? languageCode;
+	bool isShow;
 	LabelTypeEnum type;
 	OrganizationPatientTypeEnum useObjectType;
 	bool isLastLevel;
@@ -85,6 +90,7 @@ class CourseLabelDTO extends BaseLabelInfoDTO{
 
 	CourseLabelDTO({
 		this.languageCode,
+		this.isShow = false,
 		this.type = LabelTypeEnum.Unknown,
 		this.useObjectType = OrganizationPatientTypeEnum.Person,
 		this.isLastLevel = false,
@@ -106,6 +112,7 @@ class CourseLabelDTO extends BaseLabelInfoDTO{
 	factory CourseLabelDTO.fromJson(Map<String, dynamic> map) {
 		return CourseLabelDTO( 
 			languageCode: map['LanguageCode'],
+			isShow: map['IsShow'],
 			type: LabelTypeEnum.values.firstWhere((e) => e.index == map['Type']),
 			useObjectType: OrganizationPatientTypeEnum.values.firstWhere((e) => e.index == map['UseObjectType']),
 			isLastLevel: map['IsLastLevel'],
@@ -123,6 +130,7 @@ class CourseLabelDTO extends BaseLabelInfoDTO{
 		final map = super.toJson();
 		if (languageCode != null)
 			map['LanguageCode'] = languageCode;
+		map['IsShow'] = isShow;
 		map['Type'] = type.index;
 		map['UseObjectType'] = useObjectType.index;
 		map['IsLastLevel'] = isLastLevel;
@@ -214,6 +222,7 @@ class ApplyCourseRequest extends TokenRequest{
 	bool isAgentCourse;
 	List<String>? courseAlbumCodes;
 	CourseAppearTypeEnum courseAppearType;
+	bool isJustVideoCourse;
 
 	ApplyCourseRequest({
 		this.name,
@@ -238,6 +247,7 @@ class ApplyCourseRequest extends TokenRequest{
 		this.isAgentCourse = false,
 		this.courseAlbumCodes,
 		this.courseAppearType = CourseAppearTypeEnum.Unknown,
+		this.isJustVideoCourse = false,
 		String? token,
 	}) : super(
 			token: token,
@@ -267,6 +277,7 @@ class ApplyCourseRequest extends TokenRequest{
 			isAgentCourse: map['IsAgentCourse'],
 			courseAlbumCodes: map['CourseAlbumCodes']?.cast<String>().toList(),
 			courseAppearType: CourseAppearTypeEnum.values.firstWhere((e) => e.index == map['CourseAppearType']),
+			isJustVideoCourse: map['IsJustVideoCourse'],
 			token: map['Token'],
 		);
 	}
@@ -310,6 +321,7 @@ class ApplyCourseRequest extends TokenRequest{
 		if (courseAlbumCodes != null)
 			map['CourseAlbumCodes'] = courseAlbumCodes;
 		map['CourseAppearType'] = courseAppearType.index;
+		map['IsJustVideoCourse'] = isJustVideoCourse;
 		return map;
 	}
 }
@@ -691,6 +703,7 @@ class BaseCourseInfoDTO {
 	String? creatorCode;
 	String? organizationCode;
 	DateTime? createTime;
+	DateTime? updateTime;
 	double price;
 	List<String>? courseLabelCodes;
 	List<String>? caseLabelCodes;
@@ -712,6 +725,9 @@ class BaseCourseInfoDTO {
 	LiveDataDTO? courseChannel;
 	LiveDataDTO? othersScreenSharingChannel;
 	ScreenSharingChannelDTO? rtcScreenSharingChannel;
+	String? languageCode;
+	bool isJustVideoCourse;
+	bool isProhibition;
 
 	BaseCourseInfoDTO({
 		this.code,
@@ -732,6 +748,7 @@ class BaseCourseInfoDTO {
 		this.creatorCode,
 		this.organizationCode,
 		this.createTime,
+		this.updateTime,
 		this.price = 0,
 		this.courseLabelCodes,
 		this.caseLabelCodes,
@@ -753,6 +770,9 @@ class BaseCourseInfoDTO {
 		this.courseChannel,
 		this.othersScreenSharingChannel,
 		this.rtcScreenSharingChannel,
+		this.languageCode,
+		this.isJustVideoCourse = false,
+		this.isProhibition = false,
 	});
 
 	factory BaseCourseInfoDTO.fromJson(Map<String, dynamic> map) {
@@ -775,6 +795,7 @@ class BaseCourseInfoDTO {
 			creatorCode: map['CreatorCode'],
 			organizationCode: map['OrganizationCode'],
 			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
+			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
 			price: double.parse(map['Price'].toString()),
 			courseLabelCodes: map['CourseLabelCodes']?.cast<String>().toList(),
 			caseLabelCodes: map['CaseLabelCodes']?.cast<String>().toList(),
@@ -796,6 +817,9 @@ class BaseCourseInfoDTO {
 			courseChannel: map['CourseChannel'] != null ? LiveDataDTO.fromJson(map['CourseChannel']) : null,
 			othersScreenSharingChannel: map['OthersScreenSharingChannel'] != null ? LiveDataDTO.fromJson(map['OthersScreenSharingChannel']) : null,
 			rtcScreenSharingChannel: map['RtcScreenSharingChannel'] != null ? ScreenSharingChannelDTO.fromJson(map['RtcScreenSharingChannel']) : null,
+			languageCode: map['LanguageCode'],
+			isJustVideoCourse: map['IsJustVideoCourse'],
+			isProhibition: map['IsProhibition'],
 		);
 	}
 
@@ -845,6 +869,9 @@ class BaseCourseInfoDTO {
 		if (createTime != null) {
 			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
 		}
+		if (updateTime != null) {
+			map['UpdateTime'] = JsonRpcUtils.dateFormat(updateTime!);
+		}
 		map['Price'] = price;
 		if (courseLabelCodes != null) {
 			map['CourseLabelCodes'] = courseLabelCodes;
@@ -892,6 +919,11 @@ class BaseCourseInfoDTO {
 		if (rtcScreenSharingChannel != null) {
 			map['RtcScreenSharingChannel'] = rtcScreenSharingChannel;
 		}
+		if (languageCode != null) {
+			map['LanguageCode'] = languageCode;
+		}
+		map['IsJustVideoCourse'] = isJustVideoCourse;
+		map['IsProhibition'] = isProhibition;
 		return map;
 	}
 }
@@ -900,11 +932,13 @@ class BaseUserGroupDTO extends BaseDTO{
 	String? code;
 	String? name;
 	String? shortCode;
+	String? description;
 
 	BaseUserGroupDTO({
 		this.code,
 		this.name,
 		this.shortCode,
+		this.description,
 		DateTime? createTime,
 		DateTime? updateTime,
 	}) : super(
@@ -917,6 +951,7 @@ class BaseUserGroupDTO extends BaseDTO{
 			code: map['Code'],
 			name: map['Name'],
 			shortCode: map['ShortCode'],
+			description: map['Description'],
 			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
 			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
 		);
@@ -930,6 +965,8 @@ class BaseUserGroupDTO extends BaseDTO{
 			map['Name'] = name;
 		if (shortCode != null)
 			map['ShortCode'] = shortCode;
+		if (description != null)
+			map['Description'] = description;
 		return map;
 	}
 }
@@ -982,6 +1019,12 @@ class VideoInfoDTO {
 	CourseViewRangeEnum viewRange;
 	int playCount;
 	String? srcFileToken;
+	String? intro;
+	bool autoCreateCourse;
+	List<String>? userGroupCodes;
+	List<String>? courseLabelCodes;
+	CourseAudienceTypeEnum audienceType;
+	bool isAdminCreated;
 
 	VideoInfoDTO({
 		this.code,
@@ -999,6 +1042,12 @@ class VideoInfoDTO {
 		this.viewRange = CourseViewRangeEnum.All,
 		this.playCount = 0,
 		this.srcFileToken,
+		this.intro,
+		this.autoCreateCourse = false,
+		this.userGroupCodes,
+		this.courseLabelCodes,
+		this.audienceType = CourseAudienceTypeEnum.Unknown,
+		this.isAdminCreated = false,
 	});
 
 	factory VideoInfoDTO.fromJson(Map<String, dynamic> map) {
@@ -1018,6 +1067,12 @@ class VideoInfoDTO {
 			viewRange: CourseViewRangeEnum.values.firstWhere((e) => e.index == map['ViewRange']),
 			playCount: map['PlayCount'],
 			srcFileToken: map['SrcFileToken'],
+			intro: map['Intro'],
+			autoCreateCourse: map['AutoCreateCourse'],
+			userGroupCodes: map['UserGroupCodes']?.cast<String>().toList(),
+			courseLabelCodes: map['CourseLabelCodes']?.cast<String>().toList(),
+			audienceType: CourseAudienceTypeEnum.values.firstWhere((e) => e.index == map['AudienceType']),
+			isAdminCreated: map['IsAdminCreated'],
 		);
 	}
 
@@ -1056,6 +1111,18 @@ class VideoInfoDTO {
 		if (srcFileToken != null) {
 			map['SrcFileToken'] = srcFileToken;
 		}
+		if (intro != null) {
+			map['Intro'] = intro;
+		}
+		map['AutoCreateCourse'] = autoCreateCourse;
+		if (userGroupCodes != null) {
+			map['UserGroupCodes'] = userGroupCodes;
+		}
+		if (courseLabelCodes != null) {
+			map['CourseLabelCodes'] = courseLabelCodes;
+		}
+		map['AudienceType'] = audienceType.index;
+		map['IsAdminCreated'] = isAdminCreated;
 		return map;
 	}
 }
@@ -1135,6 +1202,7 @@ class CourseInfoDetailDTO extends BaseCourseInfoDTO{
 		String? creatorCode,
 		String? organizationCode,
 		DateTime? createTime,
+		DateTime? updateTime,
 		double price = 0,
 		List<String>? courseLabelCodes,
 		List<String>? caseLabelCodes,
@@ -1156,6 +1224,9 @@ class CourseInfoDetailDTO extends BaseCourseInfoDTO{
 		LiveDataDTO? courseChannel,
 		LiveDataDTO? othersScreenSharingChannel,
 		ScreenSharingChannelDTO? rtcScreenSharingChannel,
+		String? languageCode,
+		bool isJustVideoCourse = false,
+		bool isProhibition = false,
 	}) : super(
 			code: code,
 			name: name,
@@ -1175,6 +1246,7 @@ class CourseInfoDetailDTO extends BaseCourseInfoDTO{
 			creatorCode: creatorCode,
 			organizationCode: organizationCode,
 			createTime: createTime,
+			updateTime: updateTime,
 			price: price,
 			courseLabelCodes: courseLabelCodes,
 			caseLabelCodes: caseLabelCodes,
@@ -1196,6 +1268,9 @@ class CourseInfoDetailDTO extends BaseCourseInfoDTO{
 			courseChannel: courseChannel,
 			othersScreenSharingChannel: othersScreenSharingChannel,
 			rtcScreenSharingChannel: rtcScreenSharingChannel,
+			languageCode: languageCode,
+			isJustVideoCourse: isJustVideoCourse,
+			isProhibition: isProhibition,
 		);
 
 	factory CourseInfoDetailDTO.fromJson(Map<String, dynamic> map) {
@@ -1231,6 +1306,7 @@ class CourseInfoDetailDTO extends BaseCourseInfoDTO{
 			creatorCode: map['CreatorCode'],
 			organizationCode: map['OrganizationCode'],
 			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
+			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
 			price: double.parse(map['Price'].toString()),
 			courseLabelCodes: map['CourseLabelCodes']?.cast<String>().toList(),
 			caseLabelCodes: map['CaseLabelCodes']?.cast<String>().toList(),
@@ -1252,6 +1328,9 @@ class CourseInfoDetailDTO extends BaseCourseInfoDTO{
 			courseChannel: map['CourseChannel'] != null ? LiveDataDTO.fromJson(map['CourseChannel']) : null,
 			othersScreenSharingChannel: map['OthersScreenSharingChannel'] != null ? LiveDataDTO.fromJson(map['OthersScreenSharingChannel']) : null,
 			rtcScreenSharingChannel: map['RtcScreenSharingChannel'] != null ? ScreenSharingChannelDTO.fromJson(map['RtcScreenSharingChannel']) : null,
+			languageCode: map['LanguageCode'],
+			isJustVideoCourse: map['IsJustVideoCourse'],
+			isProhibition: map['IsProhibition'],
 		);
 	}
 
@@ -1288,6 +1367,12 @@ enum QueryCourseApprovalStatusEnum {
 	Approved,
 }
 
+enum QueryCourseTypeEnum {
+	All,
+	LiveCourse,
+	VideoCourse,
+}
+
 class FindCoursePagesRequest extends PageRequest{
 	String? keyword;
 	List<String>? courseLabels;
@@ -1297,7 +1382,7 @@ class FindCoursePagesRequest extends PageRequest{
 	String? participantCode;
 	String? languageCode;
 	QueryCourseApprovalStatusEnum courseApprovalStatus;
-	bool justPastVideo;
+	QueryCourseTypeEnum queryCourseType;
 
 	FindCoursePagesRequest({
 		this.keyword,
@@ -1308,7 +1393,7 @@ class FindCoursePagesRequest extends PageRequest{
 		this.participantCode,
 		this.languageCode,
 		this.courseApprovalStatus = QueryCourseApprovalStatusEnum.All,
-		this.justPastVideo = false,
+		this.queryCourseType = QueryCourseTypeEnum.All,
 		int pageIndex = 0,
 		int pageSize = 0,
 		String? token,
@@ -1328,7 +1413,7 @@ class FindCoursePagesRequest extends PageRequest{
 			participantCode: map['ParticipantCode'],
 			languageCode: map['LanguageCode'],
 			courseApprovalStatus: QueryCourseApprovalStatusEnum.values.firstWhere((e) => e.index == map['CourseApprovalStatus']),
-			justPastVideo: map['JustPastVideo'],
+			queryCourseType: QueryCourseTypeEnum.values.firstWhere((e) => e.index == map['QueryCourseType']),
 			pageIndex: map['PageIndex'],
 			pageSize: map['PageSize'],
 			token: map['Token'],
@@ -1352,7 +1437,7 @@ class FindCoursePagesRequest extends PageRequest{
 		if (languageCode != null)
 			map['LanguageCode'] = languageCode;
 		map['CourseApprovalStatus'] = courseApprovalStatus.index;
-		map['JustPastVideo'] = justPastVideo;
+		map['QueryCourseType'] = queryCourseType.index;
 		return map;
 	}
 }
@@ -1406,6 +1491,7 @@ class UpdateCourseRequest extends TokenRequest{
 	List<String>? courseAlbumCodes;
 	CourseAppearTypeEnum courseAppearType;
 	List<String>? courseMaterialCodes;
+	bool isJustVideoCourse;
 
 	UpdateCourseRequest({
 		this.code,
@@ -1431,6 +1517,7 @@ class UpdateCourseRequest extends TokenRequest{
 		this.courseAlbumCodes,
 		this.courseAppearType = CourseAppearTypeEnum.Unknown,
 		this.courseMaterialCodes,
+		this.isJustVideoCourse = false,
 		String? token,
 	}) : super(
 			token: token,
@@ -1461,6 +1548,7 @@ class UpdateCourseRequest extends TokenRequest{
 			courseAlbumCodes: map['CourseAlbumCodes']?.cast<String>().toList(),
 			courseAppearType: CourseAppearTypeEnum.values.firstWhere((e) => e.index == map['CourseAppearType']),
 			courseMaterialCodes: map['CourseMaterialCodes']?.cast<String>().toList(),
+			isJustVideoCourse: map['IsJustVideoCourse'],
 			token: map['Token'],
 		);
 	}
@@ -1506,6 +1594,7 @@ class UpdateCourseRequest extends TokenRequest{
 		map['CourseAppearType'] = courseAppearType.index;
 		if (courseMaterialCodes != null)
 			map['CourseMaterialCodes'] = courseMaterialCodes;
+		map['IsJustVideoCourse'] = isJustVideoCourse;
 		return map;
 	}
 }
@@ -1585,8 +1674,10 @@ class CourseAlbumDTO extends BaseCourseAlbumDTO{
 	CourseViewRangeEnum viewRange;
 	double price;
 	DateTime? createTime;
+	DateTime? updateTime;
 	int sort;
 	bool isStick;
+	String? languageCode;
 
 	CourseAlbumDTO({
 		this.cover,
@@ -1598,8 +1689,10 @@ class CourseAlbumDTO extends BaseCourseAlbumDTO{
 		this.viewRange = CourseViewRangeEnum.All,
 		this.price = 0,
 		this.createTime,
+		this.updateTime,
 		this.sort = 0,
 		this.isStick = false,
+		this.languageCode,
 		String? code,
 		String? name,
 	}) : super(
@@ -1618,8 +1711,10 @@ class CourseAlbumDTO extends BaseCourseAlbumDTO{
 			viewRange: CourseViewRangeEnum.values.firstWhere((e) => e.index == map['ViewRange']),
 			price: double.parse(map['Price'].toString()),
 			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
+			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
 			sort: map['Sort'],
 			isStick: map['IsStick'],
+			languageCode: map['LanguageCode'],
 			code: map['Code'],
 			name: map['Name'],
 		);
@@ -1643,8 +1738,12 @@ class CourseAlbumDTO extends BaseCourseAlbumDTO{
 		map['Price'] = price;
 		if (createTime != null)
 			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
+		if (updateTime != null)
+			map['UpdateTime'] = JsonRpcUtils.dateFormat(updateTime!);
 		map['Sort'] = sort;
 		map['IsStick'] = isStick;
+		if (languageCode != null)
+			map['LanguageCode'] = languageCode;
 		return map;
 	}
 }
@@ -1686,12 +1785,14 @@ class UserGroupDTO extends BaseUserGroupDTO{
 		String? code,
 		String? name,
 		String? shortCode,
+		String? description,
 		DateTime? createTime,
 		DateTime? updateTime,
 	}) : super(
 			code: code,
 			name: name,
 			shortCode: shortCode,
+			description: description,
 			createTime: createTime,
 			updateTime: updateTime,
 		);
@@ -1714,6 +1815,7 @@ class UserGroupDTO extends BaseUserGroupDTO{
 			code: map['Code'],
 			name: map['Name'],
 			shortCode: map['ShortCode'],
+			description: map['Description'],
 			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
 			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
 		);
@@ -1896,6 +1998,11 @@ class SaveVideoRequest extends TokenRequest{
 	UploadFileTypeEnum fodderType;
 	bool isPublic;
 	CourseViewRangeEnum viewRange;
+	CourseAudienceTypeEnum audienceType;
+	bool autoCreateCourse;
+	List<String>? courseLabelCodes;
+	List<String>? userGroupCodes;
+	String? intro;
 
 	SaveVideoRequest({
 		this.courseCode,
@@ -1912,6 +2019,11 @@ class SaveVideoRequest extends TokenRequest{
 		this.fodderType = UploadFileTypeEnum.Unknown,
 		this.isPublic = false,
 		this.viewRange = CourseViewRangeEnum.All,
+		this.audienceType = CourseAudienceTypeEnum.Unknown,
+		this.autoCreateCourse = false,
+		this.courseLabelCodes,
+		this.userGroupCodes,
+		this.intro,
 		String? token,
 	}) : super(
 			token: token,
@@ -1933,6 +2045,11 @@ class SaveVideoRequest extends TokenRequest{
 			fodderType: UploadFileTypeEnum.values.firstWhere((e) => e.index == map['FodderType']),
 			isPublic: map['IsPublic'],
 			viewRange: CourseViewRangeEnum.values.firstWhere((e) => e.index == map['ViewRange']),
+			audienceType: CourseAudienceTypeEnum.values.firstWhere((e) => e.index == map['AudienceType']),
+			autoCreateCourse: map['AutoCreateCourse'],
+			courseLabelCodes: map['CourseLabelCodes']?.cast<String>().toList(),
+			userGroupCodes: map['UserGroupCodes']?.cast<String>().toList(),
+			intro: map['Intro'],
 			token: map['Token'],
 		);
 	}
@@ -1961,6 +2078,14 @@ class SaveVideoRequest extends TokenRequest{
 		map['FodderType'] = fodderType.index;
 		map['IsPublic'] = isPublic;
 		map['ViewRange'] = viewRange.index;
+		map['AudienceType'] = audienceType.index;
+		map['AutoCreateCourse'] = autoCreateCourse;
+		if (courseLabelCodes != null)
+			map['CourseLabelCodes'] = courseLabelCodes;
+		if (userGroupCodes != null)
+			map['UserGroupCodes'] = userGroupCodes;
+		if (intro != null)
+			map['Intro'] = intro;
 		return map;
 	}
 }
@@ -3473,6 +3598,7 @@ class AddCourseAlbumRequest extends TokenRequest{
 	String? teacherName;
 	CourseViewRangeEnum viewRange;
 	double price;
+	String? languageCode;
 
 	AddCourseAlbumRequest({
 		this.name,
@@ -3486,6 +3612,7 @@ class AddCourseAlbumRequest extends TokenRequest{
 		this.teacherName,
 		this.viewRange = CourseViewRangeEnum.All,
 		this.price = 0,
+		this.languageCode,
 		String? token,
 	}) : super(
 			token: token,
@@ -3504,6 +3631,7 @@ class AddCourseAlbumRequest extends TokenRequest{
 			teacherName: map['TeacherName'],
 			viewRange: CourseViewRangeEnum.values.firstWhere((e) => e.index == map['ViewRange']),
 			price: double.parse(map['Price'].toString()),
+			languageCode: map['LanguageCode'],
 			token: map['Token'],
 		);
 	}
@@ -3528,6 +3656,8 @@ class AddCourseAlbumRequest extends TokenRequest{
 			map['TeacherName'] = teacherName;
 		map['ViewRange'] = viewRange.index;
 		map['Price'] = price;
+		if (languageCode != null)
+			map['LanguageCode'] = languageCode;
 		return map;
 	}
 }
@@ -3568,6 +3698,7 @@ class CourseCommonInfoDTO extends BaseCourseAlbumDTO{
 	StudentCourseStatusEnum signCourseStatus;
 	bool isPay;
 	DateTime? createTime;
+	DateTime? updateTime;
 
 	CourseCommonInfoDTO({
 		this.cover,
@@ -3583,6 +3714,7 @@ class CourseCommonInfoDTO extends BaseCourseAlbumDTO{
 		this.signCourseStatus = StudentCourseStatusEnum.All,
 		this.isPay = false,
 		this.createTime,
+		this.updateTime,
 		String? code,
 		String? name,
 	}) : super(
@@ -3605,6 +3737,7 @@ class CourseCommonInfoDTO extends BaseCourseAlbumDTO{
 			signCourseStatus: StudentCourseStatusEnum.values.firstWhere((e) => e.index == map['SignCourseStatus']),
 			isPay: map['IsPay'],
 			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
+			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
 			code: map['Code'],
 			name: map['Name'],
 		);
@@ -3633,6 +3766,8 @@ class CourseCommonInfoDTO extends BaseCourseAlbumDTO{
 		map['IsPay'] = isPay;
 		if (createTime != null)
 			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
+		if (updateTime != null)
+			map['UpdateTime'] = JsonRpcUtils.dateFormat(updateTime!);
 		return map;
 	}
 }
@@ -3967,6 +4102,7 @@ class GetUserPagesRequest extends PageRequest{
 	String? queryState;
 	List<String>? excludeUserCodes;
 	String? languageCode;
+	String? userCode;
 	List<String>? roleCodes;
 	bool? isAgent;
 
@@ -3976,6 +4112,7 @@ class GetUserPagesRequest extends PageRequest{
 		this.queryState,
 		this.excludeUserCodes,
 		this.languageCode,
+		this.userCode,
 		this.roleCodes,
 		this.isAgent,
 		int pageIndex = 0,
@@ -3994,6 +4131,7 @@ class GetUserPagesRequest extends PageRequest{
 			queryState: map['QueryState'],
 			excludeUserCodes: map['ExcludeUserCodes']?.cast<String>().toList(),
 			languageCode: map['LanguageCode'],
+			userCode: map['UserCode'],
 			roleCodes: map['RoleCodes']?.cast<String>().toList(),
 			isAgent: map['IsAgent'],
 			pageIndex: map['PageIndex'],
@@ -4014,6 +4152,8 @@ class GetUserPagesRequest extends PageRequest{
 			map['ExcludeUserCodes'] = excludeUserCodes;
 		if (languageCode != null)
 			map['LanguageCode'] = languageCode;
+		if (userCode != null)
+			map['UserCode'] = userCode;
 		if (roleCodes != null)
 			map['RoleCodes'] = roleCodes;
 		if (isAgent != null)
@@ -4186,6 +4326,7 @@ class UpdateCourseAlbumRequest extends TokenRequest{
 	String? teacherName;
 	CourseViewRangeEnum viewRange;
 	double price;
+	String? languageCode;
 
 	UpdateCourseAlbumRequest({
 		this.name,
@@ -4200,6 +4341,7 @@ class UpdateCourseAlbumRequest extends TokenRequest{
 		this.teacherName,
 		this.viewRange = CourseViewRangeEnum.All,
 		this.price = 0,
+		this.languageCode,
 		String? token,
 	}) : super(
 			token: token,
@@ -4219,6 +4361,7 @@ class UpdateCourseAlbumRequest extends TokenRequest{
 			teacherName: map['TeacherName'],
 			viewRange: CourseViewRangeEnum.values.firstWhere((e) => e.index == map['ViewRange']),
 			price: double.parse(map['Price'].toString()),
+			languageCode: map['LanguageCode'],
 			token: map['Token'],
 		);
 	}
@@ -4245,6 +4388,8 @@ class UpdateCourseAlbumRequest extends TokenRequest{
 			map['TeacherName'] = teacherName;
 		map['ViewRange'] = viewRange.index;
 		map['Price'] = price;
+		if (languageCode != null)
+			map['LanguageCode'] = languageCode;
 		return map;
 	}
 }
@@ -4304,4 +4449,265 @@ class AddCoursePlayCountRequest extends TokenRequest{
 	}
 }
 
+enum BrowsedUserTypeEnum {
+	Teacher,
+	Assistant,
+	Guesting,
+	Student,
+	Visitor,
+}
+
+class CourseBrowsedRecordRequest extends TokenRequest{
+	String? relevanceCode;
+	String? userCode;
+	String? displayName;
+	String? fromPlatform;
+	bool isOnline;
+	BrowsedUserTypeEnum browsedUserType;
+
+	CourseBrowsedRecordRequest({
+		this.relevanceCode,
+		this.userCode,
+		this.displayName,
+		this.fromPlatform,
+		this.isOnline = false,
+		this.browsedUserType = BrowsedUserTypeEnum.Teacher,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory CourseBrowsedRecordRequest.fromJson(Map<String, dynamic> map) {
+		return CourseBrowsedRecordRequest( 
+			relevanceCode: map['RelevanceCode'],
+			userCode: map['UserCode'],
+			displayName: map['DisplayName'],
+			fromPlatform: map['FromPlatform'],
+			isOnline: map['IsOnline'],
+			browsedUserType: BrowsedUserTypeEnum.values.firstWhere((e) => e.index == map['BrowsedUserType']),
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (relevanceCode != null)
+			map['RelevanceCode'] = relevanceCode;
+		if (userCode != null)
+			map['UserCode'] = userCode;
+		if (displayName != null)
+			map['DisplayName'] = displayName;
+		if (fromPlatform != null)
+			map['FromPlatform'] = fromPlatform;
+		map['IsOnline'] = isOnline;
+		map['BrowsedUserType'] = browsedUserType.index;
+		return map;
+	}
+}
+
+class CourseBrowsedRecordDTO {
+	String? courseBrowsedRecordCode;
+	String? relevanceCode;
+	String? userCode;
+	String? displayName;
+	String? fromPlatform;
+	int browsedCount;
+	bool isOnline;
+	BrowsedUserTypeEnum browsedUserType;
+	DateTime? createTime;
+	DateTime? updateTime;
+	String? avatar;
+
+	CourseBrowsedRecordDTO({
+		this.courseBrowsedRecordCode,
+		this.relevanceCode,
+		this.userCode,
+		this.displayName,
+		this.fromPlatform,
+		this.browsedCount = 0,
+		this.isOnline = false,
+		this.browsedUserType = BrowsedUserTypeEnum.Teacher,
+		this.createTime,
+		this.updateTime,
+		this.avatar,
+	});
+
+	factory CourseBrowsedRecordDTO.fromJson(Map<String, dynamic> map) {
+		return CourseBrowsedRecordDTO( 
+			courseBrowsedRecordCode: map['CourseBrowsedRecordCode'],
+			relevanceCode: map['RelevanceCode'],
+			userCode: map['UserCode'],
+			displayName: map['DisplayName'],
+			fromPlatform: map['FromPlatform'],
+			browsedCount: map['BrowsedCount'],
+			isOnline: map['IsOnline'],
+			browsedUserType: BrowsedUserTypeEnum.values.firstWhere((e) => e.index == map['BrowsedUserType']),
+			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
+			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
+			avatar: map['Avatar'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if (courseBrowsedRecordCode != null) {
+			map['CourseBrowsedRecordCode'] = courseBrowsedRecordCode;
+		}
+		if (relevanceCode != null) {
+			map['RelevanceCode'] = relevanceCode;
+		}
+		if (userCode != null) {
+			map['UserCode'] = userCode;
+		}
+		if (displayName != null) {
+			map['DisplayName'] = displayName;
+		}
+		if (fromPlatform != null) {
+			map['FromPlatform'] = fromPlatform;
+		}
+		map['BrowsedCount'] = browsedCount;
+		map['IsOnline'] = isOnline;
+		map['BrowsedUserType'] = browsedUserType.index;
+		if (createTime != null) {
+			map['CreateTime'] = JsonRpcUtils.dateFormat(createTime!);
+		}
+		if (updateTime != null) {
+			map['UpdateTime'] = JsonRpcUtils.dateFormat(updateTime!);
+		}
+		if (avatar != null) {
+			map['Avatar'] = avatar;
+		}
+		return map;
+	}
+}
+
+class QueryBrowsedRecordPageRequest extends PageRequest{
+	String? relevanceCode;
+	String? userCode;
+	String? displayName;
+
+	QueryBrowsedRecordPageRequest({
+		this.relevanceCode,
+		this.userCode,
+		this.displayName,
+		int pageIndex = 0,
+		int pageSize = 0,
+		String? token,
+	}) : super(
+			pageIndex: pageIndex,
+			pageSize: pageSize,
+			token: token,
+		);
+
+	factory QueryBrowsedRecordPageRequest.fromJson(Map<String, dynamic> map) {
+		return QueryBrowsedRecordPageRequest( 
+			relevanceCode: map['RelevanceCode'],
+			userCode: map['UserCode'],
+			displayName: map['DisplayName'],
+			pageIndex: map['PageIndex'],
+			pageSize: map['PageSize'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (relevanceCode != null)
+			map['RelevanceCode'] = relevanceCode;
+		if (userCode != null)
+			map['UserCode'] = userCode;
+		if (displayName != null)
+			map['DisplayName'] = displayName;
+		return map;
+	}
+}
+
+class QueryBrowsedRecordRequest extends TokenRequest{
+	String? relevanceCode;
+	String? userCode;
+	String? displayName;
+
+	QueryBrowsedRecordRequest({
+		this.relevanceCode,
+		this.userCode,
+		this.displayName,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory QueryBrowsedRecordRequest.fromJson(Map<String, dynamic> map) {
+		return QueryBrowsedRecordRequest( 
+			relevanceCode: map['RelevanceCode'],
+			userCode: map['UserCode'],
+			displayName: map['DisplayName'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (relevanceCode != null)
+			map['RelevanceCode'] = relevanceCode;
+		if (userCode != null)
+			map['UserCode'] = userCode;
+		if (displayName != null)
+			map['DisplayName'] = displayName;
+		return map;
+	}
+}
+
+class CourseLiveProhibitionRequest extends TokenRequest{
+	String? code;
+	bool isProhibition;
+
+	CourseLiveProhibitionRequest({
+		this.code,
+		this.isProhibition = false,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory CourseLiveProhibitionRequest.fromJson(Map<String, dynamic> map) {
+		return CourseLiveProhibitionRequest( 
+			code: map['Code'],
+			isProhibition: map['IsProhibition'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (code != null)
+			map['Code'] = code;
+		map['IsProhibition'] = isProhibition;
+		return map;
+	}
+}
+
+class CourseVisitorsStatisticResult {
+	int onlineCount;
+	int visitorCount;
+
+	CourseVisitorsStatisticResult({
+		this.onlineCount = 0,
+		this.visitorCount = 0,
+	});
+
+	factory CourseVisitorsStatisticResult.fromJson(Map<String, dynamic> map) {
+		return CourseVisitorsStatisticResult( 
+			onlineCount: map['OnlineCount'],
+			visitorCount: map['VisitorCount'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		map['OnlineCount'] = onlineCount;
+		map['VisitorCount'] = visitorCount;
+		return map;
+	}
+}
+
 

+ 2 - 0
lib/services/index.dart

@@ -19,6 +19,7 @@ export 'payment.dart';
 export 'platform.dart';
 export 'position.dart';
 export 'rank.dart';
+export 'recognition.dart';
 export 'recordInfo.dart';
 export 'region.dart';
 export 'remedical.dart';
@@ -50,6 +51,7 @@ export 'payment.m.dart';
 export 'platform.m.dart';
 export 'position.m.dart';
 export 'rank.m.dart';
+export 'recognition.m.dart';
 export 'recordInfo.m.dart';
 export 'region.m.dart';
 export 'remedical.m.dart';

+ 22 - 0
lib/services/liveConsultation.dart

@@ -51,6 +51,7 @@ class LiveConsultationService extends JsonRpcClientBase {
 		FJsonConvert.setDecoder((map) => ChangeConsultationResult.fromJson(map));
 		FJsonConvert.setDecoder((map) => LiveConsultationMember.fromJson(map));
 		FJsonConvert.setDecoder((map) => QueryEmergencyDataResult.fromJson(map));
+		FJsonConvert.setDecoder((map) => GetConsultationQualityTypeResult.fromJson(map));
 	}
 
 	Future<List<OrganizationBaseDTO>> findParentOrganizationsAsync(FindHigherOrganizationsRequest request) async {
@@ -373,5 +374,26 @@ class LiveConsultationService extends JsonRpcClientBase {
 		return rpcRst;
 	}
 
+	Future<GetConsultationQualityTypeResult> getConsultationReportQualityTypeAsync(GetConsultationReportQualityTypeRequest request) async {
+		var rpcRst = await call("GetConsultationReportQualityTypeAsync", request);
+		var result = GetConsultationQualityTypeResult.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<bool> addConsultationReportQualityAsync(AddConsultationReportQualityRequest request) async {
+		var rpcRst = await call("AddConsultationReportQualityAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> modifyConsultationReportQualityAsync(ModifyConsultationReportQualityRequest request) async {
+		var rpcRst = await call("ModifyConsultationReportQualityAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> deleteConsultationReportQualityAsync(DeleteConsultationReportQualityRequest request) async {
+		var rpcRst = await call("DeleteConsultationReportQualityAsync", request);
+		return rpcRst;
+	}
+
 }
 

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

@@ -598,6 +598,20 @@ enum EvaluateGradeEnum {
 	Satisfaction,
 }
 
+enum QualityType {
+	None,
+	Qualified,
+	InformationUnCompleted,
+	ImageNotClear,
+	PositiveSiteNotClear,
+}
+
+enum QualifiedState {
+	UnSet,
+	Qualified,
+	UnQualified,
+}
+
 class ConsultationPageDTO {
 	String? consultationCode;
 	TransactionStatusEnum consultationStatus;
@@ -612,6 +626,8 @@ class ConsultationPageDTO {
 	EvaluateGradeEnum consultationEvaluate;
 	bool isEmergency;
 	String? emergencyCode;
+	QualityType qualityType;
+	QualifiedState qualifiedState;
 
 	ConsultationPageDTO({
 		this.consultationCode,
@@ -627,6 +643,8 @@ class ConsultationPageDTO {
 		this.consultationEvaluate = EvaluateGradeEnum.UnSet,
 		this.isEmergency = false,
 		this.emergencyCode,
+		this.qualityType = QualityType.None,
+		this.qualifiedState = QualifiedState.UnSet,
 	});
 
 	factory ConsultationPageDTO.fromJson(Map<String, dynamic> map) {
@@ -644,6 +662,8 @@ class ConsultationPageDTO {
 			consultationEvaluate: EvaluateGradeEnum.values.firstWhere((e) => e.index == map['ConsultationEvaluate']),
 			isEmergency: map['IsEmergency'],
 			emergencyCode: map['EmergencyCode'],
+			qualityType: QualityType.values.firstWhere((e) => e.index == map['QualityType']),
+			qualifiedState: QualifiedState.values.firstWhere((e) => e.index == map['QualifiedState']),
 		);
 	}
 
@@ -682,6 +702,8 @@ class ConsultationPageDTO {
 		if (emergencyCode != null) {
 			map['EmergencyCode'] = emergencyCode;
 		}
+		map['QualityType'] = qualityType.index;
+		map['QualifiedState'] = qualifiedState.index;
 		return map;
 	}
 }
@@ -1507,6 +1529,8 @@ class ConsultationDetailDTO {
 	String? assistantDoctorUserCode;
 	String? assistantDoctorUserName;
 	bool isConsulted;
+	QualityType qualityType;
+	QualifiedState qualifiedState;
 
 	ConsultationDetailDTO({
 		this.consultationCode,
@@ -1571,6 +1595,8 @@ class ConsultationDetailDTO {
 		this.assistantDoctorUserCode,
 		this.assistantDoctorUserName,
 		this.isConsulted = false,
+		this.qualityType = QualityType.None,
+		this.qualifiedState = QualifiedState.UnSet,
 	});
 
 	factory ConsultationDetailDTO.fromJson(Map<String, dynamic> map) {
@@ -1637,6 +1663,8 @@ class ConsultationDetailDTO {
 			assistantDoctorUserCode: map['AssistantDoctorUserCode'],
 			assistantDoctorUserName: map['AssistantDoctorUserName'],
 			isConsulted: map['IsConsulted'],
+			qualityType: QualityType.values.firstWhere((e) => e.index == map['QualityType']),
+			qualifiedState: QualifiedState.values.firstWhere((e) => e.index == map['QualifiedState']),
 		);
 	}
 
@@ -1786,6 +1814,8 @@ class ConsultationDetailDTO {
 			map['AssistantDoctorUserName'] = assistantDoctorUserName;
 		}
 		map['IsConsulted'] = isConsulted;
+		map['QualityType'] = qualityType.index;
+		map['QualifiedState'] = qualifiedState.index;
 		return map;
 	}
 }
@@ -4254,6 +4284,82 @@ enum BusinessTypeEnum {
 	Lab,
 }
 
+class QualityControlScoreItem {
+	String? key;
+	double score;
+
+	QualityControlScoreItem({
+		this.key,
+		this.score = 0,
+	});
+
+	factory QualityControlScoreItem.fromJson(Map<String, dynamic> map) {
+		return QualityControlScoreItem( 
+			key: map['Key'],
+			score: double.parse(map['Score'].toString()),
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if (key != null) {
+			map['Key'] = key;
+		}
+		map['Score'] = score;
+		return map;
+	}
+}
+
+class ReportQualityControl {
+	String? controlUserCode;
+	String? controlUserName;
+	String? opinion;
+	double score;
+	DateTime? controlTime;
+	List<QualityControlScoreItem>? scoreItems;
+
+	ReportQualityControl({
+		this.controlUserCode,
+		this.controlUserName,
+		this.opinion,
+		this.score = 0,
+		this.controlTime,
+		this.scoreItems,
+	});
+
+	factory ReportQualityControl.fromJson(Map<String, dynamic> map) {
+		return ReportQualityControl( 
+			controlUserCode: map['ControlUserCode'],
+			controlUserName: map['ControlUserName'],
+			opinion: map['Opinion'],
+			score: double.parse(map['Score'].toString()),
+			controlTime: map['ControlTime'] != null ? DateTime.parse(map['ControlTime']) : null,
+			scoreItems: map['ScoreItems'] != null ? (map['ScoreItems'] as List).map((e)=>QualityControlScoreItem.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if (controlUserCode != null) {
+			map['ControlUserCode'] = controlUserCode;
+		}
+		if (controlUserName != null) {
+			map['ControlUserName'] = controlUserName;
+		}
+		if (opinion != null) {
+			map['Opinion'] = opinion;
+		}
+		map['Score'] = score;
+		if (controlTime != null) {
+			map['ControlTime'] = JsonRpcUtils.dateFormat(controlTime!);
+		}
+		if (scoreItems != null) {
+			map['ScoreItems'] = scoreItems;
+		}
+		return map;
+	}
+}
+
 class RemedicalInfoDTO extends BaseDTO{
 	String? remedicalCode;
 	String? deviceCode;
@@ -4271,6 +4377,8 @@ class RemedicalInfoDTO extends BaseDTO{
 	ScanImageDTO? commentResult;
 	CarotidResultDTO? carotidResult;
 	BusinessTypeEnum businessType;
+	ReportQualityControl? qualityControlDatas;
+	bool isQualityControlled;
 
 	RemedicalInfoDTO({
 		this.remedicalCode,
@@ -4289,6 +4397,8 @@ class RemedicalInfoDTO extends BaseDTO{
 		this.commentResult,
 		this.carotidResult,
 		this.businessType = BusinessTypeEnum.RemoteDiagnosis,
+		this.qualityControlDatas,
+		this.isQualityControlled = false,
 		DateTime? createTime,
 		DateTime? updateTime,
 	}) : super(
@@ -4314,6 +4424,8 @@ class RemedicalInfoDTO extends BaseDTO{
 			commentResult: map['CommentResult'] != null ? ScanImageDTO.fromJson(map['CommentResult']) : null,
 			carotidResult: map['CarotidResult'] != null ? CarotidResultDTO.fromJson(map['CarotidResult']) : null,
 			businessType: BusinessTypeEnum.values.firstWhere((e) => e.index == map['BusinessType']),
+			qualityControlDatas: map['QualityControlDatas'] != null ? ReportQualityControl.fromJson(map['QualityControlDatas']) : null,
+			isQualityControlled: map['IsQualityControlled'],
 			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
 			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
 		);
@@ -4350,6 +4462,9 @@ class RemedicalInfoDTO extends BaseDTO{
 		if (carotidResult != null)
 			map['CarotidResult'] = carotidResult;
 		map['BusinessType'] = businessType.index;
+		if (qualityControlDatas != null)
+			map['QualityControlDatas'] = qualityControlDatas;
+		map['IsQualityControlled'] = isQualityControlled;
 		return map;
 	}
 }
@@ -4602,6 +4717,7 @@ class UserDTO extends UserBaseDTO{
 	String? rootOrganizationShortCode;
 	bool isOldAgent;
 	List<String>? userFeatureCodes;
+	String? openId;
 
 	UserDTO({
 		this.nickName,
@@ -4643,6 +4759,7 @@ class UserDTO extends UserBaseDTO{
 		this.rootOrganizationShortCode,
 		this.isOldAgent = false,
 		this.userFeatureCodes,
+		this.openId,
 		String? phone,
 		String? email,
 		String? userCode,
@@ -4705,6 +4822,7 @@ class UserDTO extends UserBaseDTO{
 			rootOrganizationShortCode: map['RootOrganizationShortCode'],
 			isOldAgent: map['IsOldAgent'],
 			userFeatureCodes: map['UserFeatureCodes']?.cast<String>().toList(),
+			openId: map['OpenId'],
 			phone: map['Phone'],
 			email: map['Email'],
 			userCode: map['UserCode'],
@@ -4790,6 +4908,8 @@ class UserDTO extends UserBaseDTO{
 		map['IsOldAgent'] = isOldAgent;
 		if (userFeatureCodes != null)
 			map['UserFeatureCodes'] = userFeatureCodes;
+		if (openId != null)
+			map['OpenId'] = openId;
 		return map;
 	}
 }
@@ -4840,6 +4960,7 @@ class UserExtendDTO extends UserDTO{
 		String? rootOrganizationShortCode,
 		bool isOldAgent = false,
 		List<String>? userFeatureCodes,
+		String? openId,
 		String? phone,
 		String? email,
 		String? userCode,
@@ -4889,6 +5010,7 @@ class UserExtendDTO extends UserDTO{
 			rootOrganizationShortCode: rootOrganizationShortCode,
 			isOldAgent: isOldAgent,
 			userFeatureCodes: userFeatureCodes,
+			openId: openId,
 			phone: phone,
 			email: email,
 			userCode: userCode,
@@ -4943,6 +5065,7 @@ class UserExtendDTO extends UserDTO{
 			rootOrganizationShortCode: map['RootOrganizationShortCode'],
 			isOldAgent: map['IsOldAgent'],
 			userFeatureCodes: map['UserFeatureCodes']?.cast<String>().toList(),
+			openId: map['OpenId'],
 			phone: map['Phone'],
 			email: map['Email'],
 			userCode: map['UserCode'],
@@ -5737,4 +5860,175 @@ class SyncBatchConsultationRequest {
 	}
 }
 
+class QualityTypeDetail {
+	int key;
+	String? description;
+
+	QualityTypeDetail({
+		this.key = 0,
+		this.description,
+	});
+
+	factory QualityTypeDetail.fromJson(Map<String, dynamic> map) {
+		return QualityTypeDetail( 
+			key: map['Key'],
+			description: map['Description'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		map['Key'] = key;
+		if (description != null) {
+			map['Description'] = description;
+		}
+		return map;
+	}
+}
+
+class GetConsultationQualityTypeResult {
+	List<QualityTypeDetail>? qualityTypeList;
+
+	GetConsultationQualityTypeResult({
+		this.qualityTypeList,
+	});
+
+	factory GetConsultationQualityTypeResult.fromJson(Map<String, dynamic> map) {
+		return GetConsultationQualityTypeResult( 
+			qualityTypeList: map['QualityTypeList'] != null ? (map['QualityTypeList'] as List).map((e)=>QualityTypeDetail.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if (qualityTypeList != null) {
+			map['QualityTypeList'] = qualityTypeList;
+		}
+		return map;
+	}
+}
+
+class GetConsultationReportQualityTypeRequest extends TokenRequest{
+	String? language;
+
+	GetConsultationReportQualityTypeRequest({
+		this.language,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory GetConsultationReportQualityTypeRequest.fromJson(Map<String, dynamic> map) {
+		return GetConsultationReportQualityTypeRequest( 
+			language: map['Language'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (language != null)
+			map['Language'] = language;
+		return map;
+	}
+}
+
+class AddConsultationReportQualityRequest extends TokenRequest{
+	String? consultationRecordCode;
+	String? reportCode;
+	int qualityTypeKey;
+
+	AddConsultationReportQualityRequest({
+		this.consultationRecordCode,
+		this.reportCode,
+		this.qualityTypeKey = 0,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory AddConsultationReportQualityRequest.fromJson(Map<String, dynamic> map) {
+		return AddConsultationReportQualityRequest( 
+			consultationRecordCode: map['ConsultationRecordCode'],
+			reportCode: map['ReportCode'],
+			qualityTypeKey: map['QualityTypeKey'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (consultationRecordCode != null)
+			map['ConsultationRecordCode'] = consultationRecordCode;
+		if (reportCode != null)
+			map['ReportCode'] = reportCode;
+		map['QualityTypeKey'] = qualityTypeKey;
+		return map;
+	}
+}
+
+class ModifyConsultationReportQualityRequest extends TokenRequest{
+	String? consultationRecordCode;
+	String? reportCode;
+	int qualityTypeKey;
+
+	ModifyConsultationReportQualityRequest({
+		this.consultationRecordCode,
+		this.reportCode,
+		this.qualityTypeKey = 0,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory ModifyConsultationReportQualityRequest.fromJson(Map<String, dynamic> map) {
+		return ModifyConsultationReportQualityRequest( 
+			consultationRecordCode: map['ConsultationRecordCode'],
+			reportCode: map['ReportCode'],
+			qualityTypeKey: map['QualityTypeKey'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (consultationRecordCode != null)
+			map['ConsultationRecordCode'] = consultationRecordCode;
+		if (reportCode != null)
+			map['ReportCode'] = reportCode;
+		map['QualityTypeKey'] = qualityTypeKey;
+		return map;
+	}
+}
+
+class DeleteConsultationReportQualityRequest extends TokenRequest{
+	String? consultationRecordCode;
+	String? reportCode;
+
+	DeleteConsultationReportQualityRequest({
+		this.consultationRecordCode,
+		this.reportCode,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory DeleteConsultationReportQualityRequest.fromJson(Map<String, dynamic> map) {
+		return DeleteConsultationReportQualityRequest( 
+			consultationRecordCode: map['ConsultationRecordCode'],
+			reportCode: map['ReportCode'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (consultationRecordCode != null)
+			map['ConsultationRecordCode'] = consultationRecordCode;
+		if (reportCode != null)
+			map['ReportCode'] = reportCode;
+		return map;
+	}
+}
+
 

+ 5 - 7
lib/services/login.dart

@@ -24,7 +24,6 @@ class LoginService extends JsonRpcClientBase {
 		FJsonConvert.setDecoder((map) => LoginResult.fromJson(map));
 		FJsonConvert.setDecoder((map) => StartAssociatedWithAccountResult.fromJson(map));
 		FJsonConvert.setDecoder((map) => GetAssociatedAccountInfoResult.fromJson(map));
-		FJsonConvert.setDecoder((map) => ClearAssociatedWithAccountResult.fromJson(map));
 		FJsonConvert.setDecoder((map) => GetScanCodeResult.fromJson(map));
 		FJsonConvert.setDecoder((map) => CheckConfirmScanStateResult.fromJson(map));
 	}
@@ -95,6 +94,11 @@ class LoginService extends JsonRpcClientBase {
 		return rpcRst;
 	}
 
+	Future<bool> loginOutByAccountAsync(CommonLoginRequest request) async {
+		var rpcRst = await call("LoginOutByAccountAsync", request);
+		return rpcRst;
+	}
+
 	Future<StartAssociatedWithAccountResult> startAssociatedWithAccountAsync(StartAssociatedWithAccountRequest request) async {
 		var rpcRst = await call("StartAssociatedWithAccountAsync", request);
 		var result = StartAssociatedWithAccountResult.fromJson(rpcRst as Map<String, dynamic>);
@@ -107,12 +111,6 @@ class LoginService extends JsonRpcClientBase {
 		return result;
 	}
 
-	Future<ClearAssociatedWithAccountResult> clearAssociatedWithAccountAsync(ClearAssociatedWithAccountRequest request) async {
-		var rpcRst = await call("ClearAssociatedWithAccountAsync", request);
-		var result = ClearAssociatedWithAccountResult.fromJson(rpcRst as Map<String, dynamic>);
-		return result;
-	}
-
 	Future<GetScanCodeResult> getScanCodeAsync(GetScanCodeRequest request) async {
 		var rpcRst = await call("GetScanCodeAsync", request);
 		var result = GetScanCodeResult.fromJson(rpcRst as Map<String, dynamic>);

+ 0 - 49
lib/services/login.m.dart

@@ -610,55 +610,6 @@ class GetAssociatedAccountInfoRequest extends TokenRequest{
 	}
 }
 
-class ClearAssociatedWithAccountResult {
-	bool isSuccess;
-	AssociatedAccountResultEnum state;
-
-	ClearAssociatedWithAccountResult({
-		this.isSuccess = false,
-		this.state = AssociatedAccountResultEnum.Success,
-	});
-
-	factory ClearAssociatedWithAccountResult.fromJson(Map<String, dynamic> map) {
-		return ClearAssociatedWithAccountResult( 
-			isSuccess: map['IsSuccess'],
-			state: AssociatedAccountResultEnum.values.firstWhere((e) => e.index == map['State']),
-		);
-	}
-
-	Map<String, dynamic> toJson() {
-		final map = Map<String, dynamic>();
-		map['IsSuccess'] = isSuccess;
-		map['State'] = state.index;
-		return map;
-	}
-}
-
-class ClearAssociatedWithAccountRequest extends TokenRequest{
-	String? thirdPartyUserId;
-
-	ClearAssociatedWithAccountRequest({
-		this.thirdPartyUserId,
-		String? token,
-	}) : super(
-			token: token,
-		);
-
-	factory ClearAssociatedWithAccountRequest.fromJson(Map<String, dynamic> map) {
-		return ClearAssociatedWithAccountRequest( 
-			thirdPartyUserId: map['ThirdPartyUserId'],
-			token: map['Token'],
-		);
-	}
-
-	Map<String, dynamic> toJson() {
-		final map = super.toJson();
-		if (thirdPartyUserId != null)
-			map['ThirdPartyUserId'] = thirdPartyUserId;
-		return map;
-	}
-}
-
 class GetScanCodeResult {
 	int validSeconds;
 	String? scanCode;

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

@@ -84,6 +84,7 @@ class ReferralOrganizationDTO {
 
 class OrganizationBasicDTO extends OrganizationBaseDTO{
 	String? regionCode;
+	String? rootRegionCode;
 	String? parentCode;
 	String? logoUrl;
 	OrganizationPatientTypeEnum patientType;
@@ -102,6 +103,7 @@ class OrganizationBasicDTO extends OrganizationBaseDTO{
 
 	OrganizationBasicDTO({
 		this.regionCode,
+		this.rootRegionCode,
 		this.parentCode,
 		this.logoUrl,
 		this.patientType = OrganizationPatientTypeEnum.Person,
@@ -133,6 +135,7 @@ class OrganizationBasicDTO extends OrganizationBaseDTO{
 	factory OrganizationBasicDTO.fromJson(Map<String, dynamic> map) {
 		return OrganizationBasicDTO( 
 			regionCode: map['RegionCode'],
+			rootRegionCode: map['RootRegionCode'],
 			parentCode: map['ParentCode'],
 			logoUrl: map['LogoUrl'],
 			patientType: OrganizationPatientTypeEnum.values.firstWhere((e) => e.index == map['PatientType']),
@@ -160,6 +163,8 @@ class OrganizationBasicDTO extends OrganizationBaseDTO{
 		final map = super.toJson();
 		if (regionCode != null)
 			map['RegionCode'] = regionCode;
+		if (rootRegionCode != null)
+			map['RootRegionCode'] = rootRegionCode;
 		if (parentCode != null)
 			map['ParentCode'] = parentCode;
 		if (logoUrl != null)
@@ -235,6 +240,7 @@ class OrganizationDTO extends OrganizationBasicDTO{
 		this.consultationSettingVersion,
 		this.parentOrganizationName,
 		String? regionCode,
+		String? rootRegionCode,
 		String? parentCode,
 		String? logoUrl,
 		OrganizationPatientTypeEnum patientType = OrganizationPatientTypeEnum.Person,
@@ -257,6 +263,7 @@ class OrganizationDTO extends OrganizationBasicDTO{
 		DateTime? updateTime,
 	}) : super(
 			regionCode: regionCode,
+			rootRegionCode: rootRegionCode,
 			parentCode: parentCode,
 			logoUrl: logoUrl,
 			patientType: patientType,
@@ -297,6 +304,7 @@ class OrganizationDTO extends OrganizationBasicDTO{
 			consultationSettingVersion: map['ConsultationSettingVersion'],
 			parentOrganizationName: map['ParentOrganizationName'],
 			regionCode: map['RegionCode'],
+			rootRegionCode: map['RootRegionCode'],
 			parentCode: map['ParentCode'],
 			logoUrl: map['LogoUrl'],
 			patientType: OrganizationPatientTypeEnum.values.firstWhere((e) => e.index == map['PatientType']),
@@ -839,6 +847,7 @@ class ServerSettingResult {
 	bool isASROn;
 	String? webServerUrl;
 	int consultationTimeoutTimes;
+	bool qualityControlSwitch;
 
 	ServerSettingResult({
 		this.serverLangugeList,
@@ -858,6 +867,7 @@ class ServerSettingResult {
 		this.isASROn = false,
 		this.webServerUrl,
 		this.consultationTimeoutTimes = 0,
+		this.qualityControlSwitch = false,
 	});
 
 	factory ServerSettingResult.fromJson(Map<String, dynamic> map) {
@@ -879,6 +889,7 @@ class ServerSettingResult {
 			isASROn: map['IsASROn'],
 			webServerUrl: map['WebServerUrl'],
 			consultationTimeoutTimes: map['ConsultationTimeoutTimes'],
+			qualityControlSwitch: map['QualityControlSwitch'],
 		);
 	}
 
@@ -919,6 +930,7 @@ class ServerSettingResult {
 			map['WebServerUrl'] = webServerUrl;
 		}
 		map['ConsultationTimeoutTimes'] = consultationTimeoutTimes;
+		map['QualityControlSwitch'] = qualityControlSwitch;
 		return map;
 	}
 }

文件差异内容过多而无法显示
+ 472 - 10
lib/services/other.m.dart


+ 58 - 0
lib/services/recognition.dart

@@ -0,0 +1,58 @@
+import 'dart:core';
+
+import 'package:fis_jsonrpc/client_base.dart';
+import 'package:fis_common/json_convert.dart';
+
+import 'recognition.m.dart';
+
+
+class RecognitionService extends JsonRpcClientBase {
+	RecognitionService(
+		String host, {
+		String serviceName = "IRecognitionService",
+		Map<String, String>? headers,
+		int? timeout,
+	}) : super(
+						host,
+						serviceName,
+						headers: headers,
+						timeout: timeout,
+				) {
+		/// 注册响应实体反序列化处理器
+		FJsonConvert.setDecoder((map) => RecognitionResult.fromJson(map));
+		FJsonConvert.setDecoder((map) => SearchPersonsResult.fromJson(map));
+		FJsonConvert.setDecoder((map) => SavePersonResult.fromJson(map));
+		FJsonConvert.setDecoder((map) => DeletePersonResult.fromJson(map));
+	}
+
+	Future<RecognitionResult> getIDCardInfoAsync(IDCardInfoRequest request) async {
+		var rpcRst = await call("GetIDCardInfoAsync", request);
+		var result = RecognitionResult.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<bool> addOrUpdatePersonAsync(AddOrUpdatePersonRequest request) async {
+		var rpcRst = await call("AddOrUpdatePersonAsync", request);
+		return rpcRst;
+	}
+
+	Future<SearchPersonsResult> searchPersonsAsync(SearchPersonsRequest request) async {
+		var rpcRst = await call("SearchPersonsAsync", request);
+		var result = SearchPersonsResult.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<SavePersonResult> savePersonAsync(SavePersonRequest request) async {
+		var rpcRst = await call("SavePersonAsync", request);
+		var result = SavePersonResult.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<DeletePersonResult> deletePersonAsync(DeletePersonRequest request) async {
+		var rpcRst = await call("DeletePersonAsync", request);
+		var result = DeletePersonResult.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+}
+

+ 375 - 0
lib/services/recognition.m.dart

@@ -0,0 +1,375 @@
+import 'liveConsultation.m.dart';
+
+class IDCardInfoResult {
+	String? name;
+	String? idCardNo;
+	String? gender;
+	String? nation;
+	String? birthDay;
+	String? address;
+
+	IDCardInfoResult({
+		this.name,
+		this.idCardNo,
+		this.gender,
+		this.nation,
+		this.birthDay,
+		this.address,
+	});
+
+	factory IDCardInfoResult.fromJson(Map<String, dynamic> map) {
+		return IDCardInfoResult( 
+			name: map['Name'],
+			idCardNo: map['IdCardNo'],
+			gender: map['Gender'],
+			nation: map['Nation'],
+			birthDay: map['BirthDay'],
+			address: map['Address'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if (name != null) {
+			map['Name'] = name;
+		}
+		if (idCardNo != null) {
+			map['IdCardNo'] = idCardNo;
+		}
+		if (gender != null) {
+			map['Gender'] = gender;
+		}
+		if (nation != null) {
+			map['Nation'] = nation;
+		}
+		if (birthDay != null) {
+			map['BirthDay'] = birthDay;
+		}
+		if (address != null) {
+			map['Address'] = address;
+		}
+		return map;
+	}
+}
+
+class RecognitionResult {
+	int statusCode;
+	bool isSuccess;
+	IDCardInfoResult? iDCardData;
+
+	RecognitionResult({
+		this.statusCode = 0,
+		this.isSuccess = false,
+		this.iDCardData,
+	});
+
+	factory RecognitionResult.fromJson(Map<String, dynamic> map) {
+		return RecognitionResult( 
+			statusCode: map['StatusCode'],
+			isSuccess: map['IsSuccess'],
+			iDCardData: map['IDCardData'] != null ? IDCardInfoResult.fromJson(map['IDCardData']) : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		map['StatusCode'] = statusCode;
+		map['IsSuccess'] = isSuccess;
+		if (iDCardData != null) {
+			map['IDCardData'] = iDCardData;
+		}
+		return map;
+	}
+}
+
+enum UploadFileDataTypeEnum {
+	ImageUrl,
+	ImageBase64,
+}
+
+class IDCardInfoRequest extends TokenRequest{
+	String? imageData;
+	UploadFileDataTypeEnum imageDataType;
+
+	IDCardInfoRequest({
+		this.imageData,
+		this.imageDataType = UploadFileDataTypeEnum.ImageUrl,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory IDCardInfoRequest.fromJson(Map<String, dynamic> map) {
+		return IDCardInfoRequest( 
+			imageData: map['ImageData'],
+			imageDataType: UploadFileDataTypeEnum.values.firstWhere((e) => e.index == map['ImageDataType']),
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (imageData != null)
+			map['ImageData'] = imageData;
+		map['ImageDataType'] = imageDataType.index;
+		return map;
+	}
+}
+
+class AddOrUpdatePersonRequest extends TokenRequest{
+	String? groupId;
+	String? personId;
+	String? faceUrl;
+
+	AddOrUpdatePersonRequest({
+		this.groupId,
+		this.personId,
+		this.faceUrl,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory AddOrUpdatePersonRequest.fromJson(Map<String, dynamic> map) {
+		return AddOrUpdatePersonRequest( 
+			groupId: map['GroupId'],
+			personId: map['PersonId'],
+			faceUrl: map['FaceUrl'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (groupId != null)
+			map['GroupId'] = groupId;
+		if (personId != null)
+			map['PersonId'] = personId;
+		if (faceUrl != null)
+			map['FaceUrl'] = faceUrl;
+		return map;
+	}
+}
+
+class RecognitionPersonDTO {
+	String? personId;
+	String? faceId;
+	double score;
+
+	RecognitionPersonDTO({
+		this.personId,
+		this.faceId,
+		this.score = 0,
+	});
+
+	factory RecognitionPersonDTO.fromJson(Map<String, dynamic> map) {
+		return RecognitionPersonDTO( 
+			personId: map['PersonId'],
+			faceId: map['FaceId'],
+			score: double.parse(map['Score'].toString()),
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if (personId != null) {
+			map['PersonId'] = personId;
+		}
+		if (faceId != null) {
+			map['FaceId'] = faceId;
+		}
+		map['Score'] = score;
+		return map;
+	}
+}
+
+class SearchPersonsResult {
+	bool isSearchSuccess;
+	String? errMessage;
+	bool hasPerson;
+	RecognitionPersonDTO? personInfo;
+	List<RecognitionPersonDTO>? persons;
+
+	SearchPersonsResult({
+		this.isSearchSuccess = false,
+		this.errMessage,
+		this.hasPerson = false,
+		this.personInfo,
+		this.persons,
+	});
+
+	factory SearchPersonsResult.fromJson(Map<String, dynamic> map) {
+		return SearchPersonsResult( 
+			isSearchSuccess: map['IsSearchSuccess'],
+			errMessage: map['ErrMessage'],
+			hasPerson: map['HasPerson'],
+			personInfo: map['PersonInfo'] != null ? RecognitionPersonDTO.fromJson(map['PersonInfo']) : null,
+			persons: map['Persons'] != null ? (map['Persons'] as List).map((e)=>RecognitionPersonDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		map['IsSearchSuccess'] = isSearchSuccess;
+		if (errMessage != null) {
+			map['ErrMessage'] = errMessage;
+		}
+		map['HasPerson'] = hasPerson;
+		if (personInfo != null) {
+			map['PersonInfo'] = personInfo;
+		}
+		if (persons != null) {
+			map['Persons'] = persons;
+		}
+		return map;
+	}
+}
+
+class SearchPersonsRequest extends TokenRequest{
+	String? groupId;
+	String? faceUrl;
+
+	SearchPersonsRequest({
+		this.groupId,
+		this.faceUrl,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory SearchPersonsRequest.fromJson(Map<String, dynamic> map) {
+		return SearchPersonsRequest( 
+			groupId: map['GroupId'],
+			faceUrl: map['FaceUrl'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (groupId != null)
+			map['GroupId'] = groupId;
+		if (faceUrl != null)
+			map['FaceUrl'] = faceUrl;
+		return map;
+	}
+}
+
+class SavePersonResult {
+	bool success;
+	String? errMessage;
+
+	SavePersonResult({
+		this.success = false,
+		this.errMessage,
+	});
+
+	factory SavePersonResult.fromJson(Map<String, dynamic> map) {
+		return SavePersonResult( 
+			success: map['Success'],
+			errMessage: map['ErrMessage'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		map['Success'] = success;
+		if (errMessage != null) {
+			map['ErrMessage'] = errMessage;
+		}
+		return map;
+	}
+}
+
+class SavePersonRequest extends TokenRequest{
+	String? groupId;
+	String? personId;
+	String? faceUrl;
+
+	SavePersonRequest({
+		this.groupId,
+		this.personId,
+		this.faceUrl,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory SavePersonRequest.fromJson(Map<String, dynamic> map) {
+		return SavePersonRequest( 
+			groupId: map['GroupId'],
+			personId: map['PersonId'],
+			faceUrl: map['FaceUrl'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (groupId != null)
+			map['GroupId'] = groupId;
+		if (personId != null)
+			map['PersonId'] = personId;
+		if (faceUrl != null)
+			map['FaceUrl'] = faceUrl;
+		return map;
+	}
+}
+
+class DeletePersonResult {
+	bool success;
+	String? errMessage;
+
+	DeletePersonResult({
+		this.success = false,
+		this.errMessage,
+	});
+
+	factory DeletePersonResult.fromJson(Map<String, dynamic> map) {
+		return DeletePersonResult( 
+			success: map['Success'],
+			errMessage: map['ErrMessage'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		map['Success'] = success;
+		if (errMessage != null) {
+			map['ErrMessage'] = errMessage;
+		}
+		return map;
+	}
+}
+
+class DeletePersonRequest extends TokenRequest{
+	String? groupId;
+	String? personId;
+
+	DeletePersonRequest({
+		this.groupId,
+		this.personId,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory DeletePersonRequest.fromJson(Map<String, dynamic> map) {
+		return DeletePersonRequest( 
+			groupId: map['GroupId'],
+			personId: map['PersonId'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (groupId != null)
+			map['GroupId'] = groupId;
+		if (personId != null)
+			map['PersonId'] = personId;
+		return map;
+	}
+}
+
+

+ 35 - 0
lib/services/recordInfo.dart

@@ -37,6 +37,11 @@ class RecordInfoService extends JsonRpcClientBase {
 		return rpcRst;
 	}
 
+	Future<bool> createExamDataAsync(CreateExamDataRequest request) async {
+		var rpcRst = await call("CreateExamDataAsync", request);
+		return rpcRst;
+	}
+
 	Future<PageResult<GetRecordsPageDTO>> getRecordInfoPagesAsync(GetRecordsPageRequest request) async {
 		var rpcRst = await call("GetRecordInfoPagesAsync", request);
 		var result = PageResult<GetRecordsPageDTO>.fromJson(rpcRst as Map<String, dynamic>);
@@ -123,5 +128,35 @@ class RecordInfoService extends JsonRpcClientBase {
 		return result;
 	}
 
+	Future<bool> addRemedicalQualityAsync(AddRemedicalQualityRequest request) async {
+		var rpcRst = await call("AddRemedicalQualityAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> modifyRemedicalQualityAsync(ModifyRemedicalQualityRequest request) async {
+		var rpcRst = await call("ModifyRemedicalQualityAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> deleteRemedicalQualityAsync(DeleteRemedicalQualityRequest request) async {
+		var rpcRst = await call("DeleteRemedicalQualityAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> addRecordReportQualityAsync(AddRecordReportQualityRequest request) async {
+		var rpcRst = await call("AddRecordReportQualityAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> modifyRecordReportQualityAsync(ModifyRecordReportQualityRequest request) async {
+		var rpcRst = await call("ModifyRecordReportQualityAsync", request);
+		return rpcRst;
+	}
+
+	Future<bool> deleteRecordReportQualityAsync(DeleteRecordReportQualityRequest request) async {
+		var rpcRst = await call("DeleteRecordReportQualityAsync", request);
+		return rpcRst;
+	}
+
 }
 

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

@@ -72,6 +72,54 @@ class CreateRecordRequest extends TokenRequest{
 	}
 }
 
+class CreateExamDataRequest extends TokenRequest{
+	String? recordCode;
+	String? fileToken;
+	int fileSize;
+	RemedicalFileDataTypeEnum fileDataType;
+	String? previewFileToken;
+	String? coverImageToken;
+
+	CreateExamDataRequest({
+		this.recordCode,
+		this.fileToken,
+		this.fileSize = 0,
+		this.fileDataType = RemedicalFileDataTypeEnum.VinnoVidSingle,
+		this.previewFileToken,
+		this.coverImageToken,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory CreateExamDataRequest.fromJson(Map<String, dynamic> map) {
+		return CreateExamDataRequest( 
+			recordCode: map['RecordCode'],
+			fileToken: map['FileToken'],
+			fileSize: map['FileSize'],
+			fileDataType: RemedicalFileDataTypeEnum.values.firstWhere((e) => e.index == map['FileDataType']),
+			previewFileToken: map['PreviewFileToken'],
+			coverImageToken: map['CoverImageToken'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (recordCode != null)
+			map['RecordCode'] = recordCode;
+		if (fileToken != null)
+			map['FileToken'] = fileToken;
+		map['FileSize'] = fileSize;
+		map['FileDataType'] = fileDataType.index;
+		if (previewFileToken != null)
+			map['PreviewFileToken'] = previewFileToken;
+		if (coverImageToken != null)
+			map['CoverImageToken'] = coverImageToken;
+		return map;
+	}
+}
+
 enum QueryRecordStatusEnum {
 	All,
 	NotScanned,
@@ -157,6 +205,8 @@ class QueryRecordResult {
 	String? patientCode;
 	bool canCreateReport;
 	DateTime? examTime;
+	bool isQualityControlled;
+	double score;
 
 	QueryRecordResult({
 		this.createTime,
@@ -183,6 +233,8 @@ class QueryRecordResult {
 		this.patientCode,
 		this.canCreateReport = false,
 		this.examTime,
+		this.isQualityControlled = false,
+		this.score = 0,
 	});
 
 	factory QueryRecordResult.fromJson(Map<String, dynamic> map) {
@@ -211,6 +263,8 @@ class QueryRecordResult {
 			patientCode: map['PatientCode'],
 			canCreateReport: map['CanCreateReport'],
 			examTime: map['ExamTime'] != null ? DateTime.parse(map['ExamTime']) : null,
+			isQualityControlled: map['IsQualityControlled'],
+			score: double.parse(map['Score'].toString()),
 		);
 	}
 
@@ -274,6 +328,8 @@ class QueryRecordResult {
 		if (examTime != null) {
 			map['ExamTime'] = JsonRpcUtils.dateFormat(examTime!);
 		}
+		map['IsQualityControlled'] = isQualityControlled;
+		map['Score'] = score;
 		return map;
 	}
 }
@@ -631,6 +687,8 @@ class SimpleRecordInfoDTO extends BaseDTO{
 	String? customOrganzation;
 	String? equipmentSN;
 	List<DiagnosisInfoDTO>? diagnosisInfos;
+	bool isQualityControlled;
+	double score;
 
 	SimpleRecordInfoDTO({
 		this.recordCode,
@@ -654,6 +712,8 @@ class SimpleRecordInfoDTO extends BaseDTO{
 		this.customOrganzation,
 		this.equipmentSN,
 		this.diagnosisInfos,
+		this.isQualityControlled = false,
+		this.score = 0,
 		DateTime? createTime,
 		DateTime? updateTime,
 	}) : super(
@@ -684,6 +744,8 @@ class SimpleRecordInfoDTO extends BaseDTO{
 			customOrganzation: map['CustomOrganzation'],
 			equipmentSN: map['EquipmentSN'],
 			diagnosisInfos: map['DiagnosisInfos'] != null ? (map['DiagnosisInfos'] as List).map((e)=>DiagnosisInfoDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			isQualityControlled: map['IsQualityControlled'],
+			score: double.parse(map['Score'].toString()),
 			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
 			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
 		);
@@ -728,6 +790,8 @@ class SimpleRecordInfoDTO extends BaseDTO{
 			map['EquipmentSN'] = equipmentSN;
 		if (diagnosisInfos != null)
 			map['DiagnosisInfos'] = diagnosisInfos;
+		map['IsQualityControlled'] = isQualityControlled;
+		map['Score'] = score;
 		return map;
 	}
 }
@@ -1102,4 +1166,224 @@ class FindReferralHistoryRequest extends TokenRequest{
 	}
 }
 
+class AddRemedicalQualityRequest extends TokenRequest{
+	String? recordCode;
+	String? remedicalCode;
+	List<QualityControlScoreItem>? qualityControlScoreList;
+	String? opinion;
+
+	AddRemedicalQualityRequest({
+		this.recordCode,
+		this.remedicalCode,
+		this.qualityControlScoreList,
+		this.opinion,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory AddRemedicalQualityRequest.fromJson(Map<String, dynamic> map) {
+		return AddRemedicalQualityRequest( 
+			recordCode: map['RecordCode'],
+			remedicalCode: map['RemedicalCode'],
+			qualityControlScoreList: map['QualityControlScoreList'] != null ? (map['QualityControlScoreList'] as List).map((e)=>QualityControlScoreItem.fromJson(e as Map<String,dynamic>)).toList() : null,
+			opinion: map['Opinion'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (recordCode != null)
+			map['RecordCode'] = recordCode;
+		if (remedicalCode != null)
+			map['RemedicalCode'] = remedicalCode;
+		if (qualityControlScoreList != null)
+			map['QualityControlScoreList'] = qualityControlScoreList;
+		if (opinion != null)
+			map['Opinion'] = opinion;
+		return map;
+	}
+}
+
+class ModifyRemedicalQualityRequest extends TokenRequest{
+	String? recordCode;
+	String? remedicalCode;
+	List<QualityControlScoreItem>? qualityControlScoreList;
+	String? opinion;
+
+	ModifyRemedicalQualityRequest({
+		this.recordCode,
+		this.remedicalCode,
+		this.qualityControlScoreList,
+		this.opinion,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory ModifyRemedicalQualityRequest.fromJson(Map<String, dynamic> map) {
+		return ModifyRemedicalQualityRequest( 
+			recordCode: map['RecordCode'],
+			remedicalCode: map['RemedicalCode'],
+			qualityControlScoreList: map['QualityControlScoreList'] != null ? (map['QualityControlScoreList'] as List).map((e)=>QualityControlScoreItem.fromJson(e as Map<String,dynamic>)).toList() : null,
+			opinion: map['Opinion'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (recordCode != null)
+			map['RecordCode'] = recordCode;
+		if (remedicalCode != null)
+			map['RemedicalCode'] = remedicalCode;
+		if (qualityControlScoreList != null)
+			map['QualityControlScoreList'] = qualityControlScoreList;
+		if (opinion != null)
+			map['Opinion'] = opinion;
+		return map;
+	}
+}
+
+class DeleteRemedicalQualityRequest extends TokenRequest{
+	String? recordCode;
+	String? remedicalCode;
+
+	DeleteRemedicalQualityRequest({
+		this.recordCode,
+		this.remedicalCode,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory DeleteRemedicalQualityRequest.fromJson(Map<String, dynamic> map) {
+		return DeleteRemedicalQualityRequest( 
+			recordCode: map['RecordCode'],
+			remedicalCode: map['RemedicalCode'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (recordCode != null)
+			map['RecordCode'] = recordCode;
+		if (remedicalCode != null)
+			map['RemedicalCode'] = remedicalCode;
+		return map;
+	}
+}
+
+class AddRecordReportQualityRequest extends TokenRequest{
+	String? recordCode;
+	String? reportCode;
+	List<QualityControlScoreItem>? qualityControlScoreList;
+	String? opinion;
+
+	AddRecordReportQualityRequest({
+		this.recordCode,
+		this.reportCode,
+		this.qualityControlScoreList,
+		this.opinion,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory AddRecordReportQualityRequest.fromJson(Map<String, dynamic> map) {
+		return AddRecordReportQualityRequest( 
+			recordCode: map['RecordCode'],
+			reportCode: map['ReportCode'],
+			qualityControlScoreList: map['QualityControlScoreList'] != null ? (map['QualityControlScoreList'] as List).map((e)=>QualityControlScoreItem.fromJson(e as Map<String,dynamic>)).toList() : null,
+			opinion: map['Opinion'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (recordCode != null)
+			map['RecordCode'] = recordCode;
+		if (reportCode != null)
+			map['ReportCode'] = reportCode;
+		if (qualityControlScoreList != null)
+			map['QualityControlScoreList'] = qualityControlScoreList;
+		if (opinion != null)
+			map['Opinion'] = opinion;
+		return map;
+	}
+}
+
+class ModifyRecordReportQualityRequest extends TokenRequest{
+	String? recordCode;
+	String? reportCode;
+	List<QualityControlScoreItem>? qualityControlScoreList;
+	String? opinion;
+
+	ModifyRecordReportQualityRequest({
+		this.recordCode,
+		this.reportCode,
+		this.qualityControlScoreList,
+		this.opinion,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory ModifyRecordReportQualityRequest.fromJson(Map<String, dynamic> map) {
+		return ModifyRecordReportQualityRequest( 
+			recordCode: map['RecordCode'],
+			reportCode: map['ReportCode'],
+			qualityControlScoreList: map['QualityControlScoreList'] != null ? (map['QualityControlScoreList'] as List).map((e)=>QualityControlScoreItem.fromJson(e as Map<String,dynamic>)).toList() : null,
+			opinion: map['Opinion'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (recordCode != null)
+			map['RecordCode'] = recordCode;
+		if (reportCode != null)
+			map['ReportCode'] = reportCode;
+		if (qualityControlScoreList != null)
+			map['QualityControlScoreList'] = qualityControlScoreList;
+		if (opinion != null)
+			map['Opinion'] = opinion;
+		return map;
+	}
+}
+
+class DeleteRecordReportQualityRequest extends TokenRequest{
+	String? recordCode;
+	String? reportCode;
+
+	DeleteRecordReportQualityRequest({
+		this.recordCode,
+		this.reportCode,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory DeleteRecordReportQualityRequest.fromJson(Map<String, dynamic> map) {
+		return DeleteRecordReportQualityRequest( 
+			recordCode: map['RecordCode'],
+			reportCode: map['ReportCode'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (recordCode != null)
+			map['RecordCode'] = recordCode;
+		if (reportCode != null)
+			map['ReportCode'] = reportCode;
+		return map;
+	}
+}
+
 

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

@@ -2030,6 +2030,12 @@ class RecordInfoDTO extends BaseDTO{
 	String? customOrganzation;
 	String? equipmentSN;
 	DateTime? examTime;
+	bool isImgQualityControlled;
+	bool isReportQualityControlled;
+	double imgScore;
+	double reportScore;
+	bool isQualityControlled;
+	double score;
 
 	RecordInfoDTO({
 		this.recordCode,
@@ -2058,6 +2064,12 @@ class RecordInfoDTO extends BaseDTO{
 		this.customOrganzation,
 		this.equipmentSN,
 		this.examTime,
+		this.isImgQualityControlled = false,
+		this.isReportQualityControlled = false,
+		this.imgScore = 0,
+		this.reportScore = 0,
+		this.isQualityControlled = false,
+		this.score = 0,
 		DateTime? createTime,
 		DateTime? updateTime,
 	}) : super(
@@ -2093,6 +2105,12 @@ class RecordInfoDTO extends BaseDTO{
 			customOrganzation: map['CustomOrganzation'],
 			equipmentSN: map['EquipmentSN'],
 			examTime: map['ExamTime'] != null ? DateTime.parse(map['ExamTime']) : null,
+			isImgQualityControlled: map['IsImgQualityControlled'],
+			isReportQualityControlled: map['IsReportQualityControlled'],
+			imgScore: double.parse(map['ImgScore'].toString()),
+			reportScore: double.parse(map['ReportScore'].toString()),
+			isQualityControlled: map['IsQualityControlled'],
+			score: double.parse(map['Score'].toString()),
 			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
 			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
 		);
@@ -2145,6 +2163,12 @@ class RecordInfoDTO extends BaseDTO{
 			map['EquipmentSN'] = equipmentSN;
 		if (examTime != null)
 			map['ExamTime'] = JsonRpcUtils.dateFormat(examTime!);
+		map['IsImgQualityControlled'] = isImgQualityControlled;
+		map['IsReportQualityControlled'] = isReportQualityControlled;
+		map['ImgScore'] = imgScore;
+		map['ReportScore'] = reportScore;
+		map['IsQualityControlled'] = isQualityControlled;
+		map['Score'] = score;
 		return map;
 	}
 }
@@ -3127,6 +3151,10 @@ class ReportBaseDTO extends BaseDTO{
 	String? referralRecordCode;
 	ReportTypeEnum reportType;
 	bool isReferral;
+	QualityType qualityType;
+	QualifiedState qualifiedState;
+	ReportQualityControl? qualityControlDatas;
+	bool isQualityControlled;
 
 	ReportBaseDTO({
 		this.reportCode,
@@ -3146,6 +3174,10 @@ class ReportBaseDTO extends BaseDTO{
 		this.referralRecordCode,
 		this.reportType = ReportTypeEnum.RemoteDiagnosis,
 		this.isReferral = false,
+		this.qualityType = QualityType.None,
+		this.qualifiedState = QualifiedState.UnSet,
+		this.qualityControlDatas,
+		this.isQualityControlled = false,
 		DateTime? createTime,
 		DateTime? updateTime,
 	}) : super(
@@ -3172,6 +3204,10 @@ class ReportBaseDTO extends BaseDTO{
 			referralRecordCode: map['ReferralRecordCode'],
 			reportType: ReportTypeEnum.values.firstWhere((e) => e.index == map['ReportType']),
 			isReferral: map['IsReferral'],
+			qualityType: QualityType.values.firstWhere((e) => e.index == map['QualityType']),
+			qualifiedState: QualifiedState.values.firstWhere((e) => e.index == map['QualifiedState']),
+			qualityControlDatas: map['QualityControlDatas'] != null ? ReportQualityControl.fromJson(map['QualityControlDatas']) : null,
+			isQualityControlled: map['IsQualityControlled'],
 			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
 			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
 		);
@@ -3210,6 +3246,11 @@ class ReportBaseDTO extends BaseDTO{
 			map['ReferralRecordCode'] = referralRecordCode;
 		map['ReportType'] = reportType.index;
 		map['IsReferral'] = isReferral;
+		map['QualityType'] = qualityType.index;
+		map['QualifiedState'] = qualifiedState.index;
+		if (qualityControlDatas != null)
+			map['QualityControlDatas'] = qualityControlDatas;
+		map['IsQualityControlled'] = isQualityControlled;
 		return map;
 	}
 }
@@ -3252,6 +3293,10 @@ class ReportDTO extends ReportBaseDTO{
 		String? referralRecordCode,
 		ReportTypeEnum reportType = ReportTypeEnum.RemoteDiagnosis,
 		bool isReferral = false,
+		QualityType qualityType = QualityType.None,
+		QualifiedState qualifiedState = QualifiedState.UnSet,
+		ReportQualityControl? qualityControlDatas,
+		bool isQualityControlled = false,
 		DateTime? createTime,
 		DateTime? updateTime,
 	}) : super(
@@ -3272,6 +3317,10 @@ class ReportDTO extends ReportBaseDTO{
 			referralRecordCode: referralRecordCode,
 			reportType: reportType,
 			isReferral: isReferral,
+			qualityType: qualityType,
+			qualifiedState: qualifiedState,
+			qualityControlDatas: qualityControlDatas,
+			isQualityControlled: isQualityControlled,
 			createTime: createTime,
 			updateTime: updateTime,
 		);
@@ -3304,6 +3353,10 @@ class ReportDTO extends ReportBaseDTO{
 			referralRecordCode: map['ReferralRecordCode'],
 			reportType: ReportTypeEnum.values.firstWhere((e) => e.index == map['ReportType']),
 			isReferral: map['IsReferral'],
+			qualityType: QualityType.values.firstWhere((e) => e.index == map['QualityType']),
+			qualifiedState: QualifiedState.values.firstWhere((e) => e.index == map['QualifiedState']),
+			qualityControlDatas: map['QualityControlDatas'] != null ? ReportQualityControl.fromJson(map['QualityControlDatas']) : null,
+			isQualityControlled: map['IsQualityControlled'],
 			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
 			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
 		);

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

@@ -2169,6 +2169,10 @@ class DeviceExamReportDTO extends ReportDTO{
 		String? referralRecordCode,
 		ReportTypeEnum reportType = ReportTypeEnum.RemoteDiagnosis,
 		bool isReferral = false,
+		QualityType qualityType = QualityType.None,
+		QualifiedState qualifiedState = QualifiedState.UnSet,
+		ReportQualityControl? qualityControlDatas,
+		bool isQualityControlled = false,
 		DateTime? createTime,
 		DateTime? updateTime,
 	}) : super(
@@ -2198,6 +2202,10 @@ class DeviceExamReportDTO extends ReportDTO{
 			referralRecordCode: referralRecordCode,
 			reportType: reportType,
 			isReferral: isReferral,
+			qualityType: qualityType,
+			qualifiedState: qualifiedState,
+			qualityControlDatas: qualityControlDatas,
+			isQualityControlled: isQualityControlled,
 			createTime: createTime,
 			updateTime: updateTime,
 		);
@@ -2233,6 +2241,10 @@ class DeviceExamReportDTO extends ReportDTO{
 			referralRecordCode: map['ReferralRecordCode'],
 			reportType: ReportTypeEnum.values.firstWhere((e) => e.index == map['ReportType']),
 			isReferral: map['IsReferral'],
+			qualityType: QualityType.values.firstWhere((e) => e.index == map['QualityType']),
+			qualifiedState: QualifiedState.values.firstWhere((e) => e.index == map['QualifiedState']),
+			qualityControlDatas: map['QualityControlDatas'] != null ? ReportQualityControl.fromJson(map['QualityControlDatas']) : null,
+			isQualityControlled: map['IsQualityControlled'],
 			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
 			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
 		);

+ 12 - 0
lib/services/user.dart

@@ -47,6 +47,7 @@ class UserService extends JsonRpcClientBase {
 		FJsonConvert.setDecoder((map) => OrganizationSimplifyDTO.fromJson(map));
 		FJsonConvert.setDecoder((map) => PageResult<SimpleRecordInfoDTO>.fromJson(map));
 		FJsonConvert.setDecoder((map) => SimpleRecordInfoDTO.fromJson(map));
+		FJsonConvert.setDecoder((map) => PackagesDTO.fromJson(map));
 	}
 
 	Future<bool> heartRateAsync(TokenRequest request) async {
@@ -232,5 +233,16 @@ class UserService extends JsonRpcClientBase {
 		return result;
 	}
 
+	Future<PackagesDTO> getPackageByUniquedCodeAsync(GetPackageByUniquedCodeRequest request) async {
+		var rpcRst = await call("GetPackageByUniquedCodeAsync", request);
+		var result = PackagesDTO.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<String> addOrUpdatePackageAsync(AddOrUpdatePackageRequest request) async {
+		var rpcRst = await call("AddOrUpdatePackageAsync", request);
+		return rpcRst;
+	}
+
 }
 

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

@@ -451,6 +451,7 @@ class UserInfoByCodeDTO extends UserDTO{
 		String? rootOrganizationShortCode,
 		bool isOldAgent = false,
 		List<String>? userFeatureCodes,
+		String? openId,
 		String? phone,
 		String? email,
 		String? userCode,
@@ -500,6 +501,7 @@ class UserInfoByCodeDTO extends UserDTO{
 			rootOrganizationShortCode: rootOrganizationShortCode,
 			isOldAgent: isOldAgent,
 			userFeatureCodes: userFeatureCodes,
+			openId: openId,
 			phone: phone,
 			email: email,
 			userCode: userCode,
@@ -554,6 +556,7 @@ class UserInfoByCodeDTO extends UserDTO{
 			rootOrganizationShortCode: map['RootOrganizationShortCode'],
 			isOldAgent: map['IsOldAgent'],
 			userFeatureCodes: map['UserFeatureCodes']?.cast<String>().toList(),
+			openId: map['OpenId'],
 			phone: map['Phone'],
 			email: map['Email'],
 			userCode: map['UserCode'],
@@ -1171,6 +1174,7 @@ class UserMigratoryInfo extends UserDTO{
 		String? rootOrganizationShortCode,
 		bool isOldAgent = false,
 		List<String>? userFeatureCodes,
+		String? openId,
 		String? phone,
 		String? email,
 		String? userCode,
@@ -1220,6 +1224,7 @@ class UserMigratoryInfo extends UserDTO{
 			rootOrganizationShortCode: rootOrganizationShortCode,
 			isOldAgent: isOldAgent,
 			userFeatureCodes: userFeatureCodes,
+			openId: openId,
 			phone: phone,
 			email: email,
 			userCode: userCode,
@@ -1278,6 +1283,7 @@ class UserMigratoryInfo extends UserDTO{
 			rootOrganizationShortCode: map['RootOrganizationShortCode'],
 			isOldAgent: map['IsOldAgent'],
 			userFeatureCodes: map['UserFeatureCodes']?.cast<String>().toList(),
+			openId: map['OpenId'],
 			phone: map['Phone'],
 			email: map['Email'],
 			userCode: map['UserCode'],
@@ -1675,4 +1681,124 @@ class GetUserGroupRecordPagesRequest extends PageRequest{
 	}
 }
 
+class PackagesDTO extends BaseDTO{
+	String? code;
+	String? name;
+	String? version;
+	String? uniquedCode;
+	String? description;
+	String? fileUrl;
+	int fileSize;
+	String? uploadUserCode;
+	String? uploadUserName;
+
+	PackagesDTO({
+		this.code,
+		this.name,
+		this.version,
+		this.uniquedCode,
+		this.description,
+		this.fileUrl,
+		this.fileSize = 0,
+		this.uploadUserCode,
+		this.uploadUserName,
+		DateTime? createTime,
+		DateTime? updateTime,
+	}) : super(
+			createTime: createTime,
+			updateTime: updateTime,
+		);
+
+	factory PackagesDTO.fromJson(Map<String, dynamic> map) {
+		return PackagesDTO( 
+			code: map['Code'],
+			name: map['Name'],
+			version: map['Version'],
+			uniquedCode: map['UniquedCode'],
+			description: map['Description'],
+			fileUrl: map['FileUrl'],
+			fileSize: map['FileSize'],
+			uploadUserCode: map['UploadUserCode'],
+			uploadUserName: map['UploadUserName'],
+			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 (version != null)
+			map['Version'] = version;
+		if (uniquedCode != null)
+			map['UniquedCode'] = uniquedCode;
+		if (description != null)
+			map['Description'] = description;
+		if (fileUrl != null)
+			map['FileUrl'] = fileUrl;
+		map['FileSize'] = fileSize;
+		if (uploadUserCode != null)
+			map['UploadUserCode'] = uploadUserCode;
+		if (uploadUserName != null)
+			map['UploadUserName'] = uploadUserName;
+		return map;
+	}
+}
+
+class GetPackageByUniquedCodeRequest {
+	String? uniquedCode;
+	String? ipAddress;
+
+	GetPackageByUniquedCodeRequest({
+		this.uniquedCode,
+		this.ipAddress,
+	});
+
+	factory GetPackageByUniquedCodeRequest.fromJson(Map<String, dynamic> map) {
+		return GetPackageByUniquedCodeRequest( 
+			uniquedCode: map['UniquedCode'],
+			ipAddress: map['IpAddress'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if (uniquedCode != null) {
+			map['UniquedCode'] = uniquedCode;
+		}
+		if (ipAddress != null) {
+			map['IpAddress'] = ipAddress;
+		}
+		return map;
+	}
+}
+
+class AddOrUpdatePackageRequest extends TokenRequest{
+	PackagesDTO? packageInfo;
+
+	AddOrUpdatePackageRequest({
+		this.packageInfo,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory AddOrUpdatePackageRequest.fromJson(Map<String, dynamic> map) {
+		return AddOrUpdatePackageRequest( 
+			packageInfo: map['PackageInfo'] != null ? PackagesDTO.fromJson(map['PackageInfo']) : null,
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if (packageInfo != null)
+			map['PackageInfo'] = packageInfo;
+		return map;
+	}
+}
+
 

部分文件因为文件数量过多而无法显示