Light12306/Web12306/js/otn/queryticket.js

184 lines
5.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

define(function (require, exports, module) {
var ajax = require("../platform/webRequest.js");
var param = require("../data.js");
var parser = require("../platform/parser.js");
var ev = require("../platform/EventObject.js");
exports.events = new ev();
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);
var seat = { code: sc, name: param.toSeatTypeName(sc), price: sp };
if (st < 3000) {
seat.count = st;
//TODO 二等软座提交是否和二等座一样都用的MO
//一等软座 7 二等软座 8
if (sc === "7") {
data.push({ code: 'M', name: param.toSeatTypeName('M'), price: sp, count: st });
}
else if (sc === "8") {
data.push({ code: 'O', name: param.toSeatTypeName('O'), price: sp, count: st });
} else {
data.push(seat);
}
} else {
seat.count = st - 3000;
seat.code = '0';
seat.name = "无座";
data.push(seat);
}
};
return data;
};
var transferData = function (data, noProcess) {
var result = data;
if (!Array.isArray(result.data) || !result.data.length || !result.data[0].queryLeftNewDTO) {
exports.events.fireEvent("requestFailed");
};
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,
date: t.queryLeftNewDTO.start_train_date.replace(/(\d{4})(\d{2})(\d{2})/, "$1-$2-$3")
};
var kp = getTicketInfo(t.queryLeftNewDTO.yp_info);
train.tickets = kp;
train.ticketMap = _.mapObject(kp, function (e) { return e.code; });
//起售时间
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;
}
}
return trainData;
};
exports.queryTicket = function (from, to, date, student, noProcess) {
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, noProcess);
def.resolveWith(data);
}, function () {
def.reject();
});
return def.promise();
};
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();
};
});