Commit 66e8a7cf950624f63799a57bb9d6eb21e8ede13d

Authored by 游瑞烽
2 parents 27edb22b 5aff71c2

重置密码,添加用户和修改密码是前端加密

Showing 26 changed files with 491 additions and 146 deletions
src/main/java/com/bsth/controller/calc/CalcExportController.java
@@ -158,10 +158,14 @@ public class CalcExportController { @@ -158,10 +158,14 @@ public class CalcExportController {
158 if(map.get("fgsdmSing")!=null){ 158 if(map.get("fgsdmSing")!=null){
159 fgsdmSing=map.get("fgsdmSing").toString().trim(); 159 fgsdmSing=map.get("fgsdmSing").toString().trim();
160 } 160 }
  161 + String sfdc="";
  162 + if(map.get("sfdc")!=null){
  163 + sfdc=map.get("sfdc").toString().trim();
  164 + }
161 165
162 Map<String, Object> resMap = new HashMap<String, Object>(); 166 Map<String, Object> resMap = new HashMap<String, Object>();
163 List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>(); 167 List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
164 - List<Map<String, Object>> list = clacMixService.singledatatj(line, startDate, endDate, tjtype, cont, gsdmSing, fgsdmSing); 168 + List<Map<String, Object>> list = clacMixService.singledatatj(line, startDate, endDate, tjtype, cont, gsdmSing, fgsdmSing, sfdc);
165 169
166 Map<String, Object> temp = new HashMap<String, Object>(); 170 Map<String, Object> temp = new HashMap<String, Object>();
167 temp.put("i", "序号"); 171 temp.put("i", "序号");
src/main/java/com/bsth/controller/calc/CalcMixController.java
@@ -81,7 +81,11 @@ public class CalcMixController { @@ -81,7 +81,11 @@ public class CalcMixController {
81 if(map.get("fgsdmSing")!=null){ 81 if(map.get("fgsdmSing")!=null){
82 fgsdmSing=map.get("fgsdmSing").toString().trim(); 82 fgsdmSing=map.get("fgsdmSing").toString().trim();
83 } 83 }
84 - return service.singledatatj(line, startDate, endDate, tjtype, cont, gsdmSing, fgsdmSing); 84 + String sfdc="";
  85 + if(map.get("sfdc")!=null){
  86 + sfdc=map.get("sfdc").toString().trim();
  87 + }
  88 + return service.singledatatj(line, startDate, endDate, tjtype, cont, gsdmSing, fgsdmSing, sfdc);
85 } 89 }
86 90
87 } 91 }
src/main/java/com/bsth/controller/sys/RoleController.java
@@ -68,4 +68,14 @@ public class RoleController extends BaseController&lt;Role, Integer&gt;{ @@ -68,4 +68,14 @@ public class RoleController extends BaseController&lt;Role, Integer&gt;{
68 public Map<String, Object> roleInfo(@RequestParam Integer id){ 68 public Map<String, Object> roleInfo(@RequestParam Integer id){
69 return roleService.roleInfo(id); 69 return roleService.roleInfo(id);
70 } 70 }
  71 +
  72 + /**
  73 + * 检查操作合法性 操作的是否是下级角色
  74 + * @param operationRoleId 下级角色Id
  75 + * @return
  76 + */
  77 + @RequestMapping(value = "/checkOperationLegality")
  78 + public boolean checkOperationLegality(@RequestParam Integer operationRoleId){
  79 + return roleService.checkOperationLegality(operationRoleId);
  80 + }
71 } 81 }
src/main/java/com/bsth/controller/sys/UserController.java
@@ -260,6 +260,15 @@ public class UserController extends BaseController&lt;SysUser, Integer&gt; { @@ -260,6 +260,15 @@ public class UserController extends BaseController&lt;SysUser, Integer&gt; {
260 public String changePWD(@RequestParam String oldPWD, @RequestParam String newPWD, @RequestParam String cnewPWD) { 260 public String changePWD(@RequestParam String oldPWD, @RequestParam String newPWD, @RequestParam String cnewPWD) {
261 SysUser sysUser = SecurityUtils.getCurrentUser(); 261 SysUser sysUser = SecurityUtils.getCurrentUser();
262 String msg = ""; 262 String msg = "";
  263 +
  264 + //解密RSA
  265 + try{
  266 + oldPWD = (RSAUtils.decryptBase64(oldPWD));
  267 + newPWD = (RSAUtils.decryptBase64(newPWD));
  268 + cnewPWD = (RSAUtils.decryptBase64(cnewPWD));
  269 + }catch (RuntimeException e) {
  270 + return "网络延迟,解密失败,请重新添加!";
  271 + }
263 if (new BCryptPasswordEncoder(4).matches(oldPWD, sysUser.getPassword())) { 272 if (new BCryptPasswordEncoder(4).matches(oldPWD, sysUser.getPassword())) {
264 if (oldPWD.equals(newPWD)) { 273 if (oldPWD.equals(newPWD)) {
265 msg = "新密码不能跟原始密码一样!"; 274 msg = "新密码不能跟原始密码一样!";
@@ -282,8 +291,16 @@ public class UserController extends BaseController&lt;SysUser, Integer&gt; { @@ -282,8 +291,16 @@ public class UserController extends BaseController&lt;SysUser, Integer&gt; {
282 return sysUserService.register(u); 291 return sysUserService.register(u);
283 } 292 }
284 293
  294 + // 查询用户下所有下级角色
285 @RequestMapping(value = "/all_distinct") 295 @RequestMapping(value = "/all_distinct")
286 public List<SysUser> findAll_distinct() { 296 public List<SysUser> findAll_distinct() {
287 return sysUserService.findAll_distinct(); 297 return sysUserService.findAll_distinct();
288 } 298 }
  299 +
  300 + // 重置密码
  301 + @RequestMapping(value = "/resetPassword", method = RequestMethod.POST)
  302 + public Map<String, Object> resetPassword(@RequestParam Integer id) {
  303 + return sysUserService.resetPassword(id);
  304 + }
  305 +
289 } 306 }
src/main/java/com/bsth/data/ThreadMonotor.java
@@ -2,6 +2,9 @@ package com.bsth.data; @@ -2,6 +2,9 @@ package com.bsth.data;
2 2
3 import com.bsth.data.gpsdata_v2.DataHandleProcess; 3 import com.bsth.data.gpsdata_v2.DataHandleProcess;
4 import com.bsth.data.gpsdata_v2.thread.GpsDataLoaderThread; 4 import com.bsth.data.gpsdata_v2.thread.GpsDataLoaderThread;
  5 +
  6 +import org.slf4j.Logger;
  7 +import org.slf4j.LoggerFactory;
5 import org.springframework.stereotype.Component; 8 import org.springframework.stereotype.Component;
6 9
7 /** 10 /**
@@ -9,11 +12,15 @@ import org.springframework.stereotype.Component; @@ -9,11 +12,15 @@ import org.springframework.stereotype.Component;
9 */ 12 */
10 @Component 13 @Component
11 public class ThreadMonotor extends Thread{ 14 public class ThreadMonotor extends Thread{
  15 +
  16 + Logger logger = LoggerFactory.getLogger(this.getClass());
12 17
13 @Override 18 @Override
14 public void run() { 19 public void run() {
15 //切换到备用的网关实时GPS对照数据 20 //切换到备用的网关实时GPS对照数据
16 - if(DataHandleProcess.isBlock())  
17 - GpsDataLoaderThread.setFlag(-1); 21 + if(DataHandleProcess.isBlock()) {
  22 + GpsDataLoaderThread.setFlag(-1);
  23 + logger.error("切换到备用GPS数据源");
  24 + }
18 } 25 }
19 } 26 }
20 \ No newline at end of file 27 \ No newline at end of file
src/main/java/com/bsth/data/gpsdata_v2/DataHandleProcess.java
@@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSON; @@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSON;
4 import com.bsth.data.gpsdata_v2.cache.GpsCacheData; 4 import com.bsth.data.gpsdata_v2.cache.GpsCacheData;
5 import com.bsth.data.gpsdata_v2.entity.GpsEntity; 5 import com.bsth.data.gpsdata_v2.entity.GpsEntity;
6 import com.bsth.data.gpsdata_v2.handlers.*; 6 import com.bsth.data.gpsdata_v2.handlers.*;
  7 +import com.bsth.email.SendEmailController;
  8 +import com.bsth.email.entity.EmailBean;
7 import com.google.common.collect.ArrayListMultimap; 9 import com.google.common.collect.ArrayListMultimap;
8 import org.apache.commons.lang3.StringUtils; 10 import org.apache.commons.lang3.StringUtils;
9 import org.slf4j.Logger; 11 import org.slf4j.Logger;
@@ -15,6 +17,8 @@ import java.util.*; @@ -15,6 +17,8 @@ import java.util.*;
15 import java.util.concurrent.CountDownLatch; 17 import java.util.concurrent.CountDownLatch;
16 import java.util.concurrent.ExecutorService; 18 import java.util.concurrent.ExecutorService;
17 import java.util.concurrent.Executors; 19 import java.util.concurrent.Executors;
  20 +import java.util.concurrent.ThreadFactory;
  21 +import java.util.concurrent.TimeUnit;
18 22
19 /** 23 /**
20 * 实时信号数据处理 24 * 实时信号数据处理
@@ -37,13 +41,27 @@ public class DataHandleProcess { @@ -37,13 +41,27 @@ public class DataHandleProcess {
37 ReverseRouteProcess reverseRouteProcess; 41 ReverseRouteProcess reverseRouteProcess;
38 @Autowired 42 @Autowired
39 GpsRealData gpsRealData; 43 GpsRealData gpsRealData;
  44 + // 发送邮件
  45 + @Autowired
  46 + private SendEmailController sendEmailController;
40 47
41 48
42 static Logger logger = LoggerFactory.getLogger(DataHandleProcess.class); 49 static Logger logger = LoggerFactory.getLogger(DataHandleProcess.class);
43 50
44 final static int POOL_SIZE = 20; 51 final static int POOL_SIZE = 20;
45 52
46 - static ExecutorService threadPool = Executors.newFixedThreadPool(POOL_SIZE + 1); 53 + static ExecutorService threadPool = Executors.newFixedThreadPool(POOL_SIZE + 1, new ThreadFactory() {
  54 +
  55 + @Override
  56 + public Thread newThread(Runnable r) {
  57 + // TODO Auto-generated method stub
  58 + Thread t = new Thread(r);
  59 + t.setName("GPSProcessor");
  60 +
  61 + return t;
  62 + }
  63 +
  64 + });
47 public static CountDownLatch count; 65 public static CountDownLatch count;
48 66
49 static long lastTime; 67 static long lastTime;
@@ -51,7 +69,22 @@ public class DataHandleProcess { @@ -51,7 +69,22 @@ public class DataHandleProcess {
51 public static boolean isBlock() { 69 public static boolean isBlock() {
52 return System.currentTimeMillis() - lastTime > 1000 * 30; 70 return System.currentTimeMillis() - lastTime > 1000 * 30;
53 } 71 }
54 - 72 +
  73 + private void shutdownAndAwaitTermination(ExecutorService pool) {
  74 + pool.shutdown();
  75 + try {
  76 + if (!pool.awaitTermination(500, TimeUnit.MILLISECONDS)) {
  77 + pool.shutdownNow();
  78 + }
  79 + if (!pool.awaitTermination(500, TimeUnit.MILLISECONDS)) {
  80 + logger.error("线程池无法正常终止");
  81 + }
  82 + } catch (InterruptedException e) {
  83 + pool.shutdown();
  84 + Thread.currentThread().interrupt();
  85 + }
  86 + }
  87 +
55 public void handle(List<GpsEntity> list) { 88 public void handle(List<GpsEntity> list) {
56 try { 89 try {
57 if (list.size() == 0) 90 if (list.size() == 0)
@@ -85,7 +118,32 @@ public class DataHandleProcess { @@ -85,7 +118,32 @@ public class DataHandleProcess {
85 118
86 119
87 //等待子线程结束 120 //等待子线程结束
88 - count.await(); 121 + boolean isNormal = count.await(5, TimeUnit.SECONDS);
  122 + if (!isNormal) {
  123 + try {
  124 + shutdownAndAwaitTermination(threadPool);
  125 + threadPool = Executors.newFixedThreadPool(POOL_SIZE + 1, new ThreadFactory() {
  126 +
  127 + @Override
  128 + public Thread newThread(Runnable r) {
  129 + // TODO Auto-generated method stub
  130 + Thread t = new Thread(r);
  131 + t.setName("GPSProcessor");
  132 +
  133 + return t;
  134 + }
  135 +
  136 + });
  137 + //发送邮件
  138 + EmailBean mail = new EmailBean();
  139 + mail.setSubject("线调GPS处理");
  140 + mail.setContent("GPS处理超时,检查线程栈文件信息<br/>");
  141 + sendEmailController.sendMail("113252620@qq.com", mail);
  142 + logger.info("DataHandlerProcess:邮件发送成功!");
  143 + } catch (Exception e){
  144 + logger.error("DataHandlerProcess:邮件发送失败!",e);
  145 + }
  146 + }
89 147
90 //加入实时gps对照 148 //加入实时gps对照
91 for (GpsEntity gps : list) 149 for (GpsEntity gps : list)
@@ -115,6 +173,7 @@ public class DataHandleProcess { @@ -115,6 +173,7 @@ public class DataHandleProcess {
115 Collections.sort(list, comp); 173 Collections.sort(list, comp);
116 GpsEntity gps; 174 GpsEntity gps;
117 for(int i = 0,len = list.size(); i< len ;i ++){ 175 for(int i = 0,len = list.size(); i< len ;i ++){
  176 + if (Thread.currentThread().isInterrupted()) break;
118 gps = list.get(i); 177 gps = list.get(i);
119 178
120 try { 179 try {
src/main/java/com/bsth/data/gpsdata_v2/load/GatewayHttpLoader.java
@@ -75,7 +75,7 @@ public class GatewayHttpLoader implements ApplicationContextAware{ @@ -75,7 +75,7 @@ public class GatewayHttpLoader implements ApplicationContextAware{
75 while ((str = br.readLine()) != null) 75 while ((str = br.readLine()) != null)
76 sb.append(str); 76 sb.append(str);
77 77
78 - logger.info("gps:" + sb.toString()); 78 + logger.debug("gps:" + sb.toString());
79 list = JSON.parseArray(JSON.parseObject(sb.toString()).getString("data"), GpsEntity.class); 79 list = JSON.parseArray(JSON.parseObject(sb.toString()).getString("data"), GpsEntity.class);
80 //过滤掉无效的点位 80 //过滤掉无效的点位
81 list = GpsDataUtils.clearInvalid(list); 81 list = GpsDataUtils.clearInvalid(list);
src/main/java/com/bsth/repository/calc/CalcWaybillRepository.java
@@ -66,7 +66,10 @@ public interface CalcWaybillRepository extends BaseRepository&lt;CalcWaybill, Integ @@ -66,7 +66,10 @@ public interface CalcWaybillRepository extends BaseRepository&lt;CalcWaybill, Integ
66 @Query(value="select DISTINCT c from CalcWaybill c where c.xl like %?1% and c.rqStr between ?2 and ?3 and c.gsdm like %?4% and c.fgsdm like %?5% and CONCAT(sGh,'/',sName) like %?6% order by c.xl") 66 @Query(value="select DISTINCT c from CalcWaybill c where c.xl like %?1% and c.rqStr between ?2 and ?3 and c.gsdm like %?4% and c.fgsdm like %?5% and CONCAT(sGh,'/',sName) like %?6% order by c.xl")
67 List<CalcWaybill> scheduleBySpy(String line,String date,String date2,String gsdm,String fgsdm,String spy); 67 List<CalcWaybill> scheduleBySpy(String line,String date,String date2,String gsdm,String fgsdm,String spy);
68 //按照时间段统计,公司下线路 (车辆自编号) 68 //按照时间段统计,公司下线路 (车辆自编号)
69 - @Query(value="select DISTINCT c from CalcWaybill c where c.xl like %?1% and c.rqStr between ?2 and ?3 and c.gsdm like %?4% and c.fgsdm like %?5% and cl like %?6% order by c.xl") 69 + @Query(value="select DISTINCT c from CalcWaybill c where c.xl like %?1% and c.rqStr between ?2 and ?3 and c.gsdm like %?4% and c.fgsdm like %?5% and c.cl like %?6% order by c.xl")
70 List<CalcWaybill> scheduleByZbh(String line,String date,String date2,String gsdm,String fgsdm,String zbh); 70 List<CalcWaybill> scheduleByZbh(String line,String date,String date2,String gsdm,String fgsdm,String zbh);
  71 + @Query(value="select DISTINCT c from CalcWaybill c where c.xl like %?1% and c.rqStr between ?2 and ?3 and c.gsdm like %?4% and c.fgsdm like %?5% and c.cl like %?6%"
  72 + + " and c.cl in (select s.carCode from Cars s where s.sfdc = ?7) order by c.xl")
  73 + List<CalcWaybill> scheduleByZbh(String line,String date,String date2,String gsdm,String fgsdm,String zbh,Boolean sfdc);
71 74
72 } 75 }
src/main/java/com/bsth/service/calc/CalcMixService.java
@@ -10,6 +10,6 @@ public interface CalcMixService { @@ -10,6 +10,6 @@ public interface CalcMixService {
10 10
11 List<Map<String, Object>> calcjsyspy(String line, String startDate, String endDate, String cont, String empnames, String gsdmManth, String fgsdmManth); 11 List<Map<String, Object>> calcjsyspy(String line, String startDate, String endDate, String cont, String empnames, String gsdmManth, String fgsdmManth);
12 12
13 - List<Map<String, Object>> singledatatj(String line, String startDate, String endDate, String tjtype, String cont, String gsdmSing, String fgsdmSing); 13 + List<Map<String, Object>> singledatatj(String line, String startDate, String endDate, String tjtype, String cont, String gsdmSing, String fgsdmSing, String sfdc);
14 14
15 } 15 }
src/main/java/com/bsth/service/calc/impl/CalcIntervalServiceImpl.java
@@ -123,9 +123,11 @@ public class CalcIntervalServiceImpl extends BaseServiceImpl&lt;CalcInterval,Intege @@ -123,9 +123,11 @@ public class CalcIntervalServiceImpl extends BaseServiceImpl&lt;CalcInterval,Intege
123 } 123 }
124 }); 124 });
125 }else{ 125 }else{
  126 + //统计信息中需要查询所有班次
  127 +// and djg_all >0
126 String sql="select gsbm,fgsbm,xl_bm,xl_name,SUM(bcs) as bcs,MAX(id) as id,SUM(djg_all) as djgAll,SUM(djg_gf) as djgGf," 128 String sql="select gsbm,fgsbm,xl_bm,xl_name,SUM(bcs) as bcs,MAX(id) as id,SUM(djg_all) as djgAll,SUM(djg_gf) as djgGf,"
127 + "SUM(djg_dg) as djgDg,SUM(djg_zgf) as djgZgf,SUM(djg_wgf) as djgWgf,MAX(djg_time) as djgTime " 129 + "SUM(djg_dg) as djgDg,SUM(djg_zgf) as djgZgf,SUM(djg_wgf) as djgWgf,MAX(djg_time) as djgTime "
128 - + "from bsth_c_calc_interval where date>= '"+sDate+"' and date<='"+eDate+"' and level <> 'D' and djg_all >0 "; 130 + + "from bsth_c_calc_interval where date>= '"+sDate+"' and date<='"+eDate+"' and level <> 'D' ";
129 if(line.equals("")){ 131 if(line.equals("")){
130 if(fgs.equals("")){ 132 if(fgs.equals("")){
131 sql +=" and gsbm = '"+gs+"'"; 133 sql +=" and gsbm = '"+gs+"'";
@@ -150,12 +152,12 @@ public class CalcIntervalServiceImpl extends BaseServiceImpl&lt;CalcInterval,Intege @@ -150,12 +152,12 @@ public class CalcIntervalServiceImpl extends BaseServiceImpl&lt;CalcInterval,Intege
150 m.put("id", rs.getInt("id")); 152 m.put("id", rs.getInt("id"));
151 int djgAll=rs.getInt("djgAll"); 153 int djgAll=rs.getInt("djgAll");
152 int bcs=rs.getInt("bcs"); 154 int bcs=rs.getInt("bcs");
153 - //全日发生率 (大间隔次数/全日班次数 155 + //万班次发生率 (大间隔次数/全日班次数*10000
154 if(bcs>0){ 156 if(bcs>0){
155 - double fsl=(djgAll*1.0)/(bcs*1.0)*100;  
156 - m.put("fsl", df.format(fsl)+"%"); 157 + double fsl=(djgAll*1.0)/(bcs*1.0)*10000;
  158 + m.put("fsl", df.format(fsl));
157 }else{ 159 }else{
158 - m.put("fsl", "0.0%"); 160 + m.put("fsl", "0.0");
159 } 161 }
160 m.put("djgAll", rs.getString("djgAll")); 162 m.put("djgAll", rs.getString("djgAll"));
161 m.put("djgGf", rs.getString("djgGf")); 163 m.put("djgGf", rs.getString("djgGf"));
@@ -243,12 +245,12 @@ public class CalcIntervalServiceImpl extends BaseServiceImpl&lt;CalcInterval,Intege @@ -243,12 +245,12 @@ public class CalcIntervalServiceImpl extends BaseServiceImpl&lt;CalcInterval,Intege
243 m.put("djgDg", t.getDjgDg()); 245 m.put("djgDg", t.getDjgDg());
244 int djgAll=t.getDjgAll(); 246 int djgAll=t.getDjgAll();
245 int bcs=t.getBcs(); 247 int bcs=t.getBcs();
246 - //全日发生率 (大间隔次数/全日班次数 248 + //全日发生率 (大间隔次数/全日班次数*10000) 万班次发生率
247 if(bcs>0){ 249 if(bcs>0){
248 - double fsl=(djgAll*1.0)/(bcs*1.0)*100;  
249 - m.put("fsl", df.format(fsl)+"%"); 250 + double fsl=(djgAll*1.0)/(bcs*1.0)*10000;
  251 + m.put("fsl", df.format(fsl));
250 }else{ 252 }else{
251 - m.put("fsl", "0.0%"); 253 + m.put("fsl", "0.0");
252 } 254 }
253 m.put("bcs", t.getBcs()); 255 m.put("bcs", t.getBcs());
254 m.put("djgTime", t.getDjgTime()); 256 m.put("djgTime", t.getDjgTime());
src/main/java/com/bsth/service/calc/impl/CalcMixServiceImpl.java
@@ -160,7 +160,7 @@ public class CalcMixServiceImpl implements CalcMixService { @@ -160,7 +160,7 @@ public class CalcMixServiceImpl implements CalcMixService {
160 public List<Map<String, Object>> singledatatj(String line, 160 public List<Map<String, Object>> singledatatj(String line,
161 String date, String date2, 161 String date, String date2,
162 String tjtype, String cont, 162 String tjtype, String cont,
163 - String gsdm, String fgsdm) { 163 + String gsdm, String fgsdm, String sfdc) {
164 164
165 List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>(); 165 List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
166 List<CalcWaybill> list = null; 166 List<CalcWaybill> list = null;
@@ -174,7 +174,13 @@ public class CalcMixServiceImpl implements CalcMixService { @@ -174,7 +174,13 @@ public class CalcMixServiceImpl implements CalcMixService {
174 list = calcRepository.scheduleBySpy(line, date, date2, gsdm, fgsdm, cont); 174 list = calcRepository.scheduleBySpy(line, date, date2, gsdm, fgsdm, cont);
175 } else if("车辆自编号".equals(tjtype)){ 175 } else if("车辆自编号".equals(tjtype)){
176 flag = 3; 176 flag = 3;
177 - list = calcRepository.scheduleByZbh(line, date, date2, gsdm, fgsdm, cont); 177 + if("1".equals(sfdc)){
  178 + list = calcRepository.scheduleByZbh(line, date, date2, gsdm, fgsdm, cont, true);
  179 + } else if("0".equals(sfdc)){
  180 + list = calcRepository.scheduleByZbh(line, date, date2, gsdm, fgsdm, cont, false);
  181 + } else {
  182 + list = calcRepository.scheduleByZbh(line, date, date2, gsdm, fgsdm, cont);
  183 + }
178 } 184 }
179 185
180 List<CalcWaybill> calcList = new ArrayList<CalcWaybill>(); 186 List<CalcWaybill> calcList = new ArrayList<CalcWaybill>();
@@ -267,7 +273,7 @@ public class CalcMixServiceImpl implements CalcMixService { @@ -267,7 +273,7 @@ public class CalcMixServiceImpl implements CalcMixService {
267 + linesql 273 + linesql
268 + " union" 274 + " union"
269 + " SELECT id,xlbm,nbbm,jsy,cdl as jzl,hd as yh,sh as sh,fgsdm FROM bsth_c_dlb" 275 + " SELECT id,xlbm,nbbm,jsy,cdl as jzl,hd as yh,sh as sh,fgsdm FROM bsth_c_dlb"
270 - + " WHERE rq >= '"+date2+"' and rq <= '"+date2+"'" 276 + + " WHERE rq >= '"+date+"' and rq <= '"+date2+"'"
271 + linesql; 277 + linesql;
272 List<Singledata> listNy = jdbcTemplate.query(nysql, new RowMapper<Singledata>() { 278 List<Singledata> listNy = jdbcTemplate.query(nysql, new RowMapper<Singledata>() {
273 @Override 279 @Override
src/main/java/com/bsth/service/gps/GpsServiceImpl.java
@@ -13,6 +13,7 @@ import java.text.DecimalFormat; @@ -13,6 +13,7 @@ import java.text.DecimalFormat;
13 import java.text.ParseException; 13 import java.text.ParseException;
14 import java.text.SimpleDateFormat; 14 import java.text.SimpleDateFormat;
15 import java.util.ArrayList; 15 import java.util.ArrayList;
  16 +import java.util.Arrays;
16 import java.util.Calendar; 17 import java.util.Calendar;
17 import java.util.Collections; 18 import java.util.Collections;
18 import java.util.Comparator; 19 import java.util.Comparator;
@@ -1173,7 +1174,7 @@ public class GpsServiceImpl implements GpsService { @@ -1173,7 +1174,7 @@ public class GpsServiceImpl implements GpsService {
1173 } 1174 }
1174 //过滤数据 1175 //过滤数据
1175 for (SafeDriv sd : list) { 1176 for (SafeDriv sd : list) {
1176 - if (fieldEquals(fs, sd, map)) 1177 + if (isSpecialLines(sd, map) && fieldEquals(fs, sd, map))
1177 rs.add(sd); 1178 rs.add(sd);
1178 } 1179 }
1179 1180
@@ -1294,6 +1295,20 @@ public class GpsServiceImpl implements GpsService { @@ -1294,6 +1295,20 @@ public class GpsServiceImpl implements GpsService {
1294 } 1295 }
1295 }); 1296 });
1296 } 1297 }
  1298 +
  1299 + /**
  1300 + *
  1301 + * @param sd
  1302 + * @param map
  1303 + * @return
  1304 + */
  1305 + public boolean isSpecialLines(SafeDriv sd, Map<String, Object> map) {
  1306 + String lines = (String)map.get("lines");
  1307 + if (lines == null) lines = "";
  1308 +
  1309 + if (Arrays.asList(lines.split(",")).contains(sd.getXlbm())) return true;
  1310 + return false;
  1311 + }
1297 1312
1298 public boolean fieldEquals(List<Field> fs, Object obj, Map<String, Object> map) { 1313 public boolean fieldEquals(List<Field> fs, Object obj, Map<String, Object> map) {
1299 try { 1314 try {
src/main/java/com/bsth/service/sys/RoleService.java
1 package com.bsth.service.sys; 1 package com.bsth.service.sys;
2 2
3 -import java.util.List;  
4 -import java.util.Map;  
5 -  
6 import com.bsth.entity.sys.Role; 3 import com.bsth.entity.sys.Role;
7 -import com.bsth.entity.sys.SysUser;  
8 import com.bsth.service.BaseService; 4 import com.bsth.service.BaseService;
9 5
  6 +import java.util.List;
  7 +import java.util.Map;
  8 +
10 public interface RoleService extends BaseService<Role, Integer>{ 9 public interface RoleService extends BaseService<Role, Integer>{
11 10
12 Map<String, Object> findSubordinate(); 11 Map<String, Object> findSubordinate();
@@ -18,4 +17,6 @@ public interface RoleService extends BaseService&lt;Role, Integer&gt;{ @@ -18,4 +17,6 @@ public interface RoleService extends BaseService&lt;Role, Integer&gt;{
18 Map<String, Object> roleInfo(Integer id); 17 Map<String, Object> roleInfo(Integer id);
19 18
20 List<Role> findAllByIds(String ids); 19 List<Role> findAllByIds(String ids);
  20 +
  21 + boolean checkOperationLegality(Integer operationRoleId);
21 } 22 }
src/main/java/com/bsth/service/sys/SysUserService.java
@@ -2,6 +2,7 @@ package com.bsth.service.sys; @@ -2,6 +2,7 @@ package com.bsth.service.sys;
2 2
3 import com.bsth.entity.sys.SysUser; 3 import com.bsth.entity.sys.SysUser;
4 import com.bsth.service.BaseService; 4 import com.bsth.service.BaseService;
  5 +import org.springframework.web.bind.annotation.RequestParam;
5 6
6 import java.util.List; 7 import java.util.List;
7 import java.util.Map; 8 import java.util.Map;
@@ -17,4 +18,6 @@ public interface SysUserService extends BaseService&lt;SysUser, Integer&gt;{ @@ -17,4 +18,6 @@ public interface SysUserService extends BaseService&lt;SysUser, Integer&gt;{
17 Map<String,Object> register(SysUser u); 18 Map<String,Object> register(SysUser u);
18 19
19 List<SysUser> findAll_distinct(); 20 List<SysUser> findAll_distinct();
  21 +
  22 + Map<String, Object> resetPassword(@RequestParam Integer id);
20 } 23 }
src/main/java/com/bsth/service/sys/impl/RoleServiceImpl.java
@@ -96,8 +96,10 @@ public class RoleServiceImpl extends BaseServiceImpl&lt;Role, Integer&gt; implements @@ -96,8 +96,10 @@ public class RoleServiceImpl extends BaseServiceImpl&lt;Role, Integer&gt; implements
96 // ComparatorSysrole(rootlist); 96 // ComparatorSysrole(rootlist);
97 map.put("list", rsRoleList); 97 map.put("list", rsRoleList);
98 map.put("status", ResponseCode.SUCCESS); 98 map.put("status", ResponseCode.SUCCESS);
  99 + map.put("msg", "成功");
99 } catch (Exception e) { 100 } catch (Exception e) {
100 map.put("status", ResponseCode.ERROR); 101 map.put("status", ResponseCode.ERROR);
  102 + map.put("msg", e);
101 logger.error("error",e); 103 logger.error("error",e);
102 } 104 }
103 return map; 105 return map;
@@ -282,4 +284,12 @@ public class RoleServiceImpl extends BaseServiceImpl&lt;Role, Integer&gt; implements @@ -282,4 +284,12 @@ public class RoleServiceImpl extends BaseServiceImpl&lt;Role, Integer&gt; implements
282 public List<Role> findAllByIds(String ids) { 284 public List<Role> findAllByIds(String ids) {
283 return roleRepository.findAllById(ids); 285 return roleRepository.findAllById(ids);
284 } 286 }
  287 +
  288 + @Override
  289 + public boolean checkOperationLegality(Integer operationRoleId){
  290 + boolean isLegality = false;
  291 + Map<String, Object> roleMap = findSubordinate();
  292 + isLegality = (roleMap.get(operationRoleId) == null ? true:false );
  293 + return isLegality;
  294 + }
285 } 295 }
src/main/java/com/bsth/service/sys/impl/SysUserServiceImpl.java
1 package com.bsth.service.sys.impl; 1 package com.bsth.service.sys.impl;
2 2
3 -import com.alibaba.fastjson.JSONArray;  
4 import com.bsth.common.ResponseCode; 3 import com.bsth.common.ResponseCode;
  4 +import com.bsth.controller.sys.util.RSAUtils;
5 import com.bsth.entity.sys.Role; 5 import com.bsth.entity.sys.Role;
6 import com.bsth.entity.sys.SysUser; 6 import com.bsth.entity.sys.SysUser;
7 import com.bsth.repository.sys.SysUserRepository; 7 import com.bsth.repository.sys.SysUserRepository;
@@ -16,6 +16,7 @@ import org.slf4j.LoggerFactory; @@ -16,6 +16,7 @@ import org.slf4j.LoggerFactory;
16 import org.springframework.beans.factory.annotation.Autowired; 16 import org.springframework.beans.factory.annotation.Autowired;
17 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 17 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
18 import org.springframework.stereotype.Service; 18 import org.springframework.stereotype.Service;
  19 +import org.springframework.web.bind.annotation.RequestParam;
19 20
20 import java.util.ArrayList; 21 import java.util.ArrayList;
21 import java.util.HashMap; 22 import java.util.HashMap;
@@ -65,20 +66,45 @@ public class SysUserServiceImpl extends BaseServiceImpl&lt;SysUser, Integer&gt; implem @@ -65,20 +66,45 @@ public class SysUserServiceImpl extends BaseServiceImpl&lt;SysUser, Integer&gt; implem
65 @Override 66 @Override
66 public Map<String, Object> register(SysUser u) { 67 public Map<String, Object> register(SysUser u) {
67 Map<String, Object> rs = new HashMap(); 68 Map<String, Object> rs = new HashMap();
68 - try{  
69 - //检查用户名是否存在  
70 - if(findByUserName(u.getUserName()) != null){ 69 + boolean isLegality = false;
  70 + Iterator<Role> itRole = u.getRoles().iterator();
  71 + Role ro = new Role();
  72 + while(itRole.hasNext()){//判断是否有下一个
  73 + ro = itRole.next();
  74 + if(roleService.checkOperationLegality(ro.getId())){
  75 + isLegality = true;
  76 + } else {
71 rs.put("status", ResponseCode.ERROR); 77 rs.put("status", ResponseCode.ERROR);
72 - rs.put("msg", "用户名" + u.getUserName() + "已存在!"); 78 + rs.put("msg", "用户权限不够,请联系管理员!");
  79 + return rs;
73 } 80 }
74 - else{  
75 - u.setPassword(new BCryptPasswordEncoder(4).encode(u.getPassword()));  
76 - rs = super.save(u); 81 + }
  82 + if(isLegality){
  83 + try{
  84 + //解密RSA
  85 + try{
  86 + u.setUserName(RSAUtils.decryptBase64(u.getUserName()));
  87 + u.setPassword(RSAUtils.decryptBase64(u.getPassword()));
  88 + }catch (RuntimeException e) {
  89 + rs.put("msg", "网络延迟,解密失败,请重新添加!");
  90 + }
  91 + //检查用户名是否存在
  92 + if(findByUserName(u.getUserName()) != null){
  93 + rs.put("status", ResponseCode.ERROR);
  94 + rs.put("msg", "用户名" + u.getUserName() + "已存在!");
  95 + }
  96 + else{
  97 + u.setPassword(new BCryptPasswordEncoder(4).encode(u.getPassword()));
  98 + rs = super.save(u);
  99 + }
  100 + }catch (Exception e){
  101 + logger.error("", e);
  102 + rs.put("status", ResponseCode.ERROR);
  103 + rs.put("msg", e.getMessage());
77 } 104 }
78 - }catch (Exception e){  
79 - logger.error("", e); 105 + }else {
80 rs.put("status", ResponseCode.ERROR); 106 rs.put("status", ResponseCode.ERROR);
81 - rs.put("msg", e.getMessage()); 107 + rs.put("msg", "用户权限不够,请联系管理员!");
82 } 108 }
83 return rs; 109 return rs;
84 } 110 }
@@ -122,8 +148,36 @@ public class SysUserServiceImpl extends BaseServiceImpl&lt;SysUser, Integer&gt; implem @@ -122,8 +148,36 @@ public class SysUserServiceImpl extends BaseServiceImpl&lt;SysUser, Integer&gt; implem
122 } catch (Exception e){ 148 } catch (Exception e){
123 logger.error("error", e); 149 logger.error("error", e);
124 } 150 }
125 -  
126 -  
127 return rsList; 151 return rsList;
128 } 152 }
  153 +
  154 + @Override
  155 + public Map<String, Object> resetPassword(@RequestParam Integer id){
  156 + Map<String, Object> rs = new HashMap();
  157 + try{
  158 + // 获取当前用户
  159 + SysUser user = SecurityUtils.getCurrentUser();
  160 + Iterator<Role> itRole = user.getRoles().iterator();
  161 + Role ro = new Role();
  162 + boolean Legality = false;
  163 + while(itRole.hasNext()){//判断是否有下一个
  164 + ro = itRole.next();
  165 + if(ro.getLevel() == 1)
  166 + Legality = true;
  167 + }
  168 + if(Legality){
  169 + sysUserRepository.changePWD(id,new BCryptPasswordEncoder(4).encode("123456"));
  170 + rs.put("status", ResponseCode.SUCCESS);
  171 + rs.put("msg", "密码重置成功!");
  172 + }else {
  173 + rs.put("status", ResponseCode.ERROR);
  174 + rs.put("msg", "您不是超级管理员无权限重置其他用户密码");
  175 + }
  176 + }catch (Exception e){
  177 + logger.error("", e);
  178 + rs.put("status", ResponseCode.ERROR);
  179 + rs.put("msg", e.getMessage());
  180 + }
  181 + return rs;
  182 + }
129 } 183 }
src/main/resources/static/index.html
@@ -630,9 +630,11 @@ @@ -630,9 +630,11 @@
630 <script 630 <script
631 src="http://webapi.amap.com/maps?v=1.3&key=16cb1c5043847e09ef9edafdd77befda" 631 src="http://webapi.amap.com/maps?v=1.3&key=16cb1c5043847e09ef9edafdd77befda"
632 data-exclude=1></script> 632 data-exclude=1></script>
633 -<!-- echarts4 误删 --> 633 +<!-- echarts4 -->
634 <script src="/metronic_v4.5.4/plugins/echarts4/echarts.min.js"></script> 634 <script src="/metronic_v4.5.4/plugins/echarts4/echarts.min.js"></script>
635 <script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js" merge="plugins"></script> 635 <script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js" merge="plugins"></script>
  636 +<!-- RSA加密 -->
  637 +<script src="/assets/plugins/jsencrypt.min.js"></script>
636 638
637 </body> 639 </body>
638 </html> 640 </html>
639 \ No newline at end of file 641 \ No newline at end of file
src/main/resources/static/pages/forms/calc/calcsingledata.html
@@ -40,6 +40,14 @@ @@ -40,6 +40,14 @@
40 <span class="item-label" style="width: 80px;">线路: </span> 40 <span class="item-label" style="width: 80px;">线路: </span>
41 <select class="form-control" name="line" id="line" style="width: 140px;"></select> 41 <select class="form-control" name="line" id="line" style="width: 140px;"></select>
42 </div> 42 </div>
  43 + <div style="display: inline-block; margin-left: 18px;" id="sfdcDiv">
  44 + <span class="item-label" style="width: 80px;">是否电车: </span>
  45 + <select class="form-control form-filter " name="sfdc" id="sfdc">
  46 + <option value="">请选择...</option>
  47 + <option value="0">否</option>
  48 + <option value="1">是</option>
  49 + </select>
  50 + </div>
43 <div style="margin-top: 10px"></div> 51 <div style="margin-top: 10px"></div>
44 <div style="display: inline-block;margin-left: 3px;"> 52 <div style="display: inline-block;margin-left: 3px;">
45 <span class="item-label" style="width: 140px;">开始时间: </span> 53 <span class="item-label" style="width: 140px;">开始时间: </span>
@@ -99,13 +107,10 @@ @@ -99,13 +107,10 @@
99 // 关闭左侧栏 107 // 关闭左侧栏
100 if (!$('body').hasClass('page-sidebar-closed')) 108 if (!$('body').hasClass('page-sidebar-closed'))
101 $('.menu-toggler.sidebar-toggler').click(); 109 $('.menu-toggler.sidebar-toggler').click();
102 -  
103 - $("#startDate,#endDate").datetimepicker({  
104 - format : 'YYYY-MM-DD',  
105 - locale : 'zh-cn'  
106 - }); 110 +
107 111
108 var d = new Date(); 112 var d = new Date();
  113 + d.setTime(d.getTime() - 4*1000*60*60*24);
109 var year = d.getFullYear(); 114 var year = d.getFullYear();
110 var month = d.getMonth() + 1; 115 var month = d.getMonth() + 1;
111 var day = d.getDate(); 116 var day = d.getDate();
@@ -113,7 +118,20 @@ @@ -113,7 +118,20 @@
113 month = "0" + month; 118 month = "0" + month;
114 if(day < 10) 119 if(day < 10)
115 day = "0" + day; 120 day = "0" + day;
116 - $("#startDate,#endDate").val(year + "-" + month + "-" + day); 121 + var dateTime = year + "-" + month + "-" + day;
  122 + $("#startDate").datetimepicker({
  123 + format : 'YYYY-MM-DD',
  124 + locale : 'zh-cn',
  125 + maxDate : dateTime
  126 + });
  127 + $("#endDate").datetimepicker({
  128 + format : 'YYYY-MM-DD',
  129 + locale : 'zh-cn',
  130 + maxDate : dateTime
  131 + });
  132 + $("#startDate").val(dateTime);
  133 + $("#endDate").val(dateTime);
  134 +
117 135
118 var fage=false; 136 var fage=false;
119 var xlList; 137 var xlList;
@@ -193,6 +211,8 @@ @@ -193,6 +211,8 @@
193 } 211 }
194 }); 212 });
195 213
  214 + $("#sfdcDiv").hide();
  215 +
