Commit 712b4761ef8799bc8635de65b93a2ec054da1660

Authored by 徐烜
2 parents 8da79c58 b272a5a4

Update

Showing 23 changed files with 2606 additions and 2384 deletions
src/main/java/com/bsth/controller/realcontrol/summary/DestroySituationController.java
1 -package com.bsth.controller.realcontrol.summary;  
2 -  
3 -import com.bsth.controller.BaseController;  
4 -import com.bsth.data.summary.entity.DestroySituation;  
5 -import com.bsth.data.summary.service.DestroySituationService;  
6 -import org.springframework.beans.factory.annotation.Autowired;  
7 -import org.springframework.web.bind.annotation.RequestMapping;  
8 -import org.springframework.web.bind.annotation.RequestParam;  
9 -import org.springframework.web.bind.annotation.RestController;  
10 -  
11 -import javax.servlet.http.HttpServletRequest;  
12 -import javax.servlet.http.HttpServletResponse;  
13 -import java.util.Map;  
14 -  
15 -/**  
16 - * Created by panzhao on 2017/11/1.  
17 - */  
18 -@RestController  
19 -@RequestMapping("/summary/destroy_detail")  
20 -public class DestroySituationController extends BaseController<DestroySituation, Long> {  
21 -  
22 - @Autowired  
23 - DestroySituationService destroySituationService;  
24 -  
25 - @RequestMapping("excel")  
26 - public void excel(@RequestParam Map<String, Object> map, HttpServletRequest request, HttpServletResponse response) {  
27 - destroySituationService.excel(map, request, response);  
28 - }  
29 -} 1 +package com.bsth.controller.realcontrol.summary;
  2 +
  3 +import com.bsth.controller.BaseController;
  4 +import com.bsth.data.summary.entity.DestroySituation;
  5 +import com.bsth.data.summary.service.DestroySituationService;
  6 +import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.web.bind.annotation.RequestMapping;
  8 +import org.springframework.web.bind.annotation.RequestParam;
  9 +import org.springframework.web.bind.annotation.RestController;
  10 +
  11 +import javax.servlet.http.HttpServletRequest;
  12 +import javax.servlet.http.HttpServletResponse;
  13 +import java.util.Map;
  14 +
  15 +/**
  16 + * Created by panzhao on 2017/11/1.
  17 + */
  18 +@RestController
  19 +@RequestMapping("/summary/destroy_detail")
  20 +public class DestroySituationController extends BaseController<DestroySituation, Long> {
  21 +
  22 + @Autowired
  23 + DestroySituationService destroySituationService;
  24 +
  25 + @RequestMapping("excel")
  26 + public void excel(@RequestParam Map<String, Object> map, HttpServletRequest request, HttpServletResponse response) {
  27 + destroySituationService.excel(map, request, response);
  28 + }
  29 +}
src/main/java/com/bsth/data/summary/service/DestroySituationService.java
1 -package com.bsth.data.summary.service;  
2 -  
3 -import com.bsth.data.summary.entity.DestroySituation;  
4 -import com.bsth.service.BaseService;  
5 -  
6 -import javax.servlet.http.HttpServletRequest;  
7 -import javax.servlet.http.HttpServletResponse;  
8 -import java.util.Map;  
9 -  
10 -/**  
11 - * Created by panzhao on 2017/11/1.  
12 - */  
13 -public interface DestroySituationService extends BaseService<DestroySituation, Long> {  
14 - void excel(Map<String, Object> map, HttpServletRequest request, HttpServletResponse response); 1 +package com.bsth.data.summary.service;
  2 +
  3 +import com.bsth.data.summary.entity.DestroySituation;
  4 +import com.bsth.service.BaseService;
  5 +
  6 +import javax.servlet.http.HttpServletRequest;
  7 +import javax.servlet.http.HttpServletResponse;
  8 +import java.util.Map;
  9 +
  10 +/**
  11 + * Created by panzhao on 2017/11/1.
  12 + */
  13 +public interface DestroySituationService extends BaseService<DestroySituation, Long> {
  14 + void excel(Map<String, Object> map, HttpServletRequest request, HttpServletResponse response);
15 } 15 }
16 \ No newline at end of file 16 \ No newline at end of file
src/main/java/com/bsth/data/summary/service/impl/DestroySituationServiceImpl.java
1 -package com.bsth.data.summary.service.impl;  
2 -  
3 -import com.bsth.data.summary.entity.DestroySituation;  
4 -import com.bsth.data.summary.service.DestroySituationService;  
5 -import com.bsth.data.utils.CustomStringUtils;  
6 -import com.bsth.service.impl.BaseServiceImpl;  
7 -import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
8 -import org.apache.poi.poifs.filesystem.POIFSFileSystem;  
9 -import org.apache.poi.ss.usermodel.Row;  
10 -import org.apache.poi.ss.usermodel.Sheet;  
11 -import org.slf4j.Logger;  
12 -import org.slf4j.LoggerFactory;  
13 -import org.springframework.stereotype.Service;  
14 -  
15 -import javax.servlet.http.HttpServletRequest;  
16 -import javax.servlet.http.HttpServletResponse;  
17 -import java.io.FileInputStream;  
18 -import java.io.OutputStream;  
19 -import java.net.URLEncoder;  
20 -import java.text.SimpleDateFormat;  
21 -import java.util.*;  
22 -  
23 -/**  
24 - * Created by panzhao on 2017/11/1.  
25 - */  
26 -@Service  
27 -public class DestroySituationServiceImpl extends BaseServiceImpl<DestroySituation, Long> implements DestroySituationService {  
28 -  
29 - Logger logger = LoggerFactory.getLogger(this.getClass());  
30 -  
31 - @Override  
32 - public void excel(Map<String, Object> map, HttpServletRequest request, HttpServletResponse response) {  
33 - try {  
34 - map.put("rq_le", CustomStringUtils.maxEndTime(map.get("rq_ge").toString()  
35 - , map.get("rq_le").toString(), 62));  
36 -  
37 - List<DestroySituation> list = (List<DestroySituation>) super.list(map);  
38 -  
39 - if(list.size() == 0){  
40 - response.setHeader("Content-type", "text/html;charset=UTF-8");  
41 - response.getWriter().print("<span style='color:red;font-size:24px;'>根据查询条件没有搜索到数据,别导了!</span>");  
42 - return ;  
43 - }  
44 -  
45 - //排序  
46 - Collections.sort(list, new Comparator<DestroySituation>() {  
47 - @Override  
48 - public int compare(DestroySituation o1, DestroySituation o2) {  
49 - return (int) (o1.getT() - o2.getT());  
50 - }  
51 - });  
52 -  
53 - //输出excel  
54 - String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();  
55 - String filePath = basePath + "/static/pages/summary/excel/烂班明细情况.xls";  
56 - POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filePath));  
57 - HSSFWorkbook wb = new HSSFWorkbook(fs);  
58 -  
59 - //写入数据  
60 - Sheet sheet = wb.getSheetAt(0);  
61 - Row row;  
62 - DestroySituation dys;  
63 - SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");  
64 - for(int i = 0; i < list.size(); i++){  
65 - dys = list.get(i);  
66 - row = sheet.createRow(i + 1);  
67 - row.createCell(0).setCellValue(dys.getRq());  
68 - row.createCell(1).setCellValue(dys.getLineName());  
69 - row.createCell(2).setCellValue(dys.getNbbm());  
70 - row.createCell(3).setCellValue(dys.getjGh());  
71 - row.createCell(4).setCellValue(dys.getsGh());  
72 - row.createCell(5).setCellValue(dys.getReason());  
73 - row.createCell(6).setCellValue(dys.getSize());  
74 - row.createCell(7).setCellValue(dys.getMileage());  
75 - row.createCell(8).setCellValue(sdf.format(new Date(dys.getT())));  
76 - row.createCell(9).setCellValue(dys.getRemark());  
77 - }  
78 -  
79 - String name = list.get(0).getLineName();  
80 - wb.setSheetName(0, name + "烂班明细");  
81 - //response 输出  
82 - String filename = name + map.get("rq_ge") + "至" + map.get("rq_le") + "烂班明细情况.xls";  
83 - response.setContentType("application/x-msdownload");  
84 - response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));  
85 -  
86 - OutputStream os = response.getOutputStream();  
87 - wb.write(os);  
88 - os.flush();  
89 - os.close();  
90 - } catch (Exception e) {  
91 - logger.error("", e);  
92 - }  
93 - }  
94 - 1 +package com.bsth.data.summary.service.impl;
  2 +
  3 +import com.bsth.data.summary.entity.DestroySituation;
  4 +import com.bsth.data.summary.service.DestroySituationService;
  5 +import com.bsth.data.utils.CustomStringUtils;
  6 +import com.bsth.service.impl.BaseServiceImpl;
  7 +import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  8 +import org.apache.poi.poifs.filesystem.POIFSFileSystem;
  9 +import org.apache.poi.ss.usermodel.Row;
  10 +import org.apache.poi.ss.usermodel.Sheet;
  11 +import org.slf4j.Logger;
  12 +import org.slf4j.LoggerFactory;
  13 +import org.springframework.stereotype.Service;
  14 +
  15 +import javax.servlet.http.HttpServletRequest;
  16 +import javax.servlet.http.HttpServletResponse;
  17 +import java.io.FileInputStream;
  18 +import java.io.OutputStream;
  19 +import java.net.URLEncoder;
  20 +import java.text.SimpleDateFormat;
  21 +import java.util.*;
  22 +
  23 +/**
  24 + * Created by panzhao on 2017/11/1.
  25 + */
  26 +@Service
  27 +public class DestroySituationServiceImpl extends BaseServiceImpl<DestroySituation, Long> implements DestroySituationService {
  28 +
  29 + Logger logger = LoggerFactory.getLogger(this.getClass());
  30 +
  31 + @Override
  32 + public void excel(Map<String, Object> map, HttpServletRequest request, HttpServletResponse response) {
  33 + try {
  34 + map.put("rq_le", CustomStringUtils.maxEndTime(map.get("rq_ge").toString()
  35 + , map.get("rq_le").toString(), 62));
  36 +
  37 + List<DestroySituation> list = (List<DestroySituation>) super.list(map);
  38 +
  39 + if(list.size() == 0){
  40 + response.setHeader("Content-type", "text/html;charset=UTF-8");
  41 + response.getWriter().print("<span style='color:red;font-size:24px;'>根据查询条件没有搜索到数据,别导了!</span>");
  42 + return ;
  43 + }
  44 +
  45 + //排序
  46 + Collections.sort(list, new Comparator<DestroySituation>() {
  47 + @Override
  48 + public int compare(DestroySituation o1, DestroySituation o2) {
  49 + return (int) (o1.getT() - o2.getT());
  50 + }
  51 + });
  52 +
  53 + //输出excel
  54 + String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
  55 + String filePath = basePath + "/static/pages/summary/excel/烂班明细情况.xls";
  56 + POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filePath));
  57 + HSSFWorkbook wb = new HSSFWorkbook(fs);
  58 +
  59 + //写入数据
  60 + Sheet sheet = wb.getSheetAt(0);
  61 + Row row;
  62 + DestroySituation dys;
  63 + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
  64 + for(int i = 0; i < list.size(); i++){
  65 + dys = list.get(i);
  66 + row = sheet.createRow(i + 1);
  67 + row.createCell(0).setCellValue(dys.getRq());
  68 + row.createCell(1).setCellValue(dys.getLineName());
  69 + row.createCell(2).setCellValue(dys.getNbbm());
  70 + row.createCell(3).setCellValue(dys.getjGh());
  71 + row.createCell(4).setCellValue(dys.getsGh());
  72 + row.createCell(5).setCellValue(dys.getReason());
  73 + row.createCell(6).setCellValue(dys.getSize());
  74 + row.createCell(7).setCellValue(dys.getMileage());
  75 + row.createCell(8).setCellValue(sdf.format(new Date(dys.getT())));
  76 + row.createCell(9).setCellValue(dys.getRemark());
  77 + }
  78 +
  79 + String name = list.get(0).getLineName();
  80 + wb.setSheetName(0, name + "烂班明细");
  81 + //response 输出
  82 + String filename = name + map.get("rq_ge") + "至" + map.get("rq_le") + "烂班明细情况.xls";
  83 + response.setContentType("application/x-msdownload");
  84 + response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
  85 +
  86 + OutputStream os = response.getOutputStream();
  87 + wb.write(os);
  88 + os.flush();
  89 + os.close();
  90 + } catch (Exception e) {
  91 + logger.error("", e);
  92 + }
  93 + }
  94 +
95 } 95 }
96 \ No newline at end of file 96 \ No newline at end of file
src/main/java/com/bsth/service/oil/impl/DlbServiceImpl.java
@@ -128,7 +128,8 @@ public class DlbServiceImpl extends BaseServiceImpl&lt;Dlb,Integer&gt; implements DlbS @@ -128,7 +128,8 @@ public class DlbServiceImpl extends BaseServiceImpl&lt;Dlb,Integer&gt; implements DlbS
128 Dlb t1=dlList.get(k); 128 Dlb t1=dlList.get(k);
129 if(t1.getNbbm().equals(map.get("clZbh").toString()) 129 if(t1.getNbbm().equals(map.get("clZbh").toString())
130 &&t1.getJsy().equals(map.get("jGh").toString()) 130 &&t1.getJsy().equals(map.get("jGh").toString())
131 - &&t1.getXlbm().equals(map.get("xlBm").toString())) 131 + &&t1.getXlbm().equals(map.get("xlBm").toString())
  132 + &&t1.getLp().equals(map.get("lpName").toString()))
