123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445 |
- using System.Data.Common;
- using WingInterfaceLibrary.Interface;
- using WingInterfaceLibrary.Request;
- using WingInterfaceLibrary.Enum;
- using WingInterfaceLibrary.Request.Notification;
- using WingInterfaceLibrary.Enum.NotificationEnum;
- using WingServerCommon.Service;
- using WingInterfaceLibrary.LiveConsultation;
- using WingInterfaceLibrary.Interface.DBInterface;
- using WingServerCommon.Interfaces.Cache;
- using WingInterfaceLibrary.DB.Request;
- using WingInterfaceLibrary.Request.DBRequest;
- using WingInterfaceLibrary.LiveConsultation.Consultation;
- using WingServerCommon.Log;
- using WingInterfaceLibrary.DTO.LiveRoom;
- using WingServerCommon.Config;
- using WingServerCommon.Config.Parameters;
- using WingInterfaceLibrary.Rtc;
- using WingServerCommon.Utilities;
- using WingInterfaceLibrary.Request.Lock;
- using WingInterfaceLibrary.DTO.Consultation;
- using WingInterfaceLibrary.Internal.Request;
- using WingInterfaceLibrary.Internal.Interface;
- using WingInterfaceLibrary.Request.Authentication;
- using WingInterfaceLibrary.Notifications;
- using WingInterfaceLibrary.DTO.User;
- using WingInterfaceLibrary.Request.User;
- using WingServerCommon.Mapper;
- using System.Collections.Concurrent;
- using WingInterfaceLibrary.Notifications.Live;
- using WingInterfaceLibrary.Request.Remote;
- using WingInterfaceLibrary.Request.Device;
- using WingInterfaceLibrary.DTO.RemoteParameters;
- using WingInterfaceLibrary.Request.DBCopy;
- using System;
- using WingInterfaceLibrary.Result.QualityControl;
- using WingInterfaceLibrary.Request.QualityControl;
- using Newtonsoft.Json.Linq;
- using JsonRpcLite.Services;
- namespace WingLiveConsultationService
- {
- public partial class LiveConsultationService : JsonRpcService, ILiveConsultationService
- {
- private ConcurrentDictionary<string, IList<AdditionParameterDTO>> _controllingParameterLiveConsultations = new ConcurrentDictionary<string, IList<AdditionParameterDTO>>();
- private readonly string _serverHost;
- private int _connectionTimeout => EnvironmentConfigManager.GetParammeter<IntParameter>("LiveConsultation", "ConnectionTimeout").Value;
- private IAuthenticationService _authenticationService;
- private INotificationService _notificationService;
- private IUserDBService _userDBService;
- private IOrganizationDBService _organizationDBService;
- private IConsultationRecordDBService _consultationRecordDBService;
- private IRemedicalDBService _remedicalDBService;
- private IRemedicalMeasuredInfoDBService _remedicalMeasuredInfoDBService;
- private IPatientInfoDBService _patientInfoDBService;
- private ILiveRoomDBService _liveRoomDBService;
- private IDeviceInfoDBService _deviceDBService;
- private IDeviceService _deviceService;
- private IPatientService _patientService;
- private IWingRtcService _wingRtcService;
- private IRtcService _rtcService;
- private IMasterInteractionCenterService _masterInteractionCenterService;
- private LiveConsultationHeartRateManager _liveConsultationHeartRateManager;
- private IRoleService _roleService;
- private string _serverID;
- private LockManager _lockManager;
- private ILockService _lockService;
- private IReportDBService _reportDBService;
- private IDeviceForwardService _deviceForwardService;
- private static object _objLocker = new object();
- private string _reminderSmsTemplateId => EnvironmentConfigManager.GetParammeter<StringParameter>("LiveConsultation", "ReminderSmsTemplateId").Value; //短信提醒模板Id
- private string _inviteSmsTemplateId => EnvironmentConfigManager.GetParammeter<StringParameter>("LiveConsultation", "InviteSmsTemplateId").Value; //短信邀请会诊模板Id
- private string _submitSmsTemplateId => EnvironmentConfigManager.GetParammeter<StringParameter>("LiveConsultation", "SubmitSmsTemplateId").Value; //短信提交会诊模板Id
- private int _emergencyTimeout => EnvironmentConfigManager.GetParammeter<IntParameter>("LiveConsultation", "EmergencyTimeout").Value;
- private ISMSService _smsService;
- private int _downloadOriginalLowestValue = 1048576;
- private System.Timers.Timer _timer;
- //任务周期
- private int _dutyCycle = 60 * 60 * 1000;//1 hours
- public LiveConsultationService()
- {
- _serverHost = ConfigurationManager.Host;
- _serverID = ConfigurationManager.GetParammeter<StringParameter>("General", "ServerID").Value;
- _liveConsultationHeartRateManager = new LiveConsultationHeartRateManager(HandleClientJoined, HandleClientNetworkErr, HandleClientLeave);
- _timer = new System.Timers.Timer();
- _timer.Elapsed += new System.Timers.ElapsedEventHandler(Verify_Elapsed);
- _timer.Interval = _dutyCycle;
- _timer.Enabled = true;
- }
- /// <summary>
- /// Init service
- /// </summary>
- public override void Load(JsonRpcClientPool jsonRpcClientPool)
- {
- base.Load(jsonRpcClientPool);
- _authenticationService = GetProxy<IAuthenticationService>();
- _notificationService = GetProxy<INotificationService>();
- _userDBService = GetProxy<IUserDBService>();
- _organizationDBService = GetProxy<IOrganizationDBService>();
- _consultationRecordDBService = GetProxy<IConsultationRecordDBService>();
- _remedicalDBService = GetProxy<IRemedicalDBService>();
- _remedicalMeasuredInfoDBService = GetProxy<IRemedicalMeasuredInfoDBService>();
- _patientInfoDBService = GetProxy<IPatientInfoDBService>();
- _liveRoomDBService = GetProxy<ILiveRoomDBService>();
- _deviceDBService = GetProxy<IDeviceInfoDBService>();
- _patientService = GetProxy<IPatientService>();
- _wingRtcService = GetProxy<IWingRtcService>();
- _rtcService = GetProxy<IRtcService>();
- _smsService = GetProxy<ISMSService>();
- _masterInteractionCenterService = GetProxy<IMasterInteractionCenterService>();
- _roleService = GetProxy<IRoleService>();
- _reportDBService = GetProxy<IReportDBService>();
- _deviceService = GetProxy<IDeviceService>();
- LiveConsultationRoom.OnOpenNotifyQueue = OpenNotifyQueue;
- LiveConsultationRoom.OnBroadcastMessage = BroadcastMessage;
- LiveConsultationRoom.OnRtcGenerateRoomUrl = RtcGenerateRoomUrl;
- LiveConsultationRoom.OnGetUserSign = GetUserSign;
- _lockService = GetProxy<ILockService>();
- var inProcessServiceSettings = ConfigurationManager.GetParammeter<StringParameter>("Services", "InProcess").Value;
- var remoteServiceSettings = ConfigurationManager.GetParammeter<StringParameter>("Services", "Remote").Value;
- if (!inProcessServiceSettings.Contains("LockService") && !remoteServiceSettings.Contains("LockService"))
- {
- _lockManager = new LockManager();
- }
- else
- {
- _lockManager = new LockManager(ApplyLock, ReleaseLock);
- }
- _timer.Start();
- }
- /// <summary>
- /// 自定义定时任务
- /// </summary>
- /// <param name="clientIdList">用户code列表</param>
- /// <param name="sendNoticeFunc">发送通知委托</param>
- /// <returns>是否成功</returns>
- private async void Verify_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- try
- {
- if (!ConfigurationManager.IsDistributed || ConfigurationManager.IsMaster)
- {
- var toStartConsultationRecords = await _consultationRecordDBService.FindToStartConsultationRecordListAsync();
- var needUpdateRecordCodes = new List<string>();
- foreach (var record in toStartConsultationRecords)
- {
- if (record.ConsultationTimeEnd.Date < DateTime.UtcNow.Date.AddMonths(-1))
- {
- await _consultationRecordDBService.UpdateConsultationStatusAsync(record.ConsultationCode, TransactionStatusEnum.Expired);
- }
- }
- }
- }
- catch (Exception ex)
- {
- Logger.WriteLineError($"Dispatch VerifyPasswordExpire Error:{ex}");
- }
- }
- public override async void LoadAfterRegister()
- {
- try
- {
- _deviceForwardService = GetProxy<IDeviceForwardService>();
- if (!ConfigurationManager.IsDistributed || ConfigurationManager.IsMaster)
- {
- var inProcessRecords = await _consultationRecordDBService.GetConsultationRecordsByStatusAsync(new GetConsultationRecordsByStatusDBRequest
- {
- Status = TransactionStatusEnum.InProgress
- });
- if (inProcessRecords?.Any() == true)
- {
- foreach (var record in inProcessRecords)
- {
- //修改预约记录状态
- await _consultationRecordDBService.UpdateConsultationStatusAsync(record.ConsultationCode, TransactionStatusEnum.ToStart);
- }
- }
- StartCheckConsultationState(30000);
- }
- }
- catch (Exception ex)
- {
- Logger.WriteLineWarn($"LiveConsultationService LoadAfterRegister err, {ex}");
- }
- }
- private string OpenNotifyQueue(string roomId)
- {
- var openNotifyQueueRequest = new OpenNotifyQueueRequest { Module = roomId };
- var msgQueueId = _notificationService.OpenNotifyQueueAsync(openNotifyQueueRequest).Result;
- return msgQueueId;
- }
- private bool BroadcastMessage(BroadcastNotificationRequest notificationRequest)
- {
- return _notificationService.BroadcastMessageAsync(notificationRequest).Result;
- }
- private GenerateRoomUrlResult RtcGenerateRoomUrl(int integerRoomId, string uniqueId)
- {
- var agenerateRoomUrlRequest = new GenerateRoomUrlRequest
- {
- RoomId = (uint)integerRoomId,
- UniqueId = uniqueId,
- };
- var agenerateRoomUrlResult = _wingRtcService.GenerateRoomUrlAsync(agenerateRoomUrlRequest).Result;
- return agenerateRoomUrlResult;
- }
- private bool ApplyLock(string lockKey)
- {
- try
- {
- var result = _lockService.ApplyLockAsync(new ApplyLockRequest
- {
- LockKey = lockKey
- }).Result;
- return result.IsSuccess;
- }
- catch (Exception ex)
- {
- Logger.WriteLineWarn($"LiveConsultationService ApplyLock err, lock key:{lockKey}, ex:{ex}");
- return false;
- }
- }
- private bool ReleaseLock(string lockUniqueCode)
- {
- try
- {
- var result = _lockService.ReleaseLockAsync(new ReleaseLockRequest
- {
- LockUniqueCode = lockUniqueCode
- }).Result;
- return result.IsSuccess;
- }
- catch (Exception ex)
- {
- Logger.WriteLineWarn($"LiveConsultationService ReleaseLock err, release key:{lockUniqueCode}, ex:{ex}");
- return false;
- }
- }
- private string GetUserSign(string userCode)
- {
- var request = new GetUserSignRequest { UserId = userCode };
- var result = _wingRtcService.GetUserSignAsync(request).Result;
- return result.UserSign;
- }
- /// <summary>
- /// Dispatch message function
- /// </summary>
- public static Action<IList<RemoteNotifyTarget>, NotificationTypeEnum> DispatchMessage;
- /// <summary>
- /// Push message function
- /// </summary>
- public static Action<IList<string>, NotificationTypeEnum> PushMessage;
- /// <summary>
- /// Initiate a diagnosis meeting
- /// </summary>
- /// <param name="request">The request</param>
- /// <returns></returns>
- public async Task<InitiateLiveConsultationResult> InitiateLiveConsultationAsync(InitiateLiveConsultationRequest request)
- {
- var tokenInfo = await _authenticationService.GetTokenAsync(request);
- var initiatorCode = tokenInfo.ClientId;
- var initiator = await _userDBService.FindUserByCodeAsync(initiatorCode);
- var roomId = request.ConsultationCode;
- var consultationRecord = CacheMaintenance.Instance.Get<IConsultationRecordManager>().Get(roomId);
- if (consultationRecord == null)
- {
- Logger.WriteLineWarn($"LiveConsultationService initiate live consultation failed, consultation not existed, roomId:{roomId}");
- ThrowRpcException(CustomerRpcCode.ConsultationNotExisted, "Consultation not existed");
- }
- if (!consultationRecord.IsEmergency && string.IsNullOrWhiteSpace(consultationRecord.ExpertUserCode))
- {
- Logger.WriteLineWarn($"LiveConsultationService initiate live consultation failed, expert is empty, roomId:{roomId}");
- ThrowRpcException(CustomerRpcCode.ConsultationExpertIsEmpty, "Consultation Expert IsEmpty");
- }
- if (consultationRecord.ConsultationStatus == (int)TransactionStatusEnum.Applied
- || consultationRecord.ConsultationStatus == (int)TransactionStatusEnum.Withdrawn
- || consultationRecord.ConsultationStatus == (int)TransactionStatusEnum.Rejected)
- {
- Logger.WriteLineWarn($"LiveConsultationService reservation record not reviewed, current status:{consultationRecord.ConsultationStatus}, roomId:{roomId}");
- ThrowRpcException(CustomerRpcCode.ReservationNotReviewed, "Reservation record not reviewed");
- }
- if (consultationRecord.ConsultationStatus == (int)TransactionStatusEnum.InProgress)
- {
- Logger.WriteLineWarn($"LiveConsultationService consultation in process, current status:{consultationRecord.ConsultationStatus}, roomId:{roomId}");
- ThrowRpcException(CustomerRpcCode.ConsultationInProcess, "Consultation In Process");
- }
- var emergencyDoctors = new List<UserDTO>();
- if (consultationRecord.IsEmergency && string.IsNullOrWhiteSpace(consultationRecord.ExpertUserCode))
- {
- emergencyDoctors = await GetEmergencyDoctorsAsync(initiator.RootOrganizationCode);
- if (!emergencyDoctors.Any())
- {
- Logger.WriteLineWarn($"LiveConsultationService emergency doctors is empty, current status:{consultationRecord.ConsultationStatus}, roomId:{roomId}");
- ThrowRpcException(CustomerRpcCode.EmergencyDoctorsIsEmpty, "Emergency Doctors Is Empty");
- }
- }
- using (await _lockManager.Acquire(roomId))
- {
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- var freshRoom = false;
- if (room == null)
- {
- freshRoom = true;
- }
- else if (!string.IsNullOrWhiteSpace(consultationRecord.ExpertUserCode) && !consultationRecord.IsEmergency)
- {
- var expertDTO = await _userDBService.FindUserByCodeAsync(consultationRecord.ExpertUserCode);
- var assistantDoctorUserCode = expertDTO?.BindAssistantDoctorUserCode;
- if (!string.IsNullOrWhiteSpace(assistantDoctorUserCode) && (room.UserInfos == null || !room.UserInfos.Any(x => x.Code == assistantDoctorUserCode)))
- {
- freshRoom = true;
- }
- }
- if (freshRoom)
- {
- room = await CreateLiveRoomAsync(roomId);
- room = await _rtcService.AddOrUpdateLiveRoomAsync(new AddOrUpdateLiveRoomRequest
- {
- LiveRoom = room
- });
- Logger.WriteLineInfo($"LiveConsultationService InitiateLiveConsultationAsync CreateLiveRoom, data:{Newtonsoft.Json.JsonConvert.SerializeObject(room)}");
- }
- if (room == null)
- {
- Logger.WriteLineWarn($"LiveConsultationService save to db failed, roomId:{roomId}");
- ThrowRpcException(CustomerRpcCode.ConsultationDBError, "Consultation DB error");
- }
- var members = await _rtcService.GetLiveMemberInfosAsync(new GetLiveMemberInfosRequest { LiveRoomCode = roomId });
- // //状态验证
- var applyer = members.FirstOrDefault(x => x.Id == consultationRecord.ApplyUserCode);
- if (applyer == null || !applyer.IsOnline)
- {
- Logger.WriteLineWarn($"LiveConsultationService initiate live consultation failed, applyer not online, roomId:{roomId}");
- ThrowRpcException(CustomerRpcCode.ApplyerNotOnline, "Consultation applyer not online");
- }
- else if (applyer.IsBusy)
- {
- Logger.WriteLineWarn($"LiveConsultationService initiate live consultation failed, applyer is busy, roomId:{roomId}");
- ThrowRpcException(CustomerRpcCode.ApplyerIsBusy, "Applyer Is Busy");
- }
- if (!string.IsNullOrWhiteSpace(consultationRecord.ExpertUserCode) && consultationRecord.IsEmergency)
- {
- var expert = members.FirstOrDefault(x => x.Id == consultationRecord.ExpertUserCode);
- if (expert == null || !expert.IsOnline)
- {
- Logger.WriteLineWarn($"LiveConsultationService initiate live consultation failed, expert not online, roomId:{roomId}");
- ThrowRpcException(CustomerRpcCode.ExpertNotOnline, "Consultation expert not online");
- }
- else if (expert.IsBusy)
- {
- Logger.WriteLineWarn($"LiveConsultationService initiate live consultation failed, expert is busy, roomId:{roomId}");
- ThrowRpcException(CustomerRpcCode.ExpertIsBusy, "Expert Is Busy");
- }
- }
- //设备是否被占用
- var deviceLiveRoom = await _rtcService.GetInitiatingRoomByDeviceCodeAsync(new GetInitiatingRoomByDeviceCodeRequest()
- {
- DeviceCode = consultationRecord.DeviceCode,
- });
- if (deviceLiveRoom != null && deviceLiveRoom.BusinessModule == BusinessModuleEnum.LivingConsultation)
- {
- ThrowRpcException(CustomerRpcCode.DeviceInOtherConsultation, "Device In Other Consultation");
- }
- if (request.CheckOnly)
- {
- return new InitiateLiveConsultationResult { ConsultationCode = roomId };
- }
- //修改预约记录状态
- await _consultationRecordDBService.UpdateConsultationStatusAsync(roomId, TransactionStatusEnum.InProgress);
- room = await _rtcService.InitiateAsync(new InitiateRequest
- {
- LiveRoomCode = roomId,
- InitiatorCode = initiatorCode,
- LoginSource = tokenInfo.LoginSource,
- });
- members = await _rtcService.GetLiveMemberInfosAsync(new GetLiveMemberInfosRequest { LiveRoomCode = roomId });
- if (consultationRecord.IsEmergency)
- {
- if (string.IsNullOrWhiteSpace(consultationRecord.ExpertUserCode))
- {
- //呼叫急诊医生
- CallEmergencyDoctors(roomId, emergencyDoctors, room.RtcRoomId, members.FirstOrDefault(x => x.Id == initiatorCode));
- }
- else
- {
- StartCheckEmergencyDoctorTimeout(roomId, initiatorCode, consultationRecord.ExpertUserCode);
- }
- }
- var userSignRequest = new GetUserSignRequest
- {
- UserId = initiatorCode
- };
- var userSignResult = await _wingRtcService.GetUserSignAsync(userSignRequest);
- var result = new InitiateLiveConsultationResult
- {
- ConsultationCode = roomId,
- RoomNo = room.RtcRoomId,
- LiveProtocol = EnvironmentConfigs.General.LiveProtocolDetail<TransactionStatusEnum>(),
- InitiatorCode = initiatorCode,
- AppId = room.SdkAppId,
- UserSign = userSignResult.UserSign,
- MemberLiveDatas = members,
- };
- Logger.WriteLineInfo($"LiveConsultationService InitiateLiveConsultationAsync roomId:{roomId}, rtcRoomId:{room.RtcRoomId}, members:{string.Join(";", members.Select(m => $"{m.Name},sortLevel:{m.SortLevel},sortNumber:{m.SortNumber}"))}");
- return result;
- }
- }
- private async Task<LiveRoomDTO> CreateLiveRoomAsync(string roomId)
- {
- var consultationRequest = new ConsultationRecordCodeDBRequest { Code = roomId };
- var consultationRecord = await _consultationRecordDBService.FindConsultationRecordByCodeAsync(consultationRequest);
- if (consultationRecord != null && !string.IsNullOrWhiteSpace(consultationRecord.ConsultationCode))
- {
- //申请人、专家、设备、其它参与人
- var userCodes = new List<string>();
- var expertUserCode = consultationRecord.ExpertUserCode;
- if (!string.IsNullOrWhiteSpace(expertUserCode))
- {
- userCodes.Add(expertUserCode);
- }
- var applyUserCode = consultationRecord.ApplyUserCode;
- if (!string.IsNullOrWhiteSpace(applyUserCode))
- {
- userCodes.Add(applyUserCode);
- }
- if (consultationRecord.ConsultationMembers != null && consultationRecord.ConsultationMembers.Any(x => x.MemberStatus == LiveConsultationMemberStatus.Accepted))
- {
- var codes = consultationRecord.ConsultationMembers.Where(x => x.MemberStatus == LiveConsultationMemberStatus.Accepted).Select(c => c.MemberCode).Distinct().ToList();
- userCodes.AddRange(codes);
- }
- //发起人
- var initiatorCode = consultationRecord.InitiatorCode;
- if (!string.IsNullOrWhiteSpace(initiatorCode) && !userCodes.Contains(initiatorCode))
- {
- userCodes.Add(initiatorCode);
- }
- var expertUser = await _userDBService.FindUserByCodeAsync(consultationRecord.ExpertUserCode);
- //专家 助理医师
- var assistantDoctorCode = expertUser?.BindAssistantDoctorUserCode ?? string.Empty;
- if (consultationRecord.IsEmergency)
- {
- userCodes.Remove(assistantDoctorCode);
- }
- else if (!string.IsNullOrWhiteSpace(assistantDoctorCode) && !userCodes.Contains(assistantDoctorCode))
- {
- userCodes.Add(assistantDoctorCode);
- }
- var users = await _userDBService.FindUserListByUserCodesAsync(userCodes);
- var deviceCode = consultationRecord.DeviceCode;
- var deviceInfo = CacheMaintenance.Instance.Get<IDeviceInfosManager>().Get(deviceCode);
- if (deviceInfo == null)
- {
- ThrowRpcException(CustomerRpcCode.DeviceNotExist, "Not find device");
- }
- //生成会诊用户/设备信息
- var tokenManager = CacheMaintenance.Instance.Get<ITokensManager>();
- var liveMembers = new List<LiveMemberDTO>();
- foreach (var user in users)
- {
- var userCode = user.UserCode;
- var isInitiator = userCode == initiatorCode;
- var userName = user.DisplayName;
- var consultationRole = LiveConsultationRoleEnum.OtherParticipant;
- if (userCode == consultationRecord.ExpertUserCode)
- {
- consultationRole = LiveConsultationRoleEnum.Expert;
- }
- else if (userCode == consultationRecord.ApplyUserCode)
- {
- consultationRole = LiveConsultationRoleEnum.General;
- }
- else if (userCode == assistantDoctorCode)
- {
- consultationRole = LiveConsultationRoleEnum.AssistantDoctor;
- }
- var liveMember = new LiveMemberDTO
- {
- Code = userCode,
- Name = userName,
- MemberType = LiveMemberEnum.User,
- HeadImageToken = user.HeadImageUrl,
- Status = LiveMemberStatus.Default,
- MuteOpened = false,
- VideoOpened = true,
- SortLevel = (int)consultationRole,
- };
- liveMembers.Add(liveMember);
- }
- var deviceName = deviceInfo.DisplayName;
- var deviceLiveInfo = new LiveMemberDTO
- {
- Code = deviceCode,
- Name = deviceName,
- MemberType = LiveMemberEnum.Device,
- HeadImageToken = deviceInfo.HeadPicUrl,
- Status = LiveMemberStatus.Accepted,
- };
- liveMembers.Add(deviceLiveInfo);
- var room = new LiveRoomDTO
- {
- LiveRoomCode = roomId,
- Name = consultationRecord.PatientName,
- RelatedCode = roomId,
- BusinessModule = BusinessModuleEnum.LivingConsultation,
- Status = LiveRoomStatus.Default,
- UserInfos = liveMembers.Where(x => x.MemberType == LiveMemberEnum.User)?.ToList() ?? new List<LiveMemberDTO>(),
- DeviceInfos = liveMembers.Where(x => x.MemberType == LiveMemberEnum.Device)?.ToList() ?? new List<LiveMemberDTO>(),
- };
- return room;
- }
- return null;
- }
- /// <summary>
- /// Cancel the initiating a diagnosis meeting
- /// </summary>
- /// <param name="request">The request</param>
- /// <returns></returns>
- /// <show>false</show>
- public async Task<CancelLiveConsultationResult> CancelLiveConsultationAsync(CancelLiveConsultationRequest request)
- {
- var userCode = await GetClientIdByTokenAsync(request.Token);
- //获取房间缓存
- var roomId = request.ConsultationCode;
- using (await _lockManager.Acquire(roomId))
- {
- var consultationRecord = CacheMaintenance.Instance.Get<IConsultationRecordManager>().Get(roomId);
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- if (room == null || consultationRecord == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- if (room.Status == LiveRoomStatus.Cancelled)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationCancelled, "LiveConsultationCancelled");
- }
- if (userCode != room.InitiatorCode)
- {
- ThrowRpcException(CustomerRpcCode.NotConsultationInitiator, "NotConsultationInitiator");
- }
- //修改预约记录状态
- await _consultationRecordDBService.UpdateConsultationStatusAsync(roomId, TransactionStatusEnum.ToStart);
- if (consultationRecord.IsEmergency && string.IsNullOrWhiteSpace(consultationRecord.ExpertUserCode))
- {
- await UpdateEmergencyStateAsync(roomId, EmergencyConsultationStatus.Cancelled);
- }
- await _rtcService.CancelAsync(new CancelRequest
- {
- LiveRoomCode = roomId,
- UserCode = userCode,
- });
- return new CancelLiveConsultationResult() { ConsultationCode = roomId };
- }
- }
- /// <summary>
- /// Accept a diagnosis request
- /// </summary>
- /// <param name="request">The request</param>
- /// <returns></returns>
- public async Task<AcceptLiveConsultationResult> AcceptLiveConsultationAsync(AcceptLiveConsultationRequest request)
- {
- var tokenInfo = await _authenticationService.GetTokenAsync(request);
- var userCode = tokenInfo.ClientId;
- var user = await _userDBService.FindUserByCodeAsync(userCode);
- //获取房间缓存
- var roomId = request.ConsultationCode;
- using (await _lockManager.Acquire(roomId))
- {
- var consultationRecord = CacheMaintenance.Instance.Get<IConsultationRecordManager>().Get(roomId);
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- if (room == null || consultationRecord == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- else
- {
- if (room.Status == LiveRoomStatus.Cancelled)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationCancelled, "LiveConsultationCancelled");
- }
- else if (room.Status == LiveRoomStatus.ConnectionTimeout)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationTimeout, "LiveConsultationTimeout");
- }
- var accepter = room.UserInfos.FirstOrDefault(x => x.Code == userCode);
- if (accepter == null && !consultationRecord.IsEmergency)
- {
- Logger.WriteLineWarn($"LiveConsultationService AcceptLiveConsultationAsync, roomData:{Newtonsoft.Json.JsonConvert.SerializeObject(room)}");
- ThrowRpcException(CustomerRpcCode.LivMemberNotFound, "LiveMemberNotFound");
- }
- if (accepter != null)
- {
- var joinedByOtherDevice = await IsJoinedByOtherDevice(roomId, userCode, tokenInfo.LoginSource);
- if (joinedByOtherDevice)
- {
- ThrowRpcException(CustomerRpcCode.JoinedByOtherDevice, "JoinedByOtherDevice");
- }
- }
- }
- if (request.CheckOnly)
- {
- return new AcceptLiveConsultationResult { ConsultationCode = roomId };
- }
- if (consultationRecord.IsEmergency && string.IsNullOrWhiteSpace(consultationRecord.ExpertUserCode))
- {
- await UpdateEmergencyStateAsync(roomId, EmergencyConsultationStatus.Accepted);
- //维护专家信息
- await _consultationRecordDBService.UpdateExpertCodeAsync(roomId, userCode);
- //添加日程
- var addScheduleUsersRequest = new AddScheduleUsersDBRequest
- {
- RelevanceCode = roomId,
- UserCodes = new List<string> { userCode },
- };
- await _userDBService.AddScheduleUsersDBAsync(addScheduleUsersRequest);
- }
- await _rtcService.AcceptAsync(new AcceptRequest
- {
- LiveRoomCode = roomId,
- UserCode = userCode,
- LoginSource = tokenInfo.LoginSource,
- });
- var members = await _rtcService.GetLiveMemberInfosAsync(new GetLiveMemberInfosRequest { LiveRoomCode = roomId });
- var boardDatas = await _rtcService.GetLiveBoardDatasAsync(new GetLiveBoardDatasRequest { LiveRoomCode = roomId });
- var userSignRequest = new GetUserSignRequest
- {
- UserId = userCode
- };
- var userSignResult = await _wingRtcService.GetUserSignAsync(userSignRequest);
- var result = new AcceptLiveConsultationResult()
- {
- ConsultationCode = roomId,
- UserCode = userCode,
- UserSign = userSignResult.UserSign,
- AppId = room.SdkAppId,
- RoomNo = room.RtcRoomId,
- LiveProtocol = EnvironmentConfigs.General.LiveProtocolDetail<TransactionStatusEnum>(),
- MemberLiveDatas = members,
- InteractiveBoardDatas = boardDatas.Select(x => new InteractiveBoardDataDTO
- {
- UserCode = x.UserCode,
- BoardData = x.BoardData,
- InteractiveTime = x.InteractiveTime
- }).ToList(),
- };
- Logger.WriteLineInfo($"LiveConsultationService AcceptLiveConsultationAsync roomId:{roomId}, rtcRoomId:{room.RtcRoomId}, members:{string.Join(";", members.Select(m => $"{m.Name},sortLevel:{m.SortLevel},sortNumber:{m.SortNumber}"))}");
- return result;
- }
- }
- /// <summary>
- /// Reject a diagnosis request
- /// </summary>
- /// <param name="request">The request</param>
- /// <returns></returns>
- public async Task<RejectLiveConsultationResult> RejectLiveConsultationAsync(RejectLiveConsultationRequest request)
- {
- var userCode = await GetClientIdByTokenAsync(request.Token);
- //获取房间缓存
- var roomId = request.ConsultationCode;
- using (await _lockManager.Acquire(roomId))
- {
- var consultationRecord = CacheMaintenance.Instance.Get<IConsultationRecordManager>().Get(roomId);
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- if (room == null || consultationRecord == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- var isEmergency = consultationRecord.IsEmergency;
- var rejecter = room.UserInfos.FirstOrDefault(x => x.Code == userCode);
- if (!isEmergency)
- {
- if (rejecter == null)
- {
- //拒绝会诊中邀请
- await _rtcService.RejectInviteAsync(new RejectInviteRequest
- {
- LiveRoomCode = roomId,
- UserCode = userCode,
- });
- }
- else
- {
- await _rtcService.RejectAsync(new RejectRequest
- {
- LiveRoomCode = roomId,
- UserCode = userCode,
- });
- if (consultationRecord.ApplyUserCode == userCode)
- {
- //基层拒绝会诊,自动结束会诊
- await _rtcService.CloseAsync(new CloseRequest
- {
- LiveRoomCode = roomId,
- UserCode = userCode,
- });
- await _consultationRecordDBService.UpdateConsultationStatusAsync(roomId, TransactionStatusEnum.ToStart);
- }
- }
- }
- else
- {
- if (string.IsNullOrWhiteSpace(consultationRecord.ExpertUserCode))
- {
- await UpdateEmergencyStateAsync(roomId, EmergencyConsultationStatus.Rejected);
- }
- else if (rejecter == null)
- {
- //拒绝会诊中邀请
- await _rtcService.RejectInviteAsync(new RejectInviteRequest
- {
- LiveRoomCode = roomId,
- UserCode = userCode,
- });
- }
- else
- {
- await _rtcService.RejectAsync(new RejectRequest
- {
- LiveRoomCode = roomId,
- UserCode = userCode,
- });
- if (consultationRecord.ExpertUserCode == userCode)
- {
- //专家拒绝会诊,自动结束会诊
- await _rtcService.CloseAsync(new CloseRequest
- {
- LiveRoomCode = roomId,
- UserCode = userCode,
- });
- await _consultationRecordDBService.UpdateConsultationStatusAsync(roomId, TransactionStatusEnum.ToStart);
- }
- }
- }
- var result = new RejectLiveConsultationResult() { ConsultationCode = roomId };
- return result;
- }
- }
- /// <summary>
- /// Join a diagnosis request
- /// </summary>
- /// <param name="request">The request</param>
- /// <returns></returns>
- public async Task<JoinLiveConsultationResult> JoinLiveConsultationAsync(JoinLiveConsultationRequest request)
- {
- var userCode = await GetClientIdByTokenAsync(request.Token);
- //获取房间缓存
- var roomId = request.ConsultationCode;
- LiveConsultationRoom room = null;
- if (room == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- //room.Accept(accepterToken.Code);
- //Notify other guys
- BroadcastNotificationRequest notificationRequest = new BroadcastNotificationRequest();
- var others = room.Members.Where(x => x.Id != userCode);
- var otherIds = others.Select(x => x.Id).ToList();
- notificationRequest.ClientIds = otherIds; //TODO set message content
- var accepter = room.Members.FirstOrDefault(x => x.Id == userCode);
- if (accepter == null)
- {
- //TODO thow exception
- }
- var joiner = new LiveConsultationJoinerInfo()
- {
- Id = accepter.Id,
- Name = accepter.Name,
- IsOnline = accepter.IsOnline,
- Mute = accepter.Mute,
- LoginSource = accepter.LoginSource,
- LiveData = accepter.LiveData
- };
- var notification = new JoinLiveConsultationNotification()
- {
- ConsultationCode = roomId,
- Joiner = joiner,
- };
- notificationRequest.Message = notification;
- notificationRequest.JsonMessage = Newtonsoft.Json.JsonConvert.SerializeObject(notification);
- notificationRequest.NotificationType = notification.NotificationType;
- notificationRequest.TransactionType = TransactionTypeEnum.Consultion;
- notificationRequest.RelevanceCode = roomId;
- notificationRequest.ReceiverType = ApplicantTypeEnum.Client;
- await _notificationService.BroadcastMessageAsync(notificationRequest);
- var result = new JoinLiveConsultationResult() { ConsultationCode = roomId };
- return result;
- }
- /// <summary>
- /// Leave a diagnosis request
- /// </summary>
- /// <param name="request">The request</param>
- /// <returns></returns>
- public async Task<LeaveLiveConsultationResult> LeaveLiveConsultationAsync(LeaveLiveConsultationRequest request)
- {
- var userCode = await GetClientIdByTokenAsync(request.Token);
- //获取房间缓存
- var roomId = request.ConsultationCode;
- using (await _lockManager.Acquire(roomId))
- {
- var consultationRecord = CacheMaintenance.Instance.Get<IConsultationRecordManager>().Get(roomId);
- if (consultationRecord == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- if (room == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- else if (room.UserInfos.Any(x => x.Code == userCode))
- {
- var members = await _rtcService.GetLiveMemberInfosAsync(new GetLiveMemberInfosRequest { LiveRoomCode = roomId });
- var closed = userCode == consultationRecord.ExpertUserCode || userCode == consultationRecord.ApplyUserCode;
- if (!closed)
- {
- var joinMembers = members.Where(x => x.MemberType == LiveMemberEnum.User && x.Status == LiveConsultationMemberStatus.Joined && x.Id != userCode)?.ToList() ?? new List<LiveConsultationMember>();
- if (!joinMembers.Any())
- {
- closed = true;
- }
- }
- var result = await _rtcService.LeaveAsync(new LeaveRequest
- {
- LiveRoomCode = roomId,
- UserCode = userCode,
- Closed = closed,
- });
- if (closed)
- {
- //修改预约记录状态
- var reportRequest = new GetReportByRecordCodeDBRequest { RecordCode = roomId };
- var report = await _reportDBService.GetReportByRecordCodeAsync(reportRequest);
- if (report != null && report.Count > 0)
- {
- await _consultationRecordDBService.UpdateConsultationStatusAsync(roomId, TransactionStatusEnum.End);
- }
- else
- {
- var consultationStatus = TransactionStatusEnum.ToStart;
- if (LiveMemberHasJoined(members, consultationRecord.ExpertUserCode) && LiveMemberHasJoined(members, consultationRecord.ApplyUserCode))
- {
- consultationStatus = TransactionStatusEnum.PendingReport;
- }
- await _consultationRecordDBService.UpdateConsultationStatusAsync(roomId, consultationStatus);
- }
- }
- }
- return new LeaveLiveConsultationResult() { ConsultationCode = roomId };
- }
- }
- /// <summary>
- /// 设置开启或关闭静音状态
- /// </summary>
- /// <param name="request">设置开启或关闭静音状态的请求</param>
- /// <returns></returns>
- public async Task<MuteLiveConsultationResult> MuteLiveConsultationAsync(MuteLiveConsultationRequest request)
- {
- var userCode = await GetClientIdByTokenAsync(request.Token);
- //获取房间缓存
- var roomId = request.ConsultationCode;
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- if (room == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- else if (room.Status != LiveRoomStatus.Connected && room.Status != LiveRoomStatus.Initiating)
- {
- ThrowRpcException(CustomerRpcCode.ConsultationNotInProcess, "Consultation Not InProcess");
- }
- else
- {
- await _rtcService.ChangeMuteOpenedAsync(new ChangeMuteOpenedRequest
- {
- LiveRoomCode = roomId,
- UserCode = userCode,
- MuteOpened = request.Mute
- });
- }
- var result = new MuteLiveConsultationResult() { ConsultationCode = roomId };
- return result;
- }
- /// <summary>
- /// 开启或关闭视频
- /// </summary>
- /// <param name="request">开启或关闭视频请求</param>
- /// <returns></returns>
- public async Task<SwitchLiveConsultationVideoResult> SwitchLiveConsultationVideoAsync(SwitchLiveConsultationVideoRequest request)
- {
- var userCode = await GetClientIdByTokenAsync(request.Token);
- //获取房间缓存
- var roomId = request.ConsultationCode;
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- if (room == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- else if (room.Status != LiveRoomStatus.Connected && room.Status != LiveRoomStatus.Initiating)
- {
- ThrowRpcException(CustomerRpcCode.ConsultationNotInProcess, "Consultation Not InProcess");
- }
- else
- {
- await _rtcService.ChangeVideoOpenedAsync(new ChangeVideoOpenedRequest
- {
- LiveRoomCode = roomId,
- UserCode = userCode,
- VideoOpened = request.Opened
- });
- }
- var result = new SwitchLiveConsultationVideoResult() { ConsultationCode = roomId };
- return result;
- }
- /// <summary>
- /// Send HeartRate request in a diagnosis metting
- /// </summary>
- /// <param name="request">The request</param>
- /// <returns></returns>
- public async Task<LiveConsultationHeartRateResult> HeartRateAsync(LiveConsultationHeartRateRequest request)
- {
- var userToken = await _authenticationService.GetTokenAsync(request);
- var consultationRecord = CacheMaintenance.Instance.Get<IConsultationRecordManager>().Get(request.ConsultationCode);
- if (consultationRecord == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- else if (consultationRecord.ConsultationStatus == (int)TransactionStatusEnum.Applied
- || consultationRecord.ConsultationStatus == (int)TransactionStatusEnum.Withdrawn
- || consultationRecord.ConsultationStatus == (int)TransactionStatusEnum.Rejected)
- {
- ThrowRpcException(CustomerRpcCode.ReservationNotReviewed, $"Reservation record not reviewed, current status:{consultationRecord.ConsultationStatus.ToString()}");
- }
- else if (consultationRecord.ConsultationStatus != (int)TransactionStatusEnum.InProgress)
- {
- ThrowRpcException(CustomerRpcCode.ConsultationEnded, $"ConsultationEnded, current status:{consultationRecord.ConsultationStatus.ToString()}");
- }
- _liveConsultationHeartRateManager.AddOrUpdate(userToken.Code, userToken.ClientId, userToken.AccountName, request.ConsultationCode);
- var controlHeartRate = new RemoteConnectHeartRateRequest()
- {
- Token = request.Token,
- IsNeedSyn = true,
- TransactionType = TransactionTypeEnum.Consultion
- };
- if (userToken.AccountType == AccountType.User)
- {
- var res = await _deviceService.RemoteConnectHeartRateAsync(controlHeartRate);
- }
- else
- {
- var res = await _deviceService.DeviceRemoteConnectHeartRateAsync(controlHeartRate);
- }
- return await Task.FromResult<LiveConsultationHeartRateResult>(new LiveConsultationHeartRateResult { ConsultationCode = request.ConsultationCode });
- }
- /// <summary>
- /// 调参
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- public async Task<bool> ControlParameterAsync(ControlDeviceParameterInConsultationRequest request)
- {
- var result = await _authenticationService.GetTokenAsync(new TokenRequest() { Token = request.Token });
- var userCode = result.ClientId;
- if (string.IsNullOrEmpty(userCode))
- {
- ThrowRpcException(CustomerRpcCode.UsercodeIsEmpty, "User code is empty");
- }
- //获取房间缓存
- var roomId = request.ConsultationCode;
- if (string.IsNullOrWhiteSpace(roomId))
- {
- ThrowRpcException(CustomerRpcCode.ConsultationCodeIsEmpty, "ConsultationCode is empty");
- }
- //会诊记录
- var consultationRequest = new ConsultationRecordCodeDBRequest { Code = roomId };
- var consultationRecord = await _consultationRecordDBService.FindConsultationRecordByCodeAsync(consultationRequest);
- var deviceCode = consultationRecord.DeviceCode;
- if (string.IsNullOrEmpty(deviceCode))
- {
- ThrowRpcException(CustomerRpcCode.NoExistDevice, "Device does not exist");
- }
- var deviceTokenInfo = CacheMaintenance.Instance.Get<ITokensManager>().Where(x => x.ClientId == deviceCode)?.FirstOrDefault();
- if (deviceTokenInfo == null)
- {
- ThrowRpcException(CustomerRpcCode.DeviceNotFind, "Device not found");
- }
- if (deviceTokenInfo.IsOldPlatform)
- {
- ThrowRpcException(CustomerRpcCode.DeviceNotSupport, "Device not support");
- }
- var checkIdleRequest = new GetDeviceRequest()
- {
- Token = request.Token,
- DeviceCode = deviceCode
- };
- var checkResult = await _deviceService.CheckDeviceIsIdleAsync(checkIdleRequest);
- if (!checkResult)
- {
- ThrowRpcException(CustomerRpcCode.RemoteConnectDeviceOccupied, "Remote connect device has been occupied");
- }
- var res = false;
- if (request.ControlType == ControlDeviceParameterEnum.Start || request.ControlType == ControlDeviceParameterEnum.RunExecuteApi ||
- request.ControlType == ControlDeviceParameterEnum.UpdateProbeApplication || request.ControlType == ControlDeviceParameterEnum.UpdateAndExitProbeApplication ||
- request.ControlType == ControlDeviceParameterEnum.ExitProbeApplication || request.ControlType == ControlDeviceParameterEnum.GetProbeApplication ||
- request.ControlType == ControlDeviceParameterEnum.ExecuteProbeApplicationSetting || request.ControlType == ControlDeviceParameterEnum.End)
- {
- var addRequest = new AddUserRemoteConnectRequest()
- {
- Token = request.Token,
- DeviceCode = deviceCode,
- RoomId = roomId,
- StatusEnum = ConnectStatusEnum.WaitConnect,
- IsNeedSyn = request.IsNeedSyn
- };
- if (request.ControlType == ControlDeviceParameterEnum.Start)
- {
- addRequest.StatusEnum = ConnectStatusEnum.WaitConnect;
- }
- else if (request.ControlType == ControlDeviceParameterEnum.RunExecuteApi || request.ControlType == ControlDeviceParameterEnum.ExecuteProbeApplicationSetting ||
- request.ControlType == ControlDeviceParameterEnum.UpdateProbeApplication || request.ControlType == ControlDeviceParameterEnum.UpdateAndExitProbeApplication ||
- request.ControlType == ControlDeviceParameterEnum.ExitProbeApplication || request.ControlType == ControlDeviceParameterEnum.GetProbeApplication)
- {
- addRequest.StatusEnum = ConnectStatusEnum.CompleteConnect;
- }
- else if (request.ControlType == ControlDeviceParameterEnum.End)
- {
- addRequest.StatusEnum = ConnectStatusEnum.WaitDisconnect;
- }
- var addRemoteConnectResult = await _deviceService.AddUserRemoteConnectAsync(addRequest);
- var user = await _userDBService.FindUserByCodeAsync(userCode);
- BroadcastNotificationRequest notificationRequest = new BroadcastNotificationRequest();
- if (request.ControlType == ControlDeviceParameterEnum.Start || request.ControlType == ControlDeviceParameterEnum.End)
- {
- var notification = new ConnectStatusToDeviceNotification()//申请连接设备通知
- {
- ControlUserCode = userCode,
- ControlUserName = user.DisplayName,
- ControlType = request.ControlType,
- TransactionType = TransactionTypeEnum.Consultion,
- LoginSource = result.LoginSource,
- DeviceCode = deviceCode,
- };
- notificationRequest.Message = notification;
- notificationRequest.JsonMessage = Newtonsoft.Json.JsonConvert.SerializeObject(notification);
- notificationRequest.NotificationType = notification.NotificationType;
- var isOldPlatform = deviceTokenInfo != null && deviceTokenInfo.IsOldPlatform && deviceTokenInfo.IsOnline;
- if (isOldPlatform)
- {
- await _deviceForwardService.ApplyRemoteConnectAsync(notification);
- }
- notificationRequest.IsNeedSyn = false;
- }
- else
- {
- var notification = new DeviceControlledParametersNotification()//设备通知
- {
- ControlUserCode = userCode,
- ControlUserName = user.DisplayName,
- ControlType = request.ControlType,
- Parameters = request.Parameters,
- LoginSource = result.LoginSource
- };
- notificationRequest.Message = notification;
- notificationRequest.JsonMessage = Newtonsoft.Json.JsonConvert.SerializeObject(notification);
- notificationRequest.NotificationType = notification.NotificationType;
- notificationRequest.IsNeedSyn = true;
- }
- notificationRequest.ClientIds = new List<string>() { deviceCode };
- notificationRequest.TransactionType = TransactionTypeEnum.Consultion;
- notificationRequest.RelevanceCode = roomId;
- notificationRequest.ReceiverType = ApplicantTypeEnum.Device;
- res = await _notificationService.BroadcastMessageAsync(notificationRequest);
- }
- return res;
- }
- /// <summary>
- /// 设备端接受连接/断开链接请求接口
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- public async Task<bool> AcceptRemoteConnnectionAsync(ControlDeviceResponseRequest request)
- {
- var res = false;
- string deviceCode = await GetClientIdByTokenAsync(request.Token);
- if (string.IsNullOrEmpty(request.UserCode))
- {
- ThrowRpcException(CustomerRpcCode.UsercodeIsEmpty, "User code is empty");
- }
- if (string.IsNullOrEmpty(deviceCode))
- {
- ThrowRpcException(CustomerRpcCode.DeviceCodeEmpty, "Device code is empty");
- }
- var result = CacheMaintenance.Instance.Get<ITokensManager>().Where(t => t.ClientId == request.UserCode && t.LoginSource == (int)request.LoginSource)?.OrderByDescending(x => x.IsOnline)?.FirstOrDefault() ?? new Token();
- if (string.IsNullOrEmpty(result.ClientId))
- {
- ThrowRpcException(CustomerRpcCode.UsercodeIsEmpty, "User code is empty");
- }
- var checkUserExistRequest = new GetDeviceRequest()
- {
- Token = result.Code,
- DeviceCode = deviceCode,
- IsNeedSyn = request.IsNeedSyn
- };
- var existRoomIdResult = await _deviceService.CheckUserIsExistRoomIdAsync(checkUserExistRequest);
- if (string.IsNullOrEmpty(existRoomIdResult))
- {
- ThrowRpcException(CustomerRpcCode.UserNotConnected, "User not connected");
- }
- var roomId = existRoomIdResult;
- var deviceInfo = CacheMaintenance.Instance.Get<IDeviceInfosManager>().Get(deviceCode);
- if (deviceInfo == null)
- {
- ThrowRpcException(CustomerRpcCode.DeviceNotExist, "Not find device");
- }
- var userCode = request.UserCode;
- if (request.ControlType == ControlDeviceParameterEnum.Start)
- {
- var addRequest = new AddUserRemoteConnectRequest()
- {
- Token = result.Code,
- DeviceCode = deviceCode,
- RoomId = roomId,
- StatusEnum = ConnectStatusEnum.CompleteConnect,
- IsNeedSyn = request.IsNeedSyn
- };
- var addRemoteConnectResult = await _deviceService.AddUserRemoteConnectAsync(addRequest);
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- if (room == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- var existMember = room.UserInfos.FirstOrDefault(x => x.Code == userCode);
- if (existMember == null)
- {
- ThrowRpcException(CustomerRpcCode.LivMemberNotFound, "LiveMemberNotFound");
- }
- var deviceMember = room.DeviceInfos.FirstOrDefault(v => v.Code == deviceCode);
- if (deviceMember == null)
- {
- ThrowRpcException(CustomerRpcCode.NoExistDevice, "Device does not exist");
- }
- //检查是否用用户使用参数调节中
- var isControllingMember = room.UserInfos.FirstOrDefault(x => x.IsControllingParameter);
- if (isControllingMember != null && isControllingMember.Code != userCode)
- {
- ThrowRpcException(CustomerRpcCode.ControllingParameterByOtherUser, "Controlling parameter by other");
- }
- var isControllingParameter = true;
- if (existMember.IsControllingParameter != isControllingParameter)
- {
- var changeStateResult = await _rtcService.ChangeControllingStateAsync(new ChangeControllingStateRequest
- {
- LiveRoomCode = room.LiveRoomCode,
- UserCode = userCode,
- IsControllingParameter = isControllingParameter,
- });
- }
- if (isControllingParameter)
- {
- var notification = new DeviceControlledParametersNotification()//设备通知
- {
- ControlUserCode = userCode,
- ControlUserName = request.UserName,
- ControlType = ControlDeviceParameterEnum.Get,
- Parameters = new List<AdditionParameterDTO>()
- };
- BroadcastNotificationRequest notificationRequest = new BroadcastNotificationRequest();
- notificationRequest.ClientIds = new List<string>() { deviceCode };
- notificationRequest.Message = notification;
- notificationRequest.JsonMessage = Newtonsoft.Json.JsonConvert.SerializeObject(notification);
- notificationRequest.NotificationType = notification.NotificationType;
- notificationRequest.TransactionType = TransactionTypeEnum.AfterSales;
- notificationRequest.RelevanceCode = roomId;
- notificationRequest.ReceiverType = ApplicantTypeEnum.Device;
- notificationRequest.IsNeedSyn = true;
- res = await _notificationService.BroadcastMessageAsync(notificationRequest);
- }
- }
- else
- {
- //关闭正在进行的链接
- var closeRemoteConnectResult = await _deviceService.CloseUserRemoteConnectAsync(checkUserExistRequest);
- if (request.ControlType == ControlDeviceParameterEnum.End)
- {
- var notify = new DeviceDisconnectRemoteControlNotification()
- {
- DeviceCode = deviceCode,
- };
- var endNotificationRequest = new SendNotificationRequest()
- {
- ClientId = request.UserCode,
- Message = notify,
- JsonMessage = Newtonsoft.Json.JsonConvert.SerializeObject(notify),
- NotificationType = notify.NotificationType,
- TransactionType = TransactionTypeEnum.AfterSales,
- RelevanceCode = request.UserCode,
- ReceiverType = ApplicantTypeEnum.Client
- };
- res = await _notificationService.PostMessageAsync(endNotificationRequest);
- return res;
- }
- else if (request.ControlType == ControlDeviceParameterEnum.RejectConnect)
- {
- var notify = new DeviceRejectRemoteControlNotification()
- {
- DeviceCode = deviceCode,
- };
- var rejectNotificationRequest = new SendNotificationRequest()
- {
- ClientId = request.UserCode,
- Message = notify,
- JsonMessage = Newtonsoft.Json.JsonConvert.SerializeObject(notify),
- NotificationType = notify.NotificationType,
- TransactionType = TransactionTypeEnum.AfterSales,
- RelevanceCode = request.UserCode,
- ReceiverType = ApplicantTypeEnum.Client
- };
- res = await _notificationService.PostMessageAsync(rejectNotificationRequest);
- return res;
- }
- }
- return res;
- }
- private async void HandleClientJoined(string roomId, string clientId, string name, bool sendMessage)
- {
- try
- {
- //获取房间缓存
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- var liveMember = room?.UserInfos.FirstOrDefault(x => x.Code == clientId);
- if (liveMember == null)
- {
- liveMember = room?.DeviceInfos.FirstOrDefault(x => x.Code == clientId);
- }
- if (room != null && liveMember != null)
- {
- if (liveMember.Status == LiveMemberStatus.Accepted || liveMember.Status == LiveMemberStatus.Left || sendMessage)
- {
- await _rtcService.HeartRateJoinedAsync(new HeartRateJoinRequest
- {
- LiveRoomCode = roomId,
- UserCode = clientId,
- });
- }
- }
- }
- catch (Exception ex)
- {
- Logger.WriteLineWarn($"LiveConsultationService HandleClientJoined err, name:{name}, clientId:{clientId}, roomId:{roomId}, ex:{ex}");
- }
- }
- private async void HandleClientNetworkErr(string roomId, string clientId, string name)
- {
- try
- {
- //获取房间缓存
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- var liveMember = room?.UserInfos.FirstOrDefault(x => x.Code == clientId);
- if (liveMember == null)
- {
- liveMember = room?.DeviceInfos.FirstOrDefault(x => x.Code == clientId);
- }
- if (room != null && liveMember != null)
- {
- if (liveMember.Status == LiveMemberStatus.Joined)
- {
- await _rtcService.NetworkErrorAsync(new NetworkErrorRequest
- {
- LiveRoomCode = roomId,
- UserCode = clientId,
- });
- }
- }
- }
- catch (Exception ex)
- {
- Logger.WriteLineWarn($"LiveConsultationService ClientNetworkErrAsync err, name:{name}, clientId:{clientId}, roomId:{roomId}, ex:{ex}");
- }
- }
- private async void HandleClientLeave(string roomId, string clientId, string name)
- {
- try
- {
- //获取房间缓存
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- var liveMember = room?.UserInfos.FirstOrDefault(x => x.Code == clientId);
- if (liveMember == null)
- {
- liveMember = room?.DeviceInfos.FirstOrDefault(x => x.Code == clientId);
- }
- if (room != null && liveMember != null)
- {
- var consultationRecord = CacheMaintenance.Instance.Get<IConsultationRecordManager>().Get(roomId);
- if (liveMember.Status == LiveMemberStatus.Joined && consultationRecord != null)
- {
- var closed = false;
- //调整为只要基层或者会诊专家离线就认为会诊结束,房间解散
- if (consultationRecord.ExpertUserCode == clientId || consultationRecord.ApplyUserCode == clientId)
- {
- closed = true;
- }
- // var joinMembers = members.Where(x => x.MemberType == LiveMemberEnum.User && x.Status == LiveConsultationMemberStatus.Joined && x.Id != clientId)?.ToList() ?? new List<LiveConsultationMember>();
- // if (!joinMembers.Any())
- // {
- // closed = true;
- // }
- await _rtcService.HeartRateLeavedAsync(new HeartRateLeavedRequest
- {
- LiveRoomCode = roomId,
- UserCode = clientId,
- });
- if (closed)
- {
- await _rtcService.CloseAsync(new CloseRequest
- {
- LiveRoomCode = roomId,
- UserCode = clientId,
- });
- //修改预约记录状态
- var reportRequest = new GetReportByRecordCodeDBRequest { RecordCode = roomId };
- var report = await _reportDBService.GetReportByRecordCodeAsync(reportRequest);
- if (report != null && report.Count > 0)
- {
- await _consultationRecordDBService.UpdateConsultationStatusAsync(roomId, TransactionStatusEnum.End);
- }
- else
- {
- var consultationStatus = TransactionStatusEnum.ToStart;
- var members = await _rtcService.GetLiveMemberInfosAsync(new GetLiveMemberInfosRequest { LiveRoomCode = roomId });
- if (LiveMemberHasJoined(members, consultationRecord.ExpertUserCode) && LiveMemberHasJoined(members, consultationRecord.ApplyUserCode))
- {
- consultationStatus = TransactionStatusEnum.PendingReport;
- }
- await _consultationRecordDBService.UpdateConsultationStatusAsync(roomId, consultationStatus);
- }
- }
- }
- }
- }
- catch (Exception ex)
- {
- Logger.WriteLineWarn($"LiveConsultationService HandleClientLeave err, name:{name}, clientId:{clientId}, roomId:{roomId}, ex:{ex}");
- }
- }
- private void ThrowRpcException(CustomerRpcCode code, string message, string internalMessage = null)
- {
- base.ThrowRpcException((int)code, message, internalMessage ?? message);
- }
- private async Task<string> GetClientIdByTokenAsync(string token)
- {
- var result = await _authenticationService.GetTokenAsync(new TokenRequest() { Token = token });
- return result.ClientId; //return User code
- }
- /// <summary>
- /// 发送白板交互数据
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- public async Task<bool> SendInteractiveBoardDataAsync(SendInteractiveBoardDataRequest request)
- {
- var userCode = await GetClientIdByTokenAsync(request.Token);
- var roomId = request.ConsultationCode;
- var room = _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- if (room == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- await _rtcService.SendBoardDataAsync(new SendBoardDataRequest
- {
- LiveRoomCode = roomId,
- UserCode = userCode,
- BoardData = request.BoardData,
- IsClear = request.IsClear,
- });
- return true;
- }
- /// <summary>
- /// Initiated other Users or devices in diagnosis meeting
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- public async Task<InviteInLiveConsultationResult> InviteInLiveConsultationAsync(InviteInLiveConsultationRequest request)
- {
- var userCode = await GetClientIdByTokenAsync(request.Token);
- //获取房间缓存
- var roomId = request.ConsultationCode;
- using (await _lockManager.Acquire(roomId))
- {
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- if (room == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- else if (room.Status != LiveRoomStatus.Initiating)
- {
- //只有会诊过程的状态才可以邀请
- ThrowRpcException(CustomerRpcCode.ConsultationNotInProcess, "ConsultationNotInProcess");
- }
- if (request.InviteCodes.Count == 1)
- {
- var liveMemberInfos = await _rtcService.GetLiveMemberStatusInfosAsync(new GetLiveMemberStatusInfosRequest { UserCodes = request.InviteCodes });
- var liveMemberInfo = liveMemberInfos.FirstOrDefault();
- if (liveMemberInfo?.UserStatusType == UserStatusEnum.NotOnline)
- {
- ThrowRpcException(CustomerRpcCode.InviterNotOnLine, "Inviter Not OnLine");
- }
- if (liveMemberInfo?.UserStatusType == UserStatusEnum.IsBusy)
- {
- ThrowRpcException(CustomerRpcCode.InviterIsBusy, "Inviter Is Busy");
- }
- }
- await _rtcService.InviteInAsync(new InviteInRequest
- {
- LiveRoomCode = roomId,
- UserCode = userCode,
- InviteCodes = request.InviteCodes.ToList()
- });
- var result = new InviteInLiveConsultationResult
- {
- ConsultationCode = roomId
- };
- return result;
- }
- }
- /// <summary>
- /// Cancel initiating other Users or devices in diagnosis meeting
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- public async Task<CancelInvitingInLiveConsultationResult> CancelInvitingInLiveConsultationAsync(CancelInvitingInLiveConsultationRequest request)
- {
- var userCode = await GetClientIdByTokenAsync(request.Token);
- //获取房间缓存
- var roomId = request.ConsultationCode;
- using (await _lockManager.Acquire(roomId))
- {
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- if (room == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- else if (room.Status != LiveRoomStatus.Initiating)
- {
- //只有会诊过程的状态才可以邀请
- ThrowRpcException(CustomerRpcCode.ConsultationNotInProcess, "ConsultationNotInProcess");
- }
- await _rtcService.CancelInviteInAsync(new CancelInviteInRequest
- {
- LiveRoomCode = roomId,
- UserCode = userCode,
- InviteCodes = request.InviteCodes.ToList()
- });
- return new CancelInvitingInLiveConsultationResult() { ConsultationCode = roomId };
- }
- }
- /// <summary>
- /// 拒绝会诊中邀请-废弃
- /// </summary>
- /// <param name="request">The request</param>
- /// <returns></returns>
- public async Task<RejectLiveConsultationResult> RejectInviteLiveConsultationAsync(RejectLiveConsultationRequest request)
- {
- var userCode = await GetClientIdByTokenAsync(request.Token);
- //获取房间缓存
- var roomId = request.ConsultationCode;
- using (await _lockManager.Acquire(roomId))
- {
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- if (room == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- await _rtcService.RejectInviteAsync(new RejectInviteRequest
- {
- LiveRoomCode = roomId,
- UserCode = userCode,
- });
- var result = new RejectLiveConsultationResult() { ConsultationCode = roomId };
- return result;
- }
- }
- /// <summary>
- /// 会诊中加入房间
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- public async Task<JoinLiveConsultationResult> JoinInLiveConsultationAsync(JoinLiveConsultationRequest request)
- {
- var tokenInfo = await _authenticationService.GetTokenAsync(request);
- var userCode = tokenInfo.ClientId;
- //获取房间缓存
- var roomId = request.ConsultationCode;
- var recordRequest = new ConsultationRecordCodeDBRequest { Code = request.ConsultationCode };
- var record = await _consultationRecordDBService.FindConsultationRecordByCodeAsync(recordRequest);
- using (await _lockManager.Acquire(roomId))
- {
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- if (room == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- else if (room.Status != LiveRoomStatus.Initiating)
- {
- if (record.ConsultationStatus == TransactionStatusEnum.InProgress)
- {
- var consultationStatus = room.Status == LiveRoomStatus.Closed ? TransactionStatusEnum.PendingReport : TransactionStatusEnum.ToStart;
- await _consultationRecordDBService.UpdateConsultationStatusAsync(roomId, consultationStatus);
- }
- ThrowRpcException(CustomerRpcCode.ConsultationNotInProcess, "ConsultationNotInProcess");
- }
- var joinedByOtherDevice = await IsJoinedByOtherDevice(roomId, userCode, tokenInfo.LoginSource);
- if (joinedByOtherDevice)
- {
- ThrowRpcException(CustomerRpcCode.JoinedByOtherDevice, "JoinedByOtherDevice");
- }
- if (request.CheckOnly)
- {
- return new JoinLiveConsultationResult { ConsultationCode = roomId };
- }
- await _rtcService.JoinInAsync(new JoinInRequest
- {
- LiveRoomCode = roomId,
- UserCode = userCode,
- SortLevel = (int)LiveConsultationRoleEnum.OtherParticipant,
- LoginSource = tokenInfo.LoginSource,
- });
- //加入到参与人员
- if (userCode != record.ExpertUserCode && userCode != record.ApplyUserCode)
- {
- var consultationMember = record.ConsultationMembers.FirstOrDefault(x => x.MemberCode == userCode);
- if (consultationMember == null)
- {
- var userInfoDTO = await _userDBService.FindUserByCodeAsync(userCode);
- var addMemberDTO = new ConsultationMemberDTO
- {
- MemberCode = userInfoDTO.UserCode,
- MemberOrganizationCode = userInfoDTO.RootOrganizationCode,
- MemberDepartmentCode = userInfoDTO.OrganizationCode,
- MemberStatus = LiveConsultationMemberStatus.Accepted,
- MemberOperateTime = DateTime.UtcNow
- };
- record.ConsultationMembers.Add(addMemberDTO);
- await _consultationRecordDBService.UpdateConsultationRecordAsync(record);
- }
- else if (consultationMember.MemberStatus != LiveConsultationMemberStatus.Accepted)
- {
- consultationMember.MemberStatus = LiveConsultationMemberStatus.Accepted;
- consultationMember.MemberOperateTime = DateTime.UtcNow;
- await _consultationRecordDBService.UpdateConsultationRecordAsync(record);
- }
- }
- //加入到日程
- var addScheduleUsersRequest = new AddScheduleUsersDBRequest
- {
- RelevanceCode = roomId,
- UserCodes = new List<string> { userCode },
- };
- await _userDBService.AddScheduleUsersDBAsync(addScheduleUsersRequest);
- var userSignRequest = new GetUserSignRequest
- {
- UserId = userCode
- };
- var userSignResult = await _wingRtcService.GetUserSignAsync(userSignRequest);
- var boardDatas = await _rtcService.GetLiveBoardDatasAsync(new GetLiveBoardDatasRequest { LiveRoomCode = roomId });
- var members = await _rtcService.GetLiveMemberInfosAsync(new GetLiveMemberInfosRequest { LiveRoomCode = roomId });
- var result = new JoinLiveConsultationResult
- {
- ConsultationCode = roomId,
- UserCode = userCode,
- UserSign = userSignResult.UserSign,
- AppId = room.SdkAppId,
- RoomNo = room.RtcRoomId,
- LiveProtocol = EnvironmentConfigs.General.LiveProtocolDetail<TransactionStatusEnum>(),
- MemberLiveDatas = members,
- InteractiveBoardDatas = boardDatas.Select(x => new InteractiveBoardDataDTO
- {
- UserCode = x.UserCode,
- BoardData = x.BoardData,
- InteractiveTime = x.InteractiveTime
- }).ToList(),
- };
- Logger.WriteLineInfo($"LiveConsultationService JoinInLiveConsultationAsync roomId:{roomId}, rtcRoomId:{room.RtcRoomId}, members:{string.Join(";", members.Select(m => $"{m.Name},sortLevel:{m.SortLevel},sortNumber:{m.SortNumber}"))}");
- return result;
- }
- }
- /// <summary>
- /// 会诊中获取可邀请用户信息列表
- /// </summary>
- /// <param name="request">请求体</param>
- /// <returns>用户信息列表</returns>
- public async Task<List<UserExtendDTO>> GetInviteableUserListAsync(GetInviteableUserListRequest request)
- {
- //获取房间缓存
- var roomId = request.ConsultationCode;
- var language = request.Language;
- var organizationCode = request.OrganizationCode;
- var dbRequest = new GetUserListDBRequest
- {
- OrganizationCode = organizationCode,
- OrganizationQueryType = OrganizationQueryTypeEnum.All,
- ExceptUsers = new List<string>(),
- RoleCodes = new List<string> { "Role_CertifiedExpert", "Role_CertifiedPhysician", "Role_InternshipDoctor" }
- };
- var users = await _userDBService.GetUserListAsync(dbRequest);
- //过滤已在会诊间的用户 返回的结果能够跟据状态排序,能够邀请的用户排在前面,不在线和繁忙的用户排在后面
- if (users.Count > 0)
- {
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- if (room != null)
- {
- var userCodes = room.UserInfos.Select(x => x.Code);
- users = users.Where(x => !userCodes.Contains(x.UserCode)).ToList();
- }
- }
- var result = users.MappingTo<List<UserExtendDTO>>();
- if (result.Count == 0)
- {
- return result;
- }
- var findAuthenticationRolesRequest = new FindAuthenticationRolesRequest { Language = language };
- var roles = await _roleService.FindAllRolesAsync(findAuthenticationRolesRequest);
- foreach (var item in result)
- {
- if (item.RoleCodes != null && item.RoleCodes.Count > 0)
- {
- item.RoleName = roles.FirstOrDefault(x => x.RoleCode == item.RoleCodes[0])?.RoleName;
- }
- item.UserStatus = GetUserStatus(item.UserCode);
- }
- result = result.OrderByDescending(x => x.UserStatus).ToList();
- var orgInfo = CacheMaintenance.Instance.Get<IOrganizationsManager>().Where(c => c.Code == organizationCode)?.FirstOrDefault() ?? new CacheOrganizationDTO();
- foreach (var item in result)
- {
- item.RootOrganizationCode = organizationCode;
- item.RootOrganizationName = orgInfo.OrganizationName;
- }
- return result;
- }
- /// <summary>
- /// 切换会诊房间
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- public async Task<ChangeConsultationResult> ChangeConsultationAsync(ChangeConsultationRequest request)
- {
- var userToken = await _authenticationService.GetTokenAsync(request);
- var userCode = userToken.ClientId;
- var originalRoomId = request.OriginalCode;
- var currentRoomId = request.CurrentCode;
- var original = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = originalRoomId });
- if (original == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- else if (original.Status != LiveRoomStatus.Initiating)
- {
- ThrowRpcException(CustomerRpcCode.ConsultationNotInProcess, "ConsultationNotInProcess");
- }
- var liveMember = original.UserInfos.FirstOrDefault(x => x.Code == userCode);
- if (liveMember == null)
- {
- ThrowRpcException(CustomerRpcCode.ChangeConsultationNoFeature, "ChangeConsultationNoFeature");
- }
- else if (liveMember.Status != LiveMemberStatus.Joined)
- {
- ThrowRpcException(CustomerRpcCode.OperatorNoJoined, "OperatorNoJoined");
- }
- var roomId = original.LiveRoomCode;
- var patientName = original.Name;
- var initiatorCode = original.InitiatorCode;
- var current = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = currentRoomId });
- if (current == null)
- {
- ThrowRpcException(CustomerRpcCode.CurrentConsultationNotFound, "CurrentConsultationNotFound");
- }
- else if (current.Status == LiveRoomStatus.Initiating)
- {
- ThrowRpcException(CustomerRpcCode.CurrentConsultationInProcess, "CurrentConsultationInProcess");
- }
- //处理会诊中。切换下一个病人时,针对会 待会诊和已过期的会诊单进行缓存更新处理
- var consultationRecord = CacheMaintenance.Instance.Get<IConsultationRecordManager>().Get(current.LiveRoomCode);
- if (consultationRecord != null && (consultationRecord.ConsultationStatus == (int)TransactionStatusEnum.ToStart ||
- consultationRecord.ConsultationStatus == (int)TransactionStatusEnum.Expired))
- {
- var consultationStatus = TransactionStatusEnum.InProgress;
- await _consultationRecordDBService.UpdateConsultationStatusAsync(current.LiveRoomCode, consultationStatus);
- CacheMaintenance.Instance.Get<IConsultationRecordManager>().Remove(current.LiveRoomCode);
- }
- await _rtcService.ChangeRoomAsync(new ChangeRoomRequest
- {
- LiveRoomCode = original.LiveRoomCode,
- UserCode = userCode,
- OriginalCode = request.OriginalCode,
- CurrentCode = request.CurrentCode,
- });
- _liveConsultationHeartRateManager.AddOrUpdate(userToken.Code, userCode, userToken.AccountName, current.LiveRoomCode);
- //修改预约记录状态
- var reportRequest = new GetReportByRecordCodeDBRequest { RecordCode = original.LiveRoomCode };
- var report = await _reportDBService.GetReportByRecordCodeAsync(reportRequest);
- var members = await _rtcService.GetLiveMemberInfosAsync(new GetLiveMemberInfosRequest { LiveRoomCode = current.LiveRoomCode });
- if (report != null && report.Count > 0)
- {
- await _consultationRecordDBService.UpdateConsultationStatusAsync(original.LiveRoomCode, TransactionStatusEnum.End);
- }
- else
- {
- consultationRecord = CacheMaintenance.Instance.Get<IConsultationRecordManager>().Get(roomId);
- if (consultationRecord != null)
- {
- var consultationStatus = TransactionStatusEnum.ToStart;
- if (LiveMemberHasJoined(members, consultationRecord.ExpertUserCode) && LiveMemberHasJoined(members, consultationRecord.ApplyUserCode))
- {
- consultationStatus = TransactionStatusEnum.PendingReport;
- }
- await _consultationRecordDBService.UpdateConsultationStatusAsync(original.LiveRoomCode, consultationStatus);
- }
- }
- var result = new ChangeConsultationResult
- {
- ConsultationCode = current.LiveRoomCode,
- RoomNo = current.RtcRoomId,
- InitiatorCode = current.InitiatorCode,
- MemberLiveDatas = members,
- };
- return result;
- }
- // /// <summary>
- // /// 更改调参状态
- // /// </summary>
- // /// <param name="request">请求实体</param>
- // /// <returns>true</returns>
- // /// <show>false</show>
- // public async Task<bool> ChangeConsultationControllingStateAsync(ChangeConsultationControllingStateRequest request)
- // {
- // var userCode = request.UserCode;
- // var isControllingParameter = request.IsControllingParameter;
- // await _rtcService.ChangeControllingStateAsync(new ChangeControllingStateRequest
- // {
- // UserCode = userCode,
- // DeviceCode = request.DeviceCode,
- // IsControllingParameter = request.IsControllingParameter,
- // });
- // return await Task.FromResult(true);
- // }
- /// <summary>
- /// 发送会诊提醒短信通知
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- private async Task<bool> SendSmsReminderConsultationAsync(IList<string> clientIds, string time, string patientName, DateTime startTime, DateTime endTime)
- {
- try
- {
- var startEndTimeStr = startTime.ToLocalTime().ToString("yyyy-MM-dd HH:mm") + "-" + endTime.ToLocalTime().ToString("HH:mm");
- var phones = await GetMobileList(clientIds);
- return await _smsService.GeneralMessageAsync(phones, _reminderSmsTemplateId, new List<string> { time, patientName, startEndTimeStr });
- }
- catch (System.Exception ex)
- {
- Logger.WriteLineWarn("LiveConsultationService-SendSmsReminderConsultationAsync:" + "patientName" + patientName + ":" + ex);
- return false;
- }
- }
- private async Task<List<string>> GetMobileList(IList<string> clientIds)
- {
- var users = await _userDBService.FindUserListByUserCodesAsync(clientIds.ToList());
- return users.Where(c => !string.IsNullOrEmpty(c.Phone)).Select(v => v.Phone).Distinct().ToList();
- }
- /// <summary>
- /// 发送会诊邀请短信通知
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- private async Task<bool> SendSmsInviteConsultationAsync(IList<string> clientIds, string inviter, string patientName, DateTime startTime, DateTime endTime)
- {
- try
- {
- var startEndTimeStr = startTime.ToLocalTime().ToString("yyyy-MM-dd HH:mm") + "-" + endTime.ToLocalTime().ToString("HH:mm");
- var phones = await GetMobileList(clientIds);
- return await _smsService.GeneralMessageAsync(phones, _inviteSmsTemplateId, new List<string> { inviter, patientName, startEndTimeStr });
- }
- catch (System.Exception ex)
- {
- Logger.WriteLineWarn("LiveConsultationService-SendSmsInviteConsultationAsync:" + "patientName" + patientName + ":" + ex);
- return false;
- }
- }
- /// <summary>
- /// 发送预约申请提交短信通知
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- private async Task<bool> SendSmsSubmitApplyConsultationAsync(IList<string> clientIds, string inviter, string patientName, DateTime consultationTime, string orgName)
- {
- try
- {
- var consultationTimeStr = consultationTime.ToLocalTime().ToString("yyyy-MM-dd");
- var phones = await GetMobileList(clientIds);
- return await _smsService.GeneralMessageAsync(phones, _submitSmsTemplateId, new List<string> { inviter, patientName, consultationTimeStr, orgName });
- }
- catch (System.Exception ex)
- {
- Logger.WriteLineWarn("LiveConsultationService-SendSmsSubmitApplyConsultationAsync:" + "patientName" + patientName + ":" + ex.ToString());
- return false;
- }
- }
- /// <summary>
- /// 呼叫急诊专家
- /// </summary>
- /// <param name="roomId"></param>
- /// <param name="doctors"></param>
- /// <returns></returns>
- private void CallEmergencyDoctors(string roomId, IList<UserDTO> doctors, int rtcRoomId, LiveConsultationMember initiator)
- {
- var consultationRecord = CacheMaintenance.Instance.Get<IConsultationRecordManager>().Get(roomId);
- if (consultationRecord != null && consultationRecord.IsEmergency && string.IsNullOrWhiteSpace(consultationRecord.ExpertUserCode))
- {
- Task.Run(async () =>
- {
- Logger.WriteLineInfo($"LiveConsultationService CallEmergencyDoctors, roomId:{roomId}, name:{consultationRecord.PatientCode}");
- await UpdateEmergencyStateAsync(roomId, EmergencyConsultationStatus.Initiating);
- var status = EmergencyConsultationStatus.Initiating;
- foreach (var doctor in doctors)
- {
- status = GetEmergencyStatus(roomId);
- if (status == EmergencyConsultationStatus.Accepted
- || status == EmergencyConsultationStatus.Cancelled)
- {
- break;
- }
- //开始呼叫
- Logger.WriteLineInfo($"LiveConsultationService CallEmergencyDoctors, roomId:{roomId}, doctor:{doctor.DisplayName}");
- var emergencyCallNotification = new EmergencyCallNotification
- {
- ConsultationCode = roomId,
- RoomNo = rtcRoomId,
- Timeout = _emergencyTimeout,
- Initiator = initiator
- };
- var broadcastNotificationRequest = new BroadcastNotificationRequest()
- {
- ClientIds = new List<string> { doctor.UserCode },
- Message = emergencyCallNotification,
- JsonMessage = Newtonsoft.Json.JsonConvert.SerializeObject(emergencyCallNotification),
- NotificationType = emergencyCallNotification.NotificationType,
- TransactionType = TransactionTypeEnum.Consultion,
- RelevanceCode = consultationRecord.Code,
- ReceiverType = ApplicantTypeEnum.Client
- };
- await _notificationService.BroadcastMessageAsync(broadcastNotificationRequest);
- for (var s = 0; s < _emergencyTimeout; s++)
- {
- await Task.Delay(1000);
- status = GetEmergencyStatus(roomId);
- if (status == EmergencyConsultationStatus.Accepted
- || status == EmergencyConsultationStatus.Cancelled
- || status == EmergencyConsultationStatus.Rejected)
- {
- break;
- }
- }
- }
- if (status == EmergencyConsultationStatus.Initiating || status == EmergencyConsultationStatus.Rejected)
- {
- await _rtcService.CloseAsync(new CloseRequest
- {
- LiveRoomCode = roomId,
- UserCode = initiator.Id,
- });
- await _consultationRecordDBService.UpdateConsultationStatusAsync(roomId, TransactionStatusEnum.ToStart);
- //急诊呼叫失败
- var callFailedNotification = new EmergencyCallFailedNotification
- {
- ConsultationCode = roomId,
- };
- var broadcastNotificationRequest = new BroadcastNotificationRequest()
- {
- ClientIds = new List<string> { initiator.Id },
- Message = callFailedNotification,
- JsonMessage = Newtonsoft.Json.JsonConvert.SerializeObject(callFailedNotification),
- NotificationType = callFailedNotification.NotificationType,
- TransactionType = TransactionTypeEnum.Consultion,
- RelevanceCode = consultationRecord.Code,
- ReceiverType = ApplicantTypeEnum.Client
- };
- await _notificationService.BroadcastMessageAsync(broadcastNotificationRequest);
- }
- });
- }
- }
- /// <summary>
- /// 查询急诊专家集合
- /// </summary>
- /// <param name="organizationCode">当前操作人所在机构</param>
- /// <returns></returns>
- private async Task<List<UserDTO>> GetEmergencyDoctorsAsync(string organizationCode)
- {
- var getOrganizationDBRequest = new GetOrganizationDBRequest
- {
- OrganizationCode = organizationCode
- };
- var organization = await _organizationDBService.GetOrganizationDetailAsync(getOrganizationDBRequest);
- if (organization == null || organization.ReferralOrganizations == null || !organization.ReferralOrganizations.Any())
- {
- //未设置会诊医院
- ThrowRpcException(CustomerRpcCode.ReferralOrganizationsIsEmpty, "Referral Organizations Is Empty");
- }
- var emergencyOrgCode = organization.ParentCode;
- if (organization.ReferralOrganizations.All(x => x.OrganizationCode != organization.ParentCode))
- {
- emergencyOrgCode = organization.ReferralOrganizations.FirstOrDefault().OrganizationCode;
- }
- if (string.IsNullOrWhiteSpace(emergencyOrgCode))
- {
- //未设置会诊医院
- ThrowRpcException(CustomerRpcCode.ReferralOrganizationsIsEmpty, "Referral Organizations Is Empty");
- }
- var orgList = await _organizationDBService.SearchOrgByRootCodesAsync(new List<string> { emergencyOrgCode });
- if (orgList.Any() != true)
- {
- return new List<UserDTO>();
- }
- var orgCodes = orgList.Select(x => x.OrganizationCode).ToList();
- var doctors = await _userDBService.FindUserListByOrganizationCodesAsync(orgCodes);
- if (doctors.Any() != true)
- {
- return new List<UserDTO>();
- }
- var tokenManager = CacheMaintenance.Instance.Get<ITokensManager>();
- var userCodes = doctors.Select(x => x.UserCode).ToList();
- var doctorInfos = await _rtcService.GetLiveMemberStatusInfosAsync(new GetLiveMemberStatusInfosRequest { UserCodes = userCodes });
- var emergencyDoctors = doctors.Where(d =>
- {
- if (!d.RoleCodes.Contains("Role_CertifiedExpert") && !d.RoleCodes.Contains("Role_CertifiedPhysician"))
- {
- return false;
- }
- var info = doctorInfos.FirstOrDefault(x => x.Code == d.UserCode);
- if (info == null || info.UserStatusType == UserStatusEnum.NotOnline)
- {
- return false;
- }
- if (info.UserStatusType == UserStatusEnum.IsBusy)
- {
- return false;
- }
- return true;
- });
- return emergencyDoctors?.ToList() ?? new List<UserDTO>();
- }
- private void StartCheckEmergencyDoctorTimeout(string roomId, string initiatorCode, string expertCode)
- {
- Task.Run(async () =>
- {
- await Task.Delay(60 * 1000);
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- if (room != null && room.Status == LiveRoomStatus.Initiating)
- {
- var members = await _rtcService.GetLiveMemberInfosAsync(new GetLiveMemberInfosRequest { LiveRoomCode = roomId });
- if (members == null || !members.Any(x => x.Id == expertCode && x.Status == LiveConsultationMemberStatus.Joined))
- {
- //专家超时未接受,自动结束会诊
- await _rtcService.CloseAsync(new CloseRequest
- {
- LiveRoomCode = roomId,
- UserCode = initiatorCode,
- });
- await _consultationRecordDBService.UpdateConsultationStatusAsync(roomId, TransactionStatusEnum.ToStart);
- }
- }
- });
- }
- private async Task<EmergencyConsultationStatus> UpdateEmergencyStateAsync(string roomId, EmergencyConsultationStatus status)
- {
- await _consultationRecordDBService.UpdateEmergencyStatusAsync(roomId, status);
- return status;
- }
- private EmergencyConsultationStatus GetEmergencyStatus(string roomId)
- {
- try
- {
- var status = CacheMaintenance.Instance.Get<IConsultationRecordManager>().Get(roomId).EmergencyStatus;
- return (EmergencyConsultationStatus)status;
- }
- catch (Exception ex)
- {
- return EmergencyConsultationStatus.Default;
- }
- }
- /// <summary>
- /// 判断是否已在其它设备进入房间
- /// </summary>
- /// <param name="recordCode"></param>
- /// <param name="userCode"></param>
- /// <param name="loginSource"></param>
- /// <returns></returns>
- private async Task<bool> IsJoinedByOtherDevice(string recordCode, string userCode, LoginSource loginSource)
- {
- var liveMember = await _rtcService.GetLiveMemberByRoomIdAsync(new GetLiveMemberByRoomIdRequest
- {
- LiveRoomCode = recordCode,
- UserCode = userCode,
- });
- if (liveMember == null || liveMember.MemberType == LiveMemberEnum.Device)
- {
- return false;
- }
- var loginSourceList = GetLoginSource(loginSource);
- return !loginSourceList.Contains(liveMember.LoginSource);
- }
- private List<LoginSource> GetLoginSource(LoginSource loginSource)
- {
- var list = new List<LoginSource>();
- switch (loginSource)
- {
- case LoginSource.PC:
- case LoginSource.Web:
- list.Add(LoginSource.PC);
- list.Add(LoginSource.Web);
- break;
- case LoginSource.Mobile:
- case LoginSource.Pad:
- list.Add(LoginSource.Mobile);
- list.Add(LoginSource.Pad);
- break;
- default:
- list.Add(loginSource);
- break;
- }
- return list;
- }
- private bool LiveMemberHasJoined(List<LiveConsultationMember> members, string memberCode)
- {
- if (members != null && members.Any())
- {
- if (!string.IsNullOrWhiteSpace(memberCode))
- {
- return members.Any(x => x.Id == memberCode && (x.Status == LiveConsultationMemberStatus.Accepted || x.Status == LiveConsultationMemberStatus.Joined || x.Status == LiveConsultationMemberStatus.Left));
- }
- }
- return false;
- }
- /// <summary>
- /// 设备会诊中加入房间
- /// </summary>
- /// <param name="request">The request</param>
- /// <returns></returns>
- public async Task<LiveConsultationMember> DeviceJoinInLiveConsultationAsync(JoinLiveConsultationRequest request)
- {
- var roomId = request.ConsultationCode;
- var result = new LiveConsultationMember();
- try
- {
- //获取房间缓存
- using (await _lockManager.Acquire(roomId))
- {
- var cacheConsultationRecordDTO = CacheMaintenance.Instance.Get<IConsultationRecordManager>().Get(request.ConsultationCode) ?? new CacheConsultationRecordDTO();
- //验证
- var deviceTokenInfo = CacheMaintenance.Instance.Get<ITokensManager>().Where(dx => dx.ClientId == cacheConsultationRecordDTO.DeviceCode)?.FirstOrDefault() ?? new Token();
- if (!deviceTokenInfo.IsOnline)
- {
- ThrowRpcException(CustomerRpcCode.DeviceNotOnline, "Device not online");
- }
- var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
- if (room == null)
- {
- ThrowRpcException(CustomerRpcCode.LiveConsultationNotFound, "LiveConsultationNotFound");
- }
- else if (room.Status != LiveRoomStatus.Initiating)
- {
- ThrowRpcException(CustomerRpcCode.ConsultationNotInProcess, "ConsultationNotInProcess");
- }
- //如果房间中都设备已经在推流,joined,就比较已经加入房间了,返回已有的信息
- var deviceLiveRoom = room.DeviceInfos?.FirstOrDefault(c => c.Code == cacheConsultationRecordDTO.DeviceCode);
- if (deviceLiveRoom == null)
- {
- ThrowRpcException(CustomerRpcCode.DeviceNotExist, "Device not exist");
- }
- if (deviceLiveRoom.Status == LiveMemberStatus.Joined)
- {
- var liveMemberReq = new GetLiveMemberInfosRequest()
- {
- LiveRoomCode = roomId
- };
- var liveMemberInfoList = await _rtcService.GetLiveMemberInfosAsync(liveMemberReq);
- if (liveMemberInfoList?.Count > 0)
- {
- result = liveMemberInfoList.FirstOrDefault(c => c.Id == cacheConsultationRecordDTO.DeviceCode) ?? new LiveConsultationMember();
- return result;
- }
- }
- //验证超声机空闲状态
- var memberRequest = new GetLiveMemberStatusInfosRequest()
- {
- UserCodes = new List<string>() { cacheConsultationRecordDTO.DeviceCode }
- };
- var stautsInfo = await _rtcService.GetLiveMemberStatusInfosAsync(memberRequest);
- var curDeviceInfo = new LiveMemberStatusDTO();
- if (stautsInfo?.Count > 0)
- {
- curDeviceInfo = stautsInfo.FirstOrDefault(c => c.Code == cacheConsultationRecordDTO.DeviceCode) ?? new LiveMemberStatusDTO();
- }
- if (curDeviceInfo == null || (curDeviceInfo.UserStatusType == UserStatusEnum.IsBusy && curDeviceInfo.LiveRoomCode != roomId))
- {
- Logger.WriteLineWarn($"LiveConsultationService deviceCode:[{cacheConsultationRecordDTO.DeviceCode}] Join in consultation live failed, roomId:{roomId}");
- ThrowRpcException(CustomerRpcCode.DeviceIsBusy, "Device is busy");
- }
- var joinLiveMemberInfo = await _rtcService.DeviceJoinInAsync(new DeviceJoinInRequest
- {
- LiveRoomCode = roomId,
- DeviceCode = cacheConsultationRecordDTO.DeviceCode
- });
- //从rtc中取 device信息返回给客户端
- var req = new GetLiveMemberInfosRequest()
- {
- LiveRoomCode = roomId
- };
- var liveMemberList = await _rtcService.GetLiveMemberInfosAsync(req);
- if (liveMemberList?.Count > 0)
- {
- result = liveMemberList.FirstOrDefault(c => c.Id == cacheConsultationRecordDTO.DeviceCode) ?? new LiveConsultationMember();
- //同时转发给其他用户
- var message = new HeartRateJoinConsultationNotification
- {
- ConsultationCode = roomId,
- Joiner = new LiveConsultationJoinerInfo
- {
- Id = result.Id,
- Name = result.Name,
- HeadImageUrl = result.HeadImageToken,
- Mute = result.Mute,
- VideoOpend = result.VideoOpend,
- SortLevel = result.SortLevel,
- LiveData = result.LiveData,
- IsOnline = result.IsOnline,
- IsOldPlatform = deviceTokenInfo != null && deviceTokenInfo.IsOnline && deviceTokenInfo.IsOldPlatform,
- ConsultationDeviceInfo = new LiveConsultationJoinDeviceInfo()
- {
- MergedChannel = result.MergedChannel,
- MergedVideoOutputWidth = result.MergedVideoOutputWidth,
- MergedVideoOutputHeight = result.MergedVideoOutputHeight,
- VideoDeviceOutputList = result.VideoDeviceInfos,
- DeviceCode = cacheConsultationRecordDTO.DeviceCode,
- DeviceSign = "",
- IsOldPlatform = deviceTokenInfo != null && deviceTokenInfo.IsOnline && deviceTokenInfo.IsOldPlatform,
- LiveProtocol = EnvironmentConfigs.General.LiveProtocolDetail<TransactionStatusEnum>(),
- }
- }
- };
- var userInfos = liveMemberList.Where(c => c.MemberType == LiveMemberEnum.User && c.IsOnline == true);
- if (userInfos?.Any() == true)
- {
- //开启独立队列
- var openNotifyQueueRequest = new WingInterfaceLibrary.Request.Notification.OpenNotifyQueueRequest { Module = roomId };
- var msgQueueId = await _notificationService.OpenNotifyQueueAsync(openNotifyQueueRequest);
- var clientIds = userInfos.Select(x => x.Id).ToList();
- var tokenInfos = CacheMaintenance.Instance.Get<ITokensManager>().Where(x => clientIds.Contains(x.ClientId));
- if (tokenInfos != null && tokenInfos.Any())
- {
- Logger.WriteLineInfo($"DeviceJoinInLiveConsultationAsync PushMessage, roomId:{roomId}, type:{message.NotificationType.ToString()}, receivers:{string.Join(";", tokenInfos.Select(x => x.AccountName).Distinct())}");
- }
- var notificationRequest = new BroadcastNotificationRequest
- {
- MsgQueueId = msgQueueId,
- ClientIds = clientIds,
- Message = message,
- JsonMessage = Newtonsoft.Json.JsonConvert.SerializeObject(message),
- NotificationType = message.NotificationType,
- TransactionType = TransactionTypeEnum.Consultion,
- RelevanceCode = roomId,
- ReceiverType = ApplicantTypeEnum.Client,
- WSConnectType = WSConnectTypeEnum.ConsultationSecondWindow,
- IsNeedSyn = true
- };
- var res = await _notificationService.BroadcastMessageAsync(notificationRequest);
- }
- }
- }
- }
- catch (Exception ex)
- {
- Logger.WriteLineInfo($"LiveConsultationService DeviceJoinInLiveConsultationAsync Error, roomId:{roomId}, ex:{ex}");
- }
- return result;
- }
- public async Task<bool> SyncBatchConsultationAsync(SyncBatchConsultationRequest syncBatchConsultationRequest)
- {
- await _consultationRecordDBService.SyncBatchConsultationDBAsync(syncBatchConsultationRequest);
- return true;
- }
- /// <summary>
- /// 查询会诊报告质控项枚举列表
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- public async Task<GetConsultationQualityTypeResult> GetConsultationReportQualityTypeAsync(GetConsultationReportQualityTypeRequest request)
- {
- var getConsultationQualityTypeResult = new GetConsultationQualityTypeResult();
- getConsultationQualityTypeResult.QualityTypeList = new List<QualityTypeDetail>();
- try
- {
- var jsonContent = WingServerCommon.ResourceManage.ResourceManager.GetSetting(request.Language + "consultation");
- if (string.IsNullOrWhiteSpace(jsonContent))
- {
- jsonContent = WingServerCommon.ResourceManage.ResourceManager.GetSetting("en-US" + "consultation");
- }
- JObject json = JObject.Parse(jsonContent);
- foreach (QualityType qualityType in Enum.GetValues(typeof(QualityType)))
- {
- string name = Enum.GetName(typeof(QualityType), qualityType);
- int key = (int)qualityType;
- if (key == 0)
- {
- continue;
- }
- QualityTypeDetail detail = new QualityTypeDetail();
- detail.Key = key;
- detail.Description = json["Language"][name]?.ToString();
- getConsultationQualityTypeResult.QualityTypeList.Add(detail);
- }
- }
- catch (Exception ex)
- {
- Logger.WriteLineError($"LiveConsultationService GetConsultationReportQualityTypeAsync,Language:{request.Language},error{ex.ToString()}");
- }
- return getConsultationQualityTypeResult;
- }
- /// <summary>
- /// 新增会诊报告质控
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- public async Task<bool> AddConsultationReportQualityAsync(AddConsultationReportQualityRequest request)
- {
- try
- {
- string consultationRecordCode = request.ConsultationRecordCode;
- string reportCode = request.ReportCode;
- int qualityTypeKey = request.QualityTypeKey;
- var findDBRequest = new GetReportByCodeDBRequest { ReportCode = request.ReportCode };
- var reportInfo = await _reportDBService.GetReportByCodeAsync(findDBRequest);
- if (reportInfo.QualityType != QualityType.None)
- {
- //此报告已质控错误码
- ThrowRpcException(CustomerRpcCode.ConsultationReportQualityControlled, "ConsultationReportQualityControlled");
- }
- var reportList = await _reportDBService.GetReportsByRecordCodesAsync(new List<string> { consultationRecordCode });
- if (reportList.Any(x => x.QualityType != QualityType.None))
- {
- //该会诊有其他报告已做质控
- ThrowRpcException(CustomerRpcCode.ConsultationOtherReportQualityControlled, "ConsultationOtherReportQualityControlled");
- }
- reportInfo.QualityType = (QualityType)qualityTypeKey;
- if (reportInfo.QualityType == QualityType.Qualified)
- {
- reportInfo.QualifiedState = QualifiedState.Qualified;
- }
- else
- {
- reportInfo.QualifiedState = QualifiedState.UnQualified;
- }
- //修改报告质控信息
- var saveReportQualityInfoDBRequest = new SaveReportQualityInfoDBRequest();
- saveReportQualityInfoDBRequest.ReportCode = reportInfo.ReportCode;
- saveReportQualityInfoDBRequest.QualifiedState = reportInfo.QualifiedState;
- saveReportQualityInfoDBRequest.QualityType = reportInfo.QualityType;
- await _reportDBService.SaveReportQualityInfoAsync(saveReportQualityInfoDBRequest);
- //修改会诊单质控信息
- var consultationRequest = new ConsultationRecordCodeDBRequest { Code = consultationRecordCode };
- var consultationRecord = await _consultationRecordDBService.FindConsultationRecordByCodeAsync(consultationRequest);
- consultationRecord.QualifiedState = reportInfo.QualifiedState;
- consultationRecord.QualityType = reportInfo.QualityType;
- await _consultationRecordDBService.UpdateConsultationRecordAsync(consultationRecord);
- return true;
- }
- catch (RpcException rpcEx)
- {
- throw rpcEx;
- }
- catch (Exception ex)
- {
- Logger.WriteLineError($"LiveConsultationService AddConsultationReportQualityAsync,ConsultationRecordCode:{request.ConsultationRecordCode},reportCode:{request.ReportCode},error:{ex.ToString()}");
- return false;
- }
- }
- /// <summary>
- /// 修改会诊报告质控
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- public async Task<bool> ModifyConsultationReportQualityAsync(ModifyConsultationReportQualityRequest request)
- {
- try
- {
- string consultationRecordCode = request.ConsultationRecordCode;
- string reportCode = request.ReportCode;
- int qualityTypeKey = request.QualityTypeKey;
- var findDBRequest = new GetReportByCodeDBRequest { ReportCode = request.ReportCode };
- var reportInfo = await _reportDBService.GetReportByCodeAsync(findDBRequest);
- if (reportInfo.QualityType == QualityType.None)
- {
- //此报告还未做质控错误码
- ThrowRpcException(CustomerRpcCode.ConsultationReportNotQualityControl, "ConsultationReportNotQualityControl");
- }
- reportInfo.QualityType = (QualityType)qualityTypeKey;
- if (reportInfo.QualityType == QualityType.Qualified)
- {
- reportInfo.QualifiedState = QualifiedState.Qualified;
- }
- else
- {
- reportInfo.QualifiedState = QualifiedState.UnQualified;
- }
- //修改报告质控信息
- var saveReportQualityInfoDBRequest = new SaveReportQualityInfoDBRequest();
- saveReportQualityInfoDBRequest.ReportCode = reportInfo.ReportCode;
- saveReportQualityInfoDBRequest.QualifiedState = reportInfo.QualifiedState;
- saveReportQualityInfoDBRequest.QualityType = reportInfo.QualityType;
- await _reportDBService.SaveReportQualityInfoAsync(saveReportQualityInfoDBRequest);
- //修改会诊单质控信息
- var consultationRequest = new ConsultationRecordCodeDBRequest { Code = consultationRecordCode };
- var consultationRecord = await _consultationRecordDBService.FindConsultationRecordByCodeAsync(consultationRequest);
- consultationRecord.QualifiedState = reportInfo.QualifiedState;
- consultationRecord.QualityType = reportInfo.QualityType;
- await _consultationRecordDBService.UpdateConsultationRecordAsync(consultationRecord);
- return true;
- }
- catch (RpcException rpcEx)
- {
- throw rpcEx;
- }
- catch (Exception ex)
- {
- Logger.WriteLineError($"LiveConsultationService ModifyConsultationReportQualityAsync,ConsultationRecordCode:{request.ConsultationRecordCode},reportCode:{request.ReportCode},error:{ex.ToString()}");
- return false;
- }
- }
- /// <summary>
- /// 删除会诊报告质控
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- public async Task<bool> DeleteConsultationReportQualityAsync(DeleteConsultationReportQualityRequest request)
- {
- try
- {
- string consultationRecordCode = request.ConsultationRecordCode;
- string reportCode = request.ReportCode;
- var findDBRequest = new GetReportByCodeDBRequest { ReportCode = request.ReportCode };
- var reportInfo = await _reportDBService.GetReportByCodeAsync(findDBRequest);
- var reportList = await _reportDBService.GetReportsByRecordCodesAsync(new List<string> { consultationRecordCode });
- reportInfo.QualityType = QualityType.None;
- reportInfo.QualifiedState = QualifiedState.UnSet;
- //修改报告质控信息
- var saveReportQualityInfoDBRequest = new SaveReportQualityInfoDBRequest();
- saveReportQualityInfoDBRequest.ReportCode = reportInfo.ReportCode;
- saveReportQualityInfoDBRequest.QualifiedState = reportInfo.QualifiedState;
- saveReportQualityInfoDBRequest.QualityType = reportInfo.QualityType;
- await _reportDBService.SaveReportQualityInfoAsync(saveReportQualityInfoDBRequest);
- //修改会诊单质控信息
- var consultationRequest = new ConsultationRecordCodeDBRequest { Code = consultationRecordCode };
- var consultationRecord = await _consultationRecordDBService.FindConsultationRecordByCodeAsync(consultationRequest);
- consultationRecord.QualifiedState = reportInfo.QualifiedState;
- consultationRecord.QualityType = reportInfo.QualityType;
- await _consultationRecordDBService.UpdateConsultationRecordAsync(consultationRecord);
- return true;
- }
- catch (Exception ex)
- {
- Logger.WriteLineError($"LiveConsultationService DeleteConsultationReportQualityAsync,ConsultationRecordCode:{request.ConsultationRecordCode},reportCode:{request.ReportCode},error:{ex.ToString()}");
- return false;
- }
- }
- }
- }
|