using MesServerWork;
using MisDataFunDll;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Xml.Linq;

namespace MesServerFunctions
{
    public partial class FunctionMES
    {
        object lockFunWork;
        //public void FunWork(DeviceDriver_BasicData.CustomeEvetnArgs e)
        public void FunWork(string recData)
        {


            lockFunWork = new object();
            lock (lockFunWork)
            {
                List<string> dataArray = MisDataFun.GetCmdStringList(recData);
                //string[] dataArray = recData.Split('|');
                //if (dataArray.Count != 4)
                //return;
                //消息来源
                string m_Source = dataArray[0].ToString();
                //消息类型 Barcode
                string m_Command = dataArray[1].ToString();
                //工位号
                string m_OpName = dataArray[2].ToString();
                //消息参数
                string m_Value = dataArray[3].ToString();

                DeviceDriver_BasicData.CustomeEvetnArgs e = new DeviceDriver_BasicData.CustomeEvetnArgs();// = Newtonsoft.Json.JsonConvert.DeserializeObject<DeviceDriver_BasicData.CustomeEvetnArgs>(m_Value);
                string tagValue;
                string OpName = m_OpName;
                switch (m_Source)
                {
                    case "PLC":
                        e = Newtonsoft.Json.JsonConvert.DeserializeObject<DeviceDriver_BasicData.CustomeEvetnArgs>(m_Value);
                        switch (e.TagValue.ToString().ToLower())
                        {
                            case "false":
                                tagValue = "0";
                                break;
                            case "true":
                                tagValue = "1";
                                break;
                            default:
                                tagValue = e.TagValue.ToString();
                                break;
                        }
                        e.TagValue = tagValue;
                        switch (e.TagTypeCodeID.ToString())
                        {
                            // AGV相关变量类型代码处理说明：
                            // 301：AGV请求进入
                            // 302：AGV器具放置完毕
                            // 303：AGV退出光栅
                            // 304：送料信息验证完成
                            // 305：送料信息验证结果
                            // 305：任务发送状态 0 没有 1 发送 2 失败
                            // 311：请求叫料
                            // 312：请求退空    
                            // 313：请求退料
                            // 314：允许AGV进入
                            // 315：允许AGV离开
                            // 316：器具码扫描完毕
                            // 317：退回并重新配送
                            // 318：器具号
                            // 319：请求上料机型
                            // 320：收到状态反馈点
                            // 321：转序
                            // 322：下空托盘
                            // 323：上空托盘
                            // 324：点对点
                            // 500：AGV请求下降
                            // 501：AGV请求举升
                            // 550：允许AGV下降
                            // 551：允许AGV举升

                            // 请求叫料
                            case "311":
                                fun_CallMaterials(e);
                                break;
                            // 请求退空
                            case "312":
                                fun_RequestReturns(e);
                                break;
                            // 请求退料
                            case "313":
                                fun_RequestReturnMaterial(e);
                                break;
                            // 允许AGV进入
                            case "314":
                                fun_AllowAGVEnter(e);
                                break;
                            // 允许AGV离开
                            case "315":
                                fun_AllowAGVLeave(e);
                                break;
                            // 器具码扫描完毕
                            case "316":
                                fun_ToolCodeScanOver(e);
                                break;
                            // 退回并重新配送
                            case "317":
                                fun_ReturnAndRedispatch(e);
                                break;
                            // 收到任务状态握手
                            case "320":
                                //MIS_BASE.WritePLC(306, m_OpName, 0);
                                break;
                            // 转序
                            case "321":
                                fun_TransferSequence(e);
                                break;
                            // 下空托盘
                            case "322":
                                fun_UnloadEmptyTray(e);
                                break;
                            // 上空托盘
                            case "323":
                                fun_LoadEmptyTray(e);
                                break;
                            // 允许AGV下降
                            case "550":
                                fun_AllowAGVLower(e);
                                break;
                            // 允许AGV举升
                            case "551":
                                fun_AllowAGVRaise(e);
                                break;
                            // AGV插头完成
                            case "400":
                                break;
                            // AGV拔插头完成
                            case "401":
                                break;
                            // MES允许开始磨合
                            case "402":
                                break;
                            // MES反馈磨合结束
                            case "403":
                                break;
                            // 托盘压紧气缸压紧
                            case "404":
                                if (tagValue == "1") MIS_BASE.WritePLC(405, OpName, false);
                                break;
                            // 托盘压紧气缸松开
                            case "405":
                                if (tagValue == "1") MIS_BASE.WritePLC(404, OpName, false);
                                break;
                            // 插头推靠气缸推靠
                            case "406":
                                if (tagValue == "1") MIS_BASE.WritePLC(407, OpName, false);
                                break;
                            // 插头推靠气缸退回
                            case "407":
                                if (tagValue == "1") MIS_BASE.WritePLC(406, OpName, false);
                                break;
                            // 自动模式
                            case "408":
                                if (tagValue == "1") MIS_BASE.WritePLC(409, OpName, false); // 自动掉手动模式
                                break;
                            // 手动模式
                            case "409":
                                if (tagValue == "1") MIS_BASE.WritePLC(408, OpName, false); // 自动掉自动模式
                                break;
                            // 请求上线
                            case "450":
                                MisDataFun.Rrunning_UpdateOpCallStatus(OpName, Convert.ToInt32(tagValue)); // 更新至数据库库位状态
                                break;
                            // 请求下线
                            case "451":
                                break;
                            // 请求插插头
                            case "452":
                                // 需要调用AGV插插头接口 去插
                                break;
                            // 请求拔插头
                            case "453":
                                break;
                            // 开始磨合
                            case "454":
                                break;
                            // 磨合完成
                            case "455":
                                break;
                            // 推靠气缸原位
                            case "456":
                                break;
                            // 推靠气缸到位
                            case "457":
                                break;
                            // 压紧气缸原位
                            case "458":
                                break;
                            // 压紧气缸到位
                            case "459":
                                break;
                        }
                        break;
                }
            }
        }

