Bladeren bron

修改bug

jinshihui 17 uur geleden
bovenliggende
commit
8249a27f54

+ 42 - 3
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TOrderController.java

@@ -15,6 +15,7 @@ import com.ylx.massage.domain.TJs;
 import com.ylx.massage.domain.TOrder;
 import com.ylx.massage.domain.vo.OrderAllocationResultVo;
 import com.ylx.massage.domain.vo.OrderVerificationVo;
+import com.ylx.massage.domain.vo.TechnicianAvailabilityVo;
 import com.ylx.massage.enums.Enumproject;
 import com.ylx.massage.enums.OrderStatusEnum;
 import com.ylx.massage.enums.OrderStatusEnumVo;
@@ -247,6 +248,8 @@ public class TOrderController extends BaseController {
     @RequestMapping(value = "wx/reach", method = RequestMethod.POST)
     public R reach(@RequestBody TOrder order) {
         try {
+            log.info("到达订单位置,order对象的值:{}", JSON.toJSONString(order));
+
             LambdaQueryWrapper<TOrder> wrapper = new LambdaQueryWrapper<>();
             wrapper.eq(TOrder::getcId, order.getcId()).eq(TOrder::getnStatus, OrderStatusEnum.DEPART.getCode());
             order.setnStatus(OrderStatusEnum.ARRIVED.getCode());
@@ -265,6 +268,12 @@ public class TOrderController extends BaseController {
         }
     }
 
+    /**
+     * 开始服务(技师端操作的接口)
+     *
+     * @param order
+     * @return R
+     */
     @Log(title = "开始服务", businessType = BusinessType.UPDATE)
     @ApiOperation("开始服务")
     @RequestMapping(value = "wx/service", method = RequestMethod.POST)
@@ -272,6 +281,7 @@ public class TOrderController extends BaseController {
         try {
             LambdaQueryWrapper<TOrder> wrapper = new LambdaQueryWrapper<>();
             wrapper.eq(TOrder::getcId, order.getcId()).eq(TOrder::getnStatus, OrderStatusEnum.ARRIVED.getCode());
+            // 设置订单状态:服务中
             order.setnStatus(OrderStatusEnum.SERVICE.getCode());
             order.setStartTime(LocalDateTime.now());
             return R.ok(orderService.update(order, wrapper));
@@ -312,14 +322,19 @@ public class TOrderController extends BaseController {
      * 获取订单信息
      *
      * @param param
-     * @return
+     * @return R
      */
     @Log(title = "微信获取订单信息", businessType = BusinessType.OTHER)
     @ApiOperation("获取订单信息")
     @RequestMapping(value = "wx/getOrder", method = RequestMethod.GET)
     public R getOrder(Page<TOrder> page, TOrder param) {
-        Page<TOrder> all = orderService.getAll(page, param);
-        return R.ok(all);
+        try {
+            Page<TOrder> all = orderService.getAll(page, param);
+            return R.ok(all);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
     }
 
     @Log(title = "技师端-获取待接单数量", businessType = BusinessType.OTHER)
@@ -476,4 +491,28 @@ public class TOrderController extends BaseController {
             return R.fail("分页查询分配记录失败:" + e.getMessage());
         }
     }
+
+    /**
+     * 获取技师当天可预约时间
+     *
+     * @param technicianId 技师ID
+     * @param date 查询日期(格式:yyyy-MM-dd),可选,不传则查询当天
+     * @return R
+     */
+    //@Log(title = "获取技师当天可预约时间", businessType = BusinessType.OTHER)
+    @ApiOperation("获取技师当天可预约时间")
+    @RequestMapping(value = "wx/getTechnicianAvailability", method = RequestMethod.GET)
+    public R<TechnicianAvailabilityVo> getTechnicianAvailability(@RequestParam String technicianId, @RequestParam(required = false) String date) {
+        try {
+            log.info("获取技师当天可预约时间,技师ID:{},查询日期:{}", technicianId, date);
+            TechnicianAvailabilityVo availability = orderService.getTechnicianAvailability(technicianId, date);
+            return R.ok(availability);
+        } catch (ServiceException s) {
+            log.error(s.toString());
+            return R.fail(s.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.fail("系统异常");
+        }
+    }
 }

+ 48 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/TechnicianAvailabilityVo.java

@@ -0,0 +1,48 @@
+package com.ylx.massage.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 技师当天可预约时间VO
+ *
+ * @author system
+ * @since 2024-01-13
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel(value = "TechnicianAvailabilityVo", description = "技师当天可预约时间VO")
+public class TechnicianAvailabilityVo {
+
+    /**
+     * 查询日期(格式:yyyy-MM-dd)
+     */
+    @ApiModelProperty("查询日期")
+    private String date;
+
+    /**
+     * 技师ID
+     */
+    @ApiModelProperty("技师ID")
+    private String technicianId;
+
+    /**
+     * 技师姓名
+     */
+    @ApiModelProperty("技师姓名")
+    private String technicianName;
+
+    /**
+     * 时间段列表(以30分钟为间隔)
+     */
+    @ApiModelProperty("时间段列表")
+    private List<TimeSlotVo> timeSlots;
+}

+ 49 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/TimeSlotVo.java

@@ -0,0 +1,49 @@
+package com.ylx.massage.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 时间段VO
+ * 用于展示技师当天可预约和不可预约的时间段
+ *
+ * @author system
+ * @since 2024-01-13
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel(value = "TimeSlotVo", description = "时间段VO")
+public class TimeSlotVo {
+
+    /**
+     * 时间点(格式:HH:mm)
+     */
+    @ApiModelProperty("时间点(格式:HH:mm)")
+    private String time;
+
+    /**
+     * 是否可预约
+     * true-可预约,false-不可预约
+     */
+    @ApiModelProperty("是否可预约")
+    private Boolean available;
+
+    /**
+     * 不可预约原因
+     * 如果可预约,此字段为null
+     */
+    @ApiModelProperty("不可预约原因")
+    private String reason;
+
+    /**
+     * 关联订单号(如果不可预约是因为已有订单)
+     */
+    @ApiModelProperty("关联订单号")
+    private String orderNo;
+}

+ 9 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/enums/Enumproject.java

@@ -13,13 +13,21 @@ import lombok.Data;
 @Data
 @ApiModel("枚举")
 public class Enumproject {
-
+    /**
+     * 枚举值
+     */
     @ApiModelProperty("code")
     private Integer code;
 
+    /**
+     * 枚举描述
+     */
     @ApiModelProperty("desc")
     private String desc;
 
+    /**
+     * 枚举描述
+     */
     @ApiModelProperty("描述")
     private String info;
 

+ 1 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/enums/OrderStatusEnum.java

@@ -17,7 +17,7 @@ public enum OrderStatusEnum {
 
     ALL(100, "全部"),
 
-    //进行中(待接单,已接单,已到达,服务中)
+    //进行中(待接单,已接单,已出发,已到达,服务中)
 
     /**
      * 待接单

+ 9 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/TOrderService.java

@@ -6,6 +6,7 @@ import com.ylx.common.core.domain.R;
 import com.ylx.massage.domain.TOrder;
 import com.ylx.massage.domain.vo.HomeBlock;
 import com.ylx.massage.domain.vo.OrderVerificationVo;
+import com.ylx.massage.domain.vo.TechnicianAvailabilityVo;
 
 import java.math.BigDecimal;
 import java.util.Date;
@@ -77,4 +78,12 @@ public interface TOrderService extends IService<TOrder> {
     List<HomeBlock> getBlock(Date start, Date end, String deptId);
 
     OrderVerificationVo verification(TOrder order);
+
+    /**
+     * 获取技师当天可预约时间
+     * @param technicianId 技师ID
+     * @param dateStr 查询日期(格式:yyyy-MM-dd),为null则查询当天
+     * @return 技师当天可预约时间VO
+     */
+    TechnicianAvailabilityVo getTechnicianAvailability(String technicianId, String dateStr);
 }

+ 4 - 6
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/OrderValidationServiceImpl.java

@@ -35,10 +35,12 @@ public class OrderValidationServiceImpl implements OrderValidationService {
 
     /**
      * 进行中的订单状态列表
-     * 包括:已接单(1)、已到达(2)、服务中(3)
+     * 包括:待接单、已接单、已出发、已到达、服务中
      */
     private static final List<Integer> IN_PROGRESS_STATUSES = Arrays.asList(
+            OrderStatusEnum.WAIT_JD.getCode(),       // 0 - 待接单
         OrderStatusEnum.RECEIVED_ORDER.getCode(), // 1 - 已接单
+            OrderStatusEnum.DEPART.getCode(),      // 6 - 已出发
         OrderStatusEnum.ARRIVED.getCode(),        // 2 - 已到达
         OrderStatusEnum.SERVICE.getCode()         // 3 - 服务中
     );
@@ -97,13 +99,12 @@ public class OrderValidationServiceImpl implements OrderValidationService {
         // 5. 有进行中的订单,进一步检查时间范围
         log.info("技师 {} 有 {} 个进行中的订单,开始时间范围校验", technicianId, inProgressOrders.size());
 
-        // 估算新订单的开始和结束时间
+        //新订单的开始和结束时间
         LocalDateTime newOrderStart = OrderTimeRangeUtils.estimateStartTime(newOrder);
         LocalDateTime newOrderEnd = OrderTimeRangeUtils.estimateEndTime(newOrder);
 
         // 创建临时订单对象用于时间范围校验
         TOrder newOrderWithTime = new TOrder();
-        newOrderWithTime.setOrderNo(newOrder.getOrderNo());
         newOrderWithTime.setcGoods(newOrder.getcGoods());
         newOrderWithTime.setStartTime(newOrderStart);
         newOrderWithTime.setEndTime(newOrderEnd);
@@ -254,7 +255,6 @@ public class OrderValidationServiceImpl implements OrderValidationService {
      */
     private String buildTimeConflictMessage(TOrder existingOrder, TOrder newOrder) {
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
-
         StringBuilder message = new StringBuilder();
         message.append("该技师当前有进行中的订单,时间冲突。");
 
@@ -278,13 +278,11 @@ public class OrderValidationServiceImpl implements OrderValidationService {
         if (newOrder.getEndTime() != null) {
             message.append("  预计结束时间:").append(newOrder.getEndTime().format(formatter)).append("\n");
         }
-
         // 提示用户
         Long durationMinutes = OrderTimeRangeUtils.calculateOrderDuration(newOrder);
         if (durationMinutes != null) {
             message.append(" 建议:请等待当前订单完成后再试,或选择其他时间段(需间隔至少30分钟)。");
         }
-
         return message.toString();
     }
 }

+ 175 - 10
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TOrderServiceImpl.java

@@ -15,9 +15,7 @@ import com.ylx.common.core.domain.R;
 import com.ylx.common.exception.ServiceException;
 import com.ylx.common.utils.SecurityUtils;
 import com.ylx.massage.domain.*;
-import com.ylx.massage.domain.vo.CouponReceiveVo;
-import com.ylx.massage.domain.vo.HomeBlock;
-import com.ylx.massage.domain.vo.OrderVerificationVo;
+import com.ylx.massage.domain.vo.*;
 import com.ylx.massage.enums.BillTypeEnum;
 import com.ylx.massage.enums.DiscountTypeEnum;
 import com.ylx.massage.enums.JsStatusEnum;
@@ -33,7 +31,9 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -872,7 +872,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         orderNew.setEndTime(LocalDateTime.now());
         updateById(orderNew);
 
-        // 添加订单完成消息通知
+        // 添加订单完成消息通知(用户侧)
         orderNotificationService.sendCompletedNotification(orderNew);
         return true;
     }
@@ -899,6 +899,172 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         consumptionLogService.save(tConsumptionLog);
     }
 
+    /**
+     * 获取技师当天可预约时间
+     *
+     * @param technicianId 技师ID
+     * @param dateStr 查询日期(格式:yyyy-MM-dd),为null则查询当天
+     * @return 技师当天可预约时间VO
+     */
+    @Override
+    public TechnicianAvailabilityVo getTechnicianAvailability(String technicianId, String dateStr) {
+        // 1. 参数校验
+        if (StringUtils.isBlank(technicianId)) {
+            throw new ServiceException("技师ID不能为空");
+        }
+
+        // 2. 查询技师信息
+        TJs js = jsService.getById(technicianId);
+        if (js == null) {
+            throw new ServiceException("技师不存在");
+        }
+
+        // 3. 解析日期,默认为当天
+        LocalDate queryDate;
+        if (StringUtils.isBlank(dateStr)) {
+            queryDate = LocalDate.now();
+        } else {
+            try {
+                queryDate = LocalDate.parse(dateStr);
+            } catch (Exception e) {
+                throw new ServiceException("日期格式错误,请使用 yyyy-MM-dd 格式");
+            }
+        }
+
+        // 4. 定义当天的所有时间段(以30分钟为间隔,从00:00到23:30)
+        List<TimeSlotVo> timeSlots = new ArrayList<>();
+        for (int hour = 0; hour < 24; hour++) {
+            // 每小时生成两个时间段:xx:00 和 xx:30
+            timeSlots.add(TimeSlotVo.builder()
+                    .time(String.format("%02d:00", hour))
+                    .available(true)
+                    .build());
+            timeSlots.add(TimeSlotVo.builder()
+                    .time(String.format("%02d:30", hour))
+                    .available(true)
+                    .build());
+        }
+
+        // 5. 查询技师当天所有进行中的订单
+        // 开始时间
+        LocalDateTime startOfDay = queryDate.atStartOfDay();
+        // 结束时间
+        LocalDateTime endOfDay = queryDate.plusDays(1).atStartOfDay();
+        log.info("开始时间:{},结束时间:{}", startOfDay, endOfDay);
+
+        LambdaQueryWrapper<TOrder> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(TOrder::getcJsId, technicianId)
+                .in(TOrder::getnStatus, OrderStatusEnum.WAIT_JD.getCode(),
+                        OrderStatusEnum.RECEIVED_ORDER.getCode(),
+                        OrderStatusEnum.DEPART.getCode(),
+                        OrderStatusEnum.ARRIVED.getCode(),
+                        OrderStatusEnum.SERVICE.getCode())
+                .ge(TOrder::getDtCreateTime, startOfDay)
+                .lt(TOrder::getDtCreateTime, endOfDay)
+                .eq(TOrder::getIsDelete, 0);
+
+        List<TOrder> orders = this.list(queryWrapper);
+        log.info("技师{},在{}天共有 {} 个进行中的订单", technicianId, queryDate, orders.size());
+
+        // 6. 标记不可预约的时间段
+        LocalDateTime now = LocalDateTime.now();
+        for (TOrder order : orders) {
+            // 6.1 计算订单的开始时间和结束时间
+            LocalDateTime orderStart = OrderTimeRangeUtils.estimateStartTime(order);
+            LocalDateTime orderEnd = OrderTimeRangeUtils.estimateEndTime(order);
+
+            if (orderStart == null || orderEnd == null) {
+                log.warn("订单 {} 的时间信息不完整,跳过", order.getOrderNo());
+                continue;
+            }
+
+            // 6.2 限制在查询日期范围内
+            LocalDateTime effectiveStart = orderStart.isBefore(startOfDay) ? startOfDay : orderStart;
+            LocalDateTime effectiveEnd = orderEnd.isAfter(endOfDay) ? endOfDay : orderEnd;
+            // 6.3 标记不可预约的时间段
+            markTimeSlotsUnavailable(timeSlots, effectiveStart, effectiveEnd, order.getOrderNo());
+        }
+
+        // 7. 根据查询日期判断是否可预约
+        LocalDate today = LocalDate.now();
+
+        if (queryDate.isBefore(today)) {
+            // 查询日期是过去的日期,所有时间段都不可预约
+            markAllTimeSlotsUnavailable(timeSlots, "日期已过期");
+        } else if (queryDate.equals(today)) {
+            // 查询日期是今天,标记过去的时间为不可预约
+            markPastTimeSlotsUnavailable(timeSlots, now);
+        }
+        // 查询日期是未来的日期,所有时间段默认可预约,无需处理
+        // 8. 构建返回结果
+        return TechnicianAvailabilityVo.builder()
+                .date(queryDate.toString())
+                .technicianId(technicianId)
+                .technicianName(js.getcName())
+                .timeSlots(timeSlots)
+                .build();
+    }
+
+    /**
+     * 标记指定时间范围内的时间段为不可预约
+     *
+     * @param timeSlots 时间段列表
+     * @param start 开始时间
+     * @param end 结束时间
+     * @param orderNo 订单号
+     */
+    private void markTimeSlotsUnavailable(List<TimeSlotVo> timeSlots, LocalDateTime start, LocalDateTime end, String orderNo) {
+        LocalDate date = start.toLocalDate();
+        LocalTime startTime = start.toLocalTime();
+        LocalTime endTime = end.toLocalTime();
+
+        for (TimeSlotVo slot : timeSlots) {
+            LocalTime slotTime = LocalTime.parse(slot.getTime());
+
+            // 判断时间段是否在订单时间范围内
+            boolean isInRange = !slotTime.isBefore(startTime) && slotTime.isBefore(endTime);
+            if (isInRange) {
+                slot.setAvailable(false);
+                slot.setReason("已有订单");
+                slot.setOrderNo(orderNo);
+            }
+        }
+    }
+
+    /**
+     * 标记所有时间段为不可预约
+     *
+     * @param timeSlots 时间段列表
+     * @param reason 不可预约原因
+     */
+    private void markAllTimeSlotsUnavailable(List<TimeSlotVo> timeSlots, String reason) {
+        for (TimeSlotVo slot : timeSlots) {
+            slot.setAvailable(false);
+            slot.setReason(reason);
+            slot.setOrderNo(null);
+        }
+    }
+
+    /**
+     * 标记过去的时间段为不可预约
+     *
+     * @param timeSlots 时间段列表
+     * @param now 当前时间
+     */
+    private void markPastTimeSlotsUnavailable(List<TimeSlotVo> timeSlots, LocalDateTime now) {
+        LocalTime currentTime = now.toLocalTime();
+        for (TimeSlotVo slot : timeSlots) {
+            LocalTime slotTime = LocalTime.parse(slot.getTime());
+
+            // 如果当前时间已经过了这个时间段,标记为不可预约
+            if (slotTime.isBefore(currentTime)) {
+                slot.setAvailable(false);
+                slot.setReason("已过期");
+                slot.setOrderNo(null);
+            }
+        }
+    }
+
     /**
      * 取消订单
      *
@@ -1043,11 +1209,12 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void takingOrders(TOrder order) {
-        if (order == null || StringUtils.isBlank(order.getcId())) {
-            throw new IllegalArgumentException("订单对象不能为空");
+        String orderId = order.getcId();
+        if (orderId == null || StringUtils.isBlank(orderId)) {
+            throw new IllegalArgumentException("订单ID不能为空");
         }
 
-        TOrder orderNew = this.getById(order.getcId());
+        TOrder orderNew = this.getById(orderId);
 
         // 【新增】订单状态锁校验 - 检查技师是否可以接单
         log.info("开始校验技师 {} 是否可以接单,订单号:{}", orderNew.getcJsId(), orderNew.getOrderNo());
@@ -1056,9 +1223,8 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
 
         // 检查订单对应的技师是否存在
 //        updateJs (orderNew);
-        // 更新订单状态
         TOrder orderParam = new TOrder();
-        orderParam.setcId(order.getcId());
+        orderParam.setcId(orderId);
         //设置订单状态:已接单
         orderParam.setnStatus(OrderStatusEnum.RECEIVED_ORDER.getCode());
         orderParam.setAcceptanceTime(LocalDateTime.now());
@@ -1066,7 +1232,6 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
 
         // 已接单消息通知(用户侧)
         orderNotificationService.sendReceivedNotification(orderNew);
-
         // 已接单消息通知(技师侧)
         orderNotificationService.sendTechnicianReceivedNotification(orderNew);
     }

+ 4 - 17
nightFragrance-massage/src/main/java/com/ylx/massage/utils/OrderTimeRangeUtils.java

@@ -57,8 +57,7 @@ public class OrderTimeRangeUtils {
 
         // 3. 保守策略:如果任何订单的时间信息不完整,认为有冲突
         if (existingStart == null || existingEnd == null || newStart == null || newEnd == null) {
-            log.warn("订单时间信息不完整,认为时间冲突。现有订单:{},新订单:{}",
-                existingOrder.getOrderNo(), newOrder.getOrderNo());
+            log.warn("订单时间信息不完整,认为时间冲突。现有订单:{},新订单:{}", existingOrder.getOrderNo(), newOrder.getOrderNo());
             return true;
         }
 
@@ -70,13 +69,13 @@ public class OrderTimeRangeUtils {
         }
 
         // 5. 重新计算新订单的结束时间(基于当前时间 + 服务时长)
-        // 注意:新订单的startTime和endTime可能是预约时间,需要基于实际情况计算
         LocalDateTime actualNewStart = newStart;
         LocalDateTime actualNewEnd = actualNewStart.plusMinutes(newDurationMinutes);
 
         // 6. 应用缓冲时间
         // 在现有订单结束后增加缓冲时间,新订单需要在缓冲时间之后才能开始
-        LocalDateTime existingEndWithBuffer = existingEnd.plusMinutes(BUFFER_MINUTES);
+        //LocalDateTime existingEndWithBuffer = existingEnd.plusMinutes(BUFFER_MINUTES);
+        LocalDateTime existingEndWithBuffer = existingEnd;
 
         // 7. 判断时间范围是否重叠
         // 重叠条件:新订单开始时间 < 现有订单结束时间(含缓冲)
@@ -105,11 +104,6 @@ public class OrderTimeRangeUtils {
      * @return Long 服务时长(分钟),如果无法计算则返回null
      */
     public static Long calculateOrderDuration(TOrder order) {
-        if (order == null || order.getcGoods() == null || order.getcGoods().isEmpty()) {
-            log.warn("订单或订单明细为空,无法计算服务时长");
-            return null;
-        }
-
         try {
             JSONArray goods = order.getcGoods();
             long totalMinutes = 0;
@@ -182,7 +176,7 @@ public class OrderTimeRangeUtils {
     }
 
     /**
-     * 估算订单的开始时间
+     * 订单的开始时间
      * <p>
      * 根据订单的当前状态和时间字段,估算订单的开始时间。
      * - 如果已有startTime,直接使用
@@ -195,9 +189,6 @@ public class OrderTimeRangeUtils {
      * @return LocalDateTime 估算的开始时间
      */
     public static LocalDateTime estimateStartTime(TOrder order) {
-        if (order == null) {
-            return null;
-        }
         // 使用已设置的startTime
         if (order.getStartTime() != null) {
             return order.getStartTime();
@@ -215,10 +206,6 @@ public class OrderTimeRangeUtils {
      * @return LocalDateTime 估算的结束时间
      */
     public static LocalDateTime estimateEndTime(TOrder order) {
-        if (order == null) {
-            return null;
-        }
-
         // 1. 如果已有endTime,直接使用
         if (order.getEndTime() != null) {
             return order.getEndTime();