using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; using ChuPiao.AutoPrint.Machine.Models; using ChuPiao.Common.Core.Utils; using ChuPiao.Common.Enums; using ChuPiao.Common.Models; namespace ChuPiao.AutoPrint.Machine.TjJingCaiV1.MacLotPlayMode { /// <summary> /// 竞彩足球混合过关 /// </summary> public class MacLotPlayModeJzHhggService : MacLotPlayModeService { public MacLotPlayModeJzHhggService() { PlayFullName = "竞彩足球混合过关"; } #region Overrides of MacLotPlayModeService /// <summary> /// 机器投注模式配置信息 /// </summary> /// <summary> /// 获得投注需要发送的键码列表 /// </summary> /// <param name="ticketEntity"></param> /// <param name="machineEntity"></param> /// <returns></returns> public override List<KeycodeInfo> GetSendKeycodeList(L_LotTicketEntity ticketEntity, M_MachineEntity machineEntity) { List<KeycodeInfo> keycodeList = new List<KeycodeInfo>(); M_MachineModeConfigEntity machineModeConfig = machineEntity.MachineModeConfigs[ticketEntity.MacModeId]; //初始化,每次都需要进入玩法的投注内容输入界面 keycodeList.AddRange(GetInitKeycodeList(machineModeConfig)); //投注号码 List<JcCodeEntity> codeList = DealPrintCode(ticketEntity.L_Code); foreach (JcCodeEntity jcCodeEntity in codeList) { //进入场次选择界面 //keycodeList.Add(new KeycodeInfo(WeekInitKey, machineModeConfig.C_SendKeyInterval)); //选择场次 for (int i = 0; i < jcCodeEntity.ChangCi.Length; i++) { keycodeList.Add(new KeycodeInfo(jcCodeEntity.ChangCi.Substring(i, 1), machineModeConfig.C_SendKeyInterval)); } //选择场次的玩法 switch (jcCodeEntity.PlayId) { case 91101: //keycodeList.Add(new KeycodeInfo("5", machineModeConfig.C_SendKeyInterval)); keycodeList.Add(new KeycodeInfo("6", machineModeConfig.C_SendKeyInterval)); break; case 91102: //keycodeList.Add(new KeycodeInfo("5", machineModeConfig.C_SendKeyInterval)); keycodeList.Add(new KeycodeInfo("2", machineModeConfig.C_SendKeyInterval)); break; case 91103: //keycodeList.Add(new KeycodeInfo("5", machineModeConfig.C_SendKeyInterval)); keycodeList.Add(new KeycodeInfo("3", machineModeConfig.C_SendKeyInterval)); break; case 91104: //keycodeList.Add(new KeycodeInfo("5", machineModeConfig.C_SendKeyInterval)); keycodeList.Add(new KeycodeInfo("4", machineModeConfig.C_SendKeyInterval)); break; case 91106: //keycodeList.Add(new KeycodeInfo("5", machineModeConfig.C_SendKeyInterval)); keycodeList.Add(new KeycodeInfo("1", machineModeConfig.C_SendKeyInterval)); break; } //选择投注号码 foreach (string s in jcCodeEntity.OneCodeList) { keycodeList.Add(new KeycodeInfo(s, machineModeConfig.C_SendKeyInterval)); } //投注号码确认 keycodeList.Add(new KeycodeInfo(ResultEnterKey, machineModeConfig.C_SendKeyInterval)); } //倍投 if (ticketEntity.L_Mutiple > 1) { keycodeList.AddRange(GetMultipleKeycodeList(ticketEntity.L_Mutiple, machineModeConfig)); } //过关方式 keycodeList.AddRange(GetGuoGuanKeycodeList(ticketEntity.L_CodeType, machineModeConfig)); //打印确认 keycodeList.Add(new KeycodeInfo(machineModeConfig.C_PrintConfirmKey, machineModeConfig.C_PrintConfirmKeyInterval)); //是否输入密码 keycodeList.AddRange(GetPasswordKeycodeList(ticketEntity, machineEntity, machineModeConfig)); return keycodeList; } /// <summary> /// 拆分投注号码 /// </summary> /// <param name="code"></param> /// <returns></returns> protected List<JcCodeEntity> DealPrintCode(string code) { List<JcCodeEntity> codeList = new List<JcCodeEntity>(); string[] changCiCodeArr = code.Split(CodeSplitStr.ToCharArray()); //表示有多少场 foreach (string changCiCode in changCiCodeArr) { JcCodeEntity jcCodeEntity = new JcCodeEntity(); string[] arr = changCiCode.Split(MatchCodeSplitStr.ToCharArray()); jcCodeEntity.ChangCi = arr[0]; string[] arrPlayAndCode = arr[1].Split('['); jcCodeEntity.PlayId = int.Parse(arrPlayAndCode[0]); string s = arrPlayAndCode[1].Replace("]", ""); string[] oneMatchCodeArr; switch (jcCodeEntity.PlayId) { case 91106: case 91101: oneMatchCodeArr = s.Split(SplitStr.ToCharArray()); jcCodeEntity.OneCodeList.AddRange(oneMatchCodeArr); break; case 91102: s = s.Replace("-", SplitStr); oneMatchCodeArr = s.Split(SplitStr.ToCharArray()); foreach (string TmpStr_1 in oneMatchCodeArr) { switch (TmpStr_1) { case "胜其它": jcCodeEntity.OneCodeList.Add("9"); jcCodeEntity.OneCodeList.Add("0"); break; case "平其它": jcCodeEntity.OneCodeList.Add("9"); jcCodeEntity.OneCodeList.Add("9"); break; case "负其它": jcCodeEntity.OneCodeList.Add("0"); jcCodeEntity.OneCodeList.Add("9"); break; default: jcCodeEntity.OneCodeList.AddRange(TmpStr_1.Split(':')); //去掉分号 break; } } break; case 91103: oneMatchCodeArr = s.Split(SplitStr.ToCharArray()); jcCodeEntity.OneCodeList.AddRange(oneMatchCodeArr); break; case 91104: s = s.Replace("-", SplitStr); oneMatchCodeArr = s.Split(SplitStr.ToCharArray()); jcCodeEntity.OneCodeList.AddRange(oneMatchCodeArr); break; } codeList.Add(jcCodeEntity); } return codeList; } /// <summary> /// 电子票解析 /// </summary> /// <param name="machineEntity"></param> /// <param name="decodePrintData"></param> /// <param name="ticketEntity"></param> public override void DecodeData(L_LotTicketEntity ticketEntity, M_MachineEntity machineEntity, DecodePrintData decodePrintData) { //M_MachineModeConfigEntity machineModeConfig = machineEntity.MachineModeConfigs[ticketEntity.MacModeId]; //抓取的返回 decodePrintData.L_PrintTicketEntity.P_PrnText = TicketTextUtil.CompressAndEncrypt(decodePrintData.InputData.CaptureDataBytes); //decodePrintData.L_PrintTicketEntity.P_SucTime = DateTime.Now; string input = decodePrintData.InputData.CaptureDataString; string strTemp; //票号、密码、期号解析 bool suc = DecodeHeadJc(ticketEntity, machineEntity, decodePrintData); if (!suc) { decodePrintData.ErrorMessage = string.Format("头部解析错误:{0}", decodePrintData.ErrorMessage); decodePrintData.DecodeSuccess = false; return; } Regex regex; Match match; #region 投注号码及赔率 List<string> dCodeList = new List<string>(); List<string> dRateList = new List<string>(); List<string> codeReferenceList = new List<string>(); //参考赔率 //金额 int startposition = input.IndexOf(decodePrintData.L_PrintTicketEntity.P_TicketCode) + 60; int endposition = input.IndexOf("本票最高可能固定奖金", startposition); strTemp = input.Substring(startposition, endposition - startposition);//包含投注内容的字符串 string[] tmpArr = strTemp.Split('\n');//投注内容临时数组 regex = new Regex(@"周(一|二|三|四|五|六|日)\d{3}\s{1,}(胜平负|让球胜平负|比分|总进球数|半全场胜平负)"); string line; Regex regexRq = new Regex(@"让球:主[\+-]\d{1,}"); Match matchRq; for (int i = 0; i < tmpArr.Length; i++) { line = tmpArr[i].Trim(); match = regex.Match(line); if (match.Success) { //解析让分,保存到参考赔率栏位 第3关 周六071 让球:主+1 string strRq = "主-0"; matchRq = regexRq.Match(line); if (matchRq.Success) { strRq = matchRq.Value.Trim().Replace("让球:", ""); } strTemp = match.Value; strTemp = Regex.Replace(strTemp, @"\s{1,}", " "); string[] arrChangCi = strTemp.Split(' '); if (arrChangCi.Length != 2) { decodePrintData.ErrorMessage += string.Concat("解析赔率场次失败:", match.Value); decodePrintData.DecodeSuccess = false; return; } string strChangCi = DealChangChi(arrChangCi[0]);//场次字符串 如:第1关 周四002 int playIdOfRate = 0; switch (arrChangCi[1]) { case "胜平负": playIdOfRate = 91106; break; case "让球胜平负": playIdOfRate = 91101; break; case "比分": playIdOfRate = 91102; break; case "总进球数": playIdOfRate = 91103; break; case "半全场胜平负": playIdOfRate = 91104; break; } codeReferenceList.Add(string.Format("{0}{1}{2}[{3}]", strChangCi, MatchCodeSplitStr, playIdOfRate, strRq));//某一场次的让球数据 i++;//场次的下一行为球队名称 如:主队:莫斯科火车头 Vs 客队:毕尔巴鄂竞技 i++;//球队名称的下一行为投注内容与赔率 如:胜@2.540元 string tmpCodeStr = ""; //while (!new Regex(@"M\0!\0a\0").IsMatch(tmpArr[i]) && !new Regex(@"选项固定奖金额").IsMatch(tmpArr[i])) //while (!new Regex(@"第\d{1,}关").IsMatch(tmpArr[i]) && !new Regex(@"选项固定奖金额").IsMatch(tmpArr[i])) //2017-05-27 关改成场了 while (!new Regex(@"第\d{1,}(关|场)").IsMatch(tmpArr[i]) && !new Regex(@"选项固定奖金额").IsMatch(tmpArr[i])) { //投注内容可能有多行 if (tmpArr[i].IndexOf("@") > 0 || new Regex(@"\d{0,}.\d{1,}元").IsMatch(tmpArr[i])) //有单独行 3.650元 .50元 { tmpCodeStr += tmpArr[i].Trim(); } i++; if (i >= tmpArr.Length) { break; } } i--; //if (ticketEntity.L_RateType == (int)JcRateType.Fixed) //{ dRateList.Add(string.Format("{0}{1}{2}[{3}]", strChangCi, MatchCodeSplitStr, playIdOfRate, DealRateCode(playIdOfRate, tmpCodeStr.Trim()))); //} //else //{ // dCodeList.Add(string.Format("{0}{1}{2}[{3}]", strChangCi, MatchCodeSplitStr, playIdOfRate, DealResultCode(playIdOfRate,tmpCodeStr.Trim()))); //} } } decodePrintData.L_PrintTicketEntity.L_CodeReference = string.Join(CodeSplitStr, codeReferenceList.ToArray());//让球 //解析组合过关的赔率 decodePrintData.L_PrintTicketEntity.L_CodeRate = string.Join(CodeSplitStr, dRateList.ToArray()); //投注内容 decodePrintData.L_PrintTicketEntity.P_Code = SplitRateDetailToCode(decodePrintData.L_PrintTicketEntity.L_CodeRate); #endregion decodePrintData.DecodeSuccess = true; } /// <summary> /// 处理赔率明细 /// </summary> /// <param name="Istr"></param> /// <returns></returns> private string DealRateCode(int playIdOfRate, string Istr) { string result = ""; switch (playIdOfRate) { case 91106: case 91101: result = DealRateCodeSpf(Istr); break; case 91102: result = DealRateCodeBf(Istr); break; case 91103: result = DealRateCodeZjq(Istr); break; case 91104: result = DealRateCodeBqc(Istr); break; } return result; } /// <summary> /// 处理赔率明细 /// </summary> /// <param name="Istr"></param> /// <returns></returns> private string DealRateCodeSpf(string Istr) { Istr = Regex.Replace(Istr, @"[^胜平负元@.+\d]{1}", ""); string tmpstr = ""; string OneStr = ""; for (int i = 0; i < Istr.Length; i++) { OneStr = Istr.Substring(i, 1); switch (OneStr) { case "+": tmpstr += SplitStr; break; case "@": tmpstr += "#"; break; case "胜": tmpstr += "3"; break; case "平": tmpstr += "1"; break; case "负": tmpstr += "0"; break; case "元": break; default: tmpstr += OneStr; break; } } //电子票上的赔率明细字符串 如:2#4.700,1#1.080 排序输出为 1#1.080,2#4.700 使其与用户投注号码的排序相同 tmpstr = SortRateText(CODE_SORT_DIECTIONRY_SPF, tmpstr); return tmpstr; } /// <summary> /// 处理赔率明细 /// </summary> /// <param name="Istr"></param> /// <returns></returns> private string DealRateCodeBf(string Istr) { Istr = Regex.Replace(Istr, @"[^():胜平负其它元@.+\d]{1}", ""); string tmpstr = ""; string OneStr = ""; for (int i = 0; i < Istr.Length; i++) { OneStr = Istr.Substring(i, 1); switch (OneStr) { case "+": tmpstr += SplitStr; break; case "@": tmpstr += "#"; break; case "(": case ")": case "元": break; default: tmpstr += OneStr; break; } } //电子票上的赔率明细字符串 如:2#4.700,1#1.080 排序输出为 1#1.080,2#4.700 使其与用户投注号码的排序相同 tmpstr = SortRateText(CODE_SORT_DIECTIONRY_BF, tmpstr); return tmpstr; } /// <summary> /// 处理赔率明细 /// </summary> /// <param name="Istr"></param> /// <returns></returns> private string DealRateCodeZjq(string Istr) { Istr = Regex.Replace(Istr, @"[^()元@.+\d]{1}", ""); string tmpstr = ""; string OneStr = ""; Istr = Istr.Replace("7+", "7"); for (int i = 0; i < Istr.Length; i++) { OneStr = Istr.Substring(i, 1); switch (OneStr) { case "+": tmpstr += SplitStr; break; case "@": tmpstr += "#"; break; case "(": case ")": case "元": break; default: tmpstr += OneStr; break; } } //电子票上的赔率明细字符串 如:2#4.700,1#1.080 排序输出为 1#1.080,2#4.700 使其与用户投注号码的排序相同 tmpstr = SortRateText(CODE_SORT_DIECTIONRY_ZJQ, tmpstr); return tmpstr; } /// <summary> /// 处理赔率明细 /// </summary> /// <param name="Istr"></param> /// <returns></returns> private string DealRateCodeBqc(string Istr) { Istr = Regex.Replace(Istr, @"[^()胜平负元@.+\d]{1}", ""); string tmpstr = ""; string OneStr = ""; Istr = Istr.Replace("7+", "7"); for (int i = 0; i < Istr.Length; i++) { OneStr = Istr.Substring(i, 1); switch (OneStr) { case "+": tmpstr += SplitStr; break; case "@": tmpstr += "#"; break; case "(": case ")": case "元": break; case "胜": tmpstr += "3-"; break; case "平": tmpstr += "1-"; break; case "负": tmpstr += "0-"; break; default: tmpstr += OneStr; break; } } tmpstr = tmpstr.Replace("-#", "#"); //电子票上的赔率明细字符串 如:2#4.700,1#1.080 排序输出为 1#1.080,2#4.700 使其与用户投注号码的排序相同 tmpstr = SortRateText(CODE_SORT_DIECTIONRY_BQC, tmpstr); return tmpstr; } //号码排序字典 3 表示胜 1 表示平 0 表示负 private const string CODE_SORT_DIECTIONRY_SPF = "3,1,0"; //号码排序字典 private const string CODE_SORT_DIECTIONRY_BF = "1:0,2:0,2:1,3:0,3:1,3:2,4:0,4:1,4:2,5:0,5:1,5:2,胜其它,0:0,1:1,2:2,3:3,平其它,0:1,0:2,1:2,0:3,1:3,2:3,0:4,1:4,2:4,0:5,1:5,2:5,负其它"; //号码排序字典 1 表示胜 2 表示负 private const string CODE_SORT_DIECTIONRY_ZJQ = "0,1,2,3,4,5,6,7"; //号码排序字典 1 表示胜 2 表示负 private const string CODE_SORT_DIECTIONRY_BQC = "3-3,3-1,3-0,1-3,1-1,1-0,0-3,0-1,0-0"; #endregion } }