Timer定时器轮询拉取订单

自己根据工作中遇到的情况进行总结的,对其他人应该无用

package com.wanshun.drivingservice.task;

import com.wanshun.common.code.anwser.AnwserCode;
import com.wanshun.common.database.redis.RedisCache;
import com.wanshun.common.utils.JsonUtil;
import com.wanshun.common.utils.StringUtil;
import com.wanshun.im.client.clientao.ClientMessagePacketAo;
import com.wanshun.drivingservice.ao.VnInfoAo;
import com.wanshun.drivingservice.async.OrderPersistence;
import com.wanshun.drivingservice.constants.MqttUrlConstants;
import com.wanshun.drivingservice.constants.OrderStatus;
import com.wanshun.drivingservice.rpcao.driver.RpcDrivingDriverInfoAo;
import com.wanshun.drivingservice.rpcao.order.RpcCostEstimateAo;
import com.wanshun.drivingservice.rpcao.order.RpcDriverPositionAo;
import com.wanshun.drivingservice.rpcao.order.RpcOrderTraceAo;
import com.wanshun.drivingservice.rpcao.order.RpcPollingOrderInfoAo;
import com.wanshun.drivingservice.rpcvo.driver.RpcDrivingDriverInfoVo;
import com.wanshun.drivingservice.rpcvo.order.*;
import com.wanshun.drivingservice.rpcvo.user.RpcCarOwnerInfoVo;
import com.wanshun.drivingservice.service.DrivingDriverService;
import com.wanshun.drivingservice.service.OrderService;
import com.wanshun.drivingservice.spingboot.SpringBeanLoader;
import com.wanshun.drivingservice.springboot.TimeConfig;
import com.wanshun.drivingservice.utils.DrivingDateUtil;
import com.wanshun.drivingservice.vo.PollingFailedData;
import com.wanshun.drivingservice.wrap.*;
import com.wanshun.im.client.clientapi.IMPushMessageService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

/**
 * 车主下单后, 轮询拉取订单信息
 * E代驾接口地址
 * http://open.d.api.edaijia.cn/doc/
 */
public class PollingOrderTimerTask {
    private static Logger logger = LoggerFactory.getLogger(PollingOrderTimerTask.class);

    private OrderService orderService;
    private RedisCache redisCache;
    private OrderPersistence orderPersistence;
    //private VirtualNumInfoService virtualNumInfoService;
    private IMPushMessageService imPushMessageService;
    private RpcPollingOrderInfoAo pollingOrderInfoAo;
    private RpcCarOwnerInfoVo carOwnerInfo;
    private Timer taskTimer;
    private long period;
    private int mapType;
    private DrivingDriverService drivingDriverService;
    private String dutyCancelTime;
    private boolean isPushData;
    private RpcPollingOrderInfoDataVo pollingOrderInfo;

    public PollingOrderTimerTask(RpcPollingOrderInfoAo pollingOrderInfoAo, int mapType, long period) {
        this.pollingOrderInfoAo = pollingOrderInfoAo;
        this.orderService = SpringBeanLoader.getSpringBean(OrderService.class);
        this.redisCache = SpringBeanLoader.getSpringBean(RedisCache.class);
        this.orderPersistence = SpringBeanLoader.getSpringBean(OrderPersistence.class);
        this.drivingDriverService = SpringBeanLoader.getSpringBean(DrivingDriverService.class);
        //this.virtualNumInfoService = SpringBeanLoader.getSpringBean(VirtualNumInfoService.class);
        this.imPushMessageService = SpringBeanLoader.getSpringBean(IMPushMessageService.class);
        this.period = period;
        this.mapType = mapType;
        this.pollingOrderInfo = new RpcPollingOrderInfoDataVo();

    }

