FengChaoYu 1 nedēļu atpakaļ
vecāks
revīzija
e86b74bf4f

+ 23 - 15
mall-server-api/src/main/java/com/gree/mall/manager/logic/common/OrderPickTimeConfigLogic.java

@@ -37,7 +37,7 @@ public class OrderPickTimeConfigLogic {
                 .in(StringUtils.isBlank(adminUser.getCompanyWechatId())
                         && CollectionUtil.isNotEmpty(adminUser.getCompanyWechatIds()), OrderPickTimeConfig::getCompanyWechatId, adminUser.getCompanyWechatIds())
                 .eq(OrderPickTimeConfig::getStorageId, storageId)
-                .orderByDesc(OrderPickTimeConfig::getId)
+                .orderByAsc(OrderPickTimeConfig::getId)
                 .list();
     }
 
@@ -96,18 +96,17 @@ public class OrderPickTimeConfigLogic {
             throw new RemoteServiceException("提货时间配置列表不能为空");
         }
         
-        // 2. 按照startTime进行序排序
+        // 2. 按照startTime进行序排序
         configList.sort((o1, o2) -> {
             try {
-                // 转换为分钟数进行比较,取反实现倒序
-                return Integer.compare(convertTimeToMinutes(o2.getStartTime()), convertTimeToMinutes(o1.getStartTime()));
+                // 转换为分钟数进行比较
+                return Integer.compare(convertTimeToMinutes(o1.getStartTime()), convertTimeToMinutes(o2.getStartTime()));
             } catch (Exception e) {
                 throw new RemoteServiceException(e.getMessage());
             }
         });
         
         // 3. 检查时间范围是否有重叠和格式验证
-        String lastEndTime = null;
         for (int i = 0; i < configList.size(); i++) {
             OrderPickTimeConfig config = configList.get(i);
             
@@ -115,7 +114,6 @@ public class OrderPickTimeConfigLogic {
             validateTimeFormat(config.getStartTime(), "开始时间", config);
             validateTimeFormat(config.getEndTime(), "结束时间", config);
             
-            
             // 验证开始时间必须小于结束时间
             int startTimeMinutes = convertTimeToMinutes(config.getStartTime());
             int endTimeMinutes = convertTimeToMinutes(config.getEndTime());
@@ -124,17 +122,27 @@ public class OrderPickTimeConfigLogic {
                 throw new RemoteServiceException(config.getStartTime() + " 至 " + config.getEndTime() + "提货时间配置的开始时间必须小于结束时间");
             }
             
-            // 验证当前配置的开始时间必须大于等于上一个配置的结束时间+1分钟
-            if (i > 0 && lastEndTime != null) {
-                // 确保当前配置的开始时间至少比上一个配置的结束时间晚1分钟
-                int lastEndMinutes = convertTimeToMinutes(lastEndTime);
-                if (startTimeMinutes <= lastEndMinutes) {
-                    throw new RemoteServiceException(config.getStartTime() + " 至 " + config.getEndTime() + "的提货时间配置的开始时间必须在上一个配置结束时间之后至少1分钟");
+            // 检查当前配置与其他所有配置是否有时间重叠
+            // 支持不连续的时间配置,但确保没有时间范围重叠
+            for (int j = i + 1; j < configList.size(); j++) {
+                OrderPickTimeConfig otherConfig = configList.get(j);
+                int otherStartTimeMinutes = convertTimeToMinutes(otherConfig.getStartTime());
+                int otherEndTimeMinutes = convertTimeToMinutes(otherConfig.getEndTime());
+                
+                // 检查是否有重叠
+                // 1. 当前配置的结束时间大于其他配置的开始时间
+                // 2. 当前配置的开始时间小于其他配置的结束时间
+                if (endTimeMinutes > otherStartTimeMinutes && startTimeMinutes < otherEndTimeMinutes) {
+                    throw new RemoteServiceException(config.getStartTime() + " 至 " + config.getEndTime() + "与" + 
+                            otherConfig.getStartTime() + " 至 " + otherConfig.getEndTime() + "的提货时间配置存在重叠");
+                }
+                
+                // 检查相邻时间区间之间是否至少有1分钟间隔
+                if (endTimeMinutes + 1 > otherStartTimeMinutes) {
+                    throw new RemoteServiceException(config.getStartTime() + " 至 " + config.getEndTime() + "与" + 
+                            otherConfig.getStartTime() + " 至 " + otherConfig.getEndTime() + "的提货时间配置之间必须至少间隔1分钟");
                 }
             }
-            
-            // 保存当前配置的结束时间,用于下一个配置的比较
-            lastEndTime = config.getEndTime();
         }
         
         // 4. 获取当前登录用户信息