接上文的流程分析,下面是订空车页面中,正常的订空车流程对应的完整时序图(笔者第一次画时序图,老费劲了……接受拍砖):
从中可以看出,在一次完整的订车过程中,用户与页面的交互共有五个点,分别是:
页面与后台服务器的交互共有五次,分别是:
且不论这么麻烦冗余的步骤是否合理,我们可以看出用户与页面交互的几个点中,第三个点最耗时,且通常必不可少;而其他的点都可以通过javascript自动化完成或跳过。因此,我们的插件应该只有一次输入过程:提前确定选择预约列表中的第几项,并预先填写一些需要修改的订车信息项目,例如装车日期、订车数、货区货位等,然后把其余的步骤都自动化完成!
我们插件的核心代码,应该透过现有页面的限制,打破“用户<-->页面”、“页面<-->服务器”这两种固有的交互模式,实现用户与服务器之间一步到位的交互,而页面上的表单只起辅助作用。我们的整个流程简化为:
//自动获取预约信息,然后填表
function getPreserved(){
var d = new Date();
d.setDate(d.getDate() + 1);
$.getJSON(‘/gateway/hydzsw/Dzsw/action/ZcrbjhAction_getYsxq‘,{
q:‘‘,
// limit:50,
// timestamp:1394861501408,
zcrq:d.format(‘yyyy-MM-dd‘)},
function(data, textStatus,jqXHR){
if(data.length&& data.length > 0){
resultFunc(data[data.length-1]);//取最后一项
}
});
}functionresultFunc(item){
if (item) {
$("input[name=‘keyword‘]").val(‘‘);
var sycs = item.PZCS - item.JDZC4 - item.YPWZ - item.YQWP - item.FACS;
$("input[name=‘po.xqslh‘]").val(item.XQSLH);
$("input[name=‘po.pzycfh‘]").val(item.PZYCFH);
$("input[name=‘fzhzzm‘]").val(item.FZHZZM);
$("input[name=‘fjm‘]").val(item.FJQC);
$("input[name=‘fhdwmc‘]").val(item.FHDWMC);
$("input[name=‘dzhzzm‘]").val(item.DZHZZM);
$("input[name=‘djm‘]").val(item.DJQC);
$("input[name=‘shdwmc‘]").val(item.SHDWMC);
$("input[name=‘hzpm‘]").val(item.HZPM);
$("select[name=‘po.qqcz‘]").val(item.CZ);
$("input[name=‘po.qqcs‘]").val(sycs);
$("input[name=‘yqwp‘]").val(item.YQWP);
$("input[name=‘ypwz‘]").val(item.YPWZ);
$("input[name=‘jdzc4‘]").val(item.JDZC4);
$("input[name=‘po.qqds‘]").val($("input[name=‘po.qqcs‘]").val() * 60);
$("input[name=‘qqcsMax‘]").val(sycs);
$("input[name=‘po.ifzzjg‘]").attr("checked", item.IFZZJG == ‘1‘);
$("input[name=‘fztmism‘]").val(item.FZTMISM);
$("input[name=‘dztmism‘]").val(item.DZTMISM);
// $("input[name=‘fzyx‘]").val(item.FZYX);
// $("input[name=‘dzyx‘]").val(item.DZYX);
createZyx(item.PZYCFH);
}
}$("#submitBtn").click(function(){
if (validator.form()) {
if (Number($("input[name=‘po.qqcs‘]").val()) > Number($(
"input[name=‘qqcsMax‘]").val())) {
alert("最大可用车数:" + $("input[name=‘qqcsMax‘]").val()
+ ",所报车数不能超过最大可用车数!");
$("input[name=‘po.qqcs‘]").focus();
return false;
}
if (Number($("input[name=‘po.qqds‘]").val()) > Number($(
"input[name=‘po.qqcs‘]").val()) * 80) {
alert("吨数不能超80吨/车!");
$("input[name=‘po.qqds‘]").focus();
return false;
} else {
function save() {
var url = $("#uuid").val() == "" ? "/gateway/hydzsw/Dzsw/action/ZcrbjhAction_add"
: "/gateway/hydzsw/Dzsw/action/ZcrbjhAction_updateForZcrbjh2";
$.ajax({
type : "post",
url : url,
data : $("#saveForm").serialize(),
dataType : "json",
error : function(xhr, msg, e) {
alert("空车数据保存失败");
mask.hide();
},
success : function(msg) {
if (msg.success) {
// alert("空车数据保存成功,"+msg["message"]);
alert2(
"空车数据已成功保存!<br/>您可以在”未报空车查询结果列表“中编辑、打印指定的运单或批量编辑、打印运单,也可凭预约号在车站打印运单。",
function() {
clearForm();
});
// mask.hide();
} else {
alert(msg["message"]);
mask.hide();
}
}
});
}
mask.show();
// 停限装校验
$.ajax({
type : "post",
url : "/gateway/hydzsw/Dzsw/action/TbInformationRestrictionAction_checkOrder",
async : false,
data : {
fztmism : $("#fztmism").val(),
dztmism : $("#dztmism").val(),
fzyx : $("#fzyx").val(),
dzyx : $("#dzyx").val(),
startDate : $("#zcrq").val(),
endDate : $("#zcrq").val()
},
dataType : "json",
error : function(xhr, msg, e) {
},
success : function(msg) {
if (msg.success) {
confirm(msg.message
+ "<br/>您确认保存数据?",
function() {
save();
}, function() {
mask.hide();
}, ‘停限装信息提示‘);
} else {
save();
}
}
});
// 将空车数据以ajax的方式进行提交 saveForm"
// action="ZcrbjhAction_add"
// document.saveForm.submit();
}
}
});$.ajax({
url : "/gateway/hydzsw/Dzsw/action/ZcrbjhAction_operateZcrbjh",
async : true,
type : "POST",
data : "op=10&uuids=" + param + "&mor_dzsw_security_info="
+ securityInfo,
success : function(msg) {
$.unblockUI();
if (msg.success) {
$("#grid").setGridParam({
datatype : "json"
}).trigger(‘reloadGrid‘);
}
if (msg.object) {
varerrorText;
if (msg.object.BQ) {
if (msg.object.ERROR) {
errorText = ‘客户提报预约号为‘ + msg.object.ERROR
+ ‘的单据的时间已超过受理时间,请删除对应单据重新提报‘;
errorText = errorText + ‘</br>预约号为‘ + msg.object.BQ
+ ‘的单据需要转为补充需求,您是否同意?‘;
} else {
errorText = ‘客户提报预约号为‘ + msg.object.BQ
+ ‘的单据需要转为补充需求,您是否同意?‘;
}
confirm(
errorText,
function() {
//alert(msg.object.BQUUID);
$.ajax({
type : "post",
url : "/gateway/hydzsw/Dzsw/action/ZcrbjhAction_operateZcrbjhBq",
data : "op=10&uuids="
+ msg.object.BQUUID
+ "&mor_dzsw_security_info="
+ securityInfo,
dataType : "json",
async : false,
error : function(xhr, msg, e) {
},
success : function(msg) {
if (msg.success) {
$("#grid").setGridParam({
datatype : "json"
}).trigger(‘reloadGrid‘);
}
alert("上报" + msg.message);
}
});
});
} else {
errorText = ‘客户提报预约号为‘ + msg.object.ERROR
+ ‘的单据的时间已超过受理时间,请删除对应单据重新提报‘;
alert(errorText);
}
} else {
alert("上报" + msg.message);
}
}
});以上核心代码基本都来自原始的页面,我们将其重新组织了一下,用5个步骤完成了本文开头那个超复杂的时序图完成的工作,OMG!当然有一些步骤还是不能省的,比如表格的校验和错误提示信息,否则提交失败了却不知道原因,岂不是很失败……
当然,虽然核心代码已经完成,但是具体操作时,直接用这些js代码还是存在诸多不便的,尤其是给普通用户使用时,比较麻烦,因此笔者想到了制作一个chrome插件,毕竟chrome内核的浏览器在国内的市场份额还是非常大的,市面上诸多的12306抢票浏览器也都是集成了插件的chrome内核的浏览器嘛。关于插件的开发文档不多,因此编写过程颇费了一番功夫,笔者抽空再把相关内容整理一下。
记12306货运系统“抢订空车”插件的编写--流程简化及核心代码,布布扣,bubuko.com
记12306货运系统“抢订空车”插件的编写--流程简化及核心代码
原文:http://blog.csdn.net/neareast/article/details/23022341