WMS.cs 14 KB

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