MainController.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. using System;
  2. using System.Linq;
  3. using System.Text;
  4. using SHJX.Service.Dao;
  5. using SHJX.Service.Model.Dao;
  6. using System.Threading.Tasks;
  7. using System.Collections.Generic;
  8. using SHJX.Service.Common.Extend;
  9. using SHJX.Service.Model.Control;
  10. using SHJX.Service.Common.ReadXML;
  11. using SHJX.Service.Common.ExtendElement;
  12. using SHJX.Service.CustomControl;
  13. using System.Data;
  14. using Newtonsoft.Json.Linq;
  15. using System.Xml.Linq;
  16. namespace SHJX.Service.Control.ServiceController
  17. {
  18. public class MainController
  19. {
  20. /// <summary>
  21. /// 配置文件
  22. /// </summary>
  23. private static ReadConfigUtil _config;
  24. /// <summary>
  25. /// 数据库
  26. /// </summary>
  27. private static MainManager _dataManager;
  28. public MainManager DataManager;
  29. public MainController(ReadConfigUtil config)
  30. {
  31. _config = config;
  32. _dataManager = new MainManager(config);
  33. DataManager = _dataManager;
  34. }
  35. public List<EquipmentMotor> GetEquipmentMotors()
  36. {
  37. return DataCentre.GetMotor;
  38. }
  39. /// <summary>
  40. /// 打开连接
  41. /// </summary>
  42. public Task<(string, bool)> ClientOpen()
  43. {
  44. return Task.Factory.StartNew(() => DataCentre.GetClient.Open());
  45. }
  46. /// <summary>
  47. /// 设置速度、加速度、减速度
  48. /// </summary>
  49. /// <param name="speed"></param>
  50. /// <returns></returns>
  51. public bool SetSpeed(MotorSpeed speed)
  52. {
  53. #region 速度
  54. PortArgs speedArgs = new PortArgs()
  55. {
  56. TypeName = speed.NodeName,
  57. Distance = speed.Speed,
  58. WriteWay = WriteWay.Speed
  59. };
  60. var res = DataCentre.GetClient.Factory(speed.NodeName).Write(speedArgs);
  61. #endregion
  62. #region 加速度
  63. var acSpeedArgs = new PortArgs()
  64. {
  65. TypeName = speed.NodeName,
  66. Distance = speed.AcSpeed,
  67. WriteWay = WriteWay.AcSpeed
  68. };
  69. res = res && DataCentre.GetClient.Factory(speed.NodeName).Write(acSpeedArgs);
  70. #endregion
  71. #region 减速度
  72. PortArgs deSpeedArgs = new()
  73. {
  74. TypeName = speed.NodeName,
  75. Distance = speed.DeSpeed,
  76. WriteWay = WriteWay.DeSpeed
  77. };
  78. res = res && DataCentre.GetClient.Factory(speed.NodeName).Write(deSpeedArgs);
  79. #endregion
  80. return res;
  81. }
  82. public List<(string, string)> GetHeatAtPresent()
  83. {
  84. List<(string, string)> ringNames = new List<(string, string)>();
  85. foreach (var item in _dataManager.GetHeatingTaskAtPresent())
  86. {
  87. ringNames.Add((item.To, item.OriginLocalName.Replace("A", string.Empty)));
  88. }
  89. return ringNames;
  90. }
  91. public bool CheckHeatingIsRunning()
  92. {
  93. var equipment = _dataManager.CheckHeatRodStatus();
  94. EquipmentEnum[] status = new EquipmentEnum[] { EquipmentEnum.Start, EquipmentEnum.Waiting };
  95. return status.Contains(equipment.EquipmentState);
  96. }
  97. public bool UpdateHeatingIsRunning()
  98. {
  99. var portArgs = new PortArgs
  100. {
  101. TypeName = "Heat",
  102. Distance = -100,
  103. Reserve = DataCentre._dataManager.GetPid("Dissolve")
  104. };
  105. DataCentre.GetClient.Factory("Heat").Write(portArgs);
  106. var equipment = _dataManager.CheckHeatRodStatus();
  107. equipment.EquipmentState = EquipmentEnum.Stop;
  108. equipment.Udf1 = string.Empty;
  109. equipment.Udf2 = "0";
  110. return _dataManager.Update(equipment) > 0;
  111. }
  112. /// <summary>
  113. /// 启动时,所有设备返回原点
  114. /// </summary>
  115. /// <returns></returns>
  116. public async Task<bool> StartEquipmentGoBackAsync()
  117. {
  118. #region 四轴
  119. var portArgs = new PortArgs()
  120. {
  121. ReadWay = "OriginalPosition",
  122. WriteWay = WriteWay.GoBack
  123. };
  124. #region Z轴单独罗列
  125. portArgs.TypeName = "MotorZ";
  126. if (!((bool)DataCentre.GetClient.Factory("MotorZ").Read(portArgs)))
  127. {
  128. DataCentre.GetClient.Factory("MotorZ").Write(portArgs);
  129. }
  130. portArgs.TypeName.UpdateMotorPoint();
  131. #endregion
  132. #region X、Y、T轴
  133. #region 设置电机速度
  134. if (_config.SpeedWrite)
  135. {
  136. MotorSpeed item = _config.GetSpeed[0];
  137. item.Speed = 6;
  138. SetSpeed(item);
  139. MotorSpeed item1 = _config.GetSpeed[1];
  140. item1.Speed = 6;
  141. SetSpeed(item1);
  142. }
  143. #endregion
  144. string[] gobackPoint = new string[] { "MotorX", "MotorY", "MotorT" };
  145. var res = true;
  146. foreach (var item in gobackPoint)
  147. {
  148. res = res && await Task.Factory.StartNew(() =>
  149. {
  150. portArgs.TypeName = item;
  151. return (bool)DataCentre.GetClient.Factory(item).Read(portArgs) || DataCentre.GetClient.Factory(item).Write(portArgs);
  152. });
  153. item.UpdateMotorPoint();
  154. }
  155. #region 设置电机速度
  156. if (_config.SpeedWrite)
  157. {
  158. MotorSpeed item = _config.GetSpeed[0];
  159. SetSpeed(item);
  160. MotorSpeed item1 = _config.GetSpeed[1];
  161. SetSpeed(item1);
  162. }
  163. #endregion
  164. #endregion
  165. #endregion
  166. #region 升降台
  167. var cagePortArgs = new PortArgs()
  168. {
  169. TypeName = "Cage",
  170. WriteWay = WriteWay.Normotopia
  171. };
  172. res = res && DataCentre.GetClient.Factory("Cage").Write(cagePortArgs);
  173. var cageStatus = _dataManager.GetEquipmentStatusByName("Cage");
  174. cageStatus.EquipmentState = EquipmentEnum.Normotopia;
  175. _dataManager.Update(cageStatus);
  176. #endregion
  177. #region 消解位
  178. var dissolvePortArgs = new PortArgs()
  179. {
  180. TypeName = "Dissolve",
  181. ReadWay = "OriginalPosition",
  182. WriteWay = WriteWay.Antiposition
  183. };
  184. res = res && (bool)DataCentre.GetClient.Factory("Dissolve").Read(dissolvePortArgs) || DataCentre.GetClient.Factory("Dissolve").Write(dissolvePortArgs);
  185. "Dissolve".UpdateMotorPoint();
  186. var dissolveStatus = _dataManager.GetEquipmentStatusByName("DissolvePosition");
  187. dissolveStatus.EquipmentState = EquipmentEnum.Normotopia;
  188. _dataManager.Update(dissolveStatus);
  189. #endregion
  190. res = DataCentre.GetStorageContent.Factory("DripNozzle").Stop();
  191. #region 硫酸银泵回原点
  192. var silverSulfatePortArgs = new PortArgs()
  193. {
  194. TypeName = "SilverSulfate",
  195. ReadWay = "OriginalPosition",
  196. WriteWay = WriteWay.GoBack
  197. };
  198. int count = 20;
  199. while (!((bool)DataCentre.GetClient.Factory("SilverSulfate").Read(silverSulfatePortArgs)))
  200. {
  201. if (count-- < 1)
  202. { break; }
  203. silverSulfatePortArgs.WriteWay = WriteWay.Move;
  204. silverSulfatePortArgs.Distance = 1000;
  205. DataCentre.GetClient.Factory("SilverSulfate").Write(silverSulfatePortArgs);
  206. }
  207. #endregion
  208. //res = DataCentre.GetStorageContent.Factory("DripNozzle2").Stop();
  209. return res;
  210. }
  211. public bool zBackToPoint()
  212. {
  213. PortArgs portArg = new()
  214. {
  215. WriteWay = WriteWay.GoBack,
  216. TypeName = "MotorZ",
  217. Distance = "MotorZ".MotorFinal()
  218. };
  219. var res = DataCentre.GetClient.Factory("MotorZ").Write(portArg);
  220. return res;
  221. }
  222. public List<EquipmentTask> GetResidueWashTasks()
  223. {
  224. return _dataManager.GetResidueWashTask();
  225. }
  226. /// <summary>
  227. /// 获取剩余任务
  228. /// </summary>
  229. /// <returns></returns>
  230. public List<EquipmentTask> GetResidueTask()
  231. {
  232. return _dataManager.GetEquipmentTasks();
  233. }
  234. /// <summary>
  235. /// 根据uuid获取任务
  236. /// </summary>
  237. /// <param name="guid"></param>
  238. /// <param name="states"></param>
  239. /// <returns></returns>
  240. public List<EquipmentTask> GetTaskByUUID(string guid, params TaskState[] states)
  241. {
  242. return _dataManager.QueryTaskByUuid(guid, states).ToList();
  243. }
  244. /// <summary>
  245. /// 删除剩余任务
  246. /// </summary>
  247. /// <param name="tasks"></param>
  248. /// <returns></returns>
  249. public bool DeleteResidueTask(List<EquipmentTask> tasks)
  250. {
  251. var rows = _dataManager.Delete(tasks);
  252. return rows > 0;
  253. }
  254. /// <summary>
  255. /// 更新剩余任务状态(变更为取消)
  256. /// </summary>
  257. /// <param name="tasks"></param>
  258. /// <returns></returns>
  259. public bool UpdateResidueTaskState(List<EquipmentTask> tasks)
  260. {
  261. var rows = _dataManager.Update(tasks);
  262. return rows > 0;
  263. }
  264. public bool UpdateTaskState(EquipmentTask task)
  265. {
  266. var task2= _dataManager.GetEquipmentTasks(task).Where(item => item.OriginLocalName.Equals(task.OriginLocalName)).ToList();
  267. if(task2.Count > 0)
  268. {
  269. task2[0].Result = task.Result;
  270. task2[0].Amount = task.Amount;
  271. var rows = _dataManager.Update(task2);
  272. return rows == 1;
  273. }
  274. else
  275. return false;
  276. }
  277. /// <summary>
  278. /// 查询区域
  279. /// </summary>
  280. /// <returns></returns>
  281. public List<EquipmentArea> QueryArea()
  282. {
  283. return _dataManager.GetAreasByDisable();
  284. }
  285. public string GetWavekeyValue()
  286. {
  287. OptionWindows option = new(_dataManager.GetWavekeys());
  288. return (bool)option.ShowDialog() ? option.WaveKey : string.Empty;
  289. }
  290. /// <summary>
  291. /// Word转换
  292. /// </summary>
  293. /// <param name="wavekey"></param>
  294. /// <returns></returns>
  295. public async Task<bool> ConvertWordAsync(string wavekey)
  296. {
  297. try
  298. {
  299. var path = _config.ResultWordFilePath;
  300. var maxVolume = DataCentre.GetBalanceValue.MaxVolume;
  301. var tasks = _dataManager.QueryTaskByUuid(wavekey, TaskState.Finished);
  302. if (!tasks.Any())
  303. {
  304. UMessageBox.Error("暂未发现已完成任务!");
  305. return false;
  306. }
  307. if (string.IsNullOrWhiteSpace(path))
  308. {
  309. UMessageBox.Error("请查看保存路径是否正确!");
  310. return false;
  311. }
  312. var res = false;
  313. if (_config.ExportTypeByWord)
  314. {
  315. res = await Task.Factory.StartNew(() => tasks.ConvertToWord(path, maxVolume));
  316. }
  317. else if(_config.ExportTypeByExcel)
  318. { res = await Task.Factory.StartNew(() => tasks.ConvertToExcel(path)); }
  319. return res;
  320. }
  321. catch (Exception)
  322. {
  323. throw new Exception();
  324. }
  325. }
  326. public void deleteTask(string nodeName)
  327. {
  328. _dataManager.QuerydeledeTask(nodeName);
  329. }
  330. public void QuerydeledeEmptyCupTask(string nodeName)
  331. {
  332. _dataManager.QuerydeledeEmptyCupTask(nodeName);
  333. }
  334. /// <summary>
  335. /// UI界面任务下发水样任务
  336. /// </summary>
  337. /// <param name="args"></param>
  338. /// <param name="waveKey"></param>
  339. /// <returns></returns>
  340. public IEnumerable<ResponseData> SendSampleToControl(List<SampleDetail> args, string waveKey)
  341. {
  342. var tasks = new List<EquipmentTask>();
  343. var resList = new List<ResponseData>();
  344. var successSend = new StringBuilder(); //这里是已下发的
  345. var repetitionSend = new StringBuilder(); //这里是重复
  346. foreach (var item in args)
  347. {
  348. if (_dataManager.QueryContainTask(item.NodeName))
  349. {
  350. repetitionSend.AppendFormat("{0} ", item.NodeName);
  351. continue;
  352. }
  353. successSend.AppendFormat("{0} ", item.NodeName);
  354. var task = item.NewSampleTask(waveKey); //创建任务
  355. tasks.Add(task);
  356. _dataManager.QuerydeledeTask(item.NodeName);
  357. }
  358. _dataManager.Insert(tasks);
  359. var successData = new ResponseData();
  360. var errorData = new ResponseData();
  361. if (successSend.Length > 0)
  362. {
  363. successData.Code = 200;
  364. successData.Message = string.Concat(successSend.ToString(), "任务下发成功!");
  365. resList.Add(successData);
  366. return resList;
  367. }
  368. if (repetitionSend.Length <= 0) return resList;
  369. errorData.Code = 404;
  370. errorData.Message = string.Concat(repetitionSend.ToString(), "地址有在执行的任务,请勿重复下发任务!");
  371. resList.Add(errorData);
  372. return resList;
  373. }
  374. /// <summary>
  375. /// 检查是否已存在任务
  376. /// </summary>
  377. /// <returns></returns>
  378. public bool CheckExistTask()
  379. {
  380. return _dataManager.GetEquipmentTasks().Where(item => item.Status.Equals(TaskState.New) || item.Status.Equals(TaskState.Doing)).Any();
  381. }
  382. public List<EquipmentTask> CheckExistTaskBD(string wavekey)
  383. {
  384. return _dataManager.GetEquipmentTasksBD(wavekey).Where(item => item.Status.Equals(TaskState.Finished)).ToList();
  385. }
  386. public List<EquipmentTask> GetUpdateValue(params string[] values)
  387. {
  388. return _dataManager.GetTaskByConcentration(values);
  389. }
  390. /// <summary>
  391. /// 下发润洗的任务
  392. /// </summary>
  393. public bool SendWashTask(string detailName,string waveKey)
  394. {
  395. if (_dataManager.GetResidueWashTask().Any())
  396. return false;
  397. var washTask = detailName.NewWashTask();
  398. washTask.WaveKey = waveKey;
  399. if (washTask is null) return false;
  400. return _dataManager.Insert(washTask) > 0;
  401. }
  402. /// <summary>
  403. /// 写入预热温度
  404. /// </summary>
  405. public void WritePreheatTemperature()
  406. {
  407. var portArgs = new PortArgs
  408. {
  409. TypeName = "Heat",
  410. Reserve = _dataManager.GetPid("Preheat"),
  411. Distance = Convert.ToInt32(_config.PreheatTemperature)
  412. };
  413. DataCentre.GetClient.Factory("Heat").Write(portArgs);
  414. Action action = () => UMessageBox.SuccessTip("预热写入成功!");
  415. do
  416. {
  417. if (DataCentre.GetClient.Factory("Heat").Read(portArgs) is not Dictionary<string, double> obj) continue;
  418. //设定温度小于或等于实际温度
  419. if (Math.Round(obj["sv"]) <= Math.Round(obj["pv"])) break;
  420. } while (true);
  421. portArgs.Distance = -100;
  422. DataCentre.GetClient.Factory("Heat").Write(portArgs);
  423. action = () => UMessageBox.SuccessTip("预热结束!");
  424. }
  425. public void StopHeatingTemperature()
  426. {
  427. if (CheckHeatingIsRunning())
  428. {
  429. var portArgs = new PortArgs
  430. {
  431. TypeName = "Heat",
  432. Distance = -99,
  433. Reserve = DataCentre._dataManager.GetPid("Dissolve")
  434. };
  435. DataCentre.GetClient.Factory("Heat").Write(portArgs);
  436. string EquipmentName = "HeatRod";
  437. var status = EquipmentName.GetEquipmentState(); //获取加热棒的状态
  438. status.EquipmentState = EquipmentEnum.Waiting;
  439. _dataManager.Update(status);
  440. Action action = () => UMessageBox.SuccessTip("已停止加热!");
  441. }
  442. }
  443. /// <summary>
  444. /// 获取WaveKey
  445. /// </summary>
  446. /// <returns></returns>
  447. public string GetWavekey()
  448. {
  449. List<EquipmentTask> equipmentTasks = _dataManager.GetExistTask();
  450. if (equipmentTasks.Any())
  451. {
  452. return equipmentTasks.GroupBy(item => item.WaveKey).FirstOrDefault()?.Key;
  453. }
  454. Batch batch = _dataManager.GetBatch();
  455. if (batch == null || batch.Createtime.ToString("yyyyMMdd") != DateTime.Now.ToString("yyyyMMdd"))
  456. {
  457. batch = new Batch
  458. {
  459. CurrentValue = 1,
  460. Createtime = DateTime.Now
  461. };
  462. }
  463. else
  464. {
  465. ++batch.CurrentValue;
  466. }
  467. _dataManager.Insert(batch);
  468. Wavekey wavakey = new()
  469. {
  470. WaveKey = $"{DateTime.Now:yyyyMMdd}{batch.CurrentValue.ToString().PadLeft(3, '0')}"
  471. };
  472. //20210604001;
  473. _dataManager.Insert(wavakey);
  474. return wavakey.WaveKey;
  475. }
  476. }
  477. }