WCSApi.cs 18 KB

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