From c81d766cd91be3b3a24c8db94dcd93c071a66c62 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 14 七月 2023 09:30:19 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/ExchangeDetailsResponse.java    |   31 
 cloud-server-course/src/main/java/com/dsh/course/util/DateTimeHelper.java                                     |   18 
 cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/ProductDetailRequest.java       |   13 
 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/PointDetailsVo.java                    |   45 +
 cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/RecordAppoint.java                |   30 
 cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/PointsMerchandise.java          |    2 
 cloud-server-account/src/main/java/com/dsh/account/service/UserIntegralChangesService.java                    |   10 
 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/CoursePackageConfigClient.java        |   18 
 cloud-server-account/src/main/java/com/dsh/account/service/TStudentService.java                               |   13 
 cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java                      |   42 +
 cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePaymentClient.java                         |    3 
 cloud-server-account/src/main/java/com/dsh/account/service/impl/UserIntegralChangesServiceImpl.java           |   30 
 cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePackageConfigClient.java                   |   18 
 cloud-server-course/src/main/java/com/dsh/course/feignclient/model/RecordAppoint.java                         |   30 
 cloud-server-account/src/main/java/com/dsh/account/controller/UseBenefitsController.java                      |   64 +
 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/MerChandiseClient.java                       |   14 
 cloud-server-account/src/main/java/com/dsh/account/util/JuHeUtil.java                                         |   44 +
 cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java                  |  319 +++++++++
 cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java                            |    4 
 cloud-server-course/src/main/java/com/dsh/course/controller/CourseRecordController.java                       |   38 +
 cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageDiscountService.java                   |    6 
 cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java           |   83 ++
 cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/MerChandiseClient.java                |   13 
 cloud-server-course/src/main/java/com/dsh/course/model/vo/response/ExchangeCoursePackageResponse.java         |   49 +
 cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageController.java                      |   47 +
 cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java               |   27 
 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/ProductDetailsVo.java                  |   58 +
 cloud-server-activity/src/main/resources/mapper/PointsMerchandiseStoreMapper.xml                              |    6 
 cloud-server-activity/src/main/java/com/dsh/activity/mapper/PointsMerchandiseStoreMapper.java                 |   16 
 cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CourseRecordClient.java                 |    4 
 cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackagePaymentService.java                    |    9 
 cloud-server-activity/src/main/java/com/dsh/activity/service/PointsMerchandiseStoreService.java               |   16 
 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/CoursePackagePaymentConfig.java |   31 
 cloud-server-account/src/main/java/com/dsh/account/controller/ExploreWPController.java                        |    3 
 cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PointsMerchandiseStoreServiceImpl.java      |   20 
 cloud-server-course/src/main/java/com/dsh/course/feignclient/CourseRecordClient.java                          |    3 
 cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/ProductDetailsVo.java           |   58 +
 cloud-server-course/src/main/java/com/dsh/course/model/vo/response/WeekLimitedResponse.java                   |   11 
 cloud-server-account/src/main/java/com/dsh/account/controller/ClassDetailsController.java                     |   67 +
 cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandiseStore.java                       |   49 +
 cloud-server-activity/src/main/java/com/dsh/activity/entity/UserPointsMerchandise.java                        |   15 
 cloud-server-account/src/main/java/com/dsh/account/model/vo/classDetails/AppointmentRecordVo.java             |   22 
 cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/PointDetailsVo.java             |   45 +
 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/ExchangeDetailsResponse.java           |   31 
 cloud-server-account/src/main/java/com/dsh/account/util/DateTimeHelper.java                                   |   17 
 cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePaymentClient.java                |    5 
 cloud-server-course/src/main/java/com/dsh/course/util/LocalDateTimeUtils.java                                 |   23 
 cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java                      |    9 
 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/ProductDetailRequest.java              |   13 
 cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageDiscountServiceImpl.java          |  395 ++++++++++-
 cloud-server-account/src/main/java/com/dsh/account/service/TAppUserService.java                               |    2 
 51 files changed, 1,845 insertions(+), 94 deletions(-)

diff --git a/cloud-server-account/src/main/java/com/dsh/account/controller/ClassDetailsController.java b/cloud-server-account/src/main/java/com/dsh/account/controller/ClassDetailsController.java
index d371b09..5079f5f 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/controller/ClassDetailsController.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/controller/ClassDetailsController.java
@@ -4,9 +4,11 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.dsh.account.entity.TStudent;
 import com.dsh.account.feignclient.competition.model.PurchaseRecordVo;
+import com.dsh.account.model.vo.classDetails.AppointmentRecordVo;
 import com.dsh.account.model.vo.classDetails.ClasspaymentRequest;
 import com.dsh.account.model.vo.classDetails.classInsVo.*;
 import com.dsh.account.model.vo.commentDetail.StuCommentsVo;
+import com.dsh.account.model.vo.exploreDetail.LonLatRequest;
 import com.dsh.account.model.vo.medalDetail.GongVo;
 import com.dsh.account.model.vo.medalDetail.StuMedalVo;
 import com.dsh.account.model.vo.sourceDetail.CouponStuAvailableVo;
@@ -64,17 +66,15 @@
     @PostMapping("/api/startCource/queryStudentData")
     @ApiOperation(value = "上课首页", tags = {"APP-开始上课"})
     @ApiImplicitParams({
-            @ApiImplicitParam(value = "经度值", name = "longitude", required = true, dataType = "String"),
-            @ApiImplicitParam(value = "纬度值", name = "latitude", required = true, dataType = "String"),
             @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
     })
