diff --git a/ghy-quartz/src/main/java/com/ghy/quartz/service/OrderService.java b/ghy-quartz/src/main/java/com/ghy/quartz/service/OrderService.java index 50cbed6e..e1401f81 100644 --- a/ghy-quartz/src/main/java/com/ghy/quartz/service/OrderService.java +++ b/ghy-quartz/src/main/java/com/ghy/quartz/service/OrderService.java @@ -3,7 +3,7 @@ package com.ghy.quartz.service; public interface OrderService { // 更新超时环境订单 - void overTimeOrder(String orderStatus); + void overTimeOrder(String orderStatus) throws Exception; // 自动完成和分账 void autoFinishOrder(); diff --git a/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java b/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java index 0a418b24..3ddba3db 100644 --- a/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java +++ b/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java @@ -23,10 +23,8 @@ import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.math.BigDecimal; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Set; +import java.text.SimpleDateFormat; +import java.util.*; import java.util.stream.Collectors; @Service @@ -54,25 +52,23 @@ public class OrderServiceImpl implements OrderService { private ISysDeptConfigService sysDeptConfigService; @Override - public void overTimeOrder(String orderStatus) { - // 这是半小时前的时间 - Date halfHour = new Date(System.currentTimeMillis() - 30 * 60 * 1000); - // 这是4小时前的时间 - Date fourHour = new Date(System.currentTimeMillis() - 4 * 60 * 60 * 1000); - + public void overTimeOrder(String orderStatus) throws Exception{ // 查询符合超时的单 List orders = orderDetailService.selectByStatus(timeoutOrderStatus); for (OrderDetail order : orders) { if (order.getOrderStatus().equals(OrderStatus.SERVER.code())) { // 服务中状态要按预计上门时间计算超时 4h超时并且扣款 - if (order.getExpectTimeStart().before(fourHour)) { + long overTimeSec = this.getOverTimeSec(order.getExpectTimeStart(), 4 * 60 * 60 * 1000); + if (overTimeSec < System.currentTimeMillis()) { executor.execute(() -> orderTimeout(order, true)); } } else if (timeoutOrderStatus.contains(order.getOrderStatus())) { // 其它状态用update_time判断超时 30min超时 4h扣款 - if (fourHour.after(order.getUpdateTime())) { + long halfOverTimeSec = this.getOverTimeSec(order.getUpdateTime(), 30 * 60 * 1000); + long fourOverTimeSec = this.getOverTimeSec(order.getUpdateTime(), 4 * 60 * 60 * 1000); + if (halfOverTimeSec < System.currentTimeMillis()) { executor.execute(() -> orderTimeout(order, true)); - } else if (order.getUpdateTime().before(halfHour)) { + } else if (fourOverTimeSec < System.currentTimeMillis()) { executor.execute(() -> orderTimeout(order, false)); } } @@ -80,6 +76,56 @@ public class OrderServiceImpl implements OrderService { } + /** + * @param orderTime 单据时间/可能为上门开始时间 + * @param time 超时时间,0.5h/4h/8h等 + * @return 最低限制时间 + * @throws Exception + */ + private long getOverTimeSec(Date orderTime, long time) throws Exception{ + long overTime = orderTime.getTime(); + // 隔夜需要加上13个小时 + long isNight = 13 * 60 * 60 * 1000; + //设置日期格式 + SimpleDateFormat df = new SimpleDateFormat("HH:mm"); + Date nowTime =df.parse(df.format(new Date())); + // 早上8点-晚上19点 + Date amBeginTime = df.parse("08:00"); + Date pmEndTime = df.parse("19:00"); + //设置当前时间 + Calendar date = Calendar.getInstance(); + date.setTime(nowTime); + //设置开始时间 + Calendar beginTime = Calendar.getInstance(); + beginTime.setTime(amBeginTime); + //设置结束时间 + Calendar endTime = Calendar.getInstance(); + endTime.setTime(pmEndTime); + // 符合时间区间 + if(date.after(beginTime) && date.before(endTime)){ + // 当日单 + if(checkIsTodayOrder(orderTime)){ + overTime = overTime + time; + }else { + overTime = overTime + isNight + time; + } + } + return overTime; + } + + private Boolean checkIsTodayOrder(Date orderTime) throws Exception{ + // 订单日期 + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + Date orderDate = df.parse(df.format(orderTime)); + // 当前日期 + Date now = df.parse(df.format(new Date())); + if(orderDate.before(now)){ + return false; + }else { + return true; + } + } + /** * 处理订单超时与扣款 *