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.

410 lines
14 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 System.Net.Sockets;
using System.Net;
using System.Threading;
using System.IO;
using System.Drawing;
using ocean;
using Newtonsoft.Json;
namespace demo.DbModule
{
public class ProductArgs
{
public int v { get; set; }
public int t { get; set; }
public TProduct product { get; set; }
public int location { get; set; }
public ProductArgs(TProduct _pro, int _v, int _t, int _location)
{
product = _pro;
v = _v;
t = _t;
location = _location;
}
}
public class BusiData
{
private static object obj;
private static BusiData _instance;
private Socket serverSock;
private bool stop = false;
private Thread receThread;
private Thread receConn;
private Socket clientSock;
private string filename = string.Empty;
private static int count = 0;
List<string> searchPro = new List<string>();
private string dirpath = string.Empty;
public event Action<int, string> PutEventHandle;
public event Action<Color, string> MsgShowHandle;
public event Action<string> RecvDataHandle;
public static BusiData Instance
{
get {
if (_instance == null)
_instance = new BusiData();
return _instance;
}
}
private BusiData()
{
receThread = new Thread(ReceMsg);
receConn = new Thread(ReceConnect);
if (serverSock == null)
serverSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
public void SetKeywords(string words)
{
searchPro.Clear();
words = words.Replace("\r\n"," ").TrimEnd();
string[] keywords = words.Split(new char[] { ' '});
foreach (string key in keywords)
{
searchPro.Add(key);
}
}
public void Init()
{
try
{
dirpath = System.Configuration.ConfigurationManager.AppSettings["Data"];
EndPoint ep = new IPEndPoint(IPAddress.Any, 6666);
serverSock.Bind(ep);
serverSock.Listen(100);
receConn.Start();
receThread.Start();
}
catch (Exception ex)
{
//log
}
}
public void Close()
{
if(clientSock!=null)
{
clientSock.Close();
}
if (serverSock != null)
{
serverSock.Close();
}
stop = true;
receThread.Join();
receConn.Join();
}
private void ReceConnect()
{
try
{
clientSock = serverSock.Accept();
}
catch (Exception)
{
}
}
public void ReceMsg()
{
byte[] receBuffer=new byte[2048];
while (!stop)
{
if (clientSock != null && clientSock.Connected)
{
if(clientSock.Available>0)
{
int len = clientSock.Receive(receBuffer);
if (len > 0)
{
//接收到数据,开始解析
string msg = Encoding.ASCII.GetString(receBuffer, 0, len);
if (RecvDataHandle!=null)
{
RecvDataHandle(msg);
}
ParseData(msg);
}
else
{
stop = true;
}
}
}
Thread.Sleep(100);
}
}
private void ParseData(string data)
{
if (!string.IsNullOrEmpty(data))
{
data = data.TrimEnd(new char[] { ';' });
string[] parameters = data.Split(new char[] { ',' });
string modulename = parameters[0];
switch (modulename)
{
case "select":
Select(parameters);
break;
case "put":
Put(parameters);
break;
case "show":
ShowMsg(parameters);
break;
//case "getproduct":
// GetProduct(parameters);
break;
case "InStock":
InStock(parameters);
break;
default:
break;
}
}
}
private void InStock(string[] parameters)
{
if(parameters!=null&&parameters.Length==4)
{
try
{
TProduct product = new TProduct();
int v = int.Parse(parameters[1]);
int t = int.Parse(parameters[2]);
int index = int.Parse(parameters[3]);
if (Enum.IsDefined(typeof(EMapPos), t))
{
EMapPos estock = (EMapPos)Enum.ToObject(typeof(EMapPos), t);
corework.get_product_by_pos(estock, index, ref product);
//这里分两部分存储
//1、存储到本地数据库
//2、存储到远程服务器上供扫码机查询
//InFileData(product, v, t, index);
InDb(product, v, t, index, false);
string msg = "InStock1,0;";
clientSock.Send(Encoding.ASCII.GetBytes(msg));
}
else
{
string msg = "InStock1,-1;";
clientSock.Send(Encoding.ASCII.GetBytes(msg));
}
}
catch (Exception ex)
{
string msg = "InStock1,-2;";
clientSock.Send(Encoding.ASCII.GetBytes(msg));
log.Err("InStock:" + ex.Message);
}
}
}
public void InFileData(TProduct product, int v, int t, int index)
{
string savedirpath = "d:\\data\\product\\" + DateTime.Now.ToString("yyyyMMdd") + "\\";
if (!Directory.Exists(savedirpath))
{
Directory.CreateDirectory(savedirpath);
}
string savefilepath = Path.Combine(savedirpath, "data.txt");
if (!File.Exists(savefilepath))
{
File.Create(savefilepath);
}
using (Stream stream = File.Open(savefilepath, FileMode.Append))
{
StreamWriter sw = new StreamWriter(stream);
sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ">>> SN:" + product.sn + "吸嘴:" + v + " 料仓:" + t + " 穴位:" + index);
sw.Close();
stream.Close();
}
}
public void InDb(TProduct product, int v, int t, int index, bool remote=false)
{
try
{
string proJson = JsonConvert.SerializeObject(product);
ProductArgs pargs = new ProductArgs(product, v, t, index);
ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
{
try
{
ProductArgs args = (ProductArgs)obj;
string connStr = MySQLHelper.DBConnectionString;
MySQLHelper db = new MySQLHelper(connStr);
if (!string.IsNullOrEmpty(args.product.sn))
{
string insertSql = "insert into productRecords(sn,result,stock,location,vacm,createtime,projson)";
insertSql += " values('{0}','{1}',{2},{3},{4},'{5}','{6}')";
insertSql = string.Format(insertSql, args.product.sn, args.product.status == 1 ? "PASS" : "NG", t, args.location, args.v, DateTime.Now, proJson);
string tempSql = "insert into products(sn,status,createtime,upstatus,trynum,filename,mode)";
tempSql += " values('{0}','{1}','{2}',{3},{4},'{5}','{6}')";
tempSql = string.Format(tempSql, args.product.sn, args.product.status == 1 ? "PASS" : "NG", DateTime.Now, 0, 0, "Summary_" + DateTime.Now.ToString("yyyyMMdd") + ".csv", corework.getTestModel());
string waitdeal = "insert into waitdeal(SN,DXDJudge,DXDInspectionTime,DXDUpdateTime) values('{0}',{1},'{2}','{3}')";
waitdeal = string.Format(waitdeal, args.product.sn, args.product.status, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
insertSql = insertSql + ";" + tempSql + ";" + waitdeal;
int num = db.ExecuteNonQuery(insertSql);
}
}
catch (Exception ex)
{
log.Err("InDb:"+ex.Message+ex.StackTrace);
}
}), pargs);
}
catch (Exception ex)
{
log.Err("InDb" + ex.Message);
}
}
#region 挑料逻辑
/// <summary>
/// 挑料逻辑
/// </summary>
/// <param name="parameters"></param>
private void Select(string[] parameters)
{
try
{
string index = parameters[1];
string sn = parameters[2];
if (index == "1")
{
count++;
//如果是新的料盘,则创建一个新的文件存储料盘的产品信息
if (Directory.Exists(dirpath))
{
Directory.CreateDirectory(dirpath);
}
filename = DateTime.Now.ToString("yyyy-MM-dd") + "-" + count + ".csv";
}
int row, col = 0;
CalcRowCol(int.Parse(index), out row, out col);
string content = string.Format("{0},{1},{2}\r\n", index, row + "_" + col, sn);
File.AppendAllText(Path.Combine(dirpath, filename), content);
int result = 0;
if (searchPro.Contains(sn))
{
result = 1;
searchPro.Remove(sn);
}
if (clientSock != null && clientSock.Connected)
{
string tomsg = "select{0},{1};";
tomsg = string.Format(tomsg, result, searchPro.Count == 0 ? 1 : 0);
clientSock.Send(Encoding.ASCII.GetBytes(tomsg));
}
}
catch (Exception ex)
{
log.Err("BusiData-Select:" + ex.Message);
}
}
#endregion
#region 放料逻辑
/// <summary>
/// 放料逻辑
/// </summary>
/// <param name="parameters"></param>
private void Put(string[] parameters)
{
try
{
int index = Convert.ToInt32(parameters[1]);
string sn = parameters[2];
if (PutEventHandle != null)
{
PutEventHandle(index, sn);
}
}
catch (Exception ex)
{
throw;
}
}
#endregion
private void ShowMsg(string[] parameters)
{
try
{
string color = parameters[1];
string msg = parameters[2];
if (MsgShowHandle != null)
{
//Color c = Color.FromName(color);
MsgShowHandle(Color.LimeGreen, msg);
}
}
catch (Exception)
{
//log
}
}
private void GetProduct(string[] parameters)
{
try
{
int index = Convert.ToInt32(parameters[1]);
TProduct productInfo = new TProduct();
corework.get_product_by_pos(EMapPos.LocationVacm, index, ref productInfo);
if (!string.IsNullOrEmpty(productInfo.sn))
{
string insertSql = "insert into products(sn,status,createtime,upstatus,trynum,filename,mode)";
insertSql += " values('{0}','{1}','{2}',{3},{4},'{5}','{6}')";
insertSql = string.Format(insertSql, productInfo.sn, productInfo.status == 1 ? "PASS" : "NG", DateTime.Now, 0, 0, "Summary_" + DateTime.Now.ToString("yyyyMMdd") + ".csv",corework.getTestModel());
int num = MySQLHelper.ExecuteNonQuery(MySQLHelper.DBConnectionString, insertSql);
}
}
catch (Exception ex)
{
//log
}
}
private void CalcRowCol(int index, out int _row, out int _col)
{
_row = _col = 0;
if (index % 16 == 0)
{
_row = index / 16;
_col = 16;
}
else
{
_row = (index / 16) + 1;
_col = index % 16;
}
}
}
}