Light12306/Web12306/js/ui/ui-autorefresh.js

328 lines
11 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 sessMgr = require("../account/sessionMgr.js");
var session = sessMgr.current;
var currentProfile = sessMgr.currentProfile;
var expdata = require("../data.js");
var inAutoRefresh = false;
var media = require("../platform/media.js");
var query = require("../otn/queryticket.js");
sessMgr.on("sessionChanged", function () {
session = sessMgr.current;
});
sessMgr.on("currentProfileChanged", function () {
currentProfile = sessMgr.currentProfile;
});
var filterTrains = function (data) {
if (!currentProfile || !session.options.showMoreOpt) return;
//过滤车次列表
expdata.log("开始过滤车次");
if (currentProfile.hideNoTicket) {
//隐藏无票车次
var filtered = _.where(data.available, { available: 0 });
$.each(filtered, function () {
this.reason = 1;
data.filtered.push(this);
if (data.rowInfo)
data.rowInfo[this.id].$row.remove();
expdata.log("车次【" + this.code + "】因为无票被过滤。");
});
data.available = _.difference(data.available, filtered);
}
if (currentProfile.hideNotSameFrom) {
//隐藏发站不同车次
var filtered1 = _.filter(data.available, function (e) { return e.from.code != currentProfile.fromCode; });
$.each(filtered1, function () {
this.reason = 2;
data.filtered.push(this);
if (data.rowInfo)
data.rowInfo[this.id].$row.remove();
expdata.log("车次【" + this.code + "】因为发站不一致被过滤。");
});
data.available = _.difference(data.available, filtered1);
}
if (currentProfile.hideNotSameTo) {
//隐藏到站不同车次
var filtered2 = _.filter(data.available, function (e) { return e.to.code != currentProfile.toCode; });
$.each(filtered2, function () {
this.reason = 3;
data.filtered.push(this);
if (data.rowInfo)
data.rowInfo[this.id].$row.remove();
expdata.log("车次【" + this.code + "】因为发站不一致被过滤。");
});
data.available = _.difference(data.available, filtered2);
}
//按照时间过滤
(function () {
var r1 = _.filter(data.available, function (e) {
var t1 = parseInt(/^0*(\d+)\:/i.exec(e.from.time)[1], 10);
var t2 = parseInt(/^0*(\d+)\:/i.exec(e.to.time)[1], 10);
return t1 < currentProfile.timeRangeDepFrom || t1 > currentProfile.timeRangeDepTo || t2 < currentProfile.timeRangeArrFrom || t2 > currentProfile.timeRangeArrTo;
});
$.each(r1, function () {
this.reason = 4;
data.filtered.push(this);
if (data.rowInfo)
data.rowInfo[this.id].$row.remove();
expdata.log("车次【" + this.code + "】因为时间不在指定的区域中而被过滤。");
});
data.available = _.difference(data.available, r1);
})();
//如果开启了自动预定,那么不显示预定结果以外的车次
if (currentProfile.selectedTrain && currentProfile.selectedTrain.length) {
var rule = new RegExp("^(" + currentProfile.selectedTrain.join("|") + ")$", "i");
var filtered3 = _.filter(data.available, function (e) { return !rule.test(e.code); });
data.include = _.difference(data.available, filtered3);
if (currentProfile.hideNotInListTrain) {
$.each(filtered3, function () {
this.reason = 5;
data.filtered.push(this);
if (data.rowInfo)
data.rowInfo[this.id].$row.remove();
expdata.log("车次【" + this.code + "】不在自动预定列表中而被过滤。");
});
data.available = data.include;
}
}
expdata.log("车次过滤结束。");
};
var processTrains = function (data) {
if (!currentProfile || (!session.options.showMoreOpt && !inAutoRefresh))
return;
//预置参数
data.enableAuto = session.options.showMoreOpt;
data.inAuto = inAutoRefresh;
var count = Math.max(currentProfile.partialSubmitEnabled && currentProfile.passengers ? currentProfile.passengers.length : 0, 1);
var seat = null, train = null, entry = null;
if (data.original.length && !data.include.length && currentProfile.selectedTrain && currentProfile.selectedTrain.length && !currentProfile.byAuto) {
//TODO 没有查到任何车次
}
var trainRegCache = _.map(currentProfile.selectedTrain, function (s) { return new RegExp("^" + s + "$", "i"); });
if (!trainRegCache || !trainRegCache.length) {
trainRegCache = [/.*/];
}
//搜索车次
if (currentProfile.selectSeatFirst) {
//席别优先
seat = _.find(currentProfile.selectedSeatType, function (s) {
var _treg = _.find(trainRegCache, function (t) {
entry = _.find(data.available, function (item) {
return t.test(item.code) && (_.findWhere(item.tickets, { code: s }) || {}).count >= count;
});
return typeof (entry) != 'undefined';
});
return typeof (_treg) != 'undefined';
});
} else {
//车次优先
_.find(trainRegCache, function (t) {
seat = _.find(currentProfile.selectedSeatType, function (s) {
entry = _.find(data.available, function (item) {
return t.test(item.code) && (_.findWhere(item.tickets, { code: s }) || {}).count >= count;
});
return typeof (entry) != 'undefined';
});
return typeof (seat) != 'undefined';
});
}
//查找结果
if (seat) {
train = entry.code;
//乘客
var ticketCount = _.findWhere(entry.tickets, { code: seat }).count;
var pcount = Math.min(ticketCount, currentProfile.passengers ? currentProfile.passengers.length : 0);
data.auto = {
train: train,
seat: seat,
passengers: _.first(currentProfile.passengers || [], pcount),
data: entry
};
data.auto.passengers.forEach(function (p) { p.seat = seat; });
} else {
data.auto = null;
}
//判断是否需要继续刷新
if (data.auto !== null) {
//找到车次了
data.nextTime = null;
if (inAutoRefresh) {
media.play();
media.notify("可以订票了!", "终于等到可以订的 " + data.auto.train + "次列车" + expdata.toSeatTypeName(data.auto.seat) + "");
}
if (currentProfile.autoSubmitEnabled && data.enableAuto) {
auto.fireEvent("performAutoSubmit", data.auto);
}
} else {
//规则:如果只有待售的,那么等到指定的时间
//如果没有且在整点附近的,那么等到整点
//否则就按常规时间
var now = new Date();
if (data.available.length && currentProfile.autoWaitToSell && data.include.length && _.every(data.include, function (x) { return x.available === -1; })) {
var next = _.min(_.map(data.include, function (x) {
return x.selltime;
}));
data.nextTime = now.getDate() === next.getDate() && next > now ? (next - now) / 1000 + 15 : currentProfile.autoRefreshDelay;
} else if (now.getMinutes() >= 59) {
data.nextTime = 61 - now.getSeconds();
} else {
data.nextTime = currentProfile.autoRefreshDelay;
}
}
console.log(data.auto);
};
var ev = require("../platform/EventObject.js");
var AutoRefresh = function () {
ev.apply(this);
var that = this;
var refreshDiv = $("#auto_refresh");
var refreshInfoSpan = $("section.auto-refresh-info span");
var refreshInfoP = $("section.auto-refresh-info>p");
var refreshTimer = null;
var countdownTime = null;
var refreshStartTime = null;
var refreshElapseTimer = null;
var refreshCount = 0;
var currentSelectedDate;
var currentDateLoopIndex = -1;
this.init = function () {
query.events.on("filterTrains", function(e, d) {
filterTrains(d);
}).on("processTrains", function(e, d) {
processTrains(d);
if (!d.auto && (d.nextTime && inAutoRefresh)) {
countdownTime = d.nextTime;
that.start();
d.inAutoRefresh = inAutoRefresh;
} else if (d.auto) {
that.stop();
}
}).on("requestFailed", function () {
//失败?不做任何处理
});
that.on("performAutoSubmit", function (e, d) {
that.dispatchEvent("requireSubmitOrder", d);
});
};
this.start = function () {
if (!inAutoRefresh) {
currentSelectedDate = sessMgr.currentProfile.depDate;
refreshCount = 0;
refreshStartTime = new Date();
inAutoRefresh = true;
refreshDiv.height();
refreshDiv.addClass("final");
refreshElapseTimer = setInterval(that.showElapsedTime, 1000);
that.showElapsedTime();
that.updateDisplay();
$("#result>table").addClass("auto-refresh");
location.hash = "#result";
}
inAutoRefresh = true;
if (!countdownTime)
countdownTime = currentProfile.autoRefreshDelay;
refreshTimer = setInterval(that.countdown, 100);
refreshInfoP.eq(2).hide();
refreshInfoP.eq(1).show();
that.showCountDownInfo();
};
this.stop = function () {
if (!inAutoRefresh)
return;
inAutoRefresh = false;
refreshTimer && (clearInterval(refreshTimer), refreshTimer = null);
refreshElapseTimer && (clearInterval(refreshElapseTimer), refreshElapseTimer = null);
refreshStartTime = null;
refreshDiv.removeClass("final");
$("#date_loop_editor>span.selected").removeClass("selected");
$("#result>table").removeClass("auto-refresh");
currentDateLoopIndex = -1;
currentSelectedDate && (sessMgr.currentProfile.depDate = currentSelectedDate);
currentSelectedDate = null;
};
this.updateDisplay = function () {
refreshInfoSpan.eq(0).html(refreshCount);
};
this.showElapsedTime = function () {
var ed = (new Date() - refreshStartTime) / 1000;
var m = Math.floor(ed / 60);
var s = Math.floor(ed % 60);
refreshInfoSpan.eq(1).html(m);
refreshInfoSpan.eq(2).html(s);
};
this.countdown = function () {
countdownTime -= 0.1;
that.showCountDownInfo();
if (countdownTime <= 0) {
clearInterval(refreshTimer);
refreshTimer = null;
refreshInfoP.eq(1).hide();
refreshInfoP.eq(2).show();
refreshCount++;
that.updateDisplay();
//已经在刷新状态了?日期轮询
if (sessMgr.currentProfile.dateloop && sessMgr.currentProfile.dateloop) {
currentDateLoopIndex++;
$("#date_loop_editor>span.selected").removeClass("selected");
if (currentDateLoopIndex > sessMgr.currentProfile.dateloop.length - 1) {
sessMgr.currentProfile.depDate = currentSelectedDate;
currentDateLoopIndex = -1;
} else {
sessMgr.currentProfile.depDate = sessMgr.currentProfile.dateloop[currentDateLoopIndex];
$("#date_loop_editor>span:eq(" + currentDateLoopIndex + ")").addClass("selected");
}
}
that.fireEvent("requestQueryTicket");
}
};
this.showCountDownInfo = function () {
refreshInfoSpan.eq(3).html((Math.round(countdownTime * 10) / 10) + "");
};
Object.defineProperties(this, {
inAutoRefresh: {
get: function () {
return inAutoRefresh;
}
}
});
$(document).on("click", "#btn_start_autorefresh", function () {
$(this).closest("tr").hide();
that.start();
});
$("#btn_stop_refresh").click(this.stop);
return this;
};
AutoRefresh.prototype = Object.create(ev);
AutoRefresh.constructor = AutoRefresh;
var auto = new AutoRefresh();
return auto;
});