| | |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.MathContext; |
| | | import java.math.RoundingMode; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | |
| | | |
| | | @Value("${callbackPath}") |
| | | private String callbackPath;//支付回调网关地址 |
| | | |
| | | private Map<String, Timer> timerMap = new HashMap<>(); |
| | | |
| | | |
| | | |
| | |
| | | driverService.updateById(driver); |
| | | //推送状态 |
| | | if(null != order.getDriverId()){ |
| | | //推动订单数据 |
| | | redisUtil.addSetValue("orderService", order.getId().toString()); |
| | | pushUtil.pushOrderStatus(uid, 2, order.getId(), order.getStatus()); |
| | | }else{ |
| | | //开始推单 |
| | |
| | | * @return |
| | | */ |
| | | public Order getOrderPrice(Integer type, Double distance, Integer waitTime, Order order, String city){ |
| | | distance = new BigDecimal(distance).setScale(0, BigDecimal.ROUND_UP).doubleValue(); |
| | | waitTime = new BigDecimal(waitTime).setScale(0, BigDecimal.ROUND_UP).intValue(); |
| | | order = getOrderInitialPrice(order); |
| | | SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 5)); |
| | | if(null == systemConfig){ |
| | |
| | | order.setStartDistance(distance);//起步里程 |
| | | order.setStartPrice(num4);//起步价 |
| | | }else{ |
| | | BigDecimal subtract = new BigDecimal(distance).subtract(new BigDecimal(num3)).setScale(2, BigDecimal.ROUND_HALF_EVEN);//超出起步里程 |
| | | BigDecimal divide = subtract.divide(new BigDecimal(num5), 2, BigDecimal.ROUND_HALF_EVEN); |
| | | BigDecimal multiply = divide.multiply(new BigDecimal(num6)); |
| | | Double distance1 = distance;//原始里程 |
| | | order.setStartDistance(num3);//起步里程 |
| | | order.setStartPrice(num4);//起步价 |
| | | order.setOverDriveDistance(subtract.doubleValue());//超出起步里程 |
| | | order.setOverDriveDistance(new BigDecimal(distance1 - num3).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());//超出起步里程 |
| | | |
| | | distance = new BigDecimal(distance).setScale(0, RoundingMode.UP).doubleValue();//向上取整 |
| | | BigDecimal divide = new BigDecimal(distance - num3).divide(new BigDecimal(num5), 2, BigDecimal.ROUND_HALF_EVEN); |
| | | BigDecimal multiply = divide.multiply(new BigDecimal(num6)); |
| | | order.setOverDrivePrice(multiply.doubleValue());//超出起步里程费 |
| | | |
| | | //计算长途费(超出长途起始公里,费用开始按照长途规则计算。) |
| | |
| | | } |
| | | //计算长途里程超出的部分 |
| | | if(distance.compareTo(num8) > 0){ |
| | | BigDecimal subtract1 = new BigDecimal(distance).subtract(new BigDecimal(num8)).setScale(2, BigDecimal.ROUND_HALF_EVEN); |
| | | BigDecimal divide1 = subtract1.divide(new BigDecimal(num10), 2, BigDecimal.ROUND_HALF_EVEN); |
| | | order.setOverLongDistance(new BigDecimal(distance1 - num8).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());//超出长途里程 |
| | | |
| | | BigDecimal divide1 = new BigDecimal(distance - num8).divide(new BigDecimal(num10), 2, BigDecimal.ROUND_HALF_EVEN); |
| | | BigDecimal multiply1 = divide1.multiply(new BigDecimal(num11)); |
| | | order.setOverLongDistance(subtract1.doubleValue());//超出长途里程 |
| | | order.setOverLongDistancePrice(multiply1.doubleValue());//超出长途里程费 |
| | | } |
| | | } |
| | |
| | | |
| | | //等待费用 |
| | | if(waitTime.compareTo(num1 * 60) >= 0){ |
| | | order.setWaitTime(num1);//等待时长 |
| | | order.setWaitTime(num1 * 60);//等待时长 |
| | | order.setWaitTimePrice(num2);//等待费用 |
| | | |
| | | Integer w = waitTime - (num3 * 60); |
| | | Integer w = waitTime - (num1 * 60); |
| | | BigDecimal multiply = new BigDecimal(w).divide(new BigDecimal(60), 0, RoundingMode.UP).multiply(new BigDecimal(num4)); |
| | | order.setOutWaitTime(w);//等待时长超出分钟 |
| | | order.setOutWaitTimePrice(multiply.doubleValue());//等待时长超出费用 |
| | |
| | | |
| | | /** |
| | | * 订单推送逻辑 |
| | | * @param order |
| | | */ |
| | | public void pushOrder(Long orderId){ |
| | | try { |
| | |
| | | new Timer().schedule(new TimerTask() { |
| | | @Override |
| | | public void run() { |
| | | driver1.setServerStatus(1); |
| | | driverService.updateById(driver1); |
| | | |
| | | Order order1 = OrderServiceImpl.this.selectById(order.getId()); |
| | | if(order1.getState() == 101 || order1.getState() == 201){ |
| | | if(order1.getState() != 101 && order1.getState() != 201 && order1.getDriverId().compareTo(driver1.getId()) != 0){ |
| | | driver1.setServerStatus(1); |
| | | driverService.updateById(driver1); |
| | | } |
| | | |
| | | if(order1.getState() == 201 || (order1.getState() == 101 && null == order1.getDriverId())){ |
| | | driver1.setServerStatus(1); |
| | | driverService.updateById(driver1); |
| | | |
| | | order1.setHallOrder(1); |
| | | OrderServiceImpl.this.updateById(order1); |
| | | ExtraPushOrder(order); |
| | |
| | | driverService.updateById(driver); |
| | | if(state == 201){//转单的订单 |
| | | //停止定时任务 |
| | | Timer timer = timerMap.get(order.getId().toString()); |
| | | if(null != timer){ |
| | | timer.cancel(); |
| | | timerMap.remove(order.getId().toString()); |
| | | } |
| | | redisUtil.delSetValue("orderService", order.getId().toString()); |
| | | //原司机下班 TODO 2023-06-21 客户说取消此功能 |
| | | Driver oldDriver = driverService.selectById(oldDriverId); |
| | | oldDriver.setServerStatus(1); |
| | |
| | | } |
| | | |
| | | //推动订单数据 |
| | | pushOrderInfo(order.getId(), uid);//开始推送订单数据 |
| | | redisUtil.addSetValue("orderService", order.getId().toString()); |
| | | //发送系统消息 |
| | | systemMessageService.addSystemMessage(uid, 2, "接单成功", "您已成功接到用户订单,请尽快联系客户!"); |
| | | pushUtil.pushOrderStatus(order.getDriverId(), 2, order.getId(), order.getState()); |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 获取订单详情 |
| | | * @param orderId |
| | |
| | | */ |
| | | @Override |
| | | public OrderInfoWarpper queryOrderInfo(Integer uid, Long orderId) throws Exception { |
| | | Order order = this.selectById(orderId); |
| | | OrderInfoWarpper orderInfoWarpper = this.baseMapper.queryOrderInfo(orderId); |
| | | Integer wait = Integer.valueOf(orderInfoWarpper.getWaitTime()); |
| | | if(null != order.getStartWaitTime()){ |
| | | wait += Double.valueOf((System.currentTimeMillis() - order.getStartWaitTime().getTime()) / 1000).intValue(); |
| | | } |
| | | Integer s = wait % 60; |
| | | int m = Double.valueOf(wait / 60).intValue(); |
| | | orderInfoWarpper.setWaitTime((m < 10 ? ("0" + m) : m) + ":" + (s < 10 ? ("0" + s) : s)); |
| | | Double actualMileage = orderInfoWarpper.getActualMileage(); |
| | | orderInfoWarpper.setActualMileage(new BigDecimal(actualMileage / 1000).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); |
| | | |
| | | if(orderInfoWarpper.getTravelTime() == null){ |
| | | orderInfoWarpper.setTravelTime(0); |
| | | } |
| | |
| | | .where("'" + geocode.getCity() + "' like CONCAT('%', city, '%') and '" + geocode.getDistrict() + "' like CONCAT('%', district, '%') ")); |
| | | city = null != weatherCity ? weatherCity.getId().toString() : ""; |
| | | } |
| | | order = getOrderPrice(2, Double.valueOf(order.getActualMileage() / 1000), order.getWaitTime(), order, city); |
| | | order = getOrderPrice(2, Double.valueOf(order.getActualMileage()) / 1000, order.getWaitTime(), order, city); |
| | | |
| | | //修改司机状态和积分 |
| | | Driver driver = driverService.selectById(order.getDriverId()); |
| | | driver.setServerStatus(1); |
| | | driverService.updateById(driver); |
| | | saveIntegral(order); |
| | | redisUtil.delSetValue("orderService", order.getId().toString()); |
| | | break; |
| | | case 401: |
| | | order.setStartWaitTime(new Date()); |
| | |
| | | /** |
| | | * 定时任务推送订单数据 |
| | | * @param orderId |
| | | * @param uid |
| | | */ |
| | | public void pushOrderInfo(Long orderId, Integer uid){ |
| | | Timer timer = new Timer(); |
| | | timer.schedule(new TimerTask() { |
| | | @Override |
| | | public void run() { |
| | | String value = redisUtil.getValue("DRIVER" + uid); |
| | | Order order = OrderServiceImpl.this.selectById(orderId); |
| | | if(order.getState() == 106 || order.getState() == 301){ |
| | | Timer timer = timerMap.get(order.getId().toString()); |
| | | if(null != timer){ |
| | | timer.cancel(); |
| | | timerMap.remove(order.getId().toString()); |
| | | } |
| | | } |
| | | @Override |
| | | public void pushOrderInfo(Long orderId){ |
| | | Order order = this.selectById(orderId); |
| | | Integer driverId = order.getDriverId(); |
| | | String value = redisUtil.getValue("DRIVER" + driverId); |
| | | if(order.getState() == 106 || order.getState() == 301){ |
| | | redisUtil.delSetValue("orderService", orderId.toString()); |
| | | return; |
| | | } |
| | | |
| | | PushOrderInfoWarpper pushOrderInfoWarpper = new PushOrderInfoWarpper(); |
| | | pushOrderInfoWarpper.setId(orderId); |
| | | if(ToolUtil.isNotEmpty(value)){ |
| | | String[] split = value.split(","); |
| | | pushOrderInfoWarpper.setDriverLat(split[1]); |
| | | pushOrderInfoWarpper.setDriverLng(split[0]); |
| | | } |
| | | Integer w = 0; |
| | | if(null != order.getStartWaitTime()){ |
| | | w = Double.valueOf((System.currentTimeMillis() - order.getStartWaitTime().getTime()) / 1000).intValue(); |
| | | } |
| | | Integer wait = order.getWaitTime() + w; |
| | | Integer s = wait % 60; |
| | | pushOrderInfoWarpper.setWaitTime(Double.valueOf(wait / 60).intValue() + "." + s); |
| | | pushOrderInfoWarpper.setState(order.getState()); |
| | | pushOrderInfoWarpper.setActualMileage(Double.valueOf(order.getActualMileage() / 1000)); |
| | | pushOrderInfoWarpper.setTravelTime("0"); |
| | | if(null != order.getStartTime()){ |
| | | int travelTime = Double.valueOf((System.currentTimeMillis() - order.getStartTime().getTime()) / 1000).intValue(); |
| | | Integer ss = travelTime % 60; |
| | | pushOrderInfoWarpper.setTravelTime(Double.valueOf(travelTime / 60).intValue() + "." + ss); |
| | | } |
| | | if(null != order.getUserId()){ |
| | | pushUtil.pushOrderInfo(order.getUserId(), 1, pushOrderInfoWarpper); |
| | | } |
| | | if(order.getState() == 301){//司机取消不推送给司机 |
| | | CancelOrder cancelOrder = cancelOrderService.selectOne(new EntityWrapper<CancelOrder>().eq("orderId", order.getId()).eq("status", 1)); |
| | | if(null != cancelOrder && cancelOrder.getUserType() == 2){ |
| | | return; |
| | | } |
| | | } |
| | | pushUtil.pushOrderInfo(uid, 2, pushOrderInfoWarpper); |
| | | PushOrderInfoWarpper pushOrderInfoWarpper = new PushOrderInfoWarpper(); |
| | | pushOrderInfoWarpper.setId(orderId); |
| | | if(ToolUtil.isNotEmpty(value)){ |
| | | String[] split = value.split(","); |
| | | pushOrderInfoWarpper.setDriverLat(split[1]); |
| | | pushOrderInfoWarpper.setDriverLng(split[0]); |
| | | } |
| | | Integer w = 0; |
| | | if(null != order.getStartWaitTime()){ |
| | | w = Double.valueOf((System.currentTimeMillis() - order.getStartWaitTime().getTime()) / 1000).intValue(); |
| | | } |
| | | Integer wait = order.getWaitTime() + w; |
| | | Integer s = wait % 60; |
| | | Integer m = wait / 60; |
| | | pushOrderInfoWarpper.setWaitTime((m < 10 ? ("0" + m) : m) + ":" + (s < 10 ? ("0" + s) : s)); |
| | | pushOrderInfoWarpper.setState(order.getState()); |
| | | pushOrderInfoWarpper.setActualMileage(new BigDecimal(order.getActualMileage()).divide(new BigDecimal(1000), 2, RoundingMode.HALF_EVEN).doubleValue()); |
| | | pushOrderInfoWarpper.setTravelTime("0"); |
| | | if(null != order.getUserId()){ |
| | | pushUtil.pushOrderInfo(order.getUserId(), 1, pushOrderInfoWarpper); |
| | | } |
| | | if(order.getState() == 301){//司机取消不推送给司机 |
| | | CancelOrder cancelOrder = cancelOrderService.selectOne(new EntityWrapper<CancelOrder>().eq("orderId", order.getId()).eq("status", 1)); |
| | | if(null != cancelOrder && cancelOrder.getUserType() == 2){ |
| | | return; |
| | | } |
| | | },0, 5000); |
| | | timerMap.put(orderId.toString(), timer); |
| | | } |
| | | pushUtil.pushOrderInfo(driverId, 2, pushOrderInfoWarpper); |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | order.setState(301); |
| | | this.updateById(order); |
| | | redisUtil.delSetValue("orderService", orderId.toString()); |
| | | |
| | | CancelOrder cancelOrder = new CancelOrder(); |
| | | cancelOrder.setOrderId(orderId); |
| | |
| | | driverService.updateById(driver); |
| | | } |
| | | |
| | | pushUtil.pushOrderStatus(order.getUserId(), 1, order.getId(), order.getStatus()); |
| | | if(null != order.getUserId()){ |
| | | pushUtil.pushOrderStatus(order.getUserId(), 1, order.getId(), order.getStatus()); |
| | | } |
| | | return ResultUtil.success(); |
| | | } |
| | | |
| | |
| | | } |
| | | Integer waitTime = order.getWaitTime() + order.getOutWaitTime(); |
| | | Integer s = waitTime % 60; |
| | | orderPriceWarpper.setWaitTime(Double.valueOf(waitTime / 60).intValue() + "." + s); |
| | | Integer m = waitTime / 60; |
| | | orderPriceWarpper.setWaitTime((m < 10 ? "0" + m : m) + ":" + (s < 10 ? "0" + s : s)); |
| | | orderPriceWarpper.setWaitTimePrice(order.getWaitTimePrice() + order.getOutWaitTimePrice()); |
| | | orderPriceWarpper.setDiscountAmount(order.getDiscountAmount()); |
| | | orderPriceWarpper.setDiscountedPrice(order.getDiscountedPrice()); |
| | |
| | | Driver driver = driverService.selectById(order.getDriverId()); |
| | | AppUser appUser = appUserService.selectById(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); |
| | | 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)); |
| | |
| | | if(null != systemConfig1){ |
| | | JSONObject jsonObject1 = JSON.parseObject(systemConfig1.getContent()); |
| | | //司机推荐用户收入 |
| | | if(null != appUser.getInviterType() && appUser.getInviterType() == 2){ |
| | | if(null != appUser && null != appUser.getInviterType() && appUser.getInviterType() == 2){ |
| | | Double num1 = jsonObject1.getDouble("num1"); |
| | | num1 = (num3 >= num1 ? num1 : num3); |
| | | |