using BasicData;
using DataLinkMesWork;
using MesDataFunction;
using MesServerFunctions;
using MesServerWork;
using MisDataFunDll;
using Newtonsoft.Json;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using SystemFramework;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.TaskBand;
namespace MisDataSaveDateMesRead
{
public partial class Funtion
{
///
/// 允许保存(针对半自动和手动压装工位)
///
///
///
public static int MesRead(string opName, string tagValue, string tagid, bool isCheck = false)
{
return SaveQualityData(opName, Convert.ToInt32(tagValue), tagid, isCheck);
}
public static void MesRead_Cell(string[] engineIDList, string opName, string tagValue, string tagid, int qualityMask)
{
int id_tagCF;
int engineTypeID = 0;
string engineType = "";
string partPallet = "";
DataTable dt_WWW;
Hashtable valueList;
try
{
//读取工位全部数据
var tagValues = MIS_BASE.ReadPLC_OpName(opName);
//过滤出来质量数据 //获得带合格标志的质量数据
valueList = ReadPLC_OpName_Qd(tagValues);//已修改
//获得带基本信息的质量数据表
GetQualityDataTable(valueList, out dt_WWW);
// 以下是排序
DataView dv = new DataView(dt_WWW);
dv.Sort = "TagID DESC";
// 转换回 DataTable
DataTable dt_WWW_Sort = dv.ToTable();
for (int i = 0; i < engineIDList.Length; i++)
{
string engineID = engineIDList[i];
var dt_WWW_Sort_Filter = dt_WWW_Sort.Select($"测量位置 like '*${(i + 1)}*' or 测量位置 like '*$ALL*'").CopyToDataTable();
//保存质量数
MisDataFun.BaseData_tagTable_QualityData_B5A_IndexInsert_cell(engineID, tagid, engineType, engineTypeID, opName, qualityMask, partPallet, out id_tagCF);
MisDataFun.BaseData_tagTable_QualityData_B5A_Insert_cell(id_tagCF, engineTypeID, engineID, opName, dt_WWW_Sort_Filter, false);
if (MisDataFun.GetSpecialOpExist(opName, "存质量电芯条码工位")) MisDataFun.BaseData_tagTable_QualityData_B5A_Insert_OP170Status(id_tagCF, engineTypeID, engineID, $"72200001", engineID.ToString(), qualityMask, opName);
}
}
catch (Exception err)
{
}
}
public static string GetRealTimeQualityData(string opName)
{
string message = "";
DataTable dt1 = new DataTable();
DataTable dt_WWW;
DataTable dt_WWW_Copy1;
DataTable dt_WWW_Copy2;
Hashtable valueList;
try
{
//读取工位全部数据
var tagValues = MIS_BASE.ReadPLC_OpName(opName);
//过滤出来质量数据,获得带合格标志的质量数据
valueList = ReadPLC_OpName_Qd(tagValues);
//获得带基本信息的质量数据表
GetQualityDataTable(valueList, out dt_WWW);
dt_WWW_Copy1 = dt_WWW.Copy().Select("变量排序 = 1").CopyToDataTable();
DataView dv1 = dt_WWW_Copy1.DefaultView;
dv1.Sort = "列位置 DESC";
dt_WWW_Copy1 = dv1.ToTable();
dt_WWW_Copy2 = dt_WWW.Copy().Select("变量排序 = 2").CopyToDataTable();
DataView dv2 = dt_WWW_Copy2.DefaultView;
dv2.Sort = "列位置 DESC";
dt_WWW_Copy2 = dv2.ToTable();
dt1.Columns.Add("列位置", System.Type.GetType("System.String"));
dt1.Columns.Add("测量项目1", System.Type.GetType("System.String"));
dt1.Columns.Add("测量项目2", System.Type.GetType("System.String"));
dt1.Columns.Add("合格标志", System.Type.GetType("System.String"));
dt1.Columns.Add("名称", System.Type.GetType("System.String"));
for (int i = 0; i < dt_WWW_Copy1.Rows.Count; i++)
{
if (Convert.ToInt32(dt_WWW_Copy1.Rows[i]["TagValue"]) > 45 )
{
var dr = dt1.NewRow();
dr["列位置"] = dt_WWW_Copy1.Rows[i]["列位置"].ToString();
dr["测量项目1"] = dt_WWW_Copy1.Rows[i]["TagValue"].ToString();
dr["合格标志"] = "1";
dr["名称"] = dt_WWW_Copy1.Rows[i]["测量项目"].ToString();
dt1.Rows.Add(dr);
}
}
for (int i = 0; i < dt_WWW_Copy2.Rows.Count; i++)
{
if (Convert.ToInt32(dt_WWW_Copy2.Rows[i]["TagValue"]) > 45)
{
var dr = dt1.NewRow();
dr["列位置"] = dt_WWW_Copy2.Rows[i]["列位置"].ToString();
dr["测量项目1"] = dt_WWW_Copy2.Rows[i]["TagValue"].ToString();
dr["合格标志"] = "1";
dr["名称"] = dt_WWW_Copy2.Rows[i]["测量项目"].ToString();
dt1.Rows.Add(dr);
}
}
}
catch (Exception err)
{
}
message = JsonConvert.SerializeObject(dt1);
return message;
}
///
/// 返回合格标志
///
///
///
///
///
private static int SaveQualityData(string opName, int tagValue, string tagID, bool isCheck = false)
{
int id_tagCF;
int qualityMask = 0;
int engineTypeID = 0;
string engineID = "";
string engineType = "";
string partPallet = "";
string orderFormPlc = "";
DataTable dt_WWW;
Hashtable valueList;
try
{
//读取工位全部数据
var tagValues = MIS_BASE.ReadPLC_OpName(opName);
valueList = ReadPLC_OpName_Qd(tagValues);//已修改
//获得带基本信息的质量数据表
GetQualityDataTable(valueList, out dt_WWW);
engineTypeID = Convert.ToInt32(GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.EngineTypeID)));
engineID = GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.EngineID)).ToString();
//engineType = GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.EngineType)).ToString();
//orderFormPlc = GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.OrderFormPLC)).ToString();
// PDC产线plc只写了发动机号和机型代码,其余要从数据库中读取
MisDataFun.Moby_Select_PDC(engineID, out orderFormPlc, out engineType, out engineTypeID);
// 判断是否存在首件标志
if (MIS_BASE.Read_TagValueByTagTypeID(62, opName) == "1" && opName == "OP170")
{
if (dt_WWW != null && dt_WWW.Rows.Count > 0)
{
DataRow[] filteredRows;
if (engineID == "FirstpartVisionData") filteredRows = dt_WWW.Select("测量项目 LIKE '*_首件'"); // 只取视觉首件数据
else filteredRows = dt_WWW.Select("测量项目 NOT LIKE '*_首件'"); // 除了视觉首件外的其他数据
if (filteredRows.Length > 0)
{
dt_WWW = filteredRows.CopyToDataTable();
}
}
}
qualityMask = Convert.ToInt32(GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.QualityMask)));
if(qualityMask != 1) MisDataFun.LogRecording_OP(opName, "ERROR", "MIS", $"{engineID}工位总合格标志不合格 产品不合格放行!");
//保存质量数
MisDataFun.BaseData_tagTable_QualityData_B5A_IndexInsert(engineID, tagID, engineType, engineTypeID, opName, qualityMask, partPallet, out id_tagCF);
if(id_tagCF > 0)
{
//MisDataFun.BaseData_tagTable_QualityData_B5A_Insert(id_tagCF, engineTypeID, engineID, opName, dt_WWW, isCheck);
MisDataFun.BaseData_tagTable_QualityData_B5A_Insert_table(id_tagCF, engineTypeID, engineID, opName, dt_WWW, isCheck);
if (MisDataFun.GetSpecialOpExist(opName, "焊接工位")) // 焊接工位需要存5个状态点
{
var keyValues = tagValues.Where(x => Convert.ToInt32(x.Value.TagTypeCodeID) == 106).OrderBy(x => x.Key).ToDictionary(k => k.Key, v => v.Value);
foreach (var item in keyValues)
MisDataFun.BaseData_tagTable_QualityData_B5A_Insert_OP170Status(id_tagCF, engineTypeID, engineID, item.Value.TagID.ToString(), item.Value.TagValue.ToString(), qualityMask, opName);
}
if (MisDataFun.GetSpecialOpExist(opName, "电芯堆叠工位")) // 电芯堆叠存四个电芯码
{
MisDataFun.SaveOP100_CellCode(opName, engineID);
}
// 判断是否需要手动选择OK/NG
if (MisDataFun.GetSpecialOpExist(opName, "手动OKNG放行"))
{
//MIS_BASE.Read_ConfirmOkGo(opName, out bool okGo);
//MIS_BASE.Read_FalseGo(opName, out bool falseGo);
string qualityStr = "0";
if (qualityMask == 1) qualityStr = "1";
MisDataFun.BaseData_tagTable_QualityData_B5A_Insert_OP170Status(id_tagCF, engineTypeID, engineID, "72210001", qualityStr, qualityMask, opName);
}
if(MisDataFun.GetSpecialOpExist(opName, "电芯清洗时间管控工位")) // 存电芯清洗管控时间差
{
bool isOk = MisDataFun.CheckCleanoutTime(opName, engineID, out int MaxUseTime);
if (!isOk) qualityMask = 2;
MisDataFun.BaseData_tagTable_QualityData_B5A_Insert_OP170Status(id_tagCF, engineTypeID, engineID, "72300031", MaxUseTime.ToString(), qualityMask, opName);
}
if(!((engineTypeID != 1 && engineTypeID != 1 ) && (opName == "OP120" || opName == "OP140" || opName == "OP160"))) // CC GQ UPS 固定架不涂胶 所以直接跳 PDC 和 W05 需要涂胶校验
{
if (MisDataFun.GetSpecialOpExist(opName, "涂胶时间差校验"))
{
int TJResult = MisDataFun.CheckTJTimeAndSave(opName, engineID, "", 1);
//if (TJResult != 1) qualityMask = 2;
}
if (MisDataFun.GetSpecialOpExist(opName, "涂胶时间差校验2"))
{
int TJResult = MisDataFun.CheckTJTimeAndSave(opName, engineID, "", 1, 2);
//if (TJResult != 1) qualityMask = 2;
}
}
}
}
catch (Exception err)
{
}
return qualityMask;
}
static public void GetQualityDataTable(Hashtable valuList,out DataTable dt)
{
//78 0:屏蔽MES;1:启用MES(必须MIS)
//79 通过线体工位PC实现下达工位工作状态:工位有三种状态:在线、离线、屏蔽。在线;0正常状态,实现正常功能。1离线:2屏蔽。(必须MIS)
//41 机体流向标志(1 BYTE):0普通工位:1:上线(发动机上线);2:下线(发动机下线);(必须PLC)
//51 返修工位,修改后的数据MES将数据写入PLC ,MES通知PLC数据修改完成。(YN)
//8 只要返修,必须由mes发送此信号,plc接收此信号后才能放行
//(暂时没用)用于有扳手拧紧工位。通知设备螺钉拧紧完成。PC已经将数据保存到数据库中。(B5A)
// 创建 DataView 并排序
//结果表
dt = BuildDataTables_WWW();
//测量位置
string shaftID = "";
//测量项目
string item = "";
//测量单位
string unit = "";
//上限值
string tagValueUp = "";
//下限值
string tagValueDown = "";
//理论值
string tagValeNormal = "";
foreach (DictionaryEntry valueItem in valuList)
{
try
{
var qualityData = (DeviceDriver_BasicData.CustomeEvetnArgs)valueItem.Value;
try
{
shaftID = qualityData.ShaftID.ToString();
}
catch{}
try
{
item = qualityData.ItemName.ToString();
}
catch{}
try
{
unit = qualityData.Unit.ToString();
}
catch{}
try
{
tagValueUp = qualityData.TagValueUp.ToString();
}
catch{}
try
{
tagValueDown = qualityData.TagValueDown.ToString();
}
catch{}
try
{
tagValeNormal = qualityData.TagValeNormal.ToString();
}
catch{}
var dr = dt.NewRow();
dr["TagID"] = qualityData.TagID;
dr["测量位置"] = shaftID;
dr["测量项目"] = item;
dr["测量单位"] = unit;
dr["上限值"] = tagValueUp;
dr["下限值"] = tagValueDown;
dr["理论值"] = tagValeNormal;
dr["工位号"] = qualityData.OpName;
dr["列位置"] = qualityData.TagItemOrderBy;
dr["变量排序"] = qualityData.TagOrderBy;
dr["IsGoodBad"] = qualityData.IsGoodBad;
switch (qualityData.TagTypeID)
{
//合格标志数组
case 8203:
dr["TagValue"] = GetQualityData_GoodBad_String((bool[])qualityData.TagValue);
break;
case 8209:
dr["TagValue"] = "";
break;
//非标准REAL
case 8210:
dr["TagValue"] = GetNoNormalReal(qualityData.TagValue);
dt.Rows.Add(dr);
break;
default:
dr["TagValue"] = Convert.ToString(qualityData.TagValue);
dt.Rows.Add(dr);
break;
}
}
catch (Exception err)
{
//ApplicationLog.WriteLog(err, err.Message);
}
}
}
///
/// 数据表
///
///
private static object GetValueByTagTypeCodeID(ConcurrentDictionary opTagList, int TagTypeCodeID)
{
try
{
return opTagList.Where(x => Convert.ToInt32(x.Value.TagTypeCodeID) == TagTypeCodeID).ToList()[0].Value.TagValue;
}
catch (Exception err) { return "-3"; }
}
///
/// 根据工位名称,读取工位对应的质量数据,带合格标志
///
///
///
public static Hashtable ReadPLC_OpName_Qd(ConcurrentDictionary tagValues)
{
var ht = new Hashtable();
try
{
var keyValues = tagValues.Where(x => Convert.ToInt32(x.Value.TagTypeCodeID) == 105).OrderBy(x => x.Key).ToDictionary(k => k.Key, v => v.Value);
var groupCount = 4;
for (int i = 0; i < keyValues.Count / groupCount; i++)
{
var IsOK = Convert.ToInt32(keyValues.ElementAt(i * groupCount + 0).Value.TagValue);
var TagValue = keyValues.ElementAt(i * groupCount + 1).Value.TagValue.ToString();
var TagValueUp = keyValues.ElementAt(i * groupCount + 2).Value.TagValue.ToString();
var TagValueDown = keyValues.ElementAt(i * groupCount + 3).Value.TagValue.ToString();
var TF = keyValues.ElementAt(i * groupCount + 1).Value;
var qualityDataType = GetQualityDataType(TF);
qualityDataType.IsGoodBad = IsOK;
qualityDataType.TagValeNormal = TagValue;
qualityDataType.TagValueUp = TagValueUp;
qualityDataType.TagValueDown = TagValueDown;
ht.Add(qualityDataType.TagID, qualityDataType);
}
}
catch (Exception errr)
{
ApplicationLog.WriteLog(errr, "ReadPLC_OpName_Qd1");
}
try
{
var keyValues_Str = tagValues.Where(x => Convert.ToInt32(x.Value.TagTypeCodeID) == 2005).OrderBy(x => x.Key).ToDictionary(k => k.Key, v => v.Value);
foreach (var kv in keyValues_Str)
{
var cea = kv.Value;
ht.Add(cea.TagID, cea);
//if (cea?.TagValue?.ToString()?.Length > 0)
//{
// ht.Add(cea.TagID, cea);
//}
}
}
catch (Exception err)
{
ApplicationLog.WriteLog(err, "ReadPLC_OpName_Qd2");
}
return ht;
}
public static Hashtable ReadPLC_OpName_Qd_OP170(ConcurrentDictionary tagValues)
{
var keyValues = tagValues.Where(x => Convert.ToInt32(x.Value.TagTypeCodeID) == 105).OrderBy(x => x.Key).ToDictionary(k => k.Key, v => v.Value);
var ht = new Hashtable();
for (int i = 0; i < keyValues.Count ; i++)
{
var TF = keyValues.ElementAt(i).Value;
ht.Add(TF.TagID, TF);
}
return ht;
}
public static Hashtable ReadPLC_OpName_Qd_2025_07_15_LLX_BAK(ConcurrentDictionary tagValues)
{
//lock (l)
{
var keyValues = tagValues.Where(x => Convert.ToInt32(x.Value.TagTypeCodeID) == 105).OrderBy(x => x.Key).ToDictionary(k => k.Key, v => v.Value);
int isOK = 0;
string TagValeNormal = "";
string TagValueDown = "";
string TagValueUp = "";
Hashtable ht = new Hashtable();
for (int i = 0; i < keyValues.Count / 8; i++)
{
isOK = Convert.ToInt32(keyValues.ElementAt(i * 8 + 0).Value.TagValue);
TagValeNormal = keyValues.ElementAt(i * 8 + 3).Value.TagValue.ToString();
TagValueUp = keyValues.ElementAt(i * 8 + 4).Value.TagValue.ToString();
TagValueDown = keyValues.ElementAt(i * 8 + 5).Value.TagValue.ToString();
var TF1 = keyValues.ElementAt(i * 8 + 1).Value;
DeviceDriver_BasicData.CustomeEvetnArgs qualityDataType1;
qualityDataType1 = GetQualityDataType(TF1);
qualityDataType1.IsGoodBad = isOK;
qualityDataType1.TagValeNormal = TagValeNormal;
qualityDataType1.TagValueDown = TagValueDown;
qualityDataType1.TagValueUp = TagValueUp;
ht.Add(qualityDataType1.TagID, qualityDataType1);
var TF2 = keyValues.ElementAt(i * 8 + 2).Value;
DeviceDriver_BasicData.CustomeEvetnArgs qualityDataType2;
qualityDataType2 = GetQualityDataType(TF2);
qualityDataType2.IsGoodBad = isOK;
qualityDataType2.TagValeNormal = TagValeNormal;
qualityDataType2.TagValueDown = TagValueDown;
qualityDataType2.TagValueUp = TagValueUp;
ht.Add(qualityDataType2.TagID, qualityDataType2);
}
return ht;
}
}
public static DeviceDriver_BasicData.CustomeEvetnArgs GetQualityDataType(DeviceDriver_BasicData.CustomeEvetnArgs TF)
{
DeviceDriver_BasicData.CustomeEvetnArgs qualityDataType;
qualityDataType = new DeviceDriver_BasicData.CustomeEvetnArgs();
qualityDataType.TagID = TF.TagID.ToString();
qualityDataType.TagTypeID = Convert.ToInt32(TF.TagTypeID);//变量类型
qualityDataType.OpName = TF.OpName.ToString();
int.TryParse(TF.TagQuality.ToString(), out int TagQuality);
qualityDataType.TagQuality = TagQuality;
qualityDataType.TagValueType = Convert.ToInt32(TF.TagTypeCodeID);
int.TryParse(TF.TagOrderBy.ToString(), out int TagOrderBy);
qualityDataType.TagOrderBy = TagOrderBy;
int.TryParse(TF.TagItemOrderBy.ToString(), out int TagItemOrderBy);
qualityDataType.TagItemOrderBy = TagItemOrderBy;
qualityDataType.TagProperty = Convert.ToInt32(TF.TagProperty) ;//变量特点
qualityDataType.TagValue = TF.TagValue;//变量值
//2025.07.15.2232.LLX
qualityDataType.ShaftID = TF.ShaftID;
qualityDataType.ItemName = TF.ItemName;
qualityDataType.Unit = TF.Unit;
return qualityDataType;
}
}
}