|
@@ -0,0 +1,311 @@
|
|
|
+using FlowAlert.Model;
|
|
|
+using log4net;
|
|
|
+using Newtonsoft.Json;
|
|
|
+using Newtonsoft.Json.Linq;
|
|
|
+using Quartz;
|
|
|
+using RDIFramework.Utilities;
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Configuration;
|
|
|
+using System.Data;
|
|
|
+using System.Data.SqlClient;
|
|
|
+using System.IO;
|
|
|
+using System.Linq;
|
|
|
+using System.Net;
|
|
|
+using System.Security.Cryptography;
|
|
|
+using System.Text;
|
|
|
+using System.Web.Security;
|
|
|
+
|
|
|
+namespace TimedUpload.QuartzJobs
|
|
|
+{
|
|
|
+ public class DBDataUploadJob : IJob
|
|
|
+ {
|
|
|
+ private readonly ILog log = LogManager.GetLogger(typeof(DBDataUploadJob));
|
|
|
+ private static DateTime timeStampStartTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
|
|
|
+
|
|
|
+
|
|
|
+ static IDbProvider dbHelper
|
|
|
+ {
|
|
|
+ get
|
|
|
+ {
|
|
|
+ var DbDefine = DbFactoryProvider.GetProvider(CurrentDbType.SqlServer, Config.GetValue("DBDbConn"));
|
|
|
+ return DbDefine;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void Execute(IJobExecutionContext context)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+
|
|
|
+ UploadDataInfo();
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ log.Error("上传数据错误:" + ex.Message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// 上传数据
|
|
|
+ /// </summary>
|
|
|
+ public void UploadDataInfo()
|
|
|
+ {
|
|
|
+ String result;
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ string firstUpdateTime = ConfigurationManager.AppSettings["firstUpdateTime"];
|
|
|
+ string ids = ConfigurationManager.AppSettings["manageId"];
|
|
|
+ string historySql = "INSERT INTO UpdateHisHeZe (DevId, LastUpTime) SELECT a.ID,'" + firstUpdateTime + "' FROM 设备信息 a WHERE a.管理ID in ("+ ids + ") AND a.id NOT IN (SELECT DevId FROM UpdateHisHeZe)";
|
|
|
+ dbHelper.ExecuteNonQuery(historySql);
|
|
|
+
|
|
|
+ var sql = "SELECT a.*,LEFT(c.传输协议参数, CHARINDEX(',', c.传输协议参数) - 1) waterMeterNumber FROM dbo.UpdateHisHeZe a left join 设备信息 b on a.DevId = b.ID LEFT JOIN 传输设备 c on b.[传输设备ID] = c.ID ";
|
|
|
+ DataTable dt = dbHelper.Fill(sql);
|
|
|
+ for (int row = 0; row < dt.Rows.Count; row++)
|
|
|
+ {
|
|
|
+ string waterMeterNumber = dt.Rows[row]["waterMeterNumber"].ToString(); //表身号
|
|
|
+ string devId = dt.Rows[row]["DevId"].ToString();//表id
|
|
|
+ string lastUpdateTime = dt.Rows[row]["LastUpTime"].ToString();//最后更新时间
|
|
|
+ int year = Convert.ToDateTime(lastUpdateTime).Year;
|
|
|
+ string strTableName = "历史记录_" + ("000000" + devId).Substring(devId.Length, 6) + "_" + year.ToString();
|
|
|
+ if (!CheckTableExiste(strTableName))
|
|
|
+ {
|
|
|
+ //跨年判断
|
|
|
+ int thisYear = DateTime.Now.Year;
|
|
|
+ if (thisYear > year)
|
|
|
+ {
|
|
|
+ //跨年处理 记录表的更新时间 更新为新一年的 最初时间 例如"2019-01-01 00:00:00"
|
|
|
+ string UpdateHisNanDanSql = "UPDATE UpdateHisHeZe SET LastUpTime = '" + thisYear + "-01-01 00:00:00.000" + "' WHERE DevId = " + devId;
|
|
|
+ dbHelper.ExecuteNonQuery(UpdateHisNanDanSql);
|
|
|
+ }
|
|
|
+ continue;
|
|
|
+ };
|
|
|
+ string selSql = "Select * From " + strTableName + " Where 净累计流量<>-1 And 记录时间 is not null and 采集时间 is not null and 采集时间 > '" + lastUpdateTime + "' Order By 采集时间 asc";
|
|
|
+
|
|
|
+ DataTable dtDevHis = dbHelper.Fill(selSql);
|
|
|
+ StringBuilder str_Param = new StringBuilder();//传递的消息内容
|
|
|
+
|
|
|
+ if (dtDevHis == null || dtDevHis.Rows.Count == 0)
|
|
|
+ {
|
|
|
+ //跨年判断
|
|
|
+ int nowYear = DateTime.Now.Year;
|
|
|
+ if (nowYear > year)
|
|
|
+ {
|
|
|
+ //跨年处理 记录表的更新时间 更新为新一年的 最初时间 例如"2019-01-01 00:00:00"
|
|
|
+ string UpdateHisNanDanSql = "UPDATE UpdateHisHeZe SET LastUpTime = '" + nowYear + "-01-01 00:00:00.000" + "' WHERE DevId = " + devId;
|
|
|
+ dbHelper.ExecuteNonQuery(UpdateHisNanDanSql);
|
|
|
+ }
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ string now = lastUpdateTime;
|
|
|
+ int sucessNum = 0;
|
|
|
+ for (int hisRow = 0; hisRow < dtDevHis.Rows.Count; hisRow++)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ str_Param.Clear();
|
|
|
+ str_Param.Append("{ \"auto\":{");
|
|
|
+ str_Param.Append("\"client_time\":" + getTimeStamp(DateTime.Now) + ",");
|
|
|
+ str_Param.Append("\"uuid\":\"" + Guid.NewGuid().ToString() + "\",");
|
|
|
+ str_Param.Append("\"cc\":\"山东微维\",");
|
|
|
+ str_Param.Append("\"cv\":\"DB\",");
|
|
|
+ str_Param.Append("\"proi\":\"DB\",");
|
|
|
+ str_Param.Append("\"osversion\":\"\",");
|
|
|
+ str_Param.Append("\"conn\":\"\",");
|
|
|
+
|
|
|
+ str_Param.Append("\"client_ip\":\"\"");
|
|
|
+ str_Param.Append("},");
|
|
|
+ str_Param.Append("\"business\":\"REPORT_PROPERTY\",");
|
|
|
+ str_Param.Append("\"business_info\":");
|
|
|
+ str_Param.Append("{");
|
|
|
+ str_Param.Append("\"CurrentNumber\":\"" + dtDevHis.Rows[hisRow]["净累计流量"] + "\",");
|
|
|
+ str_Param.Append("\"currentForwardFlow\":\"" + dtDevHis.Rows[hisRow]["正累计流量"] + "\",");
|
|
|
+ str_Param.Append("\"currentReverseFlow\":\"" + dtDevHis.Rows[hisRow]["负累计流量"] + "\",");
|
|
|
+ str_Param.Append("\"timestamp\":" + getTimeStamp10(Convert.ToDateTime(dtDevHis.Rows[hisRow]["采集时间"])) + ",");
|
|
|
+ str_Param.Append("\"Shuibiao_SN\":\"" + waterMeterNumber + "\",");
|
|
|
+ str_Param.Append("\"companyId\":\"08\",");
|
|
|
+ str_Param.Append("\"ICCID\":\"\",");
|
|
|
+ str_Param.Append("\"CSQ\":\"\",");
|
|
|
+ str_Param.Append("\"NB_IMEI\":\"\",");
|
|
|
+
|
|
|
+
|
|
|
+ str_Param.Append("\"operators\":\"\",");
|
|
|
+ str_Param.Append("\"CurrentVoltage\":\"" + dtDevHis.Rows[hisRow]["电池电压"] + "\",");
|
|
|
+ str_Param.Append("\"instantaneousFlow\":\"" + dtDevHis.Rows[hisRow]["瞬时流量"] + "\",");
|
|
|
+ str_Param.Append("\"temperature\":\"\"");
|
|
|
+ str_Param.Append("}");
|
|
|
+ str_Param.Append("}");
|
|
|
+ result = postSend(Config.GetValue("UploadDataUrl"), str_Param.ToString());
|
|
|
+ log.Debug("结果:" + devId + "," + result);
|
|
|
+ var dicRes = JsonConvert.DeserializeObject<Result>(result);
|
|
|
+ if (dicRes != null)
|
|
|
+ {
|
|
|
+ if (dicRes.state == "0")
|
|
|
+ {
|
|
|
+
|
|
|
+ log.Debug(devId + "上传成功");
|
|
|
+ sucessNum++;
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ log.Debug(devId + "上传失败");
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ now = dtDevHis.Rows[hisRow]["采集时间"].ToString();
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ log.Error("上传抄表数据异常:【" + devId + "】" + str_Param.ToString());
|
|
|
+ log.Error("异常信息:" + ex.StackTrace);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //更新 记录表
|
|
|
+ string UpdateHisNanDanSql = "UPDATE UpdateHisHeZe SET LastUpTime = '" + now + "' WHERE DevId = " + devId;
|
|
|
+ dbHelper.ExecuteNonQuery(UpdateHisNanDanSql);
|
|
|
+ }
|
|
|
+ log.Info("上传抄表数据【" + devId + "】,共:【" + dtDevHis.Rows.Count + "】条,成功【" + sucessNum + "】条");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+
|
|
|
+ log.Debug("上传数据失败:" + ex.ToString());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ #region 请求接口
|
|
|
+ /// <summary>
|
|
|
+ ///
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="url"></param>
|
|
|
+ /// <param name="param"></param>
|
|
|
+ /// <param name="type"></param>
|
|
|
+ /// <param name="webHeader">请求头携带请求权限</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public string postSend(string url, string param, String type = "POST")
|
|
|
+ {
|
|
|
+ string strResult = "";
|
|
|
+ Encoding myEncode = Encoding.GetEncoding("UTF-8");
|
|
|
+ HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
|
|
|
+ req.Method = type;
|
|
|
+ req.ContentType = "application/json; charset=utf-8";
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if (param != null)
|
|
|
+ {
|
|
|
+ byte[] postBytes = Encoding.UTF8.GetBytes(param);
|
|
|
+ req.ContentLength = postBytes.Length;
|
|
|
+ using (Stream reqStream = req.GetRequestStream())
|
|
|
+ {
|
|
|
+ reqStream.Write(postBytes, 0, postBytes.Length);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+
|
|
|
+ using (WebResponse res = req.GetResponse())
|
|
|
+ {
|
|
|
+ using (StreamReader sr = new StreamReader(res.GetResponseStream(), myEncode))
|
|
|
+ {
|
|
|
+ strResult = sr.ReadToEnd();
|
|
|
+ return strResult;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (WebException ex)
|
|
|
+ {
|
|
|
+ log.Error("Post数据出错:" + ex.Message);
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+ public string md5Encript(String str) {
|
|
|
+ MD5 md5 = new MD5CryptoServiceProvider();
|
|
|
+ byte[] data = Encoding.UTF8.GetBytes(str);
|
|
|
+ byte[] result = md5.ComputeHash(data);
|
|
|
+ String md5Str = BitConverter.ToString(result).Replace("-","").ToLower();
|
|
|
+ return md5Str;
|
|
|
+
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// 返回13位整数
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dateTime"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public long getTimeStamp(DateTime dateTime) {
|
|
|
+ return (long)(dateTime.ToUniversalTime() - timeStampStartTime).TotalMilliseconds;
|
|
|
+
|
|
|
+ }
|
|
|
+ public long getTimeStamp10(DateTime dateTime)
|
|
|
+ {
|
|
|
+ return (long)(dateTime.ToUniversalTime() - timeStampStartTime).TotalSeconds;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public static bool CheckTableExiste(string strTableName)
|
|
|
+ {
|
|
|
+
|
|
|
+ string strSql = "select * from sysobjects where name='" + strTableName + "'";
|
|
|
+ if (CreateDataSet(strSql).Tables[0].Rows.Count == 0)
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static DataSet CreateDataSet(string strSql)
|
|
|
+ {
|
|
|
+ DataSet dataSet = new DataSet();
|
|
|
+ try
|
|
|
+ {
|
|
|
+
|
|
|
+ dataSet = new DataSet();
|
|
|
+
|
|
|
+ dbHelper.Fill(dataSet, strSql, "checkTable");
|
|
|
+ }
|
|
|
+ catch (Exception exception)
|
|
|
+ {
|
|
|
+ //log.Error("checkTable:" + exception.Message);
|
|
|
+ }
|
|
|
+ return dataSet;
|
|
|
+ }
|
|
|
+
|
|
|
+ class Result {
|
|
|
+ public String state { get; set; }
|
|
|
+ public String data { get; set; }
|
|
|
+ public String msg { get; set; }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ class reResult {
|
|
|
+ public String execCode { get; set; }
|
|
|
+ public String execMsg { get; set; }
|
|
|
+ public String errCode { get; set; }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|