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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
}
}