using Quartz; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.IO; using System.Linq; using WX.CRM.Common; using WX.CRM.DAL; using WX.CRM.Model.DTO.wework; namespace WeChatServerServices.WeWork { public class WorkGenHtml { //WX.CRM.IBLL.Wx.IWX_MESSAGE bll = new WX.CRM.BLL.Wx.WX_MESSAGE_BL(); WX.CRM.IBLL.Base.IBAS_PARAMETER_Q paraq = new WX.CRM.BLL.Base.BAS_PARAMETER_BL(); WX.CRM.IBLL.Base.IBAS_PARAMETER para = new WX.CRM.BLL.Base.BAS_PARAMETER_BL(); //private readonly object _lockObj = new object(); public void GenHtmlFile() { try { string rootPath = Utility.GetSettingByKey("WeWorkGenChatHtmlRootPath"); //html文件生成的根目录 var tableName = string.Empty; string maxPkidStr = paraq.GetModel_Patameter("WeWorkGenHtmlMaxRecordPkid").PARAVALUE; if (string.IsNullOrEmpty(maxPkidStr)) throw new Exception("没配置WeWorkGenHtmlMaxRecordPkid参数!"); int maxPkid = int.Parse(maxPkidStr); IList waitGenHtmlList = GetWaitMessage(maxPkid); if (waitGenHtmlList == null || !waitGenHtmlList.Any()) return; maxPkid = waitGenHtmlList.Select(p => p.pkid).Max(); #region 写入文本库 普通文本 List vids = waitGenHtmlList.Select(p => p.vid).Distinct().ToList(); foreach (string vid in vids) { var genLis = waitGenHtmlList.Where(p => p.vid == vid).OrderBy(o => o.createTime).ToList(); foreach (var genMessage in genLis) { try { if (genMessage.conversationId != genMessage.sender && genMessage.conversationId != genMessage.receiver)//不等于发送人,也不等于接收人,证明是群消息,不做生成 { continue; } var time = DateTimeTool.GetTimeFromLinuxShortTime(genMessage.createTime); var timeforder = time.ToString("yyyyMM"); var dir = string.Format("{0}/{1}/{2}", rootPath, timeforder, vid); string talker = string.Empty; if (genMessage.vid == genMessage.sender) { talker = genMessage.receiver; } else { talker = genMessage.sender; } var path = string.Format("{0}.json", talker); var content = Utility.ConvertToJSON(genMessage); if (File.Exists(Path.Combine(dir, path))) FileUnit.AppendFile(dir, path, "," + content); else FileUnit.AppendFile(dir, path, content); } catch (Exception e) { LogHelper.Error("出错消息记录【pkid:" + genMessage.pkid + ",id:" + genMessage.id + ",rootPath:" + rootPath + ",receiver:" + genMessage.receiver + ",sender:" + genMessage.sender + "】"); LogHelper.Error(e); } } } #endregion para.Update_ParameterValueByKey("WeWorkGenHtmlMaxRecordPkid", maxPkid.ToString()); } catch (Exception ex) { LogHelper.Error("【WX.CRM.CRMServices.WeiXin.WorkGenHtml.WeGenHtml()】" + ex.ToString()); } } #region 获取待生成消息 private IList GetWaitMessage(int maxPkid) { var tableName = "wework_message"; var sql = "select top 50000 * from " + tableName + " where pkid > @maxPkid order by pkid asc"; var p = new List() { new SqlParameter("@maxPkid", maxPkid) }; var ds = SqlHelper.GetDataSet(SqlHelper.DatabaseType.WeWork, sql, CommandType.Text, p.ToArray()); var list = new List(); if (ds.Tables[0] != null && ds.Tables[0].Rows.Count > 0) { foreach (DataRow dataRow in ds.Tables[0].Rows) { DateTime sendtime = Convert.ToDateTime(dataRow["sendTime"]); var message = new GenWorkMessage { pkid = int.Parse(string.Format("{0}", dataRow["pkid"])), id = string.Format("{0}", dataRow["id"]), appinfo = string.Format("{0}", dataRow["appinfo"]), contentType = int.Parse(string.Format("{0}", dataRow["contentType"])), convType = int.Parse(string.Format("{0}", dataRow["convType"])), content = string.Format("{0}", dataRow["content"]), conversationId = string.Format("{0}", dataRow["conversationId"]), fileMd5 = string.Format("{0}", dataRow["fileMd5"]), receiver = string.Format("{0}", dataRow["receiver"]), sender = string.Format("{0}", dataRow["sender"]), sendername = string.Format("{0}", dataRow["sendername"]), sendTime = sendtime.ToUnityString(6), createTime = long.Parse(string.Format("{0}", dataRow["createTime"])), vid = string.Format("{0}", dataRow["vid"]), url = string.Format("{0}", dataRow["url"]), maxMd5 = string.Format("{0}", dataRow["maxmd5"]), smallMd5 = string.Format("{0}", dataRow["smallMd5"]) }; list.Add(message); } } return list; } #endregion } public class WorkGenHtmlJob : IJob { static bool isRuning = false; public void Execute(JobExecutionContext context) { if (isRuning) return; isRuning = true; try { new WorkGenHtml().GenHtmlFile(); } catch (Exception e) { LogHelper.Error("【WX.CRM.CRMServices.WeiXin.WeWork.WorkGenHtml.Execute()】 " + e); } finally { isRuning = false; } } } }