using DataLinkMesWork;
using DC_A95;
using SYNC_SAP_MES;
using System;
using System.Linq;

/// <summary>
/// 
/// </summary>
namespace MesWork
{
    /// <summary>
    /// 处理MIS逻辑
    /// </summary>
    public partial class MesWorkForm
    {
        /// <summary>
        /// 处理MIS逻辑
        /// </summary>
        /// <param name="e"></param>
        private void MIS_Funtion(object e)
        {
            try
            {
                if (NotHandlerSignal == "1")
                {
                    return;
                }

                var msgEvent = (OpcData.CustomeEvetnArgs)e;
                if (msgEvent.TagValue == null) return;

                var tagID = msgEvent.TagID.ToString();
                var opCode = msgEvent.OpName.ToString();//工位号
                var tagTypeCodeID = (int)msgEvent.TagTypeCodeID;
                var tagTypeID = (EnumTagTypeID)msgEvent.TagTypeID;
                var isFirstValue = msgEvent.IsFirstValue.ToString().ToLower();
                string tagValue;
                switch (tagTypeID)
                {
                    case EnumTagTypeID.BOOL:
                        tagValue = (Convert.ToInt32(msgEvent.TagValue)).ToString();
                        break;
                    default:
                        tagValue = msgEvent.TagValue.ToString();
                        break;
                }

                if (ValueT(isFirstValue))
                {
                    //不处理第一次变化的值
                    return;
                }

                /*
                15	系统健康
                5	传递机型（AMS）
                66	允许PLC工作（AMS）
                34	发动机上线报警标志
                20	AMS保存完数据（AMS）
                112	发动机上线报警代码
                73	机型标志（AMS）
                74	变速箱总成编号（AMS）
                75	产品型号（AMS）
                116	缸体打印码
                117	订单号

                14	系统健康(PLC)
                2	工件到位(PLC)
                43	申请零件编号(PLC)
                44	传递机型(PLC)
                63	禁用MES(PLC)
                9	机型标志（PLC）
                10	变速箱总成编号（PLC）
                11	产品型号（PLC）
                80	托盘编号（PLC）
                22	0空托盘，1合格件，2不合格件(PLC)
                19	质量数据可以读数据（PLC）
                21	质量数据工位合格标志(PLC)
                23	0正常件，1返修件(PLC)
                39	缸体打印码(PLC)
                40	订单号(PLC)
                120	上线缸体码(PLC)
                */

                switch (tagTypeCodeID)
                {
                    case 2://工件到位
                        if (tagValue == "1")
                        {
                            WritePLC_IF(73, opCode, 0);//机型ID
                            WritePLC_IF(74, opCode, "");//发动机流水号（总成编号）
                            WritePLC_IF(75, opCode, "");//产品型号，机型号
                            WritePLC_IF(116, opCode, "");//缸体码
                            WritePLC_IF(117, opCode, "");//订单号
                            WritePLC_IF(118, opCode, 0); // 打印位置
                            MesWorkForm.WritePLC_IF(112, opCode, 0); // 清空报警点位
                            MesWorkForm.WritePLC_IF(34, opCode, false);
                        }
                        else
                        {
                            MesWorkForm.WritePLC_IF(112, opCode, 0); // 清空报警点位
                            MesWorkForm.WritePLC_IF(34, opCode, false);
                            WritePLC_IF(20, opCode, false); // 保存完成
                        }
                        break;
                    case 14://心跳
                        WritePLC_IF(15, opCode, tagValue);
                        break;
                    case 19://允许保存
                        if (tagValue == "1")
                        {
                            var sortNo_PLC = ReadPLC(9, opCode).ToString();
                            var engineNo_PLC = ReadPLC(10, opCode).ToString();
                            var sortName_PLC = ReadPLC(11, opCode).ToString();
                            var partCode_PLC = ReadPLC(39, opCode).ToString();
                            var orderNo_PLC = ReadPLC(40, opCode).ToString();

                            var palletNo_PLC = Convert.ToInt32(ReadPLC(80, opCode).ToString());

                            MesWork_QC.ProcessData_PartOff(opCode, engineNo_PLC, palletNo_PLC, sortNo_PLC);
                            MesWork_QC.MesRead(opCode, tagValue, tagID);


                            WritePLC_IF(20, opCode, true);
                        }
                        else
                        {
                            WritePLC_IF(5, opCode, false);
                            WritePLC_IF(66, opCode, false);
                            WritePLC_IF(20, opCode, false);
                        }
                        break;
                    case 43://申请上线
                        if (tagValue == "1")
                        {
                            //1、是否有下发的订单
                            //2、是否申请上线
                            //3、是否满足上线条件
                            //4、缸体码是否符合生产机型

                            if (!OPCodes_LineSet.Split(',').Contains(opCode))//非线首
                            {
                                return;
                            }
                            //SyncFunc_From_SAP.SyncDataOperationTask("手动同步");
                            PLC_R.Read_LineSet(opCode, out string partCode, out int palletNo);
                            ExecuteDB.Select_OnLine_Plan_Engine(opCode, partCode, palletNo
                                , out string engineNo, out int sortNo, out string sortName, out string printCode, out string orderNo
                                , out int errCode, out string errMessage, out int printPosition);

                            //*******************在此处验证***************************
                            //按规则拆解partCode（缸体二维码），再获取BOM，验证该工位物料中是否存在该型号的缸体
                            //var res_SortType_FromBOM = CALL_Interfalce_WebAPI.Get_BOMs_ByWebAPI(MesWorkForm.LineID_Product, engineNo);

                            //**********************************************

                            //上线报警代码：errCode
                            //0 - 无错误
                            //1 - PLC逻辑错误，未申请上线
                            //2 - 没有可用订单
                            //3 - 扫描缸体码为空或格式错误
                            //4 - 缸体机型与生产机型不匹配
                            //5 - AMS写入信息与RFID信息验证不一致
                            //255 - 未知错误
                            if (errCode != 0)//获取计划失败
                            {
                                PLC_W.Write_LineSetAlarm(opCode, errCode);
                                LogRecord.LogRecord.Insert_Log(Type_Log.OnLine, opCode, $"发动机上线申请错误：（{errCode}）{errMessage}");
                            }
                            else
                            {
                                // 复位报警变量
                                //112 发动机上线报警代码
                                //34  发动机上线报警标志
                                MesWorkForm.WritePLC_IF(112, opCode, 0);
                                MesWorkForm.WritePLC_IF(34, opCode, false);

                                WritePLC_IF(73, opCode, sortNo);//机型ID
                                WritePLC_IF(74, opCode, engineNo);//发动机流水号（总成编号）
                                WritePLC_IF(75, opCode, sortName);//产品型号，机型号
                                WritePLC_IF(116, opCode, printCode);//缸体码
                                WritePLC_IF(117, opCode, orderNo);//订单号
                                WritePLC_IF(118, opCode, printPosition); // 打印位置
                                WritePLC_IF(5, opCode, true);

                                //【PLC读取数据到RFID中，测试用】
                                //WritePLC_IF(9, opCode, sortNo);//机型ID
                                //WritePLC_IF(10, opCode, engineNo);//发动机流水号（总成编号）
                                //WritePLC_IF(11, opCode, sortName);//产品型号，机型号
                                //WritePLC_IF(39, opCode, partCode);//缸体码
                                //WritePLC_IF(40, opCode, orderNo);//订单号

                                LogRecord.LogRecord.Insert_Log(Type_Log.OnLine, opCode, $"上线数据写入成功：engineNo={engineNo}；sortNo={sortNo}；sortName={sortName}；printCode={printCode}；orderNo={orderNo}");
                            }
                        }
                        else
                        {
                            WritePLC_IF(5, opCode, false);
                        }
                        break;
                    case 44://传递机型
                        if (tagValue == "1")
                        {
                            var sortNo_PLC = ReadPLC(9, opCode).ToString();
                            var engineNo_PLC = ReadPLC(10, opCode).ToString();
                            var sortName_PLC = ReadPLC(11, opCode).ToString();
                            var partCode_PLC = ReadPLC(39, opCode).ToString();
                            var orderNo_PLC = ReadPLC(40, opCode).ToString();

                            var palletNo_PLC = Convert.ToInt32(ReadPLC(80, opCode).ToString());

                            if (OPCodes_LineSet.Split(',').Contains(opCode))//线首
                            {
                                var sortNo = ReadPLC(73, opCode).ToString();
                                var engineNo = ReadPLC(74, opCode).ToString();
                                var sortName = ReadPLC(75, opCode).ToString();
                                var partCode = ReadPLC(116, opCode).ToString();
                                var orderNo = ReadPLC(117, opCode).ToString();

                                var str = $"{sortNo}|{engineNo}|{sortName}|{partCode}|{orderNo}";
                                var str_PLC = $"{sortNo_PLC}|{engineNo_PLC}|{sortName_PLC}|{partCode_PLC}|{orderNo_PLC}";

                                if (str != str_PLC)
                                {
                                    var errCode = (int)Type_AlarmOnline.Err_RW_Diff;
                                    PLC_W.Write_LineSetAlarm(opCode, errCode);
                                    LogRecord.LogRecord.Insert_Log(Type_Log.Alarm, opCode, $"发动机上线信息读写校验不一致：（{errCode}）W：{str}，R：{str_PLC}");
                                    return;
                                }
                                //上线验证完成，消耗计划
                                ExecuteDB.Update_ExcutePlan_LineSetOK(opCode, engineNo);
                                WritePLC_IF(66, opCode, true);
                                LogRecord.LogRecord.Insert_Log(Type_Log.OnLine, opCode, $"【{tagTypeCodeID}】上线下载数据验证成功，流水号消耗成功！opCode={opCode}；engineNo={engineNo}");

                            }
                            //保存进站数据
                            MesWork_QC.ProcessData_PartOn(opCode, engineNo_PLC, palletNo_PLC, sortNo_PLC);
                            WritePLC_IF(66, opCode, true);
                        }
                        else
                        {
                            WritePLC_IF(66, opCode, false);
                        }
                        break;
                    default:
                        break;
                }

            }
            catch (Exception err)
            {
                LogRecord.LogRecord.Insert_Log(Type_Log.Alarm, "", $"MIS_Funtion报错！，，{err.Message}+{err.StackTrace}");
            }

        }