132 { 133 {
133 t=t1; 134 t=t1;
134 type="update"; 135 type="update";
@@ -194,6 +195,7 @@ public class DlbServiceImpl extends BaseServiceImpl&lt;Dlb,Integer&gt; implements DlbS @@ -194,6 +195,7 @@ public class DlbServiceImpl extends BaseServiceImpl&lt;Dlb,Integer&gt; implements DlbS
194 t.setSsgsdm(map.get("company")==null?"":map.get("company").toString()); 195 t.setSsgsdm(map.get("company")==null?"":map.get("company").toString());
195 t.setFgsdm(map.get("bCompany")==null?"":map.get("bCompany").toString()); 196 t.setFgsdm(map.get("bCompany")==null?"":map.get("bCompany").toString());
196 t.setJhsj(map.get("fcsj")==null?"":map.get("fcsj").toString()); 197 t.setJhsj(map.get("fcsj")==null?"":map.get("fcsj").toString());
  198 + t.setLp(map.get("lpName").toString());
197 t.setRq(sdf.parse(rq)); 199 t.setRq(sdf.parse(rq));
198 t.setCreatetime(new Date()); 200 t.setCreatetime(new Date());
199 /*if(type.equals("add")){ 201 /*if(type.equals("add")){
@@ -560,9 +562,15 @@ public class DlbServiceImpl extends BaseServiceImpl&lt;Dlb,Integer&gt; implements DlbS @@ -560,9 +562,15 @@ public class DlbServiceImpl extends BaseServiceImpl&lt;Dlb,Integer&gt; implements DlbS
560 long l=Math.round(nextJzyl); 562 long l=Math.round(nextJzyl);
561 double ylxs=l*100/100; 563 double ylxs=l*100/100;
562 dh=Arith.add(dh, Arith.sub(nextJzyl,ylxs)); 564 dh=Arith.add(dh, Arith.sub(nextJzyl,ylxs));
563 - t.setHd(dh);  
564 - t.setCdl(dh);  
565 - nextJzyl=ylxs; 565 + if(dh<0){
  566 + t.setHd(dh);
  567 + t.setCdl(dh);
  568 + nextJzyl=Arith.add(ylxs, dh);
  569 + }else{
  570 + t.setHd(dh);
  571 + t.setCdl(dh);
  572 + nextJzyl=ylxs;
  573 + }
566 }else{ 574 }else{
567 t.setHd(0.0); 575 t.setHd(0.0);
568 t.setCdl(0.0); 576 t.setCdl(0.0);
@@ -586,9 +594,15 @@ public class DlbServiceImpl extends BaseServiceImpl&lt;Dlb,Integer&gt; implements DlbS @@ -586,9 +594,15 @@ public class DlbServiceImpl extends BaseServiceImpl&lt;Dlb,Integer&gt; implements DlbS
586 594
587 } 595 }
588 dh=Arith.add(dh, Arith.sub(nextJzyl,ylxs)); 596 dh=Arith.add(dh, Arith.sub(nextJzyl,ylxs));
589 - t.setHd(dh);  
590 - t.setCdl(dh);  
591 - nextJzyl=ylxs; 597 + if(dh<0){
  598 + t.setHd(dh);
  599 + t.setCdl(dh);
  600 + nextJzyl=Arith.add(ylxs, dh);
  601 + }else{
  602 + t.setHd(dh);
  603 + t.setCdl(dh);
  604 + nextJzyl=ylxs;
  605 + }
592 }else{ 606 }else{
593 t.setHd(0.0); 607 t.setHd(0.0);
594 t.setCdl(0.0); 608 t.setCdl(0.0);
src/main/java/com/bsth/service/oil/impl/YlbServiceImpl.java
@@ -128,7 +128,8 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS @@ -128,7 +128,8 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
128 Ylb t1=ylList.get(k); 128 Ylb t1=ylList.get(k);
129 if(t1.getNbbm().equals(map.get("clZbh").toString()) 129 if(t1.getNbbm().equals(map.get("clZbh").toString())
130 &&t1.getJsy().equals(map.get("jGh").toString()) 130 &&t1.getJsy().equals(map.get("jGh").toString())
131 - &&t1.getXlbm().equals(map.get("xlBm").toString())) 131 + &&t1.getXlbm().equals(map.get("xlBm").toString())
  132 + &&t1.getLp().equals(map.get("lpName").toString()))
132 { 133 {
133 t=t1; 134 t=t1;
134 type="update"; 135 type="update";
@@ -618,13 +619,13 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS @@ -618,13 +619,13 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
618 czyl = t.getCzyl(); 619 czyl = t.getCzyl();
619 zyl =jzl; 620 zyl =jzl;
620 Double yh=0.0; 621 Double yh=0.0;
621 - if(zlc>0){ 622 + if(zlc>0 ){
622 yh = Double.parseDouble(df.format(zyl * (t.getZlc() / zlc))); 623 yh = Double.parseDouble(df.format(zyl * (t.getZlc() / zlc)));
623 } 624 }
624 nextJzyl =Arith.sub( Arith.add(Arith.sub(t.getJzl(),t.getSh()), t.getCzyl()),yh); 625 nextJzyl =Arith.sub( Arith.add(Arith.sub(t.getJzl(),t.getSh()), t.getCzyl()),yh);
625 //把进场油量的小数和整数分别取出 626 //把进场油量的小数和整数分别取出
626 // int ylxs=(int) nextJzyl; 10.6--11 10.3--10 627 // int ylxs=(int) nextJzyl; 10.6--11 10.3--10
627 - if(zlc>0){ 628 + if(zlc>0 && t.getZlc()>0){
628 long l=Math.round(nextJzyl); 629 long l=Math.round(nextJzyl);
629 double ylxs=l*100/100; 630 double ylxs=l*100/100;
630 // nextJzyl = Arith.add(nextJzyl,Arith.sub(nextJzyl,ylxs)); 631 // nextJzyl = Arith.add(nextJzyl,Arith.sub(nextJzyl,ylxs));
@@ -643,14 +644,12 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS @@ -643,14 +644,12 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
643 yh= Double.parseDouble(df.format(zyl * (t.getZlc() / zlc))); 644 yh= Double.parseDouble(df.format(zyl * (t.getZlc() / zlc)));
644 } 645 }
645 nextJzyl =Arith.sub( Arith.add(Arith.sub(t.getJzl(),t.getSh()),nextJzyl),yh); 646 nextJzyl =Arith.sub( Arith.add(Arith.sub(t.getJzl(),t.getSh()),nextJzyl),yh);
646 - if(zlc>0){ 647 + if(zlc>0 && t.getZlc()>0){
647 long l=0l; 648 long l=0l;
648 double ylxs=0.0; 649 double ylxs=0.0;
649 if(j==iterator2.size()-1){ 650 if(j==iterator2.size()-1){
650 ylxs=czyl; 651 ylxs=czyl;
651 }else{ 652 }else{
652 -// l=Math.round(nextJzyl);  
653 -// ylxs=l*100/100;  
654 if(iterator2.get(j+1).getNbbm().equals(t.getNbbm())){ 653 if(iterator2.get(j+1).getNbbm().equals(t.getNbbm())){
655 l=Math.round(nextJzyl); 654 l=Math.round(nextJzyl);
656 ylxs=l*100/100; 655 ylxs=l*100/100;
@@ -693,154 +692,6 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS @@ -693,154 +692,6 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
693 return map2; 692 return map2;
694 } 693 }
695 694
696 - /**  
697 - * 拆分  
698 - */  
699 - /*  
700 - @Transactional  
701 - @Override  
702 - public Map<String, Object> sort(Map<String, Object> map) throws Exception{  
703 - // TODO Auto-generated method stub  
704 - Map<String, Object> newMap = new HashMap<String, Object>();  
705 - SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");  
706 - try {  
707 - // 获取车辆存油信息  
708 - List<Cyl> cylList = cylRepository.findAll(new CustomerSpecs<Cyl>(newMap));  
709 - int id = Integer.parseInt(map.get("id").toString());  
710 - // 最后存油量  
711 - Double yl = Double.parseDouble(map.get("jzyl").toString());  
712 - Double sh= Double.parseDouble(map.get("sh").toString());  
713 - String shyy=map.get("shyy").toString();  
714 - Ylb ylb = repository.findOne(id);  
715 - List<Cyl> cylListAdd=new ArrayList<Cyl>();  
716 - Map<String, Object> cylMapAdd=new HashMap<String,Object>();  
717 - String nbbm_eq = ylb.getNbbm();  
718 - Date rq_eq = ylb.getRq();  
719 - // 得到一天总的加油和里程(根据车,时间)  
720 - List<Object[]> sumList = repository.sumLcYl(nbbm_eq, rq_eq,ylb.getXlbm());  
721 - // 保存总的加油量  
722 - Double jzl = 0.0;  
723 - // 保存总的里程  
724 - Double zlc = 0.0;  
725 - //保存总的损耗  
726 - Double zsh = 0.0;  
727 - for (int j = 0; j < sumList.size(); j++) {  
728 - jzl = Arith.add(jzl, Double.valueOf(sumList.get(j)[0].toString()));  
729 - zlc = Arith.add(zlc, Double.valueOf(sumList.get(j)[1].toString()));  
730 - zsh = Arith.add(zsh, Double.valueOf(sumList.get(j)[2].toString()));  
731 - }  
732 - jzl = Arith.sub(jzl, zsh);  
733 -  
734 - //新的 损耗不等于 旧的损耗 总损耗从新算  
735 - if(Arith.sub(ylb.getSh(),sh )!=0){  
736 - zsh =Arith.add(Arith.sub(zsh, ylb.getSh()), sh);  
737 - jzl =Arith.sub(jzl, zsh);  
738 - }else{  
739 - jzl =Arith.sub(jzl, zsh);  
740 - }  
741 - map.put("nbbm_eq", nbbm_eq);  
742 - map.put("rq_eq", rq_eq);  
743 - List<Ylb> iterator2=repository.obtainYl(sdf.format(rq_eq),ylb.getSsgsdm(),ylb.getFgsdm(),ylb.getXlbm(),  
744 - ylb.getNbbm(),"jcsx");  
745 -// Iterator<Ylb> iterator = repository.findAll(new CustomerSpecs<Ylb>(map), new Sort(Direction.ASC, "jcsx"))  
746 -// .iterator();  
747 - // 根据jcyl排序1为该车当日第一个出场,出场油量为前一天的存油  
748 - // 保留两位小数  
749 - DecimalFormat df = new DecimalFormat("#.00");  
750 - Double zyl = 0.0;  
751 - Double nextJzyl = 0.0;  
752 - // 车的,进,出油量及耗油  
753 - for (int i = 0; i < iterator2.size(); i++) {  
754 - Ylb t = iterator2.get(i);  
755 - if (t.getJcsx() == 1) {  
756 - if(t.getId()==id){  
757 - t.setSh(sh);  
758 - t.setShyy(shyy);  
759 - }  
760 - Double jcyl = t.getCzyl();  
761 - zyl = Arith.sub(Arith.add(jcyl, jzl), yl);  
762 - Double yh = 0.0;  
763 - if (zlc > 0 && t.getZlc() > 0) {  
764 - yh = Double.parseDouble(df.format(zyl * (t.getZlc() / zlc)));  
765 - }  
766 - nextJzyl =Arith.sub(Arith.add(t.getJzl(), t.getCzyl()), Arith.add(yh, t.getSh()));  
767 - long l=Math.round(nextJzyl);  
768 - double ylxs=l*100/100;  
769 -// nextJzyl = Arith.add(nextJzyl,Arith.sub(nextJzyl,ylxs));  
770 - yh=Arith.add(yh, Arith.sub(ylxs,nextJzyl));  
771 - t.setJzyl(ylxs);  
772 - t.setYh(yh);  
773 - nextJzyl=ylxs;  
774 - } else {  
775 - if(t.getId()==id){  
776 - t.setSh(sh);  
777 - t.setShyy(shyy);  
778 - }  
779 - t.setCzyl(nextJzyl);  
780 - Double yh =0.0;  
781 - if (t.getZlc() != 0) {  
782 - yh= Double.parseDouble(df.format(zyl * (t.getZlc() / zlc)));  
783 - }  
784 - nextJzyl = Arith.sub(Arith.add(t.getJzl(), nextJzyl), Arith.add(yh, t.getSh()));  
785 - long l=Math.round(nextJzyl);  
786 - double ylxs=l*100/100;  
787 -// nextJzyl = Arith.add(nextJzyl,Arith.sub(nextJzyl,ylxs));  
788 - yh=Arith.add(yh, Arith.sub(ylxs,nextJzyl));  
789 - t.setJzyl(ylxs);  
790 - t.setYh(yh);  
791 - nextJzyl=ylxs;  
792 - }  
793 - repository.save(t);  
794 -  
795 - // 设置存油量  
796 - Cyl cyl = null;  
797 - boolean fage = false;  
798 - for (int z = 0; z < cylList.size(); z++) {  
799 - cyl = cylList.get(z);  
800 - if (t.getNbbm().equals(cyl.getNbbm())) {  
801 - cyl.setCyl(t.getJzyl());  
802 - cyl.setUpdatetime(t.getRq());  
803 - fage = true;  
804 - break;  
805 - }  
806 - }  
807 - if (fage) {  
808 - cylRepository.save(cyl);  
809 - } else {  
810 - if(cylMapAdd.get(t.getNbbm())!=null){  
811 - for (int l = 0; l < cylListAdd.size(); l++) {  
812 - cyl=cylListAdd.get(l);  
813 - if(cyl.getNbbm().equals(t.getNbbm())){  
814 - cyl.setNbbm(t.getNbbm());  
815 - cyl.setCyl(t.getJzyl());  
816 - cyl.setGsdm(t.getSsgsdm());  
817 - cyl.setFgsdm(t.getFgsdm());  
818 - cyl.setUpdatetime(t.getRq());  
819 - }  
820 - }  
821 - }else{  
822 - cyl = new Cyl();  
823 - cyl.setNbbm(t.getNbbm());  
824 - cyl.setCyl(t.getJzyl());  
825 - cyl.setGsdm(t.getSsgsdm());  
826 - cyl.setFgsdm(t.getFgsdm());  
827 - cyl.setUpdatetime(t.getRq());  
828 - cylListAdd.add(cyl);  
829 - }  
830 - }  
831 -  
832 - newMap.put("status", ResponseCode.SUCCESS);  
833 - }  
834 - for (int i = 0; i < cylListAdd.size(); i++) {  
835 - cylRepository.save(cylListAdd.get(i));  
836 - }  
837 - } catch (Exception e) {  
838 - newMap.put("status", ResponseCode.ERROR);  
839 - logger.error("save erro.", e);  
840 - throw e;  
841 - }  
842 - return newMap;  
843 - }*/  
844 695
845 /** 696 /**
846 * 核对,有加注没里程 697 * 核对,有加注没里程
@@ -1315,6 +1166,9 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS @@ -1315,6 +1166,9 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
1315 String nbbm =jsonObject.getString("nbbm"); 1166 String nbbm =jsonObject.getString("nbbm");
1316 String rq=jsonObject.getString("rq"); 1167 String rq=jsonObject.getString("rq");
1317 double yh = Arith.sub(Arith.add(czyl, jzl), jzyl); 1168 double yh = Arith.sub(Arith.add(czyl, jzl), jzyl);
  1169 + if(yh<0){
  1170 + yh=0.0;
  1171 + }
1318 /*t.setJzyl(jzyl); 1172 /*t.setJzyl(jzyl);
1319 t.setSh(sh); 1173 t.setSh(sh);
1320 t.setShyy(shyy); 1174 t.setShyy(shyy);
@@ -1417,10 +1271,10 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS @@ -1417,10 +1271,10 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
1417 yh = Double.parseDouble(df.format(zyl * (t.getZlc() / zlc))); 1271 yh = Double.parseDouble(df.format(zyl * (t.getZlc() / zlc)));
1418 } 1272 }
1419 nextJzyl =Arith.sub(Arith.add(t.getJzl(), t.getCzyl()), Arith.add(yh, t.getSh())); 1273 nextJzyl =Arith.sub(Arith.add(t.getJzl(), t.getCzyl()), Arith.add(yh, t.getSh()));
1420 - if(zlc>0){ 1274 + if(zlc>0 && t.getZlc() > 0){
1421 long l=Math.round(nextJzyl); 1275 long l=Math.round(nextJzyl);
1422 double ylxs=l*100/100; 1276 double ylxs=l*100/100;
1423 -// nextJzyl = Arith.add(nextJzyl,Arith.sub(nextJzyl,ylxs)); 1277 +// nextJzyl = Arith.add(nextJzyl,Arith.sub(nextJzyl,ylxs));
1424 yh=Arith.add(yh, Arith.sub(nextJzyl,ylxs)); 1278 yh=Arith.add(yh, Arith.sub(nextJzyl,ylxs));
1425 t.setYh(yh); 1279 t.setYh(yh);
1426 t.setJzyl(ylxs); 1280 t.setJzyl(ylxs);
@@ -1436,11 +1290,11 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS @@ -1436,11 +1290,11 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
1436 } 1290 }
1437 t.setCzyl(nextJzyl); 1291 t.setCzyl(nextJzyl);
1438 Double yh =0.0; 1292 Double yh =0.0;
1439 - if (t.getZlc() != 0) { 1293 + if (t.getZlc() >= 0) {
1440 yh= Double.parseDouble(df.format(zyl * (t.getZlc() / zlc))); 1294 yh= Double.parseDouble(df.format(zyl * (t.getZlc() / zlc)));
1441 } 1295 }
1442 nextJzyl = Arith.sub(Arith.add(t.getJzl(), nextJzyl), Arith.add(yh, t.getSh())); 1296 nextJzyl = Arith.sub(Arith.add(t.getJzl(), nextJzyl), Arith.add(yh, t.getSh()));
1443 - if(zlc>0){ 1297 + if(zlc>0 && t.getZlc() >0){
1444 long l=0l; 1298 long l=0l;
1445 double ylxs=0.0; 1299 double ylxs=0.0;
1446 if(i==iterator2.size()-1){ 1300 if(i==iterator2.size()-1){
src/main/java/com/bsth/service/realcontrol/impl/ScheduleRealInfoServiceImpl.java
@@ -2348,6 +2348,28 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -2348,6 +2348,28 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
2348 map.put("djg_time", m.get("djgsj")); 2348 map.put("djg_time", m.get("djgsj"));
2349 map.put("jls", Arith.sub(Arith.add(jhlc, ljgl), lbgl)); 2349 map.put("jls", Arith.sub(Arith.add(jhlc, ljgl), lbgl));
2350 lMap.add(map); 2350 lMap.add(map);
  2351 +
  2352 + if(date.length() == 10){
  2353 + List<DutyEmployee> list = dutyEmployeeService.getDutyEmployee(line, date + "00:01", date + "23:59");
  2354 + String dbdp = "";
  2355 + try {
  2356 + for (int i = 0; i < list.size(); i++) {
  2357 + DutyEmployee t = list.get(i);
  2358 + if(dbdp.indexOf(t.getuName()) == -1){
  2359 + if(!(dbdp.length()>0)){
  2360 + dbdp =t.getuName();
  2361 + }else{
  2362 + dbdp +=","+t.getuName();
  2363 + }
  2364 + }
  2365 + }
  2366 + } catch (Exception e) {
  2367 + // TODO: handle exception
  2368 + e.printStackTrace();
  2369 + }
  2370 + map.put("dbdp", dbdp);
  2371 + }
  2372 +
2351 return lMap; 2373 return lMap;
2352 } 2374 }
2353 2375
@@ -4195,9 +4217,31 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -4195,9 +4217,31 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
4195 dataList3.add(tempMap); 4217 dataList3.add(tempMap);
4196 } 4218 }
4197 4219
  4220 + if(date.length() == 10){
  4221 + List<DutyEmployee> list = dutyEmployeeService.getDutyEmployee(line, date + "00:01", date + "23:59");
  4222 + String dbdp = "";
  4223 + try {
  4224 + for (int i = 0; i < list.size(); i++) {
  4225 + DutyEmployee t = list.get(i);
  4226 + if(dbdp.indexOf(t.getuName()) == -1){
  4227 + if(!(dbdp.length()>0)){
  4228 + dbdp =t.getuName();
  4229 + }else{
  4230 + dbdp +=","+t.getuName();
  4231 + }
  4232 + }
  4233 + }
  4234 + } catch (Exception e) {
  4235 + // TODO: handle exception
  4236 + e.printStackTrace();
  4237 + }
  4238 + nMap.put("dbdp", dbdp);
  4239 + }
4198 4240
4199 if (type.equals("export")) { 4241 if (type.equals("export")) {
4200 - String lineName = map.get("lineName").toString(); 4242 + String lineName = "";
  4243 + if(map.containsKey("lineName"))
  4244 + lineName = "-" + map.get("lineName").toString() + "-";
4201 SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"), 4245 SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
4202 sdfSimple = new SimpleDateFormat("yyyyMMdd"); 4246 sdfSimple = new SimpleDateFormat("yyyyMMdd");
4203 Map<String, Object> m = new HashMap<String, Object>(); 4247 Map<String, Object> m = new HashMap<String, Object>();
@@ -4215,7 +4259,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -4215,7 +4259,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
4215 sourcePath = path + "mould/scheduleDaily_m.xls"; 4259 sourcePath = path + "mould/scheduleDaily_m.xls";
4216 } 4260 }
4217 ee.excelReplace(listI, new Object[]{nMap}, sourcePath, 4261 ee.excelReplace(listI, new Object[]{nMap}, sourcePath,
4218 - path + "export/调度日报-"+ lineName + "-" + sdfSimple.format(sdfMonth.parse(date)) + ".xls"); 4262 + path + "export/调度日报"+ lineName + sdfSimple.format(sdfMonth.parse(date)) + ".xls");
4219 } catch (Exception e) { 4263 } catch (Exception e) {
4220 // TODO: handle exception 4264 // TODO: handle exception
4221 e.printStackTrace(); 4265 e.printStackTrace();
src/main/java/com/bsth/service/report/impl/ReportServiceImpl.java
@@ -1929,6 +1929,9 @@ public class ReportServiceImpl implements ReportService{ @@ -1929,6 +1929,9 @@ public class ReportServiceImpl implements ReportService{
1929 newMap.put("jhglzgf", culateService.culateJhgl_(sList,"zgf")); 1929 newMap.put("jhglzgf", culateService.culateJhgl_(sList,"zgf"));
1930 newMap.put("jhglwgf", culateService.culateJhgl_(sList,"wgf")); 1930 newMap.put("jhglwgf", culateService.culateJhgl_(sList,"wgf"));
1931 1931
  1932 + newMap.put("lbgl", culateService.culateLbgl(sList));
  1933 + newMap.put("lbbc", culateService.culateLbbc(sList));
  1934 +
1932 newMap.put("sjbc", culateService.culateSjbc(lists,"")); 1935 newMap.put("sjbc", culateService.culateSjbc(lists,""));
1933 newMap.put("sjbczgf", culateService.culateSjbc(lists,"zgf")); 1936 newMap.put("sjbczgf", culateService.culateSjbc(lists,"zgf"));
1934 newMap.put("sjbcwgf", culateService.culateSjbc(lists,"wgf")); 1937 newMap.put("sjbcwgf", culateService.culateSjbc(lists,"wgf"));
@@ -1936,8 +1939,7 @@ public class ReportServiceImpl implements ReportService{ @@ -1936,8 +1939,7 @@ public class ReportServiceImpl implements ReportService{
1936 newMap.put("sjglzgf", culateService.culateSjgl_(lists,"zgf")); 1939 newMap.put("sjglzgf", culateService.culateSjgl_(lists,"zgf"));
1937 newMap.put("sjglwgf", culateService.culateSjgl_(lists,"wgf")); 1940 newMap.put("sjglwgf", culateService.culateSjgl_(lists,"wgf"));
1938 1941
1939 - newMap.put("lbgl", culateService.culateLbgl(lists));  
1940 - newMap.put("lbbc", culateService.culateLbbc(lists)); 1942 +
1941 newMap.put("ljgl", culateService.culateLjgl(lists)); 1943 newMap.put("ljgl", culateService.culateLjgl(lists));
1942 newMap.put("ljglzgf", culateService.culateLjgl_(lists,"zgf")); 1944 newMap.put("ljglzgf", culateService.culateLjgl_(lists,"zgf"));
1943 newMap.put("ljglwgf", culateService.culateLjgl_(lists,"wgf")); 1945 newMap.put("ljglwgf", culateService.culateLjgl_(lists,"wgf"));
src/main/resources/static/pages/base/timesmodel/gantt.html
@@ -121,7 +121,7 @@ @@ -121,7 +121,7 @@
121 <script src="/pages/base/timesmodel/js/base-fun.js"></script> 121 <script src="/pages/base/timesmodel/js/base-fun.js"></script>
122 <script src="/pages/base/timesmodel/js/v2/ParameterObj.js"></script> 122 <script src="/pages/base/timesmodel/js/v2/ParameterObj.js"></script>
123 <script src="/pages/base/timesmodel/js/v2/core/InternalBcObj.js"></script> 123 <script src="/pages/base/timesmodel/js/v2/core/InternalBcObj.js"></script>
124 -<script src="/pages/base/timesmodel/js/v2/core/InternalGroupBcObj.js"></script> 124 +<script src="/pages/base/timesmodel/js/v2/core/InternalGroupObj.js"></script>
125 <script src="/pages/base/timesmodel/js/v2/core/InternalLpObj.js"></script> 125 <script src="/pages/base/timesmodel/js/v2/core/InternalLpObj.js"></script>
126 <script src="/pages/base/timesmodel/js/v2/core/InternalScheduleObj.js"></script> 126 <script src="/pages/base/timesmodel/js/v2/core/InternalScheduleObj.js"></script>
127 <script src="/pages/base/timesmodel/js/v2/main_v2.js"></script> 127 <script src="/pages/base/timesmodel/js/v2/main_v2.js"></script>
src/main/resources/static/pages/base/timesmodel/js/base-fun.js
@@ -797,44 +797,44 @@ var BaseFun = function() { @@ -797,44 +797,44 @@ var BaseFun = function() {
797 var temp = []; 797 var temp = [];
798 temp.push(allLMapBc[0]); 798 temp.push(allLMapBc[0]);
799 console.log(temp); 799 console.log(temp);
800 - return {'json':temp,'bxrcgs':null}; 800 + //return {'json':temp,'bxrcgs':null};
801 801
802 - //// 第二步 纵向调整  
803 - //baseF.evenStartDepartSpace(allLMapBc , dataMap);  
804 - ////return {'json':allLMapBc,'bxrcgs':null};  
805 - //  
806 - //// 第三步 剔除首末班车以外的班次,并确认首末班车.  
807 - //var markArray = baseF.markFirstAndLastBusAlsoDietNotInRangeBc(allLMapBc , dataMap);  
808 - ////return {'json':markArray,'bxrcgs':null};  
809 - //// 第四步 横向调整  
810 - //baseF.resizeByPitStopTime(cara , markArray , dataMap); 802 + // 第二步 纵向调整
  803 + baseF.evenStartDepartSpace(allLMapBc , dataMap);
  804 + //return {'json':allLMapBc,'bxrcgs':null};
  805 +
  806 + // 第三步 剔除首末班车以外的班次,并确认首末班车.
  807 + var markArray = baseF.markFirstAndLastBusAlsoDietNotInRangeBc(allLMapBc , dataMap);
  808 + //return {'json':markArray,'bxrcgs':null};
  809 + // 第四步 横向调整
  810 + baseF.resizeByPitStopTime(cara , markArray , dataMap);
  811 + //return {'json':markArray,'bxrcgs':null};
  812 + /**
  813 + * 第五步 把班型合理的分配到各个路牌上.
  814 + *
  815 + * 切割班型/人次/配车数 字符串 为 数组对象.
  816 + *
  817 + * 把班型分配到对应的具体路牌上.
  818 + */
  819 + // 切割班型/人次/配车数 字符串 为 数组对象.
  820 + var list = baseF.getBxRcListCollection(map.bxrc);
  821 + // 把班型分配到对应的具体路牌上.
  822 + baseF.bxAlloTotLp(list,cara);
811 ////return {'json':markArray,'bxrcgs':null}; 823 ////return {'json':markArray,'bxrcgs':null};
812 - ///**  
813 - // * 第五步 把班型合理的分配到各个路牌上.  
814 - // *  
815 - // * 切割班型/人次/配车数 字符串 为 数组对象.  
816 - // *  
817 - // * 把班型分配到对应的具体路牌上.  
818 - // */  
819 - //// 切割班型/人次/配车数 字符串 为 数组对象.  
820 - //var list = baseF.getBxRcListCollection(map.bxrc);  
821 - //// 把班型分配到对应的具体路牌上.  
822 - //baseF.bxAlloTotLp(list,cara);  
823 - //////return {'json':markArray,'bxrcgs':null};  
824 - ////  
825 - ////  
826 - //// 第六步 抽车来满足工时.  
827 - //var tempA = baseF.abstractCar(list , markArray , cara , saa , dataMap , map);  
828 - ////return {'json':tempA,'bxrcgs':null};  
829 - //// 第七步 确定吃饭时间.  
830 - //if (map.cfdd) { // NEW,没有选择吃饭地点,不设定吃饭班次  
831 - // baseF.markeEatTime(list , tempA , cara , saa , dataMap ,map);  
832 - //}  
833 - //baseF.resizeByPitStopTime(cara , tempA , dataMap);  
834 - //baseF.updfcno01(tempA,0);  
835 - ////return {'json':tempA,'bxrcgs':null};  
836 - //// 确定进出场、早晚例保时间.并返回班次数组集合  
837 - //return {'json':baseF.addInOutFieldBc(cara,tempA,dataMap,saa,map),'bxrcgs':null}; 824 + //
  825 + //
  826 + // 第六步 抽车来满足工时.
  827 + var tempA = baseF.abstractCar(list , markArray , cara , saa , dataMap , map);
  828 + //return {'json':tempA,'bxrcgs':null};
  829 + // 第七步 确定吃饭时间.
  830 + if (map.cfdd) { // NEW,没有选择吃饭地点,不设定吃饭班次
  831 + baseF.markeEatTime(list , tempA , cara , saa , dataMap ,map);
  832 + }
  833 + baseF.resizeByPitStopTime(cara , tempA , dataMap);
  834 + baseF.updfcno01(tempA,0);
  835 + //return {'json':tempA,'bxrcgs':null};
  836 + // 确定进出场、早晚例保时间.并返回班次数组集合
  837 + return {'json':baseF.addInOutFieldBc(cara,tempA,dataMap,saa,map),'bxrcgs':null};
838 }, 838 },
839 839
840 markeEatTime : function(list , markArray , cara , saa , dataMap ,map) { 840 markeEatTime : function(list , markArray , cara , saa , dataMap ,map) {
src/main/resources/static/pages/base/timesmodel/js/strategy/BcObjMatrix.js
1 -/**  
2 - * 班次对象矩阵(二维数组)。  
3 - * @param paramObj 参数对象  
4 - * @constructor  
5 - */  
6 -var BcObjMatrix = function(paramObj) {  
7 - // 内部参数  
8 - var _paramObj = paramObj;  
9 -  
10 - var lpObj = function() { // 路牌对象  
11 - return {  
12 - bxType: 6, // 班型描述,默认做5休2  
13 - qArray: [] // 圈对象数组,一圈二个班次  
14 - };  
15 - } 1 +/**
  2 + * 班次对象矩阵(二维数组)。
  3 + * @param paramObj 参数对象
  4 + * @constructor
  5 + */
  6 +var BcObjMatrix = function(paramObj) {
  7 + // 内部参数
  8 + var _paramObj = paramObj;
  9 +
  10 + var lpObj = function() { // 路牌对象
  11 + return {
  12 + bxType: 6, // 班型描述,默认做5休2
  13 + qArray: [] // 圈对象数组,一圈二个班次
  14 + };
  15 + }
16 }; 16 };
17 \ No newline at end of file 17 \ No newline at end of file
src/main/resources/static/pages/base/timesmodel/js/strategy/RelatedObjes.js
1 -// 相关的内部对象  
2 -/**  
3 - * 班次类型对象(最后转换成显示用bc对象)  
4 - * @param bcType 班次类型(normal,in,out等)  
5 - * @param isUp boolean 是否上行  
6 - * @param lp 路牌编号  
7 - * @param fcno 发车编号  
8 - * @param fcTimeObj 发车时间对象  
9 - * @param paramObj 参数对象  
10 - * @returns 班次对象  
11 - */  
12 -var BcObj = function(bcType, isUp, lp, fcno, fcTimeObj, paramObj) {  
13 -  
14 - //---------- 内部属性 ----------//  
15 - var _bcType = bcType; // 班次类型(normal,in,out等)  
16 - var _isUp = isUp; // true表示上行,false表示下行  
17 - var _lp = lp; // 路牌  
18 - var _fcno = fcno; // 发车顺序号  
19 -  
20 - // 计算的属性,TODO:还有其他属性  
21 - // 上标线里属于第几圈(本班次方向和标线方向一致,才有意义)  
22 - var qCount;  
23 -  
24 - // 班次里程  
25 - var _bclc = StrategyUtils.calcuTravelLcNumber(_isUp, _bcType, paramObj);  
26 - // 发车时间  
27 - var _fcsjObj = moment(fcTimeObj);  
28 - // 班次时间  
29 - var _bcsj = StrategyUtils.calcuTravelTime(_fcsjObj, _isUp, paramObj);  
30 - // 到达时间  
31 - var _arrsj = StrategyUtils.addMinute(_fcsjObj, _bcsj);  
32 - // 到达后的停站时间(使用到达时间判定)  
33 - var _stopTime = StrategyUtils.calcuFixedStopNumber(_arrsj, !_isUp, paramObj);  
34 -  
35 - return {  
36 - /**  
37 - * 是否上行。  
38 - * @returns boolean  
39 - */  
40 - isUp: function() {  
41 - return _isUp;  
42 - },  
43 - /**  
44 - * 获取发车时间。  
45 - * @returns {*|moment.Moment}  
46 - */  
47 - getFcTimeObj: function() {  
48 - return _fcsjObj;  
49 - },  
50 - /**  
51 - * 获取班次时间。  
52 - */  
53 - getBcTime: function() {  
54 - return _bcsj;  
55 - },  
56 - /**  
57 - * 获取停站时间。  
58 - * @returns {*}  
59 - */  
60 - getStopTime: function() {  
61 - return _stopTime;  
62 - },  
63 -  
64 - /**  
65 - * 转换成显示用班次对象。  
66 - */  
67 - toGanttBcObj: function() {  
68 - var _bcObj = {  
69 - parent: _lp,  
70 - lpNo: _lp,  
71 - lp: null,  
72 - lpName: _lp,  
73 - lpType: '普通路牌',  
74 - bcType: _bcType,  
75 - fcno: _fcno,  
76 - isfb: 0,  
77 - isSwitchXl: null,  
78 - bz: null  
79 - };  
80 -  
81 - // 线路上下行  
82 - _bcObj.xlDir = _isUp ? "relationshipGraph-up" : "relationshipGraph-down";  
83 -  
84 - // 里程  
85 - _bcObj.jhlc = _bclc;  
86 -  
87 - // 停车场  
88 - _bcObj.tcc = paramObj.getTccId();  
89 -  
90 - // 时刻表  
91 - _bcObj.ttinfo = paramObj.getTTinfoId();  
92 -  
93 - // 线路  
94 - _bcObj.xl = paramObj.getXlId();  
95 -  
96 - // 起点站、终点站  
97 - _bcObj.qdz = _isUp ? paramObj.getUpQdzObj().id : paramObj.getDownQdzObj().id;  
98 - _bcObj.zdz = _isUp ? paramObj.getUpZdzObj().id : paramObj.getDownZdzObj().id;  
99 -  
100 - // 发车时间,行驶时间,到达时间,停站时间  
101 - _bcObj.fcsj = _fcsjObj.format("HH:mm");  
102 - _bcObj.bcsj = _bcsj;  
103 - _bcObj.ARRIVALTIME = _arrsj.format("HH:mm");  
104 - _bcObj.STOPTIME = _stopTime;  
105 -  
106 - return _bcObj;  
107 - }  
108 - }; 1 +// 相关的内部对象
  2 +/**
  3 + * 班次类型对象(最后转换成显示用bc对象)
  4 + * @param bcType 班次类型(normal,in,out等)
  5 + * @param isUp boolean 是否上行
  6 + * @param lp 路牌编号
  7 + * @param fcno 发车编号
  8 + * @param fcTimeObj 发车时间对象
  9 + * @param paramObj 参数对象
  10 + * @returns 班次对象
  11 + */
  12 +var BcObj = function(bcType, isUp, lp, fcno, fcTimeObj, paramObj) {
  13 +
  14 + //---------- 内部属性 ----------//
  15 + var _bcType = bcType; // 班次类型(normal,in,out等)
  16 + var _isUp = isUp; // true表示上行,false表示下行
  17 + var _lp = lp; // 路牌
  18 + var _fcno = fcno; // 发车顺序号
  19 +
  20 + // 计算的属性,TODO:还有其他属性
  21 + // 上标线里属于第几圈(本班次方向和标线方向一致,才有意义)
  22 + var qCount;
  23 +
  24 + // 班次里程
  25 + var _bclc = StrategyUtils.calcuTravelLcNumber(_isUp, _bcType, paramObj);
  26 + // 发车时间
  27 + var _fcsjObj = moment(fcTimeObj);
  28 + // 班次时间
  29 + var _bcsj = StrategyUtils.calcuTravelTime(_fcsjObj, _isUp, paramObj);
  30 + // 到达时间
  31 + var _arrsj = StrategyUtils.addMinute(_fcsjObj, _bcsj);
  32 + // 到达后的停站时间(使用到达时间判定)
  33 + var _stopTime = StrategyUtils.calcuFixedStopNumber(_arrsj, !_isUp, paramObj);
  34 +
  35 + return {
  36 + /**
  37 + * 是否上行。
  38 + * @returns boolean
  39 + */
  40 + isUp: function() {
  41 + return _isUp;
  42 + },
  43 + /**
  44 + * 获取发车时间。
  45 + * @returns {*|moment.Moment}
  46 + */
  47 + getFcTimeObj: function() {
  48 + return _fcsjObj;
  49 + },
  50 + /**
  51 + * 获取班次时间。
  52 + */
  53 + getBcTime: function() {
  54 + return _bcsj;
  55 + },
  56 + /**
  57 + * 获取停站时间。
  58 + * @returns {*}
  59 + */
  60 + getStopTime: function() {
  61 + return _stopTime;
  62 + },
  63 +
  64 + /**
  65 + * 转换成显示用班次对象。
  66 + */
  67 + toGanttBcObj: function() {
  68 + var _bcObj = {
  69 + parent: _lp,
  70 + lpNo: _lp,
  71 + lp: null,
  72 + lpName: _lp,
  73 + lpType: '普通路牌',
  74 + bcType: _bcType,
  75 + fcno: _fcno,
  76 + isfb: 0,
  77 + isSwitchXl: null,
  78 + bz: null
  79 + };
  80 +
  81 + // 线路上下行
  82 + _bcObj.xlDir = _isUp ? "relationshipGraph-up" : "relationshipGraph-down";
  83 +
  84 + // 里程
  85 + _bcObj.jhlc = _bclc;
  86 +
  87 + // 停车场
  88 + _bcObj.tcc = paramObj.getTccId();
  89 +
  90 + // 时刻表
  91 + _bcObj.ttinfo = paramObj.getTTinfoId();
  92 +
  93 + // 线路
  94 + _bcObj.xl = paramObj.getXlId();
  95 +
  96 + // 起点站、终点站
  97 + _bcObj.qdz = _isUp ? paramObj.getUpQdzObj().id : paramObj.getDownQdzObj().id;
  98 + _bcObj.zdz = _isUp ? paramObj.getUpZdzObj().id : paramObj.getDownZdzObj().id;
  99 +
  100 + // 发车时间,行驶时间,到达时间,停站时间
  101 + _bcObj.fcsj = _fcsjObj.format("HH:mm");
  102 + _bcObj.bcsj = _bcsj;
  103 + _bcObj.ARRIVALTIME = _arrsj.format("HH:mm");
  104 + _bcObj.STOPTIME = _stopTime;
  105 +
  106 + return _bcObj;
  107 + }
  108 + };
109 }; 109 };
110 \ No newline at end of file 110 \ No newline at end of file
src/main/resources/static/pages/base/timesmodel/js/strategy/core/InternalBcObj.js
1 -/**  
2 - * 内部班次对象。  
3 - * @constructor  
4 - */  
5 -var InternalBcObj = function(  
6 - bcType, // 班次类型(normal,in,out等)  
7 - isUp, // boolean是否上下行  
8 - lp, // 路牌标识符  
9 - fcno, // 发车顺序号  
10 - fcTimeObj, // 发车时间对象  
11 - bclc, // 班次里程  
12 - bcsj, // 班次历时  
13 - arrtime, // 到达时间对象  
14 - stoptime, // 停站时间  
15 - tccid, // 停车场id  
16 - ttinfoid, // 时刻表id  
17 - xl, // 线路id  
18 - qdzid, // 起点站id  
19 - zdzid // 终点站id  
20 -) {  
21 - // 属性重新复制一遍,加前缀 _$_ 表示内部属性,不要直接访问k  
22 - // 外部函数使用 prototype 方式  
23 - this._$_bcType = bcType;  
24 - this._$_isUp = isUp;  
25 - this._$_lp = lp;  
26 - this._$_fcno = fcno;  
27 - this._$_fcsjObj = moment(fcTimeObj);  
28 - this._$_bclc = bclc;  
29 - this._$_bcsj = bcsj;  
30 - this._$_arrtime = arrtime;  
31 - this._$_stoptime = stoptime;  
32 - this._$_tccid = tccid;  
33 - this._$_ttinfoid = ttinfoid;  
34 - this._$_xlid = xl;  
35 - this._$_qdzid = qdzid;  
36 - this._$_zdzid = zdzid;  
37 -  
38 -};  
39 -  
40 -/**  
41 - * 是否上行。  
42 - * @returns boolean  
43 - */  
44 -InternalBcObj.prototype.isUp = function() {  
45 - return this._$_isUp;  
46 -};  
47 -/**  
48 - * 获取发车时间。  
49 - * @returns {*|moment.Moment}  
50 - */  
51 -InternalBcObj.prototype.getFcTimeObj = function() {  
52 - return this._$_fcsjObj;  
53 -};  
54 -/**  
55 - * 获取班次时间。  
56 - * @returns int  
57 - */  
58 -InternalBcObj.prototype.getBcTime = function() {  
59 - return this._$_bcsj;  
60 -};  
61 -/**  
62 - * 获取停站时间。  
63 - * @returns int  
64 - */  
65 -InternalBcObj.prototype.getStopTime = function() {  
66 - return this._$_stoptime;  
67 -};  
68 -/**  
69 - * 转换成显示用班次对象。  
70 - * @returns {{}}  
71 - */  
72 -InternalBcObj.prototype.toGanttBcObj = function() {  
73 - var _bcObj = {  
74 - parent: this._$_lp,  
75 - lpNo: this._$_lp,  
76 - lp: null,  
77 - lpName: this._$_lp,  
78 - lpType: '普通路牌',  
79 - bcType: this._$_bcType,  
80 - fcno: this._$_fcno,  
81 - isfb: 0,  
82 - isSwitchXl: null,  
83 - bz: null  
84 - };  
85 -  
86 - // 线路上下行  
87 - _bcObj.xlDir = this._$_isUp ? "relationshipGraph-up" : "relationshipGraph-down";  
88 -  
89 - // 里程  
90 - _bcObj.jhlc = this._$_bclc;  
91 -  
92 - // 停车场  
93 - _bcObj.tcc = this._$_tccid;  
94 -  
95 - // 时刻表  
96 - _bcObj.ttinfo = this._$_ttinfoid;  
97 -  
98 - // 线路  
99 - _bcObj.xl = this._$_xlid;  
100 -  
101 - // 起点站、终点站  
102 - _bcObj.qdz = this._$_qdzid;  
103 - _bcObj.zdz = this._$_zdzid;  
104 -  
105 - // 发车时间,行驶时间,到达时间,停站时间  
106 - _bcObj.fcsj = this._$_fcsjObj.format("HH:mm");  
107 - _bcObj.bcsj = this._$_bcsj;  
108 - _bcObj.ARRIVALTIME = this._$_arrtime;  
109 - _bcObj.STOPTIME = this._$_stoptime;  
110 -  
111 - return _bcObj;  
112 -};  
113 - 1 +/**
  2 + * 内部班次对象。
  3 + * @constructor
  4 + */
  5 +var InternalBcObj = function(
  6 + bcType, // 班次类型(normal,in,out等)
  7 + isUp, // boolean是否上下行
  8 + lp, // 路牌标识符
  9 + fcno, // 发车顺序号
  10 + fcTimeObj, // 发车时间对象
  11 + bclc, // 班次里程
  12 + bcsj, // 班次历时
  13 + arrtime, // 到达时间对象
  14 + stoptime, // 停站时间
  15 + tccid, // 停车场id
  16 + ttinfoid, // 时刻表id
  17 + xl, // 线路id
  18 + qdzid, // 起点站id
  19 + zdzid // 终点站id
  20 +) {
  21 + // 属性重新复制一遍,加前缀 _$_ 表示内部属性,不要直接访问k
  22 + // 外部函数使用 prototype 方式
  23 + this._$_bcType = bcType;
  24 + this._$_isUp = isUp;
  25 + this._$_lp = lp;
  26 + this._$_fcno = fcno;
  27 + this._$_fcsjObj = moment(fcTimeObj);
  28 + this._$_bclc = bclc;
  29 + this._$_bcsj = bcsj;
  30 + this._$_arrtime = arrtime;
  31 + this._$_stoptime = stoptime;
  32 + this._$_tccid = tccid;
  33 + this._$_ttinfoid = ttinfoid;
  34 + this._$_xlid = xl;
  35 + this._$_qdzid = qdzid;
  36 + this._$_zdzid = zdzid;
  37 +
  38 +};
  39 +
  40 +/**
  41 + * 是否上行。
  42 + * @returns boolean
  43 + */
  44 +InternalBcObj.prototype.isUp = function() {
  45 + return this._$_isUp;
  46 +};
  47 +/**
  48 + * 获取发车时间。
  49 + * @returns {*|moment.Moment}
  50 + */
  51 +InternalBcObj.prototype.getFcTimeObj = function() {
  52 + return this._$_fcsjObj;
  53 +};
  54 +/**
  55 + * 获取班次时间。
  56 + * @returns int
  57 + */
  58 +InternalBcObj.prototype.getBcTime = function() {
  59 + return this._$_bcsj;
  60 +};
  61 +/**
  62 + * 获取停站时间。
  63 + * @returns int
  64 + */
  65 +InternalBcObj.prototype.getStopTime = function() {
  66 + return this._$_stoptime;
  67 +};
  68 +/**
  69 + * 转换成显示用班次对象。
  70 + * @returns {{}}
  71 + */
  72 +InternalBcObj.prototype.toGanttBcObj = function() {
  73 + var _bcObj = {
  74 + parent: this._$_lp,
  75 + lpNo: this._$_lp,
  76 + lp: null,
  77 + lpName: this._$_lp,
  78 + lpType: '普通路牌',
  79 + bcType: this._$_bcType,
  80 + fcno: this._$_fcno,
  81 + isfb: 0,
  82 + isSwitchXl: null,
  83 + bz: null
  84 + };
  85 +
  86 + // 线路上下行
  87 + _bcObj.xlDir = this._$_isUp ? "relationshipGraph-up" : "relationshipGraph-down";
  88 +
  89 + // 里程
  90 + _bcObj.jhlc = this._$_bclc;
  91 +
  92 + // 停车场
  93 + _bcObj.tcc = this._$_tccid;
  94 +
  95 + // 时刻表
  96 + _bcObj.ttinfo = this._$_ttinfoid;
  97 +
  98 + // 线路
  99 + _bcObj.xl = this._$_xlid;
  100 +
  101 + // 起点站、终点站
  102 + _bcObj.qdz = this._$_qdzid;
  103 + _bcObj.zdz = this._$_zdzid;
  104 +
  105 + // 发车时间,行驶时间,到达时间,停站时间
  106 + _bcObj.fcsj = this._$_fcsjObj.format("HH:mm");
  107 + _bcObj.bcsj = this._$_bcsj;
  108 + _bcObj.ARRIVALTIME = this._$_arrtime;
  109 + _bcObj.STOPTIME = this._$_stoptime;
  110 +
  111 + return _bcObj;
  112 +};
  113 +
src/main/resources/static/pages/base/timesmodel/js/v2/ParameterObj.js
1 -/**  
2 - * 参数对象。  
3 - *  
4 - * @constructor  
5 - */  
6 -var ParameterObj = function() {  
7 - // 内部保存的form参数及其他参数  
8 - var _formMap;  
9 - var _dataMap;  
10 - var _validInternal = function() {  
11 - if (!_formMap) {  
12 - alert("formMap为空!");  
13 - throw "formMap为空!";  
14 - }  
15 - if (!_dataMap) {  
16 - alert("dataMap为空!");  
17 - throw "dataMap为空!";  
18 - }  
19 - };  
20 -  
21 - // 计算行驶时间对象  
22 - var _travelTimeObj_fun = function() {  
23 - var upMoningPeakTravelTime =  
24 - isNaN(_formMap.earlyUpTime) || parseInt(_formMap.earlyUpTime) == 0 ?  
25 - parseInt(_formMap.upTravelTime) :  
26 - parseInt(_formMap.earlyUpTime);  
27 - var downMoningPeakTravelTime =  
28 - isNaN(_formMap.earlyDownTime) || parseInt(_formMap.earlyDownTime) == 0 ?  
29 - parseInt(_formMap.downTravelTime) :  
30 - parseInt(_formMap.earlyDownTime);  
31 - var upEveningPeakTravelTime =  
32 - isNaN(_formMap.lateUpTime) || parseInt(_formMap.lateUpTime) == 0 ?  
33 - parseInt(_formMap.upTravelTime) :  
34 - parseInt(_formMap.lateUpTime);  
35 - var downEveningPeakTravelTime =  
36 - isNaN(_formMap.lateDownTime) || parseInt(_formMap.lateDownTime) == 0 ?  
37 - parseInt(_formMap.downTravelTime) :  
38 - parseInt(_formMap.lateDownTime);  
39 - var upTroughTravelTime =  
40 - isNaN(_formMap.troughUpTime) || parseInt(_formMap.troughUpTime) == 0 ?  
41 - parseInt(_formMap.upTravelTime) :  
42 - parseInt(_formMap.troughUpTime);  
43 - var downTroughTravelTime =  
44 - isNaN(_formMap.troughDownTime) || parseInt(_formMap.troughDownTime) == 0 ?  
45 - parseInt(_formMap.downTravelTime) :  
46 - parseInt(_formMap.troughDownTime);  
47 -  
48 - return { // TODO:暂时获取标准信息,之后改成历史数据,可能需要使用promise封装  
49 - "moningpeak": [  
50 - upMoningPeakTravelTime,  
51 - downMoningPeakTravelTime  
52 - ],  
53 - "eveningpeak": [  
54 - upEveningPeakTravelTime,  
55 - downEveningPeakTravelTime  
56 - ],  
57 - "trough": [  
58 - upTroughTravelTime,  
59 - downTroughTravelTime  
60 - ]  
61 - }  
62 - };  
63 - var _travelTimeObj;  
64 -  
65 - // 计算行驶里程对象  
66 - var _travelLcObj_fun = function() {  
67 - return [  
68 - { // 上行里程  
69 - "normalLc": isNaN(_formMap.upMileage) ? 0 : parseFloat(_formMap.upMileage),  
70 - "inLc": isNaN(_formMap.upInMileage) ? 0 : parseFloat(_formMap.upInMileage),  
71 - "outLc": isNaN(_formMap.upOutMileage) ? 0 : parseFloat(_formMap.upOutMileage)  
72 - },  
73 - { // 下行里程  
74 - "normalLc": isNaN(_formMap.downMileage) ? 0 : parseFloat(_formMap.downMileage),  
75 - "inLc": isNaN(_formMap.downInMileage) ? 0 : parseFloat(_formMap.downInMileage),  
76 - "outLc": isNaN(_formMap.downOutMileage) ? 0 : parseFloat(_formMap.downOutMileage)  
77 - }  
78 - ];  
79 - };  
80 - var _travelLcObj;  
81 -  
82 - // 计算首班车,末班车行驶时间字符串  
83 - var _firstLastDepartureTimeStrObj_fun = function() {  
84 - return {  
85 - up: { // 上行  
86 - firstVehicleDepartureTimeStr: _formMap.startStationFirstTime,  
87 - lastVehicleDepartureTimeStr: _formMap.startStationEndTime  
88 - },  
89 - down: { // 下行  
90 - firstVehicleDepartureTimeStr: _formMap.endStationFirstTime,  
91 - lastVehicleDepartureTimeStr: _formMap.endStationEndTime  
92 - }  
93 - };  
94 - };  
95 - var _firstLastDepartureTimeStrObj;  
96 -  
97 - // 计算时间段划分对象  
98 - var _timeIntervalObj_fun = function() {  
99 - return {  
100 - moningPeakTimeStrs: {  
101 - start: _formMap.earlyStartTime,  
102 - end: _formMap.earlyEndTime  
103 - },  
104 - eveningPeakTimeStrs: {  
105 - start: _formMap.lateStartTime,  
106 - end: _formMap.lateEndTime  
107 - }  
108 -  
109 - // TODO:其他时间段以后再加  
110 - };  
111 - };  
112 - var _timeIntervalObj;  
113 -  
114 - // 计算各个时段的发车间隙  
115 - var _fcjxIntervalObj_fun = function() {  
116 - var _rtn = {  
117 - mpeakfcjx : {}, // 早高峰  
118 - epeakfcjx : {}, // 晚高峰  
119 - troughfcjx: {} //低谷  
120 - };  
121 - var _fcjx = [];  
122 - var i = 0;  
123 -  
124 - // TODO:这里只有3个间隔,以后加其他的  
125 - // 1、早高峰间隙  
126 - // 2、晚高峰间隙  
127 - // 3、低谷  
128 -  
129 - _rtn.mpeakfcjx.min = parseInt(_formMap.zgffcjxmin);  
130 - _rtn.mpeakfcjx.max = parseInt(_formMap.zgffcjxmax);  
131 -  
132 - _rtn.epeakfcjx.min = parseInt(_formMap.wffcjxmin);  
133 - _rtn.epeakfcjx.max = parseInt(_formMap.wffcjxmax);  
134 -  
135 - _rtn.troughfcjx.min = parseInt(_formMap.dgfcjxmin);  
136 - _rtn.troughfcjx.max = parseInt(_formMap.dgfcjxmax);  
137 -  
138 - // 做一些逻辑检查  
139 - if (_rtn.mpeakfcjx.min > _rtn.mpeakfcjx.max) {  
140 - alert("早高峰最小间隔大于最大间隔");  
141 - throw "早高峰最小间隔大于最大间隔";  
142 - }  
143 - if (_rtn.epeakfcjx.min > _rtn.epeakfcjx.max) {  
144 - alert("晚高峰最小间隔大于最大间隔");  
145 - throw "晚高峰最小间隔大于最大间隔";  
146 - }  
147 - if (_rtn.troughfcjx.min > _rtn.troughfcjx.max) {  
148 - alert("低谷最小间隔大于最大间隔");  
149 - throw "低谷最小间隔大于最大间隔";  
150 - }  
151 -  
152 -  
153 - return _rtn;  
154 - };  
155 - var _fcjxIntervalObj;  
156 -  
157 - // 获取停站类型  
158 - var _stopTypeObj_fun = function() {  
159 - var isMasterStop = false; // 是否主站停  
160 - var isMasterUpStop = false; // 主站停是否上行站点  
161 - if (_formMap) {  
162 - var fm_temp = _formMap.stt.split("/");  
163 - if (fm_temp.length == 1) { // 双向停站  
164 - isMasterStop = false;  
165 - } else {  
166 - isMasterStop = true;  
167 - if (fm_temp[1] == "0") {  
168 - isMasterUpStop = true;  
169 - } else {  
170 - isMasterUpStop = false;  
171 - }  
172 - }  
173 - } else {  
174 - throw "停站类型没有选择!";  
175 - }  
176 -  
177 - return {  
178 - isMasterStop: isMasterStop,  
179 - isMasterUpStop: isMasterUpStop  
180 - }  
181 - };  
182 - var _stopTypeObj;  
183 -  
184 - // 计算线路对象  
185 - var _xlObj_fun = function() {  
186 - return { // TODO:其他属性再议  
187 - xl: {  
188 - id: _formMap.lineName.split('_')[0]  
189 - }  
190 - };  
191 - };  
192 - var _xlObj;  
193 -  
194 - // 计算停车场对象  
195 - var _parkObj_fun = function() {  
196 - return { // TODO:其他属性再议  
197 - park: {  
198 - id: _formMap.tcc_id  
199 - }  
200 - };  
201 - };  
202 - var _parkObj;  
203 -  
204 - // 计算时刻表对象  
205 - var _ttInfoObj_fun = function() {  
206 - return { // TODO:其他属性再议  
207 - ttinfo: {  
208 - id: _formMap.skbName  
209 - }  
210 - };  
211 - };  
212 - var _ttInfoObj;  
213 -  
214 - // 计算起点站终点站对象  
215 - var _startEndStopObj_fun = function() {  
216 - return { // TODO:其他属性再议  
217 - up: {  
218 - qdz: { // 起点站  
219 - id: _dataMap.qdzArr[0]  
220 - },  
221 - zdz: { // 终点站  
222 - id: _dataMap.zdzArr[0]  
223 - }  
224 - },  
225 - down: {  
226 - qdz: { // 起点站  
227 - id: _dataMap.qdzArr[1]  
228 - },  
229 - zdz: { // 终点站  
230 - id: _dataMap.zdzArr[1]  
231 - }  
232 - }  
233 -  
234 - };  
235 - };  
236 - var _startEndStopObj;  
237 -  
238 - var date_wrap_prefix = "2000-01-01 "; // 包装日期的前缀  
239 - var date_wrap_format = "YYYY-MM-DD HH:mm"; // 日期格式  
240 - /**  
241 - * 将时间包装成日期,方便计算。  
242 - * @param timeStr 时间格式,如 06:30  
243 - * @returns moment对象  
244 - */  
245 - var _wrapTimeFun = function(timeStr) {  
246 - return moment(  
247 - date_wrap_prefix + timeStr,  
248 - date_wrap_format  
249 - );  
250 - };  
251 - /**  
252 - * 添加时间(注意,返回一个新的moment对象,此方法是immutable)  
253 - * @param timeObj moment 对象  
254 - * @param time 时间  
255 - * @param type 时间单位  
256 - * @returns 重新创建一个moment返回  
257 - */  
258 - var _addTimeFun = function(timeObj, time, type) {  
259 - var _timeObj = moment(timeObj); // clone  
260 - _timeObj.add(time, type);  
261 - return _timeObj;  
262 - };  
263 -  
264 - return {  
265 -  
266 - /**  
267 - * 包装外部参数。  
268 - * @param formMap  
269 - * @param dataMap  
270 - */  
271 - wrap: function(formMap, dataMap) {  
272 - _formMap = formMap;  
273 - _dataMap = dataMap;  
274 -  
275 - _validInternal(); // 验证  
276 -  
277 - // 首班车,末班车行驶时间字符串  
278 - _firstLastDepartureTimeStrObj = _firstLastDepartureTimeStrObj_fun();  
279 - // 行驶时间对象  
280 - _travelTimeObj = _travelTimeObj_fun();  
281 - // 行驶里程对象  
282 - _travelLcObj = _travelLcObj_fun();  
283 - // 时间段划分对象  
284 - _timeIntervalObj = _timeIntervalObj_fun();  
285 - // 各个时段的发车间隙  
286 - _fcjxIntervalObj = _fcjxIntervalObj_fun();  
287 - // 停站类型  
288 - _stopTypeObj = _stopTypeObj_fun();  
289 - // 线路对象  
290 - _xlObj = _xlObj_fun();  
291 - // 停车场对象  
292 - _parkObj = _parkObj_fun();  
293 - // 时刻表对象  
294 - _ttInfoObj = _ttInfoObj_fun();  
295 - // 起点站终点站对象  
296 - _startEndStopObj = _startEndStopObj_fun();  
297 -  
298 - // TODO:其他再议  
299 -  
300 - },  
301 -  
302 - //------------ 获取首班末班时间 ------------//  
303 - /**  
304 - * 获取上行首班时间对象。  
305 - * @param sobj 策略对象(HeadwayObj)  
306 - * @return moment obj  
307 - */  
308 - getUpFirstDTimeObj: function() {  
309 - _validInternal(); // 验证  
310 - return this.toTimeObj(  
311 - _firstLastDepartureTimeStrObj.up.firstVehicleDepartureTimeStr  
312 - );  
313 - },  
314 - /**  
315 - * 获取上行末班时间对象。  
316 - * @return moment obj  
317 - */  
318 - getUpLastDtimeObj: function() {  
319 - _validInternal(); // 验证  
320 - return this.toTimeObj(  
321 - _firstLastDepartureTimeStrObj.up.lastVehicleDepartureTimeStr  
322 - );  
323 - },  
324 - /**  
325 - * 获取下行首班时间对象。  
326 - * @return moment obj  
327 - */  
328 - getDownFirstDTimeObj: function() {  
329 - _validInternal(); // 验证  
330 - return this.toTimeObj(  
331 - _firstLastDepartureTimeStrObj.down.firstVehicleDepartureTimeStr  
332 - );  
333 - },  
334 - /**  
335 - * 获取下行末班时间对象。  
336 - * @return moment obj  
337 - */  
338 - getDownLastDTimeObj: function() {  
339 - _validInternal(); // 验证  
340 - return this.toTimeObj(  
341 - _firstLastDepartureTimeStrObj.down.lastVehicleDepartureTimeStr  
342 - );  
343 - },  
344 -  
345 - //-------------- 获取行驶时间 ----------------//  
346 - /**  
347 - * 获取上行早高峰行驶时间。  
348 - * @returns int number  
349 - */  
350 - getUpMPeakTime: function() {  
351 - _validInternal(); // 验证  
352 - return _travelTimeObj.moningpeak[0];  
353 - },  
354 - /**  
355 - * 获取上行晚高峰行驶时间。  
356 - * @returns int number  
357 - */  
358 - getUpEPeakTime: function() {  
359 - _validInternal(); // 验证  
360 - return _travelTimeObj.eveningpeak[0];  
361 - },  
362 - /**  
363 - * 获取上行低谷行驶时间。  
364 - * @returns int number  
365 - */  
366 - getUpTroughTime: function() {  
367 - _validInternal(); // 验证  
368 - return _travelTimeObj.trough[0];  
369 - },  
370 - /**  
371 - * 获取下行早高峰行驶时间。  
372 - * @returns int number  
373 - */  
374 - getDownMPeakTime: function() {  
375 - _validInternal(); // 验证  
376 - return _travelTimeObj.moningpeak[1];  
377 - },  
378 - /**  
379 - * 获取下行晚高峰行驶时间。  
380 - * @returns int number  
381 - */  
382 - getDownEPeakTime: function() {  
383 - _validInternal(); // 验证  
384 - return _travelTimeObj.eveningpeak[1];  
385 - },  
386 - /**  
387 - * 获取下行低谷行驶时间。  
388 - * @returns int number  
389 - */  
390 - getDownTroughTime: function() {  
391 - _validInternal(); // 验证  
392 - return _travelTimeObj.trough[1];  
393 - },  
394 -  
395 - //---------------- 获取行驶里程 -----------------//  
396 - /**  
397 - * 获取上行normal班次里程。  
398 - * @returns number  
399 - */  
400 - getUpNormalLc: function() {  
401 - _validInternal(); // 验证  
402 - return _travelLcObj[0].normalLc;  
403 - },  
404 - /**  
405 - * 获取上行进场班次类型。  
406 - * @returns number  
407 - */  
408 - getUpInLc: function() {  
409 - _validInternal(); // 验证  
410 - return _travelLcObj[0].inLc;  
411 - },  
412 - /**  
413 - * 获取上行出场班次类型。  
414 - * @returns number  
415 - */  
416 - getUpOutLc: function() {  
417 - _validInternal(); // 验证  
418 - return _travelLcObj[0].outLc;  
419 - },  
420 - /**  
421 - * 获取下行normal班次类型。  
422 - * @returns number  
423 - */  
424 - getDownNormalLc: function() {  
425 - _validInternal(); // 验证  
426 - return _travelLcObj[1].normalLc;  
427 - },  
428 - /**  
429 - * 获取下行进场班次类型。  
430 - * @returns number  
431 - */  
432 - getDownInLc: function() {  
433 - _validInternal(); // 验证  
434 - return _travelLcObj[1].inLc;  
435 - },  
436 - /**  
437 - * 获取下行出场班次类型。  
438 - * @returns number  
439 - */  
440 - getDownOutLc: function() {  
441 - _validInternal(); // 验证  
442 - return _travelLcObj[1].outLc;  
443 - },  
444 -  
445 - //---------------- 获取时间段信息 --------------//  
446 - /**  
447 - * 获取早高峰开始时间对象。  
448 - * @returns moment obj  
449 - */  
450 - getMPeakStartTimeObj: function() {  
451 - _validInternal(); // 验证  
452 - return this.toTimeObj(  
453 - _timeIntervalObj.moningPeakTimeStrs.start  
454 - );  
455 - },  
456 - /**  
457 - * 获取早高峰结束时间对象。  
458 - * @returns moment obj  
459 - */  
460 - getMPeakEndTimeObj: function() {  
461 - _validInternal(); // 验证  
462 - return this.toTimeObj(  
463 - _timeIntervalObj.moningPeakTimeStrs.end  
464 - );  
465 - },  
466 - /**  
467 - * 获取晚高峰开始时间对象。  
468 - * @returns moment obj  
469 - */  
470 - getEPeakStartTimeObj: function() {  
471 - _validInternal(); // 验证  
472 - return this.toTimeObj(  
473 - _timeIntervalObj.eveningPeakTimeStrs.start  
474 - );  
475 - },  
476 - /**  
477 - * 获取晚高峰结束时间对象。  
478 - * @returns moment obj  
479 - */  
480 - getEPeakEndTimeObj: function() {  
481 - _validInternal(); // 验证  
482 - return this.toTimeObj(  
483 - _timeIntervalObj.eveningPeakTimeStrs.end  
484 - );  
485 - },  
486 -  
487 - //----------------- 获取发车间隙(TODO:以后通过客流估算)-----------------//  
488 - /**  
489 - * 获取早高峰最小发车间隙。  
490 - * @returns int  
491 - */  
492 - getMPeakMinFcjx: function() {  
493 - _validInternal(); // 验证  
494 - return _fcjxIntervalObj.mpeakfcjx.min;  
495 - },  
496 - /**  
497 - * 获取早高峰最大发车间隙。  
498 - * @returns int  
499 - */  
500 - getMPeakMaxFcjx: function() {  
501 - _validInternal(); // 验证  
502 - return _fcjxIntervalObj.mpeakfcjx.max;  
503 - },  
504 - /**  
505 - * 获取晚高峰最小发车间隙。  
506 - * @returns int  
507 - */  
508 - getEPeakMinFcjx: function() {  
509 - _validInternal(); // 验证  
510 - return _fcjxIntervalObj.epeakfcjx.min;  
511 - },  
512 - /**  
513 - * 获取晚高峰最小发车间隙。  
514 - * @returns int  
515 - */  
516 - getEPeakMaxFcjx: function() {  
517 - _validInternal(); // 验证  
518 - return _fcjxIntervalObj.epeakfcjx.max;  
519 - },  
520 - /**  
521 - * 获取低谷最小发车间隙。  
522 - * @returns int  
523 - */  
524 - getTroughMinFcjx: function() {  
525 - _validInternal(); // 验证  
526 - return _fcjxIntervalObj.troughfcjx.min;  
527 - },  
528 - /**  
529 - * 获取低谷最大发车间隙。  
530 - * @returns int  
531 - */  
532 - getTroughMaxFcjx: function() {  
533 - _validInternal(); // 验证  
534 - return _fcjxIntervalObj.troughfcjx.max;  
535 - },  
536 -  
537 - //----------------- 获取停站方式 -------------------//  
538 - /**  
539 - * 是否双向停站。  
540 - * @returns {boolean}  
541 - */  
542 - isTwoWayStop: function() {  
543 - _validInternal(); // 验证  
544 - return !_stopTypeObj.isMasterStop;  
545 - },  
546 - /**  
547 - * 是否上行单向停站。  
548 - * @returns {boolean}  
549 - */  
550 - isUpOneWayStop: function() {  
551 - _validInternal(); // 验证  
552 - return _stopTypeObj.isMasterStop && _stopTypeObj.isMasterUpStop;  
553 - },  
554 - /**  
555 - * 是否下行单向停站。  
556 - * @returns {boolean}  
557 - */  
558 - isDownOneWayStop: function() {  
559 - _validInternal(); // 验证  
560 - return _stopTypeObj.isMasterStop && (!_stopTypeObj.isMasterUpStop);  
561 - },  
562 -  
563 - //----------------- 获取高峰配车数、加班路牌数 ----------------//  
564 - /**  
565 - * 获取高峰建议配车数(TODO:参照一下)。  
566 - * @returns {Number|*}  
567 - */  
568 - getAdvicePeakClzs: function() {  
569 - _validInternal(); // 验证  
570 - return parseInt(_formMap.gfjypcs);  
571 - },  
572 - /**  
573 - * 获取加班路牌数(5休2路牌的个数)。  
574 - * @returns {Number|*}  
575 - */  
576 - getJBLpes: function() {  
577 - _validInternal(); // 验证  
578 - return parseInt(_formMap.jbclcount);  
579 - },  
580 -  
581 - //----------------- 获取关联数据信息 -----------------//  
582 - /**  
583 - * 获取线路id。  
584 - */  
585 - getXlId: function() {  
586 - _validInternal(); // 验证  
587 - return _xlObj.xl.id;  
588 - },  
589 - /**  
590 - * 获取停车场id。  
591 - */  
592 - getTccId: function() {  
593 - _validInternal(); // 验证  
594 - return _parkObj.park.id;  
595 - },  
596 - /**  
597 - * 获取时刻表id。  
598 - */  
599 - getTTinfoId: function() {  
600 - _validInternal(); // 验证  
601 - return _ttInfoObj.ttinfo.id;  
602 - },  
603 - /**  
604 - * 获取上行起点站对象。  
605 - * @returns {{id: *}}  
606 - */  
607 - getUpQdzObj: function() {  
608 - _validInternal(); // 验证  
609 - return {  
610 - id: _startEndStopObj.up.qdz.id  
611 - };  
612 - },  
613 - /**  
614 - * 获取上行终点站对象。  
615 - * @returns {{id: *}}  
616 - */  
617 - getUpZdzObj: function() {  
618 - _validInternal(); // 验证  
619 - return {  
620 - id: _startEndStopObj.up.zdz.id  
621 - };  
622 - },  
623 - /**  
624 - * 获取下行起点站对象。  
625 - * @returns {{id: *}}  
626 - */  
627 - getDownQdzObj: function() {  
628 - _validInternal(); // 验证  
629 - return {  
630 - id: _startEndStopObj.down.qdz.id  
631 - };  
632 - },  
633 - /**  
634 - * 获取下行终点站对象。  
635 - * @returns {{id: *}}  
636 - */  
637 - getDownZdzObj: function() {  
638 - _validInternal(); // 验证  
639 - return {  
640 - id: _startEndStopObj.down.zdz.id  
641 - };  
642 - },  
643 -  
644 - //-------------- 时间操作 ------------//  
645 - /**  
646 - * 通过字符串创建时间对象。  
647 - * @param timeStr 时间字符串  
648 - * @returns {moment对象}  
649 - */  
650 - toTimeObj: function(timeStr) {  
651 - _validInternal(); // 验证  
652 - return _wrapTimeFun(timeStr);  
653 - },  
654 - /**  
655 - * 增加分钟。  
656 - * @param timeObj 时间对象  
657 - * @param minute 分钟  
658 - * @returns {重新创建一个moment返回}  
659 - */  
660 - addMinute: function(timeObj, minute) {  
661 - _validInternal(); // 验证  
662 - return _addTimeFun(timeObj, minute, "m");  
663 - },  
664 -  
665 - //-------------- 时间业务操作 ------------//  
666 - /**  
667 - * 判定某个班次是否是早高峰班次。  
668 - * @param timeObj 班次时间  
669 - * @returns true false  
670 - */  
671 - isMPeakBc: function(timeObj) {  
672 - _validInternal(); // 验证  
673 - var paramObj = this;  
674 - // 早高峰开始时间  
675 - var st = paramObj.getMPeakStartTimeObj();  
676 - // 早高峰结束时间  
677 - var et = paramObj.getMPeakEndTimeObj();  
678 - // 包装日期  
679 - return timeObj.isBetween(st, et, null, "[]");  
680 - },  
681 - /**  
682 - * 判定某个班次是否是晚高峰班次。  
683 - * @param timeObj 班次时间  
684 - * @returns true false  
685 - */  
686 - isEPeakBc: function(timeObj) {  
687 - _validInternal(); // 验证  
688 - var paramObj = this;  
689 - // 晚高峰开始时间  
690 - var st = paramObj.getEPeakStartTimeObj();  
691 - // 晚高峰结束时间  
692 - var et = paramObj.getEPeakEndTimeObj();  
693 - // 包装日期  
694 - return timeObj.isBetween(st, et, null, "[]");  
695 - },  
696 - /**  
697 - * 判定某个班次是否是低谷班次。  
698 - * @param timeObj 班次时间  
699 - * @returns true false  
700 - */  
701 - isTroughBc: function(timeObj) {  
702 - _validInternal(); // 验证  
703 - var paramObj = this;  
704 - return (  
705 - !this.isMPeakBc(timeObj) &&  
706 - !this.isEPeakBc(timeObj)  
707 - );  
708 - },  
709 - /**  
710 - * 判定某个低谷班次是否在早高峰开始之前。  
711 - * @param timeObj 班次时间  
712 - * @returns true false  
713 - */  
714 - isTroughBeforMPeakStartBc: function(timeObj) {  
715 - _validInternal(); // 验证  
716 - var paramObj = this;  
717 - // 早高峰开始时间  
718 - var st = paramObj.getMPeakStartTimeObj();  
719 - // 包装日期  
720 - return timeObj.isBefore(st);  
721 - },  
722 - /**  
723 - * 判定某个低谷班次是否在晚高峰结束之后。  
724 - * @param timeObj 班次时间  
725 - * @returns true false  
726 - */  
727 - isTroughAfterEPeakEndBc: function(timeObj) {  
728 - _validInternal(); // 验证  
729 - var paramObj = this;  
730 - // 晚高峰结束时间  
731 - var et = paramObj.getEPeakEndTimeObj();  
732 - // 包装日期  
733 - return timeObj.isAfter(et);  
734 - },  
735 -  
736 - /**  
737 - * 获取固定的停站时间(固定停站时间都是选的最大值)  
738 - * @param timeObj 时间对象  
739 - * @param isUp 是否上行  
740 - * @returns number  
741 - */  
742 - calcuFixedStopNumber: function(timeObj, isUp) {  
743 - _validInternal(); // 验证  
744 - var paramObj = this;  
745 -  
746 - var peakStopTime; // 高峰停站时间  
747 - var troughStopTime; // 低谷停站时间  
748 - var secondaryStopTime; // 副站停站时间  
749 -  
750 - // 双向停站  
751 - if (paramObj.isTwoWayStop()) {  
752 - if (isUp) { // 上行  
753 - if (this.isMPeakBc(timeObj)) { // 早高峰  
754 - peakStopTime = Math.floor(paramObj.getUpMPeakTime() * 0.1); // 行驶时间的10%  
755 - if (peakStopTime < 3) { // 不少于3分钟  
756 - peakStopTime = 3;  
757 - }  
758 - return peakStopTime;  
759 - } else if (this.isEPeakBc(timeObj)) { // 晚高峰  
760 - peakStopTime = Math.floor(paramObj.getUpEPeakTime() * 0.1); // 行驶时间的10%  
761 - if (peakStopTime < 3) { // 不少于3分钟  
762 - peakStopTime = 3;  
763 - }  
764 - return peakStopTime;  
765 - } else { // 低谷  
766 - if (this.isTroughBeforMPeakStartBc(timeObj)) { // 早高峰开始前  
767 - troughStopTime = Math.floor(paramObj.getUpTroughTime() * 0.2); // 行驶时间20%  
768 - if (troughStopTime < 10) { // 不少于10分钟  
769 - troughStopTime = 10;  
770 - }  
771 - return troughStopTime;  
772 - } else if (this.isTroughAfterEPeakEndBc(timeObj)) { // 晚高峰结束后  
773 - troughStopTime = Math.floor(paramObj.getUpTroughTime() * 0.2); // 行驶时间20%  
774 - if (troughStopTime < 10) { // 不少于10分钟  
775 - troughStopTime = 10;  
776 - }  
777 - return troughStopTime;  
778 - } else { // 早高峰,晚高峰之间  
779 - troughStopTime = Math.floor(paramObj.getUpTroughTime() * 0.15); // 行驶时间15%  
780 - if (troughStopTime < 10) { // 不少于10分钟  
781 - troughStopTime = 10;  
782 - }  
783 - return troughStopTime;  
784 - }  
785 - }  
786 - } else { // 下行  
787 - if (this.isMPeakBc(timeObj)) { // 早高峰  
788 - peakStopTime = Math.floor(paramObj.getDownMPeakTime() * 0.1); // 行驶时间的10%  
789 - if (peakStopTime < 3) { // 不少于3分钟  
790 - peakStopTime = 3;  
791 - }  
792 - return peakStopTime;  
793 - } else if (this.isEPeakBc(timeObj)) { // 晚高峰  
794 - peakStopTime = Math.floor(paramObj.getDownEPeakTime() * 0.1); // 行驶时间的10%  
795 - if (peakStopTime < 3) { // 不少于3分钟  
796 - peakStopTime = 3;  
797 - }  
798 - return peakStopTime;  
799 - } else { // 低谷  
800 - if (this.isTroughBeforMPeakStartBc(timeObj)) { // 早高峰开始前  
801 - troughStopTime = Math.floor(paramObj.getDownTroughTime() * 0.2); // 行驶时间20%  
802 - if (troughStopTime < 10) { // 不少于10分钟  
803 - troughStopTime = 10;  
804 - }  
805 - return troughStopTime;  
806 - } else if (this.isTroughAfterEPeakEndBc(timeObj)) { // 晚高峰结束后  
807 - troughStopTime = Math.floor(paramObj.getDownTroughTime() * 0.2); // 行驶时间20%  
808 - if (troughStopTime < 10) { // 不少于10分钟  
809 - troughStopTime = 10;  
810 - }  
811 - return troughStopTime;  
812 - } else { // 早高峰,晚高峰之间  
813 - troughStopTime = Math.floor(paramObj.getDownTroughTime() * 0.15); // 行驶时间15%  
814 - if (troughStopTime < 10) { // 不少于10分钟  
815 - troughStopTime = 10;  
816 - }  
817 - return troughStopTime;  
818 - }  
819 - }  
820 - }  
821 - } else { // 主站停站  
822 - if (isUp == paramObj.isUpOneWayStop()) {  
823 - if (isUp) { // 上行  
824 - if (this.isMPeakBc(timeObj)) { // 早高峰  
825 - peakStopTime = Math.floor(paramObj.getUpMPeakTime() * 0.1); // 行驶时间的10%  
826 - if (peakStopTime < 3) { // 不少于3分钟  
827 - peakStopTime = 3;  
828 - }  
829 - return peakStopTime;  
830 - } else if (this.isEPeakBc(timeObj)) { // 晚高峰  
831 - peakStopTime = Math.floor(paramObj.getUpEPeakTime() * 0.1); // 行驶时间的10%  
832 - if (peakStopTime < 3) { // 不少于3分钟  
833 - peakStopTime = 3;  
834 - }  
835 - return peakStopTime;  
836 - } else { // 低谷  
837 - if (this.isTroughBeforMPeakStartBc(timeObj)) { // 早高峰开始前  
838 - troughStopTime = Math.floor(paramObj.getUpTroughTime() * 0.2); // 行驶时间20%  
839 - if (troughStopTime < 10) { // 不少于10分钟  
840 - troughStopTime = 10;  
841 - }  
842 - return troughStopTime;  
843 - } else if (this.isTroughAfterEPeakEndBc(timeObj)) { // 晚高峰结束后  
844 - troughStopTime = Math.floor(paramObj.getUpTroughTime() * 0.2); // 行驶时间20%  
845 - if (troughStopTime < 10) { // 不少于10分钟  
846 - troughStopTime = 10;  
847 - }  
848 - return troughStopTime;  
849 - } else { // 早高峰,晚高峰之间  
850 - troughStopTime = Math.floor(paramObj.getUpTroughTime() * 0.15); // 行驶时间15%  
851 - if (troughStopTime < 10) { // 不少于10分钟  
852 - troughStopTime = 10;  
853 - }  
854 - return troughStopTime;  
855 - }  
856 - }  
857 - } else { // 下行  
858 - if (this.isMPeakBc(timeObj)) { // 早高峰  
859 - peakStopTime = Math.floor(paramObj.getDownMPeakTime() * 0.1); // 行驶时间的10%  
860 - if (peakStopTime < 3) { // 不少于3分钟  
861 - peakStopTime = 3;  
862 - }  
863 - return peakStopTime;  
864 - } else if (this.isEPeakBc(timeObj)) { // 晚高峰  
865 - peakStopTime = Math.floor(paramObj.getDownEPeakTime() * 0.1); // 行驶时间的10%  
866 - if (peakStopTime < 3) { // 不少于3分钟  
867 - peakStopTime = 3;  
868 - }  
869 - return peakStopTime;  
870 - } else { // 低谷  
871 - if (this.isTroughBeforMPeakStartBc(timeObj)) { // 早高峰开始前  
872 - troughStopTime = Math.floor(paramObj.getDownTroughTime() * 0.2); // 行驶时间20%  
873 - if (troughStopTime < 10) { // 不少于10分钟  
874 - troughStopTime = 10;  
875 - }  
876 - return troughStopTime;  
877 - } else if (this.isTroughAfterEPeakEndBc(timeObj)) { // 晚高峰结束后  
878 - troughStopTime = Math.floor(paramObj.getDownTroughTime() * 0.2); // 行驶时间20%  
879 - if (troughStopTime < 10) { // 不少于10分钟  
880 - troughStopTime = 10;  
881 - }  
882 - return troughStopTime;  
883 - } else { // 早高峰,晚高峰之间  
884 - troughStopTime = Math.floor(paramObj.getDownTroughTime() * 0.15); // 行驶时间15%  
885 - if (troughStopTime < 10) { // 不少于10分钟  
886 - troughStopTime = 10;  
887 - }  
888 - return troughStopTime;  
889 - }  
890 - }  
891 - }  
892 - } else { // 副站停战,2到3分钟  
893 - secondaryStopTime = 3;  
894 - return secondaryStopTime; // 直接返回3分钟  
895 - }  
896 - }  
897 -  
898 - },  
899 -  
900 - /**  
901 - * 获取行驶时间。  
902 - * @param timeObj 班次时间字符串  
903 - * @param isUp 是否上行  
904 - */  
905 - calcuTravelTime: function(timeObj, isUp) {  
906 - _validInternal(); // 验证  
907 - var paramObj = this;  
908 -  
909 - if (isUp) {  
910 - if (this.isMPeakBc(timeObj)) {  
911 - return paramObj.getUpMPeakTime();  
912 - } else if (this.isEPeakBc(timeObj)) {  
913 - return paramObj.getUpEPeakTime();  
914 - } else {  
915 - return paramObj.getUpTroughTime();  
916 - }  
917 - } else {  
918 - if (this.isMPeakBc(timeObj)) {  
919 - return paramObj.getDownMPeakTime();  
920 - } else if (this.isEPeakBc(timeObj)) {  
921 - return paramObj.getDownEPeakTime();  
922 - } else {  
923 - return paramObj.getDownTroughTime();  
924 - }  
925 - }  
926 - },  
927 -  
928 - /**  
929 - * 获取行驶里程。  
930 - * @param isUp 是否上行  
931 - * @param bcType 班次类型  
932 - */  
933 - calcuTravelLcNumber: function(isUp, bcType) {  
934 - _validInternal(); // 验证  
935 - var paramObj = this;  
936 -  
937 - if (isUp) {  
938 - if (bcType == "in") {  
939 - return paramObj.getUpInLc();  
940 - } else if (bcType == "out") {  
941 - return paramObj.getUpOutLc();  
942 - } else {  
943 - // 基本班次类型,暂时不考虑区间等其他班次类型  
944 - // 暂时不考虑高峰低谷里程的区分  
945 - return paramObj.getUpNormalLc();  
946 - }  
947 - } else {  
948 - if (bcType == "in") {  
949 - return paramObj.getDownInLc();  
950 - } else if (bcType == "out") {  
951 - return paramObj.getDownOutLc();  
952 - } else {  
953 - // 基本班次类型,暂时不考虑区间等其他班次类型  
954 - // 暂时不考虑高峰低谷里程的区分  
955 - return paramObj.getDownNormalLc();  
956 - }  
957 - }  
958 - },  
959 -  
960 - /**  
961 - * 计算高峰周转时间。  
962 - * @returns 周转时间  
963 - */  
964 - calcuPeakZzsj: function() {  
965 - _validInternal(); // 验证  
966 - var paramObj = this;  
967 -  
968 - // 使用早高峰的周转时间  
969 - var _time = paramObj.getMPeakStartTimeObj();  
970 - var _zzsj = // 早高峰上行行驶时间+停站时间+早高峰下行行驶时间+停站时间  
971 - this.calcuTravelTime(_time, true) +  
972 - this.calcuFixedStopNumber(_time, true) +  
973 - this.calcuTravelTime(_time, false) +  
974 - this.calcuFixedStopNumber(_time, false);  
975 - return _zzsj;  
976 - },  
977 -  
978 - /**  
979 - * 计算低谷周转时间。  
980 - * @returns 周转时间  
981 - */  
982 - calcuTroughZzsj: function() {  
983 - _validInternal(); // 验证  
984 - var paramObj = this;  
985 -  
986 - // 使用低谷的周转时间  
987 - var _time = this.addMinute(paramObj.getMPeakStartTimeObj(), -1); // 使用任意一个低谷时间  
988 - var _zzsj = // 低谷上行行驶时间+停站时间+低谷下行行驶时间+停站时间  
989 - this.calcuTravelTime(_time, true) +  
990 - this.calcuFixedStopNumber(_time, true) +  
991 - this.calcuTravelTime(_time, false) +  
992 - this.calcuFixedStopNumber(_time, false);  
993 -  
994 - return _zzsj;  
995 - },  
996 -  
997 - /**  
998 - * 计算车辆总数。  
999 - * @returns 车辆数  
1000 - */  
1001 - calcuClzx: function() {  
1002 - _validInternal(); // 验证  
1003 - var paramObj = this;  
1004 -  
1005 - // 使用早高峰平均间隔  
1006 - var _fcjx_avg = Math.floor((paramObj.getMPeakMinFcjx() + paramObj.getMPeakMaxFcjx()) / 2);  
1007 - return Math.round(this.calcuPeakZzsj() / _fcjx_avg);  
1008 - }  
1009 -  
1010 - }; 1 +/**
  2 + * 参数对象。
  3 + *
  4 + * @constructor
  5 + */
  6 +var ParameterObj = function() {
  7 + // 内部保存的form参数及其他参数
  8 + var _formMap;
  9 + var _dataMap;
  10 + var _validInternal = function() {
  11 + if (!_formMap) {
  12 + alert("formMap为空!");
  13 + throw "formMap为空!";
  14 + }
  15 + if (!_dataMap) {
  16 + alert("dataMap为空!");
  17 + throw "dataMap为空!";
  18 + }
  19 + };
  20 +
  21 + // 计算行驶时间对象
  22 + var _travelTimeObj_fun = function() {
  23 + var upMoningPeakTravelTime =
  24 + isNaN(_formMap.earlyUpTime) || parseInt(_formMap.earlyUpTime) == 0 ?
  25 + parseInt(_formMap.upTravelTime) :
  26 + parseInt(_formMap.earlyUpTime);
  27 + var downMoningPeakTravelTime =
  28 + isNaN(_formMap.earlyDownTime) || parseInt(_formMap.earlyDownTime) == 0 ?
  29 + parseInt(_formMap.downTravelTime) :
  30 + parseInt(_formMap.earlyDownTime);
  31 + var upEveningPeakTravelTime =
  32 + isNaN(_formMap.lateUpTime) || parseInt(_formMap.lateUpTime) == 0 ?
  33 + parseInt(_formMap.upTravelTime) :
  34 + parseInt(_formMap.lateUpTime);
  35 + var downEveningPeakTravelTime =
  36 + isNaN(_formMap.lateDownTime) || parseInt(_formMap.lateDownTime) == 0 ?
  37 + parseInt(_formMap.downTravelTime) :
  38 + parseInt(_formMap.lateDownTime);
  39 + var upTroughTravelTime =
  40 + isNaN(_formMap.troughUpTime) || parseInt(_formMap.troughUpTime) == 0 ?
  41 + parseInt(_formMap.upTravelTime) :
  42 + parseInt(_formMap.troughUpTime);
  43 + var downTroughTravelTime =
  44 + isNaN(_formMap.troughDownTime) || parseInt(_formMap.troughDownTime) == 0 ?
  45 + parseInt(_formMap.downTravelTime) :
  46 + parseInt(_formMap.troughDownTime);
  47 +
  48 + return { // TODO:暂时获取标准信息,之后改成历史数据,可能需要使用promise封装
  49 + "moningpeak": [
  50 + upMoningPeakTravelTime,
  51 + downMoningPeakTravelTime
  52 + ],
  53 + "eveningpeak": [
  54 + upEveningPeakTravelTime,
  55 + downEveningPeakTravelTime
  56 + ],
  57 + "trough": [
  58 + upTroughTravelTime,
  59 + downTroughTravelTime
  60 + ]
  61 + }
  62 + };
  63 + var _travelTimeObj;
  64 +
  65 + // 计算行驶里程对象
  66 + var _travelLcObj_fun = function() {
  67 + return [
  68 + { // 上行里程
  69 + "normalLc": isNaN(_formMap.upMileage) ? 0 : parseFloat(_formMap.upMileage),
  70 + "inLc": isNaN(_formMap.upInMileage) ? 0 : parseFloat(_formMap.upInMileage),
  71 + "outLc": isNaN(_formMap.upOutMileage) ? 0 : parseFloat(_formMap.upOutMileage)
  72 + },
  73 + { // 下行里程
  74 + "normalLc": isNaN(_formMap.downMileage) ? 0 : parseFloat(_formMap.downMileage),
  75 + "inLc": isNaN(_formMap.downInMileage) ? 0 : parseFloat(_formMap.downInMileage),
  76 + "outLc": isNaN(_formMap.downOutMileage) ? 0 : parseFloat(_formMap.downOutMileage)
  77 + }
  78 + ];
  79 + };
  80 + var _travelLcObj;
  81 +
  82 + // 计算首班车,末班车行驶时间字符串
  83 + var _firstLastDepartureTimeStrObj_fun = function() {
  84 + return {
  85 + up: { // 上行
  86 + firstVehicleDepartureTimeStr: _formMap.startStationFirstTime,
  87 + lastVehicleDepartureTimeStr: _formMap.startStationEndTime
  88 + },
  89 + down: { // 下行
  90 + firstVehicleDepartureTimeStr: _formMap.endStationFirstTime,
  91 + lastVehicleDepartureTimeStr: _formMap.endStationEndTime
  92 + }
  93 + };
  94 + };
  95 + var _firstLastDepartureTimeStrObj;
  96 +
  97 + // 计算时间段划分对象
  98 + var _timeIntervalObj_fun = function() {
  99 + return {
  100 + moningPeakTimeStrs: {
  101 + start: _formMap.earlyStartTime,
  102 + end: _formMap.earlyEndTime
  103 + },
  104 + eveningPeakTimeStrs: {
  105 + start: _formMap.lateStartTime,
  106 + end: _formMap.lateEndTime
  107 + }
  108 +
  109 + // TODO:其他时间段以后再加
  110 + };
  111 + };
  112 + var _timeIntervalObj;
  113 +
  114 + // 计算各个时段的发车间隙
  115 + var _fcjxIntervalObj_fun = function() {
  116 + var _rtn = {
  117 + mpeakfcjx : {}, // 早高峰
  118 + epeakfcjx : {}, // 晚高峰
  119 + troughfcjx: {} //低谷
  120 + };
  121 + var _fcjx = [];
  122 + var i = 0;
  123 +
  124 + // TODO:这里只有3个间隔,以后加其他的
  125 + // 1、早高峰间隙
  126 + // 2、晚高峰间隙
  127 + // 3、低谷
  128 +
  129 + _rtn.mpeakfcjx.min = parseInt(_formMap.zgffcjxmin);
  130 + _rtn.mpeakfcjx.max = parseInt(_formMap.zgffcjxmax);
  131 +
  132 + _rtn.epeakfcjx.min = parseInt(_formMap.wffcjxmin);
  133 + _rtn.epeakfcjx.max = parseInt(_formMap.wffcjxmax);
  134 +
  135 + _rtn.troughfcjx.min = parseInt(_formMap.dgfcjxmin);
  136 + _rtn.troughfcjx.max = parseInt(_formMap.dgfcjxmax);
  137 +
  138 + // 做一些逻辑检查
  139 + if (_rtn.mpeakfcjx.min > _rtn.mpeakfcjx.max) {
  140 + alert("早高峰最小间隔大于最大间隔");
  141 + throw "早高峰最小间隔大于最大间隔";
  142 + }
  143 + if (_rtn.epeakfcjx.min > _rtn.epeakfcjx.max) {
  144 + alert("晚高峰最小间隔大于最大间隔");
  145 + throw "晚高峰最小间隔大于最大间隔";
  146 + }
  147 + if (_rtn.troughfcjx.min > _rtn.troughfcjx.max) {
  148 + alert("低谷最小间隔大于最大间隔");
  149 + throw "低谷最小间隔大于最大间隔";
  150 + }
  151 +
  152 +
  153 + return _rtn;
  154 + };
  155 + var _fcjxIntervalObj;
  156 +
  157 + // 获取停站类型
  158 + var _stopTypeObj_fun = function() {
  159 + var isMasterStop = false; // 是否主站停
  160 + var isMasterUpStop = false; // 主站停是否上行站点
  161 + if (_formMap) {
  162 + var fm_temp = _formMap.stt.split("/");
  163 + if (fm_temp.length == 1) { // 双向停站
  164 + isMasterStop = false;
  165 + } else {
  166 + isMasterStop = true;
  167 + if (fm_temp[1] == "0") {
  168 + isMasterUpStop = true;
  169 + } else {
  170 + isMasterUpStop = false;
  171 + }
  172 + }
  173 + } else {
  174 + throw "停站类型没有选择!";
  175 + }
  176 +
  177 + return {
  178 + isMasterStop: isMasterStop,
  179 + isMasterUpStop: isMasterUpStop
  180 + }
  181 + };
  182 + var _stopTypeObj;
  183 +
  184 + // 计算线路对象
  185 + var _xlObj_fun = function() {
  186 + return { // TODO:其他属性再议
  187 + xl: {
  188 + id: _formMap.lineName.split('_')[0]
  189 + }
  190 + };
  191 + };
  192 + var _xlObj;
  193 +
  194 + // 计算停车场对象
  195 + var _parkObj_fun = function() {
  196 + return { // TODO:其他属性再议
  197 + park: {
  198 + id: _formMap.tcc_id
  199 + }
  200 + };
  201 + };
  202 + var _parkObj;
  203 +
  204 + // 计算时刻表对象
  205 + var _ttInfoObj_fun = function() {
  206 + return { // TODO:其他属性再议
  207 + ttinfo: {
  208 + id: _formMap.skbName
  209 + }
  210 + };
  211 + };
  212 + var _ttInfoObj;
  213 +
  214 + // 计算起点站终点站对象
  215 + var _startEndStopObj_fun = function() {
  216 + return { // TODO:其他属性再议
  217 + up: {
  218 + qdz: { // 起点站
  219 + id: _dataMap.qdzArr[0]
  220 + },
  221 + zdz: { // 终点站
  222 + id: _dataMap.zdzArr[0]
  223 + }
  224 + },
  225 + down: {
  226 + qdz: { // 起点站
  227 + id: _dataMap.qdzArr[1]
  228 + },
  229 + zdz: { // 终点站
  230 + id: _dataMap.zdzArr[1]
  231 + }
  232 + }
  233 +
  234 + };
  235 + };
  236 + var _startEndStopObj;
  237 +
  238 + var date_wrap_prefix = "2000-01-01 "; // 包装日期的前缀
  239 + var date_wrap_format = "YYYY-MM-DD HH:mm"; // 日期格式
  240 + /**
  241 + * 将时间包装成日期,方便计算。
  242 + * @param timeStr 时间格式,如 06:30
  243 + * @returns moment对象
  244 + */
  245 + var _wrapTimeFun = function(timeStr) {
  246 + return moment(
  247 + date_wrap_prefix + timeStr,
  248 + date_wrap_format
  249 + );
  250 + };
  251 + /**
  252 + * 添加时间(注意,返回一个新的moment对象,此方法是immutable)
  253 + * @param timeObj moment 对象
  254 + * @param time 时间
  255 + * @param type 时间单位
  256 + * @returns 重新创建一个moment返回
  257 + */
  258 + var _addTimeFun = function(timeObj, time, type) {
  259 + var _timeObj = moment(timeObj); // clone
  260 + _timeObj.add(time, type);
  261 + return _timeObj;
  262 + };
  263 +
  264 + return {
  265 +
  266 + /**
  267 + * 包装外部参数。
  268 + * @param formMap
  269 + * @param dataMap
  270 + */
  271 + wrap: function(formMap, dataMap) {
  272 + _formMap = formMap;
  273 + _dataMap = dataMap;
  274 +
  275 + _validInternal(); // 验证
  276 +
  277 + // 首班车,末班车行驶时间字符串
  278 + _firstLastDepartureTimeStrObj = _firstLastDepartureTimeStrObj_fun();
  279 + // 行驶时间对象
  280 + _travelTimeObj = _travelTimeObj_fun();
  281 + // 行驶里程对象
  282 + _travelLcObj = _travelLcObj_fun();
  283 + // 时间段划分对象
  284 + _timeIntervalObj = _timeIntervalObj_fun();
  285 + // 各个时段的发车间隙
  286 + _fcjxIntervalObj = _fcjxIntervalObj_fun();
  287 + // 停站类型
  288 + _stopTypeObj = _stopTypeObj_fun();
  289 + // 线路对象
  290 + _xlObj = _xlObj_fun();
  291 + // 停车场对象
  292 + _parkObj = _parkObj_fun();
  293 + // 时刻表对象
  294 + _ttInfoObj = _ttInfoObj_fun();
  295 + // 起点站终点站对象
  296 + _startEndStopObj = _startEndStopObj_fun();
  297 +
  298 + // TODO:其他再议
  299 +
  300 + },
  301 +
  302 + //------------ 获取首班末班时间 ------------//
  303 + /**
  304 + * 获取上行首班时间对象。
  305 + * @param sobj 策略对象(HeadwayObj)
  306 + * @return moment obj
  307 + */
  308 + getUpFirstDTimeObj: function() {
  309 + _validInternal(); // 验证
  310 + return this.toTimeObj(
  311 + _firstLastDepartureTimeStrObj.up.firstVehicleDepartureTimeStr
  312 + );
  313 + },
  314 + /**
  315 + * 获取上行末班时间对象。
  316 + * @return moment obj
  317 + */
  318 + getUpLastDtimeObj: function() {
  319 + _validInternal(); // 验证
  320 + return this.toTimeObj(
  321 + _firstLastDepartureTimeStrObj.up.lastVehicleDepartureTimeStr
  322 + );
  323 + },
  324 + /**
  325 + * 获取下行首班时间对象。
  326 + * @return moment obj
  327 + */
  328 + getDownFirstDTimeObj: function() {
  329 + _validInternal(); // 验证
  330 + return this.toTimeObj(
  331 + _firstLastDepartureTimeStrObj.down.firstVehicleDepartureTimeStr
  332 + );
  333 + },
  334 + /**
  335 + * 获取下行末班时间对象。
  336 + * @return moment obj
  337 + */
  338 + getDownLastDTimeObj: function() {
  339 + _validInternal(); // 验证
  340 + return this.toTimeObj(
  341 + _firstLastDepartureTimeStrObj.down.lastVehicleDepartureTimeStr
  342 + );
  343 + },
  344 +
  345 + //-------------- 获取行驶时间 ----------------//
  346 + /**
  347 + * 获取上行早高峰行驶时间。
  348 + * @returns int number
  349 + */
  350 + getUpMPeakTime: function() {
  351 + _validInternal(); // 验证
  352 + return _travelTimeObj.moningpeak[0];
  353 + },
  354 + /**
  355 + * 获取上行晚高峰行驶时间。
  356 + * @returns int number
  357 + */
  358 + getUpEPeakTime: function() {
  359 + _validInternal(); // 验证
  360 + return _travelTimeObj.eveningpeak[0];
  361 + },
  362 + /**
  363 + * 获取上行低谷行驶时间。
  364 + * @returns int number
  365 + */
  366 + getUpTroughTime: function() {
  367 + _validInternal(); // 验证
  368 + return _travelTimeObj.trough[0];
  369 + },
  370 + /**
  371 + * 获取下行早高峰行驶时间。
  372 + * @returns int number
  373 + */
  374 + getDownMPeakTime: function() {
  375 + _validInternal(); // 验证
  376 + return _travelTimeObj.moningpeak[1];
  377 + },
  378 + /**
  379 + * 获取下行晚高峰行驶时间。
  380 + * @returns int number
  381 + */
  382 + getDownEPeakTime: function() {
  383 + _validInternal(); // 验证
  384 + return _travelTimeObj.eveningpeak[1];
  385 + },
  386 + /**
  387 + * 获取下行低谷行驶时间。
  388 + * @returns int number
  389 + */
  390 + getDownTroughTime: function() {
  391 + _validInternal(); // 验证
  392 + return _travelTimeObj.trough[1];
  393 + },
  394 +
  395 + //---------------- 获取行驶里程 -----------------//
  396 + /**
  397 + * 获取上行normal班次里程。
  398 + * @returns number
  399 + */
  400 + getUpNormalLc: function() {
  401 + _validInternal(); // 验证
  402 + return _travelLcObj[0].normalLc;
  403 + },
  404 + /**
  405 + * 获取上行进场班次类型。
  406 + * @returns number
  407 + */
  408 + getUpInLc: function() {
  409 + _validInternal(); // 验证
  410 + return _travelLcObj[0].inLc;
  411 + },
  412 + /**
  413 + * 获取上行出场班次类型。
  414 + * @returns number
  415 + */
  416 + getUpOutLc: function() {
  417 + _validInternal(); // 验证
  418 + return _travelLcObj[0].outLc;
  419 + },
  420 + /**
  421 + * 获取下行normal班次类型。
  422 + * @returns number
  423 + */
  424 + getDownNormalLc: function() {
  425 + _validInternal(); // 验证
  426 + return _travelLcObj[1].normalLc;
  427 + },
  428 + /**
  429 + * 获取下行进场班次类型。
  430 + * @returns number
  431 + */
  432 + getDownInLc: function() {
  433 + _validInternal(); // 验证
  434 + return _travelLcObj[1].inLc;
  435 + },
  436 + /**
  437 + * 获取下行出场班次类型。
  438 + * @returns number
  439 + */
  440 + getDownOutLc: function() {
  441 + _validInternal(); // 验证
  442 + return _travelLcObj[1].outLc;
  443 + },
  444 +
  445 + //---------------- 获取时间段信息 --------------//
  446 + /**
  447 + * 获取早高峰开始时间对象。
  448 + * @returns moment obj
  449 + */
  450 + getMPeakStartTimeObj: function() {
  451 + _validInternal(); // 验证
  452 + return this.toTimeObj(
  453 + _timeIntervalObj.moningPeakTimeStrs.start
  454 + );
  455 + },
  456 + /**
  457 + * 获取早高峰结束时间对象。
  458 + * @returns moment obj
  459 + */
  460 + getMPeakEndTimeObj: function() {
  461 + _validInternal(); // 验证
  462 + return this.toTimeObj(
  463 + _timeIntervalObj.moningPeakTimeStrs.end
  464 + );
  465 + },
  466 + /**
  467 + * 获取晚高峰开始时间对象。
  468 + * @returns moment obj
  469 + */
  470 + getEPeakStartTimeObj: function() {
  471 + _validInternal(); // 验证
  472 + return this.toTimeObj(
  473 + _timeIntervalObj.eveningPeakTimeStrs.start
  474 + );
  475 + },
  476 + /**
  477 + * 获取晚高峰结束时间对象。
  478 + * @returns moment obj
  479 + */
  480 + getEPeakEndTimeObj: function() {
  481 + _validInternal(); // 验证
  482 + return this.toTimeObj(
  483 + _timeIntervalObj.eveningPeakTimeStrs.end
  484 + );
  485 + },
  486 +
  487 + //----------------- 获取发车间隙(TODO:以后通过客流估算)-----------------//
  488 + /**
  489 + * 获取早高峰最小发车间隙。
  490 + * @returns int
  491 + */
  492 + getMPeakMinFcjx: function() {
  493 + _validInternal(); // 验证
  494 + return _fcjxIntervalObj.mpeakfcjx.min;
  495 + },
  496 + /**
  497 + * 获取早高峰最大发车间隙。
  498 + * @returns int
  499 + */
  500 + getMPeakMaxFcjx: function() {
  501 + _validInternal(); // 验证
  502 + return _fcjxIntervalObj.mpeakfcjx.max;
  503 + },
  504 + /**
  505 + * 获取晚高峰最小发车间隙。
  506 + * @returns int
  507 + */
  508 + getEPeakMinFcjx: function() {
  509 + _validInternal(); // 验证
  510 + return _fcjxIntervalObj.epeakfcjx.min;
  511 + },
  512 + /**
  513 + * 获取晚高峰最小发车间隙。
  514 + * @returns int
  515 + */
  516 + getEPeakMaxFcjx: function() {
  517 + _validInternal(); // 验证
  518 + return _fcjxIntervalObj.epeakfcjx.max;
  519 + },
  520 + /**
  521 + * 获取低谷最小发车间隙。
  522 + * @returns int
  523 + */
  524 + getTroughMinFcjx: function() {
  525 + _validInternal(); // 验证
  526 + return _fcjxIntervalObj.troughfcjx.min;
  527 + },
  528 + /**
  529 + * 获取低谷最大发车间隙。
  530 + * @returns int
  531 + */
  532 + getTroughMaxFcjx: function() {
  533 + _validInternal(); // 验证
  534 + return _fcjxIntervalObj.troughfcjx.max;
  535 + },
  536 +
  537 + //----------------- 获取停站方式 -------------------//
  538 + /**
  539 + * 是否双向停站。
  540 + * @returns {boolean}
  541 + */
  542 + isTwoWayStop: function() {
  543 + _validInternal(); // 验证
  544 + return !_stopTypeObj.isMasterStop;
  545 + },
  546 + /**
  547 + * 是否上行单向停站。
  548 + * @returns {boolean}
  549 + */
  550 + isUpOneWayStop: function() {
  551 + _validInternal(); // 验证
  552 + return _stopTypeObj.isMasterStop && _stopTypeObj.isMasterUpStop;
  553 + },
  554 + /**
  555 + * 是否下行单向停站。
  556 + * @returns {boolean}
  557 + */
  558 + isDownOneWayStop: function() {
  559 + _validInternal(); // 验证
  560 + return _stopTypeObj.isMasterStop && (!_stopTypeObj.isMasterUpStop);
  561 + },
  562 +
  563 + //----------------- 获取高峰配车数、加班路牌数 ----------------//
  564 + /**
  565 + * 获取高峰建议配车数(TODO:参照一下)。
  566 + * @returns {Number|*}
  567 + */
  568 + getAdvicePeakClzs: function() {
  569 + _validInternal(); // 验证
  570 + return parseInt(_formMap.gfjypcs);
  571 + },
  572 + /**
  573 + * 获取加班路牌数(5休2路牌的个数)。
  574 + * @returns {Number|*}
  575 + */
  576 + getJBLpes: function() {
  577 + _validInternal(); // 验证
  578 + return parseInt(_formMap.jbclcount);
  579 + },
  580 +
  581 + //----------------- 获取关联数据信息 -----------------//
  582 + /**
  583 + * 获取线路id。
  584 + */
  585 + getXlId: function() {
  586 + _validInternal(); // 验证
  587 + return _xlObj.xl.id;
  588 + },
  589 + /**
  590 + * 获取停车场id。
  591 + */
  592 + getTccId: function() {
  593 + _validInternal(); // 验证
  594 + return _parkObj.park.id;
  595 + },
  596 + /**
  597 + * 获取时刻表id。
  598 + */
  599 + getTTinfoId: function() {
  600 + _validInternal(); // 验证
  601 + return _ttInfoObj.ttinfo.id;
  602 + },
  603 + /**
  604 + * 获取上行起点站对象。
  605 + * @returns {{id: *}}
  606 + */
  607 + getUpQdzObj: function() {
  608 + _validInternal(); // 验证
  609 + return {
  610 + id: _startEndStopObj.up.qdz.id
  611 + };
  612 + },
  613 + /**
  614 + * 获取上行终点站对象。
  615 + * @returns {{id: *}}
  616 + */
  617 + getUpZdzObj: function() {
  618 + _validInternal(); // 验证
  619 + return {
  620 + id: _startEndStopObj.up.zdz.id
  621 + };
  622 + },
  623 + /**
  624 + * 获取下行起点站对象。
  625 + * @returns {{id: *}}
  626 + */
  627 + getDownQdzObj: function() {
  628 + _validInternal(); // 验证
  629 + return {
  630 + id: _startEndStopObj.down.qdz.id
  631 + };
  632 + },
  633 + /**
  634 + * 获取下行终点站对象。
  635 + * @returns {{id: *}}
  636 + */
  637 + getDownZdzObj: function() {
  638 + _validInternal(); // 验证
  639 + return {
  640 + id: _startEndStopObj.down.zdz.id
  641 + };
  642 + },
  643 +
  644 + //-------------- 时间操作 ------------//
  645 + /**
  646 + * 通过字符串创建时间对象。
  647 + * @param timeStr 时间字符串
  648 + * @returns {moment对象}
  649 + */
  650 + toTimeObj: function(timeStr) {
  651 + _validInternal(); // 验证
  652 + return _wrapTimeFun(timeStr);
  653 + },
  654 + /**
  655 + * 增加分钟。
  656 + * @param timeObj 时间对象
  657 + * @param minute 分钟
  658 + * @returns {重新创建一个moment返回}
  659 + */
  660 + addMinute: function(timeObj, minute) {
  661 + _validInternal(); // 验证
  662 + return _addTimeFun(timeObj, minute, "m");
  663 + },
  664 +
  665 + //-------------- 时间业务操作 ------------//
  666 + /**
  667 + * 判定某个班次是否是早高峰班次。
  668 + * @param timeObj 班次时间
  669 + * @returns true false
  670 + */
  671 + isMPeakBc: function(timeObj) {
  672 + _validInternal(); // 验证
  673 + var paramObj = this;
  674 + // 早高峰开始时间
  675 + var st = paramObj.getMPeakStartTimeObj();
  676 + // 早高峰结束时间
  677 + var et = paramObj.getMPeakEndTimeObj();
  678 + // 包装日期
  679 + return timeObj.isBetween(st, et, null, "[]");
  680 + },
  681 + /**
  682 + * 判定某个班次是否是晚高峰班次。
  683 + * @param timeObj 班次时间
  684 + * @returns true false
  685 + */
  686 + isEPeakBc: function(timeObj) {
  687 + _validInternal(); // 验证
  688 + var paramObj = this;
  689 + // 晚高峰开始时间
  690 + var st = paramObj.getEPeakStartTimeObj();
  691 + // 晚高峰结束时间
  692 + var et = paramObj.getEPeakEndTimeObj();
  693 + // 包装日期
  694 + return timeObj.isBetween(st, et, null, "[]");
  695 + },
  696 + /**
  697 + * 判定某个班次是否是低谷班次。
  698 + * @param timeObj 班次时间
  699 + * @returns true false
  700 + */
  701 + isTroughBc: function(timeObj) {
  702 + _validInternal(); // 验证
  703 + var paramObj = this;
  704 + return (
  705 + !this.isMPeakBc(timeObj) &&
  706 + !this.isEPeakBc(timeObj)
  707 + );
  708 + },
  709 + /**
  710 + * 判定某个低谷班次是否在早高峰开始之前。
  711 + * @param timeObj 班次时间
  712 + * @returns true false
  713 + */
  714 + isTroughBeforMPeakStartBc: function(timeObj) {
  715 + _validInternal(); // 验证
  716 + var paramObj = this;
  717 + // 早高峰开始时间
  718 + var st = paramObj.getMPeakStartTimeObj();
  719 + // 包装日期
  720 + return timeObj.isBefore(st);
  721 + },
  722 + /**
  723 + * 判定某个低谷班次是否在晚高峰结束之后。
  724 + * @param timeObj 班次时间
  725 + * @returns true false
  726 + */
  727 + isTroughAfterEPeakEndBc: function(timeObj) {
  728 + _validInternal(); // 验证
  729 + var paramObj = this;
  730 + // 晚高峰结束时间
  731 + var et = paramObj.getEPeakEndTimeObj();
  732 + // 包装日期
  733 + return timeObj.isAfter(et);
  734 + },
  735 +
  736 + /**
  737 + * 获取固定的停站时间(固定停站时间都是选的最大值)
  738 + * @param timeObj 时间对象
  739 + * @param isUp 是否上行
  740 + * @returns number
  741 + */
  742 + calcuFixedStopNumber: function(timeObj, isUp) {
  743 + _validInternal(); // 验证
  744 + var paramObj = this;
  745 +
  746 + var peakStopTime; // 高峰停站时间
  747 + var troughStopTime; // 低谷停站时间
  748 + var secondaryStopTime; // 副站停站时间
  749 +
  750 + // 双向停站
  751 + if (paramObj.isTwoWayStop()) {
  752 + if (isUp) { // 上行
  753 + if (this.isMPeakBc(timeObj)) { // 早高峰
  754 + peakStopTime = Math.floor(paramObj.getUpMPeakTime() * 0.1); // 行驶时间的10%
  755 + if (peakStopTime < 3) { // 不少于3分钟
  756 + peakStopTime = 3;
  757 + }
  758 + return peakStopTime;
  759 + } else if (this.isEPeakBc(timeObj)) { // 晚高峰
  760 + peakStopTime = Math.floor(paramObj.getUpEPeakTime() * 0.1); // 行驶时间的10%
  761 + if (peakStopTime < 3) { // 不少于3分钟
  762 + peakStopTime = 3;
  763 + }
  764 + return peakStopTime;
  765 + } else { // 低谷
  766 + if (this.isTroughBeforMPeakStartBc(timeObj)) { // 早高峰开始前
  767 + troughStopTime = Math.floor(paramObj.getUpTroughTime() * 0.2); // 行驶时间20%
  768 + if (troughStopTime < 10) { // 不少于10分钟
  769 + troughStopTime = 10;
  770 + }
  771 + return troughStopTime;
  772 + } else if (this.isTroughAfterEPeakEndBc(timeObj)) { // 晚高峰结束后
  773 + troughStopTime = Math.floor(paramObj.getUpTroughTime() * 0.2); // 行驶时间20%
  774 + if (troughStopTime < 10) { // 不少于10分钟
  775 + troughStopTime = 10;
  776 + }
  777 + return troughStopTime;
  778 + } else { // 早高峰,晚高峰之间
  779 + troughStopTime = Math.floor(paramObj.getUpTroughTime() * 0.15); // 行驶时间15%
  780 + if (troughStopTime < 10) { // 不少于10分钟
  781 + troughStopTime = 10;
  782 + }
  783 + return troughStopTime;
  784 + }
  785 + }
  786 + } else { // 下行
  787 + if (this.isMPeakBc(timeObj)) { // 早高峰
  788 + peakStopTime = Math.floor(paramObj.getDownMPeakTime() * 0.1); // 行驶时间的10%
  789 + if (peakStopTime < 3) { // 不少于3分钟
  790 + peakStopTime = 3;
  791 + }
  792 + return peakStopTime;
  793 + } else if (this.isEPeakBc(timeObj)) { // 晚高峰
  794 + peakStopTime = Math.floor(paramObj.getDownEPeakTime() * 0.1); // 行驶时间的10%
  795 + if (peakStopTime < 3) { // 不少于3分钟
  796 + peakStopTime = 3;
  797 + }
  798 + return peakStopTime;
  799 + } else { // 低谷
  800 + if (this.isTroughBeforMPeakStartBc(timeObj)) { // 早高峰开始前
  801 + troughStopTime = Math.floor(paramObj.getDownTroughTime() * 0.2); // 行驶时间20%
  802 + if (troughStopTime < 10) { // 不少于10分钟
  803 + troughStopTime = 10;
  804 + }
  805 + return troughStopTime;
  806 + } else if (this.isTroughAfterEPeakEndBc(timeObj)) { // 晚高峰结束后
  807 + troughStopTime = Math.floor(paramObj.getDownTroughTime() * 0.2); // 行驶时间20%
  808 + if (troughStopTime < 10) { // 不少于10分钟
  809 + troughStopTime = 10;
  810 + }
  811 + return troughStopTime;
  812 + } else { // 早高峰,晚高峰之间
  813 + troughStopTime = Math.floor(paramObj.getDownTroughTime() * 0.15); // 行驶时间15%
  814 + if (troughStopTime < 10) { // 不少于10分钟
  815 + troughStopTime = 10;
  816 + }
  817 + return troughStopTime;
  818 + }
  819 + }
  820 + }
  821 + } else { // 主站停站
  822 + if (isUp == paramObj.isUpOneWayStop()) {
  823 + if (isUp) { // 上行
  824 + if (this.isMPeakBc(timeObj)) { // 早高峰
  825 + peakStopTime = Math.floor(paramObj.getUpMPeakTime() * 0.1); // 行驶时间的10%
  826 + if (peakStopTime < 3) { // 不少于3分钟
  827 + peakStopTime = 3;
  828 + }
  829 + return peakStopTime;
  830 + } else if (this.isEPeakBc(timeObj)) { // 晚高峰
  831 + peakStopTime = Math.floor(paramObj.getUpEPeakTime() * 0.1); // 行驶时间的10%
  832 + if (peakStopTime < 3) { // 不少于3分钟
  833 + peakStopTime = 3;
  834 + }
  835 + return peakStopTime;
  836 + } else { // 低谷
  837 + if (this.isTroughBeforMPeakStartBc(timeObj)) { // 早高峰开始前
  838 + troughStopTime = Math.floor(paramObj.getUpTroughTime() * 0.2); // 行驶时间20%
  839 + if (troughStopTime < 10) { // 不少于10分钟
  840 + troughStopTime = 10;
  841 + }
  842 + return troughStopTime;
  843 + } else if (this.isTroughAfterEPeakEndBc(timeObj)) { // 晚高峰结束后
  844 + troughStopTime = Math.floor(paramObj.getUpTroughTime() * 0.2); // 行驶时间20%
  845 + if (troughStopTime < 10) { // 不少于10分钟
  846 + troughStopTime = 10;
  847 + }
  848 + return troughStopTime;
  849 + } else { // 早高峰,晚高峰之间
  850 + troughStopTime = Math.floor(paramObj.getUpTroughTime() * 0.15); // 行驶时间15%
  851 + if (troughStopTime < 10) { // 不少于10分钟
  852 + troughStopTime = 10;
  853 + }
  854 + return troughStopTime;
  855 + }
  856 + }
  857 + } else { // 下行
  858 + if (this.isMPeakBc(timeObj)) { // 早高峰
  859 + peakStopTime = Math.floor(paramObj.getDownMPeakTime() * 0.1); // 行驶时间的10%
  860 + if (peakStopTime < 3) { // 不少于3分钟
  861 + peakStopTime = 3;
  862 + }
  863 + return peakStopTime;
  864 + } else if (this.isEPeakBc(timeObj)) { // 晚高峰
  865 + peakStopTime = Math.floor(paramObj.getDownEPeakTime() * 0.1); // 行驶时间的10%
  866 + if (peakStopTime < 3) { // 不少于3分钟
  867 + peakStopTime = 3;
  868 + }
  869 + return peakStopTime;
  870 + } else { // 低谷
  871 + if (this.isTroughBeforMPeakStartBc(timeObj)) { // 早高峰开始前
  872 + troughStopTime = Math.floor(paramObj.getDownTroughTime() * 0.2); // 行驶时间20%
  873 + if (troughStopTime < 10) { // 不少于10分钟
  874 + troughStopTime = 10;
  875 + }
  876 + return troughStopTime;
  877 + } else if (this.isTroughAfterEPeakEndBc(timeObj)) { // 晚高峰结束后
  878 + troughStopTime = Math.floor(paramObj.getDownTroughTime() * 0.2); // 行驶时间20%
  879 + if (troughStopTime < 10) { // 不少于10分钟
  880 + troughStopTime = 10;
  881 + }
  882 + return troughStopTime;
  883 + } else { // 早高峰,晚高峰之间
  884 + troughStopTime = Math.floor(paramObj.getDownTroughTime() * 0.15); // 行驶时间15%
  885 + if (troughStopTime < 10) { // 不少于10分钟
  886 + troughStopTime = 10;
  887 + }
  888 + return troughStopTime;
  889 + }
  890 + }
  891 + }
  892 + } else { // 副站停战,2到3分钟
  893 + secondaryStopTime = 3;
  894 + return secondaryStopTime; // 直接返回3分钟
  895 + }
  896 + }
  897 +
  898 + },
  899 +
  900 + /**
  901 + * 获取行驶时间。
  902 + * @param timeObj 班次时间字符串
  903 + * @param isUp 是否上行
  904 + */
  905 + calcuTravelTime: function(timeObj, isUp) {
  906 + _validInternal(); // 验证
  907 + var paramObj = this;
  908 +
  909 + if (isUp) {
  910 + if (this.isMPeakBc(timeObj)) {
  911 + return paramObj.getUpMPeakTime();
  912 + } else if (this.isEPeakBc(timeObj)) {
  913 + return paramObj.getUpEPeakTime();
  914 + } else {
  915 + return paramObj.getUpTroughTime();
  916 + }
  917 + } else {
  918 + if (this.isMPeakBc(timeObj)) {
  919 + return paramObj.getDownMPeakTime();
  920 + } else if (this.isEPeakBc(timeObj)) {
  921 + return paramObj.getDownEPeakTime();
  922 + } else {
  923 + return paramObj.getDownTroughTime();
  924 + }
  925 + }
  926 + },
  927 +
  928 + /**
  929 + * 获取行驶里程。
  930 + * @param isUp 是否上行
  931 + * @param bcType 班次类型
  932 + */
  933 + calcuTravelLcNumber: function(isUp, bcType) {
  934 + _validInternal(); // 验证
  935 + var paramObj = this;
  936 +
  937 + if (isUp) {
  938 + if (bcType == "in") {
  939 + return paramObj.getUpInLc();
  940 + } else if (bcType == "out") {
  941 + return paramObj.getUpOutLc();
  942 + } else {
  943 + // 基本班次类型,暂时不考虑区间等其他班次类型
  944 + // 暂时不考虑高峰低谷里程的区分
  945 + return paramObj.getUpNormalLc();
  946 + }
  947 + } else {
  948 + if (bcType == "in") {
  949 + return paramObj.getDownInLc();
  950 + } else if (bcType == "out") {
  951 + return paramObj.getDownOutLc();
  952 + } else {
  953 + // 基本班次类型,暂时不考虑区间等其他班次类型
  954 + // 暂时不考虑高峰低谷里程的区分
  955 + return paramObj.getDownNormalLc();
  956 + }
  957 + }
  958 + },
  959 +
  960 + /**
  961 + * 计算高峰周转时间。
  962 + * @returns 周转时间
  963 + */
  964 + calcuPeakZzsj: function() {
  965 + _validInternal(); // 验证
  966 + var paramObj = this;
  967 +
  968 + // 使用早高峰的周转时间
  969 + var _time = paramObj.getMPeakStartTimeObj();
  970 + var _zzsj = // 早高峰上行行驶时间+停站时间+早高峰下行行驶时间+停站时间
  971 + this.calcuTravelTime(_time, true) +
  972 + this.calcuFixedStopNumber(_time, true) +
  973 + this.calcuTravelTime(_time, false) +
  974 + this.calcuFixedStopNumber(_time, false);
  975 + return _zzsj;
  976 + },
  977 +
  978 + /**
  979 + * 计算低谷周转时间。
  980 + * @returns 周转时间
  981 + */
  982 + calcuTroughZzsj: function() {
  983 + _validInternal(); // 验证
  984 + var paramObj = this;
  985 +
  986 + // 使用低谷的周转时间
  987 + var _time = this.addMinute(paramObj.getMPeakStartTimeObj(), -1); // 使用任意一个低谷时间
  988 + var _zzsj = // 低谷上行行驶时间+停站时间+低谷下行行驶时间+停站时间
  989 + this.calcuTravelTime(_time, true) +
  990 + this.calcuFixedStopNumber(_time, true) +
  991 + this.calcuTravelTime(_time, false) +
  992 + this.calcuFixedStopNumber(_time, false);
  993 +
  994 + return _zzsj;
  995 + },
  996 +
  997 + /**
  998 + * 计算车辆总数。
  999 + * @returns 车辆数
  1000 + */
  1001 + calcuClzx: function() {
  1002 + _validInternal(); // 验证
  1003 + var paramObj = this;
  1004 +
  1005 + // 使用早高峰平均间隔
  1006 + var _fcjx_avg = Math.floor((paramObj.getMPeakMinFcjx() + paramObj.getMPeakMaxFcjx()) / 2);
  1007 + return Math.round(this.calcuPeakZzsj() / _fcjx_avg);
  1008 + }
  1009 +
  1010 + };
1011 }; 1011 };
1012 \ No newline at end of file 1012 \ No newline at end of file
src/main/resources/static/pages/base/timesmodel/js/v2/core/InternalBcObj.js
1 -/**  
2 - * 内部班次对象。  
3 - * @constructor  
4 - */  
5 -var InternalBcObj = function(  
6 - bcType, // 班次类型(normal,in,out等)  
7 - isUp, // boolean是否上下行  
8 - lp, // 路牌标识符  
9 - fcno, // 发车顺序号  
10 - fcTimeObj, // 发车时间对象  
11 - bclc, // 班次里程  
12 - bcsj, // 班次历时  
13 - arrtime, // 到达时间对象  
14 - stoptime, // 停站时间  
15 - tccid, // 停车场id  
16 - ttinfoid, // 时刻表id  
17 - xl, // 线路id  
18 - qdzid, // 起点站id  
19 - zdzid // 终点站id  
20 -) {  
21 - // 属性重新复制一遍,加前缀 _$_ 表示内部属性,不要直接访问k  
22 - // 外部函数使用 prototype 方式  
23 - this._$_bcType = bcType;  
24 - this._$_isUp = isUp;  
25 - this._$_lp = lp;  
26 - this._$_fcno = fcno;  
27 - this._$_fcsjObj = moment(fcTimeObj);  
28 - this._$_bclc = bclc;  
29 - this._$_bcsj = bcsj;  
30 - this._$_arrtime = arrtime;  
31 - this._$_stoptime = stoptime;  
32 - this._$_tccid = tccid;  
33 - this._$_ttinfoid = ttinfoid;  
34 - this._$_xlid = xl;  
35 - this._$_qdzid = qdzid;  
36 - this._$_zdzid = zdzid;  
37 -  
38 -};  
39 -  
40 -/**  
41 - * 设置路牌标号。  
42 - * @param lpNo  
43 - */  
44 -InternalBcObj.prototype.setLp = function(lpNo) {  
45 - this._$_lp = lpNo;  
46 -};  
47 -  
48 -/**  
49 - * 是否上行。  
50 - * @returns boolean  
51 - */  
52 -InternalBcObj.prototype.isUp = function() {  
53 - return this._$_isUp;  
54 -};  
55 -/**  
56 - * 获取发车时间。  
57 - * @returns {*|moment.Moment}  
58 - */  
59 -InternalBcObj.prototype.getFcTimeObj = function() {  
60 - return this._$_fcsjObj;  
61 -};  
62 -/**  
63 - * 获取到达时间。  
64 - * @returns {*|moment.Moment}  
65 - */  
66 -InternalBcObj.prototype.getArrTimeObj = function() {  
67 - return this._$_arrtime;  
68 -};  
69 -/**  
70 - * 获取班次时间。  
71 - * @returns int  
72 - */  
73 -InternalBcObj.prototype.getBcTime = function() {  
74 - return this._$_bcsj;  
75 -};  
76 -/**  
77 - * 获取停站时间。  
78 - * @returns int  
79 - */  
80 -InternalBcObj.prototype.getStopTime = function() {  
81 - return this._$_stoptime;  
82 -};  
83 -/**  
84 - * 转换成显示用班次对象。  
85 - * @returns {{}}  
86 - */  
87 -InternalBcObj.prototype.toGanttBcObj = function() {  
88 - var _bcObj = {  
89 - parent: this._$_lp,  
90 - lpNo: this._$_lp,  
91 - lp: null,  
92 - lpName: this._$_lp,  
93 - lpType: '普通路牌',  
94 - bcType: this._$_bcType,  
95 - fcno: this._$_fcno,  
96 - isfb: 0,  
97 - isSwitchXl: null,  
98 - bz: null  
99 - };  
100 -  
101 - // 线路上下行  
102 - _bcObj.xlDir = this._$_isUp ? "relationshipGraph-up" : "relationshipGraph-down";  
103 -  
104 - // 里程  
105 - _bcObj.jhlc = this._$_bclc;  
106 -  
107 - // 停车场  
108 - _bcObj.tcc = this._$_tccid;  
109 -  
110 - // 时刻表  
111 - _bcObj.ttinfo = this._$_ttinfoid;  
112 -  
113 - // 线路  
114 - _bcObj.xl = this._$_xlid;  
115 -  
116 - // 起点站、终点站  
117 - _bcObj.qdz = this._$_qdzid;  
118 - _bcObj.zdz = this._$_zdzid;  
119 -  
120 - // 发车时间,行驶时间,到达时间,停站时间  
121 - _bcObj.fcsj = this._$_fcsjObj.format("HH:mm");  
122 - _bcObj.bcsj = this._$_bcsj;  
123 - _bcObj.ARRIVALTIME = this._$_arrtime.format("HH:mm");  
124 - _bcObj.STOPTIME = this._$_stoptime;  
125 -  
126 - return _bcObj;  
127 -};  
128 - 1 +/**
  2 + * 内部班次对象。
  3 + * @param lpObj 内部路牌对象
  4 + * @param groupObj 内部圈对象
  5 + * @param otherParamObj 其他参数对象
  6 + * @constructor InternalBcObj
  7 + */
  8 +var InternalBcObj = function(
  9 + lpObj, // InternalLpObj路牌对象
  10 + otherParamObj // 班次其他参数对象
  11 +) {
  12 + // 简单验证
  13 + if (!lpObj) {
  14 + throw "new InternalBcObj 路牌对象为空";
  15 + }
  16 + if (!otherParamObj) {
  17 + throw "new InternalBcObj 其他参数对象为空"
  18 + }
  19 +
  20 + // 内部重要属性
  21 + this._$$_internal_lp_obj = lpObj; // 班次所属的路牌对象(横轴)
  22 + // 之后会设定
  23 + this._$$_internal_group_obj; // 班次所属的圈对象(纵轴)
  24 +
  25 + // 属性重新复制一遍,加前缀 _$_ 表示内部属性,不要直接访问k
  26 + // 外部函数使用 prototype 方式
  27 + this._$_bcType = otherParamObj.bcType; // 班次类型(normal,in,out等)
  28 + this._$_isUp = otherParamObj.isUp; // boolean是否上下行
  29 + this._$_fcno = otherParamObj.fcno; // 发车顺序号
  30 + this._$_fcsjObj = moment(otherParamObj.fcTimeObj); // 发车时间对象
  31 + this._$_bclc = otherParamObj.bclc; // 班次里程
  32 + this._$_bcsj = otherParamObj.bcsj; // 班次历时
  33 + this._$_arrtime = otherParamObj.arrtime; // 到达时间对象
  34 + this._$_stoptime = otherParamObj.stoptime; // 停站时间
  35 + this._$_tccid = otherParamObj.tccid; // 停车场id
  36 + this._$_ttinfoid = otherParamObj.ttinfoid; // 时刻表id
  37 + this._$_xlid = otherParamObj.xl; // 线路id
  38 + this._$_qdzid = otherParamObj.qdzid; // 起点站id
  39 + this._$_zdzid = otherParamObj.zdzid; // 终点站id
  40 +
  41 +};
  42 +
  43 +//------------------- get/set 方法 -------------------//
  44 +
  45 +/**
  46 + * 设置路牌对象。
  47 + * @param lpObj InternalLpObj路牌对象
  48 + */
  49 +InternalBcObj.prototype.setLp = function(lpObj) {
  50 + this._$$_internal_lp_obj = lpObj;
  51 +};
  52 +/**
  53 + * 设置圈对象。
  54 + * @param groupObj
  55 + */
  56 +InternalBcObj.prototype.setGroup = function(groupObj) {
  57 + this._$$_internal_group_obj = groupObj;
  58 +};
  59 +
  60 +/**
  61 + * 是否上行。
  62 + * @returns boolean
  63 + */
  64 +InternalBcObj.prototype.isUp = function() {
  65 + return this._$_isUp;
  66 +};
  67 +/**
  68 + * 获取发车时间。
  69 + * @returns {*|moment.Moment}
  70 + */
  71 +InternalBcObj.prototype.getFcTimeObj = function() {
  72 + return this._$_fcsjObj;
  73 +};
  74 +/**
  75 + * 获取到达时间。
  76 + * @returns {*|moment.Moment}
  77 + */
  78 +InternalBcObj.prototype.getArrTimeObj = function() {
  79 + return this._$_arrtime;
  80 +};
  81 +/**
  82 + * 获取班次时间。
  83 + * @returns int
  84 + */
  85 +InternalBcObj.prototype.getBcTime = function() {
  86 + return this._$_bcsj;
  87 +};
  88 +/**
  89 + * 获取停站时间。
  90 + * @returns int
  91 + */
  92 +InternalBcObj.prototype.getStopTime = function() {
  93 + return this._$_stoptime;
  94 +};
  95 +
  96 +//---------------------- 其他方法 -------------------------//
  97 +
  98 +/**
  99 + * 转换成显示用班次对象。
  100 + * @returns {{}}
  101 + */
  102 +InternalBcObj.prototype.toGanttBcObj = function() {
  103 + var _bcObj = {
  104 + parent: this._$$_internal_lp_obj.getLpNo(),
  105 + lpNo: this._$$_internal_lp_obj.getLpNo(),
  106 + lp: null,
  107 + lpName: this._$$_internal_lp_obj.getLpName(),
  108 + lpType: '普通路牌',
  109 + bcType: this._$_bcType,
  110 + fcno: this._$_fcno,
  111 + isfb: 0,
  112 + isSwitchXl: null,
  113 + bz: null
  114 + };
  115 +
  116 + // 线路上下行
  117 + _bcObj.xlDir = this._$_isUp ? "relationshipGraph-up" : "relationshipGraph-down";
  118 +
  119 + // 里程
  120 + _bcObj.jhlc = this._$_bclc;
  121 +
  122 + // 停车场
  123 + _bcObj.tcc = this._$_tccid;
  124 +
  125 + // 时刻表
  126 + _bcObj.ttinfo = this._$_ttinfoid;
  127 +
  128 + // 线路
  129 + _bcObj.xl = this._$_xlid;
  130 +
  131 + // 起点站、终点站
  132 + _bcObj.qdz = this._$_qdzid;
  133 + _bcObj.zdz = this._$_zdzid;
  134 +
  135 + // 发车时间,行驶时间,到达时间,停站时间
  136 + _bcObj.fcsj = this._$_fcsjObj.format("HH:mm");
  137 + _bcObj.bcsj = this._$_bcsj;
  138 + _bcObj.ARRIVALTIME = this._$_arrtime.format("HH:mm");
  139 + _bcObj.STOPTIME = this._$_stoptime;
  140 +
  141 + return _bcObj;
  142 +};
  143 +
src/main/resources/static/pages/base/timesmodel/js/v2/core/InternalGroupBcObj.js renamed to src/main/resources/static/pages/base/timesmodel/js/v2/core/InternalGroupObj.js
1 -/**  
2 - * 内部圈对象(一圈2个班次),圈是以上行计算,还是下行计算,由上标线决定  
3 - * 如果上标线是上行开始,则圈的第一个班次是上行,第二个班次是下行  
4 - * 一定是从第1圈开始,第0圈表示中标线的第一个班次,是下行班次,则第0圈的上行班次就是空的。  
5 - * @constructor  
6 - */  
7 -var InternalGroupBcObj = function(  
8 - isUp, // 是否上行,就是圈以上行开始,还是下行开始  
9 - bc1, // 第一班次  
10 - bc2 // 第二个班次  
11 -) {  
12 - this._$_isUp = isUp;  
13 -  
14 - this._$_internalBcArray = [];  
15 - this._$_internalBcArray.push(bc1);  
16 - this._$_internalBcArray.push(bc2);  
17 -};  
18 -  
19 -InternalGroupBcObj.prototype.getBc1 = function() {  
20 - return this._$_internalBcArray[0];  
21 -};  
22 -InternalGroupBcObj.prototype.getBc2 = function() {  
23 - return this._$_internalBcArray[1];  
24 -};  
25 -  
26 -InternalGroupBcObj.prototype.setBc1 = function(bc) {  
27 - this._$_internalBcArray[0] = bc;  
28 -};  
29 -InternalGroupBcObj.prototype.setBc2 = function(bc) {  
30 - this._$_internalBcArray[1] = bc;  
31 -};  
32 -InternalGroupBcObj.prototype.setLp = function(lp) {  
33 - var bc1 = this._$_internalBcArray[0];  
34 - var bc2 = this._$_internalBcArray[1];  
35 - if (bc1) {  
36 - bc1.setLp(lp);  
37 - }  
38 - if (bc2) {  
39 - bc2.setLp(lp);  
40 - }  
41 -};  
42 \ No newline at end of file 1 \ No newline at end of file
  2 +/**
  3 + * 内部圈对象(一圈2个班次),圈是以上行计算,还是下行计算,由上标线决定
  4 + * 如果上标线是上行开始,则圈的第一个班次是上行,第二个班次是下行
  5 + * 一定是从第1圈开始,第0圈表示中标线的第一个班次,是下行班次,则第0圈的上行班次就是空的。
  6 + * @constructor
  7 + */
  8 +var InternalGroupObj = function(
  9 + lpObj, // 所属 InternalLpObj 路牌对象
  10 + isUp, // 是否上行,就是圈以上行开始,还是下行开始
  11 + bc1, // 第一班次
  12 + bc2 // 第二个班次
  13 +) {
  14 + // 所属内部路牌对象
  15 + this._$$_internal_lp_obj = lpObj;
  16 +
  17 + this._$_isUp = isUp;
  18 +
  19 + this._$_internalBcArray = [];
  20 + this._$_internalBcArray.push(bc1);
  21 + this._$_internalBcArray.push(bc2);
  22 +};
  23 +
  24 +//------------------------ get/set 方法 ------------------------//
  25 +
  26 +InternalGroupObj.prototype.getBc1 = function() {
  27 + return this._$_internalBcArray[0];
  28 +};
  29 +InternalGroupObj.prototype.getBc2 = function() {
  30 + return this._$_internalBcArray[1];
  31 +};
  32 +
  33 +InternalGroupObj.prototype.setBc1 = function(bc) {
  34 + this._$_internalBcArray[0] = bc;
  35 +};
  36 +InternalGroupObj.prototype.removeBc1 = function() {
  37 + this._$_internalBcArray[0] = undefined;
  38 +};
  39 +InternalGroupObj.prototype.setBc2 = function(bc) {
  40 + this._$_internalBcArray[1] = bc;
  41 +};
  42 +InternalGroupObj.prototype.removeBc2 = function() {
  43 + this._$_internalBcArray[1] = undefined;
  44 +};
  45 +InternalGroupObj.prototype.setLp = function(lpObj) {
  46 + this._$$_internal_lp_obj = lpObj; // InternalLpObj 对象
  47 +
  48 + var bc1 = this._$_internalBcArray[0];
  49 + var bc2 = this._$_internalBcArray[1];
  50 + if (bc1) {
  51 + bc1.setLp(lpObj);
  52 + }
  53 + if (bc2) {
  54 + bc2.setLp(lpObj);
  55 + }
  56 +};
  57 +
  58 +
  59 +
src/main/resources/static/pages/base/timesmodel/js/v2/core/InternalLpObj.js
@@ -3,11 +3,13 @@ @@ -3,11 +3,13 @@
3 * @constructor 3 * @constructor
4 */ 4 */
5 var InternalLpObj = function( 5 var InternalLpObj = function(
6 - lp, // 路牌编号 6 + orilpObj, // 原始路牌对象
7 qCount, // 总共多少圈 7 qCount, // 总共多少圈
8 isUp // 圈是以上行开始还是下行开始 8 isUp // 圈是以上行开始还是下行开始
9 ) { 9 ) {
10 - this._$_lp = lp; 10 + // TODO:原始路牌对象(这个路牌是对接外部gantt图像,以后有机会改了)
  11 + this._$$_orign_lp_obj = orilpObj;
  12 +
11 this._$_isUp = isUp; 13 this._$_isUp = isUp;
12 14
13 // 距离上一个路牌的最小发车间隔时间 15 // 距离上一个路牌的最小发车间隔时间
@@ -26,19 +28,85 @@ var InternalLpObj = function( @@ -26,19 +28,85 @@ var InternalLpObj = function(
26 28
27 var i; 29 var i;
28 for (i = 0; i < this._$_qCount; i++) { 30 for (i = 0; i < this._$_qCount; i++) {
29 - this._$_groupBcArray[i] = new InternalGroupBcObj(  
30 - this._$_isUp, undefined, undefined); 31 + this._$_groupBcArray[i] = new InternalGroupObj(
  32 + this, this._$_isUp, undefined, undefined);
31 } 33 }
32 34
33 // 班型的相关变量 35 // 班型的相关变量
34 this._$_bx_isLb = false; // 是否连班 36 this._$_bx_isLb = false; // 是否连班
35 this._$_bx_isfb = false; // 是否分班 37 this._$_bx_isfb = false; // 是否分班
36 this._$_bx_isfb_5_2 = false; // 是否5休2分班 38 this._$_bx_isfb_5_2 = false; // 是否5休2分班
  39 + this._$_bx_desc; // 班型描述(默认为路牌编号)
37 40
38 // TODO: 41 // TODO:
39 42
40 }; 43 };
41 44
  45 +//------------------- get/set 方法 -------------------//
  46 +
  47 +/**
  48 + * 获取圈
  49 + * @param qIndex 圈index
  50 + */
  51 +InternalLpObj.prototype.getGroup = function(qIndex) {
  52 + return this._$_groupBcArray[qIndex];
  53 +};
  54 +
  55 +/**
  56 + * 获取班次。
  57 + * @param qIndex 第几圈
  58 + * @param bcIndex 第几个班次
  59 + */
  60 +InternalLpObj.prototype.getBc = function(qIndex, bcIndex) {
  61 + var group = this._$_groupBcArray[qIndex];
  62 + var bc;
  63 + if (bcIndex == 0) {
  64 + bc = group.getBc1();
  65 + } else if (bcIndex == 1) {
  66 + bc = group.getBc2();
  67 + }
  68 + return bc;
  69 +};
  70 +
  71 +/**
  72 + * 在具体位置设置班次。
  73 + * @param qIndex 第几圈
  74 + * @param bcIndex 第几个班次
  75 + * @param bc 班次对象
  76 + */
  77 +InternalLpObj.prototype.setBc = function(qIndex, bcIndex, bc) {
  78 + var group = this._$_groupBcArray[qIndex];
  79 + if (bcIndex == 0) {
  80 + group.setBc1(bc);
  81 + bc.setGroup(group);
  82 + } else if (bcIndex == 1) {
  83 + group.setBc2(bc);
  84 + bc.setGroup(group);
  85 + }
  86 +};
  87 +
  88 +/**
  89 + * 设置原始路牌对象。
  90 + * @param lpObj 原始路牌对象
  91 + */
  92 +InternalLpObj.prototype.setLp = function(lpObj) {
  93 + this._$$_orign_lp_obj = lpObj;
  94 + var i;
  95 + var group;
  96 + for (i = 0; i < this._$_groupBcArray.length; i++) {
  97 + group = this._$_groupBcArray[i];
  98 + if (group) {
  99 + group.setLp(this); // 圈和班次保存都是 InternalLpObj 对象
  100 + }
  101 + }
  102 +};
  103 +
  104 +InternalLpObj.prototype.getLpNo = function() {
  105 + return this._$$_orign_lp_obj.lpNo;
  106 +};
  107 +InternalLpObj.prototype.getLpName = function() {
  108 + return this._$$_orign_lp_obj.lpName;
  109 +};
42 InternalLpObj.prototype.setBxFb5_2 = function(fb) { 110 InternalLpObj.prototype.setBxFb5_2 = function(fb) {
43 this._$_bx_isfb_5_2 = fb; 111 this._$_bx_isfb_5_2 = fb;
44 }; 112 };
@@ -60,6 +128,24 @@ InternalLpObj.prototype.isBxFb = function() { @@ -60,6 +128,24 @@ InternalLpObj.prototype.isBxFb = function() {
60 }; 128 };
61 129
62 /** 130 /**
  131 + * 设置路牌的班型描述(最终是设置班次的路牌名字)。
  132 + * @param desc 描述
  133 + */
  134 +InternalLpObj.prototype.setBxDesc = function(desc) {
  135 + // 最终原始路牌的名字
  136 + this._$$_orign_lp_obj.lpName = desc + "_" + this._$$_orign_lp_obj.lpNo;
  137 + // 内部对象的班型描述
  138 + this._$_bx_desc = desc;
  139 +};
  140 +/**
  141 + * 获取版型描述
  142 + * @returns string
  143 + */
  144 +InternalLpObj.prototype.getBxDesc = function() {
  145 + return this._$_bx_desc;
  146 +};
  147 +
  148 +/**
63 * 设置纵向最小发车间隔时间。 149 * 设置纵向最小发车间隔时间。
64 * @param v 150 * @param v
65 */ 151 */
@@ -75,6 +161,8 @@ InternalLpObj.prototype.getVerticalMinIntervalTime = function() { @@ -75,6 +161,8 @@ InternalLpObj.prototype.getVerticalMinIntervalTime = function() {
75 return this._$_minVerticalIntervalTime; 161 return this._$_minVerticalIntervalTime;
76 }; 162 };
77 163
  164 +//-------------------- 班次操作方法(查询,统计,删除) -----------------------//
  165 +
78 /** 166 /**
79 * 返回总共班次数。 167 * 返回总共班次数。
80 */ 168 */
@@ -98,6 +186,25 @@ InternalLpObj.prototype.getBcCount = function() { @@ -98,6 +186,25 @@ InternalLpObj.prototype.getBcCount = function() {
98 }; 186 };
99 187
100 /** 188 /**
  189 + * 返回班次列表,过滤空的班次,将所有存在的班次连成连续的对象数组返回。
  190 + * @returns arrays (InternalBcObj)
  191 + */
  192 +InternalLpObj.prototype.getBcArray = function() {
  193 + var bcArray = [];
  194 + var i;
  195 + var group;
  196 + for (i = 0; i < this._$_groupBcArray.length; i++) {
  197 + group = this._$_groupBcArray[i];
  198 + if (group) {
  199 + group.getBc1() ? bcArray.push(group.getBc1()) : "";
  200 + group.getBc2() ? bcArray.push(group.getBc2()) : "";
  201 + }
  202 + }
  203 +
  204 + return bcArray;
  205 +};
  206 +
  207 +/**
101 * 获取最小(最早)班次对象。 208 * 获取最小(最早)班次对象。
102 * @returns [{圈index},{班次index}] 209 * @returns [{圈index},{班次index}]
103 */ 210 */
@@ -141,36 +248,117 @@ InternalLpObj.prototype.getMaxBcObjPosition = function() { @@ -141,36 +248,117 @@ InternalLpObj.prototype.getMaxBcObjPosition = function() {
141 return bIndex; 248 return bIndex;
142 }; 249 };
143 250
144 -// TODO  
145 -  
146 /** 251 /**
147 - *  
148 - * 252 + * 在具体位置移除班次。
  253 + * @param qIndex 第几圈
  254 + * @param bcIndex 第几个班次
149 */ 255 */
150 -InternalLpObj.prototype.calcuLpBx = function() {  
151 - 256 +InternalLpObj.prototype.removeBc = function(qIndex, bcIndex) {
  257 + var group = this._$_groupBcArray[qIndex];
  258 + if (bcIndex == 0) {
  259 + group.removeBc1();
  260 + } else if (bcIndex == 1) {
  261 + group.removeBc2();
  262 + }
152 }; 263 };
153 264
154 /** 265 /**
155 - * 返回班次列表,过滤空的班次,将所有存在的班次连成连续的对象数组返回。  
156 - * @returns arrays (InternalBcObj) 266 + * 使用指定时间匹配返回离之最近的第几圈第几个班次,
  267 + * 使用时间差的绝度值,比较,取最小的
  268 + * 如果有两个一样的时间差,取比fctime大的时间
  269 + * @param fctime 比较用时间
  270 + * @param groupArray 圈数组
  271 + * @returns [{第几圈},{第几个班次}]
157 */ 272 */
158 -InternalLpObj.prototype.getBcArray = function() {  
159 - var bcArray = []; 273 +InternalLpObj.prototype.getgetQBcIndexWithFcTimeFromGroupArray = function(
  274 + fctime, groupArray
  275 +) {
160 var i; 276 var i;
  277 + var timediff; // 时间差取绝对值
  278 + var qIndex;
  279 + var bcIndex;
  280 +
161 var group; 281 var group;
162 - for (i = 0; i < this._$_groupBcArray.length; i++) {  
163 - group = this._$_groupBcArray[i]; 282 + var bc1time;
  283 + var bc2time;
  284 +
  285 + var tempdiff;
  286 + for (i = 0; i < this._$_qCount; i++) {
  287 + group = groupArray[i];
164 if (group) { 288 if (group) {
165 - group.getBc1() ? bcArray.push(group.getBc1()) : "";  
166 - group.getBc2() ? bcArray.push(group.getBc2()) : ""; 289 + if (group.getBc1()) {
  290 + bc1time = group.getBc1().getFcTimeObj();
  291 + tempdiff = Math.abs(bc1time.diff(fctime));
  292 +
  293 + if (!timediff) {
  294 + timediff = Math.abs(tempdiff);
  295 + qIndex = i;
  296 + bcIndex = 0;
  297 + } else {
  298 + if (tempdiff < timediff) {
  299 + timediff = tempdiff;
  300 + qIndex = i;
  301 + bcIndex = 0;
  302 + } if (Math.abs(tempdiff) == timediff) {
  303 + if (bc1time.isBefore(fctime)) {
  304 + timediff = tempdiff;
  305 + qIndex = i;
  306 + bcIndex = 0;
  307 + }
  308 +
  309 + }
  310 + }
  311 + }
  312 +
  313 + if (group.getBc2()) {
  314 + bc2time = group.getBc2().getFcTimeObj();
  315 + tempdiff = Math.abs(bc2time.diff(fctime));
  316 +
  317 + if (!timediff) {
  318 + timediff = Math.abs(tempdiff);
  319 + qIndex = i;
  320 + bcIndex = 1;
  321 + } else {
  322 + if (tempdiff < timediff) {
  323 + timediff = tempdiff;
  324 + qIndex = i;
  325 + bcIndex = 1;
  326 + } if (Math.abs(tempdiff) == timediff) {
  327 + if (bc2time.isBefore(fctime)) {
  328 + timediff = tempdiff;
  329 + qIndex = i;
  330 + bcIndex = 1;
  331 + }
  332 +
  333 + }
  334 + }
  335 + }
167 } 336 }
168 } 337 }
169 338
170 - return bcArray; 339 + var rst = [];
  340 + rst.push(qIndex);
  341 + rst.push(bcIndex);
  342 +
  343 + return rst;
171 }; 344 };
172 345
173 /** 346 /**
  347 + * 使用指定时间匹配返回离之最近的第几圈第几个班次,
  348 + * 使用时间差的绝度值,比较,取最小的
  349 + * 如果有两个一样的时间差,取比fctime大的时间
  350 + * @param fctime 比较用时间
  351 + * @returns [{第几圈},{第几个班次}]
  352 + */
  353 +InternalLpObj.prototype.getQBcIndexWithFcTime = function(
  354 + fctime
  355 +) {
  356 + return this.getgetQBcIndexWithFcTimeFromGroupArray(fctime, this._$_groupBcArray);
  357 +};
  358 +
  359 +//---------------------- 内部数据初始化方法(不同于构造函数)---------------------//
  360 +
  361 +/**
174 * 从指定开始时间到结束时间创建不间断班次(连班),并初始化路牌 362 * 从指定开始时间到结束时间创建不间断班次(连班),并初始化路牌
175 * 注意,之前有班次会删除后再创建。 363 * 注意,之前有班次会删除后再创建。
176 * @param startTime 开始时间 364 * @param startTime 开始时间
@@ -195,7 +383,7 @@ InternalLpObj.prototype.initDataFromTimeToTime = function( @@ -195,7 +383,7 @@ InternalLpObj.prototype.initDataFromTimeToTime = function(
195 var bcCount = 1; // 班次数 383 var bcCount = 1; // 班次数
196 do { 384 do {
197 bcObj = factory.createBcObj( 385 bcObj = factory.createBcObj(
198 - "normal", isUp, this._$_lp, fcno, kssj, paramObj); 386 + this, "normal", isUp, fcno, kssj, paramObj); // this就是所属路牌对象
199 bcData.push(bcObj); 387 bcData.push(bcObj);
200 388
201 kssj = paramObj.addMinute(kssj, bcObj.getBcTime() + bcObj.getStopTime()); 389 kssj = paramObj.addMinute(kssj, bcObj.getBcTime() + bcObj.getStopTime());
@@ -210,19 +398,23 @@ InternalLpObj.prototype.initDataFromTimeToTime = function( @@ -210,19 +398,23 @@ InternalLpObj.prototype.initDataFromTimeToTime = function(
210 bcData.splice(bcCount - 1, 1); 398 bcData.splice(bcCount - 1, 1);
211 } 399 }
212 400
213 - this.initDataFromLbBcArray(bcData, fromQ); 401 + this._initDataFromLbBcArray(bcData, fromQ);
214 402
215 }; 403 };
216 404
217 /** 405 /**
218 - * 使用连班的班次数组初始化路牌 406 + * 使用连班的班次数组初始化路牌(相应的圈会被覆盖)
219 * @param bcArray 连班班次数组 407 * @param bcArray 连班班次数组
220 * @param fromQ 从第几圈开始加入 408 * @param fromQ 从第几圈开始加入
221 */ 409 */
222 -InternalLpObj.prototype.initDataFromLbBcArray = function( 410 +InternalLpObj.prototype._initDataFromLbBcArray = function(
223 bcArray, 411 bcArray,
224 fromQ 412 fromQ
225 ) { 413 ) {
  414 + var _bc1Obj;
  415 + var _bc2Obj;
  416 + var _qObj;
  417 +
226 // 第一班次是上行还是下行 418 // 第一班次是上行还是下行
227 var isUp = bcArray[0].isUp(); 419 var isUp = bcArray[0].isUp();
228 420
@@ -231,12 +423,16 @@ InternalLpObj.prototype.initDataFromLbBcArray = function( @@ -231,12 +423,16 @@ InternalLpObj.prototype.initDataFromLbBcArray = function(
231 if (isUp != this._$_isUp) { 423 if (isUp != this._$_isUp) {
232 // 如果方向不一致,意味着第一个班次是半圈 424 // 如果方向不一致,意味着第一个班次是半圈
233 // 加半圈,并加在bc2上 425 // 加半圈,并加在bc2上
234 - this._$_groupBcArray[fromQ] =  
235 - new InternalGroupBcObj(  
236 - this._$_isUp,  
237 - undefined,  
238 - bcArray.slice(0, 1)[0]  
239 - ); 426 + _bc2Obj = bcArray.slice(0, 1)[0];
  427 + _qObj = new InternalGroupObj(
  428 + this,
  429 + this._$_isUp,
  430 + undefined,
  431 + _bc2Obj
  432 + );
  433 + _bc2Obj.setGroup(_qObj);
  434 + this._$_groupBcArray[fromQ] = _qObj;
  435 +
240 bcArray.splice(0, 1); 436 bcArray.splice(0, 1);
241 fromQ ++; 437 fromQ ++;
242 } 438 }
@@ -246,22 +442,31 @@ InternalLpObj.prototype.initDataFromLbBcArray = function( @@ -246,22 +442,31 @@ InternalLpObj.prototype.initDataFromLbBcArray = function(
246 442
247 while (fromQ < this._$_qCount) { 443 while (fromQ < this._$_qCount) {
248 if (qCount1 > 0) { 444 if (qCount1 > 0) {
249 - this._$_groupBcArray[fromQ] =  
250 - new InternalGroupBcObj(  
251 - this._$_isUp,  
252 - bcArray.slice(0, 1)[0],  
253 - bcArray.slice(1, 2)[0]  
254 - ); 445 + _bc1Obj = bcArray.slice(0, 1)[0];
  446 + _bc2Obj = bcArray.slice(1, 2)[0];
  447 + _qObj = new InternalGroupObj(
  448 + this,
  449 + this._$_isUp,
  450 + _bc1Obj,
  451 + _bc2Obj
  452 + );
  453 + _bc1Obj.setGroup(_qObj);
  454 + _bc2Obj.setGroup(_qObj);
  455 + this._$_groupBcArray[fromQ] = _qObj;
  456 +
255 bcArray.splice(0, 2); 457 bcArray.splice(0, 2);
256 qCount1 --; 458 qCount1 --;
257 } else if (qCount2 > 0) { 459 } else if (qCount2 > 0) {
258 // 加半圈,并加在bc1上 460 // 加半圈,并加在bc1上
259 - this._$_groupBcArray[fromQ] =  
260 - new InternalGroupBcObj(  
261 - this._$_isUp,  
262 - bcArray.slice(0, 1)[0],  
263 - undefined  
264 - ); 461 + _bc1Obj = bcArray.slice(0, 1)[0];
  462 + _qObj = new InternalGroupObj(
  463 + this,
  464 + this._$_isUp,
  465 + _bc1Obj,
  466 + undefined
  467 + );
  468 + _bc1Obj.setGroup(_qObj);
  469 + this._$_groupBcArray[fromQ] = _qObj;
265 } else { 470 } else {
266 break; 471 break;
267 } 472 }
@@ -271,151 +476,22 @@ InternalLpObj.prototype.initDataFromLbBcArray = function( @@ -271,151 +476,22 @@ InternalLpObj.prototype.initDataFromLbBcArray = function(
271 } 476 }
272 }; 477 };
273 478
274 -/**  
275 - * 获取圈  
276 - * @param qIndex 圈index  
277 - */  
278 -InternalLpObj.prototype.getGroup = function(qIndex) {  
279 - return this._$_groupBcArray[qIndex];  
280 -}; 479 +//-------------------------- 其他方法 ----------------------------//
281 480
282 -/**  
283 - * 获取班次。  
284 - * @param qIndex 第几圈  
285 - * @param bcIndex 第几个班次  
286 - */  
287 -InternalLpObj.prototype.getBc = function(qIndex, bcIndex) {  
288 - var group = this._$_groupBcArray[qIndex];  
289 - var bc;  
290 - if (bcIndex == 0) {  
291 - bc = group.getBc1();  
292 - } else if (bcIndex == 1) {  
293 - bc = group.getBc2();  
294 - }  
295 - return bc;  
296 -};  
297 481
298 -/**  
299 - * 再具体位置设置班次。  
300 - * @param qIndex 第几圈  
301 - * @param bcIndex 第几个班次  
302 - * @param bc 班次对象  
303 - */  
304 -InternalLpObj.prototype.setBc = function(qIndex, bcIndex, bc) {  
305 - var group = this._$_groupBcArray[qIndex];  
306 - if (bcIndex == 0) {  
307 - group.setBc1(bc);  
308 - } else if (bcIndex == 1) {  
309 - group.setBc2(bc);  
310 - }  
311 -};  
312 -  
313 -/**  
314 - * 设置班次的路牌编号。  
315 - * @param lpNo  
316 - */  
317 -InternalLpObj.prototype.setLp = function(lpNo) {  
318 - var i;  
319 - var group;  
320 - for (i = 0; i < this._$_groupBcArray.length; i++) {  
321 - group = this._$_groupBcArray[i];  
322 - if (group) {  
323 - group.setLp(lpNo);  
324 - }  
325 - }  
326 -}; 482 +// TODO
327 483
328 /** 484 /**
329 - * 使用指定时间匹配返回离之最近的第几圈第几个班次,  
330 - * 使用时间差的绝度值,比较,取最小的  
331 - * 如果有两个一样的时间差,取比fctime大的时间  
332 - * @param fctime 比较用时间  
333 - * @param groupArray 圈数组  
334 - * @returns [{第几圈},{第几个班次}] 485 + *
  486 + *
335 */ 487 */
336 -InternalLpObj.prototype.getgetQBcIndexWithFcTimeFromGroupArray = function(  
337 - fctime, groupArray  
338 -) {  
339 - var i;  
340 - var timediff; // 时间差取绝对值  
341 - var qIndex;  
342 - var bcIndex;  
343 -  
344 - var group;  
345 - var bc1time;  
346 - var bc2time;  
347 -  
348 - var tempdiff;  
349 - for (i = 0; i < this._$_qCount; i++) {  
350 - group = groupArray[i];  
351 - if (group) {  
352 - if (group.getBc1()) {  
353 - bc1time = group.getBc1().getFcTimeObj();  
354 - tempdiff = Math.abs(bc1time.diff(fctime));  
355 -  
356 - if (!timediff) {  
357 - timediff = Math.abs(tempdiff);  
358 - qIndex = i;  
359 - bcIndex = 0;  
360 - } else {  
361 - if (tempdiff < timediff) {  
362 - timediff = tempdiff;  
363 - qIndex = i;  
364 - bcIndex = 0;  
365 - } if (Math.abs(tempdiff) == timediff) {  
366 - if (bc1time.isBefore(fctime)) {  
367 - timediff = tempdiff;  
368 - qIndex = i;  
369 - bcIndex = 0;  
370 - } 488 +InternalLpObj.prototype.calcuLpBx = function() {
371 489
372 - }  
373 - }  
374 - } 490 +};
375 491
376 - if (group.getBc2()) {  
377 - bc2time = group.getBc2().getFcTimeObj();  
378 - tempdiff = Math.abs(bc2time.diff(fctime));  
379 492
380 - if (!timediff) {  
381 - timediff = Math.abs(tempdiff);  
382 - qIndex = i;  
383 - bcIndex = 1;  
384 - } else {  
385 - if (tempdiff < timediff) {  
386 - timediff = tempdiff;  
387 - qIndex = i;  
388 - bcIndex = 1;  
389 - } if (Math.abs(tempdiff) == timediff) {  
390 - if (bc2time.isBefore(fctime)) {  
391 - timediff = tempdiff;  
392 - qIndex = i;  
393 - bcIndex = 1;  
394 - }  
395 493
396 - }  
397 - }  
398 - }  
399 - }  
400 - }  
401 494
402 - var rst = [];  
403 - rst.push(qIndex);  
404 - rst.push(bcIndex);  
405 495
406 - return rst;  
407 -};  
408 496
409 -/**  
410 - * 使用指定时间匹配返回离之最近的第几圈第几个班次,  
411 - * 使用时间差的绝度值,比较,取最小的  
412 - * 如果有两个一样的时间差,取比fctime大的时间  
413 - * @param fctime 比较用时间  
414 - * @returns [{第几圈},{第几个班次}]  
415 - */  
416 -InternalLpObj.prototype.getQBcIndexWithFcTime = function(  
417 - fctime  
418 -) {  
419 - return this.getgetQBcIndexWithFcTimeFromGroupArray(fctime, this._$_groupBcArray);  
420 -};  
421 497
src/main/resources/static/pages/base/timesmodel/js/v2/core/InternalScheduleObj.js
@@ -16,6 +16,9 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -16,6 +16,9 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
16 var _internalLpArray = []; // 内部对象数组 16 var _internalLpArray = []; // 内部对象数组
17 17
18 var _initFun1 = function() { // 初始化方法1 18 var _initFun1 = function() { // 初始化方法1
  19 +
  20 + //----------------------- 1、确定上标线的方向,圈的方向 -------------------//
  21 +
19 // 确定_qIsUp,哪个方向的首班车晚就用哪个 22 // 确定_qIsUp,哪个方向的首班车晚就用哪个
20 _qIsUp = _paramObj.getUpFirstDTimeObj().isBefore( 23 _qIsUp = _paramObj.getUpFirstDTimeObj().isBefore(
21 _paramObj.getDownFirstDTimeObj()) ? false : true; 24 _paramObj.getDownFirstDTimeObj()) ? false : true;
@@ -33,27 +36,33 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -33,27 +36,33 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
33 et_IsUp = true; 36 et_IsUp = true;
34 } 37 }
35 38
36 - // 以开始时间,结束时间,构造上标线用连班班次  
37 - var bcData = []; // 班次数组  
38 - var bcObj; 39 + //------------------------ 2、计算总共有多少圈 ------------------------//
  40 +
  41 +
  42 +
  43 + // 以开始时间,结束时间,构造上标线用连班班次发车时间
  44 + var bcFcsjArrays = []; // 班次发车时间对象数组
  45 + var bcArsjArrays = []; // 班次到达时间对象数组
39 var isUp = _qIsUp; // 方向 46 var isUp = _qIsUp; // 方向
40 - var kssj = st;  
41 - var fcno = 1; // 发车顺序号  
42 var bcCount = 1; // 班次数 47 var bcCount = 1; // 班次数
43 - do {  
44 - bcObj = _factory.createBcObj(  
45 - "normal", isUp, _lpArray[0].lpNo, fcno, kssj, paramObj);  
46 - bcData.push(bcObj);  
47 48
48 - kssj = paramObj.addMinute(kssj, bcObj.getBcTime() + bcObj.getStopTime());  
49 - fcno ++; 49 + var _kssj = st; // 开始时间
  50 + var _bcsj = paramObj.calcuTravelTime(_kssj, isUp); // 班次历时
  51 + var _arrsj = paramObj.addMinute(_kssj, _bcsj); // 到达时间
  52 + var _stoptime = paramObj.calcuFixedStopNumber(_arrsj, !isUp); // 停站时间
  53 +
  54 + do {
  55 + bcFcsjArrays.push(_kssj);
  56 + bcArsjArrays.push(_arrsj);
  57 + _kssj = paramObj.addMinute(_kssj, _bcsj + _stoptime);
50 bcCount ++; 58 bcCount ++;
51 isUp = !isUp; 59 isUp = !isUp;
52 - } while(kssj.isBefore(et)); 60 + } while(_kssj.isBefore(et));
53 bcCount--; // 因为先做do,所以总的班次要减1 61 bcCount--; // 因为先做do,所以总的班次要减1
54 - if (bcCount > 0 && bcData[bcCount - 1].getArrTimeObj().isAfter(et)) { 62 + if (bcCount > 0 && bcArsjArrays[bcCount - 1].isAfter(et)) {
55 // 如果最后一个班次的到达时间超过结束时间,也要去除 63 // 如果最后一个班次的到达时间超过结束时间,也要去除
56 - bcData.splice(bcCount - 1, 1); 64 + bcFcsjArrays.splice(bcCount - 1, 1);
  65 + bcArsjArrays.splice(bcCount - 1, 1);
57 bcCount--; 66 bcCount--;
58 } 67 }
59 var _qCount_p1 = Math.floor(bcCount / 2); // 2个班次一圈 68 var _qCount_p1 = Math.floor(bcCount / 2); // 2个班次一圈
@@ -81,13 +90,15 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -81,13 +90,15 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
81 } 90 }
82 } 91 }
83 92
  93 + //------------------------ 3、根据路牌数,圈数创建路牌对象 ----------------------//
  94 +
84 // 创建内部的路牌数组,并把之前的连班路牌添加进上标线路牌中 95 // 创建内部的路牌数组,并把之前的连班路牌添加进上标线路牌中
85 var i; 96 var i;
86 for (i = 0; i < _lpArray.length; i++) { 97 for (i = 0; i < _lpArray.length; i++) {
87 - _internalLpArray.push(  
88 - new InternalLpObj(_lpArray[i].lpNo, _qCount, _qIsUp)); 98 + _internalLpArray.push(new InternalLpObj(_lpArray[i], _qCount, _qIsUp));
89 } 99 }
90 - _internalLpArray[0].initDataFromLbBcArray(bcData, 1); // 上标线从第1圈开始放班次 100 + // 初始化上标线,从第1圈开始
  101 + _internalLpArray[0].initDataFromTimeToTime(bcFcsjArrays[0], et, _qIsUp, 1, _paramObj, _factory);
91 102
92 console.log("//---------------- 行车计划,初始化方法1 start ----------------//"); 103 console.log("//---------------- 行车计划,初始化方法1 start ----------------//");
93 console.log("上行首班车时间:" + _paramObj.getUpFirstDTimeObj().format("HH:mm") + 104 console.log("上行首班车时间:" + _paramObj.getUpFirstDTimeObj().format("HH:mm") +
@@ -101,16 +112,18 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -101,16 +112,18 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
101 }; 112 };
102 113
103 //------------------ 初始化方法2,以及计算关联的内部变量 ----------------// 114 //------------------ 初始化方法2,以及计算关联的内部变量 ----------------//
104 - var _zgfQIndex; // 早高峰车辆从第几圈开始全部发出  
105 - var _zgfBIndex; // 早高峰车辆从第几圈第几个班次全部发出  
106 - var _wgfQIndex; // 晚高峰车辆从第几圈开始全部发出  
107 - var _wgfBIndex; // 晚高峰车辆从第几圈第几个班次全部发出 115 + var _approximate_zgfQIndex; // 预估早高峰车辆从第几圈开始全部发出
  116 + var _approximate_zgfBIndex; // 预估早高峰车辆从第几圈第几个班次开始全部发出(上行或下行)
  117 + var _approximate_wgfQIndex; // 预估晚高峰车辆从第几圈开始全部发出
  118 + var _approximate_wgfBIndex; // 预估晚高峰车辆从第几圈第几个班次开始全部发出(上行或下行)
108 119
109 // 同一圈同一方向班次发车间隔的最小值 120 // 同一圈同一方向班次发车间隔的最小值
110 // 注意:这个值就是用来添加班次的时间增加单位,在后面相关的方法里会具体说明 121 // 注意:这个值就是用来添加班次的时间增加单位,在后面相关的方法里会具体说明
111 var _qbcMinIntervalValue; 122 var _qbcMinIntervalValue;
112 123
113 var _initFun2 = function() { // 初始化方法2 124 var _initFun2 = function() { // 初始化方法2
  125 + //------------------------ 1、预估早高峰全部出车第几圈第几个班次全部出车,计算路牌之间的发车间隔 ------------------//
  126 +
114 // 以上标线为标准,查找离早高峰开始时间最近的班次作为早高峰开始班次 127 // 以上标线为标准,查找离早高峰开始时间最近的班次作为早高峰开始班次
115 // 以这个班次为早高峰起点,全部出车策略 128 // 以这个班次为早高峰起点,全部出车策略
116 var qbcIndexArray = _internalLpArray[0].getQBcIndexWithFcTime( 129 var qbcIndexArray = _internalLpArray[0].getQBcIndexWithFcTime(
@@ -132,11 +145,11 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -132,11 +145,11 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
132 qIndex, 145 qIndex,
133 bIndex, 146 bIndex,
134 _factory.createBcObj( 147 _factory.createBcObj(
  148 + _internalLpArray[i - 1],
135 "normal", startbc.isUp(), 149 "normal", startbc.isUp(),
136 - _lpArray[i - 1].lpNo,  
137 1, _kssj, paramObj) 150 1, _kssj, paramObj)
138 ); 151 );
139 - // 使用早高峰的发车间隔最为路牌纵向最小发车间隔 152 + // 使用早高峰的发车间隔最为路牌纵向最小发车间隔,不能整除的话,小的放在前面的路牌
140 _internalLpArray[i - 1].setVerticalMinIntervalTime(_c1); 153 _internalLpArray[i - 1].setVerticalMinIntervalTime(_c1);
141 } 154 }
142 for (i = 1; i <= _c2; i++) { 155 for (i = 1; i <= _c2; i++) {
@@ -145,16 +158,18 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -145,16 +158,18 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
145 qIndex, 158 qIndex,
146 bIndex, 159 bIndex,
147 _factory.createBcObj( 160 _factory.createBcObj(
  161 + _internalLpArray[_clCount - _c2 + i - 1],
148 "normal", startbc.isUp(), 162 "normal", startbc.isUp(),
149 - _lpArray[_clCount - _c2 + i - 1].lpNo,  
150 1, _kssj, paramObj) 163 1, _kssj, paramObj)
151 ); 164 );
152 - // 使用早高峰的发车间隔最为路牌纵向最小发车间隔 165 + // 使用早高峰的发车间隔最为路牌纵向最小发车间隔,,不能整除的话,大的放在后面的路牌
153 _internalLpArray[_clCount - _c2 + i - 1].setVerticalMinIntervalTime(_c1); 166 _internalLpArray[_clCount - _c2 + i - 1].setVerticalMinIntervalTime(_c1);
154 } 167 }
155 168
156 - _zgfQIndex = qIndex;  
157 - _zgfBIndex = bIndex; 169 + _approximate_zgfQIndex = qIndex;
  170 + _approximate_zgfBIndex = bIndex;
  171 +
  172 + //------------------------ 2、预估晚高峰全部出车第几圈第几个班次全部出车,计算路牌之间的发车间隔 ------------------//
158 173
159 // 以上标线为标准,查找离晚高峰开始时间最近的班次作为晚高峰开始班次 174 // 以上标线为标准,查找离晚高峰开始时间最近的班次作为晚高峰开始班次
160 // 以这个班次为早高峰起点,全部出车策略 175 // 以这个班次为早高峰起点,全部出车策略
@@ -176,8 +191,8 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -176,8 +191,8 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
176 qIndex, 191 qIndex,
177 bIndex, 192 bIndex,
178 _factory.createBcObj( 193 _factory.createBcObj(
  194 + _internalLpArray[i - 1],
179 "normal", startbc.isUp(), 195 "normal", startbc.isUp(),
180 - _lpArray[i - 1].lpNo,  
181 1, _kssj, _paramObj) 196 1, _kssj, _paramObj)
182 ); 197 );
183 } 198 }
@@ -187,20 +202,20 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -187,20 +202,20 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
187 qIndex, 202 qIndex,
188 bIndex, 203 bIndex,
189 _factory.createBcObj( 204 _factory.createBcObj(
  205 + _internalLpArray[_clCount - _c2 + i - 1],
190 "normal", startbc.isUp(), 206 "normal", startbc.isUp(),
191 - _lpArray[_clCount - _c2 + i - 1].lpNo,  
192 1, _kssj, _paramObj) 207 1, _kssj, _paramObj)
193 ); 208 );
194 } 209 }
195 210
196 - _wgfQIndex = qIndex;  
197 - _wgfBIndex = bIndex; 211 + _approximate_wgfQIndex = qIndex;
  212 + _approximate_wgfBIndex = bIndex;
