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();
}
}
}
}