Explorar el Código

商家端 线上预订 商家加时 提示信息修改

qinxuyang hace 4 semanas
padre
commit
e834e2b777

+ 53 - 6
alien-store/src/main/java/shop/alien/store/service/impl/StoreReservationServiceImpl.java

@@ -590,7 +590,7 @@ public class StoreReservationServiceImpl extends ServiceImpl<StoreReservationMap
         validateAddTimeNotExceedNextReservation(reservation, normalizedAddTimeStart, newEndTime);
 
         // 校验:不能超过营业时间的结束时间
-        validateAddTimeNotExceedBusinessHours(reservation, newEndTime);
+        validateAddTimeNotExceedBusinessHours(reservation, normalizedAddTimeStart, newEndTime);
 
         // 更新预约结束时间
         reservation.setEndTime(newEndTime);
@@ -776,9 +776,9 @@ public class StoreReservationServiceImpl extends ServiceImpl<StoreReservationMap
 
         if (nextReservation != null) {
             if (compareTime(newEndTime, nextReservation.getStartTime()) > 0) {
-                throw new RuntimeException(
-                        String.format("新的结束时间 %s 超过了下一个已确认预约的开始时间 %s(预约号:%s)",
-                                newEndTime, nextReservation.getStartTime(), nextReservation.getReservationNo()));
+                // 计算最多可加时的分钟数
+                int maxAddTimeMinutes = calculateMaxAddTimeMinutes(queryBaseTime, nextReservation.getStartTime());
+                throw new RuntimeException("最多可加时" + maxAddTimeMinutes + "分钟");
             }
         }
     }
@@ -843,6 +843,44 @@ public class StoreReservationServiceImpl extends ServiceImpl<StoreReservationMap
     }
 
     /**
+     * 计算两个时间之间的分钟差(最多可加时的分钟数)
+     * @param startTime 开始时间(支持 yyyy-MM-dd HH:mm:ss 或 yyyy-MM-dd HH:mm 格式)
+     * @param endTime 结束时间(支持 yyyy-MM-dd HH:mm:ss 或 yyyy-MM-dd HH:mm 格式)
+     * @return 分钟差,如果结束时间早于开始时间返回0
+     */
+    private int calculateMaxAddTimeMinutes(String startTime, String endTime) {
+        try {
+            // 先标准化时间格式
+            String normalizedStartTime = normalizeDateTime(startTime);
+            String normalizedEndTime = normalizeDateTime(endTime);
+            
+            if (normalizedStartTime == null || normalizedEndTime == null) {
+                log.warn("时间格式不正确,无法计算分钟差,startTime={}, endTime={}", startTime, endTime);
+                return 0;
+            }
+            
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            sdf.setLenient(false);
+            Date startDate = sdf.parse(normalizedStartTime);
+            Date endDate = sdf.parse(normalizedEndTime);
+            
+            // 如果结束时间早于开始时间,返回0
+            if (endDate.before(startDate)) {
+                return 0;
+            }
+            
+            // 计算分钟差
+            long diffInMillis = endDate.getTime() - startDate.getTime();
+            int minutes = (int) (diffInMillis / (1000 * 60));
+            
+            return minutes;
+        } catch (ParseException e) {
+            log.error("计算最多可加时分钟数失败,startTime={}, endTime={}", startTime, endTime, e);
+            return 0;
+        }
+    }
+
+    /**
      * 计算新的结束时间:加时开始时间 + 加时分钟数
      * 返回格式:yyyy-MM-dd HH:mm(不含秒)
      */
@@ -893,7 +931,7 @@ public class StoreReservationServiceImpl extends ServiceImpl<StoreReservationMap
      * @param reservation 预约信息
      * @param newEndTime 新的结束时间(yyyy-MM-dd HH:mm:ss格式)
      */
-    private void validateAddTimeNotExceedBusinessHours(UserReservation reservation, String newEndTime) {
+    private void validateAddTimeNotExceedBusinessHours(UserReservation reservation, String addTimeStart, String newEndTime) {
         try {
             if (reservation == null || reservation.getStoreId() == null || reservation.getReservationDate() == null) {
                 log.warn("预约信息不完整,跳过营业时间校验");
@@ -1025,7 +1063,16 @@ public class StoreReservationServiceImpl extends ServiceImpl<StoreReservationMap
             int comparison = compareTime(normalizedNewEndTime, normalizedBusinessEndTime);
             if (comparison > 0) {
                 // 新的结束时间超过了营业时间的结束时间
-                throw new RuntimeException("加时后结束时间不能超过营业时间,营业结束时间为:" + businessEndTime);
+                // 计算最多可加时的分钟数
+                // 确定计算基准时间:取当前结束时间和加时开始时间的较大值
+                String normalizedEndTime = normalizeDateTime(reservation.getEndTime());
+                String normalizedAddTimeStart = normalizeDateTime(addTimeStart);
+                String baseTime = normalizedEndTime;
+                if (normalizedAddTimeStart != null && compareTime(normalizedAddTimeStart, normalizedEndTime) > 0) {
+                    baseTime = normalizedAddTimeStart;
+                }
+                int maxAddTimeMinutes = calculateMaxAddTimeMinutes(baseTime, normalizedBusinessEndTime);
+                throw new RuntimeException("最多可加时" + maxAddTimeMinutes + "分钟");
             }
 
             log.info("加时校验通过,新的结束时间={},营业结束时间={}", normalizedNewEndTime, normalizedBusinessEndTime);