|
@@ -0,0 +1,374 @@
|
|
|
+using Logs;
|
|
|
+using Newtonsoft.Json;
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Linq;
|
|
|
+using WCS.Service.Entity;
|
|
|
+
|
|
|
+namespace WCS.Service
|
|
|
+{
|
|
|
+ public class WMS
|
|
|
+ {
|
|
|
+ private const string Url = "http://192.168.249.150:8026";
|
|
|
+
|
|
|
+ //private static string Url = "http://127.0.0.1:8026";
|
|
|
+ private const string WareHouseId = "opphouse";
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 向WMS获取入库任务 一次单卷
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="barcode">产品条码</param>
|
|
|
+ /// <param name="devCode">设备条码</param>
|
|
|
+ /// <param name="getTunnel"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ /// <exception cref="Exception"></exception>
|
|
|
+ public static List<I_WCS_GetInTaskResponseItem> I_WCS_GetInTask(string barcode, string devCode, bool getTunnel = false)
|
|
|
+ {
|
|
|
+ var data = JsonConvert.SerializeObject(new List<I_WCS_GetInTaskRequest>()
|
|
|
+ {
|
|
|
+ new I_WCS_GetInTaskRequest(){
|
|
|
+ ContainerBarCode = barcode,
|
|
|
+ WareHouseId = WareHouseId,
|
|
|
+ EquipmentNo = devCode,
|
|
|
+ Memo1 = getTunnel ? "1" : "" //1:分巷道 2:分货位
|
|
|
+ }
|
|
|
+ });
|
|
|
+ var res = APICaller.CallApi<I_WCS_GetInTaskResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
|
|
|
+ {
|
|
|
+ Name = "I_WCS_GetInTask",
|
|
|
+ Parameters = data,
|
|
|
+ ParametersMD5 = data.GetMD5()
|
|
|
+ });
|
|
|
+ if (res.ResType) return res.TaskList;
|
|
|
+ TaskException(devCode, res.ResMessage);
|
|
|
+ throw new WarnException(res.ResMessage);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 向WMS获取入库任务 一次双卷
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="barcode1">产品1条码</param>
|
|
|
+ /// <param name="devCode1">设备1编号</param>
|
|
|
+ /// <param name="getTunnel1">产品1是否直接分配巷道</param>
|
|
|
+ /// <param name="barcode2">产品2条码</param>
|
|
|
+ /// <param name="devCode2">设备2编号</param>
|
|
|
+ /// <param name="getTunnel2">产品2是否直接分配巷道</param>
|
|
|
+ /// <exception cref="WarnException"></exception>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static List<I_WCS_GetInTaskResponseItem> I_WCS_GetInTask(string barcode1, string devCode1, string barcode2, string devCode2, bool getTunnel1 = false, bool getTunnel2 = false)
|
|
|
+ {
|
|
|
+ if (!Configs.Any(SystemMode.虚拟PLC))
|
|
|
+ {
|
|
|
+ var data = JsonConvert.SerializeObject(new List<I_WCS_GetInTaskRequest>()
|
|
|
+ {
|
|
|
+ new(){
|
|
|
+ ContainerBarCode = barcode1,
|
|
|
+ WareHouseId = WareHouseId,
|
|
|
+ EquipmentNo = devCode1,
|
|
|
+ Memo1 = getTunnel1 ? "1" : "" //1:分巷道 2:分货位
|
|
|
+ },
|
|
|
+ new(){
|
|
|
+ ContainerBarCode = barcode2,
|
|
|
+ WareHouseId = WareHouseId,
|
|
|
+ EquipmentNo = devCode2,
|
|
|
+ Memo1 = getTunnel2 ? "1" : "" //1:分巷道 2:分货位
|
|
|
+ },
|
|
|
+ });
|
|
|
+ var res = APICaller.CallApi<I_WCS_GetInTaskResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
|
|
|
+ {
|
|
|
+ Name = "I_WCS_GetInTask",
|
|
|
+ Parameters = data,
|
|
|
+ ParametersMD5 = data.GetMD5()
|
|
|
+ });
|
|
|
+ if (res.ResType) return res.TaskList;
|
|
|
+ TaskException($"G{devCode1}", res.ResMessage);
|
|
|
+ throw new WarnException(res.ResMessage);
|
|
|
+ }
|
|
|
+ return new List<I_WCS_GetInTaskResponseItem>()
|
|
|
+ {
|
|
|
+ new I_WCS_GetInTaskResponseItem(){
|
|
|
+ WMSTaskNum="315199",
|
|
|
+ TaskType=1,
|
|
|
+ WareHouseName="OPP立库",
|
|
|
+ TunnelNum="",
|
|
|
+ EndPostion="srm",
|
|
|
+ ContainerCode=barcode1,
|
|
|
+ ContainerType=0
|
|
|
+ },
|
|
|
+ new I_WCS_GetInTaskResponseItem() {
|
|
|
+ WMSTaskNum="315200",
|
|
|
+ TaskType=1,
|
|
|
+ WareHouseName="OPP立库",
|
|
|
+ TunnelNum="",
|
|
|
+ EndPostion="srm",
|
|
|
+ ContainerCode=barcode2,
|
|
|
+ ContainerType=0
|
|
|
+ },
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 分配货位
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="wmstaskid">WMS任务ID</param>
|
|
|
+ /// <param name="tunnel">巷道</param>
|
|
|
+ /// <param name="device">设备号</param>
|
|
|
+ /// <param name="ForkNum">申请任务对应的货叉</param>
|
|
|
+ /// <exception cref="WarnException"></exception>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static I_WCS_GetWareCellResponse GetLocalIn(int wmstaskid, string tunnel, string device, WareCellForkNum ForkNum)
|
|
|
+ {
|
|
|
+ var data = JsonConvert.SerializeObject(new I_WCS_GetWareCellRequest
|
|
|
+ {
|
|
|
+ PickUpEquipmentNo = device,
|
|
|
+ TunnelNum = tunnel.Last().ToString(),
|
|
|
+ WMSTaskNum = wmstaskid.ToString(),
|
|
|
+ ForkNum = ForkNum
|
|
|
+ });
|
|
|
+ var res = APICaller.CallApi<I_WCS_GetWareCellResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
|
|
|
+ {
|
|
|
+ Name = "I_WCS_GetWareCell",
|
|
|
+ Parameters = data,
|
|
|
+ ParametersMD5 = data.GetMD5()
|
|
|
+ });
|
|
|
+ if (res.ResType) return res;
|
|
|
+ TaskException(device, res.ResMessage);
|
|
|
+ throw new WarnException(res.ResMessage);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void UpdateTask(string POSIDNEXT, int wmstaskid, int status, int size = -1)
|
|
|
+ {
|
|
|
+ if (Configs.Any(SystemMode.虚拟PLC)) return;
|
|
|
+
|
|
|
+ var data = JsonConvert.SerializeObject(new List<I_WCS_TASKRequest>
|
|
|
+ {
|
|
|
+ new()
|
|
|
+ {
|
|
|
+ TASK_WKSTATUS = status,
|
|
|
+ TASK_WMSNO = wmstaskid.ToString(),
|
|
|
+ TASK_POSIDNEXT=POSIDNEXT,
|
|
|
+ Size=size
|
|
|
+ }
|
|
|
+ });
|
|
|
+ var res = APICaller.CallApi<List<I_WCS_PutTaskStepResponse>>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
|
|
|
+ {
|
|
|
+ Name = "I_WCS_PutTaskStep",
|
|
|
+ Parameters = data,
|
|
|
+ ParametersMD5 = data.GetMD5()
|
|
|
+ });
|
|
|
+ if (res == null || res.Count == 0)
|
|
|
+ {
|
|
|
+ throw new WarnException("I_WCS_PutTaskStep调用失败");
|
|
|
+ }
|
|
|
+ if (!res.First().ResType)
|
|
|
+ throw new WarnException(res.First().ResMessage);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static GetProductInfoResponse GetProductInfo(string barcode, string dev)
|
|
|
+ {
|
|
|
+ var data = JsonConvert.SerializeObject(new GetProductInfoRequest
|
|
|
+ {
|
|
|
+ BarCode = barcode
|
|
|
+ });
|
|
|
+ var res = APICaller.CallApi<GetProductInfoResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
|
|
|
+ {
|
|
|
+ Name = "GetProductInfo",
|
|
|
+ Parameters = data,
|
|
|
+ ParametersMD5 = data.GetMD5()
|
|
|
+ });
|
|
|
+ try
|
|
|
+ {
|
|
|
+ if (!res.ResType)
|
|
|
+ throw new WarnException(res.ResMessage);
|
|
|
+ if (res.ChildContainerType is <= 0 or > 9)
|
|
|
+ throw new WarnException("托盘类型错误");
|
|
|
+ if (res.LoadCount <= 0)
|
|
|
+ throw new WarnException("最大组盘数量错误");
|
|
|
+ if (res.DocId == 0)
|
|
|
+ throw new WarnException("单据ID错误");
|
|
|
+ if (res.ProLine is < 1 or > 9)
|
|
|
+ throw new WarnException("产线编号" + res.ProLine + "错误");
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ TaskException(dev, ex.Message);
|
|
|
+ throw;
|
|
|
+ }
|
|
|
+ return res;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 获取出库任务
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="position">出库位置</param>
|
|
|
+ /// <param name="devCode">调用方法的设备号</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ /// <exception cref="Exception"></exception>
|
|
|
+ public static List<I_WCS_GetOutTaskResponseSingle> GetOutTask(string position, string devCode)
|
|
|
+ {
|
|
|
+ var data = JsonConvert.SerializeObject(new I_WCS_GetOutTaskRequest
|
|
|
+ {
|
|
|
+ OutType = 1,
|
|
|
+ WareHouseId = WareHouseId,
|
|
|
+ OutEndPostion = position
|
|
|
+ });
|
|
|
+ var res = APICaller.CallApi<I_WCS_GetOutTaskResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
|
|
|
+ {
|
|
|
+ Name = "I_WCS_GetOutTask",
|
|
|
+ Parameters = data,
|
|
|
+ ParametersMD5 = data.GetMD5()
|
|
|
+ });
|
|
|
+ if (!res.ResType)
|
|
|
+ {
|
|
|
+ TaskException(position, res.ResMessage);
|
|
|
+ throw new WarnException(res.ResMessage);
|
|
|
+ }
|
|
|
+
|
|
|
+ res.WMSTasks.ForEach(v =>
|
|
|
+ {
|
|
|
+ var tcode = "TY" + v.TunnelNum;
|
|
|
+
|
|
|
+ var tunnel = Device.Find(tcode);
|
|
|
+ //var next = tunnel.GetPath(devCode);
|
|
|
+ //v.Memo1 = next.CODE;
|
|
|
+ v.TunnelNum = tunnel.CODE;
|
|
|
+ });
|
|
|
+ return res.WMSTasks;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static WcsContractApiResponse AutoBuildUpGroupStock(string containerCode, string barcode, string dev)
|
|
|
+ {
|
|
|
+ var res = APICaller.CallApi<WcsContractApiResponse>(Url + "/api/Task/AutoBuildUpGroupStock", new
|
|
|
+ {
|
|
|
+ ContainerCode = containerCode,
|
|
|
+ BarCode = barcode
|
|
|
+ });
|
|
|
+ if (res.ResType) return res;
|
|
|
+ TaskException(dev, res.ResMessage);
|
|
|
+ throw new WarnException(res.ResMessage);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 获取巷道
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="WMSTaskId">WMS任务号集合</param>
|
|
|
+ /// <param name="dev">请求设备号</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ /// <exception cref="Exception"></exception>
|
|
|
+ public static I_WCS_GetTunnelListResponse GetTunnelList(List<string> WMSTaskId, string dev)
|
|
|
+ {
|
|
|
+ var data = JsonConvert.SerializeObject(new I_WCS_GetTunnelListRequest
|
|
|
+ {
|
|
|
+ WMSTaskNum = WMSTaskId
|
|
|
+ });
|
|
|
+ var res = APICaller.CallApi<I_WCS_GetTunnelListResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
|
|
|
+ {
|
|
|
+ Name = "I_WCS_GetTunnelList",
|
|
|
+ Parameters = data,
|
|
|
+ ParametersMD5 = data.GetMD5()
|
|
|
+ });
|
|
|
+ if (res.ResType) return res;
|
|
|
+ TaskException(dev, res.ResMessage);
|
|
|
+ throw new WarnException(res.ResMessage);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void TaskException(string device, string exMsg)
|
|
|
+ {
|
|
|
+ if (exMsg == "接口调用中")
|
|
|
+ return;
|
|
|
+ System.Threading.Tasks.Task.Run(() =>
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ var data = JsonConvert.SerializeObject(new I_WCS_GetExcTaskRequest
|
|
|
+ {
|
|
|
+ ExcCode = exMsg,
|
|
|
+ EquipmentNo = device,
|
|
|
+ ExcMessage = exMsg,
|
|
|
+ });
|
|
|
+ Console.WriteLine(device + ":" + exMsg);
|
|
|
+ var res = APICaller.CallApi2<I_WCS_GetExcTaskResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
|
|
|
+ {
|
|
|
+ Name = "I_WCS_GetExcTask",
|
|
|
+ Parameters = data,
|
|
|
+ ParametersMD5 = data.GetMD5()
|
|
|
+ });
|
|
|
+ InfoLog.INFO_I_WCS_GetExcTask(device + ":" + exMsg);
|
|
|
+ if (!res.ResType) throw new WarnException(res.ResMessage);
|
|
|
+ }
|
|
|
+ catch (Exception)
|
|
|
+ {
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private static List<I_WCS_PutDevInfoRequest> DevInfoList = new();
|
|
|
+
|
|
|
+ public static void DevInfo(string device, string exMsg)
|
|
|
+ {
|
|
|
+ DevInfoList.Add(new I_WCS_PutDevInfoRequest
|
|
|
+ {
|
|
|
+ STA_EQUIPMENTNO = device,
|
|
|
+ STA_ALARMSMSG = exMsg
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void UploadDevInfo()
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ try
|
|
|
+ {
|
|
|
+ var data = JsonConvert.SerializeObject(DevInfoList);
|
|
|
+ var res = APICaller.CallApi<I_WCS_PutDevInfoResponse>(Url + "/api/Task/I_WCS_UnifiedInterface", new InterfaceParameters
|
|
|
+ {
|
|
|
+ Name = "I_WCS_GetExcTask",
|
|
|
+ Parameters = data,
|
|
|
+ ParametersMD5 = data.GetMD5()
|
|
|
+ });
|
|
|
+ if (!res.ResType)
|
|
|
+ throw new WarnException(res.ResMessage);
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ InfoLog.INFO_WARN($"I_WCS_PutDevInfo接口调用失败:{ex.Message}");
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ DevInfoList.Clear();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void UnBound(string barcode)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ var res = APICaller.CallApi<I_WCS_GetTunnelListResponse>(Url + "/api/PDA/UnboundMwGroupStock", new
|
|
|
+ {
|
|
|
+ containerCode = barcode
|
|
|
+ });
|
|
|
+ }
|
|
|
+ catch { }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 调用接口传入参数
|
|
|
+ /// </summary>
|
|
|
+ public class InterfaceParameters
|
|
|
+ {
|
|
|
+ /// <summary>
|
|
|
+ /// 业务名 例:I_WCS_GetInTask
|
|
|
+ /// </summary>
|
|
|
+ public string Name { get; set; }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 传入参数为Json
|
|
|
+ /// </summary>
|
|
|
+ public string Parameters { get; set; }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 传入参数的唯一值
|
|
|
+ /// </summary>
|
|
|
+ public string ParametersMD5 { get; set; }
|
|
|
+ }
|
|
|
+}
|