using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Data.Common; using System.IO; using System.Linq; using System.Threading.Tasks; using Vinno.IUS.Common.IO; using Vinno.IUS.Common.Log; using Vinno.IUS.Common.Network.Leaf; using Vinno.IUS.Common.Network.Transfer; using Vinno.vCloud.Client.Proxy.Interfaces; using Vinno.vCloud.Common.Client.Managers; using Vinno.vCloud.Common.Client.Managers.Interfaces; using Vinno.vCloud.Common.Client.Managers.Interfaces.Data; using Vinno.vCloud.Common.Client.Managers.Interfaces.Data.RemoteConsultation; using Vinno.vCloud.Common.Client.Plugins.Account.ViewModels; using Vinno.vCloud.Common.Storage; using Vinno.vCloud.Common.Storage.Download; using Vinno.vCloud.Common.Storage.ObjectStorageInfo; using Vinno.vCloud.Common.Storage.Upload; using Vinno.vCloud.Protocol.Infrastructures; using Vinno.vCloud.Protocol.Messages.Admin.RemoteDiagnosis; using Vinno.vCloud.Protocol.Messages.Client; using Vinno.vCloud.Protocol.Messages.Client.Account; using Vinno.vCloud.Protocol.Messages.Client.Chat; using Vinno.vCloud.Protocol.Messages.Client.Live; using Vinno.vCloud.Protocol.Messages.Client.LiveTalking; using Vinno.vCloud.Protocol.Messages.Client.Remedical.Reports; using Vinno.vCloud.Protocol.Messages.Client.Remedical.TerminalDatas; using Vinno.vCloud.Protocol.Messages.Client.Remedical.TerminialReords; using Vinno.vCloud.Protocol.Messages.Client.RemoteDiagnosis; using Vinno.vCloud.Protocol.Messages.Common; using Vinno.vCloud.Protocol.Messages.Live; using Vinno.vCloud.Protocol.Messages.Report; namespace Vinno.vCloud.Client.Proxy { class VCloudClient : IFlyinsonoClient { private volatile int _livingTime; private readonly int _sessionLifecycle = 10; //30*10 minutes private readonly ClientManager _clientManager; private string _currentUserName; private string _accountId; /// /// 是否单点登录 /// private bool _isSingleLogin; /// ///单点登录的模式 /// private int _singleMode; private bool _isMeeting; private LoginSource _loginSource = LoginSource.ClientProxy; private LanguageType _languageType = LanguageType.Chinese; private GetAccountDetailInfoSuccess8 _getAccountDetailInfo; private object _storageInfoLocker = new object(); private StorageInfo _storageInfo; private readonly string _fileCacheFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FileCacheFolder"); public int LeftTime => _sessionLifecycle - _livingTime; public VCloudClient(string openId, string hostUrl) { OpenId = openId; _clientManager = new ClientManager(hostUrl); _clientManager.MessageArrived += OnMessageArrived; } public event EventHandler MeetingMemberNotificationArrived;//成员改变通知 public event EventHandler MeetingHangupNotificationArrived;//挂断通知 public event EventHandler StartMeetingNotificationArrived; public event EventHandler CancelStartMeetingNotificationArrived; public event EventHandler AcceptMeetingNotificationArrived; public event EventHandler RejectMeetingNotificationArrived; public event EventHandler ChatPendingMemberTimeoutNotificationArrived; public event EventHandler ChatMemberHeartbeatStatusNotificationArrived; public event EventHandler MuteVideoUserChangeNotificationArrived; /// /// OpenId /// public string OpenId { get; private set; } public int OnlineTimes { get; private set; } private void OnMessageArrived(object sender, Message e) { Logger.WriteLineInfo($"Message arrived -{e.Tag.Description}"); #region 会诊 var meetingMemberNotification = MeetingMemberNotification.Convert(e); //用户发生变化 if (meetingMemberNotification != null) { Logger.WriteLineInfo($"UserName:{_currentUserName} LiveMeeting MeetingMemberNotification Arrived"); MeetingMemberNotificationArrived?.Invoke(this, meetingMemberNotification); } var startMeetingNotification = StartMeetingNotification.Convert(e); //接收者收到被邀请通知 if (startMeetingNotification != null) { Logger.WriteLineInfo($"UserName:{_currentUserName} LiveMeeting StartMeetingNotification Arrived"); StartMeetingNotificationArrived?.Invoke(this, startMeetingNotification); } var cancelStartMeetingNotification = CancelStartMeetingNotification.Convert(e); //取消会诊通知 if (cancelStartMeetingNotification != null) { Logger.WriteLineInfo($"UserName:{_currentUserName} LiveMeeting CancelStartMeetingNotification Arrived"); CancelStartMeetingNotificationArrived?.Invoke(this, cancelStartMeetingNotification); } var acceptMeetingNotification = AcceptMeetingNotification.Convert(e); if (acceptMeetingNotification != null) { Logger.WriteLineInfo($"UserName:{_currentUserName} LiveMeeting AcceptMeetingNotification Arrived"); AcceptMeetingNotificationArrived?.Invoke(this, acceptMeetingNotification); } var rejectChatNotification = RejectMeetingNotification.Convert(e); //拒绝会诊通知 if (rejectChatNotification != null) { Logger.WriteLineInfo($"UserName:{_currentUserName} LiveMeeting RejectMeetingNotification Arrived"); RejectMeetingNotificationArrived?.Invoke(this, rejectChatNotification); } var meetingHangupNotification = MeetingHangupNotification.Convert(e); if (meetingHangupNotification != null) { Logger.WriteLineInfo($"UserName:{_currentUserName} LiveMeeting MeetingHangupNotification Arrived"); MeetingHangupNotificationArrived?.Invoke(this, meetingHangupNotification); } var chatPendingMemberTimeoutNotification = ChatPendingMemberTimeoutNotification.Convert(e); if (chatPendingMemberTimeoutNotification != null) { Logger.WriteLineInfo($"UserName:{_currentUserName} LiveMeeting ChatPendingMemberTimeoutNotification Arrived"); ChatPendingMemberTimeoutNotificationArrived?.Invoke(this, chatPendingMemberTimeoutNotification); } var chatMemberHeartBeatStatusNotification = ChatMemberHeartbeatStatusNotification.Convert(e); if (chatMemberHeartBeatStatusNotification != null) { Logger.WriteLineInfo($"UserName:{_currentUserName} LiveMeeting ChatMemberHeartbeatStatusNotification Arrived"); ChatMemberHeartbeatStatusNotificationArrived?.Invoke(this, chatMemberHeartBeatStatusNotification); } var muteVideoUserChangeNotification = MuteVideoUserChangeNotification.Convert(e); if (muteVideoUserChangeNotification != null) { Logger.WriteLineInfo($"UserName:{_currentUserName} LiveMeeting MuteVideoUserChangeNotification Arrived"); MuteVideoUserChangeNotificationArrived?.Invoke(this, muteVideoUserChangeNotification); } #endregion } /// /// Client login /// /// vCloud user name /// vCloud password /// public LoginStatus LoginByOpenId(string openId, string username = "", string password = "") { try { var result = _clientManager.LoginByOpenId(openId, username, password); if (result == LoginStatus.Success) { _currentUserName = GetUserInfoByOpenId(openId)?.NickName; _accountId = _clientManager.AccountId; _getAccountDetailInfo = GetCurrentAccountDetails(); } return result; } catch (Exception ex) { Logger.WriteLineError($"VCloudClient Login ex:{ex}"); } return LoginStatus.Unknown; } /// /// Log out the logined user /// /// public bool Logout() { return false; } /// /// 查询系统默认报告模板 /// /// /// public List GetReportTemplates(string languageCode) { var resultData = new List(); if (string.IsNullOrWhiteSpace(languageCode) || languageCode == "zh-CN") { resultData.Add(new ReportTemplateMessage { ReportFileName = "Default", ReportTemplateUrl = "1!U$https://cdn-bj.fis.plus/Default_zh-CN_flyinsono1.7_2023.json", }); resultData.Add(new ReportTemplateMessage { ReportFileName = "Pet", ReportTemplateUrl = "1!U$https://cdn-bj.fis.plus/Pet_zh-CN_flyinsono1.7_2023.json", }); resultData.Add(new ReportTemplateMessage { ReportFileName = "AI", ReportTemplateUrl = "1!U$https://cdn-bj.fis.plus/AI_zh-CN_flyinsono1.7_2023.json", }); } else { resultData.Add(new ReportTemplateMessage { ReportFileName = "Default", ReportTemplateUrl = "1!U$https://cdn-bj.fis.plus/Default_en-US_flyinsono1.7_2023.json", }); resultData.Add(new ReportTemplateMessage { ReportFileName = "Pet", ReportTemplateUrl = "1!U$https://cdn-bj.fis.plus/Pet_en-US_flyinsono1.7_2023.json", }); resultData.Add(new ReportTemplateMessage { ReportFileName = "AI", ReportTemplateUrl = "1!U$https://cdn-bj.fis.plus/AI_en-US_flyinsono1.7_2023.json", }); } if (_getAccountDetailInfo != null && _getAccountDetailInfo.ReportTemplates != null && _getAccountDetailInfo.ReportTemplates.Any()) { resultData.AddRange(_getAccountDetailInfo.ReportTemplates); } return resultData; } /// /// 查询系统默认词条 /// /// /// public List GetThesaurusTemplates(string languageCode) { var resultData = new List(); if (string.IsNullOrWhiteSpace(languageCode) || languageCode == "zh-CN") { resultData.Add(new ReportTemplateMessage { ReportFileName = "Default", ReportTemplateUrl = "1!U$https://cdn-bj.fis.plus/Thesaurus_General_zh-CN_flyinsono1.7_2023.json", }); resultData.Add(new ReportTemplateMessage { ReportFileName = "Pet", ReportTemplateUrl = "1!U$https://cdn-bj.fis.plus/Thesaurus_Pet_zh-CN_flyinsono1.7_2023.json", }); } else { resultData.Add(new ReportTemplateMessage { ReportFileName = "Default", ReportTemplateUrl = "1!U$https://cdn-bj.fis.plus/Thesaurus_General_en-US_flyinsono1.7_2023.json", }); resultData.Add(new ReportTemplateMessage { ReportFileName = "Pet", ReportTemplateUrl = "1!U$https://cdn-bj.fis.plus/Thesaurus_Pet_en-US_flyinsono1.7_2023.json", }); } return resultData; } /// /// 查询报告标签 /// /// public List GetCustomerLabels() { try { var request = new GetReportTagsTreeRequest { UserId = _accountId, }; var result = SendMessage(request); if (result != null) { var getReportTagsSuccess = GetReportTagsTreeResult.Convert(result); if (getReportTagsSuccess != null && getReportTagsSuccess.CustomLabels != null && getReportTagsSuccess.CustomLabels.Any()) { return getReportTagsSuccess.CustomLabels; } } } catch (Exception ex) { Logger.WriteLineError($"VCloudClient userName:{_currentUserName} GetCustomerLabels ex:{ex}"); } return new List(); } /// /// 开始会诊 /// /// /// /// /// /// /// public ConsultationResult StartConversation(string roomId, string consultationId) { //获取会诊单子信息 var consultation = FindConsultationById(consultationId); if (_isSingleLogin && _singleMode != 1) { using (var request = MessagePool.GetMessage()) { request.RoomId = roomId; request.InitiatorId = _accountId; request.InitiatorName = _currentUserName; request.Mode = LiveTalkingMode.Video; request.FeatureSource = FeatureSource.RemoteDiagnosis; request.Source = _loginSource; request.TerminalId = consultation?.TerminalId;//会诊单子查询 request.ConsulationRecordId = consultationId; request.ClientLanguage = _languageType; var result = SendMessage(request); if (result != null) { var resultMessage = MeetingResult.Convert(result); if (resultMessage != null) { List meetingMemberInfos = new List(); foreach (var member in resultMessage.Members) { var meetingMemberInfo = new MeetingMemberInfo { OperationType = member.OperationType, RoleType = member.RoleType, RoomId = member.RoomId, LoginSource = member.LoginSource, State = member.State, Id = member.Id, Name = member.Name, DisplayName = member.DisplayName, Avatar = member.Avatar, UserSign = member.UserSign, PushUrl = member.PushUrl, PullRtmpUrl = member.PullRtmpUrl, PullFlvUrl = member.PullFlvUrl, PullHlsUrl = member.PullHlsUrl }; meetingMemberInfos.Add(meetingMemberInfo); } List terminalInfos = new List(); foreach (var liveTerminal in resultMessage.LiveTerminals) { if (liveTerminal.IsMultiChannels) { var mainTerminalInfo = liveTerminal.Channels.Select(f => f.Name).Contains("Main") ? liveTerminal.Channels.FirstOrDefault(f => f.Name == "Main") : liveTerminal.Channels.FirstOrDefault(); var cameraInfo = liveTerminal.Channels.Count > 1 ? liveTerminal.Channels[1] : null; if (mainTerminalInfo != null) { var terminalInfo = new LiveTerminalInfo() { IsMultiChannels = liveTerminal.IsMultiChannels, OperationType = liveTerminal.OperationType, TerminalLiveEnabled = mainTerminalInfo.Enable, CameraLiveEnabled = cameraInfo?.Enable ?? false, IsMergeChannel = liveTerminal.IsMergeChannel, TerminalWidth = mainTerminalInfo.Width, TerminalHeight = mainTerminalInfo.Height, // TerminalUrl = mainTerminalInfo.RtmpUrl, CameraWidth = cameraInfo?.Width ?? 0, CameraHeight = cameraInfo?.Height ?? 0, // CameraUrl = cameraInfo?.RtmpUrl, // TerminalLiveProtocol = liveTerminal.LiveProtocol, IntegerRoomId = liveTerminal.IntegerRoomId, TerminalIntegerRoomId = liveTerminal.TerminalIntegerRoomId, State = liveTerminal.State, Id = mainTerminalInfo.UserId, CameraId = cameraInfo?.UserId, }; terminalInfos.Add(terminalInfo); } } else { var terminalInfo = new LiveTerminalInfo() { OperationType = liveTerminal.OperationType, TerminalLiveEnabled = liveTerminal.TerminalLiveEnabled, CameraLiveEnabled = liveTerminal.CameraLiveEnabled, IsMergeChannel = liveTerminal.IsMergeChannel, TerminalWidth = liveTerminal.TerminalWidth, TerminalHeight = liveTerminal.TerminalHeight, // TerminalUrl = liveTerminal.TerminalUrl, CameraWidth = liveTerminal.CameraWidth, CameraHeight = liveTerminal.CameraHeight, // CameraUrl = liveTerminal.CameraUrl, // TerminalLiveProtocol = liveTerminal.LiveProtocol, IntegerRoomId = liveTerminal.IntegerRoomId, TerminalIntegerRoomId = liveTerminal.TerminalIntegerRoomId, State = liveTerminal.State, Id = liveTerminal.Id }; terminalInfos.Add(terminalInfo); } } var requestResult = new ConsultationResult(resultMessage.State) { AppId = resultMessage.AppId, RoomId = resultMessage.RoomId, LiveProtocol = resultMessage.LiveProtocol, State = resultMessage.State, IntegerRoomId = resultMessage.IntegerRoomId, TerminalInfos = terminalInfos, MeetingMemberInfos = meetingMemberInfos }; return requestResult; } } } } using (var request = MessagePool.GetMessage()) { request.RoomId = roomId; request.InitiatorId = _accountId; request.InitiatorName = _currentUserName; request.Mode = LiveTalkingMode.Video; request.FeatureSource = FeatureSource.RemoteDiagnosis; request.Source = _loginSource; request.RecipientIds = new List() { new RecipientInfo() { Id = consultation.DoctorId, RoleType = MeetingRoleType.Recipient } }; request.TerminalIds = new List() { consultation?.TerminalId };//会诊单子查询; request.ConsulationRecordId = consultationId; request.ClientLanguage = _languageType; var result = SendMessage(request); if (result != null) { var resultMessage = MeetingResult.Convert(result); if (resultMessage != null) { List meetingMemberInfos = new List(); foreach (var member in resultMessage.Members) { var meetingMemberInfo = new MeetingMemberInfo { OperationType = member.OperationType, RoleType = member.RoleType, RoomId = member.RoomId, LoginSource = member.LoginSource, State = member.State, Id = member.Id, Name = member.Name, DisplayName = member.DisplayName, Avatar = member.Avatar, UserSign = member.UserSign, PushUrl = member.PushUrl, PullRtmpUrl = member.PullRtmpUrl, PullFlvUrl = member.PullFlvUrl, PullHlsUrl = member.PullHlsUrl }; meetingMemberInfos.Add(meetingMemberInfo); } List terminalInfos = new List(); foreach (var liveTerminal in resultMessage.LiveTerminals) { if (liveTerminal.IsMultiChannels) { var mainTerminalInfo = liveTerminal.Channels.Select(f => f.Name).Contains("Main") ? liveTerminal.Channels.FirstOrDefault(f => f.Name == "Main") : liveTerminal.Channels.FirstOrDefault(); var cameraInfo = liveTerminal.Channels.Count > 1 ? liveTerminal.Channels[1] : null; if (mainTerminalInfo != null) { var terminalInfo = new LiveTerminalInfo() { IsMultiChannels = liveTerminal.IsMultiChannels, OperationType = liveTerminal.OperationType, TerminalLiveEnabled = mainTerminalInfo.Enable, CameraLiveEnabled = cameraInfo?.Enable ?? false, IsMergeChannel = liveTerminal.IsMergeChannel, TerminalWidth = mainTerminalInfo.Width, TerminalHeight = mainTerminalInfo.Height, // TerminalUrl = mainTerminalInfo.RtmpUrl, CameraWidth = cameraInfo?.Width ?? 0, CameraHeight = cameraInfo?.Height ?? 0, // CameraUrl = cameraInfo?.RtmpUrl, // TerminalLiveProtocol = liveTerminal.LiveProtocol, IntegerRoomId = liveTerminal.IntegerRoomId, TerminalIntegerRoomId = liveTerminal.TerminalIntegerRoomId, State = liveTerminal.State, Id = mainTerminalInfo.UserId, CameraId = cameraInfo?.UserId, }; terminalInfos.Add(terminalInfo); } } else { var terminalInfo = new LiveTerminalInfo() { OperationType = liveTerminal.OperationType, TerminalLiveEnabled = liveTerminal.TerminalLiveEnabled, CameraLiveEnabled = liveTerminal.CameraLiveEnabled, IsMergeChannel = liveTerminal.IsMergeChannel, TerminalWidth = liveTerminal.TerminalWidth, TerminalHeight = liveTerminal.TerminalHeight, // TerminalUrl = liveTerminal.TerminalUrl, CameraWidth = liveTerminal.CameraWidth, CameraHeight = liveTerminal.CameraHeight, // CameraUrl = liveTerminal.CameraUrl, // TerminalLiveProtocol = liveTerminal.LiveProtocol, IntegerRoomId = liveTerminal.IntegerRoomId, TerminalIntegerRoomId = liveTerminal.TerminalIntegerRoomId, State = liveTerminal.State, Id = liveTerminal.Id }; terminalInfos.Add(terminalInfo); } } var requestResult = new ConsultationResult(resultMessage.State) { AppId = resultMessage.AppId, RoomId = resultMessage.RoomId, LiveProtocol = resultMessage.LiveProtocol, State = resultMessage.State, IntegerRoomId = resultMessage.IntegerRoomId, TerminalInfos = terminalInfos, MeetingMemberInfos = meetingMemberInfos }; if (resultMessage.State == LiveStates.OK) { if (consultation.State < ConsultationState.Started) { UpdateRecordState(new UpdateAppointmentStateRequest() { Id = consultationId, State = ConsultationState.Started }); } } return requestResult; } } } return new ConsultationResult(LiveStates.UnknowException); } public ConsultationMessage FindConsultationById(string id) { try { using (var request = MessagePool.GetMessage()) { request.ConsultationId = id; var result = SendMessage(request); if (result != null) { var resultMessage = ConsultationMessage.Convert(result); if (resultMessage != null) { return resultMessage; } } } } catch (Exception ex) { Logger.WriteLineError($"FindConsultation exception:{ex}"); } return null; } /// /// 取消发起过程中的会诊 /// /// /// /// /// /// /// public LiveStates CancelStartConversation(string roomId) { try { using (var request = MessagePool.GetMessage()) { request.RoomId = roomId; request.InitiatorId = _accountId; if (_isMeeting) { request.ForceClosed = false; } else { request.ForceClosed = true; } request.LoginSource = LoginSource.ClientProxy; var result = SendMessage(request); if (result != null) { var resultMessage = CancelStartMeetingtResult.Convert(result); if (resultMessage != null) { return resultMessage.State; } } } } catch (Exception exception) { Logger.WriteLineError($" userName:{_currentUserName} GetUserInfoByOpenId error:{exception}"); } return LiveStates.UnknowException; } /// /// 会诊过程中邀请会诊成员 /// /// /// /// /// public ConsultationResult InviteConsultationMember(string roomId, FeatureSource feature, List recipientInfos) { try { using (var request = new InviteMeetingMembersRequest()) { request.InitiatorId = _accountId; request.RoomId = roomId; request.FeatureSource = feature; request.Source = _loginSource; request.RecipientIds = recipientInfos; request.ClientLanguage = _languageType; var result = SendMessage(request); if (result != null) { var resultMessage = InviteMeetingMembersResult.Convert(result); if (resultMessage != null) { var inviteMeeting = new ConsultationResult(resultMessage.State); inviteMeeting.TerminalInfos = resultMessage.LiveTerminals.Select(liveTerminal => new LiveTerminalInfo() { TerminalLiveEnabled = liveTerminal.TerminalLiveEnabled, CameraLiveEnabled = liveTerminal.CameraLiveEnabled, IsMergeChannel = liveTerminal.IsMergeChannel, TerminalWidth = liveTerminal.TerminalWidth, TerminalHeight = liveTerminal.TerminalHeight, // TerminalUrl = liveTerminal.TerminalUrl, CameraWidth = liveTerminal.CameraWidth, CameraHeight = liveTerminal.CameraHeight, // CameraUrl = liveTerminal.CameraUrl, // TerminalLiveProtocol = liveTerminal.LiveProtocol, IntegerRoomId = liveTerminal.IntegerRoomId, State = liveTerminal.State, Id = liveTerminal.Id }).ToList(); inviteMeeting.MeetingMemberInfos = resultMessage.Recipients.Select(member => new MeetingMemberInfo() { OperationType = member.OperationType, RoleType = member.RoleType, RoomId = member.RoomId, LoginSource = member.LoginSource, State = member.State, Id = member.Id, Name = member.Name, DisplayName = member.DisplayName, Avatar = member.Avatar, UserSign = member.UserSign, PushUrl = member.PushUrl, PullRtmpUrl = member.PullRtmpUrl, PullFlvUrl = member.PullFlvUrl, PullHlsUrl = member.PullHlsUrl }).ToList(); return inviteMeeting; } } } } catch (Exception exception) { Logger.WriteLineError($" userName:{_currentUserName} InviteConsultationMember error:{exception}"); } return new ConsultationResult(LiveStates.UnknowException); } /// /// 退出会诊 /// /// /// /// /// /// public LiveStates ExitConsultation(string roomId, bool forceClosed, string terminalId, string consultationId) { try { if (_isSingleLogin && _singleMode != 1) { using (var request = new ExitIndependConversationRequest()) { request.RoomId = roomId; request.InitiatorId = _accountId; request.InitiatorName = _currentUserName; request.ClientLanguage = _languageType; request.Source = _loginSource; request.TerminalId = terminalId; var result = SendMessage(request); if (result != null) { var resultMessage = ResultMessage.Convert(result); if (resultMessage != null && resultMessage == CCR.OK) { return LiveStates.OK; } } } } else { using (var request = new ExitMeetingRequest()) { request.UserId = _accountId; request.RoomId = roomId; request.RecipientIds = new List { _accountId }; request.LoginSource = _loginSource; request.ForceClosed = forceClosed; request.ClientLanguage = _languageType; var result = SendMessage(request); if (result != null) { var resultMessage = ExitMeetingResult.Convert(result); if (resultMessage != null) { var consultationResult = FindConsultationById(consultationId); if (consultationResult?.State != ConsultationState.WaitForReportUpload) { UpdateRecordState(new UpdateAppointmentStateRequest() { Id = consultationId, State = ConsultationState.WaitForReportUpload }); } return resultMessage.State; } } } } _isMeeting = false; } catch (Exception exception) { Logger.WriteLineError($" userName:{_currentUserName} ExitConsultation error:{exception}"); } return LiveStates.UnknowException; } /// /// 接受会诊邀请 /// /// /// /// /// /// public LiveStates AcceptConsultation(string roomId, FeatureSource featureSource, LiveStates liveStates, string initiatorId) { using (var request = new AcceptMeetingRequest()) { request.RoomId = roomId; request.RecipientId = _accountId; request.FeatureSource = featureSource; request.InitiatorId = initiatorId; request.Source = _loginSource; request.PushLiveState = liveStates; request.ClientLanguage = _languageType; var result = SendMessage(request); if (result != null) { var resultMessage = AcceptMeetingResult.Convert(result); if (resultMessage != null) { return resultMessage.State; } } } return LiveStates.UnknowException; } /// /// 拒绝会诊邀请 /// /// /// /// public LiveStates RejectConsultation(string roomId, string initiatorId) { using (var request = new RejectMeetingRequest()) { request.RoomId = roomId; request.RecipientId = _accountId; request.InitiatorId = initiatorId; request.LoginSource = _loginSource; request.ClientLanguage = _languageType; var result = SendMessage(request); if (result != null) { var resultMessage = MeetingResult.Convert(result); //拒绝会诊result if (resultMessage != null) { return resultMessage.State; } } } return LiveStates.UnknowException; } public WechatUserInfo GetUserInfoByOpenId(string openId) { try { using (var request = MessagePool.GetMessage()) { request.Openid = openId; var messages = SendMessage(request); if (messages == null) return null; var result = GetAccountByOpenIdResult.Convert(messages); if (result == null || string.IsNullOrEmpty(result.UserId)) return null; _getAccountDetailInfo = GetCurrentAccountDetails(); return new WechatUserInfo { NickName = result.NickName, PhoneNumber = result.Phone, Openid = request.Openid, Hospital = _getAccountDetailInfo.Hospital, UserId = result.UserId, }; } } catch (Exception exception) { Logger.WriteLineError($" userName:{_currentUserName} GetUserInfoByOpenId error:{exception}"); } return null; } /// /// 创建会诊 /// /// /// public string CreateConsultationRecord(CreateAppointmentRequest1 request) { try { request.InspectionItems = GetEnglishCheckPointEnName(request.InspectionItems); request.CreatorId = _accountId; var result = SendMessage(request); if (result != null) { var resultMessage = AddConsultationResult.Convert(result); if (resultMessage != null) { return resultMessage.Id; } } } catch (Exception exception) { Logger.WriteLineError($" userName:{_currentUserName} Create Appointment error:{exception}"); } return string.Empty; } public FindNewAppointmentsResult6 FindConsultationRecords(int startIndex, int pageSize, AppointmentsFilterMessage filter) { var pageIndex = startIndex % pageSize == 0 ? startIndex / pageSize : startIndex / pageSize + 1; try { _getAccountDetailInfo = GetCurrentAccountDetails(); filter.SuperiorHospitalIds = _getAccountDetailInfo.HospitalMessage.SuperiorHospitals.Select(v => v.OrganizationId).ToList(); filter.LowerHospitalIds = _getAccountDetailInfo.HospitalMessage.LowerHospitals.Select(v => v.OrganizationId).ToList(); using (var request = MessagePool.GetMessage()) { request.UserId = _accountId; request.PageIndex = pageIndex; request.PageSize = pageSize; request.Filter = AppointmentsFilterMessage.ConvertToFilterMessage(filter); request.FollowUpVisitStatus = FollowUpVisitStatus.Unknown; request.EvaluateGrade = EvaluateGrade.UnSet; var result = SendMessage(request); if (result != null) { var resultMessage = FindNewAppointmentsResult6.Convert(result); if (resultMessage != null) { foreach (var item in resultMessage.AppointmentsMessages) { item.CheckPoint = GetCnCheckPointCnName(item.CheckPoint); } return resultMessage; } } } } catch (Exception ex) { Logger.WriteLineError($" userName:{_currentUserName} Find Appointments error:{ex}"); } return null; } /// /// 获取自己的医院列表 /// /// public List GetMyHospitals() { var hospitals = new List(); try { using (var request = MessagePool.GetMessage()) { request.UserId = _accountId; var result = SendMessage(request); if (result != null) { var resultMessage = GetHospitalsResult.Convert(result); if (resultMessage != null && resultMessage.Hospitals != null) { hospitals = resultMessage.Hospitals.ToList(); } } } } catch (Exception exception) { Logger.WriteLineError($"GetHospitalsAsync userName:{_currentUserName} error:{exception}"); } return hospitals; } /// /// 获取自己超声机 /// /// public List GetMyTerminals() { try { using (var request = MessagePool.GetMessage()) { request.UserId = _accountId; var result = SendMessage(request); if (result != null) { var terminalsResult = FindTerminalsResult5.Convert(result); return terminalsResult?.EntityMessages.Select(m => new Interfaces.TerminalInfo() { Id = m.Id, OrganizationId = m.OrganizationId, OrganizationDecription = m.OrganizationDescription, OrganizationName = m.OrganizationName, Name = m.TerminalName, Model = m.TerminalModel, Description = m.Description, UniqueId = m.UniquedId, }).ToList(); } } } catch (Exception ex) { Logger.WriteLineError($"VCloudClient userName:{_currentUserName} GetMyTerminals ex:{ex}"); } return new List(); } /// /// 查询专家 /// /// /// public List FindMyExpertsByHospitalId(string hospitalId) { try { using (var request = MessagePool.GetMessage()) { request.HospitalId = hospitalId; var result = SendMessage(request); if (result != null) { var resultMessage = FindAllExpertsWithShiftsResult.Convert(result); if (resultMessage != null && resultMessage.ExpertDetails != null) { return resultMessage.ExpertDetails.Select(v => v as ExpertDetailMessage).ToList(); } } } } catch (Exception ex) { Logger.WriteLineError($"VCloudClient userName:{_currentUserName} FindMyExpertsByHospitalId ex:{ex}"); } return null; } /// /// 获取检查部位 /// /// public List GetCheckPoint() { return new List() { "胎儿", "子宫","附件","盆腔","肝脏", "胆囊", "胆管","胰腺","脾脏","双肾","输尿管","膀胱","前列腺","肠系膜淋巴结","乳腺","甲状腺","颈部血管","椎动脉","外周浅表", "淋巴结","心脏", "睾丸","附睾","精索静脉" }; } private string GetCnCheckPointCnName(string enName) { string cnName = enName; switch (enName) { case "Fetu": cnName = "胎儿"; break; case "Uterus": cnName = "子宫"; break; case "Appendages": cnName = "附件"; break; case "PelvicCavity": cnName = "盆腔"; break; case "Liver": cnName = "肝脏"; break; case "GB": cnName = "胆囊"; break; case "BileDuct": cnName = "胆管"; break; case "Pancreas": cnName = "胰腺"; break; case "Spleen": cnName = "脾脏"; break; case "DoubleKidney": cnName = "双肾"; break; case "Ureter": cnName = "输尿管"; break; case "Bladder": cnName = "膀胱"; break; case "Prostate": cnName = "前列腺"; break; case "MesentericLymphNode": cnName = "肠系膜淋巴结"; break; case "Breast": cnName = "乳腺"; break; case "CervicalVessels": cnName = "颈部血管"; break; case "VertebralArtery": cnName = "椎动脉"; break; case "PeripheralSuperficial": cnName = "外周浅表"; break; case "LymphNode": cnName = "淋巴结"; break; case "Cardiac": cnName = "心脏"; break; case "Testicle": cnName = "睾丸"; break; case "Epididymis": cnName = "附睾"; break; case "VenaeSpermatica": cnName = "精索静脉"; break; } return cnName; } private string GetEnglishCheckPointEnName(string cnName) { string enName = cnName; switch (cnName) { case "胎儿": enName = "Fetu"; break; case "子宫": enName = "Uterus"; break; case "附件": enName = "Appendages"; break; case "盆腔": enName = "PelvicCavity"; break; case "肝脏": enName = "Liver"; break; case "胆囊": enName = "GB"; break; case "胆管": enName = "BileDuct"; break; case "胰腺": enName = "Pancreas"; break; case "脾脏": enName = "Spleen"; break; case "双肾": enName = "DoubleKidney"; break; case "输尿管": enName = "Ureter"; break; case "膀胱": enName = "Bladder"; break; case "前列腺": enName = "Prostate"; break; case "肠系膜淋巴结": enName = "MesentericLymphNode"; break; case "乳腺": enName = "Breast"; break; case "颈部血管": enName = "CervicalVessels"; break; case "椎动脉": enName = "VertebralArtery"; break; case "外周浅表": enName = "PeripheralSuperficial"; break; case "淋巴结": enName = "LymphNode"; break; case "心脏": enName = "Cardiac"; break; case "睾丸": enName = "Testicle"; break; case "附睾": enName = "Epididymis"; break; case "精索静脉": enName = "VenaeSpermatica"; break; } return enName; } /// ///通过远程记录Id查询图像 /// /// /// public GetPatientRecordDatasSuccess9 GetPatientRecordImageById(GetPatientRecordDatasRequest11 request) { try { var result = SendMessage(request); if (result != null) { var getRecordsSuccess = GetPatientRecordDatasSuccess9.Convert(result); if (getRecordsSuccess != null) { return getRecordsSuccess; } } } catch (Exception ex) { Logger.WriteLineError($"VCloudClient userName:{_currentUserName} GetPatientRecordImageById ex:{ex}"); } return null; } /// /// 通过记录Id获取报告 /// /// /// public NewGetReportsSuccess5 GetReportByecordId(NewGetReportsRequest5 request) { try { request.UserId = _accountId; var result = SendMessage(request); if (result != null) { var getRecordsSuccess = NewGetReportsSuccess5.Convert(result); if (getRecordsSuccess != null) { return getRecordsSuccess; } } } catch (Exception ex) { Logger.WriteLineError($"VCloudClient userName:{_currentUserName} GetReportByecordId ex:{ex}"); } return null; } /// /// 查询报告详情 /// /// /// public NewReportInfoMessage5 GetReportById(string recordId, string reportId) { try { var request = new NewGetReportsRequest5 { UserId = _accountId, TerminalRecordId = recordId, }; var result = GetReportByecordId(request); return result?.Reports?.FirstOrDefault(x => x.Id == reportId); } catch (Exception ex) { Logger.WriteLineError($"VCloudClient userName:{_currentUserName} GetReportById ex:{ex}"); } return null; } /// /// 查询分时远程诊断记录 /// /// /// public GetRecords11Success GetExamRecords(GetClientRecord11Request request) { try { _getAccountDetailInfo = GetCurrentAccountDetails(); request.Filter.TerminalIds = _getAccountDetailInfo?.AssignedTerminals.Select(v => v.Id).ToList(); request.Filter.OrganizationIds = _getAccountDetailInfo?.AssignedOrganizations.Select(v => v.OrganizationId).ToList(); request.UserId = _accountId; var result = SendMessage(request); if (result != null) { var getRecordsSuccess = GetRecords11Success.Convert(result); if (getRecordsSuccess != null) { return getRecordsSuccess; } } } catch (Exception ex) { Logger.WriteLineError($"VCloudClient userName:{_currentUserName} GetExamRecords ex:{ex}"); } return null; } /// /// 安排会诊申请单 /// /// /// /// /// public bool ArrangeConsultation(ArrangeAppointmentRequest request) { try { var result = SendMessage(request); if (result != null) { var resultMessage = ResultMessage.Convert(result); if (resultMessage == CCR.OK) { return true; } } } catch (Exception exception) { Logger.WriteLineError($" VCloudClient Finished Appointment error:{exception}"); } return false; } public GetAccountDetailInfoSuccess8 GetCurrentAccountDetails() { try { using (var request = MessagePool.GetMessage()) { request.AccountId = _accountId; var result = SendMessage(request); if (result != null) { var accountInfoResult = GetAccountDetailInfoSuccess8.Convert(result); if (accountInfoResult != null) { return accountInfoResult; } } } } catch (Exception ex) { Logger.WriteLineError($"VCloudClient userName:{_currentUserName} GetCurrentAccountDetails ex:{ex}"); } return null; } /// /// 上传会诊状态 /// /// /// public bool UpdateRecordState(UpdateAppointmentStateRequest request) { try { var result = SendMessage(request); if (result != null) { var resultMessage = ResultMessage.Convert(result); if (resultMessage == CCR.OK) { return true; } } } catch (Exception exception) { Logger.WriteLineError($" VCloudClient UpdateRecordState error:{exception}"); } return false; } /// Active the session, it will reset the living time of this session. /// public virtual void Activate() { _livingTime = 0; } /// /// Deactive the session, it will increase the living time of this session. /// public virtual void DeActivate() { _livingTime++; } /// ///会诊过程上传截图 /// /// /// /// /// public bool UploadConsultationImages(string consulationId, string imageToken) { try { using (var request = MessagePool.GetMessage()) { request.ConsultationRecordId = consulationId; request.GraphicInfos = new List { new GraphicInfoClientMessage() { GraphicType = 0, GraphicToken = imageToken, PreviewGraphicToken = imageToken, UserId = _accountId, UserName = _currentUserName } }; var result = SendMessage(request); if (result != null) { var resultMessage = ResultMessage.Convert(result); if (resultMessage == CCR.OK) { return true; } } return false; } } catch (Exception e) { Logger.WriteLineError($"UploadConsultationImages Error:{e}"); } return false; } /// ///会诊过程上传截图视频 /// /// /// /// /// public bool UploadConsulationVideos(string consulationId, string videoToken, string previewToken) { try { using (var request = MessagePool.GetMessage()) { request.ConsultationRecordId = consulationId; request.GraphicInfos = new List { new GraphicInfoClientMessage() { GraphicType = 1, GraphicToken = videoToken, PreviewGraphicToken = previewToken, UserId = _accountId, UserName = _currentUserName } }; var result = SendMessage(request); if (result != null) { var resultMessage = ResultMessage.Convert(result); if (resultMessage == CCR.OK) { return true; } } return false; } } catch (Exception e) { Logger.WriteLineError($"UploadConsulationVideos Error:{e}"); } return false; } /// /// 获取会诊报告 /// /// /// /// public NewGetReportsSuccess5 GetConsultationReports(GetConsultationReportsRequest5 request) { try { request.UserId = _accountId; var result = SendMessage(request); if (result != null) { var getRecordsSuccess = NewGetReportsSuccess5.Convert(result); if (getRecordsSuccess != null) { return getRecordsSuccess; } } } catch (Exception ex) { Logger.WriteLineError($"VCloudClient userName:{_currentUserName} GetConsultationReports ex:{ex}"); } return null; } /// /// 保存报告 /// /// /// public string SaveReport(NewAddReportRequest4 request) { try { request.UserId = _accountId; var reportElementValues = request.ReportInfo.ReportElementValues.ToList(); reportElementValues.Add(new ReportElementMessage { ElementTag = new ReportElementTagMessage { Id = "9a7baa61-a91d-4399-a3f4-df29117d2d59", Name = "CreateUserId" }, ElementValue = new ReportTextElementValueMessage { Text = _accountId }, }); request.ReportInfo.ReportElementValues = reportElementValues; Logger.WriteLineInfo($" VCloudClient SaveReport, recordId:{request.TerminalRecordId}, Detail:{JsonConvert.SerializeObject(request)}"); var result = SendMessage(request); if (result != null) { var resultMessage = AddReportSuccess.Convert(result); if (resultMessage != null) { FinishRecordByUserId(request.TerminalRecordId, request.UserId); FinishConsultation(request.TerminalRecordId); return resultMessage.ReportCode; } } } catch (Exception exception) { Logger.WriteLineError($" VCloudClient SaveReport error:{exception}"); } return string.Empty; } private void FinishRecordByUserId(string recordId, string userId) { try { var request = new FinishRecordRequest { TerminalRecordId = recordId, UserId = userId, }; var result = SendMessage(request); } catch (Exception exception) { Logger.WriteLineError($" VCloudClient FinishRecordByUserId error:{exception}"); } } private void FinishConsultation(string recordId) { try { var request = new UpdateAppointmentStateRequest { Id = recordId, State = ConsultationState.ReportUploaded, }; var result = SendMessage(request); } catch (Exception exception) { Logger.WriteLineError($" VCloudClient FinishConsultation error:{exception}"); } } public string UploadFile(byte[] fileData) { var storageInfo = GetStorageInfo(); return UploadHelper.UploadFile(storageInfo, fileData); } private StorageInfo GetStorageInfo() { lock (_storageInfoLocker) { if (_storageInfo == null) { using (var request = MessagePool.GetMessage()) { var result = SendMessage(request); var getDisplayServerInfoResult = GetStorageServerResult2.Convert(result); if (getDisplayServerInfoResult != null) { var url = getDisplayServerInfoResult.ServerUrl; var storageType = getDisplayServerInfoResult.StorageType; var config = getDisplayServerInfoResult.Config; _storageInfo = new StorageInfo() { Url = url, StorageType = storageType, Config = config }; NodeMapping.NodeMappingInilization(_storageInfo.StorageNodeItems); } } } return _storageInfo; } } public byte[] DownloadFile(string fileToken) { var data = new byte[0]; var buffer = DownloadHelper.GetFile(fileToken, _fileCacheFolder, null, null, 0); if (buffer is ByteBuffer byteBuffer) { data = byteBuffer.GetBytes(); } else if (buffer is FileBuffer fileBuffer) { data = fileBuffer.ReadBytes(0, fileBuffer.Size); fileBuffer.DeleteFile(); Logger.WriteLineWarn($" Get file size large than fileName {fileToken} ,it shoud be fileBuffer"); } return data; } private Message SendMessage(Message message) { return _clientManager.Leaf.Send(message, 1000 * 3); } public void Dispose() { _livingTime = 0; if (_clientManager != null) { _clientManager.MessageArrived -= OnMessageArrived; _clientManager.Dispose(); } } } }