多个订单待付款半小时倒计时功能

多个订单待付款半小时倒计时功能

前言

阅读这篇文章大概需要您2分钟

需求
将待付款订单设置成半小时未付款自动取消

要求
1、设置定时器,自动取消订单(后端)
2、每一个待付款订单显示倒计时并倒计时结束之后自动取消订单

最终效果多个订单待付款半小时倒计时功能
多个订单待付款半小时倒计时功能

设置定时器,自动取消订单(后端)

1、定时器(具体需求代码)

 	/**
     * 系统自动取消半小时没有付款订单
     *
     * @return
     */
    public boolean jobSystemCancelOrder() {

        // 获取当前时间一天前的时间
//        Calendar calendar = Calendar.getInstance();
//        calendar.add(Calendar.DAY_OF_MONTH, -1);
//
//        String cancelTime = TimeUtil.getDateTimeString(calendar.getTime());

        //获取当前时间的半小时之前的时间
        Calendar calendar = Calendar.getInstance();
        Calendar after = after(calendar, 1800000);  //得到指定或者当前时间前offset毫秒的Calendar

        String cancelTime = TimeUtil.getDateTimeString(after.getTime());    //得到string类型的时间

        // 获取下单半小时还未付款的订单
        List<Orders> ordersList = ordersReadDao.getUnPaiedOrders(cancelTime);

        if (ordersList != null && ordersList.size() > 0) {
            // 单条数据处理异常不影响其他数据执行
            for (Orders orders : ordersList) {
                // 事务管理
                DefaultTransactionDefinition def = new DefaultTransactionDefinition();
                def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
                TransactionStatus status = transactionManager.getTransaction(def);
                try {
                    Orders orderNew = new Orders();
                    orderNew.setId(orders.getId());
                    orderNew.setOrderState(Orders.ORDER_STATE_6);

                    Integer update = ordersWriteDao.update(orderNew);
                    if (update == 0) {
                        throw new BusinessException("系统自动取消订单时失败。");
                    }

                    OrderLog log = new OrderLog(0, "system", orders.getId(), orders.getOrderSn(),
                            "系统自动取消订单。", new Date());

                    int orderlogCount = orderLogWriteDao.save(log);
                    if (orderlogCount == 0) {
                        throw new BusinessException("系统自动取消订单,订单日志保存失败,请重试!");
                    }

                    // 返还积分
                    this.cancelOrderBackIntegral(orders);
                    // 还原销量
                    this.restoreActualSales(ordersProductReadDao.getByOrderId(orders.getId()));

                    transactionManager.commit(status);
                } catch (Exception e) {
                    transactionManager.rollback(status);
                    log.error("[OrderModel][jobSystemCancelOrder]系统自动取消订单时发生异常:", e);
                    log.error("[OrderModel][jobSystemCancelOrder]发生异常的订单:"
                            + JSON.toJSONString(orders));
                }
            }
        }

        return true;
    }

2、获取当前时间半小时之前的方法

	/**
     * 得到指定或者当前时间前offset毫秒的Calendar
     */
    public static Calendar after(Calendar c, long offset) {
        Calendar calendar = null;
        if (c != null) {
            calendar = c;
        } else {
            calendar = Calendar.getInstance();
        }

        calendar.setTimeInMillis(calendar.getTimeInMillis() - offset);
        return calendar;
    }

3、获取下单半小时还未付款的订单的sql代码

	/**
     * 获取cancelTime前发货的订单
     * 
     * @param cancelTime
     * @return
     */
    List<Orders> getUnPaiedOrders(@Param("cancelTime") String cancelTime);
	<select id="getUnPaiedOrders" resultMap="OrdersResult">
		select
		   *
		from `orders`
		where `order_state` = 1
		and `payment_status` = 0
		and `create_time` &lt;= #{cancelTime}
	</select>

每一个待付款订单显示倒计时并倒计时结束之后自动取消订单

1、在后台将每个订单剩余时间,转换成秒值,传入前端

将查询出的订单数据使用for循环遍历,得到数据存入集合

