Commit c19196e390b0536fb62b2e0580be8f16fb90d31b

Authored by 徐烜
1 parent 70749641

时刻表v2.7.11

1、修改计算停站时间的方法
2、修改平衡路牌班次停站时间的方法
3、修改平衡车距的方法
4、添加v2.1时刻表的版本,供以后使用
src/main/resources/static/pages/base/timesmodel/js/v2/ParameterObj.js
... ... @@ -913,7 +913,7 @@ var ParameterObj = function() {
913 913 },
914 914  
915 915 /**
916   - * 获取固定的停站时间(固定停站时间都是选的最大值,非平均停站)
  916 + * 获取固定的停站时间(使用平均停站)
917 917 * @param oTimeObj 时间对象
918 918 * @param bIsUp 是否上行
919 919 * @param iXXTime 行驶时间
... ... @@ -921,181 +921,185 @@ var ParameterObj = function() {
921 921 */
922 922 fnCalcuFixedStopNumber: function(oTimeObj, bIsUp, iXXTime) {
923 923 _validInternal(); // 验证
924   - var oParam = this;
925   -
926   - var iPeakStopTime; // 高峰停站时间
927   - var iTroughStopTime; // 低谷停站时间
928   - var iSecondaryStopTime; // 副站停站时间
929 924  
930   - var iXXTime_temp;
931   -
932   - // 双向停站
933   - if (oParam.isTwoWayStop()) {
934   - if (bIsUp) { // 上行
935   - if (this.isMPeakBc(oTimeObj)) { // 早高峰
936   - iXXTime_temp = iXXTime == undefined ? oParam.getUpMPeakTime() : iXXTime;
937   - iPeakStopTime = Math.floor(iXXTime_temp * 0.1); // 行驶时间的10%
938   - if (iPeakStopTime < 3) { // 不少于3分钟
939   - iPeakStopTime = 3;
940   - }
941   - return iPeakStopTime;
942   - } else if (this.isEPeakBc(oTimeObj)) { // 晚高峰
943   - iXXTime_temp = iXXTime == undefined ? oParam.getUpEPeakTime() : iXXTime;
944   - iPeakStopTime = Math.floor(iXXTime_temp * 0.1); // 行驶时间的10%
945   - if (iPeakStopTime < 3) { // 不少于3分钟
946   - iPeakStopTime = 3;
947   - }
948   - return iPeakStopTime;
949   - } else { // 低谷
950   - if (this.isTroughBeforMPeakStartBc(oTimeObj)) { // 早高峰开始前
951   - iXXTime_temp = iXXTime == undefined ? oParam.getUpTroughTime() : iXXTime;
952   - iTroughStopTime = Math.floor(iXXTime_temp * 0.2); // 行驶时间20%
953   - if (iTroughStopTime < 10) { // 不少于10分钟
954   - iTroughStopTime = 10;
955   - }
956   - return iTroughStopTime;
957   - } else if (this.isTroughAfterEPeakEndBc(oTimeObj)) { // 晚高峰结束后
958   - iXXTime_temp = iXXTime == undefined ? oParam.getUpTroughTime() : iXXTime;
959   - iTroughStopTime = Math.floor(iXXTime_temp * 0.2); // 行驶时间20%
960   - if (iTroughStopTime < 10) { // 不少于10分钟
961   - iTroughStopTime = 10;
962   - }
963   - return iTroughStopTime;
964   - } else { // 早高峰,晚高峰之间
965   - iXXTime_temp = iXXTime == undefined ? oParam.getUpTroughTime() : iXXTime;
966   - iTroughStopTime = Math.floor(iXXTime_temp * 0.15); // 行驶时间15%
967   - if (iTroughStopTime < 10) { // 不少于10分钟
968   - iTroughStopTime = 10;
969   - }
970   - return iTroughStopTime;
971   - }
972   - }
973   - } else { // 下行
974   - if (this.isMPeakBc(oTimeObj)) { // 早高峰
975   - iXXTime_temp = iXXTime == undefined ? oParam.getDownMPeakTime() : iXXTime;
976   - iPeakStopTime = Math.floor(iXXTime_temp * 0.1); // 行驶时间的10%
977   - if (iPeakStopTime < 3) { // 不少于3分钟
978   - iPeakStopTime = 3;
979   - }
980   - return iPeakStopTime;
981   - } else if (this.isEPeakBc(oTimeObj)) { // 晚高峰
982   - iXXTime_temp = iXXTime == undefined ? oParam.getDownEPeakTime() : iXXTime;
983   - iPeakStopTime = Math.floor(iXXTime_temp * 0.1); // 行驶时间的10%
984   - if (iPeakStopTime < 3) { // 不少于3分钟
985   - iPeakStopTime = 3;
986   - }
987   - return iPeakStopTime;
988   - } else { // 低谷
989   - if (this.isTroughBeforMPeakStartBc(oTimeObj)) { // 早高峰开始前
990   - iXXTime_temp = iXXTime == undefined ? oParam.getDownTroughTime() : iXXTime;
991   - iTroughStopTime = Math.floor(iXXTime_temp * 0.2); // 行驶时间20%
992   - if (iTroughStopTime < 10) { // 不少于10分钟
993   - iTroughStopTime = 10;
994   - }
995   - return iTroughStopTime;
996   - } else if (this.isTroughAfterEPeakEndBc(oTimeObj)) { // 晚高峰结束后
997   - iXXTime_temp = iXXTime == undefined ? oParam.getDownTroughTime() : iXXTime;
998   - iTroughStopTime = Math.floor(iXXTime_temp * 0.2); // 行驶时间20%
999   - if (iTroughStopTime < 10) { // 不少于10分钟
1000   - iTroughStopTime = 10;
1001   - }
1002   - return iTroughStopTime;
1003   - } else { // 早高峰,晚高峰之间
1004   - iXXTime_temp = iXXTime == undefined ? oParam.getDownTroughTime() : iXXTime;
1005   - iTroughStopTime = Math.floor(iXXTime_temp * 0.15); // 行驶时间15%
1006   - if (iTroughStopTime < 10) { // 不少于10分钟
1007   - iTroughStopTime = 10;
1008   - }
1009   - return iTroughStopTime;
1010   - }
1011   - }
1012   - }
1013   - } else { // 主站停站
1014   - if (bIsUp == oParam.isUpOneWayStop()) {
1015   - if (bIsUp) { // 上行
1016   - if (this.isMPeakBc(oTimeObj)) { // 早高峰
1017   - iXXTime_temp = iXXTime == undefined ? oParam.getUpMPeakTime() : iXXTime;
1018   - iPeakStopTime = Math.floor(iXXTime_temp * 0.1); // 行驶时间的10%
1019   - if (iPeakStopTime < 3) { // 不少于3分钟
1020   - iPeakStopTime = 3;
1021   - }
1022   - return iPeakStopTime;
1023   - } else if (this.isEPeakBc(oTimeObj)) { // 晚高峰
1024   - iXXTime_temp = iXXTime == undefined ? oParam.getUpEPeakTime() : iXXTime;
1025   - iPeakStopTime = Math.floor(iXXTime_temp * 0.1); // 行驶时间的10%
1026   - if (iPeakStopTime < 3) { // 不少于3分钟
1027   - iPeakStopTime = 3;
1028   - }
1029   - return iPeakStopTime;
1030   - } else { // 低谷
1031   - if (this.isTroughBeforMPeakStartBc(oTimeObj)) { // 早高峰开始前
1032   - iXXTime_temp = iXXTime == undefined ? oParam.getUpTroughTime() : iXXTime;
1033   - iTroughStopTime = Math.floor(iXXTime_temp * 0.2); // 行驶时间20%
1034   - if (iTroughStopTime < 10) { // 不少于10分钟
1035   - iTroughStopTime = 10;
1036   - }
1037   - return iTroughStopTime;
1038   - } else if (this.isTroughAfterEPeakEndBc(oTimeObj)) { // 晚高峰结束后
1039   - iXXTime_temp = iXXTime == undefined ? oParam.getUpTroughTime() : iXXTime;
1040   - iTroughStopTime = Math.floor(iXXTime_temp * 0.2); // 行驶时间20%
1041   - if (iTroughStopTime < 10) { // 不少于10分钟
1042   - iTroughStopTime = 10;
1043   - }
1044   - return iTroughStopTime;
1045   - } else { // 早高峰,晚高峰之间
1046   - iXXTime_temp = iXXTime == undefined ? oParam.getUpTroughTime() : iXXTime;
1047   - iTroughStopTime = Math.floor(iXXTime_temp * 0.15); // 行驶时间15%
1048   - if (iTroughStopTime < 10) { // 不少于10分钟
1049   - iTroughStopTime = 10;
1050   - }
1051   - return iTroughStopTime;
1052   - }
1053   - }
1054   - } else { // 下行
1055   - if (this.isMPeakBc(oTimeObj)) { // 早高峰
1056   - iXXTime_temp = iXXTime == undefined ? oParam.getDownMPeakTime() : iXXTime;
1057   - iPeakStopTime = Math.floor(iXXTime_temp * 0.1); // 行驶时间的10%
1058   - if (iPeakStopTime < 3) { // 不少于3分钟
1059   - iPeakStopTime = 3;
1060   - }
1061   - return iPeakStopTime;
1062   - } else if (this.isEPeakBc(oTimeObj)) { // 晚高峰
1063   - iXXTime_temp = iXXTime == undefined ? oParam.getDownEPeakTime() : iXXTime;
1064   - iPeakStopTime = Math.floor(iXXTime_temp * 0.1); // 行驶时间的10%
1065   - if (iPeakStopTime < 3) { // 不少于3分钟
1066   - iPeakStopTime = 3;
1067   - }
1068   - return iPeakStopTime;
1069   - } else { // 低谷
1070   - if (this.isTroughBeforMPeakStartBc(oTimeObj)) { // 早高峰开始前
1071   - iXXTime_temp = iXXTime == undefined ? oParam.getDownTroughTime() : iXXTime;
1072   - iTroughStopTime = Math.floor(iXXTime_temp * 0.2); // 行驶时间20%
1073   - if (iTroughStopTime < 10) { // 不少于10分钟
1074   - iTroughStopTime = 10;
1075   - }
1076   - return iTroughStopTime;
1077   - } else if (this.isTroughAfterEPeakEndBc(oTimeObj)) { // 晚高峰结束后
1078   - iXXTime_temp = iXXTime == undefined ? oParam.getDownTroughTime() : iXXTime;
1079   - iTroughStopTime = Math.floor(iXXTime_temp * 0.2); // 行驶时间20%
1080   - if (iTroughStopTime < 10) { // 不少于10分钟
1081   - iTroughStopTime = 10;
1082   - }
1083   - return iTroughStopTime;
1084   - } else { // 早高峰,晚高峰之间
1085   - iXXTime_temp = iXXTime == undefined ? oParam.getDownTroughTime() : iXXTime;
1086   - iTroughStopTime = Math.floor(iXXTime_temp * 0.15); // 行驶时间15%
1087   - if (iTroughStopTime < 10) { // 不少于10分钟
1088   - iTroughStopTime = 10;
1089   - }
1090   - return iTroughStopTime;
1091   - }
1092   - }
1093   - }
1094   - } else { // 副站停战,2到3分钟
1095   - iSecondaryStopTime = 3;
1096   - return iSecondaryStopTime; // 直接返回3分钟
1097   - }
1098   - }
  925 + return this.calcuTripAvgLayoverTime(oTimeObj, bIsUp,
  926 + this.calcuTripLayoverTimeRange(oTimeObj, bIsUp, iXXTime));
  927 +
  928 + // var oParam = this;
  929 + //
  930 + // var iPeakStopTime; // 高峰停站时间
  931 + // var iTroughStopTime; // 低谷停站时间
  932 + // var iSecondaryStopTime; // 副站停站时间
  933 + //
  934 + // var iXXTime_temp;
  935 + //
  936 + // // 双向停站
  937 + // if (oParam.isTwoWayStop()) {
  938 + // if (bIsUp) { // 上行
  939 + // if (this.isMPeakBc(oTimeObj)) { // 早高峰
  940 + // iXXTime_temp = iXXTime == undefined ? oParam.getUpMPeakTime() : iXXTime;
  941 + // iPeakStopTime = Math.floor(iXXTime_temp * 0.1); // 行驶时间的10%
  942 + // if (iPeakStopTime < 3) { // 不少于3分钟
  943 + // iPeakStopTime = 3;
  944 + // }
  945 + // return iPeakStopTime;
  946 + // } else if (this.isEPeakBc(oTimeObj)) { // 晚高峰
  947 + // iXXTime_temp = iXXTime == undefined ? oParam.getUpEPeakTime() : iXXTime;
  948 + // iPeakStopTime = Math.floor(iXXTime_temp * 0.1); // 行驶时间的10%
  949 + // if (iPeakStopTime < 3) { // 不少于3分钟
  950 + // iPeakStopTime = 3;
  951 + // }
  952 + // return iPeakStopTime;
  953 + // } else { // 低谷
  954 + // if (this.isTroughBeforMPeakStartBc(oTimeObj)) { // 早高峰开始前
  955 + // iXXTime_temp = iXXTime == undefined ? oParam.getUpTroughTime() : iXXTime;
  956 + // iTroughStopTime = Math.floor(iXXTime_temp * 0.2); // 行驶时间20%
  957 + // if (iTroughStopTime < 10) { // 不少于10分钟
  958 + // iTroughStopTime = 10;
  959 + // }
  960 + // return iTroughStopTime;
  961 + // } else if (this.isTroughAfterEPeakEndBc(oTimeObj)) { // 晚高峰结束后
  962 + // iXXTime_temp = iXXTime == undefined ? oParam.getUpTroughTime() : iXXTime;
  963 + // iTroughStopTime = Math.floor(iXXTime_temp * 0.2); // 行驶时间20%
  964 + // if (iTroughStopTime < 10) { // 不少于10分钟
  965 + // iTroughStopTime = 10;
  966 + // }
  967 + // return iTroughStopTime;
  968 + // } else { // 早高峰,晚高峰之间
  969 + // iXXTime_temp = iXXTime == undefined ? oParam.getUpTroughTime() : iXXTime;
  970 + // iTroughStopTime = Math.floor(iXXTime_temp * 0.15); // 行驶时间15%
  971 + // if (iTroughStopTime < 10) { // 不少于10分钟
  972 + // iTroughStopTime = 10;
  973 + // }
  974 + // return iTroughStopTime;
  975 + // }
  976 + // }
  977 + // } else { // 下行
  978 + // if (this.isMPeakBc(oTimeObj)) { // 早高峰
  979 + // iXXTime_temp = iXXTime == undefined ? oParam.getDownMPeakTime() : iXXTime;
  980 + // iPeakStopTime = Math.floor(iXXTime_temp * 0.1); // 行驶时间的10%
  981 + // if (iPeakStopTime < 3) { // 不少于3分钟
  982 + // iPeakStopTime = 3;
  983 + // }
  984 + // return iPeakStopTime;
  985 + // } else if (this.isEPeakBc(oTimeObj)) { // 晚高峰
  986 + // iXXTime_temp = iXXTime == undefined ? oParam.getDownEPeakTime() : iXXTime;
  987 + // iPeakStopTime = Math.floor(iXXTime_temp * 0.1); // 行驶时间的10%
  988 + // if (iPeakStopTime < 3) { // 不少于3分钟
  989 + // iPeakStopTime = 3;
  990 + // }
  991 + // return iPeakStopTime;
  992 + // } else { // 低谷
  993 + // if (this.isTroughBeforMPeakStartBc(oTimeObj)) { // 早高峰开始前
  994 + // iXXTime_temp = iXXTime == undefined ? oParam.getDownTroughTime() : iXXTime;
  995 + // iTroughStopTime = Math.floor(iXXTime_temp * 0.2); // 行驶时间20%
  996 + // if (iTroughStopTime < 10) { // 不少于10分钟
  997 + // iTroughStopTime = 10;
  998 + // }
  999 + // return iTroughStopTime;
  1000 + // } else if (this.isTroughAfterEPeakEndBc(oTimeObj)) { // 晚高峰结束后
  1001 + // iXXTime_temp = iXXTime == undefined ? oParam.getDownTroughTime() : iXXTime;
  1002 + // iTroughStopTime = Math.floor(iXXTime_temp * 0.2); // 行驶时间20%
  1003 + // if (iTroughStopTime < 10) { // 不少于10分钟
  1004 + // iTroughStopTime = 10;
  1005 + // }
  1006 + // return iTroughStopTime;
  1007 + // } else { // 早高峰,晚高峰之间
  1008 + // iXXTime_temp = iXXTime == undefined ? oParam.getDownTroughTime() : iXXTime;
  1009 + // iTroughStopTime = Math.floor(iXXTime_temp * 0.15); // 行驶时间15%
  1010 + // if (iTroughStopTime < 10) { // 不少于10分钟
  1011 + // iTroughStopTime = 10;
  1012 + // }
  1013 + // return iTroughStopTime;
  1014 + // }
  1015 + // }
  1016 + // }
  1017 + // } else { // 主站停站
  1018 + // if (bIsUp == oParam.isUpOneWayStop()) {
  1019 + // if (bIsUp) { // 上行
  1020 + // if (this.isMPeakBc(oTimeObj)) { // 早高峰
  1021 + // iXXTime_temp = iXXTime == undefined ? oParam.getUpMPeakTime() : iXXTime;
  1022 + // iPeakStopTime = Math.floor(iXXTime_temp * 0.1); // 行驶时间的10%
  1023 + // if (iPeakStopTime < 3) { // 不少于3分钟
  1024 + // iPeakStopTime = 3;
  1025 + // }
  1026 + // return iPeakStopTime;
  1027 + // } else if (this.isEPeakBc(oTimeObj)) { // 晚高峰
  1028 + // iXXTime_temp = iXXTime == undefined ? oParam.getUpEPeakTime() : iXXTime;
  1029 + // iPeakStopTime = Math.floor(iXXTime_temp * 0.1); // 行驶时间的10%
  1030 + // if (iPeakStopTime < 3) { // 不少于3分钟
  1031 + // iPeakStopTime = 3;
  1032 + // }
  1033 + // return iPeakStopTime;
  1034 + // } else { // 低谷
  1035 + // if (this.isTroughBeforMPeakStartBc(oTimeObj)) { // 早高峰开始前
  1036 + // iXXTime_temp = iXXTime == undefined ? oParam.getUpTroughTime() : iXXTime;
  1037 + // iTroughStopTime = Math.floor(iXXTime_temp * 0.2); // 行驶时间20%
  1038 + // if (iTroughStopTime < 10) { // 不少于10分钟
  1039 + // iTroughStopTime = 10;
  1040 + // }
  1041 + // return iTroughStopTime;
  1042 + // } else if (this.isTroughAfterEPeakEndBc(oTimeObj)) { // 晚高峰结束后
  1043 + // iXXTime_temp = iXXTime == undefined ? oParam.getUpTroughTime() : iXXTime;
  1044 + // iTroughStopTime = Math.floor(iXXTime_temp * 0.2); // 行驶时间20%
  1045 + // if (iTroughStopTime < 10) { // 不少于10分钟
  1046 + // iTroughStopTime = 10;
  1047 + // }
  1048 + // return iTroughStopTime;
  1049 + // } else { // 早高峰,晚高峰之间
  1050 + // iXXTime_temp = iXXTime == undefined ? oParam.getUpTroughTime() : iXXTime;
  1051 + // iTroughStopTime = Math.floor(iXXTime_temp * 0.15); // 行驶时间15%
  1052 + // if (iTroughStopTime < 10) { // 不少于10分钟
  1053 + // iTroughStopTime = 10;
  1054 + // }
  1055 + // return iTroughStopTime;
  1056 + // }
  1057 + // }
  1058 + // } else { // 下行
  1059 + // if (this.isMPeakBc(oTimeObj)) { // 早高峰
  1060 + // iXXTime_temp = iXXTime == undefined ? oParam.getDownMPeakTime() : iXXTime;
  1061 + // iPeakStopTime = Math.floor(iXXTime_temp * 0.1); // 行驶时间的10%
  1062 + // if (iPeakStopTime < 3) { // 不少于3分钟
  1063 + // iPeakStopTime = 3;
  1064 + // }
  1065 + // return iPeakStopTime;
  1066 + // } else if (this.isEPeakBc(oTimeObj)) { // 晚高峰
  1067 + // iXXTime_temp = iXXTime == undefined ? oParam.getDownEPeakTime() : iXXTime;
  1068 + // iPeakStopTime = Math.floor(iXXTime_temp * 0.1); // 行驶时间的10%
  1069 + // if (iPeakStopTime < 3) { // 不少于3分钟
  1070 + // iPeakStopTime = 3;
  1071 + // }
  1072 + // return iPeakStopTime;
  1073 + // } else { // 低谷
  1074 + // if (this.isTroughBeforMPeakStartBc(oTimeObj)) { // 早高峰开始前
  1075 + // iXXTime_temp = iXXTime == undefined ? oParam.getDownTroughTime() : iXXTime;
  1076 + // iTroughStopTime = Math.floor(iXXTime_temp * 0.2); // 行驶时间20%
  1077 + // if (iTroughStopTime < 10) { // 不少于10分钟
  1078 + // iTroughStopTime = 10;
  1079 + // }
  1080 + // return iTroughStopTime;
  1081 + // } else if (this.isTroughAfterEPeakEndBc(oTimeObj)) { // 晚高峰结束后
  1082 + // iXXTime_temp = iXXTime == undefined ? oParam.getDownTroughTime() : iXXTime;
  1083 + // iTroughStopTime = Math.floor(iXXTime_temp * 0.2); // 行驶时间20%
  1084 + // if (iTroughStopTime < 10) { // 不少于10分钟
  1085 + // iTroughStopTime = 10;
  1086 + // }
  1087 + // return iTroughStopTime;
  1088 + // } else { // 早高峰,晚高峰之间
  1089 + // iXXTime_temp = iXXTime == undefined ? oParam.getDownTroughTime() : iXXTime;
  1090 + // iTroughStopTime = Math.floor(iXXTime_temp * 0.15); // 行驶时间15%
  1091 + // if (iTroughStopTime < 10) { // 不少于10分钟
  1092 + // iTroughStopTime = 10;
  1093 + // }
  1094 + // return iTroughStopTime;
  1095 + // }
  1096 + // }
  1097 + // }
  1098 + // } else { // 副站停战,2到3分钟
  1099 + // iSecondaryStopTime = 3;
  1100 + // return iSecondaryStopTime; // 直接返回3分钟
  1101 + // }
  1102 + // }
1099 1103  
1100 1104 },
1101 1105  
... ... @@ -1247,21 +1251,56 @@ var ParameterObj = function() {
1247 1251 },
1248 1252  
1249 1253 /**
1250   - * 计算高峰周转时间
  1254 + * 计算高峰周转时间(早高峰)
1251 1255 * @returns 周转时间
1252 1256 */
1253 1257 calcuPeakZzsj: function() {
1254 1258 _validInternal(); // 验证
1255   - var paramObj = this;
  1259 + // var paramObj = this;
  1260 + //
  1261 + // // 使用早高峰的周转时间
  1262 + // var _time = paramObj.getMPeakStartTimeObj();
  1263 + // var _zzsj = // 早高峰上行行驶时间+停站时间+早高峰下行行驶时间+停站时间
  1264 + // this.calcuTravelTime(_time, true) +
  1265 + // this.fnCalcuFixedStopNumber(_time, true) +
  1266 + // this.calcuTravelTime(_time, false) +
  1267 + // this.fnCalcuFixedStopNumber(_time, false);
  1268 + // return _zzsj;
  1269 +
  1270 + // 改成使用平均停站时间
  1271 + var _oTime = this.getMPeakStartTimeObj();
  1272 + var _iUpRT = this.calcuTravelTime(_oTime, true);
  1273 + var _aUpLTRange = this.calcuTripLayoverTimeRange(
  1274 + _oTime, true, _iUpRT);
  1275 + var _iUpLT = this.calcuTripAvgLayoverTime(
  1276 + _oTime, true, _aUpLTRange);
  1277 + var _iDownRT = this.calcuTravelTime(_oTime, false);
  1278 + var _aDownLTRange = this.calcuTripLayoverTimeRange(
  1279 + _oTime, false, _iDownRT);
  1280 + var _iDownLT = this.calcuTripAvgLayoverTime(
  1281 + _oTime, true, _aDownLTRange);
  1282 + return _iUpRT + _iUpLT + _iDownRT + _iDownLT;
  1283 + },
1256 1284  
1257   - // 使用早高峰的周转时间
1258   - var _time = paramObj.getMPeakStartTimeObj();
1259   - var _zzsj = // 早高峰上行行驶时间+停站时间+早高峰下行行驶时间+停站时间
1260   - this.calcuTravelTime(_time, true) +
1261   - this.fnCalcuFixedStopNumber(_time, true) +
1262   - this.calcuTravelTime(_time, false) +
1263   - this.fnCalcuFixedStopNumber(_time, false);
1264   - return _zzsj;
  1285 + /**
  1286 + * 计算晚高峰周转时间(早高峰)。
  1287 + * @returns 周转时间
  1288 + */
  1289 + calcuEPeakZzsj : function() {
  1290 +
  1291 + // 改成使用平均停站时间
  1292 + var _oTime = this.getEPeakStartTimeObj();
  1293 + var _iUpRT = this.calcuTravelTime(_oTime, true);
  1294 + var _aUpLTRange = this.calcuTripLayoverTimeRange(
  1295 + _oTime, true, _iUpRT);
  1296 + var _iUpLT = this.calcuTripAvgLayoverTime(
  1297 + _oTime, true, _aUpLTRange);
  1298 + var _iDownRT = this.calcuTravelTime(_oTime, false);
  1299 + var _aDownLTRange = this.calcuTripLayoverTimeRange(
  1300 + _oTime, false, _iDownRT);
  1301 + var _iDownLT = this.calcuTripAvgLayoverTime(
  1302 + _oTime, true, _aDownLTRange);
  1303 + return _iUpRT + _iUpLT + _iDownRT + _iDownLT;
1265 1304 },
1266 1305  
1267 1306 /**
... ... @@ -1270,31 +1309,121 @@ var ParameterObj = function() {
1270 1309 */
1271 1310 calcuTroughZzsj: function() {
1272 1311 _validInternal(); // 验证
1273   - var paramObj = this;
1274   -
1275   - // 使用低谷的周转时间
1276   - var _time = this.addMinute(paramObj.getMPeakStartTimeObj(), -1); // 使用任意一个低谷时间
1277   - var _zzsj = // 低谷上行行驶时间+停站时间+低谷下行行驶时间+停站时间
1278   - this.calcuTravelTime(_time, true) +
1279   - this.fnCalcuFixedStopNumber(_time, true) +
1280   - this.calcuTravelTime(_time, false) +
1281   - this.fnCalcuFixedStopNumber(_time, false);
1282   -
1283   - return _zzsj;
  1312 + // var paramObj = this;
  1313 + //
  1314 + // // 使用低谷的周转时间
  1315 + // var _time = this.addMinute(paramObj.getMPeakStartTimeObj(), -1); // 使用任意一个低谷时间
  1316 + // var _zzsj = // 低谷上行行驶时间+停站时间+低谷下行行驶时间+停站时间
  1317 + // this.calcuTravelTime(_time, true) +
  1318 + // this.fnCalcuFixedStopNumber(_time, true) +
  1319 + // this.calcuTravelTime(_time, false) +
  1320 + // this.fnCalcuFixedStopNumber(_time, false);
  1321 + //
  1322 + // return _zzsj;
  1323 +
  1324 + // 改成使用平均停站时间
  1325 + var _oTime = this.addMinute(this.getMPeakStartTimeObj(), -1);
  1326 + var _iUpRT = this.calcuTravelTime(_oTime, true);
  1327 + var _aUpLTRange = this.calcuTripLayoverTimeRange(
  1328 + _oTime, true, _iUpRT);
  1329 + var _iUpLT = this.calcuTripAvgLayoverTime(
  1330 + _oTime, true, _aUpLTRange);
  1331 + var _iDownRT = this.calcuTravelTime(_oTime, false);
  1332 + var _aDownLTRange = this.calcuTripLayoverTimeRange(
  1333 + _oTime, false, _iDownRT);
  1334 + var _iDownLT = this.calcuTripAvgLayoverTime(
  1335 + _oTime, true, _aDownLTRange);
  1336 + return _iUpRT + _iUpLT + _iDownRT + _iDownLT;
1284 1337 },
1285 1338  
1286 1339 /**
1287 1340 * 计算车辆总数。
1288   - * @returns 车辆数
  1341 + * @returns {int} 车辆数
1289 1342 */
1290 1343 calcuClzx: function() {
1291 1344 _validInternal(); // 验证
1292   - var paramObj = this;
  1345 + // var paramObj = this;
  1346 + //
  1347 + // // 使用早高峰平均间隔
  1348 + // var _fcjx_avg = Math.floor((paramObj.getMPeakMinFcjx() + paramObj.getMPeakMaxFcjx()) / 2);
  1349 + // return Math.round(this.calcuPeakZzsj() / _fcjx_avg);
  1350 +
  1351 + // 计算早高峰车辆数(使用平均间隔)
  1352 + var _iAMPeakFcjx_avg = (this.getMPeakMinFcjx() + this.getMPeakMaxFcjx()) / 2;
  1353 + var _iAMPeakRCTime = this.calcuPeakZzsj();
  1354 + var _iAMPeakVehicleCount = _iAMPeakRCTime / _iAMPeakFcjx_avg;
  1355 +
  1356 + // 计算晚高峰车辆数 (使用平均间隔)
  1357 + var _iPMPeakFcjx_avg = (this.getEPeakMinFcjx() + this.getEPeakMaxFcjx()) / 2;
  1358 + var _iPMPeakRCTime = this.calcuEPeakZzsj();
  1359 + var _iPMPeakVehicleCount = _iPMPeakRCTime / _iPMPeakFcjx_avg;
  1360 +
  1361 + // 取最大值为最终车辆数
  1362 + // 大于或等于的最小整数,人话就是有小数点就加1
  1363 + if (_iAMPeakVehicleCount > _iPMPeakVehicleCount) {
  1364 + return Math.ceil(_iAMPeakVehicleCount);
  1365 + } else {
  1366 + return Math.ceil(_iPMPeakVehicleCount);
  1367 + }
  1368 + },
  1369 +
  1370 + /**
  1371 + * 计算平均Layover时间。
  1372 + * @param arriveTimeObj {moment} 到达时间对象
  1373 + * @param isUp {boolean} 是否上行
  1374 + * @param aRangeTime {array} Layover时间范围
  1375 + * @returns {int} 平均Layover时间
  1376 + */
  1377 + calcuTripAvgLayoverTime : function (arriveTimeObj, isUp, aRangeTime) {
  1378 + return Math.floor((aRangeTime[0] + aRangeTime[1]) / 2);
  1379 + },
1293 1380  
1294   - // 使用早高峰平均间隔
1295   - var _fcjx_avg = Math.floor((paramObj.getMPeakMinFcjx() + paramObj.getMPeakMaxFcjx()) / 2);
1296   - return Math.round(this.calcuPeakZzsj() / _fcjx_avg);
  1381 + /**
  1382 + * 计算班次Layover时间范围。
  1383 + * @param arriveTimeObj {moment} 到达时间对象
  1384 + * @param isUp {boolean} 是否上行
  1385 + * @param runningTime {int} 班次行驶时间
  1386 + * @returns int[] 两个元素,一个最小停站时间-分钟,一个最大停站时间-分钟
  1387 + */
  1388 + calcuTripLayoverTimeRange: function(arriveTimeObj, isUp, runningTime) {
  1389 + var _aLayoverTime = [];
  1390 +
  1391 + var _iMinLayoverTime = 0;
  1392 + var _iMaxlayoverTime = 0;
  1393 +
  1394 + if (this.isTwoWayStop() || isUp == this.isUpOneWayStop()) {
  1395 + // 主站停站
  1396 + // 早晚高峰,行驶时间的10%-15%,最少3分钟
  1397 + // 低谷,行驶时间的15%-20%,最少10分钟
  1398 +
  1399 + if (this.isMPeakBc(arriveTimeObj) || this.isEPeakBc(arriveTimeObj)) {
  1400 + _iMinLayoverTime = Math.floor(runningTime * 0.10);
  1401 + _iMaxlayoverTime = Math.floor(runningTime * 0.15);
  1402 + if (_iMaxlayoverTime < 3) {
  1403 + _iMinLayoverTime = 3;
  1404 + _iMaxlayoverTime = 3;
  1405 + }
  1406 + } else {
  1407 + _iMinLayoverTime = Math.floor(runningTime * 0.15);
  1408 + _iMaxlayoverTime = Math.floor(runningTime * 0.20);
  1409 + if (_iMaxlayoverTime < 10) {
  1410 + _iMinLayoverTime = 10;
  1411 + _iMaxlayoverTime = 10;
  1412 + }
  1413 + }
  1414 + } else {
  1415 + // 副站停站
  1416 + // 所有时间段,1-3分钟
  1417 + _iMinLayoverTime = 1;
  1418 + _iMaxlayoverTime = 3;
  1419 + }
  1420 +
  1421 + _aLayoverTime.push(_iMinLayoverTime);
  1422 + _aLayoverTime.push(_iMaxlayoverTime);
  1423 + return _aLayoverTime;
1297 1424 }
1298 1425  
  1426 +
  1427 +
1299 1428 };
1300 1429 };
1301 1430 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/js/v2/core/InternalLpObj.js
1   -/**
2   - * 内部路牌对象。
3   - * @constructor
4   - */
5   -var InternalLpObj = function(
6   - orilpObj, // 原始路牌对象
7   - qCount, // 总共多少圈
8   - isUp // 圈是以上行开始还是下行开始
9   -) {
10   - // TODO:原始路牌对象(这个路牌是对接外部gantt图像,以后有机会改了)
11   - this._$$_orign_lp_obj = orilpObj;
12   -
13   - this._$_isUp = isUp;
14   -
15   - // 路牌的圈数,注意每个路牌的圈数都是一致的,
16   - // 但并不是每一圈都有值
17   - // 第1圈从上标线开始
18   - // 第0圈表示中标线的第一个班次组成的半圈
19   - // 有多少圈根据最终迭代的结果来看
20   - this._$_qCount = qCount;
21   - // 保存的是 InternalGroupBcObj 对象
22   - this._$_groupBcArray = new Array(qCount);
23   -
24   - var i;
25   - for (i = 0; i < this._$_qCount; i++) {
26   - this._$_groupBcArray[i] = new InternalGroupObj(
27   - this, this._$_isUp, undefined, undefined);
28   - }
29   -
30   - // 距离上一个路牌的最小发车间隔时间
31   - // 用于纵向添加班次的时候使用
32   - // 默认第一个路牌为0
33   - this._$_minVerticalIntervalTime = 0;
34   -
35   - // 详细记录每圈每个方向上的发车间隔时间
36   - // 第一维度表示圈数,第二维度表示第一个方向,第二个方向
37   - // 第一个方向是否上行由 _$_isUp 决定
38   - // 这里的间隔表示下一个路牌上的班次距离本路牌的班次发车时间间隔
39   - // 如果当前是最后一个路牌,表示第一个路牌的下一圈同方向班次距离本班次的间隔
40   - this._$_aVerticalIntervalTime = new Array(this._$_qCount);
41   - for (i = 0; i < this._$_aVerticalIntervalTime.length; i++) {
42   - this._$_aVerticalIntervalTime[i] = new Array(2);
43   - }
44   -
45   - // 班型的相关变量
46   - this._$_bx_isLb = false; // 是否连班
47   - this._$_bx_isfb = false; // 是否分班
48   - this._$_bx_isfb_5_2 = false; // 是否5休2分班
49   - this._$_bx_desc; // 班型描述(默认为路牌编号)
50   -
51   - // 其他班次(进出场,例包,吃饭等),TODO:以后再拆
52   - this._$_other_bc_array = [];
53   -
54   - // TODO:
55   -
56   -};
57   -
58   -//------------------- get/set 方法 -------------------//
59   -
60   -InternalLpObj.prototype.getOtherBcArray = function() {
61   - return this._$_other_bc_array;
62   -};
63   -InternalLpObj.prototype.addOtherBcArray = function(ba) {
64   - this._$_other_bc_array = this._$_other_bc_array.concat(ba);
65   -};
66   -
67   -/**
68   - * 获取圈
69   - * @param qIndex 圈index
70   - */
71   -InternalLpObj.prototype.getGroup = function(qIndex) {
72   - return this._$_groupBcArray[qIndex];
73   -};
74   -
75   -/**
76   - * 获取路牌圈数。
77   - * @returns {*}
78   - */
79   -InternalLpObj.prototype.fnGetGroupCount = function() {
80   - return this._$_qCount;
81   -};
82   -
83   -/**
84   - * 是否上行。
85   - * @returns boolean
86   - */
87   -InternalLpObj.prototype.isUp = function() {
88   - return this._$_isUp;
89   -};
90   -
91   -/**
92   - * 获取班次。
93   - * @param qIndex 第几圈
94   - * @param bcIndex 第几个班次
95   - */
96   -InternalLpObj.prototype.getBc = function(qIndex, bcIndex) {
97   - var group = this._$_groupBcArray[qIndex];
98   - var bc;
99   - if (bcIndex == 0) {
100   - bc = group.getBc1();
101   - } else if (bcIndex == 1) {
102   - bc = group.getBc2();
103   - }
104   - return bc;
105   -};
106   -
107   -/**
108   - * 在具体位置设置班次。
109   - * @param qIndex 第几圈
110   - * @param bcIndex 第几个班次
111   - * @param bc 班次对象
112   - */
113   -InternalLpObj.prototype.setBc = function(qIndex, bcIndex, bc) {
114   - var group = this._$_groupBcArray[qIndex];
115   - if (bcIndex == 0) {
116   - group.setBc1(bc);
117   - bc.setGroup(group);
118   - } else if (bcIndex == 1) {
119   - group.setBc2(bc);
120   - bc.setGroup(group);
121   - }
122   -};
123   -
124   -/**
125   - * 设置原始路牌对象。
126   - * @param lpObj 原始路牌对象
127   - */
128   -InternalLpObj.prototype.setLp = function(lpObj) {
129   - this._$$_orign_lp_obj = lpObj;
130   - var i;
131   - var group;
132   - for (i = 0; i < this._$_groupBcArray.length; i++) {
133   - group = this._$_groupBcArray[i];
134   - if (group) {
135   - group.setLp(this); // 圈和班次保存都是 InternalLpObj 对象
136   - }
137   - }
138   -};
139   -
140   -InternalLpObj.prototype.getLpNo = function() {
141   - return this._$$_orign_lp_obj.lpNo;
142   -};
143   -InternalLpObj.prototype.getLpName = function() {
144   - return this._$$_orign_lp_obj.lpName;
145   -};
146   -InternalLpObj.prototype.setBxFb5_2 = function(fb) {
147   - this._$_bx_isfb_5_2 = fb;
148   -};
149   -InternalLpObj.prototype.isBxFb5_2 = function() {
150   - return this._$_bx_isfb_5_2;
151   -};
152   -InternalLpObj.prototype.setBxLb = function(lb) {
153   - this._$_bx_isLb = lb;
154   -};
155   -InternalLpObj.prototype.isBxLb = function() {
156   - return this._$_bx_isLb;
157   -};
158   -
159   -InternalLpObj.prototype.setBxFb = function(fb) {
160   - this._$_bx_isfb = fb;
161   -};
162   -InternalLpObj.prototype.isBxFb = function() {
163   - return this._$_bx_isfb;
164   -};
165   -
166   -/**
167   - * 设置路牌的班型描述(最终是设置班次的路牌名字)。
168   - * @param desc 描述
169   - */
170   -InternalLpObj.prototype.setBxDesc = function(desc) {
171   - // 最终原始路牌的名字
172   - this._$$_orign_lp_obj.lpName = desc + "_" + this._$$_orign_lp_obj.lpNo;
173   - // 内部对象的班型描述
174   - this._$_bx_desc = desc;
175   -};
176   -/**
177   - * 获取版型描述
178   - * @returns string
179   - */
180   -InternalLpObj.prototype.getBxDesc = function() {
181   - return this._$_bx_desc;
182   -};
183   -
184   -/**
185   - * 设置纵向最小发车间隔时间。
186   - * @param v
187   - */
188   -InternalLpObj.prototype.setVerticalMinIntervalTime = function(v) {
189   - // 第一个路牌,都为0
190   - this._$_minVerticalIntervalTime = v;
191   -};
192   -/**
193   - * 获取纵向最小发车间隔时间。
194   - * @returns {number|*}
195   - */
196   -InternalLpObj.prototype.getVerticalMinIntervalTime = function() {
197   - return this._$_minVerticalIntervalTime;
198   -};
199   -
200   -/**
201   - * 设置纵向发车间隔。
202   - * @param iQindex 圈index
203   - * @param iBindex 班次index
204   - * @param iTime 间隔时间
205   - */
206   -InternalLpObj.prototype.fnSetVerticalIntervalTime = function(iQindex, iBindex, iTime) {
207   - this._$_aVerticalIntervalTime[iQindex][iBindex] = iTime;
208   -};
209   -
210   -/**
211   - * 返回纵向发车间隔。
212   - * @param iQindex 圈index
213   - * @param iBindex 班次index
214   - */
215   -InternalLpObj.prototype.fnGetVerticalIntervalTime = function(iQindex, iBindex) {
216   - return this._$_aVerticalIntervalTime[iQindex][iBindex];
217   -};
218   -
219   -//-------------------- 班次操作方法(查询,统计,删除) -----------------------//
220   -
221   -/**
222   - * 返回总共班次数。
223   - */
224   -InternalLpObj.prototype.getBcCount = function() {
225   - var i;
226   - var group;
227   - var bccount = 0;
228   - for (i = 0; i < this._$_groupBcArray.length; i++) {
229   - group = this._$_groupBcArray[i];
230   - if (group) {
231   - if (group.getBc1()) {
232   - bccount += 1;
233   - }
234   - if (group.getBc2()) {
235   - bccount += 1;
236   - }
237   - }
238   - }
239   -
240   - return bccount;
241   -};
242   -
243   -/**
244   - * 返回班次列表,过滤空的班次,将所有存在的班次连成连续的对象数组返回。
245   - * @returns arrays (InternalBcObj)
246   - */
247   -InternalLpObj.prototype.getBcArray = function() {
248   - var bcArray = [];
249   - var i;
250   - var group;
251   - for (i = 0; i < this._$_groupBcArray.length; i++) {
252   - group = this._$_groupBcArray[i];
253   - if (group) {
254   - group.getBc1() ? bcArray.push(group.getBc1()) : "";
255   - group.getBc2() ? bcArray.push(group.getBc2()) : "";
256   - }
257   - }
258   -
259   - return bcArray;
260   -};
261   -
262   -/**
263   - * 获取最小(最早)班次对象。
264   - * @returns [{圈index},{班次index}]
265   - */
266   -InternalLpObj.prototype.getMinBcObjPosition = function() {
267   - var i;
268   - var bIndex = [];
269   - for (i = 0; i < this._$_groupBcArray.length; i++) {
270   - if (this._$_groupBcArray[i].getBc1()) {
271   - bIndex.push(i);
272   - bIndex.push(0);
273   - break;
274   - }
275   - if (this._$_groupBcArray[i].getBc2()) {
276   - bIndex.push(i);
277   - bIndex.push(1);
278   - break;
279   - }
280   - }
281   - return bIndex;
282   -};
283   -
284   -/**
285   - * 获取最大(最晚)班次对象。
286   - * @returns [{圈index},{班次index}]
287   - */
288   -InternalLpObj.prototype.getMaxBcObjPosition = function() {
289   - var i;
290   - var bIndex = [];
291   - for (i = this._$_groupBcArray.length - 1; i >= 0; i--) {
292   - if (this._$_groupBcArray[i].getBc2()) {
293   - bIndex.push(i);
294   - bIndex.push(1);
295   - break;
296   - }
297   - if (this._$_groupBcArray[i].getBc1()) {
298   - bIndex.push(i);
299   - bIndex.push(0);
300   - break;
301   - }
302   - }
303   - return bIndex;
304   -};
305   -
306   -InternalLpObj.prototype.getMinBcObj = function() {
307   - var i;
308   - var bcObj;
309   - for (i = 0; i < this._$_groupBcArray.length; i++) {
310   - bcObj = this._$_groupBcArray[i].getBc1();
311   - if (bcObj) {
312   - break;
313   - }
314   - bcObj = this._$_groupBcArray[i].getBc2();
315   - if (bcObj) {
316   - break;
317   - }
318   - }
319   - return bcObj;
320   -};
321   -InternalLpObj.prototype.getMaxBcObj = function() {
322   - var i;
323   - var bcObj;
324   - for (i = this._$_groupBcArray.length - 1; i >= 0; i--) {
325   - bcObj = this._$_groupBcArray[i].getBc2();
326   - if (bcObj) {
327   - break;
328   - }
329   - bcObj = this._$_groupBcArray[i].getBc1();
330   - if (bcObj) {
331   - break;
332   - }
333   - }
334   - return bcObj;
335   -};
336   -
337   -/**
338   - * 获取车次链信息。
339   - * @param num 第几个车次链
340   - * @returns object {s_q: {开始圈索引},s_b : {开始班次索引},e_q : {结束圈索引},e_b : {结束班次索引}, bcount : {班次数}}
341   - */
342   -InternalLpObj.prototype.fnGetBcChainInfo = function(num) {
343   - // 计算总的车次链信息
344   - var aChainInfo = [];
345   - var oChainInfo;
346   - var aBcIndex = this.getMinBcObjPosition();
347   - var oBc;
348   - var iQIndex;
349   - var iBcIndex;
350   - var i;
351   - var bFlag;
352   -
353   - var iBcount = 0;
354   -
355   - if (aBcIndex.length == 2) {
356   - iBcount = 1;
357   - oChainInfo = {s_q : aBcIndex[0], s_b : aBcIndex[1], e_q : aBcIndex[0], e_b : aBcIndex[1], bcount: 1};
358   - aChainInfo.push(oChainInfo);
359   - bFlag = true;
360   -
361   - // 下一个班次的索引
362   - iQIndex = aBcIndex[1] == 0 ? aBcIndex[0] : aBcIndex[0] + 1;
363   - iBcIndex = aBcIndex[1] == 0 ? 1 : 0;
364   -
365   - for (i = iQIndex; i < this._$_qCount; i++) {
366   - while (iBcIndex <= 1) {
367   - oBc = this.getBc(i, iBcIndex);
368   - if (!oBc) {
369   - if (bFlag) {
370   - // 车次链结尾是这个班次的前一个班次
371   - oChainInfo.e_q = iBcIndex == 0 ? i - 1 : i;
372   - oChainInfo.e_b = iBcIndex == 0 ? 1 : 0;
373   - oChainInfo.bcount = iBcount;
374   - }
375   -
376   - bFlag = false;
377   - } else {
378   - if (bFlag) {
379   - iBcount ++;
380   - oChainInfo.bcount = iBcount;
381   - } else {
382   - // 下一个车次链开始
383   - iBcount = 1;
384   - oChainInfo = {s_q : i, s_b : iBcIndex, e_q : i, e_b : iBcIndex, bcount: 1};
385   - aChainInfo.push(oChainInfo);
386   - bFlag = true;
387   - }
388   - }
389   -
390   -
391   - iBcIndex ++;
392   - }
393   - iBcIndex = 0;
394   - }
395   -
396   - }
397   -
398   - return aChainInfo[num];
399   -};
400   -
401   -/**
402   - * 获取车次链的个数。
403   - * @returns int
404   - */
405   -InternalLpObj.prototype.fnGetBcChainCount = function() {
406   - var iChainCount = 0;
407   - var aBcIndex = this.getMinBcObjPosition();
408   -
409   - var oBc;
410   - var iQIndex;
411   - var iBcIndex;
412   - var i;
413   - var bFlag;
414   -
415   - if (aBcIndex.length == 2) {
416   - iChainCount = 1;
417   - bFlag = true;
418   -
419   - // 下一个班次的索引
420   - iQIndex = aBcIndex[1] == 0 ? aBcIndex[0] : aBcIndex[0] + 1;
421   - iBcIndex = aBcIndex[1] == 0 ? 1 : 0;
422   -
423   - for (i = iQIndex; i < this._$_qCount; i++) {
424   - while (iBcIndex <= 1) {
425   - oBc = this.getBc(i, iBcIndex);
426   - if (!oBc) {
427   - bFlag = false;
428   - } else {
429   - if (bFlag) {
430   -
431   - } else {
432   - iChainCount ++;
433   - bFlag = true;
434   - }
435   - }
436   -
437   -
438   - iBcIndex ++;
439   - }
440   - iBcIndex = 0;
441   - }
442   -
443   - }
444   -
445   -
446   - return iChainCount;
447   -};
448   -
449   -/**
450   - * 在具体位置移除班次。
451   - * @param qIndex 第几圈
452   - * @param bcIndex 第几个班次
453   - */
454   -InternalLpObj.prototype.removeBc = function(qIndex, bcIndex) {
455   - var group = this._$_groupBcArray[qIndex];
456   - if (bcIndex == 0) {
457   - group.removeBc1();
458   - } else if (bcIndex == 1) {
459   - group.removeBc2();
460   - }
461   -};
462   -
463   -/**
464   - * 使用指定时间匹配返回离之最近的第几圈第几个班次,
465   - * 使用时间差的绝度值,比较,取最小的
466   - * 如果有两个一样的时间差,取比fctime大的时间
467   - * @param fctime moment 比较用时间
468   - * @param groupArray 圈数组
469   - * @param hasUp boolean 计算上行班次
470   - * @param hasDown boolean 计算下行班次
471   - * @returns [{第几圈},{第几个班次}]
472   - */
473   -InternalLpObj.prototype.fnGetQBcIndexWithFcTimeFromGroupArray = function(
474   - fctime, groupArray, hasUp, hasDown
475   -) {
476   - var i;
477   - var timediff; // 时间差取绝对值
478   - var qIndex;
479   - var bcIndex;
480   -
481   - var group;
482   - var bc1time;
483   - var bc2time;
484   -
485   - var tempdiff;
486   -
487   - console.log("比较时间=" + fctime.format("HH:mm"));
488   -
489   - for (i = 0; i < this._$_qCount; i++) {
490   - group = groupArray[i];
491   - if (group) {
492   - if (group.getBc1() && hasUp) {
493   - bc1time = group.getBc1().getFcTimeObj();
494   - console.log("bc1time=" + bc1time.format("HH:mm") + " tempdiff=" + tempdiff);
495   - tempdiff = Math.abs(bc1time.diff(fctime));
496   -
497   - if (!timediff) {
498   - timediff = Math.abs(tempdiff);
499   - qIndex = i;
500   - bcIndex = 0;
501   - } else {
502   - if (tempdiff < timediff) {
503   - timediff = tempdiff;
504   - qIndex = i;
505   - bcIndex = 0;
506   - } if (Math.abs(tempdiff) == timediff) {
507   - if (bc1time.isAfter(fctime)) {
508   - timediff = tempdiff;
509   - qIndex = i;
510   - bcIndex = 0;
511   - }
512   -
513   - }
514   - }
515   - }
516   -
517   - if (group.getBc2() && hasDown) {
518   - bc2time = group.getBc2().getFcTimeObj();
519   - console.log("bc2time=" + bc2time.format("HH:mm") + " tempdiff=" + tempdiff);
520   - tempdiff = Math.abs(bc2time.diff(fctime));
521   -
522   - if (!timediff) {
523   - timediff = Math.abs(tempdiff);
524   - qIndex = i;
525   - bcIndex = 1;
526   - } else {
527   - if (tempdiff < timediff) {
528   - timediff = tempdiff;
529   - qIndex = i;
530   - bcIndex = 1;
531   - } if (Math.abs(tempdiff) == timediff) {
532   - if (bc2time.isBefore(fctime)) {
533   - timediff = tempdiff;
534   - qIndex = i;
535   - bcIndex = 1;
536   - }
537   -
538   - }
539   - }
540   - }
541   - }
542   - }
543   -
544   - console.log("中标线对应数组索引=" + qIndex);
545   -
546   - var rst = [];
547   - rst.push(qIndex);
548   - rst.push(bcIndex);
549   -
550   - return rst;
551   -};
552   -
553   -/**
554   - * 使用指定时间匹配返回离之最近的第几圈第几个班次,
555   - * 使用时间差的绝度值,比较,取最小的
556   - * 如果有两个一样的时间差,取比fctime大的时间
557   - * @param fctime moment 比较用时间
558   - * @param hasUp boolean 计算上行班次
559   - * @param hasDown boolean 计算下行班次
560   - * @returns [{第几圈},{第几个班次}]
561   - */
562   -InternalLpObj.prototype.getQBcIndexWithFcTime = function(
563   - fctime, hasUp, hasDown
564   -) {
565   - return this.fnGetQBcIndexWithFcTimeFromGroupArray(fctime, this._$_groupBcArray, hasUp, hasDown);
566   -};
567   -
568   -//---------------------- 内部数据初始化方法(不同于构造函数)---------------------//
569   -
570   -/**
571   - * 从指定开始时间到结束时间创建不间断班次(连班),并初始化路牌
572   - * 注意,之前有班次会删除后再创建。
573   - * @param startTime 开始时间
574   - * @param endTime 结束时间
575   - * @param isUp 第一个班次是上行还是下行
576   - * @param fromQ 从第几圈开始加入
577   - * @param paramObj 参数对象
578   - * @param factory 工厂对象
579   - */
580   -InternalLpObj.prototype.initDataFromTimeToTime = function(
581   - startTime,
582   - endTime,
583   - isUp,
584   - fromQ,
585   - paramObj,
586   - factory) {
587   -
588   - var bcData = []; // 班次数组
589   - var bcObj;
590   - var kssj = startTime;
591   - var fcno = 1; // 发车顺序号
592   - var bcCount = 1; // 班次数
593   - do {
594   - bcObj = factory.createBcObj(
595   - this, "normal", isUp, fcno, kssj, paramObj); // this就是所属路牌对象
596   - bcData.push(bcObj);
597   -
598   - kssj = paramObj.addMinute(kssj, bcObj.getBcTime() + bcObj.getStopTime());
599   - fcno ++;
600   - bcCount ++;
601   - isUp = !isUp;
602   - } while(kssj.isBefore(endTime));
603   - bcCount--;
604   -
605   - //console.log("last -1;" + bcData[bcCount -2].getFcTimeObj().format("HH:mm"));
606   - //console.log("last;" + bcData[bcCount -1].getFcTimeObj().format("HH:mm"));
607   - //console.log("endtime: " + endTime.format("HH:mm"));
608   -
609   - //if (bcCount > 0 && bcData[bcCount - 1].getArrTimeObj().isAfter(endTime)) {
610   - // // 如果最后一个班次的到达时间超过结束时间,也要去除
611   - // bcData.splice(bcCount - 1, 1);
612   - //}
613   -
614   - this._initDataFromLbBcArray(bcData, fromQ);
615   -
616   -};
617   -
618   -/**
619   - * 使用连班的班次数组初始化路牌(相应的圈会被覆盖)。
620   - * @param bcArray 连班班次数组
621   - * @param fromQ 从第几圈开始加入
622   - */
623   -InternalLpObj.prototype._initDataFromLbBcArray = function(
624   - bcArray,
625   - fromQ
626   -) {
627   - var _bc1Obj;
628   - var _bc2Obj;
629   - var _qObj;
630   -
631   - // 第一班次是上行还是下行
632   - var isUp = bcArray[0].isUp();
633   -
634   - if (bcArray.length > 0 && fromQ < this._$_qCount) {
635   - // 构造圈数
636   - if (isUp != this._$_isUp) {
637   - // 如果方向不一致,意味着第一个班次是半圈
638   - // 加半圈,并加在bc2上
639   - _bc2Obj = bcArray.slice(0, 1)[0];
640   - _qObj = new InternalGroupObj(
641   - this,
642   - this._$_isUp,
643   - undefined,
644   - _bc2Obj
645   - );
646   - _bc2Obj.setGroup(_qObj);
647   - this._$_groupBcArray[fromQ] = _qObj;
648   -
649   - bcArray.splice(0, 1);
650   - fromQ ++;
651   - }
652   -
653   - var qCount1 = Math.floor(bcArray.length / 2); // 需要添加多少圈
654   - var qCount2 = bcArray.length % 2; // 最后是否有半圈
655   -
656   - while (fromQ < this._$_qCount) {
657   - if (qCount1 > 0) {
658   - _bc1Obj = bcArray.slice(0, 1)[0];
659   - _bc2Obj = bcArray.slice(1, 2)[0];
660   - _qObj = new InternalGroupObj(
661   - this,
662   - this._$_isUp,
663   - _bc1Obj,
664   - _bc2Obj
665   - );
666   - _bc1Obj.setGroup(_qObj);
667   - _bc2Obj.setGroup(_qObj);
668   - this._$_groupBcArray[fromQ] = _qObj;
669   -
670   - bcArray.splice(0, 2);
671   - qCount1 --;
672   - } else if (qCount2 > 0) {
673   - // 加半圈,并加在bc1上
674   - _bc1Obj = bcArray.slice(0, 1)[0];
675   - _qObj = new InternalGroupObj(
676   - this,
677   - this._$_isUp,
678   - _bc1Obj,
679   - undefined
680   - );
681   - _bc1Obj.setGroup(_qObj);
682   - this._$_groupBcArray[fromQ] = _qObj;
683   -
684   - bcArray.splice(0, 1);
685   - qCount2 --;
686   - } else {
687   - break;
688   - }
689   -
690   - fromQ ++;
691   - }
692   - }
693   -};
694   -
695   -//-------------------------- 其他方法 ----------------------------//
696   -
697   -/**
698   - * 从指定位置的班次开始,往后所有的班次修正发车时间
699   - * @param groupIndex
700   - * @param bcIndex
701   - * @param time
702   - */
703   -InternalLpObj.prototype.fnAddMinuteToBcFcsj = function(groupIndex, bcIndex, time) {
704   - var i;
705   - var oCurBc;
706   -
707   - // 修正之前班次的停站时间
708   - //oCurBc = this.getBc(
709   - // bcIndex == 0 ? groupIndex - 1 : groupIndex,
710   - // bcIndex == 1 ? 0 : 1
711   - //);
712   - //if (oCurBc) {
713   - // oCurBc.setStopTime(oCurBc.getStopTime() + time);
714   - //}
715   -
716   -
717   - for (i = groupIndex; i < this._$_qCount; i++) {
718   - if (bcIndex == 0) {
719   - oCurBc = this.getBc(i, 0);
720   - if (oCurBc) {
721   - oCurBc.addMinuteToFcsj(time);
722   - }
723   - oCurBc = this.getBc(i, 1);
724   - if (oCurBc) {
725   - oCurBc.addMinuteToFcsj(time);
726   - }
727   -
728   - } else {
729   - oCurBc = this.getBc(i, 1);
730   - if (oCurBc) {
731   - oCurBc.addMinuteToFcsj(time);
732   - }
733   -
734   - }
735   -
736   - bcIndex = 0;
737   - }
738   -};
739   -
740   -/**
741   - * 在指定位置添加一个吃饭班次。
742   - * 注1:吃饭班次不是普通班次,不记录进圈,记录进_$_other_bc_array
743   - * 注2:添加吃饭班次时,会修改之前班次的停战时间,所以导致之后的班次的停战都会发生变化
744   - * @param groupIndex
745   - * @param bcIndex
746   - * @param factory
747   - * @param paramObj
748   - * @returns int 相差时间(吃饭时间距离和停站时间相差值)
749   - */
750   -InternalLpObj.prototype.fnAddEatBc = function(groupIndex, bcIndex, factory, paramObj) {
751   - var oPreBc;
752   - var oEatBc;
753   - var iBcModifyTime;
754   - oPreBc = this.getBc( // 前一个邻接班次
755   - bcIndex == 0 ? groupIndex - 1 : groupIndex,
756   - bcIndex == 1 ? 0 : 1);
757   - if (oPreBc) { // 存在前一个班次
758   - oEatBc = factory.createBcObj(
759   - this,
760   - "cf",
761   - !oPreBc.isUp(), // 和上一个班次方向相反
762   - 1,
763   - paramObj.addMinute(oPreBc.getArrTimeObj(), oPreBc.getStopTime()), // 使用上一个班次的到达时间作为开始时间
764   - paramObj
765   - );
766   -
767   - //iBcModifyTime = oEatBc.getBcTime() - oPreBc.getStopTime(); // 后续班次要调整的时间
768   -
769   - // 修正之后的班次发车时间
770   - // 注意:之后那个班次发车时间就是吃饭班次的到达时间
771   - iBcModifyTime = oEatBc.getArrTimeObj().diff(this.getBc(groupIndex, bcIndex).getFcTimeObj(), "m");
772   - this.fnAddMinuteToBcFcsj(groupIndex, bcIndex, iBcModifyTime);
773   -
774   - oPreBc.setStopTime(0); // 不重置停站时间
775   - oPreBc.fnSetEatTime(oEatBc.getBcTime());
776   -
777   - //this._$_other_bc_array.push(oEatBc);
778   -
779   - return iBcModifyTime;
780   - } else {
781   - return false;
782   - }
783   -
784   -};
785   -
786   -/**
787   - * 调整路牌的班次,通过调整停站时间,或者班次发车时间,不能让班次的到达时间和下一个班次的发车时间重叠。
788   - * @param iPeakAverStopTime 高峰平均停站时间
789   - * @param iTroughAverStopTime 低谷平均停站时间
790   - * @param oParam 参数对象
791   - */
792   -InternalLpObj.prototype.fnAdjustBcInterval = function(iPeakAverStopTime, iTroughAverStopTime, oParam) {
793   - // 获取车次链个数
794   - var iBcChainCount = this.fnGetBcChainCount();
795   -
796   - var i;
797   - var j;
798   - var oBcIndex;
799   - var iQIndex;
800   - var iBcIndex;
801   - var iBcCount;
802   - var oBc;
803   - var oNextBc;
804   -
805   - var iBcStopTime;
806   -
807   - for (i = 0; i < iBcChainCount; i++) {
808   - oBcIndex = this.fnGetBcChainInfo(i);
809   - iQIndex = oBcIndex["s_q"];
810   - iBcIndex = oBcIndex["s_b"];
811   - iBcCount = oBcIndex["bcount"];
812   -
813   - for (j = 0; j < iBcCount - 1; j++) {
814   - oBc = this.getBc(iQIndex, iBcIndex);
815   - oNextBc = this.getBc(
816   - iBcIndex == 0 ? iQIndex : iQIndex + 1,
817   - iBcIndex == 0 ? 1 : 0);
818   -
819   - if (oNextBc.fnIsFirstBc()) { // 如果同一路牌连续2个方向首站班次,都不做处理
820   - continue;
821   - }
822   -
823   - // 不改变当前班次的行驶时间,修正停站时间和下一个班次的发车时间
824   - iBcStopTime = oNextBc.getFcTimeObj().diff(oBc.getArrTimeObj(), "m");
825   - if (iBcStopTime < 0) {
826   - // 当前班次使用最小停站时间
827   - oBc.setStopTime(oParam.fnCalcuFixedMinStopNumber(oBc.getArrTimeObj(), oBc.isUp()));
828   - oNextBc.addMinuteToFcsj(oBc.getStopTime() + oBc.fnGetEatTime() - iBcStopTime);
829   -
830   - } else {
831   - if (iBcStopTime == oBc.getStopTime() + oBc.fnGetEatTime()) {
832   - // 停站时间一致,没有问题
833   -
834   -
835   - } else {
836   - // TODO:当前班次使用最小停站时间
837   - oBc.setStopTime(oParam.fnCalcuFixedMinStopNumber(oBc.getArrTimeObj(), oBc.isUp()));
838   - oNextBc.addMinuteToFcsj(oBc.getStopTime() + oBc.fnGetEatTime() - iBcStopTime);
839   -
840   - }
841   - }
842   -
843   - iBcIndex = iBcIndex == 0 ? 1 : 0;
844   - iQIndex = iBcIndex == 0 ? iQIndex + 1 : iQIndex;
845   - }
846   -
847   - this.getBc(iQIndex, iBcIndex).setStopTime(0);
848   - }
849   -
850   -
851   -};
852   -
853   -
854   -// TODO
855   -
856   -/**
857   - *
858   - *
859   - */
860   -InternalLpObj.prototype.calcuLpBx = function() {
861   -
862   -};
863   -
864   -
  1 +/**
  2 + * 内部路牌对象。
  3 + * @constructor
  4 + */
  5 +var InternalLpObj = function(
  6 + orilpObj, // 原始路牌对象
  7 + qCount, // 总共多少圈
  8 + isUp // 圈是以上行开始还是下行开始
  9 +) {
  10 + // TODO:原始路牌对象(这个路牌是对接外部gantt图像,以后有机会改了)
  11 + this._$$_orign_lp_obj = orilpObj;
  12 +
  13 + this._$_isUp = isUp;
  14 +
  15 + // 路牌的圈数,注意每个路牌的圈数都是一致的,
  16 + // 但并不是每一圈都有值
  17 + // 第1圈从上标线开始
  18 + // 第0圈表示中标线的第一个班次组成的半圈
  19 + // 有多少圈根据最终迭代的结果来看
  20 + this._$_qCount = qCount;
  21 + // 保存的是 InternalGroupBcObj 对象
  22 + this._$_groupBcArray = new Array(qCount);
  23 +
  24 + var i;
  25 + for (i = 0; i < this._$_qCount; i++) {
  26 + this._$_groupBcArray[i] = new InternalGroupObj(
  27 + this, this._$_isUp, undefined, undefined);
  28 + }
  29 +
  30 + // 距离上一个路牌的最小发车间隔时间
  31 + // 用于纵向添加班次的时候使用
  32 + // 默认第一个路牌为0
  33 + this._$_minVerticalIntervalTime = 0;
  34 +
  35 + // 详细记录每圈每个方向上的发车间隔时间
  36 + // 第一维度表示圈数,第二维度表示第一个方向,第二个方向
  37 + // 第一个方向是否上行由 _$_isUp 决定
  38 + // 这里的间隔表示下一个路牌上的班次距离本路牌的班次发车时间间隔
  39 + // 如果当前是最后一个路牌,表示第一个路牌的下一圈同方向班次距离本班次的间隔
  40 + this._$_aVerticalIntervalTime = new Array(this._$_qCount);
  41 + for (i = 0; i < this._$_aVerticalIntervalTime.length; i++) {
  42 + this._$_aVerticalIntervalTime[i] = new Array(2);
  43 + }
  44 +
  45 + // 班型的相关变量
  46 + this._$_bx_isLb = false; // 是否连班
  47 + this._$_bx_isfb = false; // 是否分班
  48 + this._$_bx_isfb_5_2 = false; // 是否5休2分班
  49 + this._$_bx_desc; // 班型描述(默认为路牌编号)
  50 +
  51 + // 其他班次(进出场,例包,吃饭等),TODO:以后再拆
  52 + this._$_other_bc_array = [];
  53 +
  54 + // TODO:
  55 +
  56 +};
  57 +
  58 +//------------------- get/set 方法 -------------------//
  59 +
  60 +InternalLpObj.prototype.getOtherBcArray = function() {
  61 + return this._$_other_bc_array;
  62 +};
  63 +InternalLpObj.prototype.addOtherBcArray = function(ba) {
  64 + this._$_other_bc_array = this._$_other_bc_array.concat(ba);
  65 +};
  66 +
  67 +/**
  68 + * 获取圈
  69 + * @param qIndex 圈index
  70 + */
  71 +InternalLpObj.prototype.getGroup = function(qIndex) {
  72 + return this._$_groupBcArray[qIndex];
  73 +};
  74 +
  75 +/**
  76 + * 获取路牌圈数。
  77 + * @returns {*}
  78 + */
  79 +InternalLpObj.prototype.fnGetGroupCount = function() {
  80 + return this._$_qCount;
  81 +};
  82 +
  83 +/**
  84 + * 是否上行。
  85 + * @returns boolean
  86 + */
  87 +InternalLpObj.prototype.isUp = function() {
  88 + return this._$_isUp;
  89 +};
  90 +
  91 +/**
  92 + * 获取班次。
  93 + * @param qIndex 第几圈
  94 + * @param bcIndex 第几个班次
  95 + */
  96 +InternalLpObj.prototype.getBc = function(qIndex, bcIndex) {
  97 + var group = this._$_groupBcArray[qIndex];
  98 + var bc;
  99 + if (bcIndex == 0) {
  100 + bc = group.getBc1();
  101 + } else if (bcIndex == 1) {
  102 + bc = group.getBc2();
  103 + }
  104 + return bc;
  105 +};
  106 +
  107 +/**
  108 + * 在具体位置设置班次。
  109 + * @param qIndex 第几圈
  110 + * @param bcIndex 第几个班次
  111 + * @param bc 班次对象
  112 + */
  113 +InternalLpObj.prototype.setBc = function(qIndex, bcIndex, bc) {
  114 + var group = this._$_groupBcArray[qIndex];
  115 + if (bcIndex == 0) {
  116 + group.setBc1(bc);
  117 + bc.setGroup(group);
  118 + } else if (bcIndex == 1) {
  119 + group.setBc2(bc);
  120 + bc.setGroup(group);
  121 + }
  122 +};
  123 +
  124 +/**
  125 + * 设置原始路牌对象。
  126 + * @param lpObj 原始路牌对象
  127 + */
  128 +InternalLpObj.prototype.setLp = function(lpObj) {
  129 + this._$$_orign_lp_obj = lpObj;
  130 + var i;
  131 + var group;
  132 + for (i = 0; i < this._$_groupBcArray.length; i++) {
  133 + group = this._$_groupBcArray[i];
  134 + if (group) {
  135 + group.setLp(this); // 圈和班次保存都是 InternalLpObj 对象
  136 + }
  137 + }
  138 +};
  139 +
  140 +InternalLpObj.prototype.getLpNo = function() {
  141 + return this._$$_orign_lp_obj.lpNo;
  142 +};
  143 +InternalLpObj.prototype.getLpName = function() {
  144 + return this._$$_orign_lp_obj.lpName;
  145 +};
  146 +InternalLpObj.prototype.setBxFb5_2 = function(fb) {
  147 + this._$_bx_isfb_5_2 = fb;
  148 +};
  149 +InternalLpObj.prototype.isBxFb5_2 = function() {
  150 + return this._$_bx_isfb_5_2;
  151 +};
  152 +InternalLpObj.prototype.setBxLb = function(lb) {
  153 + this._$_bx_isLb = lb;
  154 +};
  155 +InternalLpObj.prototype.isBxLb = function() {
  156 + return this._$_bx_isLb;
  157 +};
  158 +
  159 +InternalLpObj.prototype.setBxFb = function(fb) {
  160 + this._$_bx_isfb = fb;
  161 +};
  162 +InternalLpObj.prototype.isBxFb = function() {
  163 + return this._$_bx_isfb;
  164 +};
  165 +
  166 +/**
  167 + * 设置路牌的班型描述(最终是设置班次的路牌名字)。
  168 + * @param desc 描述
  169 + */
  170 +InternalLpObj.prototype.setBxDesc = function(desc) {
  171 + // 最终原始路牌的名字
  172 + this._$$_orign_lp_obj.lpName = desc + "_" + this._$$_orign_lp_obj.lpNo;
  173 + // 内部对象的班型描述
  174 + this._$_bx_desc = desc;
  175 +};
  176 +/**
  177 + * 获取版型描述
  178 + * @returns string
  179 + */
  180 +InternalLpObj.prototype.getBxDesc = function() {
  181 + return this._$_bx_desc;
  182 +};
  183 +
  184 +/**
  185 + * 设置纵向最小发车间隔时间。
  186 + * @param v
  187 + */
  188 +InternalLpObj.prototype.setVerticalMinIntervalTime = function(v) {
  189 + // 第一个路牌,都为0
  190 + this._$_minVerticalIntervalTime = v;
  191 +};
  192 +/**
  193 + * 获取纵向最小发车间隔时间。
  194 + * @returns {number|*}
  195 + */
  196 +InternalLpObj.prototype.getVerticalMinIntervalTime = function() {
  197 + return this._$_minVerticalIntervalTime;
  198 +};
  199 +
  200 +/**
  201 + * 设置纵向发车间隔。
  202 + * @param iQindex 圈index
  203 + * @param iBindex 班次index
  204 + * @param iTime 间隔时间
  205 + */
  206 +InternalLpObj.prototype.fnSetVerticalIntervalTime = function(iQindex, iBindex, iTime) {
  207 + this._$_aVerticalIntervalTime[iQindex][iBindex] = iTime;
  208 +};
  209 +
  210 +/**
  211 + * 返回纵向发车间隔。
  212 + * @param iQindex 圈index
  213 + * @param iBindex 班次index
  214 + */
  215 +InternalLpObj.prototype.fnGetVerticalIntervalTime = function(iQindex, iBindex) {
  216 + return this._$_aVerticalIntervalTime[iQindex][iBindex];
  217 +};
  218 +
  219 +//-------------------- 班次操作方法(查询,统计,删除) -----------------------//
  220 +
  221 +/**
  222 + * 返回总共班次数。
  223 + */
  224 +InternalLpObj.prototype.getBcCount = function() {
  225 + var i;
  226 + var group;
  227 + var bccount = 0;
  228 + for (i = 0; i < this._$_groupBcArray.length; i++) {
  229 + group = this._$_groupBcArray[i];
  230 + if (group) {
  231 + if (group.getBc1()) {
  232 + bccount += 1;
  233 + }
  234 + if (group.getBc2()) {
  235 + bccount += 1;
  236 + }
  237 + }
  238 + }
  239 +
  240 + return bccount;
  241 +};
  242 +
  243 +/**
  244 + * 返回班次列表,过滤空的班次,将所有存在的班次连成连续的对象数组返回。
  245 + * @returns arrays (InternalBcObj)
  246 + */
  247 +InternalLpObj.prototype.getBcArray = function() {
  248 + var bcArray = [];
  249 + var i;
  250 + var group;
  251 + for (i = 0; i < this._$_groupBcArray.length; i++) {
  252 + group = this._$_groupBcArray[i];
  253 + if (group) {
  254 + group.getBc1() ? bcArray.push(group.getBc1()) : "";
  255 + group.getBc2() ? bcArray.push(group.getBc2()) : "";
  256 + }
  257 + }
  258 +
  259 + return bcArray;
  260 +};
  261 +
  262 +/**
  263 + * 获取最小(最早)班次对象。
  264 + * @returns [{圈index},{班次index}]
  265 + */
  266 +InternalLpObj.prototype.getMinBcObjPosition = function() {
  267 + var i;
  268 + var bIndex = [];
  269 + for (i = 0; i < this._$_groupBcArray.length; i++) {
  270 + if (this._$_groupBcArray[i].getBc1()) {
  271 + bIndex.push(i);
  272 + bIndex.push(0);
  273 + break;
  274 + }
  275 + if (this._$_groupBcArray[i].getBc2()) {
  276 + bIndex.push(i);
  277 + bIndex.push(1);
  278 + break;
  279 + }
  280 + }
  281 + return bIndex;
  282 +};
  283 +
  284 +/**
  285 + * 获取最大(最晚)班次对象。
  286 + * @returns [{圈index},{班次index}]
  287 + */
  288 +InternalLpObj.prototype.getMaxBcObjPosition = function() {
  289 + var i;
  290 + var bIndex = [];
  291 + for (i = this._$_groupBcArray.length - 1; i >= 0; i--) {
  292 + if (this._$_groupBcArray[i].getBc2()) {
  293 + bIndex.push(i);
  294 + bIndex.push(1);
  295 + break;
  296 + }
  297 + if (this._$_groupBcArray[i].getBc1()) {
  298 + bIndex.push(i);
  299 + bIndex.push(0);
  300 + break;
  301 + }
  302 + }
  303 + return bIndex;
  304 +};
  305 +
  306 +InternalLpObj.prototype.getMinBcObj = function() {
  307 + var i;
  308 + var bcObj;
  309 + for (i = 0; i < this._$_groupBcArray.length; i++) {
  310 + bcObj = this._$_groupBcArray[i].getBc1();
  311 + if (bcObj) {
  312 + break;
  313 + }
  314 + bcObj = this._$_groupBcArray[i].getBc2();
  315 + if (bcObj) {
  316 + break;
  317 + }
  318 + }
  319 + return bcObj;
  320 +};
  321 +InternalLpObj.prototype.getMaxBcObj = function() {
  322 + var i;
  323 + var bcObj;
  324 + for (i = this._$_groupBcArray.length - 1; i >= 0; i--) {
  325 + bcObj = this._$_groupBcArray[i].getBc2();
  326 + if (bcObj) {
  327 + break;
  328 + }
  329 + bcObj = this._$_groupBcArray[i].getBc1();
  330 + if (bcObj) {
  331 + break;
  332 + }
  333 + }
  334 + return bcObj;
  335 +};
  336 +
  337 +/**
  338 + * 获取车次链信息。
  339 + * @param num 第几个车次链
  340 + * @returns object {s_q: {开始圈索引},s_b : {开始班次索引},e_q : {结束圈索引},e_b : {结束班次索引}, bcount : {班次数}}
  341 + */
  342 +InternalLpObj.prototype.fnGetBcChainInfo = function(num) {
  343 + // 计算总的车次链信息
  344 + var aChainInfo = [];
  345 + var oChainInfo;
  346 + var aBcIndex = this.getMinBcObjPosition();
  347 + var oBc;
  348 + var iQIndex;
  349 + var iBcIndex;
  350 + var i;
  351 + var bFlag;
  352 +
  353 + var iBcount = 0;
  354 +
  355 + if (aBcIndex.length == 2) {
  356 + iBcount = 1;
  357 + oChainInfo = {s_q : aBcIndex[0], s_b : aBcIndex[1], e_q : aBcIndex[0], e_b : aBcIndex[1], bcount: 1};
  358 + aChainInfo.push(oChainInfo);
  359 + bFlag = true;
  360 +
  361 + // 下一个班次的索引
  362 + iQIndex = aBcIndex[1] == 0 ? aBcIndex[0] : aBcIndex[0] + 1;
  363 + iBcIndex = aBcIndex[1] == 0 ? 1 : 0;
  364 +
  365 + for (i = iQIndex; i < this._$_qCount; i++) {
  366 + while (iBcIndex <= 1) {
  367 + oBc = this.getBc(i, iBcIndex);
  368 + if (!oBc) {
  369 + if (bFlag) {
  370 + // 车次链结尾是这个班次的前一个班次
  371 + oChainInfo.e_q = iBcIndex == 0 ? i - 1 : i;
  372 + oChainInfo.e_b = iBcIndex == 0 ? 1 : 0;
  373 + oChainInfo.bcount = iBcount;
  374 + }
  375 +
  376 + bFlag = false;
  377 + } else {
  378 + if (bFlag) {
  379 + iBcount ++;
  380 + oChainInfo.bcount = iBcount;
  381 + } else {
  382 + // 下一个车次链开始
  383 + iBcount = 1;
  384 + oChainInfo = {s_q : i, s_b : iBcIndex, e_q : i, e_b : iBcIndex, bcount: 1};
  385 + aChainInfo.push(oChainInfo);
  386 + bFlag = true;
  387 + }
  388 + }
  389 +
  390 +
  391 + iBcIndex ++;
  392 + }
  393 + iBcIndex = 0;
  394 + }
  395 +
  396 + }
  397 +
  398 + return aChainInfo[num];
  399 +};
  400 +
  401 +/**
  402 + * 获取车次链的个数。
  403 + * @returns int
  404 + */
  405 +InternalLpObj.prototype.fnGetBcChainCount = function() {
  406 + var iChainCount = 0;
  407 + var aBcIndex = this.getMinBcObjPosition();
  408 +
  409 + var oBc;
  410 + var iQIndex;
  411 + var iBcIndex;
  412 + var i;
  413 + var bFlag;
  414 +
  415 + if (aBcIndex.length == 2) {
  416 + iChainCount = 1;
  417 + bFlag = true;
  418 +
  419 + // 下一个班次的索引
  420 + iQIndex = aBcIndex[1] == 0 ? aBcIndex[0] : aBcIndex[0] + 1;
  421 + iBcIndex = aBcIndex[1] == 0 ? 1 : 0;
  422 +
  423 + for (i = iQIndex; i < this._$_qCount; i++) {
  424 + while (iBcIndex <= 1) {
  425 + oBc = this.getBc(i, iBcIndex);
  426 + if (!oBc) {
  427 + bFlag = false;
  428 + } else {
  429 + if (bFlag) {
  430 +
  431 + } else {
  432 + iChainCount ++;
  433 + bFlag = true;
  434 + }
  435 + }
  436 +
  437 +
  438 + iBcIndex ++;
  439 + }
  440 + iBcIndex = 0;
  441 + }
  442 +
  443 + }
  444 +
  445 +
  446 + return iChainCount;
  447 +};
  448 +
  449 +/**
  450 + * 在具体位置移除班次。
  451 + * @param qIndex 第几圈
  452 + * @param bcIndex 第几个班次
  453 + */
  454 +InternalLpObj.prototype.removeBc = function(qIndex, bcIndex) {
  455 + var group = this._$_groupBcArray[qIndex];
  456 + if (bcIndex == 0) {
  457 + group.removeBc1();
  458 + } else if (bcIndex == 1) {
  459 + group.removeBc2();
  460 + }
  461 +};
  462 +
  463 +/**
  464 + * 使用指定时间匹配返回离之最近的第几圈第几个班次,
  465 + * 使用时间差的绝度值,比较,取最小的
  466 + * 如果有两个一样的时间差,取比fctime大的时间
  467 + * @param fctime moment 比较用时间
  468 + * @param groupArray 圈数组
  469 + * @param hasUp boolean 计算上行班次
  470 + * @param hasDown boolean 计算下行班次
  471 + * @returns [{第几圈},{第几个班次}]
  472 + */
  473 +InternalLpObj.prototype.fnGetQBcIndexWithFcTimeFromGroupArray = function(
  474 + fctime, groupArray, hasUp, hasDown
  475 +) {
  476 + var i;
  477 + var timediff; // 时间差取绝对值
  478 + var qIndex;
  479 + var bcIndex;
  480 +
  481 + var group;
  482 + var bc1time;
  483 + var bc2time;
  484 +
  485 + var tempdiff;
  486 +
  487 + console.log("比较时间=" + fctime.format("HH:mm"));
  488 +
  489 + for (i = 0; i < this._$_qCount; i++) {
  490 + group = groupArray[i];
  491 + if (group) {
  492 + if (group.getBc1() && hasUp) {
  493 + bc1time = group.getBc1().getFcTimeObj();
  494 + console.log("bc1time=" + bc1time.format("HH:mm") + " tempdiff=" + tempdiff);
  495 + tempdiff = Math.abs(bc1time.diff(fctime));
  496 +
  497 + if (!timediff) {
  498 + timediff = Math.abs(tempdiff);
  499 + qIndex = i;
  500 + bcIndex = 0;
  501 + } else {
  502 + if (tempdiff < timediff) {
  503 + timediff = tempdiff;
  504 + qIndex = i;
  505 + bcIndex = 0;
  506 + } if (Math.abs(tempdiff) == timediff) {
  507 + if (bc1time.isAfter(fctime)) {
  508 + timediff = tempdiff;
  509 + qIndex = i;
  510 + bcIndex = 0;
  511 + }
  512 +
  513 + }
  514 + }
  515 + }
  516 +
  517 + if (group.getBc2() && hasDown) {
  518 + bc2time = group.getBc2().getFcTimeObj();
  519 + console.log("bc2time=" + bc2time.format("HH:mm") + " tempdiff=" + tempdiff);
  520 + tempdiff = Math.abs(bc2time.diff(fctime));
  521 +
  522 + if (!timediff) {
  523 + timediff = Math.abs(tempdiff);
  524 + qIndex = i;
  525 + bcIndex = 1;
  526 + } else {
  527 + if (tempdiff < timediff) {
  528 + timediff = tempdiff;
  529 + qIndex = i;
  530 + bcIndex = 1;
  531 + } if (Math.abs(tempdiff) == timediff) {
  532 + if (bc2time.isBefore(fctime)) {
  533 + timediff = tempdiff;
  534 + qIndex = i;
  535 + bcIndex = 1;
  536 + }
  537 +
  538 + }
  539 + }
  540 + }
  541 + }
  542 + }
  543 +
  544 + console.log("中标线对应数组索引=" + qIndex);
  545 +
  546 + var rst = [];
  547 + rst.push(qIndex);
  548 + rst.push(bcIndex);
  549 +
  550 + return rst;
  551 +};
  552 +
  553 +/**
  554 + * 使用指定时间匹配返回离之最近的第几圈第几个班次,
  555 + * 使用时间差的绝度值,比较,取最小的
  556 + * 如果有两个一样的时间差,取比fctime大的时间
  557 + * @param fctime moment 比较用时间
  558 + * @param hasUp boolean 计算上行班次
  559 + * @param hasDown boolean 计算下行班次
  560 + * @returns [{第几圈},{第几个班次}]
  561 + */
  562 +InternalLpObj.prototype.getQBcIndexWithFcTime = function(
  563 + fctime, hasUp, hasDown
  564 +) {
  565 + return this.fnGetQBcIndexWithFcTimeFromGroupArray(fctime, this._$_groupBcArray, hasUp, hasDown);
  566 +};
  567 +
  568 +//---------------------- 内部数据初始化方法(不同于构造函数)---------------------//
  569 +
  570 +/**
  571 + * 从指定开始时间到结束时间创建不间断班次(连班),并初始化路牌
  572 + * 注意,之前有班次会删除后再创建。
  573 + * @param startTime 开始时间
  574 + * @param endTime 结束时间
  575 + * @param isUp 第一个班次是上行还是下行
  576 + * @param fromQ 从第几圈开始加入
  577 + * @param paramObj 参数对象
  578 + * @param factory 工厂对象
  579 + */
  580 +InternalLpObj.prototype.initDataFromTimeToTime = function(
  581 + startTime,
  582 + endTime,
  583 + isUp,
  584 + fromQ,
  585 + paramObj,
  586 + factory) {
  587 +
  588 + var bcData = []; // 班次数组
  589 + var bcObj;
  590 + var kssj = startTime;
  591 + var fcno = 1; // 发车顺序号
  592 + var bcCount = 1; // 班次数
  593 + do {
  594 + bcObj = factory.createBcObj(
  595 + this, "normal", isUp, fcno, kssj, paramObj); // this就是所属路牌对象
  596 + bcData.push(bcObj);
  597 +
  598 + kssj = paramObj.addMinute(kssj, bcObj.getBcTime() + bcObj.getStopTime());
  599 + fcno ++;
  600 + bcCount ++;
  601 + isUp = !isUp;
  602 + } while(kssj.isBefore(endTime));
  603 + bcCount--;
  604 +
  605 + //console.log("last -1;" + bcData[bcCount -2].getFcTimeObj().format("HH:mm"));
  606 + //console.log("last;" + bcData[bcCount -1].getFcTimeObj().format("HH:mm"));
  607 + //console.log("endtime: " + endTime.format("HH:mm"));
  608 +
  609 + //if (bcCount > 0 && bcData[bcCount - 1].getArrTimeObj().isAfter(endTime)) {
  610 + // // 如果最后一个班次的到达时间超过结束时间,也要去除
  611 + // bcData.splice(bcCount - 1, 1);
  612 + //}
  613 +
  614 + this._initDataFromLbBcArray(bcData, fromQ);
  615 +
  616 +};
  617 +
  618 +/**
  619 + * 使用连班的班次数组初始化路牌(相应的圈会被覆盖)。
  620 + * @param bcArray 连班班次数组
  621 + * @param fromQ 从第几圈开始加入
  622 + */
  623 +InternalLpObj.prototype._initDataFromLbBcArray = function(
  624 + bcArray,
  625 + fromQ
  626 +) {
  627 + var _bc1Obj;
  628 + var _bc2Obj;
  629 + var _qObj;
  630 +
  631 + // 第一班次是上行还是下行
  632 + var isUp = bcArray[0].isUp();
  633 +
  634 + if (bcArray.length > 0 && fromQ < this._$_qCount) {
  635 + // 构造圈数
  636 + if (isUp != this._$_isUp) {
  637 + // 如果方向不一致,意味着第一个班次是半圈
  638 + // 加半圈,并加在bc2上
  639 + _bc2Obj = bcArray.slice(0, 1)[0];
  640 + _qObj = new InternalGroupObj(
  641 + this,
  642 + this._$_isUp,
  643 + undefined,
  644 + _bc2Obj
  645 + );
  646 + _bc2Obj.setGroup(_qObj);
  647 + this._$_groupBcArray[fromQ] = _qObj;
  648 +
  649 + bcArray.splice(0, 1);
  650 + fromQ ++;
  651 + }
  652 +
  653 + var qCount1 = Math.floor(bcArray.length / 2); // 需要添加多少圈
  654 + var qCount2 = bcArray.length % 2; // 最后是否有半圈
  655 +
  656 + while (fromQ < this._$_qCount) {
  657 + if (qCount1 > 0) {
  658 + _bc1Obj = bcArray.slice(0, 1)[0];
  659 + _bc2Obj = bcArray.slice(1, 2)[0];
  660 + _qObj = new InternalGroupObj(
  661 + this,
  662 + this._$_isUp,
  663 + _bc1Obj,
  664 + _bc2Obj
  665 + );
  666 + _bc1Obj.setGroup(_qObj);
  667 + _bc2Obj.setGroup(_qObj);
  668 + this._$_groupBcArray[fromQ] = _qObj;
  669 +
  670 + bcArray.splice(0, 2);
  671 + qCount1 --;
  672 + } else if (qCount2 > 0) {
  673 + // 加半圈,并加在bc1上
  674 + _bc1Obj = bcArray.slice(0, 1)[0];
  675 + _qObj = new InternalGroupObj(
  676 + this,
  677 + this._$_isUp,
  678 + _bc1Obj,
  679 + undefined
  680 + );
  681 + _bc1Obj.setGroup(_qObj);
  682 + this._$_groupBcArray[fromQ] = _qObj;
  683 +
  684 + bcArray.splice(0, 1);
  685 + qCount2 --;
  686 + } else {
  687 + break;
  688 + }
  689 +
  690 + fromQ ++;
  691 + }
  692 + }
  693 +};
  694 +
  695 +//-------------------------- 其他方法 ----------------------------//
  696 +
  697 +/**
  698 + * 从指定位置的班次开始,往后所有的班次修正发车时间
  699 + * @param groupIndex
  700 + * @param bcIndex
  701 + * @param time
  702 + */
  703 +InternalLpObj.prototype.fnAddMinuteToBcFcsj = function(groupIndex, bcIndex, time) {
  704 + var i;
  705 + var oCurBc;
  706 +
  707 + // 修正之前班次的停站时间
  708 + //oCurBc = this.getBc(
  709 + // bcIndex == 0 ? groupIndex - 1 : groupIndex,
  710 + // bcIndex == 1 ? 0 : 1
  711 + //);
  712 + //if (oCurBc) {
  713 + // oCurBc.setStopTime(oCurBc.getStopTime() + time);
  714 + //}
  715 +
  716 +
  717 + for (i = groupIndex; i < this._$_qCount; i++) {
  718 + if (bcIndex == 0) {
  719 + oCurBc = this.getBc(i, 0);
  720 + if (oCurBc) {
  721 + oCurBc.addMinuteToFcsj(time);
  722 + }
  723 + oCurBc = this.getBc(i, 1);
  724 + if (oCurBc) {
  725 + oCurBc.addMinuteToFcsj(time);
  726 + }
  727 +
  728 + } else {
  729 + oCurBc = this.getBc(i, 1);
  730 + if (oCurBc) {
  731 + oCurBc.addMinuteToFcsj(time);
  732 + }
  733 +
  734 + }
  735 +
  736 + bcIndex = 0;
  737 + }
  738 +};
  739 +
  740 +/**
  741 + * 在指定位置添加一个吃饭班次。
  742 + * 注1:吃饭班次不是普通班次,不记录进圈,记录进_$_other_bc_array
  743 + * 注2:添加吃饭班次时,会修改之前班次的停战时间,所以导致之后的班次的停战都会发生变化
  744 + * @param groupIndex
  745 + * @param bcIndex
  746 + * @param factory
  747 + * @param paramObj
  748 + * @returns int 相差时间(吃饭时间距离和停站时间相差值)
  749 + */
  750 +InternalLpObj.prototype.fnAddEatBc = function(groupIndex, bcIndex, factory, paramObj) {
  751 + var oPreBc;
  752 + var oEatBc;
  753 + var iBcModifyTime;
  754 + oPreBc = this.getBc( // 前一个邻接班次
  755 + bcIndex == 0 ? groupIndex - 1 : groupIndex,
  756 + bcIndex == 1 ? 0 : 1);
  757 + if (oPreBc) { // 存在前一个班次
  758 + oEatBc = factory.createBcObj(
  759 + this,
  760 + "cf",
  761 + !oPreBc.isUp(), // 和上一个班次方向相反
  762 + 1,
  763 + paramObj.addMinute(oPreBc.getArrTimeObj(), oPreBc.getStopTime()), // 使用上一个班次的到达时间作为开始时间
  764 + paramObj
  765 + );
  766 +
  767 + //iBcModifyTime = oEatBc.getBcTime() - oPreBc.getStopTime(); // 后续班次要调整的时间
  768 +
  769 + // 修正之后的班次发车时间
  770 + // 注意:之后那个班次发车时间就是吃饭班次的到达时间
  771 + iBcModifyTime = oEatBc.getArrTimeObj().diff(this.getBc(groupIndex, bcIndex).getFcTimeObj(), "m");
  772 + this.fnAddMinuteToBcFcsj(groupIndex, bcIndex, iBcModifyTime);
  773 +
  774 + oPreBc.setStopTime(0); // 不重置停站时间
  775 + oPreBc.fnSetEatTime(oEatBc.getBcTime());
  776 +
  777 + //this._$_other_bc_array.push(oEatBc);
  778 +
  779 + return iBcModifyTime;
  780 + } else {
  781 + return false;
  782 + }
  783 +
  784 +};
  785 +
  786 +/**
  787 + * 调整路牌的班次,通过调整停站时间,或者班次发车时间,不能让班次的到达时间和下一个班次的发车时间重叠。
  788 + * @param iPeakAverStopTime 高峰平均停站时间
  789 + * @param iTroughAverStopTime 低谷平均停站时间
  790 + * @param oParam 参数对象
  791 + */
  792 +InternalLpObj.prototype.fnAdjustBcInterval = function(iPeakAverStopTime, iTroughAverStopTime, oParam) {
  793 + // 获取车次链个数
  794 + var iBcChainCount = this.fnGetBcChainCount();
  795 +
  796 + var i;
  797 + var j;
  798 + var oBcIndex;
  799 + var iQIndex;
  800 + var iBcIndex;
  801 + var iBcCount;
  802 + var oBc;
  803 + var oNextBc;
  804 +
  805 + var iBcStopTime;
  806 +
  807 + for (i = 0; i < iBcChainCount; i++) {
  808 + oBcIndex = this.fnGetBcChainInfo(i);
  809 + iQIndex = oBcIndex["s_q"];
  810 + iBcIndex = oBcIndex["s_b"];
  811 + iBcCount = oBcIndex["bcount"];
  812 +
  813 + for (j = 0; j < iBcCount - 1; j++) {
  814 + oBc = this.getBc(iQIndex, iBcIndex);
  815 + oNextBc = this.getBc(
  816 + iBcIndex == 0 ? iQIndex : iQIndex + 1,
  817 + iBcIndex == 0 ? 1 : 0);
  818 +
  819 + if (oNextBc.fnIsFirstBc()) { // 如果同一路牌连续2个方向首站班次,都不做处理
  820 + continue;
  821 + }
  822 +
  823 + // 不改变当前班次的行驶时间,修正停站时间和下一个班次的发车时间
  824 + iBcStopTime = oNextBc.getFcTimeObj().diff(oBc.getArrTimeObj(), "m");
  825 + if (iBcStopTime < 0) {
  826 + // 当前班次使用最小停站时间
  827 + oBc.setStopTime(oParam.fnCalcuFixedMinStopNumber(oBc.getArrTimeObj(), oBc.isUp()));
  828 + oNextBc.addMinuteToFcsj(oBc.getStopTime() + oBc.fnGetEatTime() - iBcStopTime);
  829 +
  830 + } else {
  831 + if (iBcStopTime == oBc.getStopTime() + oBc.fnGetEatTime()) {
  832 + // 停站时间一致,没有问题
  833 +
  834 +
  835 + } else {
  836 + // TODO:当前班次使用最小停站时间
  837 + oBc.setStopTime(oParam.fnCalcuFixedMinStopNumber(oBc.getArrTimeObj(), oBc.isUp()));
  838 + oNextBc.addMinuteToFcsj(oBc.getStopTime() + oBc.fnGetEatTime() - iBcStopTime);
  839 +
  840 + }
  841 + }
  842 +
  843 + iBcIndex = iBcIndex == 0 ? 1 : 0;
  844 + iQIndex = iBcIndex == 0 ? iQIndex + 1 : iQIndex;
  845 + }
  846 +
  847 + this.getBc(iQIndex, iBcIndex).setStopTime(0);
  848 + }
  849 +
  850 +
  851 +};
  852 +
  853 +/**
  854 + * 调整车次block的班次停站时间,如果不在范围内,调整成平均停站时间。
  855 + * @param oParam {ParameterObj} 参数对象
  856 + */
  857 +InternalLpObj.prototype.fnAdjustBcTime = function(oParam) {
  858 + // 获取车次链个数
  859 + var iBcChainCount = this.fnGetBcChainCount();
  860 +
  861 + var i;
  862 + var j;
  863 + var oBcIndex;
  864 + var iQIndex;
  865 + var iBcIndex;
  866 + var iBcCount;
  867 + var oBc;
  868 + var oNextBc;
  869 +
  870 + var iBcStopTime;
  871 +
  872 + var aRangeStopTime;
  873 +
  874 + for (i = 0; i < iBcChainCount; i++) {
  875 + oBcIndex = this.fnGetBcChainInfo(i);
  876 + iQIndex = oBcIndex["s_q"];
  877 + iBcIndex = oBcIndex["s_b"];
  878 + iBcCount = oBcIndex["bcount"];
  879 +
  880 + for (j = 0; j < iBcCount - 1; j++) {
  881 + oBc = this.getBc(iQIndex, iBcIndex);
  882 + oNextBc = this.getBc(
  883 + iBcIndex == 0 ? iQIndex : iQIndex + 1,
  884 + iBcIndex == 0 ? 1 : 0);
  885 +
  886 + if (oNextBc.fnIsFirstBc()) { // 如果同一路牌连续2个方向首站班次,都不做处理
  887 + // 两个班次都是头班车,则停站时间不考虑范围,直接计算
  888 + iBcStopTime = oNextBc.getFcTimeObj().diff(oBc.getArrTimeObj(), "m");
  889 + oBc.setStopTime(iBcStopTime);
  890 +
  891 + } else {
  892 + // 获取当前班次的停站时间范围
  893 + aRangeStopTime = oParam.calcuTripLayoverTimeRange(
  894 + oBc.getArrTimeObj(), oBc.isUp(), oBc.getBcTime()
  895 + );
  896 + // 获取当前班次停站时间
  897 + iBcStopTime = oNextBc.getFcTimeObj().diff(oBc.getArrTimeObj(), "m");
  898 +
  899 + // 不改变当前班次的行驶时间,修正停站时间和下一个班次的发车时间和停站时间
  900 + if (oBc.fnGetEatTime() > 0) {
  901 + // 当前班次后有吃饭时间, 则没有停站时间了
  902 + oBc.setStopTime(0);
  903 + // 修改下一个班次的发车时间,到达时间
  904 + oNextBc.setFcTimeObj(oParam.addMinute(
  905 + oBc.getArrTimeObj(),
  906 + oBc.fnGetEatTime())
  907 + );
  908 + oNextBc.setArrTimeObj(oParam.addMinute(
  909 + oNextBc.getFcTimeObj(),
  910 + oParam.calcuTravelTime(
  911 + oNextBc.getFcTimeObj(),
  912 + oNextBc.isUp())
  913 + ));
  914 + } else {
  915 + if (iBcStopTime >= aRangeStopTime[0] && iBcStopTime<= aRangeStopTime[1]) {
  916 + // 在范围内,重新设置以下停站时间
  917 + oBc.setStopTime(iBcStopTime);
  918 +
  919 + } else if (iBcStopTime < aRangeStopTime[0]) {
  920 + oBc.setStopTime(aRangeStopTime[0]);
  921 + // 修改下一个班次的发车时间,到达时间
  922 + oNextBc.setFcTimeObj(oParam.addMinute(
  923 + oBc.getArrTimeObj(),
  924 + oBc.getStopTime())
  925 + );
  926 + oNextBc.setArrTimeObj(oParam.addMinute(
  927 + oNextBc.getFcTimeObj(),
  928 + oParam.calcuTravelTime(
  929 + oNextBc.getFcTimeObj(),
  930 + oNextBc.isUp())
  931 + ));
  932 + } else {
  933 + oBc.setStopTime(aRangeStopTime[1]);
  934 + // 修改下一个班次的发车时间,到达时间
  935 + oNextBc.setFcTimeObj(oParam.addMinute(
  936 + oBc.getArrTimeObj(),
  937 + oBc.getStopTime())
  938 + );
  939 + oNextBc.setArrTimeObj(oParam.addMinute(
  940 + oNextBc.getFcTimeObj(),
  941 + oParam.calcuTravelTime(
  942 + oNextBc.getFcTimeObj(),
  943 + oNextBc.isUp())
  944 + ));
  945 + }
  946 + }
  947 + }
  948 +
  949 +
  950 + iBcIndex = iBcIndex == 0 ? 1 : 0;
  951 + iQIndex = iBcIndex == 0 ? iQIndex + 1 : iQIndex;
  952 +
  953 + }
  954 +
  955 + // 最后一个班次停站时间为0
  956 + this.getBc(iQIndex, iBcIndex).setStopTime(0);
  957 + }
  958 +};
  959 +
  960 +/**
  961 + * 是否能调整班次的发车时间。
  962 + * @param oBc 指定班次
  963 + * @param iStep 修正步长
  964 + * @param oParam 参数对象
  965 + */
  966 +InternalLpObj.prototype.isModifyBcFcsj = function(oBc, iStep, oParam) {
  967 + // 获取车次链个数
  968 + var iBcChainCount = this.fnGetBcChainCount();
  969 +
  970 + var i;
  971 + var j;
  972 + var oBcIndex;
  973 + var iQIndex;
  974 + var iBcIndex;
  975 + var iBcCount;
  976 + var oBc;
  977 + var oPreBc;
  978 +
  979 + var iBcStopTime;
  980 +
  981 + var aRangeStopTime;
  982 +
  983 + for (i = 0; i < iBcChainCount; i++) {
  984 + oBcIndex = this.fnGetBcChainInfo(i);
  985 + iQIndex = oBcIndex["s_q"];
  986 + iBcIndex = oBcIndex["s_b"];
  987 + iBcCount = oBcIndex["bcount"];
  988 +
  989 + oPreBc = this.getBc(
  990 + iBcIndex == 0 ? iQIndex - 1 : iQIndex,
  991 + iBcIndex == 0 ? 1 : 0);
  992 +
  993 + // 如果是第一个班次
  994 + if (!oPreBc) {
  995 + if (oBc.fnIsFirstBc()) { // 如果是方向头班车
  996 + return false;
  997 + } else {
  998 + return true;
  999 + }
  1000 + }
  1001 +
  1002 + aRangeStopTime = oParam.calcuTripLayoverTimeRange(
  1003 + oPreBc.getArrTimeObj(), oPreBc.isUp(), oPreBc.getBcTime()
  1004 + );
  1005 + iBcStopTime = oPreBc.getStopTime() + iStep;
  1006 + if (iBcStopTime >= aRangeStopTime[0] && iBcStopTime <= aRangeStopTime[1]) {
  1007 + return true;
  1008 + } else {
  1009 + return false;
  1010 + }
  1011 +
  1012 +
  1013 + }
  1014 +
  1015 +};
  1016 +
  1017 +// TODO
  1018 +
  1019 +/**
  1020 + *
  1021 + *
  1022 + */
  1023 +InternalLpObj.prototype.calcuLpBx = function() {
  1024 +
  1025 +};
  1026 +
  1027 +
... ...
src/main/resources/static/pages/base/timesmodel/js/v2/core/InternalScheduleObj.js
1   -/**
2   - * 内部行车计划对象。
3   - * @constructor
4   - */
5   -var InternalScheduleObj = function(paramObj, lpArray, factory) {
6   - // 参数对象
7   - var _paramObj = paramObj;
8   - // 外部的路牌数组
9   - var _lpArray = lpArray;
10   - // 工厂对象
11   - var _factory = factory;
12   -
13   - //------------------ 初始化方法1,以及计算关联的内部变量 -----------------//
14   - var _qIsUp; // 每一圈是上行开始还是下行开始
15   - var _qCount = 0; // 总的圈数
16   - var _internalLpArray = []; // 内部对象数组
17   - var _aBxDesc = [ // 各种班型描述(班型名称,平均工时,平均需要的班次数,平均工时)
18   - {'sType':'六工一休', 'fHoursV':6.66, 'fBcCount': 0, 'fAverTime': 0},
19   - {'sType':'五工一休', 'fHoursV':6.85, 'fBcCount': 0, 'fAverTime': 0},
20   - {'sType':'四工一休', 'fHoursV':7.14, 'fBcCount': 0, 'fAverTime': 0},
21   - {'sType':'三工一休', 'fHoursV':7.61, 'fBcCount': 0, 'fAverTime': 0},
22   - {'sType':'二工一休', 'fHoursV':8.57, 'fBcCount': 0, 'fAverTime': 0},
23   - {'sType':'一工一休', 'fHoursV':11.42, 'fBcCount': 0, 'fAverTime': 0},
24   - {'sType':'五工二休', 'fHoursV':7.99, 'fBcCount': 0, 'fAverTime': 0},
25   - {'sType':'无工休', 'fHoursV':5.43, 'fBcCount': 0, 'fAverTime': 0}
26   - ];
27   -
28   - var _fnInitFun1 = function() { // 初始化方法1
29   - console.log("//---------------- 行车计划,初始化方法1 start ----------------//");
30   -
31   - //----------------------- 1、确定上标线的方向,圈的方向 -------------------//
32   -
33   - // 确定_qIsUp,哪个方向的首班车晚就用哪个
34   - _qIsUp = _paramObj.getUpFirstDTimeObj().isBefore(
35   - _paramObj.getDownFirstDTimeObj()) ? false : true;
36   - // 上标线开始时间,就是方向的首班车时间
37   - var st = _qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();
38   - // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向
39   - var et;
40   - var et_IsUp;
41   - if (_paramObj.getUpLastDtimeObj().isBefore(
42   - _paramObj.getDownLastDTimeObj())) {
43   - et = _paramObj.getDownLastDTimeObj();
44   - et_IsUp = false;
45   - } else {
46   - et = _paramObj.getUpLastDtimeObj();
47   - et_IsUp = true;
48   - }
49   -
50   - //------------------------ 2、计算总共有多少圈 ------------------------//
51   -
52   - // 以开始时间,结束时间,构造上标线用连班班次发车时间
53   - var bcFcsjArrays = []; // 班次发车时间对象数组
54   - var bcArsjArrays = []; // 班次到达时间对象数组
55   - var isUp = _qIsUp; // 方向
56   - var bcCount = 1; // 班次数
57   -
58   - var _kssj = st; // 开始时间
59   - var _bcsj = paramObj.calcuTravelTime(_kssj, isUp); // 班次历时
60   - var _arrsj = paramObj.addMinute(_kssj, _bcsj); // 到达时间
61   - var _stoptime = paramObj.fnCalcuFixedStopNumber(_arrsj, !isUp, _bcsj); // 停站时间
62   -
63   - do {
64   - bcFcsjArrays.push(_kssj);
65   - bcArsjArrays.push(_arrsj);
66   -
67   - _kssj = paramObj.addMinute(_kssj, _bcsj + _stoptime);
68   - _bcsj = paramObj.calcuTravelTime(_kssj, isUp);
69   - _arrsj = paramObj.addMinute(_kssj, _bcsj);
70   - _stoptime = paramObj.fnCalcuFixedStopNumber(_arrsj, !isUp, _bcsj);
71   -
72   - bcCount ++;
73   - isUp = !isUp;
74   - } while(_kssj.isBefore(et));
75   - bcCount--; // 因为先做do,所以总的班次要减1
76   - //if (bcCount > 0 && bcArsjArrays[bcCount - 1].isAfter(et)) {
77   - // // 如果最后一个班次的到达时间超过结束时间,也要去除
78   - // bcFcsjArrays.splice(bcCount - 1, 1);
79   - // bcArsjArrays.splice(bcCount - 1, 1);
80   - // bcCount--;
81   - //}
82   - var _qCount_p1 = Math.floor(bcCount / 2); // 2个班次一圈
83   - var _qCount_p2 = bcCount % 2; // 余下的1个班次也算一圈
84   -
85   - // 利用连班数组计算圈数
86   - _qCount = 1; // 前面加1圈,补中标线的班次
87   - _qCount += _qCount_p1;
88   - _qCount += _qCount_p2;
89   -
90   - // 计算最后是不是还要补一圈
91   - if (_qCount > 1) { // 总的圈数就1圈,没必要加了(其实是不可能的,除非参数里问题)
92   - if (_qCount_p2 == 0) { // 没有余下班次,整数圈数
93   - // 最后一个班次的方向一定和开始的方向相反,如:上-下,上-下,上-下,一共三圈,最后一个班次为下行
94   - // 判定最后一个班次的方向和上标线判定结束时间的班次方向是否一致
95   - if (!_qIsUp == et_IsUp) {
96   - // 一致不用加圈数
97   - } else {
98   - // 不一致需要加圈补最后一个结束时间班次
99   - _qCount ++;
100   - }
101   - } else {
102   - // 有余下的圈数,最后要不补的班次不管上行,下行都在这一圈里
103   - // 不需要在补圈数了
104   - }
105   - }
106   -
107   - //------------------------ 3、根据路牌数,圈数创建路牌对象 ----------------------//
108   -
109   - // 创建内部的路牌数组,并把之前的连班路牌添加进上标线路牌中
110   - var i;
111   - for (i = 0; i < _lpArray.length; i++) {
112   - _internalLpArray.push(new InternalLpObj(_lpArray[i], _qCount, _qIsUp));
113   - }
114   - // 初始化上标线,从第1圈开始
115   - _internalLpArray[0].initDataFromTimeToTime(bcFcsjArrays[0], et, _qIsUp, 1, _paramObj, _factory);
116   -
117   - // 以上标线为基础,计算各种班型工时对应的圈数、班次数
118   - var aBcArray = _internalLpArray[0].getBcArray();
119   - aBcArray[0].fnSetIsFirstBc(true); // 设置首班班次标识
120   -
121   - if (aBcArray.length % 2 != 0) { // 不能整除2,去除一个班次计算
122   - aBcArray.splice(aBcArray.length - 1, 1);
123   - }
124   -
125   - // 午饭吃饭时间
126   - var iLTime = _paramObj.fnGetLunchTime();
127   - // 晚饭吃饭时间
128   - var iDTime = _paramObj.fnGetDinnerTime();
129   - // 出场时间
130   - var iOutTime = _qIsUp ? _paramObj.getUpOutTime() : _paramObj.getDownOutTime();
131   - // 进场时间
132   - var iInTime = _qIsUp ? _paramObj.getDownInTime() : _paramObj.getUpInTime();
133   - // 例保时间
134   - var iBTime = _paramObj.getLbTime();
135   -
136   - var sum = 0; // 总班次时间
137   - for (i = 0; i < aBcArray.length; i++) {
138   - sum += aBcArray[i].getBcTime() + aBcArray[i].getStopTime();
139   - }
140   - sum += iLTime; // 加午饭时间
141   - sum += iDTime; // 加晚饭时间
142   - for (i = 0; i < _aBxDesc.length; i++) {
143   - _aBxDesc[i].fAverTime = sum / (aBcArray.length / 2); // 平均周转时间不算进出场,例保时间
144   -
145   - // 计算5休2的班次数(双进出场,4个例保)
146   - if (i == 6) {
147   - _aBxDesc[i].fQCount =
148   - (_aBxDesc[i].fHoursV * 60 - iOutTime * 2 - iInTime * 2 - iBTime * 4) /
149   - _aBxDesc[i].fAverTime;
150   - _aBxDesc[i].fBcCount = _aBxDesc[i].fQCount * 2;
151   - } else { // 进出场,2个例保
152   - _aBxDesc[i].fQCount =
153   - (_aBxDesc[i].fHoursV * 60 - iOutTime - iInTime - iBTime * 2) /
154   - _aBxDesc[i].fAverTime;
155   - _aBxDesc[i].fBcCount = _aBxDesc[i].fQCount * 2;
156   - }
157   - }
158   -
159   -
160   - // 在第一个班次之前再添加一个模拟班次,用于中标线的作用
161   - // 那一圈必定是低谷,而且圈索引0,班次索引1,暂时标记,最后删除
162   - var iFirstStopTime =
163   - _paramObj.fnCalcuFixedStopNumber(
164   - _paramObj.addMinute(aBcArray[0].getFcTimeObj(), -10),
165   - _qIsUp
166   - );
167   - var iXXTime = _qIsUp ? _paramObj.getDownTroughTime() : _paramObj.getUpTroughTime();
168   - var oFlagBc = _factory.createBcObj( // 标记班次
169   - _internalLpArray[0],
170   - "normal",
171   - !_qIsUp,
172   - 1,
173   - _paramObj.addMinute(aBcArray[0].getFcTimeObj(), -(iFirstStopTime + iXXTime)),
174   - _paramObj
175   - );
176   - oFlagBc.fnSetDelFlag(true); // 标记了删除记号
177   -
178   - _internalLpArray[0].setBc(0, 1, oFlagBc);
179   -
180   - // 在最后一圈也补上一个或者2个模拟班次,暂时标记,最后需要删除
181   - var aMaxBcIndex = _internalLpArray[0].getMaxBcObjPosition();
182   - if (aMaxBcIndex[0] == _qCount - 1) { // 可能加半圈
183   - oFlagBc = _factory.createBcObj( // 标记班次
184   - _internalLpArray[0],
185   - "normal",
186   - !_qIsUp,
187   - 1,
188   - _paramObj.addMinute(
189   - _internalLpArray[0].getBc(_qCount - 1, 0).getArrTimeObj(),
190   - _internalLpArray[0].getBc(_qCount - 1, 0).getStopTime()),
191   - _paramObj
192   - );
193   - oFlagBc.fnSetDelFlag(true); // 标记了删除记号
194   - _internalLpArray[0].setBc(_qCount - 1, 1, oFlagBc);
195   -
196   - } else { // 加完整的一圈
197   - oFlagBc = _factory.createBcObj( // 标记班次
198   - _internalLpArray[0],
199   - "normal",
200   - _qIsUp,
201   - 1,
202   - _paramObj.addMinute(
203   - _internalLpArray[0].getBc(_qCount - 2, 1).getArrTimeObj(),
204   - _internalLpArray[0].getBc(_qCount - 2, 1).getStopTime()),
205   - _paramObj
206   - );
207   - oFlagBc.fnSetDelFlag(true); // 标记了删除记号
208   - _internalLpArray[0].setBc(_qCount - 1, 0, oFlagBc);
209   -
210   - oFlagBc = _factory.createBcObj( // 标记班次
211   - _internalLpArray[0],
212   - "normal",
213   - !_qIsUp,
214   - 1,
215   - _paramObj.addMinute(
216   - _internalLpArray[0].getBc(_qCount - 1, 0).getArrTimeObj(),
217   - _internalLpArray[0].getBc(_qCount - 1, 0).getStopTime()),
218   - _paramObj
219   - );
220   - oFlagBc.fnSetDelFlag(true); // 标记了删除记号
221   - _internalLpArray[0].setBc(_qCount - 1, 1, oFlagBc);
222   -
223   - }
224   -
225   - console.log("上行首班车时间:" + _paramObj.getUpFirstDTimeObj().format("HH:mm") +
226   - "上行末班车时间:" + _paramObj.getUpLastDtimeObj().format("HH:mm"));
227   - console.log("下行首班车时间:" + _paramObj.getDownFirstDTimeObj().format("HH:mm") +
228   - "下行末班车时间:" + _paramObj.getDownLastDTimeObj().format("HH:mm"));
229   - console.log("总共计算的圈数:" + _qCount);
230   - console.log("圈的方向isUP:" + _qIsUp);
231   - console.log("班型描述(以下):");
232   - console.log(_aBxDesc);
233   - console.log("所有路牌间隔描述(以下):");
234   - for (i = 0; i < _internalLpArray.length; i++) {
235   - console.log(_internalLpArray[i]._$_aVerticalIntervalTime);
236   - }
237   - console.log("//---------------- 行车计划,初始化方法1 end ----------------//");
238   -
239   - };
240   -
241   - //------------------ 初始化方法2,以及计算关联的内部变量 ----------------//
242   - var _approximate_zgfQIndex; // 预估早高峰车辆从第几圈开始全部发出
243   - var _approximate_zgfBIndex; // 预估早高峰车辆从第几圈第几个班次开始全部发出(上行或下行)
244   - var _approximate_wgfQIndex; // 预估晚高峰车辆从第几圈开始全部发出
245   - var _approximate_wgfBIndex; // 预估晚高峰车辆从第几圈第几个班次开始全部发出(上行或下行)
246   -
247   - var _fnInitFun2 = function() { // 初始化方法2
248   - console.log("//---------------- 行车计划,初始化方法2 start ----------------//");
249   -
250   - //------------------------ 1、计算车辆总数 ------------------------//
251   - // 是用高峰上行周转时间除以高峰平均间隔得到的
252   - // 这样算还算合理,车辆不多不少,待以后有新的算法再修正
253   - var iClCount = _paramObj.calcuClzx();
254   -
255   - //------------------------ 2、计算所有路牌的发车在各个圈中的间隔 --------------------//
256   - var i;
257   - var j;
258   - var iBindex = 1;
259   - var iZzsj;
260   - var oLp;
261   - var iC1;
262   - var iC2;
263   -
264   - for (i = 0; i < _qCount - 1; i++) {
265   - while (iBindex <= 1) {
266   - // 每圈每个方向的周转时间不一致,以上标线为主
267   - oLp = _internalLpArray[0];
268   - iZzsj = oLp.getBc(i + 1, iBindex).getFcTimeObj().diff(
269   - oLp.getBc(i, iBindex).getFcTimeObj(), "m"
270   - );
271   -
272   - iC1 = Math.floor(iZzsj / iClCount);
273   - iC2 = iZzsj % iClCount;
274   -
275   - for (j = 0; j < iClCount - iC2; j++) {
276   - oLp = _internalLpArray[j];
277   - oLp.fnSetVerticalIntervalTime(i, iBindex, iC1);
278   - }
279   -
280   - for (j = 0; j < iC2; j++) {
281   - oLp = _internalLpArray[iClCount - iC2 + j];
282   - oLp.fnSetVerticalIntervalTime(i, iBindex, iC1 + 1);
283   - }
284   -
285   - iBindex ++;
286   -
287   - }
288   - iBindex = 0;
289   - }
290   - // 最后一圈没有下一圈的参照,周转时间没发获取,由于都是低谷,所以使用倒数第二圈的间隔最为最后一圈的间隔
291   - for (i = 0; i < _internalLpArray.length; i++) {
292   - oLp = _internalLpArray[i];
293   - oLp.fnSetVerticalIntervalTime(_qCount - 1, 0, oLp.fnGetVerticalIntervalTime(_qCount - 2, 0));
294   - oLp.fnSetVerticalIntervalTime(_qCount - 1, 1, oLp.fnGetVerticalIntervalTime(_qCount - 2, 1));
295   - }
296   -
297   - //------------------------ 3、预估早高峰全部出车第几圈第几个班次全部出车,计算路牌之间的发车间隔 ------------------//
298   -
299   - // 以上标线为标准,查找离早高峰开始时间最近的班次作为早高峰开始班次
300   - // 以这个班次为早高峰起点,全部出车策略
301   - var qbcIndexArray = _internalLpArray[0].getQBcIndexWithFcTime(
302   - _paramObj.getMPeakStartTimeObj(), true, true);
303   - var qIndex = qbcIndexArray[0]; // 第几圈
304   - var bIndex = qbcIndexArray[1]; // 第几个班次
305   -
306   - for (i = 1; i < _internalLpArray.length; i++) {
307   - _fnGenerateBcAndSetBc(i, qIndex, bIndex);
308   - }
309   -
310   - _approximate_zgfQIndex = qIndex;
311   - _approximate_zgfBIndex = bIndex;
312   -
313   - //------------------------ 4、预估晚高峰全部出车第几圈第几个班次全部出车,计算路牌之间的发车间隔 ------------------//
314   -
315   - // 以上标线为标准,查找离晚高峰开始时间最近的班次作为晚高峰开始班次
316   - // 以这个班次为早高峰起点,全部出车策略
317   - qbcIndexArray = _internalLpArray[0].getQBcIndexWithFcTime(
318   - _paramObj.getEPeakStartTimeObj(), true, true);
319   - qIndex = qbcIndexArray[0]; // 第几圈
320   - bIndex = qbcIndexArray[1]; // 第几个班次
321   -
322   - for (i = 1; i < _internalLpArray.length; i++) {
323   - _fnGenerateBcAndSetBc(i, qIndex, bIndex);
324   - }
325   -
326   - _approximate_wgfQIndex = qIndex;
327   - _approximate_wgfBIndex = bIndex;
328   -
329   - console.log("早高峰周转时间(固定最大停战时间):" + _paramObj.calcuPeakZzsj() + "分钟");
330   - console.log("早高峰发车时间范围:" + _paramObj.getMPeakMinFcjx() + "分钟 --- " + _paramObj.getMPeakMaxFcjx() + "分钟");
331   - console.log("预估早高峰第" + _approximate_zgfQIndex + "(index)圈,第" + _approximate_zgfBIndex + "(index)班次车辆全部发出");
332   - console.log("预估晚高峰第" + _approximate_wgfQIndex + "(index)圈,第" + _approximate_wgfBIndex + "(index)班次车辆全部发出");
333   - console.log("//---------------- 行车计划,初始化方法2 end ----------------//");
334   - };
335   -
336   - //----------------------- 初始化方法3,计算连班分班的路牌分布 ----------------//
337   - var _iBx_lb_lpcount; // 连班路牌数
338   - var _iBx_5_2_fb_lpcount; // 5休2分班路牌数
339   - var _iBx_other_fb_lpcount; // 其他分班路牌数
340   -
341   - var _fnInitFun3 = function() { // 初始化方法3
342   - console.log("//---------------- 行车计划,初始化方法3 start ----------------//");
343   -
344   - //--------------------- 1、计算分班连班班型车辆分布数 --------------------//
345   - // 总共车辆数(高峰最大车辆数)
346   - var iCls = _paramObj.calcuClzx();
347   - // 低谷最少配车(连班车数量)
348   - var iDgminpc = Math.round(_paramObj.calcuTroughZzsj() / _paramObj.getTroughMaxFcjx());
349   - // 加班车路牌数(做5休2的路牌数)
350   - var i_5_2_lpes = _paramObj.getJBLpes();
351   -
352   - // 做些简单的验证
353   - if (iCls < iDgminpc) {
354   - alert("总配车数小于低谷最小配车");
355   - throw "总配车数小于低谷最小配车";
356   - }
357   -
358   - if (iDgminpc < 2) {
359   - // alert("连班路牌小于2,办不到啊");
360   - // throw "连班路牌小于2,办不到啊";
361   - console.log("连班路牌小于2,则5休2之外的车辆数则为连班车辆数");
362   - iDgminpc = iCls - i_5_2_lpes;
363   - }
364   - if (iCls - iDgminpc < i_5_2_lpes) {
365   - // alert("总分班路牌数小于加班路牌数");
366   - // throw "总分班路牌数小于加班路牌数";
367   - console.log("总分班路牌数小于加班路牌数,则忽略其他分班路牌数");
368   - iDgminpc = iCls - i_5_2_lpes;
369   - }
370   -
371   - //// 修正连班路牌数,班次间隔大于20的,加1,直至班次间隔小于20
372   - //while(_paramObj.calcuPeakZzsj() / iDgminpc > 20) {
373   - // iDgminpc ++;
374   - //}
375   - _iBx_lb_lpcount = iDgminpc;
376   -
377   - _iBx_5_2_fb_lpcount = i_5_2_lpes;
378   - _iBx_other_fb_lpcount = iCls - _iBx_lb_lpcount - i_5_2_lpes;
379   -
380   - //------------------------ 2、利用间隔法计算连班路牌分布 --------------------//
381   - var i;
382   - var j;
383   - var iC1 = Math.floor(_internalLpArray.length / _iBx_lb_lpcount);
384   - var iC2 = _internalLpArray.length % _iBx_lb_lpcount;
385   - var iLpIndex;
386   -
387   - for (i = 0; i < _iBx_lb_lpcount - iC2; i++) {
388   - iLpIndex = i * iC1;
389   - _internalLpArray[iLpIndex].setBxLb(true);
390   - _internalLpArray[iLpIndex].setBxDesc("连班");
391   - }
392   - for (j = 0; j < iC2; j++) {
393   - iLpIndex = i * iC1 + j * (iC1 + 1);
394   - _internalLpArray[iLpIndex].setBxLb(true);
395   - _internalLpArray[iLpIndex].setBxDesc("连班");
396   - }
397   -
398   - //------------------------ 3、利用间隔法计算分班班型路牌分布 --------------------//
399   - // 获取分班路牌索引
400   - var aNotLbIndexes = [];
401   - for (i = 0; i < _internalLpArray.length; i++) {
402   - if (!_internalLpArray[i].isBxLb()) {
403   - aNotLbIndexes.push(i);
404   - }
405   - }
406   - // 先5休2分班
407   - iC1 = Math.floor(aNotLbIndexes.length / _iBx_5_2_fb_lpcount);
408   - iC2 = aNotLbIndexes.length % _iBx_5_2_fb_lpcount;
409   -
410   - for (i = 0; i < _iBx_5_2_fb_lpcount - iC2; i++) {
411   - iLpIndex = aNotLbIndexes[i * iC1];
412   - _internalLpArray[iLpIndex].setBxLb(false);
413   - _internalLpArray[iLpIndex].setBxFb(true);
414   - _internalLpArray[iLpIndex].setBxFb5_2(true);
415   - _internalLpArray[iLpIndex].setBxDesc("5休2分班");
416   - }
417   - for (i = 0; i < iC2; i++) {
418   - iLpIndex = aNotLbIndexes[_iBx_5_2_fb_lpcount - iC2 + i * (iC1 + 1)];
419   - _internalLpArray[iLpIndex].setBxLb(false);
420   - _internalLpArray[iLpIndex].setBxFb(true);
421   - _internalLpArray[iLpIndex].setBxFb5_2(true);
422   - _internalLpArray[iLpIndex].setBxDesc("5休2分班");
423   - }
424   - // 其他分班
425   - for (i = 0; i < aNotLbIndexes.length; i++) {
426   - iLpIndex = aNotLbIndexes[i];
427   - if (!_internalLpArray[iLpIndex].isBxFb5_2()) {
428   - _internalLpArray[iLpIndex].setBxLb(false);
429   - _internalLpArray[iLpIndex].setBxFb(true);
430   - _internalLpArray[iLpIndex].setBxFb5_2(false);
431   - _internalLpArray[iLpIndex].setBxDesc("其他分班");
432   - }
433   - }
434   -
435   - console.log("高峰周转时间:" + _paramObj.calcuPeakZzsj());
436   - console.log("连班路牌数:" + _iBx_lb_lpcount);
437   - console.log("5休2分班路牌数:" + _iBx_5_2_fb_lpcount);
438   - console.log("其他分班路牌数:" + _iBx_other_fb_lpcount);
439   - var aLbIndexes = [];
440   - for (i = 0; i < _internalLpArray.length; i++) {
441   - if (_internalLpArray[i].isBxLb()) {
442   - aLbIndexes.push(i);
443   - }
444   - }
445   - console.log("连班路牌indexes=" + aLbIndexes);
446   - var a_5_2_fbIndexes = [];
447   - for (i = 0; i < _internalLpArray.length; i++) {
448   - if (_internalLpArray[i].isBxFb() && _internalLpArray[i].isBxFb5_2()) {
449   - a_5_2_fbIndexes.push(i);
450   - }
451   - }
452   - console.log("5休2分班路牌indexes=" + a_5_2_fbIndexes);
453   - var a_other_fbIndexes = [];
454   - for (i = 0; i < _internalLpArray.length; i++) {
455   - if (_internalLpArray[i].isBxFb() && !_internalLpArray[i].isBxFb5_2()) {
456   - a_other_fbIndexes.push(i);
457   - }
458   - }
459   - console.log("其他分班路牌indexes=" + a_other_fbIndexes);
460   -
461   - console.log("//---------------- 行车计划,初始化方法3 end ----------------//");
462   - };
463   -
464   - //----------------------- 初始化方法4,计算中标线位置 -------------------------//
465   - var _iZbx_lpIndex; // 中标线对应第几个路牌
466   -
467   - var _fnInitFun4 = function() { // 初始化方法4
468   - console.log("//---------------- 行车计划,初始化方法4 start ----------------//");
469   -
470   - //---------------------------- 1、模拟一个中标线,使用临时路牌 ----------------------//
471   - // 构造中标线
472   - // 中标线开始时间,就是方向的首班车时间
473   - var oSt = !_qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();
474   - // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向
475   - // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向
476   - var oEt;
477   - if (_paramObj.getUpLastDtimeObj().isBefore(
478   - _paramObj.getDownLastDTimeObj())) {
479   - oEt = _paramObj.getDownLastDTimeObj();
480   - } else {
481   - oEt = _paramObj.getUpLastDtimeObj();
482   - }
483   -
484   - var oTempLp = new InternalLpObj({lpNo: -999, lpName: "-999"}, _qCount, _qIsUp);
485   - oTempLp.initDataFromTimeToTime(
486   - oSt,
487   - oEt,
488   - !_qIsUp,
489   - 0,
490   - _paramObj,
491   - _factory
492   - );
493   -
494   - //------------------------ 2、找出中标线的早高峰班次,计算应该插在当前路牌数组的那个位置 ----------------//
495   - // 找出中标线对应的早高峰的班次对象
496   - var oZb_gf_bc = oTempLp.getBc(_approximate_zgfQIndex, _approximate_zgfBIndex);
497   - //alert(oZb_gf_bc.getFcTimeObj().format("HH:mm"));
498   -
499   - // 把所有连班路牌高峰班次重新构造成一个一个的圈数组,计算对应中标线最近的是第几个路牌
500   - // 中标线和上标线一样在连班路牌上
501   - var aTempq = [];
502   - var oTempq;
503   - var oTempb;
504   - var i;
505   - var oLp;
506   -
507   - var aLbIndexes = []; // 连班的路牌索引
508   - for (i = 0; i < _internalLpArray.length; i++) {
509   - if (_internalLpArray[i].isBxLb()) {
510   - aLbIndexes.push(i);
511   - }
512   - }
513   -
514   - for (i = 0; i < aLbIndexes.length; i++) {
515   - oLp = _internalLpArray[aLbIndexes[i]];
516   -
517   - oTempb = oLp.getBc(_approximate_zgfQIndex, _approximate_zgfBIndex);
518   - if (oTempb.isUp() == _qIsUp) {
519   - oTempq = new InternalGroupObj(oLp, _qIsUp, oTempb, undefined);
520   - } else {
521   - oTempq = new InternalGroupObj(oLp, _qIsUp, undefined, oTempb);
522   - }
523   - aTempq.push(oTempq);
524   -
525   - }
526   -
527   - var aTtindex = oTempLp.fnGetQBcIndexWithFcTimeFromGroupArray( // 找出最接近中标线的路牌索引
528   - oZb_gf_bc.getFcTimeObj(),
529   - aTempq,
530   - true,
531   - true
532   - );
533   -
534   - _iZbx_lpIndex = aLbIndexes[aTtindex[0]]; // 中标线放在第几个路牌
535   -
536   - oTempLp.getMinBcObj().fnSetIsFirstBc(true); // 设置首班班次标识
537   -
538   - if (_iZbx_lpIndex == 0) { // 如果中标线和上标线一致
539   - var oFirstBcIndexes = oTempLp.getMinBcObjPosition();
540   - var oFirstBc = oTempLp.getMinBcObj();
541   - oFirstBc.setLp(_internalLpArray[_iZbx_lpIndex]);
542   - oFirstBc.fnSetDelFlag(false);
543   - _internalLpArray[_iZbx_lpIndex].setBc(oFirstBcIndexes[0], oFirstBcIndexes[1], oFirstBc);
544   - } else {
545   - oTempLp.setLp(_lpArray[_iZbx_lpIndex]); // 设置原始路牌对象
546   - oTempLp._$_aVerticalIntervalTime = _internalLpArray[_iZbx_lpIndex]._$_aVerticalIntervalTime; // 设置纵向最小发车间隔
547   - oTempLp.setBxLb(_internalLpArray[_iZbx_lpIndex].isBxLb());
548   - oTempLp.setBxFb(_internalLpArray[_iZbx_lpIndex].isBxFb());
549   - oTempLp.setBxFb5_2(_internalLpArray[_iZbx_lpIndex].isBxFb5_2());
550   -
551   - // 修正除了第一个班次外,其余其他班次
552   - var iBcindex = 0;
553   - for (i = 1; i < _qCount; i++) {
554   - while (iBcindex <= 1) {
555   - if (oTempLp.getBc(i, iBcindex)) { // 替换存在的班次
556   - oTempLp.setBc(i, iBcindex, _fnGenerateBc(_iZbx_lpIndex, i, iBcindex));
557   - }
558   - iBcindex ++;
559   - }
560   - iBcindex = 0;
561   - }
562   -
563   - _internalLpArray[_iZbx_lpIndex] = oTempLp;
564   - }
565   -
566   - console.log("中标线对应第" + (_iZbx_lpIndex + 1) + "个路牌");
567   -
568   - console.log("//---------------- 行车计划,初始化方法4 end ----------------//");
569   - };
570   -
571   - //-------------------- 重要的内部方法 -----------------------//
572   - /**
573   - * 核心方法,利用路牌间隔纵向生成班次。
574   - * @param iLpindex 路牌索引
575   - * @param iQindex 圈索引
576   - * @param iBcindex 班次索引
577   - * @returns object InternalBcObj,失败 false
578   - */
579   - var _fnGenerateBc = function(iLpindex, iQindex, iBcindex) {
580   - // 以上标线为起始点,使用路牌在不同圈,班次索引的发车间隔,计算班次
581   - // 注意,发车间隔是指下一个班次应该距离当前班次间隔,是从下往上的
582   -
583   - // 1、参数验证
584   - if (iLpindex == 0) { // 上标线的班次不需要生成
585   - return false;
586   - }
587   -
588   - // 2、计算间隔
589   - var i;
590   - var oLp;
591   - var iTime = 0;
592   - for (i = 0; i < iLpindex; i++) {
593   - oLp = _internalLpArray[i];
594   - iTime += oLp.fnGetVerticalIntervalTime(iQindex, iBcindex);
595   - }
596   -
597   - // 3、生成班次
598   - var _oKsbc = _internalLpArray[0].getBc(iQindex, iBcindex);
599   - if (!_oKsbc) {
600   - return false;
601   - }
602   - var _oKssj = _paramObj.addMinute(_oKsbc.getFcTimeObj(), iTime);
603   - var _oBc = _factory.createBcObj(
604   - _internalLpArray[iLpindex],
605   - "normal", _oKsbc.isUp(),
606   - 1, _oKssj, _paramObj);
607   -
608   - return _oBc;
609   -
610   - };
611   -
612   - /**
613   - * 核心方法,在指定位置生成班次并添加到路牌指定位置中。
614   - * @param lpIndex 第几个路牌
615   - * @param qIndex 第几圈
616   - * @param bcIndex 第几个班次
617   - */
618   - var _fnGenerateBcAndSetBc = function(lpIndex, qIndex, bcIndex) {
619   - var _bcObj = _fnGenerateBc(lpIndex, qIndex, bcIndex);
620   - if (_bcObj) {
621   - _internalLpArray[lpIndex].setBc(qIndex, bcIndex, _bcObj);
622   - }
623   - };
624   -
625   - /**
626   - * 获取班次列表。
627   - * @param oIsUp 是否上行
628   - * @param oStartTime 开始时间对象
629   - * @returns [(InternalBcObj)]
630   - */
631   - var _fnGetBcList2 = function(oIsUp, oStartTime) {
632   - var i;
633   - var j;
634   - var oLp;
635   - var oBc;
636   - var aBc = [];
637   -
638   - for (j = 0; j < _qCount; j++) {
639   - for (i = 0; i < _internalLpArray.length; i++) {
640   - oLp = _internalLpArray[i];
641   - oBc = oLp.getBc(
642   - j,
643   - _qIsUp == oIsUp ? 0 : 1
644   - );
645   - if (oBc && oBc.getFcTimeObj().isAfter(oStartTime)) {
646   - aBc.push(oBc);
647   - }
648   - }
649   - }
650   -
651   - var aBcFcTime = [];
652   - for (i = 0; i < aBc.length; i++) {
653   - oBc = aBc[i];
654   - aBcFcTime.push(oBc.getFcTimeObj().format("HH:mm"));
655   - }
656   - console.log((oIsUp ? "上行班次列表:" : "下行班次列表:") + aBcFcTime.join(","));
657   -
658   - return aBc;
659   - };
660   -
661   - /**
662   - * 获取班次列表。
663   - * @param isUp boolean 是否上行
664   - * @returns [(InternalBcObj)]
665   - */
666   - var _fnGetBcList = function(isUp) {
667   - var i;
668   - var j;
669   - var oLp;
670   - var oBc;
671   - var aBc = [];
672   -
673   - for (j = 0; j < _qCount; j++) {
674   - for (i = 0; i < _internalLpArray.length; i++) {
675   - oLp = _internalLpArray[i];
676   - oBc = oLp.getBc(
677   - j,
678   - _qIsUp == isUp ? 0 : 1
679   - );
680   - if (oBc) {
681   - aBc.push(oBc);
682   - }
683   - }
684   - }
685   -
686   - var aBcFcTime = [];
687   - for (i = 0; i < aBc.length; i++) {
688   - oBc = aBc[i];
689   - aBcFcTime.push(oBc.getFcTimeObj().format("HH:mm"));
690   - }
691   - console.log((isUp ? "上行班次列表:" : "下行班次列表:") + aBcFcTime.join(","));
692   -
693   - return aBc;
694   - };
695   -
696   - /**
697   - * 查找离指定时间最近的前面的班次索引信息
698   - * @param timeObj 查找时间
699   - * @param isUp 是否上行
700   - * @returns [{路牌index},{圈index},{班次index}]
701   - */
702   - var _fnFindUpClosedBcIndexWithTime = function(timeObj, isUp) {
703   -
704   - var _lpObj;
705   - var _groupObj;
706   - var _bcObj;
707   - var _i;
708   - var _j;
709   - var timediff; // 时间差取绝对值
710   -
711   - var _lpIndex;
712   - var _up_qIndex;
713   - var _up_bIndex;
714   -
715   - for (_i = 0; _i < _qCount; _i++) {
716   - for (_j = 0; _j < _internalLpArray.length; _j++) {
717   - _lpObj = _internalLpArray[_j];
718   - _groupObj = _lpObj.getGroup(_i);
719   - _bcObj = isUp == _qIsUp ? _groupObj.getBc1() : _groupObj.getBc2();
720   - if (!_bcObj) { // 没有班次动态生成一个,可能生成不出的
721   - _bcObj = _fnGenerateBc(_j, _i, isUp == _qIsUp ? 0 : 1);
722   - }
723   - if (_bcObj) {
724   - if (timeObj.diff(_bcObj.getFcTimeObj()) >= 0) {
725   - if (!timediff) {
726   - timediff = timeObj.diff(_bcObj.getFcTimeObj());
727   - _lpIndex = _j;
728   - _up_qIndex = _i;
729   - _up_bIndex = isUp == _qIsUp ? 0 : 1;
730   - } else {
731   - if (timeObj.diff(_bcObj.getFcTimeObj()) < timediff) {
732   - timediff = timeObj.diff(_bcObj.getFcTimeObj());
733   - _lpIndex = _j;
734   - _up_qIndex = _i;
735   - _up_bIndex = isUp == _qIsUp ? 0 : 1;
736   - }
737   - }
738   - }
739   - }
740   - }
741   - }
742   -
743   - if (_lpIndex == undefined) {
744   - return false;
745   - }
746   -
747   - var bcindex = [];
748   - bcindex.push(_lpIndex);
749   - bcindex.push(_up_qIndex);
750   - bcindex.push(_up_bIndex);
751   -
752   - return bcindex;
753   - };
754   -
755   - /**
756   - * 查找离指定时间最近的后面的班次索引信息
757   - * @param timeObj 查找时间
758   - * @param isUp 是否上行
759   - * @returns [{路牌index},{圈index},{班次index}]
760   - */
761   - var _fnFindDownClosedBcIndexWithTime = function(timeObj, isUp) {
762   - var _lpObj;
763   - var _groupObj;
764   - var _bcObj;
765   - var _i;
766   - var _j;
767   - var timediff; // 时间差取绝对值
768   -
769   - var _lpIndex;
770   - var _down_qIndex;
771   - var _down_bIndex;
772   -
773   - var flag;
774   -
775   - for (_i = 0; _i < _qCount; _i++) {
776   - for (_j = 0; _j < _internalLpArray.length; _j++) {
777   - _lpObj = _internalLpArray[_j];
778   - _groupObj = _lpObj.getGroup(_i);
779   - // TODO:bug
780   - _bcObj = isUp == _qIsUp ? _groupObj.getBc1() : _groupObj.getBc2();
781   - if (!_bcObj) { // 没有班次动态生成一个,可能生成不出的
782   - _bcObj = _fnGenerateBc(_j, _i, isUp == _qIsUp ? 0 : 1);
783   - }
784   - if (_bcObj) {
785   - //console.log("timeobj -> bcobj diff flag " +
786   - // timeObj.format("HH:mm") + "->" +
787   - // _bcObj.getFcTimeObj().format("HH:mm") +
788   - // timeObj.diff(_bcObj.getFcTimeObj()) +
789   - // (timeObj.diff(_bcObj.getFcTimeObj()) <= 0)
790   - //);
791   -
792   - flag = (timeObj.diff(_bcObj.getFcTimeObj())) <= 0;
793   -
794   - if (flag) {
795   - if (!timediff) {
796   - timediff = timeObj.diff(_bcObj.getFcTimeObj());
797   - _lpIndex = _j;
798   - _down_qIndex = _i;
799   - _down_bIndex = isUp == _qIsUp ? 0 : 1;
800   - } else {
801   - if ((timeObj.diff(_bcObj.getFcTimeObj())) > timediff) {
802   - timediff = timeObj.diff(_bcObj.getFcTimeObj());
803   - _lpIndex = _j;
804   - _down_qIndex = _i;
805   - _down_bIndex = isUp == _qIsUp ? 0 : 1;
806   - }
807   - }
808   - }
809   - }
810   - }
811   - }
812   -
813   - if (_lpIndex == undefined) {
814   - return false;
815   - }
816   -
817   - var bcindex = [];
818   - bcindex.push(_lpIndex);
819   - bcindex.push(_down_qIndex);
820   - bcindex.push(_down_bIndex);
821   -
822   - return bcindex;
823   - };
824   -
825   - /**
826   - * 获取班次索引。
827   - * @param oBc 班次对象
828   - * @returns [{路牌索引},{圈索引},{班次索引}]
829   - */
830   - var _fnGetBcIndex = function(oBc) {
831   - // 路牌索引
832   - var i;
833   - var iLpIndex;
834   - for (i = 0; i < _internalLpArray.length; i++) {
835   - if (_internalLpArray[i]._$$_orign_lp_obj == oBc._$$_internal_lp_obj._$$_orign_lp_obj) {
836   - iLpIndex = i;
837   - break;
838   - }
839   - }
840   - // 圈索引
841   - var j;
842   - var iGroupIndex;
843   - var bFlag = false;
844   - for (i = 0; i < _internalLpArray.length; i++) {
845   - if (bFlag) {
846   - break;
847   - }
848   - for (j = 0; j < _qCount; j++) {
849   - if (_internalLpArray[i]._$_groupBcArray[j] == oBc._$$_internal_group_obj) {
850   - iGroupIndex = j;
851   - bFlag = true;
852   - break;
853   - }
854   - }
855   - }
856   - // 班次索引
857   - var iBcIndex = _qIsUp == oBc.isUp() ? 0 : 1;
858   -
859   - if (iLpIndex == undefined) {
860   - return null;
861   - } else {
862   - return [].concat(iLpIndex, iGroupIndex, iBcIndex);
863   - }
864   -
865   - };
866   -
867   - return {
868   - //------------- 布局初始化方法 ------------//
869   - /**
870   - * 初始化数据,使用标线初始化
871   - */
872   - fnInitDataWithBxLayout: function() {
873   - // 初始化布局1,构造上标线,计算圈数,把上标线数据放入第一个路牌中
874   - _fnInitFun1();
875   - // 初始化布局2,从上标线的某个班次开始,构造所有路牌的早高峰班次,晚高峰班次,计算路牌在各个圈中的间隔
876   - _fnInitFun2();
877   - // 初始化布局3,计算连班分班路牌分布
878   - _fnInitFun3();
879   - // 初始化布局4,计算中标线位置
880   - _fnInitFun4();
881   -
882   - },
883   -
884   - /**
885   - * 调整高峰班次,
886   - * 初始化生成早高峰,晚高峰班次并不准确,因为根据高峰时间段,并不在一个完整圈内,应该是在两个或多个圈之间
887   - * 当初始化定好布局后(上标线,中标线),然后确定每个路牌的班型(连班,分班,5休2分班)后
888   - * 然后重新计算框在高峰时间段内的班次索引,不足的添加,之前多加的删除(只删除分班路牌上的)
889   - * @param isZgf 是否早高峰
890   - * @param isUp 是否上行
891   - */
892   - fnAdjustGfbc : function(isZgf, isUp) {
893   - var oStartTime; // 开始时间
894   - var oEndTime; // 结束时间
895   - var aStartBcIndex; // 开始班次索引
896   - var aEndBcIndex; // 结束班次索引
897   -
898   - oStartTime = isZgf ? _paramObj.getMPeakStartTimeObj() : _paramObj.getEPeakStartTimeObj();
899   - oEndTime = isZgf ? _paramObj.getMPeakEndTimeObj() : _paramObj.getEPeakEndTimeObj();
900   -
901   - aStartBcIndex = _fnFindUpClosedBcIndexWithTime(oStartTime, isUp);
902   - aEndBcIndex = _fnFindDownClosedBcIndexWithTime(oEndTime, isUp);
903   -
904   - var iLpIndex;
905   - var iQIndex;
906   - var iBcIndex;
907   - var iQInternelCount; // 高峰时间段中间包含的圈数
908   - var i;
909   - var j;
910   -
911   - var oLp;
912   -
913   - if (aStartBcIndex && aEndBcIndex) {
914   - iLpIndex = aStartBcIndex[0];
915   - iQIndex = aStartBcIndex[1];
916   - iBcIndex = aStartBcIndex[2];
917   -
918   - // 处理头
919   - // 删除头部多余班次
920   - for (j = 0; j < iLpIndex; j++) {
921   - oLp = _internalLpArray[j];
922   - if (oLp.isBxFb() && oLp.getBc(iQIndex, iBcIndex)) {
923   - oLp.removeBc(iQIndex, iBcIndex);
924   - }
925   - }
926   -
927   - for (j = iLpIndex; j < _internalLpArray.length; j++) {
928   - oLp = _internalLpArray[j];
929   - if (!oLp.getBc(iQIndex, iBcIndex)) {
930   - _fnGenerateBcAndSetBc(j, iQIndex, iBcIndex);
931   - }
932   - }
933   -
934   - // 处理中间
935   - iQInternelCount = aEndBcIndex[1] - aStartBcIndex[1] - 1;
936   - for (i = 1; i <= iQInternelCount; i++) {
937   -
938   - for (j = 0; j < _internalLpArray.length; j++) {
939   - oLp = _internalLpArray[j];
940   - if (!oLp.getBc(iQIndex + i, iBcIndex)) {
941   - _fnGenerateBcAndSetBc(j, iQIndex + i, iBcIndex);
942   - }
943   - }
944   -
945   - }
946   -
947   - // 处理尾部
948   - iLpIndex = aEndBcIndex[0];
949   - iQIndex = aEndBcIndex[1];
950   - iBcIndex = aEndBcIndex[2];
951   -
952   - // 删除尾部多余的班次
953   - for (j = iLpIndex; j < _internalLpArray.length; j++) {
954   - oLp = _internalLpArray[j];
955   - if (oLp.isBxFb() && oLp.getBc(iQIndex, iBcIndex)) {
956   - oLp.removeBc(iQIndex, iBcIndex);
957   - }
958   - }
959   -
960   - if (aStartBcIndex[1] != aEndBcIndex[1]) { // 指定时间范围跨圈
961   - for (j = 0; j < iLpIndex; j++) {
962   - oLp = _internalLpArray[j];
963   - if (!oLp.getBc(iQIndex, iBcIndex)) {
964   - _fnGenerateBcAndSetBc(j, iQIndex, iBcIndex);
965   - }
966   - }
967   - } else {
968   - // 不跨圈,不用处理,处理头的时候已经加了
969   - }
970   -
971   - }
972   -
973   - },
974   -
975   - /**
976   - * 按照营运时间要求补充班次,
977   - * 早高峰7:45分以前出场运营,
978   - * 晚高峰16:10分以前出场运营
979   - */
980   - fnCalcuLpBc_yy: function() {
981   - // 补班次的时候,针对的是分班班型
982   - var i;
983   - var _oLp;
984   - var _oBc;
985   - var _aMinBcIndex;
986   - var _aMaxBcIndex;
987   -
988   - var _qIndex;
989   - var _bIndex;
990   -
991   - var _zgfCDate = _paramObj.toTimeObj("7:45");
992   - var _wgfCDate = _paramObj.toTimeObj("16:10");
993   - var _ccsj;
994   -
995   - for (i = 0; i < _internalLpArray.length; i++) {
996   - _oLp = _internalLpArray[i];
997   - if (_oLp.isBxFb()) { // 分班路牌
998   - // 早高峰部分
999   - _aMinBcIndex = _oLp.getMinBcObjPosition();
1000   - _qIndex = _aMinBcIndex[0];
1001   - _bIndex = _aMinBcIndex[1];
1002   - _oBc = _oLp.getBc(_qIndex, _bIndex);
1003   - if (_qIsUp) {
1004   - _ccsj = _bIndex == 0 ?
1005   - _paramObj.getUpOutTime() :
1006   - _paramObj.getDownOutTime();
1007   - } else {
1008   - _ccsj = _bIndex == 0 ?
1009   - _paramObj.getDownOutTime() :
1010   - _paramObj.getUpOutTime();
1011   - }
1012   - if (_zgfCDate.isBefore(_paramObj.addMinute(_oBc.getFcTimeObj(), -_ccsj))) {
1013   - _fnGenerateBcAndSetBc(
1014   - i,
1015   - _bIndex == 0 ? _qIndex - 1 : _qIndex,
1016   - _bIndex == 0 ? 1 : 0
1017   - )
1018   - }
1019   -
1020   - // 晚高峰部分
1021   - _aMaxBcIndex = _oLp.getMaxBcObjPosition();
1022   - _qIndex = _aMaxBcIndex[0];
1023   - _bIndex = _aMaxBcIndex[1];
1024   - _oBc = _oLp.getBc(
1025   - _bIndex == 0 ? _qIndex - 1 : _qIndex,
1026   - _bIndex == 0 ? 1 : 0
1027   - );
1028   - if (!_oBc) { // 前一个班次不存在,再判定加不加
1029   - _oBc = _oLp.getBc(_qIndex, _bIndex);
1030   - if (_qIsUp) {
1031   - _ccsj = _bIndex == 0 ?
1032   - _paramObj.getUpOutTime() :
1033   - _paramObj.getDownOutTime();
1034   - } else {
1035   - _ccsj = _bIndex == 0 ?
1036   - _paramObj.getDownOutTime() :
1037   - _paramObj.getUpOutTime();
1038   - }
1039   - if (_wgfCDate.isBefore(_paramObj.addMinute(_oBc.getFcTimeObj(), -_ccsj))) {
1040   - _fnGenerateBcAndSetBc(
1041   - i,
1042   - _bIndex == 0 ? _qIndex - 1 : _qIndex,
1043   - _bIndex == 0 ? 1 : 0
1044   - )
1045   - }
1046   - }
1047   - }
1048   - }
1049   - },
1050   -
1051   - /**
1052   - * 补充做5休2的班型班次。
1053   - * 1、确认5_2班型大致多少圈(小数点过.7进位)
1054   - * 2、获取当前5_2两端车次链的信息,每段的班次数目,还差几个班次没加
1055   - * 3、如果前面的车次链班次少,则从前面的车次链开始加
1056   - * 4、如果车次链班次数一样,从从后面的车次链开始加
1057   - * 5、加班次时都是往车次链前方加
1058   - * 6、如果前面车次链不能再加班次了,从后面车次链加
1059   - */
1060   - fnCalcuLpBx_5_2: function() {
1061   - // 计算做5休2班型所需的班次数
1062   - var iBxBcount = _aBxDesc[6].fBcCount;
1063   - if (iBxBcount - Math.floor(iBxBcount) > 0.7) {
1064   - iBxBcount = Math.floor(iBxBcount) + 1;
1065   - } else {
1066   - iBxBcount = Math.floor(iBxBcount);
1067   - }
1068   -
1069   - var i;
1070   - var j;
1071   - var oLp;
1072   - var iAddBcCount;
1073   - var oBcChain1;
1074   - var oBcChain2;
1075   - var iQindex;
1076   - var iBindex;
1077   -
1078   - for (i = 0; i < _internalLpArray.length; i++) {
1079   - oLp = _internalLpArray[i];
1080   - if (oLp.isBxFb5_2()) {
1081   - iAddBcCount = iBxBcount - oLp.getBcArray().length; // 需要添加的班次数
1082   - for (j = 1; j <= iAddBcCount; j++) {
1083   - oBcChain1 = oLp.fnGetBcChainInfo(0);
1084   - oBcChain2 = oLp.fnGetBcChainInfo(1);
1085   -
1086   - if (oBcChain1.bcount < oBcChain2.bcount) {
1087   - iQindex = oBcChain1.s_b == 0 ? oBcChain1.s_q - 1 : oBcChain1.s_q;
1088   - iBindex = oBcChain1.s_b == 0 ? 1 : 0;
1089   - // 往车次链往前不能加,就往后加
1090   - if (_fnGenerateBc(i, iQindex, iBindex)) {
1091   - _fnGenerateBcAndSetBc(i, iQindex, iBindex);
1092   - } else {
1093   - iQindex = oBcChain1.e_b == 0 ? oBcChain1.e_q : oBcChain1.e_q + 1;
1094   - iBindex = oBcChain1.e_b == 0 ? 1 : 0;
1095   - _fnGenerateBcAndSetBc(i, iQindex, iBindex);
1096   - }
1097   -
1098   - } else if (oBcChain1.bcount > oBcChain2.bcount) {
1099   - iQindex = oBcChain2.s_b == 0 ? oBcChain2.s_q - 1 : oBcChain2.s_q;
1100   - iBindex = oBcChain2.s_b == 0 ? 1 : 0;
1101   - _fnGenerateBcAndSetBc(i, iQindex, iBindex);
1102   - } else {
1103   - iQindex = oBcChain2.s_b == 0 ? oBcChain2.s_q - 1 : oBcChain2.s_q;
1104   - iBindex = oBcChain2.s_b == 0 ? 1 : 0;
1105   - _fnGenerateBcAndSetBc(i, iQindex, iBindex);
1106   - }
1107   - }
1108   - }
1109   - }
1110   -
1111   - },
1112   -
1113   - /**
1114   - * 补其他分班班型班次。
1115   - * 从车次链的后面开始加
1116   - */
1117   - fnCalcuLpBx_other: function() {
1118   - // TODO:根据上标线的首班时间确定班型,小于05:59的做一休一,否则做二休一
1119   - var oSt = _qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();
1120   - var iBxIndex = 4;
1121   - if (oSt.isBefore(_paramObj.toTimeObj("05:59"))) {
1122   - iBxIndex = 5;
1123   - }
1124   - // 计算做5休2班型所需的班次数
1125   - var iQBcount = _aBxDesc[iBxIndex].fQCount;
1126   - var iBxBcount = Math.round(iQBcount) * 2;
1127   -
1128   - var i;
1129   - var j;
1130   - var oLp;
1131   - var iAddBcCount;
1132   - var oBcChain1;
1133   - var oBcChain2;
1134   - var iQindex;
1135   - var iBindex;
1136   -
1137   - for (i = 0; i < _internalLpArray.length; i++) {
1138   - oLp = _internalLpArray[i];
1139   - if (oLp.isBxFb() && !oLp.isBxFb5_2()) {
1140   - iAddBcCount = iBxBcount - oLp.getBcArray().length; // 需要添加的班次数
1141   - for (j = 1; j <= iAddBcCount; j++) {
1142   - oBcChain1 = oLp.fnGetBcChainInfo(0);
1143   - oBcChain2 = oLp.fnGetBcChainInfo(1);
1144   -
1145   - if (oBcChain1.bcount < oBcChain2.bcount) {
1146   - iQindex = oBcChain1.e_b == 0 ? oBcChain1.e_q : oBcChain1.e_q + 1;
1147   - iBindex = oBcChain1.e_b == 0 ? 1 : 0;
1148   - _fnGenerateBcAndSetBc(i, iQindex, iBindex);
1149   - } else if (oBcChain1.bcount > oBcChain2.bcount) {
1150   - iQindex = oBcChain2.e_b == 0 ? oBcChain2.e_q : oBcChain2.e_q + 1;
1151   - iBindex = oBcChain2.e_b == 0 ? 1 : 0;
1152   - _fnGenerateBcAndSetBc(i, iQindex, iBindex);
1153   - } else {
1154   - iQindex = oBcChain2.e_b == 0 ? oBcChain2.e_q : oBcChain2.e_q + 1;
1155   - iBindex = oBcChain2.e_b == 0 ? 1 : 0;
1156   - _fnGenerateBcAndSetBc(i, iQindex, iBindex);
1157   - }
1158   - }
1159   - }
1160   - }
1161   -
1162   - },
1163   -
1164   - /**
1165   - * 补充连班路牌班次。
1166   - * 1、上标线,中标线中间的连班路牌班次从早高峰班次一直拉到底,从早高峰班次向上标线起始班次靠拢
1167   - * 2、中标线以下的连班路牌班次从早高峰班次一直拉到底,从早高峰班次向中标线起始班次靠拢
1168   - */
1169   - fnCalcuLpBx_lb: function() {
1170   - // 补充连班的班次,参照上标线,中标线补充不足的班次
1171   -
1172   - var aLbLpindexes = []; // 除上标线,中标线的连班路牌索引
1173   - var i;
1174   - for (i = 0; i < _internalLpArray.length; i++) {
1175   - if (_internalLpArray[i].isBxLb() && i != 0 && i != _iZbx_lpIndex) {
1176   - aLbLpindexes.push(i);
1177   - }
1178   - }
1179   -
1180   - var oEndsj = // 结束时间
1181   - _paramObj.getUpLastDtimeObj().isBefore(_paramObj.getDownLastDTimeObj()) ?
1182   - _paramObj.getDownLastDTimeObj() :
1183   - _paramObj.getUpLastDtimeObj();
1184   -
1185   - var oLp;
1186   - var aMinbcPos;
1187   - var oBc;
1188   - var j;
1189   - var iTempBcIndex;
1190   -
1191   - // 1、从最小班次开始,往后补充班次
1192   - for (i = 0; i < aLbLpindexes.length; i++) {
1193   - oLp = _internalLpArray[aLbLpindexes[i]];
1194   -
1195   - // 最小班次索引
1196   - aMinbcPos = oLp.getMinBcObjPosition();
1197   - // 使用纵向分隔补充班次,从最小班次向后补
1198   - iTempBcIndex = aMinbcPos[1] == 0 ? 1 : 0;
1199   - j = iTempBcIndex == 0 ? aMinbcPos[0] + 1 : aMinbcPos[0];
1200   -
1201   - while (j < _qCount) {
1202   - while (iTempBcIndex <= 1) {
1203   - oBc = _fnGenerateBc(aLbLpindexes[i], j, iTempBcIndex);
1204   - if (oBc &&
1205   - oBc.getFcTimeObj().isBefore(oEndsj) ) {
1206   - oLp.setBc(j, iTempBcIndex, oBc);
1207   - }
1208   - iTempBcIndex++;
1209   - }
1210   - iTempBcIndex = 0;
1211   - j++;
1212   - }
1213   -
1214   - }
1215   -
1216   - // 2、上标线中标线之间的路牌,从最小的班次往前补充班次
1217   -
1218   - // 还要补充缺失的班次,差上标线几个班次要往前补上
1219   - var iBccount;
1220   - var iQindex;
1221   - var iBindex;
1222   - // 补上标线到中标线之间的连班路牌的班次
1223   - for (i = 0; i < aLbLpindexes.length; i++) {
1224   - if (aLbLpindexes[i] > 0 && aLbLpindexes[i] < _iZbx_lpIndex) {
1225   - oLp = _internalLpArray[aLbLpindexes[i]];
1226   - aMinbcPos = oLp.getMinBcObjPosition();
1227   - iQindex = aMinbcPos[0];
1228   - iBindex = aMinbcPos[1];
1229   - iBccount = (iQindex - 1) * 2 + iBindex; // 距离上标线起始站点差几个班次
1230   - for (j = 0; j < iBccount; j++) {
1231   - if (iBindex == 0) {
1232   - iQindex --;
1233   - iBindex = 1;
1234   - _fnGenerateBcAndSetBc(aLbLpindexes[i], iQindex, iBindex);
1235   - } else if (iBindex == 1) {
1236   - iBindex --;
1237   - _fnGenerateBcAndSetBc(aLbLpindexes[i], iQindex, iBindex);
1238   - }
1239   - }
1240   -
1241   - }
1242   -
1243   - }
1244   -
1245   - // 3、中标线之后的路牌,从最小的班次往前补充班次
1246   -
1247   - // 补中标线以下的连班路牌的班次
1248   - for (i = 0; i < aLbLpindexes.length; i++) {
1249   - if (aLbLpindexes[i] > _iZbx_lpIndex) {
1250   - oLp = _internalLpArray[aLbLpindexes[i]];
1251   - aMinbcPos = oLp.getMinBcObjPosition();
1252   - iQindex = aMinbcPos[0];
1253   - iBindex = aMinbcPos[1];
1254   - iBccount = (iQindex - 0) * 2 + iBindex - 1; // 距离上标线起始站点差几个班次
1255   - for (j = 0; j < iBccount; j++) {
1256   - if (iBindex == 0) {
1257   - iQindex --;
1258   - iBindex = 1;
1259   - _fnGenerateBcAndSetBc(aLbLpindexes[i], iQindex, iBindex);
1260   - } else if (iBindex == 1) {
1261   - iBindex --;
1262   - _fnGenerateBcAndSetBc(aLbLpindexes[i], iQindex, iBindex);
1263   - }
1264   - }
1265   - }
1266   - }
1267   -
1268   - },
1269   -
1270   - /**
1271   - * 计算末班车。
1272   - * 1、将上下行拉成上下行两个班次列表(包括标记班次)
1273   - * 2、分别找出离末班车发车时间最近的班次,并替换时间
1274   - * 3、删除之后的班次
1275   - */
1276   - fnCalcuLastBc: function() {
1277   - var i;
1278   - var iTimeDiff;
1279   - var iTempTime;
1280   - var aBc;
1281   - var oLastBcTime;
1282   - var oLastBcIsUp;
1283   - var iModifyIndex;
1284   -
1285   - // 查找末班车早的末班车时间和方向
1286   - if (_paramObj.getUpLastDtimeObj().isBefore(_paramObj.getDownLastDTimeObj())) {
1287   - oLastBcTime = _paramObj.getUpLastDtimeObj();
1288   - oLastBcIsUp = true;
1289   - } else {
1290   - oLastBcTime = _paramObj.getDownLastDTimeObj();
1291   - oLastBcIsUp = false;
1292   - }
1293   -
1294   - // 确定早的末班车时间
1295   - aBc = _fnGetBcList(oLastBcIsUp);
1296   - for (i = 0; i < aBc.length; i++) {
1297   - iTempTime = oLastBcTime.diff(aBc[i].getFcTimeObj(), "m");
1298   - if (iTimeDiff == undefined) {
1299   - iTimeDiff = iTempTime;
1300   - iModifyIndex = i;
1301   - } else if (Math.abs(iTempTime) <= Math.abs(iTimeDiff)) {
1302   - iTimeDiff = iTempTime;
1303   - iModifyIndex = i;
1304   - }
1305   - }
1306   - aBc[iModifyIndex].addMinuteToFcsj(iTimeDiff); // 替换成末班车时间
1307   - aBc[iModifyIndex].fnSetDelFlag(false);
1308   - aBc[iModifyIndex].fnSetIsLastBc(true);
1309   - for (i = iModifyIndex + 1; i < aBc.length; i++) { // 删除多余班次
1310   - _qIsUp == oLastBcIsUp ?
1311   - aBc[i]._$$_internal_group_obj.setBc1(undefined) :
1312   - aBc[i]._$$_internal_group_obj.setBc2(undefined);
1313   - }
1314   -
1315   - // 查找末班车晚的末班车时间和方向
1316   - if (_paramObj.getUpLastDtimeObj().isBefore(_paramObj.getDownLastDTimeObj())) {
1317   - oLastBcTime = _paramObj.getDownLastDTimeObj();
1318   - oLastBcIsUp = false;
1319   - } else {
1320   - oLastBcTime = _paramObj.getUpLastDtimeObj();
1321   - oLastBcIsUp = true;
1322   - }
1323   - // 确定晚的末班车时间
1324   - aBc = _fnGetBcList(oLastBcIsUp);
1325   - var oBc;
1326   - var aBcIndex;
1327   - var iLpIndex;
1328   - var iQIndex;
1329   - var iBcIndex;
1330   -
1331   - iTimeDiff = undefined;
1332   - for (i = 0; i < aBc.length; i++) {
1333   - oBc = aBc[i];
1334   - aBcIndex = _fnGetBcIndex(oBc);
1335   -
1336   - iLpIndex = aBcIndex[0];
1337   - iQIndex = aBcIndex[2] == 0 ? aBcIndex[1] -1 : aBcIndex[1];
1338   - iBcIndex = aBcIndex[2] == 0 ? 1 : 0;
1339   -
1340   - if (!_internalLpArray[iLpIndex].getBc(iQIndex, iBcIndex)) {
1341   - continue;
1342   - }
1343   -
1344   - iTempTime = oLastBcTime.diff(aBc[i].getFcTimeObj(), "m");
1345   - if (iTimeDiff == undefined) {
1346   - iTimeDiff = iTempTime;
1347   - iModifyIndex = i;
1348   - } else if (Math.abs(iTempTime) <= Math.abs(iTimeDiff)) {
1349   - iTimeDiff = iTempTime;
1350   - iModifyIndex = i;
1351   - }
1352   - }
1353   - aBc[iModifyIndex].addMinuteToFcsj(iTimeDiff); // 替换成末班车时间
1354   - aBc[iModifyIndex].fnSetDelFlag(false);
1355   - aBc[iModifyIndex].fnSetIsLastBc(true);
1356   - for (i = iModifyIndex + 1; i < aBc.length; i++) { // 删除多余班次
1357   - _qIsUp == oLastBcIsUp ?
1358   - aBc[i]._$$_internal_group_obj.setBc1(undefined) :
1359   - aBc[i]._$$_internal_group_obj.setBc2(undefined);
1360   - }
1361   -
1362   - },
1363   -
1364   - /**
1365   - * 添加吃饭班次。
1366   - */
1367   - fnCalcuEatBc: function() {
1368   - // 吃午饭时间范围,10:15 到 12:15
1369   - // 吃晚饭时间范围,18:00 到 19:00
1370   -
1371   - if (!_paramObj.fnIsEat()) {
1372   - return;
1373   - }
1374   -
1375   - // 午饭index
1376   - var aLEIndex;
1377   - // 晚饭index
1378   - var aDEIndex;
1379   -
1380   - // 所有吃饭都默认在一个方向,两个方向暂时不考虑
1381   - if (_paramObj.fnIsUpEat()) {
1382   - aLEIndex = _internalLpArray[0].getQBcIndexWithFcTime(_paramObj.toTimeObj("10:15"), true, false);
1383   - aDEIndex = _internalLpArray[0].getQBcIndexWithFcTime(_paramObj.toTimeObj("18:00"), true, false);
1384   - } else {
1385   - aLEIndex = _internalLpArray[0].getQBcIndexWithFcTime(_paramObj.toTimeObj("10:15"), false, true);
1386   - aDEIndex = _internalLpArray[0].getQBcIndexWithFcTime(_paramObj.toTimeObj("18:00"), false, true);
1387   - }
1388   -
1389   - // 午饭第几圈,第几个班次
1390   - var iLEQIndex = aLEIndex[0];
1391   - var iLEBIndex = aLEIndex[1];
1392   - // 晚饭第几圈,第几个班次
1393   - var iDEQIndex = aDEIndex[0];
1394   - var iDEBIndex = aDEIndex[1];
1395   -
1396   - // 注意,本模型只有连班才有吃饭
1397   -
1398   - var i;
1399   - var oLp;
1400   - var aLbIndex = []; // 连班班型的路牌索引
1401   - for (i = 0; i < _internalLpArray.length; i++) {
1402   - oLp = _internalLpArray[i];
1403   - if (oLp.isBxLb()) {
1404   - aLbIndex.push(i);
1405   - }
1406   - }
1407   -
1408   - var iLTime;
1409   - var iDtime;
1410   - var j;
1411   - for (i = 0; i < aLbIndex.length; i++) {
1412   - oLp = _internalLpArray[aLbIndex[i]];
1413   -
1414   - // 午饭
1415   - iLTime = oLp.fnAddEatBc(iLEQIndex, iLEBIndex, _factory, _paramObj);
1416   - // 晚饭
1417   - iDtime = oLp.fnAddEatBc(iDEQIndex, iDEBIndex, _factory, _paramObj);
1418   -
1419   - if (i == aLbIndex.length - 1) {
1420   - for (j = aLbIndex[i]; j < _internalLpArray.length; j++) {
1421   - oLp = _internalLpArray[j];
1422   - if (oLp.isBxFb()) { // 5休2班型不调整
1423   - // 修正午饭之后路牌班次的发车时间
1424   - oLp.fnAddMinuteToBcFcsj(iLEQIndex, iLEBIndex, iLTime);
1425   - oLp.fnAddMinuteToBcFcsj(iDEQIndex, iDEBIndex, iDtime);
1426   - }
1427   - }
1428   - } else {
1429   - for (j = aLbIndex[i]; j < aLbIndex[i + 1]; j++) {
1430   - oLp = _internalLpArray[j];
1431   - if (oLp.isBxFb()) {
1432   - // 修正午饭之后路牌班次的发车时间
1433   - oLp.fnAddMinuteToBcFcsj(iLEQIndex, iLEBIndex, iLTime);
1434   - oLp.fnAddMinuteToBcFcsj(iDEQIndex, iDEBIndex, iDtime);
1435   - }
1436   - }
1437   - }
1438   - }
1439   -
1440   - },
1441   -
1442   - /**
1443   - * 补每个路牌的其他班次(进出场,例保班次)。
1444   - */
1445   - fnCalcuOtherBc_: function() {
1446   - var i;
1447   - var _lpObj;
1448   - var _minBcIndex;
1449   - var _maxBcIndex;
1450   - var _minBc;
1451   - var _maxBc;
1452   - var _otherbc = [];
1453   - var _oFbbc;
1454   -
1455   - for (i = 0; i < _internalLpArray.length; i++) {
1456   - _lpObj = _internalLpArray[i];
1457   - _minBcIndex = _lpObj.getMinBcObjPosition();
1458   - _maxBcIndex = _lpObj.getMaxBcObjPosition();
1459   - _minBc = _lpObj.getBc(_minBcIndex[0], _minBcIndex[1]);
1460   - _maxBc = _lpObj.getBc(_maxBcIndex[0], _maxBcIndex[1]);
1461   -
1462   - _otherbc = [];
1463   - _otherbc.push(_factory.createBcObj(
1464   - _lpObj, "bd", true, 1,
1465   - _minBc.getFcTimeObj(),
1466   - _paramObj
1467   - ));
1468   - _otherbc.push(_factory.createBcObj(
1469   - _lpObj, "out", true, 1,
1470   - _minBc.getFcTimeObj(),
1471   - _paramObj
1472   - ));
1473   -
1474   - _maxBc.setArrTimeObj(_paramObj.addMinute(_maxBc.getFcTimeObj(), _maxBc.getBcTime()));
1475   - _maxBc.setStopTime(0);
1476   - _otherbc.push(_factory.createBcObj(
1477   - _lpObj, "in", true, 1,
1478   - _maxBc.getArrTimeObj(),
1479   - _paramObj
1480   - ));
1481   - _otherbc.push(_factory.createBcObj(
1482   - _lpObj, "lc", true, 1,
1483   - _maxBc.getArrTimeObj(),
1484   - _paramObj
1485   - ));
1486   -
1487   - // 5休2分班出场例保班次
1488   - if (_lpObj.isBxFb5_2()) {
1489   - _oFbbc = _lpObj.getBc(
1490   - _lpObj.fnGetBcChainInfo(1)["s_q"],
1491   - _lpObj.fnGetBcChainInfo(1)["s_b"]
1492   - );
1493   -
1494   - _otherbc.push(_factory.createBcObj(
1495   - _lpObj, "bd", true, 1,
1496   - _oFbbc.getFcTimeObj(),
1497   - _paramObj
1498   - ));
1499   - _otherbc.push(_factory.createBcObj(
1500   - _lpObj, "out", true, 1,
1501   - _oFbbc.getFcTimeObj(),
1502   - _paramObj
1503   - ));
1504   - }
1505   -
1506   - _lpObj.addOtherBcArray(_otherbc);
1507   - }
1508   -
1509   - },
1510   -
1511   - /**
1512   - * 补每个路牌的其他班次(进出场,例保班次)
1513   - * 所有的车次链前后都加进出场、报道班次
1514   - */
1515   - fnCalcuOtherBc: function() {
1516   - var i;
1517   - var j;
1518   - var iBcChainCount;
1519   - var oLp;
1520   - var aOtherBc;
1521   - var oStartBc;
1522   - var oEndBc;
1523   -
1524   - for (i = 0; i < _internalLpArray.length; i++) {
1525   - aOtherBc = [];
1526   - oLp = _internalLpArray[i];
1527   - iBcChainCount = oLp.fnGetBcChainCount();
1528   -
1529   - if (iBcChainCount == 1) { // 只有一个车次链,是连班班型
1530   - // 头部要添加出场,例保班次
1531   - oStartBc = oLp.getBc(
1532   - oLp.fnGetBcChainInfo(0)["s_q"],
1533   - oLp.fnGetBcChainInfo(0)["s_b"]
1534   - );
1535   - aOtherBc.push(_factory.createBcObj(
1536   - oLp, "bd", true, 1,
1537   - oStartBc.getFcTimeObj(),
1538   - _paramObj
1539   - ));
1540   - aOtherBc.push(_factory.createBcObj(
1541   - oLp, "out", true, 1,
1542   - oStartBc.getFcTimeObj(),
1543   - _paramObj
1544   - ));
1545   -
1546   - // 尾部需添加进场,例保班次
1547   - oEndBc = oLp.getBc(
1548   - oLp.fnGetBcChainInfo(0)["e_q"],
1549   - oLp.fnGetBcChainInfo(0)["e_b"]
1550   - );
1551   - oEndBc.fnSetIsLastBc(false); // 有可能最后一个班次是吃饭班次,重置
1552   - oEndBc.fnSetEatTime(0); // 有可能最后一个班次是吃饭班次,重置
1553   - aOtherBc.push(_factory.createBcObj(
1554   - oLp, "in", true, 1,
1555   - oEndBc.getArrTimeObj(),
1556   - _paramObj
1557   - ));
1558   - aOtherBc.push(_factory.createBcObj(
1559   - oLp, "lc", true, 1,
1560   - oEndBc.getArrTimeObj(),
1561   - _paramObj
1562   - ));
1563   - } else if (iBcChainCount == 2) { // 两个车次链,是分班班型
1564   - // 第一个车次链开头有出场,报到班次,车次链结尾只有进场班次
1565   - oStartBc = oLp.getBc(
1566   - oLp.fnGetBcChainInfo(0)["s_q"],
1567   - oLp.fnGetBcChainInfo(0)["s_b"]
1568   - );
1569   - aOtherBc.push(_factory.createBcObj(
1570   - oLp, "bd", true, 1,
1571   - oStartBc.getFcTimeObj(),
1572   - _paramObj
1573   - ));
1574   - aOtherBc.push(_factory.createBcObj(
1575   - oLp, "out", true, 1,
1576   - oStartBc.getFcTimeObj(),
1577   - _paramObj
1578   - ));
1579   -
1580   - oEndBc = oLp.getBc(
1581   - oLp.fnGetBcChainInfo(0)["e_q"],
1582   - oLp.fnGetBcChainInfo(0)["e_b"]
1583   - );
1584   - aOtherBc.push(_factory.createBcObj(
1585   - oLp, "in", true, 1,
1586   - oEndBc.getArrTimeObj(),
1587   - _paramObj
1588   - ));
1589   -
1590   - // 第二个车次链开头有出场,报到班次,车次链结尾有进场,报到班次
1591   - oStartBc = oLp.getBc(
1592   - oLp.fnGetBcChainInfo(1)["s_q"],
1593   - oLp.fnGetBcChainInfo(1)["s_b"]
1594   - );
1595   - aOtherBc.push(_factory.createBcObj(
1596   - oLp, "bd", true, 1,
1597   - oStartBc.getFcTimeObj(),
1598   - _paramObj
1599   - ));
1600   - aOtherBc.push(_factory.createBcObj(
1601   - oLp, "out", true, 1,
1602   - oStartBc.getFcTimeObj(),
1603   - _paramObj
1604   - ));
1605   -
1606   - oEndBc = oLp.getBc(
1607   - oLp.fnGetBcChainInfo(1)["e_q"],
1608   - oLp.fnGetBcChainInfo(1)["e_b"]
1609   - );
1610   - aOtherBc.push(_factory.createBcObj(
1611   - oLp, "in", true, 1,
1612   - oEndBc.getArrTimeObj(),
1613   - _paramObj
1614   - ));
1615   - aOtherBc.push(_factory.createBcObj(
1616   - oLp, "lc", true, 1,
1617   - oEndBc.getArrTimeObj(),
1618   - _paramObj
1619   - ));
1620   -
1621   -
1622   - } else {
1623   - // 2个车次链以上,暂时没有此班型
1624   - }
1625   -
1626   - oLp.addOtherBcArray(aOtherBc);
1627   - }
1628   - },
1629   -
1630   - /**
1631   - * 祛除上标线开头的删除标记的班次。
1632   - */
1633   - fnRemoveDelFirstFlagBc: function() {
1634   - var oLp = _internalLpArray[0];
1635   - var aMinBcIndex = oLp.getMinBcObjPosition();
1636   - if (oLp.getBc(aMinBcIndex[0], aMinBcIndex[1]).fnIsDelFlag()) {
1637   - oLp.removeBc(aMinBcIndex[0], aMinBcIndex[1]);
1638   - }
1639   - },
1640   - /**
1641   - * 祛除上标线结尾的删除标记的班次。
1642   - */
1643   - fnRemoveDelLastFlagBc: function() {
1644   - var oLp = _internalLpArray[0];
1645   - var aMaxBcIndex = oLp.getMaxBcObjPosition();
1646   - if (oLp.getBc(aMaxBcIndex[0], aMaxBcIndex[1]).fnIsDelFlag()) {
1647   - oLp.removeBc(aMaxBcIndex[0], aMaxBcIndex[1]);
1648   - }
1649   - },
1650   -
1651   - /**
1652   - * 调整路牌班次间隔(核准周转时间,停站时间)。
1653   - * @param iFre int 迭代次数
1654   - */
1655   - fnAdjustLpBcInterval: function(iFre) {
1656   - if (iFre > 0) {
1657   - for (var i = 0; i < _internalLpArray.length; i++) {
1658   - _internalLpArray[i].fnAdjustBcInterval(
1659   - this.fnCalcuAverPeakStopTime(),
1660   - this.fnCalcuAverTroughStopTime(),
1661   - _paramObj);
1662   - }
1663   -
1664   - this.fnAdjustLpBcInterval(iFre - 1);
1665   - }
1666   - },
1667   -
1668   - /**
1669   - * 调整班次间隔。
1670   - * @param bIsUp 是否上行
1671   - * @param oStartTime 开始时间对象
1672   - * @param iFre 迭代次数
1673   - */
1674   - fnAdjustBcInterval2_: function(bIsUp, oStartTime, iFre) {
1675   - if (iFre > 0) {
1676   - var aBc = _fnGetBcList2(bIsUp, oStartTime); // 指定方向的班次列表
1677   - aBc.sort(function(o1, o2) {
1678   - if (o1.getFcTimeObj().isBefore(o2.getFcTimeObj())) {
1679   - return -1;
1680   - } else {
1681   - return 1;
1682   - }
1683   - });
1684   - var i;
1685   - var j;
1686   -
1687   - var iBcCountOfGroup = 3; // 3个班次取一次计算
1688   - var aBcOfGroup; // 3个班次列表
1689   - var aBcIntervalOfGroup; // 班次间隔列表,如:3个班次,2个间隔
1690   -
1691   - for (i = 0; i <= aBc.length - iBcCountOfGroup; i++) {
1692   - aBcOfGroup = [];
1693   - aBcIntervalOfGroup = [];
1694   - for (j = i; j < i + iBcCountOfGroup; j++) {
1695   - aBcOfGroup.push(aBc[j]);
1696   - }
1697   -
1698   - for (j = 0; j < aBcOfGroup.length; j++) {
1699   - if (j < aBcOfGroup.length - 1) {
1700   - aBcIntervalOfGroup.push(aBcOfGroup[j + 1].getFcTimeObj().diff(
1701   - aBcOfGroup[j].getFcTimeObj(), "m"));
1702   - }
1703   - }
1704   -
1705   - if (aBcIntervalOfGroup[0] < 19) {
1706   - aBcOfGroup[1].addMinuteToFcsj(1);
1707   - } else if (aBcIntervalOfGroup[0] > 20) {
1708   - aBcOfGroup[1].addMinuteToFcsj(-1);
1709   - } else {
1710   - if (Math.abs(aBcIntervalOfGroup[0] - aBcIntervalOfGroup[1]) <= 1) {
1711   - //continue;
1712   - } else if (aBcIntervalOfGroup[0] > aBcIntervalOfGroup[1]) {
1713   - aBcOfGroup[1].addMinuteToFcsj(-1);
1714   - } else {
1715   - aBcOfGroup[1].addMinuteToFcsj(1);
1716   - }
1717   - }
1718   -
1719   - }
1720   -
1721   - this.fnAdjustBcInterval2(bIsUp, oStartTime, iFre - 1);
1722   - }
1723   - },
1724   -
1725   - /**
1726   - * 调整班次间隔。
1727   - * @param boolean isUp 是否上行
1728   - * @param oStartTime 开始时间对象
1729   - * @param fre int 迭代次数
1730   - */
1731   - fnAdjustBcInterval: function(isUp, oStartTime, fre) {
1732   - if (fre > 0) {
1733   - var aBc = !oStartTime ? _fnGetBcList(isUp) : _fnGetBcList2(isUp, oStartTime); // 指定方向的班次列表
1734   -
1735   - aBc.sort(function(o1, o2) {
1736   - if (o1.getFcTimeObj().isBefore(o2.getFcTimeObj())) {
1737   - return -1;
1738   - } else {
1739   - return 1;
1740   - }
1741   - });
1742   -
1743   - var i;
1744   - var j;
1745   -
1746   - var iBcCountOfGroup = 3; // 3个班次取一次计算
1747   - var aBcOfGroup; // 3个班次列表
1748   - var aBcIntervalOfGroup; // 班次间隔列表,如:3个班次,2个间隔
1749   - var oBcFcTime; // 班次发车时间
1750   -
1751   - for (i = 0; i <= aBc.length - iBcCountOfGroup; i++) {
1752   - aBcOfGroup = [];
1753   - aBcIntervalOfGroup = [];
1754   - for (j = i; j < i + iBcCountOfGroup; j++) {
1755   - aBcOfGroup.push(aBc[j]);
1756   - }
1757   -
1758   - for (j = 0; j < aBcOfGroup.length; j++) {
1759   - if (j < aBcOfGroup.length - 1) {
1760   - aBcIntervalOfGroup.push(aBcOfGroup[j + 1].getFcTimeObj().diff(
1761   - aBcOfGroup[j].getFcTimeObj(), "m"));
1762   - }
1763   - }
1764   -
1765   - // 判定规则
1766   - oBcFcTime = aBcOfGroup[1].getFcTimeObj();
1767   -
1768   - // 第一个班次发车时间不动,根据间隔,调整中间一个班次
1769   - // 如果3个班次2个间隔时间差1分钟,不调整
1770   - // 如果第一个间隔大,调整第二个班次往前1分钟
1771   - // 如果第二个间隔大,调整第二个班次往后1分钟
1772   -
1773   - if (_paramObj.isTroughBc(oBcFcTime) &&
1774   - aBcIntervalOfGroup[0] > _paramObj.getTroughMaxFcjx()) {
1775   - aBcOfGroup[1].addMinuteToFcsj(-1);
1776   - }
1777   -
1778   - //else if (_paramObj.isMPeakBc(oBcFcTime) &&
1779   - // aBcIntervalOfGroup[0] < _paramObj.getMPeakMinFcjx()) {
1780   - // aBcOfGroup[1].addMinuteToFcsj(1);
1781   - //} else if (_paramObj.isMPeakBc(oBcFcTime) &&
1782   - // aBcIntervalOfGroup[0] > _paramObj.getMPeakMaxFcjx()) {
1783   - // aBcOfGroup[1].addMinuteToFcsj(-1);
1784   - //} else if (_paramObj.isEPeakBc(oBcFcTime) &&
1785   - // aBcIntervalOfGroup[0] < _paramObj.getEPeakMinFcjx()) {
1786   - // aBcOfGroup[1].addMinuteToFcsj(1);
1787   - //} else if (_paramObj.isEPeakBc(oBcFcTime) &&
1788   - // aBcIntervalOfGroup[0] > _paramObj.getEPeakMaxFcjx()) {
1789   - // aBcOfGroup[1].addMinuteToFcsj(-1);
1790   - //}
1791   -
1792   -
1793   - else {
1794   - if (Math.abs(aBcIntervalOfGroup[0] - aBcIntervalOfGroup[1]) <= 1) {
1795   - //continue;
1796   - } else if (aBcIntervalOfGroup[0] > aBcIntervalOfGroup[1]) {
1797   - aBcOfGroup[1].addMinuteToFcsj(-1);
1798   - } else {
1799   - aBcOfGroup[1].addMinuteToFcsj(1);
1800   - }
1801   - }
1802   -
1803   - //if (Math.abs(aBcIntervalOfGroup[0] - aBcIntervalOfGroup[1]) <= 1) {
1804   - // //continue;
1805   - //} else if (aBcIntervalOfGroup[0] > aBcIntervalOfGroup[1]) {
1806   - // aBcOfGroup[1].addMinuteToFcsj(-1);
1807   - //} else {
1808   - // aBcOfGroup[1].addMinuteToFcsj(1);
1809   - //}
1810   -
1811   -
1812   - }
1813   -
1814   - this.fnAdjustBcInterval(isUp, oStartTime, fre - 1);
1815   - }
1816   -
1817   - },
1818   -
1819   - /**
1820   - * 调整班次间隔(平均间隔)。
1821   - * @param bIsUp 是否上行
1822   - * @param oStartTime 开始时间对象
1823   - */
1824   - fnAdjustBcInterval2_avg: function(bIsUp, oStartTime) {
1825   - var aBc = !oStartTime ? _fnGetBcList(bIsUp) : _fnGetBcList2(bIsUp, oStartTime); // 指定方向的班次列表
1826   - aBc.sort(function(o1, o2) {
1827   - if (o1.getFcTimeObj().isBefore(o2.getFcTimeObj())) {
1828   - return -1;
1829   - } else {
1830   - return 1;
1831   - }
1832   - });
1833   -
1834   - if (aBc.length == 0) {
1835   - return;
1836   - }
1837   -
1838   - var j;
1839   - var iCount = aBc.length - 1;
1840   - var iC1 = Math.floor(aBc[aBc.length - 1].getFcTimeObj().diff(aBc[0].getFcTimeObj(), "m") / iCount);
1841   - var iC2 = aBc[aBc.length - 1].getFcTimeObj().diff(aBc[0].getFcTimeObj(), "m") % iCount;
1842   - var iTempTime;
1843   -
1844   - for (j = 0; j < iCount - iC2; j++) {
1845   - iTempTime = aBc[j + 1].getFcTimeObj().diff(aBc[j].getFcTimeObj(), "m");
1846   - aBc[j + 1].addMinuteToFcsj(iC1 - iTempTime);
1847   - }
1848   - for (j = 0; j < iC2; j++) {
1849   - iTempTime = aBc[iCount - iC2 + j + 1].getFcTimeObj().diff(aBc[iCount - iC2 + j].getFcTimeObj(), "m");
1850   - aBc[iCount - iC2 + j + 1].addMinuteToFcsj(iC1 + 1 - iTempTime);
1851   - }
1852   -
1853   - },
1854   -
1855   - /**
1856   - * 计算高峰平均停站时间。
1857   - */
1858   - fnCalcuAverPeakStopTime: function() {
1859   - var i;
1860   - var j;
1861   - var aBc;
1862   - var iBcCount = 0;
1863   - var iSum = 0;
1864   - for (i = 0; i < _internalLpArray.length; i++) {
1865   - aBc = _internalLpArray[i].getBcArray();
1866   -
1867   - for (j = 0; j < aBc.length; j++) {
1868   - if (!_paramObj.isTroughBc(aBc[j].getArrTimeObj())) {
1869   - iBcCount ++;
1870   - iSum += aBc[j].getStopTime();
1871   - }
1872   - }
1873   - }
1874   -
1875   - return Math.floor(iSum / iBcCount);
1876   - },
1877   -
1878   - /**
1879   - * 计算低谷平均停站时间。
1880   - */
1881   - fnCalcuAverTroughStopTime: function() {
1882   - var i;
1883   - var j;
1884   - var aBc;
1885   - var iBcCount = 0;
1886   - var iSum = 0;
1887   - for (i = 0; i < _internalLpArray.length; i++) {
1888   - aBc = _internalLpArray[i].getBcArray();
1889   - for (j = 0; j < aBc.length; j++) {
1890   - if (_paramObj.isTroughBc(aBc[j].getArrTimeObj())) {
1891   - iBcCount ++;
1892   - iSum += aBc[j].getStopTime();
1893   - }
1894   - }
1895   - }
1896   -
1897   - return Math.floor(iSum / iBcCount);
1898   - },
1899   -
1900   - //------------- 其他方法 -------------//
1901   - /**
1902   - * 返回内部路牌数据列表。
1903   - * @returns {Array}
1904   - */
1905   - fnGetLpArray: function() {
1906   - return _internalLpArray;
1907   - },
1908   -
1909   - /**
1910   - * 内部数据转化成显示用的班次数组。
1911   - */
1912   - fnToGanttBcArray: function() {
1913   - var aAllBc = [];
1914   - var aLpBc = [];
1915   - var aEatBc = [];
1916   - var oLp;
1917   - var i;
1918   - var j;
1919   -
1920   - for (i = 0; i < _internalLpArray.length; i++) {
1921   - oLp = _internalLpArray[i];
1922   - aLpBc = [];
1923   - aLpBc = aLpBc.concat(oLp.getOtherBcArray(), oLp.getBcArray());
1924   -
1925   - aEatBc = [];
1926   - // 根据班次的吃饭时间添加吃饭班次
1927   - for (j = 0; j < aLpBc.length; j++) {
1928   - if (aLpBc[j].fnGetEatTime() > 0) {
1929   - aEatBc.push(_factory.createBcObj(
1930   - oLp,
1931   - "cf",
1932   - !aLpBc[j].isUp(), // 和上一个班次方向相反
1933   - 1,
1934   - _paramObj.addMinute(aLpBc[j].getArrTimeObj(), aLpBc[j].getStopTime()), // 使用上一个班次的到达时间作为开始时间
1935   - _paramObj
1936   - ));
1937   - }
1938   - }
1939   - aLpBc = aLpBc.concat(aEatBc);
1940   -
1941   - // 按照发车时间排序
1942   - aLpBc.sort(function(o1, o2) {
1943   - if (o1.getFcTimeObj().isBefore(o2.getFcTimeObj())) {
1944   - return -1;
1945   - } else {
1946   - return 1;
1947   - }
1948   - });
1949   -
1950   - // 重新赋值fcno
1951   - for (j = 0; j < aLpBc.length; j++) {
1952   - aLpBc[j].fnSetFcno(j + 1);
1953   - }
1954   -
1955   - aAllBc = aAllBc.concat(aLpBc);
1956   - }
1957   -
1958   - var aGanttBc = [];
1959   - for (i = 0; i < aAllBc.length; i++) {
1960   - aGanttBc.push(aAllBc[i].toGanttBcObj());
1961   - }
1962   -
1963   - return aGanttBc;
1964   - }
1965   -
1966   - };
1967   -
  1 +/**
  2 + * 内部行车计划对象。
  3 + * @constructor
  4 + */
  5 +var InternalScheduleObj = function(paramObj, lpArray, factory) {
  6 + // 参数对象
  7 + var _paramObj = paramObj;
  8 + // 外部的路牌数组
  9 + var _lpArray = lpArray;
  10 + // 工厂对象
  11 + var _factory = factory;
  12 +
  13 + //------------------ 初始化方法1,以及计算关联的内部变量 -----------------//
  14 + var _qIsUp; // 每一圈是上行开始还是下行开始
  15 + var _qCount = 0; // 总的圈数
  16 + var _internalLpArray = []; // 内部对象数组
  17 + var _aBxDesc = [ // 各种班型描述(班型名称,平均工时,平均需要的班次数,平均工时)
  18 + {'sType':'六工一休', 'fHoursV':6.66, 'fBcCount': 0, 'fAverTime': 0},
  19 + {'sType':'五工一休', 'fHoursV':6.85, 'fBcCount': 0, 'fAverTime': 0},
  20 + {'sType':'四工一休', 'fHoursV':7.14, 'fBcCount': 0, 'fAverTime': 0},
  21 + {'sType':'三工一休', 'fHoursV':7.61, 'fBcCount': 0, 'fAverTime': 0},
  22 + {'sType':'二工一休', 'fHoursV':8.57, 'fBcCount': 0, 'fAverTime': 0},
  23 + {'sType':'一工一休', 'fHoursV':11.42, 'fBcCount': 0, 'fAverTime': 0},
  24 + {'sType':'五工二休', 'fHoursV':7.99, 'fBcCount': 0, 'fAverTime': 0},
  25 + {'sType':'无工休', 'fHoursV':5.43, 'fBcCount': 0, 'fAverTime': 0}
  26 + ];
  27 +
  28 + var _fnInitFun1 = function() { // 初始化方法1
  29 + console.log("//---------------- 行车计划,初始化方法1 start ----------------//");
  30 +
  31 + //----------------------- 1、确定上标线的方向,圈的方向 -------------------//
  32 +
  33 + // 确定_qIsUp,哪个方向的首班车晚就用哪个
  34 + _qIsUp = _paramObj.getUpFirstDTimeObj().isBefore(
  35 + _paramObj.getDownFirstDTimeObj()) ? false : true;
  36 + // 上标线开始时间,就是方向的首班车时间
  37 + var st = _qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();
  38 + // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向
  39 + var et;
  40 + var et_IsUp;
  41 + if (_paramObj.getUpLastDtimeObj().isBefore(
  42 + _paramObj.getDownLastDTimeObj())) {
  43 + et = _paramObj.getDownLastDTimeObj();
  44 + et_IsUp = false;
  45 + } else {
  46 + et = _paramObj.getUpLastDtimeObj();
  47 + et_IsUp = true;
  48 + }
  49 +
  50 + //------------------------ 2、计算总共有多少圈 ------------------------//
  51 +
  52 + // 以开始时间,结束时间,构造上标线用连班班次发车时间
  53 + var bcFcsjArrays = []; // 班次发车时间对象数组
  54 + var bcArsjArrays = []; // 班次到达时间对象数组
  55 + var isUp = _qIsUp; // 方向
  56 + var bcCount = 1; // 班次数
  57 +
  58 + var _kssj = st; // 开始时间
  59 + var _bcsj = paramObj.calcuTravelTime(_kssj, isUp); // 班次历时
  60 + var _arrsj = paramObj.addMinute(_kssj, _bcsj); // 到达时间
  61 + var _stoptime = paramObj.fnCalcuFixedStopNumber(_arrsj, !isUp, _bcsj); // 停站时间
  62 +
  63 + do {
  64 + bcFcsjArrays.push(_kssj);
  65 + bcArsjArrays.push(_arrsj);
  66 +
  67 + _kssj = paramObj.addMinute(_kssj, _bcsj + _stoptime);
  68 + _bcsj = paramObj.calcuTravelTime(_kssj, isUp);
  69 + _arrsj = paramObj.addMinute(_kssj, _bcsj);
  70 + _stoptime = paramObj.fnCalcuFixedStopNumber(_arrsj, !isUp, _bcsj);
  71 +
  72 + bcCount ++;
  73 + isUp = !isUp;
  74 + } while(_kssj.isBefore(et));
  75 + bcCount--; // 因为先做do,所以总的班次要减1
  76 + //if (bcCount > 0 && bcArsjArrays[bcCount - 1].isAfter(et)) {
  77 + // // 如果最后一个班次的到达时间超过结束时间,也要去除
  78 + // bcFcsjArrays.splice(bcCount - 1, 1);
  79 + // bcArsjArrays.splice(bcCount - 1, 1);
  80 + // bcCount--;
  81 + //}
  82 + var _qCount_p1 = Math.floor(bcCount / 2); // 2个班次一圈
  83 + var _qCount_p2 = bcCount % 2; // 余下的1个班次也算一圈
  84 +
  85 + // 利用连班数组计算圈数
  86 + _qCount = 1; // 前面加1圈,补中标线的班次
  87 + _qCount += _qCount_p1;
  88 + _qCount += _qCount_p2;
  89 +
  90 + // 计算最后是不是还要补一圈
  91 + if (_qCount > 1) { // 总的圈数就1圈,没必要加了(其实是不可能的,除非参数里问题)
  92 + if (_qCount_p2 == 0) { // 没有余下班次,整数圈数
  93 + // 最后一个班次的方向一定和开始的方向相反,如:上-下,上-下,上-下,一共三圈,最后一个班次为下行
  94 + // 判定最后一个班次的方向和上标线判定结束时间的班次方向是否一致
  95 + if (!_qIsUp == et_IsUp) {
  96 + // 一致不用加圈数
  97 + } else {
  98 + // 不一致需要加圈补最后一个结束时间班次
  99 + _qCount ++;
  100 + }
  101 + } else {
  102 + // 有余下的圈数,最后要不补的班次不管上行,下行都在这一圈里
  103 + // 不需要在补圈数了
  104 + }
  105 + }
  106 +
  107 + //------------------------ 3、根据路牌数,圈数创建路牌对象 ----------------------//
  108 +
  109 + // 创建内部的路牌数组,并把之前的连班路牌添加进上标线路牌中
  110 + var i;
  111 + for (i = 0; i < _lpArray.length; i++) {
  112 + _internalLpArray.push(new InternalLpObj(_lpArray[i], _qCount, _qIsUp));
  113 + }
  114 + // 初始化上标线,从第1圈开始
  115 + _internalLpArray[0].initDataFromTimeToTime(bcFcsjArrays[0], et, _qIsUp, 1, _paramObj, _factory);
  116 +
  117 + // 以上标线为基础,计算各种班型工时对应的圈数、班次数
  118 + var aBcArray = _internalLpArray[0].getBcArray();
  119 + aBcArray[0].fnSetIsFirstBc(true); // 设置首班班次标识
  120 +
  121 + if (aBcArray.length % 2 != 0) { // 不能整除2,去除一个班次计算
  122 + aBcArray.splice(aBcArray.length - 1, 1);
  123 + }
  124 +
  125 + // 午饭吃饭时间
  126 + var iLTime = _paramObj.fnGetLunchTime();
  127 + // 晚饭吃饭时间
  128 + var iDTime = _paramObj.fnGetDinnerTime();
  129 + // 出场时间
  130 + var iOutTime = _qIsUp ? _paramObj.getUpOutTime() : _paramObj.getDownOutTime();
  131 + // 进场时间
  132 + var iInTime = _qIsUp ? _paramObj.getDownInTime() : _paramObj.getUpInTime();
  133 + // 例保时间
  134 + var iBTime = _paramObj.getLbTime();
  135 +
  136 + var sum = 0; // 总班次时间
  137 + for (i = 0; i < aBcArray.length; i++) {
  138 + sum += aBcArray[i].getBcTime() + aBcArray[i].getStopTime();
  139 + }
  140 + sum += iLTime; // 加午饭时间
  141 + sum += iDTime; // 加晚饭时间
  142 + for (i = 0; i < _aBxDesc.length; i++) {
  143 + _aBxDesc[i].fAverTime = sum / (aBcArray.length / 2); // 平均周转时间不算进出场,例保时间
  144 +
  145 + // 计算5休2的班次数(双进出场,4个例保)
  146 + if (i == 6) {
  147 + _aBxDesc[i].fQCount =
  148 + (_aBxDesc[i].fHoursV * 60 - iOutTime * 2 - iInTime * 2 - iBTime * 4) /
  149 + _aBxDesc[i].fAverTime;
  150 + _aBxDesc[i].fBcCount = _aBxDesc[i].fQCount * 2;
  151 + } else { // 进出场,2个例保
  152 + _aBxDesc[i].fQCount =
  153 + (_aBxDesc[i].fHoursV * 60 - iOutTime - iInTime - iBTime * 2) /
  154 + _aBxDesc[i].fAverTime;
  155 + _aBxDesc[i].fBcCount = _aBxDesc[i].fQCount * 2;
  156 + }
  157 + }
  158 +
  159 +
  160 + // 在第一个班次之前再添加一个模拟班次,用于中标线的作用
  161 + // 那一圈必定是低谷,而且圈索引0,班次索引1,暂时标记,最后删除
  162 + var iFirstStopTime =
  163 + _paramObj.fnCalcuFixedStopNumber(
  164 + _paramObj.addMinute(aBcArray[0].getFcTimeObj(), -10),
  165 + _qIsUp
  166 + );
  167 + var iXXTime = _qIsUp ? _paramObj.getDownTroughTime() : _paramObj.getUpTroughTime();
  168 + var oFlagBc = _factory.createBcObj( // 标记班次
  169 + _internalLpArray[0],
  170 + "normal",
  171 + !_qIsUp,
  172 + 1,
  173 + _paramObj.addMinute(aBcArray[0].getFcTimeObj(), -(iFirstStopTime + iXXTime)),
  174 + _paramObj
  175 + );
  176 + oFlagBc.fnSetDelFlag(true); // 标记了删除记号
  177 +
  178 + _internalLpArray[0].setBc(0, 1, oFlagBc);
  179 +
  180 + // 在最后一圈也补上一个或者2个模拟班次,暂时标记,最后需要删除
  181 + var aMaxBcIndex = _internalLpArray[0].getMaxBcObjPosition();
  182 + if (aMaxBcIndex[0] == _qCount - 1) { // 可能加半圈
  183 + oFlagBc = _factory.createBcObj( // 标记班次
  184 + _internalLpArray[0],
  185 + "normal",
  186 + !_qIsUp,
  187 + 1,
  188 + _paramObj.addMinute(
  189 + _internalLpArray[0].getBc(_qCount - 1, 0).getArrTimeObj(),
  190 + _internalLpArray[0].getBc(_qCount - 1, 0).getStopTime()),
  191 + _paramObj
  192 + );
  193 + oFlagBc.fnSetDelFlag(true); // 标记了删除记号
  194 + _internalLpArray[0].setBc(_qCount - 1, 1, oFlagBc);
  195 +
  196 + } else { // 加完整的一圈
  197 + oFlagBc = _factory.createBcObj( // 标记班次
  198 + _internalLpArray[0],
  199 + "normal",
  200 + _qIsUp,
  201 + 1,
  202 + _paramObj.addMinute(
  203 + _internalLpArray[0].getBc(_qCount - 2, 1).getArrTimeObj(),
  204 + _internalLpArray[0].getBc(_qCount - 2, 1).getStopTime()),
  205 + _paramObj
  206 + );
  207 + oFlagBc.fnSetDelFlag(true); // 标记了删除记号
  208 + _internalLpArray[0].setBc(_qCount - 1, 0, oFlagBc);
  209 +
  210 + oFlagBc = _factory.createBcObj( // 标记班次
  211 + _internalLpArray[0],
  212 + "normal",
  213 + !_qIsUp,
  214 + 1,
  215 + _paramObj.addMinute(
  216 + _internalLpArray[0].getBc(_qCount - 1, 0).getArrTimeObj(),
  217 + _internalLpArray[0].getBc(_qCount - 1, 0).getStopTime()),
  218 + _paramObj
  219 + );
  220 + oFlagBc.fnSetDelFlag(true); // 标记了删除记号
  221 + _internalLpArray[0].setBc(_qCount - 1, 1, oFlagBc);
  222 +
  223 + }
  224 +
  225 + console.log("上行首班车时间:" + _paramObj.getUpFirstDTimeObj().format("HH:mm") +
  226 + "上行末班车时间:" + _paramObj.getUpLastDtimeObj().format("HH:mm"));
  227 + console.log("下行首班车时间:" + _paramObj.getDownFirstDTimeObj().format("HH:mm") +
  228 + "下行末班车时间:" + _paramObj.getDownLastDTimeObj().format("HH:mm"));
  229 + console.log("总共计算的圈数:" + _qCount);
  230 + console.log("圈的方向isUP:" + _qIsUp);
  231 + console.log("班型描述(以下):");
  232 + console.log(_aBxDesc);
  233 + console.log("所有路牌间隔描述(以下):");
  234 + for (i = 0; i < _internalLpArray.length; i++) {
  235 + console.log(_internalLpArray[i]._$_aVerticalIntervalTime);
  236 + }
  237 + console.log("//---------------- 行车计划,初始化方法1 end ----------------//");
  238 +
  239 + };
  240 +
  241 + //------------------ 初始化方法2,以及计算关联的内部变量 ----------------//
  242 + var _approximate_zgfQIndex; // 预估早高峰车辆从第几圈开始全部发出
  243 + var _approximate_zgfBIndex; // 预估早高峰车辆从第几圈第几个班次开始全部发出(上行或下行)
  244 + var _approximate_wgfQIndex; // 预估晚高峰车辆从第几圈开始全部发出
  245 + var _approximate_wgfBIndex; // 预估晚高峰车辆从第几圈第几个班次开始全部发出(上行或下行)
  246 +
  247 + var _fnInitFun2 = function() { // 初始化方法2
  248 + console.log("//---------------- 行车计划,初始化方法2 start ----------------//");
  249 +
  250 + //------------------------ 1、计算车辆总数 ------------------------//
  251 + // 是用高峰上行周转时间除以高峰平均间隔得到的
  252 + // 这样算还算合理,车辆不多不少,待以后有新的算法再修正
  253 + var iClCount = _paramObj.calcuClzx();
  254 +
  255 + //------------------------ 2、计算所有路牌的发车在各个圈中的间隔 --------------------//
  256 + var i;
  257 + var j;
  258 + var iBindex = 1;
  259 + var iZzsj;
  260 + var oLp;
  261 + var iC1;
  262 + var iC2;
  263 +
  264 + for (i = 0; i < _qCount - 1; i++) {
  265 + while (iBindex <= 1) {
  266 + // 每圈每个方向的周转时间不一致,以上标线为主
  267 + oLp = _internalLpArray[0];
  268 + iZzsj = oLp.getBc(i + 1, iBindex).getFcTimeObj().diff(
  269 + oLp.getBc(i, iBindex).getFcTimeObj(), "m"
  270 + );
  271 +
  272 + iC1 = Math.floor(iZzsj / iClCount);
  273 + iC2 = iZzsj % iClCount;
  274 +
  275 + for (j = 0; j < iClCount - iC2; j++) {
  276 + oLp = _internalLpArray[j];
  277 + oLp.fnSetVerticalIntervalTime(i, iBindex, iC1);
  278 + }
  279 +
  280 + for (j = 0; j < iC2; j++) {
  281 + oLp = _internalLpArray[iClCount - iC2 + j];
  282 + oLp.fnSetVerticalIntervalTime(i, iBindex, iC1 + 1);
  283 + }
  284 +
  285 + iBindex ++;
  286 +
  287 + }
  288 + iBindex = 0;
  289 + }
  290 + // 最后一圈没有下一圈的参照,周转时间没发获取,由于都是低谷,所以使用倒数第二圈的间隔最为最后一圈的间隔
  291 + for (i = 0; i < _internalLpArray.length; i++) {
  292 + oLp = _internalLpArray[i];
  293 + oLp.fnSetVerticalIntervalTime(_qCount - 1, 0, oLp.fnGetVerticalIntervalTime(_qCount - 2, 0));
  294 + oLp.fnSetVerticalIntervalTime(_qCount - 1, 1, oLp.fnGetVerticalIntervalTime(_qCount - 2, 1));
  295 + }
  296 +
  297 + //------------------------ 3、预估早高峰全部出车第几圈第几个班次全部出车,计算路牌之间的发车间隔 ------------------//
  298 +
  299 + // 以上标线为标准,查找离早高峰开始时间最近的班次作为早高峰开始班次
  300 + // 以这个班次为早高峰起点,全部出车策略
  301 + var qbcIndexArray = _internalLpArray[0].getQBcIndexWithFcTime(
  302 + _paramObj.getMPeakStartTimeObj(), true, true);
  303 + var qIndex = qbcIndexArray[0]; // 第几圈
  304 + var bIndex = qbcIndexArray[1]; // 第几个班次
  305 +
  306 + for (i = 1; i < _internalLpArray.length; i++) {
  307 + _fnGenerateBcAndSetBc(i, qIndex, bIndex);
  308 + }
  309 +
  310 + _approximate_zgfQIndex = qIndex;
  311 + _approximate_zgfBIndex = bIndex;
  312 +
  313 + //------------------------ 4、预估晚高峰全部出车第几圈第几个班次全部出车,计算路牌之间的发车间隔 ------------------//
  314 +
  315 + // 以上标线为标准,查找离晚高峰开始时间最近的班次作为晚高峰开始班次
  316 + // 以这个班次为早高峰起点,全部出车策略
  317 + qbcIndexArray = _internalLpArray[0].getQBcIndexWithFcTime(
  318 + _paramObj.getEPeakStartTimeObj(), true, true);
  319 + qIndex = qbcIndexArray[0]; // 第几圈
  320 + bIndex = qbcIndexArray[1]; // 第几个班次
  321 +
  322 + for (i = 1; i < _internalLpArray.length; i++) {
  323 + _fnGenerateBcAndSetBc(i, qIndex, bIndex);
  324 + }
  325 +
  326 + _approximate_wgfQIndex = qIndex;
  327 + _approximate_wgfBIndex = bIndex;
  328 +
  329 + console.log("早高峰周转时间(固定最大停战时间):" + _paramObj.calcuPeakZzsj() + "分钟");
  330 + console.log("早高峰发车时间范围:" + _paramObj.getMPeakMinFcjx() + "分钟 --- " + _paramObj.getMPeakMaxFcjx() + "分钟");
  331 + console.log("预估早高峰第" + _approximate_zgfQIndex + "(index)圈,第" + _approximate_zgfBIndex + "(index)班次车辆全部发出");
  332 + console.log("预估晚高峰第" + _approximate_wgfQIndex + "(index)圈,第" + _approximate_wgfBIndex + "(index)班次车辆全部发出");
  333 + console.log("//---------------- 行车计划,初始化方法2 end ----------------//");
  334 + };
  335 +
  336 + //----------------------- 初始化方法3,计算连班分班的路牌分布 ----------------//
  337 + var _iBx_lb_lpcount; // 连班路牌数
  338 + var _iBx_5_2_fb_lpcount; // 5休2分班路牌数
  339 + var _iBx_other_fb_lpcount; // 其他分班路牌数
  340 +
  341 + var _fnInitFun3 = function() { // 初始化方法3
  342 + console.log("//---------------- 行车计划,初始化方法3 start ----------------//");
  343 +
  344 + //--------------------- 1、计算分班连班班型车辆分布数 --------------------//
  345 + // 总共车辆数(高峰最大车辆数)
  346 + var iCls = _paramObj.calcuClzx();
  347 + // 低谷最少配车(连班车数量)
  348 + var iDgminpc = Math.round(_paramObj.calcuTroughZzsj() / _paramObj.getTroughMaxFcjx());
  349 + // 加班车路牌数(做5休2的路牌数)
  350 + var i_5_2_lpes = _paramObj.getJBLpes();
  351 +
  352 + // 做些简单的验证
  353 + if (iCls < iDgminpc) {
  354 + alert("总配车数小于低谷最小配车");
  355 + throw "总配车数小于低谷最小配车";
  356 + }
  357 +
  358 + if (iDgminpc < 2) {
  359 + // alert("连班路牌小于2,办不到啊");
  360 + // throw "连班路牌小于2,办不到啊";
  361 + console.log("连班路牌小于2,则5休2之外的车辆数则为连班车辆数");
  362 + iDgminpc = iCls - i_5_2_lpes;
  363 + }
  364 + if (iCls - iDgminpc < i_5_2_lpes) {
  365 + // alert("总分班路牌数小于加班路牌数");
  366 + // throw "总分班路牌数小于加班路牌数";
  367 + console.log("总分班路牌数小于加班路牌数,则忽略其他分班路牌数");
  368 + iDgminpc = iCls - i_5_2_lpes;
  369 + }
  370 +
  371 + //// 修正连班路牌数,班次间隔大于20的,加1,直至班次间隔小于20
  372 + //while(_paramObj.calcuPeakZzsj() / iDgminpc > 20) {
  373 + // iDgminpc ++;
  374 + //}
  375 + _iBx_lb_lpcount = iDgminpc;
  376 +
  377 + _iBx_5_2_fb_lpcount = i_5_2_lpes;
  378 + _iBx_other_fb_lpcount = iCls - _iBx_lb_lpcount - i_5_2_lpes;
  379 +
  380 + //------------------------ 2、利用间隔法计算连班路牌分布 --------------------//
  381 + var i;
  382 + var j;
  383 + var iC1 = Math.floor(_internalLpArray.length / _iBx_lb_lpcount);
  384 + var iC2 = _internalLpArray.length % _iBx_lb_lpcount;
  385 + var iLpIndex;
  386 +
  387 + for (i = 0; i < _iBx_lb_lpcount - iC2; i++) {
  388 + iLpIndex = i * iC1;
  389 + _internalLpArray[iLpIndex].setBxLb(true);
  390 + _internalLpArray[iLpIndex].setBxDesc("连班");
  391 + }
  392 + for (j = 0; j < iC2; j++) {
  393 + iLpIndex = i * iC1 + j * (iC1 + 1);
  394 + _internalLpArray[iLpIndex].setBxLb(true);
  395 + _internalLpArray[iLpIndex].setBxDesc("连班");
  396 + }
  397 +
  398 + //------------------------ 3、利用间隔法计算分班班型路牌分布 --------------------//
  399 + // 获取分班路牌索引
  400 + var aNotLbIndexes = [];
  401 + for (i = 0; i < _internalLpArray.length; i++) {
  402 + if (!_internalLpArray[i].isBxLb()) {
  403 + aNotLbIndexes.push(i);
  404 + }
  405 + }
  406 + // 先5休2分班
  407 + iC1 = Math.floor(aNotLbIndexes.length / _iBx_5_2_fb_lpcount);
  408 + iC2 = aNotLbIndexes.length % _iBx_5_2_fb_lpcount;
  409 +
  410 + for (i = 0; i < _iBx_5_2_fb_lpcount - iC2; i++) {
  411 + iLpIndex = aNotLbIndexes[i * iC1];
  412 + _internalLpArray[iLpIndex].setBxLb(false);
  413 + _internalLpArray[iLpIndex].setBxFb(true);
  414 + _internalLpArray[iLpIndex].setBxFb5_2(true);
  415 + _internalLpArray[iLpIndex].setBxDesc("5休2分班");
  416 + }
  417 + for (i = 0; i < iC2; i++) {
  418 + iLpIndex = aNotLbIndexes[_iBx_5_2_fb_lpcount - iC2 + i * (iC1 + 1)];
  419 + _internalLpArray[iLpIndex].setBxLb(false);
  420 + _internalLpArray[iLpIndex].setBxFb(true);
  421 + _internalLpArray[iLpIndex].setBxFb5_2(true);
  422 + _internalLpArray[iLpIndex].setBxDesc("5休2分班");
  423 + }
  424 + // 其他分班
  425 + for (i = 0; i < aNotLbIndexes.length; i++) {
  426 + iLpIndex = aNotLbIndexes[i];
  427 + if (!_internalLpArray[iLpIndex].isBxFb5_2()) {
  428 + _internalLpArray[iLpIndex].setBxLb(false);
  429 + _internalLpArray[iLpIndex].setBxFb(true);
  430 + _internalLpArray[iLpIndex].setBxFb5_2(false);
  431 + _internalLpArray[iLpIndex].setBxDesc("其他分班");
  432 + }
  433 + }
  434 +
  435 + console.log("高峰周转时间:" + _paramObj.calcuPeakZzsj());
  436 + console.log("连班路牌数:" + _iBx_lb_lpcount);
  437 + console.log("5休2分班路牌数:" + _iBx_5_2_fb_lpcount);
  438 + console.log("其他分班路牌数:" + _iBx_other_fb_lpcount);
  439 + var aLbIndexes = [];
  440 + for (i = 0; i < _internalLpArray.length; i++) {
  441 + if (_internalLpArray[i].isBxLb()) {
  442 + aLbIndexes.push(i);
  443 + }
  444 + }
  445 + console.log("连班路牌indexes=" + aLbIndexes);
  446 + var a_5_2_fbIndexes = [];
  447 + for (i = 0; i < _internalLpArray.length; i++) {
  448 + if (_internalLpArray[i].isBxFb() && _internalLpArray[i].isBxFb5_2()) {
  449 + a_5_2_fbIndexes.push(i);
  450 + }
  451 + }
  452 + console.log("5休2分班路牌indexes=" + a_5_2_fbIndexes);
  453 + var a_other_fbIndexes = [];
  454 + for (i = 0; i < _internalLpArray.length; i++) {
  455 + if (_internalLpArray[i].isBxFb() && !_internalLpArray[i].isBxFb5_2()) {
  456 + a_other_fbIndexes.push(i);
  457 + }
  458 + }
  459 + console.log("其他分班路牌indexes=" + a_other_fbIndexes);
  460 +
  461 + console.log("//---------------- 行车计划,初始化方法3 end ----------------//");
  462 + };
  463 +
  464 + //----------------------- 初始化方法4,计算中标线位置 -------------------------//
  465 + var _iZbx_lpIndex; // 中标线对应第几个路牌
  466 +
  467 + var _fnInitFun4 = function() { // 初始化方法4
  468 + console.log("//---------------- 行车计划,初始化方法4 start ----------------//");
  469 +
  470 + //---------------------------- 1、模拟一个中标线,使用临时路牌 ----------------------//
  471 + // 构造中标线
  472 + // 中标线开始时间,就是方向的首班车时间
  473 + var oSt = !_qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();
  474 + // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向
  475 + // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向
  476 + var oEt;
  477 + if (_paramObj.getUpLastDtimeObj().isBefore(
  478 + _paramObj.getDownLastDTimeObj())) {
  479 + oEt = _paramObj.getDownLastDTimeObj();
  480 + } else {
  481 + oEt = _paramObj.getUpLastDtimeObj();
  482 + }
  483 +
  484 + var oTempLp = new InternalLpObj({lpNo: -999, lpName: "-999"}, _qCount, _qIsUp);
  485 + oTempLp.initDataFromTimeToTime(
  486 + oSt,
  487 + oEt,
  488 + !_qIsUp,
  489 + 0,
  490 + _paramObj,
  491 + _factory
  492 + );
  493 +
  494 + //------------------------ 2、找出中标线的早高峰班次,计算应该插在当前路牌数组的那个位置 ----------------//
  495 + // 找出中标线对应的早高峰的班次对象
  496 + var oZb_gf_bc = oTempLp.getBc(_approximate_zgfQIndex, _approximate_zgfBIndex);
  497 + //alert(oZb_gf_bc.getFcTimeObj().format("HH:mm"));
  498 +
  499 + // 把所有连班路牌高峰班次重新构造成一个一个的圈数组,计算对应中标线最近的是第几个路牌
  500 + // 中标线和上标线一样在连班路牌上
  501 + var aTempq = [];
  502 + var oTempq;
  503 + var oTempb;
  504 + var i;
  505 + var oLp;
  506 +
  507 + var aLbIndexes = []; // 连班的路牌索引
  508 + for (i = 0; i < _internalLpArray.length; i++) {
  509 + if (_internalLpArray[i].isBxLb()) {
  510 + aLbIndexes.push(i);
  511 + }
  512 + }
  513 +
  514 + for (i = 0; i < aLbIndexes.length; i++) {
  515 + oLp = _internalLpArray[aLbIndexes[i]];
  516 +
  517 + oTempb = oLp.getBc(_approximate_zgfQIndex, _approximate_zgfBIndex);
  518 + if (oTempb.isUp() == _qIsUp) {
  519 + oTempq = new InternalGroupObj(oLp, _qIsUp, oTempb, undefined);
  520 + } else {
  521 + oTempq = new InternalGroupObj(oLp, _qIsUp, undefined, oTempb);
  522 + }
  523 + aTempq.push(oTempq);
  524 +
  525 + }
  526 +
  527 + var aTtindex = oTempLp.fnGetQBcIndexWithFcTimeFromGroupArray( // 找出最接近中标线的路牌索引
  528 + oZb_gf_bc.getFcTimeObj(),
  529 + aTempq,
  530 + true,
  531 + true
  532 + );
  533 +
  534 + _iZbx_lpIndex = aLbIndexes[aTtindex[0]]; // 中标线放在第几个路牌
  535 +
  536 + oTempLp.getMinBcObj().fnSetIsFirstBc(true); // 设置首班班次标识
  537 +
  538 + if (_iZbx_lpIndex == 0) { // 如果中标线和上标线一致
  539 + var oFirstBcIndexes = oTempLp.getMinBcObjPosition();
  540 + var oFirstBc = oTempLp.getMinBcObj();
  541 + oFirstBc.setLp(_internalLpArray[_iZbx_lpIndex]);
  542 + oFirstBc.fnSetDelFlag(false);
  543 + _internalLpArray[_iZbx_lpIndex].setBc(oFirstBcIndexes[0], oFirstBcIndexes[1], oFirstBc);
  544 + } else {
  545 + oTempLp.setLp(_lpArray[_iZbx_lpIndex]); // 设置原始路牌对象
  546 + oTempLp._$_aVerticalIntervalTime = _internalLpArray[_iZbx_lpIndex]._$_aVerticalIntervalTime; // 设置纵向最小发车间隔
  547 + oTempLp.setBxLb(_internalLpArray[_iZbx_lpIndex].isBxLb());
  548 + oTempLp.setBxFb(_internalLpArray[_iZbx_lpIndex].isBxFb());
  549 + oTempLp.setBxFb5_2(_internalLpArray[_iZbx_lpIndex].isBxFb5_2());
  550 +
  551 + // 修正除了第一个班次外,其余其他班次
  552 + var iBcindex = 0;
  553 + for (i = 1; i < _qCount; i++) {
  554 + while (iBcindex <= 1) {
  555 + if (oTempLp.getBc(i, iBcindex)) { // 替换存在的班次
  556 + oTempLp.setBc(i, iBcindex, _fnGenerateBc(_iZbx_lpIndex, i, iBcindex));
  557 + }
  558 + iBcindex ++;
  559 + }
  560 + iBcindex = 0;
  561 + }
  562 +
  563 + _internalLpArray[_iZbx_lpIndex] = oTempLp;
  564 + }
  565 +
  566 + console.log("中标线对应第" + (_iZbx_lpIndex + 1) + "个路牌");
  567 +
  568 + console.log("//---------------- 行车计划,初始化方法4 end ----------------//");
  569 + };
  570 +
  571 + //-------------------- 重要的内部方法 -----------------------//
  572 + /**
  573 + * 核心方法,利用路牌间隔纵向生成班次。
  574 + * @param iLpindex 路牌索引
  575 + * @param iQindex 圈索引
  576 + * @param iBcindex 班次索引
  577 + * @returns object InternalBcObj,失败 false
  578 + */
  579 + var _fnGenerateBc = function(iLpindex, iQindex, iBcindex) {
  580 + // 以上标线为起始点,使用路牌在不同圈,班次索引的发车间隔,计算班次
  581 + // 注意,发车间隔是指下一个班次应该距离当前班次间隔,是从下往上的
  582 +
  583 + // 1、参数验证
  584 + if (iLpindex == 0) { // 上标线的班次不需要生成
  585 + return false;
  586 + }
  587 +
  588 + // 2、计算间隔
  589 + var i;
  590 + var oLp;
  591 + var iTime = 0;
  592 + for (i = 0; i < iLpindex; i++) {
  593 + oLp = _internalLpArray[i];
  594 + iTime += oLp.fnGetVerticalIntervalTime(iQindex, iBcindex);
  595 + }
  596 +
  597 + // 3、生成班次
  598 + var _oKsbc = _internalLpArray[0].getBc(iQindex, iBcindex);
  599 + if (!_oKsbc) {
  600 + return false;
  601 + }
  602 + var _oKssj = _paramObj.addMinute(_oKsbc.getFcTimeObj(), iTime);
  603 + var _oBc = _factory.createBcObj(
  604 + _internalLpArray[iLpindex],
  605 + "normal", _oKsbc.isUp(),
  606 + 1, _oKssj, _paramObj);
  607 +
  608 + return _oBc;
  609 +
  610 + };
  611 +
  612 + /**
  613 + * 核心方法,在指定位置生成班次并添加到路牌指定位置中。
  614 + * @param lpIndex 第几个路牌
  615 + * @param qIndex 第几圈
  616 + * @param bcIndex 第几个班次
  617 + */
  618 + var _fnGenerateBcAndSetBc = function(lpIndex, qIndex, bcIndex) {
  619 + var _bcObj = _fnGenerateBc(lpIndex, qIndex, bcIndex);
  620 + if (_bcObj) {
  621 + _internalLpArray[lpIndex].setBc(qIndex, bcIndex, _bcObj);
  622 + }
  623 + };
  624 +
  625 + /**
  626 + * 获取班次列表。
  627 + * @param oIsUp 是否上行
  628 + * @param oStartTime 开始时间对象
  629 + * @returns [(InternalBcObj)]
  630 + */
  631 + var _fnGetBcList2 = function(oIsUp, oStartTime) {
  632 + var i;
  633 + var j;
  634 + var oLp;
  635 + var oBc;
  636 + var aBc = [];
  637 +
  638 + for (j = 0; j < _qCount; j++) {
  639 + for (i = 0; i < _internalLpArray.length; i++) {
  640 + oLp = _internalLpArray[i];
  641 + oBc = oLp.getBc(
  642 + j,
  643 + _qIsUp == oIsUp ? 0 : 1
  644 + );
  645 + if (oBc && oBc.getFcTimeObj().isAfter(oStartTime)) {
  646 + aBc.push(oBc);
  647 + }
  648 + }
  649 + }
  650 +
  651 + var aBcFcTime = [];
  652 + for (i = 0; i < aBc.length; i++) {
  653 + oBc = aBc[i];
  654 + aBcFcTime.push(oBc.getFcTimeObj().format("HH:mm"));
  655 + }
  656 + console.log((oIsUp ? "上行班次列表:" : "下行班次列表:") + aBcFcTime.join(","));
  657 +
  658 + return aBc;
  659 + };
  660 +
  661 + /**
  662 + * 获取班次列表。
  663 + * @param isUp boolean 是否上行
  664 + * @returns [(InternalBcObj)]
  665 + */
  666 + var _fnGetBcList = function(isUp) {
  667 + var i;
  668 + var j;
  669 + var oLp;
  670 + var oBc;
  671 + var aBc = [];
  672 +
  673 + for (j = 0; j < _qCount; j++) {
  674 + for (i = 0; i < _internalLpArray.length; i++) {
  675 + oLp = _internalLpArray[i];
  676 + oBc = oLp.getBc(
  677 + j,
  678 + _qIsUp == isUp ? 0 : 1
  679 + );
  680 + if (oBc) {
  681 + aBc.push(oBc);
  682 + }
  683 + }
  684 + }
  685 +
  686 + var aBcFcTime = [];
  687 + for (i = 0; i < aBc.length; i++) {
  688 + oBc = aBc[i];
  689 + aBcFcTime.push(oBc.getFcTimeObj().format("HH:mm"));
  690 + }
  691 + console.log((isUp ? "上行班次列表:" : "下行班次列表:") + aBcFcTime.join(","));
  692 +
  693 + return aBc;
  694 + };
  695 +
  696 + /**
  697 + * 查找离指定时间最近的前面的班次索引信息
  698 + * @param timeObj 查找时间
  699 + * @param isUp 是否上行
  700 + * @returns [{路牌index},{圈index},{班次index}]
  701 + */
  702 + var _fnFindUpClosedBcIndexWithTime = function(timeObj, isUp) {
  703 +
  704 + var _lpObj;
  705 + var _groupObj;
  706 + var _bcObj;
  707 + var _i;
  708 + var _j;
  709 + var timediff; // 时间差取绝对值
  710 +
  711 + var _lpIndex;
  712 + var _up_qIndex;
  713 + var _up_bIndex;
  714 +
  715 + for (_i = 0; _i < _qCount; _i++) {
  716 + for (_j = 0; _j < _internalLpArray.length; _j++) {
  717 + _lpObj = _internalLpArray[_j];
  718 + _groupObj = _lpObj.getGroup(_i);
  719 + _bcObj = isUp == _qIsUp ? _groupObj.getBc1() : _groupObj.getBc2();
  720 + if (!_bcObj) { // 没有班次动态生成一个,可能生成不出的
  721 + _bcObj = _fnGenerateBc(_j, _i, isUp == _qIsUp ? 0 : 1);
  722 + }
  723 + if (_bcObj) {
  724 + if (timeObj.diff(_bcObj.getFcTimeObj()) >= 0) {
  725 + if (!timediff) {
  726 + timediff = timeObj.diff(_bcObj.getFcTimeObj());
  727 + _lpIndex = _j;
  728 + _up_qIndex = _i;
  729 + _up_bIndex = isUp == _qIsUp ? 0 : 1;
  730 + } else {
  731 + if (timeObj.diff(_bcObj.getFcTimeObj()) < timediff) {
  732 + timediff = timeObj.diff(_bcObj.getFcTimeObj());
  733 + _lpIndex = _j;
  734 + _up_qIndex = _i;
  735 + _up_bIndex = isUp == _qIsUp ? 0 : 1;
  736 + }
  737 + }
  738 + }
  739 + }
  740 + }
  741 + }
  742 +
  743 + if (_lpIndex == undefined) {
  744 + return false;
  745 + }
  746 +
  747 + var bcindex = [];
  748 + bcindex.push(_lpIndex);
  749 + bcindex.push(_up_qIndex);
  750 + bcindex.push(_up_bIndex);
  751 +
  752 + return bcindex;
  753 + };
  754 +
  755 + /**
  756 + * 查找离指定时间最近的后面的班次索引信息
  757 + * @param timeObj 查找时间
  758 + * @param isUp 是否上行
  759 + * @returns [{路牌index},{圈index},{班次index}]
  760 + */
  761 + var _fnFindDownClosedBcIndexWithTime = function(timeObj, isUp) {
  762 + var _lpObj;
  763 + var _groupObj;
  764 + var _bcObj;
  765 + var _i;
  766 + var _j;
  767 + var timediff; // 时间差取绝对值
  768 +
  769 + var _lpIndex;
  770 + var _down_qIndex;
  771 + var _down_bIndex;
  772 +
  773 + var flag;
  774 +
  775 + for (_i = 0; _i < _qCount; _i++) {
  776 + for (_j = 0; _j < _internalLpArray.length; _j++) {
  777 + _lpObj = _internalLpArray[_j];
  778 + _groupObj = _lpObj.getGroup(_i);
  779 + // TODO:bug
  780 + _bcObj = isUp == _qIsUp ? _groupObj.getBc1() : _groupObj.getBc2();
  781 + if (!_bcObj) { // 没有班次动态生成一个,可能生成不出的
  782 + _bcObj = _fnGenerateBc(_j, _i, isUp == _qIsUp ? 0 : 1);
  783 + }
  784 + if (_bcObj) {
  785 + //console.log("timeobj -> bcobj diff flag " +
  786 + // timeObj.format("HH:mm") + "->" +
  787 + // _bcObj.getFcTimeObj().format("HH:mm") +
  788 + // timeObj.diff(_bcObj.getFcTimeObj()) +
  789 + // (timeObj.diff(_bcObj.getFcTimeObj()) <= 0)
  790 + //);
  791 +
  792 + flag = (timeObj.diff(_bcObj.getFcTimeObj())) <= 0;
  793 +
  794 + if (flag) {
  795 + if (!timediff) {
  796 + timediff = timeObj.diff(_bcObj.getFcTimeObj());
  797 + _lpIndex = _j;
  798 + _down_qIndex = _i;
  799 + _down_bIndex = isUp == _qIsUp ? 0 : 1;
  800 + } else {
  801 + if ((timeObj.diff(_bcObj.getFcTimeObj())) > timediff) {
  802 + timediff = timeObj.diff(_bcObj.getFcTimeObj());
  803 + _lpIndex = _j;
  804 + _down_qIndex = _i;
  805 + _down_bIndex = isUp == _qIsUp ? 0 : 1;
  806 + }
  807 + }
  808 + }
  809 + }
  810 + }
  811 + }
  812 +
  813 + if (_lpIndex == undefined) {
  814 + return false;
  815 + }
  816 +
  817 + var bcindex = [];
  818 + bcindex.push(_lpIndex);
  819 + bcindex.push(_down_qIndex);
  820 + bcindex.push(_down_bIndex);
  821 +
  822 + return bcindex;
  823 + };
  824 +
  825 + /**
  826 + * 获取班次索引。
  827 + * @param oBc 班次对象
  828 + * @returns [{路牌索引},{圈索引},{班次索引}]
  829 + */
  830 + var _fnGetBcIndex = function(oBc) {
  831 + // 路牌索引
  832 + var i;
  833 + var iLpIndex;
  834 + for (i = 0; i < _internalLpArray.length; i++) {
  835 + if (_internalLpArray[i]._$$_orign_lp_obj == oBc._$$_internal_lp_obj._$$_orign_lp_obj) {
  836 + iLpIndex = i;
  837 + break;
  838 + }
  839 + }
  840 + // 圈索引
  841 + var j;
  842 + var iGroupIndex;
  843 + var bFlag = false;
  844 + for (i = 0; i < _internalLpArray.length; i++) {
  845 + if (bFlag) {
  846 + break;
  847 + }
  848 + for (j = 0; j < _qCount; j++) {
  849 + if (_internalLpArray[i]._$_groupBcArray[j] == oBc._$$_internal_group_obj) {
  850 + iGroupIndex = j;
  851 + bFlag = true;
  852 + break;
  853 + }
  854 + }
  855 + }
  856 + // 班次索引
  857 + var iBcIndex = _qIsUp == oBc.isUp() ? 0 : 1;
  858 +
  859 + if (iLpIndex == undefined) {
  860 + return null;
  861 + } else {
  862 + return [].concat(iLpIndex, iGroupIndex, iBcIndex);
  863 + }
  864 +
  865 + };
  866 +
  867 + return {
  868 + //------------- 布局初始化方法 ------------//
  869 + /**
  870 + * 初始化数据,使用标线初始化
  871 + */
  872 + fnInitDataWithBxLayout: function() {
  873 + // 初始化布局1,构造上标线,计算圈数,把上标线数据放入第一个路牌中
  874 + _fnInitFun1();
  875 + // 初始化布局2,从上标线的某个班次开始,构造所有路牌的早高峰班次,晚高峰班次,计算路牌在各个圈中的间隔
  876 + _fnInitFun2();
  877 + // 初始化布局3,计算连班分班路牌分布
  878 + _fnInitFun3();
  879 + // 初始化布局4,计算中标线位置
  880 + _fnInitFun4();
  881 +
  882 + },
  883 +
  884 + /**
  885 + * 调整高峰班次,
  886 + * 初始化生成早高峰,晚高峰班次并不准确,因为根据高峰时间段,并不在一个完整圈内,应该是在两个或多个圈之间
  887 + * 当初始化定好布局后(上标线,中标线),然后确定每个路牌的班型(连班,分班,5休2分班)后
  888 + * 然后重新计算框在高峰时间段内的班次索引,不足的添加,之前多加的删除(只删除分班路牌上的)
  889 + * @param isZgf 是否早高峰
  890 + * @param isUp 是否上行
  891 + */
  892 + fnAdjustGfbc : function(isZgf, isUp) {
  893 + var oStartTime; // 开始时间
  894 + var oEndTime; // 结束时间
  895 + var aStartBcIndex; // 开始班次索引
  896 + var aEndBcIndex; // 结束班次索引
  897 +
  898 + oStartTime = isZgf ? _paramObj.getMPeakStartTimeObj() : _paramObj.getEPeakStartTimeObj();
  899 + oEndTime = isZgf ? _paramObj.getMPeakEndTimeObj() : _paramObj.getEPeakEndTimeObj();
  900 +
  901 + aStartBcIndex = _fnFindUpClosedBcIndexWithTime(oStartTime, isUp);
  902 + aEndBcIndex = _fnFindDownClosedBcIndexWithTime(oEndTime, isUp);
  903 +
  904 + var iLpIndex;
  905 + var iQIndex;
  906 + var iBcIndex;
  907 + var iQInternelCount; // 高峰时间段中间包含的圈数
  908 + var i;
  909 + var j;
  910 +
  911 + var oLp;
  912 +
  913 + if (aStartBcIndex && aEndBcIndex) {
  914 + iLpIndex = aStartBcIndex[0];
  915 + iQIndex = aStartBcIndex[1];
  916 + iBcIndex = aStartBcIndex[2];
  917 +
  918 + // 处理头
  919 + // 删除头部多余班次
  920 + for (j = 0; j < iLpIndex; j++) {
  921 + oLp = _internalLpArray[j];
  922 + if (oLp.isBxFb() && oLp.getBc(iQIndex, iBcIndex)) {
  923 + oLp.removeBc(iQIndex, iBcIndex);
  924 + }
  925 + }
  926 +
  927 + for (j = iLpIndex; j < _internalLpArray.length; j++) {
  928 + oLp = _internalLpArray[j];
  929 + if (!oLp.getBc(iQIndex, iBcIndex)) {
  930 + _fnGenerateBcAndSetBc(j, iQIndex, iBcIndex);
  931 + }
  932 + }
  933 +
  934 + // 处理中间
  935 + iQInternelCount = aEndBcIndex[1] - aStartBcIndex[1] - 1;
  936 + for (i = 1; i <= iQInternelCount; i++) {
  937 +
  938 + for (j = 0; j < _internalLpArray.length; j++) {
  939 + oLp = _internalLpArray[j];
  940 + if (!oLp.getBc(iQIndex + i, iBcIndex)) {
  941 + _fnGenerateBcAndSetBc(j, iQIndex + i, iBcIndex);
  942 + }
  943 + }
  944 +
  945 + }
  946 +
  947 + // 处理尾部
  948 + iLpIndex = aEndBcIndex[0];
  949 + iQIndex = aEndBcIndex[1];
  950 + iBcIndex = aEndBcIndex[2];
  951 +
  952 + // 删除尾部多余的班次
  953 + for (j = iLpIndex; j < _internalLpArray.length; j++) {
  954 + oLp = _internalLpArray[j];
  955 + if (oLp.isBxFb() && oLp.getBc(iQIndex, iBcIndex)) {
  956 + oLp.removeBc(iQIndex, iBcIndex);
  957 + }
  958 + }
  959 +
  960 + if (aStartBcIndex[1] != aEndBcIndex[1]) { // 指定时间范围跨圈
  961 + for (j = 0; j < iLpIndex; j++) {
  962 + oLp = _internalLpArray[j];
  963 + if (!oLp.getBc(iQIndex, iBcIndex)) {
  964 + _fnGenerateBcAndSetBc(j, iQIndex, iBcIndex);
  965 + }
  966 + }
  967 + } else {
  968 + // 不跨圈,不用处理,处理头的时候已经加了
  969 + }
  970 +
  971 + }
  972 +
  973 + },
  974 +
  975 + /**
  976 + * 按照营运时间要求补充班次,
  977 + * 早高峰7:45分以前出场运营,
  978 + * 晚高峰16:10分以前出场运营
  979 + */
  980 + fnCalcuLpBc_yy: function() {
  981 + // 补班次的时候,针对的是分班班型
  982 + var i;
  983 + var _oLp;
  984 + var _oBc;
  985 + var _aMinBcIndex;
  986 + var _aMaxBcIndex;
  987 +
  988 + var _qIndex;
  989 + var _bIndex;
  990 +
  991 + var _zgfCDate = _paramObj.toTimeObj("7:45");
  992 + var _wgfCDate = _paramObj.toTimeObj("16:10");
  993 + var _ccsj;
  994 +
  995 + for (i = 0; i < _internalLpArray.length; i++) {
  996 + _oLp = _internalLpArray[i];
  997 + if (_oLp.isBxFb()) { // 分班路牌
  998 + // 早高峰部分
  999 + _aMinBcIndex = _oLp.getMinBcObjPosition();
  1000 + _qIndex = _aMinBcIndex[0];
  1001 + _bIndex = _aMinBcIndex[1];
  1002 + _oBc = _oLp.getBc(_qIndex, _bIndex);
  1003 + if (_qIsUp) {
  1004 + _ccsj = _bIndex == 0 ?
  1005 + _paramObj.getUpOutTime() :
  1006 + _paramObj.getDownOutTime();
  1007 + } else {
  1008 + _ccsj = _bIndex == 0 ?
  1009 + _paramObj.getDownOutTime() :
  1010 + _paramObj.getUpOutTime();
  1011 + }
  1012 + if (_zgfCDate.isBefore(_paramObj.addMinute(_oBc.getFcTimeObj(), -_ccsj))) {
  1013 + _fnGenerateBcAndSetBc(
  1014 + i,
  1015 + _bIndex == 0 ? _qIndex - 1 : _qIndex,
  1016 + _bIndex == 0 ? 1 : 0
  1017 + )
  1018 + }
  1019 +
  1020 + // 晚高峰部分
  1021 + _aMaxBcIndex = _oLp.getMaxBcObjPosition();
  1022 + _qIndex = _aMaxBcIndex[0];
  1023 + _bIndex = _aMaxBcIndex[1];
  1024 + _oBc = _oLp.getBc(
  1025 + _bIndex == 0 ? _qIndex - 1 : _qIndex,
  1026 + _bIndex == 0 ? 1 : 0
  1027 + );
  1028 + if (!_oBc) { // 前一个班次不存在,再判定加不加
  1029 + _oBc = _oLp.getBc(_qIndex, _bIndex);
  1030 + if (_qIsUp) {
  1031 + _ccsj = _bIndex == 0 ?
  1032 + _paramObj.getUpOutTime() :
  1033 + _paramObj.getDownOutTime();
  1034 + } else {
  1035 + _ccsj = _bIndex == 0 ?
  1036 + _paramObj.getDownOutTime() :
  1037 + _paramObj.getUpOutTime();
  1038 + }
  1039 + if (_wgfCDate.isBefore(_paramObj.addMinute(_oBc.getFcTimeObj(), -_ccsj))) {
  1040 + _fnGenerateBcAndSetBc(
  1041 + i,
  1042 + _bIndex == 0 ? _qIndex - 1 : _qIndex,
  1043 + _bIndex == 0 ? 1 : 0
  1044 + )
  1045 + }
  1046 + }
  1047 + }
  1048 + }
  1049 + },
  1050 +
  1051 + /**
  1052 + * 补充做5休2的班型班次。
  1053 + * 1、确认5_2班型大致多少圈(小数点过.7进位)
  1054 + * 2、获取当前5_2两端车次链的信息,每段的班次数目,还差几个班次没加
  1055 + * 3、如果前面的车次链班次少,则从前面的车次链开始加
  1056 + * 4、如果车次链班次数一样,从从后面的车次链开始加
  1057 + * 5、加班次时都是往车次链前方加
  1058 + * 6、如果前面车次链不能再加班次了,从后面车次链加
  1059 + */
  1060 + fnCalcuLpBx_5_2: function() {
  1061 + // 计算做5休2班型所需的班次数
  1062 + var iBxBcount = _aBxDesc[6].fBcCount;
  1063 + if (iBxBcount - Math.floor(iBxBcount) > 0.7) {
  1064 + iBxBcount = Math.floor(iBxBcount) + 1;
  1065 + } else {
  1066 + iBxBcount = Math.floor(iBxBcount);
  1067 + }
  1068 +
  1069 + var i;
  1070 + var j;
  1071 + var oLp;
  1072 + var iAddBcCount;
  1073 + var oBcChain1;
  1074 + var oBcChain2;
  1075 + var iQindex;
  1076 + var iBindex;
  1077 +
  1078 + for (i = 0; i < _internalLpArray.length; i++) {
  1079 + oLp = _internalLpArray[i];
  1080 + if (oLp.isBxFb5_2()) {
  1081 + iAddBcCount = iBxBcount - oLp.getBcArray().length; // 需要添加的班次数
  1082 + for (j = 1; j <= iAddBcCount; j++) {
  1083 + oBcChain1 = oLp.fnGetBcChainInfo(0);
  1084 + oBcChain2 = oLp.fnGetBcChainInfo(1);
  1085 +
  1086 + if (oBcChain1.bcount < oBcChain2.bcount) {
  1087 + iQindex = oBcChain1.s_b == 0 ? oBcChain1.s_q - 1 : oBcChain1.s_q;
  1088 + iBindex = oBcChain1.s_b == 0 ? 1 : 0;
  1089 + // 往车次链往前不能加,就往后加
  1090 + if (_fnGenerateBc(i, iQindex, iBindex)) {
  1091 + _fnGenerateBcAndSetBc(i, iQindex, iBindex);
  1092 + } else {
  1093 + iQindex = oBcChain1.e_b == 0 ? oBcChain1.e_q : oBcChain1.e_q + 1;
  1094 + iBindex = oBcChain1.e_b == 0 ? 1 : 0;
  1095 + _fnGenerateBcAndSetBc(i, iQindex, iBindex);
  1096 + }
  1097 +
  1098 + } else if (oBcChain1.bcount > oBcChain2.bcount) {
  1099 + iQindex = oBcChain2.s_b == 0 ? oBcChain2.s_q - 1 : oBcChain2.s_q;
  1100 + iBindex = oBcChain2.s_b == 0 ? 1 : 0;
  1101 + _fnGenerateBcAndSetBc(i, iQindex, iBindex);
  1102 + } else {
  1103 + iQindex = oBcChain2.s_b == 0 ? oBcChain2.s_q - 1 : oBcChain2.s_q;
  1104 + iBindex = oBcChain2.s_b == 0 ? 1 : 0;
  1105 + _fnGenerateBcAndSetBc(i, iQindex, iBindex);
  1106 + }
  1107 + }
  1108 + }
  1109 + }
  1110 +
  1111 + },
  1112 +
  1113 + /**
  1114 + * 补其他分班班型班次。
  1115 + * 从车次链的后面开始加
  1116 + */
  1117 + fnCalcuLpBx_other: function() {
  1118 + // TODO:根据上标线的首班时间确定班型,小于05:59的做一休一,否则做二休一
  1119 + var oSt = _qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();
  1120 + var iBxIndex = 4;
  1121 + if (oSt.isBefore(_paramObj.toTimeObj("05:59"))) {
  1122 + iBxIndex = 5;
  1123 + }
  1124 + // 计算做5休2班型所需的班次数
  1125 + var iQBcount = _aBxDesc[iBxIndex].fQCount;
  1126 + var iBxBcount = Math.round(iQBcount) * 2;
  1127 +
  1128 + var i;
  1129 + var j;
  1130 + var oLp;
  1131 + var iAddBcCount;
  1132 + var oBcChain1;
  1133 + var oBcChain2;
  1134 + var iQindex;
  1135 + var iBindex;
  1136 +
  1137 + for (i = 0; i < _internalLpArray.length; i++) {
  1138 + oLp = _internalLpArray[i];
  1139 + if (oLp.isBxFb() && !oLp.isBxFb5_2()) {
  1140 + iAddBcCount = iBxBcount - oLp.getBcArray().length; // 需要添加的班次数
  1141 + for (j = 1; j <= iAddBcCount; j++) {
  1142 + oBcChain1 = oLp.fnGetBcChainInfo(0);
  1143 + oBcChain2 = oLp.fnGetBcChainInfo(1);
  1144 +
  1145 + if (oBcChain1.bcount < oBcChain2.bcount) {
  1146 + iQindex = oBcChain1.e_b == 0 ? oBcChain1.e_q : oBcChain1.e_q + 1;
  1147 + iBindex = oBcChain1.e_b == 0 ? 1 : 0;
  1148 + _fnGenerateBcAndSetBc(i, iQindex, iBindex);
  1149 + } else if (oBcChain1.bcount > oBcChain2.bcount) {
  1150 + iQindex = oBcChain2.e_b == 0 ? oBcChain2.e_q : oBcChain2.e_q + 1;
  1151 + iBindex = oBcChain2.e_b == 0 ? 1 : 0;
  1152 + _fnGenerateBcAndSetBc(i, iQindex, iBindex);
  1153 + } else {
  1154 + iQindex = oBcChain2.e_b == 0 ? oBcChain2.e_q : oBcChain2.e_q + 1;
  1155 + iBindex = oBcChain2.e_b == 0 ? 1 : 0;
  1156 + _fnGenerateBcAndSetBc(i, iQindex, iBindex);
  1157 + }
  1158 + }
  1159 + }
  1160 + }
  1161 +
  1162 + },
  1163 +
  1164 + /**
  1165 + * 补充连班路牌班次。
  1166 + * 1、上标线,中标线中间的连班路牌班次从早高峰班次一直拉到底,从早高峰班次向上标线起始班次靠拢
  1167 + * 2、中标线以下的连班路牌班次从早高峰班次一直拉到底,从早高峰班次向中标线起始班次靠拢
  1168 + */
  1169 + fnCalcuLpBx_lb: function() {
  1170 + // 补充连班的班次,参照上标线,中标线补充不足的班次
  1171 +
  1172 + var aLbLpindexes = []; // 除上标线,中标线的连班路牌索引
  1173 + var i;
  1174 + for (i = 0; i < _internalLpArray.length; i++) {
  1175 + if (_internalLpArray[i].isBxLb() && i != 0 && i != _iZbx_lpIndex) {
  1176 + aLbLpindexes.push(i);
  1177 + }
  1178 + }
  1179 +
  1180 + var oEndsj = // 结束时间
  1181 + _paramObj.getUpLastDtimeObj().isBefore(_paramObj.getDownLastDTimeObj()) ?
  1182 + _paramObj.getDownLastDTimeObj() :
  1183 + _paramObj.getUpLastDtimeObj();
  1184 +
  1185 + var oLp;
  1186 + var aMinbcPos;
  1187 + var oBc;
  1188 + var j;
  1189 + var iTempBcIndex;
  1190 +
  1191 + // 1、从最小班次开始,往后补充班次
  1192 + for (i = 0; i < aLbLpindexes.length; i++) {
  1193 + oLp = _internalLpArray[aLbLpindexes[i]];
  1194 +
  1195 + // 最小班次索引
  1196 + aMinbcPos = oLp.getMinBcObjPosition();
  1197 + // 使用纵向分隔补充班次,从最小班次向后补
  1198 + iTempBcIndex = aMinbcPos[1] == 0 ? 1 : 0;
  1199 + j = iTempBcIndex == 0 ? aMinbcPos[0] + 1 : aMinbcPos[0];
  1200 +
  1201 + while (j < _qCount) {
  1202 + while (iTempBcIndex <= 1) {
  1203 + oBc = _fnGenerateBc(aLbLpindexes[i], j, iTempBcIndex);
  1204 + if (oBc &&
  1205 + oBc.getFcTimeObj().isBefore(oEndsj) ) {
  1206 + oLp.setBc(j, iTempBcIndex, oBc);
  1207 + }
  1208 + iTempBcIndex++;
  1209 + }
  1210 + iTempBcIndex = 0;
  1211 + j++;
  1212 + }
  1213 +
  1214 + }
  1215 +
  1216 + // 2、上标线中标线之间的路牌,从最小的班次往前补充班次
  1217 +
  1218 + // 还要补充缺失的班次,差上标线几个班次要往前补上
  1219 + var iBccount;
  1220 + var iQindex;
  1221 + var iBindex;
  1222 + // 补上标线到中标线之间的连班路牌的班次
  1223 + for (i = 0; i < aLbLpindexes.length; i++) {
  1224 + if (aLbLpindexes[i] > 0 && aLbLpindexes[i] < _iZbx_lpIndex) {
  1225 + oLp = _internalLpArray[aLbLpindexes[i]];
  1226 + aMinbcPos = oLp.getMinBcObjPosition();
  1227 + iQindex = aMinbcPos[0];
  1228 + iBindex = aMinbcPos[1];
  1229 + iBccount = (iQindex - 1) * 2 + iBindex; // 距离上标线起始站点差几个班次
  1230 + for (j = 0; j < iBccount; j++) {
  1231 + if (iBindex == 0) {
  1232 + iQindex --;
  1233 + iBindex = 1;
  1234 + _fnGenerateBcAndSetBc(aLbLpindexes[i], iQindex, iBindex);
  1235 + } else if (iBindex == 1) {
  1236 + iBindex --;
  1237 + _fnGenerateBcAndSetBc(aLbLpindexes[i], iQindex, iBindex);
  1238 + }
  1239 + }
  1240 +
  1241 + }
  1242 +
  1243 + }
  1244 +
  1245 + // 3、中标线之后的路牌,从最小的班次往前补充班次
  1246 +
  1247 + // 补中标线以下的连班路牌的班次
  1248 + for (i = 0; i < aLbLpindexes.length; i++) {
  1249 + if (aLbLpindexes[i] > _iZbx_lpIndex) {
  1250 + oLp = _internalLpArray[aLbLpindexes[i]];
  1251 + aMinbcPos = oLp.getMinBcObjPosition();
  1252 + iQindex = aMinbcPos[0];
  1253 + iBindex = aMinbcPos[1];
  1254 + iBccount = (iQindex - 0) * 2 + iBindex - 1; // 距离上标线起始站点差几个班次
  1255 + for (j = 0; j < iBccount; j++) {
  1256 + if (iBindex == 0) {
  1257 + iQindex --;
  1258 + iBindex = 1;
  1259 + _fnGenerateBcAndSetBc(aLbLpindexes[i], iQindex, iBindex);
  1260 + } else if (iBindex == 1) {
  1261 + iBindex --;
  1262 + _fnGenerateBcAndSetBc(aLbLpindexes[i], iQindex, iBindex);
  1263 + }
  1264 + }
  1265 + }
  1266 + }
  1267 +
  1268 + },
  1269 +
  1270 + /**
  1271 + * 计算末班车。
  1272 + * 1、将上下行拉成上下行两个班次列表(包括标记班次)
  1273 + * 2、分别找出离末班车发车时间最近的班次,并替换时间
  1274 + * 3、删除之后的班次
  1275 + */
  1276 + fnCalcuLastBc: function() {
  1277 + var i;
  1278 + var iTimeDiff;
  1279 + var iTempTime;
  1280 + var aBc;
  1281 + var oLastBcTime;
  1282 + var oLastBcIsUp;
  1283 + var iModifyIndex;
  1284 +
  1285 + // 查找末班车早的末班车时间和方向
  1286 + if (_paramObj.getUpLastDtimeObj().isBefore(_paramObj.getDownLastDTimeObj())) {
  1287 + oLastBcTime = _paramObj.getUpLastDtimeObj();
  1288 + oLastBcIsUp = true;
  1289 + } else {
  1290 + oLastBcTime = _paramObj.getDownLastDTimeObj();
  1291 + oLastBcIsUp = false;
  1292 + }
  1293 +
  1294 + // 确定早的末班车时间
  1295 + aBc = _fnGetBcList(oLastBcIsUp);
  1296 + for (i = 0; i < aBc.length; i++) {
  1297 + iTempTime = oLastBcTime.diff(aBc[i].getFcTimeObj(), "m");
  1298 + if (iTimeDiff == undefined) {
  1299 + iTimeDiff = iTempTime;
  1300 + iModifyIndex = i;
  1301 + } else if (Math.abs(iTempTime) <= Math.abs(iTimeDiff)) {
  1302 + iTimeDiff = iTempTime;
  1303 + iModifyIndex = i;
  1304 + }
  1305 + }
  1306 + aBc[iModifyIndex].addMinuteToFcsj(iTimeDiff); // 替换成末班车时间
  1307 + aBc[iModifyIndex].fnSetDelFlag(false);
  1308 + aBc[iModifyIndex].fnSetIsLastBc(true);
  1309 + for (i = iModifyIndex + 1; i < aBc.length; i++) { // 删除多余班次
  1310 + _qIsUp == oLastBcIsUp ?
  1311 + aBc[i]._$$_internal_group_obj.setBc1(undefined) :
  1312 + aBc[i]._$$_internal_group_obj.setBc2(undefined);
  1313 + }
  1314 +
  1315 + // 查找末班车晚的末班车时间和方向
  1316 + if (_paramObj.getUpLastDtimeObj().isBefore(_paramObj.getDownLastDTimeObj())) {
  1317 + oLastBcTime = _paramObj.getDownLastDTimeObj();
  1318 + oLastBcIsUp = false;
  1319 + } else {
  1320 + oLastBcTime = _paramObj.getUpLastDtimeObj();
  1321 + oLastBcIsUp = true;
  1322 + }
  1323 + // 确定晚的末班车时间
  1324 + aBc = _fnGetBcList(oLastBcIsUp);
  1325 + var oBc;
  1326 + var aBcIndex;
  1327 + var iLpIndex;
  1328 + var iQIndex;
  1329 + var iBcIndex;
  1330 +
  1331 + iTimeDiff = undefined;
  1332 + for (i = 0; i < aBc.length; i++) {
  1333 + oBc = aBc[i];
  1334 + aBcIndex = _fnGetBcIndex(oBc);
  1335 +
  1336 + iLpIndex = aBcIndex[0];
  1337 + iQIndex = aBcIndex[2] == 0 ? aBcIndex[1] -1 : aBcIndex[1];
  1338 + iBcIndex = aBcIndex[2] == 0 ? 1 : 0;
  1339 +
  1340 + if (!_internalLpArray[iLpIndex].getBc(iQIndex, iBcIndex)) {
  1341 + continue;
  1342 + }
  1343 +
  1344 + iTempTime = oLastBcTime.diff(aBc[i].getFcTimeObj(), "m");
  1345 + if (iTimeDiff == undefined) {
  1346 + iTimeDiff = iTempTime;
  1347 + iModifyIndex = i;
  1348 + } else if (Math.abs(iTempTime) <= Math.abs(iTimeDiff)) {
  1349 + iTimeDiff = iTempTime;
  1350 + iModifyIndex = i;
  1351 + }
  1352 + }
  1353 + aBc[iModifyIndex].addMinuteToFcsj(iTimeDiff); // 替换成末班车时间
  1354 + aBc[iModifyIndex].fnSetDelFlag(false);
  1355 + aBc[iModifyIndex].fnSetIsLastBc(true);
  1356 + for (i = iModifyIndex + 1; i < aBc.length; i++) { // 删除多余班次
  1357 + _qIsUp == oLastBcIsUp ?
  1358 + aBc[i]._$$_internal_group_obj.setBc1(undefined) :
  1359 + aBc[i]._$$_internal_group_obj.setBc2(undefined);
  1360 + }
  1361 +
  1362 + },
  1363 +
  1364 + /**
  1365 + * 添加吃饭班次。
  1366 + */
  1367 + fnCalcuEatBc: function() {
  1368 + // 吃午饭时间范围,10:15 到 12:15
  1369 + // 吃晚饭时间范围,18:00 到 19:00
  1370 +
  1371 + if (!_paramObj.fnIsEat()) {
  1372 + return;
  1373 + }
  1374 +
  1375 + // 午饭index
  1376 + var aLEIndex;
  1377 + // 晚饭index
  1378 + var aDEIndex;
  1379 +
  1380 + // 所有吃饭都默认在一个方向,两个方向暂时不考虑
  1381 + if (_paramObj.fnIsUpEat()) {
  1382 + aLEIndex = _internalLpArray[0].getQBcIndexWithFcTime(_paramObj.toTimeObj("10:15"), true, false);
  1383 + aDEIndex = _internalLpArray[0].getQBcIndexWithFcTime(_paramObj.toTimeObj("18:00"), true, false);
  1384 + } else {
  1385 + aLEIndex = _internalLpArray[0].getQBcIndexWithFcTime(_paramObj.toTimeObj("10:15"), false, true);
  1386 + aDEIndex = _internalLpArray[0].getQBcIndexWithFcTime(_paramObj.toTimeObj("18:00"), false, true);
  1387 + }
  1388 +
  1389 + // 午饭第几圈,第几个班次
  1390 + var iLEQIndex = aLEIndex[0];
  1391 + var iLEBIndex = aLEIndex[1];
  1392 + // 晚饭第几圈,第几个班次
  1393 + var iDEQIndex = aDEIndex[0];
  1394 + var iDEBIndex = aDEIndex[1];
  1395 +
  1396 + // 注意,本模型只有连班才有吃饭
  1397 +
  1398 + var i;
  1399 + var oLp;
  1400 + var aLbIndex = []; // 连班班型的路牌索引
  1401 + for (i = 0; i < _internalLpArray.length; i++) {
  1402 + oLp = _internalLpArray[i];
  1403 + if (oLp.isBxLb()) {
  1404 + aLbIndex.push(i);
  1405 + }
  1406 + }
  1407 +
  1408 + var iLTime;
  1409 + var iDtime;
  1410 + var j;
  1411 + for (i = 0; i < aLbIndex.length; i++) {
  1412 + oLp = _internalLpArray[aLbIndex[i]];
  1413 +
  1414 + // 午饭
  1415 + iLTime = oLp.fnAddEatBc(iLEQIndex, iLEBIndex, _factory, _paramObj);
  1416 + // 晚饭
  1417 + iDtime = oLp.fnAddEatBc(iDEQIndex, iDEBIndex, _factory, _paramObj);
  1418 +
  1419 + if (i == aLbIndex.length - 1) {
  1420 + for (j = aLbIndex[i]; j < _internalLpArray.length; j++) {
  1421 + oLp = _internalLpArray[j];
  1422 + if (oLp.isBxFb()) { // 5休2班型不调整
  1423 + // 修正午饭之后路牌班次的发车时间
  1424 + oLp.fnAddMinuteToBcFcsj(iLEQIndex, iLEBIndex, iLTime);
  1425 + oLp.fnAddMinuteToBcFcsj(iDEQIndex, iDEBIndex, iDtime);
  1426 + }
  1427 + }
  1428 + } else {
  1429 + for (j = aLbIndex[i]; j < aLbIndex[i + 1]; j++) {
  1430 + oLp = _internalLpArray[j];
  1431 + if (oLp.isBxFb()) {
  1432 + // 修正午饭之后路牌班次的发车时间
  1433 + oLp.fnAddMinuteToBcFcsj(iLEQIndex, iLEBIndex, iLTime);
  1434 + oLp.fnAddMinuteToBcFcsj(iDEQIndex, iDEBIndex, iDtime);
  1435 + }
  1436 + }
  1437 + }
  1438 + }
  1439 +
  1440 + },
  1441 +
  1442 + /**
  1443 + * 补每个路牌的其他班次(进出场,例保班次)。
  1444 + */
  1445 + fnCalcuOtherBc_: function() {
  1446 + var i;
  1447 + var _lpObj;
  1448 + var _minBcIndex;
  1449 + var _maxBcIndex;
  1450 + var _minBc;
  1451 + var _maxBc;
  1452 + var _otherbc = [];
  1453 + var _oFbbc;
  1454 +
  1455 + for (i = 0; i < _internalLpArray.length; i++) {
  1456 + _lpObj = _internalLpArray[i];
  1457 + _minBcIndex = _lpObj.getMinBcObjPosition();
  1458 + _maxBcIndex = _lpObj.getMaxBcObjPosition();
  1459 + _minBc = _lpObj.getBc(_minBcIndex[0], _minBcIndex[1]);
  1460 + _maxBc = _lpObj.getBc(_maxBcIndex[0], _maxBcIndex[1]);
  1461 +
  1462 + _otherbc = [];
  1463 + _otherbc.push(_factory.createBcObj(
  1464 + _lpObj, "bd", true, 1,
  1465 + _minBc.getFcTimeObj(),
  1466 + _paramObj
  1467 + ));
  1468 + _otherbc.push(_factory.createBcObj(
  1469 + _lpObj, "out", true, 1,
  1470 + _minBc.getFcTimeObj(),
  1471 + _paramObj
  1472 + ));
  1473 +
  1474 + _maxBc.setArrTimeObj(_paramObj.addMinute(_maxBc.getFcTimeObj(), _maxBc.getBcTime()));
  1475 + _maxBc.setStopTime(0);
  1476 + _otherbc.push(_factory.createBcObj(
  1477 + _lpObj, "in", true, 1,
  1478 + _maxBc.getArrTimeObj(),
  1479 + _paramObj
  1480 + ));
  1481 + _otherbc.push(_factory.createBcObj(
  1482 + _lpObj, "lc", true, 1,
  1483 + _maxBc.getArrTimeObj(),
  1484 + _paramObj
  1485 + ));
  1486 +
  1487 + // 5休2分班出场例保班次
  1488 + if (_lpObj.isBxFb5_2()) {
  1489 + _oFbbc = _lpObj.getBc(
  1490 + _lpObj.fnGetBcChainInfo(1)["s_q"],
  1491 + _lpObj.fnGetBcChainInfo(1)["s_b"]
  1492 + );
  1493 +
  1494 + _otherbc.push(_factory.createBcObj(
  1495 + _lpObj, "bd", true, 1,
  1496 + _oFbbc.getFcTimeObj(),
  1497 + _paramObj
  1498 + ));
  1499 + _otherbc.push(_factory.createBcObj(
  1500 + _lpObj, "out", true, 1,
  1501 + _oFbbc.getFcTimeObj(),
  1502 + _paramObj
  1503 + ));
  1504 + }
  1505 +
  1506 + _lpObj.addOtherBcArray(_otherbc);
  1507 + }
  1508 +
  1509 + },
  1510 +
  1511 + /**
  1512 + * 补每个路牌的其他班次(进出场,例保班次)
  1513 + * 所有的车次链前后都加进出场、报道班次
  1514 + */
  1515 + fnCalcuOtherBc: function() {
  1516 + var i;
  1517 + var j;
  1518 + var iBcChainCount;
  1519 + var oLp;
  1520 + var aOtherBc;
  1521 + var oStartBc;
  1522 + var oEndBc;
  1523 +
  1524 + for (i = 0; i < _internalLpArray.length; i++) {
  1525 + aOtherBc = [];
  1526 + oLp = _internalLpArray[i];
  1527 + iBcChainCount = oLp.fnGetBcChainCount();
  1528 +
  1529 + if (iBcChainCount == 1) { // 只有一个车次链,是连班班型
  1530 + // 头部要添加出场,例保班次
  1531 + oStartBc = oLp.getBc(
  1532 + oLp.fnGetBcChainInfo(0)["s_q"],
  1533 + oLp.fnGetBcChainInfo(0)["s_b"]
  1534 + );
  1535 + aOtherBc.push(_factory.createBcObj(
  1536 + oLp, "bd", true, 1,
  1537 + oStartBc.getFcTimeObj(),
  1538 + _paramObj
  1539 + ));
  1540 + aOtherBc.push(_factory.createBcObj(
  1541 + oLp, "out", true, 1,
  1542 + oStartBc.getFcTimeObj(),
  1543 + _paramObj
  1544 + ));
  1545 +
  1546 + // 尾部需添加进场,例保班次
  1547 + oEndBc = oLp.getBc(
  1548 + oLp.fnGetBcChainInfo(0)["e_q"],
  1549 + oLp.fnGetBcChainInfo(0)["e_b"]
  1550 + );
  1551 + oEndBc.fnSetIsLastBc(false); // 有可能最后一个班次是吃饭班次,重置
  1552 + oEndBc.fnSetEatTime(0); // 有可能最后一个班次是吃饭班次,重置
  1553 + aOtherBc.push(_factory.createBcObj(
  1554 + oLp, "in", true, 1,
  1555 + oEndBc.getArrTimeObj(),
  1556 + _paramObj
  1557 + ));
  1558 + aOtherBc.push(_factory.createBcObj(
  1559 + oLp, "lc", true, 1,
  1560 + oEndBc.getArrTimeObj(),
  1561 + _paramObj
  1562 + ));
  1563 + } else if (iBcChainCount == 2) { // 两个车次链,是分班班型
  1564 + // 第一个车次链开头有出场,报到班次,车次链结尾只有进场班次
  1565 + oStartBc = oLp.getBc(
  1566 + oLp.fnGetBcChainInfo(0)["s_q"],
  1567 + oLp.fnGetBcChainInfo(0)["s_b"]
  1568 + );
  1569 + aOtherBc.push(_factory.createBcObj(
  1570 + oLp, "bd", true, 1,
  1571 + oStartBc.getFcTimeObj(),
  1572 + _paramObj
  1573 + ));
  1574 + aOtherBc.push(_factory.createBcObj(
  1575 + oLp, "out", true, 1,
  1576 + oStartBc.getFcTimeObj(),
  1577 + _paramObj
  1578 + ));
  1579 +
  1580 + oEndBc = oLp.getBc(
  1581 + oLp.fnGetBcChainInfo(0)["e_q"],
  1582 + oLp.fnGetBcChainInfo(0)["e_b"]
  1583 + );
  1584 + aOtherBc.push(_factory.createBcObj(
  1585 + oLp, "in", true, 1,
  1586 + oEndBc.getArrTimeObj(),
  1587 + _paramObj
  1588 + ));
  1589 +
  1590 + // 第二个车次链开头有出场,报到班次,车次链结尾有进场,报到班次
  1591 + oStartBc = oLp.getBc(
  1592 + oLp.fnGetBcChainInfo(1)["s_q"],
  1593 + oLp.fnGetBcChainInfo(1)["s_b"]
  1594 + );
  1595 + aOtherBc.push(_factory.createBcObj(
  1596 + oLp, "bd", true, 1,
  1597 + oStartBc.getFcTimeObj(),
  1598 + _paramObj
  1599 + ));
  1600 + aOtherBc.push(_factory.createBcObj(
  1601 + oLp, "out", true, 1,
  1602 + oStartBc.getFcTimeObj(),
  1603 + _paramObj
  1604 + ));
  1605 +
  1606 + oEndBc = oLp.getBc(
  1607 + oLp.fnGetBcChainInfo(1)["e_q"],
  1608 + oLp.fnGetBcChainInfo(1)["e_b"]
  1609 + );
  1610 + aOtherBc.push(_factory.createBcObj(
  1611 + oLp, "in", true, 1,
  1612 + oEndBc.getArrTimeObj(),
  1613 + _paramObj
  1614 + ));
  1615 + aOtherBc.push(_factory.createBcObj(
  1616 + oLp, "lc", true, 1,
  1617 + oEndBc.getArrTimeObj(),
  1618 + _paramObj
  1619 + ));
  1620 +
  1621 +
  1622 + } else {
  1623 + // 2个车次链以上,暂时没有此班型
  1624 + }
  1625 +
  1626 + oLp.addOtherBcArray(aOtherBc);
  1627 + }
  1628 + },
  1629 +
  1630 + /**
  1631 + * 祛除上标线开头的删除标记的班次。
  1632 + */
  1633 + fnRemoveDelFirstFlagBc: function() {
  1634 + var oLp = _internalLpArray[0];
  1635 + var aMinBcIndex = oLp.getMinBcObjPosition();
  1636 + if (oLp.getBc(aMinBcIndex[0], aMinBcIndex[1]).fnIsDelFlag()) {
  1637 + oLp.removeBc(aMinBcIndex[0], aMinBcIndex[1]);
  1638 + }
  1639 + },
  1640 + /**
  1641 + * 祛除上标线结尾的删除标记的班次。
  1642 + */
  1643 + fnRemoveDelLastFlagBc: function() {
  1644 + var oLp = _internalLpArray[0];
  1645 + var aMaxBcIndex = oLp.getMaxBcObjPosition();
  1646 + if (oLp.getBc(aMaxBcIndex[0], aMaxBcIndex[1]).fnIsDelFlag()) {
  1647 + oLp.removeBc(aMaxBcIndex[0], aMaxBcIndex[1]);
  1648 + }
  1649 + },
  1650 +
  1651 + /**
  1652 + * 调整路牌班次间隔(核准周转时间,停站时间)。
  1653 + * @param iFre int 迭代次数
  1654 + */
  1655 + fnAdjustLpBcInterval: function(iFre) {
  1656 + // if (iFre > 0) {
  1657 + // for (var i = 0; i < _internalLpArray.length; i++) {
  1658 + // _internalLpArray[i].fnAdjustBcInterval(
  1659 + // this.fnCalcuAverPeakStopTime(),
  1660 + // this.fnCalcuAverTroughStopTime(),
  1661 + // _paramObj);
  1662 + // }
  1663 + //
  1664 + // this.fnAdjustLpBcInterval(iFre - 1);
  1665 + // }
  1666 +
  1667 + for (var i = 0; i < _internalLpArray.length; i++) {
  1668 + _internalLpArray[i].fnAdjustBcTime(_paramObj);
  1669 + }
  1670 + },
  1671 +
  1672 + /**
  1673 + * 调整班次间隔。
  1674 + * @param bIsUp 是否上行
  1675 + * @param oStartTime 开始时间对象
  1676 + * @param iFre 迭代次数
  1677 + */
  1678 + fnAdjustBcInterval2_: function(bIsUp, oStartTime, iFre) {
  1679 + if (iFre > 0) {
  1680 + var aBc = _fnGetBcList2(bIsUp, oStartTime); // 指定方向的班次列表
  1681 + aBc.sort(function(o1, o2) {
  1682 + if (o1.getFcTimeObj().isBefore(o2.getFcTimeObj())) {
  1683 + return -1;
  1684 + } else {
  1685 + return 1;
  1686 + }
  1687 + });
  1688 + var i;
  1689 + var j;
  1690 +
  1691 + var iBcCountOfGroup = 3; // 3个班次取一次计算
  1692 + var aBcOfGroup; // 3个班次列表
  1693 + var aBcIntervalOfGroup; // 班次间隔列表,如:3个班次,2个间隔
  1694 +
  1695 + for (i = 0; i <= aBc.length - iBcCountOfGroup; i++) {
  1696 + aBcOfGroup = [];
  1697 + aBcIntervalOfGroup = [];
  1698 + for (j = i; j < i + iBcCountOfGroup; j++) {
  1699 + aBcOfGroup.push(aBc[j]);
  1700 + }
  1701 +
  1702 + for (j = 0; j < aBcOfGroup.length; j++) {
  1703 + if (j < aBcOfGroup.length - 1) {
  1704 + aBcIntervalOfGroup.push(aBcOfGroup[j + 1].getFcTimeObj().diff(
  1705 + aBcOfGroup[j].getFcTimeObj(), "m"));
  1706 + }
  1707 + }
  1708 +
  1709 + if (aBcIntervalOfGroup[0] < 19) {
  1710 + aBcOfGroup[1].addMinuteToFcsj(1);
  1711 + } else if (aBcIntervalOfGroup[0] > 20) {
  1712 + aBcOfGroup[1].addMinuteToFcsj(-1);
  1713 + } else {
  1714 + if (Math.abs(aBcIntervalOfGroup[0] - aBcIntervalOfGroup[1]) <= 1) {
  1715 + //continue;
  1716 + } else if (aBcIntervalOfGroup[0] > aBcIntervalOfGroup[1]) {
  1717 + aBcOfGroup[1].addMinuteToFcsj(-1);
  1718 + } else {
  1719 + aBcOfGroup[1].addMinuteToFcsj(1);
  1720 + }
  1721 + }
  1722 +
  1723 + }
  1724 +
  1725 + this.fnAdjustBcInterval2(bIsUp, oStartTime, iFre - 1);
  1726 + }
  1727 + },
  1728 +
  1729 + /**
  1730 + * 调整班次间隔。
  1731 + * @param boolean isUp 是否上行
  1732 + * @param oStartTime 开始时间对象
  1733 + * @param fre int 迭代次数
  1734 + */
  1735 + fnAdjustBcInterval: function(isUp, oStartTime, fre) {
  1736 + if (fre > 0) {
  1737 + var aBc = !oStartTime ? _fnGetBcList(isUp) : _fnGetBcList2(isUp, oStartTime); // 指定方向的班次列表
  1738 +
  1739 + aBc.sort(function(o1, o2) {
  1740 + if (o1.getFcTimeObj().isBefore(o2.getFcTimeObj())) {
  1741 + return -1;
  1742 + } else {
  1743 + return 1;
  1744 + }
  1745 + });
  1746 +
  1747 + var i;
  1748 + var j;
  1749 +
  1750 + var iBcCountOfGroup = 3; // 3个班次取一次计算
  1751 + var aBcOfGroup; // 3个班次列表
  1752 + var aBcIntervalOfGroup; // 班次间隔列表,如:3个班次,2个间隔
  1753 + var oBcFcTime; // 班次发车时间
  1754 +
  1755 + for (i = 0; i <= aBc.length - iBcCountOfGroup; i++) {
  1756 + aBcOfGroup = [];
  1757 + aBcIntervalOfGroup = [];
  1758 + for (j = i; j < i + iBcCountOfGroup; j++) {
  1759 + aBcOfGroup.push(aBc[j]);
  1760 + }
  1761 +
  1762 + for (j = 0; j < aBcOfGroup.length; j++) {
  1763 + if (j < aBcOfGroup.length - 1) {
  1764 + aBcIntervalOfGroup.push(aBcOfGroup[j + 1].getFcTimeObj().diff(
  1765 + aBcOfGroup[j].getFcTimeObj(), "m"));
  1766 + }
  1767 + }
  1768 +
  1769 + // 判定规则
  1770 + oBcFcTime = aBcOfGroup[1].getFcTimeObj();
  1771 +
  1772 + // 第一个班次发车时间不动,根据间隔,调整中间一个班次
  1773 + // 如果3个班次2个间隔时间差1分钟,不调整
  1774 + // 如果第一个间隔大,调整第二个班次往前1分钟
  1775 + // 如果第二个间隔大,调整第二个班次往后1分钟
  1776 +
  1777 + if (_paramObj.isTroughBc(oBcFcTime) &&
  1778 + aBcIntervalOfGroup[0] > _paramObj.getTroughMaxFcjx()) {
  1779 +
  1780 + // aBcOfGroup[1].addMinuteToFcsj(-1);
  1781 +
  1782 + // 判定是否能调整发车时间
  1783 + if (aBcOfGroup[1]._$$_internal_lp_obj.isModifyBcFcsj(aBcOfGroup[1], -1, _paramObj)) {
  1784 + aBcOfGroup[1]._$_fcsjObj.add(-1, "m");
  1785 + aBcOfGroup[1].setArrTimeObj(_paramObj.addMinute(
  1786 + aBcOfGroup[1].getFcTimeObj(),
  1787 + _paramObj.calcuTravelTime(
  1788 + aBcOfGroup[1].getFcTimeObj(),
  1789 + aBcOfGroup[1].isUp())
  1790 + ));
  1791 +
  1792 + }
  1793 + }
  1794 +
  1795 + //else if (_paramObj.isMPeakBc(oBcFcTime) &&
  1796 + // aBcIntervalOfGroup[0] < _paramObj.getMPeakMinFcjx()) {
  1797 + // aBcOfGroup[1].addMinuteToFcsj(1);
  1798 + //} else if (_paramObj.isMPeakBc(oBcFcTime) &&
  1799 + // aBcIntervalOfGroup[0] > _paramObj.getMPeakMaxFcjx()) {
  1800 + // aBcOfGroup[1].addMinuteToFcsj(-1);
  1801 + //} else if (_paramObj.isEPeakBc(oBcFcTime) &&
  1802 + // aBcIntervalOfGroup[0] < _paramObj.getEPeakMinFcjx()) {
  1803 + // aBcOfGroup[1].addMinuteToFcsj(1);
  1804 + //} else if (_paramObj.isEPeakBc(oBcFcTime) &&
  1805 + // aBcIntervalOfGroup[0] > _paramObj.getEPeakMaxFcjx()) {
  1806 + // aBcOfGroup[1].addMinuteToFcsj(-1);
  1807 + //}
  1808 +
  1809 +
  1810 + else {
  1811 + if (Math.abs(aBcIntervalOfGroup[0] - aBcIntervalOfGroup[1]) <= 1) {
  1812 + //continue;
  1813 + } else if (aBcIntervalOfGroup[0] > aBcIntervalOfGroup[1]) {
  1814 +
  1815 +
  1816 + // 判定是否能调整发车时间
  1817 + if (aBcOfGroup[1]._$$_internal_lp_obj.isModifyBcFcsj(aBcOfGroup[1], -1, _paramObj)) {
  1818 + aBcOfGroup[1]._$_fcsjObj.add(-1, "m");
  1819 + aBcOfGroup[1].setArrTimeObj(_paramObj.addMinute(
  1820 + aBcOfGroup[1].getFcTimeObj(),
  1821 + _paramObj.calcuTravelTime(
  1822 + aBcOfGroup[1].getFcTimeObj(),
  1823 + aBcOfGroup[1].isUp())
  1824 + ));
  1825 + }
  1826 +
  1827 + // aBcOfGroup[1].addMinuteToFcsj(-1);
  1828 + } else {
  1829 + // aBcOfGroup[1].addMinuteToFcsj(1);
  1830 +
  1831 + // 判定是否能调整发车时间
  1832 + if (aBcOfGroup[1]._$$_internal_lp_obj.isModifyBcFcsj(aBcOfGroup[1], 1, _paramObj)) {
  1833 + aBcOfGroup[1]._$_fcsjObj.add(1, "m");
  1834 + aBcOfGroup[1].setArrTimeObj(_paramObj.addMinute(
  1835 + aBcOfGroup[1].getFcTimeObj(),
  1836 + _paramObj.calcuTravelTime(
  1837 + aBcOfGroup[1].getFcTimeObj(),
  1838 + aBcOfGroup[1].isUp())
  1839 + ));
  1840 + }
  1841 + }
  1842 + }
  1843 +
  1844 + //if (Math.abs(aBcIntervalOfGroup[0] - aBcIntervalOfGroup[1]) <= 1) {
  1845 + // //continue;
  1846 + //} else if (aBcIntervalOfGroup[0] > aBcIntervalOfGroup[1]) {
  1847 + // aBcOfGroup[1].addMinuteToFcsj(-1);
  1848 + //} else {
  1849 + // aBcOfGroup[1].addMinuteToFcsj(1);
  1850 + //}
  1851 +
  1852 +
  1853 + }
  1854 +
  1855 + this.fnAdjustBcInterval(isUp, oStartTime, fre - 1);
  1856 + }
  1857 +
  1858 + },
  1859 +
  1860 + /**
  1861 + * 调整班次间隔(平均间隔)。
  1862 + * @param bIsUp 是否上行
  1863 + * @param oStartTime 开始时间对象
  1864 + */
  1865 + fnAdjustBcInterval2_avg: function(bIsUp, oStartTime) {
  1866 + var aBc = !oStartTime ? _fnGetBcList(bIsUp) : _fnGetBcList2(bIsUp, oStartTime); // 指定方向的班次列表
  1867 + aBc.sort(function(o1, o2) {
  1868 + if (o1.getFcTimeObj().isBefore(o2.getFcTimeObj())) {
  1869 + return -1;
  1870 + } else {
  1871 + return 1;
  1872 + }
  1873 + });
  1874 +
  1875 + if (aBc.length == 0) {
  1876 + return;
  1877 + }
  1878 +
  1879 + var j;
  1880 + var iCount = aBc.length - 1;
  1881 + var iC1 = Math.floor(aBc[aBc.length - 1].getFcTimeObj().diff(aBc[0].getFcTimeObj(), "m") / iCount);
  1882 + var iC2 = aBc[aBc.length - 1].getFcTimeObj().diff(aBc[0].getFcTimeObj(), "m") % iCount;
  1883 + var iTempTime;
  1884 +
  1885 + for (j = 0; j < iCount - iC2; j++) {
  1886 + iTempTime = aBc[j + 1].getFcTimeObj().diff(aBc[j].getFcTimeObj(), "m");
  1887 + aBc[j + 1].addMinuteToFcsj(iC1 - iTempTime);
  1888 + }
  1889 + for (j = 0; j < iC2; j++) {
  1890 + iTempTime = aBc[iCount - iC2 + j + 1].getFcTimeObj().diff(aBc[iCount - iC2 + j].getFcTimeObj(), "m");
  1891 + aBc[iCount - iC2 + j + 1].addMinuteToFcsj(iC1 + 1 - iTempTime);
  1892 + }
  1893 +
  1894 + },
  1895 +
  1896 + /**
  1897 + * 计算高峰平均停站时间。
  1898 + */
  1899 + fnCalcuAverPeakStopTime: function() {
  1900 + var i;
  1901 + var j;
  1902 + var aBc;
  1903 + var iBcCount = 0;
  1904 + var iSum = 0;
  1905 + for (i = 0; i < _internalLpArray.length; i++) {
  1906 + aBc = _internalLpArray[i].getBcArray();
  1907 +
  1908 + for (j = 0; j < aBc.length; j++) {
  1909 + if (!_paramObj.isTroughBc(aBc[j].getArrTimeObj())) {
  1910 + iBcCount ++;
  1911 + iSum += aBc[j].getStopTime();
  1912 + }
  1913 + }
  1914 + }
  1915 +
  1916 + return Math.floor(iSum / iBcCount);
  1917 + },
  1918 +
  1919 + /**
  1920 + * 计算低谷平均停站时间。
  1921 + */
  1922 + fnCalcuAverTroughStopTime: function() {
  1923 + var i;
  1924 + var j;
  1925 + var aBc;
  1926 + var iBcCount = 0;
  1927 + var iSum = 0;
  1928 + for (i = 0; i < _internalLpArray.length; i++) {
  1929 + aBc = _internalLpArray[i].getBcArray();
  1930 + for (j = 0; j < aBc.length; j++) {
  1931 + if (_paramObj.isTroughBc(aBc[j].getArrTimeObj())) {
  1932 + iBcCount ++;
  1933 + iSum += aBc[j].getStopTime();
  1934 + }
  1935 + }
  1936 + }
  1937 +
  1938 + return Math.floor(iSum / iBcCount);
  1939 + },
  1940 +
  1941 + //------------- 其他方法 -------------//
  1942 + /**
  1943 + * 返回内部路牌数据列表。
  1944 + * @returns {Array}
  1945 + */
  1946 + fnGetLpArray: function() {
  1947 + return _internalLpArray;
  1948 + },
  1949 +
  1950 + /**
  1951 + * 内部数据转化成显示用的班次数组。
  1952 + */
  1953 + fnToGanttBcArray: function() {
  1954 + var aAllBc = [];
  1955 + var aLpBc = [];
  1956 + var aEatBc = [];
  1957 + var oLp;
  1958 + var i;
  1959 + var j;
  1960 +
  1961 + for (i = 0; i < _internalLpArray.length; i++) {
  1962 + oLp = _internalLpArray[i];
  1963 + aLpBc = [];
  1964 + aLpBc = aLpBc.concat(oLp.getOtherBcArray(), oLp.getBcArray());
  1965 +
  1966 + aEatBc = [];
  1967 + // 根据班次的吃饭时间添加吃饭班次
  1968 + for (j = 0; j < aLpBc.length; j++) {
  1969 + if (aLpBc[j].fnGetEatTime() > 0) {
  1970 + aEatBc.push(_factory.createBcObj(
  1971 + oLp,
  1972 + "cf",
  1973 + !aLpBc[j].isUp(), // 和上一个班次方向相反
  1974 + 1,
  1975 + _paramObj.addMinute(aLpBc[j].getArrTimeObj(), aLpBc[j].getStopTime()), // 使用上一个班次的到达时间作为开始时间
  1976 + _paramObj
  1977 + ));
  1978 + }
  1979 + }
  1980 + aLpBc = aLpBc.concat(aEatBc);
  1981 +
  1982 + // 按照发车时间排序
  1983 + aLpBc.sort(function(o1, o2) {
  1984 + if (o1.getFcTimeObj().isBefore(o2.getFcTimeObj())) {
  1985 + return -1;
  1986 + } else {
  1987 + return 1;
  1988 + }
  1989 + });
  1990 +
  1991 + // 重新赋值fcno
  1992 + for (j = 0; j < aLpBc.length; j++) {
  1993 + aLpBc[j].fnSetFcno(j + 1);
  1994 + }
  1995 +
  1996 + aAllBc = aAllBc.concat(aLpBc);
  1997 + }
  1998 +
  1999 + var aGanttBc = [];
  2000 + for (i = 0; i < aAllBc.length; i++) {
  2001 + aGanttBc.push(aAllBc[i].toGanttBcObj());
  2002 + }
  2003 +
  2004 + return aGanttBc;
  2005 + }
  2006 +
  2007 + };
  2008 +
1968 2009 };
1969 2010 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/js/v2/main_v2.js
1   -/**
2   - * 主类。
3   - */
4   -var Main_v2 = function() {
5   -
6   - // 内部工厂类
7   - var _factoryFun = function() {
8   - return {
9   - // 创建参数
10   - createParameterObj: function(formMap, dataMap) {
11   - var paramObj = ParameterObj();
12   - paramObj.wrap(formMap, dataMap);
13   - return paramObj;
14   - },
15   - // 创建班次对象
16   - createBcObj: function(lpObj, bcType, isUp, fcno, fcTimeObj, paramObj) {
17   - var _bclc = paramObj.calcuTravelLcNumber(isUp, bcType);
18   - var _fcsj = fcTimeObj;
19   - var _bcsj = paramObj.calcuTravelTime(_fcsj, isUp);
20   - var _arrsj = paramObj.addMinute(_fcsj, _bcsj);
21   - //var _stoptime = paramObj.fnCalcuFixedStopNumber(_arrsj, !isUp, _bcsj);
22   - var _stoptime = paramObj.fnCalcuFixedStopNumber(_arrsj, !isUp, undefined);
23   - var _tccid = paramObj.getTTinfoId();
24   - var _ttinfoid = paramObj.getTTinfoId();
25   - var _xl = paramObj.getXlId();
26   - var _qdz = isUp ? paramObj.getUpQdzObj().id : paramObj.getDownQdzObj().id;
27   - var _zdz = isUp ? paramObj.getUpZdzObj().id : paramObj.getDownZdzObj().id;
28   -
29   - if (bcType == "bd") { // 早例保,传过来的发车时间是第一个班次的发车时间
30   - if (isUp) { // 上行
31   - _fcsj = paramObj.addMinute(
32   - _fcsj,
33   - -(paramObj.getUpOutTime() + paramObj.getLbTime()));
34   - _bcsj = paramObj.getLbTime();
35   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
36   - _stoptime = 0;
37   - } else { // 下行
38   - _fcsj = paramObj.addMinute(
39   - _fcsj,
40   - -(paramObj.getDownOutTime() + paramObj.getLbTime()));
41   - _bcsj = paramObj.getLbTime();
42   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
43   - _stoptime = 0;
44   - }
45   - } else if (bcType == "lc") { // 晚例保,传过来的发车时间是最后一个班次的到达时间
46   - if (isUp) { // 上行
47   - _fcsj = paramObj.addMinute(
48   - _fcsj,
49   - paramObj.getUpInTime());
50   - _bcsj = paramObj.getLbTime();
51   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
52   - _stoptime = 0;
53   - } else { // 下行
54   - _fcsj = paramObj.addMinute(
55   - _fcsj,
56   - paramObj.getDownInTime());
57   - _bcsj = paramObj.getLbTime();
58   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
59   - _stoptime = 0;
60   - }
61   - } else if (bcType == "out") { // 出场,传过来的发车时间是第一个班次的发车时间
62   - if (isUp) { // 上行
63   - _fcsj = paramObj.addMinute(
64   - _fcsj,
65   - -paramObj.getUpOutTime());
66   - _bcsj = paramObj.getUpOutTime();
67   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
68   - _stoptime = 0;
69   - } else { // 下行
70   - _fcsj = paramObj.addMinute(
71   - _fcsj,
72   - -paramObj.getDownOutTime());
73   - _bcsj = paramObj.getDownOutTime();
74   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
75   - _stoptime = 0;
76   - }
77   - } else if (bcType == "in") { // 进场,传过来的发车时间是最后一个班次的到达时间
78   - if (isUp) { // 上行
79   - _bcsj = paramObj.getUpInTime();
80   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
81   - _stoptime = 0;
82   - } else { // 下行
83   - _bcsj = paramObj.getDownInTime();
84   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
85   - _stoptime = 0;
86   - }
87   - } else if (bcType == "cf") { // 吃饭班次
88   - // 以13:00为分界,之前的为午饭,之后的为晚饭
89   - if (fcTimeObj.isBefore(paramObj.toTimeObj("13:00"))) {
90   - _bcsj = paramObj.fnGetLunchTime();
91   - } else {
92   - _bcsj = paramObj.fnGetDinnerTime();
93   - }
94   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
95   - _stoptime = 0;
96   - }
97   -
98   - var bcParamObj = {};
99   - bcParamObj.bcType = bcType; // 班次类型(normal,in_,out, bd, lc, cf等)
100   - bcParamObj.isUp = isUp; // boolean是否上下行
101   - bcParamObj.fcno = fcno; // 发车顺序号
102   - bcParamObj.fcTimeObj = _fcsj; // 发车时间对象
103   - bcParamObj.bclc = _bclc; // 班次里程
104   - bcParamObj.bcsj = _bcsj; // 班次历时
105   - bcParamObj.arrtime = _arrsj; // 到达时间对象
106   - bcParamObj.stoptime = _stoptime; // 停站时间
107   - bcParamObj.tccid = _tccid; // 停车场id
108   - bcParamObj.ttinfoid = _ttinfoid; // 时刻表id
109   - bcParamObj.xl = _xl; // 线路id
110   - bcParamObj.qdzid = _qdz; // 起点站id
111   - bcParamObj.zdzid = _zdz; // 终点站id
112   -
113   - return new InternalBcObj(lpObj, bcParamObj);
114   - }
115   - };
116   - };
117   - var _factory = _factoryFun();
118   -
119   - // 所有的时间使用moment.js计算
120   -
121   - var _paramObj; // 参数对象
122   -
123   - var _bxDesc = [ // 班型描述
124   - {'type':'六工一休','hoursV':6.66, 'minueV':'6:40', 'qcount': 0, 'avertime': 0},
125   - {'type':'五工一休','hoursV':6.85, 'minueV':'6:51', 'qcount': 0, 'avertime': 0},
126   - {'type':'四工一休','hoursV':7.14, 'minueV':'7:08', 'qcount': 0, 'avertime': 0},
127   - {'type':'三工一休','hoursV':7.61, 'minueV':'7:37', 'qcount': 0, 'avertime': 0},
128   - {'type':'二工一休','hoursV':8.57, 'minueV':'8:34', 'qcount': 0, 'avertime': 0},
129   - {'type':'一工一休','hoursV':11.42, 'minueV':'11:25', 'qcount': 0, 'avertime': 0},
130   - {'type':'五工二休','hoursV':7.99, 'minueV':'8:00', 'qcount': 0, 'avertime': 0},
131   - {'type':'无工休', 'hoursV':5.43, 'minueV':'5:43', 'qcount': 0, 'avertime': 0}
132   - ];
133   -
134   - var _funCalcuExportData_lpObjList = function(aInternalLpObj) {
135   - // 构造路牌对象
136   - var aLpObj = [];
137   - var i;
138   - var j;
139   - var z;
140   - var oInternalLp;
141   - var oInternalBc;
142   - var oInternalBc_temp;
143   - var oLp;
144   - var iZlc;
145   - var iYylc;
146   - var iKslc;
147   - var iZbc;
148   - var iZgs;
149   - var iYygs;
150   - var iYybc;
151   - for (i = 0; i < aInternalLpObj.length; i++) {
152   - oInternalLp = aInternalLpObj[i];
153   - iZlc = 0;
154   - iYylc = 0;
155   - iKslc = 0;
156   - iZgs = 0;
157   - iZbc = 0;
158   - iYygs = 0;
159   - iYybc = 0;
160   - oLp = {
161   - "lpname": oInternalLp.getLpName(), // 路牌名字
162   - "isUp": oInternalLp.isUp(), // 每圈的第一个班次是否上行
163   - "bcObjList": [], // 班次列表
164   - "groupCount": oInternalLp.fnGetGroupCount(), // 总圈数
165   - "zlc": 0, // 总里程
166   - "yylc": 0, // 营运里程
167   - "kslc": 0, // 空驶里程
168   - "zgs": 0, // 总工时
169   - "zbc": 0, // 总班次
170   - "yygs": 0, // 营运工时
171   - "yybc": 0, // 营运班次
172   - "stationRouteId1": 0, // 第一个班次起点站路由id
173   - "stationRouteId2": 0 // 第二个班次起点站路由id
174   - };
175   -
176   - // 将报到班次,进出场班次加到班次的时间上
177   - var iBcChainCount;
178   - var oStartBc;
179   - var oEndBc;
180   - var oTempBc;
181   - var aFcsj = [];
182   -
183   - iBcChainCount = oInternalLp.fnGetBcChainCount();
184   - if (iBcChainCount == 1) { // 单一车次链,连班班型
185   - oStartBc = oInternalLp.getBc(
186   - oInternalLp.fnGetBcChainInfo(0)["s_q"],
187   - oInternalLp.fnGetBcChainInfo(0)["s_b"]
188   - );
189   - oTempBc = _factory.createBcObj(
190   - oLp, "bd", true, 1,
191   - oStartBc.getFcTimeObj(),
192   - _paramObj
193   - );
194   - aFcsj.push("(到" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
195   - oLp.bcObjList.push({ // 报到班次
196   - "bcsj": oTempBc.getBcTime(), // 班次时间
197   - "ssj": oTempBc.getStopTime(), // 停站时间
198   - "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
199   -
200   - "tccid": oTempBc._$_tccid, // 停车场id
201   - "qdzid": oTempBc._$_qdzid, // 起点站id
202   - "zdzid": oTempBc._$_zdzid, // 终点站id
203   -
204   - "isUp": oTempBc._$_isUp, // 是否上行
205   - "isFb": false, // 是否分班
206   -
207   - "bcType": oTempBc._$_bcType, // 班次类型
208   - "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
209   -
210   - "groupNo": -1, // 第几圈
211   - "groupBcNo": -1 // 圈里第几个班次
212   -
213   - });
214   -
215   - oTempBc = _factory.createBcObj(
216   - oLp, "out", true, 1,
217   - oStartBc.getFcTimeObj(),
218   - _paramObj
219   - );
220   - aFcsj.push("(出" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
221   - aFcsj.push("(" + oStartBc.getFcTimeObj().format("HH:mm") + ")");
222   - oStartBc._$_fcsj_desc = aFcsj.join("");
223   -
224   - oLp.bcObjList.push({ // 出场班次
225   - "bcsj": oTempBc.getBcTime(), // 班次时间
226   - "ssj": oTempBc.getStopTime(), // 停站时间
227   - "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
228   -
229   - "tccid": oTempBc._$_tccid, // 停车场id
230   - "qdzid": oTempBc._$_qdzid, // 起点站id
231   - "zdzid": oTempBc._$_zdzid, // 终点站id
232   -
233   - "isUp": oTempBc._$_isUp, // 是否上行
234   - "isFb": false, // 是否分班
235   -
236   - "bcType": oTempBc._$_bcType, // 班次类型
237   - "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
238   -
239   - "groupNo": -1, // 第几圈
240   - "groupBcNo": -2 // 圈里第几个班次
241   -
242   - });
243   -
244   - aFcsj = [];
245   -
246   - oEndBc = oInternalLp.getBc(
247   - oInternalLp.fnGetBcChainInfo(0)["e_q"],
248   - oInternalLp.fnGetBcChainInfo(0)["e_b"]
249   - );
250   - aFcsj.push("(" + oEndBc.getFcTimeObj().format("HH:mm") + ")");
251   - oTempBc = _factory.createBcObj(
252   - oLp, "in", true, 1,
253   - oEndBc.getArrTimeObj(),
254   - _paramObj
255   - );
256   - aFcsj.push("(进" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
257   -
258   - oLp.bcObjList.push({ // 进场班次
259   - "bcsj": oTempBc.getBcTime(), // 班次时间
260   - "ssj": oTempBc.getStopTime(), // 停站时间
261   - "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
262   -
263   - "tccid": oTempBc._$_tccid, // 停车场id
264   - "qdzid": oTempBc._$_qdzid, // 起点站id
265   - "zdzid": oTempBc._$_zdzid, // 终点站id
266   -
267   - "isUp": oTempBc._$_isUp, // 是否上行
268   - "isFb": false, // 是否分班
269   -
270   - "bcType": oTempBc._$_bcType, // 班次类型
271   - "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
272   -
273   - "groupNo": oInternalLp.fnGetBcChainInfo(0)["e_b"] == 0 ?
274   - oInternalLp.fnGetBcChainInfo(0)["e_q"] :
275   - oInternalLp.fnGetBcChainInfo(0)["e_q"] + 1, // 第几圈
276   - "groupBcNo": oInternalLp.fnGetBcChainInfo(0)["e_b"] == 0 ? 1 : 0 // 圈里第几个班次
277   -
278   - });
279   -
280   - oTempBc = _factory.createBcObj(
281   - oLp, "lc", true, 1,
282   - oEndBc.getArrTimeObj(),
283   - _paramObj
284   - );
285   - aFcsj.push("(离" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
286   - oLp.bcObjList.push({ // 离场班次
287   - "bcsj": oTempBc.getBcTime(), // 班次时间
288   - "ssj": oTempBc.getStopTime(), // 停站时间
289   - "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
290   -
291   - "tccid": oTempBc._$_tccid, // 停车场id
292   - "qdzid": oTempBc._$_qdzid, // 起点站id
293   - "zdzid": oTempBc._$_zdzid, // 终点站id
294   -
295   - "isUp": oTempBc._$_isUp, // 是否上行
296   - "isFb": false, // 是否分班
297   -
298   - "bcType": oTempBc._$_bcType, // 班次类型
299   - "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
300   -
301   - "groupNo": -2, // 第几圈
302   - "groupBcNo": -4 // 圈里第几个班次
303   -
304   - });
305   -
306   - oEndBc._$_fcsj_desc = aFcsj.join("");
307   -
308   - } else if (iBcChainCount == 2) { // 两个车次链,分班班型
309   - oStartBc = oInternalLp.getBc(
310   - oInternalLp.fnGetBcChainInfo(0)["s_q"],
311   - oInternalLp.fnGetBcChainInfo(0)["s_b"]
312   - );
313   - oTempBc = _factory.createBcObj(
314   - oLp, "bd", true, 1,
315   - oStartBc.getFcTimeObj(),
316   - _paramObj
317   - );
318   - aFcsj.push("(到" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
319   - oLp.bcObjList.push({ // 报到班次
320   - "bcsj": oTempBc.getBcTime(), // 班次时间
321   - "ssj": oTempBc.getStopTime(), // 停站时间
322   - "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
323   -
324   - "tccid": oTempBc._$_tccid, // 停车场id
325   - "qdzid": oTempBc._$_qdzid, // 起点站id
326   - "zdzid": oTempBc._$_zdzid, // 终点站id
327   -
328   - "isUp": oTempBc._$_isUp, // 是否上行
329   - "isFb": false, // 是否分班
330   -
331   - "bcType": oTempBc._$_bcType, // 班次类型
332   - "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
333   -
334   - "groupNo": -1, // 第几圈
335   - "groupBcNo": -1 // 圈里第几个班次
336   -
337   - });
338   -
339   - oTempBc = _factory.createBcObj(
340   - oLp, "out", true, 1,
341   - oStartBc.getFcTimeObj(),
342   - _paramObj
343   - );
344   - aFcsj.push("(出" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
345   - aFcsj.push("(" + oStartBc.getFcTimeObj().format("HH:mm") + ")");
346   - oStartBc._$_fcsj_desc = aFcsj.join("");
347   -
348   - oLp.bcObjList.push({ // 出场班次
349   - "bcsj": oTempBc.getBcTime(), // 班次时间
350   - "ssj": oTempBc.getStopTime(), // 停站时间
351   - "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
352   -
353   - "tccid": oTempBc._$_tccid, // 停车场id
354   - "qdzid": oTempBc._$_qdzid, // 起点站id
355   - "zdzid": oTempBc._$_zdzid, // 终点站id
356   -
357   - "isUp": oTempBc._$_isUp, // 是否上行
358   - "isFb": false, // 是否分班
359   -
360   - "bcType": oTempBc._$_bcType, // 班次类型
361   - "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
362   -
363   - "groupNo": -1, // 第几圈
364   - "groupBcNo": -2 // 圈里第几个班次
365   -
366   - });
367   -
368   - aFcsj = [];
369   -
370   - oEndBc = oInternalLp.getBc(
371   - oInternalLp.fnGetBcChainInfo(0)["e_q"],
372   - oInternalLp.fnGetBcChainInfo(0)["e_b"]
373   - );
374   - aFcsj.push("(" + oEndBc.getFcTimeObj().format("HH:mm") + ")");
375   - oTempBc = _factory.createBcObj(
376   - oLp, "in", true, 1,
377   - oEndBc.getArrTimeObj(),
378   - _paramObj
379   - );
380   - aFcsj.push("(进" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
381   - oLp.bcObjList.push({ // 进场班次
382   - "bcsj": oTempBc.getBcTime(), // 班次时间
383   - "ssj": oTempBc.getStopTime(), // 停站时间
384   - "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
385   -
386   - "tccid": oTempBc._$_tccid, // 停车场id
387   - "qdzid": oTempBc._$_qdzid, // 起点站id
388   - "zdzid": oTempBc._$_zdzid, // 终点站id
389   -
390   - "isUp": oTempBc._$_isUp, // 是否上行
391   - "isFb": true, // 是否分班
392   -
393   - "bcType": oTempBc._$_bcType, // 班次类型
394   - "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
395   -
396   - "groupNo": oInternalLp.fnGetBcChainInfo(0)["e_b"] == 0 ?
397   - oInternalLp.fnGetBcChainInfo(0)["e_q"] :
398   - oInternalLp.fnGetBcChainInfo(0)["e_q"] + 1, // 第几圈
399   - "groupBcNo": oInternalLp.fnGetBcChainInfo(0)["e_b"] == 0 ? 1 : 0 // 圈里第几个班次
400   -
401   - });
402   - oEndBc._$_fcsj_desc = aFcsj.join("");
403   -
404   - aFcsj = [];
405   -
406   - oStartBc = oInternalLp.getBc(
407   - oInternalLp.fnGetBcChainInfo(1)["s_q"],
408   - oInternalLp.fnGetBcChainInfo(1)["s_b"]
409   - );
410   - oTempBc = _factory.createBcObj(
411   - oLp, "bd", true, 1,
412   - oStartBc.getFcTimeObj(),
413   - _paramObj
414   - );
415   - aFcsj.push("(到" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
416   - oLp.bcObjList.push({ // 报到班次
417   - "bcsj": oTempBc.getBcTime(), // 班次时间
418   - "ssj": oTempBc.getStopTime(), // 停站时间
419   - "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
420   -
421   - "tccid": oTempBc._$_tccid, // 停车场id
422   - "qdzid": oTempBc._$_qdzid, // 起点站id
423   - "zdzid": oTempBc._$_zdzid, // 终点站id
424   -
425   - "isUp": oTempBc._$_isUp, // 是否上行
426   - "isFb": true, // 是否分班
427   -
428   - "bcType": oTempBc._$_bcType, // 班次类型
429   - "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
430   -
431   - "groupNo": oInternalLp.fnGetBcChainInfo(1)["s_q"] - 1, // 第几圈
432   - "groupBcNo": oInternalLp.fnGetBcChainInfo(1)["s_b"] // 圈里第几个班次
433   -
434   - });
435   -
436   - oTempBc = _factory.createBcObj(
437   - oLp, "out", true, 1,
438   - oStartBc.getFcTimeObj(),
439   - _paramObj
440   - );
441   - oLp.bcObjList.push({ // 出场班次
442   - "bcsj": oTempBc.getBcTime(), // 班次时间
443   - "ssj": oTempBc.getStopTime(), // 停站时间
444   - "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
445   -
446   - "tccid": oTempBc._$_tccid, // 停车场id
447   - "qdzid": oTempBc._$_qdzid, // 起点站id
448   - "zdzid": oTempBc._$_zdzid, // 终点站id
449   -
450   - "isUp": oTempBc._$_isUp, // 是否上行
451   - "isFb": true, // 是否分班
452   -
453   - "bcType": oTempBc._$_bcType, // 班次类型
454   - "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
455   -
456   - "groupNo": oInternalLp.fnGetBcChainInfo(1)["s_b"] == 0 ?
457   - oInternalLp.fnGetBcChainInfo(1)["s_q"] - 1 :
458   - oInternalLp.fnGetBcChainInfo(1)["s_q"], // 第几圈
459   - "groupBcNo": oInternalLp.fnGetBcChainInfo(1)["s_b"] == 0 ? 1 : 0 // 圈里第几个班次
460   -
461   - });
462   - aFcsj.push("(出" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
463   - aFcsj.push("(" + oStartBc.getFcTimeObj().format("HH:mm") + ")");
464   - oStartBc._$_fcsj_desc = aFcsj.join("");
465   -
466   - aFcsj = [];
467   -
468   - oEndBc = oInternalLp.getBc(
469   - oInternalLp.fnGetBcChainInfo(1)["e_q"],
470   - oInternalLp.fnGetBcChainInfo(1)["e_b"]
471   - );
472   - aFcsj.push("(" + oEndBc.getFcTimeObj().format("HH:mm") + ")");
473   - oTempBc = _factory.createBcObj(
474   - oLp, "in", true, 1,
475   - oEndBc.getArrTimeObj(),
476   - _paramObj
477   - );
478   - aFcsj.push("(进" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
479   -
480   - oLp.bcObjList.push({ // 进场班次
481   - "bcsj": oTempBc.getBcTime(), // 班次时间
482   - "ssj": oTempBc.getStopTime(), // 停站时间
483   - "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
484   -
485   - "tccid": oTempBc._$_tccid, // 停车场id
486   - "qdzid": oTempBc._$_qdzid, // 起点站id
487   - "zdzid": oTempBc._$_zdzid, // 终点站id
488   -
489   - "isUp": oTempBc._$_isUp, // 是否上行
490   - "isFb": false, // 是否分班
491   -
492   - "bcType": oTempBc._$_bcType, // 班次类型
493   - "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
494   -
495   - "groupNo": oInternalLp.fnGetBcChainInfo(1)["e_b"] == 0 ?
496   - oInternalLp.fnGetBcChainInfo(1)["e_q"] :
497   - oInternalLp.fnGetBcChainInfo(1)["e_q"] + 1, // 第几圈
498   - "groupBcNo": oInternalLp.fnGetBcChainInfo(1)["e_b"] == 0 ? 1 : 0 // 圈里第几个班次
499   -
500   - });
501   -
502   - oTempBc = _factory.createBcObj(
503   - oLp, "lc", true, 1,
504   - oEndBc.getArrTimeObj(),
505   - _paramObj
506   - );
507   -
508   - oLp.bcObjList.push({ // 离场班次
509   - "bcsj": oTempBc.getBcTime(), // 班次时间
510   - "ssj": oTempBc.getStopTime(), // 停站时间
511   - "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
512   -
513   - "tccid": oTempBc._$_tccid, // 停车场id
514   - "qdzid": oTempBc._$_qdzid, // 起点站id
515   - "zdzid": oTempBc._$_zdzid, // 终点站id
516   -
517   - "isUp": oTempBc._$_isUp, // 是否上行
518   - "isFb": false, // 是否分班
519   -
520   - "bcType": oTempBc._$_bcType, // 班次类型
521   - "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
522   -
523   - "groupNo": -2, // 第几圈
524   - "groupBcNo": -4 // 圈里第几个班次
525   -
526   - });
527   -
528   - aFcsj.push("(离" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
529   - oEndBc._$_fcsj_desc = aFcsj.join("");
530   -
531   - }
532   -
533   - for (j = 0; j < oInternalLp.fnGetGroupCount(); j++) {
534   - for (z = 0; z < 2; z++) {
535   - oInternalBc = oInternalLp.getBc(j, z);
536   - if (oInternalBc) {
537   - if (oInternalBc.fnGetEatTime() > 0) {
538   - // 吃饭班次是下一个班次开始吃,和本班次方向相反
539   - oInternalBc_temp = oInternalLp.getBc(
540   - z == 1 ? j + 1 : j,
541   - z == 1 ? 0 : 1);
542   -
543   - oInternalBc_temp._$_fcsj_desc = "(吃" + oInternalBc_temp.getFcTimeObj().format("HH:mm") + ")";
544   - }
545   -
546   - oLp.bcObjList.push({
547   - "bcsj": oInternalBc.getBcTime(), // 班次时间
548   - "ssj": oInternalBc.getStopTime(), // 停站时间
549   - "eatsj": oInternalBc.fnGetEatTime(), // 吃饭时间
550   -
551   - "tccid": oInternalBc._$_tccid, // 停车场id
552   - "qdzid": oInternalBc._$_qdzid, // 起点站id
553   - "zdzid": oInternalBc._$_zdzid, // 终点站id
554   -
555   - "isUp": oInternalBc._$_isUp, // 是否上行
556   -
557   - "bcType": oInternalBc._$_bcType, // 班次类型
558   - "fcsj": oInternalBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
559   - "fcsjDesc" : oInternalBc._$_fcsj_desc || oInternalBc._$_fcsjObj.format("HH:mm"),
560   -
561   - "groupNo": j, // 第几圈
562   - "groupBcNo": z // 圈里第几个班次
563   -
564   - });
565   -
566   - // iZlc = 0;
567   - // iYylc = 0;
568   - // iKslc = 0;
569   - // iZgs = 0;
570   - // iZbc = 0;
571   - // iYygs = 0;
572   - // iYybc = 0;
573   -
574   - iZlc = iZlc +
575   - oInternalBc._$_bclc; // 里程
576   - iYylc = iYylc +
577   - oInternalBc._$_bclc; // 里程
578   - iYygs = iYygs +
579   - oInternalBc.getBcTime() + // 班次时间
580   - oInternalBc.getStopTime() + // 停站时间
581   - oInternalBc.fnGetEatTime(); // 吃饭时间
582   - iYybc = iYybc + 1;
583   -
584   - iZgs = iZgs +
585   - oInternalBc.getBcTime() + // 班次时间
586   - oInternalBc.getStopTime() + // 停站时间
587   - oInternalBc.fnGetEatTime(); // 吃饭时间
588   - iZbc = iZbc + 1;
589   -
590   - // 设置圈站点路由id
591   - if (oInternalBc.isUp() == oInternalLp.isUp()) { // 第一个班次
592   - if (oLp.stationRouteId1 == 0) {
593   - oLp.stationRouteId1 = oInternalBc._$_qdzid;
594   - }
595   - } else { // 第二个班次
596   - if (oLp.stationRouteId2 == 0) {
597   - oLp.stationRouteId2 = oInternalBc._$_qdzid;
598   - }
599   - }
600   -
601   - }
602   - }
603   -
604   - }
605   -
606   - for (z = 0; z < oInternalLp.getOtherBcArray().length; z++) {
607   - oInternalBc = oInternalLp.getOtherBcArray()[z];
608   - iKslc = iKslc +
609   - oInternalBc._$_bclc; // 里程
610   - iZlc = iZlc +
611   - oInternalBc._$_bclc; // 里程
612   - iZgs = iZgs +
613   - oInternalBc.getBcTime() + // 班次时间
614   - oInternalBc.getStopTime(); // 停站时间
615   - if (oInternalBc._$_bcType != "bd" &&
616   - oInternalBc._$_bcType != "lc" &&
617   - oInternalBc._$_bcType != "cf") {
618   - iZbc = iZbc + 1;
619   - }
620   - }
621   -
622   - oLp.zlc = iZlc;
623   - oLp.yylc = iYylc;
624   - oLp.kslc = iKslc;
625   - oLp.zgs = iZgs;
626   - oLp.zbc = iZbc;
627   - oLp.yygs = iYygs;
628   - oLp.yybc = iYybc;
629   - aLpObj.push(oLp);
630   - }
631   -
632   - return aLpObj;
633   - };
634   -
635   - var _funCalcuExportData_statInfoList = function(aInternalLpObj) {
636   - var countBc = 0, // 总班次
637   - serviceBc = 0, // 营运班次
638   - jcbc = 0, // 进场总班次.
639   - ccbc = 0, // 出场总班次.
640   - cfbc = 0, // 吃饭总班次.
641   - zwlbbc = 0, // 早晚例保总班次.
642   - countGs = 0.0, // 总工时
643   - servicesj = 0, // 营运班次总时间
644   - jcsj = 0.0, // 进场总时间.
645   - ccsj = 0.0, // 出场总时间.
646   - cfsj = 0.0, // 吃饭总时间.
647   - zwlbsj = 0.0, // 早晚例保总时间.
648   - ksBc = 0, // 空驶班次
649   - serviceLc = 0.0, // 营运里程
650   - ksLc = 0.0, // 空驶里程
651   - avgTzjx = 0.0, // 平均停站间隙
652   - gfServiceBc = 0, // 高峰营运班次
653   - dgServiceBc = 0, // 低谷营运班次
654   - gfAvgTzjx = 0.0, // 高峰平均停站间隙
655   - dgAvgTzjx = 0.0; // 低谷平均停站间隙
656   -
657   - var aAllBc = [];
658   - var oLp;
659   - var oBc;
660   - var i;
661   - var j;
662   -
663   - for (i = 0; i < aInternalLpObj.length; i++) {
664   - oLp = aInternalLpObj[i];
665   - for (j = 0; j < oLp.getBcArray().length; j++) {
666   - aAllBc.push(oLp.getBcArray()[j]);
667   - }
668   - for (j = 0; j < oLp.getOtherBcArray().length; j++) {
669   - aAllBc.push(oLp.getOtherBcArray()[j]);
670   - }
671   - }
672   -
673   - for (i = 0; i < aAllBc.length; i++) {
674   - oBc = aAllBc[i];
675   -
676   - if (oBc.getBcTime() > 0) {
677   - countBc = countBc + 1;
678   - countGs = countGs + oBc.getStopTime() + oBc.getBcTime();
679   - if (_paramObj.isTroughBc(oBc.getFcTimeObj())) {
680   - if (oBc._$_bcType == "normal") {
681   - dgServiceBc = dgServiceBc + 1;
682   - dgAvgTzjx = dgAvgTzjx + oBc.getStopTime();
683   - }
684   - } else {
685   - if (oBc._$_bcType == "normal") {
686   - gfServiceBc = gfServiceBc + 1;
687   - gfAvgTzjx = gfAvgTzjx + oBc.getStopTime();
688   - }
689   - }
690   -
691   - if (oBc._$_bcType == "normal") {
692   - serviceBc = serviceBc + 1;
693   - serviceLc = serviceLc + oBc._$_bclc;
694   - servicesj = servicesj + oBc.getBcTime();
695   - avgTzjx = avgTzjx + oBc.getStopTime();
696   -
697   - if (oBc.fnGetEatTime() > 0) {
698   - cfbc = cfbc + 1;
699   - cfsj = cfsj + oBc.fnGetEatTime();
700   - }
701   - } else if (oBc._$_bcType == "in") {
702   - jcbc = jcbc + 1;
703   - jcsj = jcsj + oBc.getBcTime();
704   - } else if (oBc._$_bcType == "out") {
705   - ccbc = ccbc + 1;
706   - ccsj = ccsj + oBc.getBcTime();
707   - } else if (oBc._$_bcType == "bd") {
708   - zwlbbc = zwlbbc + 1;
709   - zwlbsj = zwlbsj + oBc.getBcTime();
710   - } else if (oBc._$_bcType == "lc") {
711   - zwlbbc = zwlbbc + 1;
712   - zwlbsj = zwlbsj + oBc.getBcTime();
713   - }
714   - }
715   - }
716   -
717   - dgAvgTzjx = dgAvgTzjx / dgServiceBc;
718   - gfAvgTzjx = gfAvgTzjx / gfServiceBc;
719   - avgTzjx = avgTzjx / dgServiceBc;
720   -
721   - return [
722   - {'statItem': '总班次(包括进出场、吃饭时间、早晚例保、营运且班次时间大于零的班次)', 'statValue': countBc},
723   - {'statItem': '进场总班次(包括进场且班次时间大于零的班次)', 'statValue': jcbc},
724   - {'statItem': '出场总班次(包括进场且班次时间大于零的班次)', 'statValue': ccbc},
725   - {'statItem': '吃饭总班次(包括吃饭且班次时间大于零的班次)', 'statValue': cfbc},
726   - {'statItem': '早晚例保总班次(包括早晚例保且时间大于零的班次)', 'statValue': zwlbbc},
727   - {'statItem': '营运总班次(包括正常、区间、放大站且班次时间大于零班次)','statValue': serviceBc},
728   - {'statItem': '进场总时间(包括进场班次且班次时间大于零)', 'statValue': jcsj/60},
729   - {'statItem': '出场总时间(包括进场班次且班次时间大于零)', 'statValue': ccsj/60},
730   - {'statItem': '吃饭总时间(包括吃饭班次且班次时间大于零)', 'statValue': cfsj/60},
731   - {'statItem': '早晚例保总时间(包括早晚例保班次且时间大于零的)', 'statValue': zwlbsj/60},
732   - {'statItem': '营运班次总时间(包括正常、区间、放大站且班次时间大于零)', 'statValue': servicesj/60},
733   - {'statItem': '总工时(包括进出场、吃饭时间、早晚例保、营运班次时间)', 'statValue': countGs/60},
734   - {'statItem': '空驶班次(包括直放班次)', 'statValue': ksBc},
735   - {'statItem': '营运里程(包括正常、区间、放大站里程)', 'statValue': serviceLc},
736   - {'statItem': '空驶里程(包括直放里程)', 'statValue': ksLc},
737   - {'statItem': '平均停站时间(营运班次停站时间总和/营运总班次)', 'statValue': avgTzjx},
738   - {'statItem': '高峰营运班次(包括早晚高峰时段的正常、区间、放大站班次)', 'statValue': gfServiceBc},
739   - {'statItem': '低谷营运班次(包括低谷时段的正常、区间、放大站班次)', 'statValue': dgServiceBc},
740   - {'statItem': '高峰平均停站间隙(高峰营运班次停站时间总和/高峰营运班次总和)', 'statValue': gfAvgTzjx},
741   - {'statItem': '低谷平均停站间隙(低谷营运班次停站时间总和/低谷营运班次总和)', 'statValue': dgAvgTzjx},
742   - {'statItem': '综合评估', 'statValue': 3}
743   - ];
744   -
745   - };
746   -
747   - return {
748   - /**
749   - * 工厂对象,创建不同的对象。
750   - * @returns {{createParameterObj, createBcObj}}
751   - */
752   - getFactory: function() {
753   - return _factory;
754   - },
755   -
756   - /**
757   - * 使用发车间隔策略生成时刻表。
758   - * @param paramObj 参数对象
759   - * @param lpArray 路牌数组
760   - * @constructor
761   - */
762   - BXPplaceClassesTime03 : function(paramObj, lpArray) {
763   - // 参数对象
764   - _paramObj = paramObj;
765   -
766   - // 1、初始化行车计划
767   - var schedule = new InternalScheduleObj(_paramObj, lpArray, _factory);
768   - schedule.fnInitDataWithBxLayout();
769   - // 2、将连班路牌的班次补足
770   - schedule.fnCalcuLpBx_lb();
771   -
772   - // 3、修正针对初始化时生成的高峰班次,之前不足的补上,多余的删除
773   - schedule.fnAdjustGfbc(true, true); // 修正上行早高峰
774   - schedule.fnAdjustGfbc(true, false); // 修正下行早高峰
775   - schedule.fnAdjustGfbc(false, true); // 修正上行晚高峰
776   - schedule.fnAdjustGfbc(false, false); // 修正下行晚高峰
777   -
778   - // 6、补吃饭班次
779   - schedule.fnCalcuEatBc();
780   -
781   - // 4、按照车辆投入运营要求补充班次
782   - schedule.fnCalcuLpBc_yy();
783   -
784   - // 5、根据班型补充所有的不足班次
785   - schedule.fnCalcuLpBx_5_2();
786   - schedule.fnCalcuLpBx_other();
787   -
788   - // 7、祛除上标线开头有删除标记的班次
789   - schedule.fnRemoveDelFirstFlagBc();
790   -
791   - // TODO:8、调整路牌班次间隔
792   - schedule.fnAdjustLpBcInterval(1);
793   -
794   - // TODO:9、调整纵向班次间隔
795   - schedule.fnAdjustBcInterval(true, false, 10);
796   - schedule.fnAdjustBcInterval(false, false, 10);
797   -
798   - // 10、确定末班车
799   - schedule.fnCalcuLastBc();
800   -
801   - // 11、祛除上标线结尾有删除标记的班次
802   - schedule.fnRemoveDelLastFlagBc();
803   -
804   - // TODO:12、平均化指定时间后的班次列表间隔
805   - schedule.fnAdjustBcInterval2_avg(true, _paramObj.toTimeObj("19:50"));
806   - schedule.fnAdjustBcInterval2_avg(false, _paramObj.toTimeObj("19:50"));
807   -
808   - // 10、补进出场例保班次
809   - schedule.fnCalcuOtherBc();
810   -
811   - //-------------------- 输出ganut图上的班次,班型描述 ----------------------//
812   - // TODO:班型再议
813   - return {
814   - 'json':schedule.fnToGanttBcArray(),'bxrcgs':null,
815   - 'aInternalLpObj': schedule.fnGetLpArray()
816   - };
817   -
818   - },
819   - /**
820   - * 导出时刻表配置。
821   - * @param aInternalLpObj 内部路牌对象列表
822   - */
823   - exportDataConfig: function(aInternalLpObj) {
824   - $('.exportAddXls').on('click', function() {
825   - var aInfos = {
826   - "lpObjList": _funCalcuExportData_lpObjList(aInternalLpObj), // 路牌班次信息列表
827   - "statInfoList": _funCalcuExportData_statInfoList(aInternalLpObj) // 统计项目列表
828   - };
829   -
830   - console.log(aInfos);
831   -
832   - $(".exportAdd").addClass("disabled");
833   - $(".exportAddSpan").html("正在导出...");
834   -
835   - // 提交
836   - $.ajax({
837   - type: 'POST',
838   - url: "/tidc/exportDTDFile/xls",
839   - dataType: 'binary',
840   - contentType: "application/json",
841   - data: JSON.stringify(aInfos),
842   - success: function(data){
843   - Main_v2.downloadFile(data, "application/octet-stream", "时刻表信息.xls");
844   -
845   - $(".exportAdd").removeClass("disabled");
846   - $(".exportAddSpan").html(" 导出数据");
847   - },
848   - error: function(xhr, type){
849   - alert('错误:TODO');
850   -
851   - $(".exportAdd").removeClass("disabled");
852   - $(".exportAddSpan").html(" 导出数据");
853   - }
854   - });
855   - });
856   -
857   - $('.exportAddXlsx').on('click', function() {
858   - var aInfos = {
859   - "lpObjList": _funCalcuExportData_lpObjList(aInternalLpObj), // 路牌班次信息列表
860   - "statInfoList": _funCalcuExportData_statInfoList(aInternalLpObj) // 统计项目列表
861   - };
862   -
863   - console.log(aInfos);
864   -
865   - $(".exportAdd").addClass("disabled");
866   - $(".exportAddSpan").html("正在导出...");
867   -
868   - // 提交
869   - $.ajax({
870   - type: 'POST',
871   - url: "/tidc/exportDTDFile/xlsx",
872   - dataType: 'binary',
873   - contentType: "application/json",
874   - data: JSON.stringify(aInfos),
875   - success: function(data){
876   - Main_v2.downloadFile(data, "application/octet-stream", "时刻表信息.xlsx");
877   -
878   - $(".exportAdd").removeClass("disabled");
879   - $(".exportAddSpan").html(" 导出数据");
880   - },
881   - error: function(xhr, type){
882   - alert('错误:TODO');
883   -
884   - $(".exportAdd").removeClass("disabled");
885   - $(".exportAddSpan").html(" 导出数据");
886   - }
887   - });
888   - });
889   - },
890   -
891   - downloadFile: function (data, mimeType, fileName) {
892   - var success = false;
893   - var blob = new Blob([data], { type: mimeType });
894   - try {
895   - if (navigator.msSaveBlob)
896   - navigator.msSaveBlob(blob, fileName);
897   - else {
898   - // Try using other saveBlob implementations, if available
899   - var saveBlob = navigator.webkitSaveBlob || navigator.mozSaveBlob || navigator.saveBlob;
900   - if (saveBlob === undefined) throw "Not supported";
901   - saveBlob(blob, fileName);
902   - }
903   - success = true;
904   - } catch (ex) {
905   - console.log("saveBlob method failed with the following exception:");
906   - console.log(ex);
907   - }
908   -
909   - if (!success) {
910   - // Get the blob url creator
911   - var urlCreator = window.URL || window.webkitURL || window.mozURL || window.msURL;
912   - if (urlCreator) {
913   - // Try to use a download link
914   - var link = document.createElement('a');
915   - if ('download' in link) {
916   - // Try to simulate a click
917   - try {
918   - // Prepare a blob URL
919   - var url = urlCreator.createObjectURL(blob);
920   - link.setAttribute('href', url);
921   -
922   - // Set the download attribute (Supported in Chrome 14+ / Firefox 20+)
923   - link.setAttribute("download", fileName);
924   -
925   - // Simulate clicking the download link
926   - var event = document.createEvent('MouseEvents');
927   - event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
928   - link.dispatchEvent(event);
929   - success = true;
930   -
931   - } catch (ex) {
932   - console.log("Download link method with simulated click failed with the following exception:");
933   - console.log(ex);
934   - }
935   - }
936   -
937   - if (!success) {
938   - // Fallback to window.location method
939   - try {
940   - // Prepare a blob URL
941   - // Use application/octet-stream when using window.location to force download
942   - var url = urlCreator.createObjectURL(blob);
943   - window.location = url;
944   - console.log("Download link method with window.location succeeded");
945   - success = true;
946   - } catch (ex) {
947   - console.log("Download link method with window.location failed with the following exception:");
948   - console.log(ex);
949   - }
950   - }
951   - }
952   - }
953   -
954   - if (!success) {
955   - // Fallback to window.open method
956   - console.log("No methods worked for saving the arraybuffer, using last resort window.open");
957   - window.open("", '_blank', '');
958   - }
959   - }
960   -
961   - };
962   -
963   -}();
  1 +/**
  2 + * 主类。
  3 + */
  4 +var Main_v2 = function() {
  5 +
  6 + // 内部工厂类
  7 + var _factoryFun = function() {
  8 + return {
  9 + // 创建参数
  10 + createParameterObj: function(formMap, dataMap) {
  11 + var paramObj = ParameterObj();
  12 + paramObj.wrap(formMap, dataMap);
  13 + return paramObj;
  14 + },
  15 + // 创建班次对象
  16 + createBcObj: function(lpObj, bcType, isUp, fcno, fcTimeObj, paramObj) {
  17 + var _bclc = paramObj.calcuTravelLcNumber(isUp, bcType);
  18 + var _fcsj = fcTimeObj;
  19 + var _bcsj = paramObj.calcuTravelTime(_fcsj, isUp);
  20 + var _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  21 + //var _stoptime = paramObj.fnCalcuFixedStopNumber(_arrsj, !isUp, _bcsj);
  22 + var _stoptime = paramObj.fnCalcuFixedStopNumber(_arrsj, !isUp, paramObj.calcuTravelTime(_fcsj, isUp));
  23 + var _tccid = paramObj.getTTinfoId();
  24 + var _ttinfoid = paramObj.getTTinfoId();
  25 + var _xl = paramObj.getXlId();
  26 + var _qdz = isUp ? paramObj.getUpQdzObj().id : paramObj.getDownQdzObj().id;
  27 + var _zdz = isUp ? paramObj.getUpZdzObj().id : paramObj.getDownZdzObj().id;
  28 +
  29 + if (bcType == "bd") { // 早例保,传过来的发车时间是第一个班次的发车时间
  30 + if (isUp) { // 上行
  31 + _fcsj = paramObj.addMinute(
  32 + _fcsj,
  33 + -(paramObj.getUpOutTime() + paramObj.getLbTime()));
  34 + _bcsj = paramObj.getLbTime();
  35 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  36 + _stoptime = 0;
  37 + } else { // 下行
  38 + _fcsj = paramObj.addMinute(
  39 + _fcsj,
  40 + -(paramObj.getDownOutTime() + paramObj.getLbTime()));
  41 + _bcsj = paramObj.getLbTime();
  42 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  43 + _stoptime = 0;
  44 + }
  45 + } else if (bcType == "lc") { // 晚例保,传过来的发车时间是最后一个班次的到达时间
  46 + if (isUp) { // 上行
  47 + _fcsj = paramObj.addMinute(
  48 + _fcsj,
  49 + paramObj.getUpInTime());
  50 + _bcsj = paramObj.getLbTime();
  51 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  52 + _stoptime = 0;
  53 + } else { // 下行
  54 + _fcsj = paramObj.addMinute(
  55 + _fcsj,
  56 + paramObj.getDownInTime());
  57 + _bcsj = paramObj.getLbTime();
  58 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  59 + _stoptime = 0;
  60 + }
  61 + } else if (bcType == "out") { // 出场,传过来的发车时间是第一个班次的发车时间
  62 + if (isUp) { // 上行
  63 + _fcsj = paramObj.addMinute(
  64 + _fcsj,
  65 + -paramObj.getUpOutTime());
  66 + _bcsj = paramObj.getUpOutTime();
  67 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  68 + _stoptime = 0;
  69 + } else { // 下行
  70 + _fcsj = paramObj.addMinute(
  71 + _fcsj,
  72 + -paramObj.getDownOutTime());
  73 + _bcsj = paramObj.getDownOutTime();
  74 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  75 + _stoptime = 0;
  76 + }
  77 + } else if (bcType == "in") { // 进场,传过来的发车时间是最后一个班次的到达时间
  78 + if (isUp) { // 上行
  79 + _bcsj = paramObj.getUpInTime();
  80 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  81 + _stoptime = 0;
  82 + } else { // 下行
  83 + _bcsj = paramObj.getDownInTime();
  84 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  85 + _stoptime = 0;
  86 + }
  87 + } else if (bcType == "cf") { // 吃饭班次
  88 + // 以13:00为分界,之前的为午饭,之后的为晚饭
  89 + if (fcTimeObj.isBefore(paramObj.toTimeObj("13:00"))) {
  90 + _bcsj = paramObj.fnGetLunchTime();
  91 + } else {
  92 + _bcsj = paramObj.fnGetDinnerTime();
  93 + }
  94 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  95 + _stoptime = 0;
  96 + }
  97 +
  98 + var bcParamObj = {};
  99 + bcParamObj.bcType = bcType; // 班次类型(normal,in_,out, bd, lc, cf等)
  100 + bcParamObj.isUp = isUp; // boolean是否上下行
  101 + bcParamObj.fcno = fcno; // 发车顺序号
  102 + bcParamObj.fcTimeObj = _fcsj; // 发车时间对象
  103 + bcParamObj.bclc = _bclc; // 班次里程
  104 + bcParamObj.bcsj = _bcsj; // 班次历时
  105 + bcParamObj.arrtime = _arrsj; // 到达时间对象
  106 + bcParamObj.stoptime = _stoptime; // 停站时间
  107 + bcParamObj.tccid = _tccid; // 停车场id
  108 + bcParamObj.ttinfoid = _ttinfoid; // 时刻表id
  109 + bcParamObj.xl = _xl; // 线路id
  110 + bcParamObj.qdzid = _qdz; // 起点站id
  111 + bcParamObj.zdzid = _zdz; // 终点站id
  112 +
  113 + return new InternalBcObj(lpObj, bcParamObj);
  114 + }
  115 + };
  116 + };
  117 + var _factory = _factoryFun();
  118 +
  119 + // 所有的时间使用moment.js计算
  120 +
  121 + var _paramObj; // 参数对象
  122 +
  123 + var _bxDesc = [ // 班型描述
  124 + {'type':'六工一休','hoursV':6.66, 'minueV':'6:40', 'qcount': 0, 'avertime': 0},
  125 + {'type':'五工一休','hoursV':6.85, 'minueV':'6:51', 'qcount': 0, 'avertime': 0},
  126 + {'type':'四工一休','hoursV':7.14, 'minueV':'7:08', 'qcount': 0, 'avertime': 0},
  127 + {'type':'三工一休','hoursV':7.61, 'minueV':'7:37', 'qcount': 0, 'avertime': 0},
  128 + {'type':'二工一休','hoursV':8.57, 'minueV':'8:34', 'qcount': 0, 'avertime': 0},
  129 + {'type':'一工一休','hoursV':11.42, 'minueV':'11:25', 'qcount': 0, 'avertime': 0},
  130 + {'type':'五工二休','hoursV':7.99, 'minueV':'8:00', 'qcount': 0, 'avertime': 0},
  131 + {'type':'无工休', 'hoursV':5.43, 'minueV':'5:43', 'qcount': 0, 'avertime': 0}
  132 + ];
  133 +
  134 + var _funCalcuExportData_lpObjList = function(aInternalLpObj) {
  135 + // 构造路牌对象
  136 + var aLpObj = [];
  137 + var i;
  138 + var j;
  139 + var z;
  140 + var oInternalLp;
  141 + var oInternalBc;
  142 + var oInternalBc_temp;
  143 + var oLp;
  144 + var iZlc;
  145 + var iYylc;
  146 + var iKslc;
  147 + var iZbc;
  148 + var iZgs;
  149 + var iYygs;
  150 + var iYybc;
  151 + for (i = 0; i < aInternalLpObj.length; i++) {
  152 + oInternalLp = aInternalLpObj[i];
  153 + iZlc = 0;
  154 + iYylc = 0;
  155 + iKslc = 0;
  156 + iZgs = 0;
  157 + iZbc = 0;
  158 + iYygs = 0;
  159 + iYybc = 0;
  160 + oLp = {
  161 + "lpname": oInternalLp.getLpName(), // 路牌名字
  162 + "isUp": oInternalLp.isUp(), // 每圈的第一个班次是否上行
  163 + "bcObjList": [], // 班次列表
  164 + "groupCount": oInternalLp.fnGetGroupCount(), // 总圈数
  165 + "zlc": 0, // 总里程
  166 + "yylc": 0, // 营运里程
  167 + "kslc": 0, // 空驶里程
  168 + "zgs": 0, // 总工时
  169 + "zbc": 0, // 总班次
  170 + "yygs": 0, // 营运工时
  171 + "yybc": 0, // 营运班次
  172 + "stationRouteId1": 0, // 第一个班次起点站路由id
  173 + "stationRouteId2": 0 // 第二个班次起点站路由id
  174 + };
  175 +
  176 + // 将报到班次,进出场班次加到班次的时间上
  177 + var iBcChainCount;
  178 + var oStartBc;
  179 + var oEndBc;
  180 + var oTempBc;
  181 + var aFcsj = [];
  182 +
  183 + iBcChainCount = oInternalLp.fnGetBcChainCount();
  184 + if (iBcChainCount == 1) { // 单一车次链,连班班型
  185 + oStartBc = oInternalLp.getBc(
  186 + oInternalLp.fnGetBcChainInfo(0)["s_q"],
  187 + oInternalLp.fnGetBcChainInfo(0)["s_b"]
  188 + );
  189 + oTempBc = _factory.createBcObj(
  190 + oLp, "bd", true, 1,
  191 + oStartBc.getFcTimeObj(),
  192 + _paramObj
  193 + );
  194 + aFcsj.push("(到" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  195 + oLp.bcObjList.push({ // 报到班次
  196 + "bcsj": oTempBc.getBcTime(), // 班次时间
  197 + "ssj": oTempBc.getStopTime(), // 停站时间
  198 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  199 +
  200 + "tccid": oTempBc._$_tccid, // 停车场id
  201 + "qdzid": oTempBc._$_qdzid, // 起点站id
  202 + "zdzid": oTempBc._$_zdzid, // 终点站id
  203 +
  204 + "isUp": oTempBc._$_isUp, // 是否上行
  205 + "isFb": false, // 是否分班
  206 +
  207 + "bcType": oTempBc._$_bcType, // 班次类型
  208 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  209 +
  210 + "groupNo": -1, // 第几圈
  211 + "groupBcNo": -1 // 圈里第几个班次
  212 +
  213 + });
  214 +
  215 + oTempBc = _factory.createBcObj(
  216 + oLp, "out", true, 1,
  217 + oStartBc.getFcTimeObj(),
  218 + _paramObj
  219 + );
  220 + aFcsj.push("(出" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  221 + aFcsj.push("(" + oStartBc.getFcTimeObj().format("HH:mm") + ")");
  222 + oStartBc._$_fcsj_desc = aFcsj.join("");
  223 +
  224 + oLp.bcObjList.push({ // 出场班次
  225 + "bcsj": oTempBc.getBcTime(), // 班次时间
  226 + "ssj": oTempBc.getStopTime(), // 停站时间
  227 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  228 +
  229 + "tccid": oTempBc._$_tccid, // 停车场id
  230 + "qdzid": oTempBc._$_qdzid, // 起点站id
  231 + "zdzid": oTempBc._$_zdzid, // 终点站id
  232 +
  233 + "isUp": oTempBc._$_isUp, // 是否上行
  234 + "isFb": false, // 是否分班
  235 +
  236 + "bcType": oTempBc._$_bcType, // 班次类型
  237 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  238 +
  239 + "groupNo": -1, // 第几圈
  240 + "groupBcNo": -2 // 圈里第几个班次
  241 +
  242 + });
  243 +
  244 + aFcsj = [];
  245 +
  246 + oEndBc = oInternalLp.getBc(
  247 + oInternalLp.fnGetBcChainInfo(0)["e_q"],
  248 + oInternalLp.fnGetBcChainInfo(0)["e_b"]
  249 + );
  250 + aFcsj.push("(" + oEndBc.getFcTimeObj().format("HH:mm") + ")");
  251 + oTempBc = _factory.createBcObj(
  252 + oLp, "in", true, 1,
  253 + oEndBc.getArrTimeObj(),
  254 + _paramObj
  255 + );
  256 + aFcsj.push("(进" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  257 +
  258 + oLp.bcObjList.push({ // 进场班次
  259 + "bcsj": oTempBc.getBcTime(), // 班次时间
  260 + "ssj": oTempBc.getStopTime(), // 停站时间
  261 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  262 +
  263 + "tccid": oTempBc._$_tccid, // 停车场id
  264 + "qdzid": oTempBc._$_qdzid, // 起点站id
  265 + "zdzid": oTempBc._$_zdzid, // 终点站id
  266 +
  267 + "isUp": oTempBc._$_isUp, // 是否上行
  268 + "isFb": false, // 是否分班
  269 +
  270 + "bcType": oTempBc._$_bcType, // 班次类型
  271 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  272 +
  273 + "groupNo": oInternalLp.fnGetBcChainInfo(0)["e_b"] == 0 ?
  274 + oInternalLp.fnGetBcChainInfo(0)["e_q"] :
  275 + oInternalLp.fnGetBcChainInfo(0)["e_q"] + 1, // 第几圈
  276 + "groupBcNo": oInternalLp.fnGetBcChainInfo(0)["e_b"] == 0 ? 1 : 0 // 圈里第几个班次
  277 +
  278 + });
  279 +
  280 + oTempBc = _factory.createBcObj(
  281 + oLp, "lc", true, 1,
  282 + oEndBc.getArrTimeObj(),
  283 + _paramObj
  284 + );
  285 + aFcsj.push("(离" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  286 + oLp.bcObjList.push({ // 离场班次
  287 + "bcsj": oTempBc.getBcTime(), // 班次时间
  288 + "ssj": oTempBc.getStopTime(), // 停站时间
  289 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  290 +
  291 + "tccid": oTempBc._$_tccid, // 停车场id
  292 + "qdzid": oTempBc._$_qdzid, // 起点站id
  293 + "zdzid": oTempBc._$_zdzid, // 终点站id
  294 +
  295 + "isUp": oTempBc._$_isUp, // 是否上行
  296 + "isFb": false, // 是否分班
  297 +
  298 + "bcType": oTempBc._$_bcType, // 班次类型
  299 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  300 +
  301 + "groupNo": -2, // 第几圈
  302 + "groupBcNo": -4 // 圈里第几个班次
  303 +
  304 + });
  305 +
  306 + oEndBc._$_fcsj_desc = aFcsj.join("");
  307 +
  308 + } else if (iBcChainCount == 2) { // 两个车次链,分班班型
  309 + oStartBc = oInternalLp.getBc(
  310 + oInternalLp.fnGetBcChainInfo(0)["s_q"],
  311 + oInternalLp.fnGetBcChainInfo(0)["s_b"]
  312 + );
  313 + oTempBc = _factory.createBcObj(
  314 + oLp, "bd", true, 1,
  315 + oStartBc.getFcTimeObj(),
  316 + _paramObj
  317 + );
  318 + aFcsj.push("(到" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  319 + oLp.bcObjList.push({ // 报到班次
  320 + "bcsj": oTempBc.getBcTime(), // 班次时间
  321 + "ssj": oTempBc.getStopTime(), // 停站时间
  322 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  323 +
  324 + "tccid": oTempBc._$_tccid, // 停车场id
  325 + "qdzid": oTempBc._$_qdzid, // 起点站id
  326 + "zdzid": oTempBc._$_zdzid, // 终点站id
  327 +
  328 + "isUp": oTempBc._$_isUp, // 是否上行
  329 + "isFb": false, // 是否分班
  330 +
  331 + "bcType": oTempBc._$_bcType, // 班次类型
  332 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  333 +
  334 + "groupNo": -1, // 第几圈
  335 + "groupBcNo": -1 // 圈里第几个班次
  336 +
  337 + });
  338 +
  339 + oTempBc = _factory.createBcObj(
  340 + oLp, "out", true, 1,
  341 + oStartBc.getFcTimeObj(),
  342 + _paramObj
  343 + );
  344 + aFcsj.push("(出" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  345 + aFcsj.push("(" + oStartBc.getFcTimeObj().format("HH:mm") + ")");
  346 + oStartBc._$_fcsj_desc = aFcsj.join("");
  347 +
  348 + oLp.bcObjList.push({ // 出场班次
  349 + "bcsj": oTempBc.getBcTime(), // 班次时间
  350 + "ssj": oTempBc.getStopTime(), // 停站时间
  351 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  352 +
  353 + "tccid": oTempBc._$_tccid, // 停车场id
  354 + "qdzid": oTempBc._$_qdzid, // 起点站id
  355 + "zdzid": oTempBc._$_zdzid, // 终点站id
  356 +
  357 + "isUp": oTempBc._$_isUp, // 是否上行
  358 + "isFb": false, // 是否分班
  359 +
  360 + "bcType": oTempBc._$_bcType, // 班次类型
  361 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  362 +
  363 + "groupNo": -1, // 第几圈
  364 + "groupBcNo": -2 // 圈里第几个班次
  365 +
  366 + });
  367 +
  368 + aFcsj = [];
  369 +
  370 + oEndBc = oInternalLp.getBc(
  371 + oInternalLp.fnGetBcChainInfo(0)["e_q"],
  372 + oInternalLp.fnGetBcChainInfo(0)["e_b"]
  373 + );
  374 + aFcsj.push("(" + oEndBc.getFcTimeObj().format("HH:mm") + ")");
  375 + oTempBc = _factory.createBcObj(
  376 + oLp, "in", true, 1,
  377 + oEndBc.getArrTimeObj(),
  378 + _paramObj
  379 + );
  380 + aFcsj.push("(进" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  381 + oLp.bcObjList.push({ // 进场班次
  382 + "bcsj": oTempBc.getBcTime(), // 班次时间
  383 + "ssj": oTempBc.getStopTime(), // 停站时间
  384 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  385 +
  386 + "tccid": oTempBc._$_tccid, // 停车场id
  387 + "qdzid": oTempBc._$_qdzid, // 起点站id
  388 + "zdzid": oTempBc._$_zdzid, // 终点站id
  389 +
  390 + "isUp": oTempBc._$_isUp, // 是否上行
  391 + "isFb": true, // 是否分班
  392 +
  393 + "bcType": oTempBc._$_bcType, // 班次类型
  394 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  395 +
  396 + "groupNo": oInternalLp.fnGetBcChainInfo(0)["e_b"] == 0 ?
  397 + oInternalLp.fnGetBcChainInfo(0)["e_q"] :
  398 + oInternalLp.fnGetBcChainInfo(0)["e_q"] + 1, // 第几圈
  399 + "groupBcNo": oInternalLp.fnGetBcChainInfo(0)["e_b"] == 0 ? 1 : 0 // 圈里第几个班次
  400 +
  401 + });
  402 + oEndBc._$_fcsj_desc = aFcsj.join("");
  403 +
  404 + aFcsj = [];
  405 +
  406 + oStartBc = oInternalLp.getBc(
  407 + oInternalLp.fnGetBcChainInfo(1)["s_q"],
  408 + oInternalLp.fnGetBcChainInfo(1)["s_b"]
  409 + );
  410 + oTempBc = _factory.createBcObj(
  411 + oLp, "bd", true, 1,
  412 + oStartBc.getFcTimeObj(),
  413 + _paramObj
  414 + );
  415 + aFcsj.push("(到" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  416 + oLp.bcObjList.push({ // 报到班次
  417 + "bcsj": oTempBc.getBcTime(), // 班次时间
  418 + "ssj": oTempBc.getStopTime(), // 停站时间
  419 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  420 +
  421 + "tccid": oTempBc._$_tccid, // 停车场id
  422 + "qdzid": oTempBc._$_qdzid, // 起点站id
  423 + "zdzid": oTempBc._$_zdzid, // 终点站id
  424 +
  425 + "isUp": oTempBc._$_isUp, // 是否上行
  426 + "isFb": true, // 是否分班
  427 +
  428 + "bcType": oTempBc._$_bcType, // 班次类型
  429 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  430 +
  431 + "groupNo": oInternalLp.fnGetBcChainInfo(1)["s_q"] - 1, // 第几圈
  432 + "groupBcNo": oInternalLp.fnGetBcChainInfo(1)["s_b"] // 圈里第几个班次
  433 +
  434 + });
  435 +
  436 + oTempBc = _factory.createBcObj(
  437 + oLp, "out", true, 1,
  438 + oStartBc.getFcTimeObj(),
  439 + _paramObj
  440 + );
  441 + oLp.bcObjList.push({ // 出场班次
  442 + "bcsj": oTempBc.getBcTime(), // 班次时间
  443 + "ssj": oTempBc.getStopTime(), // 停站时间
  444 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  445 +
  446 + "tccid": oTempBc._$_tccid, // 停车场id
  447 + "qdzid": oTempBc._$_qdzid, // 起点站id
  448 + "zdzid": oTempBc._$_zdzid, // 终点站id
  449 +
  450 + "isUp": oTempBc._$_isUp, // 是否上行
  451 + "isFb": true, // 是否分班
  452 +
  453 + "bcType": oTempBc._$_bcType, // 班次类型
  454 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  455 +
  456 + "groupNo": oInternalLp.fnGetBcChainInfo(1)["s_b"] == 0 ?
  457 + oInternalLp.fnGetBcChainInfo(1)["s_q"] - 1 :
  458 + oInternalLp.fnGetBcChainInfo(1)["s_q"], // 第几圈
  459 + "groupBcNo": oInternalLp.fnGetBcChainInfo(1)["s_b"] == 0 ? 1 : 0 // 圈里第几个班次
  460 +
  461 + });
  462 + aFcsj.push("(出" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  463 + aFcsj.push("(" + oStartBc.getFcTimeObj().format("HH:mm") + ")");
  464 + oStartBc._$_fcsj_desc = aFcsj.join("");
  465 +
  466 + aFcsj = [];
  467 +
  468 + oEndBc = oInternalLp.getBc(
  469 + oInternalLp.fnGetBcChainInfo(1)["e_q"],
  470 + oInternalLp.fnGetBcChainInfo(1)["e_b"]
  471 + );
  472 + aFcsj.push("(" + oEndBc.getFcTimeObj().format("HH:mm") + ")");
  473 + oTempBc = _factory.createBcObj(
  474 + oLp, "in", true, 1,
  475 + oEndBc.getArrTimeObj(),
  476 + _paramObj
  477 + );
  478 + aFcsj.push("(进" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  479 +
  480 + oLp.bcObjList.push({ // 进场班次
  481 + "bcsj": oTempBc.getBcTime(), // 班次时间
  482 + "ssj": oTempBc.getStopTime(), // 停站时间
  483 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  484 +
  485 + "tccid": oTempBc._$_tccid, // 停车场id
  486 + "qdzid": oTempBc._$_qdzid, // 起点站id
  487 + "zdzid": oTempBc._$_zdzid, // 终点站id
  488 +
  489 + "isUp": oTempBc._$_isUp, // 是否上行
  490 + "isFb": false, // 是否分班
  491 +
  492 + "bcType": oTempBc._$_bcType, // 班次类型
  493 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  494 +
  495 + "groupNo": oInternalLp.fnGetBcChainInfo(1)["e_b"] == 0 ?
  496 + oInternalLp.fnGetBcChainInfo(1)["e_q"] :
  497 + oInternalLp.fnGetBcChainInfo(1)["e_q"] + 1, // 第几圈
  498 + "groupBcNo": oInternalLp.fnGetBcChainInfo(1)["e_b"] == 0 ? 1 : 0 // 圈里第几个班次
  499 +
  500 + });
  501 +
  502 + oTempBc = _factory.createBcObj(
  503 + oLp, "lc", true, 1,
  504 + oEndBc.getArrTimeObj(),
  505 + _paramObj
  506 + );
  507 +
  508 + oLp.bcObjList.push({ // 离场班次
  509 + "bcsj": oTempBc.getBcTime(), // 班次时间
  510 + "ssj": oTempBc.getStopTime(), // 停站时间
  511 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  512 +
  513 + "tccid": oTempBc._$_tccid, // 停车场id
  514 + "qdzid": oTempBc._$_qdzid, // 起点站id
  515 + "zdzid": oTempBc._$_zdzid, // 终点站id
  516 +
  517 + "isUp": oTempBc._$_isUp, // 是否上行
  518 + "isFb": false, // 是否分班
  519 +
  520 + "bcType": oTempBc._$_bcType, // 班次类型
  521 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  522 +
  523 + "groupNo": -2, // 第几圈
  524 + "groupBcNo": -4 // 圈里第几个班次
  525 +
  526 + });
  527 +
  528 + aFcsj.push("(离" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  529 + oEndBc._$_fcsj_desc = aFcsj.join("");
  530 +
  531 + }
  532 +
  533 + for (j = 0; j < oInternalLp.fnGetGroupCount(); j++) {
  534 + for (z = 0; z < 2; z++) {
  535 + oInternalBc = oInternalLp.getBc(j, z);
  536 + if (oInternalBc) {
  537 + if (oInternalBc.fnGetEatTime() > 0) {
  538 + // 吃饭班次是下一个班次开始吃,和本班次方向相反
  539 + oInternalBc_temp = oInternalLp.getBc(
  540 + z == 1 ? j + 1 : j,
  541 + z == 1 ? 0 : 1);
  542 +
  543 + oInternalBc_temp._$_fcsj_desc = "(吃" + oInternalBc_temp.getFcTimeObj().format("HH:mm") + ")";
  544 + }
  545 +
  546 + oLp.bcObjList.push({
  547 + "bcsj": oInternalBc.getBcTime(), // 班次时间
  548 + "ssj": oInternalBc.getStopTime(), // 停站时间
  549 + "eatsj": oInternalBc.fnGetEatTime(), // 吃饭时间
  550 +
  551 + "tccid": oInternalBc._$_tccid, // 停车场id
  552 + "qdzid": oInternalBc._$_qdzid, // 起点站id
  553 + "zdzid": oInternalBc._$_zdzid, // 终点站id
  554 +
  555 + "isUp": oInternalBc._$_isUp, // 是否上行
  556 +
  557 + "bcType": oInternalBc._$_bcType, // 班次类型
  558 + "fcsj": oInternalBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  559 + "fcsjDesc" : oInternalBc._$_fcsj_desc || oInternalBc._$_fcsjObj.format("HH:mm"),
  560 +
  561 + "groupNo": j, // 第几圈
  562 + "groupBcNo": z // 圈里第几个班次
  563 +
  564 + });
  565 +
  566 + // iZlc = 0;
  567 + // iYylc = 0;
  568 + // iKslc = 0;
  569 + // iZgs = 0;
  570 + // iZbc = 0;
  571 + // iYygs = 0;
  572 + // iYybc = 0;
  573 +
  574 + iZlc = iZlc +
  575 + oInternalBc._$_bclc; // 里程
  576 + iYylc = iYylc +
  577 + oInternalBc._$_bclc; // 里程
  578 + iYygs = iYygs +
  579 + oInternalBc.getBcTime() + // 班次时间
  580 + oInternalBc.getStopTime() + // 停站时间
  581 + oInternalBc.fnGetEatTime(); // 吃饭时间
  582 + iYybc = iYybc + 1;
  583 +
  584 + iZgs = iZgs +
  585 + oInternalBc.getBcTime() + // 班次时间
  586 + oInternalBc.getStopTime() + // 停站时间
  587 + oInternalBc.fnGetEatTime(); // 吃饭时间
  588 + iZbc = iZbc + 1;
  589 +
  590 + // 设置圈站点路由id
  591 + if (oInternalBc.isUp() == oInternalLp.isUp()) { // 第一个班次
  592 + if (oLp.stationRouteId1 == 0) {
  593 + oLp.stationRouteId1 = oInternalBc._$_qdzid;
  594 + }
  595 + } else { // 第二个班次
  596 + if (oLp.stationRouteId2 == 0) {
  597 + oLp.stationRouteId2 = oInternalBc._$_qdzid;
  598 + }
  599 + }
  600 +
  601 + }
  602 + }
  603 +
  604 + }
  605 +
  606 + for (z = 0; z < oInternalLp.getOtherBcArray().length; z++) {
  607 + oInternalBc = oInternalLp.getOtherBcArray()[z];
  608 + iKslc = iKslc +
  609 + oInternalBc._$_bclc; // 里程
  610 + iZlc = iZlc +
  611 + oInternalBc._$_bclc; // 里程
  612 + iZgs = iZgs +
  613 + oInternalBc.getBcTime() + // 班次时间
  614 + oInternalBc.getStopTime(); // 停站时间
  615 + if (oInternalBc._$_bcType != "bd" &&
  616 + oInternalBc._$_bcType != "lc" &&
  617 + oInternalBc._$_bcType != "cf") {
  618 + iZbc = iZbc + 1;
  619 + }
  620 + }
  621 +
  622 + oLp.zlc = iZlc;
  623 + oLp.yylc = iYylc;
  624 + oLp.kslc = iKslc;
  625 + oLp.zgs = iZgs;
  626 + oLp.zbc = iZbc;
  627 + oLp.yygs = iYygs;
  628 + oLp.yybc = iYybc;
  629 + aLpObj.push(oLp);
  630 + }
  631 +
  632 + return aLpObj;
  633 + };
  634 +
  635 + var _funCalcuExportData_statInfoList = function(aInternalLpObj) {
  636 + var countBc = 0, // 总班次
  637 + serviceBc = 0, // 营运班次
  638 + jcbc = 0, // 进场总班次.
  639 + ccbc = 0, // 出场总班次.
  640 + cfbc = 0, // 吃饭总班次.
  641 + zwlbbc = 0, // 早晚例保总班次.
  642 + countGs = 0.0, // 总工时
  643 + servicesj = 0, // 营运班次总时间
  644 + jcsj = 0.0, // 进场总时间.
  645 + ccsj = 0.0, // 出场总时间.
  646 + cfsj = 0.0, // 吃饭总时间.
  647 + zwlbsj = 0.0, // 早晚例保总时间.
  648 + ksBc = 0, // 空驶班次
  649 + serviceLc = 0.0, // 营运里程
  650 + ksLc = 0.0, // 空驶里程
  651 + avgTzjx = 0.0, // 平均停站间隙
  652 + gfServiceBc = 0, // 高峰营运班次
  653 + dgServiceBc = 0, // 低谷营运班次
  654 + gfAvgTzjx = 0.0, // 高峰平均停站间隙
  655 + dgAvgTzjx = 0.0; // 低谷平均停站间隙
  656 +
  657 + var aAllBc = [];
  658 + var oLp;
  659 + var oBc;
  660 + var i;
  661 + var j;
  662 +
  663 + for (i = 0; i < aInternalLpObj.length; i++) {
  664 + oLp = aInternalLpObj[i];
  665 + for (j = 0; j < oLp.getBcArray().length; j++) {
  666 + aAllBc.push(oLp.getBcArray()[j]);
  667 + }
  668 + for (j = 0; j < oLp.getOtherBcArray().length; j++) {
  669 + aAllBc.push(oLp.getOtherBcArray()[j]);
  670 + }
  671 + }
  672 +
  673 + for (i = 0; i < aAllBc.length; i++) {
  674 + oBc = aAllBc[i];
  675 +
  676 + if (oBc.getBcTime() > 0) {
  677 + countBc = countBc + 1;
  678 + countGs = countGs + oBc.getStopTime() + oBc.getBcTime();
  679 + if (_paramObj.isTroughBc(oBc.getFcTimeObj())) {
  680 + if (oBc._$_bcType == "normal") {
  681 + dgServiceBc = dgServiceBc + 1;
  682 + dgAvgTzjx = dgAvgTzjx + oBc.getStopTime();
  683 + }
  684 + } else {
  685 + if (oBc._$_bcType == "normal") {
  686 + gfServiceBc = gfServiceBc + 1;
  687 + gfAvgTzjx = gfAvgTzjx + oBc.getStopTime();
  688 + }
  689 + }
  690 +
  691 + if (oBc._$_bcType == "normal") {
  692 + serviceBc = serviceBc + 1;
  693 + serviceLc = serviceLc + oBc._$_bclc;
  694 + servicesj = servicesj + oBc.getBcTime();
  695 + avgTzjx = avgTzjx + oBc.getStopTime();
  696 +
  697 + if (oBc.fnGetEatTime() > 0) {
  698 + cfbc = cfbc + 1;
  699 + cfsj = cfsj + oBc.fnGetEatTime();
  700 + }
  701 + } else if (oBc._$_bcType == "in") {
  702 + jcbc = jcbc + 1;
  703 + jcsj = jcsj + oBc.getBcTime();
  704 + } else if (oBc._$_bcType == "out") {
  705 + ccbc = ccbc + 1;
  706 + ccsj = ccsj + oBc.getBcTime();
  707 + } else if (oBc._$_bcType == "bd") {
  708 + zwlbbc = zwlbbc + 1;
  709 + zwlbsj = zwlbsj + oBc.getBcTime();
  710 + } else if (oBc._$_bcType == "lc") {
  711 + zwlbbc = zwlbbc + 1;
  712 + zwlbsj = zwlbsj + oBc.getBcTime();
  713 + }
  714 + }
  715 + }
  716 +
  717 + dgAvgTzjx = dgAvgTzjx / dgServiceBc;
  718 + gfAvgTzjx = gfAvgTzjx / gfServiceBc;
  719 + avgTzjx = avgTzjx / dgServiceBc;
  720 +
  721 + return [
  722 + {'statItem': '总班次(包括进出场、吃饭时间、早晚例保、营运且班次时间大于零的班次)', 'statValue': countBc},
  723 + {'statItem': '进场总班次(包括进场且班次时间大于零的班次)', 'statValue': jcbc},
  724 + {'statItem': '出场总班次(包括进场且班次时间大于零的班次)', 'statValue': ccbc},
  725 + {'statItem': '吃饭总班次(包括吃饭且班次时间大于零的班次)', 'statValue': cfbc},
  726 + {'statItem': '早晚例保总班次(包括早晚例保且时间大于零的班次)', 'statValue': zwlbbc},
  727 + {'statItem': '营运总班次(包括正常、区间、放大站且班次时间大于零班次)','statValue': serviceBc},
  728 + {'statItem': '进场总时间(包括进场班次且班次时间大于零)', 'statValue': jcsj/60},
  729 + {'statItem': '出场总时间(包括进场班次且班次时间大于零)', 'statValue': ccsj/60},
  730 + {'statItem': '吃饭总时间(包括吃饭班次且班次时间大于零)', 'statValue': cfsj/60},
  731 + {'statItem': '早晚例保总时间(包括早晚例保班次且时间大于零的)', 'statValue': zwlbsj/60},
  732 + {'statItem': '营运班次总时间(包括正常、区间、放大站且班次时间大于零)', 'statValue': servicesj/60},
  733 + {'statItem': '总工时(包括进出场、吃饭时间、早晚例保、营运班次时间)', 'statValue': countGs/60},
  734 + {'statItem': '空驶班次(包括直放班次)', 'statValue': ksBc},
  735 + {'statItem': '营运里程(包括正常、区间、放大站里程)', 'statValue': serviceLc},
  736 + {'statItem': '空驶里程(包括直放里程)', 'statValue': ksLc},
  737 + {'statItem': '平均停站时间(营运班次停站时间总和/营运总班次)', 'statValue': avgTzjx},
  738 + {'statItem': '高峰营运班次(包括早晚高峰时段的正常、区间、放大站班次)', 'statValue': gfServiceBc},
  739 + {'statItem': '低谷营运班次(包括低谷时段的正常、区间、放大站班次)', 'statValue': dgServiceBc},
  740 + {'statItem': '高峰平均停站间隙(高峰营运班次停站时间总和/高峰营运班次总和)', 'statValue': gfAvgTzjx},
  741 + {'statItem': '低谷平均停站间隙(低谷营运班次停站时间总和/低谷营运班次总和)', 'statValue': dgAvgTzjx},
  742 + {'statItem': '综合评估', 'statValue': 3}
  743 + ];
  744 +
  745 + };
  746 +
  747 + return {
  748 + /**
  749 + * 工厂对象,创建不同的对象。
  750 + * @returns {{createParameterObj, createBcObj}}
  751 + */
  752 + getFactory: function() {
  753 + return _factory;
  754 + },
  755 +
  756 + /**
  757 + * 使用发车间隔策略生成时刻表。
  758 + * @param paramObj 参数对象
  759 + * @param lpArray 路牌数组
  760 + * @constructor
  761 + */
  762 + BXPplaceClassesTime03 : function(paramObj, lpArray) {
  763 + // 参数对象
  764 + _paramObj = paramObj;
  765 +
  766 + // 1、初始化行车计划
  767 + var schedule = new InternalScheduleObj(_paramObj, lpArray, _factory);
  768 + schedule.fnInitDataWithBxLayout();
  769 + // 2、将连班路牌的班次补足
  770 + schedule.fnCalcuLpBx_lb();
  771 +
  772 + // 3、修正针对初始化时生成的高峰班次,之前不足的补上,多余的删除
  773 + schedule.fnAdjustGfbc(true, true); // 修正上行早高峰
  774 + schedule.fnAdjustGfbc(true, false); // 修正下行早高峰
  775 + schedule.fnAdjustGfbc(false, true); // 修正上行晚高峰
  776 + schedule.fnAdjustGfbc(false, false); // 修正下行晚高峰
  777 +
  778 + // 6、补吃饭班次
  779 + schedule.fnCalcuEatBc();
  780 +
  781 + // 4、按照车辆投入运营要求补充班次
  782 + schedule.fnCalcuLpBc_yy();
  783 +
  784 + // 5、根据班型补充所有的不足班次
  785 + schedule.fnCalcuLpBx_5_2();
  786 + schedule.fnCalcuLpBx_other();
  787 +
  788 + // 7、祛除上标线开头有删除标记的班次
  789 + schedule.fnRemoveDelFirstFlagBc();
  790 +
  791 + // 8、调整路牌班次间隔(使用平均停站时间)
  792 + schedule.fnAdjustLpBcInterval(1);
  793 +
  794 + // TODO:9、调整纵向班次间隔
  795 + schedule.fnAdjustBcInterval(true, false, 5);
  796 + schedule.fnAdjustBcInterval(false, false, 5);
  797 +
  798 + schedule.fnAdjustLpBcInterval(1);
  799 +
  800 + schedule.fnAdjustBcInterval(true, false, 5);
  801 + schedule.fnAdjustBcInterval(false, false, 5);
  802 +
  803 + // 10、确定末班车
  804 + schedule.fnCalcuLastBc();
  805 +
  806 + // 11、祛除上标线结尾有删除标记的班次
  807 + schedule.fnRemoveDelLastFlagBc();
  808 + //
  809 + // // TODO:12、平均化指定时间后的班次列表间隔
  810 + // schedule.fnAdjustBcInterval2_avg(true, _paramObj.toTimeObj("19:50"));
  811 + // schedule.fnAdjustBcInterval2_avg(false, _paramObj.toTimeObj("19:50"));
  812 + //
  813 + // 10、补进出场例保班次
  814 + schedule.fnCalcuOtherBc();
  815 +
  816 + //-------------------- 输出ganut图上的班次,班型描述 ----------------------//
  817 + // TODO:班型再议
  818 + return {
  819 + 'json':schedule.fnToGanttBcArray(),'bxrcgs':null,
  820 + 'aInternalLpObj': schedule.fnGetLpArray()
  821 + };
  822 +
  823 + },
  824 + /**
  825 + * 导出时刻表配置。
  826 + * @param aInternalLpObj 内部路牌对象列表
  827 + */
  828 + exportDataConfig: function(aInternalLpObj) {
  829 + $('.exportAddXls').on('click', function() {
  830 + var aInfos = {
  831 + "lpObjList": _funCalcuExportData_lpObjList(aInternalLpObj), // 路牌班次信息列表
  832 + "statInfoList": _funCalcuExportData_statInfoList(aInternalLpObj) // 统计项目列表
  833 + };
  834 +
  835 + console.log(aInfos);
  836 +
  837 + $(".exportAdd").addClass("disabled");
  838 + $(".exportAddSpan").html("正在导出...");
  839 +
  840 + // 提交
  841 + $.ajax({
  842 + type: 'POST',
  843 + url: "/tidc/exportDTDFile/xls",
  844 + dataType: 'binary',
  845 + contentType: "application/json",
  846 + data: JSON.stringify(aInfos),
  847 + success: function(data){
  848 + Main_v2.downloadFile(data, "application/octet-stream", "时刻表信息.xls");
  849 +
  850 + $(".exportAdd").removeClass("disabled");
  851 + $(".exportAddSpan").html(" 导出数据");
  852 + },
  853 + error: function(xhr, type){
  854 + alert('错误:TODO');
  855 +
  856 + $(".exportAdd").removeClass("disabled");
  857 + $(".exportAddSpan").html(" 导出数据");
  858 + }
  859 + });
  860 + });
  861 +
  862 + $('.exportAddXlsx').on('click', function() {
  863 + var aInfos = {
  864 + "lpObjList": _funCalcuExportData_lpObjList(aInternalLpObj), // 路牌班次信息列表
  865 + "statInfoList": _funCalcuExportData_statInfoList(aInternalLpObj) // 统计项目列表
  866 + };
  867 +
  868 + console.log(aInfos);
  869 +
  870 + $(".exportAdd").addClass("disabled");
  871 + $(".exportAddSpan").html("正在导出...");
  872 +
  873 + // 提交
  874 + $.ajax({
  875 + type: 'POST',
  876 + url: "/tidc/exportDTDFile/xlsx",
  877 + dataType: 'binary',
  878 + contentType: "application/json",
  879 + data: JSON.stringify(aInfos),
  880 + success: function(data){
  881 + Main_v2.downloadFile(data, "application/octet-stream", "时刻表信息.xlsx");
  882 +
  883 + $(".exportAdd").removeClass("disabled");
  884 + $(".exportAddSpan").html(" 导出数据");
  885 + },
  886 + error: function(xhr, type){
  887 + alert('错误:TODO');
  888 +
  889 + $(".exportAdd").removeClass("disabled");
  890 + $(".exportAddSpan").html(" 导出数据");
  891 + }
  892 + });
  893 + });
  894 + },
  895 +
  896 + downloadFile: function (data, mimeType, fileName) {
  897 + var success = false;
  898 + var blob = new Blob([data], { type: mimeType });
  899 + try {
  900 + if (navigator.msSaveBlob)
  901 + navigator.msSaveBlob(blob, fileName);
  902 + else {
  903 + // Try using other saveBlob implementations, if available
  904 + var saveBlob = navigator.webkitSaveBlob || navigator.mozSaveBlob || navigator.saveBlob;
  905 + if (saveBlob === undefined) throw "Not supported";
  906 + saveBlob(blob, fileName);
  907 + }
  908 + success = true;
  909 + } catch (ex) {
  910 + console.log("saveBlob method failed with the following exception:");
  911 + console.log(ex);
  912 + }
  913 +
  914 + if (!success) {
  915 + // Get the blob url creator
  916 + var urlCreator = window.URL || window.webkitURL || window.mozURL || window.msURL;
  917 + if (urlCreator) {
  918 + // Try to use a download link
  919 + var link = document.createElement('a');
  920 + if ('download' in link) {
  921 + // Try to simulate a click
  922 + try {
  923 + // Prepare a blob URL
  924 + var url = urlCreator.createObjectURL(blob);
  925 + link.setAttribute('href', url);
  926 +
  927 + // Set the download attribute (Supported in Chrome 14+ / Firefox 20+)
  928 + link.setAttribute("download", fileName);
  929 +
  930 + // Simulate clicking the download link
  931 + var event = document.createEvent('MouseEvents');
  932 + event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
  933 + link.dispatchEvent(event);
  934 + success = true;
  935 +
  936 + } catch (ex) {
  937 + console.log("Download link method with simulated click failed with the following exception:");
  938 + console.log(ex);
  939 + }
  940 + }
  941 +
  942 + if (!success) {
  943 + // Fallback to window.location method
  944 + try {
  945 + // Prepare a blob URL
  946 + // Use application/octet-stream when using window.location to force download
  947 + var url = urlCreator.createObjectURL(blob);
  948 + window.location = url;
  949 + console.log("Download link method with window.location succeeded");
  950 + success = true;
  951 + } catch (ex) {
  952 + console.log("Download link method with window.location failed with the following exception:");
  953 + console.log(ex);
  954 + }
  955 + }
  956 + }
  957 + }
  958 +
  959 + if (!success) {
  960 + // Fallback to window.open method
  961 + console.log("No methods worked for saving the arraybuffer, using last resort window.open");
  962 + window.open("", '_blank', '');
  963 + }
  964 + }
  965 +
  966 + };
  967 +
  968 +}();
... ...
src/main/resources/static/pages/base/timesmodel/js/v2_1/Block.js 0 → 100644
  1 +/**
  2 + * Block类,由多个trip串连在一起,
  3 + * 可包含进场,出场,报到,离场,正常,吃饭类型班次。
  4 + */
  5 +var Block = (function() {
  6 +
  7 + /**
  8 + * 内部Block类。
  9 + * @param stra {Strategy} 策略类
  10 + * @constructor
  11 + */
  12 + function InternalBlock(stra) {
  13 + // 内部的trip数组
  14 + this._aTrips = [];
  15 + // 策略类
  16 + this._oStrategy = stra;
  17 +
  18 +
  19 + // TODO
  20 + }
  21 +
  22 + return InternalBlock;
  23 +
  24 +}());
0 25 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/js/v2_1/ParamContext.js 0 → 100644
  1 +/**
  2 + * 参数上下文。内部ParamContext类
  3 + * 构造函数两个参数,formMap,dataMap
  4 + */
  5 +var ParamContext = (function() {
  6 +
  7 + var date_wrap_prefix = "2000-01-01 "; // 包装日期的前缀
  8 + var date_wrap_format = "YYYY-MM-DD HH:mm"; // 日期格式
  9 + /**
  10 + * 将时间包装成日期,方便计算。
  11 + * @param timeStr 时间格式,如 06:30
  12 + * @returns {moment}
  13 + */
  14 + var _fnWrapToTimeObj = function(timeStr) {
  15 + return moment(
  16 + date_wrap_prefix + timeStr,
  17 + date_wrap_format
  18 + );
  19 + };
  20 +
  21 + /**
  22 + * 添加分钟到时间对象。
  23 + * @param timeObj {moment} 时间对象
  24 + * @param m {int} 分钟
  25 + * @returns {moment}
  26 + */
  27 + var _fnAddMinuteToTimeObj = function(timeObj, m) {
  28 + var _oTime = moment(timeObj);
  29 + _oTime.add(m, "m");
  30 + return _oTime
  31 + };
  32 +
  33 + /**
  34 + * 内部对应的参数上下文对象。
  35 + * @param formMap
  36 + * @param dataMap
  37 + * @constructor
  38 + */
  39 + function InternalParamContext(formMap, dataMap) {
  40 + this._formMap = formMap;
  41 + this._dataMap = dataMap;
  42 +
  43 + if (!this._formMap) {
  44 + alert("formMap为空!");
  45 + throw "formMap为空!";
  46 + }
  47 + if (!this._dataMap) {
  48 + alert("dataMap为空!");
  49 + throw "dataMap为空!";
  50 + }
  51 +
  52 + // 计算首班车,末班车行驶时间对象
  53 + this._firstLastTripBeginTimeObj = {
  54 + up: { // 上行
  55 + firstTripBeginTimeObj: _fnWrapToTimeObj(this._formMap.startStationFirstTime),
  56 + lastTripBeginTimeObj: _fnWrapToTimeObj(this._formMap.startStationEndTime)
  57 + },
  58 + down: { // 下行
  59 + firstTripBeginTimeObj: _fnWrapToTimeObj(this._formMap.endStationFirstTime),
  60 + lastTripBeginTimeObj: _fnWrapToTimeObj(this._formMap.endStationEndTime)
  61 + }
  62 + };
  63 + // 计算吃饭时间
  64 + this._oEatTime = {
  65 + l: isNaN(this._formMap.workeLunch) || parseInt(this._formMap.workeLunch) == 0 ?
  66 + 20 : parseInt(this._formMap.workeLunch),
  67 + d: isNaN(this._formMap.workeDinner) || parseInt(this._formMap.workeDinner) == 0 ?
  68 + 20 : parseInt(this._formMap.workeDinner)
  69 + };
  70 + // 计算吃饭地点(方向)
  71 + this._oEatDir = {
  72 + up: false,
  73 + down: false
  74 + };
  75 + if (this._formMap.cfdd != undefined && String(this._formMap.cfdd) == "") {
  76 + // 没有选择吃饭地点,不吃饭
  77 + } else if (parseInt(this._formMap.cfdd) == 0) {
  78 + this._oEatDir["up"] = true;
  79 + } else if (parseInt(this._formMap.cfdd) == 1) {
  80 + this._oEatDir["down"] = true;
  81 + } else if (String(this._formMap.cfdd) == "allYes") {
  82 + this._oEatDir["up"] = true;
  83 + this._oEatDir["down"] = true;
  84 + }
  85 + // 计算行驶时间对象
  86 + this._oTripRunningTime = {
  87 + "up" : {
  88 + "AMPeak" : (isNaN(this._formMap.earlyUpTime) || parseInt(this._formMap.earlyUpTime) == 0) ?
  89 + parseInt(this._formMap.upTravelTime) :
  90 + parseInt(this._formMap.earlyUpTime),
  91 + "PMPeak" : (isNaN(this._formMap.lateUpTime) || parseInt(this._formMap.lateUpTime) == 0) ?
  92 + parseInt(this._formMap.upTravelTime) :
  93 + parseInt(this._formMap.lateUpTime),
  94 + "trough" : (isNaN(this._formMap.troughUpTime) || parseInt(this._formMap.troughUpTime) == 0) ?
  95 + parseInt(this._formMap.upTravelTime) :
  96 + parseInt(this._formMap.troughUpTime)
  97 + },
  98 + "down" : {
  99 + "AMPeak" : (isNaN(this._formMap.earlyDownTime) || parseInt(this._formMap.earlyDownTime) == 0) ?
  100 + parseInt(this._formMap.downTravelTime) :
  101 + parseInt(this._formMap.earlyDownTime),
  102 + "PMPeak" : (isNaN(this._formMap.lateDownTime) || parseInt(this._formMap.lateDownTime) == 0) ?
  103 + parseInt(this._formMap.downTravelTime) :
  104 + parseInt(this._formMap.lateDownTime),
  105 + "trough" : (isNaN(this._formMap.troughDownTime) || parseInt(this._formMap.troughDownTime) == 0) ?
  106 + parseInt(this._formMap.downTravelTime) :
  107 + parseInt(this._formMap.troughDownTime)
  108 + }
  109 + };
  110 + // 计算上下行进出场时间
  111 + this._oPullInOutTime = {
  112 + "up" : {
  113 + "pullIn" : (isNaN(this._formMap.upInTimer) || parseInt(this._formMap.upInTimer) == 0) ?
  114 + 20 : parseInt(this._formMap.upInTimer),
  115 + "pullOut" : (isNaN(this._formMap.upOutTimer) || parseInt(this._formMap.upOutTimer) == 0) ?
  116 + 20 : parseInt(this._formMap.upOutTimer)
  117 + },
  118 + "down" : {
  119 + "pullIn" : (isNaN(this._formMap.downInTimer) || parseInt(this._formMap.downInTimer) == 0) ?
  120 + 20 : parseInt(this._formMap.downInTimer),
  121 + "pullOut" : (isNaN(this._formMap.downOutTimer) || parseInt(this._formMap.downOutTimer) == 0) ?
  122 + 20 : parseInt(this._formMap.downOutTimer)
  123 + }
  124 + };
  125 + // 计算行驶里程对象
  126 + this._oMileage = {
  127 + "up" : {
  128 + "trip" : isNaN(this._formMap.upMileage) ? 0 : parseFloat(this._formMap.upMileage),
  129 + "pullIn" : isNaN(this._formMap.upInMileage) ? 0 : parseFloat(this._formMap.upInMileage),
  130 + "pullOut" : isNaN(this._formMap.upOutMileage) ? 0 : parseFloat(this._formMap.upOutMileage)
  131 + },
  132 + "down" : {
  133 + "trip" : isNaN(this._formMap.downMileage) ? 0 : parseFloat(this._formMap.downMileage),
  134 + "pullIn" : isNaN(this._formMap.downInMileage) ? 0 : parseFloat(this._formMap.downInMileage),
  135 + "pullOut" : isNaN(this._formMap.downOutMileage) ? 0 : parseFloat(this._formMap.downOutMileage)
  136 + }
  137 + };
  138 + // 计算时间段划分对象
  139 + this._oPeriod = {
  140 + "AMPeak" : {
  141 + "from" : _fnWrapToTimeObj(this._formMap.earlyStartTime),
  142 + "to" : _fnWrapToTimeObj(this._formMap.earlyEndTime)
  143 + },
  144 + "PMPeak" : {
  145 + "from" : _fnWrapToTimeObj(this._formMap.lateStartTime),
  146 + "to" : _fnWrapToTimeObj(this._formMap.lateEndTime)
  147 + }
  148 + };
  149 + // 计算各个时段的发车间隙
  150 + this._oHeadway = {
  151 + "AMPeak" : {
  152 + "min" : parseInt(this._formMap.zgffcjxmin),
  153 + "max" : parseInt(this._formMap.zgffcjxmax)
  154 + },
  155 + "PMPeak" : {
  156 + "min" : parseInt(this._formMap.wffcjxmin),
  157 + "max" : parseInt(this._formMap.wffcjxmax)
  158 + },
  159 + "trough" : {
  160 + "min" : parseInt(this._formMap.dgfcjxmin),
  161 + "max" : parseInt(this._formMap.dgfcjxmax)
  162 + }
  163 + };
  164 + // 做一些逻辑检查
  165 + if (this._oHeadway.AMPeak.min > this._oHeadway.AMPeak.max) {
  166 + alert("早高峰最小间隔大于最大间隔");
  167 + throw "早高峰最小间隔大于最大间隔";
  168 + }
  169 + if (this._oHeadway.PMPeak.min > this._oHeadway.PMPeak.max) {
  170 + alert("晚高峰最小间隔大于最大间隔");
  171 + throw "晚高峰最小间隔大于最大间隔";
  172 + }
  173 + if (this._oHeadway.trough.min > this._oHeadway.trough.max) {
  174 + alert("低谷最小间隔大于最大间隔");
  175 + throw "低谷最小间隔大于最大间隔";
  176 + }
  177 + // 获取停站类型
  178 + this._oStopType = {
  179 + upMaster : false,
  180 + downMaster : false
  181 + };
  182 + if (!this._formMap.stt) {
  183 + throw "停站类型没有选择!";
  184 + } else {
  185 + if (this._formMap.stt.split("/").length == 1) {
  186 + this._oStopType.upMaster = false;
  187 + this._oStopType.downMaster = false;
  188 + } else {
  189 + if (this._formMap.stt.split("/")[1] == "0") {
  190 + this._oStopType.upMaster = true;
  191 + } else {
  192 + this._oStopType.downMaster = true;
  193 + }
  194 + }
  195 + }
  196 +
  197 + }
  198 +
  199 + //------------ 获取首班末班时间 ------------//
  200 + /**
  201 + * 获取上行首班时间对象。
  202 + * @returns {moment}
  203 + */
  204 + InternalParamContext.prototype.fnGetUpFirstTripBeginTimeObj = function() {
  205 + return this._firstLastTripBeginTimeObj["up"]["firstTripBeginTimeObj"];
  206 + };
  207 + /**
  208 + * 获取上行末班时间对象。
  209 + * @returns moment
  210 + */
  211 + InternalParamContext.prototype.fnGetUpLastTripBeginTimeObj = function() {
  212 + var oStartTime = this._firstLastTripBeginTimeObj["up"]["firstTripBeginTimeObj"];
  213 + var oEndTime = this._firstLastTripBeginTimeObj["up"]["lastTripBeginTimeObj"];
  214 + if (oEndTime.isBefore(oStartTime)) {
  215 + // 因为是相同日期前缀,具体见_fnWrapToTimeObj函数
  216 + // 如果末班车时间早于首班车时间,则末班车时间跨天,需要加1天
  217 + oEndTime.add(1, "day");
  218 +
  219 + }
  220 + return oEndTime;
  221 + };
  222 + /**
  223 + * 获取下行首班时间对象。
  224 + * @returns moment
  225 + */
  226 + InternalParamContext.prototype.fnGetDownFirstTripBeginTimeObj = function() {
  227 + return this._firstLastTripBeginTimeObj["down"]["firstTripBeginTimeObj"];
  228 + };
  229 + /**
  230 + * 获取下行末班车时间对象。
  231 + * @returns moment
  232 + */
  233 + InternalParamContext.prototype.fnGetDownLastTripBeginTimeObj = function() {
  234 + var oStartTime = this._firstLastTripBeginTimeObj["down"]["firstTripBeginTimeObj"];
  235 + var oEndTime = this._firstLastTripBeginTimeObj["down"]["lastTripBeginTimeObj"];
  236 + if (oEndTime.isBefore(oStartTime)) {
  237 + // 因为是相同日期前缀,具体见_fnWrapToTimeObj函数
  238 + // 如果末班车时间早于首班车时间,则末班车时间跨天,需要加1天
  239 + oEndTime.add(1, "day");
  240 +
  241 + }
  242 + return oEndTime;
  243 + };
  244 +
  245 + //-------------- 获取吃饭时间 ----------------//
  246 + /**
  247 + * 获取午饭时间。
  248 + * @returns int
  249 + */
  250 + InternalParamContext.prototype.fnGetLunchTime = function() {
  251 + return this._oEatTime["l"];
  252 + };
  253 + /**
  254 + * 获取晚饭时间。
  255 + * @returns int
  256 + */
  257 + InternalParamContext.prototype.fnGetDinnerTime = function() {
  258 + return this._oEatTime["d"];
  259 + };
  260 +
  261 + //-------------- 获取吃饭地点(方向) ----------------//
  262 + /**
  263 + * 是否吃饭。
  264 + * @returns boolean
  265 + */
  266 + InternalParamContext.prototype.fnIsEat = function() {
  267 + return this._oEatDir["up"] || this._oEatDir["down"];
  268 + };
  269 + /**
  270 + * 是否上行吃饭。
  271 + * @returns boolean
  272 + */
  273 + InternalParamContext.prototype.fnIsUpEat = function() {
  274 + return this._oEatDir["up"];
  275 + };
  276 + /**
  277 + * 是否下行吃饭。
  278 + * @returns boolean
  279 + */
  280 + InternalParamContext.prototype.fnIsDownEat = function() {
  281 + return this._oEatDir["down"];
  282 + };
  283 + /**
  284 + * 是否上下行吃饭。
  285 + * @returns boolean
  286 + */
  287 + InternalParamContext.prototype.fnIsBothEat = function() {
  288 + return this._oEatDir["up"] && this._oEatDir["down"];
  289 + };
  290 +
  291 + //-------------- 获取行驶时间 ----------------//
  292 + /**
  293 + * 获取上行早高峰班次行驶时间。
  294 + * @returns int
  295 + */
  296 + InternalParamContext.prototype.fnGetUpAMPeakRunningTime = function() {
  297 + return this._oTripRunningTime["up"]["AMPeak"];
  298 + };
  299 + /**
  300 + * 获取上行晚高峰班次行驶时间。
  301 + * @returns int
  302 + */
  303 + InternalParamContext.prototype.fnGetUpPMPeakRunningTime = function() {
  304 + return this._oTripRunningTime["up"]["PMPeak"];
  305 + };
  306 + /**
  307 + * 获取上行低谷班次行驶时间。
  308 + * @returns int
  309 + */
  310 + InternalParamContext.prototype.fnGetUpTRunningTime = function() {
  311 + return this._oTripRunningTime["up"]["trough"];
  312 + };
  313 + /**
  314 + * 获取下行早高峰班次行驶时间。
  315 + * @returns int
  316 + */
  317 + InternalParamContext.prototype.fnGetDownAMPeakRunningTime = function() {
  318 + return this._oTripRunningTime["down"]["AMPeak"];
  319 + };
  320 + /**
  321 + * 获取下行晚高峰班次行驶时间。
  322 + * @returns int
  323 + */
  324 + InternalParamContext.prototype.fnGetDownPMPeakRunningTime = function() {
  325 + return this._oTripRunningTime["down"]["PMPeak"];
  326 + };
  327 + /**
  328 + * 获取下行低谷班次行驶时间。
  329 + * @returns int
  330 + */
  331 + InternalParamContext.prototype.fnGetDownTRunningTime = function() {
  332 + return this._oTripRunningTime["down"]["trough"];
  333 + };
  334 + /**
  335 + * 获取上行进场时间。
  336 + * @returns int
  337 + */
  338 + InternalParamContext.prototype.fnGetUpPullInTime = function() {
  339 + return this._oPullInOutTime["up"]["pullIn"];
  340 + };
  341 + /**
  342 + * 获取上行出场时间。
  343 + * @returns int
  344 + */
  345 + InternalParamContext.prototype.fnGetUpPullOutTime = function() {
  346 + return this._oPullInOutTime["up"]["pullOut"];
  347 + };
  348 + /**
  349 + * 获取下行进场时间。
  350 + * @returns int
  351 + */
  352 + InternalParamContext.prototype.fnGetDownPullInTime = function() {
  353 + return this._oPullInOutTime["down"]["pullIn"];
  354 + };
  355 + /**
  356 + * 获取下行出场时间。
  357 + * @returns int
  358 + */
  359 + InternalParamContext.prototype.fnGetDownPullOutTime = function() {
  360 + return this._oPullInOutTime["down"]["pullOut"];
  361 + };
  362 +
  363 + //---------------- 获取行驶里程 -----------------//
  364 + /**
  365 + * 获取上行班次里程
  366 + * @returns float
  367 + */
  368 + InternalParamContext.prototype.fnGetUpTripMileage = function() {
  369 + return this._oMileage["up"]["trip"];
  370 + };
  371 + /**
  372 + * 获取上行进场里程
  373 + * @returns float
  374 + */
  375 + InternalParamContext.prototype.fnGetUpPullInMileage = function() {
  376 + return this._oMileage["up"]["pullIn"];
  377 + };
  378 + /**
  379 + * 获取上行出场里程。
  380 + * @returns float
  381 + */
  382 + InternalParamContext.prototype.fnGetUpPullOutMileage = function() {
  383 + return this._oMileage["up"]["pullOut"];
  384 + };
  385 + /**
  386 + * 获取下行班次里程。
  387 + * @returns float
  388 + */
  389 + InternalParamContext.prototype.fnGetDownTripMileage = function() {
  390 + return this._oMileage["down"]["trip"];
  391 + };
  392 + /**
  393 + * 获取下行进场里程。
  394 + * @returns float
  395 + */
  396 + InternalParamContext.prototype.fnGetDownPullInMileage = function() {
  397 + return this._oMileage["down"]["pullIn"];
  398 + };
  399 + /**
  400 + * 获取下行出场里程。
  401 + * @returns float
  402 + */
  403 + InternalParamContext.prototype.fnGetDownPullOutMileage = function() {
  404 + return this._oMileage["down"]["pullOut"];
  405 + };
  406 +
  407 + //---------------- 获取时间段信息,时间段判定 --------------//
  408 + /**
  409 + * 获取早高峰开始时间对象。
  410 + * @returns moment
  411 + */
  412 + InternalParamContext.prototype.fnGetAMPeakFromTimeObj = function() {
  413 + return this._oPeriod["AMPeak"]["from"];
  414 + };
  415 + /**
  416 + * 获取早高峰结束时间对象。
  417 + * @returns moment
  418 + */
  419 + InternalParamContext.prototype.fnGetAMPeakToTimeObj = function() {
  420 + return this._oPeriod["AMPeak"]["to"];
  421 + };
  422 + /**
  423 + * 获取晚高峰开始时间对象。
  424 + * @returns moment
  425 + */
  426 + InternalParamContext.prototype.fnGetPMPeakFromTimeObj = function() {
  427 + return this._oPeriod["PMPeak"]["from"];
  428 + };
  429 + /**
  430 + * 获取晚高峰结束时间对象。
  431 + * @returns moment
  432 + */
  433 + InternalParamContext.prototype.fnGetPMPeakToTimeObj = function() {
  434 + return this._oPeriod["PMPeak"]["to"];
  435 + };
  436 +
  437 + /**
  438 + * 判定时间是否在早高峰。
  439 + * @param leaveTimeObj {moment} 发车时间对象
  440 + * @returns {boolean}
  441 + */
  442 + InternalParamContext.prototype.fnIsAMPeak = function(timeObj) {
  443 + var _oST = this.fnGetAMPeakFromTimeObj();
  444 + var _oET = this.fnGetAMPeakToTimeObj();
  445 + return timeObj.isBetween(_oST, _oET, null, "[]");
  446 + };
  447 + /**
  448 + * 判定时间是否在晚高峰。
  449 + * @param leaveTimeObj {moment} 发车时间对象
  450 + * @returns {boolean}
  451 + */
  452 + InternalParamContext.prototype.fnIsPMPeak = function(timeObj) {
  453 + var _oST = this.fnGetPMPeakFromTimeObj();
  454 + var _oET = this.fnGetPMPeakToTimeObj();
  455 + return timeObj.isBetween(_oST, _oET, null, "[]");
  456 + };
  457 + /**
  458 + * 判定时间是否在低谷。
  459 + * @param leaveTimeObj {moment} 发车时间对象
  460 + * @returns {boolean}
  461 + */
  462 + InternalParamContext.prototype.fnIsTrough = function(timeObj) {
  463 + return !(this.fnIsAMPeak(timeObj) ||
  464 + this.fnIsPMPeak(timeObj));
  465 + };
  466 + /**
  467 + * 判定时间是否在早高峰开始之前。
  468 + * @param leaveTimeObj {moment} 发车时间对象
  469 + * @returns {boolean}
  470 + */
  471 + InternalParamContext.prototype.fnIsTroughBeforeAMPeak = function(timeObj) {
  472 + var _oST = this.fnGetAMPeakFromTimeObj();
  473 + return timeObj.isBefore(_oST);
  474 + };
  475 + /**
  476 + * 判定时间是否在晚高峰结束之后。
  477 + * @param leaveTimeObj {moment} 发车时间对象
  478 + * @returns {boolean}
  479 + */
  480 + InternalParamContext.prototype.fnIsTroughAfterPMPeak = function(timeObj) {
  481 + var _oET = this.fnGetPMPeakToTimeObj();
  482 + return timeObj.isAfter(_oET);
  483 + };
  484 +
  485 + //----------------- 获取发车间隙(TODO:以后通过客流估算)-----------------//
  486 + /**
  487 + * 获取早高峰最小发车间隔。
  488 + * @returns int
  489 + */
  490 + InternalParamContext.prototype.fnGetAMPeakMinHeadway = function() {
  491 + return this._oHeadway["AMPeak"]["min"];
  492 + };
  493 + /**
  494 + * 获取早高峰最大发车间隔。
  495 + * @returns int
  496 + */
  497 + InternalParamContext.prototype.fnGetAMPeakMaxHeadway = function() {
  498 + return this._oHeadway["AMPeak"]["max"];
  499 + };
  500 + /**
  501 + * 获取晚高峰最小发车间隔。
  502 + * @returns int
  503 + */
  504 + InternalParamContext.prototype.fnGetPMPeakMinHeadway = function() {
  505 + return this._oHeadway["PMPeak"]["min"];
  506 + };
  507 + /**
  508 + * 获取晚高峰最大发车间隔。
  509 + * @returns int
  510 + */
  511 + InternalParamContext.prototype.fnGetPMPeakMaxHeadway = function() {
  512 + return this._oHeadway["PMPeak"]["max"];
  513 + };
  514 + /**
  515 + * 获取低谷最小发车间隔。
  516 + * @returns int
  517 + */
  518 + InternalParamContext.prototype.fnGetTroughMinHeadway = function() {
  519 + return this._oHeadway["trough"]["min"];
  520 + };
  521 + /**
  522 + * 获取低谷最大发车间隔。
  523 + * @returns {int}
  524 + */
  525 + InternalParamContext.prototype.fnGetTroughMaxHeadway = function() {
  526 + return this._oHeadway["trough"]["max"];
  527 + };
  528 +
  529 + //----------------- 获取停站方式 -------------------//
  530 + /**
  531 + * 是否双向停站.
  532 + * @returns {boolean}
  533 + */
  534 + InternalParamContext.prototype.fnIsTwoDirStop = function() {
  535 + return !(this._oStopType.upMaster || this._oStopType.downMaster);
  536 + };
  537 + /**
  538 + * 是否上行停站。
  539 + * @returns {boolean}
  540 + */
  541 + InternalParamContext.prototype.fnIsUpDirStop = function() {
  542 + return this._oStopType.upMaster;
  543 + };
  544 + /**
  545 + * 是否下行停站。
  546 + * @returns {boolean}
  547 + */
  548 + InternalParamContext.prototype.fnIsDownDirStop = function() {
  549 + return this._oStopType.downMaster;
  550 + };
  551 +
  552 + //----------------- 获取高峰建议配车数、加班路牌数 ----------------//
  553 + /**
  554 + * 获取高峰建议配车数。
  555 + * @returns {int}
  556 + */
  557 + InternalParamContext.prototype.fnGetAdvicePeakVehicleCount = function() {
  558 + return parseInt(this._formMap.gfjypcs);
  559 + };
  560 + /**
  561 + * 获取5休2路牌数。
  562 + * @returns {int}
  563 + */
  564 + InternalParamContext.prototype.fnGet5_2lpCount = function() {
  565 + return parseInt(this._formMap.jbclcount);
  566 + };
  567 +
  568 + //----------------- 获取保养信息 ------------------//
  569 + /**
  570 + * 获取保养信息。
  571 + * @returns {int}
  572 + */
  573 + InternalParamContext.prototype.fnGetMaintenanceTime = function() {
  574 + return (isNaN(this._formMap.lb) || parseInt(this._formMap.lb) == 0) ?
  575 + 10 : parseInt(this._formMap.lb);
  576 + };
  577 +
  578 + //----------------- 获取其他关联数据信息 -----------------//
  579 + /**
  580 + * 获取线路id。
  581 + * @returns {int}
  582 + */
  583 + InternalParamContext.prototype.fnGetXlId = function() {
  584 + return parseInt(this._formMap.lineName.split('_')[0]);
  585 + };
  586 + /**
  587 + * 获取停车场id。
  588 + * @returns {int}
  589 + */
  590 + InternalParamContext.prototype.fnGetTccId = function() {
  591 + return parseInt(this._formMap.tcc_id);
  592 + };
  593 + /**
  594 + * 获取时刻表id。
  595 + * @returns {int}
  596 + */
  597 + InternalParamContext.prototype.fnGetTTInfoId = function() {
  598 + return parseInt(this._formMap.skbName);
  599 + };
  600 + /**
  601 + * 获取上行起点站路由id。
  602 + * @returns {int}
  603 + */
  604 + InternalParamContext.prototype.fnGetUpQdzRouteId = function() {
  605 + return parseInt(this._dataMap.qdzArr[0]);
  606 + };
  607 + /**
  608 + * 获取上行终点站路由id。
  609 + * @returns {int}
  610 + */
  611 + InternalParamContext.prototype.fnGetUpZdzRouteId = function() {
  612 + return parseInt(this._dataMap.zdzArr[0]);
  613 + };
  614 + /**
  615 + * 获取下行起点站路由id。
  616 + * @returns {int}
  617 + */
  618 + InternalParamContext.prototype.fnGetDownQdzRouteId = function() {
  619 + return parseInt(this._dataMap.qdzArr[1]);
  620 + };
  621 + /**
  622 + * 获取下行终点站路由id。
  623 + * @returns {int}
  624 + */
  625 + InternalParamContext.prototype.fnGetDownZdzRouteId = function() {
  626 + return parseInt(this._dataMap.zdzArr[1]);
  627 + };
  628 +
  629 +
  630 +
  631 +
  632 + // TODO
  633 +
  634 + //---------------------- 静态工具方法 ---------------------//
  635 + InternalParamContext.ADDMINUTE = _fnAddMinuteToTimeObj;
  636 + InternalParamContext.TOTIMEOBJ = _fnWrapToTimeObj;
  637 +
  638 + return InternalParamContext;
  639 +}());
  640 +
  641 +// new ParamContext({}, {});
0 642 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/js/v2_1/SchedulePlan.js 0 → 100644
  1 +/**
  2 + * 排班计划对象。
  3 + */
  4 +var SchedulePlan = (function() {
  5 +
  6 + // 1、初始化行车计划
  7 + // 2、将连班路牌的班次补足
  8 + // 3、修正针对初始化时生成的高峰班次,之前不足的补上,多余的删除
  9 + // 4、补吃饭班次
  10 + // 5、按照车辆投入运营要求补充班次
  11 + // 6、根据班型补充所有的不足班次
  12 + // 7、祛除上标线开头有删除标记的班次
  13 + // TODO:8、调整路牌班次间隔
  14 + // TODO:9、调整纵向班次间隔
  15 + // 10、确定末班车
  16 + // 11、祛除上标线结尾有删除标记的班次
  17 + // TODO:12、平均化指定时间后的班次列表间隔
  18 + // 13、补进出场例保班次
  19 +
  20 +
  21 + // TODO
  22 +
  23 + function InternalSchedulePlan() {
  24 +
  25 + }
  26 +
  27 + return InternalSchedulePlan;
  28 +}());
0 29 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/js/v2_1/Strategy.js 0 → 100644
  1 +// 策略类
  2 +var Strategy = (function() {
  3 +
  4 + //------------------ 策略函数(以下) -----------------//
  5 +
  6 + /**
  7 + * 计算班次的行驶时间。
  8 + * @param tripType {TripType} 班次类型
  9 + * @param isUp {boolean} 是否上行
  10 + * @param leaveTimeObj {moment} 发车时间
  11 + * @param pc {ParamContext} 参数上下文
  12 + * @returns {int}
  13 + */
  14 + function calcuTripRunningTime(tripType, isUp, leaveTimeObj, pc) {
  15 + if (isUp) {
  16 + if (Trip.Type.IN.fnIsEqual(tripType)) {
  17 + return pc.fnGetUpPullInTime();
  18 + } else if (Trip.Type.OUT.fnIsEqual(tripType)) {
  19 + return pc.fnGetUpPullOutTime();
  20 + } else if (Trip.Type.NORMAL.fnIsEqual(tripType)) {
  21 + if (pc.fnIsAMPeak(leaveTimeObj)) {
  22 + return pc.fnGetUpAMPeakRunningTime();
  23 + } else if (pc.fnIsPMPeak(leaveTimeObj)) {
  24 + return pc.fnGetUpPMPeakRunningTime();
  25 + } else {
  26 + return pc.fnGetUpTRunningTime();
  27 + }
  28 + } else if (Trip.Type.BD.fnIsEqual(tripType)) {
  29 + return pc.fnGetMaintenanceTime();
  30 + } else if (Trip.Type.LC.fnIsEqual(tripType)) {
  31 + return pc.fnGetMaintenanceTime();
  32 + }
  33 + } else {
  34 + if (Trip.Type.IN.fnIsEqual(tripType)) {
  35 + return pc.fnGetDownPullInTime();
  36 + } else if (Trip.Type.OUT.fnIsEqual(tripType)) {
  37 + return pc.fnGetDownPullOutTime();
  38 + } else if (Trip.Type.NORMAL.fnIsEqual(tripType)) {
  39 + if (pc.fnIsAMPeak(leaveTimeObj)) {
  40 + return pc.fnGetDownAMPeakRunningTime();
  41 + } else if (pc.fnIsPMPeak(leaveTimeObj)) {
  42 + return pc.fnGetDownPMPeakRunningTime();
  43 + } else {
  44 + return pc.fnGetDownTRunningTime();
  45 + }
  46 + } else if (Trip.Type.BD.fnIsEqual(tripType)) {
  47 + return pc.fnGetMaintenanceTime();
  48 + } else if (Trip.Type.LC.fnIsEqual(tripType)) {
  49 + return pc.fnGetMaintenanceTime();
  50 + }
  51 + }
  52 +
  53 + }
  54 +
  55 + /**
  56 + * 计算班次的行驶里程。
  57 + * @param tripType {TripType} 班次类型
  58 + * @param isUp {boolean} 是否上行
  59 + * @param leaveTimeObj {moment} 发车时间
  60 + * @param pc {ParamContext} 参数上下文
  61 + * @returns {float}
  62 + */
  63 + function calcuTripMileage(tripType, isUp, leaveTimeObj, pc) {
  64 + if (isUp) {
  65 + if (Trip.Type.IN.fnIsEqual(tripType)) {
  66 + return pc.fnGetUpPullInMileage();
  67 + } else if (Trip.Type.OUT.fnIsEqual(tripType)) {
  68 + return pc.fnGetUpPullOutMileage();
  69 + } else if (Trip.Type.NORMAL.fnIsEqual(tripType)) {
  70 + return pc.fnGetUpTripMileage();
  71 + }
  72 + } else {
  73 + if (Trip.Type.IN.fnIsEqual(tripType)) {
  74 + return pc.fnGetDownPullInMileage();
  75 + } else if (Trip.Type.OUT.fnIsEqual(tripType)) {
  76 + return pc.fnGetDownPullOutMileage();
  77 + } else if (Trip.Type.NORMAL.fnIsEqual(tripType)) {
  78 + return pc.fnGetDownTripMileage();
  79 + }
  80 + }
  81 +
  82 + // TODO:其他班次类型再议
  83 + }
  84 +
  85 + /**
  86 + * 计算班次Layover时间范围。
  87 + * @param arriveTimeObj {moment} 到达时间对象
  88 + * @param isUp {boolean} 是否上行
  89 + * @param runningTime {int} 班次行驶时间
  90 + * @param pc {ParamContext} 参数上下文
  91 + * @returns int[] 两个元素,一个最小停站时间-分钟,一个最大停站时间-分钟
  92 + */
  93 + function calcuTripLayoverTimeRange(arriveTimeObj, isUp, runningTime, pc) {
  94 + var _aLayoverTime = [];
  95 +
  96 + var _iMinLayoverTime = 0;
  97 + var _iMaxlayoverTime = 0;
  98 +
  99 + if (pc.fnIsTwoDirStop() || isUp != pc.fnIsUpDirStop()) {
  100 + // 主站停站
  101 + // 早晚高峰,行驶时间的10%-15%,最少3分钟
  102 + // 低谷,行驶时间的15%-20%,最少10分钟
  103 + if (pc.fnIsAMPeak(arriveTimeObj) || pc.fnIsPMPeak(arriveTimeObj)) {
  104 + _iMinLayoverTime = Math.floor(runningTime * 0.1);
  105 + _iMaxlayoverTime = Math.floor(runningTime * 0.15);
  106 + if (_iMaxlayoverTime < 3) {
  107 + _iMinLayoverTime = 3;
  108 + _iMaxlayoverTime = 3;
  109 + }
  110 + } else {
  111 + _iMinLayoverTime = Math.floor(runningTime * 0.15);
  112 + _iMaxlayoverTime = Math.floor(runningTime * 0.20);
  113 + if (_iMaxlayoverTime < 10) {
  114 + _iMinLayoverTime = 10;
  115 + _iMaxlayoverTime = 10;
  116 + }
  117 + }
  118 + } else {
  119 + // 副站停站
  120 + // 所有时间段,1-3分钟
  121 + _iMinLayoverTime = 1;
  122 + _iMaxlayoverTime = 3;
  123 + }
  124 +
  125 + _aLayoverTime.push(_iMinLayoverTime);
  126 + _aLayoverTime.push(_iMaxlayoverTime);
  127 + return _aLayoverTime;
  128 + }
  129 +
  130 + /**
  131 + * 计算Layover时间。
  132 + * @param arriveTimeObj {moment} 班次到达时间
  133 + * @param isUp {boolean} 是否上行
  134 + * @param aRangeTime {array} Layover时间范围
  135 + * @param pc {ParamContext} 参数上下文
  136 + * @returns {int}
  137 + */
  138 + function calcuTripLayoverTime(arriveTimeObj, isUp, aRangeTime, pc) {
  139 + // 使用平均时间计算Layover时间
  140 + return Math.floor((aRangeTime[0] + aRangeTime[1]) / 2);
  141 + }
  142 +
  143 + /**
  144 + * 计算早高峰周转时间(需要关联其他策略)。
  145 + * @param sConfig {InternalStrategyConfig} 行驶时间策略函数
  146 + * @param pc {ParamContext} 参数上行文
  147 + * @returns {int}
  148 + */
  149 + function calcuAMPeakRoundTripsCycleTime(sConfig, pc) {
  150 + var _oTime = pc.fnGetAMPeakFromTimeObj();
  151 + var _iUpRT = sConfig.sFn("CALCU_TRIP_R_TIME")(
  152 + Trip.Type.NORMAL, true, _oTime, pc);
  153 + var _aUpLTRange = sConfig.sFn("CALCU_TRIP_L_TIME_RANGE")(
  154 + _oTime, true, _iUpRT, pc);
  155 + var _iUpLT = sConfig.sFn("CALCU_TRIP_L_TIME")(
  156 + _oTime, true, _aUpLTRange, pc
  157 + );
  158 + var _iDownRT = sConfig.sFn("CALCU_TRIP_R_TIME")(
  159 + Trip.Type.NORMAL, true, _oTime, pc);
  160 + var _aDownLTRange = sConfig.sFn("CALCU_TRIP_L_TIME_RANGE")(
  161 + _oTime, false, _iDownRT, pc);
  162 + var _iDownLT = sConfig.sFn("CALCU_TRIP_L_TIME")(
  163 + _oTime, false, _aDownLTRange, pc
  164 + );
  165 + return _iUpRT + _iUpLT + _iDownRT + _iDownLT;
  166 + }
  167 +
  168 + /**
  169 + * 计算晚高峰周转时间(需要关联其他策略)。
  170 + * @param sConfig {InternalStrategyConfig} 行驶时间策略函数
  171 + * @param pc {ParamContext} 参数上行文
  172 + * @returns {int}
  173 + */
  174 + function calcuPMPeakRoundTripsCycleTime(sConfig, pc) {
  175 + var _oTime = pc.fnGetPMPeakFromTimeObj();
  176 + var _iUpRT = sConfig.sFn("CALCU_TRIP_R_TIME")(
  177 + Trip.Type.NORMAL, true, _oTime, pc);
  178 + var _aUpLTRange = sConfig.sFn("CALCU_TRIP_L_TIME_RANGE")(
  179 + _oTime, true, _iUpRT, pc);
  180 + var _iUpLT = sConfig.sFn("CALCU_TRIP_L_TIME")(
  181 + _oTime, true, _aUpLTRange, pc
  182 + );
  183 + var _iDownRT = sConfig.sFn("CALCU_TRIP_R_TIME")(
  184 + Trip.Type.NORMAL, true, _oTime, pc);
  185 + var _aDownLTRange = sConfig.sFn("CALCU_TRIP_L_TIME_RANGE")(
  186 + _oTime, false, _iDownRT, pc);
  187 + var _iDownLT = sConfig.sFn("CALCU_TRIP_L_TIME")(
  188 + _oTime, false, _aDownLTRange, pc
  189 + );
  190 + return _iUpRT + _iUpLT + _iDownRT + _iDownLT;
  191 + }
  192 +
  193 + /**
  194 + * 计算晚低谷周转时间(需要关联其他策略)。
  195 + * @param sConfig {InternalStrategyConfig} 策略对象
  196 + * @param pc {ParamContext} 参数上行文
  197 + * @returns {int}
  198 + */
  199 + function calcuTroughRoundTripsCycleTime(sConfig, pc) {
  200 + var _oTime = ParamContext.ADDMINUTE(pc.fnGetAMPeakFromTimeObj(), -1);
  201 + var _iUpRT = sConfig.sFn("CALCU_TRIP_R_TIME")(
  202 + Trip.Type.NORMAL, true, _oTime, pc);
  203 + var _aUpLTRange = sConfig.sFn("CALCU_TRIP_L_TIME_RANGE")(
  204 + _oTime, true, _iUpRT, pc);
  205 + var _iUpLT = sConfig.sFn("CALCU_TRIP_L_TIME")(
  206 + _oTime, true, _aUpLTRange, pc
  207 + );
  208 + var _iDownRT = sConfig.sFn("CALCU_TRIP_R_TIME")(
  209 + Trip.Type.NORMAL, true, _oTime, pc);
  210 + var _aDownLTRange = sConfig.sFn("CALCU_TRIP_L_TIME_RANGE")(
  211 + _oTime, false, _iDownRT, pc);
  212 + var _iDownLT = sConfig.sFn("CALCU_TRIP_L_TIME")(
  213 + _oTime, false, _aDownLTRange, pc
  214 + );
  215 + return _iUpRT + _iUpLT + _iDownRT + _iDownLT;
  216 + }
  217 +
  218 + /**
  219 + * 计算所需的车辆数。
  220 + * @param sConfig {InternalStrategyConfig} 策略对象
  221 + * @param pc {ParamContext} 参数上行文
  222 + * @returns {int}
  223 + */
  224 + function calcuVehicleCount : function(sConfig, pc) {
  225 + // 计算早高峰车辆数(使用平均间隔)
  226 + var _iAMPeakFcjx_avg = (pc.fnGetAMPeakMinHeadway() + pc.fnGetAMPeakMaxHeadway()) / 2;
  227 + var _iAMPeakRCTime = sConfig.sFn("CALCU_AM_P_ROUND_TRIPS_C_TIME")(sConfig, pc);
  228 + var _iAMPeakVehicleCount = _iAMPeakRCTime / _iAMPeakFcjx_avg;
  229 +
  230 + // 计算晚高峰车辆数 (使用平均间隔)
  231 + var _iPMPeakFcjx_avg = (pc.fnGetPMPeakMinHeadway() + pc.fnGetPMPeakMaxHeadway()) / 2;
  232 + var _iPMPeakRCTime = sConfig.sFn("CALCU_AM_P_ROUND_TRIPS_C_TIME")(sConfig, pc);
  233 + var _iPMPeakVehicleCount = _iPMPeakRCTime / _iPMPeakFcjx_avg;
  234 +
  235 + // 取最大值为最终车辆数
  236 + // 大于或等于的最小整数,人话就是有小数点就加1
  237 + if (_iAMPeakVehicleCount > _iPMPeakVehicleCount) {
  238 + return Math.ceil(_iAMPeakVehicleCount);
  239 + } else {
  240 + return Math.ceil(_iPMPeakVehicleCount);
  241 + }
  242 +
  243 + }
  244 +
  245 + /**
  246 + * 创建班次策略。
  247 + * @param tripType {TripType} 班次类型
  248 + * @param isUp {boolean} 是否上行
  249 + * @param leaveTimeObj {moment} 发车时间对象
  250 + * @param sConfig {InternalStrategyConfig} 策略对象
  251 + * @param pc {ParamContext} 参数上下文
  252 + * @returns {Trip}
  253 + */
  254 + function createTrip(tripType, isUp, leaveTimeObj, sConfig, pc) {
  255 + var _oTripType = tripType;
  256 + var _bIsUpDir = isUp;
  257 + var _oLeaveTime = leaveTimeObj;
  258 + var _iRunningTime = sConfig.sFn("CALCU_TRIP_R_TIME")(
  259 + _oTripType, _bIsUpDir, _oLeaveTime, pc
  260 + );
  261 + var _oArriveTime = ParamContext.ADDMINUTE(_oLeaveTime, _iRunningTime);
  262 + var _iLayoverTime = sConfig.sFn("CALCU_TRIP_L_TIME")(
  263 + _oArriveTime, _oTripType,
  264 + sConfig.sFn("CALCU_TRIP_L_TIME_RANGE")(
  265 + _oArriveTime, _bIsUpDir, _iRunningTime, pc
  266 + ),
  267 + pc
  268 + );
  269 + var _iRecoveryTime = 0;
  270 + var _iEatTime = 0;
  271 + var _fTripMileage = sConfig.sFn("CALCU_TRIP_MILE")(
  272 + _oTripType, _bIsUpDir, _oLeaveTime, pc
  273 + );
  274 +
  275 + if (Trip.Type.BD.fnIsEqual(tripType)) { // 早例保,传过来的发车时间是第一个班次的发车时间
  276 + if (_bIsUpDir) { // 上行
  277 + _oLeaveTime = ParamContext.ADDMINUTE(
  278 + _oLeaveTime,
  279 + -(pc.fnGetUpPullOutTime() + pc.fnGetMaintenanceTime())
  280 + );
  281 + _iLayoverTime = 0;
  282 + } else { // 下行
  283 + _oLeaveTime = ParamContext.ADDMINUTE(
  284 + _oLeaveTime,
  285 + -(pc.fnGetDownPullOutTime() + pc.fnGetMaintenanceTime())
  286 + );
  287 + _iLayoverTime = 0;
  288 + }
  289 + } else if (Trip.Type.LC.fnIsEqual(tripType)) { // 晚例保,传过来的发车时间是最后一个班次的到达时间
  290 + if (_bIsUpDir) { // 上行
  291 + _oLeaveTime = ParamContext.ADDMINUTE(
  292 + _oLeaveTime,
  293 + pc.fnGetUpPullInTime()
  294 + );
  295 + _iLayoverTime = 0;
  296 + } else { // 下行
  297 + _oLeaveTime = ParamContext.ADDMINUTE(
  298 + _oLeaveTime,
  299 + pc.fnGetDownPullInTime()
  300 + );
  301 + _iLayoverTime = 0;
  302 + }
  303 + } else if (Trip.Type.OUT.fnIsEqual(tripType)) { // 出场,传过来的发车时间是第一个班次的发车时间
  304 + if (_bIsUpDir) { // 上行
  305 + _oLeaveTime = ParamContext.ADDMINUTE(
  306 + _oLeaveTime,
  307 + -pc.fnGetUpPullOutTime()
  308 + );
  309 + _iLayoverTime = 0;
  310 + } else { // 下行
  311 + _oLeaveTime = ParamContext.ADDMINUTE(
  312 + _oLeaveTime,
  313 + -pc.fnGetDownPullOutTime()
  314 + );
  315 + _iLayoverTime = 0;
  316 + }
  317 + } else if (Trip.Type.IN.fnIsEqual(tripType)) { // 进场,传过来的发车时间是最后一个班次的到达时间
  318 + if (_bIsUpDir) { // 上行
  319 + _iLayoverTime = 0;
  320 + } else { // 下行
  321 + _iLayoverTime = 0;
  322 + }
  323 + }
  324 +
  325 + return new Trip(
  326 + _oTripType,
  327 + _bIsUpDir,
  328 + _oLeaveTime, _oArriveTime, _iRunningTime,
  329 + _iLayoverTime, _iRecoveryTime, _iEatTime,
  330 + _fTripMileage,
  331 + pc
  332 + );
  333 +
  334 + }
  335 +
  336 + // TODO
  337 +
  338 + //------------------ 策略函数(以上) -----------------//
  339 +
  340 + /**
  341 + * 内部策略配置封装类。
  342 + * @constructor
  343 + */
  344 + function InternalStrategyConfig() {
  345 + // 策略函数对应,每个函数都由一个标识符号对应,类似配置函数
  346 + this._oSTRATIGIS = {
  347 + "CALCU_TRIP_R_TIME" : calcuTripRunningTime,
  348 + "CALCU_TRIP_MILE" : calcuTripMileage,
  349 + "CALCU_TRIP_L_TIME_RANGE" : calcuTripLayoverTimeRange,
  350 + "CALCU_TRIP_L_TIME" : calcuTripLayoverTime,
  351 + "CALCU_AM_P_ROUND_TRIPS_C_TIME" : calcuAMPeakRoundTripsCycleTime,
  352 + "CALCU_PM_P_ROUND_TRIPS_C_TIME" : calcuPMPeakRoundTripsCycleTime,
  353 + "CALCU_T_ROUND_TRIPS_C_TIME" : calcuTroughRoundTripsCycleTime,
  354 + "CALCU_V_COUNT" : calcuVehicleCount,
  355 + "CREATE_TRIP" : createTrip
  356 +
  357 +
  358 + // TODO
  359 + };
  360 +
  361 + }
  362 +
  363 + /**
  364 + * 返回策略函数
  365 + * @param str 标识
  366 + * @returns {function}
  367 + */
  368 + InternalStrategyConfig.prototype.sFn = function(str) {
  369 + if (!this._oSTRATIGIS[str]) {
  370 + throw "指定标识" + str + "策略函数不存在!";
  371 + }
  372 + return this._oSTRATIGIS[str];
  373 + };
  374 + /**
  375 + * 替换策略配置
  376 + * @param str 策略函数标识
  377 + * @param fn 策略函数
  378 + */
  379 + InternalStrategyConfig.prototype.sConfig = function(str, fn) {
  380 + this._oSTRATIGIS[str] = fn;
  381 + };
  382 +
  383 +
  384 + return InternalStrategyConfig;
  385 +
  386 +}());
0 387 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/js/v2_1/Trip.js 0 → 100644
  1 +/**
  2 + * 班次对象。
  3 + */
  4 +var Trip = (function() {
  5 +
  6 + var _oTripType = {
  7 + "normal" : "normal", // 正常班次
  8 + "bd" : "bd", // 早例保班次
  9 + "lc" : "lc", // 晚例保班次
  10 + "out" : "out", // 出场班次
  11 + "in" : "in_", // 进场班次
  12 + "cf" : "cf" // 吃饭班次
  13 + };
  14 +
  15 + /**
  16 + * 班次类型对象
  17 + * @param sType
  18 + * @constructor
  19 + */
  20 + function TripType(sType) {
  21 + if (!_oTripType[sType]) {
  22 + throw "未知的班次类型=" + sType;
  23 + }
  24 + this._sTripType = _oTripType[sType];
  25 + }
  26 +
  27 + /**
  28 + * 返回班次类型内部描述string。
  29 + * @returns {string}
  30 + */
  31 + TripType.prototype.fnGetType = function() {
  32 + return this._sTripType;
  33 + };
  34 + /**
  35 + * 判定类型是否相等。
  36 + * @param tripType {TripType}
  37 + * @returns {boolean}
  38 + */
  39 + TripType.prototype.fnIsEqual = function(tripType) {
  40 + if (this === tripType) {
  41 + return true;
  42 + } else {
  43 + return this.fnGetType() == tripType.fnGetType();
  44 + }
  45 + };
  46 + TripType.BD = new TripType("bd");
  47 + TripType.NORMAL = new TripType("normal");
  48 + TripType.LC = new TripType("lc");
  49 + TripType.IN = new TripType("in");
  50 + TripType.OUT = new TripType("out");
  51 + TripType.CF = new TripType("cf");
  52 +
  53 + /**
  54 + * 班次对象。
  55 + * @param tripType {TripType} 班次类型
  56 + * @param isUpDir {boolean} 是否上行
  57 + * @param leaveTimeObj {moment} 发车时间
  58 + * @param arriveTimeObj {moment} 到达时间
  59 + * @param runningTime {int} 行驶时间
  60 + * @param layoverTime {int} 到达后的停站时间
  61 + * @param recoveryTime {int} 发车前的停站时间
  62 + * @param eatTime {int} 吃饭时间
  63 + * @param tripMileage {float} 行驶里程
  64 + * @param pc {ParamContext} 参数上下文
  65 + * @constructor
  66 + */
  67 + function Trip(
  68 + tripType,
  69 + isUpDir,
  70 + leaveTimeObj, arriveTimeObj, runningTime,
  71 + layoverTime, recoveryTime, eatTime,
  72 + tripMileage,
  73 + pc
  74 + ) {
  75 + this._oTripType = tripType;
  76 + this._bIsUpDir = isUpDir;
  77 + this._oLeaveTime = leaveTimeObj;
  78 + this._oArriveTime = arriveTimeObj;
  79 + this._iRunningTime = runningTime;
  80 + this._iLayoverTime = layoverTime;
  81 + this._iRecoveryTime = recoveryTime;
  82 + this._iEatTime = eatTime;
  83 + this._fTripMileage = tripMileage;
  84 + this._oPc = pc;
  85 +
  86 +
  87 +
  88 + // TODO:
  89 +
  90 +
  91 + }
  92 +
  93 + /**
  94 + * 转换生成gantt显示的班次对象。
  95 + * @param lpNo {string} 路牌编号
  96 + * @param lpName {string} 路牌名字
  97 + * @param fcno {int} 发车顺序号
  98 + * @param isfb {boolean} 是否分班
  99 + */
  100 + Trip.prototype.fnToGanttBcObj = function(lpNo, lpName, fcno, isfb) {
  101 + var _bcObj = {
  102 + parent: lpNo,
  103 + lpNo: lpNo,
  104 + lp: null,
  105 + lpName: lpName,
  106 + lpType: '普通路牌',
  107 + bcType: this._oTripType.fnGetType(),
  108 + fcno: fcno,
  109 + isfb: isfb ? 1 : 0,
  110 + isSwitchXl: null,
  111 + bz: null
  112 + };
  113 +
  114 + // 线路上下行
  115 + _bcObj.xlDir = this._bIsUpDir ? "relationshipGraph-up" : "relationshipGraph-down";
  116 +
  117 + // 里程
  118 + _bcObj.jhlc = this._fTripMileage;
  119 +
  120 + // 停车场
  121 + _bcObj.tcc = this._oPc.fnGetTccId();
  122 +
  123 + // 时刻表
  124 + _bcObj.ttinfo = this._oPc.fnGetTTInfoId();
  125 +
  126 + // 线路
  127 + _bcObj.xl = this._oPc.fnGetXlId();
  128 +
  129 + // 起点站、终点站
  130 + _bcObj.qdz = this._bIsUpDir ? this._oPc.fnGetUpQdzRouteId() : this._oPc.fnGetDownQdzRouteId();
  131 + _bcObj.zdz = this._bIsUpDir ? this._oPc.fnGetUpZdzRouteId() : this._oPc.fnGetDownZdzRouteId();
  132 +
  133 + // 发车时间,行驶时间,到达时间,停站时间
  134 + _bcObj.fcsj = this._oLeaveTime.format("HH:mm");
  135 + _bcObj.bcsj = this._iRunningTime;
  136 + _bcObj.ARRIVALTIME = this._oArriveTime.format("HH:mm");
  137 + _bcObj.STOPTIME = this._iLayoverTime;
  138 +
  139 + return _bcObj;
  140 + };
  141 +
  142 + // 班次类型
  143 + Trip.Type = TripType;
  144 +
  145 +
  146 + return Trip;
  147 +}());
0 148 \ No newline at end of file
... ...