Commit 578e6cb0 Harvey

no message

1 个父辈 bfbf66af
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MatchJson = exports.NBATeam = exports.Team = exports.Odds100 = exports.Lottery = exports.Issue = exports.Match = void 0;
const match_1 = require("./match");
Object.defineProperty(exports, "Match", { enumerable: true, get: function () { return match_1.Match; } });
const issue_1 = require("./issue");
Object.defineProperty(exports, "Issue", { enumerable: true, get: function () { return issue_1.Issue; } });
const lottery_1 = require("./lottery");
Object.defineProperty(exports, "Lottery", { enumerable: true, get: function () { return lottery_1.Lottery; } });
const odds100_1 = require("./odds100");
Object.defineProperty(exports, "Odds100", { enumerable: true, get: function () { return odds100_1.Odds100; } });
const matchJson_1 = require("./matchJson");
Object.defineProperty(exports, "MatchJson", { enumerable: true, get: function () { return matchJson_1.MatchJson; } });
const team_1 = require("./team");
Object.defineProperty(exports, "Team", { enumerable: true, get: function () { return team_1.Team; } });
Object.defineProperty(exports, "NBATeam", { enumerable: true, get: function () { return team_1.NBATeam; } });
//# sourceMappingURL=index.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Issue = void 0;
const pginfo = require('../table');
const Issue = pginfo.core_issue;
exports.Issue = Issue;
//# sourceMappingURL=issue.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Lottery = void 0;
const pginfo = require('../table');
const Lottery = pginfo.core_lottery;
exports.Lottery = Lottery;
//# sourceMappingURL=lottery.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Match = void 0;
const pginfo = require("../table");
pginfo.core_match.belongsTo(pginfo.core_lottery, { foreignKey: 'LotteryId' });
pginfo.core_match.belongsTo(pginfo.core_issue, { foreignKey: 'IssueId' });
const Match = pginfo.core_match;
exports.Match = Match;
//# sourceMappingURL=match.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MatchJson = void 0;
/**
* Created by sunney on 7/3/17.
*/
const pginfo = require('../table');
const MatchJson = pginfo.T_MatchJson;
exports.MatchJson = MatchJson;
//# sourceMappingURL=matchJson.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.News = void 0;
const pginfo = require('../table');
const News = pginfo.core_news;
exports.News = News;
//# sourceMappingURL=news.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Odds100 = void 0;
/**
* Created by sunney on 6/7/17.
*/
const pginfo = require('../table');
const Odds100 = pginfo.T_Odds100;
exports.Odds100 = Odds100;
const NBAOdds100 = pginfo.T_Odds100;
//# sourceMappingURL=odds100.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.NBATeam = exports.Team = void 0;
/**
* Created by sunney on 6/7/17.
*/
const pginfo = require('../table');
const Team = pginfo.T_Team;
exports.Team = Team;
const NBATeam = pginfo.T_NBATeam;
exports.NBATeam = NBATeam;
//# sourceMappingURL=team.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getRechargeChannelsList = void 0;
const info_db = require("../../info_mysql/table");
//充值接口控制充值通道
async function getRechargeChannelsList({ root, args, context }) {
let where = {
is_enable: 1
};
if (process.env.ALPHA) { //灰度
where = {};
}
let ms_recharge_channels_list = JSON.parse(JSON.stringify(await info_db.ms_recharge_channels.findAndCountAll({
where: where,
order: [["sort_serial", "DESC"]]
})));
return ms_recharge_channels_list.rows;
}
exports.getRechargeChannelsList = getRechargeChannelsList;
//# sourceMappingURL=charge.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getHistorySameOdds = exports.historySameOddsTemp = void 0;
const table_1 = require("../table");
const _ = require("lodash");
const config = require("../../../../config");
const moment = require("moment");
exports.historySameOddsTemp = {
"ResultSps": null,
"BetSps": null,
"AllCount": null,
"WinCount": null,
"FlatCount": null,
"LostCount": null,
"WinRate": null,
"FlatRate": null,
"LostRate": null,
"SameOddsList": null,
"LastEndBet": null
};
async function getHistorySameOdds(winBet, flatBet, lossBet) {
//只比较最小的两个,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 table_1.db.db.query(sql);
if (list != null && list.length > 0) {
list = list[0];
let result = {
"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 exports.historySameOddsTemp;
}
exports.getHistorySameOdds = getHistorySameOdds;
//# sourceMappingURL=history_same_odds.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MatchTimes = exports.Issues = exports.Issue = void 0;
const Core = require("../table");
const Model = require("../model");
const moment = require("moment");
const _ = require("lodash");
const config = require("../../../../config");
const cache_1 = require("../../../cache");
async function Issue(issueId) {
let t = await Model.Issue.findOne({
where: {
Id: issueId
}
});
return t;
}
exports.Issue = Issue;
;
const Issues = async (root, args, context, isUpdateCache = false) => {
let lotId = 72;
if (parseInt(args.lotId) > 0) {
lotId = parseInt(args.lotId);
}
// console.info(args);
return (0, cache_1.cache)(async ({ lotId, limit }) => {
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 = 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);
};
exports.Issues = Issues;
const MatchTimes = async (root, args, context, isUpdateCache = 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 cache_1.redis.get(key);
try {
if (reply && reply.length > 0 && !isUpdateCache) {
return JSON.parse(reply);
}
}
catch (e) {
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 cache_1.redis.set(key, JSON.stringify(t));
cache_1.redis.expire(key, 60);
return t;
};
exports.MatchTimes = MatchTimes;
function checkList(list) {
if (list && list.length > 0) {
return list[0];
}
return [];
}
//# sourceMappingURL=issue.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.get_sports_injury = exports.getlineupfromsporttery = void 0;
const _ = require("lodash");
const api_hemera = require("../../../api_hemera");
const moment = require("moment");
const cache_1 = require("../../../cache");
const db = require("../table");
async function getlineupfromsporttery({ sportsdt_gameid, type, lotteryId, issueName, matchNumber }) {
// 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 = 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 = {
Goalkeeper: "守门员",
Defender: "后卫",
Midfielder: "中场",
Attacker: "前锋",
};
let position_x_name = {
"": "0",
GK: '1',
D1: '2',
D2: '3',
D: '3',
DM: '4',
M: '5',
AM: '6',
A: '7',
};
let position_y_name = {
"": "0",
L: '1',
CL: '2',
C: '3',
CR: '4',
R: '5',
};
let h_lineups_info_lineups = _.map(jsonBody.h_lineups_info.lineups, (item) => {
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 = _.map(jsonBody.a_lineups_info.lineups, (item) => {
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) => {
return [item.shirtnumber,
item.person,
positionName[item.position],
"0",
"0"
];
});
let a_lineups_info_lineups_bench = _.map(jsonBody.a_lineups_info.lineups_bench, (item) => {
return [item.shirtnumber,
item.person,
positionName[item.position],
"0",
"0"
];
});
for (let i = 2; i <= 7; i++) {
let leng = _.countBy(h_lineups_info_lineups, (item) => { return item[3] + '' == i + ''; });
if (leng.true > 0) {
Formation[1] = `${Formation[1]}${leng.true}`;
}
}
for (let i = 2; i <= 7; i++) {
let leng = _.countBy(a_lineups_info_lineups, (item) => { 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) {
return JSON.stringify([
["", "", ""],
[],
[],
[],
[],
[],
[],
]);
}
}
exports.getlineupfromsporttery = getlineupfromsporttery;
async function get_sports_injury(gameid) {
try {
let gameprediction = await (0, cache_1.cache)(async (args) => {
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 = _.map(_.filter(gameprediction.Lineup.HomePlayers, (o) => { return o.Status == 2 || o.Status == 1; }), (item) => {
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 = _.map(_.filter(gameprediction.Lineup.AwayPlayers, (o) => { return o.Status == 2 || o.Status == 1; }), (item) => {
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) {
return JSON.stringify({
Home: [],
Away: []
});
}
}
exports.get_sports_injury = get_sports_injury;
//# sourceMappingURL=lineup.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CompetitionResult = exports.ZqSpPercent = exports.statProbability = exports.liveScore = exports.get_core_match = exports.gp_liveScore = exports.start_realtime_message_task = void 0;
const Model = require("../model");
const sequelize = require("sequelize");
const moment = require("moment");
const _ = require("lodash");
const api_hemera = require("../../../api_hemera");
const ms_schedule = require("./ms_schedule");
const nami_data = require("../../../nami/nami_data");
const cache_1 = require("../../../cache");
const config = require("../../../../config");
const Core = require("../table");
const info_db = require("../table");
const md5 = require("md5");
const zlib = require("zlib");
const matchlock = { flag: false };
async function start_realtime_message_task() {
}
exports.start_realtime_message_task = start_realtime_message_task;
async function gp_liveScore(root, args, context) {
//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;
}
exports.gp_liveScore = gp_liveScore;
const liveScore = async (root, args, context, isUpdateCache) => {
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);
};
exports.liveScore = liveScore;
async function doGetLiveScore(root, args, context, isUpdateCache, key, keyCount) {
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 = 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) => o.MatchState != "未" && o.Sportsdt && o.Sportsdt.SportsdtMatchId), _.filter(t, (o) => o.MatchState == "未" && o.Sportsdt && o.Sportsdt.SportsdtMatchId));
}
if (args.infoId && t.length > 1) {
//优先使用竞足的数据
t = _.concat(_.orderBy(_.filter(t, (o) => o.LotteryId == 72), ['MatchTime'], ['desc']), _.orderBy(_.filter(t, (o) => o.LotteryId == 45), ['MatchTime'], ['desc']), _.orderBy(_.filter(t, (o) => 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, where, offset, order, args) {
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) => {
//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) => {
//match.MatchTime = moment(match.MatchTime).valueOf();
return match;
});
return { t: matchs, count: result[1] };
}
}
//足球实时比分
async function addSportsdtScoreLiveData(t) {
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) {
console.info(e);
}
return t;
}
//纳米数据的实时比分
async function addNamiScoreLiveData(t) {
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) => {
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) {
console.info(e);
}
return t;
}
//篮球实时比分
async function addSportsdtBasketballLiveData(t) {
try {
}
catch (e) {
console.info(e);
}
return t;
}
async function initSportsdtBaseData(t) {
// 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) => {
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) { }
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) {
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) {
t = t.map((item) => {
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) {
return await Model.Match.findAll({
attributes: [[sequelize.fn('COUNT', sequelize.col('Id')), 'count']],
where: where,
});
}
async function getMatchListFromDb(limit, where, offset, order) {
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) {
// return await OldModel.Match.findAll({
// attributes: [[sequelize.fn('COUNT', sequelize.col('Id')), 'count']],
// where: where,
// });
}
async function getMatchListFromOldDb(limit, where, offset, order) {
// return await OldModel.Match.findAll({
// limit: limit || 20,
// include: [
// { model: OldModel.Issue, },
// { model: OldModel.Lottery, },
// ],
// where: where,
// offset: offset,
// order: order,
// });
}
function checkPages(args) {
// 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 = [["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) {
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) {
let where = {};
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) { }
}
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, keyCount) {
let reply = await cache_1.redis.get(`${key}_${moment().format('YYYYMMDDHH')}`);
if (reply && reply.length > 0) {
let replyCount = await cache_1.redis.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, keyCount) {
let time24 = 'time24';
key = key + time24;
let reply = await cache_1.redis.get(`${key}`);
if (reply && reply.length > 0) {
let replyCount = await cache_1.redis.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, keyCount, result, args) {
let buffer = await zlib.gzipSync(JSON.stringify(result.matchs));
let z_result = buffer.toString("base64");
await cache_1.redis.setex(`${key}_${moment().format('YYYYMMDDHH')}`, 20, z_result);
//更新为5秒
cache_1.redis.expire(`${key}_${moment().format('YYYYMMDDHH')}`, 20);
await cache_1.redis.setex(`${keyCount}_${moment().format('YYYYMMDDHH')}`, 20, JSON.stringify(result.count));
//更新为5秒
cache_1.redis.expire(`${keyCount}_${moment().format('YYYYMMDDHH')}`, 20);
let time24 = 'time24';
await cache_1.redis.setex(key + time24, 60 * 60 * 24 * 7, z_result);
cache_1.redis.expire(key + time24, 60 * 60 * 24 * 7);
await cache_1.redis.setex(keyCount + time24, 60 * 60 * 24 * 7, JSON.stringify(result.count));
cache_1.redis.expire(keyCount + time24, 60 * 60 * 24 * 7);
}
//计算概率
const statProbability = async (match) => {
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,
};
};
exports.statProbability = statProbability;
// 获取足球概率战力值
function ZqSpPercent(match) {
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) {
return [0, 0];
}
}
exports.ZqSpPercent = ZqSpPercent;
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;
};
exports.CompetitionResult = CompetitionResult;
async function get_core_match({ lotteryId }) {
try {
if (!_.includes([72, 74, 75, 45], lotteryId)) {
return null;
}
let where = {
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 = 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 = 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;
}) || {}).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) => 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) => 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) {
console.info(`lottery_get_matchs 获取比赛数据异常:${e.message}`);
}
}
exports.get_core_match = get_core_match;
//# sourceMappingURL=match.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getMatchJson = void 0;
/**
* Created by sunney on 7/3/17.
*/
const Model = require("../model");
const cache_1 = require("../../../cache");
async function getMatchJson({ type, match }) {
try {
let match_team_info_key = `${config.CachePrefix}match:match_json:v1_${match.Id}_${type}`;
let t = await cache_1.redis.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
}
});
cache_1.redis.set(match_team_info_key, t.Json);
cache_1.redis.expire(match_team_info_key, 60 * 60 * 24);
}
if (t == null)
return '{}';
return t.Json;
}
catch (e) {
return '{}';
}
}
exports.getMatchJson = getMatchJson;
//# sourceMappingURL=matchJson.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getMatchTeamInfo = void 0;
/**
* Created by sunney on 7/4/17.
*/
const Info = require("../table");
const cache_1 = require("../../../cache");
async function getMatchTeamInfo(match) {
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 cache_1.redis.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) {
cache_1.redis.set(match_team_info_key, JSON.stringify(t[0]));
cache_1.redis.expire(match_team_info_key, 60 * 60 * 24);
return JSON.stringify(t[0]);
}
else {
return '[]';
}
}
catch (e) {
return '[]';
}
}
exports.getMatchTeamInfo = getMatchTeamInfo;
//# sourceMappingURL=matchTeam.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.get_statistics_predict_by_game_id = exports.get_statistics_predict_by_game_id_with_cache = exports.matchHistoryStatistics = exports.getAveragePredict = exports.getFlatPredict = exports.getGoalPredict = exports.getScorePredict = exports.getLineup = exports.getMatchTypeList = exports.getRecord = exports.getScore = exports.getHomeGuestHomeTeamHistory = exports.getHomeGuestGuestTeamHistory = exports.getHomeTeamHomeHistory = exports.getGuestTeamGuestHistory = exports.getHomeTeamHistory = exports.getGuestTeamHistory = void 0;
/**
* Created by sunney on 6/12/17.
*/
const _ = require("lodash");
const moment = require("moment");
const api_hemera = require("../../../api_hemera");
const cache = require("../../../cache");
//
function getGuestTeamHistory(match, gameanalyse) {
let { SportsdtMatchId, SportsdtIsah, SportsdtHostTeamId, SportsdtGuestTeamId, SportsdtCompetitionId, SportsdtType, SportsdtDegree, SportsdtNum, SportsdtStarttime, LotteryId } = 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) {
}
return "[0,0,0,0,0,0]";
}
exports.getGuestTeamHistory = getGuestTeamHistory;
function getHomeTeamHistory(match, gameanalyse) {
let { SportsdtMatchId, SportsdtIsah, SportsdtHostTeamId, SportsdtGuestTeamId, SportsdtCompetitionId, SportsdtType, SportsdtDegree, SportsdtNum, SportsdtStarttime, LotteryId } = 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) {
}
return "[0,0,0,0,0,0]";
}
exports.getHomeTeamHistory = getHomeTeamHistory;
function getGuestTeamGuestHistory(match, gameanalyse) {
let { SportsdtMatchId, SportsdtIsah, SportsdtHostTeamId, SportsdtGuestTeamId, SportsdtCompetitionId, SportsdtType, SportsdtDegree, SportsdtNum, SportsdtStarttime, LotteryId } = 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) {
}
return "[0,0,0,0,0,0]";
}
exports.getGuestTeamGuestHistory = getGuestTeamGuestHistory;
function getHomeTeamHomeHistory(match, gameanalyse) {
let { SportsdtMatchId, SportsdtIsah, SportsdtHostTeamId, SportsdtGuestTeamId, SportsdtCompetitionId, SportsdtType, SportsdtDegree, SportsdtNum, SportsdtStarttime, LotteryId } = 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) {
}
return "[0,0,0,0,0,0]";
}
exports.getHomeTeamHomeHistory = getHomeTeamHomeHistory;
function getHomeGuestGuestTeamHistory(match, gameanalyse) {
let { SportsdtMatchId, SportsdtIsah, SportsdtHostTeamId, SportsdtGuestTeamId, SportsdtCompetitionId, SportsdtType, SportsdtDegree, SportsdtNum, SportsdtStarttime, LotteryId } = match.Sportsdt;
try {
}
catch (e) {
}
return "[0,0,0,0,0,0]";
}
exports.getHomeGuestGuestTeamHistory = getHomeGuestGuestTeamHistory;
function getHomeGuestHomeTeamHistory(match, gameanalyse) {
let { SportsdtMatchId, SportsdtIsah, SportsdtHostTeamId, SportsdtGuestTeamId, SportsdtCompetitionId, SportsdtType, SportsdtDegree, SportsdtNum, SportsdtStarttime, LotteryId } = match.Sportsdt;
try {
}
catch (e) {
}
return "[0,0,0,0,0,0]";
}
exports.getHomeGuestHomeTeamHistory = getHomeGuestHomeTeamHistory;
function getScore(match, gameanalyse) {
let { SportsdtMatchId, SportsdtIsah, SportsdtHostTeamId, SportsdtGuestTeamId, SportsdtCompetitionId, SportsdtType, SportsdtDegree, SportsdtNum, SportsdtStarttime, LotteryId } = match.Sportsdt;
try {
}
catch (e) {
}
return "{}";
}
exports.getScore = getScore;
function getRecord(match, gameanalyse) {
let { SportsdtMatchId, SportsdtIsah, SportsdtHostTeamId, SportsdtGuestTeamId, SportsdtCompetitionId, SportsdtType, SportsdtDegree, SportsdtNum, SportsdtStarttime, LotteryId } = match.Sportsdt;
try {
}
catch (e) {
}
return "[]";
}
exports.getRecord = getRecord;
function getMatchTypeList(match, gameanalyse) {
let { SportsdtMatchId, SportsdtIsah, SportsdtHostTeamId, SportsdtGuestTeamId, SportsdtCompetitionId, SportsdtType, SportsdtDegree, SportsdtNum, SportsdtStarttime, LotteryId } = match.Sportsdt;
try {
}
catch (e) {
}
return "[]";
}
exports.getMatchTypeList = getMatchTypeList;
function getLineup(match, gameanalyse) {
let { SportsdtMatchId, SportsdtIsah, SportsdtHostTeamId, SportsdtGuestTeamId, SportsdtCompetitionId, SportsdtType, SportsdtDegree, SportsdtNum, SportsdtStarttime, LotteryId } = match.Sportsdt;
try {
}
catch (e) {
}
return null;
}
exports.getLineup = getLineup;
function getScorePredict(match, gameanalyse) {
let { SportsdtMatchId, SportsdtIsah, SportsdtHostTeamId, SportsdtGuestTeamId, SportsdtCompetitionId, SportsdtType, SportsdtDegree, SportsdtNum, SportsdtStarttime, LotteryId } = match.Sportsdt;
try {
//计算预测数据,
//积分数据预测结果
//主场球队取胜的可能性=44.8%+(0.53%*两队积分差)
let ScorePredict = {};
let matchsForScorePredict = [];
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) {
}
return JSON.stringify({
WinRate: null,
FlatRate: null,
LostRate: null,
});
}
exports.getScorePredict = getScorePredict;
//六场预测法,进球数预测法
function getGoalPredict(match, gameanalyse) {
let { SportsdtMatchId, SportsdtIsah, SportsdtHostTeamId, SportsdtGuestTeamId, SportsdtCompetitionId, SportsdtType, SportsdtDegree, SportsdtNum, SportsdtStarttime, LotteryId } = 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) => {
return item;
}) / hostSixList.length) / 100,
Math.round(100 * _.sumBy(guestSixList, (item) => {
return item;
}) / guestSixList.length) / 100,
];
return JSON.stringify(GoalPredict);
}
catch (e) {
}
return JSON.stringify([null, null]);
}
exports.getGoalPredict = getGoalPredict;
function getFlatPredict(match, gameanalyse) {
let { SportsdtMatchId, SportsdtIsah, SportsdtHostTeamId, SportsdtGuestTeamId, SportsdtCompetitionId, SportsdtType, SportsdtDegree, SportsdtNum, SportsdtStarttime, LotteryId } = 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 = {
HostFlatCount: _.sumBy(hostEightList, function (o) {
if (o.Score[0] == o.Score[1])
return 1;
return 0;
}),
HostZeroCount: _.filter(hostEightList, function (o) {
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) {
if (o.Score[0] == o.Score[1])
return 1;
return 0;
}),
GuestZeroCount: _.filter(guestEightList, function (o) {
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) {
}
return "{\"HostFlatCount\":0,\"HostZeroCount\":0,\"GuestFlatCount\":0,\"GuestZeroCount\":0,\"HostWinLostCount\":8,\"GuestWinLostCount\":8,\"DrawProbability\":\"无\"}";
}
exports.getFlatPredict = getFlatPredict;
function getAveragePredict(match, gameanalyse) {
let { SportsdtMatchId, SportsdtIsah, SportsdtHostTeamId, SportsdtGuestTeamId, SportsdtCompetitionId, SportsdtType, SportsdtDegree, SportsdtNum, SportsdtStarttime, LotteryId } = 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 = 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) => o.Score[0]) * 10 / hostTenList.length)
+ (_.sumBy(guestTenList, (o) => o.Score[1]) * 10 / guestTenList.length)) / 10;
let AveragePredict = {
SixScoreResult: SixScoreResult,
TotalAverageGoal: TotalAverageGoal,
};
return JSON.stringify(AveragePredict);
}
catch (e) {
}
return "{\"SixScoreResult\":\"主胜或平\",\"TotalAverageGoal\":null}";
}
exports.getAveragePredict = getAveragePredict;
async function matchHistoryStatistics(match) {
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) {
console.info(e);
}
}
exports.matchHistoryStatistics = matchHistoryStatistics;
;
//cache
async function get_statistics_predict_by_game_id_with_cache(gameid) {
return cache.cache(get_statistics_predict_by_game_id, gameid, 3600, "get_statistics_predict_by_game_id_v3");
}
exports.get_statistics_predict_by_game_id_with_cache = get_statistics_predict_by_game_id_with_cache;
async function get_statistics_predict_by_game_id(gameid) {
try {
let gameinfo = 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) {
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}"
};
}
exports.get_statistics_predict_by_game_id = get_statistics_predict_by_game_id;
;
//# sourceMappingURL=match_history_statistics.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getMsSchedulesByCoreIds = exports.getMsSchedulesByLottery = void 0;
const infodb = require("../table");
const moment = require("moment");
const cache_1 = require("../../../cache");
//ms_schedule
async function getMsSchedulesByLottery({ lotteryId }) {
let key = `${config.CachePrefix}match:match_ms_schedule:v1_${moment().add(-10, 'day').format('YYYY-MM-DD')}_${lotteryId}`;
let reply = await cache_1.redis.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 cache_1.redis.set(key, JSON.stringify(result));
await cache_1.redis.expire(key, 60 * 10);
return result;
}
exports.getMsSchedulesByLottery = getMsSchedulesByLottery;
async function getMsSchedulesByCoreIds({ CoreIds }) {
return (0, cache_1.cache)(async ({ CoreIds }) => {
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) => o.dataValues);
return result;
}, { CoreIds }, 10, "getMsSchedulesByCoreIds:v1", 60, 100);
}
exports.getMsSchedulesByCoreIds = getMsSchedulesByCoreIds;
//# sourceMappingURL=ms_schedule.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getNBALeagueRank = void 0;
/**
* Created by sunney on 7/19/17.
*/
const table_1 = require("../table");
const cache_1 = require("../../../cache");
async function getNBALeagueRank(match) {
if (match.LotteryId == 72) {
return [];
}
let match_NBALeagueRank_key = `${config.CachePrefix}match:matchNBALeagueRank:v2_${match.Id}`;
let t = await cache_1.redis.get(match_NBALeagueRank_key);
if (t && t.length > 0 && !match.isUpdateCache) {
return t;
}
if (match.LotteryId == 73) {
t = await table_1.db.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 [];
cache_1.redis.set(match_NBALeagueRank_key, JSON.stringify(t[0]));
cache_1.redis.expire(match_NBALeagueRank_key, 60 * 60 * 24);
return JSON.stringify(t[0]);
}
return [];
}
exports.getNBALeagueRank = getNBALeagueRank;
;
//# sourceMappingURL=nba_league_rank.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.NewsList = exports.News = void 0;
const Core = require("../table");
const _ = require("lodash");
const cache_1 = require("../../../cache");
const News = async (match) => {
let news_key = `${config.CachePrefix}match:matchnews:v3_${match.LotteryId}_${match.Id}`;
let replyData = await cache_1.redis.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);
cache_1.redis.set(news_key, JSON.stringify(t));
cache_1.redis.expire(news_key, 60 * 60);
return t;
};
exports.News = News;
function checkList(list) {
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;
};
exports.NewsList = NewsList;
//# sourceMappingURL=news.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getOdds = void 0;
const table_1 = require("../table");
const _ = require("lodash");
const moment = require("moment");
const cache_1 = require("../../../cache");
let localOddsDbData = {};
//获取凯利列表
function getKellyList(AvgOdds, Odds) {
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) {
return 100.0 / _.sumBy(Odds, (o) => { return 1 / o; });
}
function round(value) {
return (Math.round(value * 100) / 100).toFixed(2);
}
//获取数据库数据,足球
async function getZqOddsDbData(match) {
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 table_1.db.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 table_1.db.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 table_1.db.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 }) {
oddsList = checkOddsList(oddsList);
oddsLetGoalList = checkOddsList(oddsLetGoalList);
oddsBigSmallList = checkOddsList(oddsBigSmallList);
return { oddsList: oddsList, oddsLetGoalList: oddsLetGoalList, oddsBigSmallList: oddsBigSmallList };
}
function checkOddsList(list) {
if (list && list.length > 0) {
return list[0];
}
return [];
}
//获取数据库数据,篮球
async function getLqOddsDbData(match) {
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 table_1.db.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 table_1.db.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 table_1.db.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) {
let match_odds_key = `${config.CachePrefix}match:match_getOddsDbData:v3_${match.Id}`;
let replyMatch = await cache_1.redis.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 cache_1.redis.set(match_odds_key, JSON.stringify(result));
cache_1.redis.expire(match_odds_key, 60 * 60 * 24);
//标识此场比赛已经缓存
cache_1.redis.set(`${config.CachePrefix}match:match_odds:${match.Id}`, match.Id);
cache_1.redis.expire(`${config.CachePrefix}match:match_odds:${match.Id}`, 60 * 60 * 24);
return result;
}
function getCheckField(tableName) {
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 }) {
let Nba = match.LotteryId == 73 ? 'NBA' : '';
let { checkHomeField, checkGuestField, valueHomeField, valueGuestField } = getCheckField(tableName);
if (oddsItem[`First${valueHomeField}`] == null) {
return {
SameFirstOddsStat: '',
SameFirstOddsList: '',
};
}
let sameOddsList = await table_1.db.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 }) {
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 table_1.db.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 }) {
let Nba = match.LotteryId == 73 ? 'NBA' : '';
let { checkHomeField, checkGuestField, valueHomeField, valueGuestField } = getCheckField(tableName);
if (oddsItem[`First${valueHomeField}`] == null) {
return {
SameMatchTypeSameFirstOddsStat: '',
SameMatchTypeSameFirstOddsList: '',
};
}
let sameOddsList = await table_1.db.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) {
let AllCount = 0;
let WinCount = 0;
let FlatCount = 0;
let LostCount = 0;
let WinRate = 0;
let FlatRate = 0;
let LostRate = 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 }) {
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 table_1.db.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 }) {
//计算平均指数
let length = match.LotteryId == 73 ? 2 : 3;
let AvgFirstOdds = _.take([0, 0, 0], length);
let AvgSecondOdds = _.take([0, 0, 0], length);
let AvgLastOdds = _.take([0, 0, 0], length);
let AvgFirstKelly = _.take([0, 0, 0], length);
let AvgLastKelly = _.take([0, 0, 0], length);
let oddsListLength = oddsList.length;
if (match.LotteryId == 73) {
_.map(oddsList, (oddsItem) => {
let FirstOdds = [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 = [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 cache_1.redis.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 cache_1.redis.set(match_odds_key, JSON.stringify(result));
cache_1.redis.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 }) {
let firstScale = 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) {
return _.map(list, (item) => {
return item.replace(new RegExp(/(<\/span>)/g), '');
});
}
//计算亚盘 让球 大小球
async function staticAsia({ match, oddsList, tableName }) {
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 cache_1.redis.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,
};
cache_1.redis.set(match_odds_key, JSON.stringify(result));
if (match.MatchState == '未')
cache_1.redis.expire(match_odds_key, 60 * 60 * 24);
else
cache_1.redis.expire(match_odds_key, 60 * 60 * 24);
return result;
});
return result;
}
//计算同陪,改成实时计算,数据取缓存数据,当前赔率取实时
//将历史数据都存储在redis中
async function getHistorySameOdds(match) {
//检查是否已经有数据
let keyMatch = `${config.CachePrefix}match:matchgetHistorySameOdds_v1_${match.Id}`;
let replyList;
replyList = await cache_1.redis.get(keyMatch);
if (replyList && replyList.length > 0 && !match.isUpdateCache) {
return JSON.parse(replyList);
}
//检查是否已经有所有的记录
let allMatchList = [];
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 cache_1.redis.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 = _.split(match.ResultSps, ',');
let lastEndBet = getLastEndBet(match);
allMatchList = _.filter(allMatchList, (item) => {
let checkItem;
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 cache_1.redis.set(keyMatch, JSON.stringify(result));
cache_1.redis.expire(keyMatch, 60 * 60 * 24);
return result;
}
function getLastEndBet(match) {
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) {
return {
CompanyId: odd.CompanyId,
CompanyName: odd.CompanyName,
FirstOdds: odd.FirstOdds,
SecondOdds: odd.SecondOdds,
LastOdds: odd.LastOdds,
};
}
async function getOdds(match) {
//获取数据库数据
//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),
};
}
exports.getOdds = getOdds;
//# sourceMappingURL=odds.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getOdds100LogByCompany = void 0;
const _ = require("lodash");
const api_hemera = require("../../../api_hemera");
const moment = require("moment");
async function getOdds100LogByCompany(root, args, context) {
//功能:获取单场的欧盘指数单公司赔率变化历史
//接口地址: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 [];
}
}
exports.getOdds100LogByCompany = getOdds100LogByCompany;
function round(value) {
return (Math.round(value * 100) / 100).toFixed(2);
}
//# sourceMappingURL=odds100.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getTeam = exports.getGuestTeam = exports.getHostTeam = void 0;
async function getHostTeam({ sportdtLogo, match }) {
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 = {};
result['SportsDtLogo'] = sportdtLogo;
result[`LogoFullPath`] = sportdtLogo;
result[`Logo`] = sportdtLogo;
return result;
}
exports.getHostTeam = getHostTeam;
async function getGuestTeam({ sportdtLogo, match }) {
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 = {};
result['SportsDtLogo'] = sportdtLogo;
result[`LogoFullPath`] = sportdtLogo;
result[`Logo`] = sportdtLogo;
return result;
}
exports.getGuestTeam = getGuestTeam;
async function getTeam({ lotteryId, id, InfoId, isUpdateCache, sportdtLogo, match, }) {
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 = {};
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
// }
}
exports.getTeam = getTeam;
;
//# sourceMappingURL=team.js.map
\ No newline at end of file \ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getUnscrambleOrder = exports.createUnscrambleOrder = void 0;
const moment = require("moment");
const _ = require("lodash");
const uuid_1 = require("uuid");
const table_1 = require("../table");
async function createUnscrambleOrder(cramble, userid) {
let money = cramble.plan_saleprice;
const user = await table_1.ms_user.findById(userid);
if (!user || !user.user_id)
throw new Error('用户不存在');
//是否购买过
const isBought = await table_1.ms_unscramble_order.count({ where: { userid } }) > 0;
if (isBought && await table_1.ms_unscramble_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 table_1.db.sequelize.transaction(async (transaction) => {
let res = await table_1.ms_unscramble_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 table_1.db.sequelize.query(updateUser, { transaction, type: table_1.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 '${(0, uuid_1.v1)()}',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 table_1.db.sequelize.query(updateUserOperation, { transaction });
return orderId;
});
}
exports.createUnscrambleOrder = createUnscrambleOrder;
async function getUnscrambleOrder(args) {
return table_1.ms_unscramble_order.findAll({
where: { userid: args.userid },
offset: args.offset,
limit: args.limit,
order: [['buytime', 'desc']]
});
}
exports.getUnscrambleOrder = getUnscrambleOrder;
// /**
// * 检查用户余额是否足够
// * @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;
// }
//# sourceMappingURL=unscramble_order.js.map
\ No newline at end of file \ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!