196 var cont = "驾驶员", cont1 = "", cont2 = "", cont3 = ""; 216 var cont = "驾驶员", cont1 = "", cont2 = "", cont3 = "";
197 $("#tjtype").on("change",function(){ 217 $("#tjtype").on("change",function(){
198 if(cont == "驾驶员"){ 218 if(cont == "驾驶员"){
@@ -205,10 +225,13 @@ @@ -205,10 +225,13 @@
205 cont = $("#tjtype").val(); 225 cont = $("#tjtype").val();
206 if($("#tjtype").val() == "驾驶员"){ 226 if($("#tjtype").val() == "驾驶员"){
207 $("#cont").val(cont1); 227 $("#cont").val(cont1);
  228 + $("#sfdcDiv").hide();
208 } else if($("#tjtype").val() == "售票员"){ 229 } else if($("#tjtype").val() == "售票员"){
209 $("#cont").val(cont2); 230 $("#cont").val(cont2);
  231 + $("#sfdcDiv").hide();
210 } else if($("#tjtype").val() == "车辆自编号"){ 232 } else if($("#tjtype").val() == "车辆自编号"){
211 $("#cont").val(cont3); 233 $("#cont").val(cont3);
  234 + $("#sfdcDiv").show();
212 } 235 }
213 }); 236 });
214 237
@@ -229,9 +252,10 @@ @@ -229,9 +252,10 @@
229 var fgsdmSing = $("#fgsdmSing").val(); 252 var fgsdmSing = $("#fgsdmSing").val();
230 var tjtype=$("#tjtype").val(); 253 var tjtype=$("#tjtype").val();
231 var cont=$("#cont").val(); 254 var cont=$("#cont").val();
  255 + var sfdc=$("#sfdc").val();
232 var params = {}; 256 var params = {};
233 var i = layer.load(2); 257 var i = layer.load(2);
234 - $get("/calc_mix/singledatatj",{gsdmSing:gsdmSing,fgsdmSing:fgsdmSing,line:line,startDate:startDate,endDate:endDate,tjtype:tjtype,cont:cont},function(result){ 258 + $get("/calc_mix/singledatatj",{gsdmSing:gsdmSing,fgsdmSing:fgsdmSing,line:line,startDate:startDate,endDate:endDate,tjtype:tjtype,cont:cont,sfdc:sfdc},function(result){
235 layer.close(i); 259 layer.close(i);
236 var singledata = template('singledata',{list:result}); 260 var singledata = template('singledata',{list:result});
237 // 把渲染好的模版html文本追加到表格中 261 // 把渲染好的模版html文本追加到表格中
@@ -247,11 +271,12 @@ @@ -247,11 +271,12 @@
247 var fgsdmSing = $("#fgsdmSing").val(); 271 var fgsdmSing = $("#fgsdmSing").val();
248 var tjtype=$("#tjtype").val(); 272 var tjtype=$("#tjtype").val();
249 var cont=$("#cont").val(); 273 var cont=$("#cont").val();
  274 + var sfdc=$("#sfdc").val();
250 var lineName = $('#line option:selected').text(); 275 var lineName = $('#line option:selected').text();
251 if(lineName == "全部线路") 276 if(lineName == "全部线路")
252 lineName = $('#fgsdmSing option:selected').text(); 277 lineName = $('#fgsdmSing option:selected').text();
253 var i = layer.load(2); 278 var i = layer.load(2);
254 - $get('/calc_export/singledataExportTj',{gsdmSing:gsdmSing,fgsdmSing:fgsdmSing,line:line,startDate:startDate,endDate:endDate,tjtype:tjtype,cont:cont,type:'export',lineName:lineName},function(result){ 279 + $get('/calc_export/singledataExportTj',{gsdmSing:gsdmSing,fgsdmSing:fgsdmSing,line:line,startDate:startDate,endDate:endDate,tjtype:tjtype,cont:cont,sfdc:sfdc,type:'export',lineName:lineName},function(result){
255 var dateTime = ""; 280 var dateTime = "";
256 if(startDate == endDate){ 281 if(startDate == endDate){
257 dateTime = moment(startDate).format("YYYYMMDD"); 282 dateTime = moment(startDate).format("YYYYMMDD");
src/main/resources/static/pages/forms/mould/calcIntervalCount.xls
No preview for this file type
src/main/resources/static/pages/forms/mould/calcIntervalList1.xls
No preview for this file type
src/main/resources/static/pages/home.html
@@ -59,41 +59,13 @@ @@ -59,41 +59,13 @@
59 } 59 }
60 </style> 60 </style>
61 <div class="system_change_log"> 61 <div class="system_change_log">
62 - <h2 style="text-indent: 35px;margin: 10px 0 5px;">2019-04-11 更新说明 Changelog</h2> 62 + <h2 style="text-indent: 35px;margin: 10px 0 5px;">2020-03-12 更新说明 Changelog</h2>
63 <br><br> 63 <br><br>
64 <ul > 64 <ul >
65 <li class="sub_title"><h6>权限管理</h6></li> 65 <li class="sub_title"><h6>权限管理</h6></li>
66 - <li><span class="label s_c_change">修复</span>1、编辑某一个员工,用户、角色和授权管理设置在同一界面。</li>  
67 - <li><span class="label s_c_change">新增</span>2、用户增加一项状态,显示主调、监控和作废。</li> 66 + <li><span class="label s_c_change">修改</span>1、密码修改加入密码复杂度校验机制</li>
68 <li class="sub_title"><h6>线调</h6></li> 67 <li class="sub_title"><h6>线调</h6></li>
69 - <li><span class="label s_c_change">新增</span>1、少量班次对换完成用颜色标记为已换。</li>  
70 - <li><span class="label s_c_change">新增</span>2、子任务可最小化。</li>  
71 - <li><span class="label s_c_change">修复</span>3、修正子任务一个备注栏原因选择后其他子任务都会同步备注此原因。</li>  
72 - <li><span class="label s_c_change">修复</span>4、轨迹回放只显示当前一段时间内的gps走向,已轨迹回放的走向自动不显示(只显示当前上下行的gps走向)。</li>  
73 - <li><span class="label s_c_change">修复</span>5、轨迹回放播放速度添加更多倍速播放可选。</li>  
74 - <li><span class="label s_c_change">新增</span>6、"线路配置"分割成"线路配置"、"翻班与自动执行",可独立授权。</li>  
75 - <li><span class="label s_c_change">新增</span>7、添加设置,选择是否显示应到实到误差时间。</li>  
76 - <li><span class="label s_c_change">修复</span>8、无发有到时间 为紫色完成状态,改为显眼颜色区分,用橙色区分。</li>  
77 - <li><span class="label s_c_change">修复</span>9、轨迹回放中根据时间点切换线路版本信息。</li>  
78 - <li><span class="label s_c_change">修复</span>10、路牌对调连续请求造成数据不一致,翻班时无法清楚前日的排班数据。</li>  
79 - <li class="sub_title"><h6>计划调度</h6></li>  
80 - <li><span class="label s_c_change">修复</span>1、车辆报废,释放设备编号后在设备管理里添加一条设备替换记录。</li>  
81 - <li><span class="label s_c_change">修复</span>2、线路值勤日报,修改班次时,跨线路修改班次车提示报警。</li>  
82 - <li><span class="label s_c_change">修复</span>3、增加公司,分公司查询条件,公司,分公司,线路都是跟登录用户权限的,导出的数据和查询条件一致。</li>  
83 - <li><span class="label s_c_change">修复</span>4、排班时,页面添加规则逻辑判定。</li>  
84 - <li><span class="label s_c_change">修复</span>5、车辆导出修正,导出内容和权限匹配,和搜索条件匹配。</li>  
85 - <li><span class="label s_c_change">新增</span>6、所有的页面搜索添加排序选项功能。</li>  
86 - <li><span class="label s_c_change">新增</span>7、新增计划排班预览功能。</li>  
87 - <li class="sub_title"><h6>统计报表</h6></li>  
88 - <li><span class="label s_c_change">新增</span>1、新增早高峰出车报表。</li>  
89 - <li><span class="label s_c_change">新增</span>2、新增调度日报(待发对比) 报表。</li>  
90 - <li><span class="label s_c_change">新增</span>3、新增路单数据统计报表。</li>  
91 - <li><span class="label s_c_change">修复</span>4、修正班次车辆人员日报表中的售票员统计。</li>  
92 - <li class="sub_title"><h6>基础信息</h6></li>  
93 - <li><span class="label s_c_change">修复</span>1、线路版本:待更新状态增加删除功能,历史版本取消修改功能。</li>  
94 - <li><span class="label s_c_change">修复</span>2、线路信息-站点详情列-详情页面-站点修改功能:站点修改多边形功能修改,站点中心点可以移动。</li>  
95 - <li class="sub_title"><h6>用油管理</h6></li>  
96 - <li><span class="label s_c_change">修复</span>1、修正加油人员不符保存后不在显示。</li> 68 + <li><span class="label s_c_change">新增</span>1、线调页面新增维修上报功能</li>
97 </ul> 69 </ul>
98 70
99 </div> 71 </div>
src/main/resources/static/pages/permission/user/add.html
@@ -42,7 +42,7 @@ @@ -42,7 +42,7 @@
42 <label class="col-md-3 control-label">密码</label> 42 <label class="col-md-3 control-label">密码</label>
43 <div class="col-md-4"> 43 <div class="col-md-4">
44 <input type="password" class="form-control" id="password" name="password" > 44 <input type="password" class="form-control" id="password" name="password" >
45 - <span class="help-block"> 请输入6位以上密码</span> 45 + <!--<span class="help-block"> 请输入6位以上密码</span>-->
46 </div> 46 </div>
47 </div> 47 </div>
48 <div class="form-group"> 48 <div class="form-group">
@@ -100,18 +100,46 @@ @@ -100,18 +100,46 @@
100 }); 100 });
101 });*/ 101 });*/
102 102
103 - // 查询下级角色 103 + // 查询下级角色
104 $.get('/role/findSubordinate', function (rs) { 104 $.get('/role/findSubordinate', function (rs) {
105 if(rs.status == "SUCCESS"){ 105 if(rs.status == "SUCCESS"){
  106 + if(rs.list.length < 1){
  107 + loadPage('/pages/permission/role/add.html');
  108 + layer.open({
  109 + // type: 2,
  110 + content: '用户需要有下级角色才能添加用户!',
  111 + title: '请添加下级角色',
  112 + shift: 5,
  113 + scrollbar: false
  114 + });
  115 + return;
  116 + }
  117 +
106 $.each(rs.list,function(i,obj){ 118 $.each(rs.list,function(i,obj){
107 $("#role").append("<option value='"+obj.id+"'>"+obj.roleName+"</option>"); 119 $("#role").append("<option value='"+obj.id+"'>"+obj.roleName+"</option>");
108 }); 120 });
  121 + }else {
  122 + loadPage('/pages/permission/role/list.html');
  123 + layer.open({
  124 + // type: 2,
  125 + content: rs.msg,
  126 + title: "用户的下级角色有问题",
  127 + shift: 5,
  128 + scrollbar: false
  129 + });
109 } 130 }
110 }); 131 });
  132 +
111 133
112 var form = $('#user_add_form'); 134 var form = $('#user_add_form');
113 var error = $('.alert-danger', form); 135 var error = $('.alert-danger', form);
114 - 136 +
  137 + $.validator.addMethod("passwordrule", function(value, element) {
  138 + //var userblank = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*?[#?!@$%^&*-]).{8,16}$/;
  139 + var userblank = /^(?=.*[a-zA-Z])(?=.*\d).{8,16}$/;
  140 + return this.optional(element) ||(userblank.test(value));
  141 + }, "需包含字母、数字的8-16位字符");
  142 +
115 //表单 validate 143 //表单 validate
116 form.validate({ 144 form.validate({
117 errorElement : 'span', 145 errorElement : 'span',
@@ -128,13 +156,14 @@ @@ -128,13 +156,14 @@
128 }, 156 },
129 'password' : { 157 'password' : {
130 required : true, 158 required : true,
131 - minlength: 6,  
132 - maxlength: 25 159 + minlength: 8,
  160 + maxlength: 16,
  161 + passwordrule: true
133 }, 162 },
134 'cfmPassword' : { 163 'cfmPassword' : {
135 - equalTo: '#password' 164 + equalTo: '#password',
136 }, 165 },
137 - 'role' : { 166 + 'roles' : {
138 required : true, 167 required : true,
139 minlength: 1 168 minlength: 1
140 } 169 }
@@ -160,6 +189,21 @@ @@ -160,6 +189,21 @@
160 var params = form.serializeJSON(); 189 var params = form.serializeJSON();
161 error.hide(); 190 error.hide();
162 191
  192 + var keys;
  193 + $.ajax({
  194 + url: "/user/login/jCryptionKey?t="+Math.random(),
  195 + type: "Get",
  196 + async:false,
  197 + data: null,
  198 + success: function(data) {
  199 + keys = data.publickey;
  200 + }
  201 + });
  202 + //RSA加密
  203 + var encrypt = new JSEncrypt();
  204 + encrypt.setPublicKey(keys);
  205 + params.userName = encrypt.encrypt(params.userName);
  206 + params.password = encrypt.encrypt(params.password);
163 $.ajax({ 207 $.ajax({
164 url: '/user/register', 208 url: '/user/register',
165 type: 'POST', 209 type: 'POST',
@@ -178,27 +222,6 @@ @@ -178,27 +222,6 @@
178 } 222 }
179 } 223 }
180 }); 224 });
181 - /*$get('/user/all', {userName_eq: params.userName}, function(list){  
182 - if(!list || list.length == 0){  
183 - console.log(params);  
184 - $.ajax({  
185 - url: '/user',  
186 - type: 'POST',  
187 - traditional: true,  
188 - data: params,  
189 - success: function(res){  
190 - layer.msg('添加用户成功.');  
191 - loadPage('list.html');  
192 - }  
193 - });  
194 - /!* $post('/user', params, function(res){  
195 - layer.msg('添加用户成功.');  
196 - loadPage('list.html');  
197 - }); *!/  
198 - }  
199 - else  
200 - layer.alert('用户【' + params.userName + '】已存在', {icon: 2, title: '提交被拒绝'});  
201 - });*/  
202 } 225 }
203 }); 226 });
204 }); 227 });
src/main/resources/static/pages/permission/user/changePWD.html
@@ -4,6 +4,9 @@ @@ -4,6 +4,9 @@
4 <div class="portlet light portlet-fit portlet-form bordered"> 4 <div class="portlet light portlet-fit portlet-form bordered">
5 <div class="portlet-body"> 5 <div class="portlet-body">
6 <form class="form-horizontal" id="changePWDForm"> 6 <form class="form-horizontal" id="changePWDForm">
  7 + <div class="alert alert-danger display-hide">
  8 + <button class="close" data-close="alert"></button>您的输入有误,请检查下面的输入项
  9 + </div>
