WCSApi.cs 19 KB

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