From d6955542a70118191d51046fc0c2489d6039e180 Mon Sep 17 00:00:00 2001 From: puzhibing <393733352@qq.com> Date: 星期五, 17 二月 2023 20:41:22 +0800 Subject: [PATCH] 新增加司机端接口 --- driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java | 151 +++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 136 insertions(+), 15 deletions(-) diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java index 04e0e9d..475be7c 100644 --- a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/OrderServiceImpl.java @@ -6,30 +6,31 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.supersavedriving.driver.modular.system.dao.OrderMapper; -import com.supersavedriving.driver.modular.system.model.Driver; -import com.supersavedriving.driver.modular.system.model.DriverWork; -import com.supersavedriving.driver.modular.system.model.Order; -import com.supersavedriving.driver.modular.system.model.SystemConfig; -import com.supersavedriving.driver.modular.system.service.IDriverService; -import com.supersavedriving.driver.modular.system.service.IDriverWorkService; -import com.supersavedriving.driver.modular.system.service.IOrderService; -import com.supersavedriving.driver.modular.system.service.ISystemConfigService; +import com.supersavedriving.driver.modular.system.model.*; +import com.supersavedriving.driver.modular.system.service.*; import com.supersavedriving.driver.modular.system.util.GaoDe.MapUtil; +import com.supersavedriving.driver.modular.system.util.GeodesyUtil; +import com.supersavedriving.driver.modular.system.util.PushUtil; import com.supersavedriving.driver.modular.system.util.ResultUtil; import com.supersavedriving.driver.modular.system.util.UUIDUtil; +import com.supersavedriving.driver.modular.system.util.mongodb.model.Location; import com.supersavedriving.driver.modular.system.warpper.AddOrderWarpper; -import com.supersavedriving.driver.modular.system.warpper.BaseWarpper; +import com.supersavedriving.driver.modular.system.warpper.HallOrderList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.geo.Circle; +import org.springframework.data.geo.Distance; +import org.springframework.data.geo.Metrics; +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.xml.crypto.Data; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Date; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** @@ -49,6 +50,18 @@ @Autowired private ISystemConfigService systemConfigService; + @Autowired + private PushUtil pushUtil; + + @Autowired + private MongoTemplate mongoTemplate; + + @Autowired + private IAppUserService appUserService; + + + + /** * 获取服务中的订单id @@ -66,21 +79,41 @@ } + /** + * 司机代客下单 + * @param uid + * @param addOrderWarpper + * @return + * @throws Exception + */ @Override public ResultUtil driverAddOrder(Integer uid, AddOrderWarpper addOrderWarpper) throws Exception { /** * 司机上线且空闲,下单直接给当前司机,其余进大厅 * 司机下的订单不需要创建新用户,且只能走线下支付 */ + + int count = this.selectCount(new EntityWrapper<Order>().eq("userPhone", addOrderWarpper.getPhone()).eq("status", 1).in("state", Arrays.asList(101, 102, 103, 104, 105, 106, 201))); + if(count > 0){ + return ResultUtil.error("该用户还有未完成的订单"); + } Driver driver = driverService.selectById(uid); DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", uid).eq("status", 1)); Order order1 = this.selectOne(new EntityWrapper<Order>().eq("driverId", uid).eq("status", 1).in("state", Arrays.asList(102, 103, 104, 105, 201))); Order order = new Order(); if(driverWork != null && null == order1){ order.setDriverId(uid); + driver.setServerStatus(2); } order.setCode(UUIDUtil.getTimeStr() + UUIDUtil.getNumberRandom(3)); order.setSource(2); + + AppUser appUser = appUserService.selectOne(new EntityWrapper<AppUser>().eq("phone", addOrderWarpper.getPhone()).eq("status", 1)); + if(null != appUser){ + order.setUserId(appUser.getId()); + } + order.setUserName(addOrderWarpper.getUserName()); + order.setUserPhone(addOrderWarpper.getPhone()); order.setAgentId(driver.getAgentId()); order.setBranchOfficeId(driver.getBranchOfficeId()); order.setStartAddress(addOrderWarpper.getStartAddress()); @@ -94,12 +127,22 @@ return ResultUtil.error("获取预估距离出错"); } Double d = Double.valueOf(distance.get("distance")) / 1000; + order.setEstimatedMileage(d); order = getOrderPrice(1, d, 0, order); + order.setHallOrder(0); order.setState(null == order.getDriverId() ? 101 : 102); order.setStatus(1); order.setCreateTime(new Date()); this.insert(order); - return null; + driverService.updateById(driver); + //推送状态 + if(null != order.getDriverId()){ + pushUtil.pushOrderStatus(uid, 2, order.getId(), order.getStatus()); + }else{ + //开始推单 + pushOrder(order); + } + return ResultUtil.success(); } @@ -271,4 +314,82 @@ return order; } + + /** + * 订单推送逻辑 + * @param order + */ + public void pushOrder(Order order){ + /** + * 系统根据配置进行三轮的范围查找司机。 + * 只要找到司机就直接推出去。 + * 当推出去的司机都没有接单,直接将订单放入大厅,不再去更大范围找司机。 + */ + SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 1)); + if(null != systemConfig){ + JSONObject jsonObject = JSON.parseObject(systemConfig.getContent()); + Integer num4 = jsonObject.getInteger("num4");//接单时间 + String startLat = order.getStartLat(); + String startLng = order.getStartLng(); + + //找到中心点 + GeoJsonPoint geoJsonPoint = new GeoJsonPoint(Double.valueOf(startLat), Double.valueOf(startLng)); + for (int i = 1; i < 4; i++) { + Double num = jsonObject.getDouble("num" + i) / 1000;//范围公里 + //构造半径 + Distance distanceR = new Distance(num, Metrics.KILOMETERS); + //画圆 + Circle circle = new Circle(geoJsonPoint, distanceR); + // 构造query对象 + Query query = Query.query(Criteria.where("location").withinSphere(circle)); + List<Location> locations = mongoTemplate.find(query, Location.class); + + List<Integer> driverIds = locations.stream().map(Location::getDriverId).collect(Collectors.toList()); + if(driverIds.size() > 0){ + List<Driver> drivers = driverService.selectList(new EntityWrapper<Driver>().eq("approvalStatus", 2).eq("serverStatus", 1).eq("status", 1).in("id", driverIds)); + if(drivers.size() == 0){ + continue; + } + + for (Driver driver : drivers) { + pushUtil.pushGrabOrder(driver.getId(), 2, order.getId(), num4); + } + + //创建定时任务处理订单到大厅 + new Timer().schedule(new TimerTask() { + @Override + public void run() { + Order order1 = OrderServiceImpl.this.selectById(order.getId()); + if(order1.getState() == 101){ + order1.setHallOrder(1); + OrderServiceImpl.this.updateById(order1); + } + } + }, num4 * 1000); + } + } + } + } + + + + /** + * 获取大厅订单列表 + * @param uid + * @param pageNum + * @param pageSize + * @return + * @throws Exception + */ + @Override + public List<HallOrderList> queryOrderHall(Integer uid, Integer pageNum, Integer pageSize) throws Exception { + pageNum = (pageNum - 1) * pageSize; + List<HallOrderList> hallOrderLists = this.baseMapper.queryOrderHall(pageNum, pageSize); + hallOrderLists.forEach(hallOrderList -> { + Map<String, Double> distance = GeodesyUtil.getDistance(hallOrderList.getStartLng() + "," + hallOrderList.getStartLat(), hallOrderList.getEndLng() + "," + hallOrderList.getEndLat()); + Double wgs84 = distance.get("WGS84"); + hallOrderList.setCurrentDistance(wgs84); + }); + return hallOrderLists; + } } -- Gitblit v1.7.1