Quellcode durchsuchen

同步Server最新接口WingInterfaceLibrary(28).dll

loki.wu vor 2 Jahren
Ursprung
Commit
b459d26c51

+ 2 - 2
lib/rpc.dart

@@ -111,8 +111,8 @@ class JsonRpcProxy {
 	UserService get user =>
 	findService(() => new UserService(currentHostAddress));
 
-	VidProcessService get vidProcess =>
-	findService(() => new VidProcessService(currentHostAddress));
+	DBLogService get dBLog =>
+	findService(() => new DBLogService(currentHostAddress));
 
 
     /* 服务代理设置 End */

+ 23 - 6
lib/services/authentication.dart

@@ -19,9 +19,9 @@ class AuthenticationService extends JsonRpcClientBase {
 						timeout: timeout,
 				) {
 		/// 注册响应实体反序列化处理器
-		FJsonConvert.setDecoder((map) => Token.fromJson(map));
+		FJsonConvert.setDecoder((map) => TokenDTO.fromJson(map));
 		FJsonConvert.setDecoder((map) => ValidateTokenResult.fromJson(map));
-		FJsonConvert.setDecoder((map) => IList<Token>.fromJson(map));
+		FJsonConvert.setDecoder((map) => IList<TokenDTO>.fromJson(map));
 	}
 
 	Future<String> getAuthorizationAsync(AuthenticationRequest request) async {
@@ -34,9 +34,9 @@ class AuthenticationService extends JsonRpcClientBase {
 		return rpcRst;
 	}
 
-	Future<Token> applyTokenAsync(ApplyTokenRequest request) async {
+	Future<TokenDTO> applyTokenAsync(ApplyTokenRequest request) async {
 		var rpcRst = await call("ApplyTokenAsync", request);
-		var result = Token.fromJson(rpcRst as Map<String, dynamic>);
+		var result = TokenDTO.fromJson(rpcRst as Map<String, dynamic>);
 		return result;
 	}
 
@@ -46,12 +46,29 @@ class AuthenticationService extends JsonRpcClientBase {
 		return result;
 	}
 
-	Future<IList<Token>> getTokensWithClientIdAsync(GetTokensWithClientIdRequest request) async {
+	Future<IList<TokenDTO>> getTokensWithClientIdAsync(GetTokensWithClientIdRequest request) async {
 		var rpcRst = await call("GetTokensWithClientIdAsync", request);
-		var result = IList<Token>.fromJson(rpcRst as Map<String, dynamic>);
+		var result = IList<TokenDTO>.fromJson(rpcRst as Map<String, dynamic>);
 		return result;
 	}
 
+	Future<IList<TokenDTO>> getTokenWithClientIdsAsync(GetTokenWithClientIdsRequest request) async {
+		var rpcRst = await call("GetTokenWithClientIdsAsync", request);
+		var result = IList<TokenDTO>.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<IList<TokenDTO>> getTokenWithValuesAsync(GetTokenWithValuesRequest request) async {
+		var rpcRst = await call("GetTokenWithValuesAsync", request);
+		var result = IList<TokenDTO>.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+	Future<bool> setOnlineStateAsync(SetOnlineStateRequest request) async {
+		var rpcRst = await call("SetOnlineStateAsync", request);
+		return rpcRst;
+	}
+
 	Future<bool> logOffAsync(TokenRequest request) async {
 		var rpcRst = await call("LogOffAsync", request);
 		return rpcRst;

+ 86 - 13
lib/services/authentication.m.dart

@@ -67,6 +67,7 @@ enum AccountType {
 	User,
 	US,
 	USBox,
+	ThirdParty,
 }
 
 enum Platform {
@@ -82,9 +83,9 @@ enum LoginSource {
 	Web,
 }
 
-class Token {
+class TokenDTO {
 	int version;
-	String? value;
+	String? code;
 	AccountType accountType;
 	Platform platform;
 	LoginSource loginSource;
@@ -93,10 +94,11 @@ class Token {
 	DateTime? createTime;
 	DateTime? expiration;
 	int ipValue;
+	bool isOnline;
 
-	Token({
+	TokenDTO({
 		this.version = 0,
-		this.value,
+		this.code,
 		this.accountType = AccountType.Admin,
 		this.platform = Platform.Windows,
 		this.loginSource = LoginSource.PC,
@@ -105,12 +107,13 @@ class Token {
 		this.createTime,
 		this.expiration,
 		this.ipValue = 0,
+		this.isOnline = false,
 	});
 
-	factory Token.fromJson(Map<String, dynamic> map) {
-		return Token( 
+	factory TokenDTO.fromJson(Map<String, dynamic> map) {
+		return TokenDTO( 
 			version: map['Version'],
-			value: map['Value'],
+			code: map['Code'],
 			accountType: AccountType.values.firstWhere((e) => e.index == map['AccountType']),
 			platform: Platform.values.firstWhere((e) => e.index == map['Platform']),
 			loginSource: LoginSource.values.firstWhere((e) => e.index == map['LoginSource']),
@@ -119,14 +122,15 @@ class Token {
 			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
 			expiration: map['Expiration'] != null ? DateTime.parse(map['Expiration']) : null,
 			ipValue: map['IpValue'],
+			isOnline: map['IsOnline'],
 		);
 	}
 
 	Map<String, dynamic> toJson() {
 		final map = Map<String, dynamic>();
 		map['Version'] = version;
-		if(value != null)
-			map['Value'] = value;
+		if(code != null)
+			map['Code'] = code;
 		map['AccountType'] = accountType.index;
 		map['Platform'] = platform.index;
 		map['LoginSource'] = loginSource.index;
@@ -139,6 +143,7 @@ class Token {
 		if(expiration != null)
 			map['Expiration'] = JsonRpcUtils.dateFormat(expiration!);
 		map['IpValue'] = ipValue;
+		map['IsOnline'] = isOnline;
 		return map;
 	}
 }
@@ -195,7 +200,7 @@ enum CustomerRpcCode {
 
 class ValidateTokenResult {
 	CustomerRpcCode code;
-	Token? token;
+	TokenDTO? token;
 
 	ValidateTokenResult({
 		this.code = CustomerRpcCode.Ok,
@@ -205,7 +210,7 @@ class ValidateTokenResult {
 	factory ValidateTokenResult.fromJson(Map<String, dynamic> map) {
 		return ValidateTokenResult( 
 			code: CustomerRpcCode.values.firstWhere((e) => e.index == map['Code']),
-			token: map['Token'] != null ? Token.fromJson(map['Token']) : null,
+			token: map['Token'] != null ? TokenDTO.fromJson(map['Token']) : null,
 		);
 	}
 
@@ -240,7 +245,7 @@ class ValidateTokenRequest {
 }
 
 class IList<T> {
-	Token? item;
+	TokenDTO? item;
 
 	IList({
 		this.item,
@@ -248,7 +253,7 @@ class IList<T> {
 
 	factory IList.fromJson(Map<String, dynamic> map) {
 		return IList( 
-			item: map['Item'] != null ? Token.fromJson(map['Item']) : null,
+			item: map['Item'] != null ? TokenDTO.fromJson(map['Item']) : null,
 		);
 	}
 
@@ -286,4 +291,72 @@ class GetTokensWithClientIdRequest extends BaseRequest{
 	}
 }
 
+class GetTokenWithClientIdsRequest extends BaseRequest{
+	List<String>? clientIds;
+
+	GetTokenWithClientIdsRequest({
+		this.clientIds,
+	}) : super(
+		);
+
+	factory GetTokenWithClientIdsRequest.fromJson(Map<String, dynamic> map) {
+		return GetTokenWithClientIdsRequest( 
+			clientIds: map['ClientIds'] != null ? map['ClientIds'].cast<String>().toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(clientIds != null)
+			map['ClientIds'] = clientIds;
+		return map;
+	}
+}
+
+class GetTokenWithValuesRequest extends BaseRequest{
+	List<String>? tokenValues;
+
+	GetTokenWithValuesRequest({
+		this.tokenValues,
+	}) : super(
+		);
+
+	factory GetTokenWithValuesRequest.fromJson(Map<String, dynamic> map) {
+		return GetTokenWithValuesRequest( 
+			tokenValues: map['TokenValues'] != null ? map['TokenValues'].cast<String>().toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(tokenValues != null)
+			map['TokenValues'] = tokenValues;
+		return map;
+	}
+}
+
+class SetOnlineStateRequest extends TokenRequest{
+	bool isOnline;
+
+	SetOnlineStateRequest({
+		this.isOnline = false,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory SetOnlineStateRequest.fromJson(Map<String, dynamic> map) {
+		return SetOnlineStateRequest( 
+			isOnline: map['IsOnline'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		map['IsOnline'] = isOnline;
+		return map;
+	}
+}
+
 

+ 35 - 0
lib/services/dBLog.dart

@@ -0,0 +1,35 @@
+import 'dart:core';
+
+import 'package:fis_jsonrpc/client_base.dart';
+import 'package:fis_common/json_convert.dart';
+
+import 'dBLog.m.dart';
+
+import 'device.m.dart';
+
+
+class DBLogService extends JsonRpcClientBase {
+	DBLogService(
+		String host, {
+		String serviceName = "IDBLogService",
+		Map<String, String>? headers,
+		int? timeout,
+	}) : super(
+						host,
+						serviceName,
+						headers: headers,
+						timeout: timeout,
+				) {
+		/// 注册响应实体反序列化处理器
+		FJsonConvert.setDecoder((map) => PageCollection<DBLog>.fromJson(map));
+		FJsonConvert.setDecoder((map) => DBLog.fromJson(map));
+	}
+
+	Future<PageCollection<DBLog>> findDBLogPagesAsync(GetDBLogPagesRequest request) async {
+		var rpcRst = await call("FindDBLogPagesAsync", request);
+		var result = PageCollection<DBLog>.fromJson(rpcRst as Map<String, dynamic>);
+		return result;
+	}
+
+}
+

+ 94 - 0
lib/services/dBLog.m.dart

@@ -0,0 +1,94 @@
+import 'device.m.dart';
+import 'authentication.m.dart';
+
+import 'package:fis_jsonrpc/utils.dart';
+
+enum LogEventLevel {
+	Verbose,
+	Debug,
+	Information,
+	Warning,
+	Error,
+	Fatal,
+}
+
+class DBLog {
+	LogEventLevel level;
+	String? utcTimestamp;
+	String? messageTemplate;
+
+	DBLog({
+		this.level = LogEventLevel.Verbose,
+		this.utcTimestamp,
+		this.messageTemplate,
+	});
+
+	factory DBLog.fromJson(Map<String, dynamic> map) {
+		return DBLog( 
+			level: LogEventLevel.values.firstWhere((e) => e.index == map['Level']),
+			utcTimestamp: map['UtcTimestamp'],
+			messageTemplate: map['MessageTemplate'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		map['Level'] = level.index;
+		if(utcTimestamp != null)
+			map['UtcTimestamp'] = utcTimestamp;
+		if(messageTemplate != null)
+			map['MessageTemplate'] = messageTemplate;
+		return map;
+	}
+}
+
+class GetDBLogPagesRequest extends PageFilterRequest{
+	String? level;
+	String? keyWord;
+	DateTime? startTime;
+	DateTime? endTime;
+
+	GetDBLogPagesRequest({
+		this.level,
+		this.keyWord,
+		this.startTime,
+		this.endTime,
+		int currentPage = 0,
+		int pageSize = 0,
+		Map<String,String>? filter,
+		bool isFuzzy = false,
+	}) : super(
+			currentPage: currentPage,
+			pageSize: pageSize,
+			filter: filter,
+			isFuzzy: isFuzzy,
+		);
+
+	factory GetDBLogPagesRequest.fromJson(Map<String, dynamic> map) {
+		return GetDBLogPagesRequest( 
+			level: map['Level'],
+			keyWord: map['KeyWord'],
+			startTime: map['StartTime'] != null ? DateTime.parse(map['StartTime']) : null,
+			endTime: map['EndTime'] != null ? DateTime.parse(map['EndTime']) : null,
+			currentPage: map['CurrentPage'],
+			pageSize: map['PageSize'],
+			filter: map['Filter'] != null ? map['Filter'].cast<String,String>() : null,
+			isFuzzy: map['IsFuzzy'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(level != null)
+			map['Level'] = level;
+		if(keyWord != null)
+			map['KeyWord'] = keyWord;
+		if(startTime != null)
+			map['StartTime'] = JsonRpcUtils.dateFormat(startTime!);
+		if(endTime != null)
+			map['EndTime'] = JsonRpcUtils.dateFormat(endTime!);
+		return map;
+	}
+}
+
+

+ 5 - 5
lib/services/device.dart

@@ -31,6 +31,11 @@ class DeviceService extends JsonRpcClientBase {
 		FJsonConvert.setDecoder((map) => DiagnosisModuleDTO.fromJson(map));
 	}
 
+	Future<bool> heartRateAsync(TokenRequest request) async {
+		var rpcRst = await call("HeartRateAsync", request);
+		return rpcRst;
+	}
+
 	Future<DeviceInfoDTO> createDeviceInfoAsync(CreateDeviceRequest request) async {
 		var rpcRst = await call("CreateDeviceInfoAsync", request);
 		var result = DeviceInfoDTO.fromJson(rpcRst as Map<String, dynamic>);
@@ -121,11 +126,6 @@ class DeviceService extends JsonRpcClientBase {
 		return result;
 	}
 
-	Future<bool> cleanDeviceCacheAsync(CleanDeviceCacheRequest request) async {
-		var rpcRst = await call("CleanDeviceCacheAsync", request);
-		return rpcRst;
-	}
-
 	Future<bool> addDeviceToOrgAsync(AddDeviceToOrgRequest request) async {
 		var rpcRst = await call("AddDeviceToOrgAsync", request);
 		return rpcRst;

+ 1 - 22
lib/services/device.m.dart

@@ -1,5 +1,5 @@
-import 'connect.m.dart';
 import 'authentication.m.dart';
+import 'connect.m.dart';
 
 import 'package:fis_common/json_convert.dart';
 
@@ -774,27 +774,6 @@ class SelectItemDTO {
 	}
 }
 
-class CleanDeviceCacheRequest {
-	String? deviceCode;
-
-	CleanDeviceCacheRequest({
-		this.deviceCode,
-	});
-
-	factory CleanDeviceCacheRequest.fromJson(Map<String, dynamic> map) {
-		return CleanDeviceCacheRequest( 
-			deviceCode: map['DeviceCode'],
-		);
-	}
-
-	Map<String, dynamic> toJson() {
-		final map = Map<String, dynamic>();
-		if(deviceCode != null)
-			map['DeviceCode'] = deviceCode;
-		return map;
-	}
-}
-
 class AddDeviceToOrgRequest extends TokenRequest{
 	String? uniqueCode;
 

+ 2 - 2
lib/services/index.dart

@@ -1,5 +1,6 @@
 export 'authentication.dart';
 export 'connect.dart';
+export 'dBLog.dart';
 export 'device.dart';
 export 'email.dart';
 export 'identityApply.dart';
@@ -18,9 +19,9 @@ export 'role.dart';
 export 'sMS.dart';
 export 'storage.dart';
 export 'user.dart';
-export 'vidProcess.dart';
 export 'authentication.m.dart';
 export 'connect.m.dart';
+export 'dBLog.m.dart';
 export 'device.m.dart';
 export 'identityApply.m.dart';
 export 'login.m.dart';
@@ -37,4 +38,3 @@ export 'report.m.dart';
 export 'role.m.dart';
 export 'storage.m.dart';
 export 'user.m.dart';
-export 'vidProcess.m.dart';

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

@@ -611,14 +611,17 @@ class ServerLangugeClass {
 
 class ServerSettingResult {
 	List<ServerLangugeClass>? serverLangugeList;
+	Map<String,String>? serverConfigList;
 
 	ServerSettingResult({
 		this.serverLangugeList,
+		this.serverConfigList,
 	});
 
 	factory ServerSettingResult.fromJson(Map<String, dynamic> map) {
 		return ServerSettingResult( 
 			serverLangugeList: map['ServerLangugeList'] != null ? (map['ServerLangugeList'] as List).map((e)=>ServerLangugeClass.fromJson(e as Map<String,dynamic>)).toList() : null,
+			serverConfigList: map['ServerConfigList'] != null ? map['ServerConfigList'].cast<String,String>() : null,
 		);
 	}
 
@@ -626,6 +629,8 @@ class ServerSettingResult {
 		final map = Map<String, dynamic>();
 		if(serverLangugeList != null)
 			map['ServerLangugeList'] = serverLangugeList;
+		if(serverConfigList != null)
+			map['ServerConfigList'] = serverConfigList;
 		return map;
 	}
 }

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

@@ -558,6 +558,697 @@ enum DiagnosisOrganEnum {
 	Spleen,
 }
 
+enum Unit {
+	None,
+	percent,
+	fraction,
+	placeHolder_3,
+	placeHolder_4,
+	placeHolder_5,
+	placeHolder_6,
+	placeHolder_7,
+	placeHolder_8,
+	placeHolder_9,
+	cm,
+	mm,
+	inch,
+	ft,
+	placeHolder_14,
+	placeHolder_15,
+	placeHolder_16,
+	placeHolder_17,
+	placeHolder_18,
+	placeHolder_19,
+	s,
+	minute,
+	hour,
+	day,
+	week,
+	week_day,
+	Tick,
+	msec,
+	placeHolder_28,
+	placeHolder_29,
+	degree,
+	radian,
+	placeHolder_32,
+	placeHolder_33,
+	placeHolder_34,
+	placeHolder_35,
+	placeHolder_36,
+	placeHolder_37,
+	placeHolder_38,
+	placeHolder_39,
+	g,
+	mg,
+	ng,
+	kg,
+	oz,
+	lb,
+	lb_oz,
+	placeHolder_47,
+	placeHolder_48,
+	placeHolder_49,
+	cm2,
+	mm2,
+	m2,
+	placeHolder_53,
+	placeHolder_54,
+	placeHolder_55,
+	placeHolder_56,
+	placeHolder_57,
+	placeHolder_58,
+	placeHolder_59,
+	cm3,
+	mm3,
+	ml,
+	L,
+	placeHolder_64,
+	placeHolder_65,
+	placeHolder_66,
+	placeHolder_67,
+	placeHolder_68,
+	placeHolder_69,
+	cms,
+	mms,
+	ms,
+	placeHolder_73,
+	placeHolder_74,
+	placeHolder_75,
+	placeHolder_76,
+	placeHolder_77,
+	placeHolder_78,
+	placeHolder_79,
+	cms2,
+	mms2,
+	placeHolder_82,
+	placeHolder_83,
+	placeHolder_84,
+	placeHolder_85,
+	placeHolder_86,
+	placeHolder_87,
+	placeHolder_88,
+	placeHolder_89,
+	cm3s,
+	mls,
+	mlmin,
+	Lmin,
+	placeHolder_94,
+	placeHolder_95,
+	placeHolder_96,
+	placeHolder_97,
+	placeHolder_98,
+	placeHolder_99,
+	gcm3,
+	gml,
+	ngml,
+	placeHolder_103,
+	placeHolder_104,
+	placeHolder_105,
+	placeHolder_106,
+	placeHolder_107,
+	placeHolder_108,
+	placeHolder_109,
+	mmHg,
+	placeHolder_111,
+	placeHolder_112,
+	placeHolder_113,
+	placeHolder_114,
+	placeHolder_115,
+	placeHolder_116,
+	placeHolder_117,
+	placeHolder_118,
+	placeHolder_119,
+	mV,
+	placeHolder_121,
+	placeHolder_122,
+	placeHolder_123,
+	placeHolder_124,
+	placeHolder_125,
+	placeHolder_126,
+	placeHolder_127,
+	placeHolder_128,
+	placeHolder_129,
+	Hz,
+	KHz,
+	HR,
+	placeHolder_133,
+	placeHolder_134,
+	placeHolder_135,
+	placeHolder_136,
+	placeHolder_137,
+	placeHolder_138,
+	placeHolder_139,
+	cm3m2,
+	mlm2,
+	placeHolder_142,
+	placeHolder_143,
+	placeHolder_144,
+	placeHolder_145,
+	placeHolder_146,
+	placeHolder_147,
+	placeHolder_148,
+	placeHolder_149,
+	cm3sm2,
+	mlsm2,
+	placeHolder_152,
+	cm3minm2,
+	mlminm2,
+	Lminm2,
+	placeHolder_156,
+	placeHolder_157,
+	placeHolder_158,
+	placeHolder_159,
+	circs,
+	placeHolder_161,
+	placeHolder_162,
+	placeHolder_163,
+	placeHolder_164,
+	placeHolder_165,
+	placeHolder_166,
+	placeHolder_167,
+	placeHolder_168,
+	placeHolder_169,
+	mlbeat,
+	placeHolder_171,
+	placeHolder_172,
+	placeHolder_173,
+	placeHolder_174,
+	placeHolder_175,
+	placeHolder_176,
+	placeHolder_177,
+	placeHolder_178,
+	placeHolder_179,
+	mm2pa,
+	d1mpa,
+	kpa,
+	placeHolder_183,
+	placeHolder_184,
+	placeHolder_185,
+	placeHolder_186,
+	placeHolder_187,
+	placeHolder_188,
+	placeHolder_189,
+	mmHgs,
+	placeHolder_191,
+	placeHolder_192,
+	placeHolder_193,
+	placeHolder_194,
+	placeHolder_195,
+	placeHolder_196,
+	placeHolder_197,
+	placeHolder_198,
+	placeHolder_199,
+	gm2,
+	kgm2,
+	placeHolder_202,
+	placeHolder_203,
+	placeHolder_204,
+	placeHolder_205,
+	placeHolder_206,
+	placeHolder_207,
+	placeHolder_208,
+	placeHolder_209,
+	cm2m2,
+	placeHolder_211,
+	placeHolder_212,
+	placeHolder_213,
+	placeHolder_214,
+	placeHolder_215,
+	placeHolder_216,
+	placeHolder_217,
+	placeHolder_218,
+	placeHolder_219,
+	cmm2,
+	mmm2,
+	placeHolder_222,
+	placeHolder_223,
+	placeHolder_224,
+	placeHolder_225,
+	placeHolder_226,
+	placeHolder_227,
+	placeHolder_228,
+	placeHolder_229,
+	pers,
+	placeHolder_231,
+	placeHolder_232,
+	placeHolder_233,
+	placeHolder_234,
+	placeHolder_235,
+	placeHolder_236,
+	placeHolder_237,
+	placeHolder_238,
+	placeHolder_239,
+	placeHolder_240,
+	placeHolder_241,
+	placeHolder_242,
+	placeHolder_243,
+	placeHolder_244,
+	placeHolder_245,
+	placeHolder_246,
+	placeHolder_247,
+	placeHolder_248,
+	placeHolder_249,
+	Celsius,
+	Fahrenheit,
+	placeHolder_252,
+	placeHolder_253,
+	placeHolder_254,
+	placeHolder_255,
+	placeHolder_256,
+	placeHolder_257,
+	placeHolder_258,
+	placeHolder_259,
+	Ohm,
+	placeHolder_261,
+	placeHolder_262,
+	placeHolder_263,
+	placeHolder_264,
+	placeHolder_265,
+	placeHolder_266,
+	placeHolder_267,
+	placeHolder_268,
+	placeHolder_269,
+	mmHgml,
+}
+
+class MeasuredValueDTO {
+	String? typeName;
+	String? name;
+	String? description;
+	bool worksheetAffinity;
+	String? briefDescription;
+	String? value;
+	Unit unit;
+	Unit targetUnit;
+
+	MeasuredValueDTO({
+		this.typeName,
+		this.name,
+		this.description,
+		this.worksheetAffinity = false,
+		this.briefDescription,
+		this.value,
+		this.unit = Unit.None,
+		this.targetUnit = Unit.None,
+	});
+
+	factory MeasuredValueDTO.fromJson(Map<String, dynamic> map) {
+		return MeasuredValueDTO( 
+			typeName: map['TypeName'],
+			name: map['Name'],
+			description: map['Description'],
+			worksheetAffinity: map['WorksheetAffinity'],
+			briefDescription: map['BriefDescription'],
+			value: map['Value'],
+			unit: Unit.values.firstWhere((e) => e.index == map['Unit']),
+			targetUnit: Unit.values.firstWhere((e) => e.index == map['TargetUnit']),
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(typeName != null)
+			map['TypeName'] = typeName;
+		if(name != null)
+			map['Name'] = name;
+		if(description != null)
+			map['Description'] = description;
+		map['WorksheetAffinity'] = worksheetAffinity;
+		if(briefDescription != null)
+			map['BriefDescription'] = briefDescription;
+		if(value != null)
+			map['Value'] = value;
+		map['Unit'] = unit.index;
+		map['TargetUnit'] = targetUnit.index;
+		return map;
+	}
+}
+
+class PointDTO {
+	double x;
+	double y;
+
+	PointDTO({
+		this.x = 0,
+		this.y = 0,
+	});
+
+	factory PointDTO.fromJson(Map<String, dynamic> map) {
+		return PointDTO( 
+			x: map['X'],
+			y: map['Y'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		map['X'] = x;
+		map['Y'] = y;
+		return map;
+	}
+}
+
+class MeasuredFeatureDTO {
+	String? typeName;
+	String? creator;
+	String? guid;
+	bool showChildFeatures;
+	DateTime? timeStamp;
+	bool isAutoCalculated;
+	bool isVisible;
+	String? annotation;
+	String? briefAnnotation;
+	String? baseType;
+	Unit xUnit;
+	Unit yUnit;
+	String? shapeType;
+	List<MeasuredValueDTO>? values;
+	List<PointDTO>? points;
+
+	MeasuredFeatureDTO({
+		this.typeName,
+		this.creator,
+		this.guid,
+		this.showChildFeatures = false,
+		this.timeStamp,
+		this.isAutoCalculated = false,
+		this.isVisible = false,
+		this.annotation,
+		this.briefAnnotation,
+		this.baseType,
+		this.xUnit = Unit.None,
+		this.yUnit = Unit.None,
+		this.shapeType,
+		this.values,
+		this.points,
+	});
+
+	factory MeasuredFeatureDTO.fromJson(Map<String, dynamic> map) {
+		return MeasuredFeatureDTO( 
+			typeName: map['TypeName'],
+			creator: map['Creator'],
+			guid: map['Guid'],
+			showChildFeatures: map['ShowChildFeatures'],
+			timeStamp: map['TimeStamp'] != null ? DateTime.parse(map['TimeStamp']) : null,
+			isAutoCalculated: map['IsAutoCalculated'],
+			isVisible: map['IsVisible'],
+			annotation: map['Annotation'],
+			briefAnnotation: map['BriefAnnotation'],
+			baseType: map['BaseType'],
+			xUnit: Unit.values.firstWhere((e) => e.index == map['XUnit']),
+			yUnit: Unit.values.firstWhere((e) => e.index == map['YUnit']),
+			shapeType: map['ShapeType'],
+			values: map['Values'] != null ? (map['Values'] as List).map((e)=>MeasuredValueDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+			points: map['Points'] != null ? (map['Points'] as List).map((e)=>PointDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(typeName != null)
+			map['TypeName'] = typeName;
+		if(creator != null)
+			map['Creator'] = creator;
+		if(guid != null)
+			map['Guid'] = guid;
+		map['ShowChildFeatures'] = showChildFeatures;
+		if(timeStamp != null)
+			map['TimeStamp'] = JsonRpcUtils.dateFormat(timeStamp!);
+		map['IsAutoCalculated'] = isAutoCalculated;
+		map['IsVisible'] = isVisible;
+		if(annotation != null)
+			map['Annotation'] = annotation;
+		if(briefAnnotation != null)
+			map['BriefAnnotation'] = briefAnnotation;
+		if(baseType != null)
+			map['BaseType'] = baseType;
+		map['XUnit'] = xUnit.index;
+		map['YUnit'] = yUnit.index;
+		if(shapeType != null)
+			map['ShapeType'] = shapeType;
+		if(values != null)
+			map['Values'] = values;
+		if(points != null)
+			map['Points'] = points;
+		return map;
+	}
+}
+
+class ChildrenFetusNodeDTO {
+	String? typeName;
+	String? folderName;
+	String? folderDescription;
+	String? modeName;
+	String? applicationId;
+	String? application;
+	List<MeasuredFeatureDTO>? children;
+
+	ChildrenFetusNodeDTO({
+		this.typeName,
+		this.folderName,
+		this.folderDescription,
+		this.modeName,
+		this.applicationId,
+		this.application,
+		this.children,
+	});
+
+	factory ChildrenFetusNodeDTO.fromJson(Map<String, dynamic> map) {
+		return ChildrenFetusNodeDTO( 
+			typeName: map['TypeName'],
+			folderName: map['FolderName'],
+			folderDescription: map['FolderDescription'],
+			modeName: map['ModeName'],
+			applicationId: map['ApplicationId'],
+			application: map['Application'],
+			children: map['Children'] != null ? (map['Children'] as List).map((e)=>MeasuredFeatureDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(typeName != null)
+			map['TypeName'] = typeName;
+		if(folderName != null)
+			map['FolderName'] = folderName;
+		if(folderDescription != null)
+			map['FolderDescription'] = folderDescription;
+		if(modeName != null)
+			map['ModeName'] = modeName;
+		if(applicationId != null)
+			map['ApplicationId'] = applicationId;
+		if(application != null)
+			map['Application'] = application;
+		if(children != null)
+			map['Children'] = children;
+		return map;
+	}
+}
+
+class FetusNodeDTO {
+	String? typeName;
+	String? fetusIndex;
+	List<ChildrenFetusNodeDTO>? children;
+
+	FetusNodeDTO({
+		this.typeName,
+		this.fetusIndex,
+		this.children,
+	});
+
+	factory FetusNodeDTO.fromJson(Map<String, dynamic> map) {
+		return FetusNodeDTO( 
+			typeName: map['TypeName'],
+			fetusIndex: map['FetusIndex'],
+			children: map['Children'] != null ? (map['Children'] as List).map((e)=>ChildrenFetusNodeDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(typeName != null)
+			map['TypeName'] = typeName;
+		if(fetusIndex != null)
+			map['FetusIndex'] = fetusIndex;
+		if(children != null)
+			map['Children'] = children;
+		return map;
+	}
+}
+
+class MeasuredResultsDTO {
+	String? version;
+	List<FetusNodeDTO>? fetusNodes;
+
+	MeasuredResultsDTO({
+		this.version,
+		this.fetusNodes,
+	});
+
+	factory MeasuredResultsDTO.fromJson(Map<String, dynamic> map) {
+		return MeasuredResultsDTO( 
+			version: map['Version'],
+			fetusNodes: map['FetusNodes'] != null ? (map['FetusNodes'] as List).map((e)=>FetusNodeDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(version != null)
+			map['Version'] = version;
+		if(fetusNodes != null)
+			map['FetusNodes'] = fetusNodes;
+		return map;
+	}
+}
+
+class AdornerDTO {
+	String? adornerTypeName;
+	PointDTO? topLeft;
+	String? content;
+
+	AdornerDTO({
+		this.adornerTypeName,
+		this.topLeft,
+		this.content,
+	});
+
+	factory AdornerDTO.fromJson(Map<String, dynamic> map) {
+		return AdornerDTO( 
+			adornerTypeName: map['AdornerTypeName'],
+			topLeft: map['TopLeft'] != null ? PointDTO.fromJson(map['TopLeft']) : null,
+			content: map['Content'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(adornerTypeName != null)
+			map['AdornerTypeName'] = adornerTypeName;
+		if(topLeft != null)
+			map['TopLeft'] = topLeft;
+		if(content != null)
+			map['Content'] = content;
+		return map;
+	}
+}
+
+class BaseAreaDTO {
+	String? visualAreaTypeName;
+	List<AdornerDTO>? adorner;
+
+	BaseAreaDTO({
+		this.visualAreaTypeName,
+		this.adorner,
+	});
+
+	factory BaseAreaDTO.fromJson(Map<String, dynamic> map) {
+		return BaseAreaDTO( 
+			visualAreaTypeName: map['VisualAreaTypeName'],
+			adorner: map['Adorner'] != null ? (map['Adorner'] as List).map((e)=>AdornerDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(visualAreaTypeName != null)
+			map['VisualAreaTypeName'] = visualAreaTypeName;
+		if(adorner != null)
+			map['Adorner'] = adorner;
+		return map;
+	}
+}
+
+class VisualAreaDTO {
+	List<BaseAreaDTO>? children;
+
+	VisualAreaDTO({
+		this.children,
+	});
+
+	factory VisualAreaDTO.fromJson(Map<String, dynamic> map) {
+		return VisualAreaDTO( 
+			children: map['Children'] != null ? (map['Children'] as List).map((e)=>BaseAreaDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(children != null)
+			map['Children'] = children;
+		return map;
+	}
+}
+
+class VisualKeyDTO {
+	String? visualKeyTypeName;
+	VisualAreaDTO? visualArea;
+
+	VisualKeyDTO({
+		this.visualKeyTypeName,
+		this.visualArea,
+	});
+
+	factory VisualKeyDTO.fromJson(Map<String, dynamic> map) {
+		return VisualKeyDTO( 
+			visualKeyTypeName: map['VisualKeyTypeName'],
+			visualArea: map['VisualArea'] != null ? VisualAreaDTO.fromJson(map['VisualArea']) : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(visualKeyTypeName != null)
+			map['VisualKeyTypeName'] = visualKeyTypeName;
+		if(visualArea != null)
+			map['VisualArea'] = visualArea;
+		return map;
+	}
+}
+
+class VisualDTO {
+	List<VisualKeyDTO>? children;
+
+	VisualDTO({
+		this.children,
+	});
+
+	factory VisualDTO.fromJson(Map<String, dynamic> map) {
+		return VisualDTO( 
+			children: map['Children'] != null ? (map['Children'] as List).map((e)=>VisualKeyDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(children != null)
+			map['Children'] = children;
+		return map;
+	}
+}
+
+class ScanImageDTO {
+	VisualDTO? visual;
+
+	ScanImageDTO({
+		this.visual,
+	});
+
+	factory ScanImageDTO.fromJson(Map<String, dynamic> map) {
+		return ScanImageDTO( 
+			visual: map['Visual'] != null ? VisualDTO.fromJson(map['Visual']) : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(visual != null)
+			map['Visual'] = visual;
+		return map;
+	}
+}
+
 class RemedicalInfoDTO extends BaseDTO{
 	String? remedicalCode;
 	String? deviceCode;
@@ -570,6 +1261,8 @@ class RemedicalInfoDTO extends BaseDTO{
 	DiagnosisConclusionEnum diagnosisConclusion;
 	String? diagnosisResult;
 	List<DiagnosisOrganEnum>? diagnosisOrgans;
+	MeasuredResultsDTO? measuredResult;
+	ScanImageDTO? commentResult;
 	DateTime? createTime;
 	DateTime? updateTime;
 
@@ -585,6 +1278,8 @@ class RemedicalInfoDTO extends BaseDTO{
 		this.diagnosisConclusion = DiagnosisConclusionEnum.NotRequired,
 		this.diagnosisResult,
 		this.diagnosisOrgans,
+		this.measuredResult,
+		this.commentResult,
 		this.createTime,
 		this.updateTime,
 	});
@@ -602,6 +1297,8 @@ class RemedicalInfoDTO extends BaseDTO{
 			diagnosisConclusion: DiagnosisConclusionEnum.values.firstWhere((e) => e.index == map['DiagnosisConclusion']),
 			diagnosisResult: map['DiagnosisResult'],
 			diagnosisOrgans: map['DiagnosisOrgans'] != null ? (map['DiagnosisOrgans'] as List).map((e)=>DiagnosisOrganEnum.values.firstWhere((i) => i.index == e)).toList() : null,
+			measuredResult: map['MeasuredResult'] != null ? MeasuredResultsDTO.fromJson(map['MeasuredResult']) : null,
+			commentResult: map['CommentResult'] != null ? ScanImageDTO.fromJson(map['CommentResult']) : null,
 			createTime: map['CreateTime'] != null ? DateTime.parse(map['CreateTime']) : null,
 			updateTime: map['UpdateTime'] != null ? DateTime.parse(map['UpdateTime']) : null,
 		);

+ 11 - 6
lib/services/remedical.dart

@@ -34,8 +34,8 @@ class RemedicalService extends JsonRpcClientBase {
 		FJsonConvert.setDecoder((map) => QueryExamListItemResult.fromJson(map));
 		FJsonConvert.setDecoder((map) => QueryExamInfoResult.fromJson(map));
 		FJsonConvert.setDecoder((map) => MeasureApplicationDTO.fromJson(map));
-		FJsonConvert.setDecoder((map) => CommentItemDTO.fromJson(map));
-		FJsonConvert.setDecoder((map) => PresetCommentItemDTO.fromJson(map));
+		FJsonConvert.setDecoder((map) => CommentItemResultDTO.fromJson(map));
+		FJsonConvert.setDecoder((map) => PresetCommentItemResultDTO.fromJson(map));
 	}
 
 	Future<CreateExaminfoResult> createExamInfoAsync(CreateExaminfoRequest request) async {
@@ -118,15 +118,15 @@ class RemedicalService extends JsonRpcClientBase {
 		return result;
 	}
 
-	Future<List<CommentItemDTO>> getCommentsByApplicationAsync(GetCommentsByApplicationRequest request) async {
+	Future<CommentItemResultDTO> getCommentsByApplicationAsync(GetCommentsByApplicationRequest request) async {
 		var rpcRst = await call("GetCommentsByApplicationAsync", request);
-		var result = (rpcRst as List).map((e)=>CommentItemDTO.fromJson(e as Map<String, dynamic>)).toList();
+		var result = CommentItemResultDTO.fromJson(rpcRst as Map<String, dynamic>);
 		return result;
 	}
 
-	Future<List<PresetCommentItemDTO>> getPresetCommentsAsync(GetPresetCommentsRequest request) async {
+	Future<PresetCommentItemResultDTO> getPresetCommentsAsync(GetPresetCommentsRequest request) async {
 		var rpcRst = await call("GetPresetCommentsAsync", request);
-		var result = (rpcRst as List).map((e)=>PresetCommentItemDTO.fromJson(e as Map<String, dynamic>)).toList();
+		var result = PresetCommentItemResultDTO.fromJson(rpcRst as Map<String, dynamic>);
 		return result;
 	}
 
@@ -140,5 +140,10 @@ class RemedicalService extends JsonRpcClientBase {
 		return rpcRst;
 	}
 
+	Future<String> getReportElementByLanguageAsync(GetReportElementByLanguageRequest request) async {
+		var rpcRst = await call("GetReportElementByLanguageAsync", request);
+		return rpcRst;
+	}
+
 }
 

+ 102 - 279
lib/services/remedical.m.dart

@@ -75,6 +75,8 @@ class UploadExamDataRequest extends TokenRequest{
 	String? coverImageToken;
 	String? application;
 	RemedicalFileDataTypeEnum fileDataType;
+	MeasuredResultsDTO? measuredResult;
+	ScanImageDTO? commentResult;
 
 	UploadExamDataRequest({
 		this.examCode,
@@ -83,6 +85,8 @@ class UploadExamDataRequest extends TokenRequest{
 		this.coverImageToken,
 		this.application,
 		this.fileDataType = RemedicalFileDataTypeEnum.VinnoVidSingle,
+		this.measuredResult,
+		this.commentResult,
 		String? token,
 	}) : super(
 			token: token,
@@ -96,6 +100,8 @@ class UploadExamDataRequest extends TokenRequest{
 			coverImageToken: map['CoverImageToken'],
 			application: map['Application'],
 			fileDataType: RemedicalFileDataTypeEnum.values.firstWhere((e) => e.index == map['FileDataType']),
+			measuredResult: map['MeasuredResult'] != null ? MeasuredResultsDTO.fromJson(map['MeasuredResult']) : null,
+			commentResult: map['CommentResult'] != null ? ScanImageDTO.fromJson(map['CommentResult']) : null,
 			token: map['Token'],
 		);
 	}
@@ -113,6 +119,10 @@ class UploadExamDataRequest extends TokenRequest{
 		if(application != null)
 			map['Application'] = application;
 		map['FileDataType'] = fileDataType.index;
+		if(measuredResult != null)
+			map['MeasuredResult'] = measuredResult;
+		if(commentResult != null)
+			map['CommentResult'] = commentResult;
 		return map;
 	}
 }
@@ -198,19 +208,19 @@ class RemedicalItemList {
 }
 
 class RemedicalListResult {
-	String? sacnDate;
+	String? scanDate;
 	String? recordCode;
 	List<RemedicalItemList>? remedicalItemList;
 
 	RemedicalListResult({
-		this.sacnDate,
+		this.scanDate,
 		this.recordCode,
 		this.remedicalItemList,
 	});
 
 	factory RemedicalListResult.fromJson(Map<String, dynamic> map) {
 		return RemedicalListResult( 
-			sacnDate: map['SacnDate'],
+			scanDate: map['ScanDate'],
 			recordCode: map['RecordCode'],
 			remedicalItemList: map['RemedicalItemList'] != null ? (map['RemedicalItemList'] as List).map((e)=>RemedicalItemList.fromJson(e as Map<String,dynamic>)).toList() : null,
 		);
@@ -218,8 +228,8 @@ class RemedicalListResult {
 
 	Map<String, dynamic> toJson() {
 		final map = Map<String, dynamic>();
-		if(sacnDate != null)
-			map['SacnDate'] = sacnDate;
+		if(scanDate != null)
+			map['ScanDate'] = scanDate;
 		if(recordCode != null)
 			map['RecordCode'] = recordCode;
 		if(remedicalItemList != null)
@@ -586,280 +596,6 @@ class QueryExamInfoRequest extends TokenRequest{
 	}
 }
 
-enum Unit {
-	None,
-	percent,
-	fraction,
-	placeHolder_3,
-	placeHolder_4,
-	placeHolder_5,
-	placeHolder_6,
-	placeHolder_7,
-	placeHolder_8,
-	placeHolder_9,
-	cm,
-	mm,
-	inch,
-	ft,
-	placeHolder_14,
-	placeHolder_15,
-	placeHolder_16,
-	placeHolder_17,
-	placeHolder_18,
-	placeHolder_19,
-	s,
-	minute,
-	hour,
-	day,
-	week,
-	week_day,
-	Tick,
-	msec,
-	placeHolder_28,
-	placeHolder_29,
-	degree,
-	radian,
-	placeHolder_32,
-	placeHolder_33,
-	placeHolder_34,
-	placeHolder_35,
-	placeHolder_36,
-	placeHolder_37,
-	placeHolder_38,
-	placeHolder_39,
-	g,
-	mg,
-	ng,
-	kg,
-	oz,
-	lb,
-	lb_oz,
-	placeHolder_47,
-	placeHolder_48,
-	placeHolder_49,
-	cm2,
-	mm2,
-	m2,
-	placeHolder_53,
-	placeHolder_54,
-	placeHolder_55,
-	placeHolder_56,
-	placeHolder_57,
-	placeHolder_58,
-	placeHolder_59,
-	cm3,
-	mm3,
-	ml,
-	L,
-	placeHolder_64,
-	placeHolder_65,
-	placeHolder_66,
-	placeHolder_67,
-	placeHolder_68,
-	placeHolder_69,
-	cms,
-	mms,
-	ms,
-	placeHolder_73,
-	placeHolder_74,
-	placeHolder_75,
-	placeHolder_76,
-	placeHolder_77,
-	placeHolder_78,
-	placeHolder_79,
-	cms2,
-	mms2,
-	placeHolder_82,
-	placeHolder_83,
-	placeHolder_84,
-	placeHolder_85,
-	placeHolder_86,
-	placeHolder_87,
-	placeHolder_88,
-	placeHolder_89,
-	cm3s,
-	mls,
-	mlmin,
-	Lmin,
-	placeHolder_94,
-	placeHolder_95,
-	placeHolder_96,
-	placeHolder_97,
-	placeHolder_98,
-	placeHolder_99,
-	gcm3,
-	gml,
-	ngml,
-	placeHolder_103,
-	placeHolder_104,
-	placeHolder_105,
-	placeHolder_106,
-	placeHolder_107,
-	placeHolder_108,
-	placeHolder_109,
-	mmHg,
-	placeHolder_111,
-	placeHolder_112,
-	placeHolder_113,
-	placeHolder_114,
-	placeHolder_115,
-	placeHolder_116,
-	placeHolder_117,
-	placeHolder_118,
-	placeHolder_119,
-	mV,
-	placeHolder_121,
-	placeHolder_122,
-	placeHolder_123,
-	placeHolder_124,
-	placeHolder_125,
-	placeHolder_126,
-	placeHolder_127,
-	placeHolder_128,
-	placeHolder_129,
-	Hz,
-	KHz,
-	HR,
-	placeHolder_133,
-	placeHolder_134,
-	placeHolder_135,
-	placeHolder_136,
-	placeHolder_137,
-	placeHolder_138,
-	placeHolder_139,
-	cm3m2,
-	mlm2,
-	placeHolder_142,
-	placeHolder_143,
-	placeHolder_144,
-	placeHolder_145,
-	placeHolder_146,
-	placeHolder_147,
-	placeHolder_148,
-	placeHolder_149,
-	cm3sm2,
-	mlsm2,
-	placeHolder_152,
-	cm3minm2,
-	mlminm2,
-	Lminm2,
-	placeHolder_156,
-	placeHolder_157,
-	placeHolder_158,
-	placeHolder_159,
-	circs,
-	placeHolder_161,
-	placeHolder_162,
-	placeHolder_163,
-	placeHolder_164,
-	placeHolder_165,
-	placeHolder_166,
-	placeHolder_167,
-	placeHolder_168,
-	placeHolder_169,
-	mlbeat,
-	placeHolder_171,
-	placeHolder_172,
-	placeHolder_173,
-	placeHolder_174,
-	placeHolder_175,
-	placeHolder_176,
-	placeHolder_177,
-	placeHolder_178,
-	placeHolder_179,
-	mm2pa,
-	d1mpa,
-	kpa,
-	placeHolder_183,
-	placeHolder_184,
-	placeHolder_185,
-	placeHolder_186,
-	placeHolder_187,
-	placeHolder_188,
-	placeHolder_189,
-	mmHgs,
-	placeHolder_191,
-	placeHolder_192,
-	placeHolder_193,
-	placeHolder_194,
-	placeHolder_195,
-	placeHolder_196,
-	placeHolder_197,
-	placeHolder_198,
-	placeHolder_199,
-	gm2,
-	kgm2,
-	placeHolder_202,
-	placeHolder_203,
-	placeHolder_204,
-	placeHolder_205,
-	placeHolder_206,
-	placeHolder_207,
-	placeHolder_208,
-	placeHolder_209,
-	cm2m2,
-	placeHolder_211,
-	placeHolder_212,
-	placeHolder_213,
-	placeHolder_214,
-	placeHolder_215,
-	placeHolder_216,
-	placeHolder_217,
-	placeHolder_218,
-	placeHolder_219,
-	cmm2,
-	mmm2,
-	placeHolder_222,
-	placeHolder_223,
-	placeHolder_224,
-	placeHolder_225,
-	placeHolder_226,
-	placeHolder_227,
-	placeHolder_228,
-	placeHolder_229,
-	pers,
-	placeHolder_231,
-	placeHolder_232,
-	placeHolder_233,
-	placeHolder_234,
-	placeHolder_235,
-	placeHolder_236,
-	placeHolder_237,
-	placeHolder_238,
-	placeHolder_239,
-	placeHolder_240,
-	placeHolder_241,
-	placeHolder_242,
-	placeHolder_243,
-	placeHolder_244,
-	placeHolder_245,
-	placeHolder_246,
-	placeHolder_247,
-	placeHolder_248,
-	placeHolder_249,
-	Celsius,
-	Fahrenheit,
-	placeHolder_252,
-	placeHolder_253,
-	placeHolder_254,
-	placeHolder_255,
-	placeHolder_256,
-	placeHolder_257,
-	placeHolder_258,
-	placeHolder_259,
-	Ohm,
-	placeHolder_261,
-	placeHolder_262,
-	placeHolder_263,
-	placeHolder_264,
-	placeHolder_265,
-	placeHolder_266,
-	placeHolder_267,
-	placeHolder_268,
-	placeHolder_269,
-	mmHgml,
-}
-
 class OutputItemMetaDTO {
 	String? name;
 	String? description;
@@ -1091,11 +827,13 @@ class MeasureModeDTO {
 }
 
 class MeasureApplicationDTO {
+	String? version;
 	String? id;
 	String? description;
 	List<MeasureModeDTO>? availableModes;
 
 	MeasureApplicationDTO({
+		this.version,
 		this.id,
 		this.description,
 		this.availableModes,
@@ -1103,6 +841,7 @@ class MeasureApplicationDTO {
 
 	factory MeasureApplicationDTO.fromJson(Map<String, dynamic> map) {
 		return MeasureApplicationDTO( 
+			version: map['Version'],
 			id: map['Id'],
 			description: map['Description'],
 			availableModes: map['AvailableModes'] != null ? (map['AvailableModes'] as List).map((e)=>MeasureModeDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
@@ -1111,6 +850,8 @@ class MeasureApplicationDTO {
 
 	Map<String, dynamic> toJson() {
 		final map = Map<String, dynamic>();
+		if(version != null)
+			map['Version'] = version;
 		if(id != null)
 			map['Id'] = id;
 		if(description != null)
@@ -1177,6 +918,32 @@ class CommentItemDTO {
 	}
 }
 
+class CommentItemResultDTO {
+	String? version;
+	List<CommentItemDTO>? commentItems;
+
+	CommentItemResultDTO({
+		this.version,
+		this.commentItems,
+	});
+
+	factory CommentItemResultDTO.fromJson(Map<String, dynamic> map) {
+		return CommentItemResultDTO( 
+			version: map['Version'],
+			commentItems: map['CommentItems'] != null ? (map['CommentItems'] as List).map((e)=>CommentItemDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(version != null)
+			map['Version'] = version;
+		if(commentItems != null)
+			map['CommentItems'] = commentItems;
+		return map;
+	}
+}
+
 class GetCommentsByApplicationRequest extends TokenRequest{
 	String? languageCode;
 	String? applicationName;
@@ -1238,6 +1005,32 @@ class PresetCommentItemDTO {
 	}
 }
 
+class PresetCommentItemResultDTO {
+	String? version;
+	List<PresetCommentItemDTO>? presetCommentItems;
+
+	PresetCommentItemResultDTO({
+		this.version,
+		this.presetCommentItems,
+	});
+
+	factory PresetCommentItemResultDTO.fromJson(Map<String, dynamic> map) {
+		return PresetCommentItemResultDTO( 
+			version: map['Version'],
+			presetCommentItems: map['PresetCommentItems'] != null ? (map['PresetCommentItems'] as List).map((e)=>PresetCommentItemDTO.fromJson(e as Map<String,dynamic>)).toList() : null,
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = Map<String, dynamic>();
+		if(version != null)
+			map['Version'] = version;
+		if(presetCommentItems != null)
+			map['PresetCommentItems'] = presetCommentItems;
+		return map;
+	}
+}
+
 class GetPresetCommentsRequest extends TokenRequest{
 	String? languageCode;
 
@@ -1284,4 +1077,34 @@ class DeviceDiagnosisChangedNotification {
 	}
 }
 
+class GetReportElementByLanguageRequest extends TokenRequest{
+	String? reportDatasJosn;
+	String? language;
+
+	GetReportElementByLanguageRequest({
+		this.reportDatasJosn,
+		this.language,
+		String? token,
+	}) : super(
+			token: token,
+		);
+
+	factory GetReportElementByLanguageRequest.fromJson(Map<String, dynamic> map) {
+		return GetReportElementByLanguageRequest( 
+			reportDatasJosn: map['ReportDatasJosn'],
+			language: map['Language'],
+			token: map['Token'],
+		);
+	}
+
+	Map<String, dynamic> toJson() {
+		final map = super.toJson();
+		if(reportDatasJosn != null)
+			map['ReportDatasJosn'] = reportDatasJosn;
+		if(language != null)
+			map['Language'] = language;
+		return map;
+	}
+}
+
 

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

@@ -270,9 +270,11 @@ class ReportDTO extends ReportBaseDTO{
 
 class FindReportByCodeRequest extends TokenRequest{
 	String? reportCode;
+	String? language;
 
 	FindReportByCodeRequest({
 		this.reportCode,
+		this.language,
 		String? token,
 	}) : super(
 			token: token,
@@ -281,6 +283,7 @@ class FindReportByCodeRequest extends TokenRequest{
 	factory FindReportByCodeRequest.fromJson(Map<String, dynamic> map) {
 		return FindReportByCodeRequest( 
 			reportCode: map['ReportCode'],
+			language: map['Language'],
 			token: map['Token'],
 		);
 	}
@@ -289,6 +292,8 @@ class FindReportByCodeRequest extends TokenRequest{
 		final map = super.toJson();
 		if(reportCode != null)
 			map['ReportCode'] = reportCode;
+		if(language != null)
+			map['Language'] = language;
 		return map;
 	}
 }

+ 5 - 0
lib/services/user.dart

@@ -28,6 +28,11 @@ class UserService extends JsonRpcClientBase {
 		FJsonConvert.setDecoder((map) => UserFeatureInfoResult.fromJson(map));
 	}
 
+	Future<bool> heartRateAsync(TokenRequest request) async {
+		var rpcRst = await call("HeartRateAsync", request);
+		return rpcRst;
+	}
+
 	Future<UserDTO> getUserInfoAsync(GetUserInfoRequest request) async {
 		var rpcRst = await call("GetUserInfoAsync", request);
 		var result = UserDTO.fromJson(rpcRst as Map<String, dynamic>);

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

@@ -1,7 +1,7 @@
+import 'authentication.m.dart';
 import 'connect.m.dart';
 import 'patient.m.dart';
 import 'identityApply.m.dart';
-import 'authentication.m.dart';
 import 'device.m.dart';
 
 enum UserInfoStateEnum {