using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using NSoup.Nodes;
using NSoup;
using System.Data;
using DllEapEntity.OFILM;
using Cksoft.Data;
using Cksoft.Data.Repository;
using DllEapDal.OFILM;
using System.Linq;
using DllEapEntity;
using System.Configuration;
using Cksoft.Unity.Log4NetConfig;
namespace MachineMaterialHandler
{
public class MachineMaterialStatusHandler
{
private readonly string dbConnectString = "";
public MachineMaterialStatusHandler()
{
this.dbConnectString = ConfigurationManager.AppSettings["ConnectionString"];
}
///
/// 分析单个文件并存入数据库
///
/// 未解析的记录
/// 错误信息
///
public int AnalyseHtml(MachineMaterialMst mst, ref string errorinfo)
{
try
{
if (!File.Exists(mst.FilePath))
{
errorinfo = "文件不存在";
return -1;
}
FileStream fs = File.OpenRead(mst.FilePath);
var buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
fs.Dispose();
fs.Close();
var htmlStr = Encoding.UTF8.GetString(buffer);
Document htmlDoc = NSoupClient.Parse(htmlStr);
var tblName = "Material Status";
var statusTbl = this.AppendDataTable(htmlDoc, tblName);
var details = statusTbl.ToEntity().ToList();
tblName = "Error Message";
var errMsgTbl = this.AppendDataTable(htmlDoc, tblName);
var errMsgs = errMsgTbl.ToEntity().ToList();
using (IDatabase db = DbFactory.Base(dbConnectString, DatabaseType.MySql))
{
db.BeginTrans();
var sql = $"delete from machinematerialdetail where mstid={mst.Id}";
if (db.ExecuteBySql(sql) < 0)
{
return -1;
}
sql = $"delete from materialerrormessage where mstid={mst.Id}";
if (db.ExecuteBySql(sql) < 0)
{
return -1;
}
if (details != null && details.Count > 0)
{
details.ForEach(item =>
{
item.MstId = mst.Id;
item.MacId = mst.MacId;
item.FDate = mst.FDate;
item.Shift = mst.Shift;
item.Recipe = mst.Recipe;
item.RecTime = DateTime.Now;
item.ModTime = DateTime.Now;
});
var detailDal = new MachineMaterialDetailDal(db);
if (detailDal.InsertTrans(details) < 0)
{
db.Rollback();
errorinfo = "插入数据表[MachineMaterialDetail]失败";
return -1;
}
}
if (errMsgs != null && errMsgs.Count > 0)
{
errMsgs.ForEach(item =>
{
item.MstId = mst.Id;
item.MacId = mst.MacId;
item.FDate = mst.FDate;
item.Shift = mst.Shift;
item.Recipe = mst.Recipe;
item.RecTime = DateTime.Now;
item.ModTime = DateTime.Now;
});
var errMsgDal = new MaterialErrorMessageDal(db);
if (errMsgDal.InsertTrans(errMsgs) < 0)
{
db.Rollback();
errorinfo = "插入数据表[MaterialErrorMessage]失败";
return -1;
}
}
mst.IsAnalysised = 1;
var mstDal = new MachineMaterialMstDal(db);
if (mstDal.Update(mst) < 0)
{
db.Rollback();
errorinfo = "更新MachineMaterialMst失败";
return -1;
}
db.Commit();
}
return 1;
}
catch (Exception ex)
{
errorinfo = ex.Message;
return -1;
}
}
///
/// 查询所有未解析的文件进行解析
///
public void StartAnalysis()
{
string errorinfo = string.Empty;
IEnumerable msts = null;
using (IDatabase db = DbFactory.Base(dbConnectString, DatabaseType.MySql))
{
var mstDal = new MachineMaterialMstDal(db);
msts = mstDal.Get(" and a.IsAnalysised=-1", ref errorinfo);
}
if (msts != null && msts.Count() > 0)
{
foreach (var item in msts)
{
if (AnalyseHtml(item, ref errorinfo) > 0)
{
LogHelper.LogFatal($"文件[{item.FilePath}]解析成功", "文件解析", string.Empty);
}
else
{
LogHelper.LogFatal($"文件[{item.FilePath}]解析失败,原因:{errorinfo}", "文件解析", string.Empty);
}
}
}
}
///
/// 将HTML解析成DataTable
///
/// html文档
/// 表格名称
///
public DataTable AppendDataTable(Document doc, string title)
{
var titles = doc.GetElementsByTag("h4");
Element table = null;
if (titles != null && titles.Count > 0)
{
foreach (var t in titles)
{
if (t.Text() == title)
{
table = t.NextElementSibling;
break;
}
}
}
if (table == null)
return null;
var dataTable = new DataTable(title);
foreach (var item in table.Children)
{
var trs = item.GetElementsByTag("tr");
if (trs != null && trs.Count > 0)
{
for (int j = 0; j < trs.Count; j++)
{
if (j == 0)
{
var headerRow = trs[j];
foreach (var th in headerRow.Children)
{
DataColumn col = new DataColumn();
var colName = th.Text();
if (string.IsNullOrEmpty(colName))
{
colName = "Category";
}
else if (colName.Contains("%"))
{
colName = colName.Replace("%", "");
}
else if (colName == "Total idle time(s)")
{
colName = "TotalIdleTime";
}
//col.ColumnName = string.IsNullOrEmpty(th.Text()) ? "Category" : th.Text();
col.ColumnName = colName;
dataTable.Columns.Add(col);
}
}
else
{
var tBody = trs[j];
DataRow row = dataTable.NewRow();
var colIndex = 0;
foreach (var td in tBody.Children)
{
var value = td.Text();
if (value.Contains("%"))
{
value = value.Replace("%", "");
}
row[colIndex] = value;
colIndex++;
}
dataTable.Rows.Add(row);
}
}
}
}
return dataTable;
}
///
/// 将HTML解析成DataTable
///
/// html文档
/// 表格所在下标
/// datatable名称
///
public DataTable AppendDataTable(Document doc, int index, string tblName)
{
var table = doc.GetElementsByTag("table").Eq(index);
var dataTable = new DataTable(tblName);
foreach (var item in table)
{
var trs = item.GetElementsByTag("tr");
if (trs != null && trs.Count > 0)
{
for (int j = 0; j < trs.Count; j++)
{
if (j == 0)
{
var headerRow = trs[j];
foreach (var th in headerRow.Children)
{
DataColumn col = new DataColumn();
col.ColumnName = string.IsNullOrEmpty(th.Text()) ? "Category" : th.Text();
dataTable.Columns.Add(col);
}
}
else
{
var tBody = trs[j];
DataRow row = dataTable.NewRow();
var colIndex = 0;
foreach (var td in tBody.Children)
{
row[colIndex] = td.Text();
colIndex++;
}
dataTable.Rows.Add(row);
}
}
}
}
return dataTable;
}
}
}