Light12306/Web12306/js/otn/queryticket.js

150 lines
4.8 KiB
JavaScript
Raw Normal View History

2014-06-20 20:55:14 +08:00
define(function (require, exports, module) {
var ajax = require("../platform/webRequest.js");
var getTicketInfo = function (v) {
var data = {}, info = v.indexOf("#") === -1 ? v : /getSelected\(['"](.*?)['"]\)/i.exec(v)[1].split('#')[11],
match = info.match(/([A-Z\d])0*?([\*\d]{5})0*?(\d{4})/gi);
for (var j in match) {
var m = /([A-Z\d])0*?([\*\d]{5})0*?(\d{4})/i.exec(match[j]);
var sc = m[1];
var sp = m[2][0] == '*' ? null : parseInt(m[2], 10);
var st = parseInt(m[3], 10);
if (st < 3000) {
data[sc] = st;
data["_" + sc] = sp;
//一等软座 7 二等软座 8
if (sc == "7") {
data['M'] = st;
data["_M"] = sp;
}
else if (sc == "8") {
data['O'] = st;
data['_O'] = sp;
}
} else {
data['0'] = st - 3000;
data['_0'] = sp;
}
};
return data;
};
var transferData = function (data) {
var result = data;
if (!Array.isArray(result.data) || !result.data.length || !result.data[0].queryLeftNewDTO) return null;
var trainData = { raw: result, rawTrainMap: {}, trainMap: {}, auto: null, nextTime: null };
_.each(result.data, function (t) {
var train = {
id: t.queryLeftNewDTO.train_no,
code: t.queryLeftNewDTO.station_train_code,
available: t.queryLeftNewDTO.canWebBuy === 'Y' ? 1 : 0,
start: {
code: t.queryLeftNewDTO.start_station_telecode,
name: t.queryLeftNewDTO.start_station_name,
},
from: {
code: t.queryLeftNewDTO.from_station_telecode,
fromStationNo: t.queryLeftNewDTO.from_station_no,
name: t.queryLeftNewDTO.from_station_name,
endpoint: t.queryLeftNewDTO.from_station_telecode == t.queryLeftNewDTO.start_station_telecode,
time: t.queryLeftNewDTO.start_time
},
to: {
code: t.queryLeftNewDTO.to_station_telecode,
toStationNo: t.queryLeftNewDTO.to_station_no,
name: t.queryLeftNewDTO.to_station_name,
endpoint: t.queryLeftNewDTO.end_station_telecode == t.queryLeftNewDTO.to_station_telecode,
time: t.queryLeftNewDTO.arrive_time
},
elapsedTime: {
days: t.queryLeftNewDTO.day_difference,
total: t.queryLeftNewDTO.lishi
},
end: {
code: t.queryLeftNewDTO.end_station_telecode,
name: t.queryLeftNewDTO.end_station_name,
},
ypinfo: t.queryLeftNewDTO.yp_info,
ypinfo_ex: t.queryLeftNewDTO.yp_ex,
locationCode: t.queryLeftNewDTO.location_code,
controlDay: t.queryLeftNewDTO.control_day,
supportCard: t.queryLeftNewDTO.is_support_card,
saleTime: t.queryLeftNewDTO.sale_time,
secureStr: t.secretStr,
selltime: null
};
var kp = _.pairs(getTicketInfo(t.queryLeftNewDTO.yp_info));
train.price = _.object(_.filter(kp, function (p) { return p[0][0] === '_'; }));
train.tickets = _.object(_.filter(kp, function (p) { return p[0][0] !== '_'; }));
//起售时间
var selltimem = /(0*(\d+)月0*(\d+)日)?(\d+)\s*点\s*((\d+)分)?\s*起售/i.exec(t.buttonTextInfo.replace(/<.*?>/g, ''));
if (selltimem) {
train.available = -1;
train.selltime = new Date();
train.selltime.setHours(parseInt(selltimem[4]));
train.selltime.setMinutes(parseInt(selltimem[6] || "0", 10));
train.selltime.setSeconds(0);
if (selltimem[1]) {
//带日期
train.selltime.setMonth(parseInt(selltimem[2]) - 1);
train.selltime.setDate(parseInt(selltimem[3]));
if (train.selltime.getMonth() < new Date().getMonth()) {
train.selltime.setFullYear(train.selltime.getFullYear() + 1);
}
}
}
trainData.rawTrainMap[train.id] = t;
trainData.trainMap[train.id] = train;
});
trainData.original = _.values(trainData.trainMap);
trainData.available = trainData.original;
trainData.trainCodes = _.pluck(trainData.original, "code");
trainData.filtered = [];
trainData.include = trainData.available;
//执行车次预过滤。过滤内容:出发地,目标地,时间
$(document).trigger("filterTrains", trainData);
//处理车次
$(document).trigger("processTrains", trainData);
//过滤数据
if (trainData.filtered && trainData.filtered.length) {
//从原始数据中删除
var orgMap = _.toMap(result.data, function (e) {
return e.queryLeftNewDTO.train_no;
});
var filtered = _.map(trainData.filtered, function (t) {
return orgMap[t.id];
});
trainData.rawDataFiltered = _.without.apply(null, [result.data].concat(filtered));
result.data = trainData.rawDataFiltered;
}
return trainData;
};
exports.queryTicket = function (from, to, date, student) {
var def = new $.Deferred();
ajax.sendGet("leftTicket/query", "leftTicket/init", {
"leftTicketDTO.train_date": date,
"leftTicketDTO.from_station": from,
"leftTicketDTO.to_station": to,
"purpose_codes": student ? "0X00" : "ADULT"
}, "json", function () {
var data = transferData(this.model);
def.resolveWith(data);
}, function () {
def.reject();
});
return def;
};
});