199 lines
5.0 KiB
JavaScript
199 lines
5.0 KiB
JavaScript
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");
|
|
var suggestion = null;
|
|
var utility = require("../utility.js");
|
|
|
|
sessmgr.on("currentProfileChanged", function () {
|
|
cp = sessmgr.currentProfile;
|
|
});
|
|
|
|
var isInQuery = false;
|
|
var startQueryLimit = data.startTrainStationSuggestQueryLimit;
|
|
var isFullyQualifiedTrainCode = function (code) {
|
|
return /^[A-Z]?\d+$/.test(code);
|
|
};
|
|
|
|
function TSS() {
|
|
EventObject.apply(this);
|
|
var that = this;
|
|
var queryResult = null;
|
|
var alltrains = null;
|
|
var trainStops = null;
|
|
|
|
var loadTrainStops = function () {
|
|
if (!alltrains || !alltrains.length) {
|
|
requestSuggestionData();
|
|
return;
|
|
}
|
|
|
|
var tcode, t;
|
|
do {
|
|
tcode = alltrains.pop();
|
|
t = _.findWhere(queryResult.original, { code: tcode });
|
|
} while (!t && alltrains.length)
|
|
if (!t) {
|
|
requestSuggestionData();
|
|
return;
|
|
}
|
|
query.queryTrainStop(t.id, t.from.code, t.to.code, t.date)
|
|
.done(function (stopinfo) {
|
|
trainStops[t.code] = {
|
|
info: t,
|
|
stops: stopinfo
|
|
};
|
|
loadTrainStops();
|
|
}).fail(loadTrainStops);
|
|
};
|
|
var requestSuggestionData = function () {
|
|
var requestData = {
|
|
data: JSON.stringify({
|
|
key: "stupid360",
|
|
from: cp.fromCode,
|
|
to: cp.toCode,
|
|
date: cp.depDate,
|
|
stops: trainStops
|
|
})
|
|
};
|
|
$.ajax({
|
|
url: "/getsuggestion.ashx?key=stupid360",
|
|
dataType: "json",
|
|
method: "POST",
|
|
data: requestData
|
|
}).done(loadTrainTickets).fail(function () {
|
|
setTimeout(function () {
|
|
that.clearQueryResultCache();
|
|
//如果服务器出现错误,则等待十秒后再恢复状态
|
|
}, 10000);
|
|
});
|
|
};
|
|
var loadTrainTickets = function (serverSuggestion) {
|
|
if (!serverSuggestion || !serverSuggestion.length) {
|
|
//木有结果。
|
|
suggestion = {};
|
|
isInQuery = false;
|
|
}
|
|
serverSuggestion = _.filter(serverSuggestion, function (s) {
|
|
//预处理数据
|
|
s.key = s.key.split('-');
|
|
s.fromText = s.key[0];
|
|
s.toText = s.key[1];
|
|
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;
|
|
});
|
|
var loaded = [];
|
|
|
|
var loadTrain = function () {
|
|
if (!serverSuggestion.length) {
|
|
checkSuggestion(loaded);
|
|
return;
|
|
}
|
|
|
|
var t = serverSuggestion.pop();
|
|
query.queryTicket(t.fromCode, t.toCode, cp.depDate, cp.studentTicket, false, true)
|
|
.done(function () {
|
|
loaded.unshift(t);
|
|
|
|
var trainAvailable = this.original;
|
|
if (!trainAvailable) {
|
|
loadTrain();
|
|
return;
|
|
}
|
|
|
|
var trainFilter = new RegExp("^(" + _.map(t.value, function (v) {
|
|
return v.trainCode;
|
|
}).join("|") + ")$", "i");
|
|
|
|
trainAvailable = _.filter(trainAvailable, function (x) {
|
|
return trainFilter.test(x.code);
|
|
});
|
|
var seatType = cp.selectedSeatType || data.seatOrder;
|
|
//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;
|
|
|
|
if (suggestion.length)
|
|
that.fireEvent("trainSuggestion", suggestion);
|
|
};
|
|
|
|
this.setQueryResult = function (result, queryCount) {
|
|
if (queryCount < startQueryLimit || isInQuery || suggestion)
|
|
return;
|
|
|
|
isInQuery = true;
|
|
queryResult = result;
|
|
trainStops = {};
|
|
that.checkTrainSuggestion();
|
|
}
|
|
this.clearQueryResultCache = function () {
|
|
queryResult = null;
|
|
isInQuery = false;
|
|
trainStops = null;
|
|
alltrains = null;
|
|
suggestion = null;
|
|
};
|
|
this.checkTrainSuggestion = function () {
|
|
alltrains = _.filter(cp.selectedTrain || [], function (code) {
|
|
if (!isFullyQualifiedTrainCode(code))
|
|
return false;
|
|
var t = _.findWhere(queryResult.original, { code: code });
|
|
//始发终到、未起售的车不考虑
|
|
if (!t || (t.from.endpoint && t.to.endpoint) || t.available < 0)
|
|
return false;
|
|
|
|
return true;
|
|
});
|
|
if (!alltrains.length)
|
|
return;
|
|
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();
|
|
}
|
|
};
|
|
Object.defineProperty(ctx.TSS, "isInSuggestQuery", {
|
|
get: function () {
|
|
return isInQuery;
|
|
}
|
|
});
|
|
|
|
return ctx;
|
|
}); |