using MesServerWork;
using MesDataFunction;
using MisDataFunDll;
using MisDataSaveDate;
using System;
using System.Data;
namespace MesServerFunctions
{
partial class FunctionMES
{
///
/// OP431 保存:按 PLC 允许保存时间生成静置质量数据,正常过站后带质量数据出站。
///
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;
}
// 重新查询 MES 执行信息,避免直接使用 PLC 中不完整的订单/机型数据。
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);
}
}
///
/// OP431 保存失败时统一复位保存完成、置 MES 报警并通知页面。
///
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);
}
}
}