123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using Vinno.IUS.Common.Log;
- using Vinno.vCloud.Common.FIS.Helper;
- using Vinno.vCloud.Protocol.Infrastructures;
- using Vinno.vCloud.Protocol.Messages.Client.LiveTalking;
- using WingInterfaceLibrary.Interface;
- using WingInterfaceLibrary.LiveConsultation;
- using WingInterfaceLibrary.Request.Device;
- using WingInterfaceLibrary.Request.User;
- namespace Vinno.vCloud.Common.FIS.Consultation
- {
- internal class ConsultationRecipientV2 : ConsultationClientV2
- {
- private readonly string _deviceId;
- /// <summary>
- /// Raised when receive a Consultation request from server.
- /// </summary>
- public event EventHandler<ConsultationInfo> ConsultationRequestArrived;
- /// <summary>
- /// 当开始Web会诊时
- /// </summary>
- public event EventHandler<string> StartWebConsultationEvent;
- /// <summary>
- /// 当切换病人时触发,病人信息与会诊code变更
- /// </summary>
- public event EventHandler<ChangeLiveConsultationrResult> ChangeLiveConsultationEvent;
- public ConsultationRecipientV2(ConsultationLiveVideoProviderV2 videoProvider, ConsultationManagerV2 consultationManager, string deviceId, ILiveConsultationService liveConsultationService, IUserService userService, IDeviceService deviceService) : base(videoProvider, consultationManager, liveConsultationService, userService, deviceService)
- {
- _deviceId = deviceId;
- }
- /// <summary>
- /// Send a join Rtc Consultation Live request
- /// </summary>
- /// <returns></returns>
- public ResultInfoDTO StartWebConsultation(FlutterLiveConsultationInfo flutterLiveConsultationInfo)
- {
- try
- {
- if (CurrentLiveStatus == LiveStates.RecipientAcceptting || CurrentLiveStatus == LiveStates.RecipientAcceptted)
- {
- Logger.WriteLineInfo($"Consultation Live-- accept Consultation failed due to CurrentLiveStatus is {CurrentLiveStatus}");
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = $"StartWebConsultation Fail,Consultation is busy.",
- ErrorCode = 861,
- };
- }
- if (string.IsNullOrEmpty(flutterLiveConsultationInfo.ConsulationId))
- {
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = $"StartWebConsultation Fail,Consultation id is null.",
- };
- }
- IsSecondViewMode = true;
- ConsultationInfo consultationInfo = new ConsultationInfo(ChatRole.Recipient)
- {
- ConsultationId = flutterLiveConsultationInfo.ConsulationId,
- };
- consultationInfo.PatientInfo = ConsultationManager.FindConsultationDetail(flutterLiveConsultationInfo.ConsulationId, AccountToken, out _);
- lock (ConsultationInfoLocker)
- {
- ConsultationInfo = consultationInfo;
- }
- StartWebConsultationEvent?.Invoke(this, flutterLiveConsultationInfo.LiveConsultationFlutterUrl);
- return new ResultInfoDTO
- {
- IsSuccess = true,
- };
- }
- catch (Exception ex)
- {
- Logger.WriteLineError($"Exception happened when StartWebConsultation {ex}");
- Hangup(true);
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = $"StartWebConsultation Error:{ex}",
- };
- }
- }
- /// <summary>
- /// Send a join Rtc Consultation Live request
- /// </summary>
- /// <returns></returns>
- public ResultInfoDTO StartLiveConsultation(LiveConsultationRequestDTO liveConsultationRequestDTO, string cameraHardwareId, string micHardwareId, string speakerHardwareId)
- {
- try
- {
- if (CurrentLiveStatus == LiveStates.RecipientAcceptting || CurrentLiveStatus == LiveStates.RecipientAcceptted || IsSecondViewMode)
- {
- Logger.WriteLineInfo($"Consultation Live-- accept Consultation failed due to CurrentLiveStatus is {CurrentLiveStatus},IsSecondViewMode:{IsSecondViewMode}");
- if (liveConsultationRequestDTO.IsInvite)
- {
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = $"AcceptConsultation Fail,Consultation is busy.",
- ErrorCode = 852,
- };
- }
- else
- {
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = $"AcceptConsultation Fail,Consultation is busy.",
- ErrorCode = 861,
- };
- }
- }
- if (string.IsNullOrEmpty(AccountId))
- {
- CurrentLiveStatus = LiveStates.UnknowException;
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = $"AcceptConsultation Fail,AccountId is Null.",
- };
- }
- string deviceId = null;
- CurrentLiveStatus = LiveStates.RecipientAcceptting;
- Logger.WriteLineInfo($"Consultation Live-- {AccountName} start Consultation request begin");
- ConsultationInfo consultationInfo;
- if (liveConsultationRequestDTO.IsInvite)
- {
- var initiateLiveConsultationRequest = new InitiateLiveConsultationRequest
- {
- ConsultationCode = liveConsultationRequestDTO.ConsultationCode,
- Token = AccountToken,
- CheckOnly = false,
- };
- var initiateLiveConsultationResult = JsonRpcHelper.InitiateLiveConsultation(LiveConsultationService, initiateLiveConsultationRequest, out var errorCode);
- if (initiateLiveConsultationResult == null)
- {
- CurrentLiveStatus = LiveStates.UnknowException;
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = $"Initiate Consultation Fail,result is null",
- ErrorCode = errorCode
- };
- }
- consultationInfo = DTOConverter.ConvertInitiateLiveConsultationResultToConsultationInfo(initiateLiveConsultationResult);
- consultationInfo.PatientInfo = ConsultationManager.FindConsultationDetail(liveConsultationRequestDTO.ConsultationCode, AccountToken, out deviceId);
- }
- else if (liveConsultationRequestDTO.IsJoin)
- {
- var joinLiveConsultationRequest = new JoinLiveConsultationRequest
- {
- ConsultationCode = liveConsultationRequestDTO.ConsultationCode,
- Token = AccountToken,
- CheckOnly = false,
- };
- var joinLiveConsultationResult = JsonRpcHelper.JoinInLiveConsultation(LiveConsultationService, joinLiveConsultationRequest, out var errorCode);
- if (joinLiveConsultationResult == null)
- {
- CurrentLiveStatus = LiveStates.UnknowException;
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = $"Join Consultation Fail,result is null",
- ErrorCode = errorCode
- };
- }
- consultationInfo = DTOConverter.ConvertJoinLiveConsultationResultToConsultationInfo(joinLiveConsultationResult);
- consultationInfo.PatientInfo = ConsultationManager.FindConsultationDetail(liveConsultationRequestDTO.ConsultationCode, AccountToken, out deviceId); ;
- }
- else
- {
- var acceptLiveConsultationRequest = new AcceptLiveConsultationRequest
- {
- CheckOnly = false,
- ConsultationCode = liveConsultationRequestDTO.ConsultationCode,
- Token = liveConsultationRequestDTO.Token,
- };
- var acceptLiveConsultationResult = JsonRpcHelper.AcceptLiveConsultation(LiveConsultationService, acceptLiveConsultationRequest, out var errorCode);
- if (acceptLiveConsultationResult == null)
- {
- CurrentLiveStatus = LiveStates.UnknowException;
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = $"AcceptConsultation Fail,result is null",
- ErrorCode = errorCode
- };
- }
- consultationInfo = DTOConverter.ConvertAcceptLiveConsultationResultToConsultationInfo(acceptLiveConsultationResult);
- consultationInfo.PatientInfo = ConsultationManager.FindConsultationDetail(liveConsultationRequestDTO.ConsultationCode, AccountToken, out deviceId);
- }
- if (consultationInfo.TerminalInfo != null && !string.IsNullOrEmpty(deviceId))
- {
- var getDeviceRequest = new GetDeviceRequest
- {
- DeviceCode = deviceId,
- Token = AccountToken,
- };
- var deviceModel = JsonRpcHelper.GetDeviceInfo(DeviceService, getDeviceRequest);
- consultationInfo.TerminalInfo.Model = deviceModel?.DeviceModel;
- }
- lock (ConsultationInfoLocker)
- {
- ConsultationInfo = consultationInfo;
- }
- StartConsultation(cameraHardwareId, micHardwareId, speakerHardwareId, false);
- CurrentLiveStatus = LiveStates.RecipientAcceptted;
- Logger.WriteLineInfo($"Consultation Live-- {AccountName} accept meeConsultationting request end");
- ConsultationRequestArrived?.Invoke(this, ConsultationInfo);
- return new ResultInfoDTO
- {
- IsSuccess = true,
- };
- }
- catch (Exception ex)
- {
- Logger.WriteLineError($"Exception happened when accept Consultation{ex}");
- Hangup();
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = $"AcceptConsultation Error:{ex}",
- };
- }
- }
- /// <summary>
- /// Send a join Rtc Consultation Live request
- /// </summary>
- /// <returns></returns>
- public ResultInfoDTO StartLiveConsultation(StartOnlyForRtmpPushingDTO startOnlyForRtmpPushingDTO, string cameraHardwareId, string micHardwareId)
- {
- try
- {
- if (CurrentLiveStatus == LiveStates.RecipientAcceptting || CurrentLiveStatus == LiveStates.RecipientAcceptted)
- {
- Logger.WriteLineInfo($"Consultation Live-- accept Consultation failed due to CurrentLiveStatus is {CurrentLiveStatus}");
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = $"AcceptConsultation Fail,Consultation is busy.",
- ErrorCode = 861,
- };
- }
- if (string.IsNullOrEmpty(AccountId))
- {
- CurrentLiveStatus = LiveStates.UnknowException;
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = $"AcceptConsultation Fail,AccountId is Null.",
- };
- }
- CurrentLiveStatus = LiveStates.RecipientAcceptting;
- Logger.WriteLineInfo($"Consultation Live-- {AccountName} start Consultation request begin");
- ConsultationInfo consultationInfo;
- consultationInfo = new ConsultationInfo(ChatRole.Recipient)
- {
- ConsultationId = startOnlyForRtmpPushingDTO.ConsultationCode,
- State = LiveStates.OK,
- LiveProtocol = LiveProtocol.Rtmp,
- LiveTalkingMode = LiveTalkingMode.Video,
- IsCurrentTerminal = false,
- ConsultationMemberInfos = new List<ConsultationMemberInfo>
- {
- new ConsultationMemberInfo
- {
- PushLiveState = LiveStates.OK,
- PushUrl = startOnlyForRtmpPushingDTO.RtmpPushingUrl,
- Id = AccountId,
- Name = AccountName,
- DisplayName = AccountName,
- },
- },
- };
- consultationInfo.PatientInfo = ConsultationManager.FindConsultationDetail(startOnlyForRtmpPushingDTO.ConsultationCode, AccountToken, out _);
- lock (ConsultationInfoLocker)
- {
- ConsultationInfo = consultationInfo;
- }
- StartConsultation(cameraHardwareId, micHardwareId, null, true);
- IsOnlyForRtmpPushing = true;
- CurrentLiveStatus = LiveStates.RecipientAcceptted;
- Logger.WriteLineInfo($"Consultation Live-- {AccountName} accept only rtmp pushing end");
- return new ResultInfoDTO
- {
- IsSuccess = true,
- };
- }
- catch (Exception ex)
- {
- Logger.WriteLineError($"Exception happened when only rtmp pushing:{ex}");
- Hangup();
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = $"AcceptConsultation Error:{ex}",
- };
- }
- }
- internal ResultInfoDTO ChangeLiveConsultation(ChangeLiveConsultationRequestDTO changeLiveConsultation0RequestDTO)
- {
- try
- {
- if (ConsultationInfo == null)
- {
- Logger.WriteLineWarn($"ChangeLiveConsultation Fail: Current is not Consultating");
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = "ChangeLiveConsultation Fail: Current is not Consultating"
- };
- }
- ConsultationInfo.ConsultationId = changeLiveConsultation0RequestDTO.ConsultationCode;
- var patientInfo = ConsultationManager.FindConsultationDetail(changeLiveConsultation0RequestDTO.ConsultationCode, AccountToken, out _);
- lock (ConsultationInfoLocker)
- {
- ConsultationInfo.PatientInfo = patientInfo;
- }
- if (IsSecondViewMode && !IsOnlyForRtmpPushing)//第二屏且不是rtmp推流的情况下
- {
- return new ResultInfoDTO
- {
- IsSuccess = true,
- };
- }
- VideoProvider.ChangeConsultationCodeForConsultationConnectionKeeper(changeLiveConsultation0RequestDTO.ConsultationCode);
- if (IsOnlyForRtmpPushing)
- {
- return new ResultInfoDTO
- {
- IsSuccess = true,
- };
- }
- ChangeLiveConsultationEvent?.Invoke(this, new ChangeLiveConsultationrResult(changeLiveConsultation0RequestDTO.ConsultationCode, ConsultationInfo.PatientInfo));
- var currentConsultationMembers = ConsultationInfo?.ConsultationMemberInfos?.ToList();
- var leaveMemberList = currentConsultationMembers.Where(x => !changeLiveConsultation0RequestDTO.Members.Any(y => y.Id == x.Id));
- if (leaveMemberList != null)
- {
- foreach (var member in leaveMemberList)
- {
- member.OperationType = ClientMessageOperationType.Delete;
- var consultationMemberChangeDTO = new ConsultationMemberChangeDTO()
- {
- ConsultationCode = changeLiveConsultation0RequestDTO.ConsultationCode,
- MemberInfo = member
- };
- ConsultationMemberChange(consultationMemberChangeDTO);
- var memberInfo = ConsultationInfo?.ConsultationMemberInfos.FirstOrDefault(f => f.Id == consultationMemberChangeDTO.MemberInfo.Id);
- if (memberInfo != null)
- {
- memberInfo.OperationType = ClientMessageOperationType.Delete;
- ConsultationInfo?.ConsultationMemberInfos.Remove(memberInfo);
- }
- var meetingChangeMember = DTOConverter.ConvertConsultationMemberChangeDTOToConsultationMemberNotificaiton(consultationMemberChangeDTO);
- HandleConsultationMemberNotificationArrived(meetingChangeMember);
- }
- }
- currentConsultationMembers = ConsultationInfo?.ConsultationMemberInfos?.ToList();
- var addMemberList = changeLiveConsultation0RequestDTO.Members.Where(x => !currentConsultationMembers.Any(y => y.Id == x.Id));
- if (addMemberList != null)
- {
- foreach (var member in addMemberList)
- {
- member.OperationType = ClientMessageOperationType.Add;
- var consultationMemberChangeDTO = new ConsultationMemberChangeDTO()
- {
- ConsultationCode = changeLiveConsultation0RequestDTO.ConsultationCode,
- MemberInfo = member
- };
- ConsultationMemberChange(consultationMemberChangeDTO);
- var memberInfo = ConsultationInfo?.ConsultationMemberInfos.FirstOrDefault(f => f.Id == consultationMemberChangeDTO.MemberInfo.Id);
- if (memberInfo == null)
- {
- ConsultationInfo?.ConsultationMemberInfos.Add(member);
- }
- var meetingChangeMember = DTOConverter.ConvertConsultationMemberChangeDTOToConsultationMemberNotificaiton(consultationMemberChangeDTO);
- HandleConsultationMemberNotificationArrived(meetingChangeMember);
- }
- }
- return new ResultInfoDTO
- {
- IsSuccess = true,
- };
- }
- catch (Exception ex)
- {
- Logger.WriteLineWarn($"ChangeLiveConsultation error: {ex}");
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = $"ChangeLiveConsultation Fail: {ex}"
- };
- }
- }
- public string GetUserInfo(string token)
- {
- AccountToken = token;
- var getUserRequest = new GetUserInfoRequest
- {
- Token = token,
- };
- var userDTO = JsonRpcHelper.GetUserInfo(UserService, getUserRequest);
- if (userDTO == null)
- {
- AccountName = null;
- AccountId = null;
- Logger.WriteLineError($"GetUserInfo Error,result is null");
- return null;
- }
- else
- {
- AccountName = userDTO.DisplayName;
- AccountId = userDTO.UserCode;
- return AccountId;
- }
- }
- public override void Dispose()
- {
- Logger.WriteLineInfo("Consultation Recipient is dispose begin");
- base.Dispose();
- Logger.WriteLineInfo("Consultation Recipient is dispose end");
- }
- internal ResultInfoDTO LiveConsultationMemberChanged(ConsultationMemberChangeDTO consultationMemberChangeDTO)
- {
- if (ConsultationInfo == null)
- {
- Logger.WriteLineWarn($"LiveConsultationMemberChanged Fail: Current is not Consultating");
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = "LiveConsultationMemberChanged Fail: Current is not Consultating"
- };
- }
- if (ConsultationInfo.ConsultationId != consultationMemberChangeDTO.ConsultationCode)
- {
- Logger.WriteLineWarn($"LiveConsultationMemberChanged Fail: Current ConsultationCode is {ConsultationInfo.ConsultationId},not {consultationMemberChangeDTO.ConsultationCode}");
- return new ResultInfoDTO
- {
- IsSuccess = false,
- FailMessage = $"LiveConsultationMemberChanged Fail: Current ConsultationCode is {ConsultationInfo.ConsultationId},not {consultationMemberChangeDTO.ConsultationCode}"
- };
- }
- ConsultationMemberChange(consultationMemberChangeDTO);
- var memberInfo = ConsultationInfo?.ConsultationMemberInfos.FirstOrDefault(f => f.Id == consultationMemberChangeDTO.MemberInfo.Id);
- if (consultationMemberChangeDTO.MemberInfo.OperationType == ClientMessageOperationType.Add)
- {
- if (memberInfo == null)
- {
- ConsultationInfo.ConsultationMemberInfos.Add(consultationMemberChangeDTO.MemberInfo);
- }
- memberInfo = consultationMemberChangeDTO.MemberInfo;
- }
- else if (consultationMemberChangeDTO.MemberInfo.OperationType == ClientMessageOperationType.Delete)
- {
- if (memberInfo != null)
- {
- ConsultationInfo?.ConsultationMemberInfos.Remove(memberInfo);
- }
- }
- if (memberInfo != null)
- {
- consultationMemberChangeDTO.MemberInfo.RoleType = memberInfo.RoleType;
- }
- var meetingChangeMember = DTOConverter.ConvertConsultationMemberChangeDTOToConsultationMemberNotificaiton(consultationMemberChangeDTO);
- HandleConsultationMemberNotificationArrived(meetingChangeMember);
- return new ResultInfoDTO
- {
- IsSuccess = true,
- };
- }
- }
- }
|