Commit bfbf66af Harvey

no message

1 个父辈 6a639c77
import {Match} from './match'
import {Issue} from './issue'
import {Lottery} from './lottery'
import {Odds100} from './odds100'
import {MatchJson} from './matchJson'
import {Team,NBATeam} from './team'
export{
Match,
Issue,
Lottery,
Odds100,
Team,
NBATeam,
MatchJson,
};
const pginfo =require( '../table');
const Issue = pginfo.core_issue;
export {Issue};
const pginfo =require( '../table');
const Lottery = pginfo.core_lottery;
export {Lottery};
\ No newline at end of file
import * as pginfo from '../table';
pginfo.core_match.belongsTo(pginfo.core_lottery, { foreignKey: 'LotteryId' });
pginfo.core_match.belongsTo(pginfo.core_issue, { foreignKey: 'IssueId' } );
const Match = pginfo.core_match;
export {Match};
/**
* Created by sunney on 7/3/17.
*/
const pginfo =require( '../table');
const MatchJson = pginfo.T_MatchJson;
export {MatchJson};
\ No newline at end of file
const pginfo =require( '../table');
const News = pginfo.core_news;
export {News};
/**
* Created by sunney on 6/7/17.
*/
const pginfo =require( '../table');
const Odds100 = pginfo.T_Odds100;
const NBAOdds100 = pginfo.T_Odds100;
export {Odds100};
/**
* Created by sunney on 6/7/17.
*/
const pginfo =require( '../table');
const Team = pginfo.T_Team;
const NBATeam = pginfo.T_NBATeam;
export {Team,NBATeam};
import * as info_db from '../../info_mysql/table';
//充值接口控制充值通道
export async function getRechargeChannelsList({ root, args, context }: any) {
let where :any={
is_enable: 1
}
if(process.env.ALPHA){//灰度
where={}
}
let ms_recharge_channels_list: any = JSON.parse(JSON.stringify(await info_db.ms_recharge_channels.findAndCountAll({
where: where,
order: [["sort_serial", "DESC"]]
})))
return ms_recharge_channels_list.rows;
}
import { db as Info } from '../table'
import _ = require('lodash');
import redis = require('redis');
const config = require("../../../../config");
import moment = require('moment');
import api_hemera = require('../../../api_hemera');
export const historySameOddsTemp= {
"ResultSps": null,
"BetSps": null,
"AllCount": null,
"WinCount": null,
"FlatCount": null,
"LostCount": null,
"WinRate": null,
"FlatRate": null,
"LostRate": null,
"SameOddsList": null,
"LastEndBet": null
}
export async function getHistorySameOdds(winBet:any,flatBet:any,lossBet:any){
//只比较最小的两个,winBet>5.0的时候比较负、平, 浮动0.02
let delta = 0.02
if(isNaN(winBet)||isNaN(winBet)||isNaN(winBet)){
throw "获取历史同赔参数错误"
}
let sql = `select * from ms_soccer_hdaodds_814
where
last_odds_win>=${(parseFloat(winBet)-delta).toFixed(2)} and last_odds_win<=${(parseFloat(winBet)+delta).toFixed(2)}
and last_odds_draw>=${(parseFloat(flatBet)-delta).toFixed(2)} and last_odds_draw<=${(parseFloat(flatBet)+delta).toFixed(2)}`
if(parseFloat(winBet)>3.1){
sql = `select * from ms_soccer_hdaodds_814
where
last_odds_loss>=${(parseFloat(lossBet)-delta).toFixed(2)} and last_odds_loss<=${(parseFloat(lossBet)+delta).toFixed(2)}
and last_odds_draw>=${(parseFloat(flatBet)-delta).toFixed(2)} and last_odds_draw<=${(parseFloat(flatBet)+delta).toFixed(2)}`
}
let list =await Info.db.query(sql)
if(list!=null&&list.length>0){
list=list[0]
let result:any = {
"ResultSps": null,
"BetSps": null,
"AllCount": list.length,
"WinCount": _.filter(list,(item)=>{return item.home_score>item.away_score}).length,
"FlatCount": _.filter(list,(item)=>{return item.home_score==item.away_score}).length,
"LostCount": _.filter(list,(item)=>{return item.home_score<item.away_score}).length,
"WinRate": null,
"FlatRate": null,
"LostRate": null,
"SameOddsList": JSON.stringify(_.map(list,(item)=>{
return {
BeginTime: moment.unix(item.game_date/1000).format('YYYY-MM-DD'),
HostTeamId: item.home_team_id,
HostTeam: item.home_team_name,
GuestTeamId: item.away_team_id,
GuestTeam: item.away_team_name,
HostScore: item.home_score,
GuestScore: item.away_score,
ShortName: item.competition_name,
}
})),
"LastEndBet": null
}
if(result.AllCount>0){
result.WinRate = (result.WinCount/result.AllCount).toFixed(4)
result.FlatRate = (result.FlatCount/result.AllCount).toFixed(4)
result.LostRate = (result.LostCount/result.AllCount).toFixed(4)
}
return result
}
return historySameOddsTemp
}
\ No newline at end of file
import * as Core from '../table';
import Model = require('../model');
import moment = require('moment');
import _ = require('lodash');
const config = require("../../../../config");
import { cache,redis as client, redis, task_lock } from '../../../cache'
async function Issue(issueId: any) {
let t = await Model.Issue.findOne({
where: {
Id: issueId
}
});
return t;
};
const Issues = async (root: any, args: any, context: any, isUpdateCache: any = false) => {
let lotId = 72
if (parseInt(args.lotId) > 0) {
lotId = parseInt(args.lotId)
}
// console.info(args);
return cache(async ({lotId,limit}: any) => {
let sql = `select * from core_issue where LotteryId=${lotId}
and (EndTime<'${moment().add(3, `hour`).format(`YYYY-MM-DD HH:mm:ss`)}')
order by Name desc limit ${args.limit||30}
`
if([45,73,72,74,75].includes(lotId)&&(args.is_end==null||args.is_end==1)){
let old_match: any = await Core.Match.findOne({
where: {
//MatchTime:{$lt:`${moment().add(-118,"minute").format(`YYYY-MM-DD HH:mm:ss`)}`},
//IssueName:`${moment().format(`YYYY-MM-DD HH:mm:ss`)}`,
LotteryId: lotId,
MatchState: '完',
},
limit: 1,
order: [["MatchTime", "desc"]]
})
if (old_match != null) {
if(lotId==72&&old_match.IssueName!=moment().format(`YYYY-MM-DD`)){
sql = `select * from core_issue where LotteryId=${lotId}
and (EndTime<'${moment().add(3, `hour`).format(`YYYY-MM-DD HH:mm:ss`)}')
order by Name desc limit ${args.limit||30}
`
}else{
sql = `select * from core_issue where LotteryId=${lotId}
and Name<='${old_match.IssueName}'
order by StartTime desc limit ${args.limit||30}
`
}
}
}
else if([45,72,73,74,75].includes(lotId)){
// 1 完场的期号 2 是未完场的期号 3不限制是否完场 0 代表当前期号
switch(args.is_end){
case 2:
sql = `select * from core_issue where LotteryId=${lotId}
and EndTime>'${moment().format(`YYYY-MM-DD HH:mm`)}'
order by Name desc limit ${args.limit||30}
`;
break;
case 3:
sql = `select * from core_issue where LotteryId=${lotId}
and StartTime>'${moment().add(-100,`day`).format(`YYYY-MM-DD HH:mm:ss`)}'
order by Name desc limit ${args.limit||30}
`;
break;
case 0:
sql = `select * from core_issue where LotteryId=${lotId}
and StartTime>'${moment().add(-3,`hour`).format(`YYYY-MM-DD HH:mm:ss`)}'
order by Name asc limit 1
`;
break;
}
}
// console.info(sql);
let t = await Core.sequelize.query(sql)
t = checkList(t);
return t;
}, {lotId,is_end:args.is_end}, 5, "pginfo_issue:vy5", 60, 100)
};
const MatchTimes = async (root: any, args: any, context: any, isUpdateCache: any = false) => {
let lotId = 72
if (parseInt(args.lotId) > 0) {
lotId = parseInt(args.lotId)
}
let key = `${config.CachePrefix}match:matchMatchDates:v1_${args.lotId}`
let reply = await client.get(key);
try {
if (reply && reply.length > 0 && !isUpdateCache) {
return JSON.parse(reply)
}
} catch (e:any) {
console.info(e)
}
let sql = `
select distinct to_char("MatchTime",'YYYY-MM-DD') as "MatchTime"
from core_match
where "LotteryId"=${lotId} and "MatchTime">'${moment().add(-20, 'day').format('YYYY-MM-DD')}'
ORDER BY "MatchTime" desc limit 13
`
let t = await Core.sequelize.query(sql)
t = checkList(t)
t = _.map(t, o => o.MatchTime)
await client.set(key, JSON.stringify(t))
client.expire(key, 60)
return t;
};
function checkList(list: any) {
if (list && list.length > 0) {
return list[0]
}
return []
}
export { Issue, Issues, MatchTimes }
import * as _ from 'lodash';
import * as api_hemera from '../../../api_hemera'
import * as moment from 'moment'
import { cache } from '../../../cache'
import db = require('../table');
export async function getlineupfromsporttery({ sportsdt_gameid, type, lotteryId, issueName, matchNumber }: any) {
// let gameprediction = await cache(async (args: any) => {
// return await api_hemera.query('sport', `getgameprediction`, {}, { gameid: args.gameid })
// }, { gameid: sportsdt_gameid }, 30, 'getgameprediction')
// let dataLineup = gameprediction.Lineup
try {
if(moment(issueName)>moment().add(1,'day')){
throw "时间范围不正确"
}
let t: any = await db.sporttery_match_lineup.findOne({
where: {
issue_name: issueName,
match_number: matchNumber
}
})
if (t == null) {
return JSON.stringify([
["", "", ""],
[],
[],
[],
[],
[],
[],
])
}
let jsonBody = t
//let Formation = ['', dataLineup.HFormation, dataLineup.AFormation]
let Formation = [``, ``, ``]
if (jsonBody.referee_name != null)
Formation[0] = jsonBody.referee_name
let positionName: any = {
Goalkeeper: "守门员",
Defender: "后卫",
Midfielder: "中场",
Attacker: "前锋",
}
let position_x_name: any = {
"":"0",
GK: '1',
D1: '2',
D2: '3',
D: '3',
DM: '4',
M: '5',
AM: '6',
A: '7',
}
let position_y_name: any = {
"":"0",
L: '1',
CL: '2',
C: '3',
CR: '4',
R: '5',
}
let h_lineups_info_lineups: any = _.map(jsonBody.h_lineups_info.lineups, (item: any) => {
return [item.shirtnumber,
item.person,
positionName[item.position],
position_x_name[item.position_x],
position_y_name[item.position_y]
]
})
let a_lineups_info_lineups: any = _.map(jsonBody.a_lineups_info.lineups, (item: any) => {
return [item.shirtnumber,
item.person,
positionName[item.position],
position_x_name[item.position_x],
position_y_name[item.position_y]
]
})
let h_lineups_info_lineups_bench = _.map(jsonBody.h_lineups_info.lineups_bench, (item: any) => {
return [item.shirtnumber,
item.person,
positionName[item.position],
"0",
"0"
]
})
let a_lineups_info_lineups_bench = _.map(jsonBody.a_lineups_info.lineups_bench, (item: any) => {
return [item.shirtnumber,
item.person,
positionName[item.position],
"0",
"0"
]
})
for (let i = 2; i <= 7; i++) {
let leng: any = _.countBy(h_lineups_info_lineups, (item: any) => { return item[3] + '' == i + '' })
if (leng.true > 0) {
Formation[1] = `${Formation[1]}${leng.true}`
}
}
for (let i = 2; i <= 7; i++) {
let leng: any = _.countBy(a_lineups_info_lineups, (item: any) => { return item[3] + '' == i + '' })
if (leng.true > 0) {
Formation[2] = `${Formation[2]}${leng.true}`
}
}
return JSON.stringify([
Formation,
h_lineups_info_lineups,
a_lineups_info_lineups,
h_lineups_info_lineups_bench,
a_lineups_info_lineups_bench,
[],
[],
])
} catch (e:any) {
return JSON.stringify([
["", "", ""],
[],
[],
[],
[],
[],
[],
])
}
}
export async function get_sports_injury(gameid: Number) {
try {
let gameprediction = await cache(async (args: any) => {
return await api_hemera.query('sport', `getgameprediction`, {}, { gameid: args.gameid })
}, { gameid: gameid }, 30, 'getgameprediction')
// 状态,整型
// 0:后备球员
// 1:停赛球员
// 2:伤病球员
// 3:首发球员
// 4:其它原因缺阵球员
// const Ontype = ["受伤", "伤疑", "停赛", "国家队上调", "预计缺席"]
// const StateType = ["不出战", " 出战"]
let injuries_info_h_injuries: any = _.map(
_.filter(gameprediction.Lineup.HomePlayers, (o) => { return o.Status == 2 || o.Status == 1 }), (item: any) => {
if (item.Status == 1) {
return { "Id": item.Id, "Name": item.Name, "ShirtNum": item.ShitNo, "State": 0, "On": 2 }
} else {
return { "Id": item.Id, "Name": item.Name, "ShirtNum": item.ShitNo, "State": 0, "On": 0 }
}
})
let injuries_info_a_injuries: any = _.map(
_.filter(gameprediction.Lineup.AwayPlayers, (o) => { return o.Status == 2 || o.Status == 1 }), (item: any) => {
if (item.Status == 1) {
return { "Id": item.Id, "Name": item.Name, "ShirtNum": item.ShitNo, "State": 0, "On": 2 }
} else {
return { "Id": item.Id, "Name": item.Name, "ShirtNum": item.ShitNo, "State": 0, "On": 0 }
}
})
return JSON.stringify({
Home: injuries_info_h_injuries,
Away: injuries_info_a_injuries
})
} catch (e:any) {
return JSON.stringify({
Home: [],
Away: []
})
}
}
import Model = require('../model');
import sequelize = require('sequelize');
import moment = require('moment');
import _ = require('lodash');
import api_hemera = require('../../../api_hemera');
import ms_schedule = require('./ms_schedule');
import * as nami_data from '../../../nami/nami_data';
import { cache,redis as client, redis, task_lock } from '../../../cache'
const config = require("../../../../config");
import Core = require('../table');
import * as info_db from '../table'
import md5 = require('md5');
import * as zlib from 'zlib';
const matchlock = { flag: false };
export async function start_realtime_message_task(){
}
export async function gp_liveScore(root: any, args: any, context: any) {
//return await matchImp.liveScore(root, args, context, null);
let result = await liveScore({}, args, {}, null);
// let result = await cache(async (args: any) => {
// return await liveScore({}, args, {}, null)
// }, args, 3, 'liveScore:v1')
// let result = await cache(async (args: any) => {
// let result = await liveScore({}, args, {}, null);
// let buffer = await zlib.gzipSync(JSON.stringify(result))
// let z_result = buffer.toString("base64");
// return z_result
// }, args, 3, 'liveScore:v2')
// if(result){
// const buffer = Buffer.from(result, 'base64');
// let str_json_result = (await zlib.unzipSync(buffer)).toString();
// result = JSON.parse(str_json_result)
// }
//弥补ios客户端错误,将count=0的强制为null
if (result == null || result.count == 0) {
return {
count: 0,
matchs: null,
}
}
//
//获取nami的足球实时比分数据
try {
if(args.matchState=='未'&&[72,45].includes(args.lottery_id) ){
result.matchs = await this.addNamiScoreLiveData(result.matchs)
}
} catch (e) {
console.info(e);
}
return result
}
const liveScore = async (root: any, args: any, context: any, isUpdateCache: any) => {
let md5Result = md5(JSON.stringify(args)).toUpperCase()
//add test
let key = `${config.CachePrefix}match:match_liveScore:v11_t_${md5Result}`
let keyCount = `${config.CachePrefix}match:match_liveScoreCount:v11_t_${md5Result}`
let reply = null
//isUpdateCache = true;
if (!isUpdateCache)
reply = await get10SecondsCache(key, keyCount)
if (reply != null && !isUpdateCache) {
return reply
}
//数据库出现问题的话,则使用24小时的缓存
if (matchlock.flag && !isUpdateCache) {
reply = await get24HoursCache(key, keyCount)
return reply
} else {
reply = await get24HoursCache(key, keyCount)
if (reply && args.coreIds == null) {
doGetLiveScore(root, args, context, isUpdateCache, key, keyCount)
return reply
} else {
return await doGetLiveScore(root, args, context, isUpdateCache, key, keyCount)
}
}
return await doGetLiveScore(root, args, context, isUpdateCache, key, keyCount)
};
async function doGetLiveScore(root: any, args: any, context: any, isUpdateCache: any, key: any, keyCount: any) {
try {
matchlock.flag = true
//检查参数
let where = await getWheres(args)
//检查分页
let { limit, offset, order } = checkPages(args);
//从数据库中获取数据
let { t, count } = await queryMatchsFromDb(limit, where, offset, order, args);
let counts: any = count[0] || 0
//记录查询锁
matchlock.flag = false
//实时整理初始的数据,足球与篮球通用,不需要查询微服务的部分
t = initBaseMatchsData(t);
//获取7M sportsdt的数据,足球与篮球通用
try {
t = await initSportsdtBaseData(t);
} catch (e) {
console.info(e);
}
//获取7M的足球实时比分数据
try {
t = await addSportsdtScoreLiveData(t);
} catch (e) {
console.info(e);
}
//获取nami的足球实时比分数据
try {
t = await addNamiScoreLiveData(t);
} catch (e) {
console.info(e);
}
//获取7M的篮球实时比分数据
try {
t = await addSportsdtBasketballLiveData(t);
} catch (e) {
console.info(e);
}
//计算情报数据
t = getSportsInfoCount(t)
//测试数据,此部分的代码只是为了测试使用
if (args.isTest != null && args.isTest == 1) {
addTestData(t);
}
//重新排序
//t= JSON.parse( JSON.stringify(t))
if(args.order==null){
t = _.concat(
_.filter(t, (o: any) => o.MatchState != "未" && o.Sportsdt && o.Sportsdt.SportsdtMatchId),
_.filter(t, (o: any) => o.MatchState == "未" && o.Sportsdt && o.Sportsdt.SportsdtMatchId)
)
}
if (args.infoId && t.length > 1) {
//优先使用竞足的数据
t = _.concat(
_.orderBy(_.filter(t, (o: any) => o.LotteryId == 72), ['MatchTime'], ['desc']),
_.orderBy(_.filter(t, (o: any) => o.LotteryId == 45), ['MatchTime'], ['desc']),
_.orderBy(_.filter(t, (o: any) => o.LotteryId != 72 && o.LotteryId != 45), ['MatchTime'], ['desc'])
)
//t=_.orderBy(t,['MatchTime'],['desc'])
t = _.take(t, 1)
}
if (args.lotId == 45 || args.lotId == 74) {
t = _.orderBy(t, (o) => {
return parseInt(o.IssueName) * 1000 + parseInt(o.MatchNumber)
})
}
let result = { matchs: t, count: counts.dataValues ? counts.dataValues.count || 0 : 0 };
//防止恶意进攻,超过查询范围内的不进入到缓存
if (t.length > 0) {
setMatchs(key, keyCount, result, args)
}
return result
} catch (e) {
console.info(e);
matchlock.flag = false
let result = await get24HoursCache(key, keyCount)
if (result) {
setMatchs(key, keyCount, result, args)
return result
} else {
throw e
}
}
//基础数据查询数据库,篮球实时比分的数据查询老的core数据库
async function queryMatchsFromDb(limit: any, where: any, offset: any, order: any, args: any) {
if (args.lotId == 73) {
// let t = getMatchListFromOldDb(limit, where, offset, order);
// //从数据库中获取总记录数
// let count = getMatchCountFromOldDb(where);
let t = getMatchListFromDb(limit, where, offset, order);
//从数据库中获取总记录数
let count = getMatchCountFromDb(where);
let result = await Promise.all([t, count])
let matchs = _.map(result[0], (match: any) => {
//match.MatchTime = moment(match.MatchTime).valueOf();
return match
})
return { t: matchs, count: result[1] };
} else {
let t = getMatchListFromDb(limit, where, offset, order);
//从数据库中获取总记录数
let count = getMatchCountFromDb(where);
let result = await Promise.all([t, count])
let matchs = _.map(result[0], (match: any) => {
//match.MatchTime = moment(match.MatchTime).valueOf();
return match
})
return { t: matchs, count: result[1] };
}
}
//足球实时比分
async function addSportsdtScoreLiveData(t: any) {
try {
if (args.infoId != null || args.matchState == '未' || args.matchState == '进行中' || (t.length == 1)) {
let livedata = await api_hemera.query('sport', 'getlivedata_from_db', root, {}, 1);
if (livedata == null) {
livedata = await api_hemera.queryWithRealtimeFirst('sport', 'getlivedata', root, {});
}
livedata = livedata.LiveData;
t = _.map(t, (o) => {
if (o.Sportsdt.SportsdtMatchId && livedata[o.Sportsdt.SportsdtMatchId]) {
let sportsdtLiveData = livedata[o.Sportsdt.SportsdtMatchId];
let timediff = moment().diff(moment(sportsdtLiveData.TStartTime), "minutes");
let isUseSportsdt = true;
// try{
// if(parseInt(o.MatchState)>timediff){
// isUseSportsdt = false;
// }
// }catch (e:any){}
if (isUseSportsdt) {
if (o.Sportsdt.SportsdtIsah == 1) {
o.BcBf = "";
if (sportsdtLiveData.Half.length > 0) {
let bcbfs = sportsdtLiveData.Half.split("-")
o.BcBf = `${bcbfs[1]}-${bcbfs[0]}`;
}
if (sportsdtLiveData.Score.length == 2)
o.QcBf = `${sportsdtLiveData.Score[1]}-${sportsdtLiveData.Score[0]}`;
o.HostRed = sportsdtLiveData.RedCard[1];
o.GuestRed = sportsdtLiveData.RedCard[0];
o.HostYellow = sportsdtLiveData.YellowCard[1];
o.GuestYellow = sportsdtLiveData.YellowCard[0];
} else {
o.BcBf = sportsdtLiveData.Half;
if (sportsdtLiveData.Score.length == 2)
o.QcBf = `${sportsdtLiveData.Score[0]}-${sportsdtLiveData.Score[1]}`;
o.HostRed = sportsdtLiveData.RedCard[0];
o.GuestRed = sportsdtLiveData.RedCard[1];
o.HostYellow = sportsdtLiveData.YellowCard[0];
o.GuestYellow = sportsdtLiveData.YellowCard[1];
}
switch (sportsdtLiveData.Status) {
case 1:
o.MatchState = timediff <= 45 ? `${timediff}` : "45+";
break;
case 2:
o.MatchState = "中场";
break;
case 3:
o.MatchState = timediff <= 45 ? `${45 + timediff}` : "90+";
break;
case 4:
o.MatchState = "完";
break;
}
// 比赛状态值,表示如下
// 0 :未开始
// 1:上半场
// 2:中场
// 3:下半场
// 4:完场
// 5:中断
// 6:取消
// 7:加时
// 8:加时
// 9:加时
// 10:完场
// 11:点球大战
// 12:全场结束
// 13:延期
// 14: 腰斩
// 15: 待定
// 16:金球
// 17:未开始
// *0、17同为未开始,7、8、9为加时,4、10、12完场
//篮球状态
// 0 :未开始
// 1:第一节
// 2:第一节完
// 3:第二节
// 4:第二节完
// 5:第三节
// 6:第三节完
// 7:第四节
// 8:第四节完
// 9:完场
// 10:加时
// 11:完场(加)
// 12:中断
// 13:取消
// 14: 延期
// 15: 腰斩
// 16待定
}
}
return o;
});
}
}
catch (e:any) {
console.info(e);
}
return t;
}
//纳米数据的实时比分
async function addNamiScoreLiveData(t: any) {
try {
if ((args.matchState == '未' || args.matchState == '进行中') && (t.length >= 1)) {
// console.info(`begin addNamiScoreLiveData`);
let nami_score_list_obj = await nami_data.get_local_nami_realtime_score();
let sportsdt_id_list = _.map(nami_score_list_obj.id_list,"sportsdt_match_id");
t = _.map(t, (o) => {
if (o.Sportsdt.SportsdtMatchId && sportsdt_id_list.includes(o.Sportsdt.SportsdtMatchId)) {
let leisu_id = _.find(nami_score_list_obj.id_list,(id_obj:any)=>{
return id_obj.sportsdt_match_id == o.Sportsdt.SportsdtMatchId
}).leisu_match_id;
let livedata = _.find(nami_score_list_obj.list,(name_obj)=>{return name_obj.id==leisu_id});
// let livedata = _.find(nami_score_list_obj.list,(name_obj)=>{return name_obj.score[1]>1});//测试
// console.info(JSON.stringify(livedata),moment(livedata.score[4]*1000).format("YYYY-MM-DD HH:mm:ss"));
if(livedata==null){
return o
}
// console.info(`找到的雷速数据`)
let score_list = livedata.score;
// livedata.score字段格式:[2783605,8,[1, 0, 0, 0, -1, 0, 0],[1, 0, 0, 0, -1, 0, 0],0,""]
// 0:"纳米比赛id - int"
// 1:"比赛状态,详见状态码->比赛状态 - int"
// 2:Array[7]
// 0:"主队比分(常规时间) - int"
// 1:"主队半场比分 - int"
// 2:"主队红牌 - int"
// 3:"主队黄牌 - int"
// 4:"主队角球,-1表示没有角球数据 - int"
// 5:"主队加时比分(120分钟,即包括常规时间比分),加时赛才有 - int"
// 6:"主队点球大战比分(不包含常规时间及加时赛比分),点球大战才有 - int"
// 3:Array[7]
// 0:"客队比分(常规时间) - int"
// 1:"客队半场比分 - int"
// 2:"客队红牌 - int"
// 3:"客队黄牌 - int"
// 4:"客队角球,-1表示没有角球数据 - int"
// 5:"客队加时比分(120分钟,即包括常规时间比分),加时赛才有 - int"
// 6:"客队点球大战比分(不包含常规时间及加时赛比分),点球大战才有 - int"
// 4:"开球时间戳,上/下半场开球时间(根据比赛状态判断) - int"
// 5:"备注信息,可忽略 - string"
let timediff = moment().add(4,'second').diff(moment(score_list[4]*1000), "minutes");
if (o.Sportsdt.SportsdtIsah != 1) {
o.QcBf = `${score_list[2][0]}-${score_list[3][0]}`;
o.BcBf = `${score_list[2][1]}-${score_list[3][1]}`;
o.HostRed = score_list[2][2];
o.GuestRed = score_list[3][2];
o.HostYellow = score_list[2][4];
o.GuestYellow = score_list[3][4];
}else{
o.QcBf = `${score_list[3][0]}-${score_list[2][0]}`;
o.BcBf = `${score_list[3][1]}-${score_list[2][1]}`;
o.HostRed = score_list[3][2];
o.GuestRed = score_list[2][2];
o.HostYellow = score_list[3][4];
o.GuestYellow = score_list[2][4];
}
// 状态码score_list[1] 描述
// 0 比赛异常,说明:暂未判断具体原因的异常比赛,可能但不限于:腰斩、取消等等,建议隐藏处理
// 1 未开赛
// 2 上半场
// 3 中场
// 4 下半场
// 5 加时赛
// 6 加时赛(弃用)
// 7 点球决战
// 8 完场
// 9 推迟
// 10 中断
// 11 腰斩
// 12 取消
// 13 待定
switch (score_list[1]) {
case 2:
o.MatchState = timediff <= 45 ? `${timediff}` : "45+";
break;
case 3:
o.MatchState = "中场";
break;
case 4:
o.MatchState = timediff <= 45 ? `${45 + timediff}` : "90+";
break;
case 5:
o.MatchState = "加时";
break;
case 7:
o.MatchState = "点球";
break;
case 8:
o.MatchState = "完"; break;
case 9:
o.MatchState = "推迟"; break;
case 10:
o.MatchState = "中断"; break;
case 11:
o.MatchState = "腰斩"; break;
case 12:
o.MatchState = "取消";
break;
}
}
return o;
});
}
}
catch (e:any) {
console.info(e);
}
return t;
}
//篮球实时比分
async function addSportsdtBasketballLiveData(t: any) {
try {
}
catch (e:any) {
console.info(e);
}
return t;
}
async function initSportsdtBaseData(t: any) {
// let [ms_schedules,livegame] = await Promise.all([
// api_hemera.query('info', 'getmsschedulesbycoreids', root, { coreIds: _.map(t, o => o.Id) }),
// api_hemera.query('sport', 'getlivegame', root, {})
// ]);
//let ms_schedules = await api_hemera.query('info', 'getmsschedulesbycoreids', root, { coreIds: _.map(t, o => o.Id) },200);
let ms_schedules = await ms_schedule.getMsSchedulesByCoreIds({ CoreIds: _.map(t, o => o.Id) });
t = t.map((o: any) => {
o = JSON.parse(JSON.stringify(o));
let schedule = _.find(ms_schedules, s => {
return s.core_match_id == o.Id;
});
o.Sportsdt = {};
try {
o.YiqiuMatchId = schedule.yiqiu_match_id;
if (schedule != null) {
o.Sportsdt.SportsdtMatchId = schedule.sportsdt_match_id;
o.Sportsdt.N = schedule.sportsdt_n;
o.Sportsdt.SportsdtIsah = schedule.sportsdt_isah;
if(o.InfoId==null&&schedule.info_match_id!=null){
o.InfoId=schedule.info_match_id;
}
if (schedule.sportsdt_isah == 1) {
o.Sportsdt.SportsdtHostTeamId = schedule.sportsdt_guest_team_id;
o.Sportsdt.SportsdtGuestTeamId = schedule.sportsdt_host_team_id;
} else {
o.Sportsdt.SportsdtHostTeamId = schedule.sportsdt_host_team_id;
o.Sportsdt.SportsdtGuestTeamId = schedule.sportsdt_guest_team_id;
}
o.Sportsdt.SportsdtCompetitionId = schedule.sportsdt_competition_id;
o.Sportsdt.SportsdtType = schedule.sportsdt_type;
o.Sportsdt.SportsdtDegree = schedule.sportsdt_degree;
o.Sportsdt.SportsdtNum = schedule.sportsdt_num;
o.Sportsdt.SportsdtStarttime = schedule.sportsdt_starttime;
o.Sportsdt.LotteryId = o.LotteryId;
}
//`http://data.7m.com.cn/team_data/${params.teamid}/logo_img/club_logo.jpg`
// if(livegame&&livegame.Competition&&livegame.Competition[schedule.sportsdt_competition_id]){
// o.GameName = livegame.Competition[schedule.sportsdt_competition_id].ShortName
// }
}
catch (e:any) { }
o.Odds = {};
try {
if (schedule != null) {
o.Odds.CoreId = o.Id;
o.Odds.CoreLotteryId = o.LotteryId;
o.Odds.SportsdtId = schedule.sportsdt_match_id;
o.Odds.MatchState = o.MatchState;
o.Odds.BetSps = o.BetSps
o.Odds.SportsdtIsah = o.Sportsdt.SportsdtIsah
}
} catch (e) {
console.info(e);
}
return o;
});
return t;
}
function addTestData(t: any) {
if (args.matchState == '未' && t.length > 0 && args.lotId == 72) {
t[0].MatchState = moment().format("mm");
//t[0].QcBf = `0-${Math.round(parseInt(moment().format("ss")) / 20)}`;
t[0].QcBf = `0-${Math.round(moment().minute() % 2)}`;
}
if (args.matchState == '未' && t.length > 1 && args.lotId == 72) {
t[1].MatchState = moment().format("mm");
//t[0].QcBf = `0-${Math.round(parseInt(moment().format("ss")) / 20)}`;
t[1].QcBf = `0-${Math.round(moment().add(14, 'second').minute() % 3)}`;
}
}
function initBaseMatchsData(t: any) {
t = t.map((item: any) => {
item.Issue = item.T_Issue;
item.Lottery = item.T_Lottery;
item.Odds100 = item.T_Odds100;
if (!item.GameName) {
item.GameName = '';
}
//应对易求页面显示,当未知天气时,天气与温度一起显示出来,天气不显示
if (!item.Weather || item.Weather == '未知') {
item.Weather = '';
}
try {
item.MatchTime = moment(item.MatchTime).utc()
} catch (e) {
console.info(e);
}
try {
if (item.Temperature && item.Temperature.indexOf('℃') < 0 && item.Temperature.length > 0) {
item.Temperature = item.Temperature.split('&')[0]
item.Temperature = `${item.Temperature}℃`
}
} catch (e) {
console.info(e);
}
//item.MatchTime = moment(item.MatchTime).add(-8, "hour");
item.MatchState = item.MatchState.replace('节', '节 ');
return item;
});
let list = [];
for (let p of t) {
list.push(p);
}
t = _.filter(list, item => {
if (item)
return true;
else
return false;
});
return t;
}
async function getMatchCountFromDb(where: any) {
return await Model.Match.findAll({
attributes: [[sequelize.fn('COUNT', sequelize.col('Id')), 'count']],
where: where,
});
}
async function getMatchListFromDb(limit: any, where: any, offset: any, order: any) {
return await Model.Match.findAll({
limit: limit || 20,
// include: [
// { model: Model.Issue, },
// { model: Model.Lottery, },
// ],
where: where,
offset: offset,
order: order,
});
}
async function getMatchCountFromOldDb(where: any) {
// return await OldModel.Match.findAll({
// attributes: [[sequelize.fn('COUNT', sequelize.col('Id')), 'count']],
// where: where,
// });
}
async function getMatchListFromOldDb(limit: any, where: any, offset: any, order: any) {
// return await OldModel.Match.findAll({
// limit: limit || 20,
// include: [
// { model: OldModel.Issue, },
// { model: OldModel.Lottery, },
// ],
// where: where,
// offset: offset,
// order: order,
// });
}
function checkPages(args:any) {
// console.info(args,`check pages args`);
let offset = 0;
if (args.offset) {
offset = args.offset;
}
let limit = 20;
if (args.limit && args.limit <= 500 && args.limit > 0) {
limit = args.limit;
}
let order: any = [["MatchTime", "asc"], ["Id", "asc"]];
//let order = [['Id', 'DESC']];
// ("LotteryId", "IssueName", "MatchNumber");
//let order = [["LotteryId","ASC"],["IssueName","ASC"],["MatchNumber","ASC"]]
if ((args.lotId == 45 || args.lotId == 74) && args.matchState == '未') {
order = [["MatchTime", "asc"]];
//[sequelize.fn('max', sequelize.col('age')), 'DESC'],
}
if ((args.lotId == 45 || args.lotId == 74) && args.matchState == '完') {
order = [["IssueName", "asc"]];
}
if (args.lotId == 72 && args.matchState == '未') {
order = [["MatchTime", "asc"], ["MatchNumber", "asc"]];
}
if (args.lotId == 72 && args.matchState == '完') {
order = [["IssueName", "asc"], ["MatchNumber", "asc"]];
}
if (args.infoId) {
limit = 10;
order = [["MatchTime", "desc"]];
}
if (args.order&&args.order[0]?.length==2) {
order = args.order;
}
return { limit, offset, order };
}
}
function getSportsInfoCount(list: any) {
return _.map(list, (item) => {
if(item==null){
return item
}
//情报
item.SportsInfoCount = 0
if (item.SportsInfo) {
if (!item.SportsInfo.HostBad)
item.SportsInfo = JSON.parse(item.SportsInfo)
item.SportsInfoCount = item.SportsInfoCount + item.SportsInfo.HostBad.length
item.SportsInfoCount = item.SportsInfoCount + item.SportsInfo.GuestBad.length
item.SportsInfoCount = item.SportsInfoCount + item.SportsInfo.HostGood.length
item.SportsInfoCount = item.SportsInfoCount + item.SportsInfo.GuestGood.length
if (item.SportsInfo.PredictionDesc) {
item.SportsInfoCount = item.SportsInfoCount + 1
}
} else {
item.SportsInfo = {
GuestBad: [],
GuestGood: [],
HostBad: [],
HostGood: [],
PredictionDesc: ''
}
}
if (item.JcInfo) {
try {
let jcInfo = item.JcInfo
if (!item.JcInfo.HostBad)
jcInfo = JSON.parse(item.JcInfo)
item.SportsInfoCount = item.SportsInfoCount + jcInfo.HostBad.length
item.SportsInfoCount = item.SportsInfoCount + jcInfo.GuestBad.length
item.SportsInfoCount = item.SportsInfoCount + jcInfo.HostGood.length
item.SportsInfoCount = item.SportsInfoCount + jcInfo.GuestGood.length
if (jcInfo.PredictionDesc) {
item.SportsInfoCount = item.SportsInfoCount + 1
}
} catch (e) {
console.info(e);
}
}
//情报价格
item.JcInfoPrice = 500
return item
})
}
async function getWheres(args: any) {
let where: any = {}
where.MatchTime = {
$gt: moment().subtract(120, 'day').format('YYYY-MM-DD')
}
if (args.sportsdtId) {
//let ms_schedules = await ms_schedule.getMsSchedulesByCoreIds({CoreIds:_.map(t, o => o.Id)});
let ms_schedules_item = await info_db.ms_schedule.findOne({
where: { sportsdt_match_id: args.sportsdtId }
})
if (ms_schedules_item != null) {
where.InfoId = args.info_match_id
where.LotteryId = { $in: [72, 45, 73, 74] }
}
}
if (args.matchIds) {
where.Id = { $in: args.matchIds }
}
if (args.lotId) {
where.LotteryId = args.lotId
} else {
where.LotteryId = { $in: [72, 45, 73, 74] }
}
if (args.lotIds) {
where.LotteryId = { $in: args.lotIds }
}
if (args.issueId) {
where.IssueId = args.issueId
}
if (args.infoId) {
where.InfoId = args.infoId
where.LotteryId = { $in: [72, 45, 73, 74] }
}
if (args.matchDay) {
try {
where.MatchTime = {
$between: [moment(args.matchDay).format('YYYY-MM-DD'),
moment(args.matchDay).add(1, 'day').format('YYYY-MM-DD')]
}
} catch (e:any) { }
}
if (args.matchState) {
if (args.matchState == '完') {
where.MatchState = { $in: ['完', '取消', '中断', '推迟', '改期'] }
} else if (args.matchState == '未') {
where.MatchTime = {
$gt: moment().add(-150, 'minute').format('YYYY-MM-DD HH:mm')
}
where.MatchState = { $notIn: ['取消', '中断', '推迟', '腰斩', '改期'] }
} else if (args.matchState == '进行中')
where.MatchState = { $notIn: ['完', '取消', '中断', '推迟', '腰斩', '改期'] }
else
where.MatchState = args.matchState
} else {
where.MatchState = { $notIn: ['腰斩'] }
}
if (args.type) {
}
if (args.userId) {
}
if (args.issueName && args.issueName != null) {
//where.IssueName = {$in:[args.issueName]}
where.IssueName = args.issueName
}
if (args.isContainSportsInfo == 1) {
where.SportsInfo = { $not: null }
}
if (args.isContainSportsInfo == 0) {
where.SportsInfo = null
}
return where
}
async function get10SecondsCache(key: any, keyCount: any) {
let reply:any = await client.get(`${key}_${moment().format('YYYYMMDDHH')}`);
if (reply && reply.length > 0) {
let replyCount:any = await client.get(`${keyCount}_${moment().format('YYYYMMDDHH')}`);
const buffer = Buffer.from(reply, 'base64');
let str_json_result = (await zlib.unzipSync(buffer)).toString();
reply = JSON.parse(str_json_result)
reply = getSportsInfoCount(reply)
let result = { matchs: reply, count: JSON.parse(replyCount) };
return result
}
return null
}
async function get24HoursCache(key: any, keyCount: any) {
let time24 = 'time24'
key = key + time24
let reply:any = await client.get(`${key}`);
if (reply && reply.length > 0) {
let replyCount:any = await client.get(`${keyCount}`);
const buffer = Buffer.from(reply, 'base64');
let str_json_result = (await zlib.unzipSync(buffer)).toString();
reply = JSON.parse(str_json_result)
reply = getSportsInfoCount(reply)
let result = { matchs: reply, count: JSON.parse(replyCount) };
return result
}
return null
}
async function setMatchs(key: any, keyCount: any, result: any, args: any) {
let buffer = await zlib.gzipSync(JSON.stringify(result.matchs))
let z_result = buffer.toString("base64");
await client.setex(`${key}_${moment().format('YYYYMMDDHH')}`, 20, z_result)
//更新为5秒
client.expire(`${key}_${moment().format('YYYYMMDDHH')}`, 20)
await client.setex(`${keyCount}_${moment().format('YYYYMMDDHH')}`, 20, JSON.stringify(result.count))
//更新为5秒
client.expire(`${keyCount}_${moment().format('YYYYMMDDHH')}`, 20)
let time24 = 'time24'
await client.setex(key + time24, 60 * 60 * 24 * 7, z_result)
client.expire(key + time24, 60 * 60 * 24 * 7)
await client.setex(keyCount + time24, 60 * 60 * 24 * 7, JSON.stringify(result.count))
client.expire(keyCount + time24, 60 * 60 * 24 * 7)
}
//计算概率
const statProbability = async (match: any) => {
let oddsList = []
if (match.InfoId && match.LotteryId != 73) {
oddsList = await Model.Odds100.findAll({ where: { MatchId: match.InfoId } })
} else if (match.InfoId && match.LotteryId == 73) {
//oddsList = await Model.NBAOdds100.findAll({where: { MatchId: match.InfoId }})
}
return {
HostProbability: String,
FlatProbability: String,
GuestProbability: String,
MaxProbabilityName: String,
FirstProbability: String,
LastProbability: String,
}
}
// 获取足球概率战力值
function ZqSpPercent(match: any) {
try {
let sp = JSON.parse(match.BetSps)["7206"]
if (!sp || sp.length < 0) {
return [0, 0]
}
let pavg = sp[1] / 2;
let v1 = [sp[0] + pavg, sp[2] + pavg];
let sum = v1[0] + v1[1];
let r = [Math.round(v1[0] / sum * 100), Math.round(v1[1] / sum * 100)];
let sy = 100 - _.sum(r);
if (r[0] > r[1]) {
r[1] += sy;
}
else {
r[0] += sy;
}
return r;
} catch (e:any) {
return [0, 0]
}
}
const CompetitionResult = async () => {
let sql = `SELECT * FROM core_match WHERE \`InfoState\`=true ORDER BY \`LotteryId\` DESC`
let result = await Core.sequelize.query(sql)
return result;
}
export async function get_core_match({ lotteryId }: any) {
try{
if (!_.includes([72, 74, 75, 45], lotteryId)) {
return null
}
let where:any = {
MatchState: '未',
LotteryId: lotteryId,
MatchTime: { $gte: moment().add(-1,'day').format("YYYY-MM-DD") }
};
if(lotteryId == 74){
where = {
// MatchState: [null,'未'],
LotteryId: lotteryId,
MatchTime: { $gte: moment().add(-1,'day').format("YYYY-MM-DD") }
};
}
let result: any = await Core.core_match.findAll({
where: where,
order: [["MatchTime", "asc"], ["MatchNumber", "asc"]],
limit: 500,
attributes: [`Id`, `updateflag`, `LotteryId`, `IssueId`, `IssueName`, `BdGameType`,
`BdGameTypeColor`, `GameName`, `GameColor`, `BdMatchDay`, `MatchNumber`,
`MatchRound`, `MatchTime`, `StopSellTime`, `PrintEndTime`,
`InfoId`, `HostId`, `HostName`, `HostRank`, `HostRed`, `HostYellow`,
`LetScore`, `PreTotalScore`, `GuestId`, `GuestName`, `GuestRank`,
`GuestRed`, `GuestYellow`, `MatchState`, `ResultState`, `Results`,
`BetSps`, `Commends`, `AvgOdds`, `GgStopPlayIds`, `DgStopPlayIds`,
`IsAutoUpdate`, `BcBf`, `QcBf`, `ResultSps`,
//`OkoooId`, `BetradarId`,
//`IsTextLive`, `PlayerData`, `TimeData`, `LiveData`, `TechnicalStatistics`,
`Stoppage`, `Weather`, `Temperature`, `SportsInfo`, `SportsLive`,
// `SportsLineup`, `SportsStatistics`, `SportsInjury`, `SportteryMatchId`, `JcInfo`,
`DfcpImgUrl`,
`VideoUrl`,
// `CreatedAt`, `UpdatedAt`,
`InfoState`, `WinLoseRate`, `WinLoseCount`,
`RangQiuWinLoseRate`, `RangQiuWinLoseCount`, `SportteryTempId`, `SportteryHostId`,
//`SportteryGuestId`, `SportteryHostName`, `SportteryGuestName`, `TempId`, `GuessRate`,
//`GuessTotal`, `GuessJoinTotal`, `GuessWinTotal`, `GuessEquelTotal`, `GuessLoseTotal`
]
})
let ms_schedule_data_list:any = await Core.ms_schedule.findAll({
where:{
core_match_time: { $gte: moment().format("YYYY-MM-DD") }
}
})
result = JSON.parse(JSON.stringify(result));
result = _.map(result, (o) => {
if(o.InfoId==null||o.InfoId==0){
o.InfoId = (_.find(ms_schedule_data_list,(m)=>{
return m.core_match_id==o.Id
})||{} as any).info_match_id;
}
let ms_item = _.find(ms_schedule_data_list,(m)=>{
return m.core_match_id==o.Id
})
if(ms_item){
// console.info(`ms_item.yiqiu_match_id`,ms_item.yiqiu_match_id)
o.YiqiuMatchId = ms_item.yiqiu_match_id;
}
if (o) {
delete o.JcInfo;
delete o.SportsInfo;
delete o.CreatedAt;
delete o.UpdatedAt;
delete o.updateflag;
delete o.IssueId;
delete o.SportsLive;
delete o.SportsLineup;
delete o.SportsStatistics;
delete o.SportsInjury;
delete o.GuessRate;
delete o.GuessTotal;
delete o.GuessJoinTotal;
delete o.GuessWinTotal;
delete o.GuessEquelTotal;
delete o.GuessLoseTotal;
delete o.OkoooId;
delete o.BetradarId;
delete o.IsTextLive;
delete o.PlayerData;
delete o.TimeData;
delete o.TechnicalStatistics;
}
return o;
});
// console.info(`result`,result);
if(lotteryId == 74){
let game_list = (await info_db.ms_soccer_game.findAll(
{
limit:100,
// `id`, `match_time`,`zucai_issue_name`, `zucai_number`, info_match_id, status, odds
attributes: [`id`, `match_time`,`zucai_issue_name`, `zucai_number`, `info_match_id`, `status`, `odds`],
where:{
is_zucai:1,
match_time: { $gte: moment().format("YYYY-MM-DD") },
}
}
))?.map((a:any) => a.dataValues) ?? [];
// 通过zucai_issue_name与zucai_number找到对应比赛
result = _.map(result, (o) => {
let game = _.find(game_list,(g)=>{
return g.zucai_issue_name==o.IssueName&&g.zucai_number==o.MatchNumber
});
if(game){
o.odds = game.odds;
o.YiqiuMatchId = o.YiqiuMatchId || game.id;
o.MatchState = o.MatchState||'未';
if(moment(o.MatchTime)<moment()&&o.MatchState=="未"){
o.MatchState="";
}
if(o.odds?.['3000181']?.eu){
o.AvgOdds = o.AvgOdds || _.map(o.odds?.['3000181'].eu,(n:any)=>Number(n).toFixed(2)).join(",");
}else{
o.AvgOdds='--,--,--';
}
//测试的时候可以留下odds
delete o.odds;
}
return o
})
}
result = _.filter(result,(o)=>{
if(o.MatchState!="未"){
return false;
}
return o.BetSps!="{\"7201\":[0.0,0.0,0.0],\"7202\":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],\"7203\":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],\"7204\":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],\"7206\":[0.0,0.0,0.0]}"
})
return result
}catch(e:any){
console.info(`lottery_get_matchs 获取比赛数据异常:${e.message}`)
}
}
export { liveScore, statProbability, ZqSpPercent, CompetitionResult }
\ No newline at end of file
/**
* Created by sunney on 7/3/17.
*/
import Model = require('../model');
import { cache,redis as client, redis, task_lock } from '../../../cache'
export async function getMatchJson({type,match}:any) {
try {
let match_team_info_key = `${config.CachePrefix}match:match_json:v1_${match.Id}_${type}`
let t:any = await client.get(match_team_info_key);
if (t && t.length > 0 && !match.isUpdateCache) {
return t
} else {
t = await
Model.MatchJson.findOne({
where: {
Type: type,
LotteryId: match.LotteryId,
IssueName: match.IssueName,
MatchNumber: match.MatchNumber
}
})
client.set(match_team_info_key, t.Json)
client.expire(match_team_info_key, 60*60*24)
}
if (t == null)
return '{}'
return t.Json;
}catch (e:any){
return '{}'
}
}
/**
* Created by sunney on 7/4/17.
*/
import Info = require('../table');
import { cache,redis as client, redis, task_lock } from '../../../cache'
export async function getMatchTeamInfo(match:any) {
let sql=`DECLARE @InfoId INT
SET @InfoId=${match.InfoId}
DECLARE @HostId INT
DECLARE @GuestId INT
DECLARE @MatchSeason VARCHAR(20)
DECLARE @BeginTime VARCHAR(20)
SELECT @HostId=HostTeamId,@GuestId=GuestTeamId,@MatchSeason=MatchSeason,@BeginTime=BeginTime FROM T_match WHERE Id=@InfoId;
DECLARE @Temp_Result TABLE(TeamId INT,zcc INT,zcs INT,zj INT,zs INT,jj DECIMAL(8,1),js DECIMAL(8,1),zcjj DECIMAL(8,1),zcjs DECIMAL(8,1),scs INT,
pcs INT,fcs INT,zscs INT,zpcs INT,zfcs INT,sbcjj DECIMAL(8,1),sbcjs DECIMAL(8,1),xbcjj DECIMAL(8,1),xbcjs DECIMAL(8,1),
s1q INT,s2q INT,f1q INT,f2q INT,nzcc INT,nzj INT,nzs INT,njj DECIMAL(8,1),njs DECIMAL(8,1))
DECLARE @Temp_Score TABLE(Score INT,HalfScore INT,Lose INT,HalfLose INT,BeginTime VARCHAR(20),IsHost INT)
DECLARE @N INT
SET @N=1
WHILE @N>=0
BEGIN
DECLARE @TeamId INT
SET @TeamId=CASE WHEN @N=1 THEN @HostId ELSE @GuestId END
INSERT INTO @Temp_Score( Score, HalfScore, Lose, HalfLose,BeginTime, IsHost)
SELECT HostScore Score,HostHalfScore HalfScore,GuestScore Lose,GuestHalfScore HalfLose,BeginTime,1 IsHost
FROM T_match WHERE matchSeason=@MatchSeason AND [Status]=-1 And BeginTime <@BeginTime AND HostTeamId=@TeamId
INSERT INTO @Temp_Score( Score, HalfScore, Lose, HalfLose,BeginTime, IsHost)
SELECT GuestScore Score,GuestHalfScore HalfScore,HostScore Lose,HostHalfScore HalfLose,BeginTime,0 IsHost
FROM T_match WHERE matchSeason=@MatchSeason AND [Status]=-1 And BeginTime <@BeginTime AND GuestTeamId=@TeamId
IF NOT EXISTS(SELECT TOP 1 1 FROM @Temp_Score)
BEGIN
BREAK
END;
WITH t1 AS (
SELECT
@TeamId TeamId,
COUNT(1) zcc,
SUM(IsHost) zcs,
SUM(Score) zj,
SUM(Lose) zs,
SUM(Score)*1.0/COUNT(1) jj,
SUM(Lose)*1.0/COUNT(1) js,
SUM(CASE WHEN IsHost=1 THEN Score ELSE 0 END)*1.0/(CASE WHEN SUM(IsHost)=0 THEN 1 ELSE SUM(IsHost) END) zcjj,
SUM(CASE WHEN IsHost=1 THEN Lose ELSE 0 END)*1.0/(CASE WHEN SUM(IsHost)=0 THEN 1 ELSE SUM(IsHost) END) zcjs,
SUM(CASE WHEN Score>Lose THEN 1 ELSE 0 END) scs,
SUM(CASE WHEN Score=Lose THEN 1 ELSE 0 END) pcs,
SUM(CASE WHEN Score<Lose THEN 1 ELSE 0 END) fcs,
SUM(CASE WHEN IsHost=@N AND Score>Lose THEN 1 ELSE 0 END) zscs,
SUM(CASE WHEN IsHost=@N AND Score=Lose THEN 1 ELSE 0 END) zpcs,
SUM(CASE WHEN IsHost=@N AND Score<Lose THEN 1 ELSE 0 END) zfcs,
SUM(HalfScore)*1.0/COUNT(1) sbcjj,
SUM(HalfLose)*1.0/COUNT(1) sbcjs,
SUM(Score-HalfScore)*1.0/COUNT(1) xbcjj,
SUM(Lose-HalfLose)*1.0/COUNT(1) xbcjs,
SUM(CASE WHEN Score-Lose=1 THEN 1 ELSE 0 END) s1q,
SUM(CASE WHEN Score-Lose>1 THEN 1 ELSE 0 END) s2q,
SUM(CASE WHEN Score-Lose=-1 THEN 1 ELSE 0 END) f1q,
SUM(CASE WHEN Score-Lose<-1 THEN 1 ELSE 0 END) f2q
FROM @Temp_Score),
t2 AS (
SELECT
@TeamId TeamId,
COUNT(1) nzcc,
SUM(Score) nzj,
SUM(Lose) nzs,
SUM(Score)*1.0/COUNT(1) njj,
SUM(Lose)*1.0/COUNT(1) njs
FROM (SELECT TOP 6 * FROM @Temp_Score ORDER BY BeginTime DESC) temp)
INSERT INTO @Temp_Result (TeamId,zcc,zcs,zj,zs,jj,js,zcjj,zcjs,scs,pcs,fcs,zscs,zpcs,zfcs,sbcjj,sbcjs,xbcjj,xbcjs,s1q,s2q,f1q,f2q,nzcc,nzj,nzs,njj,njs)
SELECT t1.TeamId,zcc,zcs,zj,zs,jj,js,zcjj,zcjs,scs,pcs,fcs,zscs,zpcs,zfcs,sbcjj,sbcjs,xbcjj,xbcjs,s1q,s2q,f1q,f2q,nzcc,nzj,nzs,njj,njs FROM t1 JOIN t2 ON t1.TeamId=t2.TeamId
SET @N=@N-1
DELETE @Temp_Score
END
SELECT * FROM @Temp_Result
`
try {
//添加redis
let match_team_info_key = `${config.CachePrefix}match:match_team_info:v1_${match.Id}`
let t = await client.get(match_team_info_key);
if (t && t.length > 0 && !match.isUpdateCache) {
return t
}else{
t = await Info.db.query(sql)
}
if (t == null)
return '[]'
if (t && t.length > 0) {
client.set(match_team_info_key,JSON.stringify(t[0]))
client.expire(match_team_info_key, 60*60*24)
return JSON.stringify(t[0])
} else {
return '[]'
}
}catch (e:any){
return '[]'
}
}
/**
* Created by sunney on 6/12/17.
*/
import _ = require('lodash');
import moment = require('moment');
import api_hemera = require('../../../api_hemera');
import * as cache from '../../../cache'
//
export function getGuestTeamHistory(match: any, gameanalyse: any) {
let { SportsdtMatchId,
SportsdtIsah,
SportsdtHostTeamId,
SportsdtGuestTeamId,
SportsdtCompetitionId,
SportsdtType,
SportsdtDegree,
SportsdtNum,
SportsdtStarttime,
LotteryId }: any = match.Sportsdt
//TeamHistory
try {
let lists = gameanalyse.TeamHistory.Away
lists = _.filter(lists, (item) => {
return item.Date < moment(SportsdtStarttime).unix() * 1000 && item.Id[1]== SportsdtCompetitionId
})
let result = _.map(lists, (game) => {
//编号数组,共4位,第1位比赛编号,第2位联赛编号,第3位主队编号 第4位客队编号
if (game.Id[2] == SportsdtGuestTeamId) {
if (game.Score[0] > game.Score[1]) {
return 3
} else if (game.Score[0] == game.Score[1]) {
return 1
} else {
return 0
}
} else {
if (game.Score[0] > game.Score[1]) {
return 0
} else if (game.Score[0] == game.Score[1]) {
return 1
} else {
return 3
}
}
})
return JSON.stringify(_.take(result, 6))
} catch (e:any) {
}
return "[0,0,0,0,0,0]"
}
export function getHomeTeamHistory(match: any, gameanalyse: any) {
let { SportsdtMatchId,
SportsdtIsah,
SportsdtHostTeamId,
SportsdtGuestTeamId,
SportsdtCompetitionId,
SportsdtType,
SportsdtDegree,
SportsdtNum,
SportsdtStarttime,
LotteryId }: any = match.Sportsdt
try {
let lists = gameanalyse.TeamHistory.Home
lists = _.filter(lists, (item) => {
return item.Date < moment(SportsdtStarttime).unix() * 1000 && item.Id[1]== SportsdtCompetitionId
})
let result = _.map(lists, (game) => {
//编号数组,共4位,第1位比赛编号,第2位联赛编号,第3位主队编号 第4位客队编号
if (game.Id[2] == SportsdtHostTeamId) {
if (game.Score[0] > game.Score[1]) {
return 3
} else if (game.Score[0] == game.Score[1]) {
return 1
} else {
return 0
}
} else {
if (game.Score[0] > game.Score[1]) {
return 0
} else if (game.Score[0] == game.Score[1]) {
return 1
} else {
return 3
}
}
})
return JSON.stringify(_.take(result, 6))
} catch (e:any) {
}
return "[0,0,0,0,0,0]"
}
export function getGuestTeamGuestHistory(match: any, gameanalyse: any) {
let { SportsdtMatchId,
SportsdtIsah,
SportsdtHostTeamId,
SportsdtGuestTeamId,
SportsdtCompetitionId,
SportsdtType,
SportsdtDegree,
SportsdtNum,
SportsdtStarttime,
LotteryId }: any = match.Sportsdt
try {
let lists = gameanalyse.TeamHistory.Away
lists = _.filter(lists, (item) => {
return item.Date < moment(SportsdtStarttime).unix() * 1000 && item.Id[1]== SportsdtCompetitionId
})
lists = _.filter(lists, (game) => {
return game.Id[3] == SportsdtGuestTeamId
})
let result = _.map(lists, (game) => {
//编号数组,共4位,第1位比赛编号,第2位联赛编号,第3位主队编号 第4位客队编号
if (game.Id[2] == SportsdtGuestTeamId) {
if (game.Score[0] > game.Score[1]) {
return 3
} else if (game.Score[0] == game.Score[1]) {
return 1
} else {
return 0
}
} else {
if (game.Score[0] > game.Score[1]) {
return 0
} else if (game.Score[0] == game.Score[1]) {
return 1
} else {
return 3
}
}
})
return JSON.stringify(_.take(result, 6))
} catch (e:any) {
}
return "[0,0,0,0,0,0]"
}
export function getHomeTeamHomeHistory(match: any, gameanalyse: any) {
let { SportsdtMatchId,
SportsdtIsah,
SportsdtHostTeamId,
SportsdtGuestTeamId,
SportsdtCompetitionId,
SportsdtType,
SportsdtDegree,
SportsdtNum,
SportsdtStarttime,
LotteryId }: any = match.Sportsdt
try {
let lists = gameanalyse.TeamHistory.Home
lists = _.filter(lists, (item) => {
return item.Date < moment(SportsdtStarttime).unix() * 1000 && item.Id[1]== SportsdtCompetitionId
})
lists = _.filter(lists, (game) => {
return game.Id[2] == SportsdtHostTeamId
})
let result = _.map(lists, (game) => {
//编号数组,共4位,第1位比赛编号,第2位联赛编号,第3位主队编号 第4位客队编号
if (game.Id[2] == SportsdtHostTeamId) {
if (game.Score[0] > game.Score[1]) {
return 3
} else if (game.Score[0] == game.Score[1]) {
return 1
} else {
return 0
}
} else {
if (game.Score[0] > game.Score[1]) {
return 0
} else if (game.Score[0] == game.Score[1]) {
return 1
} else {
return 3
}
}
})
return JSON.stringify(_.take(result, 6))
} catch (e:any) {
}
return "[0,0,0,0,0,0]"
}
export function getHomeGuestGuestTeamHistory(match: any, gameanalyse: any) {
let { SportsdtMatchId,
SportsdtIsah,
SportsdtHostTeamId,
SportsdtGuestTeamId,
SportsdtCompetitionId,
SportsdtType,
SportsdtDegree,
SportsdtNum,
SportsdtStarttime,
LotteryId }: any = match.Sportsdt
try {
} catch (e:any) {
}
return "[0,0,0,0,0,0]"
}
export function getHomeGuestHomeTeamHistory(match: any, gameanalyse: any) {
let { SportsdtMatchId,
SportsdtIsah,
SportsdtHostTeamId,
SportsdtGuestTeamId,
SportsdtCompetitionId,
SportsdtType,
SportsdtDegree,
SportsdtNum,
SportsdtStarttime,
LotteryId }: any = match.Sportsdt
try {
} catch (e:any) {
}
return "[0,0,0,0,0,0]"
}
export function getScore(match: any, gameanalyse: any) {
let { SportsdtMatchId,
SportsdtIsah,
SportsdtHostTeamId,
SportsdtGuestTeamId,
SportsdtCompetitionId,
SportsdtType,
SportsdtDegree,
SportsdtNum,
SportsdtStarttime,
LotteryId }: any = match.Sportsdt
try {
} catch (e:any) {
}
return "{}"
}
export function getRecord(match: any, gameanalyse: any) {
let { SportsdtMatchId,
SportsdtIsah,
SportsdtHostTeamId,
SportsdtGuestTeamId,
SportsdtCompetitionId,
SportsdtType,
SportsdtDegree,
SportsdtNum,
SportsdtStarttime,
LotteryId }: any = match.Sportsdt
try {
} catch (e:any) {
}
return "[]"
}
export function getMatchTypeList(match: any, gameanalyse: any) {
let { SportsdtMatchId,
SportsdtIsah,
SportsdtHostTeamId,
SportsdtGuestTeamId,
SportsdtCompetitionId,
SportsdtType,
SportsdtDegree,
SportsdtNum,
SportsdtStarttime,
LotteryId }: any = match.Sportsdt
try {
} catch (e:any) {
}
return "[]"
}
export function getLineup(match: any, gameanalyse: any) {
let { SportsdtMatchId,
SportsdtIsah,
SportsdtHostTeamId,
SportsdtGuestTeamId,
SportsdtCompetitionId,
SportsdtType,
SportsdtDegree,
SportsdtNum,
SportsdtStarttime,
LotteryId }: any = match.Sportsdt
try {
} catch (e:any) {
}
return null
}
export function getScorePredict(match: any, gameanalyse: any) {
let { SportsdtMatchId,
SportsdtIsah,
SportsdtHostTeamId,
SportsdtGuestTeamId,
SportsdtCompetitionId,
SportsdtType,
SportsdtDegree,
SportsdtNum,
SportsdtStarttime,
LotteryId }: any = match.Sportsdt
try {
//计算预测数据,
//积分数据预测结果
//主场球队取胜的可能性=44.8%+(0.53%*两队积分差)
let ScorePredict = {}
let matchsForScorePredict: any = []
let home_standing = gameanalyse.Standings.Home
let away_standing = gameanalyse.Standings.Away
let hostScore = parseInt(home_standing.Total[7])
let guestScore = parseInt(away_standing.Total[7])
let winRate = Math.round(44.8 + (hostScore - guestScore) * 0.53);
//客场球队获胜的可能性=24.5%-(0.39%*两队积分差)
let lostRate = Math.round(24.5 - (hostScore - guestScore) * 0.39);
//平局可能性 = 1-主队百分比-客队百分比
let flatRate = 100 - winRate - lostRate;
ScorePredict = {
WinRate: winRate / 100,
FlatRate: flatRate / 100,
LostRate: lostRate / 100
}
return JSON.stringify(ScorePredict)
} catch (e:any) {
}
return JSON.stringify({
WinRate: null,
FlatRate: null,
LostRate: null,
})
}
//六场预测法,进球数预测法
export function getGoalPredict(match: any, gameanalyse: any) {
let { SportsdtMatchId,
SportsdtIsah,
SportsdtHostTeamId,
SportsdtGuestTeamId,
SportsdtCompetitionId,
SportsdtType,
SportsdtDegree,
SportsdtNum,
SportsdtStarttime,
LotteryId }: any = match.Sportsdt
try {
//六场预测法
let lists = gameanalyse.TeamHistory.Home
lists = _.filter(lists, (item) => {
return item.Date < moment(SportsdtStarttime).unix() * 1000 && item.Id[1]== SportsdtCompetitionId && item.Id[2] == SportsdtHostTeamId
})
let hostSixList = _.take(_.map(lists, (game) => {
//编号数组,共4位,第1位比赛编号,第2位联赛编号,第3位主队编号 第4位客队编号
if (game.Id[2] == SportsdtHostTeamId) {
if (game.Score[0] > game.Score[1]) {
return 3
} else if (game.Score[0] == game.Score[1]) {
return 1
} else {
return 0
}
} else {
if (game.Score[0] > game.Score[1]) {
return 0
} else if (game.Score[0] == game.Score[1]) {
return 1
} else {
return 3
}
}
}), 6);
lists = gameanalyse.TeamHistory.Away
lists = _.filter(lists, (item) => {
return item.Date < moment(SportsdtStarttime).unix() * 1000 && item.Id[1]== SportsdtCompetitionId && item.Id[3] == SportsdtGuestTeamId
})
let guestSixList = _.take(_.map(lists, (game) => {
//编号数组,共4位,第1位比赛编号,第2位联赛编号,第3位主队编号 第4位客队编号
if (game.Id[2] == SportsdtGuestTeamId) {
if (game.Score[0] > game.Score[1]) {
return 3
} else if (game.Score[0] == game.Score[1]) {
return 1
} else {
return 0
}
} else {
if (game.Score[0] > game.Score[1]) {
return 0
} else if (game.Score[0] == game.Score[1]) {
return 1
} else {
return 3
}
}
}), 6);
let minSixListCount = _.min([hostSixList.length, guestSixList.length])
hostSixList = _.take(hostSixList, minSixListCount)
guestSixList = _.take(guestSixList, minSixListCount)
//平均进球数
let GoalPredict = [
Math.round(100 * _.sumBy(hostSixList, (item: any) => {
return item
}) / hostSixList.length) / 100,
Math.round(100 * _.sumBy(guestSixList, (item: any) => {
return item
}) / guestSixList.length) / 100,
]
return JSON.stringify(GoalPredict)
} catch (e:any) {
}
return JSON.stringify([null, null])
}
export function getFlatPredict(match: any, gameanalyse: any) {
let { SportsdtMatchId,
SportsdtIsah,
SportsdtHostTeamId,
SportsdtGuestTeamId,
SportsdtCompetitionId,
SportsdtType,
SportsdtDegree,
SportsdtNum,
SportsdtStarttime,
LotteryId }: any = match.Sportsdt
try {
//双八预测
let lists = gameanalyse.TeamHistory.Home
lists = _.filter(lists, (item) => {
return item.Date < moment(SportsdtStarttime).unix() * 1000 && item.Id[1]== SportsdtCompetitionId
})
let hostEightList = _.take(lists, 8);
lists = gameanalyse.TeamHistory.Away
lists = _.filter(lists, (item) => {
return item.Date < moment(SportsdtStarttime).unix() * 1000 && item.Id[1]== SportsdtCompetitionId
})
let guestEightList = _.take(lists, 8);
let FlatPredict: any =
{
HostFlatCount: _.sumBy(hostEightList, function (o: any) {
if (o.Score[0] == o.Score[1]) return 1;
return 0
}),
HostZeroCount: _.filter(hostEightList, function (o:any) {
if (o.Id[2] == SportsdtHostTeamId && o.Score[0] == 0) return true;
else if (o.Id[3] == SportsdtHostTeamId && o.Score[1] == 0) return true;
return false
// if (o.HostScore == 0) return true;
// return false
}).length,
GuestFlatCount: _.sumBy(guestEightList, function (o: any) {
if (o.Score[0] == o.Score[1]) return 1;
return 0
}),
GuestZeroCount: _.filter(guestEightList, function (o:any) {
if (o.Id[2] == SportsdtGuestTeamId && o.Score[0] == 0) return true;
else if (o.Id[3] == SportsdtGuestTeamId && o.Score[1] == 0) return true;
return false
// if (o.GuestScore == 0) return true;
// return false
}).length,
}
FlatPredict.HostWinLostCount = 8 - FlatPredict.HostFlatCount
FlatPredict.GuestWinLostCount = 8 - FlatPredict.GuestFlatCount
// (hostWinLostCount + guestWinLostCount) + (hostZeroCount + guestZeroCount) - (hostFlatCount + guestFlatCount) > 10 ? "较小" : "较大";//平局概率
FlatPredict.DrawProbability = (FlatPredict.HostWinLostCount + FlatPredict.GuestWinLostCount
+ FlatPredict.HostZeroCount + FlatPredict.GuestZeroCount
- FlatPredict.HostFlatCount - FlatPredict.GuestFlatCount > 10 ? "较小" : "较大")
return JSON.stringify(FlatPredict)
} catch (e:any) {
}
return "{\"HostFlatCount\":0,\"HostZeroCount\":0,\"GuestFlatCount\":0,\"GuestZeroCount\":0,\"HostWinLostCount\":8,\"GuestWinLostCount\":8,\"DrawProbability\":\"无\"}"
}
export function getAveragePredict(match: any, gameanalyse: any) {
let { SportsdtMatchId,
SportsdtIsah,
SportsdtHostTeamId,
SportsdtGuestTeamId,
SportsdtCompetitionId,
SportsdtType,
SportsdtDegree,
SportsdtNum,
SportsdtStarttime,
LotteryId }: any = match.Sportsdt
try {
let lists = gameanalyse.TeamHistory.Home
lists = _.filter(lists, (item) => {
return item.Date < moment(SportsdtStarttime).unix() * 1000 && item.Id[1]== SportsdtCompetitionId && item.Id[2] == SportsdtHostTeamId
})
let hostSixList = _.take(_.map(lists, (game) => {
//编号数组,共4位,第1位比赛编号,第2位联赛编号,第3位主队编号 第4位客队编号
if (game.Id[2] == SportsdtHostTeamId) {
if (game.Score[0] > game.Score[1]) {
return 3
} else if (game.Score[0] == game.Score[1]) {
return 1
} else {
return 0
}
} else {
if (game.Score[0] > game.Score[1]) {
return 0
} else if (game.Score[0] == game.Score[1]) {
return 1
} else {
return 3
}
}
}), 6);
lists = gameanalyse.TeamHistory.Away
lists = _.filter(lists, (item) => {
return item.Date < moment(SportsdtStarttime).unix() * 1000 && item.Id[1]== SportsdtCompetitionId && item.Id[3] == SportsdtGuestTeamId
})
let guestSixList = _.take(_.map(lists, (game) => {
//编号数组,共4位,第1位比赛编号,第2位联赛编号,第3位主队编号 第4位客队编号
if (game.Id[2] == SportsdtGuestTeamId) {
if (game.Score[0] > game.Score[1]) {
return 3
} else if (game.Score[0] == game.Score[1]) {
return 1
} else {
return 0
}
} else {
if (game.Score[0] > game.Score[1]) {
return 0
} else if (game.Score[0] == game.Score[1]) {
return 1
} else {
return 3
}
}
}), 6);
let minSixListCount = _.min([hostSixList.length, guestSixList.length])
hostSixList = _.take(hostSixList, minSixListCount)
guestSixList = _.take(guestSixList, minSixListCount)
//re = hostSixScore - guestSixScore;
let hostSixScore = _.sumBy(hostSixList, item => item)
let guestSixScore = _.sumBy(guestSixList, item => item)
let re: any = hostSixScore - guestSixScore
let SixScoreResult = `主胜或平`
if (re >= 6 || re <= -6) {
SixScoreResult = hostSixScore > guestSixScore ? "主胜" : "客胜";
}
else if (re == 5 && re == -5) {
SixScoreResult = hostSixScore > guestSixScore ? "主胜" : "主胜或平";
}
else if ((re >= 2 && re <= 4) || (re >= -4 && re <= -2)) {
SixScoreResult = hostSixScore > guestSixScore ? "主胜" : "客胜";
}
//近十场进球数
lists = gameanalyse.TeamHistory.Home
lists = _.filter(lists, (item) => {
return item.Date < moment(SportsdtStarttime).unix() * 1000 && item.Id[2] == SportsdtHostTeamId
})
let hostTenList = _.take(lists, 10);
lists = gameanalyse.TeamHistory.Away
lists = _.filter(lists, (item) => {
return item.Date < moment(SportsdtStarttime).unix() * 1000 && item.Id[3] == SportsdtGuestTeamId
})
let guestTenList = _.take(lists, 10);
let TotalAverageGoal = Math.round((_.sumBy(hostTenList, (o: any) => o.Score[0]) * 10 / hostTenList.length)
+ (_.sumBy(guestTenList, (o: any) => o.Score[1]) * 10 / guestTenList.length)) / 10
let AveragePredict = {
SixScoreResult: SixScoreResult,
TotalAverageGoal: TotalAverageGoal,
}
return JSON.stringify(AveragePredict)
} catch (e:any) {
}
return "{\"SixScoreResult\":\"主胜或平\",\"TotalAverageGoal\":null}"
}
export async function matchHistoryStatistics(match: any) {
try {
// Sportsdt:
// { SportsdtMatchId: '3751378',
// SportsdtIsah: false,
// SportsdtHostTeamId: '617',
// SportsdtGuestTeamId: '50',
// SportsdtCompetitionId: '177',
// SportsdtType: 'JC',
// SportsdtDegree: '2019-02-19',
// SportsdtNum: '周二001',
// SportsdtStarttime: '2019-02-19T19:45:00.000Z',
// LotteryId: 72 },
if (match.Sportsdt != null && match.Sportsdt.SportsdtMatchId != null) {
let gameanalyse = await api_hemera.query('sport', `getgameanalyse`, {}, { gameid: match.Sportsdt.SportsdtMatchId }, 30)
return {
"GuestTeamHistory": getGuestTeamHistory(match, gameanalyse),
"HomeTeamHistory": getHomeTeamHistory(match, gameanalyse),
"GuestTeamGuestHistory": getGuestTeamGuestHistory(match, gameanalyse),
"HomeTeamHomeHistory": getHomeTeamHomeHistory(match, gameanalyse),
"HomeGuestGuestTeamHistory": getHomeGuestGuestTeamHistory(match, gameanalyse),
"HomeGuestHomeTeamHistory": getHomeGuestHomeTeamHistory(match, gameanalyse),
"Score": getScore(match, gameanalyse),
"Record": getRecord(match, gameanalyse),
"MatchTypeList": getMatchTypeList(match, gameanalyse),
"Lineup": getLineup(match, gameanalyse),
"Predict": {
"ScorePredict": getScorePredict(match, gameanalyse),
"GoalPredict": getGoalPredict(match, gameanalyse),
"FlatPredict": getFlatPredict(match, gameanalyse),
"AveragePredict": getAveragePredict(match, gameanalyse),
}
}
}
return {
"GuestTeamHistory": "[0,0,0,0,0,0]",
"HomeTeamHistory": "[0,0,0,0,0,0]",
"GuestTeamGuestHistory": "[0,0,0,0,0,0]",
"HomeTeamHomeHistory": "[0,0,0,0,0,0]",
"HomeGuestGuestTeamHistory": "[0,0,0,0,0,0]",
"HomeGuestHomeTeamHistory": "[0,0,0,0,0,0]",
"Score": "{}",
"Record": "[]",
"MatchTypeList": "[]",
"Lineup": null,
"Predict": {
"ScorePredict": "{}",
"GoalPredict": "[null,null]",
"FlatPredict": "{\"HostFlatCount\":0,\"HostZeroCount\":0,\"GuestFlatCount\":0,\"GuestZeroCount\":0,\"HostWinLostCount\":8,\"GuestWinLostCount\":8,\"DrawProbability\":\"无\"}",
"AveragePredict": "{\"SixScoreResult\":\"无数据\",\"TotalAverageGoal\":null}"
}
}
} catch (e:any) {
console.info(e)
}
};
//cache
export async function get_statistics_predict_by_game_id_with_cache(gameid: any){
return cache.cache(get_statistics_predict_by_game_id,gameid,3600,"get_statistics_predict_by_game_id_v3")
}
export async function get_statistics_predict_by_game_id(gameid: any) {
try {
let gameinfo: any = await api_hemera.query('sport', `getgameinfo`, {}, { gameid: gameid })
let gameanalyse = await api_hemera.query('sport', `getgameanalyse`, {}, { gameid: gameid }, 30)
if(gameinfo==null||gameanalyse==null){
return {
"ScorePredict": "{}",
"GoalPredict": "[null,null]",
"FlatPredict": "{\"HostFlatCount\":0,\"HostZeroCount\":0,\"GuestFlatCount\":0,\"GuestZeroCount\":0,\"HostWinLostCount\":8,\"GuestWinLostCount\":8,\"DrawProbability\":\"无\"}",
"AveragePredict": "{\"SixScoreResult\":\"无数据\",\"TotalAverageGoal\":null}"
}
}
let match={Sportsdt:{
//SportsdtCompetitionId:gameid,SportsdtStarttime:moment().format("YYYY-MM-DD HH:mm")
SportsdtMatchId: gameid,
// SportsdtIsah: false,
SportsdtHostTeamId: gameinfo.HomeTeam[`Id`],
SportsdtGuestTeamId: gameinfo.AwayTeam[`Id`],
SportsdtCompetitionId: gameinfo.Competition[`Id`],
// SportsdtType: 'JC',
SportsdtStarttime: moment(gameinfo.Date).format("YYYY-MM-DD HH:mm"),
// LotteryId: 72
}}
return {
"ScorePredict": getScorePredict(match, gameanalyse),
"GoalPredict": getGoalPredict(match, gameanalyse),
"FlatPredict": getFlatPredict(match, gameanalyse),
"AveragePredict": getAveragePredict(match, gameanalyse),
}
} catch (e:any) {
console.info(e)
}
return {
"ScorePredict": "{}",
"GoalPredict": "[null,null]",
"FlatPredict": "{\"HostFlatCount\":0,\"HostZeroCount\":0,\"GuestFlatCount\":0,\"GuestZeroCount\":0,\"HostWinLostCount\":8,\"GuestWinLostCount\":8,\"DrawProbability\":\"无\"}",
"AveragePredict": "{\"SixScoreResult\":\"无数据\",\"TotalAverageGoal\":null}"
}
};
import * as infodb from '../table'
import moment = require('moment');
import { cache,redis as client, redis, task_lock } from '../../../cache';
//ms_schedule
async function getMsSchedulesByLottery({lotteryId}:any) {
let key = `${config.CachePrefix}match:match_ms_schedule:v1_${moment().add(-10,'day').format('YYYY-MM-DD')}_${lotteryId}`
let reply = await client.get(key);
if (reply) {
return JSON.parse(reply)
}
let result = await infodb.ms_schedule.findAll({
where:{
core_lottery_id:lotteryId,
core_match_time:{$gt:moment().add(-10,'day').format('YYYY-MM-DD')},
},
limit:1000,
attributes: ['core_match_id', 'sportsdt_match_id', 'sportsdt_host_team_id'
, 'sportsdt_guest_team_id', 'sportsdt_competition_id', 'sportsdt_type', 'sportsdt_degree'
, 'sportsdt_num', 'sportsdt_starttime', 'sportsdt_isah'],
})
await client.set(key,JSON.stringify(result))
await client.expire(key, 60*10)
return result
}
async function getMsSchedulesByCoreIds({CoreIds}:any) {
return cache(async ({CoreIds}:any)=>{
let result = (await infodb.ms_schedule.findAll({
where:{
core_match_id:{$in:CoreIds},
core_match_time:{$gt:moment().add(-120,'day').format('YYYY-MM-DD')},
},
limit:1000,
attributes: ['core_match_id', 'sportsdt_match_id', 'sportsdt_host_team_id'
, 'sportsdt_guest_team_id', 'sportsdt_competition_id', 'sportsdt_type', 'sportsdt_degree'
, 'sportsdt_num', 'sportsdt_starttime', 'sportsdt_isah', 'sportsdt_n'
, 'yiqiu_match_id', 'sporttery_match_id', 'w500_match_id', 'info_match_id'],
})).map((o:any)=>o.dataValues)
return result
},{CoreIds},10,"getMsSchedulesByCoreIds:v1",60,100)
}
export {getMsSchedulesByLottery,getMsSchedulesByCoreIds}
\ No newline at end of file
/**
* Created by sunney on 7/19/17.
*/
import {db as Info} from '../table'
import { cache,redis as client, redis, task_lock } from '../../../cache'
export async function getNBALeagueRank(match:any) {
if(match.LotteryId == 72) {
return []
}
let match_NBALeagueRank_key = `${config.CachePrefix}match:matchNBALeagueRank:v2_${match.Id}`
let t = await client.get(match_NBALeagueRank_key);
if (t && t.length > 0 && ! match.isUpdateCache) {
return t
}
if(match.LotteryId == 73) {
t = await Info.db.query(`SELECT
a.Id,a.TeamId,c.Name as TeamName,c.ShortName TeamShortNam,a.Win,a.Lose,a.WinPoint,
a.LosePoint,a.WinAverage,a.LostAverage,a.State,a.Type,b.FullName
as MatchTypeName,b.ShortName as MatchTypeShortName
FROM T_NBAMatch t
join T_NBALeagueRank a on a.MatchSeason=t.MatchSeason and a.MatchTypeId=t.MatchTypeId
JOIN T_NBAMatchType b ON a.MatchTypeId=b.Id AND b.ParentId=0 AND a.MatchSeason=t.MatchSeason and a.MatchTypeId=t.MatchTypeId
JOIN T_NBATeam c ON a.TeamId=c.Id
where t.Id=${match.InfoId}
ORDER BY Type, Id
`)
if (t == null || t.length == 0)
return []
client.set(match_NBALeagueRank_key, JSON.stringify(t[0]))
client.expire(match_NBALeagueRank_key, 60 *60*24)
return JSON.stringify(t[0]);
}
return []
};
import Core = require('../table');
import _ = require('lodash');
import { cache,redis as client, redis, task_lock } from '../../../cache'
const News = async (match:any) => {
let news_key = `${config.CachePrefix}match:matchnews:v3_${match.LotteryId}_${match.Id}`
let replyData = await client.get(news_key);
if (replyData && replyData.length > 0 && !match.isUpdateCache) {
return JSON.parse(replyData)
}
let sql = `SELECT * FROM core_news WHERE \`IsShow\`=true AND \`LotId\`=${match.LotteryId} AND \`MatchId\` = ${match.Id} ORDER BY \`UpdateTime\` DESC limit 10`
let t= await Core.sequelize.query(sql)
t=checkList(t)
client.set(news_key,JSON.stringify(t))
client.expire(news_key, 60*60)
return t;
};
function checkList(list:any){
if(list && list.length>0){
return _.map(list[0],(item)=>{
let rand= Math.round(Math.random()*10)
if(item.ImageUrl == null || item.ImageUrl == ''){
item.ImageUrl = `https://m.ydniu.com/images/info/00${rand}.png`
item.Contents = item.Contents.replace(new RegExp(/一定牛/g),'球道')
}
return item;
})
}
return []
}
const NewsList = async () => {
let sql = `SELECT * FROM core_news WHERE \`IsShow\`=true ORDER BY \`UpdateTime\` DESC limit 10`
let list= await Core.sequelize.query(sql)
return list;
};
export {News,NewsList}
import {db as Info} from '../table'
import _ = require('lodash');
import moment = require("moment");
import { cache,redis as client, redis, task_lock } from '../../../cache'
let localOddsDbData:any = {}
//获取凯利列表
function getKellyList(AvgOdds:any, Odds:any){
let fm = getKelly(AvgOdds)
if(Odds.length==3)
return [round(fm*Odds[0]/AvgOdds[0]/100),round(fm*Odds[1]/AvgOdds[1]/100),round(fm*Odds[2]/AvgOdds[2]/100)]
else
return [round(fm*Odds[0]/AvgOdds[0]/100),round(fm*Odds[1]/AvgOdds[1]/100)]
}
//获取凯利指数
function getKelly(Odds:any){
return 100.0/_.sumBy(Odds, (o:any) => {return 1/o});
}
function round(value:any){
return (Math.round(value*100)/100).toFixed(2)
}
//获取数据库数据,足球
async function getZqOddsDbData(match:any){
let oddsList=[]
let oddsLetGoalList = [] //让球
let oddsBigSmallList = [] //
//吴广要求加入的
//欧盘公司:1、百家平均,2、竞足官方,3、威廉希尔,4、立博,5、澳门,6、Bet365 ,7、Interwetten 8、SNAI ,9、皇冠,10、易胜博,
//11、伟德, 12、Bwin,13、Gamebookers 14、Pinnacle平博 , 15、10BET,16、18luck(新利),17、Coral ,18、Eurobet ,19、金宝博 , 20、利记,
//21、Mansion88(明升) ,22,Centrebet(澳大利亚), 23、UEDBET(UED亚洲),24、Unibe(优胜客), 25、香港马会,26、Betshop
//对应数据库的id(没有皇冠): 1129, 115, 82, 80, 281, 104, 110,90,81,255,158,177,16,1028,88,71,499,474,1137,9,1023,16,432,535
//1, 3, 4, 9, 12, 14, 16, 18, 60, 70, 71, 80, 81, 82, 88, 90, 97, 98, 104, 110, 115, 158, 173, 177, 182, 255, 266, 281, 370, 422, 432, 450, 474, 499, 517, 535, 538, 545, 574, 608, 615, 649, 659, 976, 658, 748, 799, 1038, 1039, 1040, 1041, 1042, 1044, 1129, 1183, 1137, 1028, 1023
let where = `AND \`Type\`=1
AND \`T_Company\`.\`Id\` IN (1,3,12,14,82,98,104,110,115,177,182,266,370,432,450,538,545,574,608,615,658,748,799,1038,1039,1040,1041,1042,1044,1129,281,255,976)
WHERE \`MatchId\`=${match.InfoId} and \`T_Company\`.\`Name\` is not null ORDER BY \`CompanyId\` `
oddsList = await Info.db.query(`SELECT \`T_Company\`.\`Name\` as \`CompanyName\`,\`T_Company\`.\`OrderId\`,\`T_Odds100\`.* FROM \`T_Odds100\`
LEFT JOIN \`T_Company\` ON \`T_Company\`.\`Id\`= \`T_Odds100\`.\`CompanyId\`
${where}
`)
oddsLetGoalList = await Info.db.query(`SELECT \`T_Company\`.\`Name\` as \`CompanyName\` ,\`T_Company\`.\`OrderId\`,\`T_OddsLetGoal\`.* FROM \`T_OddsLetGoal\`
LEFT JOIN \`T_Company\` ON \`T_Company\`.\`Id\`= \`T_OddsLetGoal\`.\`CompanyId\` ${where}`)
oddsBigSmallList = await Info.db.query(`SELECT \`T_Company\`.\`Name\` as \`CompanyName\` ,\`T_Company\`.\`OrderId\`,\`T_OddsBigSmall\`.* FROM \`T_OddsBigSmall\`
LEFT JOIN \`T_Company\` ON \`T_Company\`.\`Id\`= \`T_OddsBigSmall\`.\`CompanyId\` ${where}`)
return checkOdds({oddsList,oddsLetGoalList,oddsBigSmallList})
}
//检查数据
function checkOdds({oddsList,oddsLetGoalList,oddsBigSmallList}:any){
oddsList=checkOddsList(oddsList)
oddsLetGoalList=checkOddsList(oddsLetGoalList)
oddsBigSmallList=checkOddsList(oddsBigSmallList)
return {oddsList:oddsList, oddsLetGoalList:oddsLetGoalList, oddsBigSmallList:oddsBigSmallList}
}
function checkOddsList(list:any){
if(list && list.length>0){
return list[0]
}
return []
}
//获取数据库数据,篮球
async function getLqOddsDbData(match:any){
let oddsList=[]
let oddsLetGoalList = [] //让球
let oddsBigSmallList = [] //
let where = `WHERE \`T_NBACompany\`.\`Type\`=1
AND \`T_NBACompany\`.\`Id\` IN (3,6,9,26,43,82,77,83,214,265,272,317,368,369,431,458,360,422,446,366,339)
AND \`MatchId\`=${match.InfoId} and \`T_NBACompany\`.\`Name\` is not null
ORDER BY \`CompanyId\``
let where2 = `WHERE \`T_NBACompany\`.\`Type\`=2
AND \`MatchId\`=${match.InfoId} and \`T_NBACompany\`.\`Name\` is not null ORDER BY \`CompanyId\` `
oddsList = await Info.db.query(`SELECT \`T_NBACompany\`.\`Name\` as \`CompanyName\` ,\`T_NBAOdds100\`.* FROM \`T_NBAOdds100\`
LEFT JOIN \`T_NBACompany\` ON \`T_NBACompany\`.\`Id\`= \`T_NBAOdds100\`.\`CompanyId\`
${where}
`)
oddsLetGoalList = await Info.db.query(`SELECT \`T_NBACompany\`.\`Name\` as \`CompanyName\` ,\`T_NBAOddsLetGoal\`.* FROM \`T_NBAOddsLetGoal\`
LEFT JOIN \`T_NBACompany\` ON \`T_NBACompany\`.\`Id\`= \`T_NBAOddsLetGoal\`.\`CompanyId\` ${where2}`)
oddsBigSmallList = await Info.db.query(`SELECT \`T_NBACompany\`.\`Name\` as \`CompanyName\` ,\`T_NBAOddsBigSmall\`.* FROM \`T_NBAOddsBigSmall\`
LEFT JOIN \`T_NBACompany\` ON \`T_NBACompany\`.\`Id\`= \`T_NBAOddsBigSmall\`.\`CompanyId\` ${where2}`)
return checkOdds({oddsList,oddsLetGoalList,oddsBigSmallList})
}
//获取数据库数据
async function getOddsDbData(match:any){
let match_odds_key = `${config.CachePrefix}match:match_getOddsDbData:v3_${match.Id}`
let replyMatch = await client.get(match_odds_key);
if (replyMatch && replyMatch.length > 0 && !match.isUpdateCache) {
return JSON.parse(replyMatch)
}else if(!match.isUpdateCache){
return {}
}
let result = {oddsList: [], oddsLetGoalList: [], oddsBigSmallList: []}
if (match.InfoId && match.LotteryId != 73) {
result = await getZqOddsDbData(match)
} else if (match.InfoId && match.LotteryId == 73) {
result = await getLqOddsDbData(match)
}
await client.set(match_odds_key, JSON.stringify(result))
client.expire(match_odds_key, 60 * 60 * 24)
//标识此场比赛已经缓存
client.set(`${config.CachePrefix}match:match_odds:${match.Id}`, match.Id)
client.expire(`${config.CachePrefix}match:match_odds:${match.Id}`, 60 * 60 * 24)
return result;
}
function getCheckField(tableName:any){
if(tableName == 'OddsLetGoal') {
return {checkHomeField: 'HostOdds', checkGuestField: 'QuestOdds',valueHomeField: 'HostOdds', valueGuestField: 'QuestOdds'}
}
else if (tableName == 'OddsBigSmall'){
return {checkHomeField: 'BigOdds', checkGuestField: 'SmallOdds',valueHomeField: 'BigOdds', valueGuestField: 'SmallOdds'}
}
return {checkHomeField:'HomeWin',checkGuestField:'GuestWin',valueHomeField: 'HomeWin', valueGuestField: 'GuestWin'}
}
async function getSameFirstOddsStat({match, oddsItem,tableName}:any){
let Nba = match.LotteryId ==73 ? 'NBA' : ''
let {checkHomeField,checkGuestField,valueHomeField,valueGuestField} = getCheckField(tableName)
if(oddsItem[`First${valueHomeField}`]==null){
return {
SameFirstOddsStat:'',
SameFirstOddsList:'',
}
}
let sameOddsList = await Info.db.query(`SELECT t."BeginTime",t."HostTeamId",t."HostTeam",t."GuestTeamId",t."GuestTeam",t."HostScore",t."GuestScore",p."ShortName"
FROM "T_${Nba}${tableName}" o
LEFT JOIN "T_${Nba}Match" t ON t."Id"= o."MatchId"
LEFT JOIN "T_${Nba}MatchType" p ON p."Id"=t."MatchTypeId" and p."ParentId"=0
WHERE "CompanyId"=${oddsItem.CompanyId}
AND "First${checkHomeField}>=${round(oddsItem[`First${valueHomeField}`]-0.025)} AND "First${checkHomeField}"<=${round(oddsItem[`First${valueHomeField}`]+0.025)}
AND "First${checkGuestField}>=${round(oddsItem[`First${valueGuestField}`]-0.025)} AND "First${checkGuestField}"<=${round(oddsItem[`First${valueGuestField}`]+0.025)}
AND "Details"<>''
AND "${checkHomeField}"<>0
AND t."BeginTime">'${moment().add(-2,'year').format("YYYY-MM-DD")}'
AND t."BeginTime" IS NOT NULL
AND t."HostScore" IS NOT NULL
${match.LotteryId ==73 ? 'AND t."HostScore"!=t."GuestScore"' : 'AND t."MatchTypeId" IN (8,11,31,34,36)'}
order by "BeginTime" desc
limit 100
`)
sameOddsList = checkOddsList(sameOddsList)
return {
SameFirstOddsStat:JSON.stringify(statWonFlatLost(sameOddsList)),
SameFirstOddsList: JSON.stringify(sameOddsList),
}
}
async function getSameLastOddsStat({match, oddsItem,tableName}:any){
let Nba = match.LotteryId ==73 ? 'NBA' : ''
let {checkHomeField,checkGuestField,valueHomeField,valueGuestField} = getCheckField(tableName)
if(oddsItem[`First${valueHomeField}`]==null){
return {
SameLastOddsStat:'',
SameLastOddsList:'',
}
}
//只有初赔没有终盘,则使用初赔数据
if(!oddsItem[`${valueHomeField}`]){
let result =await getSameFirstOddsStat({match, oddsItem,tableName})
return {
SameLastOddsStat: result.SameFirstOddsStat,
SameLastOddsList: result.SameFirstOddsList,
}
}
let sameOddsList = await Info.db.query(`SELECT t."BeginTime",t."HostTeamId",t."HostTeam",t."GuestTeamId",t."GuestTeam",t."HostScore",t."GuestScore",p."ShortName"
FROM "T_${Nba}${tableName}" o
LEFT JOIN "T_${Nba}Match" t ON t."Id"= o."MatchId"
LEFT JOIN "T_${Nba}MatchType" p ON p."Id"=t."MatchTypeId" and p."ParentId"=0
WHERE "CompanyId"=${oddsItem.CompanyId}
AND "${checkHomeField}">=${round(oddsItem[`${valueHomeField}`]-0.025)} AND "${checkHomeField}"<=${round(oddsItem[`${valueHomeField}`]+0.025)}
AND "${checkGuestField}">=${round(oddsItem[`${valueGuestField}`]-0.025)} AND "${checkGuestField}"<=${round(oddsItem[`${valueGuestField}`]+0.025)}
AND "Details"<>''
AND "${checkHomeField}"<>0
AND t."BeginTime">'${moment().add(-2,'year').format("YYYY-MM-DD")}'
AND t."BeginTime" IS NOT NULL
AND t."HostScore" IS NOT NULL
${match.LotteryId ==73 ? 'AND t."HostScore"!=t."GuestScore"' : 'AND t."MatchTypeId" IN (8,11,31,34,36)'}
order by "BeginTime" desc
limit 100
`)
sameOddsList = checkOddsList(sameOddsList)
return {
SameLastOddsStat:JSON.stringify(statWonFlatLost(sameOddsList)),
SameLastOddsList: JSON.stringify(sameOddsList),
}
}
async function getSameMatchTypeSameFirstOddsStat({match, oddsItem,tableName}:any){
let Nba = match.LotteryId ==73 ? 'NBA' : ''
let {checkHomeField,checkGuestField,valueHomeField,valueGuestField} = getCheckField(tableName)
if(oddsItem[`First${valueHomeField}`]==null){
return {
SameMatchTypeSameFirstOddsStat:'',
SameMatchTypeSameFirstOddsList:'',
}
}
let sameOddsList = await Info.db.query(`
SELECT t."BeginTime",t."HostTeamId",t."HostTeam",t."GuestTeamId",t."GuestTeam",t."HostScore",t."GuestScore",p."ShortName"
FROM "T_${Nba}${tableName}" o
LEFT JOIN "T_${Nba}Match" t ON t."Id"= o."MatchId"
LEFT JOIN "T_${Nba}MatchType" p ON p."Id"=t."MatchTypeId" and p."ParentId"=0
WHERE "CompanyId"=${oddsItem.CompanyId}
AND "First${checkHomeField}>=${round(oddsItem[`First${valueHomeField}`]-0.025)} AND "First${checkHomeField}"<=${round(oddsItem[`First${valueHomeField}`]+0.025)}
AND "First${checkGuestField}>=${round(oddsItem[`First${valueGuestField}`]-0.025)} AND "First${checkGuestField}"<=${round(oddsItem[`First${valueGuestField}`]+0.025)}
AND "Details"<>''
AND "${checkHomeField}"<>0
AND t."BeginTime">'${moment().add(-2,'year').format("YYYY-MM-DD")}'
AND t."BeginTime" IS NOT NULL
AND t."HostScore" IS NOT NULL
${match.LotteryId ==73 ? 'AND t."HostScore"!=t."GuestScore"' : ''}
AND t."MatchTypeId" IN (select "MatchTypeId" from "T_${Nba}Match" where "Id" =${match.InfoId} limit 1)
order by "BeginTime" desc
limit 100
`)
sameOddsList = checkOddsList(sameOddsList)
return {
SameMatchTypeSameFirstOddsStat:JSON.stringify(statWonFlatLost(sameOddsList)),
SameMatchTypeSameFirstOddsList: JSON.stringify(sameOddsList),
}
}
//统计胜平负
function statWonFlatLost(sameOddsList:any){
let AllCount = 0
let WinCount = 0
let FlatCount = 0
let LostCount = 0
let WinRate:any = 0
let FlatRate:any = 0
let LostRate:any = 0
if(sameOddsList && sameOddsList.length>0){
_.map(sameOddsList,(item)=>{
AllCount++
if(item.HostScore>item.GuestScore){
WinCount++
}else if(item.HostScore==item.GuestScore){
FlatCount++
}else{
LostCount++
}
})
WinRate = round(1-parseFloat(round(FlatCount/AllCount))-parseFloat(round(LostCount/AllCount)))
FlatRate = round(FlatCount/AllCount)
LostRate = round(LostCount/AllCount)
}
return {AllCount:AllCount,WinCount:WinCount,FlatCount:FlatCount,LostCount:LostCount,WinRate:WinRate,FlatRate:FlatRate,LostRate:LostRate}
}
async function getSameMatchTypeSameLastOddsStat({match, oddsItem,tableName}:any){
let Nba = match.LotteryId ==73 ? 'NBA' : ''
let {checkHomeField,checkGuestField,valueHomeField,valueGuestField} = getCheckField(tableName)
if(oddsItem[`First${valueHomeField}`]==null){
return {
SameMatchTypeSameLastOddsStat:'',
SameMatchTypeSameLastOddsList:'',
}
}
//只有初赔没有终盘,则使用初赔数据
if(!oddsItem[`${valueHomeField}`]){
let result = await getSameMatchTypeSameFirstOddsStat({match, oddsItem,tableName})
return {
SameMatchTypeSameLastOddsStat: result.SameMatchTypeSameFirstOddsStat,
SameMatchTypeSameLastOddsList: result.SameMatchTypeSameFirstOddsList,
}
}
let sameOddsList = await Info.db.query(`SELECT t."BeginTime",t."HostTeamId",t."HostTeam",t."GuestTeamId",t."GuestTeam",t."HostScore",t."GuestScore",p."ShortName"
FROM "T_${Nba}${tableName}" o
LEFT JOIN "T_${Nba}Match" t ON t."Id"= o."MatchId"
LEFT JOIN "T_${Nba}MatchType" p ON p."Id"=t."MatchTypeId" and p."ParentId"=0
WHERE "CompanyId"=${oddsItem.CompanyId}
AND "${checkHomeField}">=${round(oddsItem[`${valueHomeField}`]-0.025)} AND "${checkHomeField}"<=${round(oddsItem[`${valueHomeField}`]+0.025)}
AND "${checkGuestField}">=${round(oddsItem[`${valueGuestField}`]-0.025)} AND "${checkGuestField}"<=${round(oddsItem[`${valueGuestField}`]+0.025)}
AND "Details"<>''
AND "${checkHomeField}"<>0
AND t."BeginTime">'${moment().add(-2,'year').format("YYYY-MM-DD")}'
AND t."BeginTime" IS NOT NULL
AND t."HostScore" IS NOT NULL
${match.LotteryId ==73 ? 'AND t."HostScore"!=t."GuestScore"' : ''}
AND t."MatchTypeId" IN (select "MatchTypeId" from "T_${Nba}Match" where "Id" =${match.InfoId} limit 1)
order by "BeginTime" desc
limit 100
`)
sameOddsList = checkOddsList(sameOddsList)
return {
SameMatchTypeSameLastOddsStat:JSON.stringify(statWonFlatLost(sameOddsList)),
SameMatchTypeSameLastOddsList: JSON.stringify(sameOddsList),
}
}
async function staticOdds100({match,oddsList,tableName}:any){
//计算平均指数
let length = match.LotteryId == 73 ? 2 :3
let AvgFirstOdds:any = _.take([0,0,0],length)
let AvgSecondOdds:any = _.take([0,0,0],length)
let AvgLastOdds:any = _.take([0,0,0],length)
let AvgFirstKelly:any = _.take([0,0,0],length)
let AvgLastKelly:any = _.take([0,0,0],length)
let oddsListLength=oddsList.length
if(match.LotteryId == 73){
_.map(oddsList, (oddsItem) => {
let FirstOdds:any = [round(oddsItem.FirstHomeWin), round(oddsItem.FirstGuestWin)]
let historyodds = JSON.parse(oddsItem.Details)
let SecondOdds = FirstOdds
let LastOdds = FirstOdds
if (historyodds && historyodds.length > 1) {
SecondOdds = [historyodds[1][0], historyodds[1][1]]
LastOdds = [historyodds[0][0], historyodds[0][1]]
}
AvgFirstOdds = [AvgFirstOdds[0] + FirstOdds[0] / oddsListLength, AvgFirstOdds[1] + FirstOdds[1] / oddsListLength]
AvgSecondOdds = [AvgSecondOdds[0] + SecondOdds[0] / oddsListLength, AvgSecondOdds[1] + SecondOdds[1] / oddsListLength]
AvgLastOdds = [AvgLastOdds[0] + LastOdds[0] / oddsListLength, AvgLastOdds[1] + LastOdds[1] / oddsListLength]
})
}else {
_.map(oddsList, (oddsItem) => {
let FirstOdds:any = [round(oddsItem.FirstHomeWin), round(oddsItem.FirstStandoff), round(oddsItem.FirstGuestWin)]
let historyodds = JSON.parse(oddsItem.Details)
let SecondOdds = FirstOdds
let LastOdds = FirstOdds
if (historyodds && historyodds.length > 1) {
SecondOdds = [historyodds[1][0], historyodds[1][1], historyodds[1][2]]
LastOdds = [historyodds[0][0], historyodds[0][1], historyodds[0][2]]
}
AvgFirstOdds = [AvgFirstOdds[0] + FirstOdds[0] / oddsListLength, AvgFirstOdds[1] + FirstOdds[1] / oddsListLength, AvgFirstOdds[2] + FirstOdds[2] / oddsListLength]
AvgSecondOdds = [AvgSecondOdds[0] + SecondOdds[0] / oddsListLength, AvgSecondOdds[1] + SecondOdds[1] / oddsListLength, AvgSecondOdds[2] + SecondOdds[2] / oddsListLength]
AvgLastOdds = [AvgLastOdds[0] + LastOdds[0] / oddsListLength, AvgLastOdds[1] + LastOdds[1] / oddsListLength, AvgLastOdds[2] + LastOdds[2] / oddsListLength]
})
}
AvgFirstOdds = _.map(AvgFirstOdds,(o)=>{ return round(o)})
AvgSecondOdds = _.map(AvgSecondOdds,(o)=>{ return round(o)})
AvgLastOdds = _.map(AvgLastOdds,(o)=>{ return round(o)})
let AvgReturnScale = getKelly(AvgLastOdds)
AvgFirstKelly= getKellyList(AvgFirstOdds,AvgFirstOdds)
AvgLastKelly = getKellyList(AvgLastOdds,AvgLastOdds)
let odds100 = await _.map(oddsList,async (oddsItem)=>{
let match_odds_key = `${config.CachePrefix}match:match_odds100_v20_${match.Id}:${oddsItem.CompanyId}`
let replyMatch = await client.get(match_odds_key);
if (replyMatch && replyMatch.length > 0 && !match.isUpdateCache) {
return JSON.parse(replyMatch)
}else if(!match.isUpdateCache){
return {}
}
let FirstOdds = _.take([round(oddsItem.FirstHomeWin),round(oddsItem.FirstStandoff),round(oddsItem.FirstGuestWin)],length)
if(match.LotteryId==73){
FirstOdds = [round(oddsItem.FirstHomeWin),round(oddsItem.FirstGuestWin)]
}
let historyodds = JSON.parse(oddsItem.Details)
let SecondOdds=FirstOdds
let LastOdds=FirstOdds
if(match.LotteryId == 73){
if (historyodds && historyodds.length > 1) {
LastOdds = [historyodds[0][0], historyodds[0][1]]
}
if (historyodds && historyodds.length > 2) {
SecondOdds = [historyodds[1][0], historyodds[1][1]]
}
}else {
if (historyodds && historyodds.length > 1) {
LastOdds = [historyodds[0][0], historyodds[0][1], historyodds[0][2]]
}
if (historyodds && historyodds.length > 2) {
SecondOdds = [historyodds[1][0], historyodds[1][1], historyodds[1][2]]
}
}
//同陪历史初赔
let {SameFirstOddsStat,SameFirstOddsList} = await getSameFirstOddsStat({match:match, oddsItem:oddsItem,tableName:tableName})
//同陪历史终赔
let {SameLastOddsStat,SameLastOddsList} = await getSameLastOddsStat({match:match, oddsItem:oddsItem,tableName:tableName})
//同联赛同陪历史统计
let {SameMatchTypeSameFirstOddsStat,SameMatchTypeSameFirstOddsList} = await getSameMatchTypeSameFirstOddsStat({match:match, oddsItem:oddsItem,tableName:tableName})
let {SameMatchTypeSameLastOddsStat,SameMatchTypeSameLastOddsList} = await getSameMatchTypeSameLastOddsStat({match:match, oddsItem:oddsItem,tableName:tableName})
let result = {
CompanyId: oddsItem.CompanyId,
CompanyName: oddsItem.CompanyName,
FirstOdds: replaceList(FirstOdds),
SecondOdds: replaceList(SecondOdds),
LastOdds: replaceList(LastOdds),
FirstKelly: getKellyList(AvgFirstOdds,FirstOdds),
LastKelly: getKellyList(AvgLastOdds,LastOdds),
ReturnScale: round(getKelly(LastOdds)),
HistoryOdds: JSON.stringify(historyodds).replace(new RegExp(/(<\/span>)/g),''),
// 同陪历史初赔统计
SameFirstOddsStat: SameFirstOddsStat,
//# 同陪历史初赔列表,
SameFirstOddsList: SameFirstOddsList,
//# 同陪历史终赔统计
SameLastOddsStat: SameLastOddsStat,
//# 同陪历史终赔列表
SameLastOddsList: SameLastOddsList,
//# 同联赛同陪历史初赔统计
SameMatchTypeSameFirstOddsStat: SameMatchTypeSameFirstOddsStat,
//# 同联赛同陪历史初赔列表
SameMatchTypeSameFirstOddsList: SameMatchTypeSameFirstOddsList,
//# 同联赛同陪历史终赔统计
SameMatchTypeSameLastOddsStat: SameMatchTypeSameLastOddsStat,
//# 同联赛同陪历史终赔列表
SameMatchTypeSameLastOddsList: SameMatchTypeSameLastOddsList,
}
await client.set(match_odds_key,JSON.stringify(result))
client.expire(match_odds_key, 60*60*24)
return result;
})
//平均赔率
let AvgOdds = {
CompanyId: 0,
CompanyName: '百家赔率',
FirstOdds: AvgFirstOdds,
SecondOdds: AvgSecondOdds,
LastOdds: AvgLastOdds,
FirstKelly: AvgFirstKelly,
LastKelly: AvgLastKelly,
ReturnScale: round(AvgReturnScale),
HistoryOdds: JSON.stringify([])
}
// //防止微服务挂掉
// try {
// //添加一条平均赔率
// odds100.unshift(AvgOdds)
//
// let sportdtOdds = await api_hemera.query('info', 'getsportdodds100', root, {
// Id: match.Id,
// AvgFirstOdds: AvgFirstOdds,
// AvgLastOdds: AvgLastOdds
// })
// if (sportdtOdds && sportdtOdds.length > 0)
// odds100 = _.concat(odds100, sportdtOdds)
// }catch (e:any){}
return {odds100:odds100,
AvgOdds:AvgOdds,
}
}
//计算概率
function staticProbability({match,AvgOdds}:any){
let firstScale:any=round(getKelly(AvgOdds.FirstOdds))
//# 概率, 主胜,平局 客胜
let MaxProbabilityName='主胜'
if(AvgOdds.LastOdds[1]<AvgOdds.LastOdds[0] && AvgOdds.LastOdds[1]<AvgOdds.LastOdds[2]){
MaxProbabilityName='平局'
}else if(AvgOdds.LastOdds[2]<AvgOdds.LastOdds[0] && AvgOdds.LastOdds[2]<AvgOdds.LastOdds[1]){
MaxProbabilityName='客胜'
}
let Probability
if(match.LotteryId == 73){
Probability = {
HostProbability: 100-Math.round(AvgOdds.ReturnScale / AvgOdds.LastOdds[1]),
FlatProbability: null,
GuestProbability: Math.round(AvgOdds.ReturnScale / AvgOdds.LastOdds[1]),
MaxProbabilityName: MaxProbabilityName,
FirstProbability: [round(firstScale / AvgOdds.FirstOdds[0]), round(firstScale / AvgOdds.FirstOdds[1])],
LastProbability: [round(AvgOdds.ReturnScale / AvgOdds.LastOdds[0]), round(AvgOdds.ReturnScale / AvgOdds.LastOdds[1])],
}
}else {
Probability = {
HostProbability: 100-Math.round(AvgOdds.ReturnScale / AvgOdds.LastOdds[1])-Math.round(AvgOdds.ReturnScale / AvgOdds.LastOdds[2]),
FlatProbability: Math.round(AvgOdds.ReturnScale / AvgOdds.LastOdds[1]),
GuestProbability: Math.round(AvgOdds.ReturnScale / AvgOdds.LastOdds[2]),
MaxProbabilityName: MaxProbabilityName,
FirstProbability: [round(firstScale / AvgOdds.FirstOdds[0]), round(firstScale / AvgOdds.FirstOdds[1]), round(firstScale / AvgOdds.FirstOdds[2])],
LastProbability: [round(AvgOdds.ReturnScale / AvgOdds.LastOdds[0]), round(AvgOdds.ReturnScale / AvgOdds.LastOdds[1]), round(AvgOdds.ReturnScale / AvgOdds.LastOdds[2])],
}
}
return Probability
}
//替换字符串列表的乱字符
function replaceList(list:any){
return _.map(list,(item) =>{
return item.replace(new RegExp(/(<\/span>)/g),'')
})
}
//计算亚盘 让球 大小球
async function staticAsia({match,oddsList,tableName}:any){
let length = match.LotteryId == 73 ? 2 :3
let result = await _.map(oddsList,async (item) =>{
let match_odds_key = `${config.CachePrefix}match:match_${tableName}:v18_${match.Id}:${item.CompanyId}`
let replyMatch = await client.get(match_odds_key);
if (replyMatch && replyMatch.length > 0 && !match.isUpdateCache) {
return JSON.parse(replyMatch)
}else if(!match.isUpdateCache){
return {}
}
let historyodds = item.Details ? JSON.parse(item.Details) : []
if(historyodds.length == 0) return {}
let LastOdds = _.take(historyodds[0],length)
let SecondOdds=LastOdds
let FirstOdds=LastOdds
if(historyodds && historyodds.length>1){
FirstOdds = _.take(historyodds[historyodds.length-1],length)
SecondOdds = _.take(historyodds[1],length)
}
//同陪历史初赔
let {SameFirstOddsStat,SameFirstOddsList} = await getSameFirstOddsStat({match:match, oddsItem:item,tableName:tableName})
//同陪历史终赔
let {SameLastOddsStat,SameLastOddsList} = await getSameLastOddsStat({match:match, oddsItem:item,tableName:tableName})
//同联赛同陪历史统计
let {SameMatchTypeSameFirstOddsStat,SameMatchTypeSameFirstOddsList} = await getSameMatchTypeSameFirstOddsStat({match:match, oddsItem:item,tableName:tableName})
let {SameMatchTypeSameLastOddsStat,SameMatchTypeSameLastOddsList} = await getSameMatchTypeSameLastOddsStat({match:match, oddsItem:item,tableName:tableName})
let result ={
CompanyId: item.CompanyId,
CompanyName: item.CompanyName,
FirstOdds: replaceList(FirstOdds),
SecondOdds: replaceList(SecondOdds),
LastOdds: replaceList(LastOdds),
HistoryOdds: JSON.stringify(historyodds).replace(new RegExp(/(<\/span>)/g),''),
// 同陪历史初赔统计
SameFirstOddsStat: SameFirstOddsStat,
//# 同陪历史初赔列表,
SameFirstOddsList: SameFirstOddsList,
//# 同陪历史终赔统计
SameLastOddsStat: SameLastOddsStat,
//# 同陪历史终赔列表
SameLastOddsList: SameLastOddsList,
//# 同联赛同陪历史初赔统计
SameMatchTypeSameFirstOddsStat: SameMatchTypeSameFirstOddsStat,
//# 同联赛同陪历史初赔列表
SameMatchTypeSameFirstOddsList: SameMatchTypeSameFirstOddsList,
//# 同联赛同陪历史终赔统计
SameMatchTypeSameLastOddsStat: SameMatchTypeSameLastOddsStat,
//# 同联赛同陪历史终赔列表
SameMatchTypeSameLastOddsList: SameMatchTypeSameLastOddsList,
}
client.set(match_odds_key,JSON.stringify(result))
if(match.MatchState == '未')
client.expire(match_odds_key, 60*60*24)
else
client.expire(match_odds_key, 60*60*24)
return result
})
return result
}
//计算同陪,改成实时计算,数据取缓存数据,当前赔率取实时
//将历史数据都存储在redis中
async function getHistorySameOdds(match:any){
//检查是否已经有数据
let keyMatch = `${config.CachePrefix}match:matchgetHistorySameOdds_v1_${match.Id}`
let replyList
replyList = await client.get(keyMatch);
if(replyList && replyList.length>0 && !match.isUpdateCache){
return JSON.parse(replyList)
}
//检查是否已经有所有的记录
let allMatchList:any = []
let keyAllMatch= `${config.CachePrefix}match:matchbylottery_${match.LotteryId}`
if(match.isUpdateLocalCache){
localOddsDbData[match.LotteryId]=null;
}
if(localOddsDbData[match.LotteryId]){
allMatchList = localOddsDbData[match.LotteryId];
}else{
allMatchList = await client.get(keyAllMatch);
if(allMatchList!=null){
allMatchList = JSON.parse( allMatchList);
}
}
if(allMatchList==null || allMatchList.length == 0){
// allMatchList = await Core.sequelize.query(`
// SELECT "Id", "InfoId", "GuestName", "HostName", "GameName", "MatchTime", "HostId", "GuestId","Results","BetSps","QcBf","ResultSps"
// FROM core_match WHERE "MatchTime">'${moment().add(-2,'year').format("YYYY-MM-DD")}' and "LotteryId"=${match.LotteryId}
// AND "Results" IS NOT null
// `)
// allMatchList = checkOddsList(allMatchList)
// if(match.isUpdateCache) {
// localOddsDbData[match.LotteryId] = null;
// localOddsDbData[match.LotteryId] = allMatchList
// }else {
// await client.set(keyAllMatch, JSON.stringify(allMatchList))
// client.expire(keyAllMatch, 60 * 60 * 24)
// }
}
let resultItem:any = _.split(match.ResultSps,',')
let lastEndBet =getLastEndBet(match)
allMatchList = _.filter(allMatchList, (item) =>{
let checkItem:any
if(match.LotteryId == 72){
if(item.BetSps) checkItem = JSON.parse(item.BetSps)["7206"]
if(resultItem == null|| resultItem.length<2) resultItem = JSON.parse(match.BetSps)["7206"]
}else if(match.LotteryId == 73){
if(item.BetSps) checkItem = JSON.parse(item.BetSps)["7301"]
if(resultItem == null || resultItem.length<2) resultItem = JSON.parse(match.BetSps)["7301"]
if(checkItem && resultItem && Math.abs(checkItem[0]-resultItem[0])<=0.025
&& Math.abs(checkItem[1]-resultItem[1])<=0.025){
return true
}
return false
}else if(match.LotteryId == 45){
if(item.BetSps) checkItem = JSON.parse(item.BetSps)["4501"]
if(resultItem == null|| resultItem.length<2) resultItem = JSON.parse(match.BetSps)["4501"]
}else {
if(item.BetSps) checkItem = _.takeRight(_.split(item.ResultSps,','),3)
}
//大的那个控制在0。05以内
let itemsCheckValue=_.map(checkItem,item=>{
if(item==_.max(checkItem)){
return 0.055
}else{
return 0.025
}
})
if(checkItem && resultItem && Math.abs(checkItem[0]-resultItem[0])<=itemsCheckValue[0]
&& Math.abs(checkItem[1]-resultItem[1])<=itemsCheckValue[1]
&& Math.abs(checkItem[2]-resultItem[2])<=itemsCheckValue[2]){
return true
}
return false
})
let AllCount = 0
let WinCount = 0
let FlatCount = 0
let LostCount = 0
allMatchList = _.map(allMatchList, (item) =>{
let checkItem = {}
let ResultSocre=''
let QcbfList = _.split(item.QcBf,'-')
AllCount++
if(QcbfList && QcbfList.length==2 && parseInt(QcbfList[0])<parseInt(QcbfList[1])){
ResultSocre='负'
LostCount++
}else if(QcbfList && QcbfList.length == 2 && parseInt(QcbfList[0])==parseInt(QcbfList[1])){
ResultSocre='平'
FlatCount++
}else if(QcbfList && QcbfList.length == 2 && parseInt(QcbfList[0])>parseInt(QcbfList[1])){
ResultSocre='胜'
WinCount++
}
if(match.LotteryId == 72){
if(item.BetSps) checkItem = JSON.parse(item.BetSps)["7206"]
}else if(match.LotteryId == 73){
if(item.BetSps) checkItem = JSON.parse(item.BetSps)["7301"]
}else if(match.LotteryId == 45){
if(item.BetSps) checkItem = JSON.parse(item.BetSps)["4501"]
}else {
if(item.BetSps) checkItem = JSON.parse(item.BetSps)["7206"]
}
return {
GameName:item.GameName,
MatchTime: item.MatchTime,
HostName: item.HostName,
GuestName: item.GuestName,
Qcbf: item.QcBf,
ResultOdds: checkItem,
ResultSocre: ResultSocre,
}
})
AllCount=WinCount+FlatCount+LostCount
let result= {
ResultSps: match.ResultSps,
BetSps:match.BetSps,
LastEndBet:JSON.stringify(lastEndBet),
AllCount: AllCount,
WinCount: WinCount,
FlatCount: FlatCount,
LostCount: LostCount,
WinRate: AllCount>0 ? round(1-parseFloat(round(FlatCount/AllCount))-parseFloat(round(LostCount/AllCount))): null,
FlatRate: AllCount>0 ? round(FlatCount/AllCount): null,
LostRate: AllCount>0 ? round(LostCount/AllCount): null,
SameOddsList: JSON.stringify(allMatchList),
}
await client.set(keyMatch,JSON.stringify(result))
client.expire(keyMatch, 60*60*24)
return result
}
function getLastEndBet(match:any) {
let lastEndBet =[]
if(match.LotteryId == 72){
if(match.BetSps) lastEndBet = JSON.parse(match.BetSps)["7206"]
}else if(match.LotteryId == 73){
if(match.BetSps) lastEndBet = JSON.parse(match.BetSps)["7301"]
}else if(match.LotteryId == 45){
if(match.BetSps) lastEndBet = JSON.parse(match.BetSps)["4501"]
}else {
if(match.BetSps) lastEndBet = _.takeRight(_.split(match.ResultSps,','),3)
}
lastEndBet = _.map(lastEndBet, t=>round(t))
return lastEndBet
}
//只获取部分字段
function getOddShortInfo(odd:any){
return {
CompanyId: odd.CompanyId,
CompanyName: odd.CompanyName,
FirstOdds: odd.FirstOdds,
SecondOdds: odd.SecondOdds,
LastOdds: odd.LastOdds,
}
}
export async function getOdds(match:any) {
//获取数据库数据
//match.isUpdateCache=true
// if(!match.isUpdateCache){
// return {
// Odds100: [],
// OddsLetGoal: [],
// OddsBigSmall: [],
// HistorySameOdds: [],
// OddsInfo:'[]',
// }
// }
let {oddsList, oddsLetGoalList, oddsBigSmallList} = await getOddsDbData(match)
if(!oddsList){
return {
Odds100: [],
OddsLetGoal: [],
OddsBigSmall: [],
HistorySameOdds: [],
OddsInfo:'[]',
}
}
//计算百家赔率,以及平均赔率
let {odds100, AvgOdds} = await staticOdds100({match:match, oddsList:oddsList,tableName:'Odds100'})
//计算预测
let Probability = staticProbability({match,AvgOdds})
//计算大小球
let OddsBigSmall =await staticAsia({match:match,oddsList:oddsBigSmallList,tableName:'OddsBigSmall'})
//计算同陪
//将历史数据都存储在redis中
//let historyOdds Results BetSps Id LotteryId 7206 7301 4501 ResultSps QcBf
//let HistorySameOdds=[]
let HistorySameOdds = await getHistorySameOdds(match)
//计算让球
let OddsLetGoal = await staticAsia({match:match,oddsList:oddsLetGoalList,tableName:'OddsLetGoal'})
let asiaOdds = {}
if(OddsLetGoal.length>0)
asiaOdds = await OddsLetGoal[0]
//赔率的情报数据
let OddsInfo = [getOddShortInfo(asiaOdds),getOddShortInfo(AvgOdds)]
return {
Odds100: odds100,
Probability: Probability,
OddsLetGoal: OddsLetGoal,
OddsBigSmall: OddsBigSmall,
HistorySameOdds: HistorySameOdds,
OddsInfo:JSON.stringify(OddsInfo),
}
}
import _ = require('lodash');
import api_hemera = require('../../../api_hemera');
import moment = require('moment');
import { cache,redis as client, redis, task_lock } from '../../../cache'
async function getOdds100LogByCompany(root:any,args:any,context:any){
//功能:获取单场的欧盘指数单公司赔率变化历史
//接口地址:http://{API_Url}/soccer/?type=gethdaoddslog
try{
let newargs={
gameid:args.sportsdtMatchId,
pid:args.companyId,
}
let result = await api_hemera.query('sport', 'gethdaoddslog', {}, newargs,30,"v1")
result = JSON.stringify(_.map(result.Logs,(log)=>{
return [round(log.Data[0]),
round(log.Data[1]),round(log.Data[2]),moment(parseInt(log.Date)).format("MM-DD HH:mm")]
}))
return result
} catch (e) {
console.info(e);
return []
}
}
function round(value:any) {
return (Math.round(value * 100) / 100).toFixed(2)
}
export {getOdds100LogByCompany}
\ No newline at end of file
export async function getHostTeam(
{ sportdtLogo, match }: any) {
if (match.Sportsdt) {
sportdtLogo = `https://data.7m.com.cn/team_data/${match.Sportsdt.SportsdtHostTeamId}/logo_img/club_logo.jpg`
if (match.LotteryId == 73) {
sportdtLogo = `https://bdata.7m.com.cn/basketball_team_data/${match.Sportsdt.SportsdtHostTeamId}/logo_img/club_logo.jpg`
}
if (match.Sportsdt.SportsdtHostTeamId == null) {
sportdtLogo = null
}
}
let result:any={}
result['SportsDtLogo'] = sportdtLogo
result[`LogoFullPath`]= sportdtLogo
result[`Logo`]= sportdtLogo
return result
}
export async function getGuestTeam(
{ sportdtLogo, match }: any) {
if (match.Sportsdt) {
sportdtLogo = `https://data.7m.com.cn/team_data/${match.Sportsdt.SportsdtGuestTeamId}/logo_img/club_logo.jpg`
if (match.LotteryId == 73) {
sportdtLogo = `https://bdata.7m.com.cn/basketball_team_data/${match.Sportsdt.SportsdtGuestTeamId}/logo_img/club_logo.jpg`
}
if (match.Sportsdt.SportsdtGuestTeamId == null) {
sportdtLogo = null
}
}
let result:any={}
result['SportsDtLogo'] = sportdtLogo
result[`LogoFullPath`]= sportdtLogo
result[`Logo`]= sportdtLogo
return result
}
export async function getTeam(
{ lotteryId, id, InfoId, isUpdateCache, sportdtLogo, match, }: any) {
if (match.Sportsdt&&id==match.GuestId) {
sportdtLogo = `https://data.7m.com.cn/team_data/${match.Sportsdt.SportsdtGuestTeamId}/logo_img/club_logo.jpg`
if (match.LotteryId == 73) {
sportdtLogo = `https://bdata.7m.com.cn/basketball_team_data/${match.Sportsdt.SportsdtGuestTeamId}/logo_img/club_logo.jpg`
}
if (match.Sportsdt.SportsdtGuestTeamId == null) {
sportdtLogo = null
}
}else if (match.Sportsdt&&id==match.HostId) {
sportdtLogo = `https://data.7m.com.cn/team_data/${match.Sportsdt.SportsdtHostTeamId}/logo_img/club_logo.jpg`
if (match.LotteryId == 73) {
sportdtLogo = `https://bdata.7m.com.cn/basketball_team_data/${match.Sportsdt.SportsdtHostTeamId}/logo_img/club_logo.jpg`
}
if (match.Sportsdt.SportsdtHostTeamId == null) {
sportdtLogo = null
}
}
let result:any={}
result['SportsDtLogo'] = sportdtLogo
result[`LogoFullPath`]= sportdtLogo
result[`Logo`]= sportdtLogo
return result
// let key = `${config.CachePrefix}match:match_getTeam:v2_${lotteryId}_${id}_${InfoId}`
// let reply:any = await client.getAsync(key);
// if (reply && !isUpdateCache) {
// reply = JSON.parse(reply)
// if (reply != null) {
// reply['SportsDtLogo'] = sportdtLogo
// // if(reply[`LogoFullPath`]==null){
// // reply[`LogoFullPath`]= sportdtLogo
// // }
// reply[`LogoFullPath`]= sportdtLogo
// return reply
// }
// }
// let result: any = {}
// if (id && lotteryId == 73) {
// let t = await Info.db.query(`SELECT
// c.*,b.\`ShortName\` as \`MatchTypeShortName\`, a.\`Id\` as \`Rank\`, a.\`Type\` as \`RankType\`
// FROM \`T_NBAMatch\` t
// join \`T_NBALeagueRank\` a on a.\`MatchSeason\`=t.\`MatchSeason\` and a.\`MatchTypeId\`=t.\`MatchTypeId\`
// JOIN \`T_NBAMatchType\` b ON a.\`MatchTypeId\`=b.\`Id\` AND b.\`ParentId\`=0 AND a.\`MatchSeason\`=t.\`MatchSeason\` and a.\`MatchTypeId\`=t.\`MatchTypeId\`
// JOIN \`T_NBATeam\` c ON a.\`TeamId\`=c.\`Id\` and c.\`Id\`=${id}
// where t.\`Id\`=${InfoId} and c.\`Id\`=${id}
// ORDER BY a.\`Type\`, a.\`Id\`
// `)
// if (t == null || t.length <= 0 || t[0].length <= 0)
// result = {}
// else {
// result = t[0][0];
// }
// } else if (id && lotteryId != 73) {
// let t = await Info.db.query(`select t.*,m.\`ShortName\` as \`MatchTypeShortName\` from \`T_Team\` t left join \`T_MatchType\` m on t.\`MatchTypeId\`=m.\`Id\` where t.\`Id\`=${id}`)
// if (t == null || t.length <= 0 || t[0].length <= 0)
// result = {}
// else {
// result = t[0][0];
// }
// }
// if (result != null) {
// result['SportsDtLogo'] = sportdtLogo
// result[`LogoFullPath`]= sportdtLogo
// // if(result[`LogoFullPath`]==null){
// // result[`LogoFullPath`]= sportdtLogo
// // }
// await client.setAsync(key, JSON.stringify(result))
// client.expire(key, 60 * 60 * 24)
// return result
// }
};
import * as moment from 'moment'
import * as _ from 'lodash'
import { v1 as Uid } from 'uuid';
import { ms_unscramble_order as order, db as info_db, ms_user } from '../table'
export async function createUnscrambleOrder(cramble: any, userid: number) {
let money = cramble.plan_saleprice
const user: any = await ms_user.findById(userid)
if (!user || !user.user_id) throw new Error('用户不存在')
//是否购买过
const isBought = await order.count({ where: { userid } }) > 0
if (isBought && await order.count({ where: { dbno: cramble.dbno, userid } }) > 0)
throw new Error('您已购买过,请勿重复购买')
//首单免费
if (!isBought) money = 0
if (isBought && user.balance < money) throw new Error('余额不够,请充值')
const scrambleOrder = {
userid,
buytime: moment(),
buymoney: money,
username: user.user_name,
..._.pick(cramble, ['dbno', 'typeid', 'expertid', 'author_name', 'plan_lotterytype', 'plan_issueno', 'plan_title', 'plan_summary', 'plan_begintime', 'plan_endtime', 'plan_passtype'])
}
return info_db.sequelize.transaction(async (transaction: any) => {
let res: any = await order.create(scrambleOrder, { transaction })
const orderId = res.id
if (!orderId) throw Error('推荐购买异常')
if (money > 0) {
const updateUser = `UPDATE ms_user SET balance=balance-${money} WHERE user_id=${userid} and balance>=${money}`;
res = await info_db.sequelize.query(updateUser, { transaction, type: info_db.sequelize.QueryTypes.UPDATE });
if (res[1] !== 1) throw Error('余额不够,请充值')
}
const updateUserOperation = `INSERT INTO ms_user_operation (uuid,user_id,created_at,user_name,user_nick_name,user_safe_code,type_name,type_id,money,balance,freeze,memo)SELECT '${Uid()}',user_id,'${moment().format('YYYY-MM-DD HH:mm:ss')}',user_name,nick_name,safe_code,'购买推荐订单',-1,${money},balance,freeze,'购买大神推荐,订单编号:${orderId}' FROM ms_user WHERE user_id=${userid}`;
await info_db.sequelize.query(updateUserOperation, { transaction });
return orderId
});
}
export async function getUnscrambleOrder(args: any) {
return order.findAll({
where: { userid: args.userid },
offset: args.offset,
limit: args.limit,
order: [['buytime', 'desc']]
})
}
// /**
// * 检查用户余额是否足够
// * @param data
// */
// @Dct.api({
// dbNo: Joi.number().required().error(() => '查询条件不能为空!'),
// buyedMoney: Joi.number().integer(),
// chargePayType: Joi.number().integer(),
// userId: Joi.number().integer()
// })
// public static async CheckUserMoney(data) {
// if (!data.userId) {
// return;
// }
// const user = await UserAdapter.getUserById(data.userId);
// if (!user) {
// return;
// }
// //余额不足直接充值
// if (user.Balance < data.buyedMoney) {
// const balance = _.floor(user.Balance);//向下取整数
// const money = (data.buyedMoney - balance).toString();
// return await PaymentAdapter.buildRequestUrl(Unscramble.PayTypeId[config.expert.PayTypeId], money, 'IOS', '', '', data.chargePayType, data.userId);
// }
// //余额不足
// if (data.Balance < data.buyedMoney) throw Error('账户余额不足请充值。');
// const unscramb = await UnscrambleInfo.find({ attributes: ['dbNo', 'plan_salePrice', 'typeId'], where: { dbNo: data.dbNo } });
// if (!unscramb) {
// throw Error('解读信息错误。');
// }
// if (data.buyedMoney !== unscramb.plan_salePrice) {
// throw Error('购买金额错误。');
// }
// if (data.UserStatus > 0 && data.UserStatus <= 50) {
// throw Error('用户已限制消费');
// }
// const cramble = await UnscrambleInfo.find({ where: { dbNo: data.dbNo } });
// if (!cramble) {
// throw Error('解读信息错误');
// }
// const trade = []
// const orderId = await Cache.getUniqId('unscrambleorder')
// const tradeno = `unscrambleorder:${orderId}`;
// const scrambleOrder = {
// Id: orderId,
// dbNo: data.dbNo,
// userId: data.userId,
// typeId: cramble.typeId,
// expertId: cramble.expertId,
// author_name: cramble.author_name,
// buyTime: moment(),
// userName: user.Name,
// buyMoney: data.buyedMoney,
// plan_lotteryType: cramble.plan_lotteryType,
// plan_issueNo: cramble.plan_issueNo,
// plan_title: cramble.plan_title,
// plan_summary: cramble.plan_summary,
// plan_beginTime: cramble.plan_beginTime,
// plan_endTime: cramble.plan_endTime,
// plan_passType: cramble.plan_passType
// };
// trade.push({
// sourceid: orderId,
// userid: user.Id,
// opertypeid: 2611,
// money: -data.buyedMoney,
// memo: `购买大神推荐,订单编号:${orderId}`,
// tradeno: tradeno
// })
// const time = Date.now()
// const msg: any = await sendMsg({
// topic: topicName.Account.AccoutnBackMoney, content: JSON.stringify({
// userid: user.Id,
// sourceid: orderId,
// tradeno: tradeno
// }),
// nextSendTime: moment().add(1, 'm').format('YYYY-MM-DD HH:mm:ss')
// })//退钱消息 60秒后发送
// const result = await AccountAdapter.trade(trade).catch(() => false)
// if (!result) {
// if (Date.now() - time < buyTimeout) Message.Model.update({ nextSendTime: moment().format('YYYY-MM-DD HH:mm:ss') }, { where: { id: msg.id, deletedAt: null } })
// throw new Error('扣款失败')
// }
// await Db.dbs[0].transaction(async (transaction) => {
// await UnscrambleOrder.create(scrambleOrder, { transaction });
// const r = await Message.Model.destroy({ where: { id: msg.id, deletedAt: null }, transaction })
// if (r < 1) throw new Error('下单失败')
// if (Date.now() - time > buyTimeout) throw new Error('购买超时')
// });
// if (unscramb.typeId === 0)//只有购买天天赢球接口的推荐才通知到他们接口
// {
// const timestamp = moment().format("YYYYMMDDHHmmss");
// const sign = await md5Sign(`${orderId}${config.expert.AppSecret}${timestamp}`, 'utf8', 'hex').toLocaleLowerCase();//md5(orderId+key+timestamp)
// const postData = `orderId=${orderId}&timestamp=${timestamp}&sign=${sign}`;
// await Unscramble.httpPostRequest(config.expert.postPay, postData);
// }
// return 1;
// }
\ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!