QGCController.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Net.Http;
  7. using System.Text;
  8. using System.Web.Http;
  9. using Lottomat.Application.Busines.CommonManage;
  10. using Lottomat.Application.Cache;
  11. using Lottomat.Application.Code;
  12. using Lottomat.Application.Entity.CommonEntity;
  13. using Lottomat.Application.Entity.LotteryNumberManage.Parameter;
  14. using Lottomat.Application.Entity.LotteryNumberManage.ViewModel;
  15. using Lottomat.SOA.API.Controllers.Base;
  16. using Lottomat.Util.Extension;
  17. using Lottomat.Utils;
  18. using Lottomat.Utils.Date;
  19. namespace Lottomat.SOA.API.Controllers.V1
  20. {
  21. /// <summary>
  22. /// 全国彩
  23. /// </summary>
  24. public class QGCController : BaseApiController
  25. {
  26. /// <summary>
  27. /// 公共BLL
  28. /// </summary>
  29. private static readonly CommonBLL commonBll = new CommonBLL();
  30. #region 获取历史记录
  31. /// <summary>
  32. /// 获取全国彩彩种历史记录
  33. /// </summary>
  34. /// <returns></returns>
  35. [HttpPost]
  36. public HttpResponseMessage GetQGCHistoryLotteryList(HistoryLotteryArgEnyity arg)
  37. {
  38. BaseJson<string> resultMsg = new BaseJson<string> { Status = (int)JsonObjectStatus.Error, Message = "服务器未知错误。", Data = null };
  39. Logger(typeof(QGCController), arg.TryToJson(), "获取全国彩彩种历史记录-GetQGCHistoryLotteryList", () =>
  40. {
  41. if (!string.IsNullOrEmpty(arg.t))
  42. {
  43. if (arg.t.CheckTimeStamp())
  44. {
  45. if (!string.IsNullOrEmpty(arg.EnumCode))
  46. {
  47. bool isSucc = Enum.TryParse<SCCLottery>(arg.EnumCode, true, out SCCLottery type);
  48. //SCCLottery type = (SCCLottery)Enum.Parse(typeof(SCCLottery), arg.EnumCode, true);
  49. if (!isSucc)
  50. {
  51. resultMsg = new BaseJson<string>
  52. {
  53. Status = (int)JsonObjectStatus.Fail,
  54. Data = null,
  55. Message = $"参数值{arg.EnumCode}无效。",
  56. BackUrl = null
  57. };
  58. }
  59. else
  60. {
  61. //获取组装完成后的Json字符串
  62. string res = GetResultByEnumCode(type, arg);
  63. resultMsg = new BaseJson<string>
  64. {
  65. Status = (int)JsonObjectStatus.Success,
  66. Data = res.ToString(),
  67. Message = JsonObjectStatus.Success.GetEnumText(),
  68. BackUrl = null
  69. };
  70. }
  71. }
  72. else
  73. {
  74. resultMsg = new BaseJson<string>
  75. {
  76. Status = (int)JsonObjectStatus.Fail,
  77. Data = null,
  78. Message = JsonObjectStatus.Fail.GetEnumText() + ",请求参数EnumCode为空。",
  79. BackUrl = null
  80. };
  81. }
  82. }
  83. else
  84. {
  85. resultMsg = new BaseJson<string>
  86. {
  87. Status = (int)JsonObjectStatus.Fail,
  88. Data = null,
  89. Message = JsonObjectStatus.Fail.GetEnumText() + ",无效参数。",
  90. BackUrl = null
  91. };
  92. }
  93. }
  94. else
  95. {
  96. resultMsg = new BaseJson<string>
  97. {
  98. Status = (int)JsonObjectStatus.Fail,
  99. Data = null,
  100. Message = JsonObjectStatus.Fail.GetEnumText() + ",请求参数为空。",
  101. BackUrl = null
  102. };
  103. }
  104. }, e =>
  105. {
  106. resultMsg = new BaseJson<string>
  107. {
  108. Status = (int)JsonObjectStatus.Exception,
  109. Data = null,
  110. Message = JsonObjectStatus.Exception.GetEnumText() + ",异常信息:" + e.Message,
  111. BackUrl = null
  112. };
  113. });
  114. return resultMsg.TryToJson().ToHttpResponseMessage();
  115. }
  116. /// <summary>
  117. /// 获取开奖历史
  118. /// </summary>
  119. /// <param name="type"></param>
  120. /// <param name="arg"></param>
  121. /// <returns></returns>
  122. private string GetResultByEnumCode(SCCLottery type, HistoryLotteryArgEnyity arg)
  123. {
  124. string res = String.Empty;
  125. DataTable data = GetData(type, arg);
  126. switch (type)
  127. {
  128. case SCCLottery.FC3D:
  129. res = AppendFC3DResult(data, SCCLottery.FC3D);
  130. break;
  131. case SCCLottery.SSQ:
  132. res = AppendSSQResult(data, SCCLottery.SSQ);
  133. break;
  134. case SCCLottery.QLC:
  135. res = AppendQLCResult(data, SCCLottery.QLC);
  136. break;
  137. default:
  138. res = AppendCommonResult(data, type);
  139. break;
  140. }
  141. return res;
  142. }
  143. /// <summary>
  144. /// 组装FC3D记录
  145. /// </summary>
  146. /// <param name="data"></param>
  147. /// <param name="type"></param>
  148. /// <returns></returns>
  149. private string AppendFC3DResult(DataTable data, SCCLottery type)
  150. {
  151. List<FC3DHistoryLotteryViewEntity> res = new List<FC3DHistoryLotteryViewEntity>();
  152. if (data.Rows.Count > 0)
  153. {
  154. //总共球个数
  155. int total = type.GetEnumText().TryToInt32();
  156. for (int j = 0; j < data.Rows.Count; j++)
  157. {
  158. //开奖号集合
  159. List<int> openCodeList = new List<int>();
  160. StringBuilder builder = new StringBuilder();
  161. for (int i = 1; i <= total; i++)
  162. {
  163. int openCode = data.Rows[j]["OpenCode" + i].TryToInt32();
  164. openCodeList.Add(openCode);
  165. }
  166. builder.Append(GetOpenCodeTemplate(type, openCodeList));
  167. res.Add(new FC3DHistoryLotteryViewEntity
  168. {
  169. Term = data.Rows[j]["Term"].ToStringEx(),
  170. OpenTime = data.Rows[j]["OpenTime"].TryToDateTimeToString("yyyy-MM-dd"),
  171. NormalOpenCode = builder.ToString(),
  172. //Spare = //TODO 新增开奖详情
  173. ShiJiHao = data.Rows[j]["ShiJiHao"].ToStringEx(),
  174. KaiJiHao = data.Rows[j]["KaiJiHao"].ToStringEx(),
  175. ParityRatio = LotteryUtils.GetProportionOfJO(openCodeList),
  176. SizeRatio = LotteryUtils.GetProportionOfDX(openCodeList, 4),
  177. Parity = LotteryUtils.GetJOString(openCodeList),
  178. TheSum = LotteryUtils.GetTheSum(openCodeList, 14, GetSumNumberCount(type))
  179. });
  180. }
  181. }
  182. return res.ToJson();
  183. }
  184. /// <summary>
  185. /// 组装双色球记录
  186. /// </summary>
  187. /// <param name="data"></param>
  188. /// <param name="type"></param>
  189. /// <returns></returns>
  190. private string AppendSSQResult(DataTable data, SCCLottery type)
  191. {
  192. List<SSQHistoryLotteryViewEntity> res = new List<SSQHistoryLotteryViewEntity>();
  193. if (data.Rows.Count > 0)
  194. {
  195. //总共球个数
  196. int total = type.GetEnumText().TryToInt32();
  197. for (int j = 0; j < data.Rows.Count; j++)
  198. {
  199. //开奖号集合
  200. List<int> openCodeList = new List<int>();
  201. StringBuilder builder = new StringBuilder();
  202. for (int i = 1; i <= total; i++)
  203. {
  204. int openCode = data.Rows[j]["OpenCode" + i].TryToInt32();
  205. openCodeList.Add(openCode);
  206. }
  207. builder.Append(GetOpenCodeTemplate(type, openCodeList));
  208. res.Add(new SSQHistoryLotteryViewEntity
  209. {
  210. Term = data.Rows[j]["Term"].ToStringEx(),
  211. OpenTime = data.Rows[j]["OpenTime"].TryToDateTimeToString("yyyy-MM-dd"),
  212. NormalOpenCode = builder.ToString(),
  213. KaiJiHao = data.Rows[j]["KaiJiHao"].ToStringEx(),
  214. ParityRatio = LotteryUtils.GetProportionOfJO(openCodeList),
  215. SizeRatio = LotteryUtils.GetProportionOfDX(openCodeList, 4),
  216. Parity = LotteryUtils.GetJOString(openCodeList),
  217. TheSum = LotteryUtils.GetTheSum(openCodeList, 14, GetSumNumberCount(type))
  218. });
  219. }
  220. }
  221. return res.ToJson();
  222. }
  223. /// <summary>
  224. /// 组装七乐彩记录
  225. /// </summary>
  226. /// <param name="data"></param>
  227. /// <param name="type"></param>
  228. /// <returns></returns>
  229. private string AppendQLCResult(DataTable data, SCCLottery type)
  230. {
  231. List<QLCHistoryLotteryViewEntity> res = new List<QLCHistoryLotteryViewEntity>();
  232. if (data.Rows.Count > 0)
  233. {
  234. //总共球个数
  235. int total = type.GetEnumText().TryToInt32();
  236. for (int j = 0; j < data.Rows.Count; j++)
  237. {
  238. //开奖号集合
  239. List<int> openCodeList = new List<int>();
  240. StringBuilder builder = new StringBuilder();
  241. for (int i = 1; i <= total; i++)
  242. {
  243. int openCode = data.Rows[j]["OpenCode" + i].TryToInt32();
  244. openCodeList.Add(openCode);
  245. }
  246. builder.Append(GetOpenCodeTemplate(type, openCodeList));
  247. res.Add(new QLCHistoryLotteryViewEntity
  248. {
  249. Term = data.Rows[j]["Term"].ToStringEx(),
  250. OpenTime = data.Rows[j]["OpenTime"].TryToDateTimeToString("yyyy-MM-dd"),
  251. NormalOpenCode = builder.ToString(),
  252. ParityRatio = LotteryUtils.GetProportionOfJO(openCodeList),
  253. SizeRatio = LotteryUtils.GetProportionOfDX(openCodeList, 15),
  254. TheSum = LotteryUtils.GetTheSum(openCodeList, 14, GetSumNumberCount(type))
  255. });
  256. }
  257. }
  258. return res.ToJson();
  259. }
  260. /// <summary>
  261. /// 大乐透、七星彩、排列3、排列5记录
  262. /// </summary>
  263. /// <param name="data"></param>
  264. /// <param name="type"></param>
  265. /// <returns></returns>
  266. private string AppendCommonResult(DataTable data, SCCLottery type)
  267. {
  268. List<QGCHistoryLotteryViewEntity> res = new List<QGCHistoryLotteryViewEntity>();
  269. if (data.Rows.Count > 0)
  270. {
  271. //总共球个数
  272. int total = type.GetEnumText().TryToInt32();
  273. for (int j = 0; j < data.Rows.Count; j++)
  274. {
  275. //开奖号集合
  276. List<int> openCodeList = new List<int>();
  277. StringBuilder builder = new StringBuilder();
  278. for (int i = 1; i <= total; i++)
  279. {
  280. int openCode = data.Rows[j]["OpenCode" + i].TryToInt32();
  281. openCodeList.Add(openCode);
  282. }
  283. builder.Append(GetOpenCodeTemplate(type, openCodeList));
  284. res.Add(new QGCHistoryLotteryViewEntity
  285. {
  286. Term = data.Rows[j]["Term"].ToStringEx(),
  287. OpenTime = data.Rows[j]["OpenTime"].TryToDateTimeToString("yyyy-MM-dd"),
  288. NormalOpenCode = builder.ToString(),
  289. ParityRatio = LotteryUtils.GetProportionOfJO(openCodeList),
  290. Parity = LotteryUtils.GetJOString(openCodeList),
  291. TheSum = LotteryUtils.GetTheSum(openCodeList, 0, GetSumNumberCount(type), false)
  292. });
  293. }
  294. }
  295. return res.ToJson();
  296. }
  297. /// <summary>
  298. /// 查询数据集
  299. /// </summary>
  300. /// <param name="type"></param>
  301. /// <param name="arg"></param>
  302. /// <returns></returns>
  303. private DataTable GetData(SCCLottery type, HistoryLotteryArgEnyity arg)
  304. {
  305. //查询结果
  306. string key = $"GetQGCHistoryLotteryList/{type.ToString()}/{arg.EnumCode}/{arg.TotalRecord}/{arg.StartTime}/{arg.Year}";
  307. DataTable o = null;
  308. if (webCache.IsExist(key))
  309. {
  310. o = webCache.GetObject<DataTable>(key) as DataTable;
  311. }
  312. else
  313. {
  314. //组装查询语句
  315. string sql = GetSeleteSQL(type, arg);
  316. o = commonBll.ExcuteSqlDataTable(sql, DatabaseLinksEnum.LotteryNumber, null);
  317. webCache.AddObject(key, o, (int)CacheTime.Data);
  318. }
  319. return o;
  320. }
  321. #endregion
  322. #region 公共私有方法
  323. /// <summary>
  324. /// 组装查询语句
  325. /// </summary>
  326. /// <param name="type">枚举码</param>
  327. /// <param name="arg"></param>
  328. /// <returns></returns>
  329. private string GetSeleteSQL(SCCLottery type, HistoryLotteryArgEnyity arg)
  330. {
  331. StringBuilder builder = new StringBuilder();
  332. string res = String.Empty;
  333. int total = type.GetEnumText().TryToInt32();
  334. string tableName = type.GetSCCLotteryTableName();
  335. for (int i = 1; i <= total; i++)
  336. {
  337. builder.Append("[OpenCode" + i + "],");
  338. }
  339. if (!arg.Year.HasValue)
  340. {
  341. arg.Year =0;
  342. }
  343. if (arg.TotalRecord > 0)
  344. {
  345. res = string.Format(GetLotterySqlByTableNameWithTop, arg.TotalRecord, StringHelper.DelLastChar(builder.ToString(), ","), tableName, arg.Year);
  346. }
  347. else if (!string.IsNullOrEmpty(arg.StartTime))
  348. {
  349. string time = arg.StartTime.CheckDateTime()
  350. ? arg.StartTime
  351. : DateTimeHelper.Now.AddDays(-7).ToString("yyyy-MM-dd");
  352. res = string.Format(GetLotterySqlByTableNameWithStartTime, StringHelper.DelLastChar(builder.ToString(), ","), tableName, time, arg.Year);
  353. }
  354. else if (arg.Year.HasValue)
  355. {
  356. res = string.Format(GetLotterySqlByTableName, StringHelper.DelLastChar(builder.ToString(), ","), tableName, arg.Year);
  357. }
  358. else
  359. {
  360. res = string.Format(GetLotterySqlByTableNameWithTop, "20", StringHelper.DelLastChar(builder.ToString(), ","), tableName, arg.Year);
  361. }
  362. return res;
  363. }
  364. #endregion
  365. #region SQL语句
  366. /// <summary>
  367. /// 通过年份表名查询数据为校验后的所有数据
  368. /// </summary>
  369. private static string GetLotterySqlByTableName = @"SELECT [ID],[Term],[OpenTime],[Spare],[ShiJiHao],[KaiJiHao],{0} FROM [dbo].[{1}] where year([OpenTime])={2} ORDER BY Term DESC ";//WHERE [IsChecked] = 1 AND [IsPassed] = 1
  370. /// <summary>
  371. /// 通过表名查询数据为校验后的前n行数据
  372. /// </summary>
  373. private static string GetLotterySqlByTableNameWithTop = @"SELECT TOP {0} [ID],[Term],[OpenTime],[Spare],[ShiJiHao],[KaiJiHao],{1} FROM [dbo].[{2}] where {3}=0 or year([OpenTime])={3} ORDER BY Term DESC ";//WHERE [IsChecked] = 1 AND [IsPassed] = 1
  374. /// <summary>
  375. /// 通过开奖时间查询数据为校验后的所有数据
  376. /// </summary>
  377. private static string GetLotterySqlByTableNameWithStartTime = @"SELECT [ID],[Term],[OpenTime],[Spare],[ShiJiHao],[KaiJiHao],{0} FROM [dbo].[{1}] WHERE DATEDIFF(DAY,'{2}',OpenTime) >= 0 and ({3}=0 or year([OpenTime])={3}) ORDER BY Term DESC";//AND [IsChecked] = 1 AND [IsPassed] = 1
  378. #endregion
  379. }
  380. }