7 <div class="form-group" style="margin-top: 60px"> 10 <div class="form-group" style="margin-top: 60px">
8 <label class="control-label col-md-5">原始密码: 11 <label class="control-label col-md-5">原始密码:
9 </label> 12 </label>
@@ -19,7 +22,7 @@ @@ -19,7 +22,7 @@
19 <div class="col-md-4"> 22 <div class="col-md-4">
20 <div class="input-icon right"> 23 <div class="input-icon right">
21 <i class="fa"></i> 24 <i class="fa"></i>
22 - <input type="password" class="form-control" name="newPWD" /> </div> 25 + <input type="password" class="form-control" name="newPWD" id="newPWD"/> </div>
23 </div> 26 </div>
24 </div> 27 </div>
25 <div class="form-group"> 28 <div class="form-group">
@@ -34,7 +37,7 @@ @@ -34,7 +37,7 @@
34 <div class="form-actions"> 37 <div class="form-actions">
35 <div class="row"> 38 <div class="row">
36 <div class="col-md-offset-5 col-md-7"> 39 <div class="col-md-offset-5 col-md-7">
37 - <button type="button" id="confirm" class="btn green">确定</button> 40 + <button type="submit" id="confirm" class="btn green">确定</button>
38 <button type="reset" class="btn default">取消</button> 41 <button type="reset" class="btn default">取消</button>
39 </div> 42 </div>
40 </div> 43 </div>
@@ -47,11 +50,79 @@ @@ -47,11 +50,79 @@
47 50
48 <script> 51 <script>
49 $(function(){ 52 $(function(){
50 - $("#confirm").on("click",function(){  
51 - var data = $('#changePWDForm').serializeJSON();  
52 - $.post('/user/changePWD',data,function(msg){  
53 - layer.alert(msg);  
54 - });  
55 - }); 53 + var form = $('#changePWDForm');
  54 + //表单 validate
  55 + var error = $('.alert-danger', form);
  56 +
  57 + $.validator.addMethod("passwordrule", function(value, element) {
  58 + //var userblank = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*?[#?!@$%^&*-]).{8,16}$/;
  59 + var userblank = /^(?=.*[a-zA-Z])(?=.*\d).{8,16}$/;
  60 + return this.optional(element) ||(userblank.test(value));
  61 + }, "需包含字母、数字的8-16位字符");
  62 +
  63 + //表单 validate
  64 + form.validate({
  65 + errorElement : 'span',
  66 + errorClass : 'help-block help-block-error',
  67 + focusInvalid : false,
  68 + rules : {
  69 + 'newPWD' : {
  70 + required : true,
  71 + minlength: 8,
  72 + maxlength: 16,
  73 + passwordrule:true
  74 + },
  75 + 'cnewPWD' : {
  76 + equalTo: '#newPWD'
  77 + }
  78 + },
  79 + invalidHandler : function(event, validator) {
  80 + error.show();
  81 + App.scrollTo(error, -200);
  82 + },
  83 +
  84 + highlight : function(element) {
  85 + $(element).closest('.form-group').addClass('has-error');
  86 + },
  87 +
  88 + unhighlight : function(element) {
  89 + $(element).closest('.form-group').removeClass('has-error');
  90 + },
  91 +
  92 + success : function(label) {
  93 + label.closest('.form-group').removeClass('has-error');
  94 + },
  95 +
  96 + submitHandler : function(f) {
  97 + var params = form.serializeJSON();
  98 + error.hide();
  99 +
  100 + var keys;
  101 + $.ajax({
  102 + url: "/user/login/jCryptionKey?t="+Math.random(),
  103 + type: "Get",
  104 + async:false,
  105 + data: null,
  106 + success: function(data) {
  107 + keys = data.publickey;
  108 + }
  109 + });
  110 + //RSA加密
  111 + var encrypt = new JSEncrypt();
  112 + encrypt.setPublicKey(keys);
  113 + params.oldPWD = encrypt.encrypt(params.oldPWD);
  114 + params.newPWD = encrypt.encrypt(params.newPWD);
  115 + params.cnewPWD = encrypt.encrypt(params.cnewPWD);
  116 + $.ajax({
  117 + url: '/user/changePWD',
  118 + type: 'POST',
  119 + traditional: true,
  120 + data: params,
  121 + success: function(msg){
  122 + layer.alert(msg);
  123 + }
  124 + });
  125 + }
  126 + });
56 }); 127 });
57 </script> 128 </script>
58 \ No newline at end of file 129 \ No newline at end of file
src/main/resources/static/pages/permission/user/list.html
@@ -64,7 +64,7 @@ @@ -64,7 +64,7 @@
64 <td> 64 <td>
65 <button class="btn btn-sm green btn-outline filter-submit margin-bottom" > 65 <button class="btn btn-sm green btn-outline filter-submit margin-bottom" >
66 <i class="fa fa-search"></i> 搜索</button> 66 <i class="fa fa-search"></i> 搜索</button>
67 - 67 +
68 <button class="btn btn-sm red btn-outline filter-cancel"> 68 <button class="btn btn-sm red btn-outline filter-cancel">
69 <i class="fa fa-times"></i> 重置</button> 69 <i class="fa fa-times"></i> 重置</button>
70 </td> 70 </td>
@@ -117,6 +117,9 @@ @@ -117,6 +117,9 @@
117 <a class="btn btn-sm blue btn-outline" href="edit.html?no={{obj.id}}" data-pjax><i class="fa fa-edit"></i> 编辑</a> 117 <a class="btn btn-sm blue btn-outline" href="edit.html?no={{obj.id}}" data-pjax><i class="fa fa-edit"></i> 编辑</a>
118 <!--<button type="button" class="btn btn-sm line_allot_btn" data-id="{{obj.id}}">线调线路分配</button>--> 118 <!--<button type="button" class="btn btn-sm line_allot_btn" data-id="{{obj.id}}">线调线路分配</button>-->
119 {{/if}} 119 {{/if}}
  120 + {{if obj.isAdmin}}
  121 + <a class="btn btn-sm red btn-outline reset_password" data-id="{{obj.id}}" data-name="{{obj.userName}}" data-pjax><i class="fa fa-undo"></i> 重置密码</a>
  122 + {{/if}}
