123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- using System;
- using System.Linq;
- using System.Data;
- using System.Threading;
- using Library;
- using LitJson;
- using MySystem.Models.Push;
- using System.Collections.Generic;
- namespace MySystem
- {
- public class PushHelper
- {
- public readonly static PushHelper Instance = new PushHelper();
- private PushHelper()
- {
- }
- public void Start()//启动
- {
- Thread thread = new Thread(threadStart);
- thread.IsBackground = true;
- thread.Start();
- }
- private void threadStart()
- {
- while (true)
- {
- try
- {
- DoSomeThing();
- }
- catch(Exception ex)
- {
- function.WriteLog(DateTime.Now.ToString() + "\n" + ex.ToString(), "通用推送日志异常");
- }
- Thread.Sleep(1000);
- }
- }
- //要执行的方法
- public void DoSomeThing()
- {
- WebCMSEntities db = new WebCMSEntities();
- //查找开通推送的商户
- var merchants = db.Merchant.Where(m => m.Status == 1).ToList();
- foreach(var merchant in merchants)
- {
- string RsaPubKey = merchant.RsaPubKey;
- string RsaPriKey = merchant.RsaPriKey;
- string AesSecret = merchant.AesSecret;
- string MerchantNo = merchant.MerchantNo;
- string MerchantName = merchant.MerchantName;
- //查找商户开通的推送项目
- var pushObj = db.PushObj.Where(m => m.Status == 1 && m.MerchantId == merchant.Id).ToList();
- foreach(var pushItem in pushObj)
- {
- string FieldList = pushItem.FieldList;
- string TableName = pushItem.TableName;
- TableName = SourceHelper.Instance.MatchExpressionVal(TableName);
- int EncryptMode = pushItem.EncryptMode;
- string NoticeUrl = pushItem.NoticeUrl;
- string Title = pushItem.Title;
- int MerchantId = pushItem.MerchantId;
- string QueryField = "";
- List<string> PushField = new List<string>();
- Dictionary<string, string> Trans = new Dictionary<string, string>();
- JsonData fieldJson = JsonMapper.ToObject(FieldList);
- for (int i = 0; i < fieldJson.Count; i++)
- {
- JsonData item = fieldJson[i];
- if(!string.IsNullOrEmpty(item["name"].ToString())) QueryField += item["name"].ToString() + ",";
- if(item["push"].ToString() == "1")
- {
- PushField.Add(item["name"].ToString());
- Trans.Add(item["name"].ToString(), item["trans"].ToString());
- }
- }
- //构造抓取数据sql
- string sql = "select " + QueryField.TrimEnd(',') + " from u_" + TableName + " where 1=1";
- var condiList = db.PushObjCondition.Where(m => m.PushObjId == pushItem.Id).ToList();
- foreach(var condi in condiList)
- {
- int QueryCondition = condi.QueryCondition;
- if(QueryCondition == 1)
- {
- sql += " and " + condi.QueryField + "='" + condi.QueryVal + "'";
- }
- else if(QueryCondition == 2)
- {
- sql += " and " + condi.QueryField + " like '%" + condi.QueryVal + "%'";
- }
- else if(QueryCondition == 3)
- {
- sql += " and " + condi.QueryField + ">" + condi.QueryVal + "";
- }
- else if(QueryCondition == 4)
- {
- sql += " and " + condi.QueryField + "<" + condi.QueryVal + "";
- }
- else if(QueryCondition == 5)
- {
- string[] QueryValList = condi.QueryVal.Split('|');
- sql += " and " + condi.QueryField + ">=" + QueryValList[0] + " and " + condi.QueryField + "<=" + QueryValList[1] + "";
- }
- else if(QueryCondition == 6)
- {
- string[] QueryValList = condi.QueryVal.Split('|');
- sql += " and " + condi.QueryField + ">='" + QueryValList[0] + "' and " + condi.QueryField + "<='" + QueryValList[1] + "'";
- }
- else if(QueryCondition == 7)
- {
- sql += " and " + condi.QueryField + " in (" + condi.QueryVal + ")";
- }
- else if(QueryCondition == 8)
- {
- sql += " and " + condi.QueryField + " in ('" + condi.QueryVal.Replace(",", "','") + "')";
- }
- else if(QueryCondition == 9)
- {
- string[] QueryValList = condi.QueryVal.Split(',');
- sql += " and (";
- int index = 0;
- foreach(string QueryVal in QueryValList)
- {
- index += 1;
- sql += condi.QueryField + "=" + QueryVal;
- if(index < QueryValList.Length)
- {
- sql += " or ";
- }
- }
- sql += ")";
- }
- else
- {
- sql += " and " + condi.QueryField + "='" + condi.QueryVal + "'";
- }
- }
- //抓取数据开始post数据
- int StartId = pushItem.QueryId;
- sql = sql.Replace("${QueryId}$", StartId.ToString());
- sql += " order by id limit 10";
- DataTable dt = CustomerSqlConn.dtable(sql, AppConfig.Base.SqlConnStr);
- foreach(DataRow dr in dt.Rows)
- {
- SortedList<string, string> obj = new SortedList<string, string>();
- foreach(DataColumn dc in dt.Columns)
- {
- if(PushField.Contains(dc.ColumnName))
- {
- string val = dr[dc.ColumnName].ToString();
- string tran = Trans[dc.ColumnName];
- if(!string.IsNullOrEmpty(val))
- {
- if(!string.IsNullOrEmpty(tran))
- {
- if(tran.StartsWith("*"))
- {
- decimal num = decimal.Parse(val) * int.Parse(tran.Substring(1));
- val = num.ToString("f0");
- }
- }
- if(dc.DataType == typeof(DateTime))
- {
- val = DateTime.Parse(val).ToString("yyyy-MM-dd HH:mm:ss");
- }
- obj.Add(dc.ColumnName, val);
- }
- }
- }
- int Status = 0;
- string PushData = "";
- string PushDataEncrypt = "";
- if(EncryptMode == 1)
- {
- string noticeId = Guid.NewGuid().ToString();
- if(obj.ContainsKey("order_id"))
- {
- noticeId = obj["order_id"];
- }
- PushData = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
- LogHelper.Instance.WriteLog("原始数据:" + PushData, "推送数据日志");
- string content = EncryptHelper.Encrypt1(obj, AesSecret);
- LogHelper.Instance.WriteLog("加密数据:" + content, "推送数据日志");
- obj = new SortedList<string, string>();
- obj.Add("type", Title);
- obj.Add("notice_id", noticeId);
- obj.Add("timestamp", DateTime.Now.ToString("yyyyMMddHHmmssfff") + function.get_Random(8));
- obj.Add("content", content);
- string requestJson = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
- PushDataEncrypt = requestJson;
- LogHelper.Instance.WriteLog("请求参数:" + PushDataEncrypt, "推送数据日志");
- LogHelper.Instance.WriteLog("请求地址:" + NoticeUrl, "推送数据日志");
- string result = function.PostWebRequest(NoticeUrl, requestJson, "application/json");
- LogHelper.Instance.WriteLog("返回报文:" + result + "\n\n", "推送数据日志");
- if(result.Replace(" ", "").Contains("\"code\":\"200\""))
- {
- Status = 1;
- }
- }
- PushRecord rec = db.PushRecord.Add(new PushRecord()
- {
- CreateDate = DateTime.Now,
- UpdateDate = DateTime.Now,
- Status = Status,
- PushData = PushData,
- PushDataEncrypt = PushDataEncrypt,
- PushObjId = pushItem.Id,
- MerchantId = merchant.Id
- }).Entity;
- db.SaveChanges();
- if(Status != 1)
- {
- db.RePushQueue.Add(new RePushQueue()
- {
- CreateDate = DateTime.Now,
- RePushUrl = NoticeUrl,
- RePushDate = RePushHelper.Instance.GetNextTime(1),
- Times = 1,
- PushData = PushData,
- PushDataEncrypt = PushDataEncrypt,
- PushObjId = pushItem.Id,
- MerchantId = merchant.Id,
- PushRecordId = rec.Id,
- });
- }
- db.SaveChanges();
- StartId = int.Parse(dr["id"].ToString());
- }
- var edit = db.PushObj.FirstOrDefault(m => m.Id == pushItem.Id);
- if(edit != null)
- {
- edit.QueryId = StartId;
- db.SaveChanges();
- }
- }
- }
- db.Dispose();
- }
-
- }
- }
|