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 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 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 128 Dlb t1=dlList.get(k);
129 129 if(t1.getNbbm().equals(map.get("clZbh").toString())
130 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 134 t=t1;
134 135 type="update";
... ... @@ -194,6 +195,7 @@ public class DlbServiceImpl extends BaseServiceImpl&lt;Dlb,Integer&gt; implements DlbS
194 195 t.setSsgsdm(map.get("company")==null?"":map.get("company").toString());
195 196 t.setFgsdm(map.get("bCompany")==null?"":map.get("bCompany").toString());
196 197 t.setJhsj(map.get("fcsj")==null?"":map.get("fcsj").toString());
  198 + t.setLp(map.get("lpName").toString());
197 199 t.setRq(sdf.parse(rq));
198 200 t.setCreatetime(new Date());
199 201 /*if(type.equals("add")){
... ... @@ -560,9 +562,15 @@ public class DlbServiceImpl extends BaseServiceImpl&lt;Dlb,Integer&gt; implements DlbS
560 562 long l=Math.round(nextJzyl);
561 563 double ylxs=l*100/100;
562 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 574 }else{
567 575 t.setHd(0.0);
568 576 t.setCdl(0.0);
... ... @@ -586,9 +594,15 @@ public class DlbServiceImpl extends BaseServiceImpl&lt;Dlb,Integer&gt; implements DlbS
586 594  
587 595 }
588 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 606 }else{
593 607 t.setHd(0.0);
594 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 128 Ylb t1=ylList.get(k);
129 129 if(t1.getNbbm().equals(map.get("clZbh").toString())
130 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 134 t=t1;
134 135 type="update";
... ... @@ -618,13 +619,13 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
618 619 czyl = t.getCzyl();
619 620 zyl =jzl;
620 621 Double yh=0.0;
621   - if(zlc>0){
  622 + if(zlc>0 ){
622 623 yh = Double.parseDouble(df.format(zyl * (t.getZlc() / zlc)));
623 624 }
624 625 nextJzyl =Arith.sub( Arith.add(Arith.sub(t.getJzl(),t.getSh()), t.getCzyl()),yh);
625 626 //把进场油量的小数和整数分别取出
626 627 // int ylxs=(int) nextJzyl; 10.6--11 10.3--10
627   - if(zlc>0){
  628 + if(zlc>0 && t.getZlc()>0){
628 629 long l=Math.round(nextJzyl);
629 630 double ylxs=l*100/100;
630 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 644 yh= Double.parseDouble(df.format(zyl * (t.getZlc() / zlc)));
644 645 }
645 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 648 long l=0l;
648 649 double ylxs=0.0;
649 650 if(j==iterator2.size()-1){
650 651 ylxs=czyl;
651 652 }else{
652   -// l=Math.round(nextJzyl);
653   -// ylxs=l*100/100;
654 653 if(iterator2.get(j+1).getNbbm().equals(t.getNbbm())){
655 654 l=Math.round(nextJzyl);
656 655 ylxs=l*100/100;
... ... @@ -693,154 +692,6 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
693 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 1166 String nbbm =jsonObject.getString("nbbm");
1316 1167 String rq=jsonObject.getString("rq");
1317 1168 double yh = Arith.sub(Arith.add(czyl, jzl), jzyl);
  1169 + if(yh<0){
  1170 + yh=0.0;
  1171 + }
1318 1172 /*t.setJzyl(jzyl);
1319 1173 t.setSh(sh);
1320 1174 t.setShyy(shyy);
... ... @@ -1417,10 +1271,10 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
1417 1271 yh = Double.parseDouble(df.format(zyl * (t.getZlc() / zlc)));
1418 1272 }
1419 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 1275 long l=Math.round(nextJzyl);
1422 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 1278 yh=Arith.add(yh, Arith.sub(nextJzyl,ylxs));
1425 1279 t.setYh(yh);
1426 1280 t.setJzyl(ylxs);
... ... @@ -1436,11 +1290,11 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
1436 1290 }
1437 1291 t.setCzyl(nextJzyl);
1438 1292 Double yh =0.0;
1439   - if (t.getZlc() != 0) {
  1293 + if (t.getZlc() >= 0) {
1440 1294 yh= Double.parseDouble(df.format(zyl * (t.getZlc() / zlc)));
1441 1295 }
1442 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 1298 long l=0l;
1445 1299 double ylxs=0.0;
1446 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 2348 map.put("djg_time", m.get("djgsj"));
2349 2349 map.put("jls", Arith.sub(Arith.add(jhlc, ljgl), lbgl));
2350 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 2373 return lMap;
2352 2374 }
2353 2375  
... ... @@ -4195,9 +4217,31 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
4195 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 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 4245 SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
4202 4246 sdfSimple = new SimpleDateFormat("yyyyMMdd");
4203 4247 Map<String, Object> m = new HashMap<String, Object>();
... ... @@ -4215,7 +4259,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
4215 4259 sourcePath = path + "mould/scheduleDaily_m.xls";
4216 4260 }
4217 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 4263 } catch (Exception e) {
4220 4264 // TODO: handle exception
4221 4265 e.printStackTrace();
... ...
src/main/java/com/bsth/service/report/impl/ReportServiceImpl.java
... ... @@ -1929,6 +1929,9 @@ public class ReportServiceImpl implements ReportService{
1929 1929 newMap.put("jhglzgf", culateService.culateJhgl_(sList,"zgf"));
1930 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 1935 newMap.put("sjbc", culateService.culateSjbc(lists,""));
1933 1936 newMap.put("sjbczgf", culateService.culateSjbc(lists,"zgf"));
1934 1937 newMap.put("sjbcwgf", culateService.culateSjbc(lists,"wgf"));
... ... @@ -1936,8 +1939,7 @@ public class ReportServiceImpl implements ReportService{
1936 1939 newMap.put("sjglzgf", culateService.culateSjgl_(lists,"zgf"));
1937 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 1943 newMap.put("ljgl", culateService.culateLjgl(lists));
1942 1944 newMap.put("ljglzgf", culateService.culateLjgl_(lists,"zgf"));
1943 1945 newMap.put("ljglwgf", culateService.culateLjgl_(lists,"wgf"));
... ...
src/main/resources/static/pages/base/timesmodel/gantt.html
... ... @@ -121,7 +121,7 @@
121 121 <script src="/pages/base/timesmodel/js/base-fun.js"></script>
122 122 <script src="/pages/base/timesmodel/js/v2/ParameterObj.js"></script>
123 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 125 <script src="/pages/base/timesmodel/js/v2/core/InternalLpObj.js"></script>
126 126 <script src="/pages/base/timesmodel/js/v2/core/InternalScheduleObj.js"></script>
127 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 797 var temp = [];
798 798 temp.push(allLMapBc[0]);
799 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 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 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 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 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 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 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 3 * @constructor
4 4 */
5 5 var InternalLpObj = function(
6   - lp, // 路牌编号
  6 + orilpObj, // 原始路牌对象
7 7 qCount, // 总共多少圈
8 8 isUp // 圈是以上行开始还是下行开始
9 9 ) {
10   - this._$_lp = lp;
  10 + // TODO:原始路牌对象(这个路牌是对接外部gantt图像,以后有机会改了)
  11 + this._$$_orign_lp_obj = orilpObj;
  12 +
11 13 this._$_isUp = isUp;
12 14  
13 15 // 距离上一个路牌的最小发车间隔时间
... ... @@ -26,19 +28,85 @@ var InternalLpObj = function(
26 28  
27 29 var i;
28 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 36 this._$_bx_isLb = false; // 是否连班
35 37 this._$_bx_isfb = false; // 是否分班
36 38 this._$_bx_isfb_5_2 = false; // 是否5休2分班
  39 + this._$_bx_desc; // 班型描述(默认为路牌编号)
37 40  
38 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 110 InternalLpObj.prototype.setBxFb5_2 = function(fb) {
43 111 this._$_bx_isfb_5_2 = fb;
44 112 };
... ... @@ -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 150 * @param v
65 151 */
... ... @@ -75,6 +161,8 @@ InternalLpObj.prototype.getVerticalMinIntervalTime = function() {
75 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 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 209 * @returns [{圈index},{班次index}]
103 210 */
... ... @@ -141,36 +248,117 @@ InternalLpObj.prototype.getMaxBcObjPosition = function() {
141 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 276 var i;
  277 + var timediff; // 时间差取绝对值
  278 + var qIndex;
  279 + var bcIndex;
  280 +
161 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 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 364 * @param startTime 开始时间
... ... @@ -195,7 +383,7 @@ InternalLpObj.prototype.initDataFromTimeToTime = function(
195 383 var bcCount = 1; // 班次数
196 384 do {
197 385 bcObj = factory.createBcObj(
198   - "normal", isUp, this._$_lp, fcno, kssj, paramObj);
  386 + this, "normal", isUp, fcno, kssj, paramObj); // this就是所属路牌对象
199 387 bcData.push(bcObj);
200 388  
201 389 kssj = paramObj.addMinute(kssj, bcObj.getBcTime() + bcObj.getStopTime());
... ... @@ -210,19 +398,23 @@ InternalLpObj.prototype.initDataFromTimeToTime = function(
210 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 407 * @param bcArray 连班班次数组
220 408 * @param fromQ 从第几圈开始加入
221 409 */
222   -InternalLpObj.prototype.initDataFromLbBcArray = function(
  410 +InternalLpObj.prototype._initDataFromLbBcArray = function(
223 411 bcArray,
224 412 fromQ
225 413 ) {
  414 + var _bc1Obj;
  415 + var _bc2Obj;
  416 + var _qObj;
  417 +
226 418 // 第一班次是上行还是下行
227 419 var isUp = bcArray[0].isUp();
228 420  
... ... @@ -231,12 +423,16 @@ InternalLpObj.prototype.initDataFromLbBcArray = function(
231 423 if (isUp != this._$_isUp) {
232 424 // 如果方向不一致,意味着第一个班次是半圈
233 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 436 bcArray.splice(0, 1);
241 437 fromQ ++;
242 438 }
... ... @@ -246,22 +442,31 @@ InternalLpObj.prototype.initDataFromLbBcArray = function(
246 442  
247 443 while (fromQ < this._$_qCount) {
248 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 457 bcArray.splice(0, 2);
256 458 qCount1 --;
257 459 } else if (qCount2 > 0) {
258 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 470 } else {
266 471 break;
267 472 }
... ... @@ -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 16 var _internalLpArray = []; // 内部对象数组
17 17  
18 18 var _initFun1 = function() { // 初始化方法1
  19 +
  20 + //----------------------- 1、确定上标线的方向,圈的方向 -------------------//
  21 +
19 22 // 确定_qIsUp,哪个方向的首班车晚就用哪个
20 23 _qIsUp = _paramObj.getUpFirstDTimeObj().isBefore(
21 24 _paramObj.getDownFirstDTimeObj()) ? false : true;
... ... @@ -33,27 +36,33 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
33 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 46 var isUp = _qIsUp; // 方向
40   - var kssj = st;
41   - var fcno = 1; // 发车顺序号
42 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 58 bcCount ++;
51 59 isUp = !isUp;
52   - } while(kssj.isBefore(et));
  60 + } while(_kssj.isBefore(et));
53 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 66 bcCount--;
58 67 }
59 68 var _qCount_p1 = Math.floor(bcCount / 2); // 2个班次一圈
... ... @@ -81,13 +90,15 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
81 90 }
82 91 }
83 92  
  93 + //------------------------ 3、根据路牌数,圈数创建路牌对象 ----------------------//
  94 +
84 95 // 创建内部的路牌数组,并把之前的连班路牌添加进上标线路牌中
85 96 var i;
86 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 103 console.log("//---------------- 行车计划,初始化方法1 start ----------------//");
93 104 console.log("上行首班车时间:" + _paramObj.getUpFirstDTimeObj().format("HH:mm") +
... ... @@ -101,16 +112,18 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
101 112 };
102 113  
103 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 122 var _qbcMinIntervalValue;
112 123  
113 124 var _initFun2 = function() { // 初始化方法2
  125 + //------------------------ 1、预估早高峰全部出车第几圈第几个班次全部出车,计算路牌之间的发车间隔 ------------------//
  126 +
114 127 // 以上标线为标准,查找离早高峰开始时间最近的班次作为早高峰开始班次
115 128 // 以这个班次为早高峰起点,全部出车策略
116 129 var qbcIndexArray = _internalLpArray[0].getQBcIndexWithFcTime(
... ... @@ -132,11 +145,11 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
132 145 qIndex,
133 146 bIndex,
134 147 _factory.createBcObj(
  148 + _internalLpArray[i - 1],
135 149 "normal", startbc.isUp(),
136   - _lpArray[i - 1].lpNo,
137 150 1, _kssj, paramObj)
138 151 );
139   - // 使用早高峰的发车间隔最为路牌纵向最小发车间隔
  152 + // 使用早高峰的发车间隔最为路牌纵向最小发车间隔,不能整除的话,小的放在前面的路牌
140 153 _internalLpArray[i - 1].setVerticalMinIntervalTime(_c1);
141 154 }
142 155 for (i = 1; i <= _c2; i++) {
... ... @@ -145,16 +158,18 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
145 158 qIndex,
146 159 bIndex,
147 160 _factory.createBcObj(
  161 + _internalLpArray[_clCount - _c2 + i - 1],
148 162 "normal", startbc.isUp(),
149   - _lpArray[_clCount - _c2 + i - 1].lpNo,
150 163 1, _kssj, paramObj)
151 164 );
152   - // 使用早高峰的发车间隔最为路牌纵向最小发车间隔
  165 + // 使用早高峰的发车间隔最为路牌纵向最小发车间隔,,不能整除的话,大的放在后面的路牌
153 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 191 qIndex,
177 192 bIndex,
178 193 _factory.createBcObj(
  194 + _internalLpArray[i - 1],
179 195 "normal", startbc.isUp(),
180   - _lpArray[i - 1].lpNo,
181 196 1, _kssj, _paramObj)
182 197 );
183 198 }
... ... @@ -187,20 +202,20 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
187 202 qIndex,
188 203 bIndex,
189 204 _factory.createBcObj(
  205 + _internalLpArray[_clCount - _c2 + i - 1],
190 206 "normal", startbc.isUp(),
191   - _lpArray[_clCount - _c2 + i - 1].lpNo,
192 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 213 _qbcMinIntervalValue = _c1;
199 214  
200 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 219 console.log("//---------------- 行车计划,初始化方法2 end ----------------//");
205 220 };
206 221  
... ... @@ -208,6 +223,8 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
208 223 var _zbx_lpIndex; // 中标线对应第几个路牌
209 224  
210 225 var _initFun3 = function() { // 初始化方法3
  226 + //---------------------------- 1、模拟一个中标线,使用临时路牌 ----------------------//
  227 +
211 228 // 构造中标线
212 229 // 中标线开始时间,就是方向的首班车时间
213 230 var st = !_qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();
... ... @@ -221,7 +238,7 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
221 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 242 tempLpObj.initDataFromTimeToTime(
226 243 st,
227 244 et,
... ... @@ -231,8 +248,12 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
231 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 259 var _tempq_array = [];
... ... @@ -240,11 +261,11 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
240 261 var _temp_bc;
241 262 var i;
242 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 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 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 270 _tempq_array.push(_temp_group);
250 271 }
... ... @@ -254,7 +275,7 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
254 275 _tempq_array
255 276 );
256 277 _zbx_lpIndex = _ttindex_[0]; // 中标线放在第几个路牌
257   - tempLpObj.setLp(_lpArray[_zbx_lpIndex].lpNo);
  278 + tempLpObj.setLp(_lpArray[_zbx_lpIndex]); // 设置原始路牌对象
258 279 tempLpObj.setVerticalMinIntervalTime( // 设置纵向最小发车间隔
259 280 _internalLpArray[_zbx_lpIndex].getVerticalMinIntervalTime()
260 281 );
... ... @@ -353,9 +374,10 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
353 374 // 3、计算班次并添加班次
354 375 var _kssj = _paramObj.addMinute(_bcObj.getFcTimeObj(), _intervalTime);
355 376 _bcObj = _factory.createBcObj(
  377 + _internalLpArray[lpIndex],
356 378 "normal", _bcObj.isUp(),
357   - _lpArray[lpIndex].lpNo,
358 379 1, _kssj, _paramObj);
  380 + _bcObj.setGroup(_internalLpArray[lpIndex].getGroup(qIndex));
359 381  
360 382 return _bcObj;
361 383  
... ... @@ -377,12 +399,12 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
377 399 };
378 400  
379 401 /**
380   - * 查找指定时间落在哪两个班次之间(很重要的内部方法)。
  402 + * 查找离指定时间最近的前面的班次索引信息
381 403 * @param timeObj 查找时间
382 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 408 var _lpObj;
387 409 var _groupObj;
388 410 var _bcObj;
... ... @@ -390,28 +412,30 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
390 412 var _j;
391 413 var timediff; // 时间差取绝对值
392 414  
393   - var _up_gIndex;
  415 + var _lpIndex;
  416 + var _up_qIndex;
394 417 var _up_bIndex;
395 418  
396   - // TODO:找上界
397 419 for (_i = 0; _i < _qCount; _i++) {
398 420 for (_j = 0; _j < _internalLpArray.length; _j++) {
399 421 _lpObj = _internalLpArray[_j];
400 422 _groupObj = _lpObj.getGroup(_i);
401 423 _bcObj = isUp ? _groupObj.getBc1() : _groupObj.getBc2();
402   - if (_bcObj) { // 没有班次动态生成一个,可能生成不出的
  424 + if (!_bcObj) { // 没有班次动态生成一个,可能生成不出的
403 425 _bcObj = _generateBc(_j, _i, isUp == _qIsUp ? 0 : 1);
404 426 }
405 427 if (_bcObj) {
406 428 if (timeObj.diff(_bcObj.getFcTimeObj()) >= 0) {
407 429 if (!timediff) {
408 430 timediff = timeObj.diff(_bcObj.getFcTimeObj());
409   - _up_gIndex = _i;
  431 + _lpIndex = _j;
  432 + _up_qIndex = _i;
410 433 _up_bIndex = isUp == _qIsUp ? 0 : 1;
411 434 } else {
412 435 if (timeObj.diff(_bcObj.getFcTimeObj()) < timediff) {
413 436 timediff = timeObj.diff(_bcObj.getFcTimeObj());
414   - _up_gIndex = _i;
  437 + _lpIndex = _j;
  438 + _up_qIndex = _i;
415 439 _up_bIndex = isUp == _qIsUp ? 0 : 1;
416 440 }
417 441 }
... ... @@ -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 451 var bcindex = [];
425   - bcindex.push(_up_gIndex);
  452 + bcindex.push(_lpIndex);
  453 + bcindex.push(_up_qIndex);
426 454 bcindex.push(_up_bIndex);
427 455  
428 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 528 return {
432 529 //------------- 布局初始化方法 ------------//
433 530 /**
... ... @@ -465,6 +562,13 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
465 562 //this._generateBc(17, 1, 1);
466 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 572 // TODO:
469 573  
470 574 // 测试时间判定
... ... @@ -482,11 +586,95 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
482 586 // _factory
483 587 //);
484 588  
  589 + // TODO:问题
  590 + // 1、中标线是直接赋值在具体位置的,没有修正班次时间
  591 + // 2、路牌间隔时间需要修正的
  592 +
485 593 },
486 594  
487 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 678 * 补充做5休2的班型班次。
491 679 * 1、做5休2的路牌总工时不能超过7个小时
492 680 * 2、5休2的路牌全部从早晚高峰班次开始往前补充1个班次,组成早晚2圈
... ... @@ -501,27 +689,27 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
501 689 var _qIndex;
502 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 714 // 2、
527 715 },
... ... @@ -637,10 +825,12 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
637 825 var _c2_start_index;
638 826 for (i = 1; i <= _count - _c2; i++) {
639 827 _internalLpArray[(i - 1) * _c1].setBxLb(true);
  828 + _internalLpArray[(i - 1) * _c1].setBxDesc("连班");
640 829 _c2_start_index = (i - 1) * _c1;
641 830 }
642 831 for (i = 1; i <= _c2; i++) {
643 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 841 _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxLb(true);
652 842 _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxFb(false);
653 843 _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxFb5_2(false);
  844 + _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxDesc("连班");
654 845 _c2_start_index = (i - 1) * _c1 + _zbx_lpIndex;
655 846 }
656 847 for (i = 1; i <= _c2; i++) {
657 848 _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxLb(true);
658 849 _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxFb(false);
659 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 863 _internalLpArray[notlbIndexes[i]].setBxFb(false);
672 864 _internalLpArray[notlbIndexes[i]].setBxFb(true);
673 865 _internalLpArray[notlbIndexes[i]].setBxFb5_2(false);
  866 + _internalLpArray[notlbIndexes[i]].setBxDesc("其他分班");
674 867 }
675 868 while (i < _bx_other_fb_lpcount + _bx_5_2_fb_lpcount) {
676 869 _internalLpArray[notlbIndexes[i]].setBxFb(false);
677 870 _internalLpArray[notlbIndexes[i]].setBxFb(true);
678 871 _internalLpArray[notlbIndexes[i]].setBxFb5_2(true);
  872 + _internalLpArray[notlbIndexes[i]].setBxDesc("5休2分班");
679 873  
680 874 i++;
681 875 }
... ... @@ -712,7 +906,6 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
712 906 */
713 907 toGanttBcArray: function() {
714 908 var bcData = [];
715   - var i;
716 909 var lpObj;
717 910 for (i = 0; i < _internalLpArray.length; i++) {
718 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 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 16 var _bclc = paramObj.calcuTravelLcNumber(isUp, bcType);
17 17 var _bcsj = paramObj.calcuTravelTime(fcTimeObj, isUp);
18 18 var _arrsj = paramObj.addMinute(fcTimeObj, _bcsj);
... ... @@ -23,22 +23,22 @@ var Main_v2 = function() {
23 23 var _qdz = isUp ? paramObj.getUpQdzObj().id : paramObj.getDownQdzObj().id;
24 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 86 // 3、将连班路牌的班次补足
87 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 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 105 //-------------------- 输出ganut图上的班次,班型描述 ----------------------//
... ...
src/main/resources/static/pages/base/timesmodel/tepms/fcjx_temp.html
... ... @@ -231,7 +231,7 @@
231 231  
232 232 <div class="col-md-6">
233 233 <label class="control-label col-md-5">
234   - <span class="required"> * </span> 高峰建议配车数 :</label>
  234 + <span class="required"> * </span> 建议高峰配车数 :</label>
235 235 <div class="col-md-5">
236 236 <input type="text" class="form-control" placeholder="车辆数" name="gfjypcs" id="gfjypcsInput" min="1">
237 237 </div>
... ... @@ -477,7 +477,7 @@
477 477 </div>
478 478  
479 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 481 <div class="col-md-4">
482 482 <p class="form-control-static" data-display="gfjypcs"> </p>
483 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 62 <div class="table-container" style="margin-top: 10px;min-width: 906px">
63 63 <label>日期:<span id="rqxs"></span>&nbsp;&nbsp;&nbsp;&nbsp;早高峰:6:31~8:30&nbsp;&nbsp;&nbsp;&nbsp;晚高峰:16:01~18:00</label>
64 64 <br/><label>计划+临加-少驶=<span id="jls"></span>&nbsp;&nbsp;计算机实驶:<span id="jsjss"></span></label>
  65 + &nbsp;&nbsp;当班调派:<span id="dbdp"></span></label>
65 66 <table class="table table-bordered table-hover table-checkable" id="forms">
66 67 <thead>
67 68 <tr>
... ... @@ -434,6 +435,7 @@
434 435 var scheduleDaily_1 = template('scheduleDaily_1',{list:result});
435 436 $("#jls").html(result[0].jls);
436 437 $("#jsjss").html(result[0].sjgl);
  438 + $("#dbdp").html(result[0].dbdp);
437 439 $('#forms .scheduleDaily_1').html(scheduleDaily_1);
438 440 });
439 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 674  
675 675 var l = layer.load(2);
676 676 $get('/ylb/ylbList', params, function (data) {
677   -
  677 + console.log(data);
678 678 for(var i=1;i<data.length;i++){
679 679 moveArray[i]=new Array();
680 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 353 </html>
354 354 \ No newline at end of file
... ...