Bladeren bron

每几分钟扫描一次,符合条件的商家自动营业或者休息

liude 5 maanden geleden
bovenliggende
commit
a9aab79414

+ 6 - 7
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/MerchantServiceImpl.java

@@ -22,6 +22,7 @@ import com.chelvc.cloud.vehicle.server.service.CategoryService;
 import com.chelvc.cloud.vehicle.server.service.GoodsService;
 import com.chelvc.cloud.vehicle.server.service.MerchantService;
 import com.chelvc.cloud.vehicle.server.service.OmsCartItemService;
+import com.chelvc.cloud.vehicle.server.task.DateUtil;
 import com.chelvc.framework.base.context.SessionContextHolder;
 import com.chelvc.framework.common.model.Pagination;
 import com.chelvc.framework.common.util.AssertUtils;
@@ -34,10 +35,13 @@ import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
+import java.time.DayOfWeek;
+import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -437,17 +441,12 @@ public class MerchantServiceImpl extends ServiceImpl<MerchantMapper, Merchant> i
     /**
      * 每天定时更新商家得营业状态
      */
-//    @Scheduled(cron = "5 * * * * ?")
+    @Scheduled(cron = "1 * * * * ?")
     public void batchMerchantBusinessStatus() {
         List<Merchant> merchantList = this.lambdaQuery().list();
         //星期一至星期六: 09:00~18:00
         merchantList.forEach(item -> {
-            String opening = "10:00:00,18:00:00";
-            String[] openStr = opening.split(",");
-            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
-            LocalTime time1 = LocalTime.parse(openStr[0], formatter);
-            LocalTime time2 = LocalTime.parse(openStr[1], formatter);
-            if (time1.isAfter(LocalTime.now()) && time2.isAfter(LocalTime.now())) {
+            if (!DateUtil.timeQuantum(item.getOpening())) {
                 this.baseMapper.updateMerchantBusinessStatus(item.getId(), "0", "0");
             } else {
                 this.baseMapper.updateMerchantBusinessStatus(item.getId(), "1", "0");

+ 99 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/task/DateUtil.java

@@ -0,0 +1,99 @@
+package com.chelvc.cloud.vehicle.server.task;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+public class DateUtil {
+    public static void main(String[] args)  {
+        String timeData = "星期二至星期二: 09:00~23:00";
+        System.out.println(timeQuantum(timeData));
+    }
+
+    public static boolean  timeQuantum(String timeData){
+        Calendar cal = Calendar.getInstance(); // 获得一个日历
+        SimpleDateFormat sdf = new  SimpleDateFormat("HH:mm");//时间格式
+        Date nowDate = new Date();//当前时间
+        String[] sdfSplit = sdf.format(nowDate).split(" ");//固定年月日为当前时间   只比较时间
+        String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };//格式
+        String[] weekAndTime = timeData.split(": ");
+        String[] weeks = weekAndTime[0].split("至");
+        String[] times = weekAndTime[1].split("~");
+        cal.setTime(nowDate);
+        int w = cal.get(Calendar.DAY_OF_WEEK) - 1; // 指示一个星期中的某天。
+        String nowDateWeek = weekDays[w];//当前时间星期几
+        //如果开始时间大约结束时间就互换 如:星期二 到星期一
+        if(getIndex(weeks[0])>getIndex(weeks[1])){
+            String temp = weeks[0];
+            weeks[0] = weeks[1];
+            weeks[1] = temp;
+        }
+        //判断当前时间 是否在时间段中
+        if(getIndex(nowDateWeek) >= getIndex(weeks[0]) && getIndex(nowDateWeek) <= getIndex(weeks[1])){
+            //是否为同一天
+            if(weeks[0].equals(weeks[1])){
+                    //当前时间在时间段范围内
+                    if(isTimeBetween(times[0],times[1])){
+                        return true;
+                    }else{
+                        return false;
+                    }
+                //比较当前时间是否在此时间段内
+            }else{//不是同一天
+                //当前星期几等于开始星期几 或者等于结束星期几
+                if(getIndex(nowDateWeek)==getIndex(weeks[0]) || getIndex(nowDateWeek)==getIndex(weeks[1])){
+                        //当前星期几等于 开始星期几
+                        if(getIndex(nowDateWeek)==getIndex(weeks[0])){
+                            if(isTimeBetween(times[0],times[1])){
+                                return true;
+                            }
+                            return false;
+                        }else{//当前星期几等于 结束星期几
+                            if(isTimeBetween(times[0],times[1])){
+                                return true;
+                            }
+                            return false;
+                        }
+                }else{//不等于,包括在中间 当前为星期三 ,开始为星期一结束为星期五
+                    if(isTimeBetween(times[0],times[1])){
+                        return true;
+                    }
+                    return false;
+                }
+            }
+        }
+        return false;
+    }
+    public static Integer getIndex(String week){
+        String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };//格式
+        Integer index = null;
+        for(int i = 0 ;i<weekDays.length;i++){
+            if(week.equals(weekDays[i])){
+                if(i == 0){//星期日
+                    return index = 7;
+                }
+                return index = i;
+            }
+        }
+        return 0;
+    }
+
+    public static boolean isTimeBetween(String startTime,String endTime) {
+        Calendar calendar = Calendar.getInstance();
+        String[] startTimes = startTime.split(":");
+        String[] endTimes = endTime.split(":");
+        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
+        int hour = calendar.get(Calendar.HOUR_OF_DAY);
+        int minute = calendar.get(Calendar.MINUTE);
+
+        if (dayOfWeek >= Calendar.MONDAY && dayOfWeek <= Calendar.SATURDAY) {
+            if (hour == Integer.valueOf(startTimes[0]) && minute >= Integer.valueOf(startTimes[1]) || hour > Integer.valueOf(startTimes[0]) || (hour == Integer.valueOf(startTimes[0]) && minute == Integer.valueOf(startTimes[1]))) {
+                if (hour == Integer.valueOf(endTimes[0]) && minute <= Integer.valueOf(endTimes[1]) || hour < Integer.valueOf(endTimes[0]) || (hour == Integer.valueOf(endTimes[0]) && minute == Integer.valueOf(endTimes[1]))) {
+                    return true;
+                }
+            }
+        } else {
+            return false;
+        }
+        return false;
+    }
+}