多个订单待付款半小时倒计时功能
前言
阅读这篇文章大概需要您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` <= #{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);
}
博主有话说
非常感谢大家看完我的博客,第一次写,如果有什么写的不好或者错误的欢迎指出。希望我的这篇文章可以帮助到您