        /// <summary>
        /// 数据库记录信号变化
        /// </summary>
        /// <param name="msg"></param>
        private void TagTypeCodeID_TagDataOnChange(object msgEvent)
        {
            try
            {
                OpcData.CustomeEvetnArgs e = (OpcData.CustomeEvetnArgs)msgEvent;

                string tagValue;
                if (e.TagValue == null) return;

                switch (e.TagValue.ToString().ToLower())
                {
                    case "1":
                    case "true":
                        tagValue = "1";
                        break;
                    default:
                        tagValue = "0";
                        break;
                }

                string TagTypeCodeID;
                string opName;
                string TagID;
                string TagValue;
                DateTime arrivedTime;
                DateTime leavedTime;
                int TimeDiff;
                opName = e.OpName.ToString();
                TagValue = tagValue;
                TagTypeCodeID = e.TagTypeCodeID.ToString();
                TagID = e.TagID.ToString();
                leavedTime = Convert.ToDateTime(e.TimeStamp);
                arrivedTime = Convert.ToDateTime(e.TimeStampBefore);
                TimeDiff = Convert.ToInt32(e.TagKeepTime);

                if (TagTypeCodeID != "14" && TagTypeCodeID != "15")
                {
                    string procedureName;
                    procedureName = "测量数据设备状态日志_增加数据";
                    System.Data.SqlClient.SqlParameter[] thisParms = new System.Data.SqlClient.SqlParameter[7];
                    thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName);
                    thisParms[1] = new System.Data.SqlClient.SqlParameter("@信号类型代码", TagTypeCodeID);
                    thisParms[2] = new System.Data.SqlClient.SqlParameter("@TagID", TagID);
                    thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagValue", TagValue);
                    thisParms[4] = new System.Data.SqlClient.SqlParameter("@到达时间", arrivedTime);
                    thisParms[5] = new System.Data.SqlClient.SqlParameter("@离开时间", leavedTime);
                    thisParms[6] = new System.Data.SqlClient.SqlParameter("@在线时间", TimeDiff);
                    DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms);
                }
            }
            catch (Exception err)
            {
            }

        }


    }
}
