WMS.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using WCS.Core;
  6. using WCS.Core.BaseExtensions;
  7. using WCS.Core.Log;
  8. using WCS.WebApi.WMS.Request;
  9. using WCS.WebApi.WMS.Response;
  10. namespace WCS.WebApi.WMS
  11. {
  12. public class WMS
  13. {
  14. private const string Url = "http://192.168.249.150:8026";
  15. //private static string Url = "http://127.0.0.1:8026";
  16. private const string WareHouseId = "opphouse";
  17. /// <summary>
  18. /// 向WMS获取入库任务 一次单卷
  19. /// </summary>
  20. /// <param name="barcode">产品条码</param>
  21. /// <param name="devCode">设备条码</param>
  22. /// <param name="getTunnel"></param>
  23. /// <returns></returns>
  24. /// <exception cref="Exception"></exception>
  25. public static List<I_WCS_GetInTaskResponseItem> I_WCS_GetInTask(string barcode, string devCode, bool getTunnel = false)
  26. {
  27. var data = JsonConvert.SerializeObject(new List<I_WCS_GetInTaskRequest>()
  28. {
  29. new I_WCS_GetInTaskRequest(){
  30. ContainerBarCode = barcode,
  31. WareHouseId = WareHouseId,
  32. EquipmentNo = devCode,
  33. Memo1 = getTunnel ? "1" : "" //1:分巷道 2:分货位
  34. }
  35. });
  36. var res = APICaller.CallApi<I_WCS_GetInTaskResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
  37. {
  38. Name = "I_WCS_GetInTask",
  39. Parameters = data,
  40. ParametersMD5 = data.GetMD5()
  41. });
  42. if (res.ResType) return res.TaskList;
  43. TaskException(devCode, res.ResMessage);
  44. throw new WarnException(res.ResMessage);
  45. }
  46. /// <summary>
  47. /// 向WMS获取入库任务 一次双卷
  48. /// </summary>
  49. /// <param name="barcode1">产品1条码</param>
  50. /// <param name="devCode1">设备1编号</param>
  51. /// <param name="getTunnel1">产品1是否直接分配巷道</param>
  52. /// <param name="barcode2">产品2条码</param>
  53. /// <param name="devCode2">设备2编号</param>
  54. /// <param name="getTunnel2">产品2是否直接分配巷道</param>
  55. /// <exception cref="WarnException"></exception>
  56. /// <returns></returns>
  57. public static List<I_WCS_GetInTaskResponseItem> I_WCS_GetInTask(string barcode1, string devCode1, string barcode2, string devCode2, bool getTunnel1 = false, bool getTunnel2 = false)
  58. {
  59. if (!Configs.Any(SystemMode.虚拟plc))
  60. {
  61. var data = JsonConvert.SerializeObject(new List<I_WCS_GetInTaskRequest>()
  62. {
  63. new(){
  64. ContainerBarCode = barcode1,
  65. WareHouseId = WareHouseId,
  66. EquipmentNo = devCode1,
  67. Memo1 = getTunnel1 ? "1" : "" //1:分巷道 2:分货位
  68. },
  69. new(){
  70. ContainerBarCode = barcode2,
  71. WareHouseId = WareHouseId,
  72. EquipmentNo = devCode2,
  73. Memo1 = getTunnel2 ? "1" : "" //1:分巷道 2:分货位
  74. },
  75. });
  76. var res = APICaller.CallApi<I_WCS_GetInTaskResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
  77. {
  78. Name = "I_WCS_GetInTask",
  79. Parameters = data,
  80. ParametersMD5 = data.GetMD5()
  81. });
  82. if (res.ResType) return res.TaskList;
  83. TaskException($"G{devCode1}", res.ResMessage);
  84. throw new WarnException(res.ResMessage);
  85. }
  86. return new List<I_WCS_GetInTaskResponseItem>()
  87. {
  88. new I_WCS_GetInTaskResponseItem(){
  89. WMSTaskNum="315199",
  90. TaskType=1,
  91. WareHouseName="OPP立库",
  92. TunnelNum="",
  93. EndPostion="srm",
  94. ContainerCode=barcode1,
  95. ContainerType=0
  96. },
  97. new I_WCS_GetInTaskResponseItem() {
  98. WMSTaskNum="315200",
  99. TaskType=1,
  100. WareHouseName="OPP立库",
  101. TunnelNum="",
  102. EndPostion="srm",
  103. ContainerCode=barcode2,
  104. ContainerType=0
  105. },
  106. };
  107. }
  108. /// <summary>
  109. /// 分配货位
  110. /// </summary>
  111. /// <param name="wmstaskid">WMS任务ID</param>
  112. /// <param name="tunnel">巷道</param>
  113. /// <param name="device">设备号</param>
  114. /// <param name="ForkNum">申请任务对应的货叉</param>
  115. /// <exception cref="WarnException"></exception>
  116. /// <returns></returns>
  117. public static I_WCS_GetWareCellResponse GetLocalIn(int wmstaskid, string tunnel, string device, WareCellForkNum ForkNum)
  118. {
  119. var data = JsonConvert.SerializeObject(new I_WCS_GetWareCellRequest
  120. {
  121. PickUpEquipmentNo = device,
  122. TunnelNum = tunnel.Last().ToString(),
  123. WMSTaskNum = wmstaskid.ToString(),
  124. ForkNum = ForkNum
  125. });
  126. var res = APICaller.CallApi<I_WCS_GetWareCellResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
  127. {
  128. Name = "I_WCS_GetWareCell",
  129. Parameters = data,
  130. ParametersMD5 = data.GetMD5()
  131. });
  132. if (res.ResType) return res;
  133. TaskException(device, res.ResMessage);
  134. throw new WarnException(res.ResMessage);
  135. }
  136. public static void UpdateTask(string POSIDNEXT, int wmstaskid, int status, int size = -1)
  137. {
  138. if (Configs.Any(SystemMode.虚拟plc)) return;
  139. var data = JsonConvert.SerializeObject(new List<I_WCS_TASKRequest>
  140. {
  141. new()
  142. {
  143. TASK_WKSTATUS = status,
  144. TASK_WMSNO = wmstaskid.ToString(),
  145. TASK_POSIDNEXT=POSIDNEXT,
  146. Size=size
  147. }
  148. });
  149. var res = APICaller.CallApi<List<I_WCS_PutTaskStepResponse>>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
  150. {
  151. Name = "I_WCS_PutTaskStep",
  152. Parameters = data,
  153. ParametersMD5 = data.GetMD5()
  154. });
  155. if (res == null || res.Count == 0)
  156. {
  157. throw new WarnException("I_WCS_PutTaskStep调用失败");
  158. }
  159. if (!res.First().ResType)
  160. throw new WarnException(res.First().ResMessage);
  161. }
  162. public static GetProductInfoResponse GetProductInfo(string barcode, string dev)
  163. {
  164. var data = JsonConvert.SerializeObject(new GetProductInfoRequest
  165. {
  166. BarCode = barcode
  167. });
  168. var res = APICaller.CallApi<GetProductInfoResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
  169. {
  170. Name = "GetProductInfo",
  171. Parameters = data,
  172. ParametersMD5 = data.GetMD5()
  173. });
  174. try
  175. {
  176. if (!res.ResType)
  177. throw new WarnException(res.ResMessage);
  178. if (res.ChildContainerType is <= 0 or > 9)
  179. throw new WarnException("托盘类型错误");
  180. if (res.LoadCount <= 0)
  181. throw new WarnException("最大组盘数量错误");
  182. if (res.DocId == 0)
  183. throw new WarnException("单据ID错误");
  184. if (res.ProLine is < 1 or > 9)
  185. throw new WarnException("产线编号" + res.ProLine + "错误");
  186. }
  187. catch (Exception ex)
  188. {
  189. TaskException(dev, ex.Message);
  190. throw;
  191. }
  192. return res;
  193. }
  194. /// <summary>
  195. /// 获取出库任务
  196. /// </summary>
  197. /// <param name="position">出库位置</param>
  198. /// <param name="devCode">调用方法的设备号</param>
  199. /// <returns></returns>
  200. /// <exception cref="Exception"></exception>
  201. public static List<I_WCS_GetOutTaskResponseSingle> GetOutTask(string position, string devCode)
  202. {
  203. var data = JsonConvert.SerializeObject(new I_WCS_GetOutTaskRequest
  204. {
  205. OutType = 1,
  206. WareHouseId = WareHouseId,
  207. OutEndPostion = position
  208. });
  209. var res = APICaller.CallApi<I_WCS_GetOutTaskResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
  210. {
  211. Name = "I_WCS_GetOutTask",
  212. Parameters = data,
  213. ParametersMD5 = data.GetMD5()
  214. });
  215. if (!res.ResType)
  216. {
  217. TaskException(position, res.ResMessage);
  218. throw new WarnException(res.ResMessage);
  219. }
  220. res.WMSTasks.ForEach(v =>
  221. {
  222. var tcode = "TY" + v.TunnelNum;
  223. var tunnel = Device.Find(tcode);
  224. //var next = tunnel.GetPath(devCode);
  225. //v.Memo1 = next.CODE;
  226. v.TunnelNum = tunnel.CODE;
  227. });
  228. return res.WMSTasks;
  229. }
  230. public static WcsContractApiResponse AutoBuildUpGroupStock(string containerCode, string barcode, string dev)
  231. {
  232. var res = APICaller.CallApi<WcsContractApiResponse>(Url + "/api/Task/AutoBuildUpGroupStock", new
  233. {
  234. ContainerCode = containerCode,
  235. BarCode = barcode
  236. });
  237. if (res.ResType) return res;
  238. TaskException(dev, res.ResMessage);
  239. throw new WarnException(res.ResMessage);
  240. }
  241. /// <summary>
  242. /// 获取巷道
  243. /// </summary>
  244. /// <param name="WMSTaskId">WMS任务号集合</param>
  245. /// <param name="dev">请求设备号</param>
  246. /// <returns></returns>
  247. /// <exception cref="Exception"></exception>
  248. public static I_WCS_GetTunnelListResponse GetTunnelList(List<string> WMSTaskId, string dev)
  249. {
  250. var data = JsonConvert.SerializeObject(new I_WCS_GetTunnelListRequest
  251. {
  252. WMSTaskNum = WMSTaskId
  253. });
  254. var res = APICaller.CallApi<I_WCS_GetTunnelListResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
  255. {
  256. Name = "I_WCS_GetTunnelList",
  257. Parameters = data,
  258. ParametersMD5 = data.GetMD5()
  259. });
  260. if (res.ResType) return res;
  261. TaskException(dev, res.ResMessage);
  262. throw new WarnException(res.ResMessage);
  263. }
  264. public static void TaskException(string device, string exMsg)
  265. {
  266. if (exMsg == "接口调用中")
  267. return;
  268. System.Threading.Tasks.Task.Run(() =>
  269. {
  270. try
  271. {
  272. var data = JsonConvert.SerializeObject(new I_WCS_GetExcTaskRequest
  273. {
  274. ExcCode = exMsg,
  275. EquipmentNo = device,
  276. ExcMessage = exMsg,
  277. });
  278. Console.WriteLine(device + ":" + exMsg);
  279. var res = APICaller.CallApi2<I_WCS_GetExcTaskResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
  280. {
  281. Name = "I_WCS_GetExcTask",
  282. Parameters = data,
  283. ParametersMD5 = data.GetMD5()
  284. });
  285. InfoLog.INFO_I_WCS_GetExcTask(device + ":" + exMsg);
  286. if (!res.ResType) throw new WarnException(res.ResMessage);
  287. }
  288. catch (Exception)
  289. {
  290. }
  291. });
  292. }
  293. private static List<I_WCS_PutDevInfoRequest> DevInfoList = new();
  294. public static void DevInfo(string device, string exMsg)
  295. {
  296. DevInfoList.Add(new I_WCS_PutDevInfoRequest
  297. {
  298. STA_EQUIPMENTNO = device,
  299. STA_ALARMSMSG = exMsg
  300. });
  301. }
  302. public static void UploadDevInfo()
  303. {
  304. return;
  305. try
  306. {
  307. var data = JsonConvert.SerializeObject(DevInfoList);
  308. var res = APICaller.CallApi<I_WCS_PutDevInfoResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
  309. {
  310. Name = "I_WCS_GetExcTask",
  311. Parameters = data,
  312. ParametersMD5 = data.GetMD5()
  313. });
  314. if (!res.ResType)
  315. throw new WarnException(res.ResMessage);
  316. }
  317. catch (Exception ex)
  318. {
  319. InfoLog.INFO_WARN($"I_WCS_PutDevInfo接口调用失败:{ex.Message}");
  320. }
  321. finally
  322. {
  323. DevInfoList.Clear();
  324. }
  325. }
  326. public static void UnBound(string barcode)
  327. {
  328. try
  329. {
  330. var res = APICaller.CallApi<I_WCS_GetTunnelListResponse>(Url + "/api/PDA/UnboundMwGroupStock", new
  331. {
  332. containerCode = barcode
  333. });
  334. }
  335. catch { }
  336. }
  337. }
  338. /// <summary>
  339. /// 调用接口传入参数
  340. /// </summary>
  341. public class InterfaceParameters
  342. {
  343. /// <summary>
  344. /// 业务名 例:I_WCS_GetInTask
  345. /// </summary>
  346. public string Name { get; set; }
  347. /// <summary>
  348. /// 传入参数为Json
  349. /// </summary>
  350. public string Parameters { get; set; }
  351. /// <summary>
  352. /// 传入参数的唯一值
  353. /// </summary>
  354. public string ParametersMD5 { get; set; }
  355. }
  356. }