当前位置:   article > 正文

记12306货运系统“抢订空车”插件的编写--流程简化及核心代码_12306核心代码

12306核心代码

--流程简化及核心代码

         接上文的流程分析,下面是订空车页面中,正常的订空车流程对应的完整时序图(笔者第一次画时序图,老费劲了……接受拍砖):


         从中可以看出,在一次完整的订车过程中,用户与页面的交互共有五个点,分别是:

  1. 触发预约列表
  2. 选择预约项
  3. 修改、保存订车信息
  4. 显示和提报订车信息
  5. 确认和提交。

        页面与后台服务器的交互共有五次,分别是:

  1. 获取预约列表
  2. 获取装卸车地点等信息(这一步单独存在,很不解)
  3. 停限装校验
  4. 保存订车信息(获取订车预约号)
  5. 提交预约号。

        且不论这么麻烦冗余的步骤是否合理,我们可以看出用户与页面交互的几个点中,第三个点最耗时,且通常必不可少;而其他的点都可以通过javascript自动化完成或跳过。因此,我们的插件应该只有一次输入过程:提前确定选择预约列表中的第几项,并预先填写一些需要修改的订车信息项目,例如装车日期、订车数、货区货位等,然后把其余的步骤都自动化完成!

        我们插件的核心代码,应该透过现有页面的限制,打破“用户<-->页面”、“页面<-->服务器”这两种固有的交互模式,实现用户与服务器之间一步到位的交互,而页面上的表单只起辅助作用。我们的整个流程简化为:

  1. 在表单中填写必要的信息(装车时间等)
  2. 取预约列表、自动选择一项
    1. //自动获取预约信息,然后填表
    2. function getPreserved(){
    3. var d = new Date();
    4. d.setDate(d.getDate() + 1);
    5. $.getJSON('/gateway/hydzsw/Dzsw/action/ZcrbjhAction_getYsxq',{
    6. q:'',
    7. // limit:50,
    8. // timestamp:1394861501408,
    9. zcrq:d.format('yyyy-MM-dd')},
    10. function(data, textStatus,jqXHR){
    11. if(data.length&& data.length > 0){
    12. resultFunc(data[data.length-1]);//取最后一项
    13. }
    14. });
    15. }
  3. 填充表单,即上述代码中取预约列表的最后一项,调用resultFunc函数来填充表格。其中resultFunc函数是在订空车页面的源码中定义的。如果第一步中填写的信息在这个函数中被覆盖了,我们就修改这个函数,删除可能导致覆盖的代码。
    1. functionresultFunc(item){
    2. if (item) {
    3. $("input[name='keyword']").val('');
    4. var sycs = item.PZCS - item.JDZC4 - item.YPWZ - item.YQWP - item.FACS;
    5. $("input[name='po.xqslh']").val(item.XQSLH);
    6. $("input[name='po.pzycfh']").val(item.PZYCFH);
    7. $("input[name='fzhzzm']").val(item.FZHZZM);
    8. $("input[name='fjm']").val(item.FJQC);
    9. $("input[name='fhdwmc']").val(item.FHDWMC);
    10. $("input[name='dzhzzm']").val(item.DZHZZM);
    11. $("input[name='djm']").val(item.DJQC);
    12. $("input[name='shdwmc']").val(item.SHDWMC);
    13. $("input[name='hzpm']").val(item.HZPM);
    14. $("select[name='po.qqcz']").val(item.CZ);
    15. $("input[name='po.qqcs']").val(sycs);
    16. $("input[name='yqwp']").val(item.YQWP);
    17. $("input[name='ypwz']").val(item.YPWZ);
    18. $("input[name='jdzc4']").val(item.JDZC4);
    19. $("input[name='po.qqds']").val($("input[name='po.qqcs']").val() * 60);
    20. $("input[name='qqcsMax']").val(sycs);
    21. $("input[name='po.ifzzjg']").attr("checked", item.IFZZJG == '1');
    22. $("input[name='fztmism']").val(item.FZTMISM);
    23. $("input[name='dztmism']").val(item.DZTMISM);
    24. // $("input[name='fzyx']").val(item.FZYX);
    25. // $("input[name='dzyx']").val(item.DZYX);
    26. createZyx(item.PZYCFH);
    27. }
    28. }
  4. createZyx函数发起了另一个ajax请求来获取装卸车地点等信息并填充表单,蛋疼啊……这个函数也是原页面定义的,我们需要修改一下它,在填充完表单之后直接调用“保存”按钮的事件处理函数来校验表单并保存。我们来看一下“保存”按钮的事件处理函数的定义:
    1. $("#submitBtn").click(function(){
    2. if (validator.form()) {
    3. if (Number($("input[name='po.qqcs']").val()) > Number($(
    4. "input[name='qqcsMax']").val())) {
    5. alert("最大可用车数:" + $("input[name='qqcsMax']").val()
    6. + ",所报车数不能超过最大可用车数!");
    7. $("input[name='po.qqcs']").focus();
    8. return false;
    9. }
    10. if (Number($("input[name='po.qqds']").val()) > Number($(
    11. "input[name='po.qqcs']").val()) * 80) {
    12. alert("吨数不能超80吨/车!");
    13. $("input[name='po.qqds']").focus();
    14. return false;
    15. } else {
    16. function save() {
    17. var url = $("#uuid").val() == "" ? "/gateway/hydzsw/Dzsw/action/ZcrbjhAction_add"
    18. : "/gateway/hydzsw/Dzsw/action/ZcrbjhAction_updateForZcrbjh2";
    19. $.ajax({
    20. type : "post",
    21. url : url,
    22. data : $("#saveForm").serialize(),
    23. dataType : "json",
    24. error : function(xhr, msg, e) {
    25. alert("空车数据保存失败");
    26. mask.hide();
    27. },
    28. success : function(msg) {
    29. if (msg.success) {
    30. // alert("空车数据保存成功,"+msg["message"]);
    31. alert2(
    32. "空车数据已成功保存!<br/>您可以在”未报空车查询结果列表“中编辑、打印指定的运单或批量编辑、打印运单,也可凭预约号在车站打印运单。",
    33. function() {
    34. clearForm();
    35. });
    36. // mask.hide();
    37. } else {
    38. alert(msg["message"]);
    39. mask.hide();
    40. }
    41. }
    42. });
    43. }
    44. mask.show();
    45. // 停限装校验
    46. $.ajax({
    47. type : "post",
    48. url : "/gateway/hydzsw/Dzsw/action/TbInformationRestrictionAction_checkOrder",
    49. async : false,
    50. data : {
    51. fztmism : $("#fztmism").val(),
    52. dztmism : $("#dztmism").val(),
    53. fzyx : $("#fzyx").val(),
    54. dzyx : $("#dzyx").val(),
    55. startDate : $("#zcrq").val(),
    56. endDate : $("#zcrq").val()
    57. },
    58. dataType : "json",
    59. error : function(xhr, msg, e) {
    60. },
    61. success : function(msg) {
    62. if (msg.success) {
    63. confirm(msg.message
    64. + "<br/>您确认保存数据?",
    65. function() {
    66. save();
    67. }, function() {
    68. mask.hide();
    69. }, '停限装信息提示');
    70. } else {
    71. save();
    72. }
    73. }
    74. });
    75. // 将空车数据以ajax的方式进行提交 saveForm"
    76. // action="ZcrbjhAction_add"
    77. // document.saveForm.submit();
    78. }
    79. }
    80. });
  5. 订空车信息保存成功之后,调用了clearForm函数来刷新“未报空车”列表。我们将刷新列表、选择再提交的繁琐步骤跳过,直接把结果提交!其中的关键参数是上步返回的对象中的uuid属性的值,也就是保存成功的预约空车的编号。
    1. $.ajax({
    2. url : "/gateway/hydzsw/Dzsw/action/ZcrbjhAction_operateZcrbjh",
    3. async : true,
    4. type : "POST",
    5. data : "op=10&uuids=" + param + "&mor_dzsw_security_info="
    6. + securityInfo,
    7. success : function(msg) {
    8. $.unblockUI();
    9. if (msg.success) {
    10. $("#grid").setGridParam({
    11. datatype : "json"
    12. }).trigger('reloadGrid');
    13. }
    14. if (msg.object) {
    15. varerrorText;
    16. if (msg.object.BQ) {
    17. if (msg.object.ERROR) {
    18. errorText = '客户提报预约号为' + msg.object.ERROR
    19. + '的单据的时间已超过受理时间,请删除对应单据重新提报';
    20. errorText = errorText + '</br>预约号为' + msg.object.BQ
    21. + '的单据需要转为补充需求,您是否同意?';
    22. } else {
    23. errorText = '客户提报预约号为' + msg.object.BQ
    24. + '的单据需要转为补充需求,您是否同意?';
    25. }
    26. confirm(
    27. errorText,
    28. function() {
    29. //alert(msg.object.BQUUID);
    30. $.ajax({
    31. type : "post",
    32. url : "/gateway/hydzsw/Dzsw/action/ZcrbjhAction_operateZcrbjhBq",
    33. data : "op=10&uuids="
    34. + msg.object.BQUUID
    35. + "&mor_dzsw_security_info="
    36. + securityInfo,
    37. dataType : "json",
    38. async : false,
    39. error : function(xhr, msg, e) {
    40. },
    41. success : function(msg) {
    42. if (msg.success) {
    43. $("#grid").setGridParam({
    44. datatype : "json"
    45. }).trigger('reloadGrid');
    46. }
    47. alert("上报" + msg.message);
    48. }
    49. });
    50. });
    51. } else {
    52. errorText = '客户提报预约号为' + msg.object.ERROR
    53. + '的单据的时间已超过受理时间,请删除对应单据重新提报';
    54. alert(errorText);
    55. }
    56. } else {
    57. alert("上报" + msg.message);
    58. }
    59. }
    60. });

        以上核心代码基本都来自原始的页面,我们将其重新组织了一下,用5个步骤完成了本文开头那个超复杂的时序图完成的工作,OMG!当然有一些步骤还是不能省的,比如表格的校验和错误提示信息,否则提交失败了却不知道原因,岂不是很失败……

        当然,虽然核心代码已经完成,但是具体操作时,直接用这些js代码还是存在诸多不便的,尤其是给普通用户使用时,比较麻烦,因此笔者想到了制作一个chrome插件,毕竟chrome内核的浏览器在国内的市场份额还是非常大的,市面上诸多的12306抢票浏览器也都是集成了插件的chrome内核的浏览器嘛。关于插件的开发文档不多,因此编写过程颇费了一番功夫,笔者抽空再把相关内容整理一下。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/632058
推荐阅读
相关标签
  

闽ICP备14008679号