using Cksoft.Data; using Cksoft.Unity; using DllEapEntity; using DllEapEntity.Rms; using DllHsms; using DllHsmsWeb; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using ZipFileHelper; namespace DllEapDal { public class LogDal { private IDatabase CurrDb = null; public LogDal(IDatabase db) { CurrDb = db; } public List ReadLog(Machine mac, DateTime starttime, DateTime endtime, ref string errorinfo) { try { string logfile = $"{mac.ID}_{mac.FCode}.log";//日志文件名称 DateTime startdate = DateTime.Parse(starttime.ToString("yyyy-MM-dd")); DateTime enddate = DateTime.Parse(endtime.ToString("yyyy-MM-dd")); string logdir = AppConfigurtaionServices.Configuration["FileDir"]; List log = new List(); DirectoryInfo dirs = new DirectoryInfo(logdir); //获取事件范围目录 List logdirs = dirs.GetDirectories().Where(t => { DateTime currdate = DateTime.Parse($"{t.Name.Substring(3, 4)}-{t.Name.Substring(7, 2)}-{t.Name.Substring(9, 2)}"); return currdate >= startdate && currdate <= enddate; } ).OrderBy(t => t.Name).ToList(); //log.Add("测试1"); //log.Add(logdirs.Count.ToString()); if (logdirs.Count <= 0) return log; List templist = null; //遍历目录文件,取对应的机台日志 foreach (DirectoryInfo item in logdirs) { //log.Add(item.FullName); //log.Add(logfile); List files = item.GetFiles().Where(t => t.Name == logfile).ToList(); if (files.Count <= 0) continue; templist = ReadLog(files[0], starttime, endtime, ref errorinfo); if (templist == null) return null; log.AddRange(templist); } //log.Add("测试2"); return log; } catch (Exception ex) { errorinfo = ex.Message.ToString(); return null; } } private DateTime GetOperatorTime(string str) { string[] strs = str.Split(':'); strs = strs[1].Split(' '); return DateTime.Parse(strs[0] + " " + strs[1]); } /// /// 从指定的文件中按时间范围取日志 /// /// /// /// /// /// public List ReadLog(FileInfo file, DateTime starttime, DateTime endtime, ref string errorinfo) { try { //将文件读取到链表 StreamReader sr = new StreamReader(file.FullName, Encoding.UTF8); List files = new List(); string tempstr = sr.ReadLine(); bool isstart = false; DateTime operatortime = DateTime.Now; while (tempstr != null) { //还没开始且不是时间标记,则直接读下行 if (!isstart && !tempstr.Contains("发生时间")) { tempstr = sr.ReadLine(); continue; } //还没开始且是时间标记,则要判断时间是否大于开始时间,如果小于开始时间则直接读下行 if (!isstart && tempstr.Contains("发生时间")) { operatortime = GetOperatorTime(tempstr); if (operatortime > endtime)//操作时间大于结束时间,则直接结束 break; if (operatortime >= starttime) { isstart = true; files.Add(tempstr); } tempstr = sr.ReadLine(); continue; } if (isstart && !tempstr.Contains("发生时间")) { files.Add(tempstr); tempstr = sr.ReadLine(); continue; } if (isstart && tempstr.Contains("发生时间")) { operatortime = GetOperatorTime(tempstr); if (operatortime > endtime)//操作时间大于结束时间,则直接结束 break; files.Add(tempstr); tempstr = sr.ReadLine(); continue; } } sr.Close(); return files; } catch (Exception ex) { errorinfo = ex.Message.ToString(); return null; } } public List ReadBusinessLog(Machine mac, DateTime starttime, DateTime endtime, ref string errorinfo) { try { string logfile = $"{mac.FCode}.log";//日志文件名称 DateTime startdate = DateTime.Parse(starttime.ToString("yyyy-MM-dd")); DateTime enddate = DateTime.Parse(endtime.ToString("yyyy-MM-dd")); string logdir = AppConfigurtaionServices.Configuration["BusinessLogDir"]; List log = new List(); DirectoryInfo dirs = new DirectoryInfo(logdir); //获取事件范围目录 List logdirs = dirs.GetDirectories().Where(t => { DateTime currdate = DateTime.Parse($"{t.Name.Substring(3, 4)}-{t.Name.Substring(7, 2)}-{t.Name.Substring(9, 2)}"); return currdate >= startdate && currdate <= enddate; } ).OrderBy(t => t.Name).ToList(); if (logdirs.Count <= 0) return log; List templist = null; //遍历目录文件,取对应的机台日志 foreach (DirectoryInfo item in logdirs) { List files = item.GetFiles().Where(t => t.Name == logfile).ToList(); if (files.Count <= 0) continue; templist = ReadLog(files[0], starttime, endtime, ref errorinfo); if (templist == null) return null; log.AddRange(templist); } return log; } catch (Exception ex) { errorinfo = ex.Message.ToString(); return null; } } /// /// 获取列表 /// /// /// /// /// /// /// public IEnumerable GetLogList(int start, int length, string filter, string sort, string order, ref string errorinfo) { var list = CurrDb.FindListForCondition($" {filter} order by {sort} {order} limit {start - 1},{length}", ref errorinfo); return list; } /// /// 获取邮件配置总的记录数 /// /// /// public int GetLogCount(string filter) { string sql = new Log().GetSelectSql(); sql = $"select count(1) from ({sql} where 1=1 {filter}) t"; return Convert.ToInt32(CurrDb.FindList(sql).FirstOrDefault() ?? "0"); } public Log Get(int id) { return CurrDb.FindEntityFor(id); } public int Insert(Log log, string userCode) { return CurrDb.InsertFor(log, userCode); } public List ReadLogList(string maccode, string starttime, string endtime, ref string errorinfo) { try { //string macode = "DA00012"; //string starttime = "2020-11-11 02:50:04.629"; //string endtime = "2020-11-11 03:50:04.629"; int spinday = Convert.ToDateTime(endtime).Subtract(Convert.ToDateTime(starttime)).Duration().Days; string url = AppConfigurtaionServices.Configuration["FileDir"] + @"\";// @"D:\log\"; var model = CurrDb.FindListForCondition($" AND a.FCode='{maccode}'", ref errorinfo).FirstOrDefault(); if (model == null) { errorinfo = "未找到机台号!!"; return null; } int macid = model.ID; DateTime st = Convert.ToDateTime(starttime); List vs = new List();//文件url List logs = new List();//log内容 string urlall = string.Empty; for (int i = 0; i <= spinday; i++) { urlall = url + st.ToString("yyyy-MM-dd") + @"\" + maccode + "_" + macid.ToString() + ".log"; vs.Add(urlall); st = st.AddDays(1); } foreach (var item in vs) { if (System.IO.File.Exists(item)) { string str1 = File.ReadAllText(item); string[] ss = str1.Split(new string[] { "\r\n\r\n" }, StringSplitOptions.None);//3614 var ll = ss.Where(l => Convert.ToDateTime(l.Split(':')[1].Substring(0, 19)) > Convert.ToDateTime(starttime) && Convert.ToDateTime(l.Split(':')[1].Substring(0, 19)) < Convert.ToDateTime(endtime)); foreach (string item1 in ll) { //Console.WriteLine(item1); logs.Add(item1.Replace("<", "<").Replace(">", ">") .Replace("\r\n", "
").Replace(" ", " ")); } } } return logs; } catch (IOException e) { return null; } } } }