Light12306/Web12306/js/otn/orderprocess.js

513 lines
18 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 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 sessmgr = require("../account/sessionMgr.js");
var submitToken;
var formData;
var submitData;
var dynamicKey;
var forceReloadKey = false;
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.indexOf("第三方") !== -1)) {
if (!forceReloadKey) {
forceReloadKey = true;
preparePageInfo();
return;
}
msg = "提交出错,请重试";
}
forceReloadKey = false;
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] === '1'
};
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 () {
dynamicKey = dynamicjs.dynamickey;
//进入查询页,获取动态码
if (dynamicKey && !forceReloadKey) {
autoSubmitRequest();
return;
}
dynamicjs.loadDynamicPage("leftTicket/init", "leftTicket/init")
.done(function () {
dynamicKey = arguments[0];
}).always(function () {
sessmgr.reloadPassengers();
sessmgr.getPassengers().always(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, "leftTicket/init", "randp");
xdef.done(function () {
submitOrder();
}).fail(function (msg) {
def.reject({ msg: msg });
});
};
var submitOrder = function () {
var url = !submitData.async ? "confirmPassenger/confirmSingle" : "confirmPassenger/confirmSingleForQueueAsys";
var data = {
passengerTicketStr: pas1,
oldPassengerStr: pas2,
randCode: param.fastSubmitOrderSkipVc ? "" : 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) {
var errMsg = json.data.errMsg || "提交订单错误,错误原因未知...";
if (errMsg.indexOf("出票失败") !== -1) {
//重新加载联系人并提交
sessmgr.reloadPassengers();
sessmgr.getPassengers().always(function () {
exports.fastPrepareOrder(train, profile, passenger)
.done(function () {
def.reject({ msg: "出票失败,请重试一次。" });
})
.always(function (e) {
def.reject({ msg: e.msg });
});
});
} else
def.reject({ msg: errMsg });
} else {
if (submitData.async)
waitQueueToComplete();
else loadOrderNoFromPayInit();
//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 loadOrderNoCount = 0;
var loadOrderNoFromPayInit = function () {
ajax.sendPost("queryOrder/queryMyOrderNoComplete", "queryOrder/initNoComplete", null, "json").done(function (text) {
if (!text.data) {
if (loadOrderNoCount++ < 3) {
setTimeout(loadOrderNoFromPayInit, 2000);
} else {
def.resolve({ orderId: "" });
}
return;
}
try {
def.resolve({ orderId: text.data.orderDBList[0].sequence_no });
} catch (e) {
def.resolve({ orderId: "" });
}
}).fail(function () {
def.resolve({ orderId: "" });
});
};
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();
};
if (param.fastSubmitOrderSkipVc) {
submitOrder();
} else {
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();
};
});