Commit 2a38042d1c77bd8a897bb2ad52799d737bd86118

Authored by 潘钊
1 parent 27a79842

超速、越界 等异常表 分区 分表...

src/main/java/com/bsth/service/gps/GpsServiceImpl.java
... ... @@ -188,25 +188,9 @@ public class GpsServiceImpl implements GpsService {
188 188 String nbbm = nbbmArray[0];
189 189  
190 190 List<DeviceChange> dcs = findDeviceChangeLogs(nbbm, et, st);
191   - //没有设备变更记录,则参考车辆信息上的设备号
192   - if(null == dcs || dcs.size() == 0){
193   - DeviceChange dc = new DeviceChange();
194   - dc.setNbbm(nbbm);
195   - dc.setDevice(BasicData.deviceId2NbbmMap.inverse().get(nbbm));
196   - dc.setSt(st);
197   - dc.setEt(et);
198   - dc.setType(1);
199   -
200   - dcs.add(dc);
201   - }
202   -
203   - //bsth_c_gps_info
204   - String tableName = "bsth_c_gps_info";
205   - String sYear = fmtyyyy.print(st),
206   - currYear = fmtyyyy.print(System.currentTimeMillis());
207 191  
208   - if(!sYear.equals(currYear))
209   - tableName += "_" + sYear;
  192 + //按年分表
  193 + String tableName = "bsth_c_gps_info_" + fmtyyyy.print(st);
210 194  
211 195 StringBuilder sql = new StringBuilder("");
212 196 long t1,t2;
... ... @@ -365,6 +349,18 @@ public class GpsServiceImpl implements GpsService {
365 349  
366 350 rs.add(dc);
367 351 }
  352 +
  353 + //没有设备变更记录,则参考车辆信息上的设备号
  354 + if(null == rs || rs.size() == 0){
  355 + DeviceChange dc = new DeviceChange();
  356 + dc.setNbbm(nbbm);
  357 + dc.setDevice(BasicData.deviceId2NbbmMap.inverse().get(nbbm));
  358 + dc.setSt(st);
  359 + dc.setEt(et);
  360 + dc.setType(1);
  361 +
  362 + rs.add(dc);
  363 + }
368 364 }catch (Exception e){
369 365 logger.error("", e);
370 366 }
... ... @@ -887,27 +883,84 @@ public class GpsServiceImpl implements GpsService {
887 883  
888 884 @Override
889 885 public List<GpsSpeed_DTO> speeds(String nbbm, long st, long et) {
890   - String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);
891   - String sql = "select vehicle, line, up_down, lon, lat, speed,timestamp from bsth_c_speeding where vehicle=? and timestamp>? and timestamp<?";
  886 + st = st * 1000;
  887 + et = et * 1000;
  888 + //按周分区
  889 + Calendar sCal = Calendar.getInstance();
  890 + sCal.setTime(new Date(st));
  891 + int sWeekYear = sCal.get(Calendar.WEEK_OF_YEAR);
  892 + Calendar eCal = Calendar.getInstance();
  893 + eCal.setTime(new Date(et));
  894 + int eWeekYear = eCal.get(Calendar.WEEK_OF_YEAR);
  895 +
  896 + //按年分表
  897 + String tableName = "bsth_c_speeding_" + fmtyyyy.print(st);
  898 +
  899 + List<DeviceChange> dcs = findDeviceChangeLogs(nbbm, et, st);
  900 + StringBuilder sql = new StringBuilder("");
  901 + long t1,t2;
  902 + DeviceChange dc;
  903 + for(int i = 0,len=dcs.size(); i < len; i++){
  904 + t1 = st;
  905 + t2 = et;
  906 + dc = dcs.get(i);
  907 + if(dc.getSt() > st)
  908 + t1 = dc.getSt();
  909 + if(dc.getEt() < et && dc.getEt()!=0)
  910 + t2 = dc.getEt();
  911 +
  912 + sql.append(" select vehicle, line, up_down, lon, lat, speed,timestamp from "+tableName+" where " +
  913 + " weeks_year in ("+sWeekYear+", "+eWeekYear+") and vehicle='"+dc.getDevice()+"' and timestamp>"+t1+" and timestamp< " + t2);
  914 +
  915 + if(i == len - 1)
  916 + sql.append(" ORDER BY vehicle,timestamp");
  917 + else
  918 + sql.append(" UNION ");
  919 + }
892 920  
893   - return GpsSpeed_DTO.create(new JdbcTemplate(DBUtils_MS.getDataSource()).queryForList(sql, deviceId, st * 1000, et * 1000));
  921 + logger.info("speed sql : " + sql.toString());
  922 + return GpsSpeed_DTO.create(new JdbcTemplate(DBUtils_MS.getDataSource()).queryForList(sql.toString()));
894 923 }
895 924  
896 925 @Override
897 926 public List<GpsOutbound_DTO> outbounds(String nbbm, long st, long et) {
898   - /**
899   - * 如果 st 和 et 跨了周分区,也只查询st 分区的数据。
900   - */
901 927 st = st * 1000;
902 928 et = et * 1000;
903 929 //按周分区
904   - Calendar weekCal = Calendar.getInstance();
905   - weekCal.setTimeInMillis(st);
906   - int weekYear = weekCal.get(Calendar.WEEK_OF_YEAR);
907   - //设备号
908   - String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);
909   - String sql = "select vehicle,line,up_down,lon,lat,timestamp from bsth_c_outbound where weeks_year=" + weekYear + " and vehicle=? and timestamp>? and timestamp<?";
910   - return GpsOutbound_DTO.create(new JdbcTemplate(DBUtils_MS.getDataSource()).queryForList(sql, deviceId, st, et));
  930 + Calendar sCal = Calendar.getInstance();
  931 + sCal.setTime(new Date(st));
  932 + int sWeekYear = sCal.get(Calendar.WEEK_OF_YEAR);
  933 + Calendar eCal = Calendar.getInstance();
  934 + eCal.setTime(new Date(et));
  935 + int eWeekYear = eCal.get(Calendar.WEEK_OF_YEAR);
  936 +
  937 + //按年分表
  938 + String tableName = "bsth_c_outbound_" + fmtyyyy.print(st);
  939 +
  940 + List<DeviceChange> dcs = findDeviceChangeLogs(nbbm, et, st);
  941 + StringBuilder sql = new StringBuilder("");
  942 + long t1,t2;
  943 + DeviceChange dc;
  944 + for(int i = 0,len=dcs.size(); i < len; i++){
  945 + t1 = st;
  946 + t2 = et;
  947 + dc = dcs.get(i);
  948 + if(dc.getSt() > st)
  949 + t1 = dc.getSt();
  950 + if(dc.getEt() < et && dc.getEt()!=0)
  951 + t2 = dc.getEt();
  952 +
  953 + sql.append("select vehicle,line,up_down,lon,lat,timestamp from "+tableName+" where " +
  954 + " weeks_year in ("+sWeekYear+", "+eWeekYear+") and vehicle='"+dc.getDevice()+"' and timestamp>"+t1+" and timestamp<" + t2);
  955 +
  956 + if(i == len - 1)
  957 + sql.append(" ORDER BY vehicle,timestamp");
  958 + else
  959 + sql.append(" UNION ");
  960 + }
  961 +
  962 + logger.info("outbounds sql : " + sql.toString());
  963 + return GpsOutbound_DTO.create(new JdbcTemplate(DBUtils_MS.getDataSource()).queryForList(sql.toString()));
911 964 }
912 965  
913 966 @Override
... ...