using System;
using System.Data;
using System.Collections;

using System.Windows.Forms;
//using bizFacade;
using System.Collections.Specialized;
//using MesWork;
//using SystemFramework;
using System.Threading;
using bizFacade;

namespace MesServerWork
{
    public partial class MIS_BASE
    {
        static object lockerWebSubmit = new object();


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

                    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;

                    //工件信息
                    string engineID = "";
                    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();
                    }

                    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"://合格放行
                                           //删除不合格放行记录
                                           //修改托盘状态
                                           //Update_PalletStatus(OpName, 1, false);
                            BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID);
                            MIS_BASE.Write_ConfirmOkGo(OpName, true);
                            MIS_BASE.Write_FalseGO(OpName, false);
                            break;
                        case "FalseGO"://返修放行
                                       //修改托盘状态
                                       //Update_PalletStatus(OpName, 3, false);
                            BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Delete(OpName, engineID);
                            MIS_BASE.Write_FalseGO(OpName, true);
                            MIS_BASE.Write_ConfirmOkGo(OpName, false);
                            break;
                        case "NgGO"://不合格放行
                                    //修改托盘状态
                                    //Update_PalletStatus(OpName, 2, false);
                                    //保存不合格信息(必须保存不合格放行信息，由于B5A的Moby没有不合格标志位)
                            BaseDataSystemMES.BaseData_tagTable_Engine_IsNG_Insert(OpName, engineID, "", "");
                            MIS_BASE.Write_FalseGO(OpName, true);
                            MIS_BASE.Write_ConfirmOkGo(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));
                                }
                            }
                            catch
                            {

                            }
                            break;
                        case "Reset"://复位，将MES所有的信息都复位了
                            SetMoby(OpName);//将MES所有信号清空
                            break;
                        case "FixAllow"://重新拧紧
                            MIS_BASE.Write_FixAllow(OpName, false);
                            MIS_BASE.Write_FixAllow(OpName, true);
                            break;
                        case "IsAutoGetEngineID"://自动手动申请编号（线首）
                            if (m_Value_length > 1) return;
                            MIS_BASE.Write_IsAutoGetEngineID(OpName, Convert.ToInt32(m_Value));
                            break;
                        case "PartPalletGoOver"://空托盘放行
                            int Is_PartPalletGoOver;
                            MIS_BASE.Read_PartPalletGoOver(OpName, out Is_PartPalletGoOver);
                            if (Is_PartPalletGoOver == 1)
                            {
                                MIS_BASE.Write_PartPalletGoOver(OpName, 1);
                            }
                            else
                            {
                                MIS_BASE.Write_PartPalletGoOver(OpName, 0);
                            }
                            break;
                        case "SetMoby"://清空托盘（线首）
                            SetMoby(OpName);//将MES所有信号清空
                                            //MIS_BASE.Write_PartPalletCode_PLC(OpName, 1);
                            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_UpdatePalletOK(OpName, true);
                                //直接给出工作完成
                                MIS_BASE.Write_MaterialVerifyOver(OpName, true);
                            }
                            else
                            { }

                            break;
                        case "ContinueMatch":
                            BaseDataSystemMES.QualityVerifyStatus_Hash_Write(OpName, true);
                            break;
                        //初始化网页信号
                        case "IniSingalToWeb":
                            InitializeSingalToWeb(OpName);
                            break;
                        case "Reset_Engine"://返修上线(返修上线点)
                            SetMoby(OpName);//将MES所有信号清空
                                            //fun_EngineTypeGetOverPLC(OpName, 0);
                                            //fun_EngineTypeGetOverPLC(OpName, 1);
                            break;


                        default: break;
                    }
                }
                catch (Exception err)
                {
                    ////ApplicationLog.WriteLog(err, "Function02:WebSubmit");
                }
            }
            
        }

        //1.工件到位后，PLC给MES传递机型(DBX0.4)(44)，
        //MES判断条码是否全部扫描完成
        //PLC给出允许保存(DBX100.2)(19)，MES见到(DBX100.2)(19)为1后给出保存完成(DBX102.2)(20)，
        //PLC见到保存完成(DBX102.2)(20)为1后，清空允许保存(DBX100.2)(19)，
        //MES见到允许保存(DBX100.2)(19)为0后，清空保存完成(DBX102.2)(20)
        //MES判断总合格标志(INT104)(21)为1后，给出合格放行(DBX2.5)(51)
        /// <summary>
        /// 扫描条码
        /// </summary>
        /// <param name="OpName"></param>
        /// <param name="barcode"></param>
        static public void fun_Barcode(DoWhatPlc.CustomeEvetnArgs e)
        {
            ThreadPool.QueueUserWorkItem(Barcode, e);
        }
        static private void SetMoby(string OpName)
        {
            try
            {
                //清空Moby时，需要将MES信号清空
                MIS_BASE.Write_ClearMesMoby(OpName);

                BaseDataSystemMES.MesServer_Process_EngineTypeOver(OpName);

                Sendmessage("5123", "1111", OpName);

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

            }
        }
        /// 网页重现登录，恢复关闭前的页面状态
        /// </summary>
        /// <param name="Opname">工位号</param>
        static private void InitializeSingalToWeb(string Opname)
        {

            //工件到位 DBX0.1
            bool S_WorkStart;
            bool S_FixAllow;
            bool S_EngineGetOver;
            bool S_MaterialVerifyOver;

            MIS_BASE.Read_WorkStart(Opname, out S_WorkStart);
            MIS_BASE.Read_FixAllow(Opname, out S_FixAllow);
            MIS_BASE.Read_EngineGetOver_PLC(Opname, out S_EngineGetOver);
            MIS_BASE.Read_MaterialVerifyOver(Opname, out S_MaterialVerifyOver);



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

            if (S_EngineGetOver == true)
            {

                SendInfomation("EngineTypeGetOverPLC", Convert.ToString(Convert.ToInt32(S_EngineGetOver)), Opname);
                Sendmessage("5123", "1111", Opname);
            }
            if (S_FixAllow == true)
            {
                SendInfomation("FixAllow", Convert.ToString(Convert.ToInt32(S_FixAllow)), Opname);
            }
            if (S_MaterialVerifyOver == true)
            {
                SendInfomation("MaterialVerifyOver", Convert.ToString(Convert.ToInt32(S_MaterialVerifyOver)), Opname);
            }
        }
    }
}
