465 lines
22 KiB
C#
465 lines
22 KiB
C#
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<SYNC_RECEIVE> 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<SYNC_RECEIVE> 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<SYNC_RECEIVE> 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(); }
|
||
}*/
|
||
|
||
/// <summary>
|
||
/// 执行数据库语句操作
|
||
/// </summary>
|
||
/// <param name="conn"></param>
|
||
/// <param name="trans"></param>
|
||
/// <param name="cmdText"></param>
|
||
/// <param name="cmdParms"></param>
|
||
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;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 处理异常信息,错误超过10次的,进行钉钉通知,数据录入到err表
|
||
/// </summary>
|
||
/// <param name="info"></param>
|
||
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<WX.CRM.Model.DTO.BIDataTypeLevel>(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());
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 返回一个dataset
|
||
/// </summary>
|
||
/// <param name="connectionstring"></param>
|
||
/// <param name="cmdType"></param>
|
||
/// <param name="cmdText"></param>
|
||
/// <param name="commandParameters"></param>
|
||
/// <returns></returns>
|
||
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();
|
||
}
|
||
}
|
||
} |