using System;
using MesServerWork;
using bizFacade;
using System.Threading;
using MisDataSaveDate;
using System.Collections;
//using SystemFramework;


namespace MesServerFunctions
{
    partial class FunctionMES
    {
        /// <summary>
        /// 处理WEB页面发送过来的请求（m_Command + "|" + m_Value;）
        /// </summary>
        /// <param name="OpName"></param>
        /// <param name="Content"></param>
        private void WebSubmit(object e)
        {
            try
            {
                DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e;
                string OpName = Convert.ToString(msgEvent.OpName);
                string Content = Convert.ToString(msgEvent.TagValue);

                string opName_SubLine = "";
                string engineID = "";//工件信息
                string[] dataArray = Content.Split('|');

                if (dataArray.Length != 2)
                    return;


                string m_Command = dataArray[0].ToString();//消息类型
                string m_Value = dataArray[1].ToString();//消息参数
                string[] m_Value_array = m_Value.Split('&');//消息参数数量
                int m_Value_length = m_Value_array.Length; //消息参数长度

                if (MIS_BASE.hashtable_EngineGetOver_EngineTypeID == null)
                {
                    MIS_BASE.InitHashtable_MesServerCode();
                }
                if (MIS_BASE.hashtable_EngineGetOver_EngineID.ContainsKey(OpName))
                {
                    engineID = MIS_BASE.hashtable_EngineGetOver_EngineID[OpName].ToString();
                }
                if (MIS_BASE.hashtable_OpNameRepair == null)
                {
                    MIS_BASE.InitHashtable_MesServerCode();
                }
                DoWhatPlc.CustomeEvetnArgs _e = new DoWhatPlc.CustomeEvetnArgs();
                _e.OpName = OpName;
                _e.TagValue = m_Value;

                //根据请求的命令处理逻辑
                switch (m_Command)
                {
                    case "Barcode":
                        if (m_Value_length > 1) return;
                        fun_Barcode(_e);
                        break;
                    case "ConfirmOkGo"://合格放行
                        //修改托盘状态
                 
                        BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID);
                        MIS_BASE.Write_ConfirmOkGo(OpName, true);
                        MIS_BASE.Write_FalseGO(OpName, false);
                        Thread.Sleep(1000);
                        MIS_BASE.Write_ConfirmOkGo(OpName, false);
                        break;
                    case "FalseGO"://返修放行
                        //修改托盘状态
                        BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID);
                        MIS_BASE.Write_FalseGO(OpName, true);
                        MIS_BASE.Write_ConfirmOkGo(OpName, false);
                        Thread.Sleep(1000);
                        MIS_BASE.Write_FalseGO(OpName, false);
                        break;
                    case "NgGO"://不合格放行
                        //修改托盘状态
                        //保存不合格信息(必须保存不合格放行信息，由于B5A的Moby没有不合格标志位)
                        BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Insert(OpName, engineID, "", "");
                        MIS_BASE.Write_FalseGO(OpName, true);
                        MIS_BASE.Write_ConfirmOkGo(OpName, false);
                        Thread.Sleep(1000);
                        MIS_BASE.Write_FalseGO(OpName, false);
                        break;
                    case "OnLineState"://在线0、离线1、屏蔽2
                        try
                        {
                            if (m_Value_length > 1) return;
                            int a = Convert.ToInt32(m_Value);
                            if (a <= 2)
                            {
                                BaseDataSystemMES.IsOnLine_Update(OpName, m_Value.ToString());
                                MIS_BASE.Write_OnLineState(OpName, Convert.ToInt32(m_Value));

                                if (a == 2) SendMessage.AsyncSendMessage_Notice(OpName, "屏蔽MES！");
                                if (a == 0) SendMessage.AsyncSendMessage_Notice(OpName, "启用MES！");
                            }
                        }
                        catch
                        {

                        }
                        break;
                    case "Reset"://复位，将MES所有的信息都复位了
                        SetMoby(OpName);//将MES所有信号清空

                        break;
                    case "FixAllow"://重新拧紧
                        break;
                    case "IsAutoGetEngineID"://自动手动申请编号（线首）
                        if (m_Value_length > 1) return;
                        MIS_BASE.Write_IsAutoGetEngineID(OpName, Convert.ToInt32(m_Value));
                        break;
                    case "PartPalletGoOver"://空托盘放行
                        MIS_BASE.Write_RepairUpline_MES(opName_SubLine, true);
                        //MIS_BASE.Write_PalletInfo(opName_SubLine, 4);
                        //MIS_BASE.Write_UpdatePalletOK(opName_SubLine, true);
                        MIS_BASE.Write_MaterialVerifyOver(opName_SubLine, true);
                        break;
                    case "SetMoby"://清空托盘（线首）
                        SetMoby(OpName);//将MES所有信号清空
                        break;
                    case "RepairUplineMES"://返修上线
                        MIS_BASE.Write_RepairUpline_MES(OpName, true);
                        break;
                    case "CancelRepair"://将返修件置为正常件

                        break;
                    case "PartPalletCode"://申请写入托盘号
                        //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1);
                        break;
                    case "WritePartPalletCode"://写入托盘号
                        if (m_Value_length > 1) return;
                        MIS_BASE.Write_PalletCode(OpName, Convert.ToInt32(m_Value));
                        break;
                    case "Normal"://启用正常拧紧工位
                        MIS_BASE.Write_Normal(OpName, 1);
                        MIS_BASE.Write_UnNormal(OpName, 0);
                        break;
                    case "UnNormal"://启用备用拧紧工位
                        MIS_BASE.Write_Normal(OpName, 0);
                        MIS_BASE.Write_UnNormal(OpName, 1);
                        break;
                    case "ResetDevice"://复位设备
                        MIS_BASE.Write_ResetDevice(OpName, true);
                        System.Threading.Thread.Sleep(1000);
                        MIS_BASE.Write_ResetDevice(OpName, false);
                        break;
                    case "IsNeedRepaire"://返修上线(返修上线点)
                        if (Convert.ToInt32(m_Value) == 1)
                        {
                            //修改托盘状态
                            MIS_BASE.Write_PalletInfo(OpName, 3);
                            //通知修改成功
                            MIS_BASE.Write_UpdatePalletOK(OpName, true);
                            IsNeedRepaire_OK(OpName);
                        }
                        else if (Convert.ToInt32(m_Value) == 0)
                        {
                            //直接给出工作完成
                            MIS_BASE.Write_MaterialVerifyOver(OpName, true);
                        }
                        break;
                        //强制匹配
                    case "ForceMatch":
                        if (Convert.ToInt32(m_Value) == 1)
                        {
                            ForceMatch(OpName);
                        }
                        break;
                    case "PalletGO":

                        if (Convert.ToInt32(m_Value) == 1)
                        {
                            //直接给出工作完成
                            MIS_BASE.Write_MaterialVerifyOver(opName_SubLine, true);
                        }
                        break;
                    case "ContinueMatch":
                        BaseDataSystemMES.QualityVerifyStatus_Hash_Write(OpName, true);
                        fun_EngineTypeGetOverPLC(_e);
                        break;
                    //初始化网页信号
                    case "IniSingalToWeb":
                        InitializeSingalToWeb(OpName);
                        break;
                    default: break;
                }
            }
            catch(Exception err)
            {
                ////ApplicationLog.WriteLog(err, "Function08:WebSubmit");
            }
        }

        private void SetMoby(string OpName)
        {
            try
            {
                //清空Moby时，需要将MES信号清空
                MIS_BASE.Write_ClearMesMoby(OpName);

                BaseDataSystemMES.MesServer_Process_EngineTypeOver(OpName);

                SendMessageFun.SendMessage("5123", "1111", OpName);

                MIS_BASE.Write_ResetDevice(OpName, true);
                System.Threading.Thread.Sleep(1000);
                MIS_BASE.Write_ResetDevice(OpName, false);
            }
            catch
            {

            }
        }


        /// <summary>
        /// 网页重现登录，恢复关闭前的页面状态
        /// </summary>
        /// <param name="Opname">工位号</param>
        private void InitializeSingalToWeb(string Opname)
        {
            bool S_WorkStart;//工件到位 DBX0.1
            bool S_EngineGetOver;//传递机型 DBX0.4
            bool S_FixAllow;//允许工作 DBX3.1
            bool S_MaterialVerifyOver;//工作完成 DBX2.3
            string S_plcStatus;//DBX501.5 PLC直通，1 强制放行 0 正常循环

            int IsCompleted = 0;
            int S_Match = 0;
            int PalletInfo_SubLine = 0;//显示分线托盘状态

            MIS_BASE.Read_WorkStart(Opname, out S_WorkStart);

            //5 显示订单、机型信息 线首工位用
            SendMessage.ShowMoby_FirstOpName(Opname);
            //3显示操作指导图片 PicShow_String_FirstOpName
            SendMessage.PicShow_FirstOpName(Opname);
            //1（直接在界面通过选择机型确认工序内容）
            SendMessage.ProcessList_FirstOpName(Opname);
            //界面显示物料信息
            SendMessage.MaterialList_FirstOpName(Opname);
            // 新增查询PLC直通状态 网页显示
            MIS_BASE.Read_TagTypeID(63, Opname, out S_plcStatus);
            InitAlarm(Opname);

            if (S_plcStatus.ToLower() == "false")
            {
                SendMessageFun.SendInfomation("PlcStatus", "0", Opname);
            }
            else
            {
                SendMessageFun.SendInfomation("PlcStatus", "1", Opname);
            }

            if (S_WorkStart == true)
            {
                SendMessageFun.SendInfomation("WorkStart", Convert.ToString(Convert.ToInt32(S_WorkStart)), Opname);
                //sendmessage(Opname, Convert.ToInt32(S_WorkStart), "WorkStart_Subline");
            }

            //sendmessage(Opname, Convert.ToInt32(S_WorkStart), "EngineTypeGetOverMES_Subline");

            MIS_BASE.Read_EngineGetOver_PLC(Opname, out S_EngineGetOver);
            if (S_EngineGetOver == true)
            {
                SendMessageFun.SendInfomation("EngineTypeGetOverPLC", Convert.ToString(Convert.ToInt32(S_EngineGetOver)), Opname);
                //sendmessage(Opname, Convert.ToInt32(S_EngineGetOver), "EngineTypeGetOverMES_Subline");
            }

            MIS_BASE.Read_FixAllow(Opname, out S_FixAllow);

            if (S_FixAllow == true)
            {
                SendMessageFun.SendInfomation("FixAllow", Convert.ToString(Convert.ToInt32(S_FixAllow)), Opname);
            }

            MIS_BASE.Read_MaterialVerifyOver(Opname, out S_MaterialVerifyOver);

            if (S_MaterialVerifyOver == true)
            {
                SendMessageFun.SendInfomation("MaterialVerifyOver", Convert.ToString(Convert.ToInt32(S_MaterialVerifyOver)), Opname);
            }

            //MIS_BASE.Read_MatchingCompleted(Opname, out IsCompleted);   //DBX1.3 是否匹配
            //MIS_BASE.Read_Match(Opname, out S_Match);                      //DBX1.4 匹配结果

            //if (IsCompleted == 1 && S_Match == 1)//发送匹配完成和匹配结果信息
            //{
            //    SendMessageFun.SendInfomation("MatchingCompleted", "1", Opname);
            //    SendMessageFun.SendInfomation("Match", "1", Opname);
            //    SendMessageFun.SendInfomation("MatchSuccess", "1", Opname);//界面显示匹配成功
            //}
            //else if (IsCompleted == 1 && S_Match == 0)
            //{
            //    SendMessageFun.SendInfomation("MatchSuccess", "0", Opname);//界面显示匹配失败
            //}

            //if (MIS_BASE.hashtable_OpNameRepair == null)
            //{
            //    MIS_BASE.InitHashtable_MesServerCode();
            //}
            //string Opname_SubLine = "";
            //if (MIS_BASE.hashtable_OpNameRepair.ContainsKey(Opname))
            //{
            //    Opname_SubLine = MIS_BASE.hashtable_OpNameRepair[Opname].ToString();
            //}
            //if (Opname_SubLine == "")
            //{
            //    return;
            //}

            //MIS_BASE.Read_PalletInfo(Opname, out  PalletInfo_SubLine);
            //sendmessage(Opname, PalletInfo_SubLine, "SubQualityMask");
            //SendMessageFun.SendInfomation("ShowMobySubLine", Opname_SubLine, Opname);//显示分线机型及流水号
        }

        //分线发送工件到位信号函数
        private void sendmessage(string OpName, int tagValue, string Command)
        {
            string SendMessage;
            SendMessage = "MES|" + Command + "|" + OpName + "|" + tagValue;
            SendMessageFun.AsyncSendMessage(SendMessage);

        }
        private void InitAlarm(string Opname)
        {
            FuntionMesRead.Alarm_InitAlarm_Send(Opname, out Hashtable ht);
            foreach (DictionaryEntry kv in ht)
            {
                var TagID = kv.Key.ToString();
                var TagValue = kv.Value.ToString();
                FuntionMesRead.Send_AlarmMsg(TagID, TagValue);
            }

        }
    }
}
