using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataServices;
using System.Data;
using AGV_WPF_Global;
namespace AGV_WPF.Models
{
public class RoutePoint
{
public int currentPoint;
public int nextPoint;
public int route;
}
public class MissReadEventArgs:EventArgs
{
///
/// 漏读卡生产区
///
public int workLine;
///
/// 漏读卡AGV
///
public int agvNum;
///
/// 漏读卡路线
///
public int route;
///
/// 漏读站点
///
public int stationNum;
///
/// 记录信息,是漏读还是多读
///
public string info;
}
public class CheckCardUnit
{
public CheckCardUnit(int agvNum,int workLine,DataBase data)
{
this.AgvNum = agvNum;
this.workLine = workLine;
this.data = data;
ExcelDataBase exceldata = (ExcelDataBase)this.data;
if (!exceldata.IsExistTable(exceldata.DataFile, "路线"))
{
exceldata.CreateTable(exceldata.DataFile, "路线");
}
}
private int agvNum;
public int AgvNum
{
get { return agvNum; }
set { agvNum = value; }
}
private int workLine;
public int WorkLine
{
get { return workLine; }
set { workLine = value; }
}
public List missPoints = new List();//漏读站点列表
public RoutePoint lastPoint = null;//上一站点
public delegate void MissReadEventHandler(object o,MissReadEventArgs e);
public event MissReadEventHandler MissReadEvent;
private DataBase data;
public DataBase Data
{
get { return data; }
}
protected void OnMissReadEvent(object o, MissReadEventArgs e)
{
if (MissReadEvent != null)
{
MissReadEvent(o, e);
}
}
public void CheckPoint(RoutePoint currentPoint)
{
DataTable table = null;
Console.ForegroundColor = ConsoleColor.Yellow;
if (lastPoint == null)
{
Console.WriteLine("LastPoint为空");
}
if (lastPoint == null || (lastPoint != null && lastPoint.nextPoint == 0) || (lastPoint != null && lastPoint.route != currentPoint.route) || (currentPoint.currentPoint == lastPoint.currentPoint && currentPoint.route == lastPoint.route))//刚进行检测或者AGV已经跑完此条路线(无下一站点)或者当前线路跟上一线路不同时
{
lastPoint = currentPoint;
#region 填充lastPoint.nextPoint操作
string str = @"select * from [路线$] where [AGV编号]=" + agvNum.ToString() + " and " + "[路线编号]=" + lastPoint.route.ToString() + " and [生产区号]=" + workLine.ToString();
if (data != null)
table = (DataTable)data.Execute(str);
else
throw new Exception("数据库未实例化");
if (table.Rows.Count > 0)//先判断表中是否有该AGV路线信息,没有再用通用路线
{
str = @"select * from [路线$] where [AGV编号]=" + agvNum.ToString() + " and " + "[路线编号]=" + lastPoint.route.ToString() + "and " + "[站点编号]=" + lastPoint.currentPoint + " and [生产区号]=" + workLine.ToString();
table = (DataTable)data.Execute(str);
//有路线信息后,再找出当前点位置,默认只会找到一条记录
if (table.Rows.Count > 0)
{
int temp;
//得到当前点的序号
if (!int.TryParse(table.Rows[0]["站点序号"].ToString(), out temp))
return;
//寻找下一序号对应站点
str = @"select * from [路线$] where [AGV编号]=" + agvNum.ToString() + " and " + "[路线编号]=" + lastPoint.route.ToString() + " and " + "[站点序号]=" + (temp + 1).ToString() + " and [生产区号]=" + workLine.ToString();
table = (DataTable)data.Execute(str);
//存在下一站点,默认只会找到一条记录
if (table.Rows.Count > 0)
{
if (!int.TryParse(table.Rows[0]["站点编号"].ToString(), out temp))
return;
lastPoint.nextPoint = temp;
}
//不存在
else
{
lastPoint.nextPoint = 0;
}
}
}
else//否则用通用AGV编号0去查找
{
str = @"select * from [路线$] where [AGV编号]=0" + " and " + "[路线编号]=" + lastPoint.route.ToString() + "and " + "[站点编号]=" + lastPoint.currentPoint + " and [生产区号]=" + workLine.ToString();
table = (DataTable)data.Execute(str);
if (table.Rows.Count > 0)
{
int temp;
//得到当前点的序号
if (!int.TryParse(table.Rows[0]["站点序号"].ToString(), out temp))
return;
//寻找下一序号对应站点
str = @"select * from [路线$] where [AGV编号]=0" + " and " + "[路线编号]=" + lastPoint.route.ToString() + " and " + "[站点序号]=" + (temp + 1).ToString() + " and [生产区号]=" + workLine.ToString();
table = (DataTable)data.Execute(str);
//存在下一站点,默认只会找到一条记录
if (table.Rows.Count > 0)
{
if (!int.TryParse(table.Rows[0]["站点编号"].ToString(), out temp))
return;
lastPoint.nextPoint = temp;
}
//不存在
else
{
lastPoint.nextPoint = 0;
}
}
return;
}
#endregion
Console.WriteLine(string.Format("检测单元:AGV{0},路线{1},当前地标{2}", this.agvNum, lastPoint.route, lastPoint.currentPoint));
}
else if (lastPoint.route == currentPoint.route)
{
if (lastPoint.nextPoint != currentPoint.currentPoint)//上一站点的下一站点不等于当前站点,说明漏读卡了
{
string tempStr = string.Format(@"select * from [路线$] where [AGV编号]={0} and [路线编号]={1} and [生产区号]={2}", agvNum, currentPoint.route, workLine);
string info="";
if (data != null)
{
table = (DataTable)data.Execute(tempStr);
if (table.Rows.Count > 0)//先查看是否有指定AGV路线
{
tempStr = string.Format(@"select * from [路线$] where [AGV编号]={0} and [路线编号]={1} and [站点编号]={2} and [生产区号]={3}", agvNum, currentPoint.route, currentPoint.currentPoint, workLine);
table = (DataTable)data.Execute(tempStr);//再看当前点是否在路线中
if (table.Rows.Count > 0)
{
info = "漏读";//在路线中则为漏读
}
else
{
info = "没登记";//否则为多读
}
}
else//否则用通用AGV路线去查找
{
tempStr = string.Format(@"select * from [路线$] where [AGV编号]=0 and [路线编号]={0} and [生产区号]={1}", currentPoint.route, workLine);
table = (DataTable)data.Execute(tempStr);
if (table.Rows.Count > 0)//有通用路线
{
tempStr = string.Format(@"select * from [路线$] where [AGV编号]=0 and [路线编号]={0} and [站点编号]={1} and [生产区号]={2}", currentPoint.route, currentPoint.currentPoint, workLine);
table = (DataTable)data.Execute(tempStr);//再看当前点是否在路线中
if (table.Rows.Count > 0)
{
info = "漏读";//在路线中则为漏读
}
else
{
info = "没登记";//否则为多读
}
}
else
{
info = "没登记";//否则为多读
}
}
}
else
throw new Exception("数据库未实例化");
RoutePoint missPoint = new RoutePoint();
missPoint.route = lastPoint.route;
missPoint.currentPoint = lastPoint.nextPoint;
missPoint.nextPoint = 0;//注此处没给漏读卡,后一站点赋值,如果需要可从数据库中得到
//missPoints.Add(missPoint);//添加漏读卡到漏读列表当中
MissReadEventArgs e = new MissReadEventArgs();
e.agvNum = this.agvNum;
e.route = missPoint.route;
e.stationNum = missPoint.currentPoint;
e.info = info;
/************************************************************************/
/* 将漏卡写入Excel文件 */
/************************************************************************/
string date = string.Format(@"Link\{0}.xls", DateTime.Now.ToString("yyyy-MM-dd"));
DataBase tempData = new ExcelDataBase(date);
if (info.Contains("没登记"))//如果是多读则必须checked后能存入excle
{
if (GlobalPara.IsEnableExtraReadCheck)
{
MissRecord.Insert(ref tempData, this.workLine, this.agvNum, currentPoint.route, lastPoint.currentPoint, lastPoint.nextPoint, currentPoint.currentPoint, info, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
}
else//其他的直接存
{
MissRecord.Insert(ref tempData, this.workLine, this.agvNum, currentPoint.route, lastPoint.currentPoint, lastPoint.nextPoint, currentPoint.currentPoint, info, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
OnMissReadEvent(this, e);
lastPoint = currentPoint;//将lastPoint信息更新到当前点,以便下一次检测,随后填充lastPoint的nextPoint值
#region 填充lastPoint.nextPoint操作
string str = @"select * from [路线$] where [AGV编号]=" + agvNum.ToString() + " and " + "[路线编号]=" + lastPoint.route.ToString() + " and [生产区号]=" + workLine.ToString();
if (data != null)
table = (DataTable)data.Execute(str);
else
throw new Exception("数据库未实例化");
if(table.Rows.Count > 0)//先判断表中是否有该AGV路线信息,没有再用通用路线
{
str = @"select * from [路线$] where [AGV编号]=" + agvNum.ToString() + " and " + "[路线编号]=" + lastPoint.route.ToString() + "and " + "[站点编号]=" + lastPoint.currentPoint + " and [生产区号]=" + workLine.ToString();
table = (DataTable)data.Execute(str);
//有路线信息后,再找出当前点位置,默认只会找到一条记录
if (table.Rows.Count > 0)
{
int temp;
//得到当前点的序号
if (!int.TryParse(table.Rows[0]["站点序号"].ToString(), out temp))
return;
//寻找下一序号对应站点
str = @"select * from [路线$] where [AGV编号]=" + agvNum.ToString() + " and " + "[路线编号]=" + lastPoint.route.ToString() + " and " + "[站点序号]=" + (temp + 1).ToString() + " and [生产区号]=" + workLine.ToString();
table = (DataTable)data.Execute(str);
//存在下一站点,默认只会找到一条记录
if (table.Rows.Count > 0)
{
if (!int.TryParse(table.Rows[0]["站点编号"].ToString(), out temp))
return;
lastPoint.nextPoint = temp;
}
//不存在
else
{
lastPoint.nextPoint = 0;
}
}
}
else//否则用通用AGV编号0去查找
{
str = @"select * from [路线$] where [AGV编号]=0" + " and " + "[路线编号]=" + lastPoint.route.ToString() + "and " + "[站点编号]=" + lastPoint.currentPoint + " and [生产区号]=" + workLine.ToString();
table = (DataTable)data.Execute(str);
if (table.Rows.Count > 0)
{
int temp;
//得到当前点的序号
if (!int.TryParse(table.Rows[0]["站点序号"].ToString(), out temp))
return;
//寻找下一序号对应站点
str = @"select * from [路线$] where [AGV编号]=0" + " and " + "[路线编号]=" + lastPoint.route.ToString() + " and " + "[站点序号]=" + (temp + 1).ToString() + " and [生产区号]=" + workLine.ToString();
table = (DataTable)data.Execute(str);
//存在下一站点,默认只会找到一条记录
if (table.Rows.Count > 0)
{
if (!int.TryParse(table.Rows[0]["站点编号"].ToString(), out temp))
return;
lastPoint.nextPoint = temp;
}
//不存在
else
{
lastPoint.nextPoint = 0;
}
}
return;
}
#endregion
}
else
{
lastPoint = currentPoint;
Console.WriteLine(string.Format("检测正常"));
#region 填充lastPoint.nextPoint操作
string str = @"select * from [路线$] where [AGV编号]=" + agvNum.ToString() + " and " + "[路线编号]=" + lastPoint.route.ToString() + " and [生产区号]=" + workLine.ToString();
if (data != null)
table = (DataTable)data.Execute(str);
else
throw new Exception("数据库未实例化");
if (table.Rows.Count > 0)//先判断表中是否有该AGV路线信息,没有再用通用路线
{
str = @"select * from [路线$] where [AGV编号]=" + agvNum.ToString() + " and " + "[路线编号]=" + lastPoint.route.ToString() + "and " + "[站点编号]=" + lastPoint.currentPoint + " and [生产区号]=" + workLine.ToString();
table = (DataTable)data.Execute(str);
//有路线信息后,再找出当前点位置,默认只会找到一条记录
if (table.Rows.Count > 0)
{
int temp;
//得到当前点的序号
if (!int.TryParse(table.Rows[0]["站点序号"].ToString(), out temp))
return;
//寻找下一序号对应站点
str = @"select * from [路线$] where [AGV编号]=" + agvNum.ToString() + " and " + "[路线编号]=" + lastPoint.route.ToString() + " and " + "[站点序号]=" + (temp + 1).ToString() + " and [生产区号]=" + workLine.ToString();
table = (DataTable)data.Execute(str);
//存在下一站点,默认只会找到一条记录
if (table.Rows.Count > 0)
{
if (!int.TryParse(table.Rows[0]["站点编号"].ToString(), out temp))
return;
lastPoint.nextPoint = temp;
}
//不存在
else
{
lastPoint.nextPoint = 0;
}
}
}
else//否则用通用AGV编号0去查找
{
str = @"select * from [路线$] where [AGV编号]=0" + " and " + "[路线编号]=" + lastPoint.route.ToString() + "and " + "[站点编号]=" + lastPoint.currentPoint + " and [生产区号]=" + workLine.ToString();
table = (DataTable)data.Execute(str);
if (table.Rows.Count > 0)
{
int temp;
//得到当前点的序号
if (!int.TryParse(table.Rows[0]["站点序号"].ToString(), out temp))
return;
//寻找下一序号对应站点
str = @"select * from [路线$] where [AGV编号]=0" + " and " + "[路线编号]=" + lastPoint.route.ToString() + " and " + "[站点序号]=" + (temp + 1).ToString() + " and [生产区号]=" + workLine.ToString();
table = (DataTable)data.Execute(str);
//存在下一站点,默认只会找到一条记录
if (table.Rows.Count > 0)
{
if (!int.TryParse(table.Rows[0]["站点编号"].ToString(), out temp))
return;
lastPoint.nextPoint = temp;
}
//不存在
else
{
lastPoint.nextPoint = 0;
}
}
return;
}
#endregion
}
}
Console.ResetColor();
}
}
public class CheckCardSystem
{
public CheckCardSystem()
{
}
public delegate void MissReadEventHandler(object o, MissReadEventArgs e);
public event MissReadEventHandler MissReadEvent;
protected void OnMissReadEvent(object o, MissReadEventArgs e)
{
if (MissReadEvent != null)
{
MissReadEvent(o, e);
}
}
private List unitList = new List();
public List UnitList
{
get { return unitList; }
}
public void Add(CheckCardUnit unit)
{
unitList.Add(unit);
unit.MissReadEvent += new CheckCardUnit.MissReadEventHandler(OnMissReadEvent);
}
public void Remove(CheckCardUnit unit)
{
unit.MissReadEvent -= new CheckCardUnit.MissReadEventHandler(OnMissReadEvent);
unitList.Remove(unit);
}
}
}