WCSApi.cs 20 KB

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