123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Web;
- using System.Globalization;
- using System.Data;
- using CP.Cache;
- using CP.Common;
- using CP.Model;
- namespace CP.Business
- {
- public class CpQiShu
- {
- /// <summary>
- /// 缓存
- /// </summary>
- static WMCache cache = WMCache.GetCacheService();
- static List<QiShuConfigInfo> qishucfgList;
- static List<PublicCzConfigInfo> czcfgList;
- #region 获取期数,适用天天开奖、春节有放假的彩种
- /// <summary>
- /// 获取当前期数,适用3D/P3及天天开奖、春节有放假的情况
- /// </summary>
- /// <param name="Tnow">当前时间</param>
- /// <returns></returns>
- public static string GetEveryDayKjQI(string _cz, DateTime Tnow)
- {
- int cid = 0;
- try
- {
- CzEnum ua = (CzEnum)Enum.Parse(typeof(CzEnum), _cz, true);
- cid = (int)ua;
- }
- catch { }
- //获取配置数据
- QiShuConfigInfo info = GetQiShuConfigInfo(1, TypeConverter.StrToInt(Tnow.Year.ToString()));
- int cx = info.Cx; //除夕 0表示不开,1 表示要开
- int nday = info.Nday; //停开几天
- string kjtimeStr = GetPublicCzInfo(cid).Kjtime; //开奖时间
- int qi = 0;
- DateTime dt = Tnow;
- ChineseLunisolarCalendar cdt = new ChineseLunisolarCalendar();
- DateTime etime = Convert.ToDateTime(dt.ToShortDateString() + " " + kjtimeStr);
- DateTime newday = dt.AddDays(1); //后一天的日期
- ///晚上20:30之后,期数+1
- if (DateTime.Compare(dt, etime) > 0)
- {
- dt = dt.AddDays(1);
- }
- int day = dt.DayOfYear;//公历第几天
- int year = dt.Year;//公历年
- int cday = cdt.GetDayOfYear(dt); //初几
- int cyear = cdt.GetYear(dt);//农历年
- int cyearsumday = cdt.GetDaysInYear(cyear);//农历年天数
- qi = Convert.ToInt32(dt.Year.ToString() + day.ToString("000"));
- if (cx == 0)//除夕不开奖
- {
- ///春节放假
- if (cday >= nday && cyear == year)
- qi = qi - nday;
- ///春节放假,初几
- if (cday < nday && cday > 0 && cyear == year)
- qi = qi - cday;
- }
- else //除夕要开奖
- {
- ///春节放假
- if (cday > nday && cyear == year)
- qi = qi - nday;
- ///春节放假,初几
- if (cday <= nday && cday > 0 && cyear == year)
- qi = qi - cday + 1;
- }
- return qi.ToString();
- }
- /// <summary>
- /// 重载
- /// </summary>
- /// <param name="Tnow">当前时间</param>
- /// <param name="typeid">类别 0:上一期,1:当期,2:下一期</param>
- public static string GetEveryDayKjQI(string _cz, DateTime Tnow, int typeid)
- {
- int qi = 0;
- //上期
- if (typeid == 0)
- {
- int i = 1;
- int _qi = TypeConverter.StrToInt(GetEveryDayKjQI(_cz, Tnow));
- while (_qi <= TypeConverter.StrToInt(GetEveryDayKjQI(_cz, Tnow.AddDays(-i))))
- {
- i++;
- }
- return GetEveryDayKjQI(_cz, Tnow.AddDays(-i));
- }
- //当期g
- if (typeid == 1)
- return GetEveryDayKjQI(_cz, Tnow);
- //下期
- if (typeid == 2)
- {
- int i = 1;
- int _qi = TypeConverter.StrToInt(GetEveryDayKjQI(_cz, Tnow));
- while (_qi >= TypeConverter.StrToInt(GetEveryDayKjQI(_cz, Tnow.AddDays(i))))
- {
- i++;
- }
- return GetEveryDayKjQI(_cz, Tnow.AddDays(i));
- }
- return qi.ToString("0000000");
- }
- /// <summary>
- /// 获取短期数,适用3D/P3及天天开奖、春节有放假的情况
- /// </summary>
- /// <param name="_cz"></param>
- /// <param name="Tnow"></param>
- /// <param name="typeid">类别 0:上一期,1:当期,2:下一期</param>
- /// <returns></returns>
- public static string GetEveryDayKjQIShort(string _cz, DateTime Tnow, int typeid)
- {
- return GetEveryDayKjQI(_cz, Tnow, typeid).Substring(4, 3);
- }
- #endregion
- #region 根据期数返回日期,适用天天开奖的彩种
- public static DateTime GetEveryDayKjDate(int _qi)
- {
- string _strQi = _qi.ToString();
- string _yy = _strQi.Substring(0, 4);
- string _dd = _strQi.Substring(4, 3);
- int year = TypeConverter.StrToInt(_yy);
- int dd = TypeConverter.StrToInt(_dd);
- DateTime strD = new DateTime(year, 1, 1);
- strD = strD.AddDays(dd - 1);
- DateTime dt = strD;
- //获取配置数据
- QiShuConfigInfo info = GetQiShuConfigInfo(1, year);
- ChineseLunisolarCalendar cdt = new ChineseLunisolarCalendar();
- int cday = cdt.GetDayOfYear(dt);
- int cyear = cdt.GetYear(dt);
- int cyearsumday = cdt.GetDaysInYear(cyear);//农历年天数
- ///除夕不开奖
- if (info.Cx == 0)
- {
- if (cday > 0 && cyear == year || cday == cyearsumday)
- strD = strD.AddDays(info.Nday);
- }
- ///除夕要开奖
- else if (info.Cx == 1)
- {
- if (cday > 0 && cyear == year)
- strD = strD.AddDays(info.Nday);
- }
- return strD;
- }
- #endregion
- #region 根据日期返回双色球、大乐透、七星彩、七乐彩等期数
- /// <summary>
- ///
- /// </summary>
- /// <param name="_cz">彩种名string,如fc3d,ssq...</param>
- /// <param name="Tnow">待计算的时间</param>
- /// <param name="typeid">类别 0:上一期,1:当期,2:下一期</param>
- /// <returns></returns>
- public static string GetSpaceCzQi(string _cz, DateTime Tnow, int typeid)
- {
- CzEnum ua = (CzEnum)Enum.Parse(typeof(CzEnum), _cz, true);
- int cid = (int)ua;
- DateTime dt = Tnow;
- string kjtimeStr = GetPublicCzInfo(cid).Kjtime;
- int year = TypeConverter.StrToInt(dt.Year.ToString());
- DateTime sDate = TypeConverter.StrToDateTime((year - 1).ToString() + "/01/01 00:00:00");//从上一年的第一期开始算,解决公历跨年的问题
- DateTime eDate = TypeConverter.StrToDateTime((year + 1).ToString() + "/01/10 00:00:00");//算到后一年的10号,解决公历跨年算下一期的问题
- DateTime etime = Convert.ToDateTime(dt.ToShortDateString() + " " + kjtimeStr);
- int tnowInt = TypeConverter.StrToInt(dt.ToString("yyyyMMdd"));
- //晚上开奖后翻期
- if (DateTime.Compare(dt, etime) > 0)
- tnowInt = TypeConverter.StrToInt(dt.AddDays(1).ToString("yyyyMMdd"));
- //待计算总天数
- int sumDay = eDate.Subtract(sDate).Days;
- //id 所有开奖日期顺序编号
- int id = 0;
- //期数计数
- int qi = 0;
- //开奖日期记录列表
- List<JgKjTempInfo> list = new List<JgKjTempInfo>();
- //公历跨年翻期
- int backYear = TypeConverter.StrToInt(sDate.Year.ToString());
- for (int i = 0; i < sumDay; i++)
- {
- DateTime _temp = sDate.AddDays(i);
- if (!IsHoliday(1, _temp))//春节放假日期不参与计算
- {
- if (IsKjdate(cid, _temp))//是否是开奖日期
- {
- JgKjTempInfo info = new JgKjTempInfo();
- info.Id = id;
- int nextYear = TypeConverter.StrToInt(_temp.Year.ToString());
- if (nextYear == backYear)
- qi++;
- //年份不等
- else
- {
- qi = 1;
- backYear = nextYear;
- }
- info.Qi = TypeConverter.StrToInt(_temp.Year.ToString() + qi.ToString("000"));
- info.KjdateInt = TypeConverter.StrToInt(_temp.ToString("yyyyMMdd"));
- info.Kjdate = _temp;
- info.Week = GetIntWeek(_temp.DayOfWeek.ToString());
- list.Add(info);
- id++;
- }
- }
- }
- for (int j = 0; j < list.Count; j++)
- {
- if (tnowInt == list[j].KjdateInt)
- {
- if (typeid == 0) //上期
- return list[j - 1].Qi.ToString();
- if (typeid == 1)//当期
- return list[j].Qi.ToString();
- if (typeid == 2)//下期
- return list[j + 1].Qi.ToString();
- }
- if (tnowInt > list[j].KjdateInt && tnowInt < list[j + 1].KjdateInt)
- {
- if (typeid == 0)//上期
- return list[j].Qi.ToString();
- if (typeid == 1)//当期
- return list[j + 1].Qi.ToString();
- if (typeid == 2)//下期
- return list[j + 2].Qi.ToString();
- }
- }
- return qi.ToString("0000000");
- }
- public static string GetSpaceCzQiShort(string _cz, DateTime Tnow, int typeid)
- {
- return GetSpaceCzQi(_cz, Tnow, typeid).Substring(4, 3);
- }
- #endregion
- #region 根据期数返回双色球、大乐透、七星彩、七乐彩等开奖日期,一次批量更新很多数据时,需要复制后适当修改,反复循环调用效率不高
- public static DateTime GetSpaceCzKjDate(string _cz, int _qi)
- {
- CzEnum ua = (CzEnum)Enum.Parse(typeof(CzEnum), _cz, true);
- int cid = (int)ua;
- string _strQi = _qi.ToString();
- string year = _strQi.Substring(0, 4);
- DateTime sDate = TypeConverter.StrToDateTime(year + "/01/01 00:00:00");//从期数对应年份1月1号开始计算
- DateTime eDate = TypeConverter.StrToDateTime(year + "/12/31 23:59:59");//算到期数对应年份12月31号
- //待计算总天数
- int sumDay = eDate.Subtract(sDate).Days;
- //id 所有开奖日期顺序编号
- int id = 0;
- //期数计数
- int qi = 0;
- //开奖日期记录列表
- List<JgKjTempInfo> list = new List<JgKjTempInfo>();
- for (int i = 0; i < sumDay+1; i++)
- {
- DateTime _temp = sDate.AddDays(i);
- if (!IsHoliday(1, _temp))//春节放假日期不参与计算
- {
- if (IsKjdate(cid, _temp))//是否是开奖日期
- {
- JgKjTempInfo info = new JgKjTempInfo();
- info.Id = id;
- qi++;
- info.Qi = TypeConverter.StrToInt(_temp.Year.ToString() + qi.ToString("000"));
- info.KjdateInt = TypeConverter.StrToInt(_temp.ToString("yyyyMMdd"));
- info.Kjdate = _temp;
- info.Week = GetIntWeek(_temp.DayOfWeek.ToString());
- list.Add(info);
- id++;
- }
- }
- }
- for (int j = 0; j < list.Count; j++)
- {
- if (_qi == list[j].Qi)
- return list[j].Kjdate;
- }
- return DateTime.Now;
- }
- #endregion
- #region 判断是否是农历过年
- public static bool IsHoliday(int cid, DateTime Tnow)
- {
- //获取配置数据
- QiShuConfigInfo info = GetQiShuConfigInfo(cid, TypeConverter.StrToInt(Tnow.Year.ToString()));
- int cx = 0;
- int nday = 0; //停开几天
- if (info != null)
- {
- cx = info.Cx; //除夕 0表示不开,1 表示要开
- nday = info.Nday;
- }
- DateTime dt = Tnow;
- ChineseLunisolarCalendar cdt = new ChineseLunisolarCalendar();
- int day = dt.DayOfYear;//公历第几天
- int year = dt.Year;//公历年
- int cday = cdt.GetDayOfYear(dt); //初几
- int cyear = cdt.GetYear(dt);//农历年
- int cyearsumday = cdt.GetDaysInYear(cyear);//农历年天数
- if (cx == 0)//除夕不开奖
- {
- ///春节放假,初几
- if (cday < nday && cday > 0 && cyear == year)
- return true;
- ///大年三十
- if (cday == cyearsumday)
- return true;
- }
- else //除夕要开奖
- {
- ///春节放假
- if (cday <= nday && cyear == year)
- return true;
- }
- return false;
- }
- #endregion
- #region 是否是开奖日期,适用于双色球、大乐透、七星彩等间隔开奖彩种
- public static bool IsKjdate(int cid, DateTime Tnow)
- {
- DateTime _date = Tnow;
- PublicCzConfigInfo info = GetPublicCzInfo(cid);
- string[] kjdate = info.Kjdate.Split(',');
- string week = _date.DayOfWeek.ToString().Trim();
- for (int i = 0; i < kjdate.Length; i++)
- {
- if (kjdate[i].Equals(week))
- return true;
- }
- return false;
- }
- #endregion
- #region 获取期数配置
- /// <summary>
- /// 某一个朋种的期数配置
- /// </summary>
- /// <param name="cid"></param>
- /// <param name="year"></param>
- /// <returns></returns>
- private static QiShuConfigInfo GetQiShuConfigInfo(int cid, int year)
- {
- QiShuConfigInfo info = new QiShuConfigInfo();
- List<QiShuConfigInfo> list = GetQiShuConfigList();
- if (list != null && list.Count > 0)
- {
- for (int i = 0; i < list.Count; i++)
- {
- if (list[i].Tid == cid && list[i].Year == year)
- return list[i];
- }
- }
- return info;
- }
- /// <summary>
- /// cache中的所有期数配置
- /// </summary>
- /// <param name="cid"></param>
- /// <param name="year"></param>
- /// <returns></returns>
- private static List<QiShuConfigInfo> GetQiShuConfigList()
- {
- if (qishucfgList != null)
- return qishucfgList;
- else
- {
- string key = string.Format(CacheKeys.SYSTEM_QI_SHU_CONFIG);
- List<QiShuConfigInfo> list = cache.GetObject<List<QiShuConfigInfo>>(key);
- if (list == null)
- {
- list = CpQiShus.GetCpQiShuConfigList();
- cache.AddObject(key, list, (int)CacheTime.System);
- }
- qishucfgList = list;
- return list;
- }
- }
- #endregion
- #region 彩种配置
- /// <summary>
- /// 从缓存或数据中获取彩种开奖日期和时间信息列表
- /// </summary>
- /// <returns></returns>
- public static List<PublicCzConfigInfo> GetPublicCzConfig()
- {
- if (czcfgList != null)
- return czcfgList;
- else
- {
- string key = CacheKeys.SYSTEM_PUBLIC_CZ_CONFIG;
- List<PublicCzConfigInfo> list = cache.GetObject<List<PublicCzConfigInfo>>(key);
- if (list == null)
- {
- list = CpQiShus.GetPublicCzConfig();
- cache.AddObject(key, list, (int)CacheTime.System);
- }
- czcfgList = list;
- return list;
- }
- }
- private static PublicCzConfigInfo GetPublicCzInfo(int cid)
- {
- PublicCzConfigInfo info = new PublicCzConfigInfo();
- List<PublicCzConfigInfo> list = GetPublicCzConfig();
- for (int i = 0; i < list.Count; i++)
- {
- if (list[i].Cid == cid)
- return list[i];
- }
- return info;
- }
- #endregion
- #region 返回数字型星期
- public static int GetIntWeek(string StrWeek)
- {
- int intWeekday = -1;
- switch (StrWeek)
- {
- case "Monday":
- intWeekday = 1;
- break;
- case "Tuesday":
- intWeekday = 2;
- break;
- case "Wednesday":
- intWeekday = 3;
- break;
- case "Thursday":
- intWeekday = 4;
- break;
- case "Friday":
- intWeekday = 5;
- break;
- case "Saturday":
- intWeekday = 6;
- break;
- case "Sunday":
- intWeekday = 7;
- break;
- default:
- intWeekday = -1;
- break;
- }
- return intWeekday;
- }
- #endregion
- }
- }
|