using System; using System.Collections.Generic; using System.Data; using System.Data.Entity; using System.Data.OracleClient; using System.IO; using System.Linq; using System.Net; using System.Security.Cryptography; using System.Text; using WX.CRM.Common; using WX.CRM.Model.EntitySync; namespace WX.CRM.DataSynFactory.BLL { public class SYNC_RECEIVE_BL { public List GetList(int topNum) { using (var db = new Entities()) { var list1 = db.SYNC_RECEIVE.Where(p => p.ISBATCH == 0).OrderBy(p => p.GRADE).ThenBy(x => x.PKID).Take(topNum).ToList(); var list2 = db.SYNC_RECEIVE.Where(p => p.ISBATCH == 1).OrderBy(p => p.GRADE).ThenBy(x => x.PKID).Take(20).ToList(); //var lis = db.SYNC_RECEIVE.OrderBy(p => p.PKID).Take(topNum).ToList(); list1.AddRange(list2); return list1; } } //取非优先级 public List GetList(int topNum, string[] businessTypes) { using (var db = new Entities()) { //去除 优先 var lis = db.SYNC_RECEIVE.Where(s => !businessTypes.Contains(s.BIDATATYPE)).OrderBy(p => p.PKID).Take(topNum).ToList(); return lis; } } //去优先级 public List GetYXList(int topNum, string[] businessTypes) { using (var db = new Entities()) { var lis = db.SYNC_RECEIVE.Where(s => businessTypes.Contains(s.BIDATATYPE)).OrderBy(p => p.PKID).Take(topNum).ToList(); return lis; } } public void ReceiveSucc(SYNC_RECEIVE info) { if (info == null) return; LogHelper.Info("ReceiveSucc开始录入信息:" + info.PKID); using (var db = new Entities()) { var o = db.SYNC_RECEIVE.FirstOrDefault(p => p.PKID == info.PKID); if (o == null) return; info.JSONTEXT = LogHelper.encryPhone(info.JSONTEXT); var suc = new SYNC_RECEIVE_SUCC { PKID = info.PKID, PICI = info.PICI, JSONTEXT = info.ISBATCH == 0 ? info.JSONTEXT : "", FILENAME = info.FILENAME, ISBATCH = info.ISBATCH, CTIME = info.CTIME, SENDTIME = DateTime.Now, DEPTCODE = info.DEPTCODE, BIDATATYPE = info.BIDATATYPE, CANREPEATNUM = info.CANREPEATNUM }; db.SYNC_RECEIVE_SUCC.Add(suc); db.SYNC_RECEIVE.Remove(db.SYNC_RECEIVE.FirstOrDefault(p => p.PKID == info.PKID)); db.SaveChanges(); } } /* public void ReceiveSucc(SYNC_RECEIVE info) { if (info == null) return; OracleConnection conn = new OracleConnection(OracleHelper.AYCRMConn); if (conn.State == ConnectionState.Closed) conn.Open(); LogHelper.Info("ReceiveSucc开始录入信息:" + info.PKID); try { using (OracleTransaction trans = conn.BeginTransaction()) { String strSql = @"INSERT INTO WSKUSER.SYNC_RECEIVE_SUCC A (A.PKID, A.PICI, A.JSONTEXT, A.FILENAME, A.ISBATCH, A.CTIME, A.SENDTIME, A.BIDATATYPE, A.DEPTCODE, A.CANREPEATNUM) VALUES (:PKID, :PICI, :JSONTEXT, :FILENAME, :ISBATCH, :CTIME, :SENDTIME, :BIDATATYPE, :DEPTCODE, :CANREPEATNUM)"; var pkid = SEQUENCES_BL.Seq_base_get(); OracleParameter[] cmdParms = { new OracleParameter(){ ParameterName = ":PKID", OracleType = OracleType.Number, Value = pkid}, new OracleParameter(){ ParameterName = ":PICI", OracleType = OracleType.Number, Value = info.PICI}, new OracleParameter(){ ParameterName = ":JSONTEXT", OracleType = OracleType.Clob, Value = info.ISBATCH == 0 ? info.JSONTEXT : "" }, new OracleParameter(){ ParameterName = ":FILENAME", OracleType = OracleType.VarChar, Value = info.FILENAME}, new OracleParameter(){ ParameterName = ":ISBATCH", OracleType = OracleType.Number, Value = info.ISBATCH}, new OracleParameter(){ ParameterName = ":CTIME", OracleType = OracleType.DateTime, Value = info.CTIME }, new OracleParameter(){ ParameterName = ":SENDTIME", OracleType = OracleType.DateTime, Value = DateTime.Now}, new OracleParameter(){ ParameterName = ":BIDATATYPE", OracleType = OracleType.VarChar, Value = info.BIDATATYPE}, new OracleParameter(){ ParameterName = ":DEPTCODE", OracleType = OracleType.VarChar, Value = info.DEPTCODE }, new OracleParameter(){ ParameterName = ":CANREPEATNUM", OracleType = OracleType.Number, Value = info.CANREPEATNUM}, }; ExecuteSqlCommand(conn, trans, strSql, cmdParms); string strDelete = $" delete from wskuser.sync_receive a where a.pkid='{info.PKID}' "; ExecuteSqlCommand(conn, trans, strDelete); trans.Commit(); } } catch (Exception ex) { LogHelper.Error(string.Concat("【录入数据】ReceiveSucc(),入参:", info.ToJson(), ex.Message, ex.StackTrace)); } finally { conn.Close(); } }*/ /* public void ReceiveError(SYNC_RECEIVE info, string errstr) { LogHelper.Info("开始录入错误信息:" + info.PKID); if (info == null) return; OracleConnection conn = new OracleConnection(OracleHelper.AYCRMConn); if (conn.State == ConnectionState.Closed) conn.Open(); try { using (OracleTransaction trans = conn.BeginTransaction()) { String strSql = @" INSERT INTO WSKUSER.SYNC_RECEIVE_ERR A (A.PKID, A.PICI, A.JSONTEXT, A.FILENAME, A.ISBATCH, A.CTIME, A.SENDTIME, A.BIDATATYPE, A.DEPTCODE, A.CANREPEATNUM, A.ERRMSG) VALUES (:PKID, :PICI, :JSONTEXT, :FILENAME, :ISBATCH, :CTIME, :SENDTIME, :BIDATATYPE, :DEPTCODE, :CANREPEATNUM, :ERRMSG)"; var pkid = SEQUENCES_BL.Seq_base_get(); OracleParameter[] cmdParms = { new OracleParameter(){ ParameterName = ":PKID", OracleType = OracleType.Number, Value = pkid}, new OracleParameter(){ ParameterName = ":PICI", OracleType = OracleType.Number, Value = info.PICI}, new OracleParameter(){ ParameterName = ":JSONTEXT", OracleType = OracleType.Clob, Value = info.ISBATCH == 0 ? info.JSONTEXT : "",}, new OracleParameter(){ ParameterName = ":FILENAME", OracleType = OracleType.VarChar, Value = info.FILENAME}, new OracleParameter(){ ParameterName = ":ISBATCH", OracleType = OracleType.Number, Value = info.ISBATCH}, new OracleParameter(){ ParameterName = ":CTIME", OracleType = OracleType.DateTime, Value = info.CTIME }, new OracleParameter(){ ParameterName = ":SENDTIME", OracleType = OracleType.DateTime, Value = System.DateTime.Now}, new OracleParameter(){ ParameterName = ":BIDATATYPE", OracleType = OracleType.VarChar, Value = info.BIDATATYPE}, new OracleParameter(){ ParameterName = ":DEPTCODE", OracleType = OracleType.VarChar, Value = info.DEPTCODE }, new OracleParameter(){ ParameterName = ":CANREPEATNUM", OracleType = OracleType.Number, Value = info.CANREPEATNUM}, new OracleParameter(){ ParameterName = ":ERRMSG", OracleType = OracleType.VarChar, Value = errstr} }; ExecuteSqlCommand(conn, trans, strSql, cmdParms); string strDelete = $" delete from wskuser.sync_receive a where a.pkid='{info.PKID}' "; ExecuteSqlCommand(conn, trans, strDelete); trans.Commit(); } } catch (Exception ex) { LogHelper.Error("ReceiveError的入参:" + info.ToJson() + ";异常是:" + ex.ToString()); } finally { conn.Close(); } }*/ /// /// 执行数据库语句操作 /// /// /// /// /// private static void ExecuteSqlCommand(OracleConnection conn, OracleTransaction trans, string cmdText, OracleParameter[] cmdParms = null) { try { OracleCommand mycmd = new OracleCommand(cmdText); mycmd.Connection = conn; if (trans != null) mycmd.Transaction = trans; mycmd.CommandType = CommandType.Text; if (cmdParms != null) { foreach (OracleParameter parameter in cmdParms) { if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && (parameter.Value == null)) { parameter.Value = DBNull.Value; } mycmd.Parameters.Add(parameter); } } mycmd.ExecuteNonQuery(); } catch { throw; } } /// /// 处理异常信息,错误超过10次的,进行钉钉通知,数据录入到err表 /// /// public void ReceiveException(SYNC_RECEIVE info) { LogHelper.Info("ReceiveException开始处理异常信息:" + info.PKID); try { var clientType = Utility.GetSettingOrNullByKey("ClientType"); if (!string.IsNullOrWhiteSpace(clientType) && clientType == "CRM") { WX.CRM.BLL.Util.CACHE_BL cache_BL = new WX.CRM.BLL.Util.CACHE_BL(); string biDataTypeLevel = cache_BL.GetValue_Parameter(Model.Enum.Parameter.BIDataTypeLevel); if (info != null && !string.IsNullOrWhiteSpace(biDataTypeLevel)) { int count = info.CANREPEATNUM.HasValue ? (int)info.CANREPEATNUM : 0; var biDataTypeLevelDto = Utility.ToObject(biDataTypeLevel); var now = DateTime.Now; var isNotice = false; //对应时间范围内,将错误信息通知到钉钉 if (!string.IsNullOrWhiteSpace(biDataTypeLevelDto.NoticeStartTime) && !string.IsNullOrWhiteSpace(biDataTypeLevelDto.NoticeEndTime)) { DateTime.TryParse($"{now.Date.ToString("yyyy-MM-dd")} {biDataTypeLevelDto.NoticeStartTime}", out DateTime startTime); DateTime.TryParse($"{now.Date.ToString("yyyy-MM-dd")} {biDataTypeLevelDto.NoticeEndTime}", out DateTime endTime); if (now >= startTime && now <= endTime) isNotice = true; } if (count >= biDataTypeLevelDto.Limit) { var item = biDataTypeLevelDto.Items.FirstOrDefault(x => x.BIDataType == info.BIDATATYPE); if (item != null && item.IsNotice) { if (isNotice && (!info.NOTICETIME.HasValue || now >= info.NOTICETIME.Value.AddMinutes(biDataTypeLevelDto.Duration))) { string message = $"{DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")} 服务异常通知信息:主键ID:{info.PKID}, 事业部编码:{info.DEPTCODE}, 数据类型:{info.BIDATATYPE}"; dingtalk(biDataTypeLevelDto.EMSecretkey, biDataTypeLevelDto.EMPostUrl, message); using (var db = new Entities()) { var o = db.SYNC_RECEIVE.FirstOrDefault(p => p.PKID == info.PKID); if (o != null) { o.NOTICETIME = DateTime.Now; db.SaveChanges(); } } } } else { ReceiveError(info, "Abnormal service information"); } } else { using (var db = new Entities()) { var o = db.SYNC_RECEIVE.FirstOrDefault(p => p.PKID == info.PKID); if (o != null) { var errNum = o.CANREPEATNUM == null ? 1 : o.CANREPEATNUM + 1; o.CANREPEATNUM = errNum; db.SaveChanges(); } } } } } else { if (info.CANREPEATNUM > 10) { ReceiveError(info, "Abnormal service information"); } else { using (var db = new Entities()) { var o = db.SYNC_RECEIVE.FirstOrDefault(p => p.PKID == info.PKID); if (o != null) { var errNum = o.CANREPEATNUM == null ? 1 : o.CANREPEATNUM + 1; o.CANREPEATNUM = errNum; db.SaveChanges(); } } } } } catch (Exception ex) { LogHelper.Error("ReceiveException的入参:" + info.ToJson() + ";异常是:" + ex.ToString()); } } public void ReceiveError(SYNC_RECEIVE info, string errstr) { if (info == null) return; try { using (var db = new Entities()) { var o = db.SYNC_RECEIVE.FirstOrDefault(p => p.PKID == info.PKID); if (o == null) return; var err = new SYNC_RECEIVE_ERR { PKID = info.PKID, PICI = info.PICI, JSONTEXT = info.ISBATCH == 0 ? info.JSONTEXT : "", FILENAME = info.FILENAME, ISBATCH = info.ISBATCH, CTIME = info.CTIME, SENDTIME = System.DateTime.Now, ERRMSG = errstr, DEPTCODE = info.DEPTCODE, BIDATATYPE = info.BIDATATYPE }; db.SYNC_RECEIVE_ERR.Add(err); db.SYNC_RECEIVE.Remove(db.SYNC_RECEIVE.FirstOrDefault(p => p.PKID == info.PKID)); db.SaveChanges(); } } catch (Exception ex) { LogHelper.Error("ReceiveError:" + ex.ToString()); } } /// /// 返回一个dataset /// /// /// /// /// /// public static DataSet DataQueray(string connectionstring, CommandType cmdType, string cmdText, params OracleParameter[] commandParameters) { OracleConnection con = new OracleConnection(connectionstring); OracleCommand cmd = new OracleCommand(cmdText, con); try { cmd.CommandType = cmdType; cmd.Parameters.AddRange(commandParameters); OracleDataAdapter da = new OracleDataAdapter(cmd); DataSet ds = new DataSet(); da.Fill(ds); cmd.Parameters.Clear(); return ds; } finally { if (con.State == ConnectionState.Open) con.Close(); } } //钉钉通知 private static void dingtalk(string secretkey, string postUrl, string content) { try { var timeStamp = getTimeStamp(); var sign = getSign(timeStamp, secretkey); var dingtalk = $"{postUrl}×tamp={timeStamp}&sign={sign}"; var postBody = "{\"at\": {\"atMobiles\":[\"15710171652\"],\"atUserIds\":[],\"isAtAll\": false},\"text\": { \"content\":\"" + content + "\"},\"msgtype\":\"text\"}"; var res = PostAjaxData(dingtalk, postBody, Encoding.UTF8); } catch (Exception ex) { LogHelper.Error(string.Concat("【钉钉通知】dingtalk(),:content", content, ex.Message, ex.StackTrace)); } } private static string PostAjaxData(string url, string param, Encoding encoding) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/json;charet=utf-8"; request.Headers.Add("dataType", "json"); request.Headers.Add("type", "post"); byte[] data = encoding.GetBytes(param); using (BinaryWriter reqStream = new BinaryWriter(request.GetRequestStream())) { reqStream.Write(data, 0, data.Length); } using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { StreamReader reader = new StreamReader(response.GetResponseStream(), encoding); string result = reader.ReadToEnd(); return result; } } private static string getSign(string timeStamp, string secret) { string stringToSign = timeStamp + "\n" + secret; var encoding = new System.Text.ASCIIEncoding(); byte[] keyByte = encoding.GetBytes(secret); byte[] messageBytes = encoding.GetBytes(stringToSign); using (var hmacsha256 = new HMACSHA256(keyByte)) { byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); return System.Web.HttpUtility.UrlEncode(Convert.ToBase64String(hashmessage), Encoding.UTF8); } } private static string getTimeStamp() { TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0); long shijianchuo = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000); return shijianchuo.ToString(); } } }