120 </td> 123 </td>
121 </tr> 124 </tr>
122 {{/each}} 125 {{/each}}
@@ -130,15 +133,49 @@ @@ -130,15 +133,49 @@
130 <script> 133 <script>
131 $(function(){ 134 $(function(){
132 var page = 0, initPagination; 135 var page = 0, initPagination;
133 - var user; 136 + var user,isAdmin = false;
134 var icheckOptions = { 137 var icheckOptions = {
135 checkboxClass: 'icheckbox_flat-blue', 138 checkboxClass: 'icheckbox_flat-blue',
136 increaseArea: '20%' 139 increaseArea: '20%'
137 }; 140 };
138 $.get('/user/getCurrentUser', function(data) { 141 $.get('/user/getCurrentUser', function(data) {
139 user = data; 142 user = data;
  143 + var roles = user.roles;
  144 + $.each(roles,function () {
  145 + if(this.level == 1)
  146 + isAdmin = true;
  147 + })
  148 +
140 }); 149 });
  150 +
141 setTimeout(function () { 151 setTimeout(function () {
  152 + $(document).on('click', 'a.reset_password', function () {
  153 + var id = $(this).data('id');
  154 + var name = $(this).data('name');
  155 + swal({
  156 + title: "重装密码",
  157 + text: "将登录名为"+name+"的用户,密码重置为默认密码!",
  158 + type: "warning",
  159 + showCancelButton: true,
  160 + confirmButtonColor: "#DD6B55",
  161 + confirmButtonText: "重置",
  162 + cancelButtonText: "取消",
  163 + closeOnConfirm: false },
  164 + function(){
  165 + $.post('/user/resetPassword',{'id':id},function(result){
  166 + if(result.status=='SUCCESS') {
  167 + // 弹出添加成功提示消息
  168 + swal("登录名为"+name+"的用户密码重置成功!", "success");
  169 + } else if(result.status=='ERROR') {
  170 + // 弹出添加失败提示消息
  171 + swal("重置失败!", result.msg+",请联系开发人员!", "ERROR");
  172 + }
  173 + // loadPage('list.html');
  174 + // 发布后刷新页面
  175 + jsDoQuery(getParams(), true);
  176 + });
  177 + });
  178 + });
142 jsDoQuery(null,true); 179 jsDoQuery(null,true);
143 180
144 //重置 181 //重置
@@ -147,45 +184,63 @@ $(function(){ @@ -147,45 +184,63 @@ $(function(){
147 jsDoQuery(null, true); 184 jsDoQuery(null, true);
148 }); 185 });
149 186
  187 + function getParams() {
  188 + var cells = $('tr.filter')[0].cells
  189 + ,params = {}
  190 + ,name;
  191 + $.each(cells, function(i, cell){
  192 + var items = $('input,select', cell);
  193 + for(var j = 0, item; item = items[j++];){
  194 + name = $(item).attr('name');
  195 + if(name){
  196 + params[name] = $(item).val();
  197 + }
  198 + }
  199 + });
  200 + return params;
  201 + }
  202 +
150 //提交 203 //提交
151 $('tr.filter .filter-submit').on('click', function(){ 204 $('tr.filter .filter-submit').on('click', function(){
152 - var cells = $('tr.filter')[0].cells  
153 - ,params = {}  
154 - ,name;  
155 - $.each(cells, function(i, cell){  
156 - var items = $('input,select', cell);  
157 - for(var j = 0, item; item = items[j++];){  
158 - name = $(item).attr('name');  
159 - if(name){  
160 - params[name] = $(item).val();  
161 - }  
162 - }  
163 - });  
164 - page = 0;  
165 - jsDoQuery(params, true); 205 + jsDoQuery(getParams(), true);
166 }); 206 });
167 207
168 /* 208 /*
169 * 获取数据 p: 要提交的参数, pagination: 是否重新分页 209 * 获取数据 p: 要提交的参数, pagination: 是否重新分页
170 */ 210 */
171 function jsDoQuery(p, pagination){ 211 function jsDoQuery(p, pagination){
  212 + var roles = new Map();
  213 + // 查询下级角色
  214 + $.ajax({
  215 + url: "/role/findSubordinate",
  216 + type: "Get",
  217 + async:false,
  218 + data: null,
  219 + success: function (rs) {
  220 + if(rs.status == "SUCCESS"){
  221 + $.each(rs.list,function(i,obj){
  222 + roles[obj.id] = obj;
  223 + });
  224 + }
  225 + }
  226 + });
172 var params = {}; 227 var params = {};
173 if(p) 228 if(p)
174 params = p; 229 params = p;
175 //更新时间排序 230 //更新时间排序
176 params['order'] = 'lastLoginDate'; 231 params['order'] = 'lastLoginDate';
177 params['page'] = page; 232 params['page'] = page;
178 - params['roles[0].pic_ne'] = 1; 233 + // params['id_eq'] = "1";
179 var i = layer.load(2); 234 var i = layer.load(2);
180 $get('/user' ,params, function(data){ 235 $get('/user' ,params, function(data){
181 var list = data.content; 236 var list = data.content;
182 - var errorList=[];  
183 $.each(list, function(i, obj) { 237 $.each(list, function(i, obj) {
184 - if(obj.roles[0].level > user.roles[0].level){ 238 + if(roles[obj.roles[0].id] != null && roles[obj.roles[0].id] != undefined){
185 obj.isEdit = 0; 239 obj.isEdit = 0;
186 } else{ 240 } else{
187 obj.isEdit = 1; 241 obj.isEdit = 1;
188 } 242 }
  243 + obj.isAdmin = isAdmin;
189 obj.lastLoginDate = moment(obj.lastLoginDate).format("YYYY-MM-DD HH:mm:ss"); 244 obj.lastLoginDate = moment(obj.lastLoginDate).format("YYYY-MM-DD HH:mm:ss");
190 }); 245 });
191 246
src/main/resources/static/pages/report/sheet/intervalCount.html
@@ -79,7 +79,7 @@ @@ -79,7 +79,7 @@
79 <td>晚高峰次数</td> 79 <td>晚高峰次数</td>
80 <td>低谷次数</td> 80 <td>低谷次数</td>
81 <td>全日班次数</td> 81 <td>全日班次数</td>
82 - <td>全日发生率</td> 82 + <td>万班次发生率</td>
83 <td>最大间隔时间</td> 83 <td>最大间隔时间</td>
84 <td>查看</td> 84 <td>查看</td>
85 </tr> 85 </tr>
@@ -125,7 +125,7 @@ @@ -125,7 +125,7 @@
125 <td>晚高峰次数</td> 125 <td>晚高峰次数</td>
126 <td>低谷次数</td> 126 <td>低谷次数</td>
127 <td>全日班次数</td> 127 <td>全日班次数</td>
128 - <td>全日发生率</td> 128 + <td>万班次发生率</td>
129 <td>最大间隔</td> 129 <td>最大间隔</td>
130 <td>查看</td> 130 <td>查看</td>
131 </tr> 131 </tr>
@@ -467,7 +467,7 @@ @@ -467,7 +467,7 @@
467 {{/each}} 467 {{/each}}
468 {{if list.length == 0}} 468 {{if list.length == 0}}
469 <tr> 469 <tr>
470 - <td colspan="10"><h6 class="muted">没有找到相关数据</h6></td> 470 + <td colspan="12"><h6 class="muted">没有找到相关数据</h6></td>
471 </tr> 471 </tr>
472 {{/if}} 472 {{/if}}
473 </script> 473 </script>
@@ -521,7 +521,7 @@ @@ -521,7 +521,7 @@
521 {{/each}} 521 {{/each}}
522 {{if list.length == 0}} 522 {{if list.length == 0}}
523 <tr> 523 <tr>
524 - <td colspan="11"><h6 class="muted">没有找到相关数据</h6></td> 524 + <td colspan="14"><h6 class="muted">没有找到相关数据</h6></td>
525 </tr> 525 </tr>
526 {{/if}} 526 {{/if}}
527 </script> 527 </script>
@@ -550,13 +550,9 @@ @@ -550,13 +550,9 @@
550 {{/each}} 550 {{/each}}
551 {{if list.length == 0}} 551 {{if list.length == 0}}
552 <tr> 552 <tr>
553 - <td colspan="7"><h6 class="muted">没有找到相关数据</h6></td>  
554 - </tr>  
555 - {{/if}}  
556 - {{if list.length == 0}}  
557 - <tr>  
558 - <td colspan="7"><h6 class="muted">没有找到相关数据</h6></td> 553 + <td colspan="11"><h6 class="muted">没有找到相关数据</h6></td>
559 </tr> 554 </tr>
560 {{/if}} 555 {{/if}}
  556 +
561 </script> 557 </script>
562 558
src/main/resources/static/real_control_v2/fragments/north/nav/safeDriving.html
@@ -117,10 +117,16 @@ @@ -117,10 +117,16 @@
117 var query = function() { 117 var query = function() {
118 scanFlag = false; 118 scanFlag = false;
119 var data = form.serializeJSON(); 119 var data = form.serializeJSON();
  120 + debugger;
  121 + var lines = new Array();
  122 + for (var i = 0;i < gb_data_basic.activeLines.length;i++) {
  123 + lines.push(gb_data_basic.activeLines[i].lineCode);
  124 + }
  125 + data.lines = lines.join(',');
120 data.page = page; 126 data.page = page;
121 data.size = pageSize; 127 data.size = pageSize;
122 128
123 - gb_common.$get('/gps/safeDriv', data, function (rs) { 129 + gb_common.$post('/gps/safeDriv', data, function (rs) {
124 //数据转换 130 //数据转换
125 var code2Name=gb_data_basic.lineCode2NameAll(), url,stm, p; 131 var code2Name=gb_data_basic.lineCode2NameAll(), url,stm, p;
126 $.each(rs.list, function(){ 132 $.each(rs.list, function(){