DeviceService.cs 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using JsonRpcLite.Services;
  6. using WingInterfaceLibrary.DTO.Device;
  7. using WingInterfaceLibrary.Interface;
  8. using WingInterfaceLibrary.Request.Device;
  9. using WingInterfaceLibrary.DTO.Dictionary;
  10. using WingServerCommon.Log;
  11. using WingServerCommon.Service;
  12. using WingInterfaceLibrary.Interface.DBInterface;
  13. using WingInterfaceLibrary.DB.Request;
  14. using WingServerCommon.Mapper;
  15. using WingInterfaceLibrary.Request;
  16. using WingInterfaceLibrary.Request.Authentication;
  17. using WingInterfaceLibrary.DTO.User;
  18. using WingInterfaceLibrary.DTO.Management;
  19. using WingServerCommon.Config;
  20. using WingDeviceService.Common;
  21. using WingInterfaceLibrary.Request.User;
  22. using WingInterfaceLibrary.Enum;
  23. using WingInterfaceLibrary.DTO.Organization;
  24. using WingInterfaceLibrary.DTO.DiagnosisModule;
  25. using WingServerCommon.Config.Parameters;
  26. using WingServerCommon.Interfaces.Cache;
  27. using WingInterfaceLibrary.LiveConsultation;
  28. namespace WingDeviceService.Service
  29. {
  30. /// <summary>
  31. /// 设备管理服务
  32. /// </summary>
  33. public partial class DeviceService : JsonRpcService, IDeviceService
  34. {
  35. private IUserDBService _userServiceProxy;
  36. private IDeviceInfoDBService _deviceInfoDBServiceProxy;
  37. private IAuthenticationService _authenticationService;
  38. private IOrganizationDBService _organizationDBService;
  39. private INotificationService _notificationService;
  40. private IRecordsInfoDBService _recordsInfoDBService;
  41. private IPatientInfoDBService _patientInfoDBService;
  42. private IDiagnosisModuleDBService _diagnosisModuleService;
  43. private IRemedicalService _remedicalService;
  44. private int _heartRateSeconds;
  45. private DeviceHeartRateManager _deviceHeartRateManager;
  46. /// <summary>
  47. /// Init service
  48. /// </summary>
  49. public override void Load(JsonRpcClientPool jsonRpcClientPool)
  50. {
  51. base.Load(jsonRpcClientPool);
  52. _userServiceProxy = GetProxy<IUserDBService>();
  53. _authenticationService = GetProxy<IAuthenticationService>();
  54. _deviceInfoDBServiceProxy = GetProxy<IDeviceInfoDBService>();
  55. _organizationDBService = GetProxy<IOrganizationDBService>();
  56. _notificationService = GetProxy<INotificationService>();
  57. _recordsInfoDBService = GetProxy<IRecordsInfoDBService>();
  58. _patientInfoDBService = GetProxy<IPatientInfoDBService>();
  59. _diagnosisModuleService = GetProxy<IDiagnosisModuleDBService>();
  60. _remedicalService = GetProxy<IRemedicalService>();
  61. _heartRateSeconds = ConfigurationManager.GetParammeter<IntParameter>("Device", "HeartRateSeconds").Value;
  62. _deviceHeartRateManager = new DeviceHeartRateManager(SetOnlineState);
  63. }
  64. /// <summary>
  65. /// 设备心跳
  66. /// </summary>
  67. /// <param name="request"></param>
  68. /// <returns></returns>
  69. public async Task<bool> HeartRateAsync(TokenRequest request)
  70. {
  71. _deviceHeartRateManager.AddOrUpdate(request.Token);
  72. var result = SetOnlineState(request.Token, true);
  73. return result;
  74. }
  75. private bool SetOnlineState(string token, bool isOnline)
  76. {
  77. return _authenticationService.SetOnlineStateAsync(new SetOnlineStateRequest { Token = token, IsOnline = isOnline }).Result;
  78. }
  79. /// <summary>
  80. /// 添加分享设备关联用户请求
  81. /// </summary>
  82. /// <param name="request"></param>
  83. /// <returns></returns>
  84. public async Task<bool> CreateShareDeviceToUserAsync(CreateShareDeviceToUserRequest request)
  85. {
  86. var userCodes = request.UserCodes;
  87. var deviceCode = request.DeviceCode;
  88. //检查设备编码不为空
  89. if (string.IsNullOrWhiteSpace(request.DeviceCode))
  90. {
  91. ThrowCustomerException(CustomerRpcCode.DeviceCodeIsEmpty, "Required parameter:DeviceCode cannot be empty");
  92. }
  93. if (userCodes == null || userCodes.Count <= 0)
  94. {
  95. ThrowCustomerException(CustomerRpcCode.UserCodeEmptyError, "Required parameter:UserCodes cannot be empty");
  96. }
  97. //查询设备对象
  98. var deviceDb = await _deviceInfoDBServiceProxy.FindDeviceInfoByCodeAsync(deviceCode);
  99. if (deviceDb == null)
  100. {
  101. ThrowCustomerException(CustomerRpcCode.NoExistDevice, "Device does not exist");
  102. }
  103. foreach (var userCode in userCodes)
  104. {
  105. var existUser = await _userServiceProxy.FindUserByCodeAsync(userCode);
  106. if (existUser == null)
  107. {
  108. ThrowCustomerException(CustomerRpcCode.UserNotExistError, "User does not exist");
  109. }
  110. }
  111. await _userServiceProxy.BingDevicesToUsersAsync(new BingDevicesToUsersRequest
  112. {
  113. DeviceCodes = new List<string> { deviceCode },
  114. UserCodes = userCodes.ToList()
  115. });
  116. return true;
  117. }
  118. /// <summary>
  119. /// 根据设备code获取设备信息
  120. /// </summary>
  121. /// <param name="request">设备code请求实体</param>
  122. /// <returns>返回查询到的设备对象信息</returns>
  123. public async Task<DeviceExtendInfoDTO> GetDeviceInfoAsync(GetDeviceRequest request)
  124. {
  125. //验证
  126. if (string.IsNullOrWhiteSpace(request.DeviceCode))
  127. {
  128. ThrowCustomerException(CustomerRpcCode.DeviceCodeEmpty, "DeviceCode empty error");
  129. }
  130. var deviceDb = await _deviceInfoDBServiceProxy.FindDeviceInfoByCodeAsync(request.DeviceCode);
  131. if (deviceDb == null || deviceDb.DeviceCode != request.DeviceCode)
  132. {
  133. ThrowCustomerException(CustomerRpcCode.NoExistDevice, "Device does not exist");
  134. }
  135. //根据机构编号查询机构名称
  136. var organizationName = "";
  137. if (!string.IsNullOrEmpty(deviceDb.OrganizationCode))
  138. {
  139. var organization = await _organizationDBService.GetOrganizationDetailAsync(new GetOrganizationDBRequest { OrganizationCode = deviceDb.OrganizationCode });
  140. organizationName = organization?.OrganizationName ?? string.Empty;
  141. }
  142. //根据机构编号查询科室名称
  143. var departmentName = "";
  144. if (!string.IsNullOrEmpty(deviceDb.DepartmentCode))
  145. {
  146. var department = await _organizationDBService.GetOrganizationDetailAsync(new GetOrganizationDBRequest { OrganizationCode = deviceDb.DepartmentCode });
  147. departmentName = department?.OrganizationName ?? string.Empty;
  148. }
  149. //是否在线 todo
  150. var deviceTypeModel = await _deviceInfoDBServiceProxy.FindDictionaryByCodeAsync(deviceDb.DeviceType);
  151. var result = new DeviceExtendInfoDTO()
  152. {
  153. DepartmentName = departmentName,
  154. OrganizationName = organizationName,
  155. IsOnline = await GetDeviceOnlineState(deviceDb.DeviceCode),
  156. DeviceCode = deviceDb.DeviceCode,
  157. SerialNumber = deviceDb.SerialNumber,
  158. Name = deviceDb.Name,
  159. Description = deviceDb.Description,
  160. DeviceModel = deviceDb.DeviceModel,
  161. DeviceType = deviceDb.DeviceType,
  162. HeadPicUrl = deviceDb.HeadPicUrl,
  163. DeviceSoftwareVersion = deviceDb.DeviceSoftwareVersion,
  164. SDKSoftwareVersion = deviceDb.SDKSoftwareVersion,
  165. OrganizationCode = deviceDb.OrganizationCode,
  166. DepartmentCode = deviceDb.DepartmentCode,
  167. ShortCode = deviceDb.ShortCode,
  168. LanguageConfigs = deviceTypeModel.LanguageConfigs
  169. };
  170. return result;
  171. }
  172. /// <summary>
  173. /// 根据设备动态唯一码获取设备信息
  174. /// </summary>
  175. /// <param name="request"></param>
  176. /// <returns></returns>
  177. public async Task<DeviceExtendInfoDTO> GetDeviceByShortCodeAsync(GetDeviceByShortCodeRequest request)
  178. {
  179. //验证
  180. if (string.IsNullOrWhiteSpace(request.ShortCode))
  181. {
  182. ThrowCustomerException(CustomerRpcCode.ShortCodeEmpty, "ShortCode empty error");
  183. }
  184. var deviceDb = await _deviceInfoDBServiceProxy.FindDeviceInfoByShortCodeAsync(request.ShortCode);
  185. if (deviceDb == null || deviceDb.ShortCode != request.ShortCode)
  186. {
  187. ThrowCustomerException(CustomerRpcCode.NoExistDevice, "Device does not exist");
  188. }
  189. return await MapToExtendDTO(deviceDb);
  190. }
  191. public async Task<PageCollection<DeviceInfoDTO>> GetDeviceInfoPageAsync(PageFilterRequest request)
  192. {
  193. throw new System.NotImplementedException();
  194. }
  195. public async Task<bool> DeleteShareDeviceToUserAsync(DeleteShareDeviceToUserRequest request)
  196. {
  197. var userCodes = request.UserCodes;
  198. var deviceCode = request.DeviceCode;
  199. //检查设备编码不为空
  200. if (string.IsNullOrWhiteSpace(request.DeviceCode))
  201. {
  202. ThrowCustomerException(CustomerRpcCode.DeviceCodeIsEmpty, "Required parameter:DeviceCode cannot be empty");
  203. }
  204. //用户编码集合检查
  205. if (userCodes == null || userCodes.Count <= 0)
  206. {
  207. ThrowCustomerException(CustomerRpcCode.UserCodeEmptyError, "Required parameter:UserCodes cannot be empty");
  208. }
  209. //查询设备对象
  210. var deviceDb = await _deviceInfoDBServiceProxy.FindDeviceInfoByCodeAsync(deviceCode);
  211. if (deviceDb == null)
  212. {
  213. ThrowCustomerException(CustomerRpcCode.NoExistDevice, "Device does not exist");
  214. }
  215. var updateUsers = new List<TableDataItem<UserPasswordDTO>>();
  216. foreach (var userCode in userCodes)
  217. {
  218. var user = await _userServiceProxy.FindUserByCodeAsync(userCode);
  219. if (user != null)
  220. {
  221. if (user.BindDevices.Contains(deviceCode))
  222. {
  223. user.BindDevices.Remove(deviceCode);
  224. updateUsers.Add(new TableDataItem<UserPasswordDTO>()
  225. {
  226. Data = user.MappingTo<UserPasswordDTO>(),
  227. });
  228. }
  229. }
  230. }
  231. if (updateUsers.Count > 0)
  232. {
  233. var updateUsersDBRequest = new UpdateUsersDBRequest() { Users = updateUsers };
  234. await _userServiceProxy.UpdateUsersAsync(updateUsersDBRequest);
  235. }
  236. return true;
  237. }
  238. /// <summary>
  239. /// 机构设备移除-根据机构code和设备code解除其绑定关系
  240. /// </summary>
  241. /// <param name="request">移除设备请求实体</param>
  242. /// <returns>移除是否成功:true-成功;false-失败</returns>
  243. public async Task<bool> RemoveDeviceRelevancyAsync(RemoveDeviceRelevancyRequest request)
  244. {
  245. //验证
  246. if (string.IsNullOrWhiteSpace(request.DeviceCode) || string.IsNullOrWhiteSpace(request.OrganizationCode))
  247. {
  248. ThrowCustomerException(CustomerRpcCode.DeviceCodeOrOrganizationCodeEmpty, "DeviceCode Or OrganizationCode empty error");
  249. }
  250. var deviceDb = await _deviceInfoDBServiceProxy.FindDeviceInfoByCodeAsync(request.DeviceCode);
  251. if (deviceDb == null || deviceDb.OrganizationCode != request.OrganizationCode || deviceDb.DepartmentCode != request.DepartmentCode)
  252. {
  253. ThrowCustomerException(CustomerRpcCode.DeviceNotExist, "DeviceInfo not exist error");
  254. }
  255. //根据设备code和机构code查询相关数据,查到则删除关联
  256. if (!string.IsNullOrEmpty(deviceDb.DepartmentCode))
  257. {
  258. deviceDb.DepartmentCode = "";
  259. deviceDb.OrganizationCode = "";
  260. }
  261. else
  262. {
  263. deviceDb.OrganizationCode = "";
  264. }
  265. bool removeDeviceResult = await _deviceInfoDBServiceProxy.UpdateDeviceInfoByCodeAsync(deviceDb.DeviceCode, deviceDb, string.Empty, true);
  266. return removeDeviceResult;
  267. }
  268. private async Task<string> GetClientIdByTokenAsync(string token)
  269. {
  270. var request = new TokenRequest() { Token = token };
  271. var result = await _authenticationService.GetTokenAsync(request);
  272. return result.ClientId; //return User code
  273. }
  274. /// <summary>
  275. /// 查询个人名下所有设备列表接口
  276. /// </summary>
  277. /// <param name="request">查询个人名下所有设备列表请求实体</param>
  278. /// <returns>返回设备信息列表</returns>
  279. public async Task<PageCollection<DeviceExtendInfoDTO>> GetPersonDeviceListAsync(GetPersonDeviceRequest request)
  280. {
  281. //验证
  282. var userCode = await GetClientIdByTokenAsync(request.Token);
  283. //查询用户是否存在
  284. var userInfoDO = await _userServiceProxy.FindUserByCodeAsync(userCode);
  285. if (userInfoDO == null)
  286. {
  287. ThrowCustomerException(CustomerRpcCode.UserNotExistError, "User does not exist");
  288. }
  289. //查询用户的医院是否存在
  290. if (string.IsNullOrWhiteSpace(userInfoDO.OrganizationCode))
  291. {
  292. ThrowCustomerException(CustomerRpcCode.OrganizationNotExist, "Org does not exist");
  293. }
  294. var deviceInfoDOList = new List<DeviceInfoDTO>();
  295. if (!userInfoDO.IsDirector)
  296. {
  297. //普通用户,查询用户绑定的设备
  298. if (userInfoDO.BindDevices != null && userInfoDO.BindDevices.Any())
  299. {
  300. deviceInfoDOList = await _deviceInfoDBServiceProxy.FindDeviceInfoListByCodeListAsync(userInfoDO.BindDevices);
  301. }
  302. }
  303. else
  304. {
  305. //机构负责人
  306. deviceInfoDOList = await _deviceInfoDBServiceProxy.FindDeviceInfoListByOrganizationCodeAsync(userInfoDO.RootOrganizationCode);
  307. }
  308. if (!deviceInfoDOList.Any())
  309. {
  310. return new PageCollection<DeviceExtendInfoDTO>() { CurrentPage = request.PageIndex, PageSize = request.PageSize, DataCount = 0, PageData = new List<DeviceExtendInfoDTO>() };
  311. }
  312. var deviceList = await MapToExtendDTO(deviceInfoDOList);
  313. //条件筛选
  314. if (!string.IsNullOrWhiteSpace(request.DeviceType))
  315. {
  316. deviceList = deviceList.Where(d => d.DeviceType == request.DeviceType)?.ToList() ?? new List<DeviceExtendInfoDTO>();
  317. }
  318. if (!string.IsNullOrWhiteSpace(request.DeviceModel))
  319. {
  320. deviceList = deviceList.Where(d => d.DeviceModel == request.DeviceModel)?.ToList() ?? new List<DeviceExtendInfoDTO>();
  321. }
  322. if (!string.IsNullOrWhiteSpace(request.KeyWord))
  323. {
  324. var keyword = request.KeyWord.Trim().ToLower();
  325. deviceList = deviceList.Where(d => d.Name.ToLower().Contains(keyword) || d.ShortCode.ToLower().Contains(keyword))?.ToList() ?? new List<DeviceExtendInfoDTO>();
  326. }
  327. if (request.IsOnline != null)
  328. {
  329. deviceList = deviceList.Where(d => d.IsOnline == request.IsOnline)?.ToList() ?? new List<DeviceExtendInfoDTO>();
  330. }
  331. var pagedResult = new PageCollection<DeviceExtendInfoDTO>
  332. {
  333. CurrentPage = request.PageIndex,
  334. PageSize = request.PageSize,
  335. DataCount = deviceList.Count,
  336. PageData = deviceList.Skip(request.PageSize * (request.PageIndex - 1)).Take(request.PageSize)?.ToList() ?? new List<DeviceExtendInfoDTO>()
  337. };
  338. return pagedResult;
  339. }
  340. /// <summary>
  341. /// 绑定设备
  342. /// </summary>
  343. /// <param name="request"></param>
  344. /// <returns></returns>
  345. public async Task<bool> BindDeviceAsync(BindDeviceRequest request)
  346. {
  347. //验证
  348. var userCode = await GetClientIdByTokenAsync(request.Token);
  349. //查询用户是否存在
  350. var userInfoDO = await _userServiceProxy.FindUserByCodeAsync(userCode);
  351. if (userInfoDO == null)
  352. {
  353. ThrowCustomerException(CustomerRpcCode.UserNotExistError, "User does not exist");
  354. }
  355. var deviceDb = await _deviceInfoDBServiceProxy.FindDeviceInfoByShortCodeAsync(request.ShortCode);
  356. if (deviceDb == null)
  357. {
  358. ThrowCustomerException(CustomerRpcCode.DeviceNotExist, "Not find device");
  359. }
  360. if (userInfoDO.BindDevices != null && userInfoDO.BindDevices.Contains(deviceDb.DeviceCode))
  361. {
  362. ThrowCustomerException(CustomerRpcCode.HasAddedDevice, "The device has been Added");
  363. }
  364. try
  365. {
  366. var isInvented = (string.IsNullOrWhiteSpace(deviceDb.OrganizationCode) || deviceDb.OrganizationCode == $"invented_{deviceDb.ShortCode}") ? true : false;
  367. deviceDb.Name = request.Name;
  368. deviceDb.SerialNumber = request.SerialNumber;
  369. deviceDb.Description = request.Description;
  370. if (!string.IsNullOrEmpty(request.HeadPicUrl))
  371. {
  372. deviceDb.HeadPicUrl = request.HeadPicUrl.ToUrlToken();
  373. }
  374. deviceDb.DepartmentCode = request.DepartmentCode;
  375. deviceDb.IsAutoShared = request.IsAutoShared;
  376. deviceDb.OrganizationCode = request.OrganizationCode;
  377. await _deviceInfoDBServiceProxy.UpdateDeviceInfoByCodeAsync(deviceDb.DeviceCode, deviceDb, string.Empty);
  378. if (isInvented && !string.IsNullOrWhiteSpace(request.OrganizationCode)) //虚拟机构改为正常机构
  379. {
  380. var newOrgCode = string.IsNullOrWhiteSpace(request.DepartmentCode) ? request.OrganizationCode : request.DepartmentCode;
  381. //迁移数据超声机上传检查记录
  382. await _recordsInfoDBService.UpdateRecordsWithOrgCodeAsync(new List<string>() { deviceDb.DeviceCode }, newOrgCode);
  383. //迁移数据超声机上传病人
  384. await _patientInfoDBService.UpdatePatientWithOrgCodeAsync(new List<string>() { deviceDb.DeviceCode }, newOrgCode);
  385. }
  386. if (deviceDb.IsAutoShared)
  387. {
  388. var users = new List<UserDTO>();
  389. if (!string.IsNullOrEmpty(deviceDb.DepartmentCode))
  390. {
  391. users = await _userServiceProxy.FindUserListByOrganizationCodesAsync(new List<string> { deviceDb.DepartmentCode });
  392. }
  393. else
  394. {
  395. users = await _userServiceProxy.GetUserListAsync(new GetUserListDBRequest { OrganizationQueryType = OrganizationQueryTypeEnum.All, OrganizationCode = deviceDb.OrganizationCode });
  396. }
  397. var userCodes = users.Select(f => f.UserCode).ToList();
  398. await _userServiceProxy.BingDevicesToUsersAsync(new BingDevicesToUsersRequest
  399. {
  400. DeviceCodes = new List<string> { deviceDb.DeviceCode.ToString() },
  401. UserCodes = userCodes.Select(f => f.ToString()).ToList()
  402. });
  403. }
  404. return true;
  405. }
  406. catch (Exception ex)
  407. {
  408. Logger.WriteLineError($"BindDeviceAsync error {ex}");
  409. }
  410. return false;
  411. }
  412. /// <summary>
  413. /// 修改设备
  414. /// </summary>
  415. /// <param name="request"></param>
  416. /// <returns></returns>
  417. public async Task<bool> ModifyDeviceAsync(ModifyDeviceRequest request)
  418. {
  419. var deviceDb = await _deviceInfoDBServiceProxy.FindDeviceInfoByCodeAsync(request.DeviceCode);
  420. if (deviceDb == null)
  421. {
  422. ThrowCustomerException(CustomerRpcCode.DeviceNotExist, "Not find device");
  423. }
  424. if (string.IsNullOrWhiteSpace(request.Name))
  425. {
  426. ThrowCustomerException(CustomerRpcCode.DeviceNameEmpty, "Device name cannot be empty");
  427. }
  428. deviceDb.Name = request.Name;
  429. if (!string.IsNullOrWhiteSpace(request.HeadPicUrl))
  430. {
  431. deviceDb.HeadPicUrl = request.HeadPicUrl.ToUrlToken();
  432. }
  433. else
  434. {
  435. deviceDb.HeadPicUrl = string.Empty;
  436. }
  437. deviceDb.DepartmentCode = request.DepartmentCode;
  438. //修改自动分享
  439. deviceDb.IsAutoShared = request.IsAutoShared;
  440. if (deviceDb.IsAutoShared)
  441. {
  442. var users = new List<UserDTO>();
  443. if (!string.IsNullOrEmpty(deviceDb.DepartmentCode))
  444. {
  445. users = await _userServiceProxy.FindUserListByOrganizationCodesAsync(new List<string> { deviceDb.DepartmentCode });
  446. }
  447. else
  448. {
  449. users = await _userServiceProxy.GetUserListAsync(new GetUserListDBRequest { OrganizationQueryType = OrganizationQueryTypeEnum.All, OrganizationCode = deviceDb.OrganizationCode });
  450. }
  451. var userCodes = users.Select(f => f.UserCode).ToList();
  452. //先解绑,再绑定,避免绑定重复设备code
  453. var updateUsers = new List<TableDataItem<UserPasswordDTO>>();
  454. foreach (var user in users)
  455. {
  456. var userPasswordDTO = user.MappingTo<UserPasswordDTO>();
  457. user.BindDevices?.Remove(deviceDb.DeviceCode);
  458. await _userServiceProxy.UpdateUserAsync(userPasswordDTO.UserCode, userPasswordDTO, string.Empty);
  459. }
  460. await _userServiceProxy.BingDevicesToUsersAsync(new BingDevicesToUsersRequest
  461. {
  462. DeviceCodes = new List<string> { deviceDb.DeviceCode.ToString() },
  463. UserCodes = userCodes.Select(f => f.ToString()).ToList()
  464. });
  465. }
  466. return await _deviceInfoDBServiceProxy.UpdateDeviceInfoByCodeAsync(deviceDb.DeviceCode, deviceDb, string.Empty, true);
  467. }
  468. /// <summary>
  469. /// 创建字典
  470. /// </summary>
  471. /// <param name="request"></param>
  472. /// <returns></returns>
  473. public async Task<string> CreateDictionaryItemAsync(CreateDictionaryItemRequest request)
  474. {
  475. return await _deviceInfoDBServiceProxy.CreateDictionaryItemAsync(new CreateDictionaryItemDBRequest
  476. {
  477. Data = new DictionaryDTO { DictionaryType = request.DictionaryType, Value = request.DictionaryItemValue, ParentCode = request.ParentCode },
  478. ExtensionData = string.Empty
  479. });
  480. }
  481. /// <summary>
  482. /// 查找设备型号所有字典项
  483. /// </summary>
  484. /// <param name="request"></param>
  485. /// <returns></returns>
  486. public async Task<List<DictionaryDTO>> FindDeviceModelItemsAsync(FindDeviceModelItemsRequest request)
  487. {
  488. var dictionaryDOList = await _deviceInfoDBServiceProxy.FindDictionaryItemsAsync(new FindDictionaryItemsDBRequest
  489. {
  490. DictionaryType = (int)request.DictionaryType,
  491. ParentCode = request.DeviceTypeCode
  492. });
  493. return dictionaryDOList;
  494. }
  495. /// <summary>
  496. /// 查找设备类型所有字典项
  497. /// </summary>
  498. /// <param name="request"></param>
  499. /// <returns></returns>
  500. public async Task<List<DictionaryDTO>> FindDeviceTypeItemsAsync(FindDeviceTypeItemsRequest request)
  501. {
  502. var dictionaryDOList = await _deviceInfoDBServiceProxy.FindDictionaryItemsAsync(new FindDictionaryItemsDBRequest
  503. {
  504. DictionaryType = (int)request.DictionaryType
  505. });
  506. return dictionaryDOList;
  507. }
  508. /// <summary>
  509. /// 根据组织编码查询所属全部设备信息
  510. /// </summary>
  511. /// <param name="request"></param>
  512. /// <returns></returns>
  513. public async Task<List<DeviceExtendInfoDTO>> FindDevicesByOrganizationCodeAsync(FindDevicesByOrganizationCodeRequest request)
  514. {
  515. var result = new List<DeviceExtendInfoDTO>();
  516. var deviceInfoDOList = await _deviceInfoDBServiceProxy.FindDeviceInfoListByOrganizationCodeAsync(request.OrganizationCode);
  517. if (deviceInfoDOList?.Count > 0)
  518. {
  519. //根据机构编号查询机构名称
  520. var organizationCode = deviceInfoDOList.FindAll(c => !string.IsNullOrEmpty(c.OrganizationCode)).Select(c => c.OrganizationCode).FirstOrDefault() ?? string.Empty;
  521. var organization = await _organizationDBService.GetOrganizationDetailAsync(new GetOrganizationDBRequest { OrganizationCode = organizationCode });
  522. var organizationName = organization?.OrganizationName ?? string.Empty;
  523. //根据机构编号查询科室名称
  524. var organizationFilter = new Dictionary<string, string>();
  525. organizationFilter.Add("RootCode", organizationCode);
  526. var organizations = await _organizationDBService.GetOrganizationPageAsync((new PageFilterRequest { CurrentPage = 1, PageSize = 999999, Filter = organizationFilter, IsFuzzy = false }));
  527. var deviceCodes = deviceInfoDOList.Select(x => x.DeviceCode).ToList();
  528. var deviceTokens = await _authenticationService.GetTokenWithClientIdsAsync(new GetTokenWithClientIdsRequest { ClientIds = deviceCodes });
  529. var deviceTypeList = await _deviceInfoDBServiceProxy.FindDictionaryItemsAsync(new FindDictionaryItemsDBRequest { DictionaryType = (int)DictionaryTypeEnum.DeviceType });
  530. foreach (var c in deviceInfoDOList)
  531. {
  532. var deviceTypeModel = deviceTypeList.FirstOrDefault(t => t.DictionaryCode == c.DeviceType);
  533. result.Add(new DeviceExtendInfoDTO
  534. {
  535. DepartmentName = organizations.PageData.FirstOrDefault(o => o.OrganizationCode == c.DepartmentCode)?.OrganizationName,
  536. OrganizationName = organizationName,
  537. IsOnline = deviceTokens.FirstOrDefault(x => x.ClientId == c.DeviceCode)?.IsOnline ?? false,
  538. DeviceCode = c.DeviceCode,
  539. SerialNumber = c.SerialNumber,
  540. Name = c.Name,
  541. Description = c.Description,
  542. DeviceModel = c.DeviceModel,
  543. DeviceType = c.DeviceType,
  544. HeadPicUrl = c.HeadPicUrl,
  545. DeviceSoftwareVersion = c.DeviceSoftwareVersion,
  546. SDKSoftwareVersion = c.SDKSoftwareVersion,
  547. OrganizationCode = c.OrganizationCode,
  548. DepartmentCode = c.DepartmentCode,
  549. ShortCode = c.ShortCode,
  550. LanguageConfigs = deviceTypeModel?.LanguageConfigs
  551. });
  552. }
  553. }
  554. return result;
  555. }
  556. public Task<DeviceInfoDTO> CreateDeviceInfoAsync(CreateDeviceRequest request)
  557. {
  558. throw new NotImplementedException();
  559. }
  560. public async Task<List<SelectItemDTO>> GetPersonDeviceDropdownListAsync(TokenRequest request)
  561. {
  562. //验证
  563. var userCode = await GetClientIdByTokenAsync(request.Token);
  564. //查询用户是否存在
  565. var userInfoDO = await _userServiceProxy.FindUserByCodeAsync(userCode);
  566. if (userInfoDO == null)
  567. {
  568. ThrowCustomerException(CustomerRpcCode.UserNotExistError, "User does not exist");
  569. }
  570. var result = new List<SelectItemDTO>();
  571. //查询用户的医院是否存在
  572. if (string.IsNullOrEmpty(userInfoDO.OrganizationCode))
  573. {
  574. ThrowCustomerException(CustomerRpcCode.OrganizationNotExist, "Org does not exist");
  575. }
  576. var deviceInfoDOList = new List<DeviceInfoDTO>();
  577. if (userInfoDO.IsDirector)
  578. {
  579. deviceInfoDOList = await _deviceInfoDBServiceProxy.FindDeviceInfoListByOrganizationCodeAsync(userInfoDO.RootOrganizationCode);
  580. }
  581. else if (!userInfoDO.RoleCodes.Contains("Role_ExpertAssistant"))
  582. {
  583. //查询用户绑定的设备
  584. if (userInfoDO.BindDevices == null || userInfoDO.BindDevices.Count <= 0)
  585. {
  586. return result;
  587. }
  588. //根据用户名下的设备id查询所有的设备信息
  589. deviceInfoDOList = await _deviceInfoDBServiceProxy.FindDeviceInfoListByCodeListAsync(userInfoDO.BindDevices);
  590. }
  591. else
  592. {
  593. var experts = await _userServiceProxy.GetBindExpertsAsync(userCode);
  594. if (experts.Any())
  595. {
  596. var bindDeviceCodes = experts.SelectMany(x => x.BindDevices ?? new List<string>()).Distinct().ToList();
  597. if (bindDeviceCodes.Any())
  598. {
  599. deviceInfoDOList = await _deviceInfoDBServiceProxy.FindDeviceInfoListByCodeListAsync(bindDeviceCodes);
  600. }
  601. }
  602. else
  603. {
  604. deviceInfoDOList = await _deviceInfoDBServiceProxy.FindDeviceInfoListByOrganizationCodeAsync(userInfoDO.RootOrganizationCode);
  605. }
  606. }
  607. if (deviceInfoDOList?.Count > 0)
  608. {
  609. result = deviceInfoDOList.Select(c => new SelectItemDTO()
  610. {
  611. Key = c.DeviceCode,
  612. Value = c.Name
  613. }).ToList();
  614. }
  615. return result;
  616. }
  617. /// <summary>
  618. /// 设备端调用,查询获取服务器配置信息接口
  619. /// </summary>
  620. /// <param name="request">Token验证</param>
  621. /// <returns>服务器配置信息结果:key:字段,value:数据值,复杂类型可为json</returns>
  622. public async Task<Dictionary<string, string>> QueryServerConfigAsync(TokenRequest request)
  623. {
  624. var deviceCode = await GetClientIdByTokenAsync(request.Token);
  625. var deviceInfo = await _deviceInfoDBServiceProxy.FindDeviceInfoByCodeAsync(deviceCode);
  626. if (deviceInfo == null || string.IsNullOrWhiteSpace(deviceInfo.DeviceCode))
  627. {
  628. ThrowCustomerException(CustomerRpcCode.NoExistDevice, "Device does not exist");
  629. }
  630. var org = new OrganizationDTO();
  631. if (!string.IsNullOrWhiteSpace(deviceInfo.OrganizationCode))
  632. {
  633. org = await _organizationDBService.GetOrganizationDetailAsync(new GetOrganizationDBRequest { OrganizationCode = deviceInfo.OrganizationCode });
  634. }
  635. var dictionary = new Dictionary<string, string>();
  636. //定义配置字段 并扩充字段,返回数据可持续更新接口文档,如果数据是复杂类型可以转成json
  637. //TODO 配置信息: 直播配置、存储配置、
  638. //存储上传图像或者视频是 是否本地上传缩略图
  639. var isUploadThumbnail = ConfigurationManager.RemedicalSettings.IsUploadThumbnail;
  640. dictionary.Add("IsUploadThumbnail", isUploadThumbnail.ToString());
  641. dictionary.Add("PatientType", org.PatientType.ToString());
  642. dictionary.Add("HeartRateSeconds", _heartRateSeconds.ToString());
  643. return dictionary;
  644. }
  645. /// <summary>
  646. /// 添加或迁移设备到医院请求
  647. /// </summary>
  648. /// <param name="request"></param>
  649. /// <returns></returns>
  650. public async Task<bool> AddDeviceToOrgAsync(AddDeviceToOrgRequest request)
  651. {
  652. var shortCode = request.UniqueCode;
  653. #region Params Check
  654. var userCode = await GetClientIdByTokenAsync(request.Token);
  655. if (string.IsNullOrEmpty(shortCode))
  656. {
  657. ThrowCustomerException(CustomerRpcCode.UniqueCodeIsEmpty, "UniqueCode is empty");
  658. }
  659. var device = await _deviceInfoDBServiceProxy.FindDeviceInfoByShortCodeAsync(shortCode);
  660. if (device == null)
  661. {
  662. ThrowCustomerException(CustomerRpcCode.NoExistDevice, "Device does not exist");
  663. }
  664. var oldOrg = await _organizationDBService.GetOrganizationDetailAsync(new GetOrganizationDBRequest { OrganizationCode = device.OrganizationCode });
  665. if (oldOrg == null || string.IsNullOrWhiteSpace(oldOrg.OrganizationCode))
  666. {
  667. ThrowCustomerException(CustomerRpcCode.OrganizationNotExist, "Org does not exist");
  668. }
  669. //用户
  670. var userDTO = await _userServiceProxy.FindUserByCodeAsync(userCode);
  671. if (userDTO == null)
  672. {
  673. ThrowCustomerException(CustomerRpcCode.UserNotExistError, "User does not exist");
  674. }
  675. if (!userDTO.IsDirector)
  676. {
  677. ThrowCustomerException(CustomerRpcCode.NotOrgAdmin, "not org admin");
  678. }
  679. var org = await _organizationDBService.GetOrganizationDetailAsync(new GetOrganizationDBRequest { OrganizationCode = userDTO.OrganizationCode });
  680. if (org == null || string.IsNullOrWhiteSpace(org.OrganizationCode))
  681. {
  682. ThrowCustomerException(CustomerRpcCode.OrganizationNotExist, "Org does not exist");
  683. }
  684. #endregion
  685. try
  686. {
  687. var newOrgode = org.OrganizationCode;
  688. //设备更新医院
  689. if (!string.IsNullOrEmpty(device.DepartmentCode))
  690. {
  691. device.DepartmentCode = "";
  692. }
  693. if (!string.IsNullOrEmpty(device.Name))
  694. {
  695. device.Name = "";
  696. }
  697. device.HeadPicUrl = "";
  698. device.Description = "";
  699. device.IsAutoShared = false;
  700. device.OrganizationCode = newOrgode;
  701. bool success = await _deviceInfoDBServiceProxy.UpdateDeviceInfoByCodeAsync(device.DeviceCode, device, string.Empty, true);
  702. if (success)
  703. {
  704. // 删除已知绑定的用户
  705. var users = await _userServiceProxy.GetUsersByDeviceAsync(device.DeviceCode);
  706. var updateUsers = new List<TableDataItem<UserPasswordDTO>>();
  707. foreach (var user in users)
  708. {
  709. user.BindDevices.Remove(device.DeviceCode);
  710. updateUsers.Add(new TableDataItem<UserPasswordDTO>()
  711. {
  712. Data = user.MappingTo<UserPasswordDTO>(),
  713. });
  714. }
  715. if (updateUsers.Count > 0)
  716. {
  717. var updateUsersDBRequest = new UpdateUsersDBRequest() { Users = updateUsers };
  718. await _userServiceProxy.UpdateUsersAsync(updateUsersDBRequest);
  719. }
  720. if (oldOrg.Isinvented) // 虚拟医院
  721. {
  722. //迁移数据超声机上传检查记录
  723. await _recordsInfoDBService.UpdateRecordsWithOrgCodeAsync(new List<string>() { device.DeviceCode }, newOrgode);
  724. //迁移数据超声机上传病人
  725. await _patientInfoDBService.UpdatePatientWithOrgCodeAsync(new List<string>() { device.DeviceCode }, newOrgode);
  726. }
  727. }
  728. return success;
  729. }
  730. catch (System.Exception ex)
  731. {
  732. Logger.WriteLineError($"AddDeviceToOrgAsync error {ex}");
  733. }
  734. return false;
  735. }
  736. /// <summary>
  737. /// 补齐设备扩展信息
  738. /// </summary>
  739. /// <param name="deviceInfoDOList"></param>
  740. /// <returns></returns>
  741. private async Task<List<DeviceExtendInfoDTO>> MapToExtendDTO(List<DeviceInfoDTO> deviceInfoDOList)
  742. {
  743. var deviceList = new List<DeviceExtendInfoDTO>();
  744. if (deviceInfoDOList != null && deviceInfoDOList.Any())
  745. {
  746. //查询机构
  747. var orgCodes = deviceInfoDOList.Select(x => x.OrganizationCode).ToList();
  748. orgCodes.AddRange(deviceInfoDOList.Select(x => x.DepartmentCode));
  749. var organizations = await _organizationDBService.FindOrganizationListByCodesAsync(orgCodes.Distinct().ToList());
  750. //查询机构负责人
  751. var organizationDirectorCodes = new List<string>();
  752. foreach (var org in organizations)
  753. {
  754. if (org.Directors != null && org.Directors.Any())
  755. {
  756. organizationDirectorCodes.AddRange(org.Directors);
  757. }
  758. }
  759. var organizationDirectors = await _userServiceProxy.FindUserListByUserCodesAsync(organizationDirectorCodes);
  760. var deviceCodes = deviceInfoDOList.Select(x => x.DeviceCode).ToList();
  761. var deviceTokens = await _authenticationService.GetTokenWithClientIdsAsync(new GetTokenWithClientIdsRequest { ClientIds = deviceCodes });
  762. var deviceTypeList = await _deviceInfoDBServiceProxy.FindDictionaryItemsAsync(new FindDictionaryItemsDBRequest { DictionaryType = (int)DictionaryTypeEnum.DeviceType });
  763. foreach (var dto in deviceInfoDOList)
  764. {
  765. var device = dto.MappingTo<DeviceExtendInfoDTO>();
  766. device.IsOnline = deviceTokens.FirstOrDefault(x => x.ClientId == dto.DeviceCode)?.IsOnline ?? false;
  767. device.DepartmentName = organizations.FirstOrDefault(x => x.OrganizationCode == dto.DepartmentCode)?.OrganizationName;
  768. device.LanguageConfigs = deviceTypeList.FirstOrDefault(t => t.DictionaryCode == device.DeviceType)?.LanguageConfigs;
  769. var organization = organizations.FirstOrDefault(x => x.OrganizationCode == dto.OrganizationCode);
  770. if (organization != null)
  771. {
  772. device.OrganizationName = organization.OrganizationName;
  773. if (organization.Directors != null && organization.Directors.Any())
  774. {
  775. var director = organizationDirectors.FirstOrDefault(x => x.UserCode == organization.Directors.FirstOrDefault());
  776. device.OrganizationDirectorCode = director?.UserCode;
  777. device.OrganizationDirectorUserName = director?.UserName;
  778. device.OrganizationDirectorFullName = director?.FullName;
  779. }
  780. }
  781. deviceList.Add(device);
  782. }
  783. }
  784. return deviceList;
  785. }
  786. /// <summary>
  787. /// 补齐设备扩展信息
  788. /// </summary>
  789. /// <param name="deviceInfoDOList"></param>
  790. /// <returns></returns>
  791. private async Task<DeviceExtendInfoDTO> MapToExtendDTO(DeviceInfoDTO deviceInfoDO)
  792. {
  793. var deviceList = await MapToExtendDTO(new List<DeviceInfoDTO> { deviceInfoDO });
  794. return deviceList.FirstOrDefault();
  795. }
  796. /// <summary>
  797. /// 获取设备绑定用户codes
  798. /// </summary>
  799. /// <param name="request">获取设备绑定用户codes请求实体</param>
  800. /// <returns>test01,test02</returns>
  801. public async Task<List<string>> GetDeviceBindUsersCodesAsync(GetDeviceRequest request)
  802. {
  803. //检查设备编码不为空
  804. if (string.IsNullOrWhiteSpace(request.DeviceCode))
  805. {
  806. ThrowCustomerException(CustomerRpcCode.DeviceCodeIsEmpty, "Required parameter:DeviceCode cannot be empty");
  807. }
  808. //查询设备对象
  809. var deviceDb = await _deviceInfoDBServiceProxy.FindDeviceInfoByCodeAsync(request.DeviceCode);
  810. if (deviceDb == null)
  811. {
  812. ThrowCustomerException(CustomerRpcCode.NoExistDevice, "Device does not exist");
  813. }
  814. var userListResult = await _userServiceProxy.GetUsersByDeviceAsync(request.DeviceCode);
  815. if (userListResult != null && userListResult.Count > 0)
  816. {
  817. return userListResult.Select(u => u.UserCode).ToList();
  818. }
  819. return new List<string>();
  820. }
  821. /// <summary>
  822. /// 查询设备AI应用的状态
  823. /// </summary>
  824. /// <param name="request">请求参数</param>
  825. /// <returns>AI应用集合</returns>
  826. public async Task<List<DiagnosisModuleDTO>> FindDeviceDiagnosisModulesAsync(FindDeviceDiagnosisModulesRequest request)
  827. {
  828. //检查设备编码不为空
  829. if (string.IsNullOrWhiteSpace(request.DeviceCode))
  830. {
  831. ThrowCustomerException(CustomerRpcCode.DeviceCodeIsEmpty, "Required parameter:DeviceCode cannot be empty");
  832. }
  833. return await _diagnosisModuleService.GetDeviceDiagnosisModulesAsync(new GetDeviceDiagnosisModulesDBRequest { DeviceCode = request.DeviceCode });
  834. }
  835. /// <summary>
  836. /// 修改设备AI应用启用状态
  837. /// </summary>
  838. /// <param name="request">修改设备AI应用启用状态请求实体</param>
  839. /// <returns>是否成功</returns>
  840. /// <para>DeviceErrorCodeEnum</para>
  841. public async Task<bool> ModifyDeviceDiagnosisModuleStateAsync(ModifyDeviceDiagnosisModuleStateRequest request)
  842. {
  843. //检查设备编码不为空
  844. if (string.IsNullOrWhiteSpace(request.DeviceCode))
  845. {
  846. ThrowCustomerException(CustomerRpcCode.DeviceCodeIsEmpty, "Required parameter:DeviceCode cannot be empty");
  847. }
  848. if (string.IsNullOrWhiteSpace(request.DiagnosisModule))
  849. {
  850. ThrowCustomerException(CustomerRpcCode.DeviceAIDiagnosisModule, "Required parameter:DeviceCode cannot be empty");
  851. }
  852. var result = await _diagnosisModuleService.UpdateDeviceDiagnosisModuleStateAsync(new UpdateDeviceDiagnosisModuleStateDBRequest
  853. {
  854. DeviceCode = request.DeviceCode,
  855. DiagnosisModule = request.DiagnosisModule,
  856. Enabled = request.Enabled
  857. });
  858. CacheMaintenance.Instance.Get<IDeviceInfosManager>().Remove(request.DeviceCode);
  859. return result;
  860. }
  861. /// <summary>
  862. /// 设备离开会诊房间
  863. /// </summary>
  864. /// <param name="request">设备离开会诊房间请求实体</param>
  865. /// <returns></returns>
  866. public async Task<DeviceLeaveLiveConsultationResult> DeviceLeaveLiveConsultationAsync(DeviceLeaveLiveConsultationRequest request)
  867. {
  868. var deviceCode = await GetClientIdByTokenAsync(request.Token);
  869. var result = new DeviceLeaveLiveConsultationResult
  870. {
  871. Success = false,
  872. };
  873. return result;
  874. }
  875. /// <summary>
  876. /// 通用异常处理方法
  877. /// </summary>
  878. /// <param name="customerRpcCodeEnum">异常标识码</param>
  879. /// <param name="msg">异常信息</param>
  880. /// <param name="internalMessage">内部异常信息,非必填</param>
  881. private void ThrowCustomerException(CustomerRpcCode customerRpcCodeEnum, string msg, string internalMessage = null)
  882. {
  883. ThrowRpcException((int)customerRpcCodeEnum, msg, internalMessage);
  884. }
  885. /// <summary>
  886. /// 上报设备画面尺寸相关信息
  887. /// </summary>
  888. /// <param name="request"></param>
  889. /// <docFirstDirectory>设备端API</docFirstDirectory>
  890. /// <docSecondDirectory>实时会诊服务接口</docSecondDirectory>
  891. /// <docThirdDirectory>会诊</docThirdDirectory>
  892. /// <returns></returns>
  893. public async Task<ReportVideoDeviceInfoResult> ReportVideoDeviceInfo(ReportVideoDeviceInfoRequest request)
  894. {
  895. var result = new ReportVideoDeviceInfoResult();
  896. var deviceCode = await GetClientIdByTokenAsync(request.Token);
  897. var deviceDTO = await _deviceInfoDBServiceProxy.FindDeviceInfoByCodeAsync(deviceCode);
  898. deviceDTO.VideoDeviceInfos = request.VideoDeviceInfos;
  899. await _deviceInfoDBServiceProxy.UpdateDeviceInfoByCodeAsync(deviceDTO.DeviceCode, deviceDTO, null);
  900. CacheMaintenance.Instance.Get<IDeviceInfosManager>().Remove(deviceDTO.DeviceCode);
  901. result.Success = true;
  902. return result;
  903. }
  904. }
  905. }