WCSApi.cs 21 KB

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