package com.stylefeng.guns.modular.crossCity.server.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.crossCity.dao.*; import com.stylefeng.guns.modular.crossCity.model.*; import com.stylefeng.guns.modular.crossCity.server.ILineSiteService; import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService; import com.stylefeng.guns.modular.crossCity.warpper.SiteWarpper; import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar; import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService; import com.stylefeng.guns.modular.system.util.DateUtil; import com.stylefeng.guns.modular.system.util.GDMapElectricFenceUtil; import com.stylefeng.guns.modular.system.util.RedisUtil; import com.stylefeng.guns.modular.system.util.SystemException; import com.stylefeng.guns.modular.system.util.model.GeoFencingPolygon; import com.stylefeng.guns.modular.taxi.model.OrderTaxi; import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.geo.GeoJsonPoint; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @Service public class LineSiteServiceImpl extends ServiceImpl implements ILineSiteService { @Resource private LineSiteMapper lineSiteMapper; @Resource private SiteMapper siteMapper; @Resource private LineShiftDriverMapper lineShiftDriverMapper; @Resource private LineShiftMapper lineShiftMapper; @Resource private LocationMapper locationMapper; @Autowired private DateUtil dateUtil; @Autowired private MongoTemplate mongoTemplate; @Autowired private RedisUtil redisUtil; @Autowired private IOrderTaxiService orderTaxiService; @Autowired private IOrderPrivateCarService orderPrivateCarService; @Autowired private IOrderCrossCityService orderCrossCityService; /** * 根据线路id获取排班数据 * @param lineId * @param day * @return * @throws Exception */ @Override public List> queryDriver(Integer lineId, String day, Integer driverId) throws Exception { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); c.setTime(new Date()); c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH), 0, 0, 0); c.set(Calendar.MILLISECOND, 0); if(c.getTimeInMillis() > sdf.parse(day).getTime()){ throw new SystemException("日期不能小于当天"); } List> list = new ArrayList<>(); List lineShifts = lineShiftMapper.queryByLineId(lineId); List> s = lineSiteMapper.queryDriver(lineId, sdf.parse(day), driverId); Calendar calendar = Calendar.getInstance(); calendar.setTime(sdf.parse(day)); String vehicle = redisUtil.getValue("VEHICLE"); List integers = new ArrayList<>(); if(ToolUtil.isNotEmpty(vehicle)){ integers = JSON.parseArray(vehicle).toJavaList(Integer.class); } for(LineShift lineShift : lineShifts){ boolean b = true; String[] split = lineShift.getEndTime().split(":"); calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0])); calendar.set(Calendar.MINUTE, Integer.valueOf(split[1])); if(calendar.getTimeInMillis() < System.currentTimeMillis()){//结束时间小于当前时间不显示 continue; } Map data = new HashMap<>(); for(Map map : s){ //先判断司机是否在限制接单范围内 boolean bo = false; for(Integer integer : integers){ if(integer.compareTo(Integer.valueOf(map.get("driverId").toString())) == 0){ bo = true; break; } } if(bo){ continue; } int i = orderTaxiService.selectCount(new EntityWrapper().eq("driverId", map.get("driverId")).in("state", Arrays.asList(2, 3, 4, 5, 11)).eq("DATE_FORMAT(travelTime, '%Y-%m-%d')", day)); if(i > 0){ continue; } i = orderPrivateCarService.selectCount(new EntityWrapper().eq("driverId", map.get("driverId")).in("state", Arrays.asList(2, 3, 4, 5, 11)).eq("DATE_FORMAT(travelTime, '%Y-%m-%d')", day)); if(i > 0){ continue; } List driverId1 = orderCrossCityService.queryListOrder(Integer.valueOf(map.get("driverId").toString()), lineShift.getId(), Arrays.asList(5), day); if(driverId1.size() > 0){ continue; } if(Integer.valueOf(map.get("laveSeat").toString()) <= 0){ continue; } if(lineShift.getId().intValue() == Integer.valueOf(map.get("id").toString()).intValue()){ b = false; String content = map.get("content").toString(); JSONObject jsonObject = JSON.parseObject(content); map.put("price", jsonObject.getString("num1")); data = map; list.add(data); } } if(b){ data.put("id", lineShift.getId()); data.put("startTime", lineShift.getStartTime()); list.add(data); } } return list; } /** * 根据司机排班数据id获取数据(剩余座位号和总座位数) * @param id * @return * @throws Exception */ @Override public Map querySeat(Integer id) throws Exception { Map map = new HashMap<>(); LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(id); map.put("totalNumber", lineShiftDriver.getTotalSeat()); map.put("number", lineShiftDriver.getLaveSeat()); map.put("content", lineShiftDriver.getLaveSeatNumber()); return map; } /** * 获取线路班次及司机预约情况 * @param lineId * @param time * @param driverId * @return * @throws Exception */ @Override public List> queryLineShiftInfo(Integer lineId, String time, Integer driverId) throws Exception { List lineShifts = lineShiftMapper.selectList(new EntityWrapper().eq("lineId", lineId).eq("state", 1).orderBy("startTime")); List> list = new ArrayList<>(); Map date = dateUtil.getStartAndEndDate(time); for(LineShift lineShift : lineShifts){ Map map = new HashMap<>(); map.put("id", lineShift.getId()); map.put("time", lineShift.getStartTime() + "-" + lineShift.getEndTime()); map.put("state", 3); List lineShiftDrivers = lineShiftDriverMapper.queryByDriver(lineShift.getId(), null, (null != date ? date.get("startTime") : null)); if(lineShiftDrivers.size() >= lineShift.getCarNum()){ map.put("state", 1); } lineShiftDrivers = lineShiftDriverMapper.queryByDriver(lineShift.getId(), driverId, (null != date ? date.get("startTime") : null)); if(lineShiftDrivers.size() > 0){ map.put("state", 2); } //判断时间(当天时间已经过了的班次) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); if(time.trim().equals(sdf.format(new Date()))){ Calendar s = Calendar.getInstance(); String[] split = lineShift.getEndTime().split(":"); s.setTime(new Date()); s.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0])); s.set(Calendar.MINUTE, Integer.valueOf(split[1])); if(s.getTimeInMillis() < System.currentTimeMillis()){ map.put("state", 1); } } list.add(map); } return list; } /** * 获取站点 * @return * @throws Exception */ @Override public List querySite(Integer startSiteId) throws Exception { List> sites = null; if(null == startSiteId){ sites = siteMapper.querySite(null); }else{ sites = siteMapper.querySite(startSiteId); } Set set = new HashSet<>(); for(Map site : sites) { set.add(site.get("cityCode").toString()); } List list = new ArrayList<>(); for(String c : set){ SiteWarpper siteWarpper = new SiteWarpper(); List data = new ArrayList<>(); String name = ""; String code = ""; for(Map s : sites){ if(c.equals(s.get("cityCode").toString())){ Map map = new HashMap<>(); map.put("id", s.get("id")); map.put("name", s.get("name").toString()); name = s.get("cityName").toString(); code = s.get("cityCode").toString(); data.add(map); } } siteWarpper.setName(name); siteWarpper.setCode(code); siteWarpper.setSites(data); list.add(siteWarpper); } return list; } /** * 根据站点id获取地点区域 * @param siteId * @return * @throws Exception */ @Override public List> queryLocation(Integer siteId) throws Exception { return locationMapper.queryLocation(siteId); } /** * 判断点是都在区域范围内 * @param siteId * @param code * @param lonLat * @return * @throws Exception */ @Override public boolean areaMonitoring(Integer siteId, String code, String lonLat) throws Exception { List> list = this.queryLocation(siteId); for(Map map : list){ if(Integer.valueOf(map.get("type").toString()) == 1){//行政区域 if(null != map.get("districtCode")){ if(code.equals(map.get("districtCode").toString())){ return true; } continue; } if(null != map.get("cityCode")){ if(code.equals(map.get("cityCode").toString())){ return true; } code = code.substring(0, 4) + "00"; if(code.equals(map.get("cityCode").toString())){ return true; } continue; } if(null != map.get("provinceCode")){ code = code.substring(0, 2) + "0000"; if(code.equals(map.get("provinceCode").toString())){ return true; } continue; } } if(Integer.valueOf(map.get("type").toString()) == 2){//电子围栏 String[] split = lonLat.split(","); GeoJsonPoint point = new GeoJsonPoint(Double.valueOf(split[0]), Double.valueOf(split[1])); Query query = Query.query(Criteria.where("geoJsonPolygon").intersects(point)); List geoFencingPolygons = mongoTemplate.find(query, GeoFencingPolygon.class); List s_sites = geoFencingPolygons.stream().map(GeoFencingPolygon::getSiteId).collect(Collectors.toList()); if(s_sites.contains(siteId)){ return true; } } } return false; } }