198 _qbcMinIntervalValue = _c1; 213 _qbcMinIntervalValue = _c1;
199 214
200 console.log("//---------------- 行车计划,初始化方法2 start ----------------//"); 215 console.log("//---------------- 行车计划,初始化方法2 start ----------------//");
201 - console.log("早高峰第" + _zgfQIndex + "(index)圈,第" + _zgfBIndex + "(index)班次车辆全部发出");  
202 - console.log("晚高峰第" + _wgfQIndex + "(index)圈,第" + _wgfBIndex + "(index)班次车辆全部发出");  
203 - console.log("同圈同方向班次最小间隔(分钟):" + _qbcMinIntervalValue); 216 + console.log("预估早高峰第" + _approximate_zgfQIndex + "(index)圈,第" + _approximate_zgfBIndex + "(index)班次车辆全部发出");
  217 + console.log("预估晚高峰第" + _approximate_wgfQIndex + "(index)圈,第" + _approximate_wgfBIndex + "(index)班次车辆全部发出");
  218 + console.log("预估同圈同方向班次最小间隔(分钟):" + _qbcMinIntervalValue);
204 console.log("//---------------- 行车计划,初始化方法2 end ----------------//"); 219 console.log("//---------------- 行车计划,初始化方法2 end ----------------//");
205 }; 220 };
206 221
@@ -208,6 +223,8 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -208,6 +223,8 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
208 var _zbx_lpIndex; // 中标线对应第几个路牌 223 var _zbx_lpIndex; // 中标线对应第几个路牌
209 224
210 var _initFun3 = function() { // 初始化方法3 225 var _initFun3 = function() { // 初始化方法3
  226 + //---------------------------- 1、模拟一个中标线,使用临时路牌 ----------------------//
  227 +
211 // 构造中标线 228 // 构造中标线
212 // 中标线开始时间,就是方向的首班车时间 229 // 中标线开始时间,就是方向的首班车时间
213 var st = !_qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj(); 230 var st = !_qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();
@@ -221,7 +238,7 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -221,7 +238,7 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
221 et = _paramObj.getUpLastDtimeObj(); 238 et = _paramObj.getUpLastDtimeObj();
222 } 239 }
223 240
224 - var tempLpObj = new InternalLpObj(-999, _qCount, _qIsUp); 241 + var tempLpObj = new InternalLpObj({lpNo: -999, lpName: "-999"}, _qCount, _qIsUp);
225 tempLpObj.initDataFromTimeToTime( 242 tempLpObj.initDataFromTimeToTime(
226 st, 243 st,
227 et, 244 et,
@@ -231,8 +248,12 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -231,8 +248,12 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
231 _factory 248 _factory
232 ); 249 );
233 250
  251 + //------------------------ 2、找出中标线的早高峰班次,计算应该插在当前路牌数组的那个位置 ----------------//
  252 + // TODO:中标线的早高峰发车班次,和插入位置的早高分班次的时间会有误差的
  253 + // TODO:这里是直接把中标线班次覆盖,没有根据误差调整,以后改
  254 +