        // 叫料流程
        // 1.请求叫料  收到请求叫料后 调用叫料接口   后续收到AGV的
        // 2.收到工厂  请求进入接口（工厂未开发 跳过） 发给PLC AGV请求进入
        // 3.收到允许AGV进入 调用接口(未开发 跳过) 允许进入
        // 4.收到 器具码扫码完成  根据318器具号 调用器具号查询接口 得出校验结果
        // 5.若器具码校验通过 调用 确认物料配送接口 调用成功后 给PLC发送 送料信息验证结果（1 合格 2 不合格） 和 送料信息验证完成
        // 6.收到AGV请求离开接口后（未开发 跳过） 发送给PLC请求离开点位
        // 7.收到PLC允许离开信号后 调用AGV允许离开接口（未开发 跳过）

        // 退空托流程
        // 1.收到请求退空  调用退空托接口
        // 2.如叫料AGV请求进入 请求离开。。。。 只不过不需要扫描器具码部分


        // AGV相关方法声明（PLC触发的信号）
        /// <summary>
        /// 请求叫料
        /// </summary>
        public void fun_CallMaterials(DeviceDriver_BasicData.CustomeEvetnArgs e)
        {
            ThreadPool.QueueUserWorkItem(CallMaterials, e);
        }

        /// <summary>
        /// 请求退空
        /// </summary>
        public void fun_RequestReturns(DeviceDriver_BasicData.CustomeEvetnArgs e)
        {
            ThreadPool.QueueUserWorkItem(RequestReturns, e);
        }

        /// <summary>
        /// 请求退料
        /// </summary>
        public void fun_RequestReturnMaterial(DeviceDriver_BasicData.CustomeEvetnArgs e)
        {
            ThreadPool.QueueUserWorkItem(RequestReturnMaterial, e);
        }

        /// <summary>
        /// 允许AGV进入
        /// </summary>
        public void fun_AllowAGVEnter(DeviceDriver_BasicData.CustomeEvetnArgs e)
        {
            ThreadPool.QueueUserWorkItem(AllowAGVEnter, e);
        }

        /// <summary>
        /// 允许AGV离开
        /// </summary>
        public void fun_AllowAGVLeave(DeviceDriver_BasicData.CustomeEvetnArgs e)
        {
            ThreadPool.QueueUserWorkItem(AllowAGVLeave, e);
        }

        /// <summary>
        /// 允许AGV下降
        /// </summary>
        public void fun_AllowAGVLower(DeviceDriver_BasicData.CustomeEvetnArgs e)
        {
            ThreadPool.QueueUserWorkItem(AllowAGVLower, e);
        }

        /// <summary>
        /// 允许AGV举升
        /// </summary>
        public void fun_AllowAGVRaise(DeviceDriver_BasicData.CustomeEvetnArgs e)
        {
            ThreadPool.QueueUserWorkItem(AllowAGVRaise, e);
        }

        /// <summary>
        /// 器具码扫描完毕
        /// </summary>
        public void fun_ToolCodeScanOver(DeviceDriver_BasicData.CustomeEvetnArgs e)
        {
            ThreadPool.QueueUserWorkItem(ToolCodeScanOver, e);
        }

        /// <summary>
        /// 退回并重新配送
        /// </summary>
        public void fun_ReturnAndRedispatch(DeviceDriver_BasicData.CustomeEvetnArgs e)
        {
            ThreadPool.QueueUserWorkItem(ReturnAndRedispatch, e);
        }

        /// <summary>
        /// 转序
        /// </summary>
        public void fun_TransferSequence(DeviceDriver_BasicData.CustomeEvetnArgs e)
        {
            ThreadPool.QueueUserWorkItem(TransferSequence, e);
        }

        /// <summary>
        /// 下空托盘
        /// </summary>
        public void fun_UnloadEmptyTray(DeviceDriver_BasicData.CustomeEvetnArgs e)
        {
            ThreadPool.QueueUserWorkItem(UnloadEmptyTray, e);
        }

        /// <summary>
        /// 上空托盘
        /// </summary>
        public void fun_LoadEmptyTray(DeviceDriver_BasicData.CustomeEvetnArgs e)
        {
            ThreadPool.QueueUserWorkItem(LoadEmptyTray, e);
        }

        /// <summary>
        /// 点对点
        /// </summary>
        public void fun_PointToPoint(DeviceDriver_BasicData.CustomeEvetnArgs e)
        {
            ThreadPool.QueueUserWorkItem(PointToPoint, e);
        }

    }
}
