using System; using System.Collections.Generic; using System.Data; 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.PKID).Take(topNum).ToList(); var list2 = db.SYNC_RECEIVE.Where(p => p.ISBATCH == 1).OrderBy(p => p.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; 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)"; OracleParameter[] cmdParms = { new OracleParameter(){ ParameterName = ":PKID", OracleType = OracleType.Number, Value = info.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)"; OracleParameter[] cmdParms = { new OracleParameter(){ ParameterName = ":PKID", OracleType = OracleType.Number, Value = info.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); WX.CRM.BLL.Util.CACHE_BL cache_BL = new WX.CRM.BLL.Util.CACHE_BL(); try { string sql = "select a.canrepeatnum from wskuser.sync_receive a where a.pkid=:pkid"; List param = new List() { new OracleParameter() { ParameterName = ":pkid", OracleType = OracleType.Number, Value = info.PKID } }; DataTable tab = DataQueray(OracleHelper.AYCRMConn, CommandType.Text, sql, param.ToArray()).Tables[0]; if (tab?.Rows.Count > 0) { int count = 0; int.TryParse(tab.Rows[0]["canrepeatnum"].ToString(), out count); if (count >= 10) { string biDataType = cache_BL.GetValue_Parameter(DingDingGroupName.EMBiDataType.ToString()); if (!string.IsNullOrEmpty(biDataType)) { List biDataTypes = biDataType.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList(); if (biDataTypes.Count > 0) { if (biDataTypes.Contains(info.BIDATATYPE)) { string secretkey = cache_BL.GetValue_Parameter(DingDingGroupName.EMSecretkey.ToString()); string postUrl = cache_BL.GetValue_Parameter(DingDingGroupName.EMPostUrl.ToString()); string message = $"{DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")} 服务异常通知信息:PKID:{info.PKID}, DEPTCODE:{info.DEPTCODE}, BIDATATYPE:{info.BIDATATYPE}"; dingtalk(secretkey, postUrl, message); } } } ReceiveError(info, "Abnormal service information"); } else { OracleConnection conn = new OracleConnection(OracleHelper.AYCRMConn); if (conn.State == ConnectionState.Closed) conn.Open(); try { string strDelete = $" update wskuser.sync_receive a set a.canrepeatnum=nvl(a.canrepeatnum,0)+1 where a.pkid='{info.PKID}' "; ExecuteSqlCommand(conn, null, strDelete); } finally { conn.Close(); } } } } catch (Exception ex) { LogHelper.Error("ReceiveException的入参:" + info.ToJson() + ";异常是:" + 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(); } } }