From a451cc632e5891790d6372041f382f22dbf49871 Mon Sep 17 00:00:00 2001
From: chen-xin-zhi <3588068430@qq.com>
Date: Fri, 6 Dec 2024 09:18:28 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E5=95=86=E5=93=81?=
 =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../heritage/config/BookingDateConfig.java    |  40 ---
 .../controller/good/CouponController.java     |  67 -----
 .../controller/good/GoodController.java       | 267 ++++++++++--------
 .../mapper/AppointmentDateMapper.java         |  14 +
 .../heritage/mapper/TimePeriodMapper.java     |   7 +
 .../AppointmentDateAddRequest.java            |  27 +-
 .../AppointmentDateUpdateRequest.java         |  24 +-
 .../good/service/ServiceGoodAddRequest.java   |  51 +++-
 .../good/service/ServiceGoodQueryRequest.java |  36 +++
 .../service/ServiceGoodUpdateRequest.java     |  60 +++-
 .../dto/timeperiod/TimePeriodAddRequest.java  |  39 +++
 .../timeperiod/TimePeriodUpdateRequest.java   |  44 +++
 .../model/entity/AppointmentDate.java         |  12 -
 .../heritage/model/entity/TimePeriod.java     |  67 +++++
 .../AppointmentDateTimePeriodVO.java          |  54 ++++
 .../vo/appointment/AppointmentDateVO.java     |  21 +-
 .../heritage/model/vo/good/ServiceGoodVO.java |  55 +++-
 .../model/vo/timeperiod/TimePeriodVO.java     |  35 +++
 .../service/good/AppointmentDateService.java  |  15 +
 .../heritage/service/good/GoodService.java    |   2 +-
 .../service/good/TimePeriodService.java       |  13 +
 .../good/impl/AppointmentDateServiceImpl.java |  35 ++-
 .../service/good/impl/GoodServiceImpl.java    |  19 +-
 .../good/impl/TimePeriodServiceImpl.java      |  40 +++
 .../mapper/AppointmentDateMapper.xml          |  11 +
 .../resources/mapper/TimePeriodMapper.xml     |   7 +
 .../java/com/cultural/heritage/test/A.java    |   6 +
 .../java/com/cultural/heritage/test/B.java    |   5 +
 .../java/com/cultural/heritage/test/Test.java |  21 +-
 29 files changed, 786 insertions(+), 308 deletions(-)
 delete mode 100644 src/main/java/com/cultural/heritage/config/BookingDateConfig.java
 create mode 100644 src/main/java/com/cultural/heritage/mapper/TimePeriodMapper.java
 create mode 100644 src/main/java/com/cultural/heritage/model/dto/good/service/ServiceGoodQueryRequest.java
 create mode 100644 src/main/java/com/cultural/heritage/model/dto/timeperiod/TimePeriodAddRequest.java
 create mode 100644 src/main/java/com/cultural/heritage/model/dto/timeperiod/TimePeriodUpdateRequest.java
 create mode 100644 src/main/java/com/cultural/heritage/model/entity/TimePeriod.java
 create mode 100644 src/main/java/com/cultural/heritage/model/vo/appointment/AppointmentDateTimePeriodVO.java
 create mode 100644 src/main/java/com/cultural/heritage/model/vo/timeperiod/TimePeriodVO.java
 create mode 100644 src/main/java/com/cultural/heritage/service/good/TimePeriodService.java
 create mode 100644 src/main/java/com/cultural/heritage/service/good/impl/TimePeriodServiceImpl.java
 create mode 100644 src/main/resources/mapper/TimePeriodMapper.xml
 create mode 100644 src/test/java/com/cultural/heritage/test/A.java
 create mode 100644 src/test/java/com/cultural/heritage/test/B.java

diff --git a/src/main/java/com/cultural/heritage/config/BookingDateConfig.java b/src/main/java/com/cultural/heritage/config/BookingDateConfig.java
deleted file mode 100644
index 9eb7313..0000000
--- a/src/main/java/com/cultural/heritage/config/BookingDateConfig.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.cultural.heritage.config;
-
-import com.cultural.heritage.common.ErrorCode;
-import com.cultural.heritage.constant.BookConstant;
-import com.cultural.heritage.exception.ThrowUtils;
-import com.cultural.heritage.model.entity.BookingDate;
-import com.cultural.heritage.service.book.BookingDateService;
-import jakarta.annotation.Resource;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Configuration
-public class BookingDateConfig {
-
-    @Resource
-    private BookingDateService bookingDateService;
-
-    // 写真预约日期初始化
-    @Bean
-    public Boolean initBookingDate() {
-        System.out.println("这是Config");
-        long count = bookingDateService.count();
-        List<BookingDate> bookingDateList = new ArrayList<>();
-        if (count == 0) {
-            for (int i = 0; i < 3; i ++ ) {
-                BookingDate bookingDateRent = bookingDateService.initBookingDate(BookConstant.RENT_CLOTHES, i);
-                BookingDate bookingDateOwn = bookingDateService.initBookingDate(BookConstant.OWN_CLOTHES, i);
-                bookingDateList.add(bookingDateRent);
-                bookingDateList.add(bookingDateOwn);
-            }
-            boolean result = bookingDateService.saveBatch(bookingDateList);
-            ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
-        }
-        return true;
-    }
-
-}
diff --git a/src/main/java/com/cultural/heritage/controller/good/CouponController.java b/src/main/java/com/cultural/heritage/controller/good/CouponController.java
index 063a7bf..57aba36 100644
--- a/src/main/java/com/cultural/heritage/controller/good/CouponController.java
+++ b/src/main/java/com/cultural/heritage/controller/good/CouponController.java
@@ -143,73 +143,6 @@ public class CouponController {
         return ResultUtils.success(page);
     }
 
