From f58cca364b731eac2d60a440ffaa804be3cd43fd Mon Sep 17 00:00:00 2001 From: puzhibing <393733352@qq.com> Date: 星期五, 30 六月 2023 10:32:28 +0800 Subject: [PATCH] 修改bug --- driver/guns-admin/src/main/java/com/agentdriving/driver/modular/system/service/impl/OrderServiceImpl.java | 607 ++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 403 insertions(+), 204 deletions(-) diff --git a/driver/guns-admin/src/main/java/com/agentdriving/driver/modular/system/service/impl/OrderServiceImpl.java b/driver/guns-admin/src/main/java/com/agentdriving/driver/modular/system/service/impl/OrderServiceImpl.java index 1be8246..182fda6 100644 --- a/driver/guns-admin/src/main/java/com/agentdriving/driver/modular/system/service/impl/OrderServiceImpl.java +++ b/driver/guns-admin/src/main/java/com/agentdriving/driver/modular/system/service/impl/OrderServiceImpl.java @@ -23,6 +23,8 @@ import com.agentdriving.driver.modular.system.warpper.AddOrderWarpper; import com.agentdriving.driver.modular.system.warpper.HallOrderList; import com.agentdriving.driver.modular.system.warpper.OrderInfoWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.geo.Circle; @@ -48,6 +50,8 @@ */ @Service public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IOrderService { + + Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class); @Autowired private IDriverWorkService driverWorkService; @@ -195,10 +199,10 @@ .where("'" + geocode.getCity() + "' like CONCAT('%', city, '%') and '" + geocode.getDistrict() + "' like CONCAT('%', district, '%') ")); city = null != weatherCity ? weatherCity.getId().toString() : ""; } + order.setCreateTime(new Date()); order = getOrderPrice(1, d, 0, order, city); order.setState(null == order.getDriverId() ? 101 : 102); order.setStatus(1); - order.setCreateTime(new Date()); this.insert(order); driverService.updateById(driver); //推送状态 @@ -210,7 +214,7 @@ new Thread(new Runnable() { @Override public void run() { - pushOrder(finalOrder); + pushOrder(finalOrder.getId()); } }).start(); } @@ -242,7 +246,7 @@ JSONObject jsonObject = JSON.parseObject(systemConfig.getContent()); JSONArray chargeStandard = jsonObject.getJSONArray("ChargeStandard"); JSONObject extraCost = jsonObject.getJSONObject("ExtraCost"); - Date date = new Date(); + Date date = order.getCreateTime(); boolean b = true; for (int i = 1; i < chargeStandard.size(); i++) {//各种时间段 @@ -257,18 +261,28 @@ Double num8 = jsonObject1.getDouble("num8");//超过num8每num10公里收取num11 String[] split = num1.split(":"); + Integer hour1 = Integer.valueOf(split[0]); Calendar s = Calendar.getInstance(); s.setTime(date); - s.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0])); + s.set(Calendar.HOUR_OF_DAY, hour1); s.set(Calendar.MINUTE, Integer.valueOf(split[1])); s.set(Calendar.SECOND, 0); split = num2.split(":"); + Integer hour2 = Integer.valueOf(split[0]); Calendar e = Calendar.getInstance(); e.setTime(date); - e.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0])); + e.set(Calendar.HOUR_OF_DAY, hour2); e.set(Calendar.MINUTE, Integer.valueOf(split[1])); e.set(Calendar.SECOND, 0); + + if(hour1 > hour2){ + if(s.getTimeInMillis() > date.getTime()){ + s.set(Calendar.DAY_OF_YEAR, s.get(Calendar.DAY_OF_YEAR) - 1); + }else{ + e.set(Calendar.DAY_OF_YEAR, e.get(Calendar.DAY_OF_YEAR) + 1); + } + } if(date.getTime() >= s.getTimeInMillis() && date.getTime() < e.getTimeInMillis()){ b = false; @@ -296,8 +310,8 @@ } //计算长途里程超出的部分 if(distance.compareTo(num5) > 0){ - BigDecimal subtract1 = new BigDecimal(distance).subtract(new BigDecimal(num5)); - BigDecimal divide1 = subtract1.divide(new BigDecimal(num7), new MathContext(2, RoundingMode.HALF_EVEN)); + BigDecimal subtract1 = new BigDecimal(distance).subtract(new BigDecimal(num5)).setScale(2, BigDecimal.ROUND_HALF_EVEN); + BigDecimal divide1 = subtract1.divide(new BigDecimal(num7), 2, BigDecimal.ROUND_HALF_EVEN); BigDecimal multiply1 = divide1.multiply(new BigDecimal(num8)); order.setOverLongDistance(subtract1.doubleValue());//超出长途里程 order.setOverLongDistancePrice(multiply1.doubleValue());//超出长途里程费 @@ -340,8 +354,8 @@ } //计算长途里程超出的部分 if(distance.compareTo(num5) > 0){ - BigDecimal subtract1 = new BigDecimal(distance).subtract(new BigDecimal(num5)); - BigDecimal divide1 = subtract1.divide(new BigDecimal(num7), new MathContext(2, RoundingMode.HALF_EVEN)); + BigDecimal subtract1 = new BigDecimal(distance).subtract(new BigDecimal(num5)).setScale(2, BigDecimal.ROUND_HALF_EVEN); + BigDecimal divide1 = subtract1.divide(new BigDecimal(num7), 2, BigDecimal.ROUND_HALF_EVEN); BigDecimal multiply1 = divide1.multiply(new BigDecimal(num8)); order.setOverLongDistance(subtract1.doubleValue());//超出长途里程 order.setOverLongDistancePrice(multiply1.doubleValue());//超出长途里程费 @@ -369,6 +383,8 @@ BigDecimal multiply = new BigDecimal(w).multiply(new BigDecimal(num4)); order.setOutWaitTime(w);//等待时长超出分钟 order.setOutWaitTimePrice(multiply.doubleValue());//等待时长超出费用 + }else{ + } //恶劣天气 @@ -431,7 +447,7 @@ order.setLongDistancePrice(0D);//长途里程费 order.setOverLongDistance(0D);//超出长途里程 order.setOverLongDistancePrice(0d);//超出长途里程费 - order.setWaitTime(0);//等待时长 +// order.setWaitTime(0);//等待时长 order.setWaitTimePrice(0D);//等待费 order.setOutWaitTime(0);//超出等待时长 order.setOutWaitTimePrice(0D);//超出等待时长费 @@ -449,30 +465,212 @@ /** * 订单推送逻辑 - * @param order */ - public void pushOrder(Order order){ - /** - * 1.先找最大推单范围内的优推司机 -》 距离最近 - * 没有1 - 》 - * 2.按照后台推送配置在范围内查找合适司机 - * 合适司:积分 > 评分 > 距离 - * 3.司机没有接单直接将订单置入大厅 - */ - SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 1)); - if(null == systemConfig){ - return; + public void pushOrder(Long orderId){ + try { + Order order = this.selectById(orderId); + /** + * 1.先找最大推单范围内的优推司机 -》 距离最近 + * 没有1 - 》 + * 2.按照后台推送配置在范围内查找合适司机 + * 合适司:积分 > 评分 > 距离 + * 3.司机没有接单直接将订单置入大厅 + */ + boolean lock = redisUtil.lock(5); + if(!lock){ + int num1 = 1; + while (num1 <= 10){ + Thread.sleep(3000);//等待3秒 + lock = redisUtil.lock(5); + if(lock){ + break; + }else{ + num1++; + } + } + } + if(!lock){ + order.setHallOrder(1); + this.updateById(order); + ExtraPushOrder(order); + redisUtil.unlock(); + } + SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 1)); + if(null == systemConfig){ + redisUtil.unlock(); + return; + } + JSONObject jsonObject = JSON.parseObject(systemConfig.getContent()); + Double num3 = jsonObject.getDouble("num3");//推单最大范围 + Integer num4 = jsonObject.getInteger("num4");//接单时间 + String startLat = order.getStartLat(); + String startLng = order.getStartLng(); + + //1 + //找到中心点 + GeoJsonPoint geoJsonPoint = new GeoJsonPoint(Double.valueOf(startLng), Double.valueOf(startLat)); + Double num = num3 / 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()); + Integer driver = null; + YouTuiDriver youTuiDriver1 = null; + if(driverIds.size() > 0){ + List<YouTuiDriver> youTuiDrivers = youTuiDriverService.selectList(new EntityWrapper<YouTuiDriver>().in("driverId", driverIds) + .eq("state", 2).last(" and surplusQuantity > 0 and now() < endTime and now() < failureTime")); + Double d = null; + for (YouTuiDriver youTuiDriver : youTuiDrivers) { + String value = redisUtil.getValue("DRIVER" + youTuiDriver.getDriverId()); + if(ToolUtil.isEmpty(value)){ + continue; + } + Driver driver1 = driverService.selectById(youTuiDriver.getDriverId()); + if(driver1.getServerStatus() == 2 || driver1.getOpenOrderQRCode() == 1){ + continue; + } + DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", driver1.getId()).eq("status", 1)); + if(null == driverWork){ + continue; + } + Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat()); + Double wgs84 = distance.get("WGS84"); + if(d == null || d.compareTo(wgs84) > 0){ + d = wgs84; + driver = youTuiDriver.getDriverId(); + youTuiDriver1 = youTuiDriver; + } + } + } + if(null != youTuiDriver1 && youTuiDriver1.getType() == 1){ + youTuiDriver1.setSurplusQuantity(youTuiDriver1.getSurplusQuantity() - 1); + youTuiDriverService.updateById(youTuiDriver1); + } + + //开始范围查找 + if(null == driver){ + for (int i = 1; i < 4; i++) { + if(null != driver){ + break; + } + num = jsonObject.getDouble("num" + i) / 1000;//范围公里 + //构造半径 + distanceR = new Distance(num, Metrics.KILOMETERS); + //画圆 + circle = new Circle(geoJsonPoint, distanceR); + // 构造query对象 + query = Query.query(Criteria.where("location").withinSphere(circle)); + locations = mongoTemplate.find(query, Location.class); + + 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("openOrderQRCode", 0).eq("status", 1).in("id", driverIds)); + if(drivers.size() == 0){ + continue; + } + + Integer integral = null;//积分 + Double score = null;//评分 + Double d = null; + for (Driver driver1 : drivers) { + String value = redisUtil.getValue("DRIVER" + driver1.getId()); + if(ToolUtil.isEmpty(value)){ + continue; + } + DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", driver1.getId()).eq("status", 1)); + if(null == driverWork){ + continue; + } + + if(integral == null || integral.compareTo(driver1.getIntegral()) < 0){//积分大 + integral = driver1.getIntegral(); + score = driver1.getScore(); + driver = driver1.getId(); + Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat()); + Double wgs84 = distance.get("WGS84"); + d = wgs84; + continue; + } + if(integral.compareTo(driver1.getIntegral()) == 0 && score.compareTo(driver1.getScore()) < 0){//积分相同对比评分 + integral = driver1.getIntegral(); + score = driver1.getScore(); + driver = driver1.getId(); + Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat()); + Double wgs84 = distance.get("WGS84"); + d = wgs84; + continue; + } + if(integral.compareTo(driver1.getIntegral()) == 0 && score.compareTo(driver1.getScore()) == 0){//积分相同/评分相同对比距离 + Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat()); + Double wgs84 = distance.get("WGS84"); + if(d.compareTo(wgs84) > 0){ + d = wgs84; + integral = driver1.getIntegral(); + score = driver1.getScore(); + driver = driver1.getId(); + continue; + } + } + } + + } + } + } + + if(null != driver){ + //防止多笔订单推给一个司机 + Driver driver1 = driverService.selectById(driver); + driver1.setServerStatus(2); + driverService.updateById(driver1); + pushUtil.pushGrabOrder(driver, 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.getState() != 201 && order1.getState() != 301 && order1.getDriverId().compareTo(driver1.getId()) != 0){ + driver1.setServerStatus(1); + driverService.updateById(driver1); + } + + if(order1.getState() == 201 || order1.getState() == 301 || (order1.getState() == 101 && null == order1.getDriverId())){ + driver1.setServerStatus(1); + driverService.updateById(driver1); + } + if(order1.getState() == 201 || (order1.getState() == 101 && null == order1.getDriverId())){ + order1.setHallOrder(1); + OrderServiceImpl.this.updateById(order1); + ExtraPushOrder(order); + } + + + } + }, num4 * 1000); + }else{ + order.setHallOrder(1); + this.updateById(order); + ExtraPushOrder(order); + } + redisUtil.unlock(); + }catch (Exception e){ + e.printStackTrace(); + redisUtil.unlock(); } - JSONObject jsonObject = JSON.parseObject(systemConfig.getContent()); - Double num3 = jsonObject.getDouble("num3");//推单最大范围 - Integer num4 = jsonObject.getInteger("num4");//接单时间 + } + + + public void ExtraPushOrder(Order order){ String startLat = order.getStartLat(); String startLng = order.getStartLng(); - //1 //找到中心点 GeoJsonPoint geoJsonPoint = new GeoJsonPoint(Double.valueOf(startLng), Double.valueOf(startLat)); - Double num = num3 / 1000;//范围公里 + Double num = 5D;//范围公里 //构造半径 Distance distanceR = new Distance(num, Metrics.KILOMETERS); //画圆 @@ -481,108 +679,24 @@ 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()); - Integer driver = null; - YouTuiDriver youTuiDriver1 = null; - if(driverIds.size() > 0){ - List<YouTuiDriver> youTuiDrivers = youTuiDriverService.selectList(new EntityWrapper<YouTuiDriver>().in("driverId", driverIds) - .eq("state", 2).last(" and (surplusQuantity > 0 or now() < endTime) and now() < failureTime")); - Double d = null; - for (YouTuiDriver youTuiDriver : youTuiDrivers) { - String value = redisUtil.getValue("DRIVER" + youTuiDriver.getDriverId()); - if(ToolUtil.isEmpty(value)){ - continue; - } - Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat()); - Double wgs84 = distance.get("WGS84"); - if(d == null || d.compareTo(wgs84) > 0){ - d = wgs84; - driver = youTuiDriver.getDriverId(); - youTuiDriver1 = youTuiDriver; - } + if(driverIds.size() == 0){ + return; + } + List<DriverWork> tDriverWorks = driverWorkService.selectList(new EntityWrapper<DriverWork>().in("driverId", driverIds).eq("status", 1)); + driverIds = tDriverWorks.stream().map(DriverWork::getDriverId).collect(Collectors.toList()); + List<Driver> drivers = driverService.selectList(new EntityWrapper<Driver>().eq("approvalStatus", 2) + .eq("serverStatus", 1).eq("openOrderQRCode", 0).eq("status", 1).in("id", driverIds)); + if(drivers.size() == 0){ + return; + } + for (Driver driver1 : drivers) { + String value = redisUtil.getValue("DRIVER" + driver1.getId()); + if (ToolUtil.isEmpty(value)) { + return; } - } - - if(null != youTuiDriver1 && youTuiDriver1.getType() == 1){ - youTuiDriver1.setSurplusQuantity(youTuiDriver1.getSurplusQuantity() - 1); - youTuiDriverService.updateById(youTuiDriver1); - } - - //开始范围查找 - if(null == driver){ - for (int i = 1; i < 4; i++) { - if(null != driver){ - break; - } - num = jsonObject.getDouble("num" + i) / 1000;//范围公里 - //构造半径 - distanceR = new Distance(num, Metrics.KILOMETERS); - //画圆 - circle = new Circle(geoJsonPoint, distanceR); - // 构造query对象 - query = Query.query(Criteria.where("location").withinSphere(circle)); - locations = mongoTemplate.find(query, Location.class); - - 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; - } - - Integer integral = null; - Double score = null; - Double d = null; - for (Driver driver1 : drivers) { - if(integral == null || integral.compareTo(driver1.getIntegral()) < 0){//积分大 - integral = driver1.getIntegral(); - score = driver1.getScore(); - driver = driver1.getId(); - continue; - } - if(integral.compareTo(driver1.getIntegral()) == 0 && score.compareTo(driver1.getScore()) < 0){//积分相同对比评分 - integral = driver1.getIntegral(); - score = driver1.getScore(); - driver = driver1.getId(); - continue; - } - if(integral.compareTo(driver1.getIntegral()) == 0 && score.compareTo(driver1.getScore()) == 0){//积分相同/评分相同对比距离 - String value = redisUtil.getValue("DRIVER" + driver1.getId()); - if(ToolUtil.isEmpty(value)){ - continue; - } - Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat()); - Double wgs84 = distance.get("WGS84"); - if(d == null || d.compareTo(wgs84) > 0){ - d = wgs84; - driver = driver1.getId(); - continue; - } - } - } - - } - } - } - - if(null != driver){ - pushUtil.pushGrabOrder(driver, 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.getState() == 201){ - order1.setHallOrder(1); - OrderServiceImpl.this.updateById(order1); - } - } - }, num4 * 1000); - }else{ - order.setHallOrder(1); - this.updateById(order); + pushUtil.pushGrabOrderExtras(driver1.getId(), 2); } } - /** @@ -639,6 +753,8 @@ orderRefusalService.insert(orderRefusal); Driver driver = driverService.selectById(uid); + driver.setServerStatus(1); + driverService.updateById(driver); //扣除积分 SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 4)); if(null != systemConfig) { @@ -684,7 +800,19 @@ if(count > 0){ return ResultUtil.error("还有未完成的订单"); } - boolean lock = redisUtil.lock(); + boolean lock = redisUtil.lock(5); + if(!lock){ + int num1 = 1; + while (num1 <= 10){ + Thread.sleep(3000);//等待3秒 + lock = redisUtil.lock(5); + if(lock){ + break; + }else{ + num1++; + } + } + } if(!lock){ return ResultUtil.error("请重试"); } @@ -867,7 +995,7 @@ Driver driver = driverService.selectById(order.getDriverId()); driver.setServerStatus(1); driverService.updateById(driver); - accountChangeDetailService.deductionInsurance();//扣减保险费 + accountChangeDetailService.deductionInsurance(order.getDriverId());//扣减保险费 saveIntegral(order); break; case 401: @@ -903,6 +1031,8 @@ accountChangeDetail.setUserType(2); accountChangeDetail.setUserId(order.getDriverId()); accountChangeDetail.setType(2); + accountChangeDetail.setChangeType(5); + accountChangeDetail.setOrderId(order.getId()); accountChangeDetail.setOldData(driver.getIntegral().doubleValue()); driver.setIntegral(driver.getIntegral() + num5); accountChangeDetail.setNewData(driver.getIntegral().doubleValue()); @@ -910,52 +1040,35 @@ accountChangeDetailService.saveData(accountChangeDetail); } //恶劣天气完成订单奖励 - Integer num8 = JSON.parseObject(systemConfig.getContent()).getInteger("num8"); - if(num8 > 0){ - AccountChangeDetail accountChangeDetail = new AccountChangeDetail(); - accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3)); - accountChangeDetail.setUserType(2); - accountChangeDetail.setUserId(order.getDriverId()); - accountChangeDetail.setType(2); - accountChangeDetail.setOldData(driver.getIntegral().doubleValue()); - driver.setIntegral(driver.getIntegral() + num8); - accountChangeDetail.setNewData(driver.getIntegral().doubleValue()); - accountChangeDetail.setExplain("恶劣天气完成订单奖励"); - accountChangeDetailService.saveData(accountChangeDetail); + String city = ""; + District geocode = MapUtil.geocode(order.getStartLng(), order.getStartLat()); + if(null != geocode){ + WeatherCity weatherCity = weatherCityService.selectOne(new EntityWrapper<WeatherCity>() + .where("'" + geocode.getCity() + "' like CONCAT('%', city, '%') and '" + geocode.getDistrict() + "' like CONCAT('%', district, '%') ")); + city = null != weatherCity ? weatherCity.getId().toString() : ""; } + boolean badWeather = WeatherUtil.isBadWeather(city); + if(badWeather){ + Integer num8 = JSON.parseObject(systemConfig.getContent()).getInteger("num8"); + if(num8 > 0){ + AccountChangeDetail accountChangeDetail = new AccountChangeDetail(); + accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3)); + accountChangeDetail.setUserType(2); + accountChangeDetail.setUserId(order.getDriverId()); + accountChangeDetail.setType(2); + accountChangeDetail.setOldData(driver.getIntegral().doubleValue()); + driver.setIntegral(driver.getIntegral() + num8); + accountChangeDetail.setNewData(driver.getIntegral().doubleValue()); + accountChangeDetail.setExplain("恶劣天气完成订单奖励"); + accountChangeDetailService.saveData(accountChangeDetail); + } + } + driverService.updateById(driver); if(null == order.getUserId()){ return; } - //推荐用户首单完成奖励 - Integer num4 = JSON.parseObject(systemConfig.getContent()).getInteger("num4"); - if(num4 > 0){ - List<Integer> state = Arrays.asList(105); - int count = this.selectCount(new EntityWrapper<Order>().eq("userId", order.getUserId()).eq("status", 1).in("state", state)); - if(count > 1){ - return; - } - AppUser appUser = appUserService.selectById(order.getUserId()); - if(null != appUser && null != appUser.getInviterType()){ - if(appUser.getInviterType() == 1){ - return; - } - Driver driver1 = driverService.selectById(appUser.getInviterId()); - AccountChangeDetail accountChangeDetail = new AccountChangeDetail(); - accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3)); - accountChangeDetail.setUserType(2); - accountChangeDetail.setUserId(driver1.getId()); - accountChangeDetail.setType(2); - accountChangeDetail.setOldData(driver1.getIntegral().doubleValue()); - driver1.setIntegral(driver1.getIntegral() + num4); - accountChangeDetail.setNewData(driver1.getIntegral().doubleValue()); - accountChangeDetail.setExplain("推荐用户完成首单奖励"); - accountChangeDetailService.saveData(accountChangeDetail); - driverService.updateById(driver1); - } - } - } } @@ -994,7 +1107,7 @@ } pushOrderInfoWarpper.setWaitTime(order.getWaitTime() + w); pushOrderInfoWarpper.setState(order.getState()); - pushOrderInfoWarpper.setActualMileage(Double.valueOf(order.getActualMileage() / 1000)); + pushOrderInfoWarpper.setActualMileage(new BigDecimal(order.getActualMileage() / 1000).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); pushOrderInfoWarpper.setTravelTime(0); if(null != order.getStartTime()){ int travelTime = Double.valueOf((System.currentTimeMillis() - order.getStartTime().getTime()) / 60000).intValue(); @@ -1050,7 +1163,7 @@ new Thread(new Runnable() { @Override public void run() { - pushOrder(finalOrder); + pushOrder(finalOrder.getId()); } }).start(); return ResultUtil.success(); @@ -1205,6 +1318,17 @@ */ @Override public ResultUtil setOrderStatus(Integer uid, Long orderId, Integer payType, Integer state) throws Exception { + if(108 == state){ + String value = redisUtil.getValue("repeat_" + orderId.toString()); + if(ToolUtil.isEmpty(value)){ + redisUtil.setStrValue("repeat_" + orderId, System.currentTimeMillis() + "", 10 * 60); + }else{ + Long s = System.currentTimeMillis() - Long.valueOf(value); + if(s < 60000){//1分钟 + return ResultUtil.error("数据处理中"); + } + } + } List<Integer> s = Arrays.asList(107, 108); if(!s.contains(state)){ return ResultUtil.error("操作失败"); @@ -1219,6 +1343,8 @@ order.setCouponId(coupon.getId()); order.setDiscountAmount(coupon.getCouponPreferentialAmount()); order.setPayMoney(order.getOrderMoney() - coupon.getCouponPreferentialAmount()); + }else{ + order.setPayMoney(order.getOrderMoney()); } } @@ -1230,9 +1356,6 @@ userToCoupon.setValidCount(userToCoupon.getValidCount() - 1); userToCouponService.updateById(userToCoupon); Coupon coupon = couponService.selectById(userToCoupon.getCouponId()); - order.setPayMoney(order.getPayMoney() - coupon.getCouponPreferentialAmount()); - order.setCouponId(coupon.getId()); - order.setDiscountedPrice(coupon.getCouponPreferentialAmount()); Driver driver = driverService.selectById(order.getDriverId()); AccountChangeDetail accountChangeDetail = new AccountChangeDetail(); @@ -1254,7 +1377,7 @@ } this.updateById(order); - if(state == 108){//计算抽成 + if(payType == 2 && state == 108){//计算抽成 saveRevenue(order); } @@ -1264,6 +1387,9 @@ pushUtil.pushOrderInfo(order.getDriverId(), 2, pushOrderInfoWarpper); if(null != order.getUserId()){ pushUtil.pushOrderStatus(order.getUserId(), 1, order.getId(), order.getState()); + } + if(108 == state){ + redisUtil.remove("repeat_" + orderId.toString()); } return ResultUtil.success(); } @@ -1278,28 +1404,70 @@ //司机分佣和司机推荐用户首单奖励都在平台的抽佣中扣除,剩余的为平台抽佣。 Driver driver = driverService.selectById(order.getDriverId()); AppUser appUser = appUserService.selectById(order.getUserId()); - Double payMoney = order.getPayMoney(); + + if(null != order.getUserId()){ + //司机推荐首单收入 + List<Integer> state = Arrays.asList(107, 108, 109); + int count = this.selectCount(new EntityWrapper<Order>().eq("userId", order.getUserId()).eq("status", 1).in("state", state)); + if(null != appUser.getInviterType() && appUser.getInviterType() == 2 && count == 1){ + Driver driver1 = driverService.selectById(appUser.getInviterId()); + //首单积分奖励 + SystemConfig systemConfig1 = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 4)); + JSONObject jsonObject2 = JSON.parseObject(systemConfig1.getContent()); + Integer num4 = jsonObject2.getInteger("num4"); + AccountChangeDetail accountChangeDetail = new AccountChangeDetail(); + accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3)); + accountChangeDetail.setUserType(2); + accountChangeDetail.setUserId(driver1.getId()); + accountChangeDetail.setType(2); + accountChangeDetail.setChangeType(5); + accountChangeDetail.setOrderId(order.getId()); + accountChangeDetail.setOldData(driver1.getIntegral().doubleValue()); + accountChangeDetail.setExplain("邀请用户首单积分奖励"); + accountChangeDetail.setCreateTime(new Date()); + driver1.setIntegral(driver1.getIntegral() + num4); + accountChangeDetail.setNewData(driver1.getIntegral().doubleValue()); + accountChangeDetailService.insert(accountChangeDetail); + driverService.updateById(driver1); + } + } + + SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 3)); - Double n = 0D; if(null != systemConfig){ JSONObject jsonObject = JSON.parseObject(systemConfig.getContent()); Double num2 = jsonObject.getDouble("num2"); Double num3 = jsonObject.getDouble("num3"); - n = num3; - if(order.getPayMoney() >= num2){ - payMoney = payMoney - num3;//司机收入 + if(order.getOrderMoney() >= num2){//订单金额大于num2才有抽佣金 + driver = driverService.selectById(order.getDriverId()); + AccountChangeDetail accountChangeDetail1 = new AccountChangeDetail(); + accountChangeDetail1.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3)); + accountChangeDetail1.setUserType(2); + accountChangeDetail1.setUserId(driver.getId()); + accountChangeDetail1.setType(1); + accountChangeDetail1.setChangeType(9); + accountChangeDetail1.setOrderId(order.getId()); + accountChangeDetail1.setOldData(driver.getBalance() + driver.getBackgroundBalance() + driver.getCouponBalance() + driver.getCommission()); + accountChangeDetail1.setExplain("订单信息费"); + accountChangeDetail1.setCreateTime(new Date()); + driver.setBalance(driver.getBalance() - num3); + accountChangeDetail1.setNewData(driver.getBalance() + driver.getBackgroundBalance() + driver.getCouponBalance() + driver.getCommission()); + driverService.updateById(driver); + accountChangeDetailService.saveData(accountChangeDetail1); + + + //有分佣的情况,分佣的金额从司机充值金额中扣除转给分佣对象 SystemConfig systemConfig1 = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 2)); if(null != systemConfig1){ JSONObject jsonObject1 = JSON.parseObject(systemConfig1.getContent()); - //司机推荐首单收入 - List<Integer> state = Arrays.asList(108, 109); - int count = this.selectCount(new EntityWrapper<Order>().eq("userId", appUser.getId()).eq("status", 1).in("state", state)); - if(null != appUser.getInviterType() && appUser.getInviterType() == 2 && count == 1){ + //司机推荐用户收入 + if(null != appUser && null != appUser.getInviterType() && appUser.getInviterType() == 2){ Double num1 = jsonObject1.getDouble("num1"); num1 = (num3 >= num1 ? num1 : num3); if(num1 > 0){ Driver driver1 = driverService.selectById(appUser.getInviterId()); + //首单积分奖励 AccountChangeDetail accountChangeDetail = new AccountChangeDetail(); accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3)); accountChangeDetail.setUserType(2); @@ -1307,12 +1475,12 @@ accountChangeDetail.setType(1); accountChangeDetail.setChangeType(5); accountChangeDetail.setOldData(driver1.getBalance() + driver1.getBackgroundBalance() + driver1.getCouponBalance() + driver1.getCommission()); - accountChangeDetail.setExplain("订单分佣收入"); + accountChangeDetail.setExplain("邀请用户奖励"); accountChangeDetail.setCreateTime(new Date()); driver1.setCommission(driver1.getCommission() + num1); accountChangeDetail.setNewData(driver1.getBalance() + driver1.getBackgroundBalance() + driver1.getCouponBalance() + driver1.getCommission()); - driverService.updateById(driver1); accountChangeDetailService.saveData(accountChangeDetail); + driverService.updateById(driver1); Revenue revenue = new Revenue(); revenue.setType(2); @@ -1327,7 +1495,7 @@ } //开始处理层级抽佣 - if(null != driver.getInviterType() && driver.getInviterType() == 2){ + if(num3 > 0 && null != driver.getInviterType() && driver.getInviterType() == 2){ Driver driver1 = driverService.selectById(driver.getInviterId());//一级司机 if(null != driver1 && null != driver1.getInviterType() && driver1.getInviterType() == 2){ Driver driver2 = driverService.selectById(driver1.getInviterId());//二级司机 @@ -1386,6 +1554,7 @@ accountChangeDetail.setNewData(driver2.getBalance() + driver2.getBackgroundBalance() + driver2.getCouponBalance() + driver2.getCommission()); driverService.updateById(driver2); accountChangeDetailService.saveData(accountChangeDetail); + num3 = (num3 >= num6 ? num3 - num6 : 0); } num7 = (num3 >= num7 ? num7 : num3); @@ -1412,6 +1581,7 @@ accountChangeDetail.setNewData(driver3.getBalance() + driver3.getBackgroundBalance() + driver3.getCouponBalance() + driver3.getCommission()); driverService.updateById(driver3); accountChangeDetailService.saveData(accountChangeDetail); + num3 = (num3 >= num7 ? num3 - num7 : 0); } }else{ @@ -1441,6 +1611,7 @@ accountChangeDetail.setNewData(driver1.getBalance() + driver1.getBackgroundBalance() + driver1.getCouponBalance() + driver1.getCommission()); driverService.updateById(driver1); accountChangeDetailService.saveData(accountChangeDetail); + num3 = (num3 >= num3_ ? num3 - num3_ : 0); } num4 = (num3 >= num4 ? num4 : num3); @@ -1513,23 +1684,6 @@ } } } - } - //司机余额扣减抽佣金额 - if(n > 0){ - AccountChangeDetail accountChangeDetail = new AccountChangeDetail(); - accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3)); - accountChangeDetail.setUserType(2); - accountChangeDetail.setUserId(driver.getId()); - accountChangeDetail.setType(1); - accountChangeDetail.setChangeType(9); - accountChangeDetail.setOrderId(order.getId()); - accountChangeDetail.setOldData(driver.getBalance() + driver.getBackgroundBalance() + driver.getCouponBalance() + driver.getCommission()); - accountChangeDetail.setExplain("线下收款服务费支出"); - accountChangeDetail.setCreateTime(new Date()); - driver.setBalance(driver.getBalance() - n); - accountChangeDetail.setNewData(driver.getBalance() + driver.getBackgroundBalance() + driver.getCouponBalance() + driver.getCommission()); - driverService.updateById(driver); - accountChangeDetailService.saveData(accountChangeDetail); } } @@ -1629,6 +1783,10 @@ if(performanceRankingWarpper.getDriverId().compareTo(driverId) == 0){ break; } + if(i == performanceRankingWarppers.size() - 1){ + position = 0; + d = 0D; + } } MyAchievementWarpper myAchievementWarpper = new MyAchievementWarpper(); myAchievementWarpper.setType("订单"); @@ -1650,6 +1808,10 @@ } if(performanceRankingWarpper.getDriverId().compareTo(driverId) == 0){ break; + } + if(i == performanceRankingWarppers.size() - 1){ + position = 0; + d = 0D; } } myAchievementWarpper = new MyAchievementWarpper(); @@ -1673,6 +1835,10 @@ if(performanceRankingWarpper.getDriverId().compareTo(driverId) == 0){ break; } + if(i == performanceRankingWarppers.size() - 1){ + position = 0; + d = 0D; + } } myAchievementWarpper = new MyAchievementWarpper(); myAchievementWarpper.setType("佣金"); @@ -1689,6 +1855,39 @@ */ @Override public void completeCollection() { - this.baseMapper.completeCollection(); + List<Order> orders = this.selectList(new EntityWrapper<Order>().eq("state", 107).eq("status", 1) + .eq("payType", 3).last(" and UNIX_TIMESTAMP(getoffTime) + 600 <= UNIX_TIMESTAMP(now())")); + for (Order order : orders) { + order.setState(108); + order.setPayTime(new Date()); + if(null != order.getCouponId()){ + UserToCoupon userToCoupon = userToCouponService.selectById(order.getCouponId()); + Coupon coupon = couponService.selectById(userToCoupon.getCouponId()); + + Driver driver = driverService.selectById(order.getDriverId()); + AccountChangeDetail accountChangeDetail = new AccountChangeDetail(); + accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3)); + accountChangeDetail.setUserType(2); + accountChangeDetail.setUserId(order.getDriverId()); + accountChangeDetail.setCreateTime(new Date()); + accountChangeDetail.setOldData(driver.getCouponBalance() + driver.getCommission()); + accountChangeDetail.setType(1); + accountChangeDetail.setChangeType(7); + accountChangeDetail.setOrderId(order.getId()); + accountChangeDetail.setExplain("优惠券收入"); + driver.setCommission(driver.getCommission() + coupon.getCouponPreferentialAmount()); + accountChangeDetail.setNewData(driver.getCouponBalance() + driver.getCommission()); + driverService.updateById(driver); + accountChangeDetailService.insert(accountChangeDetail); + } + + this.updateById(order); + + try { + saveRevenue(order); + } catch (Exception e) { + e.printStackTrace(); + } + } } } -- Gitblit v1.7.1