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点前发Z、T 车次,难度加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
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|