AppData.cs 12 KB

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