define(function (require, exports, module) { var ajax = require("../platform/webRequest.js"); var parser = require("../platform/parser.js"); var vc = require("./vc.js"); var port = require("../platform/extensionPort.js"); var param = require("../data.js"); var dynamicjs = require("../otn/dynamicjs.js"); var submitToken; var formData; var submitData; var dynamicKey; var forceReloadKey = true; Object.defineProperty(exports, "dynamicKey", { get: function () { return dynamicKey; }, set: function (key) { dynamicKey = key; } }); exports.formatJson = function (data) { return data.replace(/'/g, '"'); }; exports.prepareOrder = function (train, profile) { var purposeCode = profile.studentTicket ? "0X00" : "ADULT"; var data = "secretStr" + "=" + train.secureStr + "&train_date=" + train.date + "&back_train_date" + "=" + (profile.resign ? profile.resignDate : train.date) + "&tour_flag" + "=" + (profile.resign ? "gc" : "dc") + "&" + "purpose_codes" + "=" + purposeCode + "&" + "query_from_station_name" + "=" + profile.fromText + "&" + "query_to_station_name" + "=" + profile.toText + "&" + (ajax.userAtts ? "_json_att=" + ajax.userAtts : "undefined"); var def = new $.Deferred(); ajax.sendPost("leftTicket/submitOrderRequest", "leftTicket/init", data, "json", function (data) { if (!data.status) { var msg = parser.getError(json).message; if (msg.indexOf("未登录") !== -1) msg = "12306取消了您的登录,请重新登录..."; def.reject({ msg: msg || "12306返回了未知的状态信息,请刷新重试。" }); } else { ajax.sendPost(profile.resign ? "confirmPassenger/initGc" : "confirmPassenger/initDc", "leftTicket/init", null, "text", function (html) { parseFields(html); var token = /var\s*globalRepeatSubmitToken\s*=\s*['"]([^'"]+)["']/i.exec(html) && RegExp.$1; if (token) { submitToken = token; def.resolve({ token: token }); } else { submitToken = null; def.reject({ msg: "12306返回的信息无法识别,请重试..." }); } }, function () { def.reject({ msg: "12306不给力唷,请尽快重试..." }); }, true); } }, function () { def.reject({ msg: "12306不给力唷,请尽快重试..." }); }); var parseFields = function (html) { var reg = /(init_seatTypes|defaultTicketTypes|ticket_seat_codeMap|init_cardTypes|ticketInfoForPassengerForm|orderRequestDTO|oldTicketDTOs)\s*=\s*([^;]+);/gi; var m; formData = {}; while (m = reg.exec(html)) { formData[m[1]] = m[2]; } submitData = JSON.parse(exports.formatJson(formData["ticketInfoForPassengerForm"] || "{}")); }; return def.promise(); }; exports.fastPrepareOrder = function (train, profile, passenger) { var purposeCode = profile.studentTicket ? "0X00" : "ADULT"; var pas1 = []; var pas2 = []; passenger.forEach(function (e) { pas1.push(e.seat + "," + "1" + "," + e.passenger_type + "," + e.passenger_name + "," + e.passenger_id_type_code + "," + e.passenger_id_no + "," + e.mobile_no + "," + (profile.resign ? "Y" : "N")); if (e.passenger_type === "2") pas2.push(" "); else pas2.push(e.passenger_name + "," + e.passenger_id_type_code + "," + e.passenger_id_no + "," + e.passenger_type); }); pas1 = pas1.join("_"); pas2 = pas2.join("_") + "_"; var data = "secretStr" + "=" + train.secureStr + "&train_date=" + train.date + "&tour_flag" + "=" + (profile.resign ? "gc" : "dc") + "&" + "purpose_codes" + "=" + purposeCode + "&" + "query_from_station_name" + "=" + profile.fromText + "&" + "query_to_station_name" + "=" + profile.toText + "&" + (ajax.userAtts ? "_json_att=" + ajax.userAtts : "undefined") + "&cancel_flag=2&bed_level_order_num=000000000000000000000000000000&" + "passengerTicketStr=" + pas1 + "&" + "oldPassengerStr=" + pas2 ; var def = new $.Deferred(); var autoSubmitRequest = function () { var exData = (dynamicKey ? encodeURIComponent(dynamicKey.code) + "=" + encodeURIComponent(dynamicKey.value) + "&" : "") + "myversion=undefined&"; ajax.sendPost("confirmPassenger/autoSubmitOrderRequest", "leftTicket/init", exData + data, "json", function (json) { if (!json.status || !json.data) { var msg = parser.getError(json).message; if (msg.indexOf("未登录") !== -1) msg = "12306取消了您的登录,请重新登录..."; def.reject({ msg: msg || "12306返回了未知的状态信息,请刷新重试。" }); } else if (json.data.isRelogin) { def.reject({ msg: "12306取消了您的登录,请重新登录" }); } else if (json.data.errMsg) { def.reject({ msg: "无法提交订单:" + json.data.errMsg }); } else { var arr = json.data.result.split('#'); submitData = { key_check_isChange: arr[1], leftTicketStr: arr[2], train_location: arr[0], async: arr[3] }; checkQueueInfo(); } }, function () { def.reject({ msg: "12306不给力唷,请尽快重试..." }); }); }; var checkQueueInfo = function () { def.notify({ msg: "正在检测排队信息..." }); ajax.sendPost("confirmPassenger/getQueueCountAsync", "leftTicket/init", { train_date: new Date(train.date) + '', train_no: train.id, stationTrainCode: train.code, seatType: passenger[0].seat, fromStationTelecode: train.from.code, toStationTelecode: train.to.code, leftTicket: submitData["leftTicketStr"], purpose_codes: profile.studentTicket ? "0X00" : "ADULT", _json_att: ajax.userAtts }, "json", function (json) { if (!json || !json.status || !json.data) { def.reject({ msg: (parser.getError(json) || { message: "未知错误" }).message }); } else if (json.data.isRelogin) { def.reject({ msg: "登录状态异常,请重新登录。" }); //TODO: 警告!这里对余票不足不做出错处理! //} else if (json.data.op_2 === "true") { // def.resolve({ success: true }); // def.reject({ msg: "余票不足,无法提交订单。请重试或重新刷新。" }); } else { def.resolve({ success: true }); } }, function () { def.reject({ msg: "12306不给力啊,唉。出现网络错误了,请重试.." }); }); }; var preparePageInfo = function () { //进入查询页,获取动态码 if (dynamicKey && !forceReloadKey) { autoSubmitRequest(); return; } dynamicjs.loadDynamicPage("leftTicket/init", "leftTicket/init") .done(function () { dynamicKey = arguments[0]; }).always(function () { autoSubmitRequest(); }); }; preparePageInfo(); return def.promise(); }; exports.fastSubmitOrder = function (train, profile, passenger, randcode) { var def = new $.Deferred(); var pas1 = []; var pas2 = []; passenger.forEach(function (e) { pas1.push(e.seat + "," + "1" + "," + e.passenger_type + "," + e.passenger_name + "," + e.passenger_id_type_code + "," + e.passenger_id_no + "," + e.mobile_no + "," + (profile.resign ? "Y" : "N")); if (e.passenger_type === "2") pas2.push(" "); else pas2.push(e.passenger_name + "," + e.passenger_id_type_code + "," + e.passenger_id_no + "," + e.passenger_type); }); pas1 = pas1.join("_"); pas2 = pas2.join("_") + "_"; var checkVc = function () { def.notify({ msg: "正在检查验证码..." }); var xdef = vc.checkLoginVc(randcode); xdef.done(function () { submitOrder(); }).fail(function (msg) { def.reject({ msg: msg }); }); }; var submitOrder = function () { //def.notify({ msg: "正在提交订单..." }); //def.resolve({ orderId: "EXXXXXXXXXXXXXXXXX" }); //def.reject({ msg: "測試失敗" }); //return; var url = "confirmPassenger/confirmSingleForQueueAsys"; var data = { passengerTicketStr: pas1, oldPassengerStr: pas2, randCode: randcode, purpose_codes: profile.studentTicket ? "0X00" : "ADULT", key_check_isChange: submitData["key_check_isChange"], leftTicketStr: submitData["leftTicketStr"], train_location: submitData["train_location"], _json_att: ajax.userAtts } ajax.sendPost(url, "leftTicket/init", data, "json", function (json) { if (!json || !json.status || !json.data) { var msg = parser.getError(json).message; if (msg.indexOf("未登录") !== -1) msg = "12306取消了您的登录,请重新登录..."; def.reject({ msg: msg || "12306返回了未知的状态信息,请刷新重试。" }); } else if (!json.data.submitStatus) { def.reject({ msg: json.data.errMsg || "提交订单错误,错误原因未知..." }); } else { waitQueueToComplete(); //report port.track(param.trackTypes.QUEUE_ORDER_SUCCESS, [ train.code, train.from.name, train.to.name, train.date, passenger[0].seat, passenger.length, train.byAuto ? 1 : 0, train.suggest || 0 ]); } }, function () { def.reject({ msg: "12306不给力啊,唉。出现网络错误了,请重试.." }); }); }; var waitQueueToComplete = function () { def.notify({ msg: "正在等待订单处理..." }); var url = "confirmPassenger/queryOrderWaitTime?random=" + Math.random() + "&tourFlag=" + "dc" + "&_json_att=" + ajax.userAtts; var callback = function (json) { if (!json || !json.status || !json.data) { def.notify({ msg: "检查队列时出现错误,重试中..." }); setTimeout(sendRequest, 2000); } else if (!json.data.queryOrderWaitTimeStatus) { def.reject({ msg: (parser.getError(json) || { message: "检查队列时出现错误,请重试..." }).message }); } else if (json.data.waitTime === -1) { def.resolve({ orderId: json.data.orderId }); } else if (json.data.waitTime < 0) { def.reject({ msg: json.data.msg || "出票失败..." }); } else { def.notify({ msg: "等待订单处理(预计 " + formatSeconds(json.data.waitTime) + " 完成,排队 " + json.data.waitCount + " 人)..." }); setTimeout(sendRequest, 2000); } }; var sendRequest = function () { ajax.sendGet(url, "leftTicket/init", null, "json", callback, function () { def.notify({ msg: "检查队列时出现错误,重试中..." }); setTimeout(sendRequest, 2000); }); }; var formatSeconds = function (num) { if (num < 60) return num + "秒"; var str = (num % 60) + "秒"; num = Math.round(num / 60); str = (num % 60) + "分" + str; if (num >= 60) { num = Math.round(num / 60); str = num + "时" + str; } return str; }; sendRequest(); }; checkVc(); return def.promise(); }; exports.submitOrder = function (train, profile, passenger, randcode) { var def = new $.Deferred(); var pas1 = []; var pas2 = []; var page = profile.resign ? "confirmPassenger/initGc" : "confirmPassenger/initDc"; var resign = profile.resign; passenger.forEach(function (e) { pas1.push(e.seat + "," + "1" + "," + e.passenger_type + "," + e.passenger_name + "," + e.passenger_id_type_code + "," + e.passenger_id_no + "," + e.mobile_no + "," + (profile.resign ? "Y" : "N")); if (e.passenger_type === "2") pas2.push(" "); else pas2.push(e.passenger_name + "," + e.passenger_id_type_code + "," + e.passenger_id_no + "," + e.passenger_type); }); pas1 = pas1.join("_"); pas2 = pas2.join("_") + "_"; var doneHmd; var isCheckOrderInfo; var checkOrderInfo = function () { def.notify({ msg: "正在检测订单信息..." }); var data = "cancel_flag=2&" + "bed_level_order_num=000000000000000000000000000000&" + "passengerTicketStr=" + pas1 + "&" + "oldPassengerStr=" + pas2 + "&" + "tour_flag=" + (profile.resign ? "gc" : "dc") + "&randCode=" + randcode + "&_json_att=" + ajax.userAtts + "&REPEAT_SUBMIT_TOKEN=" + submitToken; ajax.sendPost("confirmPassenger/checkOrderInfo", page, data, "json", function (json) { if (!json || !json.status || !json.data) { def.reject({ msg: parser.getError(json) }); } else if (json.data.isRelogin) { def.reject({ msg: "12306取消了您的登录,请重新登录。" }); } else if (!json.data.submitStatus || json.data.get608Msg) { def.reject({ msg: json.data.errMsg || json.data.get608Msg || parser.getError(json) }); } else { isCheckOrderInfo = json.data.isCheckOrderInfo; doneHmd = json.data.doneHMD; checkQueueInfo(); } }, function (json) { def.reject({ msg: "12306不给力啊,唉。出现网络错误了,请重试.." }); }); }; var checkQueueInfo = function () { def.notify({ msg: "正在检测排队信息..." }); var data = { train_date: new Date(train.date) + '', train_no: train.id, stationTrainCode: train.code, seatType: passenger[0].seat, fromStationTelecode: train.from.code, toStationTelecode: train.to.code, leftTicket: submitData["leftTicketStr"], purpose_codes: profile.studentTicket ? "0X00" : "00", _json_att: ajax.userAtts, REPEAT_SUBMIT_TOKEN: submitToken }; if (isCheckOrderInfo) data.isCheckOrderInfo = isCheckOrderInfo; ajax.sendPost("confirmPassenger/getQueueCount", page, data, "json", function (json) { if (!json || !json.status || !json.data) { def.reject({ msg: (parser.getError(json) || { message: "未知错误" }).message }); } else if (json.data.isRelogin) { def.reject({ msg: "12306取消了您的登录,请重新登录。" }); } else if (json.data.op_2 === "true") { def.reject({ msg: "排队人数过多,12306禁止提交订单。" }); } else { submitOrder(); } }, function () { def.reject({ msg: "12306不给力啊,唉。出现网络错误了,请重试.." }); }); }; var submitOrder = function () { def.notify({ msg: "正在提交订单..." }); var url = resign ? "confirmPassenger/confirmResignForQueue" : "confirmPassenger/confirmSingleForQueue"; var data = { passengerTicketStr: pas1, oldPassengerStr: pas2, randCode: randcode, purpose_codes: profile.studentTicket ? "0X00" : "00", key_check_isChange: submitData["key_check_isChange"], leftTicketStr: submitData["leftTicketStr"], train_location: submitData["train_location"], _json_att: ajax.userAtts, REPEAT_SUBMIT_TOKEN: submitToken } ajax.sendPost(url, page, data, "json", function (json) { if (!json || !json.status || !json.data) { def.reject({ msg: parser.getError(json) }); } else if (!json.data.submitStatus) { def.reject({ msg: json.data.errMsg || "提交订单错误,错误原因未知..." }); } else { waitQueueToComplete(); //report port.track(param.trackTypes.QUEUE_ORDER_SUCCESS, [ train.code, train.from.name, train.to.name, train.date, passenger[0].seat, passenger.length, train.byAuto ? 1 : 0, train.suggest || 0 ]); } }, function () { def.reject({ msg: "12306不给力啊,唉。出现网络错误了,请重试.." }); }); }; var waitQueueToComplete = function () { def.notify({ msg: "正在等待订单处理..." }); var url = "confirmPassenger/queryOrderWaitTime?random=" + Math.random() + "&tourFlag=" + (resign ? "dc" : "gc") + "&_json_att=" + ajax.userAtts + "&REPEAT_SUBMIT_TOKEN=" + submitToken; var callback = function (json) { if (!json || !json.status || !json.data) { def.notify({ msg: "检查队列时出现错误,重试中..." }); setTimeout(sendRequest, 2000); } else if (!json.data.queryOrderWaitTimeStatus) { def.reject({ msg: (parser.getError(json) || { message: "检查队列时出现错误,请重试..." }).message }); } else if (json.data.waitTime === -1) { def.resolve({ orderId: json.data.orderId }); } else if (json.data.waitTime < 0) { def.reject({ msg: json.data.msg || "出票失败..." }); } else { def.notify({ msg: "等待订单处理(预计 " + formatSeconds(json.data.waitTime) + " 完成,排队 " + json.data.waitCount + " 人)..." }); setTimeout(sendRequest, 2000); } }; var sendRequest = function () { ajax.sendGet(url, page, null, "json", callback, function () { def.notify({ msg: "检查队列时出现错误,重试中..." }); setTimeout(sendRequest, 2000); }); }; var formatSeconds = function (num) { if (num < 60) return num + "秒"; var str = (num % 60) + "秒"; num = Math.round(num / 60); str = (num % 60) + "分" + str; if (num >= 60) { num = Math.round(num / 60); str = num + "时" + str; } return str; }; sendRequest(); }; checkOrderInfo(); return def.promise(); }; });