234 // 找出中标线对应的早高峰的班次对象 255 // 找出中标线对应的早高峰的班次对象
235 - var _zb_bcobj = tempLpObj.getBc(_zgfQIndex, _zgfBIndex); 256 + var _zb_bcobj = tempLpObj.getBc(_approximate_zgfQIndex, _approximate_zgfBIndex);
236 257
237 // 把所有高峰班次重新构造成一个一个的圈数组,计算对应中标线最近的是第几个路牌 258 // 把所有高峰班次重新构造成一个一个的圈数组,计算对应中标线最近的是第几个路牌
238 var _tempq_array = []; 259 var _tempq_array = [];
@@ -240,11 +261,11 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -240,11 +261,11 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
240 var _temp_bc; 261 var _temp_bc;
241 var i; 262 var i;
242 for (i = 0; i < _internalLpArray.length; i++) { 263 for (i = 0; i < _internalLpArray.length; i++) {
243 - _temp_bc = _internalLpArray[i].getBc(_zgfQIndex, _zgfBIndex); 264 + _temp_bc = _internalLpArray[i].getBc(_approximate_zgfQIndex, _approximate_zgfBIndex);
244 if (_temp_bc.isUp() == _qIsUp) { 265 if (_temp_bc.isUp() == _qIsUp) {
245 - _temp_group = new InternalGroupBcObj(_qIsUp, _temp_bc, undefined); 266 + _temp_group = new InternalGroupObj(_internalLpArray[i], _qIsUp, _temp_bc, undefined);
246 } else { 267 } else {
247 - _temp_group = new InternalGroupBcObj(_qIsUp, undefined, _temp_bc); 268 + _temp_group = new InternalGroupObj(_internalLpArray[i], _qIsUp, undefined, _temp_bc);
248 } 269 }
249 _tempq_array.push(_temp_group); 270 _tempq_array.push(_temp_group);
250 } 271 }
@@ -254,7 +275,7 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -254,7 +275,7 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
254 _tempq_array 275 _tempq_array
255 ); 276 );
256 _zbx_lpIndex = _ttindex_[0]; // 中标线放在第几个路牌 277 _zbx_lpIndex = _ttindex_[0]; // 中标线放在第几个路牌
257 - tempLpObj.setLp(_lpArray[_zbx_lpIndex].lpNo); 278 + tempLpObj.setLp(_lpArray[_zbx_lpIndex]); // 设置原始路牌对象
258 tempLpObj.setVerticalMinIntervalTime( // 设置纵向最小发车间隔 279 tempLpObj.setVerticalMinIntervalTime( // 设置纵向最小发车间隔
259 _internalLpArray[_zbx_lpIndex].getVerticalMinIntervalTime() 280 _internalLpArray[_zbx_lpIndex].getVerticalMinIntervalTime()
260 ); 281 );
@@ -353,9 +374,10 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -353,9 +374,10 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
353 // 3、计算班次并添加班次 374 // 3、计算班次并添加班次
354 var _kssj = _paramObj.addMinute(_bcObj.getFcTimeObj(), _intervalTime); 375 var _kssj = _paramObj.addMinute(_bcObj.getFcTimeObj(), _intervalTime);
355 _bcObj = _factory.createBcObj( 376 _bcObj = _factory.createBcObj(
  377 + _internalLpArray[lpIndex],
356 "normal", _bcObj.isUp(), 378 "normal", _bcObj.isUp(),
357 - _lpArray[lpIndex].lpNo,  
358 1, _kssj, _paramObj); 379 1, _kssj, _paramObj);
  380 + _bcObj.setGroup(_internalLpArray[lpIndex].getGroup(qIndex));
