CommonHelper.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Reflection;
  6. using System.Xml;
  7. using System.Net;
  8. using System.Net.Mail;
  9. using SCC.Models;
  10. using Quartz;
  11. namespace SCC.Common
  12. {
  13. /// <summary>
  14. /// 公用帮助类
  15. /// </summary>
  16. public static class CommonHelper
  17. {
  18. /// <summary>
  19. /// 本系统当前时间
  20. /// (早上8点之前为昨天,8点之后为今天)
  21. /// </summary>
  22. public static DateTime SCCSysDateTime
  23. {
  24. get
  25. {
  26. return DateTime.Now.AddHours(-8);
  27. }
  28. }
  29. /// <summary>
  30. /// 将XML内容转换成目标对象实体集合
  31. /// </summary>
  32. /// <typeparam name="T">目标对象实体</typeparam>
  33. /// <param name="FileName">完整文件名(根目录下只需文件名称)</param>
  34. /// <param name="WrapperNodeName"></param>
  35. /// <returns></returns>
  36. public static List<T> ConvertXMLToObject<T>(string FileName, string WrapperNodeName)
  37. {
  38. XmlDocument doc = new XmlDocument();
  39. doc.Load(FileName);
  40. List<T> result = new List<T>();
  41. var TType = typeof(T);
  42. XmlNodeList nodeList = doc.ChildNodes;
  43. if (!string.IsNullOrEmpty(WrapperNodeName))
  44. {
  45. foreach (XmlNode node in doc.ChildNodes)
  46. {
  47. if (node.Name == WrapperNodeName)
  48. {
  49. nodeList = node.ChildNodes;
  50. break;
  51. }
  52. }
  53. }
  54. object oneT = null;
  55. foreach (XmlNode node in nodeList)
  56. {
  57. if (node.NodeType == XmlNodeType.Comment || node.NodeType == XmlNodeType.XmlDeclaration) continue;
  58. oneT = TType.Assembly.CreateInstance(TType.FullName);
  59. foreach (XmlNode item in node.ChildNodes)
  60. {
  61. if (item.NodeType == XmlNodeType.Comment) continue;
  62. var property = TType.GetProperty(item.Name);
  63. if (property != null)
  64. property.SetValue(oneT, Convert.ChangeType(item.InnerText, property.PropertyType), null);
  65. }
  66. result.Add((T)oneT);
  67. }
  68. return result;
  69. }
  70. /// <summary>
  71. /// 从作业数据地图中获取配置信息
  72. /// </summary>
  73. /// <param name="datamap">作业数据地图</param>
  74. /// <returns></returns>
  75. public static SCCConfig GetConfigFromDataMap(JobDataMap datamap)
  76. {
  77. SCCConfig config = new SCCConfig();
  78. var properties = typeof(SCCConfig).GetProperties();
  79. foreach (PropertyInfo info in properties)
  80. {
  81. if (info.PropertyType == typeof(string))
  82. info.SetValue(config, datamap.GetString(info.Name), null);
  83. else if (info.PropertyType == typeof(Int32))
  84. info.SetValue(config, datamap.GetInt(info.Name), null);
  85. }
  86. return config;
  87. }
  88. #region 生成期号
  89. /// <summary>
  90. /// 通过期号编号生成形如YYMMDDQQ的期号
  91. /// </summary>
  92. /// <param name="QNum">期号编号</param>
  93. /// <returns></returns>
  94. public static string GenerateTodayQiHaoYYMMDDQQ(int QNum)
  95. {
  96. return GenerateQiHaoYYMMDDQQ(SCCSysDateTime, QNum);
  97. }
  98. /// <summary>
  99. /// 通过期号编号生成形如YYMMDDQQQ的期号
  100. /// </summary>
  101. /// <param name="QNum">期号编号</param>
  102. /// <returns></returns>
  103. public static string GenerateTodayQiHaoYYMMDDQQQ(int QNum)
  104. {
  105. return GenerateQiHaoYYMMDDQQQ(SCCSysDateTime, QNum);
  106. }
  107. /// <summary>
  108. /// 通过期号编号生成昨天形如YYMMDDQQ的期号
  109. /// </summary>
  110. /// <param name="QNum">期号编号</param>
  111. /// <returns></returns>
  112. public static string GenerateYesterdayQiHaoYYMMDDQQ(int QNum)
  113. {
  114. return GenerateQiHaoYYMMDDQQ(SCCSysDateTime.AddDays(-1), QNum);
  115. }
  116. /// <summary>
  117. /// 通过期号编号生成昨天形如YYMMDDQQ的期号
  118. /// </summary>
  119. /// <param name="QNum">期号编号</param>
  120. /// <returns></returns>
  121. public static string GenerateYesterdayQiHaoYYMMDDQQQ(int QNum)
  122. {
  123. return GenerateQiHaoYYMMDDQQQ(SCCSysDateTime.AddDays(-1), QNum);
  124. }
  125. /// <summary>
  126. /// 通过时间和编号生成当天形如YYMMDDQQ的期号
  127. /// </summary>
  128. /// <param name="dt">时间</param>
  129. /// <param name="QNum">期号编号</param>
  130. /// <returns></returns>
  131. private static string GenerateQiHaoYYMMDDQQ(DateTime dt, int QNum)
  132. {
  133. return dt.ToString("yyMMdd") + (QNum).ToString().PadLeft(2, '0');
  134. }
  135. /// <summary>
  136. /// 通过时间和编号生成当天形如YYMMDDQQQ的期号
  137. /// </summary>
  138. /// <param name="dt">时间</param>
  139. /// <param name="QNum">期号编号</param>
  140. /// <returns></returns>
  141. private static string GenerateQiHaoYYMMDDQQQ(DateTime dt, int QNum)
  142. {
  143. return dt.ToString("yyMMdd") + (QNum).ToString().PadLeft(3, '0');
  144. }
  145. /// <summary>
  146. /// 生成广西快乐十分指定日期指定编号的期号
  147. /// </summary>
  148. /// <param name="dt">时间</param>
  149. /// <param name="SkipDate">配置的跳过时间</param>
  150. /// <param name="QNum">期号编号</param>
  151. /// <returns></returns>
  152. public static string GenerateGXKL10FQiHao(DateTime dt, string SkipDate, int QNum)
  153. {
  154. TimeSpan datepart = dt - new DateTime(dt.Year, 1, 1);
  155. var t = SkipDate.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  156. var beforeDTSkipDates = t.Where(R => Convert.ToInt32(R) < Convert.ToInt32(dt.ToString("yyyyMMdd"))).ToList();
  157. return dt.Year.ToString() + (datepart.Days - beforeDTSkipDates.Count + 1).ToString().PadLeft(3, '0') + QNum.ToString().PadLeft(2, '0');
  158. }
  159. /// <summary>
  160. /// 通过时间和编号生成当天形如YYMMDDQQQ的期号
  161. /// </summary>
  162. /// <param name="dt">时间</param>
  163. /// <param name="QNum">期号编号</param>
  164. /// <returns></returns>
  165. public static string GenerateQiHaoYYYYDayQQ(DateTime dt, string SkipDate, int QNum)
  166. {
  167. var rq = SkipDate.Replace("2019", "").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList(); ;
  168. var dq_rq = dt.ToString("MMdd");
  169. int num = rq.IndexOf(dq_rq);
  170. int day = dt.DayOfYear - (num + 1);
  171. return dt.ToString("yyyy") + day.ToString().PadLeft(3, '0') + (QNum).ToString().PadLeft(2, '0');
  172. }
  173. #endregion
  174. #region 生成开奖时间
  175. /// <summary>
  176. /// 获取昨天对应期号的开奖时间
  177. /// 期号需形如YYMMDDQQ或YYMMDDQQQ
  178. /// </summary>
  179. /// <param name="config">配置项</param>
  180. /// <param name="QiHao">开奖期号</param>
  181. /// <returns></returns>
  182. public static DateTime GenerateYesterdayOpenTime(SCCConfig config, string QiHao)
  183. {
  184. var openDay = SCCSysDateTime.AddDays(-1);
  185. var StartTime = new DateTime(openDay.Year, openDay.Month, openDay.Day, config.StartHour, config.StartMinute, 0);
  186. return StartTime.AddMinutes((Convert.ToInt32(QiHao.Substring(6)) - 1) * config.Interval);
  187. }
  188. /// <summary>
  189. /// 获取今日对应期号的开奖时间
  190. /// 期号需形如YYMMDDQQ或YYMMDDQQQ
  191. /// </summary>
  192. /// <param name="config">配置项</param>
  193. /// <param name="QiHao">开奖期号</param>
  194. /// <returns></returns>
  195. public static DateTime GenerateTodayOpenTime(SCCConfig config, string QiHao)
  196. {
  197. var StartTime = new DateTime(SCCSysDateTime.Year, SCCSysDateTime.Month, SCCSysDateTime.Day, config.StartHour, config.StartMinute, 0);
  198. return StartTime.AddMinutes((Convert.ToInt32(QiHao.Substring(6)) - 1) * config.Interval);
  199. }
  200. public static DateTime GenerateGXKL10FYesterdayOpenTime(SCCConfig config, string QiHao)
  201. {
  202. var openDay = SCCSysDateTime.AddDays(-1);
  203. var StartTime = new DateTime(openDay.Year, openDay.Month, openDay.Day, config.StartHour, config.StartMinute, 0);
  204. return StartTime.AddMinutes((Convert.ToInt32(QiHao.Substring(7)) - 1) * config.Interval);
  205. }
  206. public static DateTime GenerateGXKL10FTodayOpenTime(SCCConfig config, string QiHao)
  207. {
  208. var StartTime = new DateTime(SCCSysDateTime.Year, SCCSysDateTime.Month, SCCSysDateTime.Day, config.StartHour, config.StartMinute, 0);
  209. return StartTime.AddMinutes((Convert.ToInt32(QiHao.Substring(7)) - 1) * config.Interval);
  210. }
  211. #endregion
  212. #region 日志信息
  213. public static string GetJobMainLogInfo(SCCConfig config, string QiHao)
  214. {
  215. return string.Format("【{0}】通过主站地址抓取{1}期开奖数据成功", config.Area + config.LotteryName, QiHao);
  216. }
  217. public static string GetJobBackLogInfo(SCCConfig config, string QiHao)
  218. {
  219. return string.Format("【{0}】通过备用地址抓取{1}期开奖数据成功", config.Area + config.LotteryName, QiHao);
  220. }
  221. public static string GetJobLogError(SCCConfig config, string QiHao)
  222. {
  223. return string.Format("【{0}】抓取{1}期开奖数据失败", config.Area + config.LotteryName, QiHao);
  224. }
  225. #endregion
  226. #region 地方彩
  227. /// <summary>
  228. /// 通过编号生成当天形如YYQQQ的期号
  229. /// (目前只有地方彩使用)
  230. /// </summary>
  231. /// <param name="QNum">期号编号</param>
  232. /// <returns></returns>
  233. public static int GenerateQiHaoYYQQQ(int QNum)
  234. {
  235. return Convert.ToInt32(SCCSysDateTime.ToString("yy") + (QNum).ToString().PadLeft(3, '0'));
  236. }
  237. /// <summary>
  238. /// 通过编号生成当天形如YYYYQQQ的期号
  239. /// (目前只有地方彩使用)
  240. /// </summary>
  241. /// <param name="QNum">期号编号</param>
  242. /// <returns></returns>
  243. public static int GenerateQiHaoYYYYQQQ(int QNum)
  244. {
  245. return Convert.ToInt32(SCCSysDateTime.ToString("yyyy") + (QNum).ToString().PadLeft(3, '0'));
  246. }
  247. /// <summary>
  248. /// 核实该地方彩程序运行时间是否应该获取到数据
  249. /// 开奖第二天检查时应该抓取到开奖数据才正确
  250. /// </summary>
  251. /// <param name="config">配置信息</param>
  252. /// <returns></returns>
  253. public static bool CheckDTIsNeedGetData(SCCConfig config)
  254. {
  255. var week = SCCSysDateTime.AddDays(-1).DayOfWeek.ToString("d");
  256. if (config.KJTime.Contains(week) && SCCSysDateTime.Hour < 1)//第二天只检查1次
  257. return true;
  258. return false;
  259. }
  260. /// <summary>
  261. /// 检查今天该地方彩是否应该开奖
  262. /// 是则进行爬取工作
  263. /// </summary>
  264. /// <param name="config">配置信息</param>
  265. /// <returns></returns>
  266. public static bool CheckTodayIsOpenDay(SCCConfig config)
  267. {
  268. var week = SCCSysDateTime.DayOfWeek.ToString("d");
  269. if (config.KJTime.Contains(week))
  270. return true;
  271. return false;
  272. }
  273. /// <summary>
  274. /// 生成地方彩昨天的开奖时间
  275. /// </summary>
  276. /// <param name="config">配置信息</param>
  277. /// <returns></returns>
  278. public static DateTime GenerateDTOpenTime(SCCConfig config)
  279. {
  280. var openday = SCCSysDateTime.AddDays(-1);
  281. return new DateTime(openday.Year, openday.Month, openday.Day, config.StartHour, config.StartMinute, 0);
  282. }
  283. #endregion
  284. /// <summary>
  285. /// 将值转换为T类型数据
  286. /// </summary>
  287. /// <typeparam name="T">目标类型</typeparam>
  288. /// <param name="value">数据值</param>
  289. /// <returns></returns>
  290. public static T ChangeType<T>(object value)
  291. {
  292. return ChangeType<T>(value, default(T));
  293. }
  294. /// <summary>
  295. /// 将值转换为T类型数据,失败则返回T类型默认值
  296. /// </summary>
  297. /// <typeparam name="T">目标类型</typeparam>
  298. /// <param name="value">数据值</param>
  299. /// <param name="defaultValue">T类型默认值</param>
  300. /// <returns></returns>
  301. public static T ChangeType<T>(object value, T defaultValue)
  302. {
  303. if (value != null)
  304. {
  305. Type nullableType = typeof(T);
  306. if (!nullableType.IsInterface && (!nullableType.IsClass || (nullableType == typeof(string))))
  307. {
  308. if (nullableType.IsGenericType && (nullableType.GetGenericTypeDefinition() == typeof(Nullable<>)))
  309. {
  310. return (T)Convert.ChangeType(value, Nullable.GetUnderlyingType(nullableType));
  311. }
  312. if (nullableType.IsEnum)
  313. {
  314. return (T)Enum.Parse(nullableType, value.ToString());
  315. }
  316. return (T)Convert.ChangeType(value, nullableType);
  317. }
  318. if (value is T)
  319. {
  320. return (T)value;
  321. }
  322. }
  323. return defaultValue;
  324. }
  325. /// <summary>
  326. /// 将值转换为type类型的值
  327. /// </summary>
  328. /// <param name="value">值</param>
  329. /// <param name="type">目标类型</param>
  330. /// <returns></returns>
  331. public static object ChangeType(object value, Type type)
  332. {
  333. if (value != null)
  334. {
  335. var nullableType = Nullable.GetUnderlyingType(type);
  336. if (nullableType != null)//可空
  337. {
  338. return Convert.ChangeType(value, nullableType);
  339. }
  340. if (Convert.IsDBNull(value))//特殊处理,由于数据库类型与项目中的类型定义不匹配
  341. return type.IsValueType ? Activator.CreateInstance(type) : null;
  342. return Convert.ChangeType(value, type);
  343. }
  344. return null;
  345. }
  346. #region 邮件功能
  347. /// <summary>
  348. /// 发送邮件
  349. /// </summary>
  350. /// <param name="Subject">邮件标题</param>
  351. /// <param name="Body">邮件正文</param>
  352. /// <returns></returns>
  353. public static bool SendEmail(string Subject, string Body)
  354. {
  355. try
  356. {
  357. var MailTo = ConfigHelper.GetConfigValue<string>("MailTo");
  358. if (string.IsNullOrEmpty(MailTo)) return false;
  359. var MailFrom = ConfigHelper.GetConfigValue<string>("MailFrom");
  360. var MailCC = ConfigHelper.GetConfigValue<string>("MailCC");
  361. var SenderUserName = ConfigHelper.GetConfigValue<string>("SenderUserName");
  362. var SenderPassWord = ConfigHelper.GetConfigValue<string>("SenderPassWord");
  363. var SMTPHost = ConfigHelper.GetConfigValue<string>("SMTPHost");
  364. MailMessage message = new MailMessage();
  365. var toList = MailTo.Trim().Split(new char[] { ';' });
  366. foreach (var to in toList)
  367. {
  368. if (!string.IsNullOrWhiteSpace(to))
  369. message.To.Add(new MailAddress(to));
  370. }
  371. var ccList = MailCC.Trim().Split(new char[] { ';' });
  372. foreach (var cc in ccList)
  373. {
  374. if (!string.IsNullOrWhiteSpace(cc))
  375. message.CC.Add(new MailAddress(cc));
  376. }
  377. message.Subject = Subject;
  378. message.SubjectEncoding = Encoding.UTF8;
  379. message.Body = Body;
  380. message.BodyEncoding = Encoding.UTF8;
  381. message.IsBodyHtml = true;
  382. message.Priority = MailPriority.High;
  383. SmtpClient client = new SmtpClient();
  384. NetworkCredential nc = new NetworkCredential();
  385. if (!string.IsNullOrEmpty(MailFrom)
  386. && !string.IsNullOrEmpty(SenderUserName)
  387. && !string.IsNullOrEmpty(SenderPassWord)
  388. && !string.IsNullOrEmpty(SMTPHost))
  389. {
  390. message.From = new MailAddress(MailFrom);
  391. nc.UserName = SenderUserName;
  392. nc.Password = SenderPassWord;
  393. client.Host = SMTPHost;
  394. }
  395. else
  396. {
  397. //set default sender
  398. #region set default sender
  399. message.From = new MailAddress("18111271228@163.com");
  400. nc.UserName = "18111271228@163.com";
  401. //nc.Password = "sccadmin520";//邮箱登陆密码
  402. nc.Password = "sccadmin51520";//客戶端授权密码
  403. client.Host = "smtp.163.com";
  404. #endregion
  405. }
  406. client.UseDefaultCredentials = false;
  407. client.DeliveryMethod = SmtpDeliveryMethod.Network;
  408. client.Credentials = nc;
  409. client.EnableSsl = true;
  410. client.Send(message);
  411. return true;
  412. }
  413. catch
  414. {
  415. }
  416. return false;
  417. }
  418. #endregion
  419. }
  420. }