杨前锦
2025-07-01 a93b0e99036c24b9bd58c79bf5e7364b1ba28bae
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/dispatch/WCSDispatch.cs
@@ -4,7 +4,9 @@
using System.Text;
using System.Threading.Tasks;
using HH.WCS.Mobox3.YNJT_PT.util;
using HH.WCS.Mobox3.YNJT_PT.wms;
using Newtonsoft.Json;
using static HH.WCS.Mobox3.YNJT_PT.api.ApiModel;
namespace HH.WCS.Mobox3.YNJT_PT.dispatch
{
@@ -13,64 +15,264 @@
        private static readonly HttpHelper apiHelper = new HttpHelper();
        private static readonly string baseUrl = "http://192.168.1.99:2000/";
        internal static string GenerateReqId()
        {
            var id = SYSHelper.GetSerialNumber("请求ID", "RE");
            var date = DateTime.Now.ToString("yyMMdd");
            return $"{date}{id.ToString().PadLeft(4, '0')}";
        }
        /// <summary>
        /// WMS向WCS获取设备状态(堆垛机)
        /// 任务下发
        /// </summary>
        /// <param name="roadway"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        public static List<StackerState> getStackerState(int roadway)
        public static bool sendTask(SendTaskModel model)
        {
            var msg = "";
            List<StackerState> stackerStates = new List<StackerState>();
            var data = new StackerStateModel() { req_no = Guid.NewGuid().ToString("D"), roadway = roadway.ToString() };
            var request = JsonConvert.SerializeObject(data);
            var response = apiHelper.Post(baseUrl + "api/StackerState", request);
            msg = $"WMS向WCS获取设备状态(堆垛机)[StackerState] request={request} response={response}";
            LogHelper.Info(msg, "WCS");
            if (response != "")
            {
            var result = false;
            model.reqId = GenerateReqId();
            model.reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            var request = JsonConvert.SerializeObject(model);
                try
                {
                    var dataResult = JsonConvert.DeserializeObject<StackerStateResponseData>(response);
                    if (dataResult.result_flag == 0)
                var response = apiHelper.Post(baseUrl + "/sendTask", request);
                LogHelper.Info($"[WCS-sendTask] request={request} response={response}", "WMS");
                if (response != null && response != "")
                    {
                        stackerStates = dataResult.data;
                    var dataResult = JsonConvert.DeserializeObject<ResponseResult>(response);
                    if (dataResult.code == 200)
                    {
                        result = true;
                    }
                    else 
                    {
                        LogHelper.Info($"WMS向WCS获取设备状态(堆垛机)失败,WCS反馈错误信息:{dataResult.err_msg}", "WCS");
                        LogHelper.Info($"调用WCS任务下发接口成功,但WCS反馈下发任务失败,失败原因:{dataResult.msg}", "WMS");
                    }
                }
                else
                {
                    LogHelper.Info("调用WCS任务下发接口失败", "WMS");
                    }
                }
                catch (Exception ex)
                {
                    LogHelper.Info($"WMS向WCS获取设备状态(堆垛机)错误,错误原因:{ex.Message}", "WCS");
                LogHelper.Info($"调用WCS任务下发接口错误,错误原因:{ex.Message}", "WMS");
            }
            return result;
        }
        /// <summary>
        /// 任务取消(任务执行中不允许取消)
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static bool cancelTask(CancelTaskModel model)
        {
            var result = false;
            model.reqId = GenerateReqId();
            model.reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            var request = JsonConvert.SerializeObject(model);
            try
            {
                var response = apiHelper.Post(baseUrl + "/api/hecWms/produceProcessTracing/trayMaterialUnBind", request);
                LogHelper.Info($"[WCS-cancelTask] request={request} response={response}", "WMS");
                if (response != null && response != "")
                {
                    var dataResult = JsonConvert.DeserializeObject<ResponseResult>(response);
                    if (dataResult.code == 200)
                    {
                        result = true;
                    }
                }
                else
                {
                    LogHelper.Info("调用WCS任务取消接口失败", "WMS");
                }
            }
            catch (Exception ex)
            {
                LogHelper.Info($"调用WCS任务取消接口错误,错误原因:{ex.Message}", "WMS");
            }
            return result;
        }
        /// <summary>
        /// 获取设备状态
        /// </summary>
        /// <param name="deviceNoList"></param>
        /// <returns></returns>
        public static List<DeviceStatusData> getDeviceStatus(List<string> deviceNoList)
        {
            List<DeviceStatusData> deviceStatusDatas = new List<DeviceStatusData>();
            DeviceStatusModel model = new DeviceStatusModel()
            {
                reqId = GenerateReqId(),
                reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                deviceNoList = deviceNoList
            };
            var request = JsonConvert.SerializeObject(model);
            try
            {
                var response = apiHelper.Post(baseUrl + "/api/hecWms/produceProcessTracing/trayMaterialUnBind", request);
                LogHelper.Info($"[WCS-getDeviceStatus] request={request} response={response}", "WMS");
                if (response != null && response != "")
                {
                    var dataResult = JsonConvert.DeserializeObject<ResponseResult>(response);
                    if (dataResult.code == 200)
                    {
                        deviceStatusDatas = JsonConvert.DeserializeObject<List<DeviceStatusData>>(response);
                    }
                }
                else
                {
                    LogHelper.Info("调用WCS获取设备状态接口失败", "WMS");
                }
            }
            catch (Exception ex)
            {
                LogHelper.Info($"调用WCS获取设备状态接口错误,错误原因:{ex.Message}", "WMS");
            }
            return deviceStatusDatas;
        }
        /// <summary>
        /// 修改任务优先级
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static bool changePriority(ChangePriorityModel model)
        {
            var result = false;
            model.reqId = GenerateReqId();
            model.reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            var request = JsonConvert.SerializeObject(model);
            try
            {
                var response = apiHelper.Post(baseUrl + "/api/hecWms/produceProcessTracing/trayMaterialUnBind", request);
                LogHelper.Info($"[WCS-changePriority] request={request} response={response}", "WMS");
                if (response != null && response != "")
                {
                    var dataResult = JsonConvert.DeserializeObject<ResponseResult>(response);
                    if (dataResult.code == 200)
                    {
                        result = true;
                    }
                }
                else
                {
                    LogHelper.Info("调用WCS修改任务优先级接口失败", "WMS");
                }
            }
            catch (Exception ex)
            {
                LogHelper.Info($"调用WCS修改任务优先级接口错误,错误原因:{ex.Message}", "WMS");
            }
            return result;
        }
        /// <summary>
        /// AGV安全交互
        /// </summary>
        /// <param name="req_no"></param>
        /// <param name="locCode"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public static bool safetyInteraction(string req_no, string locCode, string type)
        {
            var result = false;
            LocStateModel model = new LocStateModel()
            {
                req_no = req_no,
                loc_code = locCode,
                type = type
            };
            var request = JsonConvert.SerializeObject(model);
            try
            {
                var response = apiHelper.Post(baseUrl + "/api/hecWms/produceProcessTracing/trayMaterialUnBind", request);
                LogHelper.Info($"[WCS-changePriority] request={request} response={response}", "WMS");
                if (response != null && response != "")
                {
                    var dataResult = JsonConvert.DeserializeObject<ResponseResult>(response);
                    if (dataResult.code == 200)
                    {
                        result = true;
                }
            }
            else
            {
                msg = "[StackerState]WMS向WCS获取设备状态(堆垛机)失败";
                LogHelper.Info(msg, "WCS");
                    LogHelper.Info("调用WCS安全请求接口失败", "AGV");
            }
            return stackerStates;
            }
            catch (Exception ex)
            {
                LogHelper.Info($"调用WCS安全请求接口错误,错误原因:{ex.Message}", "AGV");
            }
            return result;
        }
        public class StackerStateResponseData
        public class LocStateModel
        {
            public int result_flag { get; set; }
            public string err_msg { get; set; }
            public List<StackerState> data { get; set; }
        }
        public class StackerState
        {
            public string roadway { get; set; }
            public string roadway_state { get; set; }  // 堆垛机状态 1=空闲,2=执行中,3=报警,0=不可用
            public string req_no { get; set; } // 请求id
            public string loc_code { get; set; } // 货位
            public string type { get; set; } // 货位 1 请求取货 2 请求放货 3 取货完成离开信号 4 放货完成离开信号
        }
        public class StackerStateModel
        public class ChangePriorityModel
        {
            public string req_no { get; set; }
            public string roadway { get; set; }
            public string reqId { get; set; } // 请求id
            public string reqTime { get; set; } // 请求时间
            public string taskNo { get; set; } // 任务号
            public int priority { get; set; } // 优先级
        }
        public class DeviceStatusData
        {
            public string deviceNo { get; set; } // 设备号
            public int workStatus { get; set; } // 工作状态  1正常 ,2禁用 ,3故障
            public int photoStatus { get; set; } // 光电状态 1是空载 ,2是有载
            public int manualStatus { get; set; } //手动状态  1手动,2自动
        }
        public class DeviceStatusModel
        {
            public string reqId { get; set; } // 请求id
            public string reqTime { get; set; } // 请求时间
            public List<string> deviceNoList { get; set; } // 设备号
        }
        public class CancelTaskModel
        {
            public string reqId { get; set; } // 请求id
            public string reqTime { get; set; } // 请求时间
            public string taskNo { get; set; } // 任务号
        }
        public class SendTaskModel
        {
            public string reqId { get; set; } // 请求id
            public string reqTime { get; set; } // 请求时间
            public string taskNo { get; set; } // 任务号
            public int groupNo { get; set; } // 任务组
            public string taskType { get; set; } // 任务类型  1.物料入库 2.物料出库
            public string from { get; set; } // 起点
            public string to { get; set; } // 终点
            public string cntrNo { get; set; } // 容器编码
            public string cntrType { get; set; } // 容器类型
            public List<object> extData { get; set; } //
        }
    }
}