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"); 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) return; //预置参数 data.enableAuto = session.options.showMoreOpt; data.inAuto = inAutoRefresh; var count = Math.max(currentProfile.partialSubmitEnabled ? 0 : currentProfile.passengers.length, 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.length); 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(); } if (currentProfile.autoSubmitEnabled && data.enableAuto) { $(document).trigger("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 () { $(document).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("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; return new AutoRefresh(); });