Forráskód Böngészése

feat(app): 优化预约场地学校时间查询功能

- 在 AppTeachingTimeMapper.xml 中添加 is_teaching 字段查询
- 在 OrderServiceImpl 中增加教学日和非教学日的解析逻辑
-计算并更新 PreviewOrderPlaceSchoolTime 的库存数量
- 在 OrderVO 中添加 isTeaching 字段用于区分教学日和非教学日
SheepHy 5 napja
szülő
commit
36e7e06ece

+ 42 - 1
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/OrderServiceImpl.java

@@ -37,6 +37,7 @@ import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalTime;
 import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.stream.Collectors;
@@ -303,7 +304,47 @@ public class OrderServiceImpl implements IOrderService {
 
     @Override
     public List<OrderVO.PreviewOrderPlaceSchoolTime> previewOrderPlaceSchoolTime(String placeId) {
-        return appTeachingTimeMapper.previewOrderPlaceSchoolTime(appSitePlaceMapper.selectById(placeId).getOrgCode());
+        List<OrderVO.PreviewOrderPlaceSchoolTime> previewOrderPlaceSchoolTimes = appTeachingTimeMapper.previewOrderPlaceSchoolTime(appSitePlaceMapper.selectById(placeId).getOrgCode());
+        AppSite appSite = appSiteMapper.selectOne(Wrappers.<AppSite>lambdaQuery().eq(AppSite::getId, appSitePlaceMapper.selectById(placeId).getSiteId()));
+        // 解析教学日和非教学日数据
+        List<OrderVO.TimeSlotData> teachingList = parseTimeSlotData(appSite.getTeachingDay());
+        List<OrderVO.TimeSlotData> nonTeachingList = parseTimeSlotData(appSite.getNoTeachingDay());
+        previewOrderPlaceSchoolTimes.forEach(previewOrderPlaceSchoolTime -> {
+            boolean isTeaching = previewOrderPlaceSchoolTime.getIsTeaching() == 0;
+            List<OrderVO.TimeSlotData> targetList = isTeaching ? teachingList : nonTeachingList;
+            if (!targetList.isEmpty()) {
+                // 找到最早开始时间
+                Optional<OrderVO.TimeSlotData> earliest = targetList.stream()
+                        .min(Comparator.comparing(t -> LocalTime.parse(t.getStartTime(), DateTimeFormatter.ofPattern("HH:mm"))));
+
+                // 找到最晚结束时间
+                Optional<OrderVO.TimeSlotData> latest = targetList.stream()
+                        .max(Comparator.comparing(t -> LocalTime.parse(t.getEndTime(), DateTimeFormatter.ofPattern("HH:mm"))));
+
+                String earliestStart = earliest.map(OrderVO.TimeSlotData::getStartTime).orElse("未知");
+                String latestEnd = latest.map(OrderVO.TimeSlotData::getEndTime).orElse("未知");
+
+                int bookedCount = appOrderMapper.queryBookedCount(
+                        placeId,
+                        DateUtil.format(previewOrderPlaceSchoolTime.getDay(), "yyyy-MM-dd"),
+                        earliestStart,
+                        latestEnd
+                );
+                int totalTicketNum = targetList.stream()
+                        .mapToInt(t -> {
+                            try {
+                                return Integer.parseInt(t.getTicketNum());
+                            } catch (NumberFormatException e) {
+                                return 0; // 默认值,或抛出异常
+                            }
+                        })
+                        .sum();
+                previewOrderPlaceSchoolTime.setInventory(totalTicketNum - bookedCount);
+            }
+
+        });
+
+        return previewOrderPlaceSchoolTimes;
     }
 
     /**

+ 1 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/vo/OrderVO.java

@@ -254,6 +254,7 @@ public class OrderVO {
         private Date day;
         @Schema(description = "当前剩余库存")
         private int inventory;
+        private int isTeaching;
         @Schema(description = "简称")
         private String namedDay;
     }

+ 1 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppTeachingTimeMapper.xml

@@ -4,6 +4,7 @@
     <select id="previewOrderPlaceSchoolTime" resultType="org.jeecg.modules.app.vo.OrderVO$PreviewOrderPlaceSchoolTime">
         SELECT
             a.day,
+            a.is_teaching,
             COALESCE ( b.inventory, 0 ) AS inventory,
             CASE