ComplianceServer/oldcode/WX.CRM.DataSynFactory/BLL/SYNC_RECEIVE_BL.cs

355 lines
17 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.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.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<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;
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(); }
}
/// <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);
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<OracleParameter> param = new List<OracleParameter>() { 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<String> 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());
}
}
/// <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();
}
}
}