define(function (require, exports, module) { var data = require("../data.js"); 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: [ /上海([西南]|虹桥)?/, /深圳[东西北]?/, /东莞东?/, /杭州东?/, /北京[东西南北]?/, /哈尔滨[东西北]?/, /长春[西南]/, /广州[东北南]?/, /西安[南北]?/, /宁波南?/, /温州南?/, /福州南?/, /(武[昌汉]|汉口)/, /(达州|兰州|乌鲁木齐南|南充)/, /苏州(北|新区|园区)?/ ] } ]; /** * 判断指定的日期是否是回乡日期 * @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); }); });