MachineMaterialStatusHandler.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using NSoup.Nodes;
  6. using NSoup;
  7. using System.Data;
  8. using DllEapEntity.OFILM;
  9. using Cksoft.Data;
  10. using Cksoft.Data.Repository;
  11. using DllEapDal.OFILM;
  12. using System.Linq;
  13. using DllEapEntity;
  14. using System.Configuration;
  15. using Cksoft.Unity.Log4NetConfig;
  16. namespace MachineMaterialHandler
  17. {
  18. public class MachineMaterialStatusHandler
  19. {
  20. private readonly string dbConnectString = "";
  21. public MachineMaterialStatusHandler()
  22. {
  23. this.dbConnectString = ConfigurationManager.AppSettings["ConnectionString"];
  24. }
  25. /// <summary>
  26. /// 分析单个文件并存入数据库
  27. /// </summary>
  28. /// <param name="mst">未解析的记录</param>
  29. /// <param name="errorinfo">错误信息</param>
  30. /// <returns></returns>
  31. public int AnalyseHtml(MachineMaterialMst mst, ref string errorinfo)
  32. {
  33. try
  34. {
  35. if (!File.Exists(mst.FilePath))
  36. {
  37. errorinfo = "文件不存在";
  38. return -1;
  39. }
  40. FileStream fs = File.OpenRead(mst.FilePath);
  41. var buffer = new byte[fs.Length];
  42. fs.Read(buffer, 0, buffer.Length);
  43. fs.Dispose();
  44. fs.Close();
  45. var htmlStr = Encoding.UTF8.GetString(buffer);
  46. Document htmlDoc = NSoupClient.Parse(htmlStr);
  47. var tblName = "Material Status";
  48. var statusTbl = this.AppendDataTable(htmlDoc, tblName);
  49. var details = statusTbl.ToEntity<MachineMaterialDetail>().ToList();
  50. tblName = "Error Message";
  51. var errMsgTbl = this.AppendDataTable(htmlDoc, tblName);
  52. var errMsgs = errMsgTbl.ToEntity<MaterialErrorMessage>().ToList();
  53. using (IDatabase db = DbFactory.Base(dbConnectString, DatabaseType.MySql))
  54. {
  55. db.BeginTrans();
  56. var sql = $"delete from machinematerialdetail where mstid={mst.Id}";
  57. if (db.ExecuteBySql(sql) < 0)
  58. {
  59. return -1;
  60. }
  61. sql = $"delete from materialerrormessage where mstid={mst.Id}";
  62. if (db.ExecuteBySql(sql) < 0)
  63. {
  64. return -1;
  65. }
  66. if (details != null && details.Count > 0)
  67. {
  68. details.ForEach(item =>
  69. {
  70. item.MstId = mst.Id;
  71. item.MacId = mst.MacId;
  72. item.FDate = mst.FDate;
  73. item.Shift = mst.Shift;
  74. item.Recipe = mst.Recipe;
  75. item.RecTime = DateTime.Now;
  76. item.ModTime = DateTime.Now;
  77. });
  78. var detailDal = new MachineMaterialDetailDal(db);
  79. if (detailDal.InsertTrans(details) < 0)
  80. {
  81. db.Rollback();
  82. errorinfo = "插入数据表[MachineMaterialDetail]失败";
  83. return -1;
  84. }
  85. }
  86. if (errMsgs != null && errMsgs.Count > 0)
  87. {
  88. errMsgs.ForEach(item =>
  89. {
  90. item.MstId = mst.Id;
  91. item.MacId = mst.MacId;
  92. item.FDate = mst.FDate;
  93. item.Shift = mst.Shift;
  94. item.Recipe = mst.Recipe;
  95. item.RecTime = DateTime.Now;
  96. item.ModTime = DateTime.Now;
  97. });
  98. var errMsgDal = new MaterialErrorMessageDal(db);
  99. if (errMsgDal.InsertTrans(errMsgs) < 0)
  100. {
  101. db.Rollback();
  102. errorinfo = "插入数据表[MaterialErrorMessage]失败";
  103. return -1;
  104. }
  105. }
  106. mst.IsAnalysised = 1;
  107. var mstDal = new MachineMaterialMstDal(db);
  108. if (mstDal.Update(mst) < 0)
  109. {
  110. db.Rollback();
  111. errorinfo = "更新MachineMaterialMst失败";
  112. return -1;
  113. }
  114. db.Commit();
  115. }
  116. return 1;
  117. }
  118. catch (Exception ex)
  119. {
  120. errorinfo = ex.Message;
  121. return -1;
  122. }
  123. }
  124. /// <summary>
  125. /// 查询所有未解析的文件进行解析
  126. /// </summary>
  127. public void StartAnalysis()
  128. {
  129. string errorinfo = string.Empty;
  130. IEnumerable<MachineMaterialMst> msts = null;
  131. using (IDatabase db = DbFactory.Base(dbConnectString, DatabaseType.MySql))
  132. {
  133. var mstDal = new MachineMaterialMstDal(db);
  134. msts = mstDal.Get(" and a.IsAnalysised=-1", ref errorinfo);
  135. }
  136. if (msts != null && msts.Count() > 0)
  137. {
  138. foreach (var item in msts)
  139. {
  140. if (AnalyseHtml(item, ref errorinfo) > 0)
  141. {
  142. LogHelper<MacModelProgram>.LogFatal($"文件[{item.FilePath}]解析成功", "文件解析", string.Empty);
  143. }
  144. else
  145. {
  146. LogHelper<MacModelProgram>.LogFatal($"文件[{item.FilePath}]解析失败,原因:{errorinfo}", "文件解析", string.Empty);
  147. }
  148. }
  149. }
  150. }
  151. /// <summary>
  152. /// 将HTML解析成DataTable
  153. /// </summary>
  154. /// <param name="doc">html文档</param>
  155. /// <param name="title">表格名称</param>
  156. /// <returns></returns>
  157. public DataTable AppendDataTable(Document doc, string title)
  158. {
  159. var titles = doc.GetElementsByTag("h4");
  160. Element table = null;
  161. if (titles != null && titles.Count > 0)
  162. {
  163. foreach (var t in titles)
  164. {
  165. if (t.Text() == title)
  166. {
  167. table = t.NextElementSibling;
  168. break;
  169. }
  170. }
  171. }
  172. if (table == null)
  173. return null;
  174. var dataTable = new DataTable(title);
  175. foreach (var item in table.Children)
  176. {
  177. var trs = item.GetElementsByTag("tr");
  178. if (trs != null && trs.Count > 0)
  179. {
  180. for (int j = 0; j < trs.Count; j++)
  181. {
  182. if (j == 0)
  183. {
  184. var headerRow = trs[j];
  185. foreach (var th in headerRow.Children)
  186. {
  187. DataColumn col = new DataColumn();
  188. var colName = th.Text();
  189. if (string.IsNullOrEmpty(colName))
  190. {
  191. colName = "Category";
  192. }
  193. else if (colName.Contains("%"))
  194. {
  195. colName = colName.Replace("%", "");
  196. }
  197. else if (colName == "Total idle time(s)")
  198. {
  199. colName = "TotalIdleTime";
  200. }
  201. //col.ColumnName = string.IsNullOrEmpty(th.Text()) ? "Category" : th.Text();
  202. col.ColumnName = colName;
  203. dataTable.Columns.Add(col);
  204. }
  205. }
  206. else
  207. {
  208. var tBody = trs[j];
  209. DataRow row = dataTable.NewRow();
  210. var colIndex = 0;
  211. foreach (var td in tBody.Children)
  212. {
  213. var value = td.Text();
  214. if (value.Contains("%"))
  215. {
  216. value = value.Replace("%", "");
  217. }
  218. row[colIndex] = value;
  219. colIndex++;
  220. }
  221. dataTable.Rows.Add(row);
  222. }
  223. }
  224. }
  225. }
  226. return dataTable;
  227. }
  228. /// <summary>
  229. /// 将HTML解析成DataTable
  230. /// </summary>
  231. /// <param name="doc">html文档</param>
  232. /// <param name="index">表格所在下标</param>
  233. /// <param name="tblName">datatable名称</param>
  234. /// <returns></returns>
  235. public DataTable AppendDataTable(Document doc, int index, string tblName)
  236. {
  237. var table = doc.GetElementsByTag("table").Eq(index);
  238. var dataTable = new DataTable(tblName);
  239. foreach (var item in table)
  240. {
  241. var trs = item.GetElementsByTag("tr");
  242. if (trs != null && trs.Count > 0)
  243. {
  244. for (int j = 0; j < trs.Count; j++)
  245. {
  246. if (j == 0)
  247. {
  248. var headerRow = trs[j];
  249. foreach (var th in headerRow.Children)
  250. {
  251. DataColumn col = new DataColumn();
  252. col.ColumnName = string.IsNullOrEmpty(th.Text()) ? "Category" : th.Text();
  253. dataTable.Columns.Add(col);
  254. }
  255. }
  256. else
  257. {
  258. var tBody = trs[j];
  259. DataRow row = dataTable.NewRow();
  260. var colIndex = 0;
  261. foreach (var td in tBody.Children)
  262. {
  263. row[colIndex] = td.Text();
  264. colIndex++;
  265. }
  266. dataTable.Rows.Add(row);
  267. }
  268. }
  269. }
  270. }
  271. return dataTable;
  272. }
  273. }
  274. }