Light12306/Web12306/js/otn/queryticket.js

303 lines
9.2 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");
2014-06-26 22:24:54 +08:00
var param = require("../data.js");
2014-07-01 20:07:44 +08:00
var parser = require("../platform/parser.js");
var ev = require("../platform/EventObject.js");
2014-09-13 15:58:20 +08:00
var extensionVersion = parseInt(document.body.dataset["targetExtensionVersion"].replace(/\./g, ""));
exports.events = new ev();
2014-06-20 20:55:14 +08:00
2014-08-27 23:05:50 +08:00
//记录参数
var queryTicketUrl = null;
var lastLogTime = null;
var isLogOpen = false;
2014-06-20 20:55:14 +08:00
var getTicketInfo = function (v) {
2014-06-26 22:24:54 +08:00
var data = [], info = v.indexOf("#") === -1 ? v : /getSelected\(['"](.*?)['"]\)/i.exec(v)[1].split('#')[11],
2014-06-20 20:55:14 +08:00
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);
2014-09-03 23:20:12 +08:00
var seat = { code: sc, name: param.toSeatTypeName(sc), price: sp, selected: false };
2014-06-20 20:55:14 +08:00
if (st < 3000) {
2014-06-26 22:24:54 +08:00
seat.count = st;
2014-06-20 20:55:14 +08:00
2014-06-26 22:24:54 +08:00
//TODO 二等软座提交是否和二等座一样都用的MO
2014-06-20 20:55:14 +08:00
//一等软座 7 二等软座 8
2014-06-26 22:24:54 +08:00
if (sc === "7") {
2014-09-03 23:20:12 +08:00
data.push({ code: 'M', name: param.toSeatTypeName('M'), price: sp, count: st, selected: false });
2014-06-20 20:55:14 +08:00
}
2014-06-26 22:24:54 +08:00
else if (sc === "8") {
2014-09-03 23:20:12 +08:00
data.push({ code: 'O', name: param.toSeatTypeName('O'), price: sp, count: st, selected: false });
2014-06-26 22:24:54 +08:00
} else {
data.push(seat);
2014-06-20 20:55:14 +08:00
}
} else {
2014-06-26 22:24:54 +08:00
seat.count = st - 3000;
seat.code = '0';
seat.name = "无座";
data.push(seat);
2014-06-20 20:55:14 +08:00
}
};
return data;
};
var transferData = function (query, data, noProcess, noAction) {
2014-06-20 20:55:14 +08:00
var result = data;
if (!Array.isArray(result.data) || !result.data.length || !result.data[0].queryLeftNewDTO) {
exports.events.fireEvent("requestFailed");
2014-12-02 22:53:57 +08:00
};
2014-06-20 20:55:14 +08:00
var date = query.date;
var trainData = { query: query, raw: result, rawTrainMap: {}, trainMap: {}, auto: null, nextTime: null, noProcess: noProcess, noAction: noAction };
2014-12-02 22:53:57 +08:00
var messages = (result.messages || []).join("");
2014-06-20 20:55:14 +08:00
2014-12-02 22:53:57 +08:00
trainData.notInSellTime = messages.indexOf("在预售日期范围") !== -1;
2014-06-20 20:55:14 +08:00
_.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,
2014-06-27 22:25:42 +08:00
selltime: null,
date: date,
2014-08-18 23:12:35 +08:00
limitSellInfo: t.buttonTextInfo && t.buttonTextInfo.indexOf("暂售") != -1 ? t.buttonTextInfo.replace(/<[^>]+>/i, "") : null
2014-06-20 20:55:14 +08:00
};
2014-06-26 22:24:54 +08:00
var kp = getTicketInfo(t.queryLeftNewDTO.yp_info);
train.tickets = kp;
train.ticketMap = _.mapObject(kp, function (e) { return e.code; });
2014-06-20 20:55:14 +08:00
//起售时间
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;
if (!noProcess) {
//执行车次预过滤。过滤内容:出发地,目标地,时间
exports.events.fireEvent("filterTrains", trainData);
//处理车次
exports.events.fireEvent("processTrains", trainData);
//过滤数据
if (trainData.filtered && trainData.filtered.length) {
//从原始数据中删除
var orgMap = _.mapObject(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;
}
2014-06-20 20:55:14 +08:00
}
return trainData;
};
exports.queryTicket = function (from, fromName, to, toName, date, student, resign, noProcess, noAction, byAuto) {
2014-06-20 20:55:14 +08:00
var def = new $.Deferred();
2014-09-11 22:19:33 +08:00
var queryCount = 0;
def.fail(function () {
exports.events.fireEvent("requestFailed");
});
2014-06-20 20:55:14 +08:00
//before query event.
if (!noAction && !noProcess) {
var evdata = {
from: from,
fromName: fromName,
to: to,
toName: toName,
auto: byAuto || false
};
exports.events.fireEvent("beforeQueryTicket", evdata);
from = evdata.from;
to = evdata.to;
fromName = evdata.fromName;
toName = evdata.toName;
}
2014-08-27 23:05:50 +08:00
var sendQueryRequest = function () {
var p = {
"leftTicketDTO.train_date": date,
"leftTicketDTO.from_station": from,
"leftTicketDTO.to_station": to,
"purpose_codes": student ? "0X00" : "ADULT"
};
2014-09-15 15:02:34 +08:00
var cookie = (function (obj) {
var arr = [];
2014-09-13 15:58:20 +08:00
_.forEach(obj, function (v, k) { arr.push(k + '=' + v); });
return arr.join("; ");
})(extensionVersion >= 720 ? {
"_jc_save_fromStation": escape(fromName + "," + from),
"_jc_save_toStation": escape(toName + "," + to),
"_jc_save_fromDate": date,
"_jc_save_toDate": date,
"_jc_save_wfdc_flag": resign ? "gc" : "dc"
} : {});
if (isLogOpen) {
exports.log(p, cookie);
}
2014-08-27 23:05:50 +08:00
ajax.sendGet(queryTicketUrl, "leftTicket/init", p, "json", function () {
2014-08-30 01:32:27 +08:00
//url changed?
if (!this.model.status && this.model.c_url) {
queryTicketUrl = this.model.c_url;
2014-09-02 21:41:17 +08:00
sendQueryRequest();
2014-09-10 21:49:46 +08:00
} else if (!this.model.status) {
2014-09-11 22:19:33 +08:00
var error = (this.model.messages || ["查询失败"]).join("");
2014-09-10 21:49:46 +08:00
def.reject(error);
2014-08-30 01:32:27 +08:00
} else {
var data = transferData({
from: from,
fromName: fromName,
to: to,
toName: toName,
auto: byAuto || false,
date: date,
resign: resign,
student: student || false
}, this.model, noProcess, noAction);
2014-08-30 01:32:27 +08:00
def.resolveWith(data);
}
2014-08-27 23:05:50 +08:00
}, function () {
2014-09-11 22:19:33 +08:00
if (queryCount++ < 5) {
def.notify("无法访问12306正在第 " + queryCount + " 次重试...");
setTimeout(sendQueryRequest, 2000);
} else {
def.reject("重试次数过多,请重新点击查询按钮");
}
2014-09-13 15:58:20 +08:00
}, false, {
2014-09-15 15:02:34 +08:00
"Cookie": cookie,
"If-Modified-Since": "0"
2014-08-27 23:05:50 +08:00
});
};
var fetchTicketUrl = function () {
ajax.sendGet("leftTicket/init", "/otn/", null, "text")
.done(function () {
var html = this.model;
2014-09-10 21:49:46 +08:00
2014-08-27 23:05:50 +08:00
var r = /(CLeftTicketUrl|isSaveQueryLog)\s*=\s*['"]([^'"]+)['"]/gi;
var m;
while (m = r.exec(html)) {
if (m[1] === "CLeftTicketUrl")
queryTicketUrl = m[2];
else if (m[1] === "isSaveQueryLog")
isLogOpen = m[2] === "Y";
}
if (!queryTicketUrl) {
document.dispatchEvent(new CustomEvent("platformError"));
2014-09-10 21:49:46 +08:00
def.reject("未能初始化查询地址");
2014-08-27 23:05:50 +08:00
}
else sendQueryRequest();
}).fail(function () {
2014-09-10 21:49:46 +08:00
def.reject("网络错误");
2014-08-27 23:05:50 +08:00
});
};
if (queryTicketUrl) {
sendQueryRequest();
}
else {
fetchTicketUrl();
}
2014-06-20 20:55:14 +08:00
return def.promise();
2014-06-20 20:55:14 +08:00
};
2014-07-01 20:07:44 +08:00
2014-09-13 15:58:20 +08:00
exports.log = function (data, cookies) {
2014-08-27 23:05:50 +08:00
if (!isLogOpen || (lastLogTime && (new Date() - lastLogTime) < 5000))
return;
lastLogTime = new Date();
2014-09-15 15:02:34 +08:00
ajax.sendGet("leftTicket/log", "leftTicket/init", data, "json", function () {
}, function () {
2014-09-13 15:58:20 +08:00
}, false, {
"Cookie": cookies
});
2014-08-27 23:05:50 +08:00
};
2014-07-01 20:07:44 +08:00
exports.queryTrainStop = function (id, from, to, date) {
var data = {
train_no: id,
from_station_telecode: from,
to_station_telecode: to,
depart_date: date
};
var def = new $.Deferred();
ajax.sendGet("czxx/queryByTrainNo", "leftTicket/init", data, "json", function (json) {
if (!json || !json.data || !json.data.data) {
def.reject((parser.getError(json) || { message: "查询失败" }).message);
} else {
def.resolve(json.data.data);
}
}, function () {
def.reject("网络错误");
});
return def.promise();
2014-07-01 20:07:44 +08:00
};
2014-06-20 20:55:14 +08:00
});