Browse Source

1.处理预约订单,距离半个小时才显示

qmj 5 days ago
parent
commit
e33bc231f8

+ 24 - 1
ruoyi-admin/src/main/java/com/ruoyi/app/mendian/OperatingHoursController.java

@@ -1,15 +1,19 @@
 package com.ruoyi.app.mendian;
 
+import com.ruoyi.app.mendian.dto.AppointmentTimeDto;
+import com.ruoyi.app.utils.OperatingUtil;
 import com.ruoyi.common.annotation.Anonymous;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysDictData;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.MessageUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.system.domain.OperatingHours;
 import com.ruoyi.system.service.IOperatingHoursService;
+import com.ruoyi.system.service.ISysDictTypeService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -22,7 +26,7 @@ import java.util.Map;
 
 /**
  * OperatingHoursController
- * 
+ *
  * @author ruoyi
  * @date 2025-02-11
  */
@@ -32,6 +36,25 @@ public class OperatingHoursController extends BaseController
 {
     @Autowired
     private IOperatingHoursService operatingHoursService;
+    @Autowired
+    private ISysDictTypeService dictTypeService;
+
+    /**
+     * 获取客户端预约时间段
+     *
+     * @return
+     */
+    @Anonymous
+    @GetMapping("/getAppointmentTime")
+    public AjaxResult getAppointmentTime(){
+        List<SysDictData> dictList = dictTypeService.selectDictDataByType("sys_operating_hours");
+
+        AppointmentTimeDto dto = new AppointmentTimeDto();
+        dto.setStartTime(dictList.get(0).getDictValue());
+        dto.setEndTime(dictList.get(dictList.size()-1).getDictValue());
+        List<AppointmentTimeDto> appointmentTimeList = OperatingUtil.getAppointmentTime(dto);
+        return success(appointmentTimeList);
+    }
 
     /**
      * 添加时间段

+ 12 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/mendian/dto/AppointmentTimeDto.java

@@ -0,0 +1,12 @@
+package com.ruoyi.app.mendian.dto;
+
+import lombok.Data;
+
+/**
+ * 预约时间DTO
+ */
+@Data
+public class AppointmentTimeDto {
+    private String startTime;
+    private String endTime;
+}

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/app/order/PosOrderController.java

@@ -864,7 +864,7 @@ public class PosOrderController extends BaseController {
         IPage<PosOrder> palist = new Page<>(page, size);
         QueryWrapper<PosOrder> queryWrapper = new QueryWrapper<>();
         queryWrapper.select().orderByDesc("cretim");
-        queryWrapper.eq("qs_id", id);
+        queryWrapper.eq("qs_id", id).eq("is_display", true);
         if (!"".equals(state)) {
             if (state.equals("z234")) {
                 queryWrapper.in("state", 2, 3, 4);
@@ -946,7 +946,7 @@ public class PosOrderController extends BaseController {
         queryWrapper.select().orderByDesc("cretim");
         queryWrapper.eq("sh_id", id);
         System.out.println("商户id:" + id);
-        queryWrapper.eq("md_id", mdId);
+        queryWrapper.eq("md_id", mdId).eq("is_display", true);
         if (!"".equals(state)) {
             if (state.equals("z01")) {
                 queryWrapper.apply(" ((state = 0 AND (collect_payment = 1 OR type = 1)) OR (state = 1))");

+ 30 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/order/TestTask.java

@@ -2,6 +2,8 @@ package com.ruoyi.app.order;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.app.utils.DateUtil;
+import com.ruoyi.app.utils.PayPush;
 import com.ruoyi.app.utils.zaloPay.ZaloPay;
 import com.ruoyi.app.utils.zaloPay.ZaloPayConfig;
 import com.ruoyi.app.utils.zaloPay.ZaloPayProperties;
@@ -21,6 +23,7 @@ import org.springframework.stereotype.Component;
 
 import java.io.IOException;
 import java.net.URISyntaxException;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -125,4 +128,31 @@ public class TestTask {
             posorder.setQishouBilling(order);
         }
     }
+
+    /**
+     * 检查预约单
+     */
+
+    public void checkAppointmentOrder() {
+        int minute = DateUtil.getAppoinmentOrderHandleTime();
+        System.out.println("检查预约单,预约检查时间:" + minute);
+        LambdaQueryWrapper<PosOrder> query = new LambdaQueryWrapper<>();
+        query.isNotNull(PosOrder::getDelryTime)
+                .eq(PosOrder::getType, 0L)
+                .ne(PosOrder::getDelryTime, "")
+                .eq(PosOrder::getIsDisplay, false)
+                .apply("((collect_payment = '1' AND state = 0) OR (collect_payment <> '1' AND state = 1))");
+        List<PosOrder> orders = posOrderMapper.selectList(query);
+        for (PosOrder order : orders) {
+            boolean isDisplay = DateUtil.isNearOrPastStartTime(order.getDelryTime(), minute);
+            if (isDisplay) {
+                PosOrder update = new PosOrder();
+                update.setId(order.getId());
+                update.setDisplayTime(new Date());
+                update.setIsDisplay(true);
+                posOrderService.saveOrUpdate(update);
+            }
+        }
+    }
+
 }

+ 22 - 1
ruoyi-admin/src/main/java/com/ruoyi/app/order/UserOrderController.java

@@ -12,6 +12,7 @@ import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.MessageUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.domain.*;
 import com.ruoyi.system.service.*;
 import com.ruoyi.system.utils.Auth;
@@ -66,7 +67,7 @@ public class UserOrderController extends BaseController {
             }
             shdz= JSON.toJSONString(usadd);
         }
-        createOrderParent(input,Long.valueOf(id),shdz);
+//        createOrderParent(input,Long.valueOf(id),shdz);
         createOrderChild(input,Long.valueOf(id),Long.valueOf(id),shdz);
 
         OrderParent result = orderParentService.getOne(new LambdaQueryWrapper<OrderParent>().eq(OrderParent::getDdId, input.getDdId().toString()));
@@ -112,11 +113,14 @@ public class UserOrderController extends BaseController {
         }
         // 循环items,为每个item创建一条PosOrder
         for (OrderCreatItem item : input.getItems()) {
+
             // 检查门店是否开放
             checkStoreOpen(storeList,hourslist,item,dateUtil);
             int index = input.getItems().indexOf(item) + 1;
             String subddId = ddId;
             PosOrder posOrder = new PosOrder();
+            posOrder.setIsDisplay(false);
+            handleIsDisplay(posOrder);
             posOrder.setShdzId(input.getShdzId());
             // 设置子订单的基本信息
             posOrder.setDdId(subddId);
@@ -166,6 +170,23 @@ public class UserOrderController extends BaseController {
         }
     }
 
+    //设置显示状态
+    private void handleIsDisplay(PosOrder posOrder){
+        if (StringUtils.isEmpty(posOrder.getDelryTime())) {
+            posOrder.setIsDisplay(true);
+            posOrder.setDisplayTime(new Date());
+        }
+        //预约单不在时间范围内不显示
+        if (StringUtils.isNotEmpty(posOrder.getDelryTime())) {
+            int minute = DateUtil.getAppoinmentOrderHandleTime();
+            boolean isNear = DateUtil.isNearOrPastStartTime(posOrder.getDelryTime(), minute);
+            if (isNear) {
+                posOrder.setIsDisplay(true);
+                posOrder.setDisplayTime(new Date());
+            }
+        }
+    }
+
 
     private void createFootprint(Long uid,Long mdId){
         QueryWrapper<UserFootprint> Wrapper = new QueryWrapper<>();

+ 64 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/utils/DateUtil.java

@@ -1,5 +1,7 @@
 package com.ruoyi.app.utils;
 
+import com.ruoyi.common.core.domain.entity.SysDictData;
+import com.ruoyi.common.utils.DictUtils;
 import lombok.SneakyThrows;
 
 import java.text.DateFormat;
@@ -9,10 +11,72 @@ import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.List;
 import java.util.Locale;
 
 public class DateUtil {
 
+    /**
+     * 检查当前时间是否接近或已超过开始时间
+     * @param time 时间字符串,格式:2025-11-13 16:00-17:00
+     * @param minute 分钟数,例如30
+     * @return true:当前时间距离开始时间小于等于minute分钟,或者已经超过开始时间;false:其他情况
+     */
+    @SneakyThrows
+    public static boolean isNearOrPastStartTime(String time,int minute){
+        if (time == null || time.isEmpty()) {
+            return false;
+        }
+
+        // 解析时间字符串,提取日期和开始时间
+        // 格式:2025-11-13 16:00-17:00
+        String trimmedTime = time.trim();
+        String[] parts = trimmedTime.split(" ");
+        if (parts.length != 2) {
+            return false;
+        }
+
+        String dateStr = parts[0].trim(); // 2025-11-13
+        String timeRange = parts[1].trim(); // 16:00-17:00
+
+        // 提取开始时间
+        String startTimeStr = timeRange.split("-")[0].trim(); // 16:00
+
+        // 构建完整的开始时间字符串
+        String fullStartTimeStr = dateStr + " " + startTimeStr + ":00"; // 2025-11-13 16:00:00
+
+        // 解析开始时间
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date startTime = sdf.parse(fullStartTimeStr);
+
+        // 获取当前时间
+        Date currentTime = new Date();
+
+        // 计算时间差(毫秒)
+        long diffMillis = startTime.getTime() - currentTime.getTime();
+
+        // 转换为分钟
+        long diffMinutes = diffMillis / (1000 * 60);
+
+        // 判断:如果当前时间距离开始时间小于等于minute分钟,或者已经超过开始时间,返回true
+        // diffMinutes <= minute 表示距离开始时间还有minute分钟以内
+        // diffMinutes <= 0 表示已经超过或等于开始时间
+        return diffMinutes <= minute;
+    }
+
+    /**
+     * 获取预约订单距离预约时间多少分钟处理为显示的时间
+     * @return
+     */
+    public static int getAppoinmentOrderHandleTime(){
+        int minute=60;
+        List<SysDictData> datas= DictUtils.getDictCache("sys_appointorder_handletime");
+        if (datas != null && !datas.isEmpty()) {
+            minute=Integer.parseInt(datas.get(0).getDictValue());
+        }
+        return minute;
+    }
+
     //获取当前时间戳
     public Long getTimeMillis() throws ParseException {
         return System.currentTimeMillis();

+ 57 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/utils/OperatingUtil.java

@@ -0,0 +1,57 @@
+package com.ruoyi.app.utils;
+
+import com.ruoyi.app.mendian.dto.AppointmentTimeDto;
+import com.ruoyi.system.domain.OperatingHours;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class OperatingUtil {
+
+    /**
+     * 获取预约时间段列表
+     * 按小时划分时间段,过滤掉当前时间之前的时间段
+     *
+     * @param dto 包含营业开始时间和结束时间的DTO
+     * @return 可预约的时间段列表
+     */
+    public static List<AppointmentTimeDto> getAppointmentTime(AppointmentTimeDto dto) {
+        List<AppointmentTimeDto> timeList = new ArrayList<>();
+
+        // 定义时间格式,支持 "H:mm" 格式(如 "9:00")
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("H:mm");
+
+        // 解析营业时间
+        LocalTime startTime = LocalTime.parse(dto.getStartTime(), formatter);
+        LocalTime endTime = LocalTime.parse(dto.getEndTime(), formatter);
+        LocalTime currentTime = LocalTime.now();
+
+        // 按小时划分时间段
+        LocalTime currentHour = startTime;
+        while (currentHour.isBefore(endTime)) {
+            LocalTime nextHour = currentHour.plusHours(1);
+
+            // 如果下一个小时超过结束时间,则使用结束时间
+            if (nextHour.isAfter(endTime)) {
+                nextHour = endTime;
+            }
+
+            // 只添加当前时间之后的时间段(包括当前时间所在的时间段)
+            // 如果时间段的结束时间大于当前时间,则包含该时间段
+            if (nextHour.isAfter(currentTime)) {
+                AppointmentTimeDto timeDto = new AppointmentTimeDto();
+                timeDto.setStartTime(currentHour.toString());
+                timeDto.setEndTime(nextHour.toString());
+                timeList.add(timeDto);
+            }
+            currentHour = nextHour;
+        }
+
+        return timeList;
+    }
+
+}

+ 15 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/PosOrder.java

@@ -302,5 +302,20 @@ public class PosOrder {
      */
     private Integer foodAmount;
 
+    /** 取餐号 */
+    private Long pickUpNum;
+    /** 商家是否已接单 */
+    private Boolean isAccepted;
+
+    /** 是否显示 */
+    private Boolean isDisplay;
+
+    /**
+     * 显示时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date displayTime;
+
+
 
 }

+ 17 - 1
ruoyi-system/src/main/resources/mapper/system/PosOrderMapper.xml

@@ -50,10 +50,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="logo" column="logo" />
         <result property="posName" column="pos_name" />
         <result property="foodAmount" column="food_amount" />
+        <result property="pickUpNum" column="pick_up_num" />
+        <result property="isAccepted" column="is_accepted" />
+        <result property="isDisplay" column="is_display" />
+        <result property="displayTime" column="display_time" />
     </resultMap>
 
     <sql id="selectPosOrderVo">
-        select id, dd_id, sh_id, md_id, cretim, shdz_id, user_id,sh_address, amount, remarks, state, type, delry_time,food,yh_id,yh_name,md_yh_id,md_yh_name,md_discount_amount,jvli,freight,dining_status,qs_id,pay_url,collect_payment,activity,md_activity,kefu_state,kefu_content,kefu_repeat,repeat_dd_id,sales_name,md_sales_name,sales_reduction,md_sales_reduction,points,points_reduction,sd_time,pay_type,parent_dd_id,order_category,table_num,logo,pos_name,food_amount from pos_order
+        select id, dd_id, sh_id, md_id, cretim, shdz_id, user_id,sh_address, amount, remarks, state, type, delry_time,food,yh_id,yh_name,md_yh_id,md_yh_name,md_discount_amount,jvli,freight,dining_status,qs_id,pay_url,collect_payment,activity,md_activity,kefu_state,kefu_content,kefu_repeat,repeat_dd_id,sales_name,md_sales_name,sales_reduction,md_sales_reduction,points,points_reduction,sd_time,pay_type,parent_dd_id,order_category,table_num,logo,pos_name,food_amount,pick_up_num,is_accepted,is_display,display_time from pos_order
     </sql>
 
     <select id="selectPosOrderList" parameterType="PosOrder" resultMap="PosOrderResult">
@@ -172,6 +176,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="logo != null and logo != ''">logo,</if>
             <if test="posName != null and posName != ''">pos_name,</if>
             <if test="foodAmount != null">food_amount,</if>
+            <if test="pickUpNum != null">pick_up_num,</if>
+            <if test="isAccepted != null">is_accepted,</if>
+            <if test="isDisplay != null">is_display,</if>
+            <if test="displayTime != null">display_time,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="ddId != null">#{ddId},</if>
@@ -205,6 +213,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="logo != null and logo != ''">#{logo},</if>
             <if test="posName != null and posName != ''">#{posName},</if>
             <if test="foodAmount != null">#{foodAmount},</if>
+            <if test="pickUpNum != null">#{pickUpNum},</if>
+            <if test="isAccepted != null">#{isAccepted},</if>
+            <if test="isDisplay != null">#{isDisplay},</if>
+            <if test="displayTime != null">#{displayTime},</if>
          </trim>
     </insert>
 
@@ -244,6 +256,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="logo != null and logo != ''">logo = #{logo},</if>
             <if test="posName != null and posName != ''">pos_name = #{posName},</if>
             <if test="foodAmount != null">food_amount = #{foodAmount},</if>
+            <if test="pickUpNum != null">pick_up_num = #{pickUpNum},</if>
+            <if test="isAccepted != null">is_accepted = #{isAccepted},</if>
+            <if test="isDisplay != null">is_display = #{isDisplay},</if>
+            <if test="displayTime != null">display_time = #{displayTime},</if>
         </trim>
         where id = #{id}
     </update>