DeviceService.cs 42 KB

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