using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using ChuPiao.AutoPrint.Machine;
using ChuPiao.AutoPrint.Machine.Models;
using ChuPiao.Common.Core.Net;
using ChuPiao.Common.Enums;
using ChuPiao.Common.Models;
using ChuPiao.Common.Utils;
using log4net;
namespace ChuPiao.AutoPrint.Services.OpenCode
{
///
/// 开奖号码抓取服务
///
public class JdOpenCodeSnapService : IOpenCodeSnapService
{
private DateTime _lastSnapOpenCodeSucTime=DateTime.MinValue;
private ILotMachine _lotMachine;
public JdOpenCodeSnapService(ILotMachine lotMachine)
{
_lotMachine = lotMachine;
}
private int _snapOpenCodeInterval = 5;
///
/// 抓取开奖号码时间间隔(秒)
///
public int SnapOpenCodeInterval
{
get
{
//if (_snapOpenCodeInterval < 0)
//{
// try
// {
// _snapOpenCodeInterval = int.Parse(ConfigurationManager.AppSettings["SnapOpenCodeInterval"]);
// }
// catch (Exception ex)
// {
// _lotMachine.Log.Info(string.Concat("读取SnapOpenCodeInterval配置异常", ex.Message));
// _snapOpenCodeInterval = 5;
// }
//}
return _snapOpenCodeInterval;
}
}
///
/// 判断是否可以抓取开奖结果报表
///
///
public bool AllowSnap()
{
////抓取间隔判断
//TimeSpan timeSpan = DateTime.Now.Subtract(_lastSnapOpenCodeSucTime);
//if (timeSpan.TotalSeconds < SnapOpenCodeInterval)
//{
// return false;
//}
//Database database = DBSetting.Instance.GetDataBase("jddb");
//SqlConnection conn = null;
//try
//{
// conn = new SqlConnection(database.ConnectionString);
// conn.Open();
// //距离官方开奖前5秒开始抓取
// string sql = string.Format("select count(e_id) from jd_expect with(nolock) where e_status=200 and e_opentime<'{0}'", DateTime.Now.AddSeconds(3).ToString("yyyy-MM-dd HH:mm:ss"));
// object obj = SqlHelper.ExecuteScalar(conn, CommandType.Text, sql);
// if (obj != DBNull.Value)
// {
// int waitOpenNum = Convert.ToInt32(obj);
// if (waitOpenNum < 1)
// {
// _lotMachine.Log.Info("没有需要抓取开奖号码的期号");
// return false;
// }
// }
//}
//finally
//{
// if (conn != null)
// {
// conn.Close();
// }
//}
return true;
}
///
/// 多乐彩开奖号码
///
///
public bool SnapOpenCode()
{
bool result = true;
try
{
_lotMachine.Log.Info("开始抓取多乐彩开奖号码……");
CaptureDataInfo captureData = _lotMachine.PrintOpenCodeReport((int) Lottype.Jd);
_lastSnapOpenCodeSucTime = DateTime.Now;
if (captureData.CaptureDataBytes.Length == 0)
{
_lotMachine.Log.Info("抓取多乐彩开奖号码电子票长度为0");
return true;
}
OpenCodeResult openCodeResult = DecodeDlData(captureData);
if (openCodeResult.DecodeSuccess)
{
if (openCodeResult.OpenCodeList.Count == 0)
{
_lotMachine.Log.Info("抓取多乐彩开奖号码个数为0");
return true;
}
//更新数据库
UpdateMachineOpenCodeToLotteryDb((int)Lottype.Jd, openCodeResult, _lotMachine.Log);
}
else
{
_lotMachine.Log.Warn(string.Concat("解析多乐彩开奖号码失败。错误信息:", openCodeResult.ErrorMessage));
result = false;
}
}
catch (Exception exception)
{
_lotMachine.Log.Error(string.Concat("抓取多乐彩开奖号码异常。错误信息:", exception));
result = false;
}
return result;
}
public OpenCodeResult DecodeDlData(CaptureDataInfo captureData)
{
OpenCodeResult result = new OpenCodeResult();
result.CaptureData = captureData;
/*
@c3\n
c4\0(F\0\0?(F\0\0?3M\0!\0a\0L\0\0W\0E\0KJrL\0\0W\0M!a3开 奖 结 果 报 表\n
\n
M\0!\0a\0玩法名称: 江西多乐彩\r\n
报表日期: 2013-09-03\r\n
查询时间: 2013-09-03 22:01:07\r\n
起止奖期: 090301 - 090378\r\n
奖期 开奖结果 奖期 开奖结果 \r\n
378 08+03+11+02+07 339 09+11+06+07+05\r\n
377 05+01+07+10+06 338 11+07+02+08+03\r\n
376 02+09+08+10+06 337 01+06+08+11+04\r\n
375 06+07+03+05+09 336 10+01+07+03+08\r\n
374 05+09+11+02+08 335 03+02+10+09+07\r\n
373 09+04+01+02+03 334 11+10+09+03+06\r\n
372 09+01+05+03+06 333 03+09+11+07+01\r\n
371 03+11+01+06+09 332 03+08+05+07+01\r\n
370 03+10+05+09+02 331 06+01+09+04+11\r\n
369 02+01+05+07+06 330 01+03+07+02+09\r\n
368 03+05+07+04+10 329 03+08+02+05+11\r\n
367 08+03+02+01+09 328 11+03+04+06+02\r\n
366 08+03+07+09+01 327 10+07+11+02+01\r\n
365 11+01+09+02+03 326 10+06+02+07+01\r\n
364 02+05+11+04+07 325 03+08+09+07+10\r\n
363 06+11+09+07+01 324 04+01+08+11+02\r\n
362 06+05+03+02+07 323 05+07+11+10+09\r\n
361 07+04+01+05+02 322 10+05+08+01+06\r\n
360 10+04+05+08+07 321 04+10+03+11+09\r\n
359 08+03+11+01+04 320 01+09+11+10+07\r\n
358 07+02+06+11+01 319 11+01+07+06+09\r\n
357 09+03+06+05+02 318 03+07+02+09+01\r\n
356 09+03+10+04+01 317 05+03+10+01+11\r\n
355 06+09+04+05+10 316 01+09+02+03+11\r\n
354 09+08+01+02+07 315 07+02+04+06+05\r\n
353 10+02+04+05+03 314 04+07+03+02+09\r\n
352 02+04+01+07+08 313 03+07+09+04+05\r\n
351 11+08+09+06+10 312 04+05+10+06+03\r\n
350 10+07+03+02+04 311 02+07+05+08+03\r\n
349 05+01+02+08+04 310 06+01+10+08+07\r\n
348 05+01+02+10+04 309 03+10+08+05+07\r\n
347 02+03+10+04+07 308 09+01+03+02+10\r\n
346 03+04+06+11+02 307 09+10+06+08+02\r\n
345 11+01+05+09+10 306 02+08+10+11+07\r\n
344 07+02+11+01+09 305 02+06+04+09+11\r\n
343 01+02+08+04+05 304 04+10+01+03+07\r\n
342 10+05+03+06+04 303 03+09+05+07+02\r\n
341 07+03+09+08+06 302 08+03+02+01+07\r\n
340 09+04+10+05+07 301 06+10+07+04+05\r\n
\n
3 \n
\n
\n
\n
\fV
*/
string input = captureData.CaptureDataString;
//彩种
Regex regex = new Regex(@"玩法名称[:|:]\s{0,}(.*)");
Match match = regex.Match(input);
if (!match.Success)
{
result.ErrorMessage = "没有找到彩种信息";
result.DecodeSuccess = false;
return result;
}
if (match.Groups.Count != 2)
{
result.ErrorMessage = string.Format("解析彩种错误,字符串:{0}", match.Value);
result.DecodeSuccess = false;
return result;
}
result.LotName = match.Groups[1].Value;
if (result.LotName.IndexOf("江苏11选5") < 0)
{
result.ErrorMessage = "彩种错误";
result.DecodeSuccess = false;
return result;
}
//报表日期
regex = new Regex(@"报表日期[:|:]\s{0,}\d{4}-\d{2}-\d{2}");
match = regex.Match(input);
if (!match.Success)
{
result.ErrorMessage += "没有找到报表日期";
result.DecodeSuccess = false;
return result;
}
string strTemp = match.Value;
strTemp = Regex.Replace(strTemp, @"报表日期[:|:]\s{0,}", "");
strTemp = strTemp.Trim();
DateTime reportdate;
bool sucReportDate = DateTime.TryParse(strTemp, out reportdate);
if (sucReportDate)
{
result.ReportDate = reportdate;
}
//查询时间
regex = new Regex(@"查询时间[:|:]\s{0,}\d{4}-\d{2}-\d{2}\s{1,}\d{2}:\d{2}:\d{2}");
match = regex.Match(input);
if (!match.Success)
{
result.ErrorMessage += "没有找到查询时间";
result.DecodeSuccess = false;
return result;
}
strTemp = match.Value;
strTemp = Regex.Replace(strTemp, @"查询时间[:|:]\s{0,}", "");
strTemp = strTemp.Trim();
strTemp = Regex.Replace(strTemp, @"\s+", " ");
DateTime querytime;
bool sucQueryTime = DateTime.TryParse(strTemp, out querytime);
if (sucQueryTime)
{
result.QueryTime = querytime;
}
//起止奖期
regex = new Regex(@"起止奖期[:|:]\s{0,}\d{6}\s{0,}-\s{0,}\d{6}");
match = regex.Match(input);
if (!match.Success)
{
result.ErrorMessage += "没有找到起止奖期";
result.DecodeSuccess = false;
return result;
}
strTemp = match.Value;
strTemp = Regex.Replace(strTemp, @"起止奖期[:|:]\s{0,}", "");
string[] arr = strTemp.Split('-');
if(arr.Length!=2)
{
result.ErrorMessage += "起止奖期解析错误";
result.DecodeSuccess = false;
return result;
}
string expectPrefix = DateTime.Now.ToString("yy");
string beginExpect = expectPrefix + arr[0].Trim();
string endExpect = expectPrefix + arr[1].Trim();
if (beginExpect.Length != 8 || endExpect.Length != 8)
{
result.ErrorMessage += "起止奖期长度错误";
result.DecodeSuccess = false;
return result;
}
result.BeginExpect = beginExpect;
result.EndExpect = endExpect;
//开奖结果
string[] inputLines = input.Split('\n');
int beginLineNum = -1;
for (int i = 0; i < inputLines.Length; i++)
{
string line = inputLines[i];
if(!string.IsNullOrEmpty(line) && line.IndexOf("奖期")>=0 && line.IndexOf("开奖结果")>=0)
{
beginLineNum = i+1;//下一行即为开奖结果列表
break;
}
}
if(beginLineNum<0)
{
result.ErrorMessage += "开奖结果起始行未找到";
result.DecodeSuccess = false;
return result;
}
for (int i = beginLineNum; i < inputLines.Length; i++)
{
string line = inputLines[i];
if (line.Length < 18)//340 09+04+10+05+07
{
break;
}
regex = new Regex(@"\d{3}\s{1,}\d\d\+\d\d\+\d\d\+\d\d\+\d\d");
MatchCollection machCollection = regex.Matches(line);
if (machCollection.Count < 1)
{
result.ErrorMessage = "没有找到开奖结果";
result.DecodeSuccess = false;
return result;
}
foreach (Match match1 in machCollection)
{
string opencodestr = match1.Value.Trim();
string expectsuffix_e = opencodestr.Substring(0, 3).Trim();//电子票期号后缀
string opencode_e = opencodestr.Substring(4).Trim().Replace("+", ",");//电子票开奖号码
string expect_e = DateTime.Now.ToString("yyyyMMdd").Substring(2, 5) + expectsuffix_e;//电子票期号
result.OpenCodeList.Add(new OpenCodeEntity(expect_e,opencode_e));
}
}
result.DecodeSuccess = true;
return result;
}
///
/// 更新彩票机对阵到数据库
///
public void UpdateMachineOpenCodeToLotteryDb(int lotId, OpenCodeResult openCodeResult, ILog log)
{
//L_ExpectService expectService = new L_ExpectService();
//Database database = DBSetting.Instance.GetDataBase("jddb");
//SqlConnection conn = null;
//try
//{
// conn = new SqlConnection(database.ConnectionString);
// conn.Open();
// string expectPrefix = DateTime.Now.ToString("yyMMdd");
// if (!openCodeResult.BeginExpect.StartsWith(expectPrefix) || !openCodeResult.EndExpect.StartsWith(expectPrefix))
// {
// log.Warn(string.Concat("起止奖期 ", openCodeResult.BeginExpect,"-",openCodeResult.EndExpect, " 非当天期号,不允许添加,请检查机器开奖号码及获取开奖是否有异常"));
// return;
// }
// foreach (OpenCodeEntity openCodeEntity in openCodeResult.OpenCodeList)
// {
// L_ExpectEntity expectEntity = expectService.GetExpect(lotId, openCodeEntity.Expect);
// if (expectEntity != null)
// {
// DateTime opentime = expectEntity.E_OpenTime.AddMinutes(-1);
// if (DateTime.Now < opentime)
// {
// log.Warn(string.Concat("期号 ", expectEntity.E_Expect, "开奖时间为:", opentime, " 当前时间", DateTime.Now, " 还没到开奖时间 不允许添加,请检查机器开奖号码及获取开奖是否有异常"));
// continue;
// }
// if (expectEntity.E_OpenCode == openCodeEntity.OpenCode)
// {
// log.Info(string.Concat("期号 ", openCodeEntity.Expect, " 开奖号码 ", openCodeEntity.OpenCode, " 数据库已存在"));
// }
// else
// {
// if(!string.IsNullOrEmpty(expectEntity.E_OpenCode))
// {
// log.Warn(string.Concat("期号 ", openCodeEntity.Expect, " 开奖号码不一致,数据库:", expectEntity.E_OpenCode," 彩票机:", openCodeEntity.OpenCode, ",请检查核对"));
// }
// }
// if (expectEntity.E_Status == (int)ExpectStatus.WaitOpen || expectEntity.E_OpenCode != openCodeEntity.OpenCode)
// {
// expectEntity.E_OpenCode = openCodeEntity.OpenCode;
// expectEntity.E_GetOpenCodeTime = openCodeResult.QueryTime;
// expectEntity.E_Status = (int)ExpectStatus.WaitSetPrize;
// expectService.UpdateOpenCodeInformationAndStatus(expectEntity);
// Jd_ExpectDao dlExpectDao = new Jd_ExpectDao();
// dlExpectDao.UpdateUploadStatus(expectEntity.E_Expect, NotifyStatus.NotifyAble);
// log.Info(string.Concat("期号 ", openCodeEntity.Expect, " 开奖号码 ", openCodeEntity.OpenCode, " 更新到数据库"));
// }
// }
// }
//}
//finally
//{
// if (conn != null)
// {
// conn.Close();
// }
//}
}
}
}