ServerController.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. using FISLib.Connect;
  2. using System;
  3. using System.Linq;
  4. using Vinno.FIS.Sonopost.Common;
  5. using Vinno.FIS.Sonopost.Features.Config;
  6. using Vinno.FIS.Sonopost.WebApi.Models;
  7. using Vinno.IUS.Common.Log;
  8. using Vinno.IUS.Common.Utilities;
  9. namespace Vinno.FIS.Sonopost.WebApi.Controllers
  10. {
  11. [WebApiController("Server")]
  12. internal class ServerController : BaseController
  13. {
  14. /// <summary>
  15. /// 登录
  16. /// </summary>
  17. /// <param name="request"></param>
  18. /// <returns></returns>
  19. [WebApiAction("Login")]
  20. public Result Login(ServerLoginRequest2 request)
  21. {
  22. if (!request.Ipv4.Equals(ConfigManager.VCloudServerAddress) || !request.Port.Equals(ConfigManager.VCloudServerPort) || !request.ServerName.Equals(ConfigManager.VCloudServerName))
  23. {
  24. bool changed = LoginManager.ChangeServer(request.Ipv4, request.Port, request.ServerName);
  25. if (!changed) Result.Fail();
  26. }
  27. var isLoginWithAccountAndPassword = SonopostUserDefinedSettings.Instance.ServerSetting.IsLoginWithAccountAndPassword;
  28. var hospitalName = request.HospitalName?.Trim();
  29. if (string.IsNullOrWhiteSpace(hospitalName))
  30. {
  31. hospitalName = null;
  32. }
  33. if (!isLoginWithAccountAndPassword)
  34. {
  35. UpdateAccount(string.Empty, string.Empty);
  36. }
  37. else
  38. {
  39. if (string.IsNullOrWhiteSpace(request.Account))
  40. {
  41. return Result.Fail("InputAccountTips");
  42. }
  43. if (string.IsNullOrWhiteSpace(request.Password))
  44. {
  45. return Result.Fail("InputPasswordTips");
  46. }
  47. UpdateAccount(request.Account, request.Password);
  48. }
  49. var status = LoginManager.Login(hospitalName);
  50. if (status != DeviceStatus.Logon)
  51. {
  52. return Result.Fail(status.ToString());
  53. }
  54. ServerLoginResult result = new ServerLoginResult
  55. {
  56. UniqueId = LoginManager.UniqueId,
  57. QRCodeString = LoginManager.QRCodeString,
  58. };
  59. return Result.Success(result);
  60. }
  61. /// <summary>
  62. /// 登出
  63. /// </summary>
  64. /// <returns></returns>
  65. [WebApiAction]
  66. public Result Logout()
  67. {
  68. if (LoginManager.DeviceStatus != DeviceStatus.Logon)
  69. {
  70. return Result<bool>.Success(true);
  71. }
  72. SonopostUserDefinedSettings.Instance.ServerSetting.IsAutoLogin = false;
  73. ConfigManager.Save();
  74. if (LoginManager.Logoff())
  75. {
  76. return Result<bool>.Success(LoginManager.DeviceStatus != DeviceStatus.Logon);
  77. }
  78. else
  79. {
  80. return Result.Fail($"LogOffError");
  81. }
  82. }
  83. /// <summary>
  84. /// 获取登录信息
  85. /// </summary>
  86. /// <returns></returns>
  87. [WebApiAction]
  88. public Result GetLoginInfo()
  89. {
  90. var username = DesBuilder.Decrypt(SonopostUserDefinedSettings.Instance.ServerSetting.UserName);
  91. var pwd = DesBuilder.Decrypt(SonopostUserDefinedSettings.Instance.ServerSetting.UserPassword);
  92. bool isLoginWithAccountAndPassword = false;
  93. bool isExisted = false;
  94. if (LoginManager.DeviceStatus == DeviceStatus.Logon)
  95. {
  96. isLoginWithAccountAndPassword = LoginManager.IsLoginWithAccountAndPassword;
  97. }
  98. else
  99. {
  100. isLoginWithAccountAndPassword = SonopostUserDefinedSettings.Instance.ServerSetting.IsLoginWithAccountAndPassword;
  101. }
  102. var servers = SonopostUserDefinedSettings.Instance.ServerSetting.Servers;
  103. if (servers.Any(x => x.Host.Equals(ConfigManager.VCloudServerAddress) && x.Port.Equals(ConfigManager.VCloudServerPort)))
  104. {
  105. isExisted = true;
  106. }
  107. var result = new ServerLoginResult2
  108. {
  109. QRCodeString = LoginManager.QRCodeString,
  110. UniqueId = LoginManager.UniqueId,
  111. Address = ConfigManager.VCloudServerAddress,
  112. Port = ConfigManager.VCloudServerPort,
  113. Account = username,
  114. Password = pwd,
  115. IsLoginWithAccountAndPassword = isLoginWithAccountAndPassword,
  116. IsExisted = isExisted,
  117. DongleId = FISManager.UltrasoundMachineInfo.DongleId,
  118. VCloudServerName = ConfigManager.VCloudServerName,
  119. };
  120. return Result.Success(result);
  121. }
  122. /// <summary>
  123. /// 当前是否已登录
  124. /// </summary>
  125. /// <returns></returns>
  126. [WebApiAction]
  127. public Result CheckIsLogon()
  128. {
  129. return Result.Success(LoginManager.DeviceStatus == DeviceStatus.Logon);
  130. }
  131. /// <summary>
  132. /// 获取服务列表
  133. /// </summary>
  134. /// <returns></returns>
  135. [WebApiAction]
  136. public Result GetServerList()
  137. {
  138. if (LoginManager.DeviceStatus != DeviceStatus.Logon && !LoginManager.HasGetFasterServer)
  139. {
  140. var fasterServer = LoginManager.GetFasterServerInfo();
  141. if (fasterServer != null && SonopostUserDefinedSettings.Instance.ServerSetting.Servers.FirstOrDefault(x => x.IsDefault && x.DisplayName == SonopostConstants.FlyinsonoServerName).ToString() != fasterServer.ToString())
  142. {
  143. var flyinsonoServer = SonopostUserDefinedSettings.Instance.ServerSetting.Servers.FirstOrDefault(x => x.IsDefault && x.DisplayName == SonopostConstants.FlyinsonoServerName);
  144. var newFlyinsonoServer = new ServerInfoSetting(fasterServer.Host, fasterServer.Port, true, SonopostConstants.FlyinsonoServerName);
  145. ConfigManager.RefreshFlyinsonoServer(newFlyinsonoServer);
  146. flyinsonoServer.Host = fasterServer.Host;
  147. flyinsonoServer.Port = fasterServer.Port;
  148. if (SonopostUserDefinedSettings.Instance.ServerSetting.DefaultServer.DisplayName == SonopostConstants.FlyinsonoServerName && SonopostUserDefinedSettings.Instance.ServerSetting.DefaultServer.ToString() != fasterServer.ToString())
  149. {
  150. SonopostUserDefinedSettings.Instance.ServerSetting.DefaultServer.Host = fasterServer.Host;
  151. SonopostUserDefinedSettings.Instance.ServerSetting.DefaultServer.Port = fasterServer.Port;
  152. }
  153. ConfigManager.Save();
  154. }
  155. }
  156. return Result.Success(SonopostUserDefinedSettings.Instance.ServerSetting.Servers);
  157. }
  158. /// <summary>
  159. /// 检查网络
  160. /// </summary>
  161. /// <returns></returns>
  162. [WebApiAction]
  163. public Result CheckNetwork()
  164. {
  165. if (TestManager.IsRunning)
  166. {
  167. TestManager.Stop();
  168. }
  169. TestManager.Run();
  170. return Result.Success();
  171. }
  172. /// <summary>
  173. /// 获取 检查网络 进度
  174. /// </summary>
  175. /// <returns></returns>
  176. [WebApiAction]
  177. public Result GetCheckNetworkProgress()
  178. {
  179. return Result.Success(TestManager.CurrentProgress);
  180. }
  181. /// <summary>
  182. /// 获取DongleId
  183. /// </summary>
  184. /// <returns></returns>
  185. [WebApiAction]
  186. public Result GetDongleId()
  187. {
  188. return Result.Success(FISManager.UltrasoundMachineInfo.DongleId);
  189. }
  190. /// <summary>
  191. /// 获取 当前的登录模式
  192. /// </summary>
  193. /// <returns></returns>
  194. [WebApiAction]
  195. public Result GetCurrentVCloudLoginMode()
  196. {
  197. var currentMode = LoginManager.IsLoginWithAccountAndPassword;
  198. return Result.Success(new VCloudLoginRequest { IsLoginWithAccountAndPassword = currentMode });
  199. }
  200. /// <summary>
  201. /// 切换已登录的云服务器
  202. /// </summary>
  203. /// <returns></returns>
  204. [WebApiAction]
  205. public Result SwtichLoginServer(ServerNodeRequest serverNodeRequest)
  206. {
  207. var request = Helpers.JsonHelper.ToJson(serverNodeRequest);
  208. Logger.WriteLineInfo($"Sonopost SwtichLoginServer Invoke,{request}");
  209. if (LoginManager.DeviceStatus == DeviceStatus.Logon)
  210. {
  211. if (!LoginManager.Logoff())
  212. {
  213. return Result.Fail($"LogOffError");
  214. }
  215. }
  216. if (serverNodeRequest == null)
  217. {
  218. return Result.Fail($"Server Info is Null");
  219. }
  220. if (SonopostUserDefinedSettings.Instance.ServerSetting.IsLoginWithAccountAndPassword)
  221. {
  222. SonopostUserDefinedSettings.Instance.ServerSetting.IsLoginWithAccountAndPassword = false;
  223. ConfigManager.Save();
  224. }
  225. string serverName = string.Empty;
  226. var existItems = SonopostUserDefinedSettings.Instance.ServerSetting.Servers.Where(x => x.Host == serverNodeRequest.Ipv4 && x.Port == serverNodeRequest.Port);
  227. if (existItems.Count() == 0)
  228. {
  229. serverName = $"{serverNodeRequest.Ipv4}:{serverNodeRequest.Port}";
  230. }
  231. if (existItems.Count() == 1)
  232. {
  233. serverName = existItems.FirstOrDefault().DisplayName;
  234. }
  235. else
  236. {
  237. serverName = existItems.FirstOrDefault(x => x.DisplayName != SonopostConstants.FlyinsonoServerName)?.DisplayName;
  238. }
  239. if (string.IsNullOrEmpty(serverName))
  240. {
  241. serverName = $"{serverNodeRequest.Ipv4}:{serverNodeRequest.Port}";
  242. }
  243. return Login(new ServerLoginRequest2
  244. {
  245. Ipv4 = serverNodeRequest.Ipv4,
  246. Port = serverNodeRequest.Port,
  247. ServerName = serverName,
  248. });
  249. }
  250. /// <summary>
  251. /// 修改物理唯一码
  252. /// </summary>
  253. /// <returns></returns>
  254. [WebApiAction]
  255. public Result ChangePhysicalUniqueId(PhysicalUniqueIdRequest physicalUniqueIdRequest)
  256. {
  257. try
  258. {
  259. if (physicalUniqueIdRequest == null || string.IsNullOrEmpty(physicalUniqueIdRequest.Id))
  260. {
  261. return Result.Fail("IdIsEmpty");
  262. }
  263. FISIMPL.FISIMPL.ChangeMachineId(physicalUniqueIdRequest.Id);
  264. return Result.Success();
  265. }
  266. catch (Exception ex)
  267. {
  268. Logger.WriteLineError($"ChangePhysicalUniqueId Error:{ex}");
  269. return Result.Fail();
  270. }
  271. }
  272. /// <summary>
  273. /// 读取云服务登录设置
  274. /// </summary>
  275. /// <returns></returns>
  276. [WebApiAction]
  277. public Result LoadVCloudLoginSetting()
  278. {
  279. try
  280. {
  281. return Result.Success(new VCloudLoginRequest { IsLoginWithAccountAndPassword = SonopostUserDefinedSettings.Instance.ServerSetting.IsLoginWithAccountAndPassword });
  282. }
  283. catch (Exception ex)
  284. {
  285. Logger.WriteLineError($"Load VCloud Login Setting Error:{ex}");
  286. return Result.Fail();
  287. }
  288. }
  289. /// <summary>
  290. /// 保存云服务登录设置
  291. /// </summary>
  292. /// <returns></returns>
  293. [WebApiAction]
  294. public Result SaveVCloudLoginSetting(VCloudLoginRequest vCloudLoginRequest)
  295. {
  296. try
  297. {
  298. SonopostUserDefinedSettings.Instance.ServerSetting.IsLoginWithAccountAndPassword = vCloudLoginRequest.IsLoginWithAccountAndPassword;
  299. ConfigManager.Save();
  300. return Result.Success();
  301. }
  302. catch (Exception ex)
  303. {
  304. Logger.WriteLineError($"Save VCloud Login Setting Error:{ex}");
  305. return Result.Fail();
  306. }
  307. }
  308. #region Private Methods
  309. private void UpdateAccount(string name, string password)
  310. {
  311. SonopostUserDefinedSettings.Instance.ServerSetting.UserName = DesBuilder.Encrypt(name);
  312. SonopostUserDefinedSettings.Instance.ServerSetting.UserPassword = DesBuilder.Encrypt(password);
  313. SonopostUserDefinedSettings.Instance.ServerSetting.IsAutoLogin = true;
  314. ConfigManager.Save();
  315. }
  316. #endregion Private Methods
  317. }
  318. }