StartMain.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. using Google.Protobuf.WellKnownTypes;
  2. using ivf_tl_Com;
  3. using IvfTl.Control.Entity.DTO;
  4. using IvfTl.Control.Entity.DTO.ApiRequestDTO;
  5. using IvfTl.Control.Entity.DTO.ControllerResults;
  6. using IvfTl.Control.Entity.GlobalEntitys;
  7. using IvfTl.Control.Entity.GlobalEnums;
  8. using IvfTl.Control.Entity.InitEntitys;
  9. using ivf_tl_UtilHelper;
  10. using Newtonsoft.Json;
  11. using System.Diagnostics;
  12. using System.Runtime.InteropServices;
  13. using System.Text;
  14. using System.Windows;
  15. namespace ivf_tl_Control
  16. {
  17. public class StartMain
  18. {
  19. AppData AppData { get; set; }
  20. public int CamNum { get; set; } = 0;
  21. public StartMain()
  22. {
  23. //HouseBin houseBin = new HouseBin();
  24. //houseBin.ComBin._channel.ErrorLogEvent += AppData.logControl.TLLog;
  25. //houseBin.ComBin._channel.ExceptionLogEvent += AppData.logControl.ExceptionLog;
  26. //houseBin.ComBin._channel.CommandLogEvent += AppData.logControl.HouseLog;
  27. }
  28. public string StartRun()
  29. {
  30. try
  31. {
  32. string errorInfo = "";
  33. AppData = AppData.Instance;
  34. AppData.LogService.TLLog($"程序开始启动", LogEnum.RunRecord);
  35. var initTLResult = InitTL(ref errorInfo);
  36. if (!string.IsNullOrEmpty(errorInfo)) return errorInfo;
  37. if (errorInfo == "结束") return errorInfo;
  38. AppData.TLSetting = initTLResult.Item1.TLSetting;
  39. PathHelper.pan = initTLResult.Item1.TLSetting.tmpDir;
  40. AppData.LogService.Pan = initTLResult.Item1.TLSetting.tmpDir;
  41. if (!InitHouse(initTLResult.Item1, initTLResult.Item2, ref errorInfo)) return errorInfo;
  42. AppData.StartAsync().Wait();
  43. return null;
  44. }
  45. catch (Exception ex)
  46. {
  47. AppData.LogService.ExceptionLog(ex, "仪器初始化", null, LogEnum.RunException);
  48. return ex.Message;
  49. }
  50. }
  51. /// <summary>
  52. /// TL数据初始化
  53. /// </summary>
  54. /// <returns></returns>
  55. public (TLInitControllerResult, List<int>) InitTL(ref string errora)
  56. {
  57. try
  58. {
  59. SerialBin serialBin = new SerialBin();
  60. serialBin.TLLogEvent += AppData.LogService.TLLog;
  61. serialBin.ExceptionLogEvent += AppData.LogService.ExceptionLog;
  62. serialBin.HouseLogEvent += AppData.LogService.HouseLog;
  63. var errorList = serialBin.UpdataCamera();
  64. AppData.LogService.TLLog($"相机信息:{JsonConvert.SerializeObject(serialBin.CCDidSn)}", LogEnum.RunRecord);
  65. if (errorList.Any())
  66. {
  67. // 舱室故障隔离:相机枚举异常不再整机中止,只记日志;受影响舱稍后在 CCDSN 配对时落坏舱被剔除。
  68. AppData.LogService.TLLog($"相机枚举有异常(不中止,受影响舱将按坏舱剔除):{JsonConvert.SerializeObject(errorList)}", LogEnum.RunRecord);
  69. }
  70. CamNum = serialBin.CCDidSn.Where(x => x.Value != null).Count();
  71. errorList = serialBin.Start();
  72. AppData.LogService.TLLog($"仓室信息:{JsonConvert.SerializeObject(serialBin.SerialModels)}", LogEnum.RunRecord);
  73. AppData.LogService.TLLog($"E方数据:{JsonConvert.SerializeObject(serialBin.HouseEEPROInfos)}", LogEnum.RunRecord);
  74. if (errorList.Any())
  75. {
  76. // 舱室故障隔离:扫口异常不再整机中止,剔除坏舱后用好舱继续(见下方 RunnableHouses)。
  77. AppData.LogService.TLLog($"扫口有异常(将剔除坏舱后继续):{JsonConvert.SerializeObject(errorList)}", LogEnum.RunRecord);
  78. }
  79. var modelCount = serialBin.SerialModels.Count;
  80. if (modelCount != 11)
  81. {
  82. // M1-01 步骤2:合并后是单进程无人值守前台,不能弹模态框。
  83. // 原 hack(MessageBox + Task.Delay(3000) + FindWindow/EnumChildWindows/SendMessage(BM_CLICK) 自动点 Yes)
  84. // 改为静默 + 日志记录;是否继续由配置项 ContinueOnModuleCountMismatch 控制(默认继续)。
  85. // 相关 [DllImport] 声明(FindWindow/SendMessage/EnumChildWindows/GetClassName/GetWindowText)按代码隔离原则保留为死代码,仅停止调用。
  86. bool continueOnMismatch = true;
  87. try
  88. {
  89. string cfg = System.Configuration.ConfigurationManager.AppSettings["ContinueOnModuleCountMismatch"];
  90. if (!string.IsNullOrEmpty(cfg) && bool.TryParse(cfg, out bool parsed)) continueOnMismatch = parsed;
  91. }
  92. catch { /* 读取配置失败时按默认(继续)处理 */ }
  93. AppData.LogService.TLLog($"检测到 {modelCount} 个模块(期望 11),ContinueOnModuleCountMismatch={continueOnMismatch},按配置策略{(continueOnMismatch ? "继续运行" : "中止初始化")}", LogEnum.RunRecord);
  94. if (!continueOnMismatch)
  95. {
  96. errora = "结束";
  97. return (new TLInitControllerResult(), new List<int>());
  98. }
  99. }
  100. // 舱室故障隔离:坏舱 = 故障清单中已知舱号;可跑舱 = 发现的舱 − 坏舱;仅零可跑才整机中止。
  101. var discovered = serialBin.SerialModels.Select(x => x.houseSn).ToList();
  102. List<int> listIntRunHoues = StartupFaultPolicy.RunnableHouses(discovered, serialBin.Faults);
  103. foreach (var f in serialBin.Faults) if (f.HouseSn > 0) f.Isolated = true;
  104. AppData.StartupFaults = serialBin.Faults;
  105. if (serialBin.Faults.Any())
  106. AppData.LogService.TLLog($"启动坏舱清单:{JsonConvert.SerializeObject(serialBin.Faults)};可跑舱:{string.Join(",", listIntRunHoues)}", LogEnum.RunRecord);
  107. if (StartupFaultPolicy.IsFatal(listIntRunHoues))
  108. {
  109. errora = "所有舱室初始化失败,无可运行舱室";
  110. AppData.LogService.TLLog(errora, LogEnum.RunRecord);
  111. return (new TLInitControllerResult(), new List<int>());
  112. }
  113. // 启动期坏舱经现有 reportAlarm 报警闭环上报(alarm 表/双端列表/短信电话/可消警);失败不影响启动。
  114. try { AppData.ReportStartupFaults(); } catch { }
  115. TLInitData tLInitData = new TLInitData();
  116. tLInitData.tlSn = $"NEO-1-{serialBin.TLNum}";
  117. tLInitData.dayLighting = serialBin.dayLighting;
  118. tLInitData.softwareVersion = "V2.0.0";
  119. tLInitData.verticalMotorPulseMax = 125000;
  120. tLInitData.houseLinkDataList = serialBin.SerialModels.OrderBy(x => x.houseSn).ToList();
  121. foreach (var item in serialBin.HouseEEPROInfos)
  122. {
  123. item.tlSn = tLInitData.tlSn;
  124. }
  125. tLInitData.houseEEPROInitDTOList = serialBin.HouseEEPROInfos.OrderBy(x => x.houseSn).ToList();
  126. AppData.LogService.TLLog($"【CamNum:{CamNum}】设备基础数据:{JsonConvert.SerializeObject(tLInitData)}", LogEnum.RunRecord);
  127. TLInitControllerResult tLInitControllerResult = AppData.SerialBinController.UpdateTLInfoController(tLInitData);
  128. if (tLInitControllerResult == null)
  129. {
  130. errora = "获取TL设置失败";
  131. AppData.LogService.TLLog(errora, LogEnum.RunRecord);
  132. return (new TLInitControllerResult(), new List<int>());
  133. }
  134. //AppData.LogService.TLLog($"TL初始化结果:{JsonConvert.SerializeObject(tLInitControllerResult)};{string.Join("_", listIntRunHoues)}", LogEnum.RunRecord);
  135. return (tLInitControllerResult, listIntRunHoues);
  136. }
  137. catch (Exception ex)
  138. {
  139. errora = ex.Message;
  140. AppData.LogService.ExceptionLog(ex, "数据初始化", null, LogEnum.RunException);
  141. return (new TLInitControllerResult(), new List<int>());
  142. }
  143. }
  144. /// <summary>
  145. /// 仓室初始化
  146. /// </summary>
  147. /// <param name="tLInitControllerResult"></param>
  148. /// <param name="runHouses"></param>
  149. /// <param name="errorInfo"></param>
  150. /// <returns></returns>
  151. private bool InitHouse(TLInitControllerResult tLInitControllerResult, List<int> runHouses, ref string errorInfo)
  152. {
  153. try
  154. {
  155. TLSetting tLSetting = tLInitControllerResult.TLSetting;
  156. AppData.TLSetting = tLSetting;
  157. var allList = AppData.SerialBinController.GetDishAndBalanceDataController(tLSetting.tlSn);
  158. int housesn = 11;
  159. AppData.BufferBottleBin = new BufferBottleBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), AppData.Instance.guanbiTime);
  160. AppData.InitBufferBottleBinEvent(AppData.BufferBottleBin);
  161. housesn = 1;
  162. AppData.HouseBin1 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  163. AppData.InitHouseBinEvent(AppData.HouseBin1);
  164. housesn = 2;
  165. AppData.HouseBin2 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  166. AppData.InitHouseBinEvent(AppData.HouseBin2);
  167. housesn = 3;
  168. AppData.HouseBin3 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  169. AppData.InitHouseBinEvent(AppData.HouseBin3);
  170. housesn = 4;
  171. AppData.HouseBin4 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  172. AppData.InitHouseBinEvent(AppData.HouseBin4);
  173. housesn = 5;
  174. AppData.HouseBin5 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  175. AppData.InitHouseBinEvent(AppData.HouseBin5);
  176. housesn = 6;
  177. AppData.HouseBin6 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  178. AppData.InitHouseBinEvent(AppData.HouseBin6);
  179. housesn = 7;
  180. AppData.HouseBin7 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  181. AppData.InitHouseBinEvent(AppData.HouseBin7);
  182. housesn = 8;
  183. AppData.HouseBin8 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  184. AppData.InitHouseBinEvent(AppData.HouseBin8);
  185. housesn = 9;
  186. AppData.HouseBin9 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  187. AppData.InitHouseBinEvent(AppData.HouseBin9);
  188. housesn = 10;
  189. AppData.HouseBin10 = new HouseBin(tLSetting, tLInitControllerResult.HouseList.FirstOrDefault(x => x.houseSn == housesn), allList.Dishes.FirstOrDefault(x => x.houseSn == housesn), allList.BalanceList.FirstOrDefault(x => x.houseSn == housesn), tLInitControllerResult.HouseWellList.Where(x => x.houseSn == housesn).ToList());
  190. AppData.InitHouseBinEvent(AppData.HouseBin10);
  191. AppData.HouseBin1.CamNum = CamNum;
  192. AppData.HouseBin2.CamNum = CamNum;
  193. AppData.HouseBin3.CamNum = CamNum;
  194. AppData.HouseBin4.CamNum = CamNum;
  195. AppData.HouseBin5.CamNum = CamNum;
  196. AppData.HouseBin6.CamNum = CamNum;
  197. AppData.HouseBin7.CamNum = CamNum;
  198. AppData.HouseBin8.CamNum = CamNum;
  199. AppData.HouseBin9.CamNum = CamNum;
  200. AppData.HouseBin10.CamNum = CamNum;
  201. if (!AppData.MvcTest)
  202. {
  203. if (runHouses.Contains(1)) AppData.HouseBin1.StartTask();
  204. if (runHouses.Contains(2)) AppData.HouseBin2.StartTask();
  205. if (runHouses.Contains(3)) AppData.HouseBin3.StartTask();
  206. if (runHouses.Contains(4)) AppData.HouseBin4.StartTask();
  207. if (runHouses.Contains(6)) AppData.HouseBin6.StartTask();
  208. if (runHouses.Contains(7)) AppData.HouseBin7.StartTask();
  209. if (runHouses.Contains(8)) AppData.HouseBin8.StartTask();
  210. if (runHouses.Contains(9)) AppData.HouseBin9.StartTask();
  211. if (runHouses.Contains(10)) AppData.HouseBin10.StartTask();
  212. }
  213. if (runHouses.Contains(5)) AppData.HouseBin5.StartTask();
  214. if (runHouses.Contains(11)) AppData.BufferBottleBin.StartTask();
  215. return true;
  216. }
  217. catch (Exception ex)
  218. {
  219. AppData.LogService.ExceptionLog(ex, "仓室初始化", null, LogEnum.RunException);
  220. errorInfo = ex.Message;
  221. return false;
  222. }
  223. }
  224. public void testc()
  225. {
  226. AppData = AppData.Instance;
  227. string body1 = AppData.ReadText(@"C:\Users\jxb\Desktop\work\10 时差\8 开发文档\6 服务器架构\link接口请求参数.txt");
  228. string body2 = AppData.ReadText(@"C:\Users\jxb\Desktop\work\10 时差\8 开发文档\6 服务器架构\init接口请求参数.txt");
  229. //AppData.SerialBinController.TLInitController(body1, body2);
  230. }
  231. public void testGetAutoFocusController()
  232. {
  233. AppData = AppData.Instance;
  234. PositionRequestDTO autoFocusDTO = new PositionRequestDTO
  235. {
  236. tlSn = "NEO-1-20230101",
  237. houseSn = 1,
  238. };
  239. AppData.HouseBinController.GetAutoFocusController(autoFocusDTO);
  240. }
  241. public void TestGetCCDPositionController()
  242. {
  243. AppData = AppData.Instance;
  244. PositionRequestDTO autoFocusDTO = new PositionRequestDTO
  245. {
  246. tlSn = "NEO-1-20230101",
  247. houseSn = 1,
  248. };
  249. AppData.HouseBinController.GetCCDPositionController(autoFocusDTO);
  250. }
  251. public void TestGetDishAndBalanceDataController()
  252. {
  253. AppData = AppData.Instance;
  254. //AppData.HouseBinController.GetDishAndBalanceDataController("NEO-1-20230101");
  255. }
  256. [DllImport("user32.dll", SetLastError = true)]
  257. static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  258. [DllImport("user32.dll", CharSet = CharSet.Auto)]
  259. static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
  260. delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
  261. [DllImport("user32.dll")]
  262. static extern bool EnumChildWindows(IntPtr hWndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);
  263. [DllImport("user32.dll")]
  264. static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
  265. [DllImport("user32.dll", CharSet = CharSet.Auto)]
  266. static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
  267. const uint WM_CLOSE = 0x0010;
  268. const uint BM_CLICK = 0x00F5;
  269. }
  270. }