WebService.cs 8.0 KB
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Activation;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using OnlineStore.Common;
using System.ServiceModel.Web;

namespace OnlineStore.DeviceLibrary.ESS
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single, IncludeExceptionDetailInFaults = true)]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class WebService : IService
    {
        /// <summary>
        /// 机器人放容器到输送线完成通知接口
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        Result IService.unloadContainerFinish(Stream stream)
        {
            Result result = new Result();
            StreamReader sr = new StreamReader(stream);
            string s = sr.ReadToEnd();
            EssModel essModel = JsonHelper.DeserializeJsonToObject<EssModel>(s);
            LogUtil.info($"放容器完成通知:【{s}】");
            return result;
        }
        /// <summary>
        /// 机器人从输送线取容器完成通知接口
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        Result IService.loadContainerFinish(Stream stream)
        {
            Result result = new Result();
            StreamReader sr = new StreamReader(stream);
            string s = sr.ReadToEnd();
            EssModel essModel = JsonHelper.DeserializeJsonToObject<EssModel>(s);
            LineManager.GetDischargeEquip().BoxLeave = true;
            LogUtil.info($"取容器完成通知:【{s}】");
            return result;
        }
        /// <summary>
        /// 机器人请求放容器到输送线接口
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        Result IService.unloadContainerReq(Stream stream)
        {
            Result result = new Result();
            StreamReader sr = new StreamReader(stream);
            string s = sr.ReadToEnd();
            EssModel essModel = JsonHelper.DeserializeJsonToObject<EssModel>(s);
            result.data = new Allow() { allow = LineManager.CanBoxIntoFeeding() };
            LogUtil.info($"机器人请求放容器到输送线:【{s}】【{JsonHelper.SerializeObject(result)}】");
            return result;
        }
        /// <summary>
        /// ESS任务状态上报接口
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        Result IService.taskCallBack(Stream stream)
        {
            Result result = new Result();
            StreamReader sr = new StreamReader(stream);
            string s = sr.ReadToEnd();
            TaskStateInfo essModel = JsonHelper.DeserializeJsonToObject<TaskStateInfo>(s);
            if (ContainerManager.CheckContainerCode(essModel.containerCode))
            {
                if (essModel.taskCode?.ToLower().StartsWith("in") ?? false)
                {
                    if (essModel.eventType?.Equals("tote_load") ?? false)
                    {
                        if (essModel.status.Equals("success"))
                        {
                            ContainerManager.UpdateTaskStatus(essModel.containerCode, TaskStatus.IN_ON_AGV);
                        }
                        //else if (essModel.status.Equals("cancel"))
                        //    ContainerManager.UpdateTaskStatus(essModel.containerCode, TaskStatus.ERROR);
                    }
                    else if(essModel.eventType?.Equals("task")??false)
                    {
                        if (essModel.status.Equals("success"))
                        {
                            ContainerManager.UpdateTaskStatus(essModel.containerCode, TaskStatus.FINISHED);
                        }
                        //else if (essModel.status.Equals("cancel"))
                        //    ContainerManager.UpdateTaskStatus(essModel.containerCode, TaskStatus.WAIT);
                    }
                }
                else if (essModel.taskCode?.ToLower().StartsWith("out") ?? false)
                {
                    if (essModel.eventType?.Equals("tote_load") ?? false)
                    {
                        if (essModel.status.Equals("success"))
                        {
                            ContainerManager.UpdateTaskStatus(essModel.containerCode, TaskStatus.OUT_ON_AGV);
                        }
                        //else if (essModel.status.Equals("cancel"))
                        //    ContainerManager.UpdateTaskStatus(essModel.containerCode, TaskStatus.ERROR);
                    }
                    else if (essModel.eventType?.Equals("task") ?? false)
                    {
                        if (essModel.status.Equals("success"))
                        {
                            ContainerManager.UpdateTaskStatus(essModel.containerCode, TaskStatus.OUT_ON_LINE);
                            ////对应线体开始入库
                            //ContainerInfo info = ContainerManager.GetTrayInfo(essModel.containerCode);
                            //if(info!=null)
                            //{  
                            //    LineManager.StartStationInStore(info.InoutParam);
                            //}
                        }
                        //else if (essModel.status.Equals("cancel"))
                        //    ContainerManager.UpdateTaskStatus(essModel.containerCode, TaskStatus.ERROR);
                    }
                }


            }
            else
            {
                result.code = -1;
                result.msg = $"Not found containerCode={essModel.containerCode}";
            }
            LogUtil.info($"收到GV任务状态上报:【{s}】【{JsonHelper.SerializeObject(result)}】");
            return result;
        }
        /// <summary>
        /// 异常上报接口
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        Result IService.exceptionCallBack(Stream stream)
        {
            Result result = new Result();
            StreamReader sr = new StreamReader(stream);
            string s = sr.ReadToEnd();
            ErrorStateInfo essModel = JsonHelper.DeserializeJsonToObject<ErrorStateInfo>(s);
            if (ContainerManager.CheckContainerCode(essModel.containerCode))
            {
                //ContainerManager.UpdateTaskStatus(essModel.containerCode, TaskStatus.ERROR);
            }
            else
            {
                result.code = -1;
                result.msg = $"Not found containerCode={essModel.containerCode}";
            }
            LogUtil.info($"收到AGV异常上报:【{s}】【{JsonHelper.SerializeObject(result)}】");
            return result;
        }
    }

    public class ESSService
    {
        private WebServiceHost _serviceHost;
        public bool State = false;
        public void Open(string url)
        {
            try
            {
                WebService service = new WebService();
                _serviceHost = new WebServiceHost(service, new Uri(url));//service, new Uri(url)
                _serviceHost.Open();
                State = true;
                LogUtil.info($"Web服务已开启:{url}");
            }
            catch (Exception ex)
            {
                State = false;
                LogUtil.error($"Web服务开启出错:{url}", ex);
            }
        }

        public void Close()
        {
            try
            {
                if (_serviceHost != null)//判断服务是否关闭
                    _serviceHost.Close();//关闭服务
                State = false;
                LogUtil.info("Web服务已关闭");
            }
            catch (Exception ex)
            {
                LogUtil.error("Web服务关闭", ex);
            }

        }

    }

}