DataUploadJob.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. using log4net;
  2. using Newtonsoft.Json;
  3. using Quartz;
  4. using RDIFramework.Utilities;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Configuration;
  8. using System.Data;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Net;
  12. using System.Text;
  13. using TimedUpload.WebReference;
  14. namespace TimedUpload.QuartzJobs
  15. {
  16. [DisallowConcurrentExecution]
  17. public class DataUploadJob : IJob
  18. {
  19. private readonly ILog log = LogManager.GetLogger(typeof(IJob));
  20. //接口地址
  21. public static string str_ApiUrl = Constants.str_Url;
  22. //公司编号
  23. public static string str_Company = Constants.str_Company;
  24. public void Execute(IJobExecutionContext context)
  25. {
  26. //log.InfoFormat("数据上传服务");
  27. DateTime date = DateTime.Now;
  28. log.Info("数据上传任务开始执行.................\r\n");
  29. try
  30. {
  31. //#region 有现远传水表
  32. //UpdateMeterDread();
  33. //UpdateMeterDreadOfBigMeter();
  34. ////2021-01-23移动NB水表对接
  35. //UpdateNBMeter();
  36. UpDataValveControlState();
  37. // #endregion
  38. }
  39. catch (Exception ex)
  40. {
  41. log.Error("任务上传异常:" + ex.Message);
  42. }
  43. log.InfoFormat("数据上传任务执行结束.................\r\n");
  44. }
  45. //上传数据
  46. public void UpdateMeterDread()
  47. {
  48. //2021-01-21
  49. Int32 i_Count = 0;
  50. i_Count = Convert.ToInt32(ConfigurationManager.AppSettings["Count"]);
  51. //
  52. try
  53. {
  54. List<meterRead> meterList = new List<meterRead>();
  55. meterRead[] meters = new meterRead[] { };
  56. WebReference.MeterReadingImplService wm = new WebReference.MeterReadingImplService();
  57. // String sql = "select 表地址,表读数,ReviseDT from Bsc_MeterInfo ";select t.表地址, t.ReviseDT, t.表读数 from Bsc_MeterInfo t inner join ( select 表地址, max(ReviseDT) as MaxDate from Bsc_MeterInfo group by 表地址) tm on t.表地址 = tm.表地址 and t.ReviseDT = tm.MaxDate
  58. //String sql = "select t.表地址, t.ReviseDT, t.表读数 from Bsc_MeterInfo t inner join ( select 表地址, max(ReviseDT) as MaxDate from Bsc_MeterInfo group by 表地址) tm on t.表地址 = tm.表地址 and t.ReviseDT = tm.MaxDate ";
  59. String sql = "select t.表地址, t.ReviseDT, t.表读数 from Bsc_MeterInfo t inner join ( select 表地址, max(ReviseDT) as MaxDate from Bsc_MeterInfo group by 表地址) tm on t.表地址 = tm.表地址 and t.ReviseDT = tm.MaxDate ";
  60. DataTable dt = dbHelper.Fill(sql);
  61. StringBuilder sb_Info = new StringBuilder();
  62. if (dt.Rows.Count > 0)
  63. {
  64. for (int i = 0; i < dt.Rows.Count; i++)
  65. {
  66. //meterList = new List<meterRead>();
  67. meterRead meter = new meterRead();
  68. meter.meterAddress = dt.Rows[i]["表地址"].ToString();
  69. meter.readDate = dt.Rows[i]["ReviseDT"].ToString();
  70. meter.readNum = Convert.ToDouble(dt.Rows[i]["表读数"].ToString());
  71. meter.metersort_id = "2";
  72. meter.meterState = "3";
  73. meterList.Add(meter);
  74. sb_Info.Append(meter.meterAddress + "|" + meter.readDate + "|" + meter.readNum + "\r\n");
  75. if (meterList.Count == i_Count || (meterList.Count != i_Count && i == dt.Rows.Count - 1))
  76. //if (meterList.Count == 1 )
  77. {
  78. meters = meterList.ToArray();
  79. String ss = wm.UPMeterRead(meters, "2");
  80. if (ss == "true")
  81. {
  82. //log.Info(DateTime.Now.ToString() + "_[" + meter.meterAddress + "]上传成功");
  83. log.Info(DateTime.Now.ToString() + sb_Info.ToString()+ "_上传成功");
  84. //log2txt.WriteLog(DateTime.Now.ToString() + "_" + "上传成功");
  85. sb_Info = new StringBuilder();
  86. }
  87. else if (ss == "")
  88. {
  89. log.Info("接口返回空" + sb_Info.ToString() +"上传成功");
  90. sb_Info = new StringBuilder();
  91. }
  92. else
  93. {
  94. //log.Info(DateTime.Now.ToString() + "_[" + meter.meterAddress + "]上传失败" + ss);
  95. log.Info(DateTime.Now.ToString() +sb_Info.ToString() + "_上传失败" + ss);
  96. sb_Info = new StringBuilder();
  97. }
  98. meterList = new List<meterRead>();
  99. }
  100. }
  101. }
  102. }
  103. catch (Exception ex)
  104. {
  105. log.Info("接口返回:" + ex.ToString() + "_" + "上传失败");
  106. }
  107. }
  108. #region 2019-10-10 大表对接
  109. public void UpdateMeterDreadOfBigMeter()
  110. {
  111. try
  112. {
  113. List<meterRead> meterList = new List<meterRead>();
  114. meterRead[] meters = new meterRead[] { };
  115. WebReference.MeterReadingImplService wm = new WebReference.MeterReadingImplService();
  116. // String sql = "select 表地址,表读数,ReviseDT from Bsc_MeterInfo ";select t.表地址, t.ReviseDT, t.表读数 from Bsc_MeterInfo t inner join ( select 表地址, max(ReviseDT) as MaxDate from Bsc_MeterInfo group by 表地址) tm on t.表地址 = tm.表地址 and t.ReviseDT = tm.MaxDate
  117. // String sql = "select t.表地址, t.ReviseDT, t.表读数 from Bsc_MeterInfo t inner join ( select 表地址, max(ReviseDT) as MaxDate from Bsc_MeterInfo group by 表地址) tm on t.表地址 = tm.表地址 and t.ReviseDT = tm.MaxDate ";
  118. StringBuilder sb_Sql = new StringBuilder();
  119. sb_Sql.Append(" select C.值 as 表地址,A.正累计流量 as 表读数,A.采集时间 as ReviseDT,D.值 as SIM,A.电池电压, ");
  120. sb_Sql.Append("ISNULL(A.GPRS信号质量,0) as 信号,ISNULL(A.压力,0) as 供水压力,A.瞬时流量 from 最后状态 A ");
  121. sb_Sql.Append("inner join (");
  122. sb_Sql.Append("select MAX(A.id) as max_Id ,A.设备ID from 最后状态 A left join ");
  123. sb_Sql.Append("设备信息 B on B.ID = A.设备ID where B.管理ID = 125 Group by A.设备ID "); //设备管理ID 暂时写死
  124. sb_Sql.Append(") b on A.id = b.max_Id and A.设备ID = B.设备ID ");
  125. sb_Sql.Append("left join 设备辅助信息 C on C.设备ID = B.设备ID and C.名称 = '表身号' ");
  126. sb_Sql.Append("left join 设备辅助信息 D on D.设备ID = B.设备ID and D.名称 = '手机卡号' ");
  127. DataTable dt = dbHelperNB.Fill(sb_Sql.ToString());
  128. StringBuilder sb_Info = new StringBuilder();
  129. if (dt.Rows.Count > 0)
  130. {
  131. for (int i = 0; i < dt.Rows.Count; i++)
  132. {
  133. // meterList = new List<meterRead>();
  134. meterRead meter = new meterRead();
  135. meter.meterAddress = dt.Rows[i]["表地址"].ToString();
  136. meter.readDate = dt.Rows[i]["ReviseDT"].ToString();
  137. meter.readNum = Convert.ToDouble(dt.Rows[i]["表读数"].ToString());
  138. sb_Info.Append(meter.meterAddress + "|" + meter.readDate + "|" + meter.readNum + "\r\n");
  139. meter.metersort_id = "8";
  140. meter.meterState = "3";
  141. meterList.Add(meter);
  142. if (meterList.Count == 100 || (meterList.Count != 100 && i == dt.Rows.Count - 1))
  143. {
  144. meters = meterList.ToArray();
  145. String ss = wm.UPMeterRead(meters, "8");
  146. if (ss == "true")
  147. {
  148. //log.Info(DateTime.Now.ToString() + "_" + "上传成功");
  149. log.Info(DateTime.Now.ToString() + sb_Info + "_上传成功(大表)");
  150. sb_Info = new StringBuilder();
  151. }
  152. else
  153. {
  154. log.Info(DateTime.Now.ToString() + sb_Info + "_上传失败(大表)" + ss);
  155. sb_Info = new StringBuilder();
  156. }
  157. meterList = new List<meterRead>();
  158. }
  159. }
  160. }
  161. }
  162. catch (Exception ex)
  163. {
  164. throw ex;
  165. }
  166. }
  167. #endregion
  168. #region 2021-01-23 移动NB水表对接
  169. public void UpdateNBMeter()
  170. {
  171. #region 变量
  172. String str_Sql;
  173. DataTable dt = new DataTable();
  174. String meterTypeNotValve = ConfigurationManager.AppSettings["meterTypeNotValve"];
  175. String meterTypeValve = ConfigurationManager.AppSettings["meterTypeValve"];
  176. #endregion
  177. #region 逻辑
  178. log.Debug("~~~~~~NB非阀控水表~~~~~");
  179. str_Sql = "select ElecAddress as 表地址,NowRadingDT as ReviseDT,NowReading as 表读数 from ONET_RMRS_MeterInfo where CompanyID ='6e50093a-2b74-4e3e-9993-c3bd1f23979a' and DeleteMark = 0 and MeterComTypeId<>6";
  180. dt = dbHelperNBYd.Fill(str_Sql);
  181. //非阀控
  182. insertData(dt, meterTypeNotValve);
  183. //阀控水表
  184. log.Debug("~~~~~~NB阀控水表~~~~~");
  185. str_Sql = "select ElecAddress as 表地址,NowRadingDT as ReviseDT,NowReading as 表读数 from ONET_RMRS_MeterInfo where CompanyID ='6e50093a-2b74-4e3e-9993-c3bd1f23979a' and DeleteMark = 0 and MeterComTypeId=6";
  186. dt = dbHelperNBYd.Fill(str_Sql);
  187. insertData(dt, meterTypeValve);
  188. #endregion
  189. }
  190. #endregion
  191. private void insertData(DataTable dt,String meterType) {
  192. List<meterRead> meterList = new List<meterRead>();
  193. //上传条数
  194. Int32 i_Count = Convert.ToInt32(ConfigurationManager.AppSettings["Count"]);
  195. StringBuilder sb_Info = new StringBuilder();
  196. meterRead[] meters = new meterRead[] { };
  197. //接口
  198. WebReference.MeterReadingImplService wm = new WebReference.MeterReadingImplService();
  199. if (dt.Rows.Count > 0)
  200. {
  201. for (int i = 0; i < dt.Rows.Count; i++)
  202. {
  203. try
  204. {
  205. meterRead meter = new meterRead();
  206. meter.meterAddress = dt.Rows[i]["表地址"].ToString();
  207. meter.readDate = dt.Rows[i]["ReviseDT"].ToString();
  208. meter.readNum = Convert.ToDouble(dt.Rows[i]["表读数"].ToString());
  209. meter.metersort_id = meterType;
  210. meter.meterState = "3";
  211. meterList.Add(meter);
  212. sb_Info.Append(meter.meterAddress + "|" + meter.readDate + "|" + meter.readNum + "\r\n");
  213. if (meterList.Count == i_Count || (meterList.Count != i_Count && i == dt.Rows.Count - 1))
  214. {
  215. meters = meterList.ToArray();
  216. String ss = wm.UPMeterRead(meters, meterType);
  217. if (ss == "true")
  218. {
  219. log.Info(DateTime.Now.ToString() + sb_Info.ToString() + "_上传成功");
  220. sb_Info = new StringBuilder();
  221. }
  222. else if (ss == "")
  223. {
  224. log.Info("接口返回空" + sb_Info.ToString() + "上传成功");
  225. sb_Info = new StringBuilder();
  226. }
  227. else
  228. {
  229. log.Info(DateTime.Now.ToString() + sb_Info.ToString() + "_上传失败" + ss);
  230. sb_Info = new StringBuilder();
  231. }
  232. meterList = new List<meterRead>();
  233. }
  234. }
  235. catch (Exception ex)
  236. {
  237. log.Debug("~~~~~~~~" + dt.Rows[i]["表地址"].ToString() + ",报错:" + ex.ToString());
  238. }
  239. }
  240. }
  241. }
  242. /// <summary>
  243. /// 阀控指令更新
  244. /// </summary>
  245. private void UpDataValveControlState()
  246. {
  247. //远传表厂家编号
  248. String metersortId = "13";
  249. StringBuilder sql = new StringBuilder();
  250. List<valveControlState> vcStateList = new List<valveControlState>();
  251. valveControlState[] valveControlStates = new valveControlState[] { };
  252. valveControlState vcState = new valveControlState();
  253. WebReference.MeterReadingImplService wm = new WebReference.MeterReadingImplService();
  254. sql.Append("select distinct c.id,a.MeterID,c.meteraddress, a.ValveStatus,b.CmdResult,c.updateTime,ReturnCode from ONET_RMRS_MeterInfo a ");
  255. sql.Append("inner join ONET_RMRS_SendCmdRecord b on a.MeterID = b.MeterId ");
  256. sql.Append("inner join TempValveControlData c on a.ElecAddress = c.meteraddress ");
  257. sql.Append("where a.DeleteMark = 0 and CmdType = 1002 ");
  258. DataTable dt = dbHelperNBYd.Fill(sql.ToString());
  259. if (dt.Rows.Count > 0)
  260. {
  261. for (int i = 0; i < dt.Rows.Count; i++)
  262. {
  263. vcState.id = dt.Rows[i]["id"].ToString();
  264. if (dt.Rows[i]["ValveStatus"].ToString() == "00")
  265. {
  266. vcState.meterState = "开阀";
  267. }
  268. else
  269. {
  270. vcState.meterState = "关阀";
  271. }
  272. // dt.Rows[i]["CmdResult"] = vcState.state;
  273. // if (dt.Rows[i]["CmdResult"].ToString() == "命令成功")
  274. String returnCode = dt.Rows[i]["ReturnCode"] == null ? null : dt.Rows[i]["ReturnCode"].ToString();
  275. if (returnCode == "0")
  276. {
  277. vcState.state = "1";
  278. log.Debug("########指令ID:"+ vcState.id+",水表地址:"+dt.Rows[i]["meteraddress"] +"执行成功");
  279. }
  280. else
  281. {
  282. vcState.state = "0";
  283. vcState.result = "指令超时";
  284. log.Debug("########指令ID:" + vcState.id + ",水表地址:" + dt.Rows[i]["meteraddress"] + "执行失败");
  285. }
  286. vcState.controlTime = dt.Rows[i]["updateTime"].ToString();
  287. vcStateList.Add(vcState);
  288. }
  289. // valveControlStates = vcStateList.ToArray();
  290. Boolean result = wm.UPValveControlState(valveControlStates, metersortId);
  291. if (result)
  292. {
  293. log.Info("上传成功");
  294. }
  295. else
  296. {
  297. log.Info("上传失败");
  298. }
  299. }
  300. /*wm.UPValveControlState();*/
  301. }
  302. static IDbProvider dbHelper
  303. {
  304. get
  305. {
  306. var DbDefine = DbFactoryProvider.GetProvider(CurrentDbType.SqlServer, Constants.DBUrl);
  307. return DbDefine;
  308. }
  309. }
  310. static IDbProvider dbHelperNB
  311. {
  312. get
  313. {
  314. var DbDefine = DbFactoryProvider.GetProvider(CurrentDbType.SqlServer, Constants.DBUrlNb);
  315. return DbDefine;
  316. }
  317. }
  318. static IDbProvider dbHelperNBYd
  319. {
  320. get
  321. {
  322. var DbDefine = DbFactoryProvider.GetProvider(CurrentDbType.SqlServer, Constants.DBUrlNbYd);
  323. return DbDefine;
  324. }
  325. }
  326. }
  327. public class MeterInfo
  328. {
  329. //交易代码
  330. public String CBNY { get; set; }
  331. //抄表月份
  332. public String JYDM { get; set; }
  333. //表厂名称
  334. public String CJDM { get; set; }
  335. public List<DATA> DATA { get; set; }
  336. }
  337. public class DATA
  338. {
  339. //本月表数
  340. public String SYBS { get; set; }
  341. //抄表日期
  342. public String CBRQ { get; set; }
  343. //水表编号
  344. public String SBBH { get; set; }
  345. //用户编号
  346. public String CUSERID { get; set; }
  347. //抄表状态
  348. public String CBZT { get; set; }
  349. //本月表数
  350. public double BYBS { get; set; }
  351. //抄表标记
  352. public Int32 CCOPY { get; set; }
  353. //加水量
  354. public double JJSL { get; set; }
  355. //抄表备注
  356. public String REMARK { get; set; }
  357. }
  358. public class ValueControlInfo
  359. {
  360. public String ManufacturerCode { get; set; }
  361. public String MeterAddress { get; set; }
  362. public String CommandType { get; set; }
  363. public String ValueState { get; set; }
  364. }
  365. }