Light12306/Mobile12306New/js/run_query.js

570 lines
18 KiB
JavaScript
Raw Normal View History

2014-08-21 17:20:34 +08:00
var RunQuery = {
init: function() {
2014-08-22 18:00:59 +08:00
if ($('#runquery_page').length == 0) {
2014-08-21 17:20:34 +08:00
return false;
}
2014-09-01 13:50:43 +08:00
2014-08-21 17:20:34 +08:00
var maxDay = (new Date()).addDays(19);
Public.formatString = 'M月d日';
Public.setDate(maxDay);
Public.calendar.checkCallback = RunQuery.dateChangeCallback;
2014-09-01 13:50:43 +08:00
Public.checkLogin(RunQuery.run, RunQuery.run, RunQuery.run);
2014-08-22 18:00:59 +08:00
2014-08-21 17:20:34 +08:00
$('#filter_ok').on('click', function() {
Public.hideInnerPage('filter');
$('#query_form [name=filters]').val($('#filter_form').serialize());
2014-09-01 13:50:43 +08:00
RunQuery.setFilterCond();
2014-08-21 17:20:34 +08:00
RunQuery.hisUpdata();
});
$('#check_left,#check_right').on('click', function() {
RunQuery.hisUpdata();
});
$('#filter_cancel').on('click', function() {
Public.hideInnerPage('filter');
var bak = $('#query_form [name=filters]').val(),
querys = bak.split('&');
Query.setFilter(querys);
});
2014-08-22 18:00:59 +08:00
$('#filter_btn').on('click', function() {
2014-08-21 17:20:34 +08:00
Public.showInnerPage('filter');
});
2014-08-22 18:00:59 +08:00
$('#filter_cancel').on('click', function() {
2014-08-21 17:20:34 +08:00
Public.hideInnerPage();
});
2014-08-22 18:00:59 +08:00
2014-09-01 13:50:43 +08:00
$('[data-fn="buy"]').live('click', function() {
2014-08-22 18:00:59 +08:00
var train = $(this).attr('data-traincode'),
seat = $(this).attr('data-seatcode');
2014-09-01 13:50:43 +08:00
if (seat == '0' && $('[data-traincode="' + train + '"][data-seatcode="' + seat + '"]').length > 0) {
seat = '1';
}
sessionStorage.setItem(Public.user + 'curBuy', JSON.stringify(RunQuery.trainData.trainMap[train]));
sessionStorage.setItem(Public.user + 'curBuySeat', seat);
2014-08-22 18:00:59 +08:00
2014-09-01 13:50:43 +08:00
if (Public.isLogin) {
location.href = 'perfect.html';
} else {
Public.alert('还未登录,请登陆后购票', function() {
location.href = 'login.html?t=submitorder';
});
}
2014-08-22 18:00:59 +08:00
});
2014-09-01 13:50:43 +08:00
$('#autoTipBtn').live('click', function() {
if (Public.isLogin) {
RunQuery.startRef();
} else {
window.location.href = 'login.html';
}
});
$('#refresh_end').live('click', function() {
RunQuery.refStop();
});
},
run: function() {
Query.getPassenger();
RunQuery.getQueryData();
if (!RunQuery.curData) {
window.location.href = 'query.html';
return false;
}
RunQuery.setFilter();
RunQuery.queryTicket();
Query.filterBind();
2014-08-21 17:20:34 +08:00
},
2014-08-22 18:00:59 +08:00
curData: null,
getQueryData: function() {
if (!!Public.his.queryObjs[Public.his.querys[0][0]]) {
2014-08-21 17:20:34 +08:00
RunQuery.curData = Public.his.queryObjs[Public.his.querys[0][0]];
}
},
2014-08-22 18:00:59 +08:00
setFilter: function() {
2014-08-21 17:20:34 +08:00
Query.setFilter(RunQuery.curData['filters'].split('&'));
2014-08-22 18:00:59 +08:00
$('.station_title strong').html(RunQuery.curData['startname'] + '→' + RunQuery.curData['endname']);
2014-08-21 17:20:34 +08:00
$('#query_form [name=startname]').val(RunQuery.curData['startname']);
$('#query_form [name=startcode]').val(RunQuery.curData['startcode']);
$('#query_form [name=endname]').val(RunQuery.curData['endname']);
$('#query_form [name=endcode]').val(RunQuery.curData['endcode']);
$('#query_form [name=type]').val(RunQuery.curData['type']);
$('#query_form [name=filters]').val(RunQuery.curData['filters']);
2014-08-22 18:00:59 +08:00
var date = new Date(RunQuery.curData['start_date'].replace(/\-/g, '/'));
2014-08-21 17:20:34 +08:00
$('#start_date').html(date.format('M月d日') + ' ' + date.day(3));
2014-08-22 18:00:59 +08:00
$('#start_date_val').val(date.format('yyyy-MM-dd'));
2014-08-21 17:20:34 +08:00
Public.calendar.setCurDate(date);
2014-09-01 13:50:43 +08:00
RunQuery.setFilterCond();
2014-08-21 17:20:34 +08:00
},
2014-08-22 18:00:59 +08:00
queryTicket: function() {
2014-09-01 13:50:43 +08:00
2014-08-22 18:00:59 +08:00
var loading = Public.showLoading('正在查票'),
data = {
2014-08-21 17:20:34 +08:00
"leftTicketDTO.train_date": RunQuery.curData.start_date,
"leftTicketDTO.from_station": RunQuery.curData.startcode,
"leftTicketDTO.to_station": RunQuery.curData.endcode,
"purpose_codes": RunQuery.curData.type == "2" ? "0X00" : "ADULT"
2014-08-22 18:00:59 +08:00
};
// (url, returnType, postdata, refer, headers)
2014-09-01 13:50:43 +08:00
// bootStrap.get("leftTicket/queryT", "json", data, "leftTicket/init").done(function(json) {
// Public.hideLoading(loading);
// if (json["status"] == true && json["httpstatus"] == 200) {
// if (json['data'].length > 0) {
// RunQuery.formatJson(json);
// RunQuery.formatList();
// }
// } else if (!json["status"] && !!json["messages"]) {
// Public.alert(json["messages"][0] || '未知错误');
// } else {
// Public.alert('未知错误');
// }
// }).fail(function(xhr, type) {
// console.log(xhr, type);
// Public.hideLoading(loading);
// });
cn12306.queryTicket(data,function(json) {
Public.hideLoading(loading);
2014-08-22 18:00:59 +08:00
if (json["status"] == true && json["httpstatus"] == 200) {
if (json['data'].length > 0) {
RunQuery.formatJson(json);
RunQuery.formatList();
2014-08-21 17:20:34 +08:00
}
2014-09-01 13:50:43 +08:00
} else if (!json["status"] && !!json["messages"]) {
Public.alert(json["messages"][0] || '未知错误');
} else {
Public.alert('未知错误');
2014-08-21 17:20:34 +08:00
}
2014-09-01 13:50:43 +08:00
},function(xhr, type) {
2014-08-22 18:00:59 +08:00
console.log(xhr, type);
Public.hideLoading(loading);
2014-08-21 17:20:34 +08:00
});
},
2014-08-22 18:00:59 +08:00
formatList: function() {
2014-09-01 13:50:43 +08:00
// var lists = RunQuery.trainData.trainMap,
var lists = RunQuery.trainData.train,
2014-08-21 17:20:34 +08:00
html = '',
2014-08-22 18:00:59 +08:00
obj = {};
2014-09-01 13:50:43 +08:00
if (RunQuery.trainData['isMaintain']) {
lists = RunQuery.trainData.trainMap;
}
2014-08-21 17:20:34 +08:00
for (var k in lists) {
obj = lists[k];
html += '<li>';
/*第1行*/
html += '<div class="line no_border">';
2014-08-22 18:00:59 +08:00
html += '<strong class="pull_right text_underline text_lg" data-id="' + obj["id"] + '">' + obj["code"] + '</strong>';
html += '<strong class="text_warning text_lg link_label">' + obj["from"]["time"] + '</strong>';
html += '<span class="text_lg">';
if (obj["from"]["code"] == obj["start"]["code"]) {
html += '<i class="text_label">始</i>';
}
html += obj["from"]["name"] + '</span>';
html += '</div>';
2014-08-21 17:20:34 +08:00
2014-08-22 18:00:59 +08:00
/*第2行*/
html += '<div class="line">';
2014-08-21 17:20:34 +08:00
2014-08-22 18:00:59 +08:00
ls = obj["elapsedTime"]['total'].split(':');
html += '<span class="pull_right text_gray">' + (!!ls[0] ? ls[0] + '小时' : '') + (!!ls[1] ? ls[1] + '分' : '0分') + '</span>';
html += '<span class="text_lg link_label">';
html += obj["to"]["time"] + '</span>';
html += '<span class="text_lg">'
if (obj["to"]["code"] == obj["end"]["code"]) {
html += '<i class="text_label">终</i>';
}
html += obj["to"]["name"] + '</span>';
html += '</div>';
2014-08-21 17:20:34 +08:00
/*输出席别*/
for (var i = 0; i < obj['ticketMapSort'].length; i++) {
2014-09-01 13:50:43 +08:00
if (obj['ticketMapSort'][i]["count"] == 0 && !RunQuery.trainData['isMaintain']) {
2014-08-21 17:20:34 +08:00
continue;
}
2014-08-22 18:00:59 +08:00
html += '<div class="line"><span class="pull_right">';
if (obj['ticketMapSort'][i]["count"] == '有') {
html += '<span class="text_warning">有</span>';
} else {
html += '<span class="text_warning">' + obj['ticketMapSort'][i]["count"] + '</span>';
html += '<span class="text_gray">张</span>';
}
2014-09-01 13:50:43 +08:00
if (!RunQuery.trainData['isMaintain']) {
2014-08-22 18:00:59 +08:00
html += '<a href="javascript:;" class="btn btn_success" data-fn="buy" data-traincode="' + obj["id"] + '" data-seatcode="' + obj['ticketMapSort'][i]["code"] + '">抢票</a>';
2014-09-01 13:50:43 +08:00
} else {
2014-08-22 18:00:59 +08:00
html += '<span href="javascript:;" class="btn btn_gray">维护</span>';
}
html += '</span>';
html += '<span class="link_label">' + obj['ticketMapSort'][i]['name'] + '</span>';
html += '<span class="text_gray">' + (obj['ticketMapSort'][i]['price'] / 10) + '元</span>';
html += '</div>';
2014-08-21 17:20:34 +08:00
};
2014-08-22 18:00:59 +08:00
html += '</li>';
2014-08-21 17:20:34 +08:00
};
2014-09-01 13:50:43 +08:00
2014-08-21 17:20:34 +08:00
$('#train_list').html(html);
2014-08-22 18:00:59 +08:00
$('.station_title span').html('共&nbsp;' + $('#train_list li').length + '&nbsp;趟列车');
2014-09-01 13:50:43 +08:00
if (!RunQuery.trainData['isMaintain'] && Object.keys(RunQuery.trainData.train).length == 0) {
RunQuery.showRefresh();
} else if (!RunQuery.trainData['isMaintain'] && RunQuery.refresh) {
Client.refreshSuccess();
RunQuery.refStop();
RunQuery.autoSubmit();
} else {
$('#autoTip').hide();
}
},
autoSubmit: function() {
$('#train_list li [data-fn="buy"]').eq(0).click();
2014-08-21 17:20:34 +08:00
},
2014-08-22 18:00:59 +08:00
getTicketInfo: function(v) {
var data = [],
info = v.indexOf("#") === -1 ? v : /getSelected\(['"](.*?)['"]\)/i.exec(v)[1].split('#')[11],
2014-08-21 17:20:34 +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-08-22 18:00:59 +08:00
var seat = {
code: sc,
name: Util.toSeatTypeName(sc),
price: sp
};
2014-08-21 17:20:34 +08:00
if (st < 3000) {
seat.count = st;
//TODO 二等软座提交是否和二等座一样都用的MO
//一等软座 7 二等软座 8
if (sc === "7") {
2014-08-22 18:00:59 +08:00
data.push({
code: 'M',
name: Util.toSeatTypeName('M'),
price: sp,
count: st
});
} else if (sc === "8") {
data.push({
code: 'O',
name: Util.toSeatTypeName('O'),
price: sp,
count: st
});
2014-08-21 17:20:34 +08:00
} else {
data.push(seat);
}
} else {
seat.count = st - 3000;
seat.code = '0';
seat.name = "无座";
data.push(seat);
}
};
return data;
},
2014-08-22 18:00:59 +08:00
trainData: null,
formatJson: function(data) {
if (!Array.isArray(data['data']) && !data['data'].length) {
2014-08-21 17:20:34 +08:00
return null;
}
2014-08-22 18:00:59 +08:00
var lists = data['data'],
train, kp, selltimem, trainData = {
raw: data,
rawTrainMap: {},
trainMap: {},
2014-09-01 13:50:43 +08:00
codeMap: {},
2014-08-22 18:00:59 +08:00
auto: null,
nextTime: null
};
2014-09-01 13:50:43 +08:00
2014-08-21 17:20:34 +08:00
for (var i = 0; i < lists.length; i++) {
t = lists[i];
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"),
2014-09-01 13:50:43 +08:00
"form_train_date": RunQuery.curData.start_date,
"limitSellInfo": t['buttonTextInfo'] && t['buttonTextInfo'].indexOf("暂售") != -1 ? t['buttonTextInfo'].replace(/<[^>]+>/i, "") : null
2014-08-21 17:20:34 +08:00
};
2014-09-01 13:50:43 +08:00
2014-08-21 17:20:34 +08:00
kp = RunQuery.getTicketInfo(t["queryLeftNewDTO"]['yp_info']);
train.tickets = kp;
2014-08-22 18:00:59 +08:00
train.ticketMap = Util.mapObject(kp, function(e) {
return e.code;
});
2014-08-21 17:20:34 +08:00
train.ticketMapSort = Util.sortType(train.ticketMap);
// for (var i = 0; i < train.ticketMapSort.length; i++) {
// if(train.ticketMapSort[i]['count'] == 0){
// train.ticketMapSort.splice(i,1);
// i--;
// }
// };
2014-08-22 18:00:59 +08:00
// //起售时间
2014-08-21 17:20:34 +08:00
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);
}
}
}
2014-09-01 13:50:43 +08:00
trainData.rawTrainMap[train['id']] = t;
trainData.codeMap[train['code']] = t;
trainData.trainMap[train['id']] = train;
2014-08-21 17:20:34 +08:00
};
2014-09-01 13:50:43 +08:00
if (lists.length > 0) {
trainData["isMaintain"] = lists[0]['buttonTextInfo'].indexOf("系统维护时间") != -1
}
2014-08-21 17:20:34 +08:00
RunQuery.trainData = trainData;
2014-09-01 13:50:43 +08:00
if (typeof RunQuery.filterCond.train != 'undefined') {
for (var i = 0; i < RunQuery.filterCond.train.length; i++) {
if (typeof trainData.codeMap[RunQuery.filterCond.train[i]] == 'undefined') {
RunQuery.filterCond.train.splice(i, 1);
i--;
}
}
}
RunQuery.filterJson();
},
filterCond: {},
setFilterCond: function() {
RunQuery.filterCond = {};
var arr = $('#filter_form').serializeArray();
for (var i = 0; i < arr.length; i++) {
if (!RunQuery.filterCond[arr[i]['name']]) {
RunQuery.filterCond[arr[i]['name']] = [];
}
RunQuery.filterCond[arr[i]['name']].push(arr[i]['value']);
};
if (!!RunQuery.filterCond['train_type']) {
RunQuery.filterCond['train_type'] = RunQuery.filterCond['train_type'].join('|').split('|');
}
},
hasTrains: function(list) {
var obj = {},
b = false;
for (var k in list) {
b = false;
for (var i = 0; i < list[k]['ticketMapSort'].length; i++) {
if (list[k]['ticketMapSort'][i]['count'] > 0) {
b = true;
break;
}
}
if (b) {
obj[k] = list[k];
}
};
return obj;
},
trainsFilter: function(list) {
var obj = {};
if (typeof RunQuery.filterCond.train == 'undefined' || RunQuery.filterCond.train.length == 0) {
return list;
}
for (var k in list) {
if (RunQuery.filterCond.train.indexOf(list[k]['code']) != -1) {
obj[k] = list[k];
}
};
return obj;
},
trainsType: function(list) {
if (typeof RunQuery.filterCond['train_type'] == 'undefined' || RunQuery.filterCond['train_type'][0] == 'all') {
return list;
}
var obj = {};
for (var k in list) {
if (RunQuery.filterCond['train_type'].indexOf(list[k]['code'][0]) != -1 || (!isNaN(list[k]['code'][0]) && RunQuery.filterCond['train_type'].indexOf('QT') != -1)) {
obj[k] = list[k];
}
};
return obj;
},
trainsSeat: function(list) {
if (typeof RunQuery.filterCond['train_seat'] == 'undefined' || RunQuery.filterCond['train_seat'][0] == 'all') {
return list;
}
var obj = {},
b = false;
for (var k in list) {
b = false;
for (var i = 0; i < RunQuery.filterCond['train_seat'].length; i++) {
if (typeof list[k].ticketMap[RunQuery.filterCond['train_seat'][i]] != 'undefined' && list[k].ticketMap[RunQuery.filterCond['train_seat'][i]]['count'] > 0) {
b = true;
break;
};
};
if (b) {
obj[k] = list[k];
}
};
return obj;
},
filterJson: function() {
var date = {};
RunQuery.trainData.hasTrains = RunQuery.hasTrains(RunQuery.trainData.trainMap);
RunQuery.trainData.train = RunQuery.trainsFilter(RunQuery.trainData.hasTrains);
RunQuery.trainData.trainsType = RunQuery.trainsType(RunQuery.trainData.train);
RunQuery.trainData.trainsSeat = RunQuery.trainsSeat(RunQuery.trainData.trainsType);
RunQuery.trainData.train = RunQuery.trainData.trainsSeat;
2014-08-21 17:20:34 +08:00
},
dateChangeCallback: function(date) {
var time = date.date.getTime();
if (time >= Public.calendar.minDate.date.getTime() && time <= Public.calendar.maxDate.date.getTime()) {
$('#date_tip').hide();
Public.hideInnerPage('date_box');
$('#start_date').html(Public.calendar.curDate.format(Public.formatString) + ' ' + Public.calendar.curDate.day(3));
$('#start_date_val').val(Public.calendar.curDate.format('yyyy-MM-dd'));
RunQuery.hisUpdata();
} else {
var offset = $('a.cur', Public.calendar.wrap).offset();
$('#date_tip').css({
'left': offset.left,
'top': offset.top,
'display': 'block'
2014-09-01 13:50:43 +08:00
}).html('<p>' + date.format('M月d日') + '不在预售期</p><a href="remind.html?data=' + encodeURIComponent(date.format('M月d日')) + '" class="btn btn_m btn_success">预约提醒</a>');
2014-08-21 17:20:34 +08:00
if (offset.left / window.innerWidth > 0.75) {
$('#date_tip').attr('class', 'tip_small tip_right');
} else if (offset.left / window.innerWidth < 0.15) {
$('#date_tip').attr('class', 'tip_small tip_left');
} else {
$('#date_tip').attr('class', 'tip_small');
}
}
},
2014-08-22 18:00:59 +08:00
hisUpdata: function() {
2014-08-21 17:20:34 +08:00
Public.setHisQuery($('#startStationCode').val() + '-' + $('#endStationCode').val(), $('#query_form').serialize());
Public.setHis();
RunQuery.getQueryData();
RunQuery.queryTicket();
2014-09-01 13:50:43 +08:00
},
showRefresh: function() {
if (RunQuery.refresh) {
return;
}
if (Public.isLogin) {
$('#autoTip p').html('暂时无票!<br>没有符合你要求的车次和席别');
} else {
$('#autoTip p').html('暂时无票!<br>登录后可以自动刷票');
}
$('#autoTip').show();
},
refCount: 0,
startDate: null,
refDate: null,
refresh: false,
refTimer: null,
startRef: function() {
if (RunQuery.refresh) {
return;
}
Client.refreshStart();
RunQuery.startDate = (new Date()).getTime();
RunQuery.refDate = RunQuery.startDate;
RunQuery.refresh = true;
$('#refresh_train').show();
$('#autoTip').hide();
RunQuery.queryTicket();
RunQuery.refCount = 1;
RunQuery.refGo();
},
refGo: function() {
if (RunQuery.refresh) {
var now = (new Date()).getTime();
var useTime = RunQuery.formatTime(now - RunQuery.startDate);
var surplus = ((5000 - (now - RunQuery.refDate)) / 1000).toFixed(1);
if (surplus <= 0) {
surplus = 0;
}
$('#refresh_train .rf_desc').html('已刷 ' + RunQuery.refCount + ' 次,用时 ' + useTime + '<br>距下次刷票还有 ' + surplus + ' 秒 ...');
if (surplus == 0) {
RunQuery.refDate = now;
RunQuery.refCount++;
RunQuery.queryTicket();
}
RunQuery.refTimer = setTimeout(RunQuery.refGo, 100);
}
},
refStop: function() {
Client.refreshEnd();
clearTimeout(RunQuery.refTimer);
RunQuery.refresh = false;
$('#refresh_train').hide();
// RunQuery.queryTicket();
if (RunQuery.trainData.train.length == 0) {
RunQuery.showRefresh();
}
},
formatTime: function(t) {
var m = parseInt(t / 60000);
var s = parseInt(t % 60000 / 1000);
return m + '分' + s + '秒';
2014-08-21 17:20:34 +08:00
}
2014-09-01 13:50:43 +08:00
}