-//
-//    /**
-//     * 积分兑换优惠券
-//     * @param exchangeAddRequest  兑换记录添加请求体
-//     * @return  是否兑换成功
-//     */
-//    @PostMapping("/exchange")
-//    @Transactional(rollbackFor = Exception.class)
-//    @Operation(summary = "小程序端用户积分兑换优惠券", description = "参数:兑换记录添加请求体,权限:管理员(admin, boss),方法名:pointsExchangeCoupon")
-//    public BaseResponse<Boolean> pointsExchangeCoupon(@RequestBody ExchangeAddRequest exchangeAddRequest, HttpServletRequest request) {
-//        if (exchangeAddRequest == null) {
-//            throw new BusinessException(ErrorCode.PARAMS_ERROR);
-//        }
-//        // 更新用户积分
-//        User loginUser = userService.getLoginUser(request);
-//        Long userId = loginUser.getId();
-//        Integer requirePoints = exchangeAddRequest.getRequirePoints();
-//        Integer quantity = exchangeAddRequest.getQuantity();
-//        if (userId <= 0) {
-//            throw new BusinessException(ErrorCode.PARAMS_ERROR);
-//        }
-//        User user = userService.getById(userId);
-//        ThrowUtils.throwIf(user == null, ErrorCode.NOT_FOUND_ERROR);
-//        int residual = user.getPoints() - requirePoints * quantity;
-//        if (residual < 0) {
-//            throw new BusinessException(ErrorCode.OPERATION_ERROR, "积分不足");
-//        }
-//        user.setPoints(residual);
-//        boolean save = userService.updateById(user);
-//        ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR);
-//
-//        // 更新优惠券的库存量
-//        Long couponId = exchangeAddRequest.getCouponId();
-//        Coupon coupon = couponService.getById(couponId);
-//        if (coupon.getTotalNum() - quantity < 0) {
-//            throw new BusinessException(ErrorCode.OPERATION_ERROR, "优惠券数量不足");
-//        }
-//        coupon.setResidueNum(coupon.getTotalNum() - quantity);
-//        boolean updateCoupon = couponService.updateById(coupon);
-//        ThrowUtils.throwIf(!updateCoupon, ErrorCode.OPERATION_ERROR);
-//
-//        // 校验用户限领量是否已达到上限
-//        Integer currentNum = couponService.verifyIsReachTheUpperLimit(userId, couponId);
-//        int limitNum = 0;
-//        if (currentNum == null) {
-//            limitNum = quantity;
-//        } else {
-//            limitNum = currentNum + quantity;
-//        }
-//        if ( limitNum > coupon.getLimitNum()) {
-//            throw new BusinessException(ErrorCode.OPERATION_ERROR, "用户限领量已达到上限");
-//        }
-//        // 插入一条兑换记录
-//        Exchange exchange = new Exchange();
-//        BeanUtils.copyProperties(exchangeAddRequest, exchange);
-//        boolean result = exchangeService.save(exchange);
-//        ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
-//
-//        // 给当前用户添加优惠券
-//        UserCoupon userCoupon = new UserCoupon();
-//        BeanUtils.copyProperties(exchangeAddRequest, userCoupon);
-//        boolean couponResult = userCouponService.save(userCoupon);
-//        ThrowUtils.throwIf(!couponResult, ErrorCode.OPERATION_ERROR);
-//        return ResultUtils.success(true, "兑换成功");
-//    }
-
-
 
     /**
      * 用户删除兑换记录
diff --git a/src/main/java/com/cultural/heritage/controller/good/GoodController.java b/src/main/java/com/cultural/heritage/controller/good/GoodController.java
index c7ae49d..1cbece6 100644
--- a/src/main/java/com/cultural/heritage/controller/good/GoodController.java
+++ b/src/main/java/com/cultural/heritage/controller/good/GoodController.java
@@ -1,8 +1,8 @@
 package com.cultural.heritage.controller.good;
 
 
-import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cultural.heritage.annotation.AuthCheck;
 import com.cultural.heritage.common.BaseResponse;
@@ -19,33 +19,32 @@ import com.cultural.heritage.model.dto.good.GoodAddRequest;
 import com.cultural.heritage.model.dto.good.GoodQueryRequest;
 import com.cultural.heritage.model.dto.good.GoodUpdateRequest;
 import com.cultural.heritage.model.dto.good.service.ServiceGoodAddRequest;
+import com.cultural.heritage.model.dto.good.service.ServiceGoodQueryRequest;
 import com.cultural.heritage.model.dto.good.service.ServiceGoodUpdateRequest;
+import com.cultural.heritage.model.dto.timeperiod.TimePeriodAddRequest;
 import com.cultural.heritage.model.entity.AppointmentDate;
 import com.cultural.heritage.model.entity.Good;
+import com.cultural.heritage.model.entity.TimePeriod;
+import com.cultural.heritage.model.vo.appointment.AppointmentDateTimePeriodVO;
 import com.cultural.heritage.model.vo.appointment.AppointmentDateVO;
 import com.cultural.heritage.model.vo.good.GoodPageVO;
 import com.cultural.heritage.model.vo.good.ServiceGoodCardVO;
 import com.cultural.heritage.model.vo.good.ServiceGoodVO;
+import com.cultural.heritage.model.vo.timeperiod.TimePeriodVO;
 import com.cultural.heritage.service.good.AppointmentDateService;
 import com.cultural.heritage.service.good.GoodService;
+import com.cultural.heritage.service.good.TimePeriodService;
 import com.cultural.heritage.service.user.UserService;
-import com.cultural.heritage.utils.AppointmentDateUtil;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.*;
 
 
 /**
@@ -70,6 +69,11 @@ public class GoodController {
     private AppointmentDateService appointmentDateService;
 
 
+    @Resource
+    private TimePeriodService timePeriodService;
+
+
+
     /**
      * Web端管理员添加常规类商品
      * @param goodAddRequest  商品添加请求体
@@ -100,6 +104,7 @@ public class GoodController {
      * @return 是否添加成功
      */
     @PostMapping("/add/service")
+    @Transactional(rollbackFor = Exception.class)
     @Operation(summary = "Web端管理员添加服务类商品", description = "参数:服务类商品添加请求体,权限:管理员(admin, boss),方法名:addServiceGood")
     @AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
     public BaseResponse<Boolean> addServiceGood(@RequestBody ServiceGoodAddRequest serviceGoodAddRequest) {
@@ -108,32 +113,48 @@ public class GoodController {
         }
         // 向商品表插入服务类商品的基本信息
         Good good = new Good();
-        good.setIsGoodType(0);
         BeanUtils.copyProperties(serviceGoodAddRequest, good);
+        good.setType("服务类");
+        good.setIsGoodType(0);
+        good.setInventory(1);
+        good.setFestivalOrder(0);
         // 校验
         goodService.validGood(good, false);
         boolean save = goodService.save(good);
         ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR);
 
-        // 获取当天及未来三天的日期
-        List<String> dates = AppointmentDateUtil.getDates();
-        AtomicInteger idx = new AtomicInteger(0);
-
-        // 向预约日期表中批量插入服务类商品的预约信息
-        Long id = good.getId();
+        // 添加当前商品的预约日期
         List<AppointmentDateAddRequest> appointmentDateAddRequestList = serviceGoodAddRequest.getAppointmentDateAddRequestList();
-        List<AppointmentDate> appointmentDates = appointmentDateAddRequestList.stream().map(appointmentDateAddRequest -> {
+        List<AppointmentDate> appointmentDateList = appointmentDateAddRequestList.stream().map(appointmentDateAddRequest -> {
             AppointmentDate appointmentDate = new AppointmentDate();
             BeanUtils.copyProperties(appointmentDateAddRequest, appointmentDate);
-            appointmentDate.setSpecificDate(dates.get(idx.getAndIncrement()));
-            appointmentDate.setGoodId(id);
+            appointmentDate.setGoodId(good.getId());
             // 校验
             appointmentDateService.validAppointmentDate(appointmentDate, false);
             return appointmentDate;
         }).toList();
-        boolean isSuccess = appointmentDateService.saveBatch(appointmentDates);
-        ThrowUtils.throwIf(!isSuccess, ErrorCode.OPERATION_ERROR);
+        boolean isSaveBatch = appointmentDateService.saveBatch(appointmentDateList);
+        ThrowUtils.throwIf(!isSaveBatch, ErrorCode.OPERATION_ERROR);
 
+        // 添加当前商品的预约时间段
+        List<TimePeriod> timePeriods = new ArrayList<>();
+        for (int i = 0; i < appointmentDateAddRequestList.size(); i++) {
+            AppointmentDate appointmentDate = appointmentDateList.get(i);
+            AppointmentDateAddRequest appointmentDateAddRequest = appointmentDateAddRequestList.get(i);
+            Long appointmentDateId = appointmentDate.getId();
+            List<TimePeriodAddRequest> timePeriodAddRequestList = appointmentDateAddRequest.getTimePeriodAddRequestList();
+            List<TimePeriod> timePeriodList = timePeriodAddRequestList.stream().map(timePeriodAddRequest -> {
+                TimePeriod timePeriod = new TimePeriod();
+                BeanUtils.copyProperties(timePeriodAddRequest, timePeriod);
+                timePeriod.setAppointmentDateId(appointmentDateId);
+                // 校验
+                timePeriodService.validTimePeriod(timePeriod, false);
+                return timePeriod;
+            }).toList();
+            timePeriods.addAll(timePeriodList);
+        }
+        boolean result = timePeriodService.saveBatch(timePeriods);
+        ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
         return ResultUtils.success(true);
     }
 
@@ -173,15 +194,24 @@ public class GoodController {
             throw new BusinessException(ErrorCode.PARAMS_ERROR);
         }
         Long id = deleteRequest.getId();
-        // 删除预约日期表中与该商品关联的记录
+
+        //删除预约时间段表中与该商品关联的记录
         QueryWrapper<AppointmentDate> dateQueryWrapper = new QueryWrapper<>();
         dateQueryWrapper.eq("goodId", id);
+        List<AppointmentDate> appointmentDateList = appointmentDateService.list(dateQueryWrapper);
+        List<Long> ids = appointmentDateList.stream().map(AppointmentDate::getId).toList();
+        QueryWrapper<TimePeriod> timePeriodQueryWrapper = new QueryWrapper<>();
+        timePeriodQueryWrapper.in("appointmentDateId", ids);
+        boolean remove = timePeriodService.remove(timePeriodQueryWrapper);
+        ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR, "服务类商品预约时间段删除失败");
+
+        // 删除预约日期表中与该商品关联的记录
         boolean isSuccess = appointmentDateService.remove(dateQueryWrapper);
-        ThrowUtils.throwIf(!isSuccess, ErrorCode.OPERATION_ERROR);
+        ThrowUtils.throwIf(!isSuccess, ErrorCode.OPERATION_ERROR, "服务类商品预约日期删除失败");
 
         // 删除商品表中的服务类商品
         boolean result = goodService.removeById(id);
-        ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
+        ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR, "服务类商品删除失败");
         return ResultUtils.success(true);
     }
 
