AppData.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. using ivf_tl_Entity.DebugEntitys;
  2. using ivf_tl_Entity.GlobalEntitys;
  3. using ivf_tl_Entity.GlobalEnums;
  4. using ivf_tl_Operate.CustomUserControls;
  5. using ivf_tl_Operate.View;
  6. using ivf_tl_Services;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Configuration;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Resources;
  13. using System.Windows.Controls;
  14. using System.Windows.Documents;
  15. using System.Windows.Media.Imaging;
  16. using System.Xml;
  17. namespace ivf_tl_Operate
  18. {
  19. public class AppData
  20. {
  21. public static AppData Instance = new Lazy<AppData>(() => new AppData()).Value;
  22. public string DefeatPan { get; set; } = "C";
  23. public string PicSuf { get; set; } = ".png";
  24. /// <summary>
  25. /// 主窗口
  26. /// </summary>
  27. public MainWindow MainWindow { get; set; }
  28. /// <summary>
  29. /// 首页
  30. /// </summary>
  31. public MainPageView MainPageView { get; set; }
  32. /// <summary>
  33. /// 首页舱室信息控件
  34. /// </summary>
  35. public List<CustomHouseInfo> CustomHouseInfoList { get; set; } = new List<CustomHouseInfo>();
  36. public string TlSn { get; set; } = "NEO-1-20230107";
  37. public string TlNum { get; set; } = "20230107";
  38. public TLSettingCommon TLSettingCommon { get; set; }
  39. public HttpHelper HttpHelper { get; set; }
  40. public LogHelper LogHelper { get; set; }
  41. public MqttHelper MqttHelper { get; set; }
  42. public ConvertHelper ConvertHelper { get; set; }
  43. //public string BaseUrl = "http://gateway.aivfo.com:36000/";
  44. public string BaseUrl = "http://192.168.31.89:10010/";
  45. private string MqttIp = "211.149.139.131";
  46. private int MqttPort = 1883;
  47. private string MqttUserName = "aivfo";
  48. private string MqttPassword = "aivfo";
  49. private string MqttClientId = "TL/Surafce/tlSn";
  50. private string MqttTopicName = "TL/House/surface/tlSn";
  51. private string fertilizationTypeString = "FERTILIZATION_TYPE";
  52. public ExUserInfo CurrentUserInfo { get; set; } = new ExUserInfo();
  53. public List<FertilizationTypeEntity> FertilizationTypeEntitieList { get; set; }
  54. public string OutInterString { get; set; } = "1";
  55. private AppData()
  56. {
  57. BaseUrl = $"{ConfigurationManager.AppSettings["urlIp"]}:{ConfigurationManager.AppSettings["urlPort"]}/";
  58. MqttIp = ConfigurationManager.AppSettings["mqttIp"].ToString();
  59. MqttPort = int.Parse(ConfigurationManager.AppSettings["mqttPort"]);
  60. OutInterString = ConfigurationManager.AppSettings["outInter"].ToString();
  61. if (OutInterString == "1")
  62. {
  63. //测试环境外网
  64. BaseUrl = "http://test-gateway.aivfo.com:36000/";
  65. MqttIp = "211.149.139.131";
  66. MqttPort = 62883;
  67. }
  68. #if DEBUG
  69. //开发环境
  70. BaseUrl = "http://192.168.0.207:10010/";
  71. MqttIp = "192.168.0.207";
  72. MqttPort = 1883;
  73. //测试环境
  74. BaseUrl = "http://192.168.0.91:10010/";
  75. MqttIp = "192.168.0.91";
  76. MqttPort = 1883;
  77. //开发环境外网
  78. BaseUrl = "http://gateway.aivfo.com:36000/";
  79. MqttIp = "211.149.139.131";
  80. MqttPort = 61883;
  81. //测试环境外网
  82. BaseUrl = "http://test-gateway.aivfo.com:36000/";
  83. MqttIp = "211.149.139.131";
  84. MqttPort = 62883;
  85. #endif
  86. }
  87. public bool AppDataInit(string _account, string _password, string _tlNum)
  88. {
  89. LogHelper = new LogHelper();
  90. LogHelper.Pan = DefeatPan;
  91. HttpHelper = new HttpHelper(_account, _password, LogHelper);
  92. var exuserinfo = HttpHelper.Init(BaseUrl);
  93. if (exuserinfo != null && !string.IsNullOrEmpty(exuserinfo.username))
  94. {
  95. TlNum = _tlNum;
  96. TlSn = $"NEO-1-{TlNum}";
  97. CurrentUserInfo.account = _account;
  98. CurrentUserInfo.password = _password;
  99. ConvertHelper = new ConvertHelper();
  100. }
  101. else
  102. {
  103. return false;
  104. }
  105. CurrentUserInfo.email = exuserinfo.email;
  106. CurrentUserInfo.phone = exuserinfo.phone;
  107. CurrentUserInfo.username = exuserinfo.username;
  108. CurrentUserInfo.operatorInformation = exuserinfo.operatorInformation;
  109. // M8-P3b:登录后设置操作日志的 operator 与设备上下文(TlSn)。
  110. SetOperationLogContext();
  111. if (MqttHelper != null) MqttHelper.DisPoseMqtt();
  112. MqttClientId = $"TL/Surafce/{TlSn}/{DateTime.Now}";
  113. MqttTopicName = $"TL/House/surface/{TlSn}";
  114. MqttHelper = new MqttHelper(MqttIp, MqttPort, MqttUserName, MqttPassword, MqttClientId, MqttTopicName);
  115. MqttHelper.ErrorLogEvent += LogHelper.TLLog;
  116. MqttHelper.ExceptionLogEvent += LogHelper.ExceptionLog;
  117. TLSettingCommon = HttpHelper.SettingCommonApi(TlSn);
  118. FertilizationTypeEntitieList = HttpHelper.QueryDictionaryByTypeApi(fertilizationTypeString);
  119. return true;
  120. }
  121. /// <summary>
  122. /// M8-P3b:当前登录操作者(供操作日志 operator 字段用)。AsyncLocal 不跨 UI 事件传播,
  123. /// 故同时存静态值作全局默认,埋点处可显式取用。来源:登录用户 username(无则 account)。
  124. /// </summary>
  125. public static string CurrentOperator { get; private set; }
  126. /// <summary>
  127. /// M8-P3b:把登录用户与设备 SN 写入操作日志上下文。全 try 兜底。
  128. /// </summary>
  129. private void SetOperationLogContext()
  130. {
  131. try
  132. {
  133. string op = !string.IsNullOrEmpty(CurrentUserInfo?.username)
  134. ? CurrentUserInfo.username
  135. : CurrentUserInfo?.account;
  136. CurrentOperator = op;
  137. Aivfo.OperationLog.OperationLogContext.Operator = op;
  138. // 设备 SN 作为全局默认(埋点未显式给 tlSn 时回退到此)。
  139. if (Aivfo.OperationLog.OperationLogger.Options != null)
  140. Aivfo.OperationLog.OperationLogger.Options.TlSn = TlSn;
  141. }
  142. catch { /* 兜底:绝不因设置日志上下文影响登录 */ }
  143. }
  144. /// <summary>
  145. /// 返回首页
  146. /// </summary>
  147. public void BackMainPage()
  148. {
  149. MainWindow.LoadPage(MainPageView);
  150. }
  151. public CustomHouseInfo HouseSnToCustomHouseInfo(int houseSn)
  152. {
  153. return CustomHouseInfoList.FirstOrDefault(x => x.HouseSn == houseSn);
  154. }
  155. public void SetApp(string name, string pass, string _tlNum)
  156. {
  157. Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
  158. config.AppSettings.Settings["userName"].Value = name;
  159. // M5-02-2:passWord 写回时加密(DPAPI,与读取点 Decrypt 对称)。
  160. config.AppSettings.Settings["passWord"].Value = ivf_tl_Operate.Helpers.CryptoHelper.Encrypt(pass);
  161. config.AppSettings.Settings["tlNum"].Value = _tlNum;
  162. config.Save(ConfigurationSaveMode.Modified);
  163. System.Configuration.ConfigurationManager.RefreshSection("appSettings");
  164. }
  165. public void setAppConfig(string name, string pass, string _tlNum)
  166. {
  167. try
  168. {
  169. // M5-02-2:passWord 写回时加密(登录流程经此点写盘)。
  170. string encPass = ivf_tl_Operate.Helpers.CryptoHelper.Encrypt(pass);
  171. string fileName = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "ivf_tl_Operate.dll.config");
  172. if (!File.Exists(fileName)) return;
  173. var xmlDoc = new XmlDocument();
  174. xmlDoc.Load(fileName);
  175. var tags = xmlDoc.GetElementsByTagName("appSettings");
  176. XmlNode appSettingsNode = xmlDoc.SelectSingleNode("configuration/appSettings");
  177. if (appSettingsNode != null)
  178. {
  179. XmlNodeList addNodes = appSettingsNode.SelectNodes("add");
  180. foreach (XmlNode addNode in addNodes)
  181. {
  182. if (addNode.Attributes["key"].Value == "userName") addNode.Attributes["value"].Value = name;
  183. if (addNode.Attributes["key"].Value == "passWord") addNode.Attributes["value"].Value = encPass;
  184. if (addNode.Attributes["key"].Value == "tlNum") addNode.Attributes["value"].Value = _tlNum;
  185. }
  186. }
  187. xmlDoc.Save(fileName);
  188. System.Configuration.ConfigurationManager.RefreshSection("appSettings");
  189. xmlDoc = null;
  190. }
  191. catch (Exception ex)
  192. {
  193. return;
  194. }
  195. }
  196. public void SetApp(int _tlNum)
  197. {
  198. Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
  199. config.AppSettings.Settings["tlNum"].Value = _tlNum.ToString();
  200. config.Save(ConfigurationSaveMode.Modified);
  201. System.Configuration.ConfigurationManager.RefreshSection("appSettings");
  202. }
  203. public BitmapImage LogoBitmapImage(LogoEnum logoEnum)
  204. {
  205. try
  206. {
  207. #if DEBUG
  208. string basePath = @"C:\PersonalSpace\work\1 VisualWorkSpace\LogoFile";
  209. #else
  210. string basePath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Resources", "LogoFile");
  211. #endif
  212. string logoFile = string.Empty;
  213. switch (logoEnum)
  214. {
  215. case LogoEnum.Login:
  216. logoFile = "LoginLogo.png";
  217. break;
  218. case LogoEnum.Rectangle:
  219. logoFile = "RectangleLogo.png";
  220. break;
  221. case LogoEnum.Circle:
  222. logoFile = "CircleLogo.png";
  223. break;
  224. case LogoEnum.BlackCircle:
  225. logoFile = "BlackCircleLogo.png";
  226. break;
  227. default:
  228. break;
  229. }
  230. if (string.IsNullOrEmpty(logoFile)) return null;
  231. string filePath = Path.Combine(basePath, logoFile);
  232. if (!File.Exists(filePath)) return null;
  233. BitmapImage bitmap = new BitmapImage();
  234. bitmap.BeginInit();
  235. bitmap.UriSource = new Uri(filePath);
  236. bitmap.CacheOption = BitmapCacheOption.OnLoad;
  237. bitmap.EndInit();
  238. bitmap.Freeze();
  239. return bitmap;
  240. }
  241. catch (Exception ex)
  242. {
  243. return null;
  244. }
  245. }
  246. public void SetImageSource(Image image, LogoEnum logoEnum)
  247. {
  248. image.Source = LogoBitmapImage(logoEnum);
  249. }
  250. }
  251. }