package com.stylefeng.guns.modular.api; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.system.model.Driver; import com.stylefeng.guns.modular.system.service.IDriverService; import com.stylefeng.guns.modular.system.service.IOrderEvaluateService; import com.stylefeng.guns.modular.system.util.ResultUtil; import com.stylefeng.guns.modular.system.warpper.BaseWarpper; import com.stylefeng.guns.modular.system.warpper.DriverInfoWarpper; import com.stylefeng.guns.modular.system.warpper.DriverPosition; import com.stylefeng.guns.modular.system.warpper.OrderEvaluateWarpper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.geo.Point; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; /** * 司机控制器 */ @Api @RestController @RequestMapping("") @Slf4j public class DriverController { @Autowired private IDriverService driverService; @Autowired private IOrderEvaluateService orderEvaluateService; @Autowired private MongoTemplate mongoTemplate; @Resource private RedisTemplate redisTemplate; /** * 获取5公里范围内空闲司机数量 * @param type 业务类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车) * @return */ @ResponseBody @PostMapping("/base/driver/queryIdleDriver") @ApiOperation(value = "获取5公里范围内空闲司机数量", tags = {"用户端-首页"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "业务类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)", name = "type", required = true, dataType = "int"), @ApiImplicitParam(value = "乘客当前定位经度", name = "lon", required = true, dataType = "double"), @ApiImplicitParam(value = "乘客当前定位纬度", name = "lat", required = true, dataType = "double") }) public ResultUtil queryIdleDriver(Integer type, Double lon, Double lat){ try { if(type==2){ type=null; } List list = driverService.queryIdleDriver(type, lon, lat, 5D, null); BaseWarpper baseWarpper = new BaseWarpper(); baseWarpper.setNumber(list.size()); return ResultUtil.success(baseWarpper); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } /** * 获取司机详情 * @param id * @return */ @ResponseBody @PostMapping("/api/driver/queryDriverInfo") @ApiOperation(value = "获取司机详情", tags = {"用户端-订单相关"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "司机id", name = "id", required = true, dataType = "int"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil queryDriverInfo(Integer id){ try { Map map = driverService.queryDriverInfo(id); String name = String.valueOf(map.get("name")); map.put("name", name.substring(0, 1) + "师傅"); List list = driverService.queryBusiness(id); map.put("list", list); return ResultUtil.success(DriverInfoWarpper.getDriverInfoWarpper(map)); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } /** * 获取司机的历史评价 * @param id * @param pageNum * @param size * @return */ @ResponseBody @PostMapping("/api/driver/queryOrderEvaluate") @ApiOperation(value = "获取司机的历史评价", tags = {"用户端-订单相关"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "司机id", name = "id", required = true, dataType = "int"), @ApiImplicitParam(value = "页码,首页1", name = "pageNum", required = true, dataType = "int"), @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil> queryOrderEvaluate(Integer id, Integer pageNum, Integer size){ try { List> list = orderEvaluateService.queryOrderEvaluate(id, pageNum, size); return ResultUtil.success(OrderEvaluateWarpper.getOrderEvaluateWarpper(list)); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } @ResponseBody @PostMapping("/base/driver/queryNearbyCar") @ApiOperation(value = "首页查询5公里范围内的车辆位置(黔云通)", tags = {"用户端-首页"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "经度", name = "lon", required = true, dataType = "String"), @ApiImplicitParam(value = "纬度", name = "lat", required = true, dataType = "String"), }) public ResultUtil>> queryNearbyCar(String lon, String lat){ //mongodb查询附近5公里范围内的坐标 Query query = Query.query(Criteria.where("point").nearSphere(new Point(Double.parseDouble(lon), Double.parseDouble(lat))).maxDistance(5000)); List driverPositions = mongoTemplate.find(query, DriverPosition.class); log.info("地理空间检索出的数据:{}", JSON.toJSONString(driverPositions)); List> collect = new ArrayList<>(); if(driverPositions.size() > 0){ List driverIds = driverPositions.stream().map(DriverPosition::getDriverId).collect(Collectors.toList()); List drivers = driverService.selectList(new EntityWrapper().in("id", driverIds) .eq("authState", 2).eq("state", 2)); collect = drivers.stream().map(driver -> { String value = (String) redisTemplate.opsForValue().get("dache:DRIVER" + String.valueOf(driver.getId())); if(ToolUtil.isNotEmpty(value)){ Optional driverPosition = driverPositions.stream().filter(position -> position.getDriverId().equals(driver.getId())).findFirst(); Map map = new HashMap<>(); map.put("driverId", driver.getId()); map.put("name", driver.getName()); map.put("lot", driverPosition.isPresent() ? driverPosition.get().getPoint().getX() : ""); map.put("lat", driverPosition.isPresent() ? driverPosition.get().getPoint().getY() : ""); return map; } return null; }).filter(Objects::nonNull).collect(Collectors.toList()); } return ResultUtil.success(collect); } }