WCSApi.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  1. using DBHelper;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Microsoft.EntityFrameworkCore;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using WCS.Core;
  8. using WCS.Entity;
  9. using WCS.Entity.Protocol;
  10. using WCS.Service.Entity;
  11. using WCS.Service.WebApi.ViewModels;
  12. namespace WCS.Service.WebApi
  13. {
  14. [ApiController]
  15. [Route("[controller]/[action]")]
  16. public class WCSApi : ControllerBase
  17. {
  18. [HttpPost]
  19. public WcsContractApiResponse I_WMS_CreateTasks(List<PushCreateWcsTaskRequest> list)
  20. {
  21. var res = new WcsContractApiResponse();
  22. try
  23. {
  24. DB.Do(db =>
  25. {
  26. foreach (var obj in list)
  27. {
  28. if (obj.TaskType == "3")//移库任务
  29. {
  30. var wmstaskid = int.Parse(obj.WMSTaskNo);
  31. if (db.Default.Set<WCS_TASK>().Any(v => v.WMSTASK == wmstaskid))
  32. throw new Exception("任务号" + wmstaskid + "重复下发");
  33. var scid = int.Parse(obj.SRMNo.Last().ToString());
  34. var tunnel = (scid > 3 ? "TM" : "TY") + obj.StartTunnel;
  35. var task = new WCS_TASK
  36. {
  37. TYPE = TaskType.移库,
  38. STATUS = WCS.Entity.TaskStatus.新建,
  39. DEVICE = "SC" + obj.SRMNo.Last(),
  40. BARCODE = obj.PalletCode,
  41. ADDRFROM = obj.StartLocation,
  42. ADDRTO = obj.EndLocation,
  43. UPDATETIME = DateTime.Now,
  44. UPDATEUSER = "WMS",
  45. TUNNEL = tunnel,
  46. WMSTASK = int.Parse(obj.WMSTaskNo),
  47. };
  48. db.Default.Add(task);
  49. db.Default.SaveChanges();
  50. //task.CreateStatusLog(db);
  51. }
  52. else if (obj.TaskType == "2")
  53. { //出库任务
  54. var wmstaskid = int.Parse(obj.WMSTaskNo);
  55. if (db.Default.Set<WCS_TASK>().Any(v => v.WMSTASK == wmstaskid))
  56. throw new Exception("任务号" + wmstaskid + "重复下发");
  57. var scid = int.Parse(obj.SRMNo.Last().ToString());
  58. var tunnel = (scid > 3 ? "TM" : "TY") + obj.StartTunnel;
  59. var task = new WCS_TASK
  60. {
  61. TYPE = TaskType.出库,
  62. STATUS = WCS.Entity.TaskStatus.新建,
  63. DEVICE = "SC" + obj.SRMNo.Last(),
  64. BARCODE = obj.PalletCode,
  65. ADDRFROM = string.Format("{0}-{1}-{2}", obj.StartRow, obj.StartCol, obj.StartLayer),
  66. ADDRTO = obj.EndLocation,
  67. UPDATETIME = DateTime.Now,
  68. UPDATEUSER = "WMS",
  69. TUNNEL = tunnel,
  70. WMSTASK = int.Parse(obj.WMSTaskNo),
  71. ADDRNEXT = obj.EndLocation
  72. };
  73. if (task.ADDRTO == "2122")
  74. task.ADDRNEXT = "2108";
  75. else if (task.ADDRTO == "2131")
  76. task.ADDRNEXT = "2366";
  77. else if (task.ADDRTO == "2143")
  78. task.ADDRNEXT = "2385";
  79. else if (task.ADDRTO == "2086")
  80. task.ADDRNEXT = "2325";
  81. var next = Device.Find(tunnel).GetNext(task.ADDRTO);
  82. if (next == null)
  83. throw new Exception("创建失败");
  84. task.SCSTATION = next.CODE;
  85. db.Default.Add(task);
  86. db.Default.SaveChanges();
  87. //task.CreateStatusLog(db);
  88. }
  89. else if (obj.TaskType == "1")
  90. {//入库任务
  91. var wmstaskid = int.Parse(obj.WMSTaskNo);
  92. if (db.Default.Set<WCS_TASK>().Any(v => v.WMSTASK == wmstaskid))
  93. throw new Exception("任务号" + wmstaskid + "重复下发");
  94. if (obj.StartLocation.Contains("_Back_"))
  95. {//生成AGV入库任务
  96. var ws = int.Parse(obj.StartLocation.Split('_')[1]);
  97. var agvtask = new WCS_AGVTask
  98. {
  99. AGVStatus = AGVTaskStatus.新建,
  100. Status = AGVTaskStatus.新建,
  101. Position = obj.StartLocation,
  102. TaskType = AGVTaskType.入库,
  103. CreateTime = DateTime.Now,
  104. UpdateTime = DateTime.Now,
  105. Workshop = ws,
  106. };
  107. if (ws == 13 || ws == 14)
  108. {
  109. agvtask.Station = "2088";
  110. agvtask.Workshop = 1314;
  111. }
  112. else if (ws == 1)
  113. {
  114. agvtask.Station = "2122";
  115. }
  116. else if (ws == 2)
  117. agvtask.Station = "2131";
  118. else if (ws == 3)
  119. agvtask.Station = "2143";
  120. db.Default.Set<WCS_AGVTask>().Add(agvtask);
  121. db.Default.SaveChanges();
  122. }
  123. else
  124. {
  125. var task = new WCS_TASK
  126. {
  127. TYPE = TaskType.入库,
  128. STATUS = WCS.Entity.TaskStatus.新建,
  129. BARCODE = obj.PalletCode,
  130. ADDRFROM = obj.StartLocation,
  131. ADDRTO = obj.EndLocation,
  132. UPDATETIME = DateTime.Now,
  133. UPDATEUSER = "WMS",
  134. WMSTASK = int.Parse(obj.WMSTaskNo)
  135. };
  136. db.Default.Add(task);
  137. db.Default.SaveChanges();
  138. //task.CreateStatusLog(db);
  139. }
  140. }
  141. }
  142. });
  143. res.ResType = true;
  144. }
  145. catch (Exception ex)
  146. {
  147. res.ResMessage = ex.GetBaseException().Message;
  148. }
  149. return res;
  150. }
  151. [HttpPost]
  152. public WcsContractApiResponse I_WMS_CreateAGVTask(PushCreateAGVTaskRequest obj)
  153. {
  154. var res = new WcsContractApiResponse();
  155. try
  156. {
  157. DB.Do(db =>
  158. {
  159. if (obj.Type == 1)
  160. {
  161. var ws = int.Parse(obj.StartPos.Split('_')[1]);
  162. var agvtask = new WCS_AGVTask
  163. {
  164. AGVStatus = AGVTaskStatus.新建,
  165. Status = AGVTaskStatus.新建,
  166. Position = obj.StartPos,
  167. TaskType = AGVTaskType.入库,
  168. CreateTime = DateTime.Now,
  169. UpdateTime = DateTime.Now,
  170. Workshop = ws,
  171. };
  172. if (ws == 13 || ws == 14)
  173. {
  174. agvtask.Station = "2088";
  175. agvtask.Workshop = 1314;
  176. }
  177. else if (ws == 1)
  178. {
  179. agvtask.Station = "2122";
  180. }
  181. else if (ws == 2)
  182. agvtask.Station = "2131";
  183. else if (ws == 3)
  184. agvtask.Station = "2143";
  185. db.Default.Set<WCS_AGVTask>().Add(agvtask);
  186. db.Default.SaveChanges();
  187. }
  188. else
  189. throw new Exception($"类型{obj.Type}不支持");
  190. });
  191. res.ResType = true;
  192. }
  193. catch (Exception ex)
  194. {
  195. res.ResMessage = ex.GetBaseException().Message;
  196. }
  197. return res;
  198. }
  199. [HttpPost]
  200. public WcsContractApiResponse I_CancelWCSTaskByCode(string code)
  201. {
  202. var res = new WcsContractApiResponse();
  203. try
  204. {
  205. DB.Do(db =>
  206. {
  207. var task = db.Default.Set<WCS_TASK>().Where(v => v.BARCODE == code && v.STATUS < WCS.Entity.TaskStatus.已完成 && v.TYPE == TaskType.组盘).FirstOrDefault();
  208. if (task == null)
  209. throw new Exception("WCS任务不存在");
  210. task.STATUS = WCS.Entity.TaskStatus.已取消;
  211. task.UPDATETIME = DateTime.Now;
  212. task.UPDATEUSER = "RF";
  213. db.Default.SaveChanges();
  214. });
  215. res.ResType = true;
  216. }
  217. catch (Exception ex)
  218. {
  219. res.ResMessage = ex.GetBaseException().Message;
  220. }
  221. return res;
  222. }
  223. [HttpPost]
  224. public WcsContractApiResponse I_CancelWCSTaskByID(int wmstaskId)
  225. {
  226. var res = new WcsContractApiResponse();
  227. try
  228. {
  229. DB.Do(db =>
  230. {
  231. var task = db.Default.Set<WCS_TASK>().Where(v => v.WMSTASK == wmstaskId).FirstOrDefault();
  232. if (task == null)
  233. throw new Exception("WCS任务不存在");
  234. if (task.STATUS != WCS.Entity.TaskStatus.新建)
  235. throw new Exception("WCS任务当前状态不允许取消");
  236. task.STATUS = WCS.Entity.TaskStatus.已取消;
  237. task.UPDATETIME = DateTime.Now;
  238. task.UPDATEUSER = "WMS";
  239. db.Default.SaveChanges();
  240. if (task.TYPE == TaskType.出库 && task.AgvTask > 0)
  241. {
  242. var agvtask = db.Default.Set<WCS_AGVTask>().Find(task.AgvTask);
  243. agvtask.Status = AGVTaskStatus.取消;
  244. agvtask.UpdateTime = DateTime.Now;
  245. db.Default.SaveChanges();
  246. }
  247. });
  248. res.ResType = true;
  249. }
  250. catch (Exception ex)
  251. {
  252. res.ResMessage = ex.GetBaseException().Message;
  253. }
  254. return res;
  255. }
  256. /// <summary>
  257. /// WMS 通过该接口获取码垛位当前各位置对应的托盘码
  258. /// </summary>
  259. /// <returns></returns>
  260. [HttpGet]
  261. public List<KeyValueViewModel<string, string>> I_WMS_GetPalletCode()
  262. {
  263. //找出所有组盘站台信息
  264. var station = Device.Where(v => v.Is(DF.组盘)).ToList();
  265. //找出所有有光电信号站台中的任务号
  266. var taskNumbers = station.Select(v => v.Device<IStation521, IStation520>())
  267. .Where(p => p.Data.TASKNUM != 0 && p.Data.PH_STATUS)
  268. .Select(p => p.Data.TASKNUM);
  269. var result = new List<KeyValueViewModel<string, string>>();
  270. DB.Do(db =>
  271. {
  272. //找到有光电的位置对应的任务
  273. var tasks = db.Default.Set<WCS_TASK>().AsNoTracking().Where(task => taskNumbers.Any(x => task.ID == x)).ToList();
  274. station.ForEach(p =>
  275. {
  276. var value = tasks.FirstOrDefault(task => task.ADDRTO == p.CODE);
  277. result.Add(new KeyValueViewModel<string, string>()
  278. {
  279. Key = p.CODE,
  280. Value = value == null ? null : value.BARCODE,
  281. });
  282. });
  283. });
  284. return result;
  285. }
  286. /// <summary>
  287. /// 通过该接口获取指定条件设备信息
  288. /// </summary>
  289. /// <param name="model">筛选条件</param>
  290. /// <returns></returns>
  291. [HttpPost]
  292. public List<DeviceStatusViewModel> GetDeviceStatus([FromQuery] DeviceStatusViewModel model)
  293. {
  294. var result = new List<DeviceStatusViewModel>();
  295. //找到所有设备的读取协议
  296. var rgv = Device.Where(v => v.IsRGV()).Select(v => v.Device<IRGV521>());
  297. var sc = Device.Where(v => v.IsSC()).Select(v => v.Device<ISC521>());
  298. var conv = Device.Where(v => v.IsConv()).Select(v => v.Device<IStation521>());
  299. var robot = Device.Where(v => v.IsRobot()).Select(v => v.Device<IRobot>());
  300. #region 检索分两部分,设备、任务(数据库)
  301. #region 设备信息
  302. if (!string.IsNullOrEmpty(model.CODE))
  303. {
  304. result.AddRange(GetDeviceStatusWhere(rgv, v => v.Entity.CODE == model.CODE));
  305. result.AddRange(GetDeviceStatusWhere(sc, v => v.Entity.CODE == model.CODE));
  306. result.AddRange(GetDeviceStatusWhere(conv, v => v.Entity.CODE == model.CODE));
  307. result.AddRange(GetDeviceStatusWhere(robot, v => v.Entity.CODE == model.CODE));
  308. }
  309. if (model.TASKNUM > 10000)
  310. {
  311. result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID == model.TASKNUM));
  312. result.AddRange(GetDeviceStatusWhere(sc, v => v.Data.TaskID == model.TASKNUM));
  313. result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.TASKNUM == model.TASKNUM));
  314. result.AddRange(GetDeviceStatusWhere(robot, v => v.Data.TaskID == model.TASKNUM));
  315. }
  316. if (model.REQUEST != null)
  317. {
  318. result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.REQUEST == model.REQUEST));
  319. }
  320. if (model.PH_STATUS != null)
  321. {
  322. result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID == model.TASKNUM));
  323. result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.REQUEST == model.REQUEST));
  324. }
  325. if (!string.IsNullOrEmpty(model.ADDRFROM))
  326. {
  327. result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.StartPosition == short.Parse(model.ADDRFROM)));
  328. result.AddRange(GetDeviceStatusWhere(sc, v => model.ADDRFROM.Contains(v.Data.SLine.ToString())
  329. || model.ADDRFROM.Contains(v.Data.SCol.ToString())
  330. || model.ADDRFROM.Contains(v.Data.SLayer.ToString())));
  331. }
  332. if (!string.IsNullOrEmpty(model.ADDRTO))
  333. {
  334. result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.DestPosition == short.Parse(model.ADDRTO)));
  335. result.AddRange(GetDeviceStatusWhere(sc, v => model.ADDRTO.Contains(v.Data.ELine.ToString())
  336. || model.ADDRTO.Contains(v.Data.ECol.ToString())
  337. || model.ADDRTO.Contains(v.Data.ELayer.ToString())));
  338. result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.GOODSEND == short.Parse(model.ADDRTO)));
  339. result.AddRange(GetDeviceStatusWhere(robot, v => v.Data.Target == short.Parse(model.ADDRTO)));
  340. }
  341. #endregion 设备信息
  342. #region 任务信息
  343. //获取所有设备上的任务信息
  344. if (model.TYPE != null || !string.IsNullOrEmpty(model.BARCODE))
  345. {
  346. var info = new List<DeviceStatusViewModel>();
  347. var ids = result.Select(v => v.TASKNUM);
  348. info.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID > 10000));
  349. info.AddRange(GetDeviceStatusWhere(sc, v => v.Data.TaskID > 10000));
  350. info.AddRange(GetDeviceStatusWhere(conv, v => v.Data.TASKNUM > 10000));
  351. info.AddRange(GetDeviceStatusWhere(robot, v => v.Data.TaskID > 10000));
  352. result.AddRange(info.Where(v => !ids.Any(b => b == v.TASKNUM)));
  353. }
  354. DB.Do(db =>
  355. {
  356. var ids = result.Select(v => v.TASKNUM);
  357. var tasks = db.Default.Set<WCS_TASK>().AsNoTracking().Where(v => ids.Any(b => b == v.ID)).ToList();
  358. tasks.ForEach(task =>
  359. {
  360. var info = result.Find(v => v.TASKNUM == task.ID);
  361. info.TYPE = task.TYPE;
  362. info.BARCODE = task.BARCODE;
  363. });
  364. });
  365. if (model.TYPE != null)
  366. {
  367. result = result.Where(v => v.TYPE == model.TYPE).ToList();
  368. }
  369. if (!string.IsNullOrEmpty(model.BARCODE))
  370. {
  371. result = result.Where(v => v.BARCODE != null && v.BARCODE.Contains(model.BARCODE)).ToList();
  372. }
  373. #endregion 任务信息
  374. #endregion 检索分两部分,设备、任务(数据库)
  375. return result;
  376. }
  377. /// <summary>
  378. /// 通过该接口获取wcs报警信息
  379. /// </summary>
  380. /// <param name="query"></param>
  381. /// <returns></returns>
  382. [HttpPost]
  383. public List<V_WCSALARM> GetWcsAlarms(ALARMQUERY query)
  384. {
  385. var wcsAlarms = new List<V_WCSALARM>();
  386. query.EQUNO = String.IsNullOrEmpty(query.EQUNO) ? "" : query.EQUNO;
  387. query.ALARMFUNC = String.IsNullOrEmpty(query.ALARMFUNC) ? "" : query.ALARMFUNC;
  388. query.ALARMS = String.IsNullOrEmpty(query.ALARMS) ? "" : query.ALARMS;
  389. query.ALARMTYPE = String.IsNullOrEmpty(query.ALARMTYPE) ? "" : query.ALARMTYPE;
  390. query.WCSTASKNO = String.IsNullOrEmpty(query.WCSTASKNO) ? "" : query.WCSTASKNO;
  391. try
  392. {
  393. DB.Do(db =>
  394. {
  395. var scAlarms = db.Default.Set<WCS_SC537>()
  396. .Where(v => "设备报警".Contains(query.ALARMTYPE))
  397. .Where(v => v.SCAlarm > 0)
  398. .Where(v => v.DEVICECODE.Contains(query.EQUNO))
  399. .Where(v => query.STARTTIME <= v.UPDATETIME && query.ENTTIME >= v.UPDATETIME).ToList()
  400. .Where(v => v.SCAlarm.ToString().Contains(query.ALARMS));
  401. var stationAlarms = db.Default.Set<WCS_STATION523>()
  402. .Where(v => "设备报警".Contains(query.ALARMTYPE))
  403. .Where(v => v.Fault > 0)
  404. .Where(v => v.DEVICECODE.Contains(query.EQUNO))
  405. .Where(v => query.STARTTIME <= v.UPDATETIME && query.ENTTIME >= v.UPDATETIME).ToList()
  406. .Where(v => v.Fault.ToString().Contains(query.ALARMS));
  407. var rgvAlarms = db.Default.Set<WCS_RGV523>()
  408. .Where(v => "设备报警".Contains(query.ALARMTYPE))
  409. .Where(v => v.Fault > 0)
  410. .Where(v => v.DEVICECODE.Contains(query.EQUNO))
  411. .Where(v => query.STARTTIME <= v.UPDATETIME && query.ENTTIME >= v.UPDATETIME).ToList()
  412. .Where(v => v.Fault.ToString().Contains(query.ALARMS));
  413. var exception = db.Default.Set<WCS_EXCEPTION>()
  414. .Where(v => "系统异常".Contains(query.ALARMTYPE))
  415. .Where(v => query.STARTTIME <= v.UPDATETIME && query.ENTTIME >= v.UPDATETIME).ToList()
  416. .Where(v => v.MSG.Contains(query.ALARMS));
  417. foreach (var a in scAlarms)
  418. {
  419. wcsAlarms.Add(new V_WCSALARM
  420. {
  421. EQUNO = a.DEVICECODE,
  422. ALARMS = a.SCAlarm.ToString(),
  423. WCSTASKNO = "",
  424. TIME = a.UPDATETIME,
  425. ALARMTYPE = "设备报警",
  426. ALARMFUNC = ""
  427. });
  428. }
  429. foreach (var a in stationAlarms)
  430. {
  431. wcsAlarms.Add(new V_WCSALARM
  432. {
  433. EQUNO = a.DEVICECODE,
  434. ALARMS = a.Fault.ToString(),
  435. WCSTASKNO = "",
  436. TIME = a.UPDATETIME,
  437. ALARMTYPE = "设备报警",
  438. ALARMFUNC = ""
  439. });
  440. }
  441. foreach (var a in rgvAlarms)
  442. {
  443. wcsAlarms.Add(new V_WCSALARM
  444. {
  445. EQUNO = a.DEVICECODE,
  446. ALARMS = a.Fault.ToString(),
  447. WCSTASKNO = "",
  448. TIME = a.UPDATETIME,
  449. ALARMTYPE = "设备报警",
  450. ALARMFUNC = ""
  451. });
  452. }
  453. foreach (var a in exception)
  454. {
  455. wcsAlarms.Add(new V_WCSALARM
  456. {
  457. EQUNO = "",
  458. ALARMS = a.MSG.ToString(),
  459. WCSTASKNO = "",
  460. TIME = a.UPDATETIME,
  461. ALARMTYPE = "系统异常",
  462. ALARMFUNC = ""
  463. });
  464. }
  465. });
  466. }
  467. catch (Exception ex)
  468. {
  469. throw new Exception(ex.Message);
  470. }
  471. return wcsAlarms;
  472. }
  473. #region 静态方法
  474. /// <summary>
  475. /// 获取RGV设备信息
  476. /// </summary>
  477. /// <param name="soue"></param>
  478. /// <param name="func"></param>
  479. /// <returns></returns>
  480. public static List<DeviceStatusViewModel> GetDeviceStatusWhere(IEnumerable<Device<IRGV521>> soue, Func<Device<IRGV521>, bool> func)
  481. {
  482. var result = new List<DeviceStatusViewModel>();
  483. result.AddRange(soue.Where(func).Select(device =>
  484. {
  485. return new DeviceStatusViewModel
  486. {
  487. CODE = device.Entity.CODE,
  488. TASKNUM = device.Data.TaskID,
  489. PH_STATUS = device.Data.PH_Status,
  490. ADDRFROM = device.Data.StartPosition.ToString(),
  491. ADDRTO = device.Data.DestPosition.ToString(),
  492. };
  493. }));
  494. return result;
  495. }
  496. /// <summary>
  497. /// 获取堆垛机设备信息
  498. /// </summary>
  499. /// <param name="soue"></param>
  500. /// <param name="func"></param>
  501. /// <returns></returns>
  502. public static List<DeviceStatusViewModel> GetDeviceStatusWhere(IEnumerable<Device<ISC521>> soue, Func<Device<ISC521>, bool> func)
  503. {
  504. var result = new List<DeviceStatusViewModel>();
  505. result.AddRange(soue.Where(func).Select(device =>
  506. {
  507. var info = new DeviceStatusViewModel
  508. {
  509. CODE = device.Entity.CODE,
  510. TASKNUM = device.Data.TaskID,
  511. ADDRFROM = $"{device.Data.SLine}-{device.Data.SCol}-{device.Data.SLayer}",
  512. ADDRTO = device.Data.ELine.ToString(),
  513. };
  514. if (device.Data.ECol != 0 && device.Data.ELayer != 0)
  515. info.ADDRTO = $"{device.Data.ELine}-{device.Data.ECol}-{device.Data.ELayer}";
  516. return info;
  517. }));
  518. return result;
  519. }
  520. /// <summary>
  521. /// 获取输送机设备信息
  522. /// </summary>
  523. /// <param name="soue"></param>
  524. /// <param name="func"></param>
  525. /// <returns></returns>
  526. public static List<DeviceStatusViewModel> GetDeviceStatusWhere(IEnumerable<Device<IStation521>> soue, Func<Device<IStation521>, bool> func)
  527. {
  528. var result = new List<DeviceStatusViewModel>();
  529. result.AddRange(soue.Where(func).Select(device =>
  530. {
  531. return new DeviceStatusViewModel
  532. {
  533. CODE = device.Entity.CODE,
  534. TASKNUM = device.Data.TASKNUM,
  535. REQUEST = device.Data.REQUEST,
  536. PH_STATUS = device.Data.PH_STATUS,
  537. ADDRTO = device.Data.GOODSEND.ToString(),
  538. WEIGTH = device.Data.GOODSCODE / 10
  539. };
  540. }));
  541. return result;
  542. }
  543. /// <summary>
  544. /// 获取机械臂设备信息
  545. /// </summary>
  546. /// <param name="soue"></param>
  547. /// <param name="func"></param>
  548. /// <returns></returns>
  549. public static List<DeviceStatusViewModel> GetDeviceStatusWhere(IEnumerable<Device<IRobot>> soue, Func<Device<IRobot>, bool> func)
  550. {
  551. var result = new List<DeviceStatusViewModel>();
  552. result.AddRange(soue.Where(func).Select(device =>
  553. {
  554. return new DeviceStatusViewModel
  555. {
  556. CODE = device.Entity.CODE,
  557. TASKNUM = device.Data.TaskID,
  558. ADDRTO = device.Data.Trigger.ToString(),
  559. };
  560. }));
  561. return result;
  562. }
  563. #endregion 静态方法
  564. }
  565. }