CommonHelper.cs 19 KB

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