Commit 8e0251f97b5ea4e6f573dfc58cd7eb3ca96cdd0f

Authored by 徐烜
2 parents d503df12 8d0c9706

Merge branch 'pudong' of http://222.66.0.204:8090//panzhaov5/bsth_control into pudong

Showing 26 changed files with 3481 additions and 2136 deletions
src/main/java/com/bsth/controller/calc/CalcExportController.java
... ... @@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RestController;
16 16 import com.bsth.common.ResponseCode;
17 17 import com.bsth.entity.calc.CalcWaybill;
18 18 import com.bsth.entity.mcy_forms.Waybillday;
  19 +import com.bsth.service.calc.CalcLbStatuAnalyService;
19 20 import com.bsth.service.calc.CalcMixService;
20 21 import com.bsth.service.calc.CalcWaybillService;
21 22 import com.bsth.util.ReportUtils;
... ... @@ -26,6 +27,9 @@ public class CalcExportController {
26 27  
27 28 @Autowired
28 29 CalcWaybillService service;
  30 +
  31 + @Autowired
  32 + CalcLbStatuAnalyService lbService;
29 33  
30 34 @Autowired
31 35 CalcMixService clacMixService;
... ... @@ -204,5 +208,84 @@ public class CalcExportController {
204 208 }
205 209 return resMap;
206 210 }
  211 +
  212 + @RequestMapping(value = "/lbStatuAnalyExport", method = RequestMethod.GET)
  213 + public Map<String, Object> lbStatuAnalyExport(@RequestParam Map<String, Object> map) {
  214 +
  215 + String gsdm="";
  216 + if(map.get("company")!=null){
  217 + gsdm=map.get("company").toString().trim();
  218 + }
  219 + String fgsdm="";
  220 + if(map.get("subCompany")!=null){
  221 + fgsdm=map.get("subCompany").toString().trim();
  222 + }
  223 + String line="";
  224 + if(map.get("line")!=null){
  225 + line=map.get("line").toString().trim();
  226 + }
  227 + String lineName="";
  228 + if(map.get("lineName")!=null){
  229 + lineName=map.get("lineName").toString().trim();
  230 + }
  231 + String date="";
  232 + if(map.get("startDate")!=null){
  233 + date=map.get("startDate").toString().trim();
  234 + }
  235 + String date2="";
  236 + if(map.get("endDate")!=null){
  237 + date2=map.get("endDate").toString().trim();
  238 + }
  239 + String sfyy="";
  240 + if(map.get("sfyy")!=null){
  241 + sfyy=map.get("sfyy").toString().trim();
  242 + }
  243 + String type="";
  244 + if(map.get("type")!=null){
  245 + type=map.get("type").toString().trim();
  246 + }
  247 +
  248 + Map<String, Object> resMap = new HashMap<String, Object>();
  249 + List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
  250 + List<Map<String, Object>> list = lbService.lbStatuAnaly(gsdm, fgsdm, line, date, date2, sfyy, type);
  251 +
  252 + for(int i = 0; i < list.size(); i++){
  253 + Map<String, Object> temp = list.get(i);
  254 + temp.put("i", i+1);
  255 + if(!temp.containsKey("date") || temp.get("date") == null){
  256 + temp.put("date", "");
  257 + }
  258 + if(!temp.containsKey("company") || temp.get("company") == null){
  259 + temp.put("company", "");
  260 + }
  261 + if(!temp.containsKey("subCompany") || temp.get("subCompany") == null){
  262 + temp.put("subCompany", "");
  263 + }
  264 + resList.add(temp);
  265 + }
  266 +
  267 + String Data = date.replaceAll("-", "");
  268 + if(!date.equals(date2)){
  269 + Data = date.replaceAll("-", "") + "-" + date2.replaceAll("-", "");
  270 + }
  271 +
  272 + SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
  273 + sdfSimple = new SimpleDateFormat("yyyyMMdd");
  274 + List<Iterator<?>> listI = new ArrayList<Iterator<?>>();
  275 + Map<String,Object> mm = new HashMap<String, Object>();
  276 + ReportUtils ee = new ReportUtils();
  277 +
  278 + try {
  279 + listI.add(resList.iterator());
  280 + String path = this.getClass().getResource("/").getPath()+"static/pages/forms/";
  281 + ee.excelReplace(listI, new Object[] { mm }, path+"mould/calcLbStatuAnaly.xls",
  282 + path+"export/"+Data+"-"+lineName+"-烂班情况分析表(统计).xls");
  283 + resMap.put("status", ResponseCode.SUCCESS);
  284 + } catch (Exception e) {
  285 + e.printStackTrace();
  286 + resMap.put("status", ResponseCode.ERROR);
  287 + }
  288 + return resMap;
  289 + }
207 290  
208 291 }
... ...
src/main/java/com/bsth/controller/calc/CalcLbStatuAnalyController.java 0 → 100644
  1 +package com.bsth.controller.calc;
  2 +
  3 +import java.util.List;
  4 +import java.util.Map;
  5 +
  6 +import com.bsth.controller.BaseController;
  7 +import com.bsth.entity.calc.CalcLbStatuAnaly;
  8 +import com.bsth.service.calc.CalcLbStatuAnalyService;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.web.bind.annotation.RequestMapping;
  11 +import org.springframework.web.bind.annotation.RequestParam;
  12 +import org.springframework.web.bind.annotation.RestController;
  13 +
  14 +/**
  15 + * Created by 19/03/18.
  16 + */
  17 +@RestController
  18 +@RequestMapping("calcLbStatuAnaly")
  19 +public class CalcLbStatuAnalyController extends BaseController<CalcLbStatuAnaly, Integer> {
  20 +
  21 + @Autowired
  22 + private CalcLbStatuAnalyService service;
  23 +
  24 +
  25 + @RequestMapping(value="/lbStatuAnaly")
  26 + public List<Map<String,Object>> lbStatuAnaly(@RequestParam Map<String, Object> map){
  27 + String gsdm="";
  28 + if(map.get("company")!=null){
  29 + gsdm=map.get("company").toString().trim();
  30 + }
  31 + String fgsdm="";
  32 + if(map.get("subCompany")!=null){
  33 + fgsdm=map.get("subCompany").toString().trim();
  34 + }
  35 + String line="";
  36 + if(map.get("line")!=null){
  37 + line=map.get("line").toString().trim();
  38 + }
  39 + String date="";
  40 + if(map.get("startDate")!=null){
  41 + date=map.get("startDate").toString().trim();
  42 + }
  43 + String date2="";
  44 + if(map.get("endDate")!=null){
  45 + date2=map.get("endDate").toString().trim();
  46 + }
  47 + String sfyy="";
  48 + if(map.get("sfyy")!=null){
  49 + sfyy=map.get("sfyy").toString().trim();
  50 + }
  51 + String type="";
  52 + if(map.get("type")!=null){
  53 + type=map.get("type").toString().trim();
  54 + }
  55 + return service.lbStatuAnaly(gsdm,fgsdm,line,date,date2,sfyy,type);
  56 + }
  57 +
  58 +}
... ...
src/main/java/com/bsth/entity/calc/CalcLbStatuAnaly.java 0 → 100644
  1 +package com.bsth.entity.calc;
  2 +
  3 +import java.util.Date;
  4 +
  5 +import javax.persistence.Entity;
  6 +import javax.persistence.GeneratedValue;
  7 +import javax.persistence.Id;
  8 +import javax.persistence.Table;
  9 +
  10 +@Entity
  11 +@Table(name = "calc_lb_statu_analy")
  12 +public class CalcLbStatuAnaly {
  13 + /* 主键*/
  14 + @Id
  15 + @GeneratedValue
  16 + private Long id;
  17 + /* 公司代码*/
  18 + private String gsdm;
  19 + /* 公司名称*/
  20 + private String gsname;
  21 + /* 分公司代码*/
  22 + private String fgsdm;
  23 + /* 分公司名称*/
  24 + private String fgsname;
  25 + /* 日期*/
  26 + private Date rq;
  27 + /* 日期字符串*/
  28 + private String rqStr;
  29 + /* 线路编码*/
  30 + private String xl;
  31 + /* 线路名称*/
  32 + private String xlName;
  33 + /* 计划班次*/
  34 + private int jhbc;
  35 + /* 实际班次*/
  36 + private int sjbc;
  37 + /* 计划里程*/
  38 + private Double jhlc;
  39 + /* 实际公里*/
  40 + private Double sjlc;
  41 + /* 路阻(烂班班次)*/
  42 + private int lzbc;
  43 + /* 路阻(烂班里程)*/
  44 + private Double lzlc;
  45 + /* 吊慢(烂班班次)*/
  46 + private int dmbc;
  47 + /* 吊慢(烂班里程)*/
  48 + private Double dmlc;
  49 + /* 故障(烂班班次)*/
  50 + private int gzbc;
  51 + /* 故障(烂班里程)*/
  52 + private Double gzlc;
  53 + /* 纠纷(烂班班次)*/
  54 + private int jfbc;
  55 + /* 纠纷(烂班里程)*/
  56 + private Double jflc;
  57 + /* 肇事(烂班班次)*/
  58 + private int zsbc;
  59 + /* 肇事(烂班里程)*/
  60 + private Double zslc;
  61 + /* 缺人(烂班班次)*/
  62 + private int qrbc;
  63 + /* 缺人(烂班里程)*/
  64 + private Double qrlc;
  65 + /* 缺车(烂班班次)*/
  66 + private int qcbc;
  67 + /* 缺车(烂班里程)*/
  68 + private Double qclc;
  69 + /* 客稀(烂班班次)*/
  70 + private int kxbc;
  71 + /* 客稀(烂班里程)*/
  72 + private Double kxlc;
  73 + /* 气候(烂班班次)*/
  74 + private int qhbc;
  75 + /* 气候(烂班里程)*/
  76 + private Double qhlc;
  77 + /* 援外(烂班班次)*/
  78 + private int ywbc;
  79 + /* 援外(烂班里程)*/
  80 + private Double ywlc;
  81 + /* 其他(烂班班次)*/
  82 + private int qtbc;
  83 + /* 其他(烂班里程)*/
  84 + private Double qtlc;
  85 + /* 备注*/
  86 + private String remark;
  87 +
  88 +
  89 + public Long getId() {
  90 + return id;
  91 + }
  92 + public void setId(Long id) {
  93 + this.id = id;
  94 + }
  95 + public String getGsdm() {
  96 + return gsdm;
  97 + }
  98 + public void setGsdm(String gsdm) {
  99 + this.gsdm = gsdm;
  100 + }
  101 + public String getGsname() {
  102 + return gsname;
  103 + }
  104 + public void setGsname(String gsname) {
  105 + this.gsname = gsname;
  106 + }
  107 + public String getFgsdm() {
  108 + return fgsdm;
  109 + }
  110 + public void setFgsdm(String fgsdm) {
  111 + this.fgsdm = fgsdm;
  112 + }
  113 + public String getFgsname() {
  114 + return fgsname;
  115 + }
  116 + public void setFgsname(String fgsname) {
  117 + this.fgsname = fgsname;
  118 + }
  119 + public Date getRq() {
  120 + return rq;
  121 + }
  122 + public void setRq(Date rq) {
  123 + this.rq = rq;
  124 + }
  125 + public String getRqStr() {
  126 + return rqStr;
  127 + }
  128 + public void setRqStr(String rqStr) {
  129 + this.rqStr = rqStr;
  130 + }
  131 + public String getXl() {
  132 + return xl;
  133 + }
  134 + public void setXl(String xl) {
  135 + this.xl = xl;
  136 + }
  137 + public String getXlName() {
  138 + return xlName;
  139 + }
  140 + public void setXlName(String xlName) {
  141 + this.xlName = xlName;
  142 + }
  143 + public int getJhbc() {
  144 + return jhbc;
  145 + }
  146 + public void setJhbc(int jhbc) {
  147 + this.jhbc = jhbc;
  148 + }
  149 + public int getSjbc() {
  150 + return sjbc;
  151 + }
  152 + public void setSjbc(int sjbc) {
  153 + this.sjbc = sjbc;
  154 + }
  155 + public Double getJhlc() {
  156 + return jhlc;
  157 + }
  158 + public void setJhlc(Double jhlc) {
  159 + this.jhlc = jhlc;
  160 + }
  161 + public Double getSjlc() {
  162 + return sjlc;
  163 + }
  164 + public void setSjlc(Double sjlc) {
  165 + this.sjlc = sjlc;
  166 + }
  167 + public int getLzbc() {
  168 + return lzbc;
  169 + }
  170 + public void setLzbc(int lzbc) {
  171 + this.lzbc = lzbc;
  172 + }
  173 + public Double getLzlc() {
  174 + return lzlc;
  175 + }
  176 + public void setLzlc(Double lzlc) {
  177 + this.lzlc = lzlc;
  178 + }
  179 + public int getDmbc() {
  180 + return dmbc;
  181 + }
  182 + public void setDmbc(int dmbc) {
  183 + this.dmbc = dmbc;
  184 + }
  185 + public Double getDmlc() {
  186 + return dmlc;
  187 + }
  188 + public void setDmlc(Double dmlc) {
  189 + this.dmlc = dmlc;
  190 + }
  191 + public int getGzbc() {
  192 + return gzbc;
  193 + }
  194 + public void setGzbc(int gzbc) {
  195 + this.gzbc = gzbc;
  196 + }
  197 + public Double getGzlc() {
  198 + return gzlc;
  199 + }
  200 + public void setGzlc(Double gzlc) {
  201 + this.gzlc = gzlc;
  202 + }
  203 + public int getJfbc() {
  204 + return jfbc;
  205 + }
  206 + public void setJfbc(int jfbc) {
  207 + this.jfbc = jfbc;
  208 + }
  209 + public Double getJflc() {
  210 + return jflc;
  211 + }
  212 + public void setJflc(Double jflc) {
  213 + this.jflc = jflc;
  214 + }
  215 + public int getZsbc() {
  216 + return zsbc;
  217 + }
  218 + public void setZsbc(int zsbc) {
  219 + this.zsbc = zsbc;
  220 + }
  221 + public Double getZslc() {
  222 + return zslc;
  223 + }
  224 + public void setZslc(Double zslc) {
  225 + this.zslc = zslc;
  226 + }
  227 + public int getQrbc() {
  228 + return qrbc;
  229 + }
  230 + public void setQrbc(int qrbc) {
  231 + this.qrbc = qrbc;
  232 + }
  233 + public Double getQrlc() {
  234 + return qrlc;
  235 + }
  236 + public void setQrlc(Double qrlc) {
  237 + this.qrlc = qrlc;
  238 + }
  239 + public int getQcbc() {
  240 + return qcbc;
  241 + }
  242 + public void setQcbc(int qcbc) {
  243 + this.qcbc = qcbc;
  244 + }
  245 + public Double getQclc() {
  246 + return qclc;
  247 + }
  248 + public void setQclc(Double qclc) {
  249 + this.qclc = qclc;
  250 + }
  251 + public int getKxbc() {
  252 + return kxbc;
  253 + }
  254 + public void setKxbc(int kxbc) {
  255 + this.kxbc = kxbc;
  256 + }
  257 + public Double getKxlc() {
  258 + return kxlc;
  259 + }
  260 + public void setKxlc(Double kxlc) {
  261 + this.kxlc = kxlc;
  262 + }
  263 + public int getQhbc() {
  264 + return qhbc;
  265 + }
  266 + public void setQhbc(int qhbc) {
  267 + this.qhbc = qhbc;
  268 + }
  269 + public Double getQhlc() {
  270 + return qhlc;
  271 + }
  272 + public void setQhlc(Double qhlc) {
  273 + this.qhlc = qhlc;
  274 + }
  275 + public int getYwbc() {
  276 + return ywbc;
  277 + }
  278 + public void setYwbc(int ywbc) {
  279 + this.ywbc = ywbc;
  280 + }
  281 + public Double getYwlc() {
  282 + return ywlc;
  283 + }
  284 + public void setYwlc(Double ywlc) {
  285 + this.ywlc = ywlc;
  286 + }
  287 + public int getQtbc() {
  288 + return qtbc;
  289 + }
  290 + public void setQtbc(int qtbc) {
  291 + this.qtbc = qtbc;
  292 + }
  293 + public Double getQtlc() {
  294 + return qtlc;
  295 + }
  296 + public void setQtlc(Double qtlc) {
  297 + this.qtlc = qtlc;
  298 + }
  299 + public String getRemark() {
  300 + return remark;
  301 + }
  302 + public void setRemark(String remark) {
  303 + this.remark = remark;
  304 + }
  305 +
  306 +}
... ...
src/main/java/com/bsth/repository/calc/CalcLbStatuAnalyRepository.java 0 → 100644
  1 +package com.bsth.repository.calc;
  2 +
  3 +import java.util.List;
  4 +
  5 +import javax.transaction.Transactional;
  6 +
  7 +import com.bsth.entity.calc.CalcLbStatuAnaly;
  8 +import com.bsth.repository.BaseRepository;
  9 +
  10 +import org.springframework.data.jpa.repository.Modifying;
  11 +import org.springframework.data.jpa.repository.Query;
  12 +import org.springframework.stereotype.Repository;
  13 +
  14 +/**
  15 + *
  16 + */
  17 +@Repository
  18 +public interface CalcLbStatuAnalyRepository extends BaseRepository<CalcLbStatuAnaly, Integer>{
  19 +
  20 + //按照时间段统计,公司下线路
  21 + @Query(value="select DISTINCT c from CalcLbStatuAnaly c where c.xl like %?1% and c.rqStr between ?2 and ?3 and c.gsdm like %?4% and c.fgsdm like %?5% order by c.xl")
  22 + List<CalcLbStatuAnaly> selectByDateAndLine(String line,String date,String date2,String gsdm,String fgsdm);
  23 +
  24 + //按照时间段统计,单条线路
  25 + @Query(value="select DISTINCT c from CalcLbStatuAnaly c where c.xl = ?1 and c.rqStr between ?2 and ?3 order by c.xl")
  26 + List<CalcLbStatuAnaly> selectByDateAndLine(String line,String date,String date2);
  27 +
  28 + //按照日期和线路删除数据
  29 + @Modifying
  30 + @Transactional
  31 + @Query(value = "delete CalcLbStatuAnaly c where c.rqStr=?1 and c.xl=?2")
  32 + void deleteByDateAndLine(String date, String line);
  33 +
  34 + //按照日期删除数据
  35 + @Modifying
  36 + @Transactional
  37 + @Query(value = "delete CalcLbStatuAnaly c where c.rqStr=?1")
  38 + void deleteByDate(String date);
  39 +
  40 +}
