using System;
using System.Data;
using System.Linq;
using MesDataFunction;
using MesServerWork;
using MisDataFunDll;
using MisDataSaveDate;

namespace MesServerFunctions
{
    partial class FunctionMES
    {
        /// <summary>
        /// 保存完成(针对半自动和手动压装工位)
        /// </summary>
        /// <param name="OpName"></param>
        /// <param name="tagValue"></param>
        private void MesRead(object e)
        {
            try
            {
                var msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e;
                string OpName = Convert.ToString(msgEvent.OpName);
                int tagValue = Convert.ToInt32(msgEvent.TagValue);

                int EngineTypeID;
                string EngineType;
                string EngineID;
                int PartPallet_Code;
                string OrderForm;

                if (tagValue == 1)
                {
                    MisDataFun.LogRecording_OP(OpName, "INFO", "MIS", "PLC允许保存数据！");
                    MIS_BASE.Read_QualityMask(OpName, out int qualityMask);

                    #region 工位特殊操作部分
                    //// 判断是否需要手动选择OK/NG   不需要了 按照PLC给的合格标志做
                    //if (MisDataFun.GetSpecialOpExist(OpName, "手动OKNG放行"))
                    //{
                    //    MIS_BASE.Read_ConfirmOkGo(OpName, out bool okGo);
                    //    MIS_BASE.Read_FalseGo(OpName, out bool falseGo);
                    //    if (!okGo && !falseGo)
                    //    {
                    //        string errMsg = $"【{OpName}】请在界面选择 OK/NG 放行";
                    //        MisDataFun.LogRecording_OP(OpName, "INFO", "MIS", errMsg);
                    //        SendMessageFun.AsyncSendMessage_Notice(OpName, errMsg);
                    //        return;
                    //    }
                    //    if (okGo) qualityMask = 1;
                    //    if (falseGo) qualityMask = 2;
                    //}
                    #endregion

                    MIS_BASE.GetEngineTypeFromPLC(OpName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code, out OrderForm);

                    string code;
                    string message;
                    if (MisDataFun.GetSpecialOpExist(OpName, "自动入箱工位"))
                    {
                        // 把模组码和箱体码绑定到执行计划列表中 DBB640-679
                        string TrunEngineID = MIS_BASE.Read_TagValueByTagTypeID(203, OpName);
                        // 调用接口进行物料装配验证
                        CallWebService.Call_miAssmebleAndCollectDataForSfc(OpName, EngineID, TrunEngineID,"", out code, out message);
                        if (code != "0")
                        {
                            MisDataFun.LogRecording_OP(OpName, "ERROR", "MIS", "PACK装配模组失败！message: " + message);
                            return;
                        }
                        // 把PLC给得 模组码存入Pack中 同时给 模组记录Pack信息
                        MisDataFun.WorkPlan_TurnLine(EngineID, TrunEngineID, 1);
                    }

                    // PDC产线plc只写了发动机号和机型代码，其余要从数据库中读取
                    MisDataFun.Moby_Select_PDC(EngineID, out OrderForm, out EngineType, out EngineTypeID);

                    // 保存质量数据
                    MisDataSaveDateMesRead.Funtion.MesRead(OpName, tagValue.ToString(), msgEvent.TagID.ToString());
                   
                    //MisDataFun.MOM_SaveQDataToUpload(OpName, EngineID); // 数据存至临时表
                    MisDataFun.WorkStartInsert(OpName, qualityMask); // 保存不合格过站信息

                    // 判断是否存在首件标志
                    if (MIS_BASE.Read_TagValueByTagTypeID(62, OpName) == "1") MisDataFun.Save_FristWorkData(OpName, EngineID); // 第一个产品 存首件数据

                    // 保存物料数据
                    MisDataFun.Material_Insert(OpName, qualityMask);
                    // 从数据库查出质量数据组  MOM_质量数据_上传_查询
                    MisDataFun.GetPartQualityGroupParams(OpName, EngineID, out DataTable dt_quality);
                    // 调用工厂MES出站接口
                    if (dt_quality.Rows.Count > 0)
                    {
                        CallWebService.Call_dataCollectForSfcEx(OpName, EngineID, dt_quality, qualityMask, out code, out message);
                    }
                    else
                    {
                        CallWebService.Call_sfcComplete(OpName, EngineID, qualityMask, out code, out message);
                    }
                    if (code == "0")
                    {
                        MIS_BASE.Write_OpNameIsOk(OpName, qualityMask); // 写入加工合格还是不合格 根据工位合格标志写
                      
                    }
                    else if (code == "13921") // 质量判定不合格 走不合格放行
                    {
                        qualityMask = 2;
                        MIS_BASE.Write_OpNameIsOk(OpName, qualityMask);
                        MisDataFun.WorkStartInsert(OpName, qualityMask); // 保存不合格过站信息
                    }
                    else
                    {
                        string msg = "出站失败：" + EngineID + "，code：" + code + "，message：" + message;
                        MisDataFun.LogRecording_OP(OpName, "ERROR", "MOM", msg);
                        return;
                    }
                    // 保存过站信息
                    MisDataFun.WorkStartInsert(OpName, qualityMask);

                    // 如果不合格 同时 是人工PC工位 则 需要屏幕上点放行后才能放行
                    if (qualityMask != 1 && MisDataFun.GetSpecialOpExist(OpName, "人工PC工位"))
                    {
                        SendInfomation("showOpWorkFalseGoBox", "1", OpName); // 显示不合格刷卡放行弹窗
                        MisDataFun.LogRecording_OP(OpName, "INFO", "MIS", $"{EngineID} 产品不合格 待人工确认后不合格放行！");
                        return;
                    }

                    MisDataBaseFun.WriteMesReadOver(OpName, true); // 保存完成工作完成
                }
                else
                {
                    MisDataBaseFun.WriteMesReadOver(OpName, false); // 保存完成工作完成
                    // 写入加工合格还是不合格 根据工位合格标志写
                    MIS_BASE.Write_OpNameIsOk(OpName, -99);
                    MisDataFun.LogRecording_OP(OpName, "INFO", "MIS", "PLC允许保存数据取消！");
                }
            }
            catch (Exception err)
            {
                ////ApplicationLog.WriteLog(err, "Function08:MesReadOver");
            }

        }
    }
}
