You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

353 lines
18 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Mesnac.Codd.Session;
using Mesnac.Action.Feeding.Qingquan.BasicInfo;
using System.Data;
using System.Data.Common;
namespace Mesnac.Action.Feeding.Qingquan.FinishBatch
{
/// <summary>
/// 密炼数据存盘辅助类
/// </summary>
public class PptMixingDataHelper
{
private LotBarcode lotBarcode = null;
private List<RecipeData.RecipeMixingInfo> allMixingInfo = null;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="_lotBarcode">架子信息</param>
/// <param name="_allMixingInfo">密炼信息</param>
public PptMixingDataHelper(LotBarcode _lotBarcode, List<RecipeData.RecipeMixingInfo> _allMixingInfo)
{
this.lotBarcode = _lotBarcode;
this.allMixingInfo = _allMixingInfo;
}
#region SavePptMixingData - 保存当前车密炼数据
/// <summary>
/// 保存当前车密炼数据
/// </summary>
/// <param name="dbHelper"></param>
/// <returns></returns>
public bool SavePptMixingData(Mesnac.Basic.DataSourceFactory.MCDbType dbType, DbHelper dbHelper)
{
try
{
#region 基本信息
PlcRecipeReader reader = PlcSchemaHandler.Instance.GetPlcRecipeReader("PptMixData").FirstOrDefault();
#endregion
int[] buff;
if (!PlcData.Instance.PlcLastValueRead(reader.PlcFiledName, out buff))
{
ICSharpCode.Core.LoggingService.Warn("读取PLC的密炼数据失败!");
return true;
}
int shifting = 0;
for (int i = 0; i < allMixingInfo.Count; i++)
{
RecipeData.RecipeMixingInfo mixing = allMixingInfo[i];
#region 基本信息
dbHelper.CommandType = CommandType.Text;
//dbHelper.ClearParameter();
List<DbParameter>[] parameters = new List<DbParameter>[mixing.SynchMixingInfos.Count]; //当前密炼步骤合并的步骤
StringBuilder[] sqlstr_fields = new StringBuilder[mixing.SynchMixingInfos.Count];
StringBuilder[] sqlstr_values = new StringBuilder[mixing.SynchMixingInfos.Count];
for (int index = 0; index < mixing.SynchMixingInfos.Count; index++)
{
parameters[index] = new List<DbParameter>();
sqlstr_fields[index] = new StringBuilder();
sqlstr_values[index] = new StringBuilder();
}
string fieldName = string.Empty;
string valueName = string.Empty;
if (dbType == Mesnac.Basic.DataSourceFactory.MCDbType.Local)
{
for (int index = 0; index < mixing.SynchMixingInfos.Count; index++)
{
sqlstr_fields[index].Append("INSERT INTO PptMixData(");
}
}
if (dbType == Mesnac.Basic.DataSourceFactory.MCDbType.Server)
{
for (int index = 0; index < mixing.SynchMixingInfos.Count; index++)
{
sqlstr_fields[index].Append("INSERT INTO Ppt_MixData(");
}
}
for (int index = 0; index < mixing.SynchMixingInfos.Count; index++)
{
sqlstr_values[index].Append(" ) VALUES (");
}
#region 数据整理
#region SaveTime
fieldName = "Save_Time";
valueName = "getdate()";
for (int index = 0; index < mixing.SynchMixingInfos.Count; index++)
{
sqlstr_fields[index].Append(fieldName).Append(",");
sqlstr_values[index].Append(valueName).Append(",");
}
#endregion
#region MixId
fieldName = "Mix_id";
valueName = "@MixID";
for (int index = 0; index < mixing.SynchMixingInfos.Count; index++)
{
sqlstr_fields[index].Append(fieldName).Append(",");
sqlstr_values[index].Append(valueName).Append(",");
parameters[index].Add(dbHelper.CreateParameter(valueName, mixing.SynchMixingInfos[index].MixingStep));
//dbHelper.AddParameter(valueName, mixing.MixingStep);
}
#endregion
#endregion
#endregion
#region 存储PLCSchema.xml中配置字段的数据
foreach (PlcRecipeReaderItem item in reader.ItemList)
{
int[] data = new int[item.ValueLen];
for (int idx = 0; idx < data.Length; idx++)
{
data[idx] = buff[idx + shifting];
}
shifting += item.ValueLen;
item.SetValue = data;
fieldName = item.DataFieldName;
valueName = "@" + fieldName;
for (int index = 0; index < mixing.SynchMixingInfos.Count; index++)
{
sqlstr_fields[index].Append(fieldName).Append(",");
sqlstr_values[index].Append(valueName).Append(",");
if (fieldName.Equals("Term_code", StringComparison.CurrentCultureIgnoreCase))
{
//int value = 0;
//if (int.TryParse(item.GetValue().ToString(), out value))
//{
// if (value > 0)
// {
// parameters[index].Add(dbHelper.CreateParameter(valueName, value));
// }
// else
// {
// parameters[index].Add(dbHelper.CreateParameter(valueName, mixing.SynchMixingInfos[index].TermCodeAddress));
// }
//}
//else
//{
// parameters[index].Add(dbHelper.CreateParameter(valueName, mixing.SynchMixingInfos[index].TermCodeAddress));
//}
if (dbType == Mesnac.Basic.DataSourceFactory.MCDbType.Local)
{
parameters[index].Add(dbHelper.CreateParameter(valueName, mixing.SynchMixingInfos[index].TermCodeAddress));
}
else if (dbType == Mesnac.Basic.DataSourceFactory.MCDbType.Server)
{
parameters[index].Add(dbHelper.CreateParameter(valueName, mixing.SynchMixingInfos[index].TermCodeMapAddress));
}
}
else if (fieldName.Equals("Act_code", StringComparison.CurrentCultureIgnoreCase))
{
//int actionCode = 0;
//if (int.TryParse(item.GetValue().ToString(), out actionCode))
//{
// if (actionCode == mixing.ActionCodeAddress)
// {
// parameters[index].Add(dbHelper.CreateParameter(valueName, mixing.SynchMixingInfos[index].ActionCodeAddress));
// }
// else
// {
// //ICSharpCode.Core.LoggingService.Warn("密炼数据存盘时从PLC获取的Act_code与配方中的密炼动作不一致:密炼步骤:" + mixing.SynchMixingInfos[index].MixingStep + ",动作地址:" + actionCode);
// parameters[index].Add(dbHelper.CreateParameter(valueName, mixing.SynchMixingInfos[index].ActionCodeAddress));
// }
//}
//else
//{
// ICSharpCode.Core.LoggingService.Warn("密炼数据存盘时从PLC获取Act_code的值失败");
// parameters[index].Add(dbHelper.CreateParameter(valueName, mixing.SynchMixingInfos[index].ActionCodeAddress));
//}
if (dbType == Mesnac.Basic.DataSourceFactory.MCDbType.Local)
{
parameters[index].Add(dbHelper.CreateParameter(valueName, mixing.SynchMixingInfos[index].ActionCodeAddress));
}
else if (dbType == Mesnac.Basic.DataSourceFactory.MCDbType.Server)
{
parameters[index].Add(dbHelper.CreateParameter(valueName, mixing.SynchMixingInfos[index].ActionCodeMapAddress));
}
}
else
{
parameters[index].Add(dbHelper.CreateParameter(valueName, item.GetValue()));
}
//dbHelper.AddParameter(valueName, item.GetValue());
}
}
#endregion
#region Barcode
fieldName = "Barcode";
valueName = "@" + fieldName;
for (int index = 0; index < mixing.SynchMixingInfos.Count; index++)
{
sqlstr_fields[index].Append(fieldName);
sqlstr_values[index].Append(valueName);
parameters[index].Add(dbHelper.CreateParameter(valueName, lotBarcode.Barcode.Trim()));
//dbHelper.AddParameter(valueName, lotBarcode.Barcode.Trim());
}
#endregion
#region 执行存储
for (int index = 0; index < mixing.SynchMixingInfos.Count; index++)
{
try
{
sqlstr_values[index].Append(")"); //结束SQL语句
dbHelper.ClearParameter();
dbHelper.CommandText = sqlstr_fields[index].ToString() + sqlstr_values[index].ToString();
foreach (DbParameter p in parameters[index])
{
dbHelper.AddParameter(p);
}
dbHelper.ExecuteNonQuery();
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error("存盘业务-保存当前步骤的密炼数据失败:" + ex.Message);
}
}
#endregion
}
return true;
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error("存盘业务-保存当前车密炼数据失败:" + ex.Message);
return false;
}
}
#endregion
#region 更新本地库密炼数据的上传标志
/// <summary>
/// 更新本地库密炼数据的上传标志
/// </summary>
/// <param name="localHelper">本地库数据连接对象</param>
public void UpdateIsUpFlag(DbHelper localHelper)
{
try
{
string strSql = "update PptMixData set IsUpFlag = 1 where Barcode = @Barcode";
localHelper.ClearParameter();
localHelper.CommandText = strSql;
localHelper.AddParameter("@Barcode", this.lotBarcode.Barcode.Trim());
localHelper.ExecuteNonQuery();
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error(String.Format("更新本地库密炼数据[{0}]上传标志失败:{1}", this.lotBarcode.Barcode, ex.Message));
}
}
#endregion
#region 处理配方结束(如果最后一步的动作是配方结束,则取上一步的值)
/// <summary>
/// 处理配方结束(如果最后一步的动作是配方结束,则取上一步的值)
/// </summary>
/// <param name="localHelper">本地连接</param>
/// <param name="serverHelper">网络连接</param>
/// <param name="isNet">是否网络版</param>
public void ProcessTheEnd(DbHelper localHelper,DbHelper serverHelper, bool isNet)
{
try
{
string strSql = "select top 1 * from PptMixData where Barcode= @Barcode order by Mix_id desc";
localHelper.ClearParameter();
localHelper.CommandText = strSql;
localHelper.AddParameter("@Barcode", this.lotBarcode.Barcode.Trim());
DataTable table = localHelper.ToDataTable();
if (table != null && table.Rows.Count > 0)
{
int actionCode = Mesnac.Basic.DataProcessor.RowValue(table.Rows[0], "Act_code", -1);
if (actionCode == 0) //如果动作是配方结束
{
int mixId = Mesnac.Basic.DataProcessor.RowValue(table.Rows[0], "Mix_id", -1); //取出最后一步的密炼步骤
int preMixId = mixId - 1; //获取上一步的密炼步骤
if (preMixId >= 1) //验证合法性
{
string strSql2 = "select * from PptMixData where Barcode = @Barcode and Mix_id = @Mix_id";
localHelper.ClearParameter();
localHelper.CommandText = strSql2;
localHelper.AddParameter("@Barcode", this.lotBarcode.Barcode.Trim());
localHelper.AddParameter("@Mix_id", preMixId);
DataTable table2 = localHelper.ToDataTable();
if (table2 != null && table2.Rows.Count > 0)
{
DataRow row2 = table2.Rows[0];
int setTime = Mesnac.Basic.DataProcessor.RowValue(row2, "Set_time", 0);
double setTemp = Mesnac.Basic.DataProcessor.RowValue(row2, "Set_temp", 0.0);
double setEner = Mesnac.Basic.DataProcessor.RowValue(row2, "Set_ener", 0.0);
double setPower = Mesnac.Basic.DataProcessor.RowValue(row2, "Set_power", 0.0);
double setPres = Mesnac.Basic.DataProcessor.RowValue(row2, "Set_pres", 0.0);
double setRota = Mesnac.Basic.DataProcessor.RowValue(row2, "Set_rota", 0.0);
string strSql3 = "Update PptMixData set Set_time = @Set_time,Set_temp = @Set_temp,Set_ener = @Set_ener,Set_power = @Set_power,Set_pres = @Set_pres,Set_rota = @Set_rota where Barcode = @Barcode and Mix_id = @Mix_id";
localHelper.ClearParameter();
localHelper.CommandText = strSql3;
localHelper.AddParameter("@Set_time", setTime);
localHelper.AddParameter("@Set_temp", setTemp);
localHelper.AddParameter("@Set_ener", setEner);
localHelper.AddParameter("@Set_power", setPower);
localHelper.AddParameter("@Set_pres", setPres);
localHelper.AddParameter("@Set_rota", setRota);
localHelper.AddParameter("@Barcode", this.lotBarcode.Barcode.Trim());
localHelper.AddParameter("@Mix_id", mixId);
localHelper.ExecuteNonQuery();
if (isNet)
{
string strSql4 = "Update Ppt_mixdata set Set_time = @Set_time,Set_temp = @Set_temp,Set_ener = @Set_ener,Set_power = @Set_power,Set_pres = @Set_pres,Set_rota = @Set_rota where Barcode = @Barcode and Mix_id = @Mix_id";
serverHelper.ClearParameter();
serverHelper.CommandText = strSql4;
serverHelper.AddParameter("@Set_time", setTime);
serverHelper.AddParameter("@Set_temp", setTemp);
serverHelper.AddParameter("@Set_ener", setEner);
serverHelper.AddParameter("@Set_power", setPower);
serverHelper.AddParameter("@Set_pres", setPres);
serverHelper.AddParameter("@Set_rota", setRota);
serverHelper.AddParameter("@Barcode", this.lotBarcode.Barcode.Trim());
serverHelper.AddParameter("@Mix_id", mixId);
serverHelper.ExecuteNonQuery();
}
}
}
}
}
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error(String.Format("密炼信息存盘-处理配方结束失败:{0},{1}!", this.lotBarcode.Barcode, ex.Message));
}
}
#endregion
}
}