458 lines
16 KiB
JavaScript
458 lines
16 KiB
JavaScript
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 () {
|
||
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();
|
||
};
|
||
});
|