@@ -202,9 +232,17 @@ public class GoodController {
         if (CollectionUtils.isEmpty(ids)) {
             throw new BusinessException(ErrorCode.PARAMS_ERROR);
         }
-        // 删除预约日期表中与该商品关联的记录
+        //删除预约时间段表中与该商品关联的记录
         QueryWrapper<AppointmentDate> queryWrapper = new QueryWrapper<>();
         queryWrapper.in("goodId", ids);
+        List<AppointmentDate> appointmentDateList = appointmentDateService.list(queryWrapper);
+        List<Long> appointmentDateIds = appointmentDateList.stream().map(AppointmentDate::getId).toList();
+        QueryWrapper<TimePeriod> timePeriodQueryWrapper = new QueryWrapper<>();
+        timePeriodQueryWrapper.in("appointmentDateId", appointmentDateIds);
+        boolean success = timePeriodService.remove(timePeriodQueryWrapper);
+        ThrowUtils.throwIf(!success, ErrorCode.OPERATION_ERROR, "服务类商品预约时间段删除失败");
+
+        // 删除预约日期表中与该商品关联的记录
         boolean remove = appointmentDateService.remove(queryWrapper);
         ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR, "服务类商品预约日期删除失败");
 
@@ -253,7 +291,7 @@ public class GoodController {
     public BaseResponse<Page<GoodPageVO>> listGoodByPage(@RequestBody GoodQueryRequest goodQueryRequest) {
         long current = goodQueryRequest.getCurrent();
         long pageSize = goodQueryRequest.getPageSize();
-        QueryWrapper<Good> goodQueryWrapper = goodService.getGoodQueryWrapper(goodQueryRequest);
+        QueryWrapper<Good> goodQueryWrapper = goodService.getGoodQueryWrapper(goodQueryRequest, true);
         Page<Good> page = goodService.page(new Page<>(current, pageSize), goodQueryWrapper);
         List<Good> records = page.getRecords();
         List<GoodPageVO> goodPageVOS = records.stream().map(good -> {
@@ -316,57 +354,80 @@ public class GoodController {
 
     /**
      * Web端管理员分页查询服务类商品
-     * @param goodQueryRequest  商品查询请求体
+     * @param serviceGoodQueryRequest  服务类商品查询请求体
      * @return  服务类商品列表
      */
     @PostMapping("/service/list/page")
     @Operation(summary = "Web端管理员分页查询服务类商品", description = "参数:商品查询请求体,权限:管理员(admin, boss),方法名:listServiceGoodVOByPage")
     @AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
-    public BaseResponse<Page<ServiceGoodVO>> listServiceGoodVOByPage(@RequestBody GoodQueryRequest goodQueryRequest) {
-        if (goodQueryRequest == null) {
+    public BaseResponse<Page<ServiceGoodVO>> listServiceGoodVOByPage(@RequestBody ServiceGoodQueryRequest serviceGoodQueryRequest) {
+        if (serviceGoodQueryRequest == null) {
             throw new BusinessException(ErrorCode.PARAMS_ERROR);
         }
-        long current = goodQueryRequest.getCurrent();
-        long pageSize = goodQueryRequest.getPageSize();
-        QueryWrapper<Good> goodQueryWrapper = goodService.getGoodQueryWrapper(goodQueryRequest);
+        long current = serviceGoodQueryRequest.getCurrent();
+        long pageSize = serviceGoodQueryRequest.getPageSize();
+        GoodQueryRequest goodQueryRequest = new GoodQueryRequest();
+        BeanUtils.copyProperties(serviceGoodQueryRequest, goodQueryRequest);
+        goodQueryRequest.setFestivalOrder(0);
+        goodQueryRequest.setType("服务类");
+        QueryWrapper<Good> goodQueryWrapper = goodService.getGoodQueryWrapper(goodQueryRequest, true);
         Page<Good> page = goodService.page(new Page<>(current, pageSize), goodQueryWrapper);
         List<Good> records = page.getRecords();
 
-
-        // 获取当天及未来三天的日期
-        List<String> dates = AppointmentDateUtil.getDates();
-
-        // 用map集合存储服务类商品关联的预约日期
-        List<AppointmentDate> appointmentDateList = appointmentDateService.list();
-        List<AppointmentDateVO> appointmentDateVOS = appointmentDateList.stream().map(appointmentDate -> {
+        // 获取联表(预约日期表, 预约时间段表)查询结果
+        List<AppointmentDateTimePeriodVO> appointmentDateTimePeriodVOS = appointmentDateService.queryAppointmentDateDetail();
+        List<AppointmentDateVO> appointmentDateVOList = new ArrayList<>();
+        // 利用map集合封装预约日期和预约时间段
+        Map<Long, List<TimePeriodVO>> timeMap = new HashMap<>();
+        Map<Long, AppointmentDateVO> dateMap = new HashMap<>();
+        for (AppointmentDateTimePeriodVO appointmentDateTimePeriodVO : appointmentDateTimePeriodVOS) {
+            // 封装预约日期和预约时间段
             AppointmentDateVO appointmentDateVO = new AppointmentDateVO();
-            BeanUtils.copyProperties(appointmentDate, appointmentDateVO);
-            return appointmentDateVO;
-        }).toList();
-        Map<Long, List<AppointmentDateVO>> map = new HashMap<>();
-        for (AppointmentDateVO appointmentDateVO : appointmentDateVOS) {
-            Long goodId = appointmentDateVO.getGoodId();
-            String specificDate = appointmentDateVO.getSpecificDate();
-            if (!dates.contains(specificDate)) continue;
-            List<AppointmentDateVO> dateVOList = map.get(goodId) != null ? map.get(goodId) : new ArrayList<>();
-            dateVOList.add(appointmentDateVO);
-            map.put(goodId, dateVOList);
+            TimePeriodVO timePeriodVO = new TimePeriodVO();
+            BeanUtils.copyProperties(appointmentDateTimePeriodVO, appointmentDateVO);
+            BeanUtils.copyProperties(appointmentDateTimePeriodVO, timePeriodVO);
+            Long timePeriodId = appointmentDateTimePeriodVO.getTimePeriodId();
+            timePeriodVO.setId(timePeriodId);
+
+            Long id = appointmentDateTimePeriodVO.getId();
+            List<TimePeriodVO> timePeriodVOList = timeMap.get(id);
+            if (timePeriodVOList == null) {
+                timePeriodVOList = new ArrayList<>();
+                // 用map集合存储预约日期
+                dateMap.put(id, appointmentDateVO);
+            }
+            timePeriodVOList.add(timePeriodVO);
+            timeMap.put(id, timePeriodVOList);
+
+        }
+        // 封装预约日期集合
+        Set<Long> dateIds = dateMap.keySet();
+        for (Long dateId : dateIds) {
+            AppointmentDateVO appointmentDateVO = dateMap.get(dateId);
+            List<TimePeriodVO> timePeriodVOList = timeMap.get(dateId);
+            appointmentDateVO.setTimePeriodVOList(timePeriodVOList);
+            appointmentDateVOList.add(appointmentDateVO);
         }
 
-        List<ServiceGoodVO> serviceGoodVOList = records.stream().map(good -> {
+        List<ServiceGoodVO> serviceGoodVOList = new ArrayList<>();
+        for (Good good : records) {
             ServiceGoodVO serviceGoodVO = new ServiceGoodVO();
             BeanUtils.copyProperties(good, serviceGoodVO);
-            Long id = good.getId();
-            List<AppointmentDateVO> appointmentDateVOList = map.get(id);
-            serviceGoodVO.setAppointmentDateVOS(appointmentDateVOList);
-            return serviceGoodVO;
-        }).toList();
+            Long goodVOId = serviceGoodVO.getId();
+            List<AppointmentDateVO> dateVOList = appointmentDateVOList.stream()
+                            .filter(appointmentDateVO -> Objects.equals(appointmentDateVO.getGoodId(), goodVOId)).toList();
+            serviceGoodVO.setAppointmentDateVOList(dateVOList);
+            serviceGoodVOList.add(serviceGoodVO);
+        }
+
         Page<ServiceGoodVO> serviceGoodVOPage = new Page<>();
         serviceGoodVOPage.setRecords(serviceGoodVOList);
-        serviceGoodVOPage.setCurrent(current);
-        serviceGoodVOPage.setPages(pageSize);
+        serviceGoodVOPage.setPages(page.getPages());
+        serviceGoodVOPage.setCurrent(page.getCurrent());
+        serviceGoodVOPage.setSize(page.getSize());
         serviceGoodVOPage.setTotal(page.getTotal());
         return ResultUtils.success(serviceGoodVOPage);
+
     }
 
 
@@ -389,22 +450,38 @@ public class GoodController {
         ThrowUtils.throwIf(good == null, ErrorCode.NOT_FOUND_ERROR, "商品不存在");
         ServiceGoodVO serviceGoodVO = new ServiceGoodVO();
         BeanUtils.copyProperties(good, serviceGoodVO);
-
-        // 获取当天及未来三天的日期
-        List<String> dates = AppointmentDateUtil.getDates();
-
-        // 获取当前服务类商品关联的预约日期
-        QueryWrapper<AppointmentDate> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("goodId", id);
-        List<AppointmentDate> appointmentDateList = appointmentDateService.list(queryWrapper);
-        List<AppointmentDateVO> appointmentDateVOS = appointmentDateList.stream().map(appointmentDate -> {
+        Long goodVOId = serviceGoodVO.getId();
+        List<AppointmentDateTimePeriodVO> appointmentDateTimePeriodVOList = appointmentDateService.queryAppointmentDateDetailById(goodVOId);
+        List<AppointmentDateVO> appointmentDateVOList = new ArrayList<>();
+        // 封装预约日期和预约时间段
+        Map<Long, List<TimePeriodVO>> timeMap = new HashMap<>();
+        Map<Long, AppointmentDateVO> dateMap = new HashMap<>();
+        for (AppointmentDateTimePeriodVO appointmentDateTimePeriodVO : appointmentDateTimePeriodVOList) {
+            TimePeriodVO timePeriodVO = new TimePeriodVO();
             AppointmentDateVO appointmentDateVO = new AppointmentDateVO();
-            BeanUtils.copyProperties(appointmentDate, appointmentDateVO);
-            return appointmentDateVO;
-        }).toList();
-        List<AppointmentDateVO> dateVOList = appointmentDateVOS.stream()
-                .filter(appointmentDateVO -> dates.contains(appointmentDateVO.getSpecificDate())).toList();
-        serviceGoodVO.setAppointmentDateVOS(dateVOList);
+            BeanUtils.copyProperties(appointmentDateTimePeriodVO, timePeriodVO);
+            BeanUtils.copyProperties(appointmentDateTimePeriodVO, appointmentDateVO);
+            Long timePeriodId = appointmentDateTimePeriodVO.getTimePeriodId();
+            timePeriodVO.setId(timePeriodId);
+
+            Long appId = appointmentDateTimePeriodVO.getId();
+            List<TimePeriodVO> timePeriodVOList = timeMap.get(appId);
+            if (timePeriodVOList == null) {
+                timePeriodVOList = new ArrayList<>();
+                dateMap.put(appId, appointmentDateVO);
+            }
+            timePeriodVOList.add(timePeriodVO);
+            timeMap.put(appId, timePeriodVOList);
+        }
+
+        Set<Long> dateIds = dateMap.keySet();
+        for (Long dateId : dateIds) {
+            AppointmentDateVO appointmentDateVO = dateMap.get(dateId);
+            List<TimePeriodVO> timePeriodVOList = timeMap.get(dateId);
+            appointmentDateVO.setTimePeriodVOList(timePeriodVOList);
+            appointmentDateVOList.add(appointmentDateVO);
+        }
+        serviceGoodVO.setAppointmentDateVOList(appointmentDateVOList);
         return ResultUtils.success(serviceGoodVO);
     }
 
@@ -448,65 +525,31 @@ public class GoodController {
         // 更新服务类商品的基本信息
         Good good = new Good();
         BeanUtils.copyProperties(serviceGoodUpdateRequest, good);
+        good.setType("服务类");
         good.setIsGoodType(0);
+        good.setInventory(1);
+        good.setFestivalOrder(0);
         // 校验
         goodService.validGood(good, true);
         boolean result = goodService.updateById(good);
         ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR, "商品不存在");
 
-        // 获取当天及未来三天的日期
-        List<String> dates = AppointmentDateUtil.getDates();
-        AtomicInteger idx = new AtomicInteger(0);
-
-        // 封装预约日期实体类
         List<AppointmentDateUpdateRequest> appointmentDateUpdateRequestList = serviceGoodUpdateRequest.getAppointmentDateUpdateRequestList();
         List<AppointmentDate> appointmentDateList = appointmentDateUpdateRequestList.stream().map(appointmentDateUpdateRequest -> {
             AppointmentDate appointmentDate = new AppointmentDate();
             BeanUtils.copyProperties(appointmentDateUpdateRequest, appointmentDate);
-            appointmentDate.setSpecificDate(dates.get(idx.getAndIncrement()));
             appointmentDate.setGoodId(good.getId());
-            // 校验
-            appointmentDateService.validAppointmentDate(appointmentDate, true);
             return appointmentDate;
         }).toList();
 
-        // 更新当前服务类商品的预约日期
-        boolean isSuccess = appointmentDateService.updateBatchById(appointmentDateList);
-        ThrowUtils.throwIf(!isSuccess, ErrorCode.OPERATION_ERROR);
+
+
         return ResultUtils.success(true);
     }
 
 
 
 
-    /**
-     * (服务类商品)初始化未来一天的预约日期
-     */
-//        @Scheduled(cron = "*/5 * * * * ?")
-    // 每天00:00-00:00调用
-    @Scheduled(cron = "0 0 0 * * ?")
-    @PostMapping("/service/init")
-    @Operation(summary = "(服务类商品)初始化未来一天的预约日期", description = "参数:无,权限:自动调用,方法名:initServiceGoodBookingDate")
-    @Transactional(rollbackFor = Exception.class)
-    public void initServiceGoodBookingDate() {
-        QueryWrapper<Good> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("isGoodType", 0);
-        List<Good> goodList = goodService.list(queryWrapper);
-        List<AppointmentDate> appointmentDateList = new ArrayList<>();
-        goodList.forEach(good -> {
-            AppointmentDate appointmentDate = new AppointmentDate();
-            appointmentDate.setGoodId(good.getId());
-            appointmentDate.setSpecificDate(DateUtil.formatDate(DateUtil.offsetDay(DateUtil.date(), 3)));
-            appointmentDate.setTimeSlot("00:00-00:00");
-            appointmentDate.setIsAvailable(0);
-            appointmentDate.setNumberRange("(0,0)");
-            appointmentDateList.add(appointmentDate);
-        });
-        boolean result = appointmentDateService.saveBatch(appointmentDateList);
-        ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR, "初始化失败");
-    }
-
-
 
 
 
diff --git a/src/main/java/com/cultural/heritage/mapper/AppointmentDateMapper.java b/src/main/java/com/cultural/heritage/mapper/AppointmentDateMapper.java
index 11d9579..a542df2 100644
--- a/src/main/java/com/cultural/heritage/mapper/AppointmentDateMapper.java
+++ b/src/main/java/com/cultural/heritage/mapper/AppointmentDateMapper.java
@@ -2,6 +2,20 @@ package com.cultural.heritage.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cultural.heritage.model.entity.AppointmentDate;
+import com.cultural.heritage.model.vo.appointment.AppointmentDateTimePeriodVO;
+
+import java.util.List;
 
 public interface AppointmentDateMapper extends BaseMapper<AppointmentDate> {
+
+    /**
+     * (多表联查)查询所有商品的预约情况
+     */
+    List<AppointmentDateTimePeriodVO> queryAppointmentDateDetail();
+
+
+    /**
+     * (多表联查)根据id查询商品的预约情况
+     */
+    List<AppointmentDateTimePeriodVO> queryAppointmentDateDetailById(Long goodId);
 }
diff --git a/src/main/java/com/cultural/heritage/mapper/TimePeriodMapper.java b/src/main/java/com/cultural/heritage/mapper/TimePeriodMapper.java
new file mode 100644
index 0000000..05efd51
--- /dev/null
+++ b/src/main/java/com/cultural/heritage/mapper/TimePeriodMapper.java
@@ -0,0 +1,7 @@
+package com.cultural.heritage.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cultural.heritage.model.entity.TimePeriod;
+
+public interface TimePeriodMapper extends BaseMapper<TimePeriod> {
+}
diff --git a/src/main/java/com/cultural/heritage/model/dto/appointment/AppointmentDateAddRequest.java b/src/main/java/com/cultural/heritage/model/dto/appointment/AppointmentDateAddRequest.java
index d7351a3..72d4aaf 100644
--- a/src/main/java/com/cultural/heritage/model/dto/appointment/AppointmentDateAddRequest.java
+++ b/src/main/java/com/cultural/heritage/model/dto/appointment/AppointmentDateAddRequest.java
@@ -1,29 +1,25 @@
 package com.cultural.heritage.model.dto.appointment;
 
+import com.cultural.heritage.model.dto.timeperiod.TimePeriodAddRequest;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.util.List;
 
 @Data
-@Schema(description = "预约日期请求体", requiredProperties = {"timeSlot", "isAvailable", "minNumber", "maxNumber"})
+@Schema(description = "预约日期请求体", requiredProperties = {
+        "timeSlot", "isAvailable", "minNumber", "maxNumber", "timePeriodAddRequestList"
+})
 public class AppointmentDateAddRequest implements Serializable {
 
 
-//    /**
-//     * 预约具体日期
-//     */
-//    @Schema(description = "预约具体日期", example = "2024-11-09")
-//    private String specificDate;
-
-
     /**
-     * 预约时间段
+     * 具体预约时间
      */
-    @Schema(description = "预约时间段", example = "9:00-11:00;12:00-14:00")
-    private String timeSlot;
-
+    @Schema(description = "具体预约时间", example = "2024-12-04")
+    private String specificDate;
 
     /**
      * 是否可预约
@@ -31,13 +27,10 @@ public class AppointmentDateAddRequest implements Serializable {
     @Schema(description = "是否可预约", example = "1")
     private Integer isAvailable;
 
-
     /**
-     * 预约人数范围
+     * 预约时间段列表
      */
-    @Schema(description = "预约人数范围", example = "(3,5);(4,6)")
-    private String numberRange;
-
+    private List<TimePeriodAddRequest> timePeriodAddRequestList;
 
 
     @Serial
diff --git a/src/main/java/com/cultural/heritage/model/dto/appointment/AppointmentDateUpdateRequest.java b/src/main/java/com/cultural/heritage/model/dto/appointment/AppointmentDateUpdateRequest.java
index bb98435..018b3ef 100644
--- a/src/main/java/com/cultural/heritage/model/dto/appointment/AppointmentDateUpdateRequest.java
+++ b/src/main/java/com/cultural/heritage/model/dto/appointment/AppointmentDateUpdateRequest.java
@@ -1,12 +1,16 @@
 package com.cultural.heritage.model.dto.appointment;
 
+import com.cultural.heritage.model.dto.timeperiod.TimePeriodUpdateRequest;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.util.List;
 
 @Data
+@Schema(description = "预约日期更新请求体", requiredProperties = {"id", "specificDate",
+"isAvailable", "timePeriodUpdateRequestList"})
 public class AppointmentDateUpdateRequest implements Serializable {
 
     /**
@@ -16,18 +20,11 @@ public class AppointmentDateUpdateRequest implements Serializable {
     private Long id;
 
 
-//    /**
-//     * 预约具体日期
-//     */
-//    @Schema(description = "预约具体日期", example = "2024-11-09")
-//    private String specificDate;
-
-
     /**
-     * 预约时间段
+     * 预约具体日期
      */
-    @Schema(description = "预约时间段", example = "9:00-11:00;12:00-14:00")
-    private String timeSlot;
+    @Schema(description = "预约具体日期", example = "2024-11-09")
+    private String specificDate;
 
 
     /**
@@ -38,10 +35,11 @@ public class AppointmentDateUpdateRequest implements Serializable {
 
 
     /**
-     * 预约人数范围
+     * 预约时间段
      */
-    @Schema(description = "预约人数范围", example = "(3,5);(4,6)")
-    private String numberRange;
+    @Schema(description = "预约时间段")
+    private List<TimePeriodUpdateRequest> timePeriodUpdateRequestList;
+
 
 
     @Serial
diff --git a/src/main/java/com/cultural/heritage/model/dto/good/service/ServiceGoodAddRequest.java b/src/main/java/com/cultural/heritage/model/dto/good/service/ServiceGoodAddRequest.java
index 02c28f5..010d234 100644
--- a/src/main/java/com/cultural/heritage/model/dto/good/service/ServiceGoodAddRequest.java
+++ b/src/main/java/com/cultural/heritage/model/dto/good/service/ServiceGoodAddRequest.java
@@ -1,23 +1,66 @@
 package com.cultural.heritage.model.dto.good.service;
 
 import com.cultural.heritage.model.dto.appointment.AppointmentDateAddRequest;
-import com.cultural.heritage.model.dto.good.GoodAddRequest;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.List;
 
 @Data
-@Schema(description = "服务类商品添加请求体", requiredProperties = {"appointmentDateAddRequestList"})
-public class ServiceGoodAddRequest extends GoodAddRequest implements Serializable {
+@Schema(description = "服务类商品添加请求体", requiredProperties = {"name", "price", "goodImg", "intro", "introDetail",
+"detailImg", "label", "appointmentDateAddRequestList"})
+public class ServiceGoodAddRequest implements Serializable {
+
+    /**
+     * 商品名
+     */
+    @Schema(description = "商品名", example = "非遗香囊")
+    private String name;
+
+    /**
+     * 商品价格
+     */
+    @Schema(description = "商品价格", example = "20.00")
+    private BigDecimal price;
+
+    /**
+     * 商品图片
+     */
+    @Schema(description = "商品图片", example = "https://xxx/xxx.jpg")
+    private String goodImg;
+
+    /**
+     * 商品简介
+     */
+    @Schema(description = "商品简介", example = "传承千年文化,守护健康美好")
+    private String intro;
+
+    /**
+     * 商品详情简介
+     */
+    @Schema(description = "商品详情简介", example = "精选药材:选用艾草、菖蒲、苍术、白芷等十多种纯天然中草药,科学配比,香气宜人,具有驱蚊、防疫、安神等多种功效。端午香囊,传承千年文化,守护健康美好。在这个端午节,让我们共同感受传统文化的魅力,为生活增添一抹色彩!")
+    private String introDetail;
+
+    /**
+     * 商品详情图片
+     */
+    @Schema(description = "商品详情图片", example = "https://xxx/xxx.jpg")
+    private String detailImg;
+
+    /**
+     * 商品标签
+     */
+    @Schema(description = "商品标签", example = "亲情;送礼;材料包")
+    private String label;
 
 
     /**
      * 未来几天的预约详情
      */
-    @Schema(description = "未来几天的预约详情")
+    @Schema(description = "未来的预约时间表")
     private List<AppointmentDateAddRequest> appointmentDateAddRequestList;
 
 
diff --git a/src/main/java/com/cultural/heritage/model/dto/good/service/ServiceGoodQueryRequest.java b/src/main/java/com/cultural/heritage/model/dto/good/service/ServiceGoodQueryRequest.java
new file mode 100644
index 0000000..3e8d413
--- /dev/null
+++ b/src/main/java/com/cultural/heritage/model/dto/good/service/ServiceGoodQueryRequest.java
@@ -0,0 +1,36 @@
+package com.cultural.heritage.model.dto.good.service;
+
+import com.cultural.heritage.common.PageRequest;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Schema(description = "服务类商品查询请求体", requiredProperties = {"id", "name", "isShelves"})
+public class ServiceGoodQueryRequest extends PageRequest implements Serializable {
+
+    /**
+     * id
+     */
+    @Schema(description = "商品id(id > 0)", example = "17")
+    private Long id;
+
+    /**
+     * 商品名
+     */
+    @Schema(description = "商品名", example = "非遗香囊")
+    private String name;
+
+    /**
+     * 是否上架
+     */
+    @Schema(description = "是否上架(1:上架;0:下架)", example = "1")
+    private Integer isShelves;
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+}
diff --git a/src/main/java/com/cultural/heritage/model/dto/good/service/ServiceGoodUpdateRequest.java b/src/main/java/com/cultural/heritage/model/dto/good/service/ServiceGoodUpdateRequest.java
index 3a2102b..5e8dbc3 100644
--- a/src/main/java/com/cultural/heritage/model/dto/good/service/ServiceGoodUpdateRequest.java
+++ b/src/main/java/com/cultural/heritage/model/dto/good/service/ServiceGoodUpdateRequest.java
@@ -1,22 +1,72 @@
 package com.cultural.heritage.model.dto.good.service;
 
 import com.cultural.heritage.model.dto.appointment.AppointmentDateUpdateRequest;
-import com.cultural.heritage.model.dto.good.GoodUpdateRequest;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.List;
 
 @Data
-@Schema(description = "服务类商品更新请求体", requiredProperties = {"appointmentDateUpdateRequestList"})
-public class ServiceGoodUpdateRequest extends GoodUpdateRequest implements Serializable {
+@Schema(description = "服务类商品更新请求体", requiredProperties = {"id", "name", "price", "goodImg", "intro", "introDetail",
+        "detailImg", "label", "appointmentDateUpdateRequestList"})
+public class ServiceGoodUpdateRequest implements Serializable {
 
     /**
-     * 未来几天的预约详情
+     * 商品id
      */
-    @Schema(description = "未来几天的预约详情")
+    @Schema(description = "商品id(id > 0)", example = "286")
+    private Long id;
+
+    /**
+     * 商品名
+     */
+    @Schema(description = "商品名", example = "非遗香囊")
+    private String name;
+
+    /**
+     * 商品价格
+     */
+    @Schema(description = "商品价格", example = "20.00")
+    private BigDecimal price;
+
+    /**
+     * 商品图片
+     */
+    @Schema(description = "商品图片", example = "https://xxx/xxx.jpg")
+    private String goodImg;
+
+    /**
+     * 商品简介
+     */
+    @Schema(description = "商品简介", example = "传承千年文化,守护健康美好")
+    private String intro;
+
+    /**
+     * 商品详情简介
+     */
+    @Schema(description = "商品详情简介", example = "精选药材:选用艾草、菖蒲、苍术、白芷等十多种纯天然中草药,科学配比,香气宜人,具有驱蚊、防疫、安神等多种功效。端午香囊,传承千年文化,守护健康美好。在这个端午节,让我们共同感受传统文化的魅力,为生活增添一抹色彩!")
+    private String introDetail;
+
+    /**
+     * 商品详情图片
+     */
+    @Schema(description = "商品详情图片", example = "https://xxx/xxx.jpg")
+    private String detailImg;
+
+    /**
+     * 商品标签
+     */
+    @Schema(description = "商品标签", example = "亲情;送礼;材料包")
+    private String label;
+
+
+    /**
+     * 未来几天的预约时间表
+     */
+    @Schema(description = "未来的预约时间表")
     private List<AppointmentDateUpdateRequest> appointmentDateUpdateRequestList;
 
 
diff --git a/src/main/java/com/cultural/heritage/model/dto/timeperiod/TimePeriodAddRequest.java b/src/main/java/com/cultural/heritage/model/dto/timeperiod/TimePeriodAddRequest.java
new file mode 100644
index 0000000..c9328f1
--- /dev/null
+++ b/src/main/java/com/cultural/heritage/model/dto/timeperiod/TimePeriodAddRequest.java
@@ -0,0 +1,39 @@
+package com.cultural.heritage.model.dto.timeperiod;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+@Schema(description = "预约时间段添加请求体", requiredProperties = {
+        "timeSlot", "minNumber", "maxNumber"
+})
+public class TimePeriodAddRequest implements Serializable {
+
+
+    /**
+     * 时间段
+     */
+    @Schema(description = "时间段", example = "08:00-10:00")
+    private String timeSlot;
+
+
+    /**
+     * 最小预约人数
+     */
+    @Schema(description = "最小预约人数", example = "3")
+    private Integer minNumber;
+
+
+    /**
+     * 最大预约人数
+     */
+    @Schema(description = "最大预约人数", example = "10")
+    private Integer maxNumber;
+
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+}
diff --git a/src/main/java/com/cultural/heritage/model/dto/timeperiod/TimePeriodUpdateRequest.java b/src/main/java/com/cultural/heritage/model/dto/timeperiod/TimePeriodUpdateRequest.java
new file mode 100644
index 0000000..be9acad
--- /dev/null
+++ b/src/main/java/com/cultural/heritage/model/dto/timeperiod/TimePeriodUpdateRequest.java
@@ -0,0 +1,44 @@
+package com.cultural.heritage.model.dto.timeperiod;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+@Schema(description = "预约时间段更新请求体", requiredProperties = {"id", "timeSlot",
+"minNumber", "maxNumber"})
+public class TimePeriodUpdateRequest implements Serializable {
+
+    /**
+     * 预约时间段id
+     */
+    @Schema(description = "预约时间段id(id > 0)", example = "10")
+    private Long id;
+
+    /**
+     * 时间段
+     */
+    @Schema(description = "时间段", example = "08:00-10:00")
+    private String timeSlot;
+
+
+    /**
+     * 最小预约人数
+     */
+    @Schema(description = "最小预约人数", example = "3")
+    private Integer minNumber;
+
+
+    /**
+     * 最大预约人数
+     */
+    @Schema(description = "最大预约人数", example = "10")
+    private Integer maxNumber;
+
+
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+}
diff --git a/src/main/java/com/cultural/heritage/model/entity/AppointmentDate.java b/src/main/java/com/cultural/heritage/model/entity/AppointmentDate.java
index 218caeb..6fe8368 100644
--- a/src/main/java/com/cultural/heritage/model/entity/AppointmentDate.java
+++ b/src/main/java/com/cultural/heritage/model/entity/AppointmentDate.java
@@ -31,24 +31,12 @@ public class AppointmentDate implements Serializable {
     private String specificDate;
 
 
-    /**
-     * 预约时间段
-     */
-    private String timeSlot;
-
-
     /**
      * 是否可预约
      */
     private Integer isAvailable;
 
 
-    /**
-     * 预约人数范围
-     */
-    private String numberRange;
-
-
     /**
      * 商品id
      */
diff --git a/src/main/java/com/cultural/heritage/model/entity/TimePeriod.java b/src/main/java/com/cultural/heritage/model/entity/TimePeriod.java
new file mode 100644
index 0000000..3cae487
--- /dev/null
+++ b/src/main/java/com/cultural/heritage/model/entity/TimePeriod.java
@@ -0,0 +1,67 @@
+package com.cultural.heritage.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 服务类商品预约时间段表
+ * @TableName   time_period
+ */
+@Data
+@TableName("time_period")
+public class TimePeriod implements Serializable {
+
+
+    /**
+     * 预约时间段id
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 时间段
+     */
+    private String timeSlot;
+
+
+    /**
+     * 最小预约人数
+     */
+    private Integer minNumber;
+
+
+    /**
+     * 最大预约人数
+     */
+    private Integer maxNumber;
+
+
+    /**
+     * 预约日期id
+     */
+    private Long appointmentDateId;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 是否删除
+     */
+    private Integer isDelete;
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+}
diff --git a/src/main/java/com/cultural/heritage/model/vo/appointment/AppointmentDateTimePeriodVO.java b/src/main/java/com/cultural/heritage/model/vo/appointment/AppointmentDateTimePeriodVO.java
new file mode 100644
index 0000000..00ee2c3
--- /dev/null
+++ b/src/main/java/com/cultural/heritage/model/vo/appointment/AppointmentDateTimePeriodVO.java
@@ -0,0 +1,54 @@
+package com.cultural.heritage.model.vo.appointment;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class AppointmentDateTimePeriodVO implements Serializable {
+
+    /**
+     * 预约日期id
+     */
+    private Long id;
+
+    /**
+     * 预约具体日期
+     */
+    private String specificDate;
+
+    /**
+     * 是否可预约
+     */
+    private Integer isAvailable;
+
+    /**
+     * 商品id
+     */
+    private Long goodId;
+
+    /**
+     * 预约时间段id
+     */
+    private Long timePeriodId;
+
+    /**
+     * 预约时间段
+     */
+    private String timeSlot;
+
+    /**
+     * 最小预约人数
+     */
+    private Integer minNumber;
+
+    /**
+     * 最大预约人数
+     */
+    private Integer maxNumber;
+
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+}
diff --git a/src/main/java/com/cultural/heritage/model/vo/appointment/AppointmentDateVO.java b/src/main/java/com/cultural/heritage/model/vo/appointment/AppointmentDateVO.java
index bc7b4a2..020b3a4 100644
--- a/src/main/java/com/cultural/heritage/model/vo/appointment/AppointmentDateVO.java
+++ b/src/main/java/com/cultural/heritage/model/vo/appointment/AppointmentDateVO.java
@@ -1,9 +1,11 @@
 package com.cultural.heritage.model.vo.appointment;
 
+import com.cultural.heritage.model.vo.timeperiod.TimePeriodVO;
 import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.util.List;
 
 @Data
 public class AppointmentDateVO implements Serializable {
@@ -21,29 +23,24 @@ public class AppointmentDateVO implements Serializable {
     private String specificDate;
 
 
-    /**
-     * 预约时间段
-     */
-    private String timeSlot;
-
-
     /**
      * 是否可预约
      */
     private Integer isAvailable;
 
 
-    /**
-     * 预约人数范围
-     */
-    private String numberRange;
-
-
     /**
      * 商品id
      */
     private Long goodId;
 
+
+    /**
+     * 预约时间段
+     */
+    private List<TimePeriodVO> timePeriodVOList;
+
+
     @Serial
     private static final long serialVersionUID = 1L;
 }
diff --git a/src/main/java/com/cultural/heritage/model/vo/good/ServiceGoodVO.java b/src/main/java/com/cultural/heritage/model/vo/good/ServiceGoodVO.java
index 3a5d88e..4f8664f 100644
--- a/src/main/java/com/cultural/heritage/model/vo/good/ServiceGoodVO.java
+++ b/src/main/java/com/cultural/heritage/model/vo/good/ServiceGoodVO.java
@@ -6,17 +6,64 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.List;
 
 @Data
-public class ServiceGoodVO extends GoodPageVO implements Serializable {
+public class ServiceGoodVO implements Serializable {
+
+    /**
+     * 商品编号
+     */
+    private Long id;
+
+    /**
+     * 商品名
+     */
+    private String name;
+
+    /**
+     * 商品价格
+     */
+    private BigDecimal price;
+
+    /**
+     * 商品图片
+     */
+    private String goodImg;
+
+    /**
+     * 商品简介
+     */
+    private String intro;
+
+    /**
+     * 商品详情简介
+     */
+    private String introDetail;
+
+    /**
+     * 商品详情图片
+     */
+    private String detailImg;
+
+    /**
+     * 商品标签
+     */
+    private String label;
 
 
     /**
-     * 未来几天的预约详情
+     * 是否上架
      */
-    @Schema(description = "未来几天的预约详情")
-    private List<AppointmentDateVO> appointmentDateVOS;
+    private Integer isShelves;
+
+
+    /**
+     * 未来几天的预约时间表
+     */
+    @Schema(description = "未来几天的预约时间表")
+    private List<AppointmentDateVO> appointmentDateVOList;
 
 
     @Serial
diff --git a/src/main/java/com/cultural/heritage/model/vo/timeperiod/TimePeriodVO.java b/src/main/java/com/cultural/heritage/model/vo/timeperiod/TimePeriodVO.java
new file mode 100644
index 0000000..197af89
--- /dev/null
+++ b/src/main/java/com/cultural/heritage/model/vo/timeperiod/TimePeriodVO.java
@@ -0,0 +1,35 @@
+package com.cultural.heritage.model.vo.timeperiod;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class TimePeriodVO implements Serializable {
+
+    /**
+     * 预约时间段id
+     */
+    private Long id;
+
+    /**
+     * 时间段
+     */
+    private String timeSlot;
+
+
+    /**
+     * 最小预约人数
+     */
+    private Integer minNumber;
+
+
+    /**
+     * 最大预约人数
+     */
+    private Integer maxNumber;
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+}
diff --git a/src/main/java/com/cultural/heritage/service/good/AppointmentDateService.java b/src/main/java/com/cultural/heritage/service/good/AppointmentDateService.java
index 7270d7a..0a12dc7 100644
--- a/src/main/java/com/cultural/heritage/service/good/AppointmentDateService.java
+++ b/src/main/java/com/cultural/heritage/service/good/AppointmentDateService.java
@@ -2,6 +2,9 @@ package com.cultural.heritage.service.good;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.cultural.heritage.model.entity.AppointmentDate;
+import com.cultural.heritage.model.vo.appointment.AppointmentDateTimePeriodVO;
+
+import java.util.List;
 
 public interface AppointmentDateService extends IService<AppointmentDate> {
 
@@ -9,4 +12,16 @@ public interface AppointmentDateService extends IService<AppointmentDate> {
      * 校验
      */
     void validAppointmentDate(AppointmentDate appointmentDate, boolean update);
+
+
+    /**
+     * (多表联查)查询所有商品的预约情况
+     */
+    List<AppointmentDateTimePeriodVO> queryAppointmentDateDetail();
+
+
+    /**
+     * (多表联查)根据id查询商品的预约情况
+     */
+    List<AppointmentDateTimePeriodVO> queryAppointmentDateDetailById(Long goodId);
 }
diff --git a/src/main/java/com/cultural/heritage/service/good/GoodService.java b/src/main/java/com/cultural/heritage/service/good/GoodService.java
index 14d71af..fb4e65c 100644
--- a/src/main/java/com/cultural/heritage/service/good/GoodService.java
+++ b/src/main/java/com/cultural/heritage/service/good/GoodService.java
@@ -12,7 +12,7 @@ public interface GoodService extends IService<Good> {
     /**
      * 获取查询条件
      */
-    QueryWrapper<Good> getGoodQueryWrapper(GoodQueryRequest goodQueryRequest);
+    QueryWrapper<Good> getGoodQueryWrapper(GoodQueryRequest goodQueryRequest, boolean isServiceGood);
 
 
     /**
diff --git a/src/main/java/com/cultural/heritage/service/good/TimePeriodService.java b/src/main/java/com/cultural/heritage/service/good/TimePeriodService.java
new file mode 100644
index 0000000..f4eb591
--- /dev/null
+++ b/src/main/java/com/cultural/heritage/service/good/TimePeriodService.java
@@ -0,0 +1,13 @@
+package com.cultural.heritage.service.good;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cultural.heritage.model.entity.TimePeriod;
+
+public interface TimePeriodService extends IService<TimePeriod> {
+
+
+    /**
+     * 校验
+     */
+    void validTimePeriod(TimePeriod timePeriod, boolean update);
+}
diff --git a/src/main/java/com/cultural/heritage/service/good/impl/AppointmentDateServiceImpl.java b/src/main/java/com/cultural/heritage/service/good/impl/AppointmentDateServiceImpl.java
index 67ceaeb..c09a9bd 100644
--- a/src/main/java/com/cultural/heritage/service/good/impl/AppointmentDateServiceImpl.java
+++ b/src/main/java/com/cultural/heritage/service/good/impl/AppointmentDateServiceImpl.java
@@ -3,10 +3,9 @@ package com.cultural.heritage.service.good.impl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cultural.heritage.common.ErrorCode;
 import com.cultural.heritage.exception.BusinessException;
-import com.cultural.heritage.exception.ThrowUtils;
 import com.cultural.heritage.mapper.AppointmentDateMapper;
 import com.cultural.heritage.model.entity.AppointmentDate;
-import com.cultural.heritage.model.entity.Good;
+import com.cultural.heritage.model.vo.appointment.AppointmentDateTimePeriodVO;
 import com.cultural.heritage.service.good.AppointmentDateService;
 import com.cultural.heritage.service.good.GoodService;
 import jakarta.annotation.Resource;
@@ -14,6 +13,8 @@ import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 @Service
 public class AppointmentDateServiceImpl extends ServiceImpl<AppointmentDateMapper, AppointmentDate> implements AppointmentDateService {
 
@@ -22,6 +23,10 @@ public class AppointmentDateServiceImpl extends ServiceImpl<AppointmentDateMappe
     private GoodService goodService;
 
 
+    @Resource
+    private AppointmentDateMapper appointmentDateMapper;
+
+
     /**
      * 校验
      */
@@ -29,10 +34,8 @@ public class AppointmentDateServiceImpl extends ServiceImpl<AppointmentDateMappe
     public void validAppointmentDate(AppointmentDate appointmentDate, boolean update) {
         Long id = appointmentDate.getId();
         String specificDate = appointmentDate.getSpecificDate();
-        String timeSlot = appointmentDate.getTimeSlot();
         Integer isAvailable = appointmentDate.getIsAvailable();
         Long goodId = appointmentDate.getGoodId();
-        String numberRange = appointmentDate.getNumberRange();
         if (update) {
             if (id == null) {
                 throw new BusinessException(ErrorCode.PARAMS_ERROR, "参数id错误");
@@ -44,11 +47,29 @@ public class AppointmentDateServiceImpl extends ServiceImpl<AppointmentDateMappe
         if (ObjectUtils.isEmpty(goodId)) {
             throw new BusinessException(ErrorCode.PARAMS_ERROR, "商品id参数为null");
         }
-        Good good = goodService.getById(goodId);
-        ThrowUtils.throwIf(good == null, ErrorCode.SYSTEM_ERROR, "商品不存在");
-        if (StringUtils.isAnyBlank(specificDate, timeSlot, numberRange)) {
+        if (StringUtils.isBlank(specificDate)) {
             throw new BusinessException(ErrorCode.PARAMS_ERROR, "存在参数为空");
         }
 
     }
+
+
+    /**
+     * (多表联查)查询所有商品的预约情况
+     */
+    @Override
+    public List<AppointmentDateTimePeriodVO> queryAppointmentDateDetail() {
+        return appointmentDateMapper.queryAppointmentDateDetail();
+    }
+
+
+    /**
+     * (多表联查)根据id查询商品的预约情况
+     */
+    @Override
+    public List<AppointmentDateTimePeriodVO> queryAppointmentDateDetailById(Long goodId) {
+        return appointmentDateMapper.queryAppointmentDateDetailById(goodId);
+    }
+
+
 }
diff --git a/src/main/java/com/cultural/heritage/service/good/impl/GoodServiceImpl.java b/src/main/java/com/cultural/heritage/service/good/impl/GoodServiceImpl.java
index 12b20a1..0afcb76 100644
--- a/src/main/java/com/cultural/heritage/service/good/impl/GoodServiceImpl.java
+++ b/src/main/java/com/cultural/heritage/service/good/impl/GoodServiceImpl.java
@@ -26,7 +26,7 @@ public class GoodServiceImpl extends ServiceImpl<GoodMapper, Good> implements Go
      * 商品查询条件
      */
     @Override
-    public QueryWrapper<Good> getGoodQueryWrapper(GoodQueryRequest goodQueryRequest) {
+    public QueryWrapper<Good> getGoodQueryWrapper(GoodQueryRequest goodQueryRequest, boolean isServiceGood) {
         if (goodQueryRequest == null) {
             throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空");
         }
@@ -41,9 +41,14 @@ public class GoodServiceImpl extends ServiceImpl<GoodMapper, Good> implements Go
         QueryWrapper<Good> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq(ObjectUtils.isNotEmpty(id), "id", id);
         queryWrapper.like(StringUtils.isNotBlank(name), "name", name);
-        queryWrapper.like(StringUtils.isNotBlank(type), "type", type);
-        queryWrapper.eq(ObjectUtils.isNotEmpty(festivalOrder), "festivalOrder", festivalOrder);
+        int isGoodType = 0;
+        if (!isServiceGood){
+            isGoodType = 1;
+            queryWrapper.like(StringUtils.isNotBlank(type), "type", type);
+            queryWrapper.eq(ObjectUtils.isNotEmpty(festivalOrder), "festivalOrder", festivalOrder);
+        }
         queryWrapper.eq(ObjectUtils.isNotEmpty(isShelves), "isShelves", isShelves);
+        queryWrapper.eq(ObjectUtils.isNotEmpty(isGoodType), "isGoodType", isGoodType);
         queryWrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC),
                 sortField);
         return queryWrapper;
@@ -78,7 +83,7 @@ public class GoodServiceImpl extends ServiceImpl<GoodMapper, Good> implements Go
         String introDetail = good.getIntroDetail();
         String detailImg = good.getDetailImg();
         String label = good.getLabel();
-//        Integer inventory = good.getInventory();
+        Integer inventory = good.getInventory();
         Integer festivalOrder = good.getFestivalOrder();
         BigDecimal price = good.getPrice();
 
@@ -90,9 +95,9 @@ public class GoodServiceImpl extends ServiceImpl<GoodMapper, Good> implements Go
         if (StringUtils.isAnyBlank(type, goodImg, intro, introDetail, detailImg, label, name)) {
             throw new BusinessException(ErrorCode.PARAMS_ERROR, "存在参数为空");
         }
-//        if (ObjectUtils.isEmpty(inventory) || inventory < 1) {
-//            throw new BusinessException(ErrorCode.PARAMS_ERROR, "库存量不能小于1");
-//        }
+        if (ObjectUtils.isEmpty(inventory) || inventory < 1) {
+            throw new BusinessException(ErrorCode.PARAMS_ERROR, "库存量不能小于1");
+        }
         if (ObjectUtils.isEmpty(festivalOrder) || festivalOrder < 0) {
             throw new BusinessException(ErrorCode.PARAMS_ERROR, "节日参数错误");
         }
diff --git a/src/main/java/com/cultural/heritage/service/good/impl/TimePeriodServiceImpl.java b/src/main/java/com/cultural/heritage/service/good/impl/TimePeriodServiceImpl.java
new file mode 100644
index 0000000..e50928e
--- /dev/null
+++ b/src/main/java/com/cultural/heritage/service/good/impl/TimePeriodServiceImpl.java
@@ -0,0 +1,40 @@
+package com.cultural.heritage.service.good.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cultural.heritage.common.ErrorCode;
+import com.cultural.heritage.exception.BusinessException;
+import com.cultural.heritage.mapper.TimePeriodMapper;
+import com.cultural.heritage.model.entity.TimePeriod;
+import com.cultural.heritage.service.good.TimePeriodService;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+@Service
+public class TimePeriodServiceImpl extends ServiceImpl<TimePeriodMapper, TimePeriod> implements TimePeriodService {
+
+    @Override
+    public void validTimePeriod(TimePeriod timePeriod, boolean update) {
+        Long id = timePeriod.getId();
+        Integer minNumber = timePeriod.getMinNumber();
+        Integer maxNumber = timePeriod.getMaxNumber();
+        String timeSlot = timePeriod.getTimeSlot();
+        Long appointmentDateId = timePeriod.getAppointmentDateId();
+
+        if (update) {
+            if (id == null) {
+                throw new BusinessException(ErrorCode.PARAMS_ERROR, "预约日期id参数错误");
+            }
+        }
+        if (ObjectUtils.anyNull(minNumber, maxNumber, appointmentDateId)) {
+            throw new BusinessException(ErrorCode.PARAMS_ERROR, "存在参数为空");
+        }
+        if (minNumber > maxNumber) {
+            throw new BusinessException(ErrorCode.PARAMS_ERROR, "最小预约人数不能超过最大预约人数");
+        }
+        if (StringUtils.isBlank(timeSlot)) {
+            throw new BusinessException(ErrorCode.PARAMS_ERROR, "时间段参数为空");
+        }
+
+    }
+}
diff --git a/src/main/resources/mapper/AppointmentDateMapper.xml b/src/main/resources/mapper/AppointmentDateMapper.xml
index 9e374b7..b2c696d 100644
--- a/src/main/resources/mapper/AppointmentDateMapper.xml
+++ b/src/main/resources/mapper/AppointmentDateMapper.xml
@@ -3,5 +3,16 @@
         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.cultural.heritage.mapper.AppointmentDateMapper">
+    <select id="queryAppointmentDateDetail" resultType="com.cultural.heritage.model.vo.appointment.AppointmentDateTimePeriodVO">
+        select a.id, a.specificDate, a.isAvailable, a.goodId, t.id timePeriodId, t.timeSlot, t.minNumber, t.maxNumber
+        from appointment_date a, time_period t
+        where a.id = t.appointmentDateId and a.isDelete = 0 and t.isDelete = 0
+    </select>
 
+
+    <select id="queryAppointmentDateDetailById" resultType="com.cultural.heritage.model.vo.appointment.AppointmentDateTimePeriodVO">
+        select a.id, a.specificDate, a.isAvailable, goodId, t.id timePeriodId, t.timeSlot, t.minNumber, t.maxNumber
+        from appointment_date a, time_period t
+        where a.id = t.appointmentDateId and a.isDelete = 0 and t.isDelete = 0 and a.goodId = #{goodId}
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/TimePeriodMapper.xml b/src/main/resources/mapper/TimePeriodMapper.xml
new file mode 100644
index 0000000..bcdef4b
--- /dev/null
+++ b/src/main/resources/mapper/TimePeriodMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.cultural.heritage.mapper.TimePeriodMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/test/java/com/cultural/heritage/test/A.java b/src/test/java/com/cultural/heritage/test/A.java
new file mode 100644
index 0000000..8e8df3d
--- /dev/null
+++ b/src/test/java/com/cultural/heritage/test/A.java
@@ -0,0 +1,6 @@
+package com.cultural.heritage.test;
+
+public class A {
+
+    public Long num = 10L;
+}
diff --git a/src/test/java/com/cultural/heritage/test/B.java b/src/test/java/com/cultural/heritage/test/B.java
new file mode 100644
index 0000000..5907da3
--- /dev/null
+++ b/src/test/java/com/cultural/heritage/test/B.java
@@ -0,0 +1,5 @@
+package com.cultural.heritage.test;
+
+public class B {
+    public Long num = 10L;
+}
diff --git a/src/test/java/com/cultural/heritage/test/Test.java b/src/test/java/com/cultural/heritage/test/Test.java
index ec6b918..b5e0364 100644
--- a/src/test/java/com/cultural/heritage/test/Test.java
+++ b/src/test/java/com/cultural/heritage/test/Test.java
@@ -1,8 +1,5 @@
 package com.cultural.heritage.test;
 
-import cn.hutool.core.date.DateTime;
-import cn.hutool.core.date.DateUtil;
-
 public class Test {
     public static void main(String[] args) {
 //        Date date = new Date();
@@ -29,15 +26,25 @@ public class Test {
 //        Integer quantity = 10;
 //        BigDecimal bigDecimal = BigDecimal.valueOf(quantity);
 //        System.out.println(bigDecimal);
-        DateTime date = DateUtil.date();
-        System.out.println(date);
-        String formatDate = DateUtil.formatDate(date);
-        System.out.println(formatDate);
+//        DateTime date = DateUtil.date();
+//        System.out.println(date);
+//        String formatDate = DateUtil.formatDate(date);
+//        System.out.println(formatDate);
 
 //        String str = "2024-11-21 22:43:33";
 //        DateTime parse = DateUtil.parse(str);
 //        System.out.println(parse);
 
+//        Map<Long, Good> map = new HashMap<>();
+//        System.out.println(map.get(5));
+
+//        List<Long> ids = new ArrayList<>();
+//        Long number = 1L;
+//        ids.add(1L);
+//        System.out.println(ids.get(0) == number);
+
+//        System.out.println(Objects.equals(new A().num, new B().num));
+
 
     }
 }