Service.cs 12.6 KB
using System.ServiceModel;
using System.ServiceModel.Web;
using System.ServiceModel.Activation;
using System;
using System.IO;
using System.Runtime.Serialization;
using Common;
using DeviceLibrary.service.model;
using DeviceLibrary.manager;
using System.Reflection;
using System.Windows.Forms;
using DeviceLibrary.lift;

namespace DeviceLibrary
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single, IncludeExceptionDetailInFaults = true)]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    internal class WebService : IService
    {
        static log4net.ILog Log = log4net.LogManager.GetLogger("WebService");
        public Result Create(Stream stream)
        {
            Result result = new Result();
            StreamReader sr = new StreamReader(stream);
            string s = sr.ReadToEnd();
            MissionInfo createMissionInfo = JsonHelper.DeserializeJsonToObject<MissionInfo>(s);
            if (MissionManager.InUpdating)
            {
                result.code = -1;
                result.msg = $"创建任务失败,AGV已收线:{s}";
                Log.Error(result.msg);
            }
            else if (createMissionInfo == null)
            {
                result.code = -1;
                result.msg = $"解析失败:{s}";
                Log.Error(result.msg);
            }
            else
            {
                int.TryParse(createMissionInfo.missionId.Substring(1, 2), out int projectType);
                if (projectType > 16)
                {
                    result.code = -1;
                    result.msg = $"创建任务失败,不存在的任务类型,请确认编号规则:{createMissionInfo.missionId}";
                    Log.Error(result.msg);
                }
                if (!NodeManager.CheckNode(createMissionInfo.sourcePoint))
                {
                    result.code = -1;
                    result.msg = $"不存在的节点:{createMissionInfo.sourcePoint}";
                    Log.Error(result.msg);
                }
                else if (!NodeManager.CheckNodes(createMissionInfo.destinationPoint, out string nodenames))
                {
                    result.code = -1;
                    result.msg = $"不存在的节点:{nodenames}";
                    Log.Error(result.msg);
                }
                else if (!MissionManager.Contains(createMissionInfo))
                {
                    createMissionInfo.state = MissionState.创建;
                    MissionManager.GetLiftName(createMissionInfo);
                    bool rtn = MissionManager.AddMission(createMissionInfo);
                    if (rtn)
                    {
                        Log.Info($"创建任务成功:{s}");
                    }
                    else
                    {
                        result.code = -1;
                        result.msg = $"创建任务失败,已存在该任务id:{createMissionInfo.missionId}";
                        Log.Error(result.msg);
                    }
                }
                else
                {
                    result.code = -1;
                    result.msg = $"创建任务失败:{createMissionInfo.missionId}";
                    Log.Error(result.msg);
                }
            }
            return result;
        }

        public Result Update(Stream stream)
        {
            Result result = new Result();
            StreamReader sr = new StreamReader(stream);
            string s = sr.ReadToEnd();
            UpdateMission updateMission = JsonHelper.DeserializeJsonToObject<UpdateMission>(s);
            if (updateMission == null)
            {
                result.code = -1;
                result.msg = $"解析失败:{s}";
                Log.Error(result.msg);
            }
            else
            {
                result.code = -1;
                result.msg = $"该接口未开放,请联系管理员";
                Log.Error(result.msg);
            }
            return result;
        }
        public Result Delete(Stream stream)
        {
            Result result = new Result();
            StreamReader sr = new StreamReader(stream);
            string s = sr.ReadToEnd();
            DeleteMission deleteMission = JsonHelper.DeserializeJsonToObject<DeleteMission>(s);
            if (deleteMission == null)
            {
                result.code = -1;
                result.msg = $"解析失败:{s}";
                Log.Error(result.msg);
            }
            else
            {
                if (MissionManager.Contains(deleteMission.missionId))
                {
                    MissionInfo missionInfo = MissionManager.GetMission(deleteMission.missionId);
                    if (missionInfo == null)
                    {
                        result.code = -1;
                        result.msg = $"不存在该任务id:{deleteMission.missionId}";
                        Log.Error(result.msg);
                    }
                    else
                    {
                        if (missionInfo.state.Equals(MissionState.创建))
                        {
                            MissionManager.SetMissionState(missionInfo.missionId, MissionState.取消, out string msg);
                            result.msg = msg;
                        }
                        else
                        {
                            AgvInfo agvInfo = AGVManager.agvInfo.Find(k => k.JobContext.MissionId == deleteMission.missionId);
                            if (agvInfo == null)
                            {
                                MissionManager.SetMissionState(missionInfo.missionId, MissionState.中止, out string msg);
                                result.msg = msg;
                            }
                            else
                            {
                                result.code = -1;
                                result.msg = $"已执行该任务,无法取消:{deleteMission.missionId}";
                                Log.Error(result.msg);
                            }

                        }

                    }

                }
                else
                {
                    result.code = -1;
                    result.msg = $"不存在该任务id:{deleteMission.missionId}";
                    Log.Error(result.msg);
                }
            }
            return result;
        }

        public Result OperationFinish(Stream stream)
        {
            Result result = new Result();
            StreamReader sr = new StreamReader(stream);
            string s = sr.ReadToEnd();
            ConfirmOperation operationFinish = JsonHelper.DeserializeJsonToObject<ConfirmOperation>(s);
            if (operationFinish == null)
            {
                result.code = -1;
                result.msg = $"解析失败:{s}";
                Log.Error(result.msg);
            }
            else
            {
                Node node = NodeManager.GetNode(operationFinish.line);
                if (node == null)
                {
                    result.code = -1;
                    result.msg = $"不存在的线体名:{operationFinish.line}";
                    Log.Error(result.msg);
                }
                else
                {
                    //if(node.ExtendEquip.CanConfirm)
                    {
                        Log.Info($"线体[{operationFinish.line}]被调用确认接口");
                        node.ExtendEquip.ApiConfirmSig = true;
                    }
                    //else
                    //{
                    //    result.code = -1;
                    //    result.msg = $"线体[{operationFinish.line}]附近无小车,不允许调用该接口";
                    //    Log.Warn(result.msg);
                    //}
                }
            }
            return result;
        }

        public MissionResult ReadAll()
        {
            MissionResult missionResult = new MissionResult();
            missionResult.data = MissionManager.GetAllMissions();
            return missionResult;
        }

        public StealResult Storage(string Place)
        {
            StealResult stealResult = new StealResult();
            stealResult.Msg = $"OK,3D";
            //Place:3D_Enter:3D的⼩车⼊库
            if (Place.ToUpper().Equals("3D_ENTER"))//立库出库,呼叫AGV
            {
                MissionInfo missionInfo = new MissionInfo()
                {
                    state = MissionState.创建,
                    missionId = $"P150" + DateTime.Now.ToString("yyyyMMddHHmmss"),
                    sourcePoint = "3dwash",
                    destinationPoint = "storage",
                    needBack = true
                };
                MissionManager.GetLiftName(missionInfo);
                bool rtn = MissionManager.AddSteelMission(missionInfo);
                if (!rtn)
                    Log.Error($"已呼叫钢网出库,忽略");
                return stealResult;
            }
            if (!DataBufferManager.SteelAgvInStorage)
            {
                stealResult.Msg = $"NG,3D";
                Log.Info($"收到立库调用Storage接口:【Place={Place}】【{JsonHelper.SerializeObject(stealResult)}】");
                return stealResult;
            }
            //DI_On/DI_Off 信号亮DI_On,没信号DI_Off
            if (Place.ToUpper().Equals("DI_OFF"))
            {
                manager.DataBufferManager.DockingOk = false;
            }
            else if (Place.ToUpper().Equals("DI_ON"))
            {
                manager.DataBufferManager.DockingOk = true;
            }
            //Leave 出料架,小车可以接料架离开
            else if (Place.ToUpper().Equals("LEAVE"))
            {
                manager.DataBufferManager.LeaveLiku = true;
            }
            else if (Place.ToUpper().Equals("DETACH"))//Detach 脱离架子
            {
                if (!manager.DataBufferManager.DetachShelf)
                {
                    stealResult.Msg = $"NG,3D";
                }
            }
            else
            {
                stealResult.Msg = $"NG,3D,not found place={Place}";
            }
            Log.Info($"收到立库调用Storage接口:【Place={Place}】【{JsonHelper.SerializeObject(stealResult)}】");
            return stealResult;
        }

        public StealResult SendNew(string From, string Place)
        {
            StealResult stealResult = new StealResult();
            stealResult.Msg = $"OK,3D";
            if (DataBufferManager.SteelAgvInStorage)
            {
                DataBufferManager.SteelTarget = Place;
            }
            else
            {
                if ("storage".Equals(From.ToLower()))
                {
                    //MissionInfo missionInfo = new MissionInfo();
                    //missionInfo.state = MissionState.创建;
                    //bool rtn = MissionManager.AddMission(missionInfo);
                    //if (!rtn)
                    //{
                    //    stealResult.Msg = $"NG,3D";
                    //}
                }
            }
            Log.Info($"收到立库调用SendNew接口:【From={From}】【Place={Place}】【{JsonHelper.SerializeObject(stealResult)}】");
            return stealResult;
        }

        public Result GetPositionState(string name)
        {
            Result result = new Result();
            bool rtn = LiftContext.F4AGVIsInD2Lift();
            if (rtn)
            {
                result.code = -1;
                result.msg = "agv in lift";
            }
            return result;
        }
    }

    public class Service
    {
        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服务已开启");
            }
            catch (Exception ex)
            {
                State = false;
                LogUtil.error("Web服务开启", ex);
            }
        }

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

        }

    }



}