WCSApi.cs 20 KB

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