AgvController.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. using Microsoft.AspNetCore.Mvc;
  2. using NetTaste;
  3. using Newtonsoft.Json;
  4. using PlcSiemens.Core.Extension;
  5. using ServiceCenter.Attributes;
  6. using ServiceCenter.Logs;
  7. using ServiceCenter.Redis;
  8. using ServiceCenter.SqlSugars;
  9. using WCS.Core;
  10. using WCS.Entity;
  11. using WCS.WorkEngineering.Extensions;
  12. using WCS.WorkEngineering.Protocol.Station;
  13. using WCS.WorkEngineering.Systems;
  14. using WCS.WorkEngineering.WebApi.Models.AGV;
  15. using WCS.WorkEngineering.WebApi.Models.AGV.Request;
  16. using WCS.WorkEngineering.WebApi.Models.AGV.Response;
  17. namespace WCS.WorkEngineering.WebApi.Controllers
  18. {
  19. /// <summary>
  20. /// AGV相关接口控制器
  21. /// </summary>
  22. [ApiController]
  23. [Route("api/[controller]/[action]")]
  24. public class AgvController : ControllerBase
  25. {
  26. /// <summary>
  27. /// AGV任务下发
  28. /// </summary>
  29. /// <param name="type">任务类型</param>
  30. /// <param name="code">agv任务号</param>
  31. /// <param name="startPos">起始位置</param>
  32. /// <param name="endPos">目标位置</param>
  33. /// <param name="nextPos">下个位置</param>
  34. /// <param name="barCode">容器编码</param>
  35. /// <returns></returns>
  36. [HttpPost]
  37. public string AgvDebug(int type, string code, string startPos,string endPos,string nextPos,string barCode)
  38. {
  39. try
  40. {
  41. switch (type)
  42. {
  43. case 1:
  44. AgvApi.盘条入库(startPos,nextPos,endPos,barCode, code, "1");
  45. break;
  46. //case 2:
  47. //AgvApi.机台补满();
  48. //break;
  49. case 3:
  50. AgvApi.ContinueTask(code, nextPos);
  51. break;
  52. case 4:
  53. AgvApi.搬运(barCode,startPos,endPos,code, "1");
  54. break;
  55. case 5:
  56. AgvApi.搬运_wmsStart(barCode, startPos,endPos, code, "1");
  57. break;
  58. case 6:
  59. AgvApi.出库搬运_wms(barCode, startPos, endPos, code, "1");
  60. break;
  61. default:
  62. break;
  63. }
  64. return "成功";
  65. }
  66. catch (Exception ex)
  67. {
  68. return $"Error-----" +
  69. $"{ex.Message}------" +
  70. $"{ex.StackTrace}";
  71. }
  72. }
  73. /// <summary>
  74. /// AGV执行回调
  75. /// </summary>
  76. /// <param name="reqDto"></param>
  77. /// <returns></returns>
  78. [HttpPost]
  79. public AgvCallbackResponse AgvCallback([FromBody] AgvCallbackRequest reqDto)
  80. {
  81. var key = $"WCS:Lock:AGV:{nameof(AgvCallback)}";
  82. var res = new AgvCallbackResponse() { code = AgvResponseCode.Fail, message = "失败" };
  83. try
  84. {
  85. if (RedisHub.Default.Get(key) != null)
  86. {
  87. res.code = AgvResponseCode.Error;
  88. res.message = $"[{nameof(AgvCallback)}]--触发并发管控";
  89. }
  90. else
  91. {
  92. RedisHub.Default.Set(key, nameof(AgvCallback));
  93. WCS_TaskInfo taskInfo = null;
  94. try
  95. {
  96. SqlSugarHelper.Do(db =>
  97. {
  98. //跟据AGVid找到对应的AGV任务
  99. var agvTask = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(tabs => tabs.Take(2)).First(v => v.AgvID == reqDto.taskCode && v.Status < AGVTaskStatus.MissionCompleted);
  100. if (agvTask == null)
  101. {
  102. res.code = AgvResponseCode.Fail;
  103. res.message = "未找到对应的AGV任务";
  104. }
  105. else
  106. {
  107. switch (reqDto.method)
  108. {
  109. //case "start": //表示请求巷道
  110. // agvTask.Status = AGVTaskStatus.RequestOrPermission1;
  111. // break;
  112. //case "end": //表示请求巷道
  113. // agvTask.Status = AGVTaskStatus.RequestOrPermission1;
  114. // break;
  115. //入库任务、叫料任务、搬运任务
  116. case "outbin": //入库小车取货后退出取货位
  117. agvTask.AgvStatus = AGVTaskStatus.LeaveGet;
  118. break;
  119. case "applyContinue": //表示请求巷道
  120. agvTask.AgvStatus = AGVTaskStatus.RequestOrPermission1;
  121. break;
  122. case "applyQuqGet": //表示请求取货
  123. agvTask.AgvStatus = AGVTaskStatus.RequestOrPermission2;
  124. break;
  125. case "applyQuqPut": //表示请求放货
  126. agvTask.AgvStatus = AGVTaskStatus.PutRequestOrPermission;
  127. break;
  128. case "finishIn": //入库任务完成
  129. agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
  130. break;
  131. case "finishOut": //出库任务完成
  132. agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
  133. break;
  134. case "finishMove": //搬运任务完成
  135. agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
  136. break;
  137. case "tcEnd": //机台补空任务完成
  138. agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
  139. break;
  140. case "exc_end": //异常信息上抛-值不匹配
  141. agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
  142. break;
  143. case "cancel": //取消任务
  144. //agvTask.AgvStatus = AGVTaskStatus.Cancel;
  145. break;
  146. default:
  147. break;
  148. }
  149. db.Default.Updateable(agvTask).SplitTable().ExecuteCommand();
  150. res.code = AgvResponseCode.Success;
  151. res.message = "成功";
  152. }
  153. });
  154. }
  155. catch (Exception ex)
  156. {
  157. res.code = AgvResponseCode.Error;
  158. res.message = ex.Message;
  159. }
  160. }
  161. }
  162. finally
  163. {
  164. RedisHub.Default.Del(key);
  165. }
  166. return res;
  167. }
  168. }
  169. }