Light12306/Web12306/js/otn/trainstationsuggest.js

246 lines
6.4 KiB
JavaScript
Raw Normal View History

2014-07-31 21:30:48 +08:00
define(function (require, exports, module) {
var data = require("../data.js");
var sessmgr = require("../account/sessionMgr.js");
var EventObject = require("../platform/EventObject.js");
var cp = sessmgr.currentProfile;
var query = require("../otn/queryticket.js");
2014-08-27 23:05:50 +08:00
var suggestion = null;
var utility = require("../utility.js");
2014-08-30 01:32:27 +08:00
var cachedSuggest = JSON.parse(localStorage['trainsuggestion'] || '{"key":"", "data":null}');
var lastQuerySuggest = null;
2014-07-31 21:30:48 +08:00
sessmgr.on("currentProfileChanged", function () {
cp = sessmgr.currentProfile;
});
var isInQuery = false;
var startQueryLimit = data.startTrainStationSuggestQueryLimit;
2014-08-30 01:32:27 +08:00
var isSuggestLoopDisabled = false;
2014-07-31 21:30:48 +08:00
function TSS() {
EventObject.apply(this);
var that = this;
var queryResult = null;
var alltrains = null;
var trainStops = null;
var loadTrainStops = function () {
if (!alltrains || !alltrains.length) {
2014-08-27 23:05:50 +08:00
requestSuggestionData();
2014-07-31 21:30:48 +08:00
return;
}
2014-08-30 01:32:27 +08:00
var t = null;
2014-08-05 20:54:33 +08:00
do {
2014-08-30 01:32:27 +08:00
t = alltrains.pop();
2014-08-05 20:54:33 +08:00
} while (!t && alltrains.length)
if (!t) {
2014-08-27 23:05:50 +08:00
requestSuggestionData();
2014-08-05 20:54:33 +08:00
return;
}
2014-07-31 21:30:48 +08:00
query.queryTrainStop(t.id, t.from.code, t.to.code, t.date)
.done(function (stopinfo) {
2014-08-30 01:32:27 +08:00
if (!trainStops)
return;
2014-07-31 21:30:48 +08:00
trainStops[t.code] = {
info: t,
stops: stopinfo
};
loadTrainStops();
}).fail(loadTrainStops);
};
2014-08-27 23:05:50 +08:00
var requestSuggestionData = function () {
2014-08-26 21:29:58 +08:00
var requestData = {
2014-08-27 23:05:50 +08:00
data: JSON.stringify({
key: "stupid360",
from: cp.fromCode,
to: cp.toCode,
date: cp.depDate,
stops: trainStops
})
2014-08-26 21:29:58 +08:00
};
2014-08-27 23:05:50 +08:00
$.ajax({
url: "/getsuggestion.ashx?key=stupid360",
dataType: "json",
method: "POST",
data: requestData
2014-08-30 01:32:27 +08:00
}).done(preprocessServerResponse).fail(function () {
2014-08-27 23:05:50 +08:00
setTimeout(function () {
that.clearQueryResultCache();
//如果服务器出现错误,则等待十秒后再恢复状态
}, 10000);
});
};
2014-08-30 01:32:27 +08:00
var preprocessServerResponse = function (serverSuggestion) {
serverSuggestion = serverSuggestion && serverSuggestion.groups;
2014-08-27 23:05:50 +08:00
if (!serverSuggestion || !serverSuggestion.length) {
//木有结果。
2014-08-30 01:32:27 +08:00
suggestion = [];
2014-08-27 23:05:50 +08:00
isInQuery = false;
2014-08-30 01:32:27 +08:00
return;
2014-08-27 23:05:50 +08:00
}
2014-08-30 01:32:27 +08:00
2014-08-27 23:05:50 +08:00
serverSuggestion = _.filter(serverSuggestion, function (s) {
//预处理数据
s.fromCode = data.citynameMap[s.fromText];
s.toCode = data.citynameMap[s.toText];
if (!s.toCode || !s.fromCode)
return false;
s.toCode = s.toCode.c;
s.fromCode = s.fromCode.c;
return true;
});
2014-08-30 01:32:27 +08:00
cachedSuggest.data = _.clone(serverSuggestion);
localStorage['trainsuggestion'] = JSON.stringify(cachedSuggest);
loadTrainTickets(serverSuggestion);
};
var loadTrainTickets = function (serverSuggestion) {
if (!serverSuggestion)
return;
2014-08-27 23:05:50 +08:00
var loaded = [];
var loadTrain = function () {
if (!serverSuggestion.length) {
checkSuggestion(loaded);
return;
2014-07-31 21:30:48 +08:00
}
2014-08-27 23:05:50 +08:00
var t = serverSuggestion.pop();
2014-08-30 01:32:27 +08:00
query.queryTicket(t.fromCode, t.toCode, t.date, cp.studentTicket, false, true)
2014-08-27 23:05:50 +08:00
.done(function () {
loaded.unshift(t);
var trainAvailable = this.original;
if (!trainAvailable) {
loadTrain();
return;
2014-08-14 21:33:47 +08:00
}
2014-08-27 23:05:50 +08:00
2014-08-30 01:32:27 +08:00
var trainFilter = new RegExp("^(" + _.map(t.lines, function (v) {
2014-08-27 23:05:50 +08:00
return v.trainCode;
}).join("|") + ")$", "i");
trainAvailable = _.filter(trainAvailable, function (x) {
return trainFilter.test(x.code);
});
2014-08-30 01:32:27 +08:00
var seatType = cp.selectedSeatType && cp.selectedSeatType.length ? cp.selectedSeatType : data.seatDisplayOrder;
2014-08-27 23:05:50 +08:00
//seatType=['O']
var count = Math.max(!cp.partialSubmitEnabled && cp.passengers ? cp.passengers.length : 0, 1);
var selectedTrain = _.filter(trainAvailable, function (x) {
if (x.available !== 1)
return false;
return _.some(seatType, function (s) {
return x.ticketMap[s] && x.ticketMap[s].count >= count;
});
});
if (selectedTrain.length)
t.train = selectedTrain;
loadTrain();
}).fail(loadTrain);
};
loadTrain();
};
var checkSuggestion = function (suggestData) {
suggestion = suggestData;
2014-08-30 01:32:27 +08:00
isInQuery = false;
2014-07-31 21:30:48 +08:00
if (suggestion.length)
that.fireEvent("trainSuggestion", suggestion);
};
this.setQueryResult = function (result, queryCount) {
2014-08-30 01:32:27 +08:00
if (queryCount < startQueryLimit || isInQuery || isSuggestLoopDisabled)
2014-07-31 21:30:48 +08:00
return;
queryResult = result;
2014-08-30 01:32:27 +08:00
isInQuery = true;
2014-07-31 21:30:48 +08:00
trainStops = {};
that.checkTrainSuggestion();
}
this.clearQueryResultCache = function () {
queryResult = null;
isInQuery = false;
trainStops = null;
alltrains = null;
2014-08-30 01:32:27 +08:00
lastQuerySuggest = null;
2014-07-31 21:30:48 +08:00
};
this.checkTrainSuggestion = function () {
2014-08-30 01:32:27 +08:00
var suggestKey = cp.fromCode + cp.toCode + ((cp.selectedTrain || []).join("|"));
if (suggestKey === cachedSuggest.key) {
if (!lastQuerySuggest || (new Date() - lastQuerySuggest) > data.suggestRefreshInterval) {
lastQuerySuggest = new Date();
loadTrainTickets(_.clone(cachedSuggest.data));
} else {
isInQuery = false;
}
return;
}
cachedSuggest.key = suggestKey;
var selectedTrain = new RegExp("^" + ((cp.selectedTrain || []).join("|") || ".*") + "$", "i");
alltrains = _.filter(queryResult.include || [], function (t) {
//没有选择,则不考虑
if (!selectedTrain.test(t.code))
2014-07-31 21:30:48 +08:00
return false;
2014-08-30 01:32:27 +08:00
//始发终到或未起售,不考虑
if ((t.from.endpoint && t.to.endpoint) || t.available < 0)
2014-07-31 21:30:48 +08:00
return false;
return true;
});
if (!alltrains.length)
return;
2014-08-30 01:32:27 +08:00
//如果没有选择车次并且此时车次数量多于10趟则不予检测。
if ((!cp.selectedTrain || !cp.selectedTrain.length) && alltrains.length > 15)
return;
2014-07-31 21:30:48 +08:00
loadTrainStops();
};
}
TSS.prototype = Object.create(EventObject);
TSS.constructor = TSS;
var ctx = {
TSS: new TSS(),
setQueryResult: function (result, queryCount) {
ctx.TSS.setQueryResult(result, queryCount);
},
clearQueryResultCache: function () {
ctx.TSS.clearQueryResultCache();
2014-08-30 01:32:27 +08:00
ctx.isSuggestLoopDisabled = false;
},
findTrain: function (secstr) {
for (var line in suggestion) {
var t = _.findWhere(suggestion[line].train, { secureStr: secstr });
if (t)
return t;
}
return null;
2014-07-31 21:30:48 +08:00
}
};
Object.defineProperty(ctx.TSS, "isInSuggestQuery", {
get: function () {
return isInQuery;
}
});
2014-08-30 01:32:27 +08:00
Object.defineProperty(ctx, "isSuggestLoopDisabled",
{
get: function () {
return isSuggestLoopDisabled;
},
set: function (value) {
isSuggestLoopDisabled = value;
}
});
2014-07-31 21:30:48 +08:00
return ctx;
2014-08-05 20:54:33 +08:00
});