TG.WXCRM.V4/WX.CRM.DataSynFactory/BLL/SYNC_RECEIVE_BL.cs

465 lines
22 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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}&timestamp={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();
}
}
}