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