for(...){
 	//判断当前订单是否是待付款订单,是待付款订单就进去计算剩余时间
   if (orders.getOrderState() == Orders.ORDER_STATE_1 || orders.getOrderState() == Orders.ORDER_STATE_2){
      Date createTime = orders.getCreateTime();   //获取当前订单创建时间
      //半小时的毫秒值为1800000 
      long createTimeTime = createTime.getTime() + 1800000 ;     //订单的时间戳,订单的结束时间
      Date nowDate = new Date();  //当前时间
      long nowDateTime = nowDate.getTime();   //当前时间戳
      /**
      	使用订单结束时间-当前时间
      		为正数,就是剩余的毫秒值
      		为负数,代表当前订单未付款时间已经超出了半小时。在前端处理
      		除以1000,得到剩余秒值
      	*/
     orders.setTimeRemaining((int) (createTimeTime - nowDateTime) / 1000);     //将剩余秒数,存入集合
  }
}

2、在页面中,获取每一个订单的数据

<#list ordersList as order>
	<div class="order-crrinfo">
   		<#if (order.orderState==1)||(order.orderState==2)><!-- 订单状态 为1(未付款的订单)或者 2待确认 才能取消 -->
       		<input type="hidden" id="Remaining" value="${order.id}"/><!--订单号,用于取消订单-->
       		<div class="order-money">
       			<!--${order.timeRemaining}:当前订单剩余秒值-->
       			<span class="timeRemaining" left_time_int="${order.timeRemaining}"></span>后订单自动关闭
       		</div>
       		<br/>
    	</#if>
	</div>
</#list>

倒计时代码(大家需要的)

3、javascript代码(倒计时)

$(function() {
        //启用过期时钟
        order_expire_time();
    });

    //倒计时
    function counterClock(left_time) {
        var left_time = parseInt(left_time);
        var days_second = 86400; //每天时间
        var hours_second = days_second / 24;
        var minute_second = hours_second / 60;
        var str = '';
        // alert(left_time)
        if(left_time > 0) {
            var days = parseInt(left_time / days_second);
            str += (days > 0) ? days + '天' : '';
            var hours = parseInt((left_time - days * days_second) / hours_second);
            str += hours > 0 ? hours + '时' : '';
            var minutes = parseInt((left_time - days * days_second - hours_second * hours) / minute_second);
            str += minutes > 0 ? minutes + '分' : '';
            second = left_time - days * days_second - hours_second * hours - minutes * minute_second;
            str += second + '秒';
        }
        return str;
    }

    var x=0,c=0;  //简易线程控制

    //订单过期时间
    function order_expire_time() {
        $(".order-crrinfo .order-money").each(function() {	//each:遍历
            var time_obj = $(this).find('.timeRemaining');	//搜索所有段落中的后代 timeRemaining 元素
            var left_time_int = time_obj.attr('left_time_int');	//attr() 方法设置或返回被选元素的属性值。
            // alert(left_time_int)
            if(left_time_int) {
                var time_string = counterClock(left_time_int);	//调用倒计时方法,得到时间
                if(time_string == ''){	//如果订单剩余时间少于0
                    time_obj.html('<span></span>' + 0+"秒");
                    var id = $("#Remaining").val();
                    if (x == c) {
                        ++x;    //x=c; 执行一轮之后x就不等于c,等这一遍执行完了,重新加载页面。x又等于c了
                        //调用取消订单方法
                        $.ajax({
                            type: "GET",
                            url: domain + "/member/cancalorder.html",
                            data: {id: id},
                            dataType: "json",
                            success: function (data) {
                                if (data.success) {
                                    window.location.reload();
                                } else {
                                    jAlert(data.message);
                                }
                            },
                            error: function () {
                                jAlert("数据加载失败!");
                            }
                        });
                    }
                } else {	//大于0
                    time_obj.html('<span></span>' + time_string);
                    time_obj.attr('left_time_int', left_time_int - 1);	//倒计时减1
                }
            }
        });
        window.setTimeout(function() {
            order_expire_time();
        }, 1000);
    }

博主有话说
非常感谢大家看完我的博客,第一次写,如果有什么写的不好或者错误的欢迎指出。希望我的这篇文章可以帮助到您

上一篇:Java计算2个时间单位计算相差多少天


下一篇:JS 时间运算大全