    public void start() {
        this.taskTimer = new Timer();
        this.taskTimer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                String bookingId = redisCache.get(pollingOrderInfoAo.getBookingId());
                logger.info("PollingOrderTimerTask>>>>预约订单号==============" + bookingId);
                if(StringUtil.isEmpty(pollingOrderInfoAo.getBookingId())) {
                    logger.info("bookingId: {} PollingOrderTimerTask", pollingOrderInfoAo.getBookingId());
                    stop();
                    return;
                }

                try {
                    pollingOrderInfo = orderService.getPollingOrderInfo(pollingOrderInfoAo);
                    logger.info("车主下单后, 定时拉取订单信息: {}", pollingOrderInfo);

                    if(pollingOrderInfo != null && "0".equals(pollingOrderInfo.getCode())) {

                        //获取e代驾拉取订单接口数据并启动当前订单接口定时拉取
                        getPollingOrderInfo(pollingOrderInfo);

                    }else if (pollingOrderInfo == null){//如果e代驾拉去订单接口返回为空则重新请求

                        pollingOrderInfo = orderService.getPollingOrderInfo(pollingOrderInfoAo);
                        logger.info("车主下单后, 定时拉取订单信息: {}", pollingOrderInfo);

                        if(pollingOrderInfo != null && "0".equals(pollingOrderInfo.getCode())) {

                            //获取e代驾拉取订单接口数据并启动当前订单接口定时拉取
                            getPollingOrderInfo(pollingOrderInfo);
                        }
                    }
                }catch (Exception e){
                    logger.info("获取e代驾拉取订单接口信息失败");
                    e.printStackTrace();
                }

            }
        }, 0, this.period);
    }

    /**
     * 获取e代驾拉取订单接口数据并启动当前订单接口定时拉取
     * @param pollingOrderInfo
     */
    private void getPollingOrderInfo(RpcPollingOrderInfoDataVo pollingOrderInfo){
        /**
         * pollingState的取值
         * 0 继续请求
         * 1 派单失败
         * 2 司机已接单
         */
        final String pollingState = pollingOrderInfo.getData().getPollingState();

        if("1".equals(pollingState)) {//派单失败
            logger.info("------ 派单失败 -------");
            RpcDrivingOrderDetailVo drivingOrderDetailVo = orderService.getCurrentOrder(pollingOrderInfoAo.getBookingId());
            if(drivingOrderDetailVo == null){
                stop();
            }else {
                //更新数据库状态
                orderPersistence.updateDrivingOrderStatus(pollingOrderInfoAo.getBookingId(),drivingOrderDetailVo.getOrderId());

                PollingFailedData pollingFailedData = new PollingFailedData();
                pollingFailedData.setBookingId(pollingOrderInfoAo.getBookingId());
                pollingFailedData.setOrderStatus(190);

                ClientMessagePacketAo imPacket = new ClientMessagePacketAo();
                imPacket.setTtl(10 * 60);
                imPacket.setId(Long.parseLong(pollingOrderInfoAo.getUserId()));
                imPacket.setData(pollingFailedData);
                imPacket.setAnwserCode(new AnwserCode(190, "派单失败"));

                logger.info("派单失败: {}", JsonUtil.toJson(imPacket));

//                rpcPassengerGateWayService.publishBusinessMsg(MqttUrlConstants.POLLING_ORDER, packet);
                imPacket.setUrl(MqttUrlConstants.POLLING_ORDER);
                imPushMessageService.publishBusinessMsg(imPacket);
                stop();
            }

        } else if("2".equals(pollingState)) {//司机已接单
            logger.info("------ 司机已接单 -------");

            stop();

            dutyCancelTime = DrivingDateUtil.getCurrentTimeAfterMinutes(3);

            if(!isPushData){

                RpcDriverPositionAo driverPositionAo = new RpcDriverPositionAo();
                driverPositionAo.setBookingId(pollingOrderInfoAo.getBookingId());
                driverPositionAo.setDriverId(pollingOrderInfo.getData().getDriverId());
                driverPositionAo.setOrderId(pollingOrderInfo.getData().getOrderId());
                driverPositionAo.setUserId(pollingOrderInfoAo.getUserId());

                RpcOrderTraceAo orderTraceAo = new RpcOrderTraceAo();
                orderTraceAo.setOrderId(pollingOrderInfo.getData().getOrderId());
                orderTraceAo.setStart(System.currentTimeMillis() / 1000);
                orderTraceAo.setBookingId(pollingOrderInfoAo.getBookingId());
                orderTraceAo.setDriverId(pollingOrderInfo.getData().getDriverId());
                orderTraceAo.setUserId(pollingOrderInfoAo.getUserId());

                /**
                 * dutyCancelTime
                 */
                redisCache.set(pollingOrderInfoAo.getUserId() + "_dutyCancelTime", dutyCancelTime, 24 * 60 * 60);

                /**
                 * 获取起始地点的经纬度和目的地的经纬度
                 * 调用预估费接口获取预估费
                 */
                RpcGetUpAndDestVo orderStartDestLatLon = orderPersistence.getOrderStartDestLatLon(pollingOrderInfoAo.getBookingId());

                RpcCostEstimateAo costEstimateAo = new RpcCostEstimateAo();
                costEstimateAo.setMapType(mapType);
                costEstimateAo.setUserId(pollingOrderInfoAo.getUserId());
                costEstimateAo.setStartLng(orderStartDestLatLon.getStartLon());
                costEstimateAo.setStartLat(orderStartDestLatLon.getStartLat());
                costEstimateAo.setEndLng(orderStartDestLatLon.getDestLon());
                costEstimateAo.setEndLat(orderStartDestLatLon.getDestLat());

                //获取预估费
                RpcCostEstimateDataVo costEstimate = orderService.getCostEstimate(costEstimateAo);
                EstimateFeeWrap estimateFeeWrap = new EstimateFeeWrap();

                if(costEstimate != null && costEstimate.getCode() == 0) {
                    estimateFeeWrap.setFee(String.valueOf(costEstimate.getData().getFee()));
                    estimateFeeWrap.setFeeDetail(costEstimate.getData().getFeeDetail());
                }

                //获取司机信息
                RpcDriverPositionDataVo driverPositionDataVo = orderService.getDriverPosition(driverPositionAo);
                RpcDriverPositionVo driver = driverPositionDataVo.getData().getDriver();
                logger.info("PollingOrderTimerTask,e代驾当前订单司机位置接口中的司机信息,driver" + JsonUtil.toJson(driver));

                //如果后台kafka消息队列中在数据库中存储了订单状态数据则在task中不再存储
                if(StringUtil.isEmpty(redisCache.get(pollingOrderInfoAo.getBookingId() + 301))){
                    /**
                     * 更新订单状态和订单ID
                     */
                    orderPersistence.updateOrderOrderStatusAndOrderId(pollingOrderInfo.getData().getOrderId(),pollingOrderInfoAo.getBookingId(),pollingOrderInfo.getData().getDriverId(),OrderStatus.ORDER_STATUS_RECEIVED,JsonUtil.toJson(estimateFeeWrap),driverPositionDataVo.getData().getDriver().getPhone());
                }

                //查询司机信息
                RpcDrivingDriverInfoVo rpcDrivingDriverInfoVo = drivingDriverService.getDriverInfo(driver.getDriverId());
                logger.info("PollingOrderTimerTask,查询司机信息,rpcDrivingDriverInfoVo :" + JsonUtil.toJson(rpcDrivingDriverInfoVo));
                if(rpcDrivingDriverInfoVo == null){
                    //将司机信息存入数据库
                    RpcDrivingDriverInfoAo rpcDrivingDriverInfoAo = new RpcDrivingDriverInfoAo();
                    rpcDrivingDriverInfoAo.setName(driver.getName());
                    rpcDrivingDriverInfoAo.setPhone(driver.getPhone());
                    rpcDrivingDriverInfoAo.setNewLevel(driver.getNewLevel());
                    rpcDrivingDriverInfoAo.setDrivingAge(Integer.parseInt(driver.getYear()));
                    rpcDrivingDriverInfoAo.setDriverNo(driver.getDriverId());
                    rpcDrivingDriverInfoAo.setDriverUrl(driver.getPictureSmall());

                    rpcDrivingDriverInfoAo.setGoback(0);
                    rpcDrivingDriverInfoAo.setServiceTimes(0);
                    rpcDrivingDriverInfoAo.setState(0);
                    rpcDrivingDriverInfoAo.setLowOpinionTimes(0);
                    rpcDrivingDriverInfoAo.setHighOpinionTimes(0);
                    rpcDrivingDriverInfoAo.setRecommand(0);
                    rpcDrivingDriverInfoAo.setRole(0);
                    rpcDrivingDriverInfoAo.setIsRemote(0);
                    rpcDrivingDriverInfoAo.setReadyInTime(0);
                    rpcDrivingDriverInfoAo.setUpdatetime(new Date());
                    rpcDrivingDriverInfoAo.setCreateTime(new Date());

                    drivingDriverService.addDriverInfo(rpcDrivingDriverInfoAo);
                }

                //如果e代驾司机的当前订单接口星级和手机号与数据库不同则更改
                if(rpcDrivingDriverInfoVo != null && driver != null){
                    if((!rpcDrivingDriverInfoVo.getNewLevel().equals(driver.getNewLevel())) || (!rpcDrivingDriverInfoVo.getPhone().equals(driver.getPhone()))){
                        RpcDrivingDriverInfoAo rpcDrivingDriverInfoAo = new RpcDrivingDriverInfoAo();
                        rpcDrivingDriverInfoAo.setNewLevel(driver.getNewLevel());
                        rpcDrivingDriverInfoAo.setPhone(driver.getPhone());
                        rpcDrivingDriverInfoAo.setDriverNo(driver.getDriverId());

                        logger.info("如果e代驾司机的当前订单接口星级和手机号与数据库不同则更改,数据更改的入参,rpcDrivingDriverInfoAo==" + JsonUtil.toJson(rpcDrivingDriverInfoAo));
                        drivingDriverService.updateDriverDetail(rpcDrivingDriverInfoAo);
                    }
                }

                try {
                    /**
                     * 绑定司机虚拟号
                     */
                    VnInfoAo vnInfoAo = new VnInfoAo();
                    vnInfoAo.setUserId(Long.parseLong(pollingOrderInfoAo.getUserId()));
                    vnInfoAo.setOrderId(carOwnerInfo.getDrivingOrderId());
                    vnInfoAo.setDriverPhone(driverPositionDataVo.getData().getDriver().getPhone());

                    //virtualNumInfoService.updateNoDriver(vnInfoAo);
                }catch (Exception e){
                    logger.error("绑定车主用户虚拟号失败,则用用户自身手机号");
                }

                /**
                 * bookingId存入缓存
                 */
                redisCache.set(pollingOrderInfoAo.getBookingId(),pollingOrderInfoAo.getBookingId(),24 * 60 * 60);

                /**
                 * 司机接单, 轮询获取实施费用和轨迹
                 */
                new OrderDriverTimerTask(orderTraceAo, driverPositionAo, mapType, TimeConfig.ACTUAL_ORDER_DRIVER_TIME_DISTANCE).start();

                isPushData = true;
            }
        }
    }

    public void stop() {
        this.redisCache.deleteKey(this.pollingOrderInfoAo.getBookingId());

        if(this.taskTimer != null) {
            this.taskTimer.cancel();
            this.taskTimer = null;
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: timer定时器是一种计时工具,常用于需要定时执行某些任务的场景中。它能够在设定的时间到达后触发某个事件或执行某段代码。 timer定时器的使用非常灵活,可以根据需求设置不同的时间间隔和执行次数。常见的定时器有单次定时器和循环定时器两种。 单次定时器可以在指定的时间间隔后执行一次任务,并且只执行一次。例如,我们可以设置一个单次定时器,在5秒后触发某个函数执行。 循环定时器可以按照设定的时间间隔不断重复执行任务。例如,我们可以设置一个循环定时器,每隔1分钟触发某个函数执行。 timer定时器不仅可以用于编程语言中,也可以用在各种电子设备中。比如,我们可以在手机上设置一个定时器,用来提醒我们在某个时间点做某件事情,或者在烹饪过程中使用定时器来控制食物的烹饪时间。 总之,timer定时器是一种非常实用的工具,可以在需要定时执行任务的场景中发挥重要作用。无论是在编程中还是在日常生活中,我们都可以利用timer定时器来提高效率和方便操作。 ### 回答2: timer定时器是一种用于控制时间间隔的设备或工具。它可以在给定的时间间隔内执行特定的任务或操作。 timer定时器通常用于各种计时和定时操作,例如在游戏中实现角色的移动、动画效果的切换,或者定时播放音乐等。 在编程中,我们可以使用timer定时器实现事件的定时触发。通过设置一个特定的时间间隔和一个回调函数,当时间到达设定的时间间隔时,定时器将会触发回调函数,并执行其中的代码。 timer定时器可以在编程语言中以不同形式实现,例如在C语言中,我们可以使用标准库中的函数来创建和使用定时器。在C语言中,我们通常需要定义一个回调函数,用于实现定时触发时需要执行的操作,然后使用定时器函数来设置时间间隔和回调函数。 定时器的使用可以帮助我们在程序中实现各种时间相关的任务,提高程序的可靠性和运行效率。但是需要注意的是,在使用定时器时需要合理设置时间间隔,避免频繁触发定时器导致系统负荷过大和性能下降。 总结起来,timer定时器是一种用于控制时间间隔的设备或工具,它在编程中可以用来实现各种时间相关的操作。通过设置时间间隔和回调函数,我们可以实现定时触发并执行相应的代码。 ### 回答3: timer定时器是一种用来测量或控制时间间隔的设备或工具。它通常用于在特定时间间隔内执行一些操作或发出信号。 timer定时器有广泛的应用领域。在家庭生活中,我们可以使用定时器来设置闹钟,提醒我们起床、上班、做饭等。在厨房中,我们可以设置烤箱定时器来保证食物在正确定时烹饪,防止过度或不足。 在工业领域,timer定时器被广泛应用于自动化系统中。它可以用来控制设备的运行时间,例如定时关闭空调或照明设备,节约能源。定时器还可以用于控制机器的运转周期,在特定时间间隔内启动或停止机器,提高生产效率。 在计算机编程中,timer定时器也是一个重要的概念。它可以用来控制代码的执行时间,例如设置一个定时器在特定时间间隔内反复执行某个函数或代码块。这在游戏开发中很常见,用来实现动画效果或定期更新游戏状态。 总之,timer定时器在我们的生活和工作中扮演着重要的角色。无论是作为一个简单的时间管理工具还是一个复杂的控制设备,它都能够帮助我们提高效率、节约时间,并实现各种不同的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值