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

namespace MesServerFunctions
{
    partial class FunctionMES
    {
        /// <summary>
        /// OP431 保存：按 PLC 允许保存时间生成静置质量数据，正常过站后带质量数据出站。
        /// </summary>
        private void MesRead(object e)
        {
            try
            {
                var msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e;
                string opName = Convert.ToString(msgEvent.OpName);
                int tagValue = Convert.ToInt32(msgEvent.TagValue);

                if (tagValue != 1)
                {
                    MisDataBaseFun.WriteMesReadOver(opName, false);
                    MIS_BASE.Write_OpNameIsOk(opName, -99);
                    MisDataFun.LogRecording_OP(opName, "INFO", "MIS", "PLC允许保存数据取消！");
                    return;
                }

                MisDataFun.LogRecording_OP(opName, "INFO", "MIS", "PLC允许保存OP431静置数据！");

                // 读取 PLC 当前产品信息，后续质量数据和出站都以该产品码为准。
                MIS_BASE.GetEngineTypeFromPLC(opName, out int engineTypeID, out string engineType, out string engineID, out int palletCode, out string orderForm);
                if (string.IsNullOrWhiteSpace(engineID))
                {
                    WriteManualStaticMesReadError(opName, "PLC产品码为空，无法保存静置数据");
                    return;
                }

                // 保存阶段从 PLC 读取到的已经是最终 PACK 码，只补查订单和机型信息。
                MisDataFun.Moby_Select_PDC(engineID, out orderForm, out engineType, out engineTypeID);
                if (engineTypeID <= 0)
                {
                    WriteManualStaticMesReadError(opName, "未查询到产品执行信息：" + engineID);
                    return;
                }

                // PLC 合格标识只保留合格/不合格两种结果。
                MIS_BASE.Read_QualityMask(opName, out int qualityMask);
                qualityMask = NormalizeManualStaticQualityMask(qualityMask);

                // 组装 OP431 静置质量数据：开始时间、完成时间、时间差、库位号。
                if (!TryBuildManualStaticOutData(engineID, qualityMask, out ManualStaticOutData staticOutData, out string message))
                {
                    WriteManualStaticMesReadError(opName, message);
                    return;
                }

                // 保存信号到达时，回写线下静置结束时间和静置时长。
                if (!FinishManualStaticRecord(engineID, staticOutData.FinishTime, staticOutData.Minutes, out message))
                {
                    WriteManualStaticMesReadError(opName, message);
                    return;
                }

                // 将四项静置质量数据写入测量数据合格索引和明细表。
                if (!WriteManualStaticOutQualityData(opName, engineID, staticOutData, out message))
                {
                    WriteManualStaticMesReadError(opName, message);
                    return;
                }

                // 写正常过站记录后查询 MOM 上传质量数据组。
                MisDataFun.WorkStartInsert(opName, qualityMask);
                MisDataFun.GetPartQualityGroupParams(opName, engineID, out DataTable dtQuality);
                if (dtQuality == null || dtQuality.Rows.Count == 0)
                {
                    WriteManualStaticMesReadError(opName, "未查询到OP431静置质量数据组，禁止静默出站：" + engineID);
                    return;
                }

                // 带质量数据调用工厂 MES 出站，返回 13921 时按不合格完成。
                CallWebService.Call_dataCollectForSfcEx(opName, engineID, dtQuality, qualityMask, out string code, out string momMessage);
                if (code == "0")
                {
                    MIS_BASE.Write_OpNameIsOk(opName, qualityMask);
                }
                else if (code == "13921")
                {
                    qualityMask = 2;
                    MIS_BASE.Write_OpNameIsOk(opName, qualityMask);
                    MisDataFun.LogRecording_OP(opName, "INFO", "MOM", engineID + " 工厂MES质量判定不合格，按不合格完成OP431过站");
                }
                else
                {
                    WriteManualStaticMesReadError(opName, "出站失败：" + engineID + "，错误代码：" + code + "，消息：" + momMessage);
                    return;
                }

                MisDataBaseFun.WriteMesReadOver(opName, true);

                MisDataFun.LogRecording_OP(opName, "INFO", "MIS", "MES保存OP431静置数据完成！");
                MisDataFun.LogRecording_OP(opName, "INFO", "MIS", "MES工作完成！");
            }
            catch (Exception err)
            {
                MyLog4Net.MyLogHelper.Error("Function1062.MesRead", err.Message);
                MisDataFun.LogRecording_OP(ManualStaticOutOpName, "ERROR", "MesRead", err.Message);
            }
        }

        /// <summary>
        /// OP431 保存失败时统一复位保存完成、置 MES 报警并通知页面。
        /// </summary>
        private void WriteManualStaticMesReadError(string opName, string message)
        {
            MisDataBaseFun.WriteMesReadOver(opName, false);
            MIS_BASE.Write_TagValueByTagTypeID(34, opName, true);
            SendMessage.AsyncSendMessage_Notice(opName, "【" + opName + "】" + message);
            MisDataFun.LogRecording_OP(opName, "ERROR", "MesRead", message);
        }
    }
}
