CpQiShu.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Web;
  6. using System.Globalization;
  7. using System.Data;
  8. using CP.Cache;
  9. using CP.Common;
  10. using CP.Model;
  11. namespace CP.Business
  12. {
  13. public class CpQiShu
  14. {
  15. /// <summary>
  16. /// 缓存
  17. /// </summary>
  18. static WMCache cache = WMCache.GetCacheService();
  19. static List<QiShuConfigInfo> qishucfgList;
  20. static List<PublicCzConfigInfo> czcfgList;
  21. #region 获取期数,适用天天开奖、春节有放假的彩种
  22. /// <summary>
  23. /// 获取当前期数,适用3D/P3及天天开奖、春节有放假的情况
  24. /// </summary>
  25. /// <param name="Tnow">当前时间</param>
  26. /// <returns></returns>
  27. public static string GetEveryDayKjQI(string _cz, DateTime Tnow)
  28. {
  29. int cid = 0;
  30. try
  31. {
  32. CzEnum ua = (CzEnum)Enum.Parse(typeof(CzEnum), _cz, true);
  33. cid = (int)ua;
  34. }
  35. catch { }
  36. //获取配置数据
  37. QiShuConfigInfo info = GetQiShuConfigInfo(1, TypeConverter.StrToInt(Tnow.Year.ToString()));
  38. int cx = info.Cx; //除夕 0表示不开,1 表示要开
  39. int nday = info.Nday; //停开几天
  40. string kjtimeStr = GetPublicCzInfo(cid).Kjtime; //开奖时间
  41. int qi = 0;
  42. DateTime dt = Tnow;
  43. ChineseLunisolarCalendar cdt = new ChineseLunisolarCalendar();
  44. DateTime etime = Convert.ToDateTime(dt.ToShortDateString() + " " + kjtimeStr);
  45. DateTime newday = dt.AddDays(1); //后一天的日期
  46. ///晚上20:30之后,期数+1
  47. if (DateTime.Compare(dt, etime) > 0)
  48. {
  49. dt = dt.AddDays(1);
  50. }
  51. int day = dt.DayOfYear;//公历第几天
  52. int year = dt.Year;//公历年
  53. int cday = cdt.GetDayOfYear(dt); //初几
  54. int cyear = cdt.GetYear(dt);//农历年
  55. int cyearsumday = cdt.GetDaysInYear(cyear);//农历年天数
  56. qi = Convert.ToInt32(dt.Year.ToString() + day.ToString("000"));
  57. if (cx == 0)//除夕不开奖
  58. {
  59. ///春节放假
  60. if (cday >= nday && cyear == year)
  61. qi = qi - nday;
  62. ///春节放假,初几
  63. if (cday < nday && cday > 0 && cyear == year)
  64. qi = qi - cday;
  65. }
  66. else //除夕要开奖
  67. {
  68. ///春节放假
  69. if (cday > nday && cyear == year)
  70. qi = qi - nday;
  71. ///春节放假,初几
  72. if (cday <= nday && cday > 0 && cyear == year)
  73. qi = qi - cday + 1;
  74. }
  75. return qi.ToString();
  76. }
  77. /// <summary>
  78. /// 重载
  79. /// </summary>
  80. /// <param name="Tnow">当前时间</param>
  81. /// <param name="typeid">类别 0:上一期,1:当期,2:下一期</param>
  82. public static string GetEveryDayKjQI(string _cz, DateTime Tnow, int typeid)
  83. {
  84. int qi = 0;
  85. //上期
  86. if (typeid == 0)
  87. {
  88. int i = 1;
  89. int _qi = TypeConverter.StrToInt(GetEveryDayKjQI(_cz, Tnow));
  90. while (_qi <= TypeConverter.StrToInt(GetEveryDayKjQI(_cz, Tnow.AddDays(-i))))
  91. {
  92. i++;
  93. }
  94. return GetEveryDayKjQI(_cz, Tnow.AddDays(-i));
  95. }
  96. //当期g
  97. if (typeid == 1)
  98. return GetEveryDayKjQI(_cz, Tnow);
  99. //下期
  100. if (typeid == 2)
  101. {
  102. int i = 1;
  103. int _qi = TypeConverter.StrToInt(GetEveryDayKjQI(_cz, Tnow));
  104. while (_qi >= TypeConverter.StrToInt(GetEveryDayKjQI(_cz, Tnow.AddDays(i))))
  105. {
  106. i++;
  107. }
  108. return GetEveryDayKjQI(_cz, Tnow.AddDays(i));
  109. }
  110. return qi.ToString("0000000");
  111. }
  112. /// <summary>
  113. /// 获取短期数,适用3D/P3及天天开奖、春节有放假的情况
  114. /// </summary>
  115. /// <param name="_cz"></param>
  116. /// <param name="Tnow"></param>
  117. /// <param name="typeid">类别 0:上一期,1:当期,2:下一期</param>
  118. /// <returns></returns>
  119. public static string GetEveryDayKjQIShort(string _cz, DateTime Tnow, int typeid)
  120. {
  121. return GetEveryDayKjQI(_cz, Tnow, typeid).Substring(4, 3);
  122. }
  123. #endregion
  124. #region 根据期数返回日期,适用天天开奖的彩种
  125. public static DateTime GetEveryDayKjDate(int _qi)
  126. {
  127. string _strQi = _qi.ToString();
  128. string _yy = _strQi.Substring(0, 4);
  129. string _dd = _strQi.Substring(4, 3);
  130. int year = TypeConverter.StrToInt(_yy);
  131. int dd = TypeConverter.StrToInt(_dd);
  132. DateTime strD = new DateTime(year, 1, 1);
  133. strD = strD.AddDays(dd - 1);
  134. DateTime dt = strD;
  135. //获取配置数据
  136. QiShuConfigInfo info = GetQiShuConfigInfo(1, year);
  137. ChineseLunisolarCalendar cdt = new ChineseLunisolarCalendar();
  138. int cday = cdt.GetDayOfYear(dt);
  139. int cyear = cdt.GetYear(dt);
  140. int cyearsumday = cdt.GetDaysInYear(cyear);//农历年天数
  141. ///除夕不开奖
  142. if (info.Cx == 0)
  143. {
  144. if (cday > 0 && cyear == year || cday == cyearsumday)
  145. strD = strD.AddDays(info.Nday);
  146. }
  147. ///除夕要开奖
  148. else if (info.Cx == 1)
  149. {
  150. if (cday > 0 && cyear == year)
  151. strD = strD.AddDays(info.Nday);
  152. }
  153. return strD;
  154. }
  155. #endregion
  156. #region 根据日期返回双色球、大乐透、七星彩、七乐彩等期数
  157. /// <summary>
  158. ///
  159. /// </summary>
  160. /// <param name="_cz">彩种名string,如fc3d,ssq...</param>
  161. /// <param name="Tnow">待计算的时间</param>
  162. /// <param name="typeid">类别 0:上一期,1:当期,2:下一期</param>
  163. /// <returns></returns>
  164. public static string GetSpaceCzQi(string _cz, DateTime Tnow, int typeid)
  165. {
  166. CzEnum ua = (CzEnum)Enum.Parse(typeof(CzEnum), _cz, true);
  167. int cid = (int)ua;
  168. DateTime dt = Tnow;
  169. string kjtimeStr = GetPublicCzInfo(cid).Kjtime;
  170. int year = TypeConverter.StrToInt(dt.Year.ToString());
  171. DateTime sDate = TypeConverter.StrToDateTime((year - 1).ToString() + "/01/01 00:00:00");//从上一年的第一期开始算,解决公历跨年的问题
  172. DateTime eDate = TypeConverter.StrToDateTime((year + 1).ToString() + "/01/10 00:00:00");//算到后一年的10号,解决公历跨年算下一期的问题
  173. DateTime etime = Convert.ToDateTime(dt.ToShortDateString() + " " + kjtimeStr);
  174. int tnowInt = TypeConverter.StrToInt(dt.ToString("yyyyMMdd"));
  175. //晚上开奖后翻期
  176. if (DateTime.Compare(dt, etime) > 0)
  177. tnowInt = TypeConverter.StrToInt(dt.AddDays(1).ToString("yyyyMMdd"));
  178. //待计算总天数
  179. int sumDay = eDate.Subtract(sDate).Days;
  180. //id 所有开奖日期顺序编号
  181. int id = 0;
  182. //期数计数
  183. int qi = 0;
  184. //开奖日期记录列表
  185. List<JgKjTempInfo> list = new List<JgKjTempInfo>();
  186. //公历跨年翻期
  187. int backYear = TypeConverter.StrToInt(sDate.Year.ToString());
  188. for (int i = 0; i < sumDay; i++)
  189. {
  190. DateTime _temp = sDate.AddDays(i);
  191. if (!IsHoliday(1, _temp))//春节放假日期不参与计算
  192. {
  193. if (IsKjdate(cid, _temp))//是否是开奖日期
  194. {
  195. JgKjTempInfo info = new JgKjTempInfo();
  196. info.Id = id;
  197. int nextYear = TypeConverter.StrToInt(_temp.Year.ToString());
  198. if (nextYear == backYear)
  199. qi++;
  200. //年份不等
  201. else
  202. {
  203. qi = 1;
  204. backYear = nextYear;
  205. }
  206. info.Qi = TypeConverter.StrToInt(_temp.Year.ToString() + qi.ToString("000"));
  207. info.KjdateInt = TypeConverter.StrToInt(_temp.ToString("yyyyMMdd"));
  208. info.Kjdate = _temp;
  209. info.Week = GetIntWeek(_temp.DayOfWeek.ToString());
  210. list.Add(info);
  211. id++;
  212. }
  213. }
  214. }
  215. for (int j = 0; j < list.Count; j++)
  216. {
  217. if (tnowInt == list[j].KjdateInt)
  218. {
  219. if (typeid == 0) //上期
  220. return list[j - 1].Qi.ToString();
  221. if (typeid == 1)//当期
  222. return list[j].Qi.ToString();
  223. if (typeid == 2)//下期
  224. return list[j + 1].Qi.ToString();
  225. }
  226. if (tnowInt > list[j].KjdateInt && tnowInt < list[j + 1].KjdateInt)
  227. {
  228. if (typeid == 0)//上期
  229. return list[j].Qi.ToString();
  230. if (typeid == 1)//当期
  231. return list[j + 1].Qi.ToString();
  232. if (typeid == 2)//下期
  233. return list[j + 2].Qi.ToString();
  234. }
  235. }
  236. return qi.ToString("0000000");
  237. }
  238. public static string GetSpaceCzQiShort(string _cz, DateTime Tnow, int typeid)
  239. {
  240. return GetSpaceCzQi(_cz, Tnow, typeid).Substring(4, 3);
  241. }
  242. #endregion
  243. #region 根据期数返回双色球、大乐透、七星彩、七乐彩等开奖日期,一次批量更新很多数据时,需要复制后适当修改,反复循环调用效率不高
  244. public static DateTime GetSpaceCzKjDate(string _cz, int _qi)
  245. {
  246. CzEnum ua = (CzEnum)Enum.Parse(typeof(CzEnum), _cz, true);
  247. int cid = (int)ua;
  248. string _strQi = _qi.ToString();
  249. string year = _strQi.Substring(0, 4);
  250. DateTime sDate = TypeConverter.StrToDateTime(year + "/01/01 00:00:00");//从期数对应年份1月1号开始计算
  251. DateTime eDate = TypeConverter.StrToDateTime(year + "/12/31 23:59:59");//算到期数对应年份12月31号
  252. //待计算总天数
  253. int sumDay = eDate.Subtract(sDate).Days;
  254. //id 所有开奖日期顺序编号
  255. int id = 0;
  256. //期数计数
  257. int qi = 0;
  258. //开奖日期记录列表
  259. List<JgKjTempInfo> list = new List<JgKjTempInfo>();
  260. for (int i = 0; i < sumDay+1; i++)
  261. {
  262. DateTime _temp = sDate.AddDays(i);
  263. if (!IsHoliday(1, _temp))//春节放假日期不参与计算
  264. {
  265. if (IsKjdate(cid, _temp))//是否是开奖日期
  266. {
  267. JgKjTempInfo info = new JgKjTempInfo();
  268. info.Id = id;
  269. qi++;
  270. info.Qi = TypeConverter.StrToInt(_temp.Year.ToString() + qi.ToString("000"));
  271. info.KjdateInt = TypeConverter.StrToInt(_temp.ToString("yyyyMMdd"));
  272. info.Kjdate = _temp;
  273. info.Week = GetIntWeek(_temp.DayOfWeek.ToString());
  274. list.Add(info);
  275. id++;
  276. }
  277. }
  278. }
  279. for (int j = 0; j < list.Count; j++)
  280. {
  281. if (_qi == list[j].Qi)
  282. return list[j].Kjdate;
  283. }
  284. return DateTime.Now;
  285. }
  286. #endregion
  287. #region 判断是否是农历过年
  288. public static bool IsHoliday(int cid, DateTime Tnow)
  289. {
  290. //获取配置数据
  291. QiShuConfigInfo info = GetQiShuConfigInfo(cid, TypeConverter.StrToInt(Tnow.Year.ToString()));
  292. int cx = 0;
  293. int nday = 0; //停开几天
  294. if (info != null)
  295. {
  296. cx = info.Cx; //除夕 0表示不开,1 表示要开
  297. nday = info.Nday;
  298. }
  299. DateTime dt = Tnow;
  300. ChineseLunisolarCalendar cdt = new ChineseLunisolarCalendar();
  301. int day = dt.DayOfYear;//公历第几天
  302. int year = dt.Year;//公历年
  303. int cday = cdt.GetDayOfYear(dt); //初几
  304. int cyear = cdt.GetYear(dt);//农历年
  305. int cyearsumday = cdt.GetDaysInYear(cyear);//农历年天数
  306. if (cx == 0)//除夕不开奖
  307. {
  308. ///春节放假,初几
  309. if (cday < nday && cday > 0 && cyear == year)
  310. return true;
  311. ///大年三十
  312. if (cday == cyearsumday)
  313. return true;
  314. }
  315. else //除夕要开奖
  316. {
  317. ///春节放假
  318. if (cday <= nday && cyear == year)
  319. return true;
  320. }
  321. return false;
  322. }
  323. #endregion
  324. #region 是否是开奖日期,适用于双色球、大乐透、七星彩等间隔开奖彩种
  325. public static bool IsKjdate(int cid, DateTime Tnow)
  326. {
  327. DateTime _date = Tnow;
  328. PublicCzConfigInfo info = GetPublicCzInfo(cid);
  329. string[] kjdate = info.Kjdate.Split(',');
  330. string week = _date.DayOfWeek.ToString().Trim();
  331. for (int i = 0; i < kjdate.Length; i++)
  332. {
  333. if (kjdate[i].Equals(week))
  334. return true;
  335. }
  336. return false;
  337. }
  338. #endregion
  339. #region 获取期数配置
  340. /// <summary>
  341. /// 某一个朋种的期数配置
  342. /// </summary>
  343. /// <param name="cid"></param>
  344. /// <param name="year"></param>
  345. /// <returns></returns>
  346. private static QiShuConfigInfo GetQiShuConfigInfo(int cid, int year)
  347. {
  348. QiShuConfigInfo info = new QiShuConfigInfo();
  349. List<QiShuConfigInfo> list = GetQiShuConfigList();
  350. if (list != null && list.Count > 0)
  351. {
  352. for (int i = 0; i < list.Count; i++)
  353. {
  354. if (list[i].Tid == cid && list[i].Year == year)
  355. return list[i];
  356. }
  357. }
  358. return info;
  359. }
  360. /// <summary>
  361. /// cache中的所有期数配置
  362. /// </summary>
  363. /// <param name="cid"></param>
  364. /// <param name="year"></param>
  365. /// <returns></returns>
  366. private static List<QiShuConfigInfo> GetQiShuConfigList()
  367. {
  368. if (qishucfgList != null)
  369. return qishucfgList;
  370. else
  371. {
  372. string key = string.Format(CacheKeys.SYSTEM_QI_SHU_CONFIG);
  373. List<QiShuConfigInfo> list = cache.GetObject<List<QiShuConfigInfo>>(key);
  374. if (list == null)
  375. {
  376. list = CpQiShus.GetCpQiShuConfigList();
  377. cache.AddObject(key, list, (int)CacheTime.System);
  378. }
  379. qishucfgList = list;
  380. return list;
  381. }
  382. }
  383. #endregion
  384. #region 彩种配置
  385. /// <summary>
  386. /// 从缓存或数据中获取彩种开奖日期和时间信息列表
  387. /// </summary>
  388. /// <returns></returns>
  389. public static List<PublicCzConfigInfo> GetPublicCzConfig()
  390. {
  391. if (czcfgList != null)
  392. return czcfgList;
  393. else
  394. {
  395. string key = CacheKeys.SYSTEM_PUBLIC_CZ_CONFIG;
  396. List<PublicCzConfigInfo> list = cache.GetObject<List<PublicCzConfigInfo>>(key);
  397. if (list == null)
  398. {
  399. list = CpQiShus.GetPublicCzConfig();
  400. cache.AddObject(key, list, (int)CacheTime.System);
  401. }
  402. czcfgList = list;
  403. return list;
  404. }
  405. }
  406. private static PublicCzConfigInfo GetPublicCzInfo(int cid)
  407. {
  408. PublicCzConfigInfo info = new PublicCzConfigInfo();
  409. List<PublicCzConfigInfo> list = GetPublicCzConfig();
  410. for (int i = 0; i < list.Count; i++)
  411. {
  412. if (list[i].Cid == cid)
  413. return list[i];
  414. }
  415. return info;
  416. }
  417. #endregion
  418. #region 返回数字型星期
  419. public static int GetIntWeek(string StrWeek)
  420. {
  421. int intWeekday = -1;
  422. switch (StrWeek)
  423. {
  424. case "Monday":
  425. intWeekday = 1;
  426. break;
  427. case "Tuesday":
  428. intWeekday = 2;
  429. break;
  430. case "Wednesday":
  431. intWeekday = 3;
  432. break;
  433. case "Thursday":
  434. intWeekday = 4;
  435. break;
  436. case "Friday":
  437. intWeekday = 5;
  438. break;
  439. case "Saturday":
  440. intWeekday = 6;
  441. break;
  442. case "Sunday":
  443. intWeekday = 7;
  444. break;
  445. default:
  446. intWeekday = -1;
  447. break;
  448. }
  449. return intWeekday;
  450. }
  451. #endregion
  452. }
  453. }