359 381
360 return _bcObj; 382 return _bcObj;
361 383
@@ -377,12 +399,12 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -377,12 +399,12 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
377 }; 399 };
378 400
379 /** 401 /**
380 - * 查找指定时间落在哪两个班次之间(很重要的内部方法)。 402 + * 查找离指定时间最近的前面的班次索引信息
381 * @param timeObj 查找时间 403 * @param timeObj 查找时间
382 * @param isUp 是否上行 404 * @param isUp 是否上行
383 - * @returns [上界班次index,下界班次index],班次index=[圈index, 班次index] 405 + * @returns [{路牌index},{圈index},{班次index}]
384 */ 406 */
385 - var _findBcIndexWithTime = function(timeObj, isUp) { 407 + var _findUpClosedBcIndexWithTime = function(timeObj, isUp) {
386 var _lpObj; 408 var _lpObj;
387 var _groupObj; 409 var _groupObj;
388 var _bcObj; 410 var _bcObj;
@@ -390,28 +412,30 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -390,28 +412,30 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
390 var _j; 412 var _j;
391 var timediff; // 时间差取绝对值 413 var timediff; // 时间差取绝对值
392 414
393 - var _up_gIndex; 415 + var _lpIndex;
  416 + var _up_qIndex;
394 var _up_bIndex; 417 var _up_bIndex;
395 418
396 - // TODO:找上界  
397 for (_i = 0; _i < _qCount; _i++) { 419 for (_i = 0; _i < _qCount; _i++) {
398 for (_j = 0; _j < _internalLpArray.length; _j++) { 420 for (_j = 0; _j < _internalLpArray.length; _j++) {
399 _lpObj = _internalLpArray[_j]; 421 _lpObj = _internalLpArray[_j];
400 _groupObj = _lpObj.getGroup(_i); 422 _groupObj = _lpObj.getGroup(_i);
401 _bcObj = isUp ? _groupObj.getBc1() : _groupObj.getBc2(); 423 _bcObj = isUp ? _groupObj.getBc1() : _groupObj.getBc2();
402 - if (_bcObj) { // 没有班次动态生成一个,可能生成不出的 424 + if (!_bcObj) { // 没有班次动态生成一个,可能生成不出的
403 _bcObj = _generateBc(_j, _i, isUp == _qIsUp ? 0 : 1); 425 _bcObj = _generateBc(_j, _i, isUp == _qIsUp ? 0 : 1);
404 } 426 }
405 if (_bcObj) { 427 if (_bcObj) {
406 if (timeObj.diff(_bcObj.getFcTimeObj()) >= 0) { 428 if (timeObj.diff(_bcObj.getFcTimeObj()) >= 0) {
407 if (!timediff) { 429 if (!timediff) {
408 timediff = timeObj.diff(_bcObj.getFcTimeObj()); 430 timediff = timeObj.diff(_bcObj.getFcTimeObj());
409 - _up_gIndex = _i; 431 + _lpIndex = _j;
  432 + _up_qIndex = _i;
410 _up_bIndex = isUp == _qIsUp ? 0 : 1; 433 _up_bIndex = isUp == _qIsUp ? 0 : 1;
411 } else { 434 } else {
412 if (timeObj.diff(_bcObj.getFcTimeObj()) < timediff) { 435 if (timeObj.diff(_bcObj.getFcTimeObj()) < timediff) {
413 timediff = timeObj.diff(_bcObj.getFcTimeObj()); 436 timediff = timeObj.diff(_bcObj.getFcTimeObj());
414 - _up_gIndex = _i; 437 + _lpIndex = _j;
  438 + _up_qIndex = _i;
415 _up_bIndex = isUp == _qIsUp ? 0 : 1; 439 _up_bIndex = isUp == _qIsUp ? 0 : 1;
416 } 440 }
417 } 441 }
@@ -420,14 +444,87 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -420,14 +444,87 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
420 } 444 }
421 } 445 }
422 446
423 - // TODO: 447 + if (_lpIndex == undefined) {
  448 + return false;
  449 + }
  450 +
424 var bcindex = []; 451 var bcindex = [];
425 - bcindex.push(_up_gIndex); 452 + bcindex.push(_lpIndex);
  453 + bcindex.push(_up_qIndex);
426 bcindex.push(_up_bIndex); 454 bcindex.push(_up_bIndex);
427 455
428 return bcindex; 456 return bcindex;
429 }; 457 };
430 458
  459 + /**
  460 + * 查找离指定时间最近的后面的班次索引信息
  461 + * @param timeObj 查找时间
  462 + * @param isUp 是否上行
  463 + * @returns [{路牌index},{圈index},{班次index}]
  464 + */
  465 + var _findDownClosedBcIndexWithTime = function(timeObj, isUp) {
  466 + var _lpObj;
  467 + var _groupObj;
  468 + var _bcObj;
  469 + var _i;
  470 + var _j;
  471 + var timediff; // 时间差取绝对值
  472 +
  473 + var _lpIndex;
  474 + var _down_qIndex;
  475 + var _down_bIndex;
  476 +
  477 + var flag;
  478 +
  479 + for (_i = 0; _i < _qCount; _i++) {
  480 + for (_j = 0; _j < _internalLpArray.length; _j++) {
  481 + _lpObj = _internalLpArray[_j];
  482 + _groupObj = _lpObj.getGroup(_i);
  483 + _bcObj = isUp ? _groupObj.getBc1() : _groupObj.getBc2();
  484 + if (!_bcObj) { // 没有班次动态生成一个,可能生成不出的
  485 + _bcObj = _generateBc(_j, _i, isUp == _qIsUp ? 0 : 1);
  486 + }
  487 + if (_bcObj) {
  488 + //console.log("timeobj -> bcobj diff flag " +
  489 + // timeObj.format("HH:mm") + "->" +
  490 + // _bcObj.getFcTimeObj().format("HH:mm") +
  491 + // timeObj.diff(_bcObj.getFcTimeObj()) +
  492 + // (timeObj.diff(_bcObj.getFcTimeObj()) <= 0)
  493 + //);
  494 +
  495 + flag = (timeObj.diff(_bcObj.getFcTimeObj())) <= 0;
  496 +
  497 + if (flag) {
  498 + if (!timediff) {
  499 + timediff = timeObj.diff(_bcObj.getFcTimeObj());
  500 + _lpIndex = _j;
  501 + _down_qIndex = _i;
  502 + _down_bIndex = isUp == _qIsUp ? 0 : 1;
  503 + } else {
  504 + if ((timeObj.diff(_bcObj.getFcTimeObj())) > timediff) {
  505 + timediff = timeObj.diff(_bcObj.getFcTimeObj());
  506 + _lpIndex = _j;
  507 + _down_qIndex = _i;
  508 + _down_bIndex = isUp == _qIsUp ? 0 : 1;
  509 + }
  510 + }
  511 + }
  512 + }
  513 + }
  514 + }
  515 +
  516 + if (_lpIndex == undefined) {
  517 + return false;
  518 + }
  519 +
  520 + var bcindex = [];
  521 + bcindex.push(_lpIndex);
  522 + bcindex.push(_down_qIndex);
  523 + bcindex.push(_down_bIndex);
  524 +
  525 + return bcindex;
  526 + };
  527 +
431 return { 528 return {
432 //------------- 布局初始化方法 ------------// 529 //------------- 布局初始化方法 ------------//
433 /** 530 /**
@@ -465,6 +562,13 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -465,6 +562,13 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
465 //this._generateBc(17, 1, 1); 562 //this._generateBc(17, 1, 1);
466 //this._generateBc(18, 1, 1); 563 //this._generateBc(18, 1, 1);
467 564
  565 + // 6:31 8:30
  566 + // 16:01 18:00
  567 +
  568 + // 测试找上界
  569 + console.log("上界:" + _findUpClosedBcIndexWithTime(_paramObj.getMPeakStartTimeObj(), false));
  570 + console.log("下界:" + _findDownClosedBcIndexWithTime(_paramObj.getMPeakEndTimeObj(), false));
  571 +
468 // TODO: 572 // TODO:
469 573
470 // 测试时间判定 574 // 测试时间判定
@@ -482,11 +586,95 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -482,11 +586,95 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
482 // _factory 586 // _factory
483 //); 587 //);
484 588
  589 + // TODO:问题
  590 + // 1、中标线是直接赋值在具体位置的,没有修正班次时间
  591 + // 2、路牌间隔时间需要修正的
  592 +
485 }, 593 },
486 594
487 // TODO: 595 // TODO:
488 596
489 /** 597 /**
  598 + * 调整高峰班次,
  599 + * 初始化生成早高峰,晚高峰班次并不准确,因为根据高峰时间段,并不在一个完整圈内,应该是在两个或多个圈之间
  600 + * 当初始化定好布局后(上标线,中标线),然后确定每个路牌的班型(连班,分班,5休2分班)后
  601 + * 然后重新计算框在高峰时间段内的班次索引,不足的添加,之前多加的删除(只删除分班路牌上的)
  602 + * @param isZgf 是否早高峰
  603 + * @param isUp 是否上行
  604 + */
  605 + adjustGfbc : function(isZgf, isUp) {
  606 + var startTime; // 开始时间
  607 + var endTime; // 结束时间
  608 + var startBcIndex; // 开始班次索引
  609 + var endBcIndex; // 结束班次索引
  610 +
  611 + startTime = isZgf ? _paramObj.getMPeakStartTimeObj() : _paramObj.getEPeakStartTimeObj();
  612 + endTime = isZgf ? _paramObj.getMPeakEndTimeObj() : _paramObj.getEPeakEndTimeObj();
  613 +
  614 + startBcIndex = _findUpClosedBcIndexWithTime(startTime, isUp);
  615 + endBcIndex = _findDownClosedBcIndexWithTime(endTime, isUp);
  616 +
  617 + var _lpIndex;
  618 + var _qIndex;
  619 + var _bcIndex;
  620 + var _qInternelCount; // 高峰时间段中间包含的圈数
  621 + var i;
  622 + var j;
  623 +
  624 + var _lp;
  625 +
  626 + if (startBcIndex && endBcIndex) {
  627 + _lpIndex = startBcIndex[0];
  628 + _qIndex = startBcIndex[1];
  629 + _bcIndex = startBcIndex[2];
  630 +
  631 + // 处理头
  632 + // 删除头部多余班次
  633 + for (j = 0; j < _lpIndex; j++) {
  634 + _lp = _internalLpArray[j];
  635 + if (_lp.isBxFb() && _lp.getBc(_qIndex, _bcIndex)) {
  636 + _lp.removeBc(_qIndex, _bcIndex);
  637 + }
  638 + }
  639 +
  640 + for (j = _lpIndex; j < _internalLpArray.length; j++) {
  641 + _lp = _internalLpArray[j];
  642 + if (!_lp.getBc(_qIndex, _bcIndex)) {
  643 + _generateBcAndSetBc(j, _qIndex, _bcIndex);
  644 + }
  645 + }
  646 +
  647 + // 处理中间
  648 + _qInternelCount = endBcIndex[1] - startBcIndex[1] - 1;
  649 + for (i = 1; i <= _qInternelCount; i++) {
  650 + _lp = _internalLpArray[_qIndex + i];
  651 + if (!_lp.getBc(_qIndex + i, _bcIndex)) {
  652 + _generateBcAndSetBc(i, _qIndex + i, _bcIndex);
  653 + }
  654 + }
  655 +
  656 + // 处理尾部
  657 + _lpIndex = endBcIndex[0];
  658 + _qIndex = endBcIndex[1];
  659 + _bcIndex = endBcIndex[2];
  660 + for (j = 0; j < _lpIndex; j++) {
  661 + _lp = _internalLpArray[j];
  662 + if (!_lp.getBc(_qIndex, _bcIndex)) {
  663 + _generateBcAndSetBc(j, _qIndex, _bcIndex);
  664 + }
  665 + }
  666 + // 删除尾部多余的班次
  667 + for (j = _lpIndex; j < _internalLpArray.length; j++) {
  668 + _lp = _internalLpArray[j];
  669 + if (_lp.isBxFb() && _lp.getBc(_qIndex, _bcIndex)) {
  670 + _lp.removeBc(_qIndex, _bcIndex);
  671 + }
  672 + }
  673 + }
  674 +
  675 + },
  676 +
  677 + /**
490 * 补充做5休2的班型班次。 678 * 补充做5休2的班型班次。
491 * 1、做5休2的路牌总工时不能超过7个小时 679 * 1、做5休2的路牌总工时不能超过7个小时
492 * 2、5休2的路牌全部从早晚高峰班次开始往前补充1个班次,组成早晚2圈 680 * 2、5休2的路牌全部从早晚高峰班次开始往前补充1个班次,组成早晚2圈
@@ -501,27 +689,27 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -501,27 +689,27 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
501 var _qIndex; 689 var _qIndex;
502 var _bIndex; 690 var _bIndex;
503 691
504 - for (i = 0; i < _internalLpArray.length; i++) {  
505 - _lp = _internalLpArray[i];  
506 - if (_lp.isBxFb5_2()) {  
507 - _zgfbcpos = _lp.getMinBcObjPosition();  
508 - _wgfbcpos = _lp.getMaxBcObjPosition();  
509 -  
510 - // TODO:测试向前添加一个班次  
511 - _qIndex = _zgfbcpos[0];  
512 - _bIndex = _zgfbcpos[1];  
513 - _bIndex == 0 ?  
514 - _generateBcAndSetBc(i, _qIndex - 1, 1) :  
515 - _generateBcAndSetBc(i, _qIndex, 0);  
516 -  
517 - _qIndex = _wgfbcpos[0];  
518 - _bIndex = _wgfbcpos[1];  
519 - _bIndex == 0 ?  
520 - _generateBcAndSetBc(i, _qIndex - 1, 1) :  
521 - _generateBcAndSetBc(i, _qIndex, 0);  
522 -  
523 - }  
524 - } 692 + //for (i = 0; i < _internalLpArray.length; i++) {
  693 + // _lp = _internalLpArray[i];
  694 + // if (_lp.isBxFb5_2()) {
  695 + // _zgfbcpos = _lp.getMinBcObjPosition();
  696 + // _wgfbcpos = _lp.getMaxBcObjPosition();
  697 + //
  698 + // // TODO:测试向前添加一个班次
  699 + // _qIndex = _zgfbcpos[0];
  700 + // _bIndex = _zgfbcpos[1];
  701 + // _bIndex == 0 ?
  702 + // _generateBcAndSetBc(i, _qIndex - 1, 1) :
  703 + // _generateBcAndSetBc(i, _qIndex, 0);
  704 + //
  705 + // _qIndex = _wgfbcpos[0];
  706 + // _bIndex = _wgfbcpos[1];
  707 + // _bIndex == 0 ?
  708 + // _generateBcAndSetBc(i, _qIndex - 1, 1) :
  709 + // _generateBcAndSetBc(i, _qIndex, 0);
  710 + //
  711 + // }
  712 + //}
525 713
526 // 2、 714 // 2、
527 }, 715 },
@@ -637,10 +825,12 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -637,10 +825,12 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
637 var _c2_start_index; 825 var _c2_start_index;
638 for (i = 1; i <= _count - _c2; i++) { 826 for (i = 1; i <= _count - _c2; i++) {
639 _internalLpArray[(i - 1) * _c1].setBxLb(true); 827 _internalLpArray[(i - 1) * _c1].setBxLb(true);
  828 + _internalLpArray[(i - 1) * _c1].setBxDesc("连班");
640 _c2_start_index = (i - 1) * _c1; 829 _c2_start_index = (i - 1) * _c1;
641 } 830 }
642 for (i = 1; i <= _c2; i++) { 831 for (i = 1; i <= _c2; i++) {
643 _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxLb(true); 832 _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxLb(true);
  833 + _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxDesc("连班");
644 } 834 }
645 835
646 // 设定第二个区域的连班路牌 836 // 设定第二个区域的连班路牌
@@ -651,12 +841,14 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -651,12 +841,14 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
651 _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxLb(true); 841 _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxLb(true);
652 _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxFb(false); 842 _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxFb(false);
653 _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxFb5_2(false); 843 _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxFb5_2(false);
  844 + _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxDesc("连班");
654 _c2_start_index = (i - 1) * _c1 + _zbx_lpIndex; 845 _c2_start_index = (i - 1) * _c1 + _zbx_lpIndex;
655 } 846 }
656 for (i = 1; i <= _c2; i++) { 847 for (i = 1; i <= _c2; i++) {
657 _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxLb(true); 848 _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxLb(true);
658 _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxFb(false); 849 _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxFb(false);
659 _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxFb5_2(false); 850 _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxFb5_2(false);
  851 + _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxDesc("连班");
660 } 852 }
661 853
662 // 设定分班路牌 854 // 设定分班路牌
@@ -671,11 +863,13 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -671,11 +863,13 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
671 _internalLpArray[notlbIndexes[i]].setBxFb(false); 863 _internalLpArray[notlbIndexes[i]].setBxFb(false);
672 _internalLpArray[notlbIndexes[i]].setBxFb(true); 864 _internalLpArray[notlbIndexes[i]].setBxFb(true);
673 _internalLpArray[notlbIndexes[i]].setBxFb5_2(false); 865 _internalLpArray[notlbIndexes[i]].setBxFb5_2(false);
  866 + _internalLpArray[notlbIndexes[i]].setBxDesc("其他分班");
674 } 867 }
675 while (i < _bx_other_fb_lpcount + _bx_5_2_fb_lpcount) { 868 while (i < _bx_other_fb_lpcount + _bx_5_2_fb_lpcount) {
676 _internalLpArray[notlbIndexes[i]].setBxFb(false); 869 _internalLpArray[notlbIndexes[i]].setBxFb(false);
677 _internalLpArray[notlbIndexes[i]].setBxFb(true); 870 _internalLpArray[notlbIndexes[i]].setBxFb(true);
678 _internalLpArray[notlbIndexes[i]].setBxFb5_2(true); 871 _internalLpArray[notlbIndexes[i]].setBxFb5_2(true);
  872 + _internalLpArray[notlbIndexes[i]].setBxDesc("5休2分班");
679 873
680 i++; 874 i++;
681 } 875 }
@@ -712,7 +906,6 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) { @@ -712,7 +906,6 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
712 */ 906 */
713 toGanttBcArray: function() { 907 toGanttBcArray: function() {
714 var bcData = []; 908 var bcData = [];
715 - var i;  
716 var lpObj; 909 var lpObj;
717 for (i = 0; i < _internalLpArray.length; i++) { 910 for (i = 0; i < _internalLpArray.length; i++) {
718 lpObj = _internalLpArray[i]; 911 lpObj = _internalLpArray[i];
src/main/resources/static/pages/base/timesmodel/js/v2/main_v2.js
@@ -12,7 +12,7 @@ var Main_v2 = function() { @@ -12,7 +12,7 @@ var Main_v2 = function() {
12 return paramObj; 12 return paramObj;
13 }, 13 },
14 // 创建班次对象 14 // 创建班次对象
15 - createBcObj: function(bcType, isUp, lp, fcno, fcTimeObj, paramObj) { 15 + createBcObj: function(lpObj, bcType, isUp, fcno, fcTimeObj, paramObj) {
16 var _bclc = paramObj.calcuTravelLcNumber(isUp, bcType); 16 var _bclc = paramObj.calcuTravelLcNumber(isUp, bcType);
17 var _bcsj = paramObj.calcuTravelTime(fcTimeObj, isUp); 17 var _bcsj = paramObj.calcuTravelTime(fcTimeObj, isUp);
18 var _arrsj = paramObj.addMinute(fcTimeObj, _bcsj); 18 var _arrsj = paramObj.addMinute(fcTimeObj, _bcsj);
@@ -23,22 +23,22 @@ var Main_v2 = function() { @@ -23,22 +23,22 @@ var Main_v2 = function() {
23 var _qdz = isUp ? paramObj.getUpQdzObj().id : paramObj.getDownQdzObj().id; 23 var _qdz = isUp ? paramObj.getUpQdzObj().id : paramObj.getDownQdzObj().id;
24 var _zdz = isUp ? paramObj.getUpZdzObj().id : paramObj.getDownZdzObj().id; 24 var _zdz = isUp ? paramObj.getUpZdzObj().id : paramObj.getDownZdzObj().id;
25 25
26 - return new InternalBcObj(  
27 - bcType, // 班次类型(normal,in,out等)  
28 - isUp, // boolean是否上下行  
29 - lp, // 路牌标识符  
30 - fcno, // 发车顺序号  
31 - fcTimeObj, // 发车时间对象  
32 - _bclc, // 班次里程  
33 - _bcsj, // 班次历时  
34 - _arrsj, // 到达时间对象  
35 - _stoptime, // 停站时间  
36 - _tccid, // 停车场id  
37 - _ttinfoid, // 时刻表id  
38 - _xl, // 线路id  
39 - _qdz, // 起点站id  
40 - _zdz // 终点站id  
41 - ); 26 + var bcParamObj = {};
  27 + bcParamObj.bcType = bcType; // 班次类型(normal,in,out等)
  28 + bcParamObj.isUp = isUp; // boolean是否上下行
  29 + bcParamObj.fcno = fcno; // 发车顺序号
  30 + bcParamObj.fcTimeObj = fcTimeObj; // 发车时间对象
  31 + bcParamObj.bclc = _bclc; // 班次里程
  32 + bcParamObj.bcsj = _bcsj; // 班次历时
  33 + bcParamObj.arrtime = _arrsj; // 到达时间对象
  34 + bcParamObj.stoptime = _stoptime; // 停站时间
  35 + bcParamObj.tccid = _tccid; // 停车场id
  36 + bcParamObj.ttinfoid = _ttinfoid; // 时刻表id
  37 + bcParamObj.xl = _xl; // 线路id
  38 + bcParamObj.qdzid = _qdz; // 起点站id
  39 + bcParamObj.zdzid = _zdz; // 终点站id
  40 +
  41 + return new InternalBcObj(lpObj, bcParamObj);
42 } 42 }
43 }; 43 };
44 }; 44 };
@@ -86,15 +86,20 @@ var Main_v2 = function() { @@ -86,15 +86,20 @@ var Main_v2 = function() {
86 // 3、将连班路牌的班次补足 86 // 3、将连班路牌的班次补足
87 schedule.calcuLpBx_lb(); 87 schedule.calcuLpBx_lb();
88 88
89 - // 4、TODO:修正上下行班次,添加高峰不足的班次,删除高峰多余的班次 89 + // 4、修正针对初始化时生成的高峰班次,之前不足的补上,多余的删除
  90 + schedule.adjustGfbc(true, true); // 修正上行早高峰
  91 + schedule.adjustGfbc(true, false); // 修正下行早高峰
  92 + schedule.adjustGfbc(false, true); // 修正上行晚高峰
  93 + schedule.adjustGfbc(false, false); // 修正下行晚高峰
90 94
91 -  
92 - // 4、根据班型补充所有的不足班次 95 + // 5、TODO:根据班型补充所有的不足班次
93 schedule.calcuLpBx_5_2(); 96 schedule.calcuLpBx_5_2();
94 97
95 - // TODO:4、确定末班车 98 + // TODO:6、确定末班车
  99 +
  100 + // TODO:8、修正不准确的停站时间,微调发车间隔
96 101
97 - // TODO:5、补进出场班次 102 + // TODO:9、补进出场报道班次
98 103
99 104
100 //-------------------- 输出ganut图上的班次,班型描述 ----------------------// 105 //-------------------- 输出ganut图上的班次,班型描述 ----------------------//
src/main/resources/static/pages/base/timesmodel/tepms/fcjx_temp.html
@@ -231,7 +231,7 @@ @@ -231,7 +231,7 @@
231 231
232 <div class="col-md-6"> 232 <div class="col-md-6">
233 <label class="control-label col-md-5"> 233 <label class="control-label col-md-5">
234 - <span class="required"> * </span> 高峰建议配车数 :</label> 234 + <span class="required"> * </span> 建议高峰配车数 :</label>
235 <div class="col-md-5"> 235 <div class="col-md-5">
236 <input type="text" class="form-control" placeholder="车辆数" name="gfjypcs" id="gfjypcsInput" min="1"> 236 <input type="text" class="form-control" placeholder="车辆数" name="gfjypcs" id="gfjypcsInput" min="1">
237 </div> 237 </div>
@@ -477,7 +477,7 @@ @@ -477,7 +477,7 @@
477 </div> 477 </div>
478 478
479 <div class="col-md-6"> 479 <div class="col-md-6">
480 - <label class="control-label col-md-5"> 高峰建议配车数 : </label> 480 + <label class="control-label col-md-5"> 建议高峰配车数 : </label>
481 <div class="col-md-4"> 481 <div class="col-md-4">
482 <p class="form-control-static" data-display="gfjypcs"> </p> 482 <p class="form-control-static" data-display="gfjypcs"> </p>
483 </div> 483 </div>
src/main/resources/static/pages/forms/mould/scheduleDaily.xls
No preview for this file type
src/main/resources/static/pages/forms/statement/scheduleDaily.html
@@ -62,6 +62,7 @@ @@ -62,6 +62,7 @@
62 <div class="table-container" style="margin-top: 10px;min-width: 906px"> 62 <div class="table-container" style="margin-top: 10px;min-width: 906px">
63 <label>日期:<span id="rqxs"></span>&nbsp;&nbsp;&nbsp;&nbsp;早高峰:6:31~8:30&nbsp;&nbsp;&nbsp;&nbsp;晚高峰:16:01~18:00</label> 63 <label>日期:<span id="rqxs"></span>&nbsp;&nbsp;&nbsp;&nbsp;早高峰:6:31~8:30&nbsp;&nbsp;&nbsp;&nbsp;晚高峰:16:01~18:00</label>
64 <br/><label>计划+临加-少驶=<span id="jls"></span>&nbsp;&nbsp;计算机实驶:<span id="jsjss"></span></label> 64 <br/><label>计划+临加-少驶=<span id="jls"></span>&nbsp;&nbsp;计算机实驶:<span id="jsjss"></span></label>
  65 + &nbsp;&nbsp;当班调派:<span id="dbdp"></span></label>
65 <table class="table table-bordered table-hover table-checkable" id="forms"> 66 <table class="table table-bordered table-hover table-checkable" id="forms">
66 <thead> 67 <thead>
67 <tr> 68 <tr>
@@ -434,6 +435,7 @@ @@ -434,6 +435,7 @@
434 var scheduleDaily_1 = template('scheduleDaily_1',{list:result}); 435 var scheduleDaily_1 = template('scheduleDaily_1',{list:result});
435 $("#jls").html(result[0].jls); 436 $("#jls").html(result[0].jls);
436 $("#jsjss").html(result[0].sjgl); 437 $("#jsjss").html(result[0].sjgl);
  438 + $("#dbdp").html(result[0].dbdp);
437 $('#forms .scheduleDaily_1').html(scheduleDaily_1); 439 $('#forms .scheduleDaily_1').html(scheduleDaily_1);
438 }); 440 });
439 $.get('/realSchedule/queryUserInfo',{line:line,date:date,state:2,type:"query"},function(result){ 441 $.get('/realSchedule/queryUserInfo',{line:line,date:date,state:2,type:"query"},function(result){
src/main/resources/static/pages/oil/list_ph.html
@@ -674,7 +674,7 @@ onkeyup=&quot;this.value=this.value.replace(/[^(\d||/.)]/g,&#39;&#39;).replace(&#39;.&#39;,&#39;$#$&#39;).rep @@ -674,7 +674,7 @@ onkeyup=&quot;this.value=this.value.replace(/[^(\d||/.)]/g,&#39;&#39;).replace(&#39;.&#39;,&#39;$#$&#39;).rep
674 674
675 var l = layer.load(2); 675 var l = layer.load(2);
676 $get('/ylb/ylbList', params, function (data) { 676 $get('/ylb/ylbList', params, function (data) {
677 - 677 + console.log(data);
678 for(var i=1;i<data.length;i++){ 678 for(var i=1;i<data.length;i++){
679 moveArray[i]=new Array(); 679 moveArray[i]=new Array();
680 for(var j=1;j<6;j++){ 680 for(var j=1;j<6;j++){
src/main/resources/static/pages/summary/destory_sch_detail/list.html
1 -<!DOCTYPE html>  
2 -<html lang="zh-cn">  
3 -  
4 -<head>  
5 - <meta charset="UTF-8">  
6 - <link rel="stylesheet" href="/assets/plugins/uk3.0/uikit.min.css"/>  
7 - <link rel="stylesheet" href="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.css" />  
8 - <!-- flatpickr -->  
9 - <link rel="stylesheet" href="/real_control_v2/assets/plugins/flatpickr/flatpickr.min.css">  
10 - <style>  
11 - html,body{  
12 - height: 100%;  
13 - }  
14 - .ct_page{  
15 - padding: 25px 15px;  
16 - height: 100%;  
17 - height: calc(100% - 50px);  
18 - }  
19 -  
20 - .ct_cont{  
21 - height: calc(100% - 35px);  
22 - }  
23 -  
24 - .ct_cont>div>div.uk-card{  
25 - height: 99%;  
26 - }  
27 -  
28 - .loading{  
29 - height: 100%;  
30 - text-align: center;  
31 - }  
32 - .loading .uk-spinner{  
33 - margin-top: 200px;  
34 - }  
35 - .loading circle{  
36 - stroke: red;  
37 - }  
38 -  
39 - .ps-container > .ps-scrollbar-x-rail, .ps-container > .ps-scrollbar-y-rail{  
40 - opacity: 0.6 !important;  
41 - padding: 0 !important;  
42 - }  
43 -  
44 - .ct_destroy_sch_table_width th:nth-of-type(1),.ct_destroy_sch_table_width td:nth-of-type(1){  
45 - width: 9%;  
46 - }  
47 - .ct_destroy_sch_table_width th:nth-of-type(2),.ct_destroy_sch_table_width td:nth-of-type(2){  
48 - width: 9%;  
49 - }  
50 - .ct_destroy_sch_table_width th:nth-of-type(3),.ct_destroy_sch_table_width td:nth-of-type(3){  
51 - width: 9%;  
52 - }  
53 - .ct_destroy_sch_table_width th:nth-of-type(4),.ct_destroy_sch_table_width td:nth-of-type(4){  
54 - width: 9%;  
55 - }  
56 - .ct_destroy_sch_table_width th:nth-of-type(5),.ct_destroy_sch_table_width td:nth-of-type(5){  
57 - width: 9%;  
58 - }  
59 - .ct_destroy_sch_table_width th:nth-of-type(6),.ct_destroy_sch_table_width td:nth-of-type(6){  
60 - width: 9%;  
61 - }  
62 - .ct_destroy_sch_table_width th:nth-of-type(7),.ct_destroy_sch_table_width td:nth-of-type(7){  
63 - width: 8%;  
64 - }  
65 - .ct_destroy_sch_table_width th:nth-of-type(8),.ct_destroy_sch_table_width td:nth-of-type(8){  
66 - width: 8%;  
67 - }  
68 - .ct_destroy_sch_table_width th:nth-of-type(9),.ct_destroy_sch_table_width td:nth-of-type(9){  
69 - width: 8%;  
70 - }  
71 - .ct_destroy_sch_table_width th:nth-of-type(10),.ct_destroy_sch_table_width td:nth-of-type(10){  
72 - }  
73 -  
74 - .ct_search_form_wrap{  
75 - border-bottom: 1px solid #e5e5e5;  
76 - padding: 10px 0 25px 10px;  
77 - }  
78 - .ct_search_form_wrap .ct_field{  
79 - display: inline-block;  
80 - margin: 0 5px;  
81 - }  
82 -  
83 - .ct_search_form_wrap .ct_field label{  
84 - font-size: 14px;  
85 - }  
86 -  
87 - .ct_search_form_wrap .ct_field input{  
88 - width: 110px;  
89 - }  
90 -  
91 - .ct_search_form_wrap .ct_field select{  
92 - width: auto;  
93 - min-width: 100px;  
94 - }  
95 -  
96 - .ct_search_form_wrap .uk-button{  
97 - padding: 0 14px;  
98 - }  
99 -  
100 - .ct_search_form_wrap .uk-button i{  
101 - vertical-align: middle;  
102 - margin-top: -2px;  
103 - margin-right: 7px;  
104 - }  
105 -  
106 - .ct_table_wrap{  
107 - font-size: 14px;  
108 - height: calc(100% - 77px);  
109 - }  
110 -  
111 - .t_body_wrap{  
112 - height: calc(100% - 41px);  
113 - overflow: auto;  
114 - position: relative;  
115 - }  
116 -  
117 - .ct_field.ct_field_bottom{  
118 - vertical-align: bottom;  
119 - font-size: 12px;  
120 - margin-left: 0;  
121 - }  
122 - </style>  
123 -</head>  
124 -  
125 -<body>  
126 -<div class="loading">  
127 - <div uk-spinner></div>  
128 -</div>  
129 -<div class="ct_page" style="display: none;">  
130 - <h3 class="uk-heading-line uk-heading-bullet"><span>烂班明细统计</span></h3>  
131 - <div class="ct_cont" >  
132 - <div class="ct_search_form_wrap">  
133 - <form>  
134 - <div class="ct_field">  
135 - <label>公司:  
136 - <select class="uk-select" name="gsBm_eq">  
137 - </select>  
138 - </label>  
139 - </div>  
140 - <div class="ct_field">  
141 - <label>分公司:  
142 - <select class="uk-select" name="fgsBm_eq">  
143 - </select>  
144 - </label>  
145 - </div>  
146 - <div class="ct_field">  
147 - <label>线路:  
148 - <select class="uk-select" name="lineCode_eq">  
149 - </select>  
150 - </label>  
151 - </div>  
152 - <div class="ct_field">  
153 - <label>日期:  
154 - <input class="uk-input" name="rq" style="width: 220px;">  
155 - </label>  
156 - </div>  
157 - <div class="ct_field">  
158 - <button class="uk-button uk-button-primary search"><i uk-icon="icon: search"></i>搜索</button>  
159 - </div>  
160 - <div class="ct_field ct_field_bottom">  
161 - <button class="uk-button uk-button-text export_excel" style="padding: 0 5px;">导出数据</button>  
162 - </div>  
163 - <div class="ct_field ct_field_bottom">  
164 - <span uk-icon="icon: question" title="不统计进出场和子任务" uk-tooltip="pos: bottom"></span>  
165 - </div>  
166 - </form>  
167 - </div>  
168 - <div class="ct_table_wrap day">  
169 - <table class="uk-table uk-table-small ct_destroy_sch_table_width" style="margin-bottom: 0;">  
170 - <thead>  
171 - <tr>  
172 - <th>日期</th>  
173 - <th>线路</th>  
174 - <th>车号</th>  
175 - <th>司机</th>  
176 - <th>售票员</th>  
177 - <th>原因</th>  
178 - <th>班次</th>  
179 - <th>烂班公里</th>  
180 - <th>烂班时间</th>  
181 - <th>备注</th>  
182 - </tr>  
183 - </thead>  
184 - </table>  
185 - <div class="t_body_wrap">  
186 - <table class="uk-table uk-table-divider uk-table-hover uk-table-small ct_destroy_sch_table ct_destroy_sch_table_width">  
187 - <tbody>  
188 - </tbody>  
189 - </table>  
190 - </div>  
191 - </div>  
192 - </div>  
193 -</div>  
194 -  
195 -<script id="destroy_sch_list_temp" type="text/html">  
196 - {{each list as obj i}}  
197 - <tr>  
198 - <td>{{obj.rq}}</td>  
199 - <td>{{obj.lineName}}</td>  
200 - <td>{{obj.nbbm}}</td>  
201 - <td>{{obj.jGh}}</td>  
202 - <td>{{obj.sGh}}</td>  
203 - <td>{{obj.reason}}</td>  
204 - <td><a style="text-decoration: underline;">{{obj.size}}</a></td>  
205 - <td>{{obj.mileage}}</td>  
206 - <td>{{obj.timeStr}}</td>  
207 - <td>{{obj.remark}}</td>  
208 - </tr>  
209 - {{/each}}  
210 -</script>  
211 -  
212 -<script src="/metronic_v4.5.4/plugins/jquery.min.js"></script>  
213 -<script src="/assets/plugins/uk3.0/uikit.min.js"></script>  
214 -<script src="/assets/plugins/uk3.0/uikit-icons.min.js"></script>  
215 -<script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js" ></script>  
216 -<!-- EventProxy -->  
217 -<script src="/assets/js/eventproxy.js"></script>  
218 -<!-- art-template 模版引擎 -->  
219 -<script src="/assets/plugins/template.js"></script>  
220 -<script src="/real_control_v2/assets/plugins/moment/moment.min.js"></script>  
221 -<!-- jquery.serializejson JSON序列化插件 -->  
222 -<script src="/assets/plugins/jquery.serializejson.js" merge="plugins"></script>  
223 -<!-- flatpickr -->  
224 -<script src="/real_control_v2/assets/plugins/flatpickr/flatpickr.min.js" ></script>  
225 -<script src="/real_control_v2/assets/plugins/flatpickr/l10n/zh.js" ></script>  
226 -<script>  
227 -  
228 - var f = $('form', '');  
229 - //var page=0, pageSize=120;  
230 -  
231 - var ep = EventProxy.create('query_comps', 'query_lines', function () {  
232 - $('[name=gsBm_eq]', f).trigger('change');//公司change  
233 - query();  
234 -  
235 - $('.loading').remove();  
236 - $('.ct_page').show();  
237 - });  
238 -  
239 - //点击搜索  
240 - $('button.search', f).on('click', query);  
241 -  
242 - function query() {  
243 - $('button.search', f).attr('disabled', 'disabled');  
244 - var data = f.serializeJSON();  
245 - $('.ct_destroy_sch_table tbody').html('');  
246 - //开始结束时间  
247 - data.rq_ge = data.rq.substr(0, 10);  
248 - data.rq_le = data.rq.substr(13);  
249 - data.order='t';  
250 - delete data.rq;  
251 -  
252 - $.get('/summary/destroy_detail/all', data, function (rs) {  
253 - $('button.search', f).removeAttr('disabled');  
254 - if(!rs || rs.length==0)  
255 - return UIkit.notification('没有搜索到相关数据!!', 'danger');  
256 - $.each(rs, function () {  
257 - this.timeStr=moment(this.t).format('HH:mm')  
258 - });  
259 -  
260 - var htmlStr = template('destroy_sch_list_temp', {list: rs});  
261 - $('.ct_destroy_sch_table tbody').html(htmlStr);  
262 - $('.t_body_wrap').perfectScrollbar('update');  
263 - });  
264 - }  
265 -  
266 -  
267 - //日期选择框  
268 - var fs='YYYY-MM-DD'  
269 - , ets=moment().subtract(1, 'days').format(fs)  
270 - , sts=moment().subtract(3, 'days').format(fs);  
271 - flatpickr('.ct_search_form_wrap [name=rq]', {  
272 - mode: "range", dateFormat: "Y-m-d","locale": "zh", defaultDate: [sts, ets]  
273 - });  
274 - var comps;  
275 - //构建公司级联下拉框  
276 - $.get('/user/companyData', function (rs) {  
277 - comps = rs;  
278 - var opts = '';  
279 - for(var i=0,obj;obj=comps[i++];){  
280 - opts += '<option value="'+obj.companyCode+'">'+obj.companyName+'</option>';  
281 - }  
282 - $('[name=gsBm_eq]', f).html(opts);  
283 - ep.emit('query_comps');  
284 - });  
285 -  
286 - var lineMapps;  
287 - //加载线路信息  
288 - $.get('/line/all', {'destroy_eq': 0}, function (rs) {  
289 - rs.sort(function (a, b) {  
290 - return a.name.localeCompare(b.name);  
291 - });  
292 - lineMapps={};  
293 - var k;  
294 - $.each(rs, function () {  
295 - k = this.company+'_'+this.brancheCompany;  
296 - if(!lineMapps[k])  
297 - lineMapps[k]=[];  
298 - lineMapps[k].push(this);  
299 - });  
300 -  
301 - ep.emit('query_lines');  
302 - });  
303 -  
304 - $('[name=gsBm_eq]', f).on('change', function () {  
305 - var code = $(this).val(), subs=[];  
306 - $.each(comps, function () {  
307 - if(this.companyCode==code)  
308 - subs=this.children;  
309 - });  
310 -  
311 - var opts='';  
312 - $.each(subs, function () {  
313 - opts += '<option value="'+this.code+'">'+this.name+'</option>';  
314 - });  
315 - $('[name=fgsBm_eq]', f).html(opts).trigger('change');  
316 - });  
317 -  
318 - $('[name=fgsBm_eq]', f).on('change', function () {  
319 - var k = $('[name=gsBm_eq]', f).val() + '_' + $(this).val();  
320 - var array = lineMapps[k];  
321 - var opts = '<option value="">全部</option>';  
322 - if(array){  
323 - $.each(array, function () {  
324 - opts += '<option value="'+this.lineCode+'">'+this.name+'</option>';  
325 - });  
326 - }  
327 - $('[name=lineCode_eq]', f).html(opts);  
328 - });  
329 -  
330 - //  
331 - //滚动条  
332 - $('.t_body_wrap').perfectScrollbar({suppressScrollX: true});  
333 -  
334 - $(document).on('submit', 'form', function () {  
335 - return false;  
336 - });  
337 -  
338 - /**  
339 - * 导出  
340 - */  
341 - $('.export_excel').on('click', function () {  
342 - var data = f.serializeJSON();  
343 - data.rq_ge = data.rq.substr(0, 10);  
344 - data.rq_le = data.rq.substr(13);  
345 - data.order='t';  
346 - delete data.rq;  
347 -  
348 - window.open('/summary/destroy_detail/excel?' + $.param(data));  
349 - });  
350 -  
351 -</script>  
352 -</body> 1 +<!DOCTYPE html>
  2 +<html lang="zh-cn">
  3 +
  4 +<head>
  5 + <meta charset="UTF-8">
  6 + <link rel="stylesheet" href="/assets/plugins/uk3.0/uikit.min.css"/>
  7 + <link rel="stylesheet" href="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.css" />
  8 + <!-- flatpickr -->
  9 + <link rel="stylesheet" href="/real_control_v2/assets/plugins/flatpickr/flatpickr.min.css">
  10 + <style>
  11 + html,body{
  12 + height: 100%;
  13 + }
  14 + .ct_page{
  15 + padding: 25px 15px;
  16 + height: 100%;
  17 + height: calc(100% - 50px);
  18 + }
  19 +
  20 + .ct_cont{
  21 + height: calc(100% - 35px);
  22 + }
  23 +
  24 + .ct_cont>div>div.uk-card{
  25 + height: 99%;
  26 + }
  27 +
  28 + .loading{
  29 + height: 100%;
  30 + text-align: center;
  31 + }
  32 + .loading .uk-spinner{
  33 + margin-top: 200px;
  34 + }
  35 + .loading circle{
  36 + stroke: red;
  37 + }
  38 +
  39 + .ps-container > .ps-scrollbar-x-rail, .ps-container > .ps-scrollbar-y-rail{
  40 + opacity: 0.6 !important;
  41 + padding: 0 !important;
  42 + }
  43 +
  44 + .ct_destroy_sch_table_width th:nth-of-type(1),.ct_destroy_sch_table_width td:nth-of-type(1){
  45 + width: 9%;
  46 + }
  47 + .ct_destroy_sch_table_width th:nth-of-type(2),.ct_destroy_sch_table_width td:nth-of-type(2){
  48 + width: 9%;
  49 + }
  50 + .ct_destroy_sch_table_width th:nth-of-type(3),.ct_destroy_sch_table_width td:nth-of-type(3){
  51 + width: 9%;
  52 + }
  53 + .ct_destroy_sch_table_width th:nth-of-type(4),.ct_destroy_sch_table_width td:nth-of-type(4){
  54 + width: 9%;
  55 + }
  56 + .ct_destroy_sch_table_width th:nth-of-type(5),.ct_destroy_sch_table_width td:nth-of-type(5){
  57 + width: 9%;
  58 + }
  59 + .ct_destroy_sch_table_width th:nth-of-type(6),.ct_destroy_sch_table_width td:nth-of-type(6){
  60 + width: 9%;
  61 + }
  62 + .ct_destroy_sch_table_width th:nth-of-type(7),.ct_destroy_sch_table_width td:nth-of-type(7){
  63 + width: 8%;
  64 + }
  65 + .ct_destroy_sch_table_width th:nth-of-type(8),.ct_destroy_sch_table_width td:nth-of-type(8){
  66 + width: 8%;
  67 + }
  68 + .ct_destroy_sch_table_width th:nth-of-type(9),.ct_destroy_sch_table_width td:nth-of-type(9){
  69 + width: 8%;
  70 + }
  71 + .ct_destroy_sch_table_width th:nth-of-type(10),.ct_destroy_sch_table_width td:nth-of-type(10){
  72 + }
  73 +
  74 + .ct_search_form_wrap{
  75 + border-bottom: 1px solid #e5e5e5;
  76 + padding: 10px 0 25px 10px;
  77 + }
  78 + .ct_search_form_wrap .ct_field{
  79 + display: inline-block;
  80 + margin: 0 5px;
  81 + }
  82 +
  83 + .ct_search_form_wrap .ct_field label{
  84 + font-size: 14px;
  85 + }
  86 +
  87 + .ct_search_form_wrap .ct_field input{
  88 + width: 110px;
  89 + }
  90 +
  91 + .ct_search_form_wrap .ct_field select{
  92 + width: auto;
  93 + min-width: 100px;
  94 + }
  95 +
  96 + .ct_search_form_wrap .uk-button{
  97 + padding: 0 14px;
  98 + }
  99 +
  100 + .ct_search_form_wrap .uk-button i{
  101 + vertical-align: middle;
  102 + margin-top: -2px;
  103 + margin-right: 7px;
  104 + }
  105 +
  106 + .ct_table_wrap{
  107 + font-size: 14px;
  108 + height: calc(100% - 77px);
  109 + }
  110 +
  111 + .t_body_wrap{
  112 + height: calc(100% - 41px);
  113 + overflow: auto;
  114 + position: relative;
  115 + }
  116 +
  117 + .ct_field.ct_field_bottom{
  118 + vertical-align: bottom;
  119 + font-size: 12px;
  120 + margin-left: 0;
  121 + }
  122 + </style>
  123 +</head>
  124 +
  125 +<body>
  126 +<div class="loading">
  127 + <div uk-spinner></div>
  128 +</div>
  129 +<div class="ct_page" style="display: none;">
  130 + <h3 class="uk-heading-line uk-heading-bullet"><span>烂班明细统计</span></h3>
  131 + <div class="ct_cont" >
  132 + <div class="ct_search_form_wrap">
  133 + <form>
  134 + <div class="ct_field">
  135 + <label>公司:
  136 + <select class="uk-select" name="gsBm_eq">
  137 + </select>
  138 + </label>
  139 + </div>
  140 + <div class="ct_field">
  141 + <label>分公司:
  142 + <select class="uk-select" name="fgsBm_eq">
  143 + </select>
  144 + </label>
  145 + </div>
  146 + <div class="ct_field">
  147 + <label>线路:
  148 + <select class="uk-select" name="lineCode_eq">
  149 + </select>
  150 + </label>
  151 + </div>
  152 + <div class="ct_field">
  153 + <label>日期:
  154 + <input class="uk-input" name="rq" style="width: 220px;">
  155 + </label>
  156 + </div>
  157 + <div class="ct_field">
  158 + <button class="uk-button uk-button-primary search"><i uk-icon="icon: search"></i>搜索</button>
  159 + </div>
  160 + <div class="ct_field ct_field_bottom">
  161 + <button class="uk-button uk-button-text export_excel" style="padding: 0 5px;">导出数据</button>
  162 + </div>
  163 + <div class="ct_field ct_field_bottom">
  164 + <span uk-icon="icon: question" title="不统计进出场和子任务" uk-tooltip="pos: bottom"></span>
  165 + </div>
  166 + </form>
  167 + </div>
  168 + <div class="ct_table_wrap day">
  169 + <table class="uk-table uk-table-small ct_destroy_sch_table_width" style="margin-bottom: 0;">
  170 + <thead>
  171 + <tr>
  172 + <th>日期</th>
  173 + <th>线路</th>
  174 + <th>车号</th>
  175 + <th>司机</th>
  176 + <th>售票员</th>
  177 + <th>原因</th>
  178 + <th>班次</th>
  179 + <th>烂班公里</th>
  180 + <th>烂班时间</th>
  181 + <th>备注</th>
  182 + </tr>
  183 + </thead>
  184 + </table>
  185 + <div class="t_body_wrap">
  186 + <table class="uk-table uk-table-divider uk-table-hover uk-table-small ct_destroy_sch_table ct_destroy_sch_table_width">
  187 + <tbody>
  188 + </tbody>
  189 + </table>
  190 + </div>
  191 + </div>
  192 + </div>
  193 +</div>
  194 +
  195 +<script id="destroy_sch_list_temp" type="text/html">
  196 + {{each list as obj i}}
  197 + <tr>
  198 + <td>{{obj.rq}}</td>
  199 + <td>{{obj.lineName}}</td>
  200 + <td>{{obj.nbbm}}</td>
  201 + <td>{{obj.jGh}}</td>
  202 + <td>{{obj.sGh}}</td>
  203 + <td>{{obj.reason}}</td>
  204 + <td><a style="text-decoration: underline;">{{obj.size}}</a></td>
  205 + <td>{{obj.mileage}}</td>
  206 + <td>{{obj.timeStr}}</td>
  207 + <td>{{obj.remark}}</td>
  208 + </tr>
  209 + {{/each}}
  210 +</script>
  211 +
  212 +<script src="/metronic_v4.5.4/plugins/jquery.min.js"></script>
  213 +<script src="/assets/plugins/uk3.0/uikit.min.js"></script>
  214 +<script src="/assets/plugins/uk3.0/uikit-icons.min.js"></script>
  215 +<script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js" ></script>
  216 +<!-- EventProxy -->
  217 +<script src="/assets/js/eventproxy.js"></script>
  218 +<!-- art-template 模版引擎 -->
  219 +<script src="/assets/plugins/template.js"></script>
  220 +<script src="/real_control_v2/assets/plugins/moment/moment.min.js"></script>
  221 +<!-- jquery.serializejson JSON序列化插件 -->
  222 +<script src="/assets/plugins/jquery.serializejson.js" merge="plugins"></script>
  223 +<!-- flatpickr -->
  224 +<script src="/real_control_v2/assets/plugins/flatpickr/flatpickr.min.js" ></script>
  225 +<script src="/real_control_v2/assets/plugins/flatpickr/l10n/zh.js" ></script>
  226 +<script>
  227 +
  228 + var f = $('form', '');
  229 + //var page=0, pageSize=120;
  230 +
  231 + var ep = EventProxy.create('query_comps', 'query_lines', function () {
  232 + $('[name=gsBm_eq]', f).trigger('change');//公司change
  233 + query();
  234 +
  235 + $('.loading').remove();
  236 + $('.ct_page').show();
  237 + });
  238 +
  239 + //点击搜索
  240 + $('button.search', f).on('click', query);
  241 +
  242 + function query() {
  243 + $('button.search', f).attr('disabled', 'disabled');
  244 + var data = f.serializeJSON();
  245 + $('.ct_destroy_sch_table tbody').html('');
  246 + //开始结束时间
  247 + data.rq_ge = data.rq.substr(0, 10);
  248 + data.rq_le = data.rq.substr(13);
  249 + data.order='t';
  250 + delete data.rq;
  251 +
  252 + $.get('/summary/destroy_detail/all', data, function (rs) {
  253 + $('button.search', f).removeAttr('disabled');
  254 + if(!rs || rs.length==0)
  255 + return UIkit.notification('没有搜索到相关数据!!', 'danger');
  256 + $.each(rs, function () {
  257 + this.timeStr=moment(this.t).format('HH:mm')
  258 + });
  259 +
  260 + var htmlStr = template('destroy_sch_list_temp', {list: rs});
  261 + $('.ct_destroy_sch_table tbody').html(htmlStr);
  262 + $('.t_body_wrap').perfectScrollbar('update');
  263 + });
  264 + }
  265 +
  266 +
  267 + //日期选择框
  268 + var fs='YYYY-MM-DD'
  269 + , ets=moment().subtract(1, 'days').format(fs)
  270 + , sts=moment().subtract(3, 'days').format(fs);
  271 + flatpickr('.ct_search_form_wrap [name=rq]', {
  272 + mode: "range", dateFormat: "Y-m-d","locale": "zh", defaultDate: [sts, ets]
  273 + });
  274 + var comps;
  275 + //构建公司级联下拉框
  276 + $.get('/user/companyData', function (rs) {
  277 + comps = rs;
  278 + var opts = '';
  279 + for(var i=0,obj;obj=comps[i++];){
  280 + opts += '<option value="'+obj.companyCode+'">'+obj.companyName+'</option>';
  281 + }
  282 + $('[name=gsBm_eq]', f).html(opts);
  283 + ep.emit('query_comps');
  284 + });
  285 +
  286 + var lineMapps;
  287 + //加载线路信息
  288 + $.get('/line/all', {'destroy_eq': 0}, function (rs) {
  289 + rs.sort(function (a, b) {
  290 + return a.name.localeCompare(b.name);
  291 + });
  292 + lineMapps={};
  293 + var k;
  294 + $.each(rs, function () {
  295 + k = this.company+'_'+this.brancheCompany;
  296 + if(!lineMapps[k])
  297 + lineMapps[k]=[];
  298 + lineMapps[k].push(this);
  299 + });
  300 +
  301 + ep.emit('query_lines');
  302 + });
  303 +
  304 + $('[name=gsBm_eq]', f).on('change', function () {
  305 + var code = $(this).val(), subs=[];
  306 + $.each(comps, function () {
  307 + if(this.companyCode==code)
  308 + subs=this.children;
  309 + });
  310 +
  311 + var opts='';
  312 + $.each(subs, function () {
  313 + opts += '<option value="'+this.code+'">'+this.name+'</option>';
  314 + });
  315 + $('[name=fgsBm_eq]', f).html(opts).trigger('change');
  316 + });
  317 +
  318 + $('[name=fgsBm_eq]', f).on('change', function () {
  319 + var k = $('[name=gsBm_eq]', f).val() + '_' + $(this).val();
  320 + var array = lineMapps[k];
  321 + var opts = '<option value="">全部</option>';
  322 + if(array){
  323 + $.each(array, function () {
  324 + opts += '<option value="'+this.lineCode+'">'+this.name+'</option>';
  325 + });
  326 + }
  327 + $('[name=lineCode_eq]', f).html(opts);
  328 + });
  329 +
  330 + //
  331 + //滚动条
  332 + $('.t_body_wrap').perfectScrollbar({suppressScrollX: true});
  333 +
  334 + $(document).on('submit', 'form', function () {
  335 + return false;
  336 + });
  337 +
  338 + /**
  339 + * 导出
  340 + */
  341 + $('.export_excel').on('click', function () {
  342 + var data = f.serializeJSON();
  343 + data.rq_ge = data.rq.substr(0, 10);
  344 + data.rq_le = data.rq.substr(13);
  345 + data.order='t';
  346 + delete data.rq;
  347 +
  348 + window.open('/summary/destroy_detail/excel?' + $.param(data));
  349 + });
  350 +
  351 +</script>
  352 +</body>
353 </html> 353 </html>
354 \ No newline at end of file 354 \ No newline at end of file