
using bizFacade;
using DoWhatPlc;
using MesServerWork;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//using SystemFramework;

namespace MisDataFunction
{
    public partial class Function: MIS_BASE
    {



        ///<summary>
        /// 处理MIS逻辑 TagName 变量类型代码 变量类型名称
        /// WorkStart	2	工件到位。托盘到达工位，并且托盘上有工件。
        ///RepairPartStatusPLC	3	备用
        ///RepairPathString	4	工位返修字符串（121211112222111）,前2位是西门子字符串格式，第一位是总长度，第二位是实际长度
        ///EngineTypeGetOverMES	5	MES传递总成信息给PLC（上线工位）
        ///PartPalletGoOver	6	上线工位。0：正常工作；1：空托盘放行，PLC读取到此标志不走申请上线逻辑。
        ///MaterialVerifyOver	7	MES保存完质量数据，物料数据等与PLC信号交互完成后通知PLC，所以工步都完成，才可以放行工件，正常工作时工件放行的必要条件。
        ///FalseGo	8	按MES界面[不合格放行] 按钮，MES发送此信号。操作者判断工件不合格，通知设备，按不合格方式放行工件，工件流转到返修下线工位后，返修下线。MES工作完成MES0.3=1，MES合格放行MES0.5=0，MES0.4=1
        ///EngineTypeID	9	MES发动机机型标志(必须PLC)
        ///EngineID	10	MES发动机编号(必须PLC)
        ///EngineType	11	MES发动机机型(必须PLC)
        ///PartPalletStatus	13	MES激发变量托盘到位离开(必须PLC)
        ///HeartBeatPLC	14	心跳处理：PLC收到MES心跳信号后，PLC延时5秒后，数值取反再写回PLC，写回PLC开始计时，如果5秒钟MES无反馈报通讯故障。
        ///HeartBeatMIS	15	间隔时间5S，心跳处理。收到PLC心跳信号后，MES按原值回写。PLC收到MES信号后延时5秒，取反写入，以此循环。
        ///TargetTimeRead	16	MES允许可读工位运行时间
        ///MachineTargetTime	17	目标运行时间
        ///MachineActualTime	18	实际运行时间
        ///MesRead	19	质量数据可以读数据
        ///MesReadOver	20	MES保存完数据(必须MIS)
        ///QualityMask	21	质量数据工位合格标志0:没有工作；1：合格 ；2 ：不合格(必须PLC)
        ///PalletInfo	22	0空托盘，1合格件，2不合格件
        ///RepairStatusPLC	23	0正常件，1返修件
        ///Reserved_3	24	备用
        ///Reserved_4	25	备用
        ///Reserved_5	26	备用
        ///Reserved_6	27	备用
        ///Reserved_7	28	备用
        ///Reserved_8	29	备用
        ///Reserved_9	30	备用
        ///Reserved_10	31	备用
        ///Reserved_11	32	备用
        ///Reserved_12	33	备用
        ///Reserved_13	34	备用
        ///Reserved_14	35	备用
        ///PLCSPareint1	36	备用
        ///PLCSPareint2	37	备用
        ///PLCSPareint3	38	备用
        ///PLCSarestring1	39	备用
        ///PLCSarestring2	40	备用
        ///MarkID	42	机体打标号（MES）前2位是西门子字符串格式，第一位是总长度，第二位是实际长度
        ///PartLoad	43	上线工位，PLC向MES申请总成编号。收到该信号后，MES将机型标志（DBB22 ~23）、总成号（DBB24 ~63）、总成机型DBB64 ~103写入PLC。之后MES通过信号“传递机型（DBX0.1）”通知PLC。
        ///EngineTypeGetOverPLC	44	PLC将机型标志（DBB50…51）、工件编号（DBB52…101）、产品型号（DBB102…187）、托盘编号（DBB188…189）准备完毕后，通知MES。
        ///PartLoadOK	48	备用
        ///Reserved_18	49	备用
        ///PalletDown	50	暂时保留，项目未使用
        ///ConfirmOkGo	51	按MES界面[合格放行] 按钮，MES发送此信号。操作者判断工件合格，通知设备，工件按合格方式放行工件。MES工作完成MES0.3=1，MES合格放行MES0.5=1，MES0.4=0
        ///ResetDevice	52	针对手动工位，无HMI，需要复位设备在MES页面操作。
        ///UnloadCompleted	53	暂时保留，项目未使用
        ///MachineTime_ReadOver	54	备用
        ///Reserved_19	58	备用
        ///FixOK	59	手动拧紧工位，单工步螺栓拧紧完成，通知PC读取数据。
        ///Reserved_21	61	备用
        ///Reserved_22	62	备用
        ///Reserved_23	63	备用
        ///Reserved_24	64	备用
        ///Reserved_25	65	备用
        ///FixAllow	66	设备工作的必须信号,对于有物料验证的工位，MES验证完成给出此信号，对于无物料验证工位，MES直接给出此信号。
        ///FixOver	67	用于手动拧紧且有质量数据工位。通知设备当前工步拧紧螺钉工作结束。
        ///MatchingCompleted	68	分线上总线，匹配成功是1；不成功是0。
        ///Match	69	分线上总线，匹配成功是1；不成功是0。
        ///Reserved_2	70	备用
        ///IsAutoGetEngineID	71	自动手动申请工件编号。0是自动方式；1：手动方式。暂时保留，生成流水号方式是在数据库中实现的
        ///RepairUplineMES	72	上线清空MOBY（针对上线工位）：通知PLC从新开始申请上线流程
        ///EngineTypeID_MES	73	MES发动机机型标志(必须MES)
        ///EngineID_MES	74	MES发动机编号(必须MES)
        ///EngineType_MES	75	MES发动机机型(必须MES)
        ///Reserved_20	76	备用
        ///ProcessCode	77	手动拧紧工位：由MES通知PLC拧紧序号
        ///OnLineState	79	通过线体工位PC实现下达工位工作状态：工位有三种状态：在线、离线、屏蔽。在线：0正常状态，实现正常功能。1离线:设备脱离MES工作，进入不交互模式。
        ///PartPalletCode	80	托盘编号(B5A)
        ///BoltCode	88	手动拧紧工位：指导PLC所用套筒
        ///RepairStatus	93	0正常件，1返修件。对于上线工位MES给出是正常上线还是返修上线,返修路径
        ///Reserved_15	110	备用
        ///Reserved_16	111	备用
        ///Reserved_17	112	备用
        ///SPareint1	113	备用int1
        ///SPareint2	114	备用int2
        ///SPareint3	115	备用int3
        ///Sparestring1	116	备用字符串1
        ///Sparestring2	117	备用字符串2
        ///MachineStatusPutOn	1000	机床上电(必须PLC)
        ///MachineStatusWorkOn	1001	循环开始(必须PLC)
        ///MachineStatusAlarm	1002	机床故障(必须PLC)
        ///MachineStatusNoPart	1003	上料无件(必须PLC)
        ///MachineStatusBlock	1004	下料堵塞(必须PLC)
        ///Alarm	103	设备报警
        /// </summary>
        /// <param name = "e" ></ param >
        public static void MIS_Funtion(object e)
        {
            try
            {

                string recData = e.ToString();
                string[] dataArray = recData.Split('|');
                if (dataArray.Length != 4)
                    return;
                //消息来源
                string m_Source = dataArray[0].ToString();
                //消息类型
                string m_Command = dataArray[1].ToString();
                //工位号
                string m_OpName = dataArray[2].ToString();
                //消息参数
                string m_Value = dataArray[3].ToString();

                DoWhatPlc.ReturnValueString rv = Newtonsoft.Json.JsonConvert.DeserializeObject<DoWhatPlc.ReturnValueString>(m_Value);
                //Console.WriteLine($"【【{rv.TagID}【【【【{ rv.TagKeepTime}");

                int tagType;
                string opName;
                string tagValue;
                int tagid;
                DoWhatPlc.ReturnValueString msgEvent = rv;
                if (msgEvent.TagValue == null) return;
                tagType = Convert.ToInt32(msgEvent.TagTypeID);
                opName = msgEvent.OpName.ToString();
                tagid = Convert.ToInt32(msgEvent.TagID);


                //int tagType;
                //string opName;
                //string tagValue;
                //int tagid;
                //DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e;
                //if (msgEvent.TagValue == null) return;
                //tagType = Convert.ToInt32(msgEvent.TagType);
                //opName = msgEvent.OpName.ToString();
                //tagid = Convert.ToInt32(msgEvent.TagKey);
                switch (Convert.ToInt32(msgEvent.TagTypeCodeID))
                {
                    case 11:
                        switch (msgEvent.TagValue.ToLower())
                        {
                            case "1":
                            case "true":
                                tagValue = "1";
                                break;
                            default:
                                tagValue = "0";
                                break;
                        }
                        break;
                    default:
                        tagValue = msgEvent.TagValue.ToString();
                        break;
                }
                ///根据信号处理逻辑
                switch (tagType)
                {
                    case 19:
                        //允许保存
                        MesRead(opName, tagValue, tagid);
                        break;
                    case 14:
                        //心跳
                        Heartbeat(opName, tagValue);
                        break;
                    case 44://PLC传递机型过后  才允许保存过站信息，否则不允许保存
                        //if (tagValue == "1")
                        //{
                        //    IsEngTypeGetOver_Write(opName, true);
                            
                        //    EngineData Enginedata = new EngineData(DtWebApi.ReadWritePLC.ReadPLC("10", opName).ToString(), Convert.ToInt32(DtWebApi.ReadWritePLC.ReadPLC("80", opName)));
                        //    //EngineData Enginedata = new EngineData(MesDataFunction.OpcOperation.ReadPLC(10, opName).ToString(), Convert.ToInt32(MesDataFunction.OpcOperation.ReadPLC(80, opName)));
                        //    //保存产品编号、托盘号 保存过站信息用
                        //    EngineData_Hash_Write(opName, Enginedata);
                        //}
                        break;
                    case 2://工件到位
                        WorkStart( rv);


                        //WorkStart(opName, tagValue);
                        break;
                    case 51:
                        if (hashtableOpName_IsHaveComputer[opName].ToString() == "1")
                        {
                            SaveProductLeaveData(opName, 1);
                        }

                        break;
                    case 8:
                        if (hashtableOpName_IsHaveComputer[opName].ToString() == "1")
                        {
                            SaveProductLeaveData(opName, 2);
                        }
                        break;
                    case 103:

                        Alarm_Insert(rv);

                        break;
                }
            
            }
            catch (Exception err)
            {
                ////ApplicationLog.WriteLog(err, err.Message);
            }
        }
        private static void Alarm_Insert(ReturnValueString rv)
        {
            string TagID;
            string opName;
            string tagTypeID;
            int TagValue;

            DateTime alarmStartTime;
            DateTime alarmEndTime;
            int TimeDiff;
            string TagOrderBy;
            string Text1;
            string Text2;
            TagID = rv.TagID;
            tagTypeID = rv.TagTypeID;
            opName = rv.OpName;
            TagValue = Convert.ToInt32( rv.TagValue);

            alarmStartTime = Convert.ToDateTime( rv.TimeStampBefore);
            alarmEndTime = Convert.ToDateTime( rv.TimeStamp);
            TimeDiff = Convert.ToInt32(rv.TagKeepTime);
            TagOrderBy = rv.TagOrderBy;
            Text1 = rv.ItemName;
            Text2 = rv.ShaftID;
            
            BaseDataSystemMES.Alarm_Insert(TagID, tagTypeID, opName, TagValue,
             alarmStartTime, alarmEndTime, TimeDiff, Text1, Text2, TagOrderBy);
        }
        private static void WorkStart(ReturnValueString rv)
        {

           

            var ro = rv.ReturnValueToObject();

            string opName = ro.OpName;
            DateTime arrivedTime = ro.TimeStampBefore;
            DateTime leavedTime = ro.TimeStamp;
            int TimeDiff = ro.TagKeepTime;
            int targetTime = 0;
            string isPass = "";

            int QualityMark=0;
            string tagValue="0";
            switch (ro.TagValue.ToString().ToLower())
            {
                case "1":
                case "true":
                    tagValue = "1";
                    break;
                default:
                    tagValue = "0";
                    break;
            }
            //if (ro.TagValue.ToString() == "0")
            //{
            //    //Write_TagTypeID(5, opName, false);//MES传递机型
            //    //Write_TagTypeID(66, opName, false);//允许工作
            //    //Write_TagTypeID(51, opName, false);//合格放行
            //    //Write_TagTypeID(8, opName, false);//不合格放行
            //    //Write_TagTypeID(7, opName, false);//工作完成
            //    //Write_TagTypeID(20, opName, false);//保存完成

            //    //string isHaveComputer = hashtableOpName_IsHaveComputer[opName].ToString();
            //    //if (Convert.ToInt32(isHaveComputer) == 0)//自动工位 读合格标志
            //    //{
            //    //    if (IsEngTypeGetOver_Read(opName))
            //    //    {
            //    //        //PLC未传递机型 不保存过站信息  
            //    //        SaveProductLeaveData_AutoWorkStation(opName, Convert.ToInt32(DtWebApi.ReadWritePLC.ReadPLC("21", opName)));
            //    //        //SaveProductLeaveData_AutoWorkStation(opName, Convert.ToInt32(MesDataFunction.OpcOperation.ReadPLC(21, opName)));
            //    //    }

            //    //}

            //    ////清空信号
            //    ////m_WorkStart_OpName[opName] = 0;//清空工件到位标志
            //    ////通知WEB更新产量
            //    //SendActuallyCount(opName, 0);
            //}

            QualityMark =  Convert.ToInt32(ReadPLC(21, opName));

            if (QualityMark == 1)
            {
                isPass = "1";
            }
            else
            {
                isPass = "0";
            }
            int EngineTypeID;//机型代码
            int PartPallet_Code;//托盘编号
            string EngineType;//机型
            string EngineID;//工件编号
            string OrderForm;
            MIS_BASE.GetEngineTypeFromPLC(opName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code,out OrderForm);

            //EngineData Enginedata = (EngineData)EngineData_Hash_Read(opName);
            BaseDataSystemMES.WorkStartInsert_AutoWorkStation(opName, EngineID, PartPallet_Code, arrivedTime, leavedTime, TimeDiff, targetTime, null, isPass, 0);

        }



    }
}
