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 { /// /// 窗口条码枪扫描机台号 /// 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); } /// /// 条码扫描事件处理 /// /// /// 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); } } /// /// 处理条码核心业务 /// /// 条码 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 判断一个字符串是否为字母和数字的组合 /// /// 判断一个字符串是否为字母和数字的组合 /// /// 要验证的字符串 /// 是返回true,否返回false 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 手动条码扫描核心业务 /// /// 手动条码扫描核心业务 /// /// 条码号 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 根据条码获取物料编码 /// /// 根据条码获取物料编码 /// /// 条码 /// 返回对应的物料编码 public string GetMatercodeByBar(string barStr) { string procedureName = "Proc_GetMaterByBarcode"; //根据条码返回物料数据集的存储过程(mater_Code,mater_name) Dictionary parameters = new Dictionary(); 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 原料入库(网络库业务) /// /// 原料入库(网络库业务) /// /// 原材料条码 /// 物料代码 /// 炭黑扫描机台号 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 从网络库中根据条码获取物料代码 /// /// 从网络库中根据条码获取物料代码 /// /// 条码 /// 返回对应的物料代码 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 从网络库中根据物料代码获取物料名称 /// /// 从网络库中根据物料代码获取物料名称 /// /// 物料代码 /// 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 从网络库中查询是否存在等同物料 /// /// 从网络库中查询是否存在等同物料 /// /// 物料代码 /// 如果存在等同物料返回true,否则返回false 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 判断物料是否使用完毕 /// /// 判断物料是否使用完毕 /// /// 物料代码 /// 条码 /// 返回的消息 /// 用完返回true,否则返回false 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 判断配方中含有该条码的物料 /// /// 判断配方中含有该条码的物料 /// /// 物料代码 /// 物料类型0-炭黑,1-油,2-胶料,3-粉料,4-小料 /// 有返回True,否则返回False public bool IsNowProduct(string materCd, int materTp) { BasicInfo.RecipeData recipeData = new BasicInfo.RecipeData(); List 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 在本地库架子条码表中检验是否有物料批次条码对应的记录 /// /// 在本地库架子条码表中检验是否有物料批次条码对应的记录 /// /// 条码 /// 存在返回true,否则返回false 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 追加条码扫描记录 /// /// 追加条码扫描记录 /// /// 物料编码 /// 条码 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 parameters = new Dictionary(); 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 } }