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
{
///
/// 缓存
///
static WMCache cache = WMCache.GetCacheService();
static List qishucfgList;
static List czcfgList;
#region 获取期数,适用天天开奖、春节有放假的彩种
///
/// 获取当前期数,适用3D/P3及天天开奖、春节有放假的情况
///
/// 当前时间
///
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();
}
///
/// 重载
///
/// 当前时间
/// 类别 0:上一期,1:当期,2:下一期
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");
}
///
/// 获取短期数,适用3D/P3及天天开奖、春节有放假的情况
///
///
///
/// 类别 0:上一期,1:当期,2:下一期
///
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 根据日期返回双色球、大乐透、七星彩、七乐彩等期数
///
///
///
/// 彩种名string,如fc3d,ssq...
/// 待计算的时间
/// 类别 0:上一期,1:当期,2:下一期
///
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 list = new List();
//公历跨年翻期
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 list = new List();
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 获取期数配置
///
/// 某一个朋种的期数配置
///
///
///
///
private static QiShuConfigInfo GetQiShuConfigInfo(int cid, int year)
{
QiShuConfigInfo info = new QiShuConfigInfo();
List 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;
}
///
/// cache中的所有期数配置
///
///
///
///
private static List GetQiShuConfigList()
{
if (qishucfgList != null)
return qishucfgList;
else
{
string key = string.Format(CacheKeys.SYSTEM_QI_SHU_CONFIG);
List list = cache.GetObject>(key);
if (list == null)
{
list = CpQiShus.GetCpQiShuConfigList();
cache.AddObject(key, list, (int)CacheTime.System);
}
qishucfgList = list;
return list;
}
}
#endregion
#region 彩种配置
///
/// 从缓存或数据中获取彩种开奖日期和时间信息列表
///
///
public static List GetPublicCzConfig()
{
if (czcfgList != null)
return czcfgList;
else
{
string key = CacheKeys.SYSTEM_PUBLIC_CZ_CONFIG;
List list = cache.GetObject>(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 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
}
}