-    public ResultUtil<ClassInfoVo> queryCouponRecord(String longitude, String latitude){
+    public ResultUtil<ClassInfoVo> queryCouponRecord(LonLatRequest lonLatRequest){
         try {
             Integer userIdFormRedis = tokenUtil.getUserIdFormRedis();
             if(null == userIdFormRedis){
                 return ResultUtil.tokenErr();
             }
-            return ResultUtil.success(tappuService.queryUserOfStus(userIdFormRedis,longitude,latitude));
+            return ResultUtil.success(tappuService.queryUserOfStus(userIdFormRedis,lonLatRequest.getLongitude(),lonLatRequest.getLatitude()));
         }catch (Exception e){
             e.printStackTrace();
             return ResultUtil.runErr();
@@ -86,7 +86,7 @@
     @PostMapping("/api/startCource/queryPhysical")
     @ApiOperation(value = "获取学员测试报告", tags = {"APP-开始上课"})
     @ApiImplicitParams({
-            @ApiImplicitParam(value = "学员id", name = "id", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "学员id", name = "stuID", required = true, dataType = "int"),
             @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
     })
     public ResultUtil<StuPhysicalVo> getStuPhysicalInfo(Integer stuID){
@@ -117,8 +117,7 @@
             if(null == userIdFormRedis){
                 return ResultUtil.tokenErr();
             }
-            istuService.addStuOfAppUser(stu,userIdFormRedis);
-            return ResultUtil.success();
+            return istuService.addStuOfAppUser(stu,userIdFormRedis);
         }catch (Exception e){
             return ResultUtil.runErr(ResultUtil.ERROR);
         }
@@ -244,7 +243,9 @@
     @PostMapping("/api/startCource/renewal")
     @ApiOperation(value = "课时详情-续课课包详情", tags = {"APP-开始上课"})
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
+            @ApiImplicitParam(value = "课包id", name = "lessonId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "学员id", name = "stuId", required = true, dataType = "int"),
     })
     public ResultUtil<CourseDetailsOfContinuationResp> renewalOfCourses(Integer lessonId, Integer stuId){
         try {
@@ -317,7 +318,7 @@
             @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
             @ApiImplicitParam(value = "学员id", name = "stuId", required = true, dataType = "int"),
     })
-    public ResultUtil<List<StuCommentsVo>> queryStuComment(@RequestParam("stuId") Integer stuId){
+    public ResultUtil<List<StuCommentsVo>> queryStuComment( Integer stuId){
         try {
             return ResultUtil.success(evalstuService.queryStuCommentsList(stuId));
         }catch (Exception e){
@@ -336,7 +337,7 @@
             @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
             @ApiImplicitParam(value = "学员id", name = "stuId", required = true, dataType = "int"),
     })
-    public ResultUtil<List<StuMedalVo>> queryStuMedal(@RequestParam("stuId") Integer stuId){
+    public ResultUtil<List<StuMedalVo>> queryStuMedal( Integer stuId){
         try {
             Integer appUserId = tokenUtil.getUserIdFormRedis();
             if(null == appUserId){
@@ -359,7 +360,7 @@
             @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
             @ApiImplicitParam(value = "学员id", name = "stuId", required = true, dataType = "int"),
     })
-    public ResultUtil<List<GongVo>> queryStuGoog(@RequestParam("stuId") Integer stuId){
+    public ResultUtil<List<GongVo>> queryStuGoog(Integer stuId){
         try {
             Integer appUserId = tokenUtil.getUserIdFormRedis();
             if(null == appUserId){
@@ -371,6 +372,50 @@
         }
     }
 
+    /**
+     * 上课预约记录
+     */
+    @ResponseBody
+    @PostMapping("/api/startCource/stuAppointList")
+    @ApiOperation(value = "上课预约记录", tags = {"APP-开始上课"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
+            @ApiImplicitParam(value = "学员id", name = "stuId", required = true, dataType = "int"),
+    })
+    public ResultUtil<AppointmentRecordVo> cgeClassAppointmentRecordList(Integer stuId){
+        try {
+            Integer appUserId = tokenUtil.getUserIdFormRedis();
+            if(null == appUserId){
+                return ResultUtil.tokenErr();
+            }
+            return ResultUtil.success(istuService.getAppointmentRecords(stuId,appUserId));
+        }catch (Exception e){
+            return ResultUtil.runErr();
+        }
+    }
 
 
+
+    /**
+     * 取消预约
+     */
+    @ResponseBody
+    @PostMapping("/api/startCource/cancelCourse")
+    @ApiOperation(value = "上课预约-取消预约", tags = {"APP-开始上课"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
+            @ApiImplicitParam(value = "上课记录id", name = "courseStuRecordId", required = true, dataType = "int"),
+    })
+    public ResultUtil cancelReservation(Integer courseStuRecordId){
+        try {
+            Integer appUserId = tokenUtil.getUserIdFormRedis();
+            if(null == appUserId){
+                return ResultUtil.tokenErr();
+            }
+            return istuService.cancelReservationOfCourse(courseStuRecordId);
+        }catch (Exception e){
+            return ResultUtil.runErr();
+        }
+    }
+
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/controller/ExploreWPController.java b/cloud-server-account/src/main/java/com/dsh/account/controller/ExploreWPController.java
index b195abe..64fd0c1 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/controller/ExploreWPController.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/controller/ExploreWPController.java
@@ -82,6 +82,9 @@
     @ResponseBody
     @PostMapping("/base/exploreWP/exceptionDetail")
     @ApiOperation(value = "联系客服-常见问题详情", tags = {"APP-探索玩湃"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "问题记录id", name = "quesId", required = true, dataType = "int"),
+    })
     public ResultUtil<QuestionIns> queryQuestionData(Integer quesId){
         try {
             return ResultUtil.success(tsService.queryQuestionDataInfo(quesId));
diff --git a/cloud-server-account/src/main/java/com/dsh/account/controller/UseBenefitsController.java b/cloud-server-account/src/main/java/com/dsh/account/controller/UseBenefitsController.java
index c5fa489..cc1e617 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/controller/UseBenefitsController.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/controller/UseBenefitsController.java
@@ -277,11 +277,31 @@
 
 
     /**
+     * 商品详情
+     */
+    @ResponseBody
+    @PostMapping("/api/useBenefit/goodsDetails")
+    @ApiOperation(value = "积分商城-商品详情", tags = {"APP-使用福利"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
+            @ApiImplicitParam(value = "商品id", name = "goodId", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "商品类型 1实物 2课包 3门票 4优惠券", name = "goodsType", required = true, dataType = "int"),
+    })
+    public ResultUtil<ProductDetailsVo> productDetails(Integer goodId, Integer goodsType){
+        try {
+            return ResultUtil.success(tauService.productDetails(goodId,goodsType));
+        }catch (Exception e){
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
      * 积分明细
      */
     @ResponseBody
     @PostMapping("/api/useBenefit/integralDetails")
-    @ApiOperation(value = "积分明细", tags = {"APP-使用福利"})
+    @ApiOperation(value = "积分商城-积分明细", tags = {"APP-使用福利"})
     @ApiImplicitParams({
             @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
             @ApiImplicitParam(value = "年月", name = "yearMonth", required = true, dataType = "string"),
@@ -300,6 +320,48 @@
     }
 
 
+    /**
+     * 兑换记录
+     */
+    @ResponseBody
+    @PostMapping("/api/useBenefit/exchangeRecords")
+    @ApiOperation(value = "积分商城-兑换记录", tags = {"APP-使用福利"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
+            @ApiImplicitParam(value = "使用状态 (1已使用 2未使用)", name = "useType", required = true, dataType = "string"),
+            @ApiImplicitParam(value = "商品类型  1实物 2课包 3门票 4优惠券", name = "goodType", required = true, dataType = "int"),
+    })
+    public ResultUtil<List<ExchangeDetailsResponse>> exchangeRecordsDetails(Integer useType, Integer goodType){
+        try {
+            Integer userIdFormRedis = tokenUtil.getUserIdFormRedis();
+            if(null == userIdFormRedis){
+                return ResultUtil.tokenErr();
+            }
+            return ResultUtil.success(uicService.queryExchangeGoodsdetails(userIdFormRedis,useType,goodType));
+        }catch (Exception e){
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 兑换记录详情
+     */
+    @ResponseBody
+    @PostMapping("/api/useBenefit/redemptionDetails")
+    @ApiOperation(value = "积分商城-兑换记录详情", tags = {"APP-使用福利"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
+            @ApiImplicitParam(value = "记录id", name = "detailsId", required = true, dataType = "string"),
+    })
+    public ResultUtil<PointDetailsVo> redemptionDetails(Integer detailsId){
+        try {
+            return ResultUtil.success(uicService.queryRedemptionDetails(detailsId));
+        }catch (Exception e){
+            return ResultUtil.runErr();
+        }
+    }
+
 
 
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/MerChandiseClient.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/MerChandiseClient.java
index 7d045a8..ba61917 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/MerChandiseClient.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/MerChandiseClient.java
@@ -4,6 +4,10 @@
 import com.dsh.account.feignclient.activity.model.CommodityRequest;
 import com.dsh.account.feignclient.activity.model.IntegralCommodity;
 import com.dsh.account.feignclient.activity.model.PointsMerchandise;
+import com.dsh.account.feignclient.activity.model.ProductDetailRequest;
+import com.dsh.account.model.vo.userBenefitDetail.ExchangeDetailsResponse;
+import com.dsh.account.model.vo.userBenefitDetail.PointDetailsVo;
+import com.dsh.account.model.vo.userBenefitDetail.ProductDetailsVo;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -23,4 +27,13 @@
     @PostMapping("/base/pointMerchars/getRedeemedNums")
     public int getRedeemedQuantity(@RequestBody Integer goodId);
 
+    @PostMapping("/base/pointMerchars/getGoodDetails")
+    ProductDetailsVo getGoodDetailsWithId(@RequestBody ProductDetailRequest detailRequest);
+
+
+    @PostMapping("/base/pointMerchars/getDetailsOfExchange")
+    List<ExchangeDetailsResponse> getIntegralExchangeDetails(@RequestBody Integer appUserId);
+
+    @PostMapping("/base/pointMerchars/getSpecificsOfGoods")
+    public PointDetailsVo getSpecificsOfGoods(@RequestBody Integer speMercharsId);
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/PointsMerchandise.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/PointsMerchandise.java
index 69d9377..84177d7 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/PointsMerchandise.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/PointsMerchandise.java
@@ -39,7 +39,7 @@
     /**
      * 所属积分
      */
-    private BigDecimal integral;
+    private Integer integral;
     /**
      * 商品封面
      */
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/ProductDetailRequest.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/ProductDetailRequest.java
new file mode 100644
index 0000000..33659e0
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/ProductDetailRequest.java
@@ -0,0 +1,13 @@
+package com.dsh.account.feignclient.activity.model;
+
+
+import lombok.Data;
+
+@Data
+public class ProductDetailRequest {
+
+    Integer goodId;
+
+    Integer goodsType;
+
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePaymentClient.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePaymentClient.java
index 2e0b74f..f960001 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePaymentClient.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePaymentClient.java
@@ -44,7 +44,7 @@
     public boolean delPaymentCoursePackage(@RequestBody Integer payId);
 
     @PostMapping("/base/coursePack/updatePaymentCoursePackage")
-    void updatePaymentCoursePackage(TCoursePackagePayment coursePackagePayment);
+    void updatePaymentCoursePackage(@RequestBody TCoursePackagePayment coursePackagePayment);
 
     @PostMapping("/base/coursePack/savePaymentCoursePackage")
     public boolean savePaymentCoursePackage(@RequestBody TCoursePackagePayment packagePayment);
@@ -52,4 +52,7 @@
     @PostMapping("/base/coursePack/allAmountPayRecordOfUser")
     public List<TCoursePackagePayment> getAmountPayRecord(@RequestBody Integer appUserId);
 
+    @PostMapping("/base/coursePack/obtainStudentClassDetails")
+    List<RecordAppoint> obtainStudentClassDetailsData(@RequestBody Integer stuId);
+
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CourseRecordClient.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CourseRecordClient.java
index 67b286f..41e0c1f 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CourseRecordClient.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CourseRecordClient.java
@@ -11,4 +11,8 @@
     @PostMapping("/base/courseRecord/queryDeduClassHours")
     public Integer getDeductionClassHour(@RequestBody GetStudentCourse course);
 
+    @PostMapping("/base/courseRecord/cancelCourseData")
+    Integer cancelCourseRecordClass(@RequestBody Integer courseRecordId);
+
+
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/RecordAppoint.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/RecordAppoint.java
new file mode 100644
index 0000000..e4c0131
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/RecordAppoint.java
@@ -0,0 +1,30 @@
+package com.dsh.account.feignclient.course.model;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class RecordAppoint {
+
+    @ApiModelProperty(value = "课包id")
+    private Integer coursePackageId;
+
+    @ApiModelProperty(value = "上课记录id")
+    private Long courseStuRecordId;
+
+    @ApiModelProperty(value = "课包名称")
+    private String coursePackageName;
+
+    @ApiModelProperty(value = "课时数")
+    private Integer courseHours;
+
+    @ApiModelProperty(value = "上课时间范围(例如:2021.03.01 8:00-11:00)")
+    private String timeFrame;
+
+    @ApiModelProperty(value = "门店名称+地址")
+    private String storeNameAddr;
+
+    @ApiModelProperty(value = "课状态(1待上课 2已开始 3已完成 4已取消)")
+    private Integer status;
+
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/model/vo/classDetails/AppointmentRecordVo.java b/cloud-server-account/src/main/java/com/dsh/account/model/vo/classDetails/AppointmentRecordVo.java
new file mode 100644
index 0000000..296e9e7
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/model/vo/classDetails/AppointmentRecordVo.java
@@ -0,0 +1,22 @@
+package com.dsh.account.model.vo.classDetails;
+
+
+import com.dsh.account.feignclient.course.model.RecordAppoint;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AppointmentRecordVo {
+
+    @ApiModelProperty(value = "学员id")
+    private Integer stuId;
+
+    @ApiModelProperty(value = "当前学员姓名")
+    private String stuName;
+
+    @ApiModelProperty(value = "记录列表")
+    private List<RecordAppoint> appointList;
+
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/ExchangeDetailsResponse.java b/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/ExchangeDetailsResponse.java
new file mode 100644
index 0000000..21ce630
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/ExchangeDetailsResponse.java
@@ -0,0 +1,31 @@
+package com.dsh.account.model.vo.userBenefitDetail;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ExchangeDetailsResponse {
+
+    @ApiModelProperty(value = "记录id")
+    private Long detailsId;
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodName;
+
+    @ApiModelProperty(value = "支付类型(积分 / 积分+现金)")
+    private String requiredType;
+
+    @ApiModelProperty(value = "有效期开始时间")
+    private String startTime;
+
+    @ApiModelProperty(value = "有效期结束时间")
+    private String endTime;
+
+    @ApiModelProperty(value = "使用状态 (1已使用 2未使用)")
+    private Integer useStatus;
+
+    @ApiModelProperty(value = "商品类型  1实物 2课包 3门票 4优惠券")
+    private Integer goodType;
+
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/PointDetailsVo.java b/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/PointDetailsVo.java
new file mode 100644
index 0000000..237c23d
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/PointDetailsVo.java
@@ -0,0 +1,45 @@
+package com.dsh.account.model.vo.userBenefitDetail;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PointDetailsVo {
+
+    @ApiModelProperty(value = "记录id")
+    private Integer detailsId;
+
+    @ApiModelProperty(value = "图片集")
+    private List<String> pics;
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodName;
+
+    @ApiModelProperty(value = "适用状态(1已使用 2未使用)")
+    private Integer useType;
+
+    @ApiModelProperty(value = "有效期开始时间")
+    private String startTime;
+
+    @ApiModelProperty(value = "有效期结束时间")
+    private String endTime;
+
+    @ApiModelProperty(value = "下单时间")
+    private String orderTime;
+
+    @ApiModelProperty(value = "核销时间")
+    private String writeOffTime;
+
+    @ApiModelProperty(value = "核销门店")
+    private String writeOffName;
+
+    @ApiModelProperty(value = "适用范围(指定门店可用)")
+    private String belongs;
+
+    @ApiModelProperty(value = "兑换说明")
+    private String contents;
+
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/ProductDetailsVo.java b/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/ProductDetailsVo.java
new file mode 100644
index 0000000..52e811f
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/ProductDetailsVo.java
@@ -0,0 +1,58 @@
+package com.dsh.account.model.vo.userBenefitDetail;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class ProductDetailsVo {
+
+    @ApiModelProperty(value = "商品id")
+    private Integer goodId;
+
+    @ApiModelProperty(value = "图片列表")
+    private List<String> pics;
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodName;
+
+    @ApiModelProperty(value = "适用人群")
+    private Integer belongsScope;
+
+    @ApiModelProperty(value = "已兑换数量")
+    private Integer redeemedNum;
+
+    @ApiModelProperty(value = "剩余数量")
+    private Integer residueNum;
+
+    @ApiModelProperty(value = "每人限额")
+    private Integer perLimit;
+
+    @ApiModelProperty(value = "所需类型(积分/积分+现金)")
+    private String requiredType;
+
+    @ApiModelProperty(value = "价值")
+    private BigDecimal cost;
+
+    @ApiModelProperty(value = "课时数")
+    private Integer courseHours;
+
+    @ApiModelProperty(value = "适用范围")
+    private String belongs;
+
+    @ApiModelProperty(value = "有效期开始时间")
+    private String startTime;
+
+    @ApiModelProperty(value = "有效期结束时间")
+    private String endTime;
+
+    @ApiModelProperty(value = "兑换说明")
+    private String contents;
+
+    @ApiModelProperty(value = "商品类型 1实物 2课包 3门票 4优惠券")
+    private Integer goodType;
+
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/TAppUserService.java b/cloud-server-account/src/main/java/com/dsh/account/service/TAppUserService.java
index e63f6f4..b8cf145 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/service/TAppUserService.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/service/TAppUserService.java
@@ -124,4 +124,6 @@
 
     ResultUtil uploadAppUserHeadImg(Integer appUserId, MultipartFile file, HttpServletRequest request);
 
+    ProductDetailsVo productDetails(Integer goodId, Integer goodsType );
+
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/TStudentService.java b/cloud-server-account/src/main/java/com/dsh/account/service/TStudentService.java
index d8cc797..0006542 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/service/TStudentService.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/service/TStudentService.java
@@ -4,6 +4,7 @@
 import com.dsh.account.entity.TStudent;
 import com.dsh.account.feignclient.competition.model.PurchaseRecordVo;
 import com.dsh.account.feignclient.other.model.SysNotice;
+import com.dsh.account.model.vo.classDetails.AppointmentRecordVo;
 import com.dsh.account.model.vo.classDetails.ClasspaymentRequest;
 import com.dsh.account.model.vo.classDetails.classInsVo.ClassDetailsInsVo;
 import com.dsh.account.model.vo.classDetails.classInsVo.StuDetailsReq;
@@ -29,7 +30,7 @@
  */
 public interface TStudentService extends IService<TStudent> {
 
-    void addStuOfAppUser(StuDetailsReq stu,Integer appUserId);
+    ResultUtil addStuOfAppUser(StuDetailsReq stu,Integer appUserId) throws Exception;
 
     ClassDetailsInsVo querySessionDetailsDt(Integer userIdFormRedis, Integer lessonId, Integer stuId);
 
@@ -75,4 +76,14 @@
 
     ResultUtil insertVipPaymentCallback(String outTradeNo, String transactionId);
 
+    /**
+     * 查询学院的上课记录
+     * @param stuId
+     * @param appUserId
+     * @return
+     */
+    AppointmentRecordVo getAppointmentRecords(Integer stuId, Integer appUserId);
+
+    ResultUtil cancelReservationOfCourse( Integer courseStuRecordId);
+
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/UserIntegralChangesService.java b/cloud-server-account/src/main/java/com/dsh/account/service/UserIntegralChangesService.java
index 2d1b48a..b45c68a 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/service/UserIntegralChangesService.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/service/UserIntegralChangesService.java
@@ -3,7 +3,11 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dsh.account.entity.UserIntegralChanges;
 import com.dsh.account.model.SaveUserIntegralChangesVo;
+import com.dsh.account.model.vo.userBenefitDetail.ExchangeDetailsResponse;
 import com.dsh.account.model.vo.userBenefitDetail.IntegralDetailsResponse;
+import com.dsh.account.model.vo.userBenefitDetail.PointDetailsVo;
+
+import java.util.List;
 
 /**
  * <p>
@@ -24,4 +28,10 @@
      * @throws Exception
      */
     void saveUserIntegralChanges(SaveUserIntegralChangesVo vo) throws Exception;
+
+    List<ExchangeDetailsResponse> queryExchangeGoodsdetails(Integer userIdFormRedis, Integer useType, Integer goodType);
+
+
+    PointDetailsVo queryRedemptionDetails(Integer detailsId);
+
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java b/cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java
index cb4076e..5119fd7 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java
@@ -12,6 +12,7 @@
 import com.dsh.account.feignclient.activity.UserConponClient;
 import com.dsh.account.feignclient.activity.model.CommodityRequest;
 import com.dsh.account.feignclient.activity.model.PointsMerchandise;
+import com.dsh.account.feignclient.activity.model.ProductDetailRequest;
 import com.dsh.account.feignclient.competition.DeductionCompetitionsClient;
 import com.dsh.account.feignclient.competition.model.PaymentCompetition;
 import com.dsh.account.feignclient.course.CoursePackageClient;
@@ -739,4 +740,12 @@
         return ResultUtil.success();
     }
 
+    @Override
+    public ProductDetailsVo productDetails(Integer goodId, Integer goodsType ) {
+        ProductDetailRequest detailsVo = new ProductDetailRequest();
+        detailsVo.setGoodsType(goodsType);
+        detailsVo.setGoodId(goodId);
+        return mcClient.getGoodDetailsWithId(detailsVo);
+    }
+
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java b/cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java
index e55dcac..03a738d 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java
@@ -25,6 +25,7 @@
 import com.dsh.account.mapper.CoachMapper;
 import com.dsh.account.mapper.TAppUserMapper;
 import com.dsh.account.mapper.TStudentMapper;
+import com.dsh.account.model.vo.classDetails.AppointmentRecordVo;
 import com.dsh.account.model.vo.classDetails.ClasspaymentRequest;
 import com.dsh.account.model.vo.classDetails.classInsVo.ClassDetailsInsVo;
 import com.dsh.account.model.vo.classDetails.classInsVo.StuDetailsReq;
@@ -106,8 +107,14 @@
 
 
     @Override
-    public void addStuOfAppUser(StuDetailsReq stu,Integer appUserId) {
+    public ResultUtil addStuOfAppUser(StuDetailsReq stu,Integer appUserId) throws Exception {
         TStudent student = new TStudent();
+        if(ToolUtil.isNotEmpty(stu.getName()) && ToolUtil.isNotEmpty(stu.getIdCard())){
+            Boolean aBoolean = JuHeUtil.idcardAuthentication(stu.getIdCard(), stu.getName());
+            if(!aBoolean){
+                return ResultUtil.error("身份证和姓名不匹配");
+            }
+        }
         student.setAppUserId(appUserId);
         student.setName(stu.getName());
         student.setHeadImg(stu.getHeadImg());
@@ -136,6 +143,7 @@
         saveParticipant.setPhone(student.getPhone());
         saveParticipant.setIdcard(student.getIdCard());
         participantClient.saveParticipant(saveParticipant);
+        return ResultUtil.success();
     }
 
     @Override
@@ -555,4 +563,36 @@
         return ResultUtil.success();
     }
 
+    @Override
+    public AppointmentRecordVo getAppointmentRecords(Integer stuId, Integer appUserId) {
+        AppointmentRecordVo recordVo = new AppointmentRecordVo();
+        TStudent tStudent = this.baseMapper.selectOne(new QueryWrapper<TStudent>()
+                .eq("id",stuId )
+                .eq("appUserId",appUserId));
+        if (ToolUtil.isNotEmpty(tStudent)){
+            recordVo.setStuId(tStudent.getId());
+            recordVo.setStuName(tStudent.getName());
+            recordVo.setAppointList(couPayClient.obtainStudentClassDetailsData(stuId));
+        }
+        return recordVo;
+    }
+
+    @Override
+    public ResultUtil cancelReservationOfCourse(Integer courseStuRecordId) {
+        Integer integer = crClient.cancelCourseRecordClass(courseStuRecordId);
+        switch (integer){
+            case 1:
+                ResultUtil.success();
+                break;
+            case 2:
+                ResultUtil.error("开课前三小时不能取消!");
+                break;
+            default:
+                ResultUtil.runErr();
+                break;
+        }
+        return null;
+    }
+
+
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/impl/UserIntegralChangesServiceImpl.java b/cloud-server-account/src/main/java/com/dsh/account/service/impl/UserIntegralChangesServiceImpl.java
index 309550a..e04b185 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/service/impl/UserIntegralChangesServiceImpl.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/service/impl/UserIntegralChangesServiceImpl.java
@@ -4,12 +4,16 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dsh.account.entity.TAppUser;
 import com.dsh.account.entity.UserIntegralChanges;
+import com.dsh.account.feignclient.activity.MerChandiseClient;
 import com.dsh.account.mapper.TAppUserMapper;
 import com.dsh.account.mapper.UserIntegralChangesMapper;
 import com.dsh.account.model.SaveUserIntegralChangesVo;
+import com.dsh.account.model.vo.userBenefitDetail.ExchangeDetailsResponse;
 import com.dsh.account.model.vo.userBenefitDetail.IntegralDetailsResponse;
+import com.dsh.account.model.vo.userBenefitDetail.PointDetailsVo;
 import com.dsh.account.service.UserIntegralChangesService;
 import com.dsh.account.util.DateTimeHelper;
+import com.dsh.account.util.ToolUtil;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
@@ -34,7 +38,10 @@
 
     @Resource
     private TAppUserMapper tauMapper;
-    
+
+    @Resource
+    private MerChandiseClient mcClient;
+
     @Override
     public IntegralDetailsResponse queryUserPointsDetails(String yearMonth, Integer recordId, Integer userIdFormRedis) {
         IntegralDetailsResponse vo = new IntegralDetailsResponse();
@@ -116,4 +123,25 @@
         userIntegralChanges.setInsertTime(new Date());
         this.save(userIntegralChanges);
     }
+
+    @Override
+    public List<ExchangeDetailsResponse> queryExchangeGoodsdetails(Integer userIdFormRedis, Integer useType, Integer goodType) {
+        List<ExchangeDetailsResponse> integralExchangeDetails = mcClient.getIntegralExchangeDetails(userIdFormRedis);
+        if (ToolUtil.isNotEmpty(useType)){
+            integralExchangeDetails = integralExchangeDetails.stream()
+                    .filter(response -> Objects.equals(response.getUseStatus(), useType))
+                    .collect(Collectors.toList());
+        }
+        if (ToolUtil.isNotEmpty(goodType)){
+            integralExchangeDetails = integralExchangeDetails.stream()
+                    .filter(response -> Objects.equals(response.getGoodType(), goodType))
+                    .collect(Collectors.toList());
+        }
+        return integralExchangeDetails;
+    }
+
+    @Override
+    public PointDetailsVo queryRedemptionDetails(Integer detailsId) {
+        return mcClient.getSpecificsOfGoods(detailsId);
+    }
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/util/DateTimeHelper.java b/cloud-server-account/src/main/java/com/dsh/account/util/DateTimeHelper.java
index 03bb3d3..2d7b310 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/util/DateTimeHelper.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/util/DateTimeHelper.java
@@ -1484,6 +1484,23 @@
     }
 
     /**
+     * 获取当前日期是星期几<br>
+     * Obtain the day of the week for the current date.
+     * @param dt
+     * @return 当前日期是星期几
+     */
+    public static int getWeekNumOfDate(Date dt) {
+        Integer[] weekDays = {7, 1, 2, 3, 4, 5, 6}; // 将周一的数值设为2,依次递增表示周二到周日
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(dt);
+        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
+        if (w < 0) {
+            w = 6; // 如果为负数,将其设为6,表示周日
+        }
+        return weekDays[w];
+    }
+
+    /**
      * 获取今天时间 2017-11-20 00:00:00
      */
     public static Date todayDate() {
diff --git a/cloud-server-account/src/main/java/com/dsh/account/util/JuHeUtil.java b/cloud-server-account/src/main/java/com/dsh/account/util/JuHeUtil.java
new file mode 100644
index 0000000..af3b28f
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/util/JuHeUtil.java
@@ -0,0 +1,44 @@
+package com.dsh.account.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.dsh.account.util.httpClinet.HttpClientUtil;
+import com.dsh.account.util.httpClinet.HttpResult;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/11 12:05
+ */
+public class JuHeUtil {
+
+
+    /**
+     * 校验实名认证
+     * @param idcard
+     * @param name
+     * @return
+     * @throws Exception
+     */
+    public static Boolean idcardAuthentication(String idcard, String name) throws Exception{
+        Map<String, Object> params = new HashMap<>();
+        params.put("idcard", idcard);
+        params.put("realname", name);
+        params.put("key", "29fec4bbe3108e4fbf52704e5a906fe0");
+        HttpResult httpResult = HttpClientUtil.pushHttpRequset("POST", "http://op.juhe.cn/idcard/query", params, null, "form");
+        if(httpResult.getCode() != 200){
+            return false;
+        }
+        JSONObject jsonObject = JSON.parseObject(httpResult.getData());
+        Integer error_code = jsonObject.getInteger("error_code");
+        if(0 == error_code){
+            JSONObject result = jsonObject.getJSONObject("result");
+            Integer res = result.getInteger("res");
+            return res == 1 ? true : false;
+        }
+        return false;
+    }
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java
index e326ec9..26c9023 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java
@@ -2,19 +2,26 @@
 
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.dsh.activity.entity.PointsMerchandise;
-import com.dsh.activity.entity.UserPointsMerchandise;
-import com.dsh.activity.feignclient.model.IntegralCommodity;
+import com.dsh.activity.entity.*;
+import com.dsh.activity.feignclient.course.CoursePackageClient;
+import com.dsh.activity.feignclient.course.CoursePackageConfigClient;
+import com.dsh.activity.feignclient.course.model.CoursePackage;
+import com.dsh.activity.feignclient.course.model.CoursePackagePaymentConfig;
+import com.dsh.activity.feignclient.model.*;
+import com.dsh.activity.feignclient.other.StoreClient;
+import com.dsh.activity.feignclient.other.model.StoreDetailOfCourse;
 import com.dsh.activity.model.request.CommodityRequest;
-import com.dsh.activity.service.PointsMerchandiseService;
-import com.dsh.activity.service.UserPointsMerchandiseService;
+import com.dsh.activity.service.*;
 import com.dsh.activity.util.GDMapGeocodingUtil;
+import com.dsh.activity.util.StrUtils;
+import com.dsh.activity.util.ToolUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.text.SimpleDateFormat;
 import java.util.*;
 
 @RestController
@@ -31,6 +38,26 @@
     @Autowired
     private UserPointsMerchandiseService upmseService;
 
+    @Autowired
+    private ICouponService iCouponService;
+
+    @Autowired
+    private CoursePackageClient cpClient;
+
+    @Autowired
+    private StoreClient stoClient;
+
+    @Autowired
+    private CoursePackageConfigClient cpcfigClient;
+
+    @Autowired
+    private PointsMerchandiseStoreService pmdstoService;
+
+    @Autowired
+    private UserCouponService uconService;
+
+    @Autowired
+    private CouponStoreService cstoreService;
 
 
     @PostMapping("/base/pointMerchars/convertGoods")
@@ -85,4 +112,286 @@
                 .eq("pointsMerchandiseId",goodId));
     }
 
+
+    @PostMapping("/base/pointMerchars/getGoodDetails")
+    public ProductDetailsVo getGoodDetailsWithId(@RequestBody ProductDetailRequest detailRequest){
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        ProductDetailsVo detailsVo = new ProductDetailsVo();
+        PointsMerchandise merchandise = pmdsService.getById(detailRequest.getGoodId());
+        switch (detailRequest.getGoodsType()){
+            case 2:
+//                课包
+                CoursePackage coursePackage = cpClient.queryCoursePackageById(detailRequest.getGoodId());
+
+                detailsVo.setGoodId(coursePackage.getId());
+                List<String> list1 = Arrays.asList(StrUtils.splitStr2StrArr(coursePackage.getDetailDrawing(), ","));
+                list1.add(coursePackage.getCoverDrawing());
+                detailsVo.setPics(list1);
+                Collections.sort(detailsVo.getPics(), (s1, s2) -> {
+                    if (s1.equals(coursePackage.getCoverDrawing())) {
+                        return -1; // s1排在前面
+                    } else if (s2.equals(coursePackage.getCoverDrawing())) {
+                        return 1; // s2排在前面
+                    } else {
+                        return 0; // 保持原顺序
+                    }
+                });
+                detailsVo.setGoodName(coursePackage.getName());
+                detailsVo.setBelongsScope(merchandise.getUserPopulation());
+                int coursePackageNums = upmseService.count(new QueryWrapper<UserPointsMerchandise>()
+                        .eq("pointsMerchandiseId",merchandise.getId() ));
+                detailsVo.setRedeemedNum(coursePackageNums);
+                detailsVo.setResidueNum(merchandise.getQuantityIssued() - coursePackageNums);
+                detailsVo.setPerLimit(merchandise.getPickUpQuantity());
+                if (merchandise.getRedemptionMethod() == 1){
+                    detailsVo.setRequiredType(merchandise.getIntegral() + "积分");
+                }else {
+                    detailsVo.setRequiredType(merchandise.getIntegral() + "积分+¥"+merchandise.getCash());
+                }
+                detailsVo.setCost(merchandise.getPrice());
+                if (merchandise.getUseScope() == 1){
+                    detailsVo.setBelongs("全国通用");
+                }else if (merchandise.getUseScope() == 2){
+                    detailsVo.setBelongs(merchandise.getProvince()+"|"+merchandise.getCity() + "用户可用");
+                }else {
+                    List<PointsMerchandiseStore> list = pmdstoService.list(new QueryWrapper<PointsMerchandiseStore>()
+                            .eq("pointsMerchandiseId",merchandise.getId() ));
+                    PointsMerchandiseStore pointsMerchandiseStore = list.get(0);
+                    StoreDetailOfCourse courseOfStore = stoClient.getCourseOfStore(pointsMerchandiseStore.getStoreId());
+                    detailsVo.setBelongs(courseOfStore.getStoreName()+"可用");
+                }
+                List<CoursePackagePaymentConfig> courseConfigList = cpcfigClient.getCourseConfigList(coursePackage.getId());
+                int redul = 0;
+
+                for (CoursePackagePaymentConfig coursePackagePaymentConfig : courseConfigList) {
+                    redul = redul + coursePackagePaymentConfig.getClassHours();
+                }
+                detailsVo.setCourseHours(redul);
+                detailsVo.setStartTime(format.format(merchandise.getStartTime()));
+                detailsVo.setEndTime(format.format(merchandise.getEndTime()));
+
+                detailsVo.setContents(merchandise.getRedemptionInstructions());
+                detailsVo.setGoodType(merchandise.getType());
+
+                break;
+            case 1:
+            case 3:
+
+                detailsVo.setGoodId(merchandise.getId());
+                List<String> list2 = Arrays.asList(StrUtils.splitStr2StrArr(merchandise.getProductImages(), ","));
+                list2.add(merchandise.getCover());
+                detailsVo.setPics(list2);
+                Collections.sort(detailsVo.getPics(), (s1, s2) -> {
+                    if (s1.equals(merchandise.getCover())) {
+                        return -1; // s1排在前面
+                    } else if (s2.equals(merchandise.getCover())) {
+                        return 1; // s2排在前面
+                    } else {
+                        return 0; // 保持原顺序
+                    }
+                });
+                detailsVo.setPics(list2);
+                detailsVo.setGoodName(merchandise.getName());
+                detailsVo.setBelongsScope(merchandise.getUserPopulation());
+                int count = upmseService.count(new QueryWrapper<UserPointsMerchandise>()
+                        .eq("pointsMerchandiseId",merchandise.getId() ));
+                detailsVo.setRedeemedNum(count);
+                detailsVo.setResidueNum(merchandise.getQuantityIssued()-count);
+                detailsVo.setPerLimit(merchandise.getPickUpQuantity());
+                if (merchandise.getRedemptionMethod() == 1){
+                    detailsVo.setRequiredType(merchandise.getIntegral() + "积分");
+                }else {
+                    detailsVo.setRequiredType(merchandise.getIntegral() + "积分+¥"+merchandise.getCash());
+                }
+                detailsVo.setCost(merchandise.getPrice());
+                if (merchandise.getUseScope() == 1){
+                    detailsVo.setBelongs("全国通用");
+                }else if (merchandise.getUseScope() == 2){
+                    detailsVo.setBelongs(merchandise.getProvince()+"|"+merchandise.getCity() + "用户可用");
+                }else {
+                    List<PointsMerchandiseStore> list = pmdstoService.list(new QueryWrapper<PointsMerchandiseStore>()
+                            .eq("pointsMerchandiseId",merchandise.getId() ));
+                    PointsMerchandiseStore pointsMerchandiseStore = list.get(0);
+                    StoreDetailOfCourse courseOfStore = stoClient.getCourseOfStore(pointsMerchandiseStore.getStoreId());
+                    detailsVo.setBelongs(courseOfStore.getStoreName()+"可用");
+                }
+
+                detailsVo.setStartTime(format.format(merchandise.getStartTime()));
+                detailsVo.setEndTime(format.format(merchandise.getEndTime()));
+
+                detailsVo.setContents(merchandise.getRedemptionInstructions());
+                detailsVo.setGoodType(merchandise.getType());
+                break;
+            case 4:
+//                优惠券
+                Coupon coupon = iCouponService.getById(detailRequest.getGoodId());
+                detailsVo.setGoodId(coupon.getId());
+                List<String> list3 = Arrays.asList(StrUtils.splitStr2StrArr(coupon.getProductImages(), ","));
+                list3.add(coupon.getCover());
+                detailsVo.setPics(list3);
+                Collections.sort(detailsVo.getPics(), (s1, s2) -> {
+                    if (s1.equals(coupon.getCover())) {
+                        return -1; // s1排在前面
+                    } else if (s2.equals(coupon.getCover())) {
+                        return 1; // s2排在前面
+                    } else {
+                        return 0; // 保持原顺序
+                    }
+                });
+                detailsVo.setGoodName(coupon.getName());
+                detailsVo.setBelongsScope(coupon.getUserPopulation());
+                int couponNums = uconService.count(new QueryWrapper<UserCoupon>()
+                        .eq("couponId",coupon.getId() ));
+                detailsVo.setRedeemedNum(couponNums);
+                detailsVo.setResidueNum(coupon.getQuantityIssued()-couponNums);
+                detailsVo.setPerLimit(coupon.getPickUpQuantity());
+                if (merchandise.getRedemptionMethod() == 1){
+                    detailsVo.setRequiredType(merchandise.getIntegral() + "积分");
+                }else {
+                    detailsVo.setRequiredType(merchandise.getIntegral() + "积分+¥"+merchandise.getCash());
+                }
+                if (coupon.getUseScope() == 1){
+                    detailsVo.setBelongs("全国通用");
+                }else if (coupon.getUseScope() == 2){
+                    detailsVo.setBelongs(coupon.getProvince()+"|"+coupon.getCity() + "用户可用");
+                }else {
+                    List<CouponStore> list = cstoreService.list(new QueryWrapper<CouponStore>()
+                            .eq("couponId",coupon.getId() ));
+                    StoreDetailOfCourse courseOfStore = stoClient.getCourseOfStore(list.get(0).getStoreId());
+                    detailsVo.setBelongs(courseOfStore.getStoreName()+"可用");
+                }
+                detailsVo.setStartTime(format.format(merchandise.getStartTime()));
+                detailsVo.setEndTime(format.format(merchandise.getEndTime()));
+
+                detailsVo.setContents(coupon.getIllustrate());
+                detailsVo.setGoodType(4);
+                break;
+            default:
+                break;
+        }
+        return detailsVo;
+    }
+
+
+
+    @PostMapping("/base/pointMerchars/getDetailsOfExchange")
+    public List<ExchangeDetailsResponse> getIntegralExchangeDetails(@RequestBody Integer appUserId){
+        List<ExchangeDetailsResponse> responses = new ArrayList<>();
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        List<UserPointsMerchandise> pointsMerchandises = upmseService.list(new QueryWrapper<UserPointsMerchandise>()
+                .eq("userId",appUserId ));
+        if (pointsMerchandises.size() > 0 ){
+            for (UserPointsMerchandise pointsMerchandise : pointsMerchandises) {
+                PointsMerchandise merchandise = pmdsService.getById(pointsMerchandise.getPointsMerchandiseId());
+                ExchangeDetailsResponse detailsResponse = new ExchangeDetailsResponse();
+                detailsResponse.setDetailsId(pointsMerchandise.getId());
+                detailsResponse.setGoodName(merchandise.getName());
+                if (merchandise.getRedemptionMethod() == 1){
+                    detailsResponse.setRequiredType(merchandise.getIntegral()+"积分");
+                }else {
+                    detailsResponse.setRequiredType(merchandise.getIntegral()+"积分 ¥"+merchandise.getCash());
+                }
+                detailsResponse.setStartTime(simpleDateFormat.format(merchandise.getStartTime()));
+                detailsResponse.setEndTime(simpleDateFormat.format(merchandise.getEndTime()));
+                detailsResponse.setUseStatus(pointsMerchandise.getStatus());
+                detailsResponse.setGoodType(merchandise.getType());
+                responses.add(detailsResponse);
+            }
+        }
+        return responses;
+    }
+
+
+
+    @PostMapping("/base/pointMerchars/getSpecificsOfGoods")
+    public PointDetailsVo getSpecificsOfGoods(@RequestBody Integer speMercharsId){
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        PointDetailsVo detailsVo = new PointDetailsVo();
+        UserPointsMerchandise byId = upmseService.getById(speMercharsId);
+        if (ToolUtil.isNotEmpty(byId)){
+            PointsMerchandise pmdsServiceById = pmdsService.getById(byId.getPointsMerchandiseId());
+            detailsVo.setDetailsId(byId.getId());
+            switch (pmdsServiceById.getType()){
+                case 1:
+                case 3:
+                    List<String> list2 = Arrays.asList(StrUtils.splitStr2StrArr(pmdsServiceById.getProductImages(), ","));
+                    list2.add(pmdsServiceById.getCover());
+                    detailsVo.setPics(list2);
+                    Collections.sort(detailsVo.getPics(), (s1, s2) -> {
+                        if (s1.equals(pmdsServiceById.getCover())) {
+                            return -1; // s1排在前面
+                        } else if (s2.equals(pmdsServiceById.getCover())) {
+                            return 1; // s2排在前面
+                        } else {
+                            return 0; // 保持原顺序
+                        }
+                    });
+                    break;
+                case 2:
+                    CoursePackage coursePackage = cpClient.queryCoursePackageById(pmdsServiceById.getCoursePackageId());
+                    List<String> list1 = Arrays.asList(StrUtils.splitStr2StrArr(coursePackage.getDetailDrawing(), ","));
+                    list1.add(coursePackage.getCoverDrawing());
+                    detailsVo.setPics(list1);
+                    Collections.sort(detailsVo.getPics(), (s1, s2) -> {
+                        if (s1.equals(coursePackage.getCoverDrawing())) {
+                            return -1; // s1排在前面
+                        } else if (s2.equals(coursePackage.getCoverDrawing())) {
+                            return 1; // s2排在前面
+                        } else {
+                            return 0; // 保持原顺序
+                        }
+                    });
+                    break;
+                case 4:
+                    Coupon coupon = iCouponService.getById(pmdsServiceById.getId());
+                    List<String> list3 = Arrays.asList(StrUtils.splitStr2StrArr(coupon.getProductImages(), ","));
+                    list3.add(coupon.getCover());
+                    detailsVo.setPics(list3);
+                    Collections.sort(detailsVo.getPics(), (s1, s2) -> {
+                        if (s1.equals(coupon.getCover())) {
+                            return -1; // s1排在前面
+                        } else if (s2.equals(coupon.getCover())) {
+                            return 1; // s2排在前面
+                        } else {
+                            return 0; // 保持原顺序
+                        }
+                    });
+                    break;
+                default:
+                    break;
+            }
+
+            detailsVo.setGoodName(pmdsServiceById.getName());
+            detailsVo.setStartTime(simpleDateFormat.format(pmdsServiceById.getStartTime()));
+            detailsVo.setEndTime(simpleDateFormat.format(pmdsServiceById.getEndTime()));
+            detailsVo.setOrderTime(simpleDateFormat.format(byId.getInsertTime()));
+            if (byId.getStatus() == 1){
+                detailsVo.setUseType(2);
+            }else {
+                detailsVo.setUseType(1);
+                detailsVo.setWriteOffTime(simpleDateFormat.format(byId.getVerificationTime()));
+                StoreDetailOfCourse courseOfStore = stoClient.getCourseOfStore(byId.getVerifiStoreId());
+                detailsVo.setWriteOffName(courseOfStore.getStoreName());
+            }
+            switch (pmdsServiceById.getUseScope()){
+                case 1:
+                    detailsVo.setBelongs("全国通用");
+                    break;
+                case 2:
+                    detailsVo.setBelongs(pmdsServiceById.getProvince()+pmdsServiceById.getCity());
+                    break;
+                case 3:
+                    PointsMerchandiseStore one = pmdstoService.getOne(new QueryWrapper<PointsMerchandiseStore>()
+                            .eq("pointsMerchandiseId",pmdsServiceById.getId() ));
+                    StoreDetailOfCourse courseOfStore = stoClient.getCourseOfStore(one.getStoreId());
+                    detailsVo.setBelongs(courseOfStore.getStoreName()+" "+courseOfStore.getStoreAddr());
+                    break;
+                default:
+                    break;
+            }
+            detailsVo.setContents(pmdsServiceById.getRedemptionInstructions());
+        }
+        return detailsVo;
+    }
+
 }
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java
index 989c500..c5b362d 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java
@@ -35,7 +35,7 @@
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
     /**
-     * 类型(1=实体商品,2=课包商品,3=门票商品)
+     * 类型(1=实体商品,2=课包商品,3=门票商品 4=优惠券)
      */
     @TableField("type")
     private Integer type;
@@ -68,7 +68,7 @@
      * 所属积分
      */
     @TableField("integral")
-    private BigDecimal integral;
+    private Integer integral;
     /**
      * 商品封面
      */
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandiseStore.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandiseStore.java
new file mode 100644
index 0000000..8d8e480
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandiseStore.java
@@ -0,0 +1,49 @@
+package com.dsh.activity.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 积分商品使用门店关系数据
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-07-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("t_points_merchandise_store")
+public class PointsMerchandiseStore extends Model<PointsMerchandiseStore> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 积分商品id
+     */
+    private Integer pointsMerchandiseId;
+    /**
+     * 门店id
+     */
+    private Integer storeId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserPointsMerchandise.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserPointsMerchandise.java
index 22f0842..81c510f 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserPointsMerchandise.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserPointsMerchandise.java
@@ -44,21 +44,26 @@
     @TableField("userId")
     private Integer userId;
     /**
-     * 状态(1=待核销,2=已核销)
-     */
-    @TableField("status")
-    private Integer status;
-    /**
      * 核销人员id
      */
     @TableField("verificationUserId")
     private Integer verificationUserId;
     /**
+     * 核销门店id
+     */
+    @TableField("verifiStoreId")
+    private Integer verifiStoreId;
+    /**
      * 核销时间
      */
     @TableField("verificationTime")
     private Date verificationTime;
     /**
+     * 状态(1=待核销,2=已核销)
+     */
+    @TableField("status")
+    private Integer status;
+    /**
      * 领取时间
      */
     @TableField("insertTime")
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/MerChandiseClient.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/MerChandiseClient.java
index fe612bd..d6937db 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/MerChandiseClient.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/MerChandiseClient.java
@@ -2,7 +2,7 @@
 
 
 import com.dsh.activity.entity.PointsMerchandise;
-import com.dsh.activity.feignclient.model.IntegralCommodity;
+import com.dsh.activity.feignclient.model.*;
 import com.dsh.activity.model.request.CommodityRequest;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -22,4 +22,16 @@
     @PostMapping("/base/pointMerchars/getRedeemedNums")
     public int getRedeemedQuantity(@RequestBody Integer goodId);
 
+
+    @PostMapping("/base/pointMerchars/getGoodDetails")
+    ProductDetailsVo getGoodDetailsWithId(@RequestBody ProductDetailRequest detailRequest);
+
+    @PostMapping("/base/pointMerchars/getDetailsOfExchange")
+    List<ExchangeDetailsResponse> getIntegralExchangeDetails(@RequestBody Integer appUserId);
+
+
+    @PostMapping("/base/pointMerchars/getSpecificsOfGoods")
+    public PointDetailsVo getSpecificsOfGoods(@RequestBody Integer speMercharsId);
+
+
 }
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/CoursePackageConfigClient.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/CoursePackageConfigClient.java
new file mode 100644
index 0000000..645a366
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/CoursePackageConfigClient.java
@@ -0,0 +1,18 @@
+package com.dsh.activity.feignclient.course;
+
+
+import com.dsh.activity.feignclient.course.model.CoursePackagePaymentConfig;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+
+@FeignClient(value = "mb-cloud-course")
+public interface CoursePackageConfigClient {
+
+    @PostMapping("/base/coursePack/getCoursePackageConfig")
+    List<CoursePackagePaymentConfig> getCourseConfigList(@RequestBody Integer coursePackageId);
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/CoursePackagePaymentConfig.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/CoursePackagePaymentConfig.java
new file mode 100644
index 0000000..99ed0bd
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/CoursePackagePaymentConfig.java
@@ -0,0 +1,31 @@
+package com.dsh.activity.feignclient.course.model;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/6/29 10:42
+ */
+@Data
+public class CoursePackagePaymentConfig {
+    /**
+     * 主键
+     */
+    private Integer id;
+    /**
+     * 课包id
+     */
+    private Integer coursePackageId;
+    /**
+     * 课时数
+     */
+    private Integer classHours;
+    /**
+     * 现金支付价格
+     */
+    private Double cashPayment;
+    /**
+     * 玩湃币价格
+     */
+    private Integer playPaiCoin;
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/ExchangeDetailsResponse.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/ExchangeDetailsResponse.java
new file mode 100644
index 0000000..2588782
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/ExchangeDetailsResponse.java
@@ -0,0 +1,31 @@
+package com.dsh.activity.feignclient.model;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ExchangeDetailsResponse {
+
+    @ApiModelProperty(value = "记录id")
+    private Long detailsId;
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodName;
+
+    @ApiModelProperty(value = "支付类型(积分 / 积分+现金)")
+    private String requiredType;
+
+    @ApiModelProperty(value = "有效期开始时间")
+    private String startTime;
+
+    @ApiModelProperty(value = "有效期结束时间")
+    private String endTime;
+
+    @ApiModelProperty(value = "使用状态 (1已使用 2未使用)")
+    private Integer useStatus;
+
+    @ApiModelProperty(value = "商品类型  1实物 2课包 3门票 4优惠券")
+    private Integer goodType;
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/PointDetailsVo.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/PointDetailsVo.java
new file mode 100644
index 0000000..8bf0fac
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/PointDetailsVo.java
@@ -0,0 +1,45 @@
+package com.dsh.activity.feignclient.model;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PointDetailsVo {
+
+    @ApiModelProperty(value = "记录id")
+    private Long detailsId;
+
+    @ApiModelProperty(value = "图片集")
+    private List<String> pics;
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodName;
+
+    @ApiModelProperty(value = "适用状态(1已使用 2未使用)")
+    private Integer useType;
+
+    @ApiModelProperty(value = "有效期开始时间")
+    private String startTime;
+
+    @ApiModelProperty(value = "有效期结束时间")
+    private String endTime;
+
+    @ApiModelProperty(value = "下单时间")
+    private String orderTime;
+
+    @ApiModelProperty(value = "核销时间")
+    private String writeOffTime;
+
+    @ApiModelProperty(value = "核销门店")
+    private String writeOffName;
+
+    @ApiModelProperty(value = "适用范围(指定门店可用)")
+    private String belongs;
+
+    @ApiModelProperty(value = "兑换说明")
+    private String contents;
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/ProductDetailRequest.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/ProductDetailRequest.java
new file mode 100644
index 0000000..a1bc3ea
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/ProductDetailRequest.java
@@ -0,0 +1,13 @@
+package com.dsh.activity.feignclient.model;
+
+
+import lombok.Data;
+
+@Data
+public class ProductDetailRequest {
+
+    Integer goodId;
+
+    Integer goodsType;
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/ProductDetailsVo.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/ProductDetailsVo.java
new file mode 100644
index 0000000..db38c2a
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/ProductDetailsVo.java
@@ -0,0 +1,58 @@
+package com.dsh.activity.feignclient.model;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class ProductDetailsVo {
+
+    @ApiModelProperty(value = "商品id")
+    private Integer goodId;
+
+    @ApiModelProperty(value = "图片列表")
+    private List<String> pics;
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodName;
+
+    @ApiModelProperty(value = "适用人群")
+    private Integer belongsScope;
+
+    @ApiModelProperty(value = "已兑换数量")
+    private Integer redeemedNum;
+
+    @ApiModelProperty(value = "剩余数量")
+    private Integer residueNum;
+
+    @ApiModelProperty(value = "每人限额")
+    private Integer perLimit;
+
+    @ApiModelProperty(value = "所需类型(积分/积分+现金)")
+    private String requiredType;
+
+    @ApiModelProperty(value = "价值")
+    private BigDecimal cost;
+
+    @ApiModelProperty(value = "课时数")
+    private Integer courseHours;
+
+    @ApiModelProperty(value = "适用范围")
+    private String belongs;
+
+    @ApiModelProperty(value = "有效期开始时间")
+    private String startTime;
+
+    @ApiModelProperty(value = "有效期结束时间")
+    private String endTime;
+
+    @ApiModelProperty(value = "兑换说明")
+    private String contents;
+
+    @ApiModelProperty(value = "商品类型 1实物 2课包 3门票 4优惠券")
+    private Integer goodType;
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/mapper/PointsMerchandiseStoreMapper.java b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/PointsMerchandiseStoreMapper.java
new file mode 100644
index 0000000..93b1594
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/PointsMerchandiseStoreMapper.java
@@ -0,0 +1,16 @@
+package com.dsh.activity.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dsh.activity.entity.PointsMerchandiseStore;
+
+/**
+ * <p>
+ * 积分商品使用门店关系数据 Mapper 接口
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-07-12
+ */
+public interface PointsMerchandiseStoreMapper extends BaseMapper<PointsMerchandiseStore> {
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/PointsMerchandiseStoreService.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/PointsMerchandiseStoreService.java
new file mode 100644
index 0000000..6adb70d
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/PointsMerchandiseStoreService.java
@@ -0,0 +1,16 @@
+package com.dsh.activity.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dsh.activity.entity.PointsMerchandiseStore;
+
+/**
+ * <p>
+ * 积分商品使用门店关系数据 服务类
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-07-12
+ */
+public interface PointsMerchandiseStoreService extends IService<PointsMerchandiseStore> {
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PointsMerchandiseStoreServiceImpl.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PointsMerchandiseStoreServiceImpl.java
new file mode 100644
index 0000000..fa13f02
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PointsMerchandiseStoreServiceImpl.java
@@ -0,0 +1,20 @@
+package com.dsh.activity.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dsh.activity.entity.PointsMerchandiseStore;
+import com.dsh.activity.mapper.PointsMerchandiseStoreMapper;
+import com.dsh.activity.service.PointsMerchandiseStoreService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 积分商品使用门店关系数据 服务实现类
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-07-12
+ */
+@Service
+public class PointsMerchandiseStoreServiceImpl extends ServiceImpl<PointsMerchandiseStoreMapper, PointsMerchandiseStore> implements PointsMerchandiseStoreService {
+
+}
diff --git a/cloud-server-activity/src/main/resources/mapper/PointsMerchandiseStoreMapper.xml b/cloud-server-activity/src/main/resources/mapper/PointsMerchandiseStoreMapper.xml
new file mode 100644
index 0000000..f198ce1
--- /dev/null
+++ b/cloud-server-activity/src/main/resources/mapper/PointsMerchandiseStoreMapper.xml
@@ -0,0 +1,6 @@
+<?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.dsh.activity.mapper.PointsMerchandiseStoreMapper">
+
+
+</mapper>
diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageController.java
index 2159d03..ad053e0 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageController.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageController.java
@@ -1,6 +1,7 @@
 package com.dsh.course.controller;
 
 import com.dsh.course.entity.TCoursePackage;
+import com.dsh.course.model.vo.response.ExchangeCoursePackageResponse;
 import com.dsh.course.model.vo.response.WeekLimitedResponse;
 import com.dsh.course.service.TCoursePackageDiscountService;
 import com.dsh.course.service.TCoursePackageService;
@@ -72,4 +73,50 @@
         }
     }
 
+
+    /**
+     * 折扣课包详情
+     */
+    @ResponseBody
+    @PostMapping("/api/useBenefit/discountCourseDatas")
+    @ApiOperation(value = "本周福利-折扣课包详情", tags = {"APP-使用福利"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
+            @ApiImplicitParam(name = "coursePackageDiscountId",value = "限时折扣配置id/赠送课时配置id",dataType = "int"),
+            @ApiImplicitParam(name = "lon",value = "经度",dataType = "String"),
+            @ApiImplicitParam(name = "lat",value = "纬度",dataType = "String"),
+    })
+    public ResultUtil<ExchangeCoursePackageResponse> discountCourseDatas(Integer coursePackageDiscountId,String lon,String lat){
+        try {
+            return ResultUtil.success(tcpdService.getWeekFreeCourseDetails(coursePackageDiscountId,lat,lon));
+        }catch (Exception e){
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 折扣课包支付
+     */
+    @ResponseBody
+    @PostMapping("/api/useBenefit/paymentOfDiscountCoursePack")
+    @ApiOperation(value = "本周福利-折扣课包支付", tags = {"APP-使用福利"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
+            @ApiImplicitParam(name = "coursePackageDiscountId",value = "限时折扣配置id/赠送课时配置id",dataType = "int"),
+            @ApiImplicitParam(name = "lon",value = "经度",dataType = "String"),
+            @ApiImplicitParam(name = "lat",value = "纬度",dataType = "String"),
+    })
+    public ResultUtil paymentWeeksFreeCourse(Integer coursePackageDiscountId){
+        try {
+            Integer appuserId = tokenUtil.getUserIdFormRedis();
+            if(null == appuserId){
+                return ResultUtil.tokenErr();
+            }
+            return tcpdService.paymentDiscountCoursePack(coursePackageDiscountId,appuserId);
+        }catch (Exception e){
+            return ResultUtil.runErr();
+        }
+    }
+
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java
index 574528c..b9be5bb 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java
@@ -53,14 +53,6 @@
     @Autowired
     private TCoursePackageDiscountService tcpdService;
 
-    @Autowired
-    private PostCourseVideoService pcvService;
-
-    @Autowired
-    private CoursePackageStudentService cpsService;
-
-    @Autowired
-    private CancelledClassesService cacService;
 
     @Autowired
     private ICoursePackagePaymentConfigService icppcService;
@@ -689,4 +681,23 @@
         return packagePaymentService.save(packagePayment);
     }
 
+
+    @PostMapping("/base/coursePack/obtainStudentClassDetails")
+    public List<RecordAppoint> obtainStudentClassDetailsData(@RequestBody Integer stuId){
+        try {
+            Integer appUserId = tokenUtil.getUserIdFormRedis();
+            return packagePaymentService.obtainStuClassDetails(stuId,appUserId);
+        }catch (Exception e){
+            e.printStackTrace();
+            throw new RuntimeException();
+        }
+    }
+
+
+    @PostMapping("/base/coursePack/getCoursePackageConfig")
+    public List<CoursePackagePaymentConfig> getCourseConfigList(@RequestBody Integer coursePackageId){
+        return icppcService.list(new QueryWrapper<CoursePackagePaymentConfig>()
+                .eq("coursePackageId",coursePackageId));
+    }
+
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CourseRecordController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CourseRecordController.java
index 81e2384..db47c6d 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/controller/CourseRecordController.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CourseRecordController.java
@@ -9,10 +9,17 @@
 import com.dsh.course.service.CancelledClassesService;
 import com.dsh.course.service.CoursePackageStudentService;
 import com.dsh.course.service.TCoursePackageService;
+import com.dsh.course.util.ToolUtil;
 import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
+import java.util.Date;
 import java.util.List;
 
 @Api
@@ -57,4 +64,35 @@
         return sult;
     }
 
+
+    @PostMapping("/base/courseRecord/cancelCourseData")
+    public Integer cancelCourseRecordClass(@RequestBody Integer courseRecordId){
+        int sult = 0;
+        CoursePackageStudent packageStudent = cosService.getById(courseRecordId);
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd");
+        SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
+        String tis = simpleDateFormat.format(new Date());
+
+        if (ToolUtil.isNotEmpty(packageStudent)){
+            TCoursePackage coursePackage = tcpService.getById(packageStudent.getCoursePackageId());
+            String startTime = tis +" " + coursePackage.getClassStartTime();
+            Date parse = null;
+            try {
+                parse = format.parse(startTime);
+            } catch (ParseException e) {
+                throw new RuntimeException(e);
+            }
+            LocalDateTime localDateTime = parse.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+            // 计算时间间隔
+            long hours = ChronoUnit.HOURS.between(LocalDateTime.now(), localDateTime);
+            // 判断是否在前三小时内
+            if (hours <= 3 && hours >= 0){
+                sult = 1;
+            }else {
+                sult = 2;
+            }
+        }
+        return sult;
+    }
+
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePackageConfigClient.java b/cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePackageConfigClient.java
new file mode 100644
index 0000000..fc9f11f
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePackageConfigClient.java
@@ -0,0 +1,18 @@
+package com.dsh.course.feignclient;
+
+
+import com.dsh.course.entity.CoursePackagePaymentConfig;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+
+@FeignClient(value = "mb-cloud-course")
+public interface CoursePackageConfigClient {
+
+    @PostMapping("/base/coursePack/getCoursePackageConfig")
+    List<CoursePackagePaymentConfig> getCourseConfigList(@RequestBody Integer coursePackageId);
+
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePaymentClient.java b/cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePaymentClient.java
index d081599..4798270 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePaymentClient.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePaymentClient.java
@@ -58,4 +58,7 @@
     @PostMapping("/base/coursePack/allAmountPayRecordOfUser")
     public List<TCoursePackagePayment> getAmountPayRecord(@RequestBody Integer appUserId);
 
+    @PostMapping("/base/coursePack/obtainStudentClassDetails")
+    List<RecordAppoint> obtainStudentClassDetailsData(@RequestBody Integer stuId);
+
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/feignclient/CourseRecordClient.java b/cloud-server-course/src/main/java/com/dsh/course/feignclient/CourseRecordClient.java
index e553ce5..4d3be7a 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/feignclient/CourseRecordClient.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/feignclient/CourseRecordClient.java
@@ -11,4 +11,7 @@
     @PostMapping("/base/courseRecord/queryDeduClassHours")
     public Integer getDeductionClassHour(@RequestBody GetStudentCourse course);
 
+    @PostMapping("/base/courseRecord/cancelCourseData")
+    Integer cancelCourseRecordClass(@RequestBody Integer courseRecordId);
+
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/feignclient/model/RecordAppoint.java b/cloud-server-course/src/main/java/com/dsh/course/feignclient/model/RecordAppoint.java
new file mode 100644
index 0000000..ca6a2cf
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/feignclient/model/RecordAppoint.java
@@ -0,0 +1,30 @@
+package com.dsh.course.feignclient.model;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class RecordAppoint {
+
+    @ApiModelProperty(value = "课包id")
+    private Integer coursePackageId;
+
+    @ApiModelProperty(value = "上课记录id")
+    private Long courseStuRecordId;
+
+    @ApiModelProperty(value = "课包名称")
+    private String coursePackageName;
+
+    @ApiModelProperty(value = "课时数")
+    private Integer courseHours;
+
+    @ApiModelProperty(value = "上课时间范围(例如:2021.03.01 8:00-11:00)")
+    private String timeFrame;
+
+    @ApiModelProperty(value = "门店名称+地址")
+    private String storeNameAddr;
+
+    @ApiModelProperty(value = "课状态(1待上课 2已开始 3已完成 4已取消)")
+    private Integer status;
+
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/vo/response/ExchangeCoursePackageResponse.java b/cloud-server-course/src/main/java/com/dsh/course/model/vo/response/ExchangeCoursePackageResponse.java
new file mode 100644
index 0000000..d07f170
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/vo/response/ExchangeCoursePackageResponse.java
@@ -0,0 +1,49 @@
+package com.dsh.course.model.vo.response;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ExchangeCoursePackageResponse {
+
+    @ApiModelProperty(value = "限时折扣配置id/赠送课时配置id")
+    private Integer coursePackageDiscountId;
+
+    @ApiModelProperty(value = "课包封面图")
+    private String coverDrawing;
+
+    @ApiModelProperty(value = "课包介绍图")
+    private String introduceDrawing;
+
+    @ApiModelProperty(value = "课包名称")
+    private String coursePackageName;
+
+    @ApiModelProperty(value = "门店名称+地址")
+    private String storeNameAddr;
+
+    @ApiModelProperty(value = "门店距离 单位km")
+    private double distance;
+
+    @ApiModelProperty(value = "课时数")
+    private Integer classHours;
+
+    @ApiModelProperty(value = "赠送课时数")
+    private Integer freeClassHours;
+
+    @ApiModelProperty(value = "上课周数")
+    private String weekTime;
+
+    @ApiModelProperty(value = "上课时间")
+    private String time;
+
+    @ApiModelProperty(value = "原价")
+    private Double costPrice;
+
+    @ApiModelProperty(value = "折扣价/会员价")
+    private Double discountPrice;
+
+    @ApiModelProperty(value = "玩湃币")
+    private Integer wanpaiGold;
+
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/vo/response/WeekLimitedResponse.java b/cloud-server-course/src/main/java/com/dsh/course/model/vo/response/WeekLimitedResponse.java
index 0e55ce8..297caa6 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/model/vo/response/WeekLimitedResponse.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/vo/response/WeekLimitedResponse.java
@@ -19,6 +19,9 @@
     @Data
     public static class Details{
 
+        @ApiModelProperty(value = "限时折扣配置id/赠送课时配置id")
+        private Integer coursePackageDiscountId;
+
         @ApiModelProperty(value = "封面图")
         private String image;
 
@@ -28,7 +31,7 @@
         @ApiModelProperty(value = "课包课时数")
         private Integer courseHours;
 
-        @ApiModelProperty(value = "赠送课时数(赠送课时取改字段)")
+        @ApiModelProperty(value = "赠送课时数(赠送课时 取该字段)")
         private Integer donateHours;
 
         @ApiModelProperty(value = "今日/明日/周x")
@@ -38,12 +41,12 @@
         private Date date;
 
         @ApiModelProperty(value = "原价")
-        private Integer originalPrice;
+        private Double originalPrice;
 
         @ApiModelProperty(value = "折后价")
-        private Integer discountPrice;
+        private Double discountPrice;
 
-        @ApiModelProperty(value = "状态")
+        @ApiModelProperty(value = "状态(1=查看详情 2=暂未开始)")
         private Integer status;
 
         @ApiModelProperty(value = "门店距离")
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageDiscountService.java b/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageDiscountService.java
index 852deda..c9ba179 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageDiscountService.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageDiscountService.java
@@ -2,7 +2,9 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dsh.course.entity.TCoursePackageDiscount;
+import com.dsh.course.model.vo.response.ExchangeCoursePackageResponse;
 import com.dsh.course.model.vo.response.WeekLimitedResponse;
+import com.dsh.course.util.ResultUtil;
 
 
 /**
@@ -17,4 +19,8 @@
 
     WeekLimitedResponse getWeeksBenefitCourse(Integer appUserId,Integer discountType,String lon,String lat);
 
+    ExchangeCoursePackageResponse getWeekFreeCourseDetails(Integer coursePackageDiscountId,String lat,String lon);
+
+    ResultUtil paymentDiscountCoursePack(Integer coursePackageDiscountId, Integer appuserId);
+
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackagePaymentService.java b/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackagePaymentService.java
index 8d57092..d41eb94 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackagePaymentService.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackagePaymentService.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dsh.course.entity.TCoursePackagePayment;
+import com.dsh.course.feignclient.model.RecordAppoint;
 import com.dsh.course.model.vo.RegisterCourseVo;
 import com.dsh.course.model.vo.request.ClasspaymentRequest;
 import com.dsh.course.model.vo.request.CourseOfAfterRequest;
@@ -77,4 +78,12 @@
 
     ResultUtil ContinuationOrpaymentCourse(Integer userIdFormRedis, ClasspaymentRequest request);
 
+    /**
+     * 查询学员的课包上课记录
+     * @param stuId
+     * @param appUserId
+     * @return
+     */
+    List<RecordAppoint> obtainStuClassDetails(Integer stuId, Integer appUserId);
+
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageDiscountServiceImpl.java b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageDiscountServiceImpl.java
index 3d92269..aa8c8de 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageDiscountServiceImpl.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageDiscountServiceImpl.java
@@ -1,23 +1,35 @@
 package com.dsh.course.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dsh.course.entity.CoursePackagePaymentConfig;
 import com.dsh.course.entity.TCoursePackage;
 import com.dsh.course.entity.TCoursePackageDiscount;
+import com.dsh.course.entity.TCoursePackagePayment;
 import com.dsh.course.feignclient.other.StoreClient;
 import com.dsh.course.feignclient.other.model.GetDistanceVo;
+import com.dsh.course.feignclient.other.model.Store;
+import com.dsh.course.mapper.CoursePackagePaymentConfigMapper;
 import com.dsh.course.mapper.TCoursePackageDiscountMapper;
 import com.dsh.course.mapper.TCoursePackageMapper;
+import com.dsh.course.mapper.TCoursePackagePaymentMapper;
+import com.dsh.course.model.vo.response.ExchangeCoursePackageResponse;
 import com.dsh.course.model.vo.response.WeekLimitedResponse;
 import com.dsh.course.service.TCoursePackageDiscountService;
 import com.dsh.course.util.DateTimeHelper;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import com.dsh.course.util.LocalDateTimeUtils;
+import com.dsh.course.util.ResultUtil;
+import com.dsh.course.util.StrUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 
@@ -36,74 +48,361 @@
     @Resource
     private TCoursePackageMapper tcpMapper;
 
+    @Resource
+    private TCoursePackagePaymentMapper tcppMapper;
+
+    @Resource
+    private CoursePackagePaymentConfigMapper cppcMapper;
 
     @Resource
     private StoreClient sreClient;
 
 
     @Override
-    public WeekLimitedResponse getWeeksBenefitCourse(Integer appUserId,Integer discountType,String lon,String lat) {
-        Date start = DateTimeHelper.getTodayTime();
-        Date lastTime = DateTimeHelper.getWeekOfLastDay();
-        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
-        WeekLimitedResponse response= new WeekLimitedResponse();
+    public WeekLimitedResponse getWeeksBenefitCourse(Integer appUserId, Integer discountType, String lon, String lat) {
+        Date localTime = DateTimeHelper.getWXTime();
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+        WeekLimitedResponse response = new WeekLimitedResponse();
         List<WeekLimitedResponse.Details> list = new ArrayList<>();
+
         QueryWrapper<TCoursePackageDiscount> tCoursePackageDiscountQueryWrapper = new QueryWrapper<>();
-        tCoursePackageDiscountQueryWrapper.eq("auditStatus",2 );
+        tCoursePackageDiscountQueryWrapper.eq("auditStatus", 2);
         List<TCoursePackageDiscount> tCoursePackageDiscounts = new ArrayList<>();
-        if (null == discountType || discountType == 1){
-            tCoursePackageDiscountQueryWrapper.eq("type",3);
+        int weekStr = LocalDateTimeUtils.getWeekStr();
+        if (null == discountType || discountType == 1) {
+            tCoursePackageDiscountQueryWrapper.eq("type", 3);
             response.setDiscountType(1);
             tCoursePackageDiscounts = this.baseMapper.selectList(tCoursePackageDiscountQueryWrapper);
-            if (tCoursePackageDiscounts.size() > 0){
+            if (tCoursePackageDiscounts.size() > 0) {
                 for (TCoursePackageDiscount tCoursePackageDiscount : tCoursePackageDiscounts) {
-                    WeekLimitedResponse.Details ls = new WeekLimitedResponse.Details();
-
+                    TCoursePackage coursePackage = tcpMapper.selectById(tCoursePackageDiscount.getCoursePackageId());
+//                    判断预约人数是否已满
+                    Integer maxSubscribeNumber = coursePackage.getMaxSubscribeNumber();
+                    Integer integer = tcppMapper.selectCount(new QueryWrapper<TCoursePackagePayment>()
+                            .eq("appUserId",appUserId )
+                            .eq("status",1));
+                    if (integer >= maxSubscribeNumber){
+                        continue;
+                    }
+                    /**
+                     * [{
+                     * 	"startDate": "2023-01-01 00:00:00",
+                     * 	"endDate": "2023-12-31 23:59:59",
+                     * 	"startTime": "02:00:00",
+                     * 	"endTime": "23:00:00",
+                     * 	"weeks": [1, 2, 7],
+                     * 	"cashPayment": 100
+                     * }]
+                     */
                     try {
-                        ObjectMapper objectMapper = new ObjectMapper();
-                        JsonNode rootNode = null;
-                        rootNode = objectMapper.readTree(tCoursePackageDiscount.getContent());
-                        String courseHours = rootNode.get("courseHours").asText();
-                        String lifespanEnd = rootNode.get("lifespanEnd").asText();
-                        Date endTime = simpleDateFormat.parse(lifespanEnd);
-                        if (endTime.compareTo(lastTime) < 0){
-                            continue;
+                        JSONArray jsonArray = JSON.parseArray(tCoursePackageDiscount.getContent());
+                        JSONObject jsonObject = jsonArray.getJSONObject(0);
+                        Date parse1 = null;
+                        Date parse2 = null;
+                        String startDate = jsonObject.getString("startDate");
+                        String endDate = jsonObject.getString("endDate");
+                        try {
+                            parse1 = simpleDateFormat.parse(startDate);
+                            parse2 = simpleDateFormat.parse(endDate);
+                        } catch (ParseException e) {
+                            throw new RuntimeException(e);
                         }
-                        TCoursePackage coursePackage = tcpMapper.selectById(tCoursePackageDiscount.getCoursePackageId());
-                        GetDistanceVo distanceVo = new GetDistanceVo();
-                        distanceVo.setLatitude(lat);
-                        distanceVo.setLongitude(lon);
-                        distanceVo.setStoreId(coursePackage.getStoreId());
-                        ls.setStoreDistance(sreClient.calculateDistance(distanceVo));
-                        // TODO: 2023/7/10 限时折扣查询
-                        list.add(ls);
+                        List<Integer> weeks = jsonObject.getJSONArray("weeks").toJavaList(Integer.class);
+                        Double cashPayment = jsonObject.getDouble("cashPayment");
+                        Date tomorrowDate = null;
+                        if (weekStr != 7) {
+                            Calendar calendar = Calendar.getInstance();
+                            calendar.setTime(localTime);
+                            calendar.add(Calendar.DAY_OF_WEEK, 1);
+                            tomorrowDate = calendar.getTime();
+                        }
+
+                        boolean isWithinRange = false;
+                        if (weeks.contains(weekStr)) {
+                            isWithinRange = true;
+                        }
+
+                        if (isWithinRange) {
+                            // 判断当前日期是否在开始时间和结束时间范围内
+                            if (isDateWithinRange(localTime, parse1, parse2)) {
+                                WeekLimitedResponse.Details resde = new WeekLimitedResponse.Details();
+
+                                resde.setCoursePackageDiscountId(tCoursePackageDiscount.getId());
+                                resde.setImage(coursePackage.getCoverDrawing());
+                                resde.setCoursePackageName(coursePackage.getName());
+                                CoursePackagePaymentConfig paymentConfig = cppcMapper.selectById(tCoursePackageDiscount.getCoursePackagePaymentConfigId());
+                                resde.setCourseHours(paymentConfig.getClassHours());
+                                resde.setDataTime("今日");
+                                resde.setDate(localTime);
+                                resde.setOriginalPrice(paymentConfig.getCashPayment());
+                                resde.setDiscountPrice(cashPayment);
+                                resde.setStatus(1);
+                                GetDistanceVo distanceVo = new GetDistanceVo();
+                                distanceVo.setLatitude(lat);
+                                distanceVo.setLongitude(lon);
+                                distanceVo.setStoreId(coursePackage.getStoreId());
+                                resde.setStoreDistance(sreClient.calculateDistance(distanceVo));
+                                list.add(resde);
+                            }
+                        }
+                        Calendar tempCalendar = Calendar.getInstance();
+                        tempCalendar.setTime(localTime);
+                        tempCalendar.add(Calendar.DAY_OF_WEEK, 1);
+
+                        while (tempCalendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
+                            Date tempDate = tempCalendar.getTime();
+                            int weekNumOfDate = DateTimeHelper.getWeekNumOfDate(tempDate);
+                            if (isDateWithinRange(tempDate, parse1, parse2) && weeks.contains(weekNumOfDate)) {
+                                WeekLimitedResponse.Details resde = new WeekLimitedResponse.Details();
+
+                                resde.setCoursePackageDiscountId(tCoursePackageDiscount.getId());
+                                resde.setImage(coursePackage.getCoverDrawing());
+                                resde.setCoursePackageName(coursePackage.getName());
+                                CoursePackagePaymentConfig paymentConfig = cppcMapper.selectById(tCoursePackageDiscount.getCoursePackagePaymentConfigId());
+                                resde.setCourseHours(paymentConfig.getClassHours());
+                                String weekOfDate = "";
+                                if (weekStr != 7 && tempDate.equals(tomorrowDate)) {
+                                    weekOfDate = "明日";
+                                } else {
+                                    weekOfDate = DateTimeHelper.getWeekOfDate(tempDate);
+                                }
+                                resde.setDataTime(weekOfDate);
+                                resde.setDate(tempDate);
+                                resde.setOriginalPrice(paymentConfig.getCashPayment());
+                                resde.setDiscountPrice(cashPayment);
+                                resde.setStatus(2);
+                                GetDistanceVo distanceVo = new GetDistanceVo();
+                                distanceVo.setLatitude(lat);
+                                distanceVo.setLongitude(lon);
+                                distanceVo.setStoreId(coursePackage.getStoreId());
+                                resde.setStoreDistance(sreClient.calculateDistance(distanceVo));
+                                list.add(resde);
+                            }
+                            tempCalendar.add(Calendar.DAY_OF_WEEK, 1);
+                        }
+
                     } catch (Exception e) {
                         e.printStackTrace();
                     }
                 }
-            }
-        }else {
-            tCoursePackageDiscountQueryWrapper.eq("type",4);
-            response.setDiscountType(2);
-            tCoursePackageDiscounts = this.baseMapper.selectList(tCoursePackageDiscountQueryWrapper);
-            if (tCoursePackageDiscounts.size() > 0){
-                for (TCoursePackageDiscount tCoursePackageDiscount : tCoursePackageDiscounts) {
-                    try {
-                        ObjectMapper objectMapper = new ObjectMapper();
-                        JsonNode rootNode = null;
-                        rootNode = objectMapper.readTree(tCoursePackageDiscount.getContent());
-                        String courseHours = rootNode.get("courseHours").asText();
-                        String lifespanStart = rootNode.get("lifespanStart").asText();
-                        String lifespanEnd = rootNode.get("lifespanEnd").asText();
-                        String classHours = rootNode.get("classHours").asText();
-                    } catch (Exception e) {
-                        e.printStackTrace();
+            } else {
+                tCoursePackageDiscountQueryWrapper.eq("type", 4);
+                response.setDiscountType(2);
+                tCoursePackageDiscounts = this.baseMapper.selectList(tCoursePackageDiscountQueryWrapper);
+                if (tCoursePackageDiscounts.size() > 0) {
+                    for (TCoursePackageDiscount tCoursePackageDiscount : tCoursePackageDiscounts) {
+                        TCoursePackage coursePackage = tcpMapper.selectById(tCoursePackageDiscount.getCoursePackageId());
+//                    判断预约人数是否已满
+                        Integer maxSubscribeNumber = coursePackage.getMaxSubscribeNumber();
+                        Integer integer = tcppMapper.selectCount(new QueryWrapper<TCoursePackagePayment>()
+                                .eq("appUserId",appUserId )
+                                .eq("status",1));
+                        if (integer >= maxSubscribeNumber){
+                            continue;
+                        }
+//                    [{
+//                        "startDate": "2023-01-01 00:00:00",
+//                        "endDate": "2023-12-31 23:59:59",
+//                        "startTime": "02:00:00",
+//                        "endTime": "23:00:00",
+//                        "weeks": [1, 2, 7],
+//                        "hour": 10
+//                    }]
+                        try {
+                            JSONArray jsonArray = JSON.parseArray(tCoursePackageDiscount.getContent());
+                            JSONObject jsonObject = jsonArray.getJSONObject(0);
+                            Date parse1 = null;
+                            Date parse2 = null;
+                            String startDate = jsonObject.getString("startDate");
+                            String endDate = jsonObject.getString("endDate");
+                            try {
+                                parse1 = simpleDateFormat.parse(startDate);
+                                parse2 = simpleDateFormat.parse(endDate);
+                            } catch (ParseException e) {
+                                throw new RuntimeException(e);
+                            }
+                            List<Integer> weeks = jsonObject.getJSONArray("weeks").toJavaList(Integer.class);
+                            Integer cashPayment = jsonObject.getInteger("hour");
+
+                            Date tomorrowDate = null;
+                            if (weekStr != 7) {
+                                Calendar calendar = Calendar.getInstance();
+                                calendar.setTime(localTime);
+                                calendar.add(Calendar.DAY_OF_WEEK, 1);
+                                tomorrowDate = calendar.getTime();
+                            }
+
+                            boolean isWithinRange = false;
+                            if (weeks.contains(weekStr)) {
+                                isWithinRange = true;
+                            }
+
+                            if (isWithinRange) {
+                                // 判断当前日期是否在开始时间和结束时间范围内
+                                if (isDateWithinRange(localTime, parse1, parse2)) {
+                                    WeekLimitedResponse.Details resde = new WeekLimitedResponse.Details();
+
+                                    resde.setCoursePackageDiscountId(tCoursePackageDiscount.getId());
+                                    resde.setImage(coursePackage.getCoverDrawing());
+                                    resde.setCoursePackageName(coursePackage.getName());
+                                    CoursePackagePaymentConfig paymentConfig = cppcMapper.selectById(tCoursePackageDiscount.getCoursePackagePaymentConfigId());
+                                    resde.setCourseHours(paymentConfig.getClassHours());
+                                    resde.setDonateHours(cashPayment);
+                                    resde.setDataTime("今日");
+                                    resde.setDate(localTime);
+                                    resde.setOriginalPrice(paymentConfig.getCashPayment());
+                                    resde.setStatus(1);
+                                    GetDistanceVo distanceVo = new GetDistanceVo();
+                                    distanceVo.setLatitude(lat);
+                                    distanceVo.setLongitude(lon);
+                                    distanceVo.setStoreId(coursePackage.getStoreId());
+                                    resde.setStoreDistance(sreClient.calculateDistance(distanceVo));
+                                    list.add(resde);
+                                }
+                            }
+                            Calendar tempCalendar = Calendar.getInstance();
+                            tempCalendar.setTime(localTime);
+                            tempCalendar.add(Calendar.DAY_OF_WEEK, 1);
+
+                            while (tempCalendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
+                                Date tempDate = tempCalendar.getTime();
+                                int weekNumOfDate = DateTimeHelper.getWeekNumOfDate(tempDate);
+                                if (isDateWithinRange(tempDate, parse1, parse2) && weeks.contains(weekNumOfDate)) {
+                                    WeekLimitedResponse.Details resde = new WeekLimitedResponse.Details();
+
+                                    resde.setCoursePackageDiscountId(tCoursePackageDiscount.getId());
+                                    resde.setImage(coursePackage.getCoverDrawing());
+                                    resde.setCoursePackageName(coursePackage.getName());
+                                    CoursePackagePaymentConfig paymentConfig = cppcMapper.selectById(tCoursePackageDiscount.getCoursePackagePaymentConfigId());
+                                    resde.setCourseHours(paymentConfig.getClassHours());
+                                    resde.setDonateHours(cashPayment);
+                                    String weekOfDate = "";
+                                    if (weekStr != 7 && tempDate.equals(tomorrowDate)) {
+                                        weekOfDate = "明日";
+                                    } else {
+                                        weekOfDate = DateTimeHelper.getWeekOfDate(tempDate);
+                                    }
+                                    resde.setDataTime(weekOfDate);
+                                    resde.setDate(tempDate);
+                                    resde.setOriginalPrice(paymentConfig.getCashPayment());
+                                    resde.setStatus(2);
+                                    GetDistanceVo distanceVo = new GetDistanceVo();
+                                    distanceVo.setLatitude(lat);
+                                    distanceVo.setLongitude(lon);
+                                    distanceVo.setStoreId(coursePackage.getStoreId());
+                                    resde.setStoreDistance(sreClient.calculateDistance(distanceVo));
+                                    list.add(resde);
+                                }
+                                tempCalendar.add(Calendar.DAY_OF_WEEK, 1);
+                            }
+
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
                     }
                 }
             }
         }
-
-
         return response;
     }
+
+    @Override
+    public ExchangeCoursePackageResponse getWeekFreeCourseDetails(Integer coursePackageDiscountId,String lat,String lon) {
+        ExchangeCoursePackageResponse packageResponse = new ExchangeCoursePackageResponse();
+        TCoursePackageDiscount coursePackageDiscount = this.baseMapper.selectById(coursePackageDiscountId);
+        packageResponse.setCoursePackageDiscountId(coursePackageDiscount.getId());
+        Integer coursePackageId = coursePackageDiscount.getCoursePackageId();
+
+        TCoursePackage coursePackage = tcpMapper.selectById(coursePackageId);
+
+        packageResponse.setCoverDrawing(coursePackage.getCoverDrawing());
+        packageResponse.setIntroduceDrawing(coursePackage.getIntroduceDrawing());
+        packageResponse.setCoursePackageName(coursePackage.getName());
+
+        Store store = sreClient.queryStoreById(coursePackage.getStoreId());
+        packageResponse.setStoreNameAddr(store.getName() +"(" +store.getAddress()+")");
+        GetDistanceVo distanceVo = new GetDistanceVo();
+
+        distanceVo.setLatitude(lat);
+        distanceVo.setLongitude(lon);
+        distanceVo.setStoreId(coursePackage.getStoreId());
+        long l = sreClient.calculateDistance(distanceVo);
+        packageResponse.setDistance(l);
+
+        JSONArray jsonArray = JSON.parseArray(coursePackageDiscount.getContent());
+        JSONObject jsonObject = jsonArray.getJSONObject(0);
+        CoursePackagePaymentConfig paymentConfig = cppcMapper.selectById(coursePackageDiscount.getCoursePackagePaymentConfigId());
+        if (coursePackageDiscount.getType() == 3){
+            Double cashPayment = jsonObject.getDouble("cashPayment");
+            packageResponse.setClassHours(paymentConfig.getClassHours());
+            packageResponse.setCostPrice(paymentConfig.getCashPayment());
+            packageResponse.setDiscountPrice(cashPayment);
+        }else {
+            packageResponse.setClassHours(paymentConfig.getClassHours());
+
+            Integer cashPayment = jsonObject.getInteger("hour");
+            packageResponse.setFreeClassHours(cashPayment);
+
+            packageResponse.setCostPrice(paymentConfig.getCashPayment());
+            TCoursePackageDiscount coursePackageDiscount1 = this.baseMapper.selectOne(new QueryWrapper<TCoursePackageDiscount>()
+                    .eq("type", 1)
+                    .eq("coursePackageId",coursePackage.getId()));
+            String content = coursePackageDiscount1.getContent();
+            JSONObject jsonObject1 = JSON.parseObject(content);
+            Double vipPrice = jsonObject1.getDouble("num1");
+            packageResponse.setDiscountPrice(vipPrice);
+            packageResponse.setWanpaiGold(paymentConfig.getPlayPaiCoin());
+        }
+        List<Integer> weeks = StrUtils.dealStrToList(coursePackage.getClassWeeks());
+        if (weeks.size() > 0){
+            StringBuilder courWeeks = new StringBuilder("每");
+            for (Integer integer : weeks) {
+                switch (integer){
+                    case 1:
+                        courWeeks.append("周一、");
+                        break;
+                    case 2:
+                        courWeeks.append("周二、");
+                        break;
+                    case 3:
+                        courWeeks.append("周三、");
+                        break;
+                    case 4:
+                        courWeeks.append("周四、");
+                        break;
+                    case 5:
+                        courWeeks.append("周五、");
+                        break;
+                    case 6:
+                        courWeeks.append("周六、");
+                        break;
+                    case 7:
+                        courWeeks.append("周末、");
+                        break;
+                    default:
+                        break;
+                }
+            }
+            if (courWeeks.length() > 0 && courWeeks.charAt(courWeeks.length() - 1) == ','){
+                courWeeks.deleteCharAt(courWeeks.length() - 1);
+            }
+            packageResponse.setWeekTime(courWeeks.toString());
+        }
+        packageResponse.setTime(coursePackage.getClassStartTime()+"-"+coursePackage.getClassEndTime());
+
+        return packageResponse;
+    }
+
+    @Override
+    public ResultUtil paymentDiscountCoursePack(Integer coursePackageDiscountId, Integer appuserId) {
+        // TODO: 2023/7/13 折扣课包支付
+        return null;
+    }
+
+
+    private static boolean isDateWithinRange(Date date, Date startTime, Date endTime) {
+        return date.after(startTime) && date.before(endTime);
+    }
+
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java
index 93feb54..bba42cc 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java
@@ -9,6 +9,7 @@
 import com.dsh.course.feignclient.activity.CouponClient;
 import com.dsh.course.feignclient.activity.model.BenefitsVideos;
 import com.dsh.course.feignclient.activity.model.Coupon;
+import com.dsh.course.feignclient.model.RecordAppoint;
 import com.dsh.course.feignclient.other.StoreClient;
 import com.dsh.course.feignclient.other.model.Store;
 import com.dsh.course.mapper.*;
@@ -22,10 +23,7 @@
 import com.dsh.course.model.vo.response.CourseDetailsResponse;
 import com.dsh.course.model.vo.response.CourseOfVideoResponse;
 import com.dsh.course.service.TCoursePackagePaymentService;
-import com.dsh.course.util.PayMoneyUtil;
-import com.dsh.course.util.ResultUtil;
-import com.dsh.course.util.StrUtils;
-import com.dsh.course.util.UUIDUtil;
+import com.dsh.course.util.*;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,6 +31,7 @@
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.regex.Matcher;
@@ -401,4 +400,80 @@
 
     }
 
+
+    @Override
+    public List<RecordAppoint> obtainStuClassDetails(Integer stuId, Integer appUserId) {
+        List<RecordAppoint> recordVoList = new ArrayList<>();
+        List<TCoursePackagePayment> tCoursePackagePayments = this.baseMapper.selectList(new QueryWrapper<TCoursePackagePayment>()
+                .eq("studentId",stuId )
+                .eq("appUserId",appUserId )
+                .eq("payStatus",2 )
+                .eq("status",1 )
+                .orderByDesc("insertTime"));
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd");
+        SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
+        if (tCoursePackagePayments.size() > 0 ){
+            for (TCoursePackagePayment tCoursePackagePayment : tCoursePackagePayments) {
+                RecordAppoint recordVo = new RecordAppoint();
+                recordVo.setCoursePackageId(tCoursePackagePayment.getCoursePackageId());
+
+                TCoursePackage coursePackage = tcpmapper.selectById(tCoursePackagePayment.getCoursePackageId());
+
+                recordVo.setCoursePackageName(coursePackage.getName());
+                recordVo.setCourseHours(tCoursePackagePayment.getClassHours());
+                Date date = DateUtil.getDate();
+
+                String classStartTime = coursePackage.getClassStartTime();
+                String classEndTime = coursePackage.getClassEndTime();
+                recordVo.setTimeFrame(simpleDateFormat.format(date)+" "+classStartTime+"-"+classEndTime);
+                Store store = stoClient.queryStoreById(coursePackage.getStoreId());
+                recordVo.setStoreNameAddr(store.getName()+store.getAddress());
+                CoursePackageStudent coursePackageStudent = cpsMapper.selectOne(new QueryWrapper<CoursePackageStudent>()
+                        .eq("coursePackageId",tCoursePackagePayment.getCoursePackageId() )
+                        .eq("studentId",stuId)
+                        .eq("appUserId",appUserId)
+                        .eq("reservationStatus",1));
+                if (ToolUtil.isNotEmpty(coursePackageStudent) && coursePackageStudent.getReservationStatus() == 1){
+
+                    recordVo.setCourseStuRecordId(coursePackageStudent.getId());
+                    String classWeeks = coursePackage.getClassWeeks();
+                    String[] split = classWeeks.split(";");
+                    List<Integer> integerList = Arrays.stream(split)
+                            .map(Integer::parseInt)
+                            .collect(Collectors.toList());
+                    int dayOfWeek = DateTimeHelper.getDayOfWeek(new Date());
+
+                    if (integerList.contains(dayOfWeek)){
+                        String dat = simpleDateFormat.format(date) +" "+ classStartTime;
+
+                        Date start = null;
+                        try {
+                            start = format.parse(dat);
+                        } catch (ParseException e) {
+                            throw new RuntimeException(e);
+                        }
+                        if (start.after(new Date())){
+                            recordVo.setStatus(1);
+                        }else {
+                            CancelledClasses cancelledClasses = cacMapper.selectOne(new QueryWrapper<CancelledClasses>()
+                                    .eq("coursePackageId",tCoursePackagePayment.getCoursePackageId() ));
+                            if (ToolUtil.isNotEmpty(cancelledClasses)){
+                                recordVo.setStatus(3);
+                            }else {
+                                recordVo.setStatus(2);
+                            }
+                        }
+                    }else {
+                        recordVo.setStatus(1);
+                    }
+                }else {
+                    recordVo.setStatus(4);
+                }
+
+                recordVoList.add(recordVo);
+            }
+        }
+        return recordVoList;
+    }
+
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/util/DateTimeHelper.java b/cloud-server-course/src/main/java/com/dsh/course/util/DateTimeHelper.java
index 97688c4..017f6ac 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/util/DateTimeHelper.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/util/DateTimeHelper.java
@@ -1438,6 +1438,24 @@
         return weekDays[w];
     }
 
+
+    /**
+     * 获取当前日期是星期几<br>
+     * Obtain the day of the week for the current date.
+     * @param dt
+     * @return 当前日期是星期几
+     */
+    public static int getWeekNumOfDate(Date dt) {
+        Integer[] weekDays = {7, 1, 2, 3, 4, 5, 6}; // 将周一的数值设为2,依次递增表示周二到周日
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(dt);
+        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
+        if (w < 0) {
+            w = 6; // 如果为负数,将其设为6,表示周日
+        }
+        return weekDays[w];
+    }
+
     /**
      * 获取今天时间 2017-11-20 00:00:00
      */
diff --git a/cloud-server-course/src/main/java/com/dsh/course/util/LocalDateTimeUtils.java b/cloud-server-course/src/main/java/com/dsh/course/util/LocalDateTimeUtils.java
index 1a83e4d..b706602 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/util/LocalDateTimeUtils.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/util/LocalDateTimeUtils.java
@@ -5,6 +5,8 @@
 import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.Calendar;
+import java.util.Date;
 
 /**
  * LocalDateTimeUtils
@@ -89,5 +91,26 @@
         return dayOfWeek.getValue();
     }
 
+    /**
+     * 根据输入本周的周几,获取当天的时间
+     * @param dayOfWeekInput 周几
+     * @return
+     */
+    public static Date getDateOfWeekNum(int dayOfWeekInput){
+        // 获取当前日期
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(new Date());
+
+        // 设置为本周的第一天(星期一)
+        calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
+
+        // 根据输入的星期几数值,计算出相应的偏移量
+        int dayOfWeekIndex = (dayOfWeekInput + 6) % 7;
+        calendar.add(Calendar.DAY_OF_WEEK, dayOfWeekIndex);
+
+        // 获取计算后的日期
+        return calendar.getTime();
+    }
+
 
 }

--
Gitblit v1.7.1