Light12306/Web12306/js/platform/DifficultyCalculator.js

179 lines
4.3 KiB
JavaScript
Raw Normal View History

2015-11-18 19:48:23 +08:00
define(function (require, exports, module) {
2015-11-17 19:55:51 +08:00
var data = require("../data.js");
2015-11-18 19:48:23 +08:00
var queryTicket = require("../otn/queryticket.js");
var hotLineMatrix = [
{
type: 0, //单向,节前顺向,节后逆向
from: [
/广州[东北南]?/
],
to: [
/重庆[南北]?/,
/(武[昌汉]|汉口)/,
/(达州|兰州|常德|乌鲁木齐南|潮汕|饶平)/,
/成都[东南]?/,
/岳阳东?/,
/长沙南?/,
/衡阳东?/,
/襄阳东?/,
/西安[南北]?/
]
},
{
type: 0, //单向,节前顺向,节后逆向
from: [
/北京[东西南北]?/
],
to: [
/(武[昌汉]|汉口)/,
/长沙南?/,
/宝鸡南?/,
/重庆[南北]?/,
/成都[东南]?/,
/(兰州|乌鲁木齐南)/,
/西安[南北]?/,
/哈尔滨[东西北]?/,
/长春[西南]/
]
},
{
type: 1, //双向
from: [
/(武[昌汉]|汉口)/
],
to: [
/重庆[南北]?/,
/成都[东南]?/,
/哈尔滨[东西北]?/,
/长春[西南]/
]
},
{
type: 0,
from: [
/上海([西南]|虹桥)?/
],
to: [
/重庆[南北]?/,
/成都[东南]?/,
/哈尔滨[东西北]?/,
/长春[西南]/,
/广州[东北南]?/,
/西安[南北]?/,
/郑州东?/,
/怀化南?/,
/(武[昌汉]|汉口)/,
/(达州|兰州|乌鲁木齐南|南充)/
]
},
{
type: 0,
to: [
/成都[东南]?/
],
from: [
/上海([西南]|虹桥)?/,
/深圳[东西北]?/,
/东莞东?/,
/杭州东?/,
/北京[东西南北]?/,
/哈尔滨[东西北]?/,
/长春[西南]/,
/广州[东北南]?/,
/西安[南北]?/,
/宁波南?/,
/温州南?/,
/福州南?/,
/(武[昌汉]|汉口)/,
/(达州|兰州|乌鲁木齐南|南充)/,
/苏州(北|新区|园区)?/
]
}
];
2015-11-17 19:55:51 +08:00
2015-11-18 19:48:23 +08:00
/**
* 判断指定的日期是否是回乡日期
* @param {string} 具体日期
* @returns {boolean} 如果是回乡日期则返回 true否则返回 false
*/
var isBackHome = function (date) {
if (!/(\d{4})-(0?\d+)-(0?\d+)/.exec(date || ""))
return false;
var year = parseInt(RegExp.$1, 10);
var month = parseInt(RegExp.$2, 10);
var day = parseInt(RegExp.$3, 10);
return month < 2 || (month === 2 && day <= 8);
};
/**
* 计算单个车次的购票难度
* @param {} 车次
*/
var calculateTrainDifficulty = function (train) {
var ratio = 40;
//是否是热门车次以及回乡
var isBack = isBackHome(train.date);
var isHotLine = _.any(hotLineMatrix, function (l) {
train.start.isHot = _.any(l.type === 0 && !isBack ? l.to : l.from, function (r) { return r.test(train.start.name) }) ? 1 : 0;
train.end.isHot = _.any(l.type === 0 && !isBack ? l.from : l.to, function (r) { return r.test(train.end.name) }) ? 1 : 0;
train.hotRatio = (train.start.isHot ? 1 : 0) + (train.end.isHot ? 1 : 0);
return train.hotRatio > 0;
});
/**
* 基础购票难度系数均为40
* 列车始发站终到站如果命中任意一条规则则难度+20
* 如果车次非始发站或非终到站则每次难度均加10非热门线路或30热门线路
* 15点后24点前发ZT 车次难度加10非热门线路或30热门线路
* DG车非热门线路难度减10
* 非热门线路始发终到满足任意一个条件则难度减5
*
* 最终难度区间10-200越高越难
*/
if (isHotLine)
ratio += 20 * train.hotRatio;
//非始发站
if (!train.from.endpoint)
ratio += (train.start.isHot ? 30 : 10);
//非终到站
if (!train.to.endpoint)
ratio += (train.end.isHot ? 30 : 10);
//15点以后的ZT
if (parseInt(/^0?(\d+)/.exec(train.from.time)[1], 10) >= 15) {
ratio += isHotLine ? 60 : 40;
}
if (!isHotLine) {
if ((/^[GD]/i.test(train.code)))
ratio -= 10;
if (train.from.endpoint)
ratio -= 10;
if (train.to.endpoint)
ratio -= 10;
}
train.difficulty = ratio;
train.difficultyPoint = ratio / 10;
console.log(`${train.code} -> difficultyPoint= ${train.difficultyPoint}`);
};
/**
* 计算车次购票难度最终难度区间10-200指数越高越难
* @param {Array} 要计算的车次
*/
var calculateTrainsDifficulty = function (trains) {
_.each(trains, calculateTrainDifficulty);
};
queryTicket.events.on("processTrains", function (e, data) {
calculateTrainsDifficulty(data.available);
});
2015-11-17 19:55:51 +08:00
});