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.

573 lines
24 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Mesnac.Action.Base;
using System.Windows.Forms;
using System.Xml;
using System.Data;
using System.IO.Ports;
using Mesnac.Controls.Base;
using Mesnac.Controls.Default;
using Mesnac.Codd.Session;
namespace Mesnac.Action.Feeding.Sys
{
/// <summary>
/// 窗口条码枪扫描机台号
/// </summary>
public class ScanBarcodeAction : FeedingAction, IAction
{
private SerialPort serialPort = null;
public void Run(RuntimeParameter runtime)
{
base.LogDebug("条码枪,条码扫描业务...");
string portName = base.GetConfigValue("PortName", "COM7"); //获取配置文件中的串口口
int baudRate = Convert.ToInt32(base.GetConfigValue("BaudRate", "9600")); //获取配置文件中的波特率
this.serialPort = Mesnac.Communication.SerialPortService.Instance.GetSerialPort(portName, baudRate);
if (this.serialPort == null)
{
base.LogError("串口对象获取失败...");
return;
}
this.serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
}
/// <summary>
/// 条码扫描事件处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
System.Threading.Thread.Sleep(200); //睡眠200毫秒目的是为了能一次把缓冲区中的数据读取出来
string barStr = this.serialPort.ReadExisting().Trim();
if (barStr.IndexOf("~") > 0)
{
barStr = barStr.Substring(0, barStr.IndexOf("~"));
}
this.ProcessBarcode(barStr);
}
catch (Exception ex)
{
base.LogError(ex.Message);
base.LogError(ex.StackTrace);
}
}
/// <summary>
/// 处理条码核心业务
/// </summary>
/// <param name="barStr">条码</param>
public void ProcessBarcode(string barStr)
{
if (barStr.Length == 5) //机台条码
{
Global.PublicVar.Instance.G_CBEquip = barStr;
return;
}
if (barStr.StartsWith("*") || barStr.StartsWith("#"))
{
barStr = barStr.Substring(1);
}
if (this.IsLetterOrDigit(barStr)) //判断扫描条码合法性
{
this.HandleScanBarcode(barStr);
}
else
{
//RubBarShow(Barstr); 老版本Delphi业务暂时没有实现
string strMsg = String.Format("条码无效,请重新扫描!");
Mesnac.Basic.MessageBoxTimeOut.Show(strMsg, Language(1), 2000);
//ShowMsg(strMsg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
#region 辅助方法
#region IsLetterOrDigit 判断一个字符串是否为字母和数字的组合
/// <summary>
/// 判断一个字符串是否为字母和数字的组合
/// </summary>
/// <param name="str">要验证的字符串</param>
/// <returns>是返回true否返回false</returns>
public bool IsLetterOrDigit(string str)
{
bool flag = true;
foreach (char c in str)
{
if (!Char.IsLetterOrDigit(c))
{
flag = false;
break;
}
}
return flag;
}
#endregion
#region HandleScanBarcode 手动条码扫描核心业务
/// <summary>
/// 手动条码扫描核心业务
/// </summary>
/// <param name="barStr">条码号</param>
public void HandleScanBarcode(string barStr)
{
string materCode = String.Empty;
string materName;
int barlen;
string strMsg = String.Empty;
if (base.NetType == NetTypes.Net) //网络版条码处理
{
barlen = barStr.Length;
if (barlen < 15) //原材料条码
{
materCode = this.GetMatercodeByBar(barStr);
if (String.IsNullOrEmpty(materCode))
{
MediaPlayerEx.Play("2.WAV");
strMsg = String.Format("[{0}]无该条码批次信息!", barStr);
Mesnac.Basic.MessageBoxTimeOut.Show(strMsg, Language(1), 2000);
//ShowMsg(strMsg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
string scanBarcodeCBCode = base.GetConfigValue("ScanBarcodeCBCode", "107"); //从配置文件获取炭黑类型码
string[] cbCodes = scanBarcodeCBCode.Split(new char[] { ',' });
bool isCBFlag = false;
foreach (string code in cbCodes)
{
if (materCode.Substring(0, 3) == code)
{
isCBFlag = true;
break;
}
}
//if (materCode.Substring(0,3) == "107") //炭黑
if (isCBFlag)
{
this.AddInJarRecord(barStr, materCode, Global.PublicVar.Instance.G_CBEquip);
Global.PublicVar.Instance.G_CBEquip = String.Empty;
MediaPlayerEx.Play("1.WAV");
}
}
if (barlen == 17 || barlen == 18)
{
materCode = this.GetMaterCodeByLotBarXLM(barStr);
materName = this.GetMaterNameByMaterCodeLocal(materCode);
this.GetDTMater(materCode);
if (this.IsUseFinished(materCode, barStr,out strMsg))
{
Mesnac.Basic.MessageBoxTimeOut.Show(strMsg, Language(1), 2000);
//ShowMsg(strMsg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Warning);
MediaPlayerEx.Play("2.WAV");
return;
}
if (String.IsNullOrEmpty(materCode))
{
strMsg = String.Format("[{0}]无该条码批次信息!", barStr);
Mesnac.Basic.MessageBoxTimeOut.Show(strMsg, Language(1), 2000);
MediaPlayerEx.Play("2.WAV");
return;
}
if (String.IsNullOrEmpty(materName))
{
strMsg = String.Format("[{0}]物料物料!", materName);
Mesnac.Basic.MessageBoxTimeOut.Show(strMsg, Language(1), 2000);
MediaPlayerEx.Play("2.WAV");
return;
}
if (!this.IsNowProduct(materCode, 2))
{
if (this.GetDTMater(materCode) == false)
{
strMsg = String.Format("[{0}]配方无该物料!", materName);
Mesnac.Basic.MessageBoxTimeOut.Show(strMsg, Language(1), 2000);
//ShowMsg(strMsg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Warning);
MediaPlayerEx.Play("2.WAV");
return;
}
}
}
if (this.IsInShelfBar(barStr))
{
strMsg = String.Format("条码已存在!");
Mesnac.Basic.MessageBoxTimeOut.Show(strMsg, Language(1), 2000);
//ShowMsg(strMsg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Warning);
MediaPlayerEx.Play("2.WAV");
}
else
{
//RubMaterBarShow(Barstr, MaterName); 老版本Delphi业务暂时没有实现
this.InsertMaterbar(materCode, barStr);
strMsg = String.Format("条码扫描成功!");
Mesnac.Basic.MessageBoxTimeOut.Show(strMsg, Language(1), 2000);
//ShowMsg(strMsg, Language(1), MessageBoxButtons.OK, MessageBoxIcon.Information);
MediaPlayerEx.Play("1.WAV");
}
}
}
#endregion
#region GetMatercodeByBar 根据条码获取物料编码
/// <summary>
/// 根据条码获取物料编码
/// </summary>
/// <param name="barStr">条码</param>
/// <returns>返回对应的物料编码</returns>
public string GetMatercodeByBar(string barStr)
{
string procedureName = "Proc_GetMaterByBarcode"; //根据条码返回物料数据集的存储过程mater_Code,mater_name
Dictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add("@barcode", barStr);
DbHelper dbHelper = base.GetProcedureHelper(Basic.DataSourceFactory.MCDbType.Server, procedureName, parameters);
if (dbHelper != null)
{
DataTable table = dbHelper.ToDataTable();
if (table != null && table.Rows.Count > 0)
{
return table.Rows[0]["Mater_Code"] as string;
}
}
return String.Empty;
}
#endregion
#region AddInJarRecord 原料入库(网络库业务)
/// <summary>
/// 原料入库(网络库业务)
/// </summary>
/// <param name="materbarcode">原材料条码</param>
/// <param name="matercode">物料代码</param>
/// <param name="equip_Code">炭黑扫描机台号</param>
public void AddInJarRecord(string materbarcode, string matercode, string equip_Code)
{
double bagweight = 1000;
DbHelper dbHelper = base.NewDbHelper(Basic.DataSourceFactory.MCDbType.Server);
if (dbHelper == null)
{
base.LogError("获取网络数据库连接失败...");
return;
}
dbHelper.ClearParameter();
dbHelper.CommandType = CommandType.Text;
//string strSql = "select top 1 UnitWeight from PstMinStock where UpDwnMark=1 and MaterBarcode = @MaterBarcode"; //密炼Web
string strSql = "select top 1 Unit_Weight from Pst_MinStock where up_dwn_mark=1 and Mater_barcode = @MaterBarcode";
dbHelper.CommandText = strSql;
dbHelper.AddParameter("@MaterBarcode", materbarcode);
object result = dbHelper.ToScalar();
if (result != null && result != System.DBNull.Value)
{
double.TryParse(result.ToString(), out bagweight);
}
//string strSql2 = "insert into Pstmminjar(Materbarcode,MaterCode,StockDate,EquipCode,ShiftID,InTime,RealNum,RealWeight,ClearFlag)"; //密炼Web
string strSql2 = "insert into Pst_mminjar(Mater_barcode,Mater_code,Stock_date,Equip_code,Shift_id,In_Time,Real_num,Real_weight,Clear_Flag)";
strSql2 += " values(@Materbarcode,@MaterCode,@StockDate,@EquipCode,@ShiftID,GETDATE(),'1',@RealWeight,'0')";
dbHelper.ClearParameter();
dbHelper.CommandText = strSql2;
PlanLog log = PlanCommon.PlanLog;
if (log != null)
{
dbHelper.AddParameter("Materbarcode", materbarcode);
dbHelper.AddParameter("MaterCode", matercode);
dbHelper.AddParameter("StockDate", log.LastSelectDate);
dbHelper.AddParameter("EquipCode", equip_Code);
dbHelper.AddParameter("ShiftID", log.LastSelectShiftID);
dbHelper.AddParameter("RealWeight", bagweight);
}
else
{
base.LogDebug("获取不到执行的计划,不能进行扫描数据的原料入库!");
return;
}
dbHelper.ExecuteNonQuery();
}
#endregion
#region GetMaterCodeByLotBarXLM 从网络库中根据条码获取物料代码
/// <summary>
/// 从网络库中根据条码获取物料代码
/// </summary>
/// <param name="barcode">条码</param>
/// <returns>返回对应的物料代码</returns>
public string GetMaterCodeByLotBarXLM(string barcode)
{
DbHelper dbHelper = base.NewDbHelper(Basic.DataSourceFactory.MCDbType.Server);
if (dbHelper == null)
{
base.LogError("获取网络数据库连接失败...");
return String.Empty;
}
dbHelper.ClearParameter();
dbHelper.CommandType = CommandType.Text;
string strSql = String.Empty;
//退料及不合格胶
if (barcode.ToUpper().IndexOf("TTT") > 0 || barcode.ToUpper().IndexOf("XXX") > 0)
{
strSql = "select Mater_Code from Ppm_QuaNoRecord where Shelf_Barcode = @Barcode";
}
else
{
strSql = "select Mater_code from Ppt_ShiftConfig where Barcode = @Barcode";
}
dbHelper.CommandText = strSql;
dbHelper.AddParameter("@Barcode", barcode);
object result = dbHelper.ToScalar();
if (result != null && result != System.DBNull.Value)
{
return result as string;
}
return String.Empty;
}
#endregion
#region GetMaterNameByMaterCodeLocal 从网络库中根据物料代码获取物料名称
/// <summary>
/// 从网络库中根据物料代码获取物料名称
/// </summary>
/// <param name="materCode">物料代码</param>
/// <returns></returns>
public string GetMaterNameByMaterCodeLocal(string materCode)
{
DbHelper dbHelper = base.NewDbHelper(Basic.DataSourceFactory.MCDbType.Server);
if (dbHelper == null)
{
base.LogError("获取网络数据库连接失败...");
return String.Empty;
}
dbHelper.ClearParameter();
dbHelper.CommandType = CommandType.Text;
//string strSql = "select MaterialName from BasMaterial where MaterialCode = @MaterialCode"; //密炼Web库
string strSql = "select Mater_name from Pmt_material where Mater_code = @MaterialCode";
dbHelper.CommandText = strSql;
dbHelper.AddParameter("@MaterialCode", materCode);
object result = dbHelper.ToScalar();
if (result != null && result != System.DBNull.Value)
{
return result as string;
}
return String.Empty;
}
#endregion
#region GetDTMater 从网络库中查询是否存在等同物料
/// <summary>
/// 从网络库中查询是否存在等同物料
/// </summary>
/// <param name="materCode">物料代码</param>
/// <returns>如果存在等同物料返回true否则返回false</returns>
public bool GetDTMater(string materCode)
{
DbHelper dbHelper = base.NewDbHelper(Basic.DataSourceFactory.MCDbType.Server);
if (dbHelper == null)
{
base.LogError("获取网络数据库连接失败...");
return false;
}
dbHelper.ClearParameter();
dbHelper.CommandType = CommandType.Text;
//string strSql = "select count(*) from BasMaterial where MaterialGroup = @MaterialCode and MaterialGroup <> MaterialCode"; //密炼web库
string strSql = "select count(*) from Pmt_material where Mater_groupName = @MaterialCode and Mater_groupName <> Mater_code";
dbHelper.CommandText = strSql;
dbHelper.AddParameter("@MaterialCode", materCode);
object result = dbHelper.ToScalar();
if (result != null && result != System.DBNull.Value)
{
if (Convert.ToInt32(result) > 0)
{
return true;
}
}
return false;
}
#endregion
#region IsUseFinished 判断物料是否使用完毕
/// <summary>
/// 判断物料是否使用完毕
/// </summary>
/// <param name="materCode">物料代码</param>
/// <param name="barCode">条码</param>
/// <param name="strMsg">返回的消息</param>
/// <returns>用完返回true否则返回false</returns>
public bool IsUseFinished(string materCode, string barCode, out string strMsg)
{
string strFst;
string strSql;
double realWeight;
double usedWeigh;
int shelfNum;
int usedNum;
strMsg = String.Empty;
DbHelper dbHelper = base.NewDbHelper(Basic.DataSourceFactory.MCDbType.Server);
if (dbHelper == null)
{
base.LogError("获取网络数据库连接失败...");
return false;
}
dbHelper.ClearParameter();
dbHelper.CommandType = CommandType.Text;
strFst = materCode.Substring(0, 1);
if (strFst.CompareTo("3") >= 0)
{
strSql = "select ISNULL(Total_Weight * Shelf_Num, 0) as RealWeight, ISNULL(Used_Weigh,0) as UsedWeigh from Ppt_ShiftConfig where Barcode = @Barcode";
dbHelper.CommandText = strSql;
dbHelper.AddParameter("@Barcode", barCode);
DataTable table = dbHelper.ToDataTable();
if (table != null && table.Rows.Count > 0)
{
realWeight = Convert.ToDouble(table.Rows[0]["RealWeight"]);
usedWeigh = Convert.ToDouble(table.Rows[0]["UsedWeigh"]);
if (usedWeigh > realWeight)
{
strMsg = "该架子物料重量使用完毕";
return true;
}
}
}
else if (strFst == "2")
{
strSql = "select ISNULL(Shelf_Num,0) as ShelfNum,ISNULL(Used_Num,0) as UsedNum from Ppt_ShiftConfig where Barcode = @Barcode";
dbHelper.CommandText = strSql;
dbHelper.AddParameter("@Barcode", barCode);
DataTable table = dbHelper.ToDataTable();
if (table != null && table.Rows.Count > 0)
{
shelfNum = Convert.ToInt32(table.Rows[0]["ShelfNum"]);
usedNum = Convert.ToInt32(table.Rows[0]["UsedNum"]);
if (shelfNum < usedNum)
{
strMsg = "该批小料已使用完毕'";
return true;
}
}
}
return false;
}
#endregion
#region IsNowProduct 判断配方中含有该条码的物料
/// <summary>
/// 判断配方中含有该条码的物料
/// </summary>
/// <param name="materCd">物料代码</param>
/// <param name="materTp">物料类型0-炭黑1-油2-胶料3-粉料4-小料</param>
/// <returns>有返回True否则返回False</returns>
public bool IsNowProduct(string materCd, int materTp)
{
BasicInfo.RecipeData recipeData = new BasicInfo.RecipeData();
List<BasicInfo.RecipeData.RecipeWeightInfo> lst = recipeData.GetCurrentRecipeWeightInfo();
bool flag = false;
foreach (BasicInfo.RecipeData.RecipeWeightInfo weightInfo in lst)
{
if (weightInfo.MaterialCode == materCd && weightInfo.WeightType == materTp)
{
flag = true;
break;
}
}
return flag;
}
#endregion
#region IsInShelfBar 在本地库架子条码表中检验是否有物料批次条码对应的记录
/// <summary>
/// 在本地库架子条码表中检验是否有物料批次条码对应的记录
/// </summary>
/// <param name="tShelfBar">条码</param>
/// <returns>存在返回true否则返回false</returns>
public bool IsInShelfBar(string tShelfBar)
{
DbHelper dbHelper = base.NewDbHelper(Basic.DataSourceFactory.MCDbType.Local);
if (dbHelper == null)
{
base.LogError("获取本地数据连接失败...");
return false;
}
dbHelper.ClearParameter();
dbHelper.CommandType = CommandType.Text;
//string strSql = "select count(barCode) from PmtShelfBar where barCode = @barCode";
string strSql = "select COUNT(*) from pmt_ShelfBar where barcode = @barCode";
dbHelper.CommandText = strSql;
dbHelper.AddParameter("@barCode", tShelfBar);
object result = dbHelper.ToScalar();
if (result != null && result != System.DBNull.Value)
{
if (Convert.ToInt32(result) > 0)
{
return true;
}
}
return false;
}
#endregion
#region InsertMaterbar 追加条码扫描记录
/// <summary>
/// 追加条码扫描记录
/// </summary>
/// <param name="materCode">物料编码</param>
/// <param name="barCode">条码</param>
public void InsertMaterbar(string materCode, string barCode)
{
string mKind = String.Empty;
//首先把扫描条码保存到本地(如果是小料只允许一个批次条码存在)
mKind = materCode.Substring(0, 1);
DbHelper dbHelper = base.NewDbHelper(Basic.DataSourceFactory.MCDbType.Local);
if (dbHelper == null)
{
base.LogError("获取本地数据连接失败...");
return;
}
dbHelper.ClearParameter();
dbHelper.CommandType = CommandType.Text;
//string strSql = "insert into PmtShelfBar(barCode,materCode) values(@barCode,@materCode)";
string strSql = "insert into pmt_ShelfBar(barcode,mater_code) values(@barCode,@materCode)";
dbHelper.CommandText = strSql;
dbHelper.AddParameter("@barCode", barCode);
dbHelper.AddParameter("@materCode", materCode);
dbHelper.ExecuteNonQuery();
if (base.NetType == NetTypes.Net)
{
//保存条码到网络数据库
int tmpCurrNum = Convert.ToInt32(BasicInfo.PlcData.Instance.PloyFinishedCount.LastValue);
string procedureName = "Proc_InsertBarcode";
Dictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add("@Barcode", barCode);
parameters.Add("@Equip_code", base.CurrEquipCode);
parameters.Add("@Mater_code", materCode);
parameters.Add("@FinishNum", tmpCurrNum + 1);
base.ExecuteProcedure(Basic.DataSourceFactory.MCDbType.Server, procedureName, parameters);
}
}
#endregion
#endregion
}
}