... ...
src/main/java/com/bsth/repository/oil/YlbRepository.java
... ... @@ -46,7 +46,8 @@ public interface YlbRepository extends BaseRepository&lt;Ylb, Integer&gt;{
46 46 + " and y.xlbm like %?4% and y.nbbm like %?5%",nativeQuery=true)
47 47 List<Ylb> listMaxRqJcsx(String rq,String gsbm,String fgsbm,String xlbm,String nbbm);
48 48  
49   - @Query(value="select * from bsth_c_ylb where to_days(?1) -to_days(rq) <30 "
  49 + @Query(value="select * from bsth_c_ylb where "
  50 + + " DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= rq "
50 51 + " and rq< ?1 and ssgsdm like %?2%"
51 52 + " and fgsdm like %?3% and xlbm like %?4% and nbbm like %?5% "
52 53 + " order by nbbm , rq desc,jcsx desc,lp desc",nativeQuery=true)
... ... @@ -54,7 +55,7 @@ public interface YlbRepository extends BaseRepository&lt;Ylb, Integer&gt;{
54 55  
55 56 @Query(value="select * from bsth_c_ylb where rq>=?1 "
56 57 + " and rq<= ?2 and ssgsdm =?3"
57   - + " and fgsdm =?4 and xlbm like %?5% "
  58 + + " and fgsdm like %?4% and xlbm like %?5% "
58 59 + " order by nbbm , rq desc,jcsx desc,lp desc",nativeQuery=true)
59 60 List<Ylb> listByMonthJcsx(String rq,String rq2,String gsbm,String fgsbm,String xlbm);
60 61  
... ... @@ -125,6 +126,12 @@ public interface YlbRepository extends BaseRepository&lt;Ylb, Integer&gt;{
125 126 List<Object[]> checkNbmmYl(String rq, String gsbm,String fgsbm,String xlbm,String nbbm);
126 127  
127 128  
  129 + @Query(value="select nbbm,cs from (select nbbm,count(nbbm) as cs from ("
  130 + + " select nbbm,fgsdm from bsth_c_ylb where rq=?1 "
  131 + + " and ssgsdm like %?2% group by nbbm,fgsdm "
  132 + + " ) t group by t.nbbm) x where x.cs >1 ",nativeQuery=true)
  133 + List<Object[]> checkNbmmFgs(String rq, String gsbm);
  134 +
128 135 @Query(value="select jzl,yh,sh from Ylb s "
129 136 + " where to_days(s.rq)=to_days(?1) "
130 137 + " and s.ssgsdm like %?2% "
... ... @@ -155,7 +162,7 @@ public interface YlbRepository extends BaseRepository&lt;Ylb, Integer&gt;{
155 162 @Query(value="select s from Ylb s "
156 163 + " where to_days(s.rq)=to_days(?1) "
157 164 + " and s.ssgsdm =?2 "
158   - + " and s.fgsdm =?3 "
  165 + + " and s.fgsdm like %?3% "
159 166 + " and s.xlbm like %?4% "
160 167 + " and s.nbbm in ?5 order by nbbm,jcsx")
161 168 List<Ylb> listYlb(String rq, String gsbm,String fgsbm,String xlbm,List<String> listNbbm);
... ... @@ -163,7 +170,7 @@ public interface YlbRepository extends BaseRepository&lt;Ylb, Integer&gt;{
163 170 @Query(value="select s from Ylb s "
164 171 + " where s.rq=?1 "
165 172 + " and s.ssgsdm =?2 "
166   - + " and s.fgsdm =?3 "
  173 + + " and s.fgsdm like %?3% "
167 174 + " and s.xlbm like %?4% "
168 175 + " and s.nbbm in ?5 order by nbbm,jcsx")
169 176 List<Ylb> listYlb_s(Date rq, String gsbm,String fgsbm,String xlbm,List<String> listNbbm);
... ...
src/main/java/com/bsth/service/calc/CalcLbStatuAnalyService.java 0 → 100644
  1 +package com.bsth.service.calc;
  2 +
  3 +import java.util.List;
  4 +import java.util.Map;
  5 +
  6 +import com.bsth.entity.calc.CalcLbStatuAnaly;
  7 +import com.bsth.service.BaseService;
  8 +
  9 +/**
  10 + * Created by 19/03/18.
  11 + */
  12 +public interface CalcLbStatuAnalyService extends BaseService<CalcLbStatuAnaly, Integer> {
  13 +
  14 + List<Map<String, Object>> lbStatuAnaly(String gsdm, String fgsdm, String line, String date, String date2, String sfyy, String type);
  15 +
  16 +}
... ...
src/main/java/com/bsth/service/calc/impl/CalcLbStatuAnalyServiceImpl.java 0 → 100644
  1 +package com.bsth.service.calc.impl;
  2 +
  3 +import java.util.ArrayList;
  4 +import java.util.Collections;
  5 +import java.util.Comparator;
  6 +import java.util.HashMap;
  7 +import java.util.List;
  8 +import java.util.Map;
  9 +
  10 +import com.bsth.entity.calc.CalcLbStatuAnaly;
  11 +import com.bsth.repository.calc.CalcLbStatuAnalyRepository;
  12 +import com.bsth.service.LineService;
  13 +import com.bsth.service.calc.CalcLbStatuAnalyService;
  14 +import com.bsth.service.impl.BaseServiceImpl;
  15 +import com.bsth.util.Arith;
  16 +
  17 +import org.slf4j.Logger;
  18 +import org.slf4j.LoggerFactory;
  19 +import org.springframework.beans.factory.annotation.Autowired;
  20 +import org.springframework.jdbc.core.JdbcTemplate;
  21 +import org.springframework.stereotype.Service;
  22 +
  23 +/**
  24 + * Created by 19/03/18.
  25 + */
  26 +@Service
  27 +public class CalcLbStatuAnalyServiceImpl extends BaseServiceImpl<CalcLbStatuAnaly, Integer> implements CalcLbStatuAnalyService {
  28 +
  29 + @Autowired
  30 + private CalcLbStatuAnalyRepository calcRepository;
  31 +
  32 + @Autowired
  33 + private LineService lineService;
  34 +
  35 + @Autowired
  36 + JdbcTemplate jdbcTemplate;
  37 +
  38 +
  39 + Logger logger = LoggerFactory.getLogger(this.getClass());
  40 +
  41 +
  42 + @Override
  43 + public List<Map<String, Object>> lbStatuAnaly(String gsdm, String fgsdm,
  44 + String line, String date, String date2, String sfyy, String type) {
  45 + // TODO Auto-generated method stub
  46 + List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
  47 + List<CalcLbStatuAnaly> query = calcRepository.selectByDateAndLine(line, date, date2, gsdm, fgsdm);
  48 + Map<String, Boolean> lineNature = lineService.lineNature();
  49 + Map<String, List<CalcLbStatuAnaly>> keyMap = new HashMap<String, List<CalcLbStatuAnaly>>();
  50 + List<String> keyList = new ArrayList<String>();
  51 +
  52 + String[] Date1 = date.split("-");
  53 + String[] Date2 = date2.split("-");
  54 + String Date = "";
  55 + if(date.equals(date2))
  56 + Date = Date1[0] + "年" + Date1[1] + "月" + Date1[2] + "日";
  57 + else
  58 + Date = Date1[0] + "年" + Date1[1] + "月" + Date1[2] + "日 - "
  59 + + Date2[0] + "年" + Date2[1] + "月" + Date2[2] + "日";
  60 +
  61 + for(CalcLbStatuAnaly lb : query){
  62 + String xlBm = lb.getXl();
  63 + if(lineNature.containsKey(xlBm) && lineNature.get(xlBm) != null){
  64 + if(sfyy.equals("1") && !lineNature.get(xlBm)){
  65 + continue;
  66 + } else if(sfyy.equals("2") && lineNature.get(xlBm)){
  67 + continue;
  68 + }
  69 + } else if(sfyy.equals("2")){
  70 + continue;
  71 + }
  72 +
  73 + String key = lb.getGsdm() + "/" + lb.getFgsdm() + "/" + lb.getXl();
  74 +
  75 + if(!keyMap.containsKey(key)){
  76 + keyMap.put(key, new ArrayList<CalcLbStatuAnaly>());
  77 + keyList.add(key);
  78 + }
  79 + keyMap.get(key).add(lb);
  80 + }
  81 +
  82 + Collections.sort(keyList, new Comparator<String>() {
  83 +
  84 + public int compare(String o1, String o2) {
  85 +
  86 + Long a = 0l;
  87 + Long b = 0l;
  88 + String[] split1 = o1.split("/");
  89 + String[] split2 = o2.split("/");
  90 + char[] charArray1 = split1[2].toCharArray();
  91 + char[] charArray2 = split2[2].toCharArray();
  92 + for(int i = 0; i < charArray1.length; i++){
  93 + long temp = 1l;
  94 + for(int j = 0; j < i; j++)
  95 + temp *= 10;
  96 + a += (long)charArray1[charArray1.length - 1 - i] * temp;
  97 + }
  98 + for(int i = 0; i < charArray2.length; i++){
  99 + long temp = 1l;
  100 + for(int j = 0; j < i; j++)
  101 + temp *= 10;
  102 + b += (long)charArray2[charArray2.length - 1 - i] * temp;
  103 + }
  104 +
  105 + return a.compareTo(b);
  106 + }
  107 + });
  108 + Collections.sort(keyList, new Comparator<String>() {
  109 +
  110 + public int compare(String o1, String o2) {
  111 +
  112 + Long a = 0l;
  113 + Long b = 0l;
  114 + String[] split1 = o1.split("/");
  115 + String[] split2 = o2.split("/");
  116 + char[] charArray1 = split1[1].toCharArray();
  117 + char[] charArray2 = split2[1].toCharArray();
  118 + for(int i = 0; i < charArray1.length; i++){
  119 + long temp = 1l;
  120 + for(int j = 0; j < i; j++)
  121 + temp *= 10;
  122 + a += (long)charArray1[charArray1.length - 1 - i] * temp;
  123 + }
  124 + for(int i = 0; i < charArray2.length; i++){
  125 + long temp = 1l;
  126 + for(int j = 0; j < i; j++)
  127 + temp *= 10;
  128 + b += (long)charArray2[charArray2.length - 1 - i] * temp;
  129 + }
  130 +
  131 + return a.compareTo(b);
  132 + }
  133 + });
  134 +
  135 + String company = "", subCompany = "", lineName = "";
  136 + Map<String, Object> lastMap = new HashMap<String, Object>();
  137 + lastMap.put("line", "合计");
  138 + for(String key : keyList){
  139 + List<CalcLbStatuAnaly> list = keyMap.get(key);
  140 + Map<String, Object> m = new HashMap<String, Object>();
  141 + company = "";
  142 + subCompany = "";
  143 + lineName = "";
  144 + for(CalcLbStatuAnaly lb : list){
  145 + if(lb.getGsname() != null && company.trim().length() == 0)
  146 + company = lb.getGsname();
  147 + if(lb.getFgsname() != null && subCompany.trim().length() == 0)
  148 + subCompany = lb.getFgsname();
  149 + if(lb.getXlName() != null && lineName.trim().length() == 0)
  150 + lineName = lb.getXlName();
  151 + m.put("jhbc", Arith.add(m.get("jhbc")!=null?m.get("jhbc"):"0", lb.getJhbc()));
  152 + m.put("sjbc", Arith.add(m.get("sjbc")!=null?m.get("sjbc"):"0", lb.getSjbc()));
  153 + m.put("jhlc", Arith.add(m.get("jhlc")!=null?m.get("jhlc"):"0", lb.getJhlc()!=null?lb.getJhlc():"0"));
  154 + m.put("sjlc", Arith.add(m.get("sjlc")!=null?m.get("sjlc"):"0", lb.getSjlc()!=null?lb.getSjlc():"0"));
  155 + m.put("lzbc", Arith.add(m.get("lzbc")!=null?m.get("lzbc"):"0", lb.getLzbc()));
  156 + m.put("lzlc", Arith.add(m.get("lzlc")!=null?m.get("lzlc"):"0", lb.getLzlc()!=null?lb.getLzlc():"0"));
  157 + m.put("dmbc", Arith.add(m.get("dmbc")!=null?m.get("dmbc"):"0", lb.getDmbc()));
  158 + m.put("dmlc", Arith.add(m.get("dmlc")!=null?m.get("dmlc"):"0", lb.getDmlc()!=null?lb.getDmlc():"0"));
  159 + m.put("gzbc", Arith.add(m.get("gzbc")!=null?m.get("gzbc"):"0", lb.getGzbc()));
  160 + m.put("gzlc", Arith.add(m.get("gzlc")!=null?m.get("gzlc"):"0", lb.getGzlc()!=null?lb.getGzlc():"0"));
  161 + m.put("jfbc", Arith.add(m.get("jfbc")!=null?m.get("jfbc"):"0", lb.getJfbc()));
  162 + m.put("jflc", Arith.add(m.get("jflc")!=null?m.get("jflc"):"0", lb.getJflc()!=null?lb.getJflc():"0"));
  163 + m.put("zsbc", Arith.add(m.get("zsbc")!=null?m.get("zsbc"):"0", lb.getZsbc()));
  164 + m.put("zslc", Arith.add(m.get("zslc")!=null?m.get("zslc"):"0", lb.getZslc()!=null?lb.getZslc():"0"));
  165 + m.put("qrbc", Arith.add(m.get("qrbc")!=null?m.get("qrbc"):"0", lb.getQrbc()));
  166 + m.put("qrlc", Arith.add(m.get("qrlc")!=null?m.get("qrlc"):"0", lb.getQrlc()!=null?lb.getQrlc():"0"));
  167 + m.put("qcbc", Arith.add(m.get("qcbc")!=null?m.get("qcbc"):"0", lb.getQcbc()));
  168 + m.put("qclc", Arith.add(m.get("qclc")!=null?m.get("qclc"):"0", lb.getQclc()!=null?lb.getQclc():"0"));
  169 + m.put("kxbc", Arith.add(m.get("kxbc")!=null?m.get("kxbc"):"0", lb.getKxbc()));
  170 + m.put("kxlc", Arith.add(m.get("kxlc")!=null?m.get("kxlc"):"0", lb.getKxlc()!=null?lb.getKxlc():"0"));
  171 + m.put("qhbc", Arith.add(m.get("qhbc")!=null?m.get("qhbc"):"0", lb.getQhbc()));
  172 + m.put("qhlc", Arith.add(m.get("qhlc")!=null?m.get("qhlc"):"0", lb.getQhlc()!=null?lb.getQhlc():"0"));
  173 + m.put("ywbc", Arith.add(m.get("ywbc")!=null?m.get("ywbc"):"0", lb.getYwbc()));
  174 + m.put("ywlc", Arith.add(m.get("ywlc")!=null?m.get("ywlc"):"0", lb.getYwlc()!=null?lb.getYwlc():"0"));
  175 + m.put("qtbc", Arith.add(m.get("qtbc")!=null?m.get("qtbc"):"0", lb.getQtbc()));
  176 + m.put("qtlc", Arith.add(m.get("qtlc")!=null?m.get("qtlc"):"0", lb.getQtlc()!=null?lb.getQtlc():"0"));
  177 + }
  178 + m.put("date", Date);
  179 + m.put("company", company);
  180 + m.put("subCompany", subCompany);
  181 + m.put("line", lineName);
  182 + resList.add(m);
  183 +
  184 + lastMap.put("jhbc", Arith.add(m.get("jhbc")!=null?m.get("jhbc"):"0", lastMap.get("jhbc")!=null?lastMap.get("jhbc"):"0"));
  185 + lastMap.put("sjbc", Arith.add(m.get("sjbc")!=null?m.get("sjbc"):"0", lastMap.get("sjbc")!=null?lastMap.get("sjbc"):"0"));
  186 + lastMap.put("jhlc", Arith.add(m.get("jhlc")!=null?m.get("jhlc"):"0", lastMap.get("jhlc")!=null?lastMap.get("jhlc"):"0"));
  187 + lastMap.put("sjlc", Arith.add(m.get("sjlc")!=null?m.get("sjlc"):"0", lastMap.get("sjlc")!=null?lastMap.get("sjlc"):"0"));
  188 + lastMap.put("lzbc", Arith.add(m.get("lzbc")!=null?m.get("lzbc"):"0", lastMap.get("lzbc")!=null?lastMap.get("lzbc"):"0"));
  189 + lastMap.put("lzlc", Arith.add(m.get("lzlc")!=null?m.get("lzlc"):"0", lastMap.get("lzlc")!=null?lastMap.get("lzlc"):"0"));
  190 + lastMap.put("dmbc", Arith.add(m.get("dmbc")!=null?m.get("dmbc"):"0", lastMap.get("dmbc")!=null?lastMap.get("dmbc"):"0"));
  191 + lastMap.put("dmlc", Arith.add(m.get("dmlc")!=null?m.get("dmlc"):"0", lastMap.get("dmlc")!=null?lastMap.get("dmlc"):"0"));
  192 + lastMap.put("gzbc", Arith.add(m.get("gzbc")!=null?m.get("gzbc"):"0", lastMap.get("gzbc")!=null?lastMap.get("gzbc"):"0"));
  193 + lastMap.put("gzlc", Arith.add(m.get("gzlc")!=null?m.get("gzlc"):"0", lastMap.get("gzlc")!=null?lastMap.get("gzlc"):"0"));
  194 + lastMap.put("jfbc", Arith.add(m.get("jfbc")!=null?m.get("jfbc"):"0", lastMap.get("jfbc")!=null?lastMap.get("jfbc"):"0"));
  195 + lastMap.put("jflc", Arith.add(m.get("jflc")!=null?m.get("jflc"):"0", lastMap.get("jflc")!=null?lastMap.get("jflc"):"0"));
  196 + lastMap.put("zsbc", Arith.add(m.get("zsbc")!=null?m.get("zsbc"):"0", lastMap.get("zsbc")!=null?lastMap.get("zsbc"):"0"));
  197 + lastMap.put("zslc", Arith.add(m.get("zslc")!=null?m.get("zslc"):"0", lastMap.get("zslc")!=null?lastMap.get("zslc"):"0"));
  198 + lastMap.put("qrbc", Arith.add(m.get("qrbc")!=null?m.get("qrbc"):"0", lastMap.get("qrbc")!=null?lastMap.get("qrbc"):"0"));
  199 + lastMap.put("qrlc", Arith.add(m.get("qrlc")!=null?m.get("qrlc"):"0", lastMap.get("qrlc")!=null?lastMap.get("qrlc"):"0"));
  200 + lastMap.put("qcbc", Arith.add(m.get("qcbc")!=null?m.get("qcbc"):"0", lastMap.get("qcbc")!=null?lastMap.get("qcbc"):"0"));
  201 + lastMap.put("qclc", Arith.add(m.get("qclc")!=null?m.get("qclc"):"0", lastMap.get("qclc")!=null?lastMap.get("qclc"):"0"));
  202 + lastMap.put("kxbc", Arith.add(m.get("kxbc")!=null?m.get("kxbc"):"0", lastMap.get("kxbc")!=null?lastMap.get("kxbc"):"0"));
  203 + lastMap.put("kxlc", Arith.add(m.get("kxlc")!=null?m.get("kxlc"):"0", lastMap.get("kxlc")!=null?lastMap.get("kxlc"):"0"));
  204 + lastMap.put("qhbc", Arith.add(m.get("qhbc")!=null?m.get("qhbc"):"0", lastMap.get("qhbc")!=null?lastMap.get("qhbc"):"0"));
  205 + lastMap.put("qhlc", Arith.add(m.get("qhlc")!=null?m.get("qhlc"):"0", lastMap.get("qhlc")!=null?lastMap.get("qhlc"):"0"));
  206 + lastMap.put("ywbc", Arith.add(m.get("ywbc")!=null?m.get("ywbc"):"0", lastMap.get("ywbc")!=null?lastMap.get("ywbc"):"0"));
  207 + lastMap.put("ywlc", Arith.add(m.get("ywlc")!=null?m.get("ywlc"):"0", lastMap.get("ywlc")!=null?lastMap.get("ywlc"):"0"));
  208 + lastMap.put("qtbc", Arith.add(m.get("qtbc")!=null?m.get("qtbc"):"0", lastMap.get("qtbc")!=null?lastMap.get("qtbc"):"0"));
  209 + lastMap.put("qtlc", Arith.add(m.get("qtlc")!=null?m.get("qtlc"):"0", lastMap.get("qtlc")!=null?lastMap.get("qtlc"):"0"));
  210 + }
  211 +
  212 + if(resList.size() > 0){
  213 + resList.add(lastMap);
  214 + for(Map<String, Object> m : resList){
  215 + if(Arith.compareTo(m.get("sjbc"), 0) == 1 && Arith.compareTo(m.get("jhbc"), 0) == 1){
  216 + m.put("bcbfb", Arith.div(Arith.mul(m.get("sjbc"), 100), m.get("jhbc"), 2) + "%");
  217 + } else {
  218 + m.put("bcbfb", "0%");
  219 + }
  220 + if(Arith.compareTo(m.get("sjlc"), 0) == 1 && Arith.compareTo(m.get("jhlc"), 0) == 1){
  221 + m.put("lcbfb", Arith.div(Arith.mul(m.get("sjlc"), 100), m.get("jhlc"), 2) + "%");
  222 + } else {
  223 + m.put("lcbfb", "0%");
  224 + }
  225 + if(Arith.compareTo(m.get("lzbc"), 0) == 1 && Arith.compareTo(m.get("jhbc"), 0) == 1){
  226 + m.put("lzbfb", Arith.div(Arith.mul(m.get("lzbc"), 100), m.get("jhbc"), 2) + "%");
  227 + } else {
  228 + m.put("lzbfb", "0%");
  229 + }
  230 + if(Arith.compareTo(m.get("dmbc"), 0) == 1 && Arith.compareTo(m.get("jhbc"), 0) == 1){
  231 + m.put("dmbfb", Arith.div(Arith.mul(m.get("dmbc"), 100), m.get("jhbc"), 2) + "%");
  232 + } else {
  233 + m.put("dmbfb", "0%");
  234 + }
  235 + if(Arith.compareTo(m.get("gzbc"), 0) == 1 && Arith.compareTo(m.get("jhbc"), 0) == 1){
  236 + m.put("gzbfb", Arith.div(Arith.mul(m.get("gzbc"), 100), m.get("jhbc"), 2) + "%");
  237 + } else {
  238 + m.put("gzbfb", "0%");
  239 + }
  240 + if(Arith.compareTo(m.get("jfbc"), 0) == 1 && Arith.compareTo(m.get("jhbc"), 0) == 1){
  241 + m.put("jfbfb", Arith.div(Arith.mul(m.get("jfbc"), 100), m.get("jhbc"), 2) + "%");
  242 + } else {
  243 + m.put("jfbfb", "0%");
  244 + }
  245 + if(Arith.compareTo(m.get("zsbc"), 0) == 1 && Arith.compareTo(m.get("jhbc"), 0) == 1){
  246 + m.put("zsbfb", Arith.div(Arith.mul(m.get("zsbc"), 100), m.get("jhbc"), 2) + "%");
  247 + } else {
  248 + m.put("zsbfb", "0%");
  249 + }
  250 + if(Arith.compareTo(m.get("qrbc"), 0) == 1 && Arith.compareTo(m.get("jhbc"), 0) == 1){
  251 + m.put("qrbfb", Arith.div(Arith.mul(m.get("qrbc"), 100), m.get("jhbc"), 2) + "%");
  252 + } else {
  253 + m.put("qrbfb", "0%");
  254 + }
  255 + if(Arith.compareTo(m.get("qcbc"), 0) == 1 && Arith.compareTo(m.get("jhbc"), 0) == 1){
  256 + m.put("qcbfb", Arith.div(Arith.mul(m.get("qcbc"), 100), m.get("jhbc"), 2) + "%");
  257 + } else {
  258 + m.put("qcbfb", "0%");
  259 + }
  260 + if(Arith.compareTo(m.get("kxbc"), 0) == 1 && Arith.compareTo(m.get("jhbc"), 0) == 1){
  261 + m.put("kxbfb", Arith.div(Arith.mul(m.get("kxbc"), 100), m.get("jhbc"), 2) + "%");
  262 + } else {
  263 + m.put("kxbfb", "0%");
  264 + }
  265 + if(Arith.compareTo(m.get("qhbc"), 0) == 1 && Arith.compareTo(m.get("jhbc"), 0) == 1){
  266 + m.put("qhbfb", Arith.div(Arith.mul(m.get("qhbc"), 100), m.get("jhbc"), 2) + "%");
  267 + } else {
  268 + m.put("qhbfb", "0%");
  269 + }
  270 + if(Arith.compareTo(m.get("ywbc"), 0) == 1 && Arith.compareTo(m.get("jhbc"), 0) == 1){
  271 + m.put("ywbfb", Arith.div(Arith.mul(m.get("ywbc"), 100), m.get("jhbc"), 2) + "%");
  272 + } else {
  273 + m.put("ywbfb", "0%");
  274 + }
  275 + if(Arith.compareTo(m.get("qtbc"), 0) == 1 && Arith.compareTo(m.get("jhbc"), 0) == 1){
  276 + m.put("qtbfb", Arith.div(Arith.mul(m.get("qtbc"), 100), m.get("jhbc"), 2) + "%");
  277 + } else {
  278 + m.put("qtbfb", "0%");
  279 + }
  280 + }
  281 + }
  282 +
  283 + return resList;
  284 + }
  285 +
  286 +}
... ...
src/main/java/com/bsth/service/gps/GpsServiceImpl.java
... ... @@ -239,7 +239,6 @@ public class GpsServiceImpl implements GpsService {
239 239 long serviceState;
240 240 ArrivalEntity arrival;
241 241 Set<String> lineSet=new HashSet();
242   - String firstLineCode="";
243 242 List<Map<String,Object>> lineSwitch=new ArrayList<>();
244 243  
245 244 List<Map> gpsNotValidList=new ArrayList();
... ...
src/main/java/com/bsth/service/impl/BusIntervalServiceImpl.java
... ... @@ -306,10 +306,10 @@ public class BusIntervalServiceImpl implements BusIntervalService {
306 306 String sql = "select id,cc_id,mileage_type,destroy,destroy_reason," +
307 307 " mileage,type1,type2,schedule from bsth_c_s_child_task" +
308 308 " where 1=1";
309   - if(schedule1 != null && schedule1 > 0){
  309 + if(schedule1 != null && schedule1 >= 0){
310 310 sql += " and schedule >= '"+schedule1+"'";
311 311 }
312   - if(schedule2 != null && schedule2 > 0){
  312 + if(schedule2 != null && schedule2 >= 0){
313 313 sql += " and schedule <= '"+schedule2+"'";
314 314 }
315 315  
... ... @@ -520,9 +520,9 @@ public class BusIntervalServiceImpl implements BusIntervalService {
520 520 continue;
521 521 Map<String, List<ScheduleRealInfo>> keyMap2 = new HashMap<String, List<ScheduleRealInfo>>();
522 522 for(ScheduleRealInfo schedule : keyMap.get(key)){
523   - if(companyName.length() == 0 && schedule.getGsName() != null)
  523 + if(companyName.trim().length() == 0 && schedule.getGsName() != null)
524 524 companyName = schedule.getGsName();
525   - if(subCompanyName.length() == 0 && schedule.getFgsName() != null)
  525 + if(subCompanyName.trim().length() == 0 && schedule.getFgsName() != null)
526 526 subCompanyName = schedule.getFgsName();
527 527 String date = schedule.getScheduleDateStr();
528 528 if(!keyMap2.containsKey(date))
... ... @@ -1061,7 +1061,7 @@ public class BusIntervalServiceImpl implements BusIntervalService {
1061 1061 continue;
1062 1062 }
1063 1063 String key = schedule.getScheduleDateStr() + "/" + schedule.getXlName() + "/"
1064   - + schedule.getLpName() + "/" + schedule.getFgsName();
  1064 + + schedule.getLpName() + "/" + schedule.getFgsBm();
1065 1065 if(model.length() != 0){
1066 1066 if(ttSet.contains(schedule.getSpId())){
1067 1067 if(!keyMap.containsKey(key))
... ... @@ -1099,10 +1099,10 @@ public class BusIntervalServiceImpl implements BusIntervalService {
1099 1099 long jhyssj1 = 0, sjyssj1 = 0;
1100 1100 double jhlc = 0, sjlc = 0;
1101 1101 for(ScheduleRealInfo schedule : list2){
1102   - if(companyName.length() == 0 && schedule.getGsName() != null){
  1102 + if(companyName.trim().length() == 0 && schedule.getGsName() != null){
1103 1103 companyName = schedule.getGsName();
1104 1104 }
1105   - if(subCompanyName.length() == 0 && schedule.getFgsName() != null){
  1105 + if(subCompanyName.trim().length() == 0 && schedule.getFgsName() != null){
1106 1106 subCompanyName = schedule.getFgsName();
1107 1107 }
1108 1108 long fcsj = schedule.getFcsjT();
... ... @@ -1887,7 +1887,7 @@ public class BusIntervalServiceImpl implements BusIntervalService {
1887 1887 continue;
1888 1888 }
1889 1889  
1890   - String key = schedule.getXlName() + "/" + schedule.getFgsName();
  1890 + String key = schedule.getXlName() + "/" + schedule.getFgsBm();
1891 1891 if(!keyMap.containsKey(key))
1892 1892 keyMap.put(key, new ArrayList<ScheduleRealInfo>());
1893 1893 keyMap.get(key).add(schedule);
... ... @@ -1978,9 +1978,9 @@ public class BusIntervalServiceImpl implements BusIntervalService {
1978 1978 qtlc = new BigDecimal("0");
1979 1979 String companyName = "", subCompanyName = "";
1980 1980 for(ScheduleRealInfo schedule : keyMap.get(key)){
1981   - if(schedule.getGsName() != null && companyName.length() == 0)
  1981 + if(schedule.getGsName() != null && companyName.trim().length() == 0)
1982 1982 companyName = schedule.getGsName();
1983   - if(schedule.getFgsName() != null && subCompanyName.length() == 0)
  1983 + if(schedule.getFgsName() != null && subCompanyName.trim().length() == 0)
1984 1984 subCompanyName = schedule.getFgsName();
1985 1985 BigDecimal lc = new BigDecimal("0");
1986 1986 if(schedule.getJhlcOrig() != null && schedule.getJhlcOrig() > 0.1d){
... ... @@ -2071,7 +2071,8 @@ public class BusIntervalServiceImpl implements BusIntervalService {
2071 2071 String[] keys = key.split("/");
2072 2072 tempMap.put("date", Date);
2073 2073 tempMap.put("company", companyName);
2074   - tempMap.put("subCompany", keys[1]);
  2074 + tempMap.put("subCompany", subCompanyName);
  2075 +// tempMap.put("subCompany", keys[1]);
2075 2076 tempMap.put("times", sfqr == 1 ? times : "全日");
2076 2077 tempMap.put("line", keys[0]);
2077 2078 tempMap.put("jhbc", jhbc);
... ... @@ -2338,17 +2339,23 @@ public class BusIntervalServiceImpl implements BusIntervalService {
2338 2339 continue;
2339 2340 }
2340 2341  
2341   - String key = schedule.getGsName() + "/" + schedule.getFgsName() + "/" + schedule.getXlBm();
  2342 + String key = schedule.getGsBm() + "/" + schedule.getFgsBm() + "/" + schedule.getXlBm();
2342 2343 if(!keyMap.containsKey(key))
2343 2344 keyMap.put(key, new ArrayList<ScheduleRealInfo>());
2344 2345 keyMap.get(key).add(schedule);
2345 2346 }
  2347 +
2346 2348 for(String key : keyMap.keySet()){
  2349 + String companyName = "", subCompanyName = "";
2347 2350 Map<String, Object> tempMap = new HashMap<String, Object>();
2348 2351 List<ScheduleRealInfo> tempList = new ArrayList<ScheduleRealInfo>();
2349 2352 int sjbc = 0, sddf = 0, zddf = 0,
2350 2353 dxtz = 0, lbtz = 0;
2351 2354 for(ScheduleRealInfo schedule : keyMap.get(key)){
  2355 + if(schedule.getGsName() != null && companyName.trim().length() == 0)
  2356 + companyName = schedule.getGsName();
  2357 + if(schedule.getFgsName() != null && subCompanyName.trim().length() == 0)
  2358 + subCompanyName = schedule.getFgsName();
2352 2359 boolean flag = false;
2353 2360 if(schedule.getFcsjActual() != null && schedule.getZdsjActual() != null
2354 2361 && schedule.getStatus() != -1 && !schedule.isCcService()){
... ... @@ -2373,8 +2380,10 @@ public class BusIntervalServiceImpl implements BusIntervalService {
2373 2380 }
2374 2381 tempMap.put("date", date);
2375 2382 String[] keys = key.split("/");
2376   - tempMap.put("company", keys[0]);
2377   - tempMap.put("subCompany", keys[1]);
  2383 + tempMap.put("company", companyName);
  2384 + tempMap.put("subCompany", subCompanyName);
  2385 +// tempMap.put("company", keys[0]);
  2386 +// tempMap.put("subCompany", keys[1]);
2378 2387 tempMap.put("line", keys[2]);
2379 2388 tempMap.put("sjbc", sjbc);
2380 2389 tempMap.put("sddf", sddf);
... ... @@ -3108,7 +3117,7 @@ public class BusIntervalServiceImpl implements BusIntervalService {
3108 3117 continue;
3109 3118 }
3110 3119  
3111   - String xl = s.getXlName() + "/" + s.getFgsName();
  3120 + String xl = s.getXlName() + "/" + s.getFgsBm();
3112 3121 String dateStr = s.getScheduleDateStr();
3113 3122 if(!sches.containsKey(xl)){
3114 3123 sches.put(xl, new HashMap<String, List<ScheduleRealInfo>>());
... ... @@ -3138,12 +3147,19 @@ public class BusIntervalServiceImpl implements BusIntervalService {
3138 3147 List<List<Map<String, Object>>> lists = new ArrayList<List<Map<String, Object>>>();
3139 3148 Map<Long, ScheduleRealInfo> keyTemp = new HashMap<Long, ScheduleRealInfo>();
3140 3149 for(Long time : timeList){
  3150 + String companyName = "", subCompanyName = "";
3141 3151 List<Long> keyList = new ArrayList<Long>();
3142 3152 String date = timeTemp.get(time);
3143 3153 List<ScheduleRealInfo> sche2 = sche1.get(date);
3144 3154 for(ScheduleRealInfo s : sche2){
3145 3155 if(s.getFcsj()!=null && s.getFcsj().trim().length() > 0
3146 3156 && s.getFcsj().contains(":")){
  3157 +
  3158 + if(s.getGsName() != null && companyName.trim().length() == 0)
  3159 + companyName = s.getGsName();
  3160 + if(s.getFgsName() != null && subCompanyName.trim().length() == 0)
  3161 + subCompanyName = s.getFgsName();
  3162 +
3147 3163 String[] split = s.getFcsj().split(":");
3148 3164 Long key = Long.valueOf(s.getXlDir())*1500 + Long.valueOf(split[0])*60 + Long.valueOf(split[1]);
3149 3165 while(keyTemp.containsKey(key)){
... ... @@ -3158,8 +3174,10 @@ public class BusIntervalServiceImpl implements BusIntervalService {
3158 3174 for(Long l : keyList){
3159 3175 ScheduleRealInfo s = keyTemp.get(l);
3160 3176 Map<String, Object> temp = new HashMap<String, Object>();
3161   - temp.put("gs", s.getGsName());
3162   - temp.put("fgs", s.getFgsName());
  3177 + temp.put("gs", companyName);
  3178 + temp.put("fgs", subCompanyName);
  3179 +// temp.put("gs", s.getGsName());
  3180 +// temp.put("fgs", s.getFgsName());
3163 3181 temp.put("fgsBm", s.getFgsBm());
3164 3182 temp.put("date", date);
3165 3183 temp.put("xlbm", s.getXlBm());
... ...
src/main/java/com/bsth/service/oil/impl/YlbServiceImpl.java
... ... @@ -291,6 +291,26 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
291 291 String sxtj=map2.get("sxtj").toString();
292 292 if(sxtj.equals("0")){
293 293 listpb=listpbs;
  294 + }else if (sxtj.equals("5")){
  295 + List<String> stringList=new ArrayList<String>();
  296 +
  297 + List<Object[]> objectLists = repository.checkNbmmFgs(rq, gsbm);
  298 + for (int i = 0; i < objectLists.size(); i++) {
  299 + String clbm=objectLists.get(i)[0].toString();
  300 + stringList.add(clbm);
  301 + }
  302 +
  303 + for (int i = 0; i < stringList.size(); i++) {
  304 + String strNbbm=stringList.get(i);
  305 + for (int j = 0; j < listpbs.size(); j++) {
  306 + Map<String, Object> map = listpbs.get(j);
  307 + String mapNbbm=map.get("clZbh").toString();
  308 + if(strNbbm.equals(mapNbbm)){
  309 + listpb.add(map);
  310 + }
  311 + }
  312 + }
  313 +
294 314 }else{
295 315 List<Object[]> objectLists=repository.checkNbmmNum(rq, gsbm, fgsbm, "",nbbm);
296 316 List<String> stringList=new ArrayList<String>();
... ... @@ -1269,6 +1289,19 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
1269 1289 else
1270 1290 listYlb = repository.listYlb_s(sdf.parse(rq+" 00:00:00"), gsbm, fgsbm, xlbm, stringList);
1271 1291 }
  1292 + }else if(sxtj.equals("5")){
  1293 + List<Object[]> objectLists = repository.checkNbmmFgs(rq, gsbm);
  1294 + for (int i = 0; i < objectLists.size(); i++) {
  1295 + String clbm =objectLists.get(i)[0].toString();
  1296 + stringList.add(clbm);
  1297 + }
  1298 +
  1299 + if (stringList.size() > 0) {
  1300 + if (type.equals("1"))
  1301 + listYlb = repository.listYlb(rq, gsbm, fgsbm, xlbm, stringList);
  1302 + else
  1303 + listYlb = repository.listYlb_s(sdf.parse(rq+" 00:00:00"), gsbm, fgsbm, xlbm, stringList);
  1304 + }
1272 1305 } else {
1273 1306 List<Object[]> objectLists;
1274 1307 if (sxtj.equals("3")) {
... ... @@ -1395,6 +1428,10 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
1395 1428 try {
1396 1429 List<Cyl> cylList = cylRepository.findAll(new CustomerSpecs<Cyl>(newMap));
1397 1430 String json =StringEscapeUtils.unescapeHtml4(map.get("ylbList").toString());
  1431 + String fgsbm="999";
  1432 + if(map.get("fgsbm")!=null){
  1433 + fgsbm=map.get("fgsbm").toString();
  1434 + }
1398 1435 JSONArray jsonArray=JSONArray.parseArray(json);
1399 1436 JSONObject jsonObject;
1400 1437 for (int x = 0; x < jsonArray.size(); x++) {
... ... @@ -1409,7 +1446,12 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
1409 1446 String nbbm_eq = ylb.getNbbm();
1410 1447 Date rq_eq = ylb.getRq();
1411 1448 // 得到一天总的加油和里程(根据车,时间)
1412   - List<Object[]> sumList = repository.sumLcYl(nbbm_eq, rq_eq,"",ylb.getSsgsdm(),ylb.getFgsdm());
  1449 + List<Object[]> sumList=new ArrayList<Object[]>();
  1450 + if(fgsbm.equals(""))
  1451 + sumList = repository.sumLcYl(nbbm_eq, rq_eq,"",ylb.getSsgsdm(),fgsbm);
  1452 + else
  1453 + sumList = repository.sumLcYl(nbbm_eq, rq_eq,"",ylb.getSsgsdm(),ylb.getFgsdm());
  1454 +
1413 1455 // 保存总的加油量
1414 1456 Double jzl = 0.0;
1415 1457 // 保存总的里程
... ... @@ -1431,9 +1473,14 @@ public class YlbServiceImpl extends BaseServiceImpl&lt;Ylb,Integer&gt; implements YlbS
1431 1473 }*/
1432 1474 map.put("nbbm_eq", nbbm_eq);
1433 1475 map.put("rq_eq", rq_eq);
1434   -
1435   - List<Ylb> iterator2=this.listOrderBy(sdf.format(rq_eq),ylb.getSsgsdm(),ylb.getFgsdm(),"",
1436   - ylb.getNbbm(),"jcsx");
  1476 + List<Ylb> iterator2=null;
  1477 + if(fgsbm.equals(""))
  1478 + iterator2=this.listOrderBy(sdf.format(rq_eq),ylb.getSsgsdm(),fgsbm,"",
  1479 + ylb.getNbbm(),"jcsx");
  1480 + else
  1481 + iterator2=this.listOrderBy(sdf.format(rq_eq),ylb.getSsgsdm(),ylb.getFgsdm(),"",
  1482 + ylb.getNbbm(),"jcsx");
  1483 +
1437 1484 // repository.obtainYl(sdf.format(rq_eq),ylb.getSsgsdm(),ylb.getFgsdm(),"",
1438 1485 // ylb.getNbbm(),"jcsx");
1439 1486 DecimalFormat df = new DecimalFormat("#.00");
... ...
src/main/java/com/bsth/service/realcontrol/impl/ScheduleRealInfoServiceImpl.java
... ... @@ -568,7 +568,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
568 568  
569 569 //公司 和 分公司名称
570 570 t.setGsName(BasicData.businessCodeNameMap.get(t.getGsBm()));
571   - t.setFgsName(BasicData.businessFgsCodeNameMap.get(t.getGsBm() + "_" + t.getFgsBm()));
  571 + t.setFgsName(BasicData.businessFgsCodeNameMap.get(t.getFgsBm()+ "_" + t.getGsBm() ));
572 572  
573 573 //t.setScheduleDateStr(schDate);
574 574 t.setScheduleDate(sdfyyyyMMdd.parse(t.getScheduleDateStr()));
... ... @@ -590,6 +590,11 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
590 590  
591 591 //计算班次实际执行时间
592 592 schAttrCalculator.calcRealDate(t).calcAllTimeByFcsj(t);
  593 + //处理计达跨24点
  594 + LineConfig conf = lineConfigData.get(t.getXlBm());
  595 + if (t.getZdsj().compareTo(conf.getStartOpt()) < 0) {
  596 + t.setZdsjT(sdfyyyyMMddHHmm.parse(t.getScheduleDateStr() + t.getZdsj()).getTime() + (1000 * 60 * 60 * 24));
  597 + }
593 598 if (t.getZdsjT() < t.getFcsjT()) {
594 599 rs.put("status", ResponseCode.ERROR);
595 600 rs.put("msg", "起终点时间异常!");
... ...
src/main/resources/application-dev.properties
... ... @@ -8,9 +8,10 @@ spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy
8 8 spring.jpa.database= MYSQL
9 9 spring.jpa.show-sql= true
10 10 spring.datasource.driver-class-name= com.mysql.jdbc.Driver
11   -spring.datasource.url= jdbc:mysql://127.0.0.1/pd_control?useUnicode=true&characterEncoding=utf-8&useSSL=false
  11 +#spring.datasource.url= jdbc:mysql://127.0.0.1/control?useUnicode=true&characterEncoding=utf-8&useSSL=false
  12 +spring.datasource.url= jdbc:mysql://192.168.168.222/control?useUnicode=true&characterEncoding=utf-8&useSSL=false
12 13 spring.datasource.username= root
13   -spring.datasource.password=
  14 +spring.datasource.password= root
14 15 #spring.datasource.url= jdbc:mysql://192.168.168.117/pd_control?useUnicode=true&characterEncoding=utf-8&useSSL=false
15 16 #spring.datasource.username= root
16 17 #spring.datasource.password= root
... ...
src/main/resources/fatso/package.json
1   -{
2   - "name": "fatso",
3   - "version": "1.0.0",
4   - "description": "子页面js检查、合并、压缩等处理",
5   - "main": "start.js",
6   - "scripts": {
7   - "test": "echo \"Error: no test specified\" && exit 1"
8   - },
9   - "author": "panzhaov5",
10   - "license": "ISC",
11   - "dependencies": {
12   - "cheerio": "^0.20.0",
13   - "clean-css": "^4.0.12",
14   - "colors": "^1.3.3",
15   - "eventproxy": "^0.3.4",
16   - "uglify-js": "^2.6.2"
17   - }
18   -}
  1 +{
  2 + "name": "fatso",
  3 + "version": "1.0.0",
  4 + "description": "子页面js检查、合并、压缩等处理",
  5 + "main": "start.js",
  6 + "scripts": {
  7 + "test": "echo \"Error: no test specified\" && exit 1"
  8 + },
  9 + "author": "panzhaov5",
  10 + "license": "ISC",
  11 + "dependencies": {
  12 + "cheerio": "^0.20.0",
  13 + "clean-css": "^4.0.12",
  14 + "colors": "^1.3.3",
  15 + "eventproxy": "^0.3.4",
  16 + "uglify-js": "^2.6.2"
  17 + }
  18 +}
... ...
src/main/resources/fatso/start.js
... ... @@ -16,7 +16,7 @@ var platform = process.platform;
16 16 var iswin = platform == 'win32';
17 17 var sp = platform == 'win32' ? '\\' : '/';
18 18 //不参与的目录
19   -var excludes = ['scheduleApp', 'trafficManage', 'control', 'permission' + sp + 'authorize_all', 'summary', 'history_sch', 'report' + sp + 'oil', 'base' + sp + 'geo_data_edit', 'base' + sp + 'carpark', 'forms', 'mforms', 'report', 'punctual', 'base' + sp + 'timesmodel']
  19 +var excludes = ['scheduleApp', 'trafficManage', 'control', 'permission' + sp + 'authorize_all','permission' + sp + 'user', 'summary', 'history_sch', 'report' + sp + 'oil', 'base' + sp + 'geo_data_edit', 'base' + sp + 'carpark', 'forms', 'mforms', 'report', 'punctual', 'base' + sp + 'timesmodel']
20 20 , ep = new EventProxy()
21 21 , pName = 'bsth_control'
22 22 , path = process.cwd()
... ...
src/main/resources/static/pages/base/timesmodel/js/v2_2/main_v2_2.js
1   -/**
2   - * 主类(v2_2版本)。
3   - */
4   -var Main_v2_2 = function() {
5   -
6   - var _paramObj; // 参数对象
7   -
8   - return {
9   - /**
10   - * 使用发车间隔策略生成时刻表。
11   - * @param paramObj 参数对象
12   - * @param lpArray 路牌数组
13   - * @constructor
14   - */
15   - BXPplaceClassesTime03 : function(paramObj, lpArray) {
16   - // 参数对象
17   - _paramObj = paramObj;
18   -
19   - // // 测试行驶时间
20   - // var _fcsj = paramObj.toTimeObj("16:20");
21   - // var _bcsj = StrategyUtils_v2_2.sFn("CALCU_RUNTIME")(false, _fcsj, paramObj); // 使用策略计算班次行驶时间
22   - // console.log("发车时间=" + _fcsj.format("HH:mm") + ",行驶时间=" + _bcsj);
23   - //
24   -
25   - // // 测试停站时间
26   - // var _fcsj = paramObj.toTimeObj("05:30");
27   - // var _layovertime = StrategyUtils_v2_2.sFn("CALCU_LAYOVER_TIME")(
28   - // _fcsj, false, StrategyUtils_v2_2.sFn("CALCU_RUNTIME"), paramObj);
29   - // console.log("发车时间=" + _fcsj.format("HH:mm") + ",停站layover时间=" + _layovertime);
30   - //
31   - // var schedule = {};
32   -
33   - // // 测试间隔时间
34   - // var _fcsj = paramObj.toTimeObj("07:30");
35   - // var _headway = StrategyUtils_v2_2.sFn("CALCU_HEADWAY_2")(true, _fcsj, _paramObj);
36   - // console.log("发车时间=" + _fcsj.format("HH:mm") + ",发车间隔=" + _headway);
37   -
38   - // 1、初始化行车计划
39   - var schedule = new InternalScheduleObj_v2_2(paramObj, lpArray);
40   - // 2、生成班次(从第2圈开始)
41   - schedule.fnCreateBclistWithMasterBc(2, 20);
42   - // 3、调整发车间隔
43   - schedule.fnAdjustHeadway();
44   - // 4、计算吃饭班次
45   - schedule.fnCalcuEatBc();
46   - // // 6、计算末班车
47   - // schedule.fnCalcuLastBc();
48   - // 7、重新设置停站时间
49   - schedule.fnReSetLayoverTime();
50   - // 8、补进出场例保班次
51   - schedule.fnCalcuOtherBc();
52   -
53   - //-------------------- 输出ganut图上的班次,班型描述 ----------------------//
54   - // TODO:班型再议
55   - return {
56   - 'json':schedule.fnToGanttBcArray(),'bxrcgs':null,
57   - 'aInternalLpObj': schedule.fnGetLpArray()
58   - };
59   - },
60   -
61   - //----------------------------------- 导入导出配置 -----------------------------------//
62   -
63   - /**
64   - * 导出时刻表配置。
65   - * @param fnGetGanttBc 获取gantt班次方法
66   - */
67   - exportExcelConfig: function(fnGetGanttBc) {
68   - var oExcel = new Main_v2_2_ExcelObj(_paramObj, fnGetGanttBc);
69   -
70   - $('.exportAddXls').off('click');
71   - $('.exportAddXlsx').off('click');
72   -
73   - $('.exportAddXls').on('click', function() {
74   -
75   - var aInfos = {
76   - "lpObjList": oExcel.fnGetLpBcInfoList(), // 路牌班次信息列表
77   - "statInfoList": oExcel.fnGetStatInfoList(), // 统计项目列表
78   - "parameterInfoList" : oExcel.fnGetParamInfoList() // 参数对象
79   - };
80   -
81   - console.log(aInfos);
82   -
83   - $(".exportAdd").addClass("disabled");
84   - $(".exportAddSpan").html("正在导出...");
85   -
86   - // 提交
87   - $.ajax({
88   - type: 'POST',
89   - url: "/tidc/exportDTDFile/xls",
90   - dataType: 'binary',
91   - contentType: "application/json",
92   - data: JSON.stringify(aInfos),
93   - success: function(data){
94   - oExcel.downloadFile(data, "application/octet-stream", "时刻表信息.xls");
95   -
96   - $(".exportAdd").removeClass("disabled");
97   - $(".exportAddSpan").html(" 导出数据");
98   - },
99   - error: function(xhr, type){
100   - alert('错误:TODO');
101   -
102   - $(".exportAdd").removeClass("disabled");
103   - $(".exportAddSpan").html(" 导出数据");
104   - }
105   - });
106   - });
107   -
108   - $('.exportAddXlsx').on('click', function() {
109   - var aInfos = {
110   - "lpObjList": oExcel.fnGetLpBcInfoList(), // 路牌班次信息列表
111   - "statInfoList": oExcel.fnGetStatInfoList(), // 统计项目列表
112   - "parameterInfoList" : oExcel.fnGetParamInfoList() // 参数对象
113   - };
114   -
115   - console.log(aInfos);
116   -
117   - $(".exportAdd").addClass("disabled");
118   - $(".exportAddSpan").html("正在导出...");
119   -
120   - // 提交
121   - $.ajax({
122   - type: 'POST',
123   - url: "/tidc/exportDTDFile/xlsx",
124   - dataType: 'binary',
125   - contentType: "application/json",
126   - data: JSON.stringify(aInfos),
127   - success: function(data){
128   - oExcel.downloadFile(data, "application/octet-stream", "时刻表信息.xlsx");
129   -
130   - $(".exportAdd").removeClass("disabled");
131   - $(".exportAddSpan").html(" 导出数据");
132   - },
133   - error: function(xhr, type){
134   - alert('错误:TODO');
135   -
136   - $(".exportAdd").removeClass("disabled");
137   - $(".exportAddSpan").html(" 导出数据");
138   - }
139   - });
140   - });
141   - }
142   -
143   -
144   - }
  1 +/**
  2 + * 主类(v2_2版本)。
  3 + */
  4 +var Main_v2_2 = function() {
  5 +
  6 + var _paramObj; // 参数对象
  7 +
  8 + return {
  9 + /**
  10 + * 使用发车间隔策略生成时刻表。
  11 + * @param paramObj 参数对象
  12 + * @param lpArray 路牌数组
  13 + * @constructor
  14 + */
  15 + BXPplaceClassesTime03 : function(paramObj, lpArray) {
  16 + // 参数对象
  17 + _paramObj = paramObj;
  18 +
  19 + // // 测试行驶时间
  20 + // var _fcsj = paramObj.toTimeObj("16:20");
  21 + // var _bcsj = StrategyUtils_v2_2.sFn("CALCU_RUNTIME")(false, _fcsj, paramObj); // 使用策略计算班次行驶时间
  22 + // console.log("发车时间=" + _fcsj.format("HH:mm") + ",行驶时间=" + _bcsj);
  23 + //
  24 +
  25 + // // 测试停站时间
  26 + // var _fcsj = paramObj.toTimeObj("05:30");
  27 + // var _layovertime = StrategyUtils_v2_2.sFn("CALCU_LAYOVER_TIME")(
  28 + // _fcsj, false, StrategyUtils_v2_2.sFn("CALCU_RUNTIME"), paramObj);
  29 + // console.log("发车时间=" + _fcsj.format("HH:mm") + ",停站layover时间=" + _layovertime);
  30 + //
  31 + // var schedule = {};
  32 +
  33 + // // 测试间隔时间
  34 + // var _fcsj = paramObj.toTimeObj("07:30");
  35 + // var _headway = StrategyUtils_v2_2.sFn("CALCU_HEADWAY_2")(true, _fcsj, _paramObj);
  36 + // console.log("发车时间=" + _fcsj.format("HH:mm") + ",发车间隔=" + _headway);
  37 +
  38 + // 1、初始化行车计划
  39 + var schedule = new InternalScheduleObj_v2_2(paramObj, lpArray);
  40 + // 2、生成班次(从第2圈开始)
  41 + schedule.fnCreateBclistWithMasterBc(2, 20);
  42 + // 3、调整发车间隔
  43 + schedule.fnAdjustHeadway();
  44 + // 4、计算吃饭班次
  45 + schedule.fnCalcuEatBc();
  46 + // // 6、计算末班车
  47 + // schedule.fnCalcuLastBc();
  48 + // 7、重新设置停站时间
  49 + schedule.fnReSetLayoverTime();
  50 + // 8、补进出场例保班次
  51 + schedule.fnCalcuOtherBc();
  52 +
  53 + //-------------------- 输出ganut图上的班次,班型描述 ----------------------//
  54 + // TODO:班型再议
  55 + return {
  56 + 'json':schedule.fnToGanttBcArray(),'bxrcgs':null,
  57 + 'aInternalLpObj': schedule.fnGetLpArray()
  58 + };
  59 + },
  60 +
  61 + //----------------------------------- 导入导出配置 -----------------------------------//
  62 +
  63 + /**
  64 + * 导出时刻表配置。
  65 + * @param fnGetGanttBc 获取gantt班次方法
  66 + */
  67 + exportExcelConfig: function(fnGetGanttBc) {
  68 + var oExcel = new Main_v2_2_ExcelObj(_paramObj, fnGetGanttBc);
  69 +
  70 + $('.exportAddXls').off('click');
  71 + $('.exportAddXlsx').off('click');
  72 +
  73 + $('.exportAddXls').on('click', function() {
  74 +
  75 + var aInfos = {
  76 + "lpObjList": oExcel.fnGetLpBcInfoList(), // 路牌班次信息列表
  77 + "statInfoList": oExcel.fnGetStatInfoList(), // 统计项目列表
  78 + "parameterInfoList" : oExcel.fnGetParamInfoList() // 参数对象
  79 + };
  80 +
  81 + console.log(aInfos);
  82 +
  83 + $(".exportAdd").addClass("disabled");
  84 + $(".exportAddSpan").html("正在导出...");
  85 +
  86 + // 提交
  87 + $.ajax({
  88 + type: 'POST',
  89 + url: "/tidc/exportDTDFile/xls",
  90 + dataType: 'binary',
  91 + contentType: "application/json",
  92 + data: JSON.stringify(aInfos),
  93 + success: function(data){
  94 + oExcel.downloadFile(data, "application/octet-stream", "时刻表信息.xls");
  95 +
  96 + $(".exportAdd").removeClass("disabled");
  97 + $(".exportAddSpan").html(" 导出数据");
  98 + },
  99 + error: function(xhr, type){
  100 + alert('错误:TODO');
  101 +
  102 + $(".exportAdd").removeClass("disabled");
  103 + $(".exportAddSpan").html(" 导出数据");
  104 + }
  105 + });
  106 + });
  107 +
  108 + $('.exportAddXlsx').on('click', function() {
  109 + var aInfos = {
  110 + "lpObjList": oExcel.fnGetLpBcInfoList(), // 路牌班次信息列表
  111 + "statInfoList": oExcel.fnGetStatInfoList(), // 统计项目列表
  112 + "parameterInfoList" : oExcel.fnGetParamInfoList() // 参数对象
  113 + };
  114 +
  115 + console.log(aInfos);
  116 +
  117 + $(".exportAdd").addClass("disabled");
  118 + $(".exportAddSpan").html("正在导出...");
  119 +
  120 + // 提交
  121 + $.ajax({
  122 + type: 'POST',
  123 + url: "/tidc/exportDTDFile/xlsx",
  124 + dataType: 'binary',
  125 + contentType: "application/json",
  126 + data: JSON.stringify(aInfos),
  127 + success: function(data){
  128 + oExcel.downloadFile(data, "application/octet-stream", "时刻表信息.xlsx");
  129 +
  130 + $(".exportAdd").removeClass("disabled");
  131 + $(".exportAddSpan").html(" 导出数据");
  132 + },
  133 + error: function(xhr, type){
  134 + alert('错误:TODO');
  135 +
  136 + $(".exportAdd").removeClass("disabled");
  137 + $(".exportAddSpan").html(" 导出数据");
  138 + }
  139 + });
  140 + });
  141 + }
  142 +
  143 +
  144 + }
145 145 }();
146 146 \ No newline at end of file
... ...
src/main/resources/static/pages/forms/calc/calcLbStatuAnaly.html 0 → 100644
  1 +<style type="text/css">
  2 + .table-bordered {
  3 + border: 1px solid; }
  4 + .table-bordered > thead > tr > th,
  5 + .table-bordered > thead > tr > td,
  6 + .table-bordered > tbody > tr > th,
  7 + .table-bordered > tbody > tr > td,
  8 + .table-bordered > tfoot > tr > th,
  9 + .table-bordered > tfoot > tr > td {
  10 + border: 1px solid; }
  11 + .table-bordered > thead > tr > th,
  12 + .table-bordered > thead > tr > td {
  13 + border-bottom-width: 2px; }
  14 + .table > tbody + tbody {
  15 + border-top: 1px solid; }
  16 + #forms > tbody > tr{
  17 + background-color: #FFFFFF;
  18 + }
  19 +</style>
  20 +
  21 +<div class="page-head">
  22 + <div class="page-title">
  23 + <h1>烂班情况分析表(统计)</h1>
  24 + </div>
  25 +</div>
  26 +
  27 +<div class="row">
  28 + <div class="col-md-12">
  29 + <div class="portlet light porttlet-fit bordered">
  30 + <div class="portlet-title">
  31 + <form id="history" class="form-inline" action="">
  32 + <div style="display: inline-block;margin-left: 5px;">
  33 + <span class="item-label" style="width: 80px;">烂班原因: </span>
  34 + <input class="form-control" type="checkbox" id="totalLb" style="width: 20px;" checked="true"/>全选
  35 + <input class="form-control" type="checkbox" name="reason" style="width: 20px;" value="0" checked="true"/>路阻
  36 + <input class="form-control" type="checkbox" name="reason" style="width: 20px;" value="1" checked="true"/>吊慢
  37 + <input class="form-control" type="checkbox" name="reason" style="width: 20px;" value="2" checked="true"/>故障
  38 + <input class="form-control" type="checkbox" name="reason" style="width: 20px;" value="3" checked="true"/>纠纷
  39 + <input class="form-control" type="checkbox" name="reason" style="width: 20px;" value="4" checked="true"/>肇事
  40 + <input class="form-control" type="checkbox" name="reason" style="width: 20px;" value="5" checked="true"/>缺人
  41 + <input class="form-control" type="checkbox" name="reason" style="width: 20px;" value="6" checked="true"/>缺车
  42 + <input class="form-control" type="checkbox" name="reason" style="width: 20px;" value="7" checked="true"/>客稀
  43 + <input class="form-control" type="checkbox" name="reason" style="width: 20px;" value="8" checked="true"/>气候
  44 + <input class="form-control" type="checkbox" name="reason" style="width: 20px;" value="9" checked="true"/>援外
  45 + <input class="form-control" type="checkbox" name="reason" style="width: 20px;" value="10" checked="true"/>其他
  46 + </div>
  47 + <div style="margin-top: 5px"></div>
  48 + <div style="display: inline-block; margin-left: 33px;" id="company1">
  49 + <span class="item-label" style="width: 80px;">公司: </span>
  50 + <select class="form-control" name="company" id="company" style="width: 140px;"></select>
  51 + </div>
  52 + <div style="display: inline-block; margin-left: 24px;" id="subCompany1">
  53 + <span class="item-label" style="width: 80px;">分公司: </span>
  54 + <select class="form-control" name="subCompany" id="subCompany" style="width: 140px;"></select>
  55 + </div>
  56 + <div style="display: inline-block; margin-left: 10px;">
  57 + <span class="item-label" style="width: 80px;">选择线路: </span>
  58 + <select class="form-control" name="line" id="line" style="width: 150px;"></select>
  59 + </div>
  60 + <div style="margin-top: 10px"></div>
  61 + <div style="display: inline-block; margin-left: 5px">
  62 + <span class="item-label" style="width: 80px;">是否营运: </span>
  63 + <select class="form-control" name="sfyy" id="sfyy" style="width: 140px;">
  64 + <option value="0">全部线路</option>
  65 + <option value="1" selected="selected">营运线路</option>
  66 + <option value="2">非营运线路</option>
  67 + </select>
  68 + </div>
  69 + <div style="display: inline-block;margin-left: 10px;">
  70 + <span class="item-label" style="width: 80px;">开始时间: </span>
  71 + <input class="form-control" type="text" id="startDate" style="width: 140px;"/>
  72 + </div>
  73 + <div style="display: inline-block;margin-left: 10px;">
  74 + <span class="item-label" style="width: 80px;">结束时间: </span>
  75 + <input class="form-control" type="text" id="endDate" style="width: 140px;"/>
  76 + </div>
  77 + <div class="form-group" style="margin-left: 10px">
  78 + <input class="btn btn-default" type="button" id="query" value="筛选"/>
  79 + <input class="btn btn-default" type="button" id="export" value="导出"/>
  80 + </div>
  81 + </form>
  82 + </div>
  83 + <div class="portlet-body">
  84 + <div class="table-container" id="table" style="margin-top: 0px;overflow:auto;min-width: 906px;">
  85 + <table class="table table-bordered table-hover table-checkable" id="forms">
  86 + <thead>
  87 +
  88 + </thead>
  89 + <tbody>
  90 +
  91 + </tbody>
  92 + </table>
  93 + <div style="text-align: right;">
  94 + <ul id="pagination" class="pagination"></ul>
  95 + </div>
  96 + </div>
  97 + </div>
  98 + </div>
  99 + </div>
  100 +</div>
  101 +
  102 +<script>
  103 + $(function(){
  104 + $('#export').attr('disabled', "true");
  105 +
  106 + // 关闭左侧栏
  107 + if (!$('body').hasClass('page-sidebar-closed'))
  108 + $('.menu-toggler.sidebar-toggler').click();
  109 +
  110 +
  111 + var d = new Date();
  112 + d.setTime(d.getTime() - 1*1000*60*60*24);
  113 + var year = d.getFullYear();
  114 + var month = d.getMonth() + 1;
  115 + var day = d.getDate();
  116 + if(month < 10)
  117 + month = "0" + month;
  118 + if(day < 10)
  119 + day = "0" + day;
  120 + var dateTime = year + "-" + month + "-" + day;
  121 + $("#startDate").datetimepicker({
  122 + format : 'YYYY-MM-DD',
  123 + locale : 'zh-cn',
  124 + maxDate : dateTime
  125 + });
  126 + $("#endDate").datetimepicker({
  127 + format : 'YYYY-MM-DD',
  128 + locale : 'zh-cn',
  129 + maxDate : dateTime
  130 + });
  131 + $("#startDate").val(dateTime);
  132 + $("#endDate").val(dateTime);
  133 +
  134 +
  135 + var fage=false;
  136 + var xlList;
  137 + var obj = [];
  138 +
  139 + $.get('/report/lineList',function(result){
  140 + xlList=result;
  141 + $.get('/user/companyData', function(result){
  142 + obj = result;
  143 + var options = '';
  144 + for(var i = 0; i < obj.length; i++){
  145 + options += '<option value="'+obj[i].companyCode+'">'+obj[i].companyName+'</option>';
  146 + }
  147 +
  148 + if(obj.length ==0){
  149 + $("#company1").css('display','none');
  150 + }else if(obj.length ==1){
  151 + $("#company1").css('display','none');
  152 + if(obj[0].children.length == 1 || obj[0].children.length ==0)
  153 + $('#subCompany1').css('display','none');
  154 + }
  155 + $('#company').html(options);
  156 + updateCompany();
  157 + });
  158 + })
  159 + $("#company").on("change",updateCompany);
  160 + function updateCompany(){
  161 + var company = $('#company').val();
  162 + var options = '<option value="">全部分公司</option>';
  163 + for(var i = 0; i < obj.length; i++){
  164 + if(obj[i].companyCode == company){
  165 + var children = obj[i].children;
  166 + for(var j = 0; j < children.length; j++){
  167 + options += '<option value="'+children[j].code+'">'+children[j].name+'</option>';
  168 + }
  169 + }
  170 + }
  171 + $('#subCompany').html(options);
  172 + }
  173 +
  174 + var tempData = {};
  175 + $.get('/report/lineList',function(xlList){
  176 + var data = [];
  177 + data.push({id: " ", text: "全部线路"});
  178 + $.get('/user/companyData', function(result){
  179 + for(var i = 0; i < result.length; i++){
  180 + var companyCode = result[i].companyCode;
  181 + var children = result[i].children;
  182 + for(var j = 0; j < children.length; j++){
  183 + var code = children[j].code;
  184 + for(var k=0;k < xlList.length;k++ ){
  185 + if(xlList[k]["fgsbm"]==code && xlList[k]["gsbm"]==companyCode){
  186 + data.push({id: xlList[k]["xlbm"], text: xlList[k]["xlname"]});
  187 + tempData[xlList[k]["xlbm"]] = companyCode+":"+code;
  188 + }
  189 + }
  190 + }
  191 + }
  192 + initPinYinSelect2('#line',data,'');
  193 +
  194 + });
  195 + });
  196 +
  197 + $("#line").on("change", function(){
  198 + if($("#line").val() == " "){
  199 + $("#company").attr("disabled", false);
  200 + $("#subCompany").attr("disabled", false);
  201 + } else {
  202 + var temp = tempData[$("#line").val()].split(":");
  203 + $("#company").val(temp[0]);
  204 + updateCompany();
  205 +// $("#subCompany").val(temp[1]);
  206 + $("#subCompany").val("");
  207 + $("#company").attr("disabled", true);
  208 +// $("#subCompany").attr("disabled", true);
  209 + }
  210 + });
  211 +
  212 + var lb = 0; //标志是否有选择至少一个烂班类型
  213 + $("#totalLb").on("change", function(){
  214 + var reason = $("input[name='reason']");
  215 + var checked = this.checked;
  216 + $.each(reason, function(i, g){
  217 + g.checked = checked;
  218 + });
  219 + if(checked == true)
  220 + lb = 33;
  221 + else
  222 + lb = 0;
  223 + });
  224 +
  225 + $("input[name='reason']").on("change", function(){
  226 + var totalLb = $("#totalLb")[0];
  227 + totalLb.checked = true;
  228 + lb = 0;
  229 + $.each($("input[name='reason']"), function(i, g){
  230 + if(g.checked == false){
  231 + totalLb.checked = false;
  232 + }else{
  233 + lb += 3;
  234 + }
  235 + });
  236 + });
  237 +
  238 + $("#query").on("click",jsDoQuery);
  239 +
  240 + var sfyy = 1;
  241 + var line = $("#line").val();
  242 + var startDate = $("#startDate").val();
  243 + var endDate = $("#endDate").val();
  244 + var company = $("#company").val();
  245 + var subCompany = $("#subCompany").val();
  246 + var lineName = $('#line option:selected').text();
  247 + function jsDoQuery(pagination){
  248 + if($("#startDate").val().trim().length == 0 || $("#endDate").val().trim().length == 0){
  249 + layer.msg("请选择日期");
  250 + return;
  251 + }
  252 + var reason = $("input[name='reason']");
  253 + var params = {};
  254 + if(line == " ")
  255 + line = "";
  256 +// line = $("#line").val();
  257 + sfyy = $("#sfyy").val();
  258 + startDate = $("#startDate").val();
  259 + endDate = $("#endDate").val();
  260 + company = $("#company").val();
  261 + subCompany = $("#subCompany").val();
  262 + params['line'] = line;
  263 + params['sfyy'] = sfyy;
  264 + params['startDate'] = startDate;
  265 + params['endDate'] = endDate;
  266 + params['company'] = company;
  267 + params['subCompany'] = subCompany;
  268 + params['type'] = "query";
  269 + lineName = $('#line option:selected').text();
  270 + if(lineName == "全部线路")
  271 + lineName = $('#subCompany option:selected').text();
  272 + var i = layer.load(2);
  273 +// $(".hidden").removeClass("hidden");
  274 + $get('/calcLbStatuAnaly/lbStatuAnaly', params, function(result){
  275 + // 把数据填充到模版中
  276 + var tbodyHtml = template('list_lbAnaly',{list:result, reason:reason, lb:lb});
  277 + // 把渲染好的模版html文本追加到表格中
  278 + $('#forms').html(tbodyHtml);
  279 + layer.close(i);
  280 +
  281 + _w_table_rowspan("#forms", 1);
  282 + _w_table_rowspan("#forms", 2);
  283 + _w_table_rowspan("#forms", 3);
  284 + _w_table_rowspan("#forms", 4);
  285 +// _w_table_rowspan("#forms", 5);
  286 +
  287 + if(result.length == 0)
  288 + $('#export').attr('disabled', "true");
  289 + else
  290 + $("#export").removeAttr("disabled");
  291 +
  292 + if($("#forms").height()+70 > $(window).height()-110){
  293 + $("#table").height($(window).height()-110);
  294 + } else {
  295 + $("#table").height($("#forms").height()+70);
  296 + }
  297 + });
  298 + }
  299 +
  300 + $("#export").on("click", function(){
  301 + if($("#startDate").val().trim().length == 0 || $("#endDate").val().trim().length == 0){
  302 + layer.msg("请选择日期");
  303 + return;
  304 + }
  305 + var params = {};
  306 + params['line'] = line;
  307 + params['sfyy'] = sfyy;
  308 + params['startDate'] = startDate;
  309 + params['endDate'] = endDate;
  310 + params['company'] = company;
  311 + params['subCompany'] = subCompany;
  312 + params['type'] = "export";
  313 + params['lineName'] = lineName;
  314 + var i = layer.load(2);
  315 + $get('/calc_export/lbStatuAnalyExport', params, function(result){
  316 + var dd = "";
  317 + if(startDate == endDate){
  318 + dd = moment(startDate).format("YYYYMMDD");
  319 + } else {
  320 + dd = moment(startDate).format("YYYYMMDD")
  321 + +"-"+moment(endDate).format("YYYYMMDD");
  322 + }
  323 + window.open("/downloadFile/download?fileName="
  324 + +dd+"-"+lineName+"-烂班情况分析表(统计)");
  325 + layer.close(i);
  326 + });
  327 + });
  328 +
  329 +
  330 + $("#line").on("change", function(){
  331 + line = $("#line").val();
  332 + if(line == " ")
  333 + line = "";
  334 + });
  335 + $('#startDate').on("blur", function(){
  336 + startDate = $("#startDate").val();
  337 + endDate = $("#endDate").val();
  338 + });
  339 + $('#endDate').on("blur", function(){
  340 + startDate = $("#startDate").val();
  341 + endDate = $("#endDate").val();
  342 + });
  343 +
  344 +
  345 + /**
  346 + * 将模块List 转换为树结构
  347 + * @param arr
  348 + * @returns {Array}
  349 + */
  350 + function createTreeData(arr){
  351 + var treeData = [];
  352 + var len = arr.length;
  353 + for(var i = 0; i < len; i ++){
  354 + var pId = arr[i].pId;
  355 + arr[i].text = arr[i].name;
  356 + if(!pId){
  357 + treeData.push(arr[i]);
  358 + }
  359 +
  360 + for(var j = 0; j < len; j ++){
  361 + if(pId == arr[j].id){
  362 + if(!arr[j].children)
  363 + arr[j].children = [];
  364 + arr[j].children.push(arr[i]);
  365 + break;
  366 + }
  367 + }
  368 + }
  369 + return treeData;
  370 + }
  371 +
  372 + function _w_table_rowspan(_w_table_id, _w_table_colnum){
  373 + _w_table_firsttd = "";
  374 + _w_table_currenttd = "";
  375 + _w_table_SpanNum = 0;
  376 + _w_table_Obj = jQuery(_w_table_id + " tr td:nth-child(" + _w_table_colnum + ")");
  377 + _w_table_Obj.each(function(i){
  378 + if(i==0){
  379 + _w_table_firsttd = jQuery(this);
  380 + _w_table_SpanNum = 1;
  381 + }else{
  382 + _w_table_currenttd = jQuery(this);
  383 + if(_w_table_firsttd.text()==_w_table_currenttd.text()){
  384 + _w_table_SpanNum++;
  385 + _w_table_currenttd.hide(); //remove();
  386 + _w_table_firsttd.attr("rowSpan",_w_table_SpanNum);
  387 + }else{
  388 + _w_table_firsttd = jQuery(this);
  389 + _w_table_SpanNum = 1;
  390 + }
  391 + }
  392 + });
  393 + }
  394 +
  395 +
  396 + });
  397 +
  398 +</script>
  399 +<script type="text/html" id="list_lbAnaly">
  400 +<thead>
  401 + <tr>
  402 + <th class="hidden"></th>
  403 + <th rowspan="3" style=" width:120px;">日期</th>
  404 + <th rowspan="3">公司</th>
  405 + <th rowspan="3">分公司</th>
  406 + <th rowspan="3">线路</th>
  407 + <th rowspan="2" colspan="3">总班次</th>
  408 + <th rowspan="2" colspan="3">总营运公里</th>
  409 + {{if lb != 0}}
  410 + <th colspan={{lb}}>烂班原因</th>
  411 + {{/if}}
  412 + </tr>
  413 + <tr>
  414 + <th class="hidden"></th>
  415 + {{if reason[0].checked == true}}<th colspan="3">路阻</th>{{/if}}
  416 + {{if reason[1].checked == true}}<th colspan="3">吊慢</th>{{/if}}
  417 + {{if reason[2].checked == true}}<th colspan="3">故障</th>{{/if}}
  418 + {{if reason[3].checked == true}}<th colspan="3">纠纷</th>{{/if}}
  419 + {{if reason[4].checked == true}}<th colspan="3">肇事</th>{{/if}}
  420 + {{if reason[5].checked == true}}<th colspan="3">缺人</th>{{/if}}
  421 + {{if reason[6].checked == true}}<th colspan="3">缺车</th>{{/if}}
  422 + {{if reason[7].checked == true}}<th colspan="3">客稀</th>{{/if}}
  423 + {{if reason[8].checked == true}}<th colspan="3">气候</th>{{/if}}
  424 + {{if reason[9].checked == true}}<th colspan="3">援外</th>{{/if}}
  425 + {{if reason[10].checked == true}}<th colspan="3">其他</th>{{/if}}
  426 + </tr>
  427 + <tr>
  428 + <th class="hidden"></th>
  429 + <th>计划</th><th>实际</th><th>百分比</th>
  430 + <th>计划</th><th>实际</th><th>百分比</th>
  431 + {{if reason[0].checked==true}}<th>烂班班次</th><th>烂班公里</th><th>百分比</th>{{/if}}
  432 + {{if reason[1].checked==true}}<th>烂班班次</th><th>烂班公里</th><th>百分比</th>{{/if}}
  433 + {{if reason[2].checked==true}}<th>烂班班次</th><th>烂班公里</th><th>百分比</th>{{/if}}
  434 + {{if reason[3].checked==true}}<th>烂班班次</th><th>烂班公里</th><th>百分比</th>{{/if}}
  435 + {{if reason[4].checked==true}}<th>烂班班次</th><th>烂班公里</th><th>百分比</th>{{/if}}
  436 + {{if reason[5].checked==true}}<th>烂班班次</th><th>烂班公里</th><th>百分比</th>{{/if}}
  437 + {{if reason[6].checked==true}}<th>烂班班次</th><th>烂班公里</th><th>百分比</th>{{/if}}
  438 + {{if reason[7].checked==true}}<th>烂班班次</th><th>烂班公里</th><th>百分比</th>{{/if}}
  439 + {{if reason[8].checked==true}}<th>烂班班次</th><th>烂班公里</th><th>百分比</th>{{/if}}
  440 + {{if reason[9].checked==true}}<th>烂班班次</th><th>烂班公里</th><th>百分比</th>{{/if}}
  441 + {{if reason[10].checked==true}}<th>烂班班次</th><th>烂班公里</th><th>百分比</th>{{/if}}
  442 + </tr>
  443 +</thead>
  444 +<tbody>
  445 + {{each list as obj i}}
  446 + <tr>
  447 + {{if obj.line!='合计'}}
  448 + <td>{{obj.date}}</td>
  449 + <td>{{obj.company}}</td>
  450 + <td>{{obj.subCompany}}</td>
  451 + <td>{{obj.line}}</td>
  452 + {{/if}}
  453 + {{if obj.line=='合计'}}
  454 + <td colspan="4">{{obj.line}}</td>
  455 + {{/if}}
  456 + <td>{{obj.jhbc}}</td><td>{{obj.sjbc}}</td><td>{{obj.bcbfb}}</td>
  457 + <td>{{obj.jhlc}}</td><td>{{obj.sjlc}}</td><td>{{obj.lcbfb}}</td>
  458 + {{if reason[0].checked==true}}<td>{{obj.lzbc}}</td><td>{{obj.lzlc}}</td><td>{{obj.lzbfb}}</td>{{/if}}
  459 + {{if reason[1].checked==true}}<td>{{obj.dmbc}}</td><td>{{obj.dmlc}}</td><td>{{obj.dmbfb}}</td>{{/if}}
  460 + {{if reason[2].checked==true}}<td>{{obj.gzbc}}</td><td>{{obj.gzlc}}</td><td>{{obj.gzbfb}}</td>{{/if}}
  461 + {{if reason[3].checked==true}}<td>{{obj.jfbc}}</td><td>{{obj.jflc}}</td><td>{{obj.jfbfb}}</td>{{/if}}
  462 + {{if reason[4].checked==true}}<td>{{obj.zsbc}}</td><td>{{obj.zslc}}</td><td>{{obj.zsbfb}}</td>{{/if}}
  463 + {{if reason[5].checked==true}}<td>{{obj.qrbc}}</td><td>{{obj.qrlc}}</td><td>{{obj.qrbfb}}</td>{{/if}}
  464 + {{if reason[6].checked==true}}<td>{{obj.qcbc}}</td><td>{{obj.qclc}}</td><td>{{obj.qcbfb}}</td>{{/if}}
  465 + {{if reason[7].checked==true}}<td>{{obj.kxbc}}</td><td>{{obj.kxlc}}</td><td>{{obj.kxbfb}}</td>{{/if}}
  466 + {{if reason[8].checked==true}}<td>{{obj.qhbc}}</td><td>{{obj.qhlc}}</td><td>{{obj.qhbfb}}</td>{{/if}}
  467 + {{if reason[9].checked==true}}<td>{{obj.ywbc}}</td><td>{{obj.ywlc}}</td><td>{{obj.ywbfb}}</td>{{/if}}
  468 + {{if reason[10].checked==true}}<td>{{obj.qtbc}}</td><td>{{obj.qtlc}}</td><td>{{obj.qtbfb}}</td>{{/if}}
  469 + </tr>
  470 + {{/each}}
  471 + {{if list.length == 0}}
  472 + <tr>
  473 + <td colspan="44"><h6 class="muted">没有找到相关数据</h6></td>
  474 + </tr>
  475 + {{/if}}
  476 +</tbody>
  477 +</script>
0 478 \ No newline at end of file
... ...
src/main/resources/static/pages/forms/mould/calcLbStatuAnaly.xls 0 → 100644
No preview for this file type
src/main/resources/static/pages/oil/list_ph.html
... ... @@ -149,6 +149,7 @@
149 149 <option value="2">一车多单</option>
150 150 <option value="3">有加油没里程</option>
151 151 <option value="4">有里程没加油</option>
  152 + <option value="5">跨分工用车</option>
152 153 </select>
153 154 </div>
154 155  
... ... @@ -547,6 +548,8 @@ onkeyup=&quot;this.value=this.value.replace(/[^(\d||/.)]/g,&#39;&#39;).replace(&#39;.&#39;,&#39;$#$&#39;).rep
547 548 }else{
548 549 var params2 = {};
549 550 params2['ylbList']=JSON.stringify(ylArray2);
  551 + params2['fgsbm']=$("#ylbListFgsdmId").val();
  552 +
550 553 var i = layer.load(2);
551 554 //保存操作
552 555 $post('/ylb/saveYlbList', params, function () {
... ... @@ -659,11 +662,17 @@ onkeyup=&quot;this.value=this.value.replace(/[^(\d||/.)]/g,&#39;&#39;).replace(&#39;.&#39;,&#39;$#$&#39;).rep
659 662 $('tr.filter .filter-submit').on('click', function () {
660 663 var ylbGsdm=$("#ylbListGsdmId").val();
661 664 var ylbFgsdm=$("#ylbListFgsdmId").val();
  665 + var nbbm=$("#nbbm").val();
662 666 if ($("#rq").val() == "" || $("#rq").val() ==null){
663 667 layer.msg('请选择日期.');
664   - }else if(ylbGsdm=="" || ylbGsdm==null || ylbFgsdm=="" ||ylbFgsdm==null){
665   - layer.msg('请选择公司和分公司.');
666   - }else {
  668 + }else if(ylbGsdm=="" || ylbGsdm==null){
  669 +// || ylbFgsdm==""
  670 + layer.msg('请选择公司');
  671 + }
  672 + /* else if( (ylbFgsdm==""||ylbFgsdm==null) && (nbbm=="" || nbbm==null) ){
  673 + layer.msg('不选择分公司处理输入车辆自编号');
  674 + } */
  675 + else {
667 676 var params = getParamsList();
668 677 page = 0;
669 678 jsDoQuery(params, true);
... ... @@ -697,6 +706,7 @@ onkeyup=&quot;this.value=this.value.replace(/[^(\d||/.)]/g,&#39;&#39;).replace(&#39;.&#39;,&#39;$#$&#39;).rep
697 706 }
698 707 }
699 708 }
  709 + options += '<option value="">全部分公司</option>';
700 710 $('#ylbListFgsdmId').html(options);
701 711 initXl();
702 712 initCl();
... ...
src/main/resources/static/pages/permission/user/authorize.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   - <link rel="stylesheet" href="/assets/plugins/ztree_v3/css/zTreeStyle/zTreeStyle.css" />
9   - <style>
10   - html,body{
11   - height: 100%;
12   - }
13   - .ct_page{
14   - padding: 25px 15px;
15   - height: 100%;
16   - height: calc(100% - 50px);
17   - }
18   -
19   - .ct_cont{
20   - height: calc(100% - 41px);
21   - }
22   -
23   - .ct_cont>div>div.uk-card{
24   - height: 99%;
25   - }
26   -
27   - form .uk-inline{
28   - width: calc(100% - 4px);
29   - margin-left: 2px;
30   - }
31   -
32   - .ct-card-body{
33   - overflow: auto;
34   - padding: 1px 1px 0 2px;
35   - height: calc(100% - 54px);
36   - position: relative;
37   - margin-top: -12px;
38   - }
39   -
40   - .ct_li_desc{
41   - color: #a8a8a8;
42   - font-size: 13px;
43   - }
44   -
45   - .ct-card-body .uk-list-large{
46   - font-size: 14px;
47   - }
48   -
49   - .ct-card-body .uk-list-large>li{
50   - cursor: default;
51   - padding-left: 20px;
52   - margin-top: 2px !important;
53   - padding-top: 17px !important;
54   - position: relative;
55   - }
56   -
57   - .ct-card-body .uk-list-large>li:hover{
58   - background: #edecec;
59   - }
60   -
61   - .ct-card-body .uk-list-large>li.active{
62   - background: #1e87f0 !important;
63   - color: white;
64   - }
65   -
66   - .ct-card-body .uk-list-large>li.active>span.role-code{
67   - color: #ffffff;
68   - }
69   -
70   - .ct-card-body .uk-list-large.role-list>li:hover{
71   - background: #fff494;
72   - }
73   -
74   - .ct-card-body .uk-list-large>li.active .ct_li_desc{
75   - color: #e6e6e6;
76   - }
77   -
78   - .ct-card-body .uk-list-large>li>span.uk-badge{
79   - position: absolute;
80   - top: 17px;
81   - right: 25px;
82   - }
83   -
84   - .ct-card-body .uk-list-large>li>span.role-code{
85   - padding: 4px 6px;
86   - color: #a8a8a8;
87   - margin-left: 5px;
88   - }
89   -
90   - .top_title{
91   - padding: 9px 0 5px 15px;
92   - border-bottom: 1px solid #ededed;
93   - border-left: 5px solid #FFC107;
94   - }
95   -
96   - .top_title>.desc{
97   - font-size: 13px;
98   - color: grey;
99   - margin-top: 3px;
100   - }
101   -
102   - .left_menu_list{
103   - overflow: auto;
104   - position: relative;
105   - }
106   -
107   - .left_menu_list .ps-container > .ps-scrollbar-x-rail, .ps-container > .ps-scrollbar-y-rail{
108   - opacity: 0.6 !important;
109   - padding: 0 !important;
110   - }
111   -
112   - ._company{
113   - margin: 15px 0px;
114   - }
115   - ._company>h5{
116   - margin-bottom: 10px;
117   - font-size: 15px;
118   - color: #6b6b6b;
119   - text-indent: 12px;
120   - }
121   - ._company>._fgs>label{
122   - padding: 3px 12px 3px 10px;
123   - display: inline-block;
124   - border: 1px solid gainsboro;
125   - border-radius: 2px;
126   - margin: 5px;
127   - font-size: 14px;
128   - }
129   - ._company>._fgs>label.active{
130   - background: #1e87f0;
131   - color: #fff;
132   - }
133   - ._company .uk-checkbox:checked:focus,
134   - .line_checkbox_list .uk-checkbox:checked:focus{
135   - background-color: #1e87f0 !important;
136   - }
137   - .save_icon{
138   - position: absolute;
139   - right: 2px;
140   - background: #bec4c9;
141   - font-size: 12px;
142   - padding: 2px 15px;
143   - color: #fff;
144   - box-shadow: 0 5px 15px rgba(0,0,0,0.08);
145   - cursor: pointer;
146   - }
147   - .save_icon:hover{
148   - background: #FFC107;
149   - }
150   - .data_auth_list{
151   - position: relative;
152   - }
153   - #user_authorize_wrap .top_title{
154   - border-left: 5px solid #cacac8;
155   - }
156   - .xd_line_list{
157   - height: 37%;
158   - padding: 7px;
159   - border-bottom: 1px solid #f2f2f2;
160   - overflow: auto;
161   - position: relative;
162   - }
163   - .xd_line_list>h5{
164   - color: #858585;
165   - margin: 5px 5px 5px 0;
166   - font-size: 14px;
167   - }
168   - .sub_lines{
169   - padding-left: 15px;
170   - }
171   - .sub_lines>span.line_btn {
172   - background: #00BCD4;
173   - color: #fff;
174   - padding: 4px 9px;
175   - display: inline-block;
176   - min-width: 68px;
177   - text-align: center;
178   - margin: 5px 2px;
179   - box-shadow: 0 5px 9px rgba(0,0,0,0.08);
180   - cursor: pointer;
181   - font-size: 14px;
182   - font-family: 微软雅黑;
183   - }
184   -
185   - .sub_lines>span.line_btn.destroy{
186   - background: #ff5c5c;
187   - }
188   -
189   - .sub_lines>span.line_btn.destroy:hover{
190   - background: #ff7373;
191   - }
192   -
193   - .sub_lines>span.line_btn:hover{
194   - background: #2dd7ed;
195   - }
196   - .add_line_icon{
197   - cursor: pointer;
198   - padding: 2px 5px;
199   - border-radius: 5px;
200   - display: inline-block;
201   - }
202   - .add_line_icon>i{
203   - vertical-align: top;
204   - margin-top: 3px;
205   - }
206   - .add_line_icon:hover{
207   - background: #ededed;
208   - }
209   - .ct_pattern_form{
210   - display: inline-block;
211   - }
212   - .xd_menu_grid{
213   - padding: 25px 25px 0 25px;
214   - height: calc(63% - 91px);
215   - }
216   - .xd_menu_grid .uk-list{
217   - border: 1px solid #ededed;
218   - height: calc(100% - 70px);
219   - overflow: auto;
220   - position: relative;
221   - }
222   -
223   - .xd_menu_grid .uk-list>li{
224   - margin: 5px 0 !important;
225   - padding: 10px 0 0 10px !important;
226   - font-size: 14px;
227   - }
228   - .top_tools{
229   - position: absolute;
230   - top: 15px;
231   - right: 25px;
232   - }
233   - .ct_field {
234   - display: inline-block;
235   - width: 240px;
236   - }
237   - .ct_field>select,.ct_field>input{
238   - width: calc(100% - 60px);
239   - }
240   - .line_checkbox_list{
241   - margin-top: 15px;
242   - }
243   - .line_checkbox_list>.btn{
244   - padding: 5px 7px;
245   - border-radius: 2px;
246   - display: inline-block;
247   - margin: 4px 9px;
248   - font-size: 14px;
249   - font-family: 微软雅黑;
250   - border: 1px solid #d9d9d9;
251   - width: 100px;
252   - overflow: hidden;
253   - text-overflow: ellipsis;
254   - white-space: nowrap;
255   - }
256   - .line_checkbox_list>.btn>input{
257   - margin-right: 5px;
258   - }
259   - .line_checkbox_list>.btn.active{
260   - background: #1e87f0;
261   - color: #fff;
262   - }
263   -
264   - .line_checkbox_list>.btn.destroy,
265   - .line_checkbox_list>.btn.destroy>input{
266   - border-color: #ff9595;
267   - color: #ff5c5c;
268   - }
269   -
270   - .line_checkbox_list>.btn.destroy.active{
271   - background: #ff5c5c;
272   - color: #fff;
273   - }
274   -
275   - .line_checkbox_list>.btn.destroy.active>input{
276   - background-color: #ff5c5c !important;
277   - border-color: #ff5c5c !important;
278   - }
279   -
280   - #role_authorize_wrap .ztree *{
281   - font-size: 14px;
282   - }
283   - #role_authorize_wrap .ztree li{
284   - line-height: 21px;
285   - }
286   - .loading{
287   - height: 100%;
288   - text-align: center;
289   - }
290   - .loading .uk-spinner{
291   - margin-top: 200px;
292   - }
293   - .loading circle{
294   - stroke: red;
295   - }
296   -
297   - #select_line_modal .uk-checkbox:checked {
298   - background-color: #1e87f0;
299   - }
300   - </style>
301   -</head>
302   -
303   -<body>
304   -<div class="loading">
305   - <div uk-spinner></div>
306   -</div>
307   -<div class="ct_page" style="display: none;">
308   - <h2 class="uk-heading-line uk-heading-bullet"><span>用户授权管理</span></h2>
309   - <div class="ct_cont uk-grid-small uk-child-width-expand" uk-grid>
310   - <div class="role_list uk-width-1-4 ">
311   - <div class="uk-card uk-card-default">
312   - <form>
313   - <div class="uk-margin">
314   - <div class="uk-inline" >
315   - <!--<span class="uk-form-icon uk-form-icon-flip" uk-icon="icon: search"></span>-->
316   - <!--<input class="uk-input role_search_input" type="text" placeholder="搜索角色">-->
317   - </div>
318   - </div>
319   - </form>
320   -
321   - <div class="ct-card-body" >
322   - <ul class="uk-list uk-list-large uk-list-divider role-list">
323   - </ul>
324   - </div>
325   - </div>
326   - </div>
327   - <div class="user_list uk-width-1-5 ">
328   - <div class="uk-card uk-card-default">
329   - <form>
330   - <div class="uk-margin">
331   - <div class="uk-inline" >
332   - <!--<span class="uk-form-icon uk-form-icon-flip" uk-icon="icon: search"></span>-->
333   - <!--<input class="uk-input user_search_input" type="text" placeholder="搜索用户">-->
334   - </div>
335   - </div>
336   - </form>
337   -
338   - <div class="ct-card-body">
339   - <ul class="uk-list uk-list-large user-list">
340   - </ul>
341   - </div>
342   - </div>
343   - </div>
344   - <div class="auth_cont ">
345   - <div class="uk-card uk-card-default authorize_right_cont">
346   -
347   - </div>
348   - </div>
349   - </div>
350   -</div>
351   -
352   -<script id="authorize-role-list-temp" type="text/html">
353   - {{each list as r i}}
354   - <li data-id="{{r.id}}" data-name="{{r.roleName}}" data-code="{{r.codeUp}}">{{r.roleName}}
355   - <span class="role-code">{{r.codeName}}</span>
356   - <div class="ct_li_desc">{{r.createDateStr}}</div>
357   - <span class="uk-badge">{{r.count}}</span>
358   - </li>
359   - {{/each}}
360   -</script>
361   -<script id="authorize-user-list-temp" type="text/html">
362   - {{each list as u i}}
363   - <li class="uk-animation-fade uk-animation-fast" data-name="{{u.name}}" data-code="{{u.userNameUp}}" data-id="{{u.id}}">{{u.name}}<span class="role-code">{{u.userName}}</span></li>
364   - {{/each}}
365   -</script>
366   -<script src="/metronic_v4.5.4/plugins/jquery.min.js"></script>
367   -<script src="/assets/js/common.js"></script>
368   -<script src="/assets/plugins/uk3.0/uikit.min.js"></script>
369   -<script src="/assets/plugins/uk3.0/uikit-icons.min.js"></script>
370   -<script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js" ></script>
371   -<!-- EventProxy -->
372   -<script src="/assets/js/eventproxy.js"></script>
373   -<!-- art-template 模版引擎 -->
374   -<script src="/assets/plugins/template.js"></script>
375   -<script src="/real_control_v2/assets/plugins/moment/moment.min.js"></script>
376   -<script src="/assets/plugins/ztree_v3/js/jquery.ztree.core.min.js"></script>
377   -<script src="/assets/plugins/ztree_v3/js/jquery.ztree.excheck.min.js"></script>
378   -<script>
379   - var storage = window.localStorage;
380   -
381   - if (typeof String.prototype.startsWith != 'function') {
382   - String.prototype.startsWith = function (prefix){
383   - return this.slice(0, prefix.length) === prefix;
384   - };
385   - }
386   - var roles,users,role_users,modules,companyData,lineArray;
387   -
388   - var ep = EventProxy.create('query_roles', 'query_users', 'query_modules', 'query_company', 'query_line', function (rs, us, ms, cs, lines) {
389   - roles = rs;
390   - users = us;
391   - modules = ms;
392   - companyData = cs;
393   - lineArray=lines;
394   - role_users = {};
395   - debugger
396   - for(var i=0,r;r=roles[i++];){
397   - r.count=0;
398   - role_users[r.id]=[];
399   - r.createDateStr=moment(r.createDate).format('YYYY-MM-DD HH:ss');
400   - r.codeUp=r.codeName.toUpperCase();
401   - for(var j=0,u;u=users[j++];){
402   - if(u.roles.indexOf(r.id)!=-1){
403   - r.count++;
404   - role_users[r.id].push(u);
405   - }
406   - }
407   - }
408   - //渲染角色list
409   - render_role_list(roles);
410   - //渲染用户list
411   - render_user_list(users);
412   -
413   - $('.loading').remove();
414   - $('.ct_page').show();
415   - });
416   -
417   - //角色点击
418   - $('ul.role-list').on('click', 'li', roleClickHanlder);
419   - //用户点击
420   - $('ul.user-list').on('click', 'li', userClickHanlder);
421   -
422   -
423   - function roleClickHanlder() {
424   - if($(this).hasClass('active') && $('ul.user-list>li.active').length==0)
425   - return;
426   -
427   - reset_dom();
428   - $('ul.role-list>li.active').removeClass('active');
429   - $(this).addClass('active');
430   - //重新渲染用户list
431   - var id = $(this).data('id');
432   - render_user_list(role_users[id]);
433   - //加载角色授权页面
434   - $('.authorize_right_cont').load('/pages/permission/authorize_all/role_auth.html', function () {
435   - $('#role_authorize_wrap', this).trigger('init', {role: get_role(id), modules: modules, companyData: companyData});
436   - });
437   - }
438   -
439   - function userClickHanlder() {
440   - if($(this).hasClass('active'))
441   - return;
442   -
443   - reset_dom();
444   - $('ul.user-list>li.active').removeClass('active');
445   - $(this).addClass('active');
446   -
447   - //加载用户授权页面
448   - var id = $(this).data('id');
449   - $('.authorize_right_cont').load('/pages/permission/authorize_all/user_auth.html', function () {
450   - $('#user_authorize_wrap', this).trigger('init', {user: get_user(id),lineArray:lineArray, companyData:companyData});
451   - });
452   - }
453   -
454   - //refresh-user
455   - $('.authorize_right_cont').on('refresh-user', function () {
456   - $('ul.user-list>li.active').removeClass('active').trigger('click');
457   - });
458   -
459   - function reset_dom() {
460   - $('#select_line_modal').remove();
461   - }
462   -
463   - //滚动条
464   - $('.ct_page .uk-card .ct-card-body').perfectScrollbar({suppressScrollX: true});
465   -
466   - //query all role
467   - var paramsRole = {};
468   - paramsRole['codeName'] = 'ROLE_ADMIN';
469   - var userId=storage.getItem("editUser");
470   - $get('/user',{id_eq:userId}, function (rs) {
471   - debugger
472   - //if (rs)
473   - ep.emit('query_roles', rs.content[0].roles);
474   - });
475   -
476   -
477   - //query all user
478   - var paramsUser = {};
479   - paramsRole['name'] = 'name';
480   - $.get('/user/all_distinct',paramsUser, function (rs) {
481   - var userA={};
482   - for(var i=0,u;u=rs[i++];){
483   - if (u.id==userId){
484   - discard_field(u);
485   - u.userNameUp=u.userName.toUpperCase();
486   - u.lastLoginDateStr=moment(u.lastLoginDate).format('YYYY-MM-DD HH:ss');
487   - userA[0]=u;
488   - }
489   - }
490   - ep.emit('query_users', userA);
491   - });
492   -
493   - //query all modules
494   - $.get('/module/all_distinct', function (rs) {
495   - ep.emit('query_modules', rs);
496   - });
497   -
498   - //query all company data
499   - $.get('/business/all', function (rs) {
500   - ep.emit('query_company', rs);
501   - });
502   -
503   - //query all line
504   - $.get('/line/all', {'remove_ne': 1}, function (rs) {
505   - ep.emit('query_line', rs);
506   - });
507   -
508   - function discard_field(u) {
509   - var array = [];
510   - $.each(u.roles, function () {
511   - array.push(this.id);
512   - });
513   - u.roles = array;
514   - }
515   -
516   - function render_role_list(list) {
517   - var htmlStr = template('authorize-role-list-temp', {list: list});
518   - $('ul.role-list').html(htmlStr);
519   - up_scroll();
520   - }
521   -
522   -
523   - function render_user_list(list) {
524   - var htmlStr = template('authorize-user-list-temp', {list: list});
525   - $('ul.user-list').html(htmlStr);
526   - up_scroll();
527   - }
528   -
529   - function reset_role_list(){
530   - var actives = $('ul.role-list>li.active');
531   - if(actives.length > 0){
532   - $('ul.role-list>li.active').removeClass('active');
533   - render_user_list(users);
534   - $('.authorize_right_cont').empty();
535   - }
536   - }
537   -
538   - function up_scroll() {
539   - $('.ct_page .uk-card .ct-card-body').perfectScrollbar('update');
540   - }
541   -
542   -
543   -
544   - function get_role(id) {
545   - for(var i=0,r;r=roles[i++];){
546   - if(r.id==id)
547   - return r;
548   - }
549   - return null;
550   - }
551   -
552   - function get_user(id) {
553   - for(var i=0,u;u=users[i++];){
554   - if(u.id==id)
555   - return u;
556   - }
557   - return null;
558   - }
559   -
560   - $(document).on('submit', 'form', function () {
561   - return false;
562   - });
563   -
564   - function convert_buss_data(rs) {
565   - var baseCode;
566   - //找到跟节点
567   - $.each(rs, function () {
568   - if(this.upCode == 0){
569   - baseCode=this.businessCode;
570   - return false;
571   - }
572   - });
573   - if(!baseCode){
574   - alert('大爷找不到根节点,数据有问题吧!!!');
575   - return;
576   - }
577   - //提取二级节点
578   - var secondMap={};
579   - $.each(rs, function () {
580   - if(this.upCode==baseCode){
581   - secondMap[this.businessCode] = {
582   - name: this.businessName,
583   - childs: []
584   - };
585   - }
586   - });
587   - //分公司节点
588   - $.each(rs, function () {
589   - if(secondMap[this.upCode])
590   - secondMap[this.upCode].childs.push(this);
591   - });
592   -
593   - //排序
594   - for(var sid in secondMap){
595   - secondMap[sid].childs.sort(naturalSort);
596   - }
597   -
598   - return secondMap;
599   - }
600   -
601   - var naturalSort=function (a, b) {
602   - return a.businessName.localeCompare(b.businessName);
603   - };
604   -
605   - var groupBy = function (list, field) {
606   - var rs = {},
607   - key;
608   - $.each(list, function () {
609   - key = this[field];
610   - if (!rs[key])
611   - rs[key] = [];
612   -
613   - rs[key].push(this);
614   - });
615   -
616   - return rs;
617   - };
618   -</script>
619   -</body>
  1 +<!--<!DOCTYPE html>-->
  2 +<html lang="zh-cn">
  3 +
  4 +<head>
  5 + <meta charset="UTF-8">
  6 + <script src="/metronic_v4.5.4/plugins/jquery.min.js"></script>
  7 + <script src="/assets/js/common.js"></script>
  8 + <script src="/assets/plugins/uk3.0/uikit.min.js"></script>
  9 + <script src="/assets/plugins/uk3.0/uikit-icons.min.js"></script>
  10 + <script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js"></script>
  11 + <!-- EventProxy -->
  12 + <script src="/assets/js/eventproxy.js"></script>
  13 + <!-- art-template 模版引擎 -->
  14 + <script src="/assets/plugins/template.js"></script>
  15 + <script src="/real_control_v2/assets/plugins/moment/moment.min.js"></script>
  16 + <script src="/assets/plugins/ztree_v3/js/jquery.ztree.core.min.js"></script>
  17 + <script src="/assets/plugins/ztree_v3/js/jquery.ztree.excheck.min.js"></script>
  18 + <link rel="stylesheet" href="/assets/plugins/uk3.0/uikit.min.css"/>
  19 + <link rel="stylesheet" href="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.css" />
  20 + <link rel="stylesheet" href="/assets/plugins/ztree_v3/css/zTreeStyle/zTreeStyle.css" />
  21 + <style>
  22 + html,body{
  23 + height: 100%;
  24 + }
  25 + .ct_page{
  26 + padding: 25px 15px;
  27 + height: 100%;
  28 + height: calc(100% - 50px);
  29 + }
  30 +
  31 + .ct_cont{
  32 + height: calc(100% - 41px);
  33 + }
  34 +
  35 + .ct_cont>div>div.uk-card{
  36 + height: 99%;
  37 + }
  38 +
  39 + form .uk-inline{
  40 + width: calc(100% - 4px);
  41 + margin-left: 2px;
  42 + }
  43 +
  44 + .ct-card-body{
  45 + overflow: auto;
  46 + padding: 1px 1px 0 2px;
  47 + height: calc(100% - 54px);
  48 + position: relative;
  49 + margin-top: -12px;
  50 + }
  51 +
  52 + .ct_li_desc{
  53 + color: #a8a8a8;
  54 + font-size: 13px;
  55 + }
  56 +
  57 + .ct-card-body .uk-list-large{
  58 + font-size: 14px;
  59 + }
  60 +
  61 + .ct-card-body .uk-list-large>li{
  62 + cursor: default;
  63 + padding-left: 20px;
  64 + margin-top: 2px !important;
  65 + padding-top: 17px !important;
  66 + position: relative;
  67 + }
  68 +
  69 + .ct-card-body .uk-list-large>li:hover{
  70 + background: #edecec;
  71 + }
  72 +
  73 + .ct-card-body .uk-list-large>li.active{
  74 + background: #1e87f0 !important;
  75 + color: white;
  76 + }
  77 +
  78 + .ct-card-body .uk-list-large>li.active>span.role-code{
  79 + color: #ffffff;
  80 + }
  81 +
  82 + .ct-card-body .uk-list-large.role-list>li:hover{
  83 + background: #fff494;
  84 + }
  85 +
  86 + .ct-card-body .uk-list-large>li.active .ct_li_desc{
  87 + color: #e6e6e6;
  88 + }
  89 +
  90 + .ct-card-body .uk-list-large>li>span.uk-badge{
  91 + position: absolute;
  92 + top: 17px;
  93 + right: 25px;
  94 + }
  95 +
  96 + .ct-card-body .uk-list-large>li>span.role-code{
  97 + padding: 4px 6px;
  98 + color: #a8a8a8;
  99 + margin-left: 5px;
  100 + }
  101 +
  102 + .top_title{
  103 + padding: 9px 0 5px 15px;
  104 + border-bottom: 1px solid #ededed;
  105 + border-left: 5px solid #FFC107;
  106 + }
  107 +
  108 + .top_title>.desc{
  109 + font-size: 13px;
  110 + color: grey;
  111 + margin-top: 3px;
  112 + }
  113 +
  114 + .left_menu_list{
  115 + overflow: auto;
  116 + position: relative;
  117 + }
  118 +
  119 + .left_menu_list .ps-container > .ps-scrollbar-x-rail, .ps-container > .ps-scrollbar-y-rail{
  120 + opacity: 0.6 !important;
  121 + padding: 0 !important;
  122 + }
  123 +
  124 + ._company{
  125 + margin: 15px 0px;
  126 + }
  127 + ._company>h5{
  128 + margin-bottom: 10px;
  129 + font-size: 15px;
  130 + color: #6b6b6b;
  131 + text-indent: 12px;
  132 + }
  133 + ._company>._fgs>label{
  134 + padding: 3px 12px 3px 10px;
  135 + display: inline-block;
  136 + border: 1px solid gainsboro;
  137 + border-radius: 2px;
  138 + margin: 5px;
  139 + font-size: 14px;
  140 + }
  141 + ._company>._fgs>label.active{
  142 + background: #1e87f0;
  143 + color: #fff;
  144 + }
  145 + ._company .uk-checkbox:checked:focus,
  146 + .line_checkbox_list .uk-checkbox:checked:focus{
  147 + background-color: #1e87f0 !important;
  148 + }
  149 + .save_icon{
  150 + position: absolute;
  151 + right: 2px;
  152 + background: #bec4c9;
  153 + font-size: 12px;
  154 + padding: 2px 15px;
  155 + color: #fff;
  156 + box-shadow: 0 5px 15px rgba(0,0,0,0.08);
  157 + cursor: pointer;
  158 + }
  159 + .save_icon:hover{
  160 + background: #FFC107;
  161 + }
  162 + .data_auth_list{
  163 + position: relative;
  164 + }
  165 + #user_authorize_wrap .top_title{
  166 + border-left: 5px solid #cacac8;
  167 + }
  168 + .xd_line_list{
  169 + height: 37%;
  170 + padding: 7px;
  171 + border-bottom: 1px solid #f2f2f2;
  172 + overflow: auto;
  173 + position: relative;
  174 + }
  175 + .xd_line_list>h5{
  176 + color: #858585;
  177 + margin: 5px 5px 5px 0;
  178 + font-size: 14px;
  179 + }
  180 + .sub_lines{
  181 + padding-left: 15px;
  182 + }
  183 + .sub_lines>span.line_btn {
  184 + background: #00BCD4;
  185 + color: #fff;
  186 + padding: 4px 9px;
  187 + display: inline-block;
  188 + min-width: 68px;
  189 + text-align: center;
  190 + margin: 5px 2px;
  191 + box-shadow: 0 5px 9px rgba(0,0,0,0.08);
  192 + cursor: pointer;
  193 + font-size: 14px;
  194 + font-family: 微软雅黑;
  195 + }
  196 +
  197 + .sub_lines>span.line_btn.destroy{
  198 + background: #ff5c5c;
  199 + }
  200 +
  201 + .sub_lines>span.line_btn.destroy:hover{
  202 + background: #ff7373;
  203 + }
  204 +
  205 + .sub_lines>span.line_btn:hover{
  206 + background: #2dd7ed;
  207 + }
  208 + .add_line_icon{
  209 + cursor: pointer;
  210 + padding: 2px 5px;
  211 + border-radius: 5px;
  212 + display: inline-block;
  213 + }
  214 + .add_line_icon>i{
  215 + vertical-align: top;
  216 + margin-top: 3px;
  217 + }
  218 + .add_line_icon:hover{
  219 + background: #ededed;
  220 + }
  221 + .ct_pattern_form{
  222 + display: inline-block;
  223 + }
  224 + .xd_menu_grid{
  225 + padding: 25px 25px 0 25px;
  226 + height: calc(63% - 91px);
  227 + }
  228 + .xd_menu_grid .uk-list{
  229 + border: 1px solid #ededed;
  230 + height: calc(100% - 70px);
  231 + overflow: auto;
  232 + position: relative;
  233 + }
  234 +
  235 + .xd_menu_grid .uk-list>li{
  236 + margin: 5px 0 !important;
  237 + padding: 10px 0 0 10px !important;
  238 + font-size: 14px;
  239 + }
  240 + .top_tools{
  241 + position: absolute;
  242 + top: 15px;
  243 + right: 25px;
  244 + }
  245 + .ct_field {
  246 + display: inline-block;
  247 + width: 240px;
  248 + }
  249 + .ct_field>select,.ct_field>input{
  250 + width: calc(100% - 60px);
  251 + }
  252 + .line_checkbox_list{
  253 + margin-top: 15px;
  254 + }
  255 + .line_checkbox_list>.btn{
  256 + padding: 5px 7px;
  257 + border-radius: 2px;
  258 + display: inline-block;
  259 + margin: 4px 9px;
  260 + font-size: 14px;
  261 + font-family: 微软雅黑;
  262 + border: 1px solid #d9d9d9;
  263 + width: 100px;
  264 + overflow: hidden;
  265 + text-overflow: ellipsis;
  266 + white-space: nowrap;
  267 + }
  268 + .line_checkbox_list>.btn>input{
  269 + margin-right: 5px;
  270 + }
  271 + .line_checkbox_list>.btn.active{
  272 + background: #1e87f0;
  273 + color: #fff;
  274 + }
  275 +
  276 + .line_checkbox_list>.btn.destroy,
  277 + .line_checkbox_list>.btn.destroy>input{
  278 + border-color: #ff9595;
  279 + color: #ff5c5c;
  280 + }
  281 +
  282 + .line_checkbox_list>.btn.destroy.active{
  283 + background: #ff5c5c;
  284 + color: #fff;
  285 + }
  286 +
  287 + .line_checkbox_list>.btn.destroy.active>input{
  288 + background-color: #ff5c5c !important;
  289 + border-color: #ff5c5c !important;
  290 + }
  291 +
  292 + #role_authorize_wrap .ztree *{
  293 + font-size: 14px;
  294 + }
  295 + #role_authorize_wrap .ztree li{
  296 + line-height: 21px;
  297 + }
  298 + .loading{
  299 + height: 100%;
  300 + text-align: center;
  301 + }
  302 + .loading .uk-spinner{
  303 + margin-top: 200px;
  304 + }
  305 + .loading circle{
  306 + stroke: red;
  307 + }
  308 +
  309 + #select_line_modal .uk-checkbox:checked {
  310 + background-color: #1e87f0;
  311 + }
  312 + </style>
  313 +
  314 +</head>
  315 +
  316 +<body>
  317 +<div class="loading">
  318 + <div uk-spinner></div>
  319 +</div>
  320 +<div class="ct_page" style="display: none;">
  321 + <h2 class="uk-heading-line uk-heading-bullet"><span>用户授权管理</span></h2>
  322 + <div class="ct_cont uk-grid-small uk-child-width-expand" uk-grid>
  323 + <div class="role_list uk-width-1-4 ">
  324 + <div class="uk-card uk-card-default">
  325 + <form>
  326 + <div class="uk-margin">
  327 + <div class="uk-inline" >
  328 + </div>
  329 + </div>
  330 + </form>
  331 +
  332 + <div class="ct-card-body" >
  333 + <ul class="uk-list uk-list-large uk-list-divider role-list">
  334 + </ul>
  335 + </div>
  336 + </div>
  337 + </div>
  338 + <div class="user_list uk-width-1-5 ">
  339 + <div class="uk-card uk-card-default">
  340 + <form>
  341 + <div class="uk-margin">
  342 + <div class="uk-inline" >
  343 + </div>
  344 + </div>
  345 + </form>
  346 +
  347 + <div class="ct-card-body">
  348 + <ul class="uk-list uk-list-large user-list">
  349 + </ul>
  350 + </div>
  351 + </div>
  352 + </div>
  353 + <div class="auth_cont ">
  354 + <div class="uk-card uk-card-default authorize_right_cont">
  355 +
  356 + </div>
  357 + </div>
  358 +
  359 + </div>
  360 +</div>
  361 +
  362 +<script id="authorize-role-list-temp1" type="text/html">
  363 + {{each list as r i}}
  364 + <li data-id="{{r.id}}" data-name="{{r.roleName}}" data-code="{{r.codeUp}}">{{r.roleName}}
  365 + <span class="role-code">{{r.codeName}}</span>
  366 + <div class="ct_li_desc">{{r.createDateStr}}</div>
  367 + <span class="uk-badge">{{r.count}}</span>
  368 + </li>
  369 + {{/each}}
  370 +</script>
  371 +<script id="authorize-user-list-temp1" type="text/html">
  372 + {{each list as u i}}
  373 + <li class="uk-animation-fade uk-animation-fast" data-name="{{u.name}}" data-code="{{u.userNameUp}}" data-id="{{u.id}}">{{u.name}}<span class="role-code">{{u.userName}}</span></li>
  374 + {{/each}}
  375 +</script>
  376 +<script>
  377 + var storage = window.localStorage;
  378 +
  379 + if (typeof String.prototype.startsWith != 'function') {
  380 + String.prototype.startsWith = function (prefix){
  381 + return this.slice(0, prefix.length) === prefix;
  382 + };
  383 + }
  384 + var roles,users,role_users,modules,companyData,lineArray;
  385 +
  386 + var ep = EventProxy.create('query_roles', 'query_users', 'query_modules', 'query_company', 'query_line', function (rs, us, ms, cs, lines) {
  387 + roles = rs;
  388 + users = us;
  389 + modules = ms;
  390 + companyData = cs;
  391 + lineArray=lines;
  392 + role_users = {};
  393 + debugger
  394 + for(var i=0,r;r=roles[i++];){
  395 + r.count=0;
  396 + role_users[r.id]=[];
  397 + r.createDateStr=moment(r.createDate).format('YYYY-MM-DD HH:ss');
  398 + r.codeUp=r.codeName.toUpperCase();
  399 + for(var j=0,u;u=users[j++];){
  400 + if(u.roles.indexOf(r.id)!=-1){
  401 + r.count++;
  402 + role_users[r.id].push(u);
  403 + }
  404 + }
  405 + }
  406 + //渲染角色list
  407 + render_role_list(roles);
  408 + //渲染用户list
  409 + render_user_list(users);
  410 +
  411 + $('.loading').remove();
  412 + $('.ct_page').show();
  413 + });
  414 +
  415 + //角色点击
  416 + $('ul.role-list').on('click', 'li', roleClickHanlder);
  417 + //用户点击
  418 + $('ul.user-list').on('click', 'li', userClickHanlder);
  419 +
  420 +
  421 + function roleClickHanlder() {
  422 + if($(this).hasClass('active') && $('ul.user-list>li.active').length==0)
  423 + return;
  424 +
  425 + reset_dom();
  426 + $('ul.role-list>li.active').removeClass('active');
  427 + $(this).addClass('active');
  428 + //重新渲染用户list
  429 + var id = $(this).data('id');
  430 + render_user_list(role_users[id]);
  431 + //加载角色授权页面
  432 + $('.authorize_right_cont').load('/pages/permission/authorize_all/role_auth.html', function () {
  433 + $('#role_authorize_wrap', this).trigger('init', {role: get_role(id), modules: modules, companyData: companyData});
  434 + });
  435 + }
  436 +
  437 + function userClickHanlder() {
  438 + if($(this).hasClass('active'))
  439 + return;
  440 +
  441 + reset_dom();
  442 + $('ul.user-list>li.active').removeClass('active');
  443 + $(this).addClass('active');
  444 +
  445 + //加载用户授权页面
  446 + var id = $(this).data('id');
  447 + $('.authorize_right_cont').load('/pages/permission/authorize_all/user_auth.html', function () {
  448 + $('#user_authorize_wrap', this).trigger('init', {user: get_user(id),lineArray:lineArray, companyData:companyData});
  449 + });
  450 + }
  451 +
  452 + //refresh-user
  453 + $('.authorize_right_cont').on('refresh-user', function () {
  454 + $('ul.user-list>li.active').removeClass('active').trigger('click');
  455 + });
  456 +
  457 + function reset_dom() {
  458 + $('#select_line_modal').remove();
  459 + }
  460 +
  461 + //滚动条
  462 + $('.ct_page .uk-card .ct-card-body').perfectScrollbar({suppressScrollX: true});
  463 +
  464 + //query all role
  465 + var paramsRole = {};
  466 + paramsRole['codeName'] = 'ROLE_ADMIN';
  467 + var userId=storage.getItem("editUser");
  468 + $get('/user',{id_eq:userId}, function (rs) {
  469 + ep.emit('query_roles', rs.content[0].roles);
  470 + });
  471 +
  472 +
  473 + //query all user
  474 + var paramsUser = {};
  475 + paramsRole['name'] = 'name';
  476 + $.get('/user/all_distinct',paramsUser, function (rs) {
  477 + var userA={};
  478 + for(var i=0,u;u=rs[i++];){
  479 + if (u.id==userId){
  480 + discard_field(u);
  481 + u.userNameUp=u.userName.toUpperCase();
  482 + u.lastLoginDateStr=moment(u.lastLoginDate).format('YYYY-MM-DD HH:ss');
  483 + userA[0]=u;
  484 + }
  485 + }
  486 + ep.emit('query_users', userA);
  487 + });
  488 +
  489 + //query all modules
  490 + $.get('/module/all_distinct', function (rs) {
  491 + ep.emit('query_modules', rs);
  492 + });
  493 +
  494 + //query all company data
  495 + $.get('/business/all', function (rs) {
  496 + ep.emit('query_company', rs);
  497 + });
  498 +
  499 + //query all line
  500 + $.get('/line/all', {'remove_ne': 1}, function (rs) {
  501 + ep.emit('query_line', rs);
  502 + });
  503 +
  504 + function discard_field(u) {
  505 + var array = [];
  506 + $.each(u.roles, function () {
  507 + array.push(this.id);
  508 + });
  509 + u.roles = array;
  510 + }
  511 +
  512 + function render_role_list(list) {
  513 + var htmlStr = template('authorize-role-list-temp1', {list: list});
  514 + $('ul.role-list').html(htmlStr);
  515 + up_scroll();
  516 + }
  517 +
  518 +
  519 + function render_user_list(list) {
  520 + var htmlStr = template('authorize-user-list-temp1', {list: list});
  521 + $('ul.user-list').html(htmlStr);
  522 + up_scroll();
  523 + }
  524 +
  525 + function reset_role_list(){
  526 + var actives = $('ul.role-list>li.active');
  527 + if(actives.length > 0){
  528 + $('ul.role-list>li.active').removeClass('active');
  529 + render_user_list(users);
  530 + $('.authorize_right_cont').empty();
  531 + }
  532 + }
  533 +
  534 + function up_scroll() {
  535 + $('.ct_page .uk-card .ct-card-body').perfectScrollbar('update');
  536 + }
  537 +
  538 +
  539 +
  540 + function get_role(id) {
  541 + for(var i=0,r;r=roles[i++];){
  542 + if(r.id==id)
  543 + return r;
  544 + }
  545 + return null;
  546 + }
  547 +
  548 + function get_user(id) {
  549 + for(var i=0,u;u=users[i++];){
  550 + if(u.id==id)
  551 + return u;
  552 + }
  553 + return null;
  554 + }
  555 +
  556 + $(document).on('submit', 'form', function () {
  557 + return false;
  558 + });
  559 +
  560 + function convert_buss_data(rs) {
  561 + var baseCode;
  562 + //找到跟节点
  563 + $.each(rs, function () {
  564 + if(this.upCode == 0){
  565 + baseCode=this.businessCode;
  566 + return false;
  567 + }
  568 + });
  569 + if(!baseCode){
  570 + alert('大爷找不到根节点,数据有问题吧!!!');
  571 + return;
  572 + }
  573 + //提取二级节点
  574 + var secondMap={};
  575 + $.each(rs, function () {
  576 + if(this.upCode==baseCode){
  577 + secondMap[this.businessCode] = {
  578 + name: this.businessName,
  579 + childs: []
  580 + };
  581 + }
  582 + });
  583 + //分公司节点
  584 + $.each(rs, function () {
  585 + if(secondMap[this.upCode])
  586 + secondMap[this.upCode].childs.push(this);
  587 + });
  588 +
  589 + //排序
  590 + for(var sid in secondMap){
  591 + secondMap[sid].childs.sort(naturalSort);
  592 + }
  593 +
  594 + return secondMap;
  595 + }
  596 +
  597 + var naturalSort=function (a, b) {
  598 + return a.businessName.localeCompare(b.businessName);
  599 + };
  600 +
  601 + var groupBy = function (list, field) {
  602 + var rs = {},
  603 + key;
  604 + $.each(list, function () {
  605 + key = this[field];
  606 + if (!rs[key])
  607 + rs[key] = [];
  608 +
  609 + rs[key].push(this);
  610 + });
  611 +
  612 + return rs;
  613 + };
  614 +</script>
  615 +</body>
620 616 </html>
621 617 \ No newline at end of file
... ...
src/main/resources/static/pages/permission/user/main.html
1   -<iframe src="authorize.html?origin=real_control_iframe" frameborder="0" style="height: 90%;width: 100%;"></iframe>
  1 +<iframe src="/pages/permission/user/authorize.html?origin=real_control_iframe" frameborder="0" style="height: 90%;width: 100%;"></iframe>
2 2 <div class="form-actions">
3 3 <div class="row">
4 4 <div class="col-md-offset-3 col-md-4">
5   - <!--<a href="main.html" class="btn green" ><i class="fa fa-check"></i> 上一步</a>-->
6   - <!--<button type="submit" class="btn green" ><i class="fa fa-check"></i> 提交</button>-->
7   - <!--<a type="button" class="btn default" href="list.html" data-pjax><i class="fa fa-times"></i> 取消</a>-->
8 5 </div>
9 6 </div>
10 7 </div>
11 8 \ No newline at end of file
... ...
src/main/resources/static/pages/report/inoutstation/js/Blob.js
1   -/* Blob.js
2   - * A Blob implementation.
3   - * 2014-07-24
4   - *
5   - * By Eli Grey, http://eligrey.com
6   - * By Devin Samarin, https://github.com/dsamarin
7   - * License: X11/MIT
8   - * See https://github.com/eligrey/Blob.js/blob/master/LICENSE.md
9   - */
10   -
11   -/*global self, unescape */
12   -/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,
13   - plusplus: true */
14   -
15   -/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */
16   -
17   -(function (view) {
18   - "use strict";
19   -
20   - view.URL = view.URL || view.webkitURL;
21   -
22   - if (view.Blob && view.URL) {
23   - try {
24   - new Blob;
25   - return;
26   - } catch (e) {}
27   - }
28   -
29   - // Internally we use a BlobBuilder implementation to base Blob off of
30   - // in order to support older browsers that only have BlobBuilder
31   - var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) {
32   - var
33   - get_class = function(object) {
34   - return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
35   - }
36   - , FakeBlobBuilder = function BlobBuilder() {
37   - this.data = [];
38   - }
39   - , FakeBlob = function Blob(data, type, encoding) {
40   - this.data = data;
41   - this.size = data.length;
42   - this.type = type;
43   - this.encoding = encoding;
44   - }
45   - , FBB_proto = FakeBlobBuilder.prototype
46   - , FB_proto = FakeBlob.prototype
47   - , FileReaderSync = view.FileReaderSync
48   - , FileException = function(type) {
49   - this.code = this[this.name = type];
50   - }
51   - , file_ex_codes = (
52   - "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR "
53   - + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR"
54   - ).split(" ")
55   - , file_ex_code = file_ex_codes.length
56   - , real_URL = view.URL || view.webkitURL || view
57   - , real_create_object_URL = real_URL.createObjectURL
58   - , real_revoke_object_URL = real_URL.revokeObjectURL
59   - , URL = real_URL
60   - , btoa = view.btoa
61   - , atob = view.atob
62   -
63   - , ArrayBuffer = view.ArrayBuffer
64   - , Uint8Array = view.Uint8Array
65   -
66   - , origin = /^[\w-]+:\/*\[?[\w\.:-]+\]?(?::[0-9]+)?/
67   - ;
68   - FakeBlob.fake = FB_proto.fake = true;
69   - while (file_ex_code--) {
70   - FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;
71   - }
72   - // Polyfill URL
73   - if (!real_URL.createObjectURL) {
74   - URL = view.URL = function(uri) {
75   - var
76   - uri_info = document.createElementNS("http://www.w3.org/1999/xhtml", "a")
77   - , uri_origin
78   - ;
79   - uri_info.href = uri;
80   - if (!("origin" in uri_info)) {
81   - if (uri_info.protocol.toLowerCase() === "data:") {
82   - uri_info.origin = null;
83   - } else {
84   - uri_origin = uri.match(origin);
85   - uri_info.origin = uri_origin && uri_origin[1];
86   - }
87   - }
88   - return uri_info;
89   - };
90   - }
91   - URL.createObjectURL = function(blob) {
92   - var
93   - type = blob.type
94   - , data_URI_header
95   - ;
96   - if (type === null) {
97   - type = "application/octet-stream";
98   - }
99   - if (blob instanceof FakeBlob) {
100   - data_URI_header = "data:" + type;
101   - if (blob.encoding === "base64") {
102   - return data_URI_header + ";base64," + blob.data;
103   - } else if (blob.encoding === "URI") {
104   - return data_URI_header + "," + decodeURIComponent(blob.data);
105   - } if (btoa) {
106   - return data_URI_header + ";base64," + btoa(blob.data);
107   - } else {
108   - return data_URI_header + "," + encodeURIComponent(blob.data);
109   - }
110   - } else if (real_create_object_URL) {
111   - return real_create_object_URL.call(real_URL, blob);
112   - }
113   - };
114   - URL.revokeObjectURL = function(object_URL) {
115   - if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) {
116   - real_revoke_object_URL.call(real_URL, object_URL);
117   - }
118   - };
119   - FBB_proto.append = function(data/*, endings*/) {
120   - var bb = this.data;
121   - // decode data to a binary string
122   - if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {
123   - var
124   - str = ""
125   - , buf = new Uint8Array(data)
126   - , i = 0
127   - , buf_len = buf.length
128   - ;
129   - for (; i < buf_len; i++) {
130   - str += String.fromCharCode(buf[i]);
131   - }
132   - bb.push(str);
133   - } else if (get_class(data) === "Blob" || get_class(data) === "File") {
134   - if (FileReaderSync) {
135   - var fr = new FileReaderSync;
136   - bb.push(fr.readAsBinaryString(data));
137   - } else {
138   - // async FileReader won't work as BlobBuilder is sync
139   - throw new FileException("NOT_READABLE_ERR");
140   - }
141   - } else if (data instanceof FakeBlob) {
142   - if (data.encoding === "base64" && atob) {
143   - bb.push(atob(data.data));
144   - } else if (data.encoding === "URI") {
145   - bb.push(decodeURIComponent(data.data));
146   - } else if (data.encoding === "raw") {
147   - bb.push(data.data);
148   - }
149   - } else {
150   - if (typeof data !== "string") {
151   - data += ""; // convert unsupported types to strings
152   - }
153   - // decode UTF-16 to binary string
154   - bb.push(unescape(encodeURIComponent(data)));
155   - }
156   - };
157   - FBB_proto.getBlob = function(type) {
158   - if (!arguments.length) {
159   - type = null;
160   - }
161   - return new FakeBlob(this.data.join(""), type, "raw");
162   - };
163   - FBB_proto.toString = function() {
164   - return "[object BlobBuilder]";
165   - };
166   - FB_proto.slice = function(start, end, type) {
167   - var args = arguments.length;
168   - if (args < 3) {
169   - type = null;
170   - }
171   - return new FakeBlob(
172   - this.data.slice(start, args > 1 ? end : this.data.length)
173   - , type
174   - , this.encoding
175   - );
176   - };
177   - FB_proto.toString = function() {
178   - return "[object Blob]";
179   - };
180   - FB_proto.close = function() {
181   - this.size = 0;
182   - delete this.data;
183   - };
184   - return FakeBlobBuilder;
185   - }(view));
186   -
187   - view.Blob = function(blobParts, options) {
188   - var type = options ? (options.type || "") : "";
189   - var builder = new BlobBuilder();
190   - if (blobParts) {
191   - for (var i = 0, len = blobParts.length; i < len; i++) {
192   - builder.append(blobParts[i]);
193   - }
194   - }
195   - return builder.getBlob(type);
196   - };
197   -}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this));
  1 +/* Blob.js
  2 + * A Blob implementation.
  3 + * 2014-07-24
  4 + *
  5 + * By Eli Grey, http://eligrey.com
  6 + * By Devin Samarin, https://github.com/dsamarin
  7 + * License: X11/MIT
  8 + * See https://github.com/eligrey/Blob.js/blob/master/LICENSE.md
  9 + */
  10 +
  11 +/*global self, unescape */
  12 +/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,
  13 + plusplus: true */
  14 +
  15 +/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */
  16 +
  17 +(function (view) {
  18 + "use strict";
  19 +
  20 + view.URL = view.URL || view.webkitURL;
  21 +
  22 + if (view.Blob && view.URL) {
  23 + try {
  24 + new Blob;
  25 + return;
  26 + } catch (e) {}
  27 + }
  28 +
  29 + // Internally we use a BlobBuilder implementation to base Blob off of
  30 + // in order to support older browsers that only have BlobBuilder
  31 + var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) {
  32 + var
  33 + get_class = function(object) {
  34 + return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
  35 + }
  36 + , FakeBlobBuilder = function BlobBuilder() {
  37 + this.data = [];
  38 + }
  39 + , FakeBlob = function Blob(data, type, encoding) {
  40 + this.data = data;
  41 + this.size = data.length;
  42 + this.type = type;
  43 + this.encoding = encoding;
  44 + }
  45 + , FBB_proto = FakeBlobBuilder.prototype
  46 + , FB_proto = FakeBlob.prototype
  47 + , FileReaderSync = view.FileReaderSync
  48 + , FileException = function(type) {
  49 + this.code = this[this.name = type];
  50 + }
  51 + , file_ex_codes = (
  52 + "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR "
  53 + + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR"
  54 + ).split(" ")
  55 + , file_ex_code = file_ex_codes.length
  56 + , real_URL = view.URL || view.webkitURL || view
  57 + , real_create_object_URL = real_URL.createObjectURL
  58 + , real_revoke_object_URL = real_URL.revokeObjectURL
  59 + , URL = real_URL
  60 + , btoa = view.btoa
  61 + , atob = view.atob
  62 +
  63 + , ArrayBuffer = view.ArrayBuffer
  64 + , Uint8Array = view.Uint8Array
  65 +
  66 + , origin = /^[\w-]+:\/*\[?[\w\.:-]+\]?(?::[0-9]+)?/
  67 + ;
  68 + FakeBlob.fake = FB_proto.fake = true;
  69 + while (file_ex_code--) {
  70 + FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;
  71 + }
  72 + // Polyfill URL
  73 + if (!real_URL.createObjectURL) {
  74 + URL = view.URL = function(uri) {
  75 + var
  76 + uri_info = document.createElementNS("http://www.w3.org/1999/xhtml", "a")
  77 + , uri_origin
  78 + ;
  79 + uri_info.href = uri;
  80 + if (!("origin" in uri_info)) {
  81 + if (uri_info.protocol.toLowerCase() === "data:") {
  82 + uri_info.origin = null;
  83 + } else {
  84 + uri_origin = uri.match(origin);
  85 + uri_info.origin = uri_origin && uri_origin[1];
  86 + }
  87 + }
  88 + return uri_info;
  89 + };
  90 + }
  91 + URL.createObjectURL = function(blob) {
  92 + var
  93 + type = blob.type
  94 + , data_URI_header
  95 + ;
  96 + if (type === null) {
  97 + type = "application/octet-stream";
  98 + }
  99 + if (blob instanceof FakeBlob) {
  100 + data_URI_header = "data:" + type;
  101 + if (blob.encoding === "base64") {
  102 + return data_URI_header + ";base64," + blob.data;
  103 + } else if (blob.encoding === "URI") {
  104 + return data_URI_header + "," + decodeURIComponent(blob.data);
  105 + } if (btoa) {
  106 + return data_URI_header + ";base64," + btoa(blob.data);
  107 + } else {
  108 + return data_URI_header + "," + encodeURIComponent(blob.data);
  109 + }
  110 + } else if (real_create_object_URL) {
  111 + return real_create_object_URL.call(real_URL, blob);
  112 + }
  113 + };
  114 + URL.revokeObjectURL = function(object_URL) {
  115 + if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) {
  116 + real_revoke_object_URL.call(real_URL, object_URL);
  117 + }
  118 + };
  119 + FBB_proto.append = function(data/*, endings*/) {
  120 + var bb = this.data;
  121 + // decode data to a binary string
  122 + if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {
  123 + var
  124 + str = ""
  125 + , buf = new Uint8Array(data)
  126 + , i = 0
  127 + , buf_len = buf.length
  128 + ;
  129 + for (; i < buf_len; i++) {
  130 + str += String.fromCharCode(buf[i]);
  131 + }
  132 + bb.push(str);
  133 + } else if (get_class(data) === "Blob" || get_class(data) === "File") {
  134 + if (FileReaderSync) {
  135 + var fr = new FileReaderSync;
  136 + bb.push(fr.readAsBinaryString(data));
  137 + } else {
  138 + // async FileReader won't work as BlobBuilder is sync
  139 + throw new FileException("NOT_READABLE_ERR");
  140 + }
  141 + } else if (data instanceof FakeBlob) {
  142 + if (data.encoding === "base64" && atob) {
  143 + bb.push(atob(data.data));
  144 + } else if (data.encoding === "URI") {
  145 + bb.push(decodeURIComponent(data.data));
  146 + } else if (data.encoding === "raw") {
  147 + bb.push(data.data);
  148 + }
  149 + } else {
  150 + if (typeof data !== "string") {
  151 + data += ""; // convert unsupported types to strings
  152 + }
  153 + // decode UTF-16 to binary string
  154 + bb.push(unescape(encodeURIComponent(data)));
  155 + }
  156 + };
  157 + FBB_proto.getBlob = function(type) {
  158 + if (!arguments.length) {
  159 + type = null;
  160 + }
  161 + return new FakeBlob(this.data.join(""), type, "raw");
  162 + };
  163 + FBB_proto.toString = function() {
  164 + return "[object BlobBuilder]";
  165 + };
  166 + FB_proto.slice = function(start, end, type) {
  167 + var args = arguments.length;
  168 + if (args < 3) {
  169 + type = null;
  170 + }
  171 + return new FakeBlob(
  172 + this.data.slice(start, args > 1 ? end : this.data.length)
  173 + , type
  174 + , this.encoding
  175 + );
  176 + };
  177 + FB_proto.toString = function() {
  178 + return "[object Blob]";
  179 + };
  180 + FB_proto.close = function() {
  181 + this.size = 0;
  182 + delete this.data;
  183 + };
  184 + return FakeBlobBuilder;
  185 + }(view));
  186 +
  187 + view.Blob = function(blobParts, options) {
  188 + var type = options ? (options.type || "") : "";
  189 + var builder = new BlobBuilder();
  190 + if (blobParts) {
  191 + for (var i = 0, len = blobParts.length; i < len; i++) {
  192 + builder.append(blobParts[i]);
  193 + }
  194 + }
  195 + return builder.getBlob(type);
  196 + };
  197 +}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this));
... ...
src/main/resources/static/pages/report/inoutstation/js/FileSaver.js
1   -/* FileSaver.js
2   - * A saveAs() FileSaver implementation.
3   - * 2014-08-29
4   - *
5   - * By Eli Grey, http://eligrey.com
6   - * License: X11/MIT
7   - * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
8   - */
9   -
10   -/*global self */
11   -/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
12   -
13   -/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
14   -
15   -var saveAs = saveAs
16   - // IE 10+ (native saveAs)
17   - || (typeof navigator !== "undefined" &&
18   - navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
19   - // Everyone else
20   - || (function(view) {
21   - "use strict";
22   - // IE <10 is explicitly unsupported
23   - if (typeof navigator !== "undefined" &&
24   - /MSIE [1-9]\./.test(navigator.userAgent)) {
25   - return;
26   - }
27   - var
28   - doc = view.document
29   - // only get URL when necessary in case Blob.js hasn't overridden it yet
30   - , get_URL = function() {
31   - return view.URL || view.webkitURL || view;
32   - }
33   - , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
34   - , can_use_save_link = "download" in save_link
35   - , click = function(node) {
36   - var event = doc.createEvent("MouseEvents");
37   - event.initMouseEvent(
38   - "click", true, false, view, 0, 0, 0, 0, 0
39   - , false, false, false, false, 0, null
40   - );
41   - node.dispatchEvent(event);
42   - }
43   - , webkit_req_fs = view.webkitRequestFileSystem
44   - , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
45   - , throw_outside = function(ex) {
46   - (view.setImmediate || view.setTimeout)(function() {
47   - throw ex;
48   - }, 0);
49   - }
50   - , force_saveable_type = "application/octet-stream"
51   - , fs_min_size = 0
52   - // See https://code.google.com/p/chromium/issues/detail?id=375297#c7 for
53   - // the reasoning behind the timeout and revocation flow
54   - , arbitrary_revoke_timeout = 10
55   - , revoke = function(file) {
56   - var revoker = function() {
57   - if (typeof file === "string") { // file is an object URL
58   - get_URL().revokeObjectURL(file);
59   - } else { // file is a File
60   - file.remove();
61   - }
62   - };
63   - if (view.chrome) {
64   - revoker();
65   - } else {
66   - setTimeout(revoker, arbitrary_revoke_timeout);
67   - }
68   - }
69   - , dispatch = function(filesaver, event_types, event) {
70   - event_types = [].concat(event_types);
71   - var i = event_types.length;
72   - while (i--) {
73   - var listener = filesaver["on" + event_types[i]];
74   - if (typeof listener === "function") {
75   - try {
76   - listener.call(filesaver, event || filesaver);
77   - } catch (ex) {
78   - throw_outside(ex);
79   - }
80   - }
81   - }
82   - }
83   - , FileSaver = function(blob, name) {
84   - // First try a.download, then web filesystem, then object URLs
85   - var
86   - filesaver = this
87   - , type = blob.type
88   - , blob_changed = false
89   - , object_url
90   - , target_view
91   - , dispatch_all = function() {
92   - dispatch(filesaver, "writestart progress write writeend".split(" "));
93   - }
94   - // on any filesys errors revert to saving with object URLs
95   - , fs_error = function() {
96   - // don't create more object URLs than needed
97   - if (blob_changed || !object_url) {
98   - object_url = get_URL().createObjectURL(blob);
99   - }
100   - if (target_view) {
101   - target_view.location.href = object_url;
102   - } else {
103   - var new_tab = view.open(object_url, "_blank");
104   - if (new_tab == undefined && typeof safari !== "undefined") {
105   - //Apple do not allow window.open, see http://bit.ly/1kZffRI
106   - view.location.href = object_url
107   - }
108   - }
109   - filesaver.readyState = filesaver.DONE;
110   - dispatch_all();
111   - revoke(object_url);
112   - }
113   - , abortable = function(func) {
114   - return function() {
115   - if (filesaver.readyState !== filesaver.DONE) {
116   - return func.apply(this, arguments);
117   - }
118   - };
119   - }
120   - , create_if_not_found = {create: true, exclusive: false}
121   - , slice
122   - ;
123   - filesaver.readyState = filesaver.INIT;
124   - if (!name) {
125   - name = "download";
126   - }
127   - if (can_use_save_link) {
128   - object_url = get_URL().createObjectURL(blob);
129   - save_link.href = object_url;
130   - save_link.download = name;
131   - click(save_link);
132   - filesaver.readyState = filesaver.DONE;
133   - dispatch_all();
134   - revoke(object_url);
135   - return;
136   - }
137   - // Object and web filesystem URLs have a problem saving in Google Chrome when
138   - // viewed in a tab, so I force save with application/octet-stream
139   - // http://code.google.com/p/chromium/issues/detail?id=91158
140   - // Update: Google errantly closed 91158, I submitted it again:
141   - // https://code.google.com/p/chromium/issues/detail?id=389642
142   - if (view.chrome && type && type !== force_saveable_type) {
143   - slice = blob.slice || blob.webkitSlice;
144   - blob = slice.call(blob, 0, blob.size, force_saveable_type);
145   - blob_changed = true;
146   - }
147   - // Since I can't be sure that the guessed media type will trigger a download
148   - // in WebKit, I append .download to the filename.
149   - // https://bugs.webkit.org/show_bug.cgi?id=65440
150   - if (webkit_req_fs && name !== "download") {
151   - name += ".download";
152   - }
153   - if (type === force_saveable_type || webkit_req_fs) {
154   - target_view = view;
155   - }
156   - if (!req_fs) {
157   - fs_error();
158   - return;
159   - }
160   - fs_min_size += blob.size;
161   - req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
162   - fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
163   - var save = function() {
164   - dir.getFile(name, create_if_not_found, abortable(function(file) {
165   - file.createWriter(abortable(function(writer) {
166   - writer.onwriteend = function(event) {
167   - target_view.location.href = file.toURL();
168   - filesaver.readyState = filesaver.DONE;
169   - dispatch(filesaver, "writeend", event);
170   - revoke(file);
171   - };
172   - writer.onerror = function() {
173   - var error = writer.error;
174   - if (error.code !== error.ABORT_ERR) {
175   - fs_error();
176   - }
177   - };
178   - "writestart progress write abort".split(" ").forEach(function(event) {
179   - writer["on" + event] = filesaver["on" + event];
180   - });
181   - writer.write(blob);
182   - filesaver.abort = function() {
183   - writer.abort();
184   - filesaver.readyState = filesaver.DONE;
185   - };
186   - filesaver.readyState = filesaver.WRITING;
187   - }), fs_error);
188   - }), fs_error);
189   - };
190   - dir.getFile(name, {create: false}, abortable(function(file) {
191   - // delete file if it already exists
192   - file.remove();
193   - save();
194   - }), abortable(function(ex) {
195   - if (ex.code === ex.NOT_FOUND_ERR) {
196   - save();
197   - } else {
198   - fs_error();
199   - }
200   - }));
201   - }), fs_error);
202   - }), fs_error);
203   - }
204   - , FS_proto = FileSaver.prototype
205   - , saveAs = function(blob, name) {
206   - return new FileSaver(blob, name);
207   - }
208   - ;
209   - FS_proto.abort = function() {
210   - var filesaver = this;
211   - filesaver.readyState = filesaver.DONE;
212   - dispatch(filesaver, "abort");
213   - };
214   - FS_proto.readyState = FS_proto.INIT = 0;
215   - FS_proto.WRITING = 1;
216   - FS_proto.DONE = 2;
217   -
218   - FS_proto.error =
219   - FS_proto.onwritestart =
220   - FS_proto.onprogress =
221   - FS_proto.onwrite =
222   - FS_proto.onabort =
223   - FS_proto.onerror =
224   - FS_proto.onwriteend =
225   - null;
226   -
227   - return saveAs;
228   -}(
229   - typeof self !== "undefined" && self
230   - || typeof window !== "undefined" && window
231   - || this.content
232   -));
233   -// `self` is undefined in Firefox for Android content script context
234   -// while `this` is nsIContentFrameMessageManager
235   -// with an attribute `content` that corresponds to the window
236   -
237   -if (typeof module !== "undefined" && module !== null) {
238   - module.exports = saveAs;
239   -} else if ((typeof define !== "undefined" && define !== null) && (define.amd != null)) {
240   - define([], function() {
241   - return saveAs;
242   - });
243   -}
  1 +/* FileSaver.js
  2 + * A saveAs() FileSaver implementation.
  3 + * 2014-08-29
  4 + *
  5 + * By Eli Grey, http://eligrey.com
  6 + * License: X11/MIT
  7 + * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
  8 + */
  9 +
  10 +/*global self */
  11 +/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
  12 +
  13 +/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
  14 +
  15 +var saveAs = saveAs
  16 + // IE 10+ (native saveAs)
  17 + || (typeof navigator !== "undefined" &&
  18 + navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
  19 + // Everyone else
  20 + || (function(view) {
  21 + "use strict";
  22 + // IE <10 is explicitly unsupported
  23 + if (typeof navigator !== "undefined" &&
  24 + /MSIE [1-9]\./.test(navigator.userAgent)) {
  25 + return;
  26 + }
  27 + var
  28 + doc = view.document
  29 + // only get URL when necessary in case Blob.js hasn't overridden it yet
  30 + , get_URL = function() {
  31 + return view.URL || view.webkitURL || view;
  32 + }
  33 + , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
  34 + , can_use_save_link = "download" in save_link
  35 + , click = function(node) {
  36 + var event = doc.createEvent("MouseEvents");
  37 + event.initMouseEvent(
  38 + "click", true, false, view, 0, 0, 0, 0, 0
  39 + , false, false, false, false, 0, null
  40 + );
  41 + node.dispatchEvent(event);
  42 + }
  43 + , webkit_req_fs = view.webkitRequestFileSystem
  44 + , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
  45 + , throw_outside = function(ex) {
  46 + (view.setImmediate || view.setTimeout)(function() {
  47 + throw ex;
  48 + }, 0);
  49 + }
  50 + , force_saveable_type = "application/octet-stream"
  51 + , fs_min_size = 0
  52 + // See https://code.google.com/p/chromium/issues/detail?id=375297#c7 for
  53 + // the reasoning behind the timeout and revocation flow
  54 + , arbitrary_revoke_timeout = 10
  55 + , revoke = function(file) {
  56 + var revoker = function() {
  57 + if (typeof file === "string") { // file is an object URL
  58 + get_URL().revokeObjectURL(file);
  59 + } else { // file is a File
  60 + file.remove();
  61 + }
  62 + };
  63 + if (view.chrome) {
  64 + revoker();
  65 + } else {
  66 + setTimeout(revoker, arbitrary_revoke_timeout);
  67 + }
  68 + }
  69 + , dispatch = function(filesaver, event_types, event) {
  70 + event_types = [].concat(event_types);
  71 + var i = event_types.length;
  72 + while (i--) {
  73 + var listener = filesaver["on" + event_types[i]];
  74 + if (typeof listener === "function") {
  75 + try {
  76 + listener.call(filesaver, event || filesaver);
  77 + } catch (ex) {
  78 + throw_outside(ex);
  79 + }
  80 + }
  81 + }
  82 + }
  83 + , FileSaver = function(blob, name) {
  84 + // First try a.download, then web filesystem, then object URLs
  85 + var
  86 + filesaver = this
  87 + , type = blob.type
  88 + , blob_changed = false
  89 + , object_url
  90 + , target_view
  91 + , dispatch_all = function() {
  92 + dispatch(filesaver, "writestart progress write writeend".split(" "));
  93 + }
  94 + // on any filesys errors revert to saving with object URLs
  95 + , fs_error = function() {
  96 + // don't create more object URLs than needed
  97 + if (blob_changed || !object_url) {
  98 + object_url = get_URL().createObjectURL(blob);
  99 + }
  100 + if (target_view) {
  101 + target_view.location.href = object_url;
  102 + } else {
  103 + var new_tab = view.open(object_url, "_blank");
  104 + if (new_tab == undefined && typeof safari !== "undefined") {
  105 + //Apple do not allow window.open, see http://bit.ly/1kZffRI
  106 + view.location.href = object_url
  107 + }
  108 + }
  109 + filesaver.readyState = filesaver.DONE;
  110 + dispatch_all();
  111 + revoke(object_url);
  112 + }
  113 + , abortable = function(func) {
  114 + return function() {
  115 + if (filesaver.readyState !== filesaver.DONE) {
  116 + return func.apply(this, arguments);
  117 + }
  118 + };
  119 + }
  120 + , create_if_not_found = {create: true, exclusive: false}
  121 + , slice
  122 + ;
  123 + filesaver.readyState = filesaver.INIT;
  124 + if (!name) {
  125 + name = "download";
  126 + }
  127 + if (can_use_save_link) {
  128 + object_url = get_URL().createObjectURL(blob);
  129 + save_link.href = object_url;
  130 + save_link.download = name;
  131 + click(save_link);
  132 + filesaver.readyState = filesaver.DONE;
  133 + dispatch_all();
  134 + revoke(object_url);
  135 + return;
  136 + }
  137 + // Object and web filesystem URLs have a problem saving in Google Chrome when
  138 + // viewed in a tab, so I force save with application/octet-stream
  139 + // http://code.google.com/p/chromium/issues/detail?id=91158
  140 + // Update: Google errantly closed 91158, I submitted it again:
  141 + // https://code.google.com/p/chromium/issues/detail?id=389642
  142 + if (view.chrome && type && type !== force_saveable_type) {
  143 + slice = blob.slice || blob.webkitSlice;
  144 + blob = slice.call(blob, 0, blob.size, force_saveable_type);
  145 + blob_changed = true;
  146 + }
  147 + // Since I can't be sure that the guessed media type will trigger a download
  148 + // in WebKit, I append .download to the filename.
  149 + // https://bugs.webkit.org/show_bug.cgi?id=65440
  150 + if (webkit_req_fs && name !== "download") {
  151 + name += ".download";
  152 + }
  153 + if (type === force_saveable_type || webkit_req_fs) {
  154 + target_view = view;
  155 + }
  156 + if (!req_fs) {
  157 + fs_error();
  158 + return;
  159 + }
  160 + fs_min_size += blob.size;
  161 + req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
  162 + fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
  163 + var save = function() {
  164 + dir.getFile(name, create_if_not_found, abortable(function(file) {
  165 + file.createWriter(abortable(function(writer) {
  166 + writer.onwriteend = function(event) {
  167 + target_view.location.href = file.toURL();
  168 + filesaver.readyState = filesaver.DONE;
  169 + dispatch(filesaver, "writeend", event);
  170 + revoke(file);
  171 + };
  172 + writer.onerror = function() {
  173 + var error = writer.error;
  174 + if (error.code !== error.ABORT_ERR) {
  175 + fs_error();
  176 + }
  177 + };
  178 + "writestart progress write abort".split(" ").forEach(function(event) {
  179 + writer["on" + event] = filesaver["on" + event];
  180 + });
  181 + writer.write(blob);
  182 + filesaver.abort = function() {
  183 + writer.abort();
  184 + filesaver.readyState = filesaver.DONE;
  185 + };
  186 + filesaver.readyState = filesaver.WRITING;
  187 + }), fs_error);
  188 + }), fs_error);
  189 + };
  190 + dir.getFile(name, {create: false}, abortable(function(file) {
  191 + // delete file if it already exists
  192 + file.remove();
  193 + save();
  194 + }), abortable(function(ex) {
  195 + if (ex.code === ex.NOT_FOUND_ERR) {
  196 + save();
  197 + } else {
  198 + fs_error();
  199 + }
  200 + }));
  201 + }), fs_error);
  202 + }), fs_error);
  203 + }
  204 + , FS_proto = FileSaver.prototype
  205 + , saveAs = function(blob, name) {
  206 + return new FileSaver(blob, name);
  207 + }
  208 + ;
  209 + FS_proto.abort = function() {
  210 + var filesaver = this;
  211 + filesaver.readyState = filesaver.DONE;
  212 + dispatch(filesaver, "abort");
  213 + };
  214 + FS_proto.readyState = FS_proto.INIT = 0;
  215 + FS_proto.WRITING = 1;
  216 + FS_proto.DONE = 2;
  217 +
  218 + FS_proto.error =
  219 + FS_proto.onwritestart =
  220 + FS_proto.onprogress =
  221 + FS_proto.onwrite =
  222 + FS_proto.onabort =
  223 + FS_proto.onerror =
  224 + FS_proto.onwriteend =
  225 + null;
  226 +
  227 + return saveAs;
  228 +}(
  229 + typeof self !== "undefined" && self
  230 + || typeof window !== "undefined" && window
  231 + || this.content
  232 +));
  233 +// `self` is undefined in Firefox for Android content script context
  234 +// while `this` is nsIContentFrameMessageManager
  235 +// with an attribute `content` that corresponds to the window
  236 +
  237 +if (typeof module !== "undefined" && module !== null) {
  238 + module.exports = saveAs;
  239 +} else if ((typeof define !== "undefined" && define !== null) && (define.amd != null)) {
  240 + define([], function() {
  241 + return saveAs;
  242 + });
  243 +}
... ...
src/main/resources/static/pages/report/inoutstation/js/tableExport.js
1   -
2   -
3   -(function(view){
4   - "use strict";
5   - var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
6   - var fromCharCode = String.fromCharCode;
7   - var INVALID_CHARACTER_ERR = ( function() {
8   - // fabricate a suitable error object
9   - try {
10   - document.createElement('$');
11   - } catch (error) {
12   - return error;
13   - }
14   - }());
15   -
16   - // encoder
17   - var btoa = function(string) {
18   - var a, b, b1, b2, b3, b4, c, i = 0, len = string.length, max = Math.max, result = '';
19   -
20   - while (i < len) {
21   - a = string.charCodeAt(i++) || 0;
22   - b = string.charCodeAt(i++) || 0;
23   - c = string.charCodeAt(i++) || 0;
24   -
25   - if (max(a, b, c) > 0xFF) {
26   - throw INVALID_CHARACTER_ERR;
27   - }
28   -
29   - b1 = (a >> 2) & 0x3F;
30   - b2 = ((a & 0x3) << 4) | ((b >> 4) & 0xF);
31   - b3 = ((b & 0xF) << 2) | ((c >> 6) & 0x3);
32   - b4 = c & 0x3F;
33   -
34   - if (!b) {
35   - b3 = b4 = 64;
36   - } else if (!c) {
37   - b4 = 64;
38   - }
39   - result += characters.charAt(b1) + characters.charAt(b2) + characters.charAt(b3) + characters.charAt(b4);
40   - }
41   - return result;
42   - };
43   -
44   - //获取dom文本
45   - var getText = function( el ){
46   - var s = el.textContent || el.innerText;
47   - return s == null ? "" : s.replace( /^\s*(.*?)\s+$/, "$1");
48   - };
49   - view.tableExport = function(tableId, filename, type){
50   - var doc = view.document,
51   - table = doc.getElementById(tableId),
52   - charSet = doc.characterSet
53   -
54   - var uri = {
55   - json: 'application/json;charset='+charSet,
56   - txt: 'csv/txt;charset='+charSet,
57   - csv: 'csv/txt;charset='+charSet,
58   - doc: 'application/vnd.ms-doc',
59   - excel: 'application/vnd.ms-excel'
60   - };
61   -
62   - var base64 = function(s) {
63   - return btoa(unescape(encodeURIComponent(s)));
64   - };
65   - var template = function(s, c) {
66   - return s.replace(/{(\w+)}/g, function(m, p) {
67   - return c[p];
68   - });
69   - };
70   -
71   - var get_blob = function() {
72   - return view.Blob;
73   - }
74   -
75   - var fixCSVField = function(value) {
76   - var fixedValue = value;
77   - var addQuotes = (value.indexOf(',') !== -1) || (value.indexOf('\r') !== -1) || (value.indexOf('\n') !== -1);
78   - var replaceDoubleQuotes = (value.indexOf('"') !== -1);
79   -
80   - if (replaceDoubleQuotes) {
81   - fixedValue = fixedValue.replace(/"/g, '""');
82   - }
83   - if (addQuotes || replaceDoubleQuotes) {
84   - fixedValue = '"' + fixedValue + '"';
85   - }
86   - return fixedValue;
87   - };
88   -
89   - var saveData = function(data){
90   - var BB = get_blob();
91   - saveAs(new BB([data], {type: uri[type]}), filename + "."+type);
92   - };
93   -
94   - var toCSV = function(){
95   - var data = "\ufeff";
96   - for (var i = 0, row; row = table.rows[i]; i++) {
97   - for (var j = 0, col; col = row.cells[j]; j++) {
98   - data = data + (j ? ',' : '') + fixCSVField(getText(col));
99   - }
100   - data = data + "\r\n";
101   - }
102   - saveData(data);
103   - };
104   -
105   - var toJson = function(){
106   - var jsonHeaderArray = [];
107   -
108   - if(table.tHead){
109   - for(var i =0,col; col = table.tHead.rows[0].cells[i]; i++){
110   - jsonHeaderArray.push(getText(col));
111   - }
112   - }
113   -
114   - var jsonArray = [];
115   - if(table.tBodies){
116   - for(var j=0,tbody; tbody = table.tBodies[j]; j++){
117   - for(var k =0, rowb; rowb= tbody.rows[k]; k++){
118   - var len = jsonArray.length;
119   - jsonArray[len] = [];
120   - for (var g = 0, colb; colb = rowb.cells[g]; g++) {
121   - jsonArray[len].push(getText(colb));
122   - }
123   - }
124   - }
125   - }
126   -
127   - var jsonExportArray = {
128   - header: jsonHeaderArray,
129   - data: jsonArray
130   - };
131   - saveData(JSON.stringify(jsonExportArray));
132   - };
133   -
134   - var toOffice = function(){
135   - var tmpl = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:'+type+'" xmlns="http://www.w3.org/TR/REC-html40">';
136   - tmpl += '<head><meta charset="'+charSet+'" /><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>';
137   - tmpl += '{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->';
138   - tmpl += '</head><body><table>{table}</table></body></html>';
139   - var office = '',
140   - maph = [['<thead><tr>', '</tr></thead>'], ['<tbody><tr>', '</tr></tbody>'], ['<tr>', '</tr>']],
141   - mapb = [['<th>', '</th>'],['<td>', '</td>']],
142   - flag = +!table.tHead,
143   - com = 1 - flag;
144   -
145   - for(var i=0, row; row = table.rows[i]; i++){
146   - flag = i > com ? 2 : flag;
147   - office += maph[flag][0];
148   - for(var j =0, col; col = row.cells[j]; j++){
149   - office += mapb[+!!flag][0]+ getText(col) +mapb[+!!flag][1];
150   - }
151   - office += maph[flag][1];
152   - flag++;
153   - }
154   - saveData(template(tmpl, {worksheet: 'Worksheet', table: office}));
155   - };
156   -
157   - var typeMap = {
158   - json : toJson,
159   - txt: toCSV,
160   - csv: toCSV,
161   - doc: toOffice,
162   - docx: toOffice,
163   - xls: toOffice,
164   - xlsx: toOffice
165   - };
166   -
167   - typeMap[type]();
168   - };
169   -
  1 +
  2 +
  3 +(function(view){
  4 + "use strict";
  5 + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  6 + var fromCharCode = String.fromCharCode;
  7 + var INVALID_CHARACTER_ERR = ( function() {
  8 + // fabricate a suitable error object
  9 + try {
  10 + document.createElement('$');
  11 + } catch (error) {
  12 + return error;
  13 + }
  14 + }());
  15 +
  16 + // encoder
  17 + var btoa = function(string) {
  18 + var a, b, b1, b2, b3, b4, c, i = 0, len = string.length, max = Math.max, result = '';
  19 +
  20 + while (i < len) {
  21 + a = string.charCodeAt(i++) || 0;
  22 + b = string.charCodeAt(i++) || 0;
  23 + c = string.charCodeAt(i++) || 0;
  24 +
  25 + if (max(a, b, c) > 0xFF) {
  26 + throw INVALID_CHARACTER_ERR;
  27 + }
  28 +
  29 + b1 = (a >> 2) & 0x3F;
  30 + b2 = ((a & 0x3) << 4) | ((b >> 4) & 0xF);
  31 + b3 = ((b & 0xF) << 2) | ((c >> 6) & 0x3);
  32 + b4 = c & 0x3F;
  33 +
  34 + if (!b) {
  35 + b3 = b4 = 64;
  36 + } else if (!c) {
  37 + b4 = 64;
  38 + }
  39 + result += characters.charAt(b1) + characters.charAt(b2) + characters.charAt(b3) + characters.charAt(b4);
  40 + }
  41 + return result;
  42 + };
  43 +
  44 + //获取dom文本
  45 + var getText = function( el ){
  46 + var s = el.textContent || el.innerText;
  47 + return s == null ? "" : s.replace( /^\s*(.*?)\s+$/, "$1");
  48 + };
  49 + view.tableExport = function(tableId, filename, type){
  50 + var doc = view.document,
  51 + table = doc.getElementById(tableId),
  52 + charSet = doc.characterSet
  53 +
  54 + var uri = {
  55 + json: 'application/json;charset='+charSet,
  56 + txt: 'csv/txt;charset='+charSet,
  57 + csv: 'csv/txt;charset='+charSet,
  58 + doc: 'application/vnd.ms-doc',
  59 + excel: 'application/vnd.ms-excel'
  60 + };
  61 +
  62 + var base64 = function(s) {
  63 + return btoa(unescape(encodeURIComponent(s)));
  64 + };
  65 + var template = function(s, c) {
  66 + return s.replace(/{(\w+)}/g, function(m, p) {
  67 + return c[p];
  68 + });
  69 + };
  70 +
  71 + var get_blob = function() {
  72 + return view.Blob;
  73 + }
  74 +
  75 + var fixCSVField = function(value) {
  76 + var fixedValue = value;
  77 + var addQuotes = (value.indexOf(',') !== -1) || (value.indexOf('\r') !== -1) || (value.indexOf('\n') !== -1);
  78 + var replaceDoubleQuotes = (value.indexOf('"') !== -1);
  79 +
  80 + if (replaceDoubleQuotes) {
  81 + fixedValue = fixedValue.replace(/"/g, '""');
  82 + }
  83 + if (addQuotes || replaceDoubleQuotes) {
  84 + fixedValue = '"' + fixedValue + '"';
  85 + }
  86 + return fixedValue;
  87 + };
  88 +
  89 + var saveData = function(data){
  90 + var BB = get_blob();
  91 + saveAs(new BB([data], {type: uri[type]}), filename + "."+type);
  92 + };
  93 +
  94 + var toCSV = function(){
  95 + var data = "\ufeff";
  96 + for (var i = 0, row; row = table.rows[i]; i++) {
  97 + for (var j = 0, col; col = row.cells[j]; j++) {
  98 + data = data + (j ? ',' : '') + fixCSVField(getText(col));
  99 + }
  100 + data = data + "\r\n";
  101 + }
  102 + saveData(data);
  103 + };
  104 +
  105 + var toJson = function(){
  106 + var jsonHeaderArray = [];
  107 +
  108 + if(table.tHead){
  109 + for(var i =0,col; col = table.tHead.rows[0].cells[i]; i++){
  110 + jsonHeaderArray.push(getText(col));
  111 + }
  112 + }
  113 +
  114 + var jsonArray = [];
  115 + if(table.tBodies){
  116 + for(var j=0,tbody; tbody = table.tBodies[j]; j++){
  117 + for(var k =0, rowb; rowb= tbody.rows[k]; k++){
  118 + var len = jsonArray.length;
  119 + jsonArray[len] = [];
  120 + for (var g = 0, colb; colb = rowb.cells[g]; g++) {
  121 + jsonArray[len].push(getText(colb));
  122 + }
  123 + }
  124 + }
  125 + }
  126 +
  127 + var jsonExportArray = {
  128 + header: jsonHeaderArray,
  129 + data: jsonArray
  130 + };
  131 + saveData(JSON.stringify(jsonExportArray));
  132 + };
  133 +
  134 + var toOffice = function(){
  135 + var tmpl = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:'+type+'" xmlns="http://www.w3.org/TR/REC-html40">';
  136 + tmpl += '<head><meta charset="'+charSet+'" /><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>';
  137 + tmpl += '{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->';
  138 + tmpl += '</head><body><table>{table}</table></body></html>';
  139 + var office = '',
  140 + maph = [['<thead><tr>', '</tr></thead>'], ['<tbody><tr>', '</tr></tbody>'], ['<tr>', '</tr>']],
  141 + mapb = [['<th>', '</th>'],['<td>', '</td>']],
  142 + flag = +!table.tHead,
  143 + com = 1 - flag;
  144 +
  145 + for(var i=0, row; row = table.rows[i]; i++){
  146 + flag = i > com ? 2 : flag;
  147 + office += maph[flag][0];
  148 + for(var j =0, col; col = row.cells[j]; j++){
  149 + office += mapb[+!!flag][0]+ getText(col) +mapb[+!!flag][1];
  150 + }
  151 + office += maph[flag][1];
  152 + flag++;
  153 + }
  154 + saveData(template(tmpl, {worksheet: 'Worksheet', table: office}));
  155 + };
  156 +
  157 + var typeMap = {
  158 + json : toJson,
  159 + txt: toCSV,
  160 + csv: toCSV,
  161 + doc: toOffice,
  162 + docx: toOffice,
  163 + xls: toOffice,
  164 + xlsx: toOffice
  165 + };
  166 +
  167 + typeMap[type]();
  168 + };
  169 +
170 170 })(window);
171 171 \ No newline at end of file
... ...
src/main/resources/static/pages/scheduleApp/module/common/dts2/ttinfotable/saTimeTablePreView.js
1   -/**
2   - * saTimetablePreview指令,时刻表预览模式视图。
3   - */
4   -angular.module("ScheduleApp").directive(
5   - "saTimetable2",
6   - [
7   - '$timeout',
8   - function($timeout) {
9   - return {
10   - restrict : 'E',
11   - templateUrl : '/pages/scheduleApp/module/common/dts2/ttinfotable/saTimeTablePreViewTemplate.html',
12   - scope : { // 独立作用域
13   - // 使用外部数据源,内部重新组合显示
14   - ds : "=ngModel"
15   - },
16   - controllerAs : "$saTimeTablePreviewCtrl",
17   - bindToController: true,
18   - controller : function() {
19   - var self = this;
20   -
21   - // 内部班次时刻模型
22   - self.internalBcModel = {
23   - up_qdz_name : "", // 上行起点站名字
24   - down_qdz_name : "", // 下行起点站名字
25   - up_bc_list_asc : [], // 上行班次列表(按照发车时间升序)
26   - down_bc_list_asc : [] // 下行班次列表(按照发车时间升序)
27   - };
28   -
29   - // 内部各个路牌block车次链模型
30   - self.internalLpBlockModel = {
31   - // key:路牌名字
32   - // value: 数组(按照发车时间排序)
33   - // value 数据内对象 {fcsj:发车时间,isUp:是否上行,fcno:发车顺序号,index:对应的班次列表索引}
34   - };
35   -
36   - // TODO:
37   - },
38   -
39   - /**,
40   - * compile阶段,angular还没有编译模版,根据需要可以修改模版dom
41   - * @param tElem
42   - * @param tAttrs
43   - * @returns {{pre: Function, post: Function}}
44   - */
45   - compile : function(tElem, tAttrs) {
46   - // 获取属性
47   - var $attr_name = tAttrs["name"]; // 控件的名字
48   - if (!$attr_name) {
49   - throw new Error("saTimeTablePreview指令 name属性required");
50   - }
51   -
52   - // 内部controlAs名字
53   - var ctrlAs = "$saTimeTablePreviewCtrl";
54   -
55   - // TODO:
56   -
57   - //------------------ 内部方法 --------------------//
58   - var date_wrap_prefix = "2000-01-01 "; // 包装日期的前缀
59   - var date_wrap_format = "YYYY-MM-DD HH:mm"; // 日期格式
60   - /**
61   - * 将时间包装成日期,方便计算。
62   - * @param timeStr 时间格式,如 06:30
63   - * @returns moment对象
64   - */
65   - var _fun_WrapTime = function(timeStr) {
66   - return moment(
67   - date_wrap_prefix + timeStr,
68   - date_wrap_format
69   - );
70   - };
71   -
72   - /**
73   - * 点击班次html元素(dl),触发班次移动,如下:
74   - * 1、点击上行班次,下一个下行班次在下行班次列表中移到中间位置
75   - * 2、点击下行班次,下一个上行班次在上行班次列表中移到中间位置
76   - * @param ctrl 内部控制器
77   - * @param index 班次索引
78   - * @param isUp 是否上行
79   - * @private
80   - */
81   - var _fun_bcDDViewMove = function(ctrl, index, isUp) {
82   - // 获取当前点击班次对象
83   - var oBc;
84   - if (isUp) {
85   - oBc = ctrl.internalBcModel.up_bc_list_asc[index];
86   - } else {
87   - oBc = ctrl.internalBcModel.down_bc_list_asc[index];
88   - }
89   -
90   - // 找出车次链中的下一个班次索引,没有就undefined
91   - var nextIndex = undefined;
92   - var nextBlockBc = undefined;
93   - var currentBlockBcIndex = undefined;
94   - angular.forEach(ctrl.internalLpBlockModel[oBc.lpName], function(data, i) {
95   - if (data.fcsj == oBc.fcsj) {
96   - currentBlockBcIndex = i;
97   - }
98   - });
99   - if (currentBlockBcIndex != undefined &&
100   - currentBlockBcIndex < (ctrl.internalLpBlockModel[oBc.lpName].length - 1)) {
101   - nextBlockBc = ctrl.internalLpBlockModel[oBc.lpName][currentBlockBcIndex + 1];
102   - nextIndex = nextBlockBc.index;
103   - }
104   - // 先删除click标记,再添加
105   - angular.forEach(ctrl.internalBcModel.up_bc_list_asc, function(data) {
106   - delete data["isClick"];
107   - });
108   - angular.forEach(ctrl.internalBcModel.down_bc_list_asc, function(data) {
109   - delete data["isClick"];
110   - });
111   - oBc.isClick = true;
112   - if (nextIndex) {
113   - if (nextBlockBc.isUp) {
114   - ctrl.internalBcModel.up_bc_list_asc[nextIndex].isClick = true;
115   - } else {
116   - ctrl.internalBcModel.down_bc_list_asc[nextIndex].isClick = true;
117   - }
118   - }
119   -
120   - // 移动,同方向不移动
121   - var clientHeight = angular.element("#temp").height() - 34;
122   - if (nextBlockBc && isUp != nextBlockBc.isUp) {
123   - if (isUp) { // 移动下行
124   - angular.element(".ttpv_table_scrollbar:eq(1)").animate(
125   - {scrollTop : nextIndex * 30 - clientHeight / 2}, 400);
126   - } else { // 移动上行
127   - angular.element(".ttpv_table_scrollbar:eq(0)").animate(
128   - {scrollTop : nextIndex * 30 - clientHeight / 2}, 400);
129   - }
130   - }
131   -
132   - };
133   -
134   - /**
135   - * 刷新内部数据。
136   - * @param ctrl 内部控制器对象($saTimeTablePreviewCtrl)
137   - * @private
138   - */
139   - var _fun_refreshInternalModel = function(ctrl) {
140   - // 初始化内部数据
141   - ctrl.internalBcModel = {
142   - up_qdz_name : "", // 上行起点站名字
143   - up_zdz_name : "", // 上行终点站名字
144   - down_qdz_name : "", // 下行起点站名字
145   - down_zdz_name : "", // 下行终点站名字
146   - up_bc_list_asc : [], // 上行班次列表(按照发车时间升序)
147   - down_bc_list_asc : [] // 下行班次列表(按照发车时间升序)
148   - };
149   - ctrl.internalLpBlockModel = {
150   -
151   - };
152   -
153   - // ngModel传入的数据
154   - var dataSource = ctrl.ds.bcList;
155   -
156   - // 构造上下行班次列表,并确定上下行的首发站点
157   - angular.forEach(dataSource, function(bcObj) {
158   - var _internalBcObj = {};
159   - // 构造内部班次对象
160   - _internalBcObj.lpName = bcObj.lp.lpName; // 路牌
161   - _internalBcObj.fcsj = bcObj.fcsj; // 发车时间
162   - _internalBcObj.ddsj = _fun_WrapTime(bcObj.fcsj).add(bcObj.bcsj, "m").format("HH:mm");
163   - _internalBcObj.qdzName = bcObj.qdzName; // 起点站名字
164   - _internalBcObj.zdzName = bcObj.zdzName; // 终点站名字
165   - _internalBcObj.bcType = bcObj.bcType; // 班次类型
166   - _internalBcObj.isTs = bcObj.isTS; // 是否停驶
167   - _internalBcObj.isFb = bcObj.isFB; // 是否分班
168   - _internalBcObj.remark = bcObj.remark; // 备注
169   - _internalBcObj._fcno = bcObj.fcno; // 发车顺序号
170   -
171   - if (bcObj.xlDir == "0") { // 上行
172   - ctrl.internalBcModel.up_bc_list_asc.push(_internalBcObj);
173   - // 确定起点站
174   - if (ctrl.internalBcModel.up_qdz_name == "") {
175   - if (bcObj.bcType == "normal") {
176   - ctrl.internalBcModel.up_qdz_name = bcObj.qdzName;
177   - }
178   - }
179   - // 确定终点站
180   - if (ctrl.internalBcModel.up_zdz_name == "") {
181   - if (bcObj.bcType == "normal") {
182   - ctrl.internalBcModel.up_zdz_name = bcObj.zdzName;
183   - }
184   - }
185   - }
186   - if (bcObj.xlDir == "1") { // 下行
187   - ctrl.internalBcModel.down_bc_list_asc.push(_internalBcObj);
188   - // 确定起点站
189   - if (ctrl.internalBcModel.down_qdz_name == "") {
190   - if (bcObj.bcType == "normal") {
191   - ctrl.internalBcModel.down_qdz_name = bcObj.qdzName;
192   - }
193   - }
194   - // 确定终点站
195   - if (ctrl.internalBcModel.down_zdz_name == "") {
196   - if (bcObj.bcType == "normal") {
197   - ctrl.internalBcModel.down_zdz_name = bcObj.zdzName;
198   - }
199   - }
200   - }
201   -
202   - });
203   -
204   - // 发车时间升序排序上行班次
205   - ctrl.internalBcModel.up_bc_list_asc.sort(function(a, b) {
206   - var a_wrapTime = _fun_WrapTime(a.fcsj);
207   - var b_wrapTime = _fun_WrapTime(b.fcsj);
208   -
209   - // 判定如果发车时间是以00,01,02,03开头的,说明是下一天凌晨的班次,需要加1天判定
210   - // TODO:以后要配合首班车的发车时间判定
211   - if (a.fcsj.indexOf("00:") == 0 ||
212   - a.fcsj.indexOf("01:") == 0 ||
213   - a.fcsj.indexOf("02:") == 0) {
214   - a_wrapTime.add(1, "day");
215   - }
216   - if (b.fcsj.indexOf("00:") == 0 ||
217   - b.fcsj.indexOf("01:") == 0 ||
218   - b.fcsj.indexOf("02:") == 0) {
219   - b_wrapTime.add(1, "day");
220   - }
221   -
222   - if (a_wrapTime.isBefore(b_wrapTime)) {
223   - return -1;
224   - } else if (a_wrapTime.isAfter(b_wrapTime)) {
225   - return 1;
226   - } else {
227   - return 0;
228   - }
229   -
230   - });
231   - // 发车时间升序排序下行班次
232   - ctrl.internalBcModel.down_bc_list_asc.sort(function(a, b) {
233   - var a_wrapTime = _fun_WrapTime(a.fcsj);
234   - var b_wrapTime = _fun_WrapTime(b.fcsj);
235   -
236   - // 判定如果发车时间是以00,01,02,03开头的,说明是下一天凌晨的班次,需要加1天判定
237   - // TODO:以后要配合首班车的发车时间判定
238   - if (a.fcsj.indexOf("00:") == 0 ||
239   - a.fcsj.indexOf("01:") == 0 ||
240   - a.fcsj.indexOf("02:") == 0) {
241   - a_wrapTime.add(1, "day");
242   - }
243   - if (b.fcsj.indexOf("00:") == 0 ||
244   - b.fcsj.indexOf("01:") == 0 ||
245   - b.fcsj.indexOf("02:") == 0) {
246   - b_wrapTime.add(1, "day");
247   - }
248   -
249   - if (a_wrapTime.isBefore(b_wrapTime)) {
250   - return -1;
251   - } else if (a_wrapTime.isAfter(b_wrapTime)) {
252   - return 1;
253   - } else {
254   - return 0;
255   - }
256   - });
257   -
258   - // 构造路牌block车次链,按照发车顺序排序
259   - angular.forEach(ctrl.internalBcModel.up_bc_list_asc, function(data, index) {
260   - if (!ctrl.internalLpBlockModel[data.lpName]) {
261   - ctrl.internalLpBlockModel[data.lpName] = [];
262   - }
263   - ctrl.internalLpBlockModel[data.lpName].push({
264   - fcsj : data.fcsj,
265   - isUp : true,
266   - fcno : data._fcno,
267   - index : index
268   - });
269   - });
270   - angular.forEach(ctrl.internalBcModel.down_bc_list_asc, function(data, index) {
271   - if (!ctrl.internalLpBlockModel[data.lpName]) {
272   - ctrl.internalLpBlockModel[data.lpName] = [];
273   - }
274   - ctrl.internalLpBlockModel[data.lpName].push({
275   - fcsj : data.fcsj,
276   - isUp : false,
277   - fcno : data._fcno,
278   - index : index
279   - });
280   - });
281   - angular.forEach(ctrl.internalLpBlockModel, function(value, key) {
282   - value.sort(function (a, b) {
283   - if (a.fcno < b.fcno) {
284   - return -1;
285   - } else if (a.fcno > b.fcno) {
286   - return 1;
287   - } else {
288   - return 0;
289   - }
290   - });
291   - });
292   -
293   -
294   - };
295   -
296   - return {
297   - pre : function(scope, element, attr) {
298   - // TODO:
299   - },
300   - post : function(scope, element, attr) {
301   - // 班次html点击事件
302   - scope[ctrlAs].$$bcDD_Click = function(index, xlDir) {
303   - _fun_bcDDViewMove(scope[ctrlAs], index, xlDir);
304   - };
305   -
306   - // 监控ngModel绑定的外部数据源的刷新状态变化
307   - scope.$watch(
308   - function() {
309   - return scope[ctrlAs].ds.refreshInfos;
310   - },
311   - function(newValue, oldValue) {
312   - if (newValue === undefined && oldValue === undefined) {
313   - return;
314   - }
315   - console.log("saTimetable2 refresh");
316   - _fun_refreshInternalModel(scope[ctrlAs]);
317   - },
318   - true
319   - );
320   - }
321   - };
322   - }
323   - };
324   - }
325   - ]
  1 +/**
  2 + * saTimetablePreview指令,时刻表预览模式视图。
  3 + */
  4 +angular.module("ScheduleApp").directive(
  5 + "saTimetable2",
  6 + [
  7 + '$timeout',
  8 + function($timeout) {
  9 + return {
  10 + restrict : 'E',
  11 + templateUrl : '/pages/scheduleApp/module/common/dts2/ttinfotable/saTimeTablePreViewTemplate.html',
  12 + scope : { // 独立作用域
  13 + // 使用外部数据源,内部重新组合显示
  14 + ds : "=ngModel"
  15 + },
  16 + controllerAs : "$saTimeTablePreviewCtrl",
  17 + bindToController: true,
  18 + controller : function() {
  19 + var self = this;
  20 +
  21 + // 内部班次时刻模型
  22 + self.internalBcModel = {
  23 + up_qdz_name : "", // 上行起点站名字
  24 + down_qdz_name : "", // 下行起点站名字
  25 + up_bc_list_asc : [], // 上行班次列表(按照发车时间升序)
  26 + down_bc_list_asc : [] // 下行班次列表(按照发车时间升序)
  27 + };
  28 +
  29 + // 内部各个路牌block车次链模型
  30 + self.internalLpBlockModel = {
  31 + // key:路牌名字
  32 + // value: 数组(按照发车时间排序)
  33 + // value 数据内对象 {fcsj:发车时间,isUp:是否上行,fcno:发车顺序号,index:对应的班次列表索引}
  34 + };
  35 +
  36 + // TODO:
  37 + },
  38 +
  39 + /**,
  40 + * compile阶段,angular还没有编译模版,根据需要可以修改模版dom
  41 + * @param tElem
  42 + * @param tAttrs
  43 + * @returns {{pre: Function, post: Function}}
  44 + */
  45 + compile : function(tElem, tAttrs) {
  46 + // 获取属性
  47 + var $attr_name = tAttrs["name"]; // 控件的名字
  48 + if (!$attr_name) {
  49 + throw new Error("saTimeTablePreview指令 name属性required");
  50 + }
  51 +
  52 + // 内部controlAs名字
  53 + var ctrlAs = "$saTimeTablePreviewCtrl";
  54 +
  55 + // TODO:
  56 +
  57 + //------------------ 内部方法 --------------------//
  58 + var date_wrap_prefix = "2000-01-01 "; // 包装日期的前缀
  59 + var date_wrap_format = "YYYY-MM-DD HH:mm"; // 日期格式
  60 + /**
  61 + * 将时间包装成日期,方便计算。
  62 + * @param timeStr 时间格式,如 06:30
  63 + * @returns moment对象
  64 + */
  65 + var _fun_WrapTime = function(timeStr) {
  66 + return moment(
  67 + date_wrap_prefix + timeStr,
  68 + date_wrap_format
  69 + );
  70 + };
  71 +
  72 + /**
  73 + * 点击班次html元素(dl),触发班次移动,如下:
  74 + * 1、点击上行班次,下一个下行班次在下行班次列表中移到中间位置
  75 + * 2、点击下行班次,下一个上行班次在上行班次列表中移到中间位置
  76 + * @param ctrl 内部控制器
  77 + * @param index 班次索引
  78 + * @param isUp 是否上行
  79 + * @private
  80 + */
  81 + var _fun_bcDDViewMove = function(ctrl, index, isUp) {
  82 + // 获取当前点击班次对象
  83 + var oBc;
  84 + if (isUp) {
  85 + oBc = ctrl.internalBcModel.up_bc_list_asc[index];
  86 + } else {
  87 + oBc = ctrl.internalBcModel.down_bc_list_asc[index];
  88 + }
  89 +
  90 + // 找出车次链中的下一个班次索引,没有就undefined
  91 + var nextIndex = undefined;
  92 + var nextBlockBc = undefined;
  93 + var currentBlockBcIndex = undefined;
  94 + angular.forEach(ctrl.internalLpBlockModel[oBc.lpName], function(data, i) {
  95 + if (data.fcsj == oBc.fcsj) {
  96 + currentBlockBcIndex = i;
  97 + }
  98 + });
  99 + if (currentBlockBcIndex != undefined &&
  100 + currentBlockBcIndex < (ctrl.internalLpBlockModel[oBc.lpName].length - 1)) {
  101 + nextBlockBc = ctrl.internalLpBlockModel[oBc.lpName][currentBlockBcIndex + 1];
  102 + nextIndex = nextBlockBc.index;
  103 + }
  104 + // 先删除click标记,再添加
  105 + angular.forEach(ctrl.internalBcModel.up_bc_list_asc, function(data) {
  106 + delete data["isClick"];
  107 + });
  108 + angular.forEach(ctrl.internalBcModel.down_bc_list_asc, function(data) {
  109 + delete data["isClick"];
  110 + });
  111 + oBc.isClick = true;
  112 + if (nextIndex) {
  113 + if (nextBlockBc.isUp) {
  114 + ctrl.internalBcModel.up_bc_list_asc[nextIndex].isClick = true;
  115 + } else {
  116 + ctrl.internalBcModel.down_bc_list_asc[nextIndex].isClick = true;
  117 + }
  118 + }
  119 +
  120 + // 移动,同方向不移动
  121 + var clientHeight = angular.element("#temp").height() - 34;
  122 + if (nextBlockBc && isUp != nextBlockBc.isUp) {
  123 + if (isUp) { // 移动下行
  124 + angular.element(".ttpv_table_scrollbar:eq(1)").animate(
  125 + {scrollTop : nextIndex * 30 - clientHeight / 2}, 400);
  126 + } else { // 移动上行
  127 + angular.element(".ttpv_table_scrollbar:eq(0)").animate(
  128 + {scrollTop : nextIndex * 30 - clientHeight / 2}, 400);
  129 + }
  130 + }
  131 +
  132 + };
  133 +
  134 + /**
  135 + * 刷新内部数据。
  136 + * @param ctrl 内部控制器对象($saTimeTablePreviewCtrl)
  137 + * @private
  138 + */
  139 + var _fun_refreshInternalModel = function(ctrl) {
  140 + // 初始化内部数据
  141 + ctrl.internalBcModel = {
  142 + up_qdz_name : "", // 上行起点站名字
  143 + up_zdz_name : "", // 上行终点站名字
  144 + down_qdz_name : "", // 下行起点站名字
  145 + down_zdz_name : "", // 下行终点站名字
  146 + up_bc_list_asc : [], // 上行班次列表(按照发车时间升序)
  147 + down_bc_list_asc : [] // 下行班次列表(按照发车时间升序)
  148 + };
  149 + ctrl.internalLpBlockModel = {
  150 +
  151 + };
  152 +
  153 + // ngModel传入的数据
  154 + var dataSource = ctrl.ds.bcList;
  155 +
  156 + // 构造上下行班次列表,并确定上下行的首发站点
  157 + angular.forEach(dataSource, function(bcObj) {
  158 + var _internalBcObj = {};
  159 + // 构造内部班次对象
  160 + _internalBcObj.lpName = bcObj.lp.lpName; // 路牌
  161 + _internalBcObj.fcsj = bcObj.fcsj; // 发车时间
  162 + _internalBcObj.ddsj = _fun_WrapTime(bcObj.fcsj).add(bcObj.bcsj, "m").format("HH:mm");
  163 + _internalBcObj.qdzName = bcObj.qdzName; // 起点站名字
  164 + _internalBcObj.zdzName = bcObj.zdzName; // 终点站名字
  165 + _internalBcObj.bcType = bcObj.bcType; // 班次类型
  166 + _internalBcObj.isTs = bcObj.isTS; // 是否停驶
  167 + _internalBcObj.isFb = bcObj.isFB; // 是否分班
  168 + _internalBcObj.remark = bcObj.remark; // 备注
  169 + _internalBcObj._fcno = bcObj.fcno; // 发车顺序号
  170 +
  171 + if (bcObj.xlDir == "0") { // 上行
  172 + ctrl.internalBcModel.up_bc_list_asc.push(_internalBcObj);
  173 + // 确定起点站
  174 + if (ctrl.internalBcModel.up_qdz_name == "") {
  175 + if (bcObj.bcType == "normal") {
  176 + ctrl.internalBcModel.up_qdz_name = bcObj.qdzName;
  177 + }
  178 + }
  179 + // 确定终点站
  180 + if (ctrl.internalBcModel.up_zdz_name == "") {
  181 + if (bcObj.bcType == "normal") {
  182 + ctrl.internalBcModel.up_zdz_name = bcObj.zdzName;
  183 + }
  184 + }
  185 + }
  186 + if (bcObj.xlDir == "1") { // 下行
  187 + ctrl.internalBcModel.down_bc_list_asc.push(_internalBcObj);
  188 + // 确定起点站
  189 + if (ctrl.internalBcModel.down_qdz_name == "") {
  190 + if (bcObj.bcType == "normal") {
  191 + ctrl.internalBcModel.down_qdz_name = bcObj.qdzName;
  192 + }
  193 + }
  194 + // 确定终点站
  195 + if (ctrl.internalBcModel.down_zdz_name == "") {
  196 + if (bcObj.bcType == "normal") {
  197 + ctrl.internalBcModel.down_zdz_name = bcObj.zdzName;
  198 + }
  199 + }
  200 + }
  201 +
  202 + });
  203 +
  204 + // 发车时间升序排序上行班次
  205 + ctrl.internalBcModel.up_bc_list_asc.sort(function(a, b) {
  206 + var a_wrapTime = _fun_WrapTime(a.fcsj);
  207 + var b_wrapTime = _fun_WrapTime(b.fcsj);
  208 +
  209 + // 判定如果发车时间是以00,01,02,03开头的,说明是下一天凌晨的班次,需要加1天判定
  210 + // TODO:以后要配合首班车的发车时间判定
  211 + if (a.fcsj.indexOf("00:") == 0 ||
  212 + a.fcsj.indexOf("01:") == 0 ||
  213 + a.fcsj.indexOf("02:") == 0) {
  214 + a_wrapTime.add(1, "day");
  215 + }
  216 + if (b.fcsj.indexOf("00:") == 0 ||
  217 + b.fcsj.indexOf("01:") == 0 ||
  218 + b.fcsj.indexOf("02:") == 0) {
  219 + b_wrapTime.add(1, "day");
  220 + }
  221 +
  222 + if (a_wrapTime.isBefore(b_wrapTime)) {
  223 + return -1;
  224 + } else if (a_wrapTime.isAfter(b_wrapTime)) {
  225 + return 1;
  226 + } else {
  227 + return 0;
  228 + }
  229 +
  230 + });
  231 + // 发车时间升序排序下行班次
  232 + ctrl.internalBcModel.down_bc_list_asc.sort(function(a, b) {
  233 + var a_wrapTime = _fun_WrapTime(a.fcsj);
  234 + var b_wrapTime = _fun_WrapTime(b.fcsj);
  235 +
  236 + // 判定如果发车时间是以00,01,02,03开头的,说明是下一天凌晨的班次,需要加1天判定
  237 + // TODO:以后要配合首班车的发车时间判定
  238 + if (a.fcsj.indexOf("00:") == 0 ||
  239 + a.fcsj.indexOf("01:") == 0 ||
  240 + a.fcsj.indexOf("02:") == 0) {
  241 + a_wrapTime.add(1, "day");
  242 + }
  243 + if (b.fcsj.indexOf("00:") == 0 ||
  244 + b.fcsj.indexOf("01:") == 0 ||
  245 + b.fcsj.indexOf("02:") == 0) {
  246 + b_wrapTime.add(1, "day");
  247 + }
  248 +
  249 + if (a_wrapTime.isBefore(b_wrapTime)) {
  250 + return -1;
  251 + } else if (a_wrapTime.isAfter(b_wrapTime)) {
  252 + return 1;
  253 + } else {
  254 + return 0;
  255 + }
  256 + });
  257 +
  258 + // 构造路牌block车次链,按照发车顺序排序
  259 + angular.forEach(ctrl.internalBcModel.up_bc_list_asc, function(data, index) {
  260 + if (!ctrl.internalLpBlockModel[data.lpName]) {
  261 + ctrl.internalLpBlockModel[data.lpName] = [];
  262 + }
  263 + ctrl.internalLpBlockModel[data.lpName].push({
  264 + fcsj : data.fcsj,
  265 + isUp : true,
  266 + fcno : data._fcno,
  267 + index : index
  268 + });
  269 + });
  270 + angular.forEach(ctrl.internalBcModel.down_bc_list_asc, function(data, index) {
  271 + if (!ctrl.internalLpBlockModel[data.lpName]) {
  272 + ctrl.internalLpBlockModel[data.lpName] = [];
  273 + }
  274 + ctrl.internalLpBlockModel[data.lpName].push({
  275 + fcsj : data.fcsj,
  276 + isUp : false,
  277 + fcno : data._fcno,
  278 + index : index
  279 + });
  280 + });
  281 + angular.forEach(ctrl.internalLpBlockModel, function(value, key) {
  282 + value.sort(function (a, b) {
  283 + if (a.fcno < b.fcno) {
  284 + return -1;
  285 + } else if (a.fcno > b.fcno) {
  286 + return 1;
  287 + } else {
  288 + return 0;
  289 + }
  290 + });
  291 + });
  292 +
  293 +
  294 + };
  295 +
  296 + return {
  297 + pre : function(scope, element, attr) {
  298 + // TODO:
  299 + },
  300 + post : function(scope, element, attr) {
  301 + // 班次html点击事件
  302 + scope[ctrlAs].$$bcDD_Click = function(index, xlDir) {
  303 + _fun_bcDDViewMove(scope[ctrlAs], index, xlDir);
  304 + };
  305 +
  306 + // 监控ngModel绑定的外部数据源的刷新状态变化
  307 + scope.$watch(
  308 + function() {
  309 + return scope[ctrlAs].ds.refreshInfos;
  310 + },
  311 + function(newValue, oldValue) {
  312 + if (newValue === undefined && oldValue === undefined) {
  313 + return;
  314 + }
  315 + console.log("saTimetable2 refresh");
  316 + _fun_refreshInternalModel(scope[ctrlAs]);
  317 + },
  318 + true
  319 + );
  320 + }
  321 + };
  322 + }
  323 + };
  324 + }
  325 + ]
326 326 );
327 327 \ No newline at end of file
... ...
src/main/resources/static/pages/scheduleApp/module/common/dts2/ttinfotable/saTimeTablePreViewTemplate.html
1   -<style>
2   - .ttpv_detail {
3   - height: 100%;
4   - }
5   - .ttpv_detail .container-fluid {
6   - height: 100%;
7   - margin-left: 0;
8   - }
9   - .ttpv_detail .container-fluid>* {
10   - padding: 0;
11   - }
12   - .ttpv_detail .container-fluid.top-container {
13   - margin-top: 5px;
14   - padding: 0;
15   - }
16   -
17   - .ttpv_detail .detail-panel {
18   - padding: 0;
19   - height: 100%;
20   - border: 1px solid #ddd;
21   - background: #fafafa;
22   - border-radius: 10px !important;
23   - moz-user-select: -moz-none;
24   - -moz-user-select: none;
25   - -o-user-select: none;
26   - -khtml-user-select: none;
27   - -webkit-user-select: none;
28   - -ms-user-select: none;
29   - user-select: none;
30   - }
31   -
32   - .ttpv_detail .detail-panel .detail-wrap {
33   - height: calc(100% - 1px);
34   - padding: 0;
35   -
36   - font-size: 14px;
37   - color: #cccaca;
38   - }
39   -
40   - .ttpv_detail .detail-panel .detail-wrap .detail-title {
41   - margin: 7px 0 5px;
42   - text-indent: 5px;
43   - margin: 0;
44   - height: 31px;
45   - line-height: 31px;
46   - color: #2765A7;
47   - }
48   -
49   - .ttpv_detail .detail-panel .detail-wrap .detail-body {
50   - height: calc(100% - 37px);
51   - background: #fff;
52   - }
53   -
54   - .ttpv_detail .detail-panel .detail-wrap .detail-body .ttpv_table_wrap {
55   - width: 100%;
56   - height: 100%;
57   - border-left: 0;
58   - border-bottom: 0;
59   - overflow: auto;
60   - }
61   -
62   -</style>
63   -
64   -<style>
65   - /** 表格样式 */
66   - .ttpv_table {
67   - position: relative;
68   - padding-top: 34px;
69   - font-size: 13px;
70   - }
71   -
72   - .ttpv_table dl {
73   - display: block;
74   - /*width: 100%;*/
75   - margin: 0;
76   - /*border-bottom: 1px solid;*/
77   - cursor: default;
78   - }
79   - .ttpv_table dl {
80   - font-size: 0;
81   - white-space: nowrap;
82   - }
83   - .ttpv_table dl {
84   - transition: all .1s ease;
85   - }
86   -
87   - .ttpv_table dl dd, .ttpv_table dl dt {
88   - display: inline-block;
89   - white-space: nowrap;
90   - overflow: hidden;
91   - text-overflow: ellipsis;
92   - height: 100%;
93   - line-height: 34px;
94   - border-right: 1px solid;
95   - text-indent: 5px;
96   - }
97   - .ttpv_table dl dd, .ttpv_table dl dt {
98   - border-right-color: #dedede;
99   - font-size: 13px;
100   - /*border-bottom: 1px solid #dedede;*/
101   - border-top: 1px solid #dedede;
102   - text-align: center;
103   - }
104   -
105   - .ttpv_table > .ttpv_table_head {
106   - position: absolute;
107   - top: 0;
108   - height: 34px;
109   - background: #f5f5f5;
110   - /*width: 100%;*/
111   - line-height: 34px;
112   - z-index: 1;
113   - }
114   - .ttpv_table_head dl {
115   - border-bottom: 2px solid #96b9d7;
116   - color: #333333;
117   - height: 34px;
118   - background-color: #f5f5f5;
119   - }
120   - .ttpv_table_head dl dt {
121   - font-weight: normal;
122   - font-size: 12px;
123   - }
124   -
125   - .ttpv_table_head dl dt:nth-of-type(1) {
126   - width: 50px;
127   - height: 34px;
128   - }
129   - .ttpv_table_head dl dt:nth-of-type(2) {
130   - width: 55px;
131   - height: 34px;
132   - }
133   - .ttpv_table_head dl dt:nth-of-type(3) {
134   - width: 120px;
135   - height: 34px;
136   - }
137   - .ttpv_table_head dl dt:nth-of-type(4) {
138   - width: 100px;
139   - height: 34px;
140   - }
141   - .ttpv_table_head dl dt:nth-of-type(5) {
142   - width: 200px;
143   - height: 34px;
144   - }
145   -
146   - .ttpv_table > .ttpv_table_body {
147   - /*width: 100%;*/
148   - position: absolute;
149   - border-bottom: 1px solid #dedede;
150   - }
151   -
152   - .ttpv_table_body dd.ists {
153   - background: #105383 !important;
154   - color: white !important;
155   - }
156   - .ttpv_table_body dd.region {
157   - background: #686d7b !important;
158   - color: white !important;
159   - }
160   - .ttpv_table_body dd.isfb {
161   - background: #adff00 !important;
162   - color: #501a1a !important;
163   - }
164   -
165   - .ttpv_table_body dd.istsClick {
166   - background: linear-gradient(to right,#8baabf,#105383,#808086)!important;
167   - }
168   - .ttpv_table_body dd.regionClick {
169   - background: linear-gradient(to right,#8baabf,#686d7b,#a09997)!important;
170   - }
171   - .ttpv_table_body dd.isfbClick {
172   - background: linear-gradient(to right,#8baabf,#adff00,#a09997)!important;
173   - }
174   -
175   - .ttpv_table_body dl dd:nth-of-type(1) {
176   - width: 50px;
177   - height: 30px;
178   - }
179   - .ttpv_table_body dl dd:nth-of-type(2) {
180   - width: 55px;
181   - height: 30px;
182   - }
183   - .ttpv_table_body dl dd:nth-of-type(3) {
184   - width: 120px;
185   - height: 30px;
186   - text-align: left;
187   - }
188   - .ttpv_table_body dl dd:nth-of-type(4) {
189   - width: 100px;
190   - height: 30px;
191   - }
192   - .ttpv_table_body dl dd:nth-of-type(5) {
193   - width: 200px;
194   - height: 30px;
195   - }
196   -
197   - .ttpv_table_body dd:nth-of-type(1) {
198   - color: #2765A7;
199   - background: #eae8e8;
200   - /*border-bottom: 1px solid #b3b3b3;*/
201   - border-right: 1px solid #b3b3b3;
202   - text-indent: -3px;
203   - }
204   - .ttpv_table_body dd:nth-of-type(n + 2) {
205   - color: #2765A7;
206   - }
207   - .ttpv_table_body dl:hover {
208   - box-shadow: 0 0 4px #656c71;
209   - background: #f5fbff;
210   - }
211   - .ttpv_table_body dl:hover dd:nth-of-type(1) {
212   - background: #fafafa;
213   - background: linear-gradient(to right, #fafafa, #f5fbff);
214   - }
215   -
216   - .isClick {
217   - background: #8baabf!important;
218   - color: #fff!important;
219   - }
220   -
221   -</style>
222   -
223   -<style>
224   - /** 滚动条css样式 */
225   -
226   - .ttpv_table_scrollbar::-webkit-scrollbar {
227   - width: 18px;
228   - height: 18px;
229   - }
230   -
231   - .ttpv_table_scrollbar::-webkit-scrollbar-track, ::-webkit-scrollbar-thumb {
232   - border-radius: 999px;
233   - border: 5px solid transparent;
234   - }
235   -
236   - .ttpv_table_scrollbar::-webkit-scrollbar-track {
237   - box-shadow: 1px 1px 5px rgba(0, 0, 0, .2) inset;
238   - }
239   -
240   - .ttpv_table_scrollbar::-webkit-scrollbar-thumb {
241   - min-height: 20px;
242   - background-clip: content-box;
243   - box-shadow: 0 0 0 5px rgba(0, 0, 0, .2) inset;
244   - }
245   -
246   - .ttpv_table_scrollbar::-webkit-scrollbar-corner {
247   - background: transparent;
248   - }
249   -</style>
250   -
251   -<div class="ttpv_detail">
252   - <div class="container-fluid top-container">
253   - <div class="col-md-12 container-fluid">
254   - <div class="col-md-6" style="height: 100%; padding-right: 3px;">
255   - <div class="detail-panel">
256   - <div class="detail-wrap" >
257   - <h3 class="detail-title">
258   - 上行:
259   - {{$saTimeTablePreviewCtrl.internalBcModel.up_qdz_name}}
260   - <i class="fa fa-angle-double-right" aria-hidden="true"></i>
261   - {{$saTimeTablePreviewCtrl.internalBcModel.up_zdz_name}}
262   - </h3>
263   - <div id="temp" class="detail-body">
264   - <div class="ttpv_table_wrap ttpv_table_scrollbar" sa-tscrolly2 scrclass = ".upFixHead">
265   - <div class="ttpv_table">
266   - <div class="ttpv_table_head upFixHead">
267   - <dl>
268   - <dt>序号</dt>
269   - <dt>路牌</dt>
270   - <dt>发车时间</dt>
271   - <dt>到达时间</dt>
272   - <dt>备注</dt>
273   - </dl>
274   - </div>
275   - <div class="ttpv_table_body">
276   - <dl ng-repeat="bc in $saTimeTablePreviewCtrl.internalBcModel.up_bc_list_asc track by $index"
277   - ng-click="$saTimeTablePreviewCtrl.$$bcDD_Click($index, true)">
278   - <dd>{{$index + 1}}</dd>
279   - <dd ng-class="{isClick : bc.isClick}">
280   - {{bc.lpName}}
281   - </dd>
282   - <dd ng-class="{
283   - ists: (bc.isTs && !bc.isClick),
284   - istsClick: (bc.isTs && bc.isClick),
285   - region: (bc.bcType == 'region' && !bc.isClick),
286   - regionClick : (bc.bcType == 'region' && bc.isClick),
287   - isfb: (bc.isFb && !bc.isClick),
288   - isfbClick : (bc.isFb && bc.isClick),
289   - isClick: bc.isClick}">
290   - {{bc.fcsj}}
291   - <span class="badge"
292   - style="border-radius: 2px !important; background-color: #f9a124;"
293   - ng-show="bc.bcType == 'out'">出场</span>
294   - <span class="badge"
295   - style="border-radius: 2px !important; background-color: #f9a124;"
296   - ng-show="bc.bcType == 'in'">进场</span>
297   - </dd>
298   - <dd ng-class="{isClick : bc.isClick}">
299   - {{bc.ddsj}}
300   - </dd>
301   - <dd ng-class="{isClick : bc.isClick}">{{bc.remark}}</dd>
302   - </dl>
303   - </div>
304   - </div>
305   - </div>
306   - </div>
307   - </div>
308   - </div>
309   - </div>
310   -
311   - <div class="col-md-6" style="height: 100%; padding-left: 3px;">
312   - <div class="detail-panel">
313   - <div class="detail-wrap" >
314   - <h3 class="detail-title">
315   - 下行:
316   - {{$saTimeTablePreviewCtrl.internalBcModel.down_qdz_name}}
317   - <i class="fa fa-angle-double-right" aria-hidden="true"></i>
318   - {{$saTimeTablePreviewCtrl.internalBcModel.down_zdz_name}}
319   - </h3>
320   - <div class="detail-body">
321   - <div class="ttpv_table_wrap ttpv_table_scrollbar" sa-tscrolly2 scrclass = ".downFixHead">
322   - <div class="ttpv_table">
323   - <div class="ttpv_table_head downFixHead">
324   - <dl>
325   - <dt>序号</dt>
326   - <dt>路牌</dt>
327   - <dt>发车时间</dt>
328   - <dt>到达时间</dt>
329   - <dt>备注</dt>
330   - </dl>
331   - </div>
332   - <div class="ttpv_table_body">
333   - <dl ng-repeat="bc in $saTimeTablePreviewCtrl.internalBcModel.down_bc_list_asc track by $index"
334   - ng-click="$saTimeTablePreviewCtrl.$$bcDD_Click($index, false)">
335   - <dd>{{$index + 1}}</dd>
336   - <dd ng-class="{isClick : bc.isClick}">
337   - {{bc.lpName}}
338   - </dd>
339   - <dd ng-class="{
340   - ists: (bc.isTs && !bc.isClick),
341   - istsClick: (bc.isTs && bc.isClick),
342   - region: (bc.bcType == 'region' && !bc.isClick),
343   - regionClick : (bc.bcType == 'region' && bc.isClick),
344   - isfb: (bc.isFb && !bc.isClick),
345   - isfbClick : (bc.isFb && bc.isClick),
346   - isClick: bc.isClick}">
347   - {{bc.fcsj}}
348   - <span class="badge"
349   - style="border-radius: 2px !important; background-color: #f9a124;"
350   - ng-show="bc.bcType == 'out'">出场</span>
351   - <span class="badge"
352   - style="border-radius: 2px !important; background-color: #f9a124;"
353   - ng-show="bc.bcType == 'in'">进场</span>
354   - </dd>
355   - <dd ng-class="{isClick : bc.isClick}">
356   - {{bc.ddsj}}
357   - </dd>
358   - <dd ng-class="{isClick : bc.isClick}">{{bc.remark}}</dd>
359   - </dl>
360   - </div>
361   - </div>
362   - </div>
363   - </div>
364   - </div>
365   - </div>
366   - </div>
367   -
368   - </div>
369   - </div>
370   -</div>
371   -
372   -
373   -
374   -
375   -
376   -
377   -
378   -
379   -
380   -
381   -
  1 +<style>
  2 + .ttpv_detail {
  3 + height: 100%;
  4 + }
  5 + .ttpv_detail .container-fluid {
  6 + height: 100%;
  7 + margin-left: 0;
  8 + }
  9 + .ttpv_detail .container-fluid>* {
  10 + padding: 0;
  11 + }
  12 + .ttpv_detail .container-fluid.top-container {
  13 + margin-top: 5px;
  14 + padding: 0;
  15 + }
  16 +
  17 + .ttpv_detail .detail-panel {
  18 + padding: 0;
  19 + height: 100%;
  20 + border: 1px solid #ddd;
  21 + background: #fafafa;
  22 + border-radius: 10px !important;
  23 + moz-user-select: -moz-none;
  24 + -moz-user-select: none;
  25 + -o-user-select: none;
  26 + -khtml-user-select: none;
  27 + -webkit-user-select: none;
  28 + -ms-user-select: none;
  29 + user-select: none;
  30 + }
  31 +
  32 + .ttpv_detail .detail-panel .detail-wrap {
  33 + height: calc(100% - 1px);
  34 + padding: 0;
  35 +
  36 + font-size: 14px;
  37 + color: #cccaca;
  38 + }
  39 +
  40 + .ttpv_detail .detail-panel .detail-wrap .detail-title {
  41 + margin: 7px 0 5px;
  42 + text-indent: 5px;
  43 + margin: 0;
  44 + height: 31px;
  45 + line-height: 31px;
  46 + color: #2765A7;
  47 + }
  48 +
  49 + .ttpv_detail .detail-panel .detail-wrap .detail-body {
  50 + height: calc(100% - 37px);
  51 + background: #fff;
  52 + }
  53 +
  54 + .ttpv_detail .detail-panel .detail-wrap .detail-body .ttpv_table_wrap {
  55 + width: 100%;
  56 + height: 100%;
  57 + border-left: 0;
  58 + border-bottom: 0;
  59 + overflow: auto;
  60 + }
  61 +
  62 +</style>
  63 +
  64 +<style>
  65 + /** 表格样式 */
  66 + .ttpv_table {
  67 + position: relative;
  68 + padding-top: 34px;
  69 + font-size: 13px;
  70 + }
  71 +
  72 + .ttpv_table dl {
  73 + display: block;
  74 + /*width: 100%;*/
  75 + margin: 0;
  76 + /*border-bottom: 1px solid;*/
  77 + cursor: default;
  78 + }
  79 + .ttpv_table dl {
  80 + font-size: 0;
  81 + white-space: nowrap;
  82 + }
  83 + .ttpv_table dl {
  84 + transition: all .1s ease;
  85 + }
  86 +
  87 + .ttpv_table dl dd, .ttpv_table dl dt {
  88 + display: inline-block;
  89 + white-space: nowrap;
  90 + overflow: hidden;
  91 + text-overflow: ellipsis;
  92 + height: 100%;
  93 + line-height: 34px;
  94 + border-right: 1px solid;
  95 + text-indent: 5px;
  96 + }
  97 + .ttpv_table dl dd, .ttpv_table dl dt {
  98 + border-right-color: #dedede;
  99 + font-size: 13px;
  100 + /*border-bottom: 1px solid #dedede;*/
  101 + border-top: 1px solid #dedede;
  102 + text-align: center;
  103 + }
  104 +
  105 + .ttpv_table > .ttpv_table_head {
  106 + position: absolute;
  107 + top: 0;
  108 + height: 34px;
  109 + background: #f5f5f5;
  110 + /*width: 100%;*/
  111 + line-height: 34px;
  112 + z-index: 1;
  113 + }
  114 + .ttpv_table_head dl {
  115 + border-bottom: 2px solid #96b9d7;
  116 + color: #333333;
  117 + height: 34px;
  118 + background-color: #f5f5f5;
  119 + }
  120 + .ttpv_table_head dl dt {
  121 + font-weight: normal;
  122 + font-size: 12px;
  123 + }
  124 +
  125 + .ttpv_table_head dl dt:nth-of-type(1) {
  126 + width: 50px;
  127 + height: 34px;
  128 + }
  129 + .ttpv_table_head dl dt:nth-of-type(2) {
  130 + width: 55px;
  131 + height: 34px;
  132 + }
  133 + .ttpv_table_head dl dt:nth-of-type(3) {
  134 + width: 120px;
  135 + height: 34px;
  136 + }
  137 + .ttpv_table_head dl dt:nth-of-type(4) {
  138 + width: 100px;
  139 + height: 34px;
  140 + }
  141 + .ttpv_table_head dl dt:nth-of-type(5) {
  142 + width: 200px;
  143 + height: 34px;
  144 + }
  145 +
  146 + .ttpv_table > .ttpv_table_body {
  147 + /*width: 100%;*/
  148 + position: absolute;
  149 + border-bottom: 1px solid #dedede;
  150 + }
  151 +
  152 + .ttpv_table_body dd.ists {
  153 + background: #105383 !important;
  154 + color: white !important;
  155 + }
  156 + .ttpv_table_body dd.region {
  157 + background: #686d7b !important;
  158 + color: white !important;
  159 + }
  160 + .ttpv_table_body dd.isfb {
  161 + background: #adff00 !important;
  162 + color: #501a1a !important;
  163 + }
  164 +
  165 + .ttpv_table_body dd.istsClick {
  166 + background: linear-gradient(to right,#8baabf,#105383,#808086)!important;
  167 + }
  168 + .ttpv_table_body dd.regionClick {
  169 + background: linear-gradient(to right,#8baabf,#686d7b,#a09997)!important;
  170 + }
  171 + .ttpv_table_body dd.isfbClick {
  172 + background: linear-gradient(to right,#8baabf,#adff00,#a09997)!important;
  173 + }
  174 +
  175 + .ttpv_table_body dl dd:nth-of-type(1) {
  176 + width: 50px;
  177 + height: 30px;
  178 + }
  179 + .ttpv_table_body dl dd:nth-of-type(2) {
  180 + width: 55px;
  181 + height: 30px;
  182 + }
  183 + .ttpv_table_body dl dd:nth-of-type(3) {
  184 + width: 120px;
  185 + height: 30px;
  186 + text-align: left;
  187 + }
  188 + .ttpv_table_body dl dd:nth-of-type(4) {
  189 + width: 100px;
  190 + height: 30px;
  191 + }
  192 + .ttpv_table_body dl dd:nth-of-type(5) {
  193 + width: 200px;
  194 + height: 30px;
  195 + }
  196 +
  197 + .ttpv_table_body dd:nth-of-type(1) {
  198 + color: #2765A7;
  199 + background: #eae8e8;
  200 + /*border-bottom: 1px solid #b3b3b3;*/
  201 + border-right: 1px solid #b3b3b3;
  202 + text-indent: -3px;
  203 + }
  204 + .ttpv_table_body dd:nth-of-type(n + 2) {
  205 + color: #2765A7;
  206 + }
  207 + .ttpv_table_body dl:hover {
  208 + box-shadow: 0 0 4px #656c71;
  209 + background: #f5fbff;
  210 + }
  211 + .ttpv_table_body dl:hover dd:nth-of-type(1) {
  212 + background: #fafafa;
  213 + background: linear-gradient(to right, #fafafa, #f5fbff);
  214 + }
  215 +
  216 + .isClick {
  217 + background: #8baabf!important;
  218 + color: #fff!important;
  219 + }
  220 +
  221 +</style>
  222 +
  223 +<style>
  224 + /** 滚动条css样式 */
  225 +
  226 + .ttpv_table_scrollbar::-webkit-scrollbar {
  227 + width: 18px;
  228 + height: 18px;
  229 + }
  230 +
  231 + .ttpv_table_scrollbar::-webkit-scrollbar-track, ::-webkit-scrollbar-thumb {
  232 + border-radius: 999px;
  233 + border: 5px solid transparent;
  234 + }
  235 +
  236 + .ttpv_table_scrollbar::-webkit-scrollbar-track {
  237 + box-shadow: 1px 1px 5px rgba(0, 0, 0, .2) inset;
  238 + }
  239 +
  240 + .ttpv_table_scrollbar::-webkit-scrollbar-thumb {
  241 + min-height: 20px;
  242 + background-clip: content-box;
  243 + box-shadow: 0 0 0 5px rgba(0, 0, 0, .2) inset;
  244 + }
  245 +
  246 + .ttpv_table_scrollbar::-webkit-scrollbar-corner {
  247 + background: transparent;
  248 + }
  249 +</style>
  250 +
  251 +<div class="ttpv_detail">
  252 + <div class="container-fluid top-container">
  253 + <div class="col-md-12 container-fluid">
  254 + <div class="col-md-6" style="height: 100%; padding-right: 3px;">
  255 + <div class="detail-panel">
  256 + <div class="detail-wrap" >
  257 + <h3 class="detail-title">
  258 + 上行:
  259 + {{$saTimeTablePreviewCtrl.internalBcModel.up_qdz_name}}
  260 + <i class="fa fa-angle-double-right" aria-hidden="true"></i>
  261 + {{$saTimeTablePreviewCtrl.internalBcModel.up_zdz_name}}
  262 + </h3>
  263 + <div id="temp" class="detail-body">
  264 + <div class="ttpv_table_wrap ttpv_table_scrollbar" sa-tscrolly2 scrclass = ".upFixHead">
  265 + <div class="ttpv_table">
  266 + <div class="ttpv_table_head upFixHead">
  267 + <dl>
  268 + <dt>序号</dt>
  269 + <dt>路牌</dt>
  270 + <dt>发车时间</dt>
  271 + <dt>到达时间</dt>
  272 + <dt>备注</dt>
  273 + </dl>
  274 + </div>
  275 + <div class="ttpv_table_body">
  276 + <dl ng-repeat="bc in $saTimeTablePreviewCtrl.internalBcModel.up_bc_list_asc track by $index"
  277 + ng-click="$saTimeTablePreviewCtrl.$$bcDD_Click($index, true)">
  278 + <dd>{{$index + 1}}</dd>
  279 + <dd ng-class="{isClick : bc.isClick}">
  280 + {{bc.lpName}}
  281 + </dd>
  282 + <dd ng-class="{
  283 + ists: (bc.isTs && !bc.isClick),
  284 + istsClick: (bc.isTs && bc.isClick),
  285 + region: (bc.bcType == 'region' && !bc.isClick),
  286 + regionClick : (bc.bcType == 'region' && bc.isClick),
  287 + isfb: (bc.isFb && !bc.isClick),
  288 + isfbClick : (bc.isFb && bc.isClick),
  289 + isClick: bc.isClick}">
  290 + {{bc.fcsj}}
  291 + <span class="badge"
  292 + style="border-radius: 2px !important; background-color: #f9a124;"
  293 + ng-show="bc.bcType == 'out'">出场</span>
  294 + <span class="badge"
  295 + style="border-radius: 2px !important; background-color: #f9a124;"
  296 + ng-show="bc.bcType == 'in'">进场</span>
  297 + </dd>
  298 + <dd ng-class="{isClick : bc.isClick}">
  299 + {{bc.ddsj}}
  300 + </dd>
  301 + <dd ng-class="{isClick : bc.isClick}">{{bc.remark}}</dd>
  302 + </dl>
  303 + </div>
  304 + </div>
  305 + </div>
  306 + </div>
  307 + </div>
  308 + </div>
  309 + </div>
  310 +
  311 + <div class="col-md-6" style="height: 100%; padding-left: 3px;">
  312 + <div class="detail-panel">
  313 + <div class="detail-wrap" >
  314 + <h3 class="detail-title">
  315 + 下行:
  316 + {{$saTimeTablePreviewCtrl.internalBcModel.down_qdz_name}}
  317 + <i class="fa fa-angle-double-right" aria-hidden="true"></i>
  318 + {{$saTimeTablePreviewCtrl.internalBcModel.down_zdz_name}}
  319 + </h3>
  320 + <div class="detail-body">
  321 + <div class="ttpv_table_wrap ttpv_table_scrollbar" sa-tscrolly2 scrclass = ".downFixHead">
  322 + <div class="ttpv_table">
  323 + <div class="ttpv_table_head downFixHead">
  324 + <dl>
  325 + <dt>序号</dt>
  326 + <dt>路牌</dt>
  327 + <dt>发车时间</dt>
  328 + <dt>到达时间</dt>
  329 + <dt>备注</dt>
  330 + </dl>
  331 + </div>
  332 + <div class="ttpv_table_body">
  333 + <dl ng-repeat="bc in $saTimeTablePreviewCtrl.internalBcModel.down_bc_list_asc track by $index"
  334 + ng-click="$saTimeTablePreviewCtrl.$$bcDD_Click($index, false)">
  335 + <dd>{{$index + 1}}</dd>
  336 + <dd ng-class="{isClick : bc.isClick}">
  337 + {{bc.lpName}}
  338 + </dd>
  339 + <dd ng-class="{
  340 + ists: (bc.isTs && !bc.isClick),
  341 + istsClick: (bc.isTs && bc.isClick),
  342 + region: (bc.bcType == 'region' && !bc.isClick),
  343 + regionClick : (bc.bcType == 'region' && bc.isClick),
  344 + isfb: (bc.isFb && !bc.isClick),
  345 + isfbClick : (bc.isFb && bc.isClick),
  346 + isClick: bc.isClick}">
  347 + {{bc.fcsj}}
  348 + <span class="badge"
  349 + style="border-radius: 2px !important; background-color: #f9a124;"
  350 + ng-show="bc.bcType == 'out'">出场</span>
  351 + <span class="badge"
  352 + style="border-radius: 2px !important; background-color: #f9a124;"
  353 + ng-show="bc.bcType == 'in'">进场</span>
  354 + </dd>
  355 + <dd ng-class="{isClick : bc.isClick}">
  356 + {{bc.ddsj}}
  357 + </dd>
  358 + <dd ng-class="{isClick : bc.isClick}">{{bc.remark}}</dd>
  359 + </dl>
  360 + </div>
  361 + </div>
  362 + </div>
  363 + </div>
  364 + </div>
  365 + </div>
  366 + </div>
  367 +
  368 + </div>
  369 + </div>
  370 +</div>
  371 +
  372 +
  373 +
  374 +
  375 +
  376 +
  377 +
  378 +
  379 +
  380 +
  381 +
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/lp_change.html
... ... @@ -389,21 +389,20 @@
389 389 rightIdx = rightIdx.substr(0, rightIdx.length - 1);
390 390  
391 391 var type = $(this).data('type');
  392 + reLoadCurrPageData();
392 393 gb_common.$post('/realSchedule/lpChangeMulti', {leftIdx: leftIdx, rightIdx: rightIdx, type: type}, function (rs) {
393 394 console.log('rs', rs);
394   - debugger
395 395 notify_succ("操作成功!!");
396 396 if(rs.ts)
397 397 gb_schedule_table.updateSchedule(rs.ts);
398 398  
399   - reLoadCurrPageData();
  399 +
400 400  
401 401 });
402 402 });
403 403  
404 404  
405 405 function reLoadCurrPageData(){
406   - debugger
407 406 $('[name=lineSelect]', modal).each(function () {
408 407 var array = gb_common.get_vals(gb_schedule_table.findScheduleByLine($(this).val())).sort(gb_schedule_table.schedule_sort);
409 408 //按路牌分组
... ...