From 134d13688e4b6677133ba2d362d2978d8bda2b87 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期三, 12 七月 2023 11:46:30 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 cloud-server-activity/src/main/java/com/dsh/activity/entity/Coupon.java                                     |   10 
 cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageController.java                    |    4 
 cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/TCoursePackagePayment.java      |   10 
 cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java             |  124 +++
 cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/PointMallDetailsResponse.java |    8 
 cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/PointsMerchandise.java        |  108 +++
 cloud-server-course/src/main/java/com/dsh/course/model/vo/response/CourseDetailsResponse.java               |    3 
 cloud-server-account/src/main/java/com/dsh/account/util/OssUploadUtil.java                                  |   39 +
 cloud-server-account/src/main/java/com/dsh/account/service/TStudentService.java                             |    2 
 cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java                    |  196 +++++
 cloud-server-course/src/main/java/com/dsh/course/model/vo/RegisterCourseVo.java                             |    3 
 cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackagePaymentService.java                  |    4 
 cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePaymentClient.java                       |   23 
 cloud-server-activity/src/main/java/com/dsh/activity/model/request/CommodityRequest.java                    |   18 
 cloud-server-account/src/main/java/com/dsh/account/service/RechargeRecordsService.java                      |    1 
 cloud-server-account/src/main/java/com/dsh/account/controller/PaymentCallbackController.java                |  114 +++
 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/UserConponClient.java                      |   10 
 cloud-server-account/src/main/java/com/dsh/account/controller/UseBenefitsController.java                    |   25 
 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/MerChandiseClient.java                     |    8 
 cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java                       |   52 +
 cloud-server-course/src/main/java/com/dsh/course/model/vo/request/PlayPaiGoldCoursePackage.java             |   22 
 cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePackageClient.java              |   22 
 cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/CoursePackage.java              |  128 ++++
 cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/model/PaymentCompetition.java    |   65 ++
 cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java                |   48 +
 cloud-server-account/src/main/java/com/dsh/account/model/vo/classDetails/ClasspaymentRequest.java           |    2 
 cloud-server-account/src/main/java/com/dsh/account/model/dto/Coupon.java                                    |  119 +++
 cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePaymentClient.java              |   19 
 cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/CommodityRequest.java         |   16 
 cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/IndexOfUserBenefirVo.java     |    2 
 cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java                    |  217 ++++++
 cloud-server-competition/src/main/java/com/dsh/competition/feignclient/DeductionCompetitionsClient.java     |   10 
 cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/PlayPaiGoldCoursePackage.java   |   22 
 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/CoursePackage.java            |    2 
 cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java         |  115 +++
 cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/MerChandiseClient.java              |    9 
 cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/UserConponClient.java               |   11 
 cloud-server-course/src/main/java/com/dsh/course/model/vo/request/ClasspaymentRequest.java                  |    4 
 cloud-server-account/src/main/java/com/dsh/account/service/impl/RechargeRecordsServiceImpl.java             |  206 ++++++
 cloud-server-account/src/main/java/com/dsh/account/service/TAppUserService.java                             |   13 
 cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/DeductionCompetitionsClient.java |    9 
 cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java            |   30 
 42 files changed, 1,736 insertions(+), 117 deletions(-)

diff --git a/cloud-server-account/src/main/java/com/dsh/account/controller/PaymentCallbackController.java b/cloud-server-account/src/main/java/com/dsh/account/controller/PaymentCallbackController.java
index fad5bff..84d79ba 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/controller/PaymentCallbackController.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/controller/PaymentCallbackController.java
@@ -1,9 +1,19 @@
 package com.dsh.account.controller;
 
 
+import com.dsh.account.service.RechargeRecordsService;
+import com.dsh.account.service.TStudentService;
+import com.dsh.account.util.PayMoneyUtil;
+import com.dsh.account.util.ResultUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+import java.util.Map;
 
 /**
  * 支付回调控制器
@@ -15,22 +25,108 @@
 public class PaymentCallbackController {
 
 
-    /**
-     * 支付宝支付回调接口
-     */
-    @PostMapping("/v1")
-    public void alipayCallback(){
+    @Autowired
+    private PayMoneyUtil payMoneyUtil;
 
+    @Autowired
+    private TStudentService tstuService;
+    @Autowired
+    private RechargeRecordsService recordsService;
+
+    /**
+     * 课包续课支付宝支付回调接口
+     */
+    @PostMapping("/base/coursePackage/alipayPaymentCallback")
+    public void alipayCallback(HttpServletRequest request, HttpServletResponse response){
+        try {
+            Map<String, String> map = payMoneyUtil.alipayCallback(request);
+            if(null != map){
+                String out_trade_no = map.get("out_trade_no");
+                String transaction_id = map.get("transaction_id");
+                ResultUtil resultUtil = tstuService.insertVipPaymentCallback(out_trade_no, transaction_id);
+                if(resultUtil.getCode() == 200){
+                    PrintWriter out = response.getWriter();
+                    out.write("success");
+                    out.flush();
+                    out.close();
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
     }
 
 
     /**
-     * 微信支付回调接口
+     * 课包续课微信支付回调接口
      */
-    @PostMapping("/v2")
-    public void weChatCallback(){
-
+    @PostMapping("/base/coursePackage/wechatPaymentCallback")
+    public void weChatCallback(HttpServletRequest request, HttpServletResponse response){
+        try {
+            Map<String, String> map = payMoneyUtil.weixinpayCallback(request);
+            if(null != map){
+                String out_trade_no = map.get("out_trade_no");
+                String transaction_id = map.get("transaction_id");
+                String result = map.get("result");
+                ResultUtil resultUtil = tstuService.insertVipPaymentCallback(out_trade_no, transaction_id);
+                if(resultUtil.getCode() == 200){
+                    PrintWriter out = response.getWriter();
+                    out.write(result);
+                    out.flush();
+                    out.close();
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
     }
 
+    /**
+     * 充值玩湃币支付宝支付回调接口
+     */
+    @PostMapping("/base/recharge/alipayRechargeCallback")
+    public void alipayRechargeCallback(HttpServletRequest request, HttpServletResponse response){
+        try {
+            Map<String, String> map = payMoneyUtil.alipayCallback(request);
+            if(null != map){
+                String out_trade_no = map.get("out_trade_no");
+                String transaction_id = map.get("transaction_id");
+                ResultUtil resultUtil = recordsService.addRechargeCallbackPay(out_trade_no, transaction_id);
+                if(resultUtil.getCode() == 200){
+                    PrintWriter out = response.getWriter();
+                    out.write("success");
+                    out.flush();
+                    out.close();
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 课包续课微信支付回调接口
+     */
+    @PostMapping("/base/recharge/wechatRechargeCallback")
+    public void wechatRechargeCallback(HttpServletRequest request, HttpServletResponse response){
+        try {
+            Map<String, String> map = payMoneyUtil.weixinpayCallback(request);
+            if(null != map){
+                String out_trade_no = map.get("out_trade_no");
+                String transaction_id = map.get("transaction_id");
+                String result = map.get("result");
+                ResultUtil resultUtil = recordsService.addRechargeCallbackPay(out_trade_no, transaction_id);
+                if(resultUtil.getCode() == 200){
+                    PrintWriter out = response.getWriter();
+                    out.write(result);
+                    out.flush();
+                    out.close();
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
 
 }
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 73175a8..c5fa489 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
@@ -17,8 +17,10 @@
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.text.SimpleDateFormat;
 import java.util.List;
 
@@ -92,6 +94,26 @@
                 detailsVo.setMemberLifespan(format1.format(tAppUser.getVipEndTime()));
             }
             return ResultUtil.success(detailsVo);
+        }catch (Exception e){
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    @ResponseBody
+    @PostMapping("/api/useBenefit/uploadImage")
+    @ApiOperation(value = "上传用户头像", tags = {"APP-使用福利"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
+            @ApiImplicitParam(name = "file",value = "图片字节",dataType = "MultipartFile")
+    })
+    public ResultUtil uploadAppUserProfile(MultipartFile file, HttpServletRequest request){
+        try {
+            Integer appUserId = tokenUtil.getUserIdFormRedis();
+            if(null == appUserId){
+                return ResultUtil.tokenErr();
+            }
+            return ResultUtil.success(tauService.uploadAppUserHeadImg(appUserId,file,request));
         }catch (Exception e){
             return ResultUtil.runErr();
         }
@@ -247,8 +269,7 @@
             if(null == userIdFormRedis){
                 return ResultUtil.tokenErr();
             }
-            // TODO: 2023/7/10 积分商品列表查询
-            return ResultUtil.success();
+            return ResultUtil.success(tauService.queryAppUserIntegral(request,userIdFormRedis));
         }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 bdcab0b..7d045a8 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
@@ -1,9 +1,12 @@
 package com.dsh.account.feignclient.activity;
 
 
+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 org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.List;
 
@@ -14,4 +17,10 @@
     public List<IntegralCommodity> getConvertibleGoods();
 
 
+    @PostMapping("/base/pointMerchars/getCommoditys")
+    public List<PointsMerchandise> getVicinityGoods(@RequestBody CommodityRequest request);
+
+    @PostMapping("/base/pointMerchars/getRedeemedNums")
+    public int getRedeemedQuantity(@RequestBody Integer goodId);
+
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/UserConponClient.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/UserConponClient.java
index f336961..ec8eae1 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/UserConponClient.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/UserConponClient.java
@@ -1,8 +1,11 @@
 package com.dsh.account.feignclient.activity;
 
+import com.dsh.account.feignclient.activity.model.CommodityRequest;
+import com.dsh.account.model.dto.Coupon;
 import com.dsh.account.model.vo.sourceDetail.CouponStuAvailableVo;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
@@ -14,4 +17,12 @@
     @PostMapping("/base/userConpon/getStuOfConpons")
     public List<CouponStuAvailableVo> queryUserWithConponList(@RequestParam("appUserId") Integer appUserId);
 
+
+    @PostMapping("/base/coupon/getAllCoupons")
+    public List<Coupon> getAllCoupons(@RequestBody CommodityRequest request);
+
+
+    @PostMapping("/base/coupon/getRedeemedNums")
+    public int getRedeemedQuantity(@RequestBody Integer id);
+
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/CommodityRequest.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/CommodityRequest.java
new file mode 100644
index 0000000..f7f8958
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/CommodityRequest.java
@@ -0,0 +1,16 @@
+package com.dsh.account.feignclient.activity.model;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+public class CommodityRequest {
+
+    @ApiModelProperty(value = "经度")
+    private String lon;
+
+    @ApiModelProperty(value = "纬度")
+    private String lat;
+
+}
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
new file mode 100644
index 0000000..69d9377
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/PointsMerchandise.java
@@ -0,0 +1,108 @@
+package com.dsh.account.feignclient.activity.model;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class PointsMerchandise {
+
+    /**
+     * 主键
+     */
+    private Integer id;
+    /**
+     * 类型(1=实体商品,2=课包商品,3=门票商品)
+     */
+    private Integer type;
+    /**
+     * 商品名称
+     */
+    private String name;
+    /**
+     * 课包id
+     */
+    private Integer coursePackageId;
+    /**
+     * 原价
+     */
+    private BigDecimal price;
+    /**
+     * 兑换方式(1=积分,2=现金+积分)
+     */
+    private Integer redemptionMethod;
+    /**
+     * 所需现金
+     */
+    private BigDecimal cash;
+    /**
+     * 所属积分
+     */
+    private BigDecimal integral;
+    /**
+     * 商品封面
+     */
+    private String cover;
+    /**
+     * 商品图片
+     */
+    private String productImages;
+    /**
+     * 用户人群(1=全部用户,2=年度会员,3=已有学员用户)
+     */
+    private Integer userPopulation;
+    /**
+     * 发放数量
+     */
+    private Integer quantityIssued;
+    /**
+     * 限领数量
+     */
+    private Integer pickUpQuantity;
+    /**
+     * 开始时间
+     */
+    private Date startTime;
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+    /**
+     * 使用范围(1=全国,2=指定城市,3=指定门店)
+     */
+    private Integer useScope;
+    /**
+     * 省
+     */
+    private String province;
+    /**
+     * 省编号
+     */
+    private String provinceCode;
+    /**
+     * 市
+     */
+    private String city;
+    /**
+     * 市编号
+     */
+    private String cityCode;
+    /**
+     * 兑换说明
+     */
+    private String redemptionInstructions;
+    /**
+     * 排序
+     */
+    private Integer sort;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/DeductionCompetitionsClient.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/DeductionCompetitionsClient.java
index a88b8de..fc6962a 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/DeductionCompetitionsClient.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/DeductionCompetitionsClient.java
@@ -2,6 +2,7 @@
 
 
 import com.dsh.account.feignclient.competition.model.GetStuSourseList;
+import com.dsh.account.feignclient.competition.model.PaymentCompetition;
 import com.dsh.account.feignclient.competition.model.PurchaseRecordVo;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -14,4 +15,12 @@
     @PostMapping("/base/competition/getCompetitionsDetails")
     List<PurchaseRecordVo> getStuSourseList(@RequestBody GetStuSourseList getStuSourseList);
 
+    @PostMapping("/base/competition/getPayedCompetitions")
+    List<PaymentCompetition> getAllCompetitionPayRecord(@RequestBody Integer appUserId);
+
+    @PostMapping("/base/competition/getCancelOrderOfUserPay")
+    public List<PaymentCompetition> getCancelOrderOfUserPayRecord(@RequestBody Integer appUserId);
+
+    @PostMapping("/base/competition/getPlayPaiFGoldPayRecord")
+    List<PaymentCompetition> getPlayPaiFGoldPayRecord(@RequestBody Integer appUserId);
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/model/PaymentCompetition.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/model/PaymentCompetition.java
new file mode 100644
index 0000000..359de61
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/competition/model/PaymentCompetition.java
@@ -0,0 +1,65 @@
+package com.dsh.account.feignclient.competition.model;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/6 16:30
+ */
+@Data
+public class PaymentCompetition {
+    /**
+     * 主键
+     */
+    private Long id;
+    /**
+     * 业务流水号
+     */
+    private String code;
+    /**
+     * 赛事id
+     */
+    private Integer competitionId;
+    /**
+     * 用户id
+     */
+    private Integer appUserId;
+    /**
+     * 支付方式(1=微信,2=支付宝,3=玩湃币,4=课时)
+     */
+    private Integer payType;
+    /**
+     * 支付金额
+     */
+    private Double amount;
+    /**
+     * 支付状态(1=待支付,2=已支付,3=已退款)
+     */
+    private Integer payStatus;
+    /**
+     * 支付时间
+     */
+    private Date payTime;
+    /**
+     * 第三方支付流水号
+     */
+    private String payOrderNo;
+    /**
+     * 退款时间
+     */
+    private Date refundTime;
+    /**
+     * 第三方退款流水
+     */
+    private String refundOrderNo;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePackageClient.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePackageClient.java
new file mode 100644
index 0000000..c788428
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePackageClient.java
@@ -0,0 +1,22 @@
+package com.dsh.account.feignclient.course;
+
+import com.dsh.account.feignclient.course.model.CoursePackage;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/5 9:55
+ */
+@FeignClient("mb-cloud-course")
+public interface CoursePackageClient {
+
+
+    /**
+     * 根据id获取课包
+     * @param id
+     * @return
+     */
+    @PostMapping("/coursePackage/queryCoursePackageById")
+    CoursePackage queryCoursePackageById(Integer id);
+}
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 55af25f..2e0b74f 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
@@ -33,4 +33,23 @@
 
     @PostMapping("/base/coursePack/allPaymentCourseList")
     public List<TCoursePackagePayment> getAppuserCourseList(@RequestBody Integer appUserId);
+
+    @PostMapping("/coursePackagePayment/courseRenewPlayPaiPay")
+    public int paymentWanpaiRenewCourse(@RequestBody PlayPaiGoldCoursePackage coursePackage);
+
+    @PostMapping("/base/coursePack/getPaymentCoursePackage")
+    public TCoursePackagePayment getCoursePackagePaymentByCode(@RequestBody String code);
+
+    @PostMapping("/base/coursePack/delPaymentCoursePackage")
+    public boolean delPaymentCoursePackage(@RequestBody Integer payId);
+
+    @PostMapping("/base/coursePack/updatePaymentCoursePackage")
+    void updatePaymentCoursePackage(TCoursePackagePayment coursePackagePayment);
+
+    @PostMapping("/base/coursePack/savePaymentCoursePackage")
+    public boolean savePaymentCoursePackage(@RequestBody TCoursePackagePayment packagePayment);
+
+    @PostMapping("/base/coursePack/allAmountPayRecordOfUser")
+    public List<TCoursePackagePayment> getAmountPayRecord(@RequestBody Integer appUserId);
+
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/CoursePackage.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/CoursePackage.java
new file mode 100644
index 0000000..4f54cd2
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/CoursePackage.java
@@ -0,0 +1,128 @@
+package com.dsh.account.feignclient.course.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/5 9:56
+ */
+@Data
+public class CoursePackage {
+    private Integer id;
+    /**
+     * 省
+     */
+    private String province;
+    /**
+     * 省编号
+     */
+    private String provinceCode;
+    /**
+     * 市
+     */
+    private String city;
+    /**
+     * 市编号
+     */
+    private String cityCode;
+    /**
+     * 门店id
+     */
+    private Integer storeId;
+    /**
+     * 课包类型id
+     */
+    private Integer coursePackageTypeId;
+    /**
+     * 课包名称
+     */
+    private String name;
+    /**
+     * 上课场地id
+     */
+    private Integer siteId;
+    /**
+     * 教练id
+     */
+    private Integer coachId;
+    /**
+     * 最多预约人数
+     */
+    private Integer maxSubscribeNumber;
+    /**
+     * 上课开始时间
+     */
+    private String classStartTime;
+    /**
+     * 上课结束时段
+     */
+    private String classEndTime;
+    /**
+     * 上课周,多个分号分隔
+     */
+    private String classWeeks;
+    /**
+     * 封面图
+     */
+    private String coverDrawing;
+    /**
+     * 详情图
+     */
+    private String detailDrawing;
+    /**
+     * 介绍图
+     */
+    private String introduceDrawing;
+    /**
+     * 排序
+     */
+    private Integer sort;
+    /**
+     * 支付方式(1=现金,2=玩湃币)
+     */
+    private Integer payType;
+    /**
+     * 有效天数
+     */
+    private Integer validDays;
+    /**
+     * 课后练习课程id
+     */
+    private Integer courseId;
+    /**
+     * 课后练习视频介绍
+     */
+    private String introduce;
+    /**
+     * 完成课后练习获取积分
+     */
+    private Integer integral;
+    /**
+     * 课程状态(1=未开始,2=进行中,3=已结束,4=已取消)
+     */
+    private Integer status;
+    /**
+     * 审核状态(1=待审核,2=已同意,3=已拒绝)
+     */
+    private Integer auditStatus;
+    /**
+     * 审核人id
+     */
+    private Integer auditUserId;
+    /**
+     * 审核备注
+     */
+    private String authRemark;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date insertTime;
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/PlayPaiGoldCoursePackage.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/PlayPaiGoldCoursePackage.java
new file mode 100644
index 0000000..d1ff02a
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/PlayPaiGoldCoursePackage.java
@@ -0,0 +1,22 @@
+package com.dsh.account.feignclient.course.model;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PlayPaiGoldCoursePackage {
+
+    @ApiModelProperty(value = "支付配置id")
+    Integer coursePayConfigId;
+
+    @ApiModelProperty(value = "学员id")
+    Integer stuId;
+
+    @ApiModelProperty(value = "课包id")
+    Integer coursePackageId;
+
+    @ApiModelProperty(value = "code")
+    String code;
+
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/TCoursePackagePayment.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/TCoursePackagePayment.java
index f0dfe8e..4c867d1 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/TCoursePackagePayment.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/TCoursePackagePayment.java
@@ -25,7 +25,7 @@
      */
     private Integer coursePackageId;
     /**
-     * 支付方式(1=现金,2=玩湃币)
+     * 支付方式(1=微信 2=支付宝 3=玩湃币)
      */
     private Integer payType;
     /**
@@ -88,5 +88,13 @@
      * 添加时间
      */
     private Date insertTime;
+    /**
+     * 业务编号
+     */
+    private String code;
+    /**
+     * 原价
+     */
+    private Double originalPrice;
 
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/model/dto/Coupon.java b/cloud-server-account/src/main/java/com/dsh/account/model/dto/Coupon.java
new file mode 100644
index 0000000..81fecae
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/model/dto/Coupon.java
@@ -0,0 +1,119 @@
+package com.dsh.account.model.dto;
+
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class Coupon {
+    /**
+     * 主键
+     */
+    private Integer id;
+    /**
+     * 优惠券名称
+     */
+    private String name;
+    /**
+     * 优惠券类型(1=满减券,2=代金券,3=体验券)
+     */
+    private Integer type;
+    /**
+     * 优惠券规则JSON
+     */
+    private String content;
+    /**
+     * 优惠券说明
+     */
+    private String illustrate;
+    /**
+     * 发放方式(1=积分购买,2=注册赠送,3=自动发券)
+     */
+    private Integer distributionMethod;
+    /**
+     * 兑换方式(1=积分,2=积分+现金)
+     */
+    private Integer redemptionMethod;
+    /**
+     * 所需现金
+     */
+    private BigDecimal cash;
+    /**
+     * 所属积分
+     */
+    private BigDecimal integral;
+    /**
+     * 用户人群(1=全部用户,2=年度会员,3=已有学员用户)
+     */
+    private Integer userPopulation;
+    /**
+     * 发放数量
+     */
+    private Integer quantityIssued;
+    /**
+     * 限领数量
+     */
+    private Integer pickUpQuantity;
+    /**
+     * 开始时间
+     */
+    private Date startTime;
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+    /**
+     * 使用范围(1=全国,2=指定城市,3=指定门店)
+     */
+    private Integer useScope;
+    /**
+     * 省
+     */
+    private String province;
+    /**
+     * 省编号
+     */
+    private String provinceCode;
+    /**
+     * 市
+     */
+    private String city;
+    /**
+     * 市编号
+     */
+    private String cityCode;
+    /**
+     * 审核状态(1=待审核,2=已通过,3=已拒绝)
+     */
+    private Integer auditStatus;
+    /**
+     * 审核人id
+     */
+    private Integer auditUserId;
+    /**
+     * 审核备注
+     */
+    private String auditRemark;
+    /**
+     * 状态(1=未开始,2=已开始,3=已结束,4=已取消)
+     */
+    private Integer status;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 封面图
+     */
+    private String cover;
+    /**
+     * 图片
+     */
+    private String productImages;
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/model/vo/classDetails/ClasspaymentRequest.java b/cloud-server-account/src/main/java/com/dsh/account/model/vo/classDetails/ClasspaymentRequest.java
index 5604edd..12d69b7 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/model/vo/classDetails/ClasspaymentRequest.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/model/vo/classDetails/ClasspaymentRequest.java
@@ -25,7 +25,7 @@
     private Integer conponId;
 
     @ApiModelProperty(value = "课时id")
-    private Long courseConfigId;
+    private Integer courseConfigId;
 
     @ApiModelProperty(value = "支付金额")
     private BigDecimal payAmount;
diff --git a/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/IndexOfUserBenefirVo.java b/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/IndexOfUserBenefirVo.java
index a766f2f..c2abae4 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/IndexOfUserBenefirVo.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/IndexOfUserBenefirVo.java
@@ -16,7 +16,7 @@
     @ApiModelProperty(value = "用户名称")
     private String userName;
 
-    @ApiModelProperty(value = "是否年度会员")
+    @ApiModelProperty(value = "是否年度会员(字符:年度会员 或者 普通用户)")
     private String isMember;
 
     @ApiModelProperty(value = "玩湃币")
diff --git a/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/PointMallDetailsResponse.java b/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/PointMallDetailsResponse.java
index 287f537..68cc3f3 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/PointMallDetailsResponse.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/PointMallDetailsResponse.java
@@ -35,18 +35,24 @@
         @ApiModelProperty(value = "商品名称")
         private String goodName;
 
+        @ApiModelProperty(value = "1积分 2现金+积分")
+        private Integer condition;
+
         @ApiModelProperty(value = "金额")
         private BigDecimal amount;
 
         @ApiModelProperty(value = "积分")
         private Integer integral;
 
-        @ApiModelProperty(value = "适用范围: 1 仅限会员 2仅限学员 3全部用户")
+        @ApiModelProperty(value = "适用范围: 1全部用户 2仅限会员 3仅限学员")
         private Integer belongsType;
 
         @ApiModelProperty(value = "商品类型: 1实物 2课包 3门票 4优惠券")
         private Integer goodsType;
 
+        @ApiModelProperty(value = "已兑换数量")
+        private Integer nums;
+
     }
 
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/RechargeRecordsService.java b/cloud-server-account/src/main/java/com/dsh/account/service/RechargeRecordsService.java
index 3c920de..c1e0f4d 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/service/RechargeRecordsService.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/service/RechargeRecordsService.java
@@ -20,4 +20,5 @@
 
     ResultUtil rechargeCenPayment(Integer userIdFormRedis, RechargePayRequest request);
 
+    ResultUtil addRechargeCallbackPay(String code, String orderNumber);
 }
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 5b897dc..e63f6f4 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
@@ -7,11 +7,11 @@
 import com.dsh.account.model.LoginSMSCodeVo;
 import com.dsh.account.model.LoginWeChatVo;
 import com.dsh.account.model.vo.classDetails.classInsVo.ClassInfoVo;
-import com.dsh.account.model.vo.userBenefitDetail.BillingDetailsVo;
-import com.dsh.account.model.vo.userBenefitDetail.IndexOfUserBenefirVo;
-import com.dsh.account.model.vo.userBenefitDetail.RechargeCentVo;
+import com.dsh.account.model.vo.userBenefitDetail.*;
 import com.dsh.account.util.ResultUtil;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 
 /**
@@ -107,7 +107,7 @@
     /**
      * 获取用户账单列表
      * @param yearMonth 年月
-     * @param recordId 记录id
+     * @param recordId 记录
      * @return
      */
     BillingDetailsVo queryUserBillingDetails(String yearMonth, Integer recordId,Integer appUserId);
@@ -119,4 +119,9 @@
     void cancellation(Integer appUserId);
 
     List<RechargeCentVo> getSysRechargeConfig(Integer appUserId);
+
+    PointMallDetailsResponse queryAppUserIntegral(MallRequest request, Integer userIdFormRedis);
+
+    ResultUtil uploadAppUserHeadImg(Integer appUserId, MultipartFile file, HttpServletRequest request);
+
 }
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 dcd9be9..d8cc797 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
@@ -73,4 +73,6 @@
 
     ResultUtil renewClassPayment(Integer userIdFormRedis, ClasspaymentRequest request);
 
+    ResultUtil insertVipPaymentCallback(String outTradeNo, String transactionId);
+
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/impl/RechargeRecordsServiceImpl.java b/cloud-server-account/src/main/java/com/dsh/account/service/impl/RechargeRecordsServiceImpl.java
index 511f7f2..0c946de 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/service/impl/RechargeRecordsServiceImpl.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/service/impl/RechargeRecordsServiceImpl.java
@@ -5,15 +5,20 @@
 import com.dsh.account.entity.RechargeRecords;
 import com.dsh.account.entity.TAppUser;
 import com.dsh.account.enums.RechargeRecordEnum;
+import com.dsh.account.feignclient.competition.DeductionCompetitionsClient;
+import com.dsh.account.feignclient.competition.model.PaymentCompetition;
 import com.dsh.account.feignclient.course.CoursePaymentClient;
 import com.dsh.account.feignclient.course.model.TCoursePackagePayment;
+import com.dsh.account.feignclient.other.RechargeConfigClient;
 import com.dsh.account.mapper.RechargeRecordsMapper;
 import com.dsh.account.mapper.TAppUserMapper;
 import com.dsh.account.model.vo.userBenefitDetail.RechargeDetailsVo;
 import com.dsh.account.model.vo.userBenefitDetail.RechargePayRequest;
 import com.dsh.account.service.RechargeRecordsService;
 import com.dsh.account.util.DateTimeHelper;
+import com.dsh.account.util.PayMoneyUtil;
 import com.dsh.account.util.ResultUtil;
+import com.dsh.account.util.UUIDUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
@@ -24,6 +29,7 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -45,6 +51,16 @@
 
     @Autowired
     private CoursePaymentClient cpClient;
+
+    @Autowired
+    private DeductionCompetitionsClient deducClient;
+
+    @Autowired
+    private PayMoneyUtil payMoneyUtil;
+
+
+    @Resource
+    private RechargeConfigClient reconMapper;
 
 
     @Override
@@ -70,7 +86,16 @@
             vo.setWpGold(0);
         }
 //            1.赛事报名
-
+        List<PaymentCompetition> playPaiFGoldPayRecord = deducClient.getPlayPaiFGoldPayRecord(appUserId);
+        if (playPaiFGoldPayRecord.size() > 0 ){
+            for (PaymentCompetition competition : playPaiFGoldPayRecord) {
+                RechargeDetailsVo.RechargesDetail consumeDetail = new RechargeDetailsVo.RechargesDetail();
+                consumeDetail.setConsumeName(RechargeRecordEnum.EVENT_REGISTRATION.getMsg() );
+                consumeDetail.setConsumeTime(simpleDateFormat.format(competition.getInsertTime()));
+                consumeDetail.setConsumeAmount("-" + competition.getAmount());
+                details.add(consumeDetail);
+            }
+        }
 //            2.课包购买
         List<TCoursePackagePayment> appuserCourseList = cpClient.getAppuserCourseList(appUserId);
         if (appuserCourseList.size() > 0){
@@ -86,7 +111,7 @@
 //            4.智慧球场
 
 //            5.充值
-        List<RechargeRecords> rechargeRecords = rereMapper.selectList(new QueryWrapper<RechargeRecords>()
+        List<RechargeRecords> rechargeRecords = this.baseMapper.selectList(new QueryWrapper<RechargeRecords>()
                 .eq("payStatus", 2)
                 .eq("appUserId", appUserId)
                 .between("insertTime", monthStart, monthEnd));
@@ -105,27 +130,178 @@
 
     @Override
     public ResultUtil rechargeCenPayment(Integer userIdFormRedis, RechargePayRequest request) {
-        // TODO: 2023/7/10 充值支付
-        switch (request.getPayType()){
-            case 1:
-                WeChatPayment(request.getPayAmount());
-                break;
-            case 2:
-                AlipayPayment(request.getPayAmount());
-                break;
-            default:
-                break;
+        TAppUser tAppUser = tappMapper.selectById(userIdFormRedis);
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+        String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
+        RechargeRecords rechargeRecords = new RechargeRecords();
+        rechargeRecords.setCode(code);
+        rechargeRecords.setAppUserId(userIdFormRedis);
+        rechargeRecords.setAmount(request.getPayAmount());
+        List<Map<String, Object>> rechargeConfig = reconMapper.getRechargeConfig();
+        if (rechargeConfig.size() > 0){
+            for (Map<String, Object> stringObjectMap : rechargeConfig) {
+                Object o = stringObjectMap.get("money");
+                if (o.equals(request.getPayAmount())){
+                    if (tAppUser.getIsVip() == 1){
+                        rechargeRecords.setPlayPaiCoins((Integer) stringObjectMap.get("MemberCoins"));
+                    }else {
+                        rechargeRecords.setPlayPaiCoins((Integer) stringObjectMap.get("usersCoins"));
+                    }
+                }
+            }
+        }
+        rechargeRecords.setPayStatus(1);
+        rechargeRecords.setState(1);
+        rechargeRecords.setInsertTime(new Date());
+        this.baseMapper.insert(rechargeRecords);
+        try {
+            switch (request.getPayType()){
+                case 1:
+                    return WeChatPayment(code,request.getPayAmount());
+                case 2:
+                    return AlipayPayment(code,request.getPayAmount());
+                default:
+                    break;
+            }
+        }catch (Exception e){
+            ResultUtil.runErr();
         }
         return ResultUtil.success();
     }
 
-    private void AlipayPayment(BigDecimal payAmount) {
 
+
+    private ResultUtil AlipayPayment(String code,BigDecimal amount) {
+        ResultUtil alipay = payMoneyUtil.alipay("玩湃币充值", "", "", code, amount.toString(),
+                "/base/recharge/alipayRechargeCallback");
+        if(alipay.getCode() == 200){
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        int num = 1;
+                        int wait = 0;
+                        while (num <= 10){
+                            int min = 5000;
+                            wait += (min * num);
+                            Thread.sleep(wait);
+
+                            RechargeRecords records = rereMapper.selectOne(new QueryWrapper<RechargeRecords>()
+                                    .eq("code",code));
+                            if(records.getPayStatus() == 2){
+                                break;
+                            }
+                            ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryALIOrder(code);
+                            if(resultUtil.getCode() == 200 && records.getPayStatus() == 1){
+                                /**
+                                 * WAIT_BUYER_PAY(交易创建,等待买家付款)、
+                                 * TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、
+                                 * TRADE_SUCCESS(交易支付成功)、
+                                 * TRADE_FINISHED(交易结束,不可退款)
+                                 */
+                                Map<String, String> data1 = resultUtil.getData();
+                                String s = data1.get("tradeStatus");
+                                String tradeNo = data1.get("tradeNo");
+                                if("TRADE_CLOSED".equals(s) || "TRADE_FINISHED".equals(s) || num == 10){
+                                    records.setState(3);
+                                    rereMapper.deleteById(records.getId());
+                                    break;
+                                }
+                                if("TRADE_SUCCESS".equals(s)){
+                                    records.setPayStatus(2);
+                                    records.setOrderNumber(tradeNo);
+                                    rereMapper.updateById(records);
+                                    break;
+                                }
+                                if("WAIT_BUYER_PAY".equals(s)){
+                                    num++;
+                                }
+                            }
+                        }
+                    }catch (Exception e){
+                        e.printStackTrace();
+                    }
+                }
+            }).start();
+        }
+        return alipay;
+    }
+
+    private ResultUtil WeChatPayment(String code,BigDecimal amount) throws Exception {
+        ResultUtil weixinpay = payMoneyUtil.weixinpay("玩湃币充值", "", code, amount.toString(),
+                "/base/recharge/wechatRechargeCallback", "APP", "");
+        if(weixinpay.getCode() == 200){
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        int num = 1;
+                        int wait = 0;
+                        while (num <= 10){
+                            int min = 5000;
+                            wait += (min * num);
+                            Thread.sleep(wait);
+                            RechargeRecords records = rereMapper.selectOne(new QueryWrapper<RechargeRecords>()
+                                    .eq("code",code));
+                            if(records.getPayStatus() == 2){
+                                break;
+                            }
+                            ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryWXOrder(code, "");
+                            if(resultUtil.getCode() == 200 && records.getPayStatus() == 1){
+                                /**
+                                 * SUCCESS—支付成功,
+                                 * REFUND—转入退款,
+                                 * NOTPAY—未支付,
+                                 * CLOSED—已关闭,
+                                 * REVOKED—已撤销(刷卡支付),
+                                 * USERPAYING--用户支付中,
+                                 * PAYERROR--支付失败(其他原因,如银行返回失败)
+                                 */
+                                Map<String, String> data1 = resultUtil.getData();
+                                String s = data1.get("trade_state");
+                                String transaction_id = data1.get("transaction_id");
+                                if("REFUND".equals(s) || "NOTPAY".equals(s) || "CLOSED".equals(s) || "REVOKED".equals(s) || "PAYERROR".equals(s) || num == 10){
+                                    records.setState(3);
+                                    rereMapper.deleteById(records.getId());
+                                    break;
+                                }
+                                if("SUCCESS".equals(s)){
+                                    records.setPayStatus(2);
+                                    records.setOrderNumber(transaction_id);
+                                    rereMapper.updateById(records);
+                                    break;
+                                }
+                                if("USERPAYING".equals(s)){
+                                    num++;
+                                }
+                            }
+                        }
+                    }catch (Exception e){
+                        e.printStackTrace();
+                    }
+                }
+            }).start();
+        }
+        return weixinpay;
 
     }
 
-    private void WeChatPayment(BigDecimal payAmount) {
+    @Override
+    public ResultUtil addRechargeCallbackPay(String code, String orderNumber) {
+        RechargeRecords rechargeRecords = this.baseMapper.selectOne(new QueryWrapper<RechargeRecords>()
+                .eq("code", code));
+        if (rechargeRecords.getPayStatus() == 2){
+            return  ResultUtil.success();
+        }
+        rechargeRecords.setPayStatus(2);
+        rechargeRecords.setPayTime(new Date());
+        rechargeRecords.setOrderNumber(orderNumber);
+        this.baseMapper.updateById(rechargeRecords);
 
-
+        TAppUser tAppUser = tappMapper.selectById(rechargeRecords.getAppUserId());
+        tAppUser.setPlayPaiCoins(null == tAppUser.getPlayPaiCoins()? rechargeRecords.getPlayPaiCoins(): tAppUser.getPlayPaiCoins() +rechargeRecords.getPlayPaiCoins() );
+        tappMapper.updateById(tAppUser);
+        return null;
     }
+
 }
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 4e6c0fb..80663ea 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
@@ -9,10 +9,14 @@
 import com.dsh.account.entity.VipPayment;
 import com.dsh.account.enums.RechargeRecordEnum;
 import com.dsh.account.feignclient.activity.MerChandiseClient;
+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.competition.DeductionCompetitionsClient;
+import com.dsh.account.feignclient.competition.model.PaymentCompetition;
+import com.dsh.account.feignclient.course.CoursePackageClient;
 import com.dsh.account.feignclient.course.CoursePaymentClient;
-import com.dsh.account.feignclient.course.model.CourseOfStoreVo;
-import com.dsh.account.feignclient.course.model.QueryStoreList;
-import com.dsh.account.feignclient.course.model.StuCourseResp;
+import com.dsh.account.feignclient.course.model.*;
 import com.dsh.account.feignclient.other.ImgConfigClient;
 import com.dsh.account.feignclient.other.RechargeConfigClient;
 import com.dsh.account.feignclient.other.StoreClient;
@@ -26,14 +30,13 @@
 import com.dsh.account.model.JoinPlayPaiVo;
 import com.dsh.account.model.LoginSMSCodeVo;
 import com.dsh.account.model.LoginWeChatVo;
+import com.dsh.account.model.dto.Coupon;
 import com.dsh.account.model.vo.classDetails.CourseVenue;
 import com.dsh.account.model.vo.classDetails.ExerciseVideo;
 import com.dsh.account.model.vo.classDetails.RegisteredCourse;
 import com.dsh.account.model.vo.classDetails.WeekedCourse;
 import com.dsh.account.model.vo.classDetails.classInsVo.ClassInfoVo;
-import com.dsh.account.model.vo.userBenefitDetail.BillingDetailsVo;
-import com.dsh.account.model.vo.userBenefitDetail.IndexOfUserBenefirVo;
-import com.dsh.account.model.vo.userBenefitDetail.RechargeCentVo;
+import com.dsh.account.model.vo.userBenefitDetail.*;
 import com.dsh.account.service.TAppUserService;
 import com.dsh.account.util.*;
 import com.dsh.account.util.akeylogin.Md5Util;
@@ -41,13 +44,13 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -100,6 +103,15 @@
 
     @Resource
     private RechargeConfigClient reconMapper;
+
+    @Resource
+    private UserConponClient ucponClient;
+
+    @Resource
+    private CoursePackageClient cpageClient;
+
+    @Resource
+    private DeductionCompetitionsClient deducClient;
 
     @Override
     public ClassInfoVo queryUserOfStus(Integer id,String latitude,String longitude) {
@@ -490,11 +502,41 @@
             monthEnd = DateTimeHelper.getCurrentMouthEnd();
         }
 //            1.赛事报名
-//            2.课包购买
-
-//            3.场地预约
-//            4.智慧球场
-//            5.年度会员
+        List<PaymentCompetition> allCompetitionPayRecord = deducClient.getAllCompetitionPayRecord(appUserId);
+        if (allCompetitionPayRecord.size() > 0 ){
+            for (PaymentCompetition paymentCompetition : allCompetitionPayRecord) {
+                BillingDetailsVo.ConsumeDetail consumeDetail = new BillingDetailsVo.ConsumeDetail();
+                consumeDetail.setConsumeName(RechargeRecordEnum.EVENT_REGISTRATION.getMsg());
+                consumeDetail.setConsumeTime(simpleDateFormat.format(paymentCompetition.getInsertTime()));
+                consumeDetail.setConsumeAmount("-" + paymentCompetition.getAmount());
+                details.add(consumeDetail);
+            }
+        }
+//            2.取消赛事报名
+        List<PaymentCompetition> cancelOrderOfUserPayRecord = deducClient.getCancelOrderOfUserPayRecord(appUserId);
+        if (cancelOrderOfUserPayRecord.size() > 0 ){
+            for (PaymentCompetition paymentCompetition : cancelOrderOfUserPayRecord) {
+                BillingDetailsVo.ConsumeDetail consumeDetail = new BillingDetailsVo.ConsumeDetail();
+                consumeDetail.setConsumeName(RechargeRecordEnum.CANCEL_EVENT_REGISTRATION.getMsg());
+                consumeDetail.setConsumeTime(simpleDateFormat.format(paymentCompetition.getInsertTime()));
+                consumeDetail.setConsumeAmount("+" + paymentCompetition.getAmount());
+                details.add(consumeDetail);
+            }
+        }
+//            3.课包购买
+        List<TCoursePackagePayment> amountPayRecord = paymentClient.getAmountPayRecord(appUserId);
+        if (amountPayRecord.size() > 0 ){
+            for (TCoursePackagePayment coursePackagePayment : amountPayRecord) {
+                BillingDetailsVo.ConsumeDetail consumeDetail = new BillingDetailsVo.ConsumeDetail();
+                consumeDetail.setConsumeName(RechargeRecordEnum.COURSE_PACKAGE_PURCHASE.getMsg());
+                consumeDetail.setConsumeTime(simpleDateFormat.format(coursePackagePayment.getInsertTime()));
+                consumeDetail.setConsumeAmount("-" + coursePackagePayment.getCashPayment());
+                details.add(consumeDetail);
+            }
+        }
+//            4.场地预约
+//            5.智慧球场
+//            6.年度会员
         List<VipPayment> vipPayments = vipPaymentMapper.selectList(new QueryWrapper<VipPayment>()
                 .eq("payStatus", 2)
                 .eq("appUserId", appUserId)
@@ -504,11 +546,10 @@
                 BillingDetailsVo.ConsumeDetail consumeDetail = new BillingDetailsVo.ConsumeDetail();
                 consumeDetail.setConsumeName(RechargeRecordEnum.ANNUAL_MEMBERSHIP.getMsg());
                 consumeDetail.setConsumeTime(simpleDateFormat.format(vipPayment.getInsertTime()));
-                consumeDetail.setConsumeAmount("+" + vipPayment.getAmount());
+                consumeDetail.setConsumeAmount("-" + vipPayment.getAmount());
                 details.add(consumeDetail);
             }
         }
-//            6.续课
 //            7.充值
         List<RechargeRecords> rechargeRecords = rrMapper.selectList(new QueryWrapper<RechargeRecords>()
                 .eq("payStatus", 2)
@@ -519,7 +560,7 @@
                 BillingDetailsVo.ConsumeDetail consumeDetail = new BillingDetailsVo.ConsumeDetail();
                 consumeDetail.setConsumeName(RechargeRecordEnum.RECHARGE.getMsg() + ":" + rechargeRecord.getPlayPaiCoins());
                 consumeDetail.setConsumeTime(simpleDateFormat.format(rechargeRecord.getInsertTime()));
-                consumeDetail.setConsumeAmount("+" + rechargeRecord.getAmount());
+                consumeDetail.setConsumeAmount("-" + rechargeRecord.getAmount());
                 details.add(consumeDetail);
             }
         }
@@ -557,4 +598,144 @@
         return centVos;
     }
 
+    @Override
+    public PointMallDetailsResponse queryAppUserIntegral(MallRequest request, Integer userIdFormRedis) {
+        PointMallDetailsResponse detailsResponse = new PointMallDetailsResponse();
+        List<PointMallDetailsResponse.Goods> goods = new ArrayList<>();
+
+        TAppUser tAppUser = this.baseMapper.selectById(userIdFormRedis);
+        detailsResponse.setName(tAppUser.getName());
+        detailsResponse.setIntegral(tAppUser.getIntegral());
+        detailsResponse.setHeadImg(tAppUser.getHeadImg());
+
+        CommodityRequest commodityRequest = new CommodityRequest();
+        commodityRequest.setLon(request.getLon());
+        commodityRequest.setLat(request.getLat());
+        List<PointsMerchandise> vicinityGoods = mcClient.getVicinityGoods(commodityRequest);
+        if (vicinityGoods.size() > 0) {
+            for (PointsMerchandise vicinityGood : vicinityGoods) {
+                PointMallDetailsResponse.Goods commodity = new PointMallDetailsResponse.Goods();
+                switch (vicinityGood.getType()) {
+                    case 1:
+                        commodity.setGoodId(vicinityGood.getId());
+                        commodity.setGoodName(vicinityGood.getName());
+                        commodity.setGoodImg(vicinityGood.getCover());
+                        commodity.setCondition(vicinityGood.getRedemptionMethod());
+                        if (vicinityGood.getRedemptionMethod() == 1) {
+                            commodity.setIntegral(vicinityGood.getIntegral().intValue());
+                        } else {
+                            commodity.setIntegral(vicinityGood.getIntegral().intValue());
+                            commodity.setAmount(vicinityGood.getCash());
+                        }
+                        commodity.setBelongsType(vicinityGood.getUserPopulation());
+                        commodity.setGoodsType(1);
+                        commodity.setNums(mcClient.getRedeemedQuantity(vicinityGood.getId()));
+                        break;
+                    case 2:
+                        commodity.setGoodId(vicinityGood.getCoursePackageId());
+                        CoursePackage coursePackage = cpageClient.queryCoursePackageById(vicinityGood.getCoursePackageId());
+                        commodity.setGoodImg(coursePackage.getCoverDrawing());
+                        commodity.setGoodName(coursePackage.getName());
+                        commodity.setCondition(vicinityGood.getRedemptionMethod());
+                        if (vicinityGood.getRedemptionMethod() == 1) {
+                            commodity.setIntegral(vicinityGood.getIntegral().intValue());
+                        } else {
+                            commodity.setIntegral(vicinityGood.getIntegral().intValue());
+                            commodity.setAmount(vicinityGood.getCash());
+                        }
+                        commodity.setBelongsType(vicinityGood.getUserPopulation());
+                        commodity.setGoodsType(2);
+                        commodity.setNums(mcClient.getRedeemedQuantity(vicinityGood.getId()));
+                        break;
+                    case 3:
+                        commodity.setGoodId(vicinityGood.getId());
+                        commodity.setGoodName(vicinityGood.getName());
+                        commodity.setGoodImg(vicinityGood.getCover());
+                        commodity.setCondition(vicinityGood.getRedemptionMethod());
+                        if (vicinityGood.getRedemptionMethod() == 1) {
+                            commodity.setIntegral(vicinityGood.getIntegral().intValue());
+                        } else {
+                            commodity.setIntegral(vicinityGood.getIntegral().intValue());
+                            commodity.setAmount(vicinityGood.getCash());
+                        }
+                        commodity.setBelongsType(vicinityGood.getUserPopulation());
+                        commodity.setGoodsType(3);
+                        commodity.setNums(mcClient.getRedeemedQuantity(vicinityGood.getId()));
+                        break;
+                    default:
+                        break;
+                }
+                goods.add(commodity);
+            }
+        }
+        List<Coupon> allCoupons = ucponClient.getAllCoupons(commodityRequest);
+        if (allCoupons.size() > 0) {
+            for (Coupon allCoupon : allCoupons) {
+                PointMallDetailsResponse.Goods commodity = new PointMallDetailsResponse.Goods();
+                commodity.setGoodId(allCoupon.getId());
+                commodity.setGoodName(allCoupon.getName());
+                commodity.setCondition(allCoupon.getRedemptionMethod());
+                commodity.setGoodImg(allCoupon.getCover());
+                if (allCoupon.getRedemptionMethod() == 1) {
+                    commodity.setIntegral(allCoupon.getIntegral().intValue());
+                } else {
+                    commodity.setIntegral(allCoupon.getIntegral().intValue());
+                    commodity.setAmount(allCoupon.getCash());
+                }
+                commodity.setBelongsType(allCoupon.getUserPopulation());
+                commodity.setGoodsType(4);
+                commodity.setNums(ucponClient.getRedeemedQuantity(allCoupon.getId()));
+                goods.add(commodity);
+            }
+        }
+        if (StringUtils.hasText(request.getSearch())){
+            goods = goods.stream()
+                    .filter(merchandise -> merchandise.getGoodName().contains(request.getSearch()))
+                    .collect(Collectors.toList());
+        }
+        if (null != request.getRank()){
+            switch (request.getRank()){
+                case 1:
+                    goods = goods.stream()
+                            .sorted(Comparator.comparing(PointMallDetailsResponse.Goods::getIntegral).reversed())
+                            .collect(Collectors.toList());
+                    break;
+                case 2:
+                    goods = goods.stream()
+                            .sorted(Comparator.comparing(PointMallDetailsResponse.Goods::getIntegral))
+                            .collect(Collectors.toList());
+                    break;
+                case 3:
+                    goods = goods.stream()
+                            .sorted(Comparator.comparing(PointMallDetailsResponse.Goods::getNums).reversed())
+                            .collect(Collectors.toList());
+                    break;
+                default:
+                    break;
+            }
+
+        }
+        if (null != request.getGoodsType()){
+            goods = goods.stream()
+                    .filter(merchandise -> merchandise.getGoodsType().equals(request.getGoodsType()))
+                    .collect(Collectors.toList());
+        }
+        detailsResponse.setGoods(goods);
+        return detailsResponse;
+    }
+
+    @Override
+    public ResultUtil uploadAppUserHeadImg(Integer appUserId, MultipartFile file, HttpServletRequest request) {
+        try {
+            String filePath = OssUploadUtil.ossUpload(request,file);
+            TAppUser tAppUser = this.baseMapper.selectById(appUserId);
+            tAppUser.setHeadImg(filePath);
+            this.baseMapper.updateById(tAppUser);
+        } catch (IOException e) {
+            ResultUtil.error("头像上传失败!");
+        }
+
+        return ResultUtil.success();
+    }
+
 }
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 4ab69ac..e55dcac 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
@@ -37,10 +37,8 @@
 import com.dsh.account.model.vo.sourceDetail.CourseDetailsOfContinuationResp;
 import com.dsh.account.model.vo.sourceDetail.RecordTimeRequest;
 import com.dsh.account.service.TStudentService;
-import com.dsh.account.util.DateTimeHelper;
-import com.dsh.account.util.DateUtil;
-import com.dsh.account.util.ResultUtil;
-import com.dsh.account.util.ToolUtil;
+import com.dsh.account.util.*;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -99,6 +97,10 @@
 
     @Resource
     private ParticipantClient participantClient;
+
+
+    @Autowired
+    private PayMoneyUtil payMoneyUtil;
 
 
 
@@ -374,35 +376,183 @@
 
     @Override
     public ResultUtil renewClassPayment(Integer userIdFormRedis, ClasspaymentRequest request) {
-        // TODO: 2023/7/5 续课支付
-        switch (request.getPayType()){
-            case 1:
-                WeChatPayment();
-                break;
-            case 2:
-                AlipayPayment();
-                break;
-            case 3:
-                PlaypaiGoldPayment();
-                break;
-            default:
-                break;
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+        String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
+
+        TCoursePackagePayment packagePayment = new TCoursePackagePayment();
+        packagePayment.setCode(code);
+        packagePayment.setAppUserId(userIdFormRedis);
+        packagePayment.setStudentId(request.getStuId());
+        packagePayment.setCoursePackageId(request.getLessonId());
+        packagePayment.setPayType(request.getPayType());
+        packagePayment.setAbsencesNumber(0);
+        packagePayment.setPayUserType(1);
+        packagePayment.setPayStatus(1);
+        packagePayment.setPayUserId(userIdFormRedis);
+        packagePayment.setStatus(1);
+        packagePayment.setState(1);
+        packagePayment.setInsertTime(new Date());
+        couPayClient.savePaymentCoursePackage(packagePayment);
+
+        try {
+            switch (request.getPayType()) {
+                case 1:
+                    return WeChatPayment(code,request.getPayAmount());
+                case 2:
+                    return AlipayPayment(code,request.getPayAmount());
+                case 3:
+                    int i = PlaypaiGoldPayment(code,request);
+                    switch (i){
+                        case 1:
+                            return ResultUtil.success();
+                        case 2:
+                            return ResultUtil.error("用户未登录!");
+                        case 3:
+                            return ResultUtil.error("续课失败,玩湃币不足,请充值");
+                        case 4:
+                            return ResultUtil.error("续课失败,请联系管理员");
+                    }
+                default:
+                    break;
+            }
+        }catch (Exception e){
+            ResultUtil.runErr();
         }
         return ResultUtil.success();
     }
 
 
-    public void WeChatPayment(){
-
+    public ResultUtil WeChatPayment(String code,BigDecimal amount) throws Exception {
+        ResultUtil weixinpay = payMoneyUtil.weixinpay("课包续费", "", code, amount.toString(),
+                "/base/coursePackage/wechatPaymentCallback", "APP", "");
+        if(weixinpay.getCode() == 200){
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        int num = 1;
+                        int wait = 0;
+                        while (num <= 10){
+                            int min = 5000;
+                            wait += (min * num);
+                            Thread.sleep(wait);
+                            TCoursePackagePayment coursePackagePayment = couPayClient.getCoursePackagePaymentByCode(code);
+                            if(coursePackagePayment.getPayStatus() == 2){
+                                break;
+                            }
+                            ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryWXOrder(code, "");
+                            if(resultUtil.getCode() == 200 && coursePackagePayment.getPayStatus() == 1){
+                                /**
+                                 * SUCCESS—支付成功,
+                                 * REFUND—转入退款,
+                                 * NOTPAY—未支付,
+                                 * CLOSED—已关闭,
+                                 * REVOKED—已撤销(刷卡支付),
+                                 * USERPAYING--用户支付中,
+                                 * PAYERROR--支付失败(其他原因,如银行返回失败)
+                                 */
+                                Map<String, String> data1 = resultUtil.getData();
+                                String s = data1.get("trade_state");
+                                String transaction_id = data1.get("transaction_id");
+                                if("REFUND".equals(s) || "NOTPAY".equals(s) || "CLOSED".equals(s) || "REVOKED".equals(s) || "PAYERROR".equals(s) || num == 10){
+                                    coursePackagePayment.setState(3);
+                                    couPayClient.delPaymentCoursePackage(coursePackagePayment.getId());
+                                    break;
+                                }
+                                if("SUCCESS".equals(s)){
+                                    coursePackagePayment.setPayStatus(2);
+                                    coursePackagePayment.setOrderNumber(transaction_id);
+                                    couPayClient.updatePaymentCoursePackage(coursePackagePayment);
+                                    break;
+                                }
+                                if("USERPAYING".equals(s)){
+                                    num++;
+                                }
+                            }
+                        }
+                    }catch (Exception e){
+                        e.printStackTrace();
+                    }
+                }
+            }).start();
+        }
+        return weixinpay;
     }
 
-    public void AlipayPayment(){
-
+    public ResultUtil AlipayPayment(String code,BigDecimal amount){
+        ResultUtil alipay = payMoneyUtil.alipay("课包续费", "", "", code, amount.toString(),
+                "/base/coursePackage/alipayPaymentCallback");
+        if(alipay.getCode() == 200){
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        int num = 1;
+                        int wait = 0;
+                        while (num <= 10){
+                            int min = 5000;
+                            wait += (min * num);
+                            Thread.sleep(wait);
+                            TCoursePackagePayment coursePackagePayment = couPayClient.getCoursePackagePaymentByCode(code);
+                            if(coursePackagePayment.getPayStatus() == 2){
+                                break;
+                            }
+                            ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryALIOrder(code);
+                            if(resultUtil.getCode() == 200 && coursePackagePayment.getPayStatus() == 1){
+                                /**
+                                 * WAIT_BUYER_PAY(交易创建,等待买家付款)、
+                                 * TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、
+                                 * TRADE_SUCCESS(交易支付成功)、
+                                 * TRADE_FINISHED(交易结束,不可退款)
+                                 */
+                                Map<String, String> data1 = resultUtil.getData();
+                                String s = data1.get("tradeStatus");
+                                String tradeNo = data1.get("tradeNo");
+                                if("TRADE_CLOSED".equals(s) || "TRADE_FINISHED".equals(s) || num == 10){
+                                    coursePackagePayment.setState(3);
+                                    couPayClient.delPaymentCoursePackage(coursePackagePayment.getId());
+                                    break;
+                                }
+                                if("TRADE_SUCCESS".equals(s)){
+                                    coursePackagePayment.setPayStatus(2);
+                                    coursePackagePayment.setOrderNumber(tradeNo);
+                                    couPayClient.updatePaymentCoursePackage(coursePackagePayment);
+                                    break;
+                                }
+                                if("WAIT_BUYER_PAY".equals(s)){
+                                    num++;
+                                }
+                            }
+                        }
+                    }catch (Exception e){
+                        e.printStackTrace();
+                    }
+                }
+            }).start();
+        }
+        return alipay;
     }
 
-    public void PlaypaiGoldPayment(){
-
+    public int PlaypaiGoldPayment(String code,ClasspaymentRequest request){
+        PlayPaiGoldCoursePackage paiGoldCoursePackage = new PlayPaiGoldCoursePackage();
+        paiGoldCoursePackage.setCoursePackageId(request.getLessonId());
+        paiGoldCoursePackage.setStuId(request.getStuId());
+        paiGoldCoursePackage.setCoursePayConfigId(request.getCourseConfigId());
+        paiGoldCoursePackage.setCode(code);
+        return couPayClient.paymentWanpaiRenewCourse(paiGoldCoursePackage);
     }
 
 
+    @Override
+    public ResultUtil insertVipPaymentCallback(String code, String orderNumber) {
+        TCoursePackagePayment coursePackagePayment = couPayClient.getCoursePackagePaymentByCode(code);
+        if(coursePackagePayment.getPayStatus() != 1){
+            return ResultUtil.success();
+        }
+        coursePackagePayment.setPayStatus(2);
+        coursePackagePayment.setOrderNumber(orderNumber);
+        couPayClient.updatePaymentCoursePackage(coursePackagePayment);
+        return ResultUtil.success();
+    }
+
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/util/OssUploadUtil.java b/cloud-server-account/src/main/java/com/dsh/account/util/OssUploadUtil.java
new file mode 100644
index 0000000..5d7b3a7
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/util/OssUploadUtil.java
@@ -0,0 +1,39 @@
+package com.dsh.account.util;
+
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.model.ObjectMetadata;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.UUID;
+
+public class OssUploadUtil {
+	//OSS图片访问域名
+	public static String oss_domain = "https://newok.oss-cn-shenzhen.aliyuncs.com/";
+	public static String accessKeyId = "LTAI4G9Zez9H4B36vakPXGy4";
+	public static String accessKeySecret = "BOVPUeZndKVbrPOq6Ef5j6oiydB3XZ";
+	public static String bucketName="newok";
+	public static String endpoint = "oss-cn-shenzhen.aliyuncs.com";
+	
+	public static OSSClient ossClient = new OSSClient(endpoint, accessKeyId,accessKeySecret);
+	
+	public static String ossUpload(HttpServletRequest request, MultipartFile file) throws IOException{
+		//CommonsMultipartFile file = (CommonsMultipartFile)multipartFile;
+		String fileName = "";
+			if(file!=null && !"".equals(file.getOriginalFilename()) && file.getOriginalFilename()!=null){
+				InputStream content = file.getInputStream();//获得指定文件的输入流
+				ObjectMetadata meta = new ObjectMetadata();// 创建上传Object的Metadata
+				meta.setContentLength(file.getSize());  // 必须设置ContentLength
+				String originalFilename = file.getOriginalFilename();
+				fileName =  UUID.randomUUID().toString().replaceAll("-","") + originalFilename.subSequence(originalFilename.lastIndexOf("."), originalFilename.length());
+				ossClient.putObject(bucketName,"img/"+fileName,content,meta);// 上传Object.
+				if(fileName != null && !"".equals(fileName)){
+					System.out.println(fileName);
+					fileName = oss_domain+"img/"+fileName;
+				}
+			}
+		return fileName;
+	}
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java
index c1fceaf..a3feebf 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java
@@ -1,11 +1,15 @@
 package com.dsh.activity.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.dsh.activity.entity.Coupon;
+import com.dsh.activity.entity.UserCoupon;
 import com.dsh.activity.model.CouponListVo;
+import com.dsh.activity.model.request.CommodityRequest;
 import com.dsh.activity.model.request.CouponPackageReq;
 import com.dsh.activity.model.response.CouponPackageResp;
 import com.dsh.activity.service.ICouponService;
 import com.dsh.activity.service.UserCouponService;
+import com.dsh.activity.util.GDMapGeocodingUtil;
 import com.dsh.activity.util.ResultUtil;
 import com.dsh.activity.util.TokenUtil;
 import io.swagger.annotations.ApiImplicitParam;
@@ -14,7 +18,10 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * @author zhibing.pu
@@ -32,6 +39,9 @@
 
     @Autowired
     private UserCouponService ucService;
+
+    @Autowired
+    private GDMapGeocodingUtil gdMapGeocodingUtil;
 
 
 
@@ -103,4 +113,46 @@
         }
     }
 
+
+    @PostMapping("/base/coupon/getAllCoupons")
+    public List<Coupon> getAllCoupons(@RequestBody CommodityRequest request){
+        String provinceCode = "";
+        String cityCode = "";
+        try {
+            Map<String, String> geocode = gdMapGeocodingUtil.geocode(request.getLon(), request.getLat());
+            provinceCode = geocode.get("provinceCode");
+            cityCode = geocode.get("cityCode");
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        try {
+            Integer userAppId = tokenUtil.getUserIdFormRedis();
+            List<UserCoupon> list = ucService.list(new QueryWrapper<UserCoupon>()
+                    .eq("userId",userAppId ));
+            List<Coupon> couponList = couponService.list(new QueryWrapper<Coupon>()
+                    .eq("auditStatus",2)
+                    .eq("state",1)
+                    .eq("status",2));
+            if (couponList.size() > 0 ){
+                Iterator<Coupon> iterator = couponList.iterator();
+                while (iterator.hasNext()) {
+                    Coupon merchandise = iterator.next();
+                    if (merchandise.getUseScope() == 2 && (!Objects.equals(merchandise.getCityCode(), cityCode) && !Objects.equals(merchandise.getProvinceCode(), provinceCode))) {
+                        iterator.remove(); // 移除符合条件的商品
+                    }
+                }
+            }
+            return couponList;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+
+    @PostMapping("/base/coupon/getRedeemedNums")
+    public int getRedeemedQuantity(@RequestBody Integer id){
+        return ucService.count(new QueryWrapper<UserCoupon>()
+                .eq("couponId",id));
+    }
+
 }
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 9e61d1e..e326ec9 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
@@ -3,16 +3,19 @@
 
 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.model.request.CommodityRequest;
 import com.dsh.activity.service.PointsMerchandiseService;
+import com.dsh.activity.service.UserPointsMerchandiseService;
+import com.dsh.activity.util.GDMapGeocodingUtil;
 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.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 @RestController
 @RequestMapping("")
@@ -21,6 +24,12 @@
 
     @Autowired
     private PointsMerchandiseService pmdsService;
+
+    @Autowired
+    private GDMapGeocodingUtil gdMapGeocodingUtil;
+
+    @Autowired
+    private UserPointsMerchandiseService upmseService;
 
 
 
@@ -43,4 +52,37 @@
         return commodity;
     }
 
+
+    @PostMapping("/base/pointMerchars/getCommoditys")
+    public List<PointsMerchandise> getVicinityGoods(@RequestBody CommodityRequest request){
+        String provinceCode = "";
+        String cityCode = "";
+        try {
+            Map<String, String> geocode = gdMapGeocodingUtil.geocode(request.getLon(), request.getLat());
+            provinceCode = geocode.get("provinceCode");
+            cityCode = geocode.get("cityCode");
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
+        List<PointsMerchandise> list = pmdsService.list(new QueryWrapper<PointsMerchandise>()
+                .eq("state", 1));
+        if (list.size() > 0 ){
+            Iterator<PointsMerchandise> iterator = list.iterator();
+            while (iterator.hasNext()) {
+                PointsMerchandise merchandise = iterator.next();
+                if (merchandise.getUseScope() == 2 && (!Objects.equals(merchandise.getCityCode(), cityCode) && !Objects.equals(merchandise.getProvinceCode(), provinceCode))) {
+                    iterator.remove(); // 移除符合条件的商品
+                }
+            }
+        }
+        return list;
+    }
+
+    @PostMapping("/base/pointMerchars/getRedeemedNums")
+    public int getRedeemedQuantity(@RequestBody Integer goodId){
+        return upmseService.count(new QueryWrapper<UserPointsMerchandise>()
+                .eq("pointsMerchandiseId",goodId));
+    }
+
 }
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/Coupon.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/Coupon.java
index fe57f32..02e3e18 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/entity/Coupon.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/Coupon.java
@@ -158,6 +158,16 @@
     @TableField("insertTime")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date insertTime;
+    /**
+     * 封面图
+     */
+    @TableField("cover")
+    private String cover;
+    /**
+     * 图片
+     */
+    @TableField("productImages")
+    private String productImages;
 
 
     @Override
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 41d7f40..fe612bd 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
@@ -1,9 +1,12 @@
 package com.dsh.activity.feignclient;
 
 
+import com.dsh.activity.entity.PointsMerchandise;
 import com.dsh.activity.feignclient.model.IntegralCommodity;
+import com.dsh.activity.model.request.CommodityRequest;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.List;
 
@@ -13,5 +16,10 @@
     @PostMapping("/base/pointMerchars/convertGoods")
     public List<IntegralCommodity> getConvertibleGoods();
 
+    @PostMapping("/base/pointMerchars/getCommoditys")
+    public List<PointsMerchandise> getVicinityGoods(@RequestBody CommodityRequest request);
+
+    @PostMapping("/base/pointMerchars/getRedeemedNums")
+    public int getRedeemedQuantity(@RequestBody Integer goodId);
 
 }
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/UserConponClient.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/UserConponClient.java
index c13d4af..496b9c8 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/UserConponClient.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/UserConponClient.java
@@ -1,8 +1,11 @@
 package com.dsh.activity.feignclient;
 
+import com.dsh.activity.entity.Coupon;
 import com.dsh.activity.feignclient.model.CouponStuAvailableVo;
+import com.dsh.activity.model.request.CommodityRequest;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
@@ -14,4 +17,11 @@
     @PostMapping("/base/userConpon/getStuOfConpons")
     public List<CouponStuAvailableVo> queryUserWithConponList(@RequestParam("appUserId") Integer appUserId);
 
+    @PostMapping("/base/coupon/getAllCoupons")
+    public List<Coupon> getAllCoupons(@RequestBody CommodityRequest request);
+
+
+    @PostMapping("/base/coupon/getRedeemedNums")
+    public int getRedeemedQuantity(@RequestBody Integer id);
+
 }
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/CoursePackage.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/CoursePackage.java
index 3d6097c..1b31933 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/CoursePackage.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/CoursePackage.java
@@ -81,7 +81,7 @@
      */
     private Integer sort;
     /**
-     * 支付方式(1=现金,2=玩湃币)
+     * 支付方式(1=微信 2=支付宝 3=玩湃币)
      */
     private Integer payType;
     /**
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/model/request/CommodityRequest.java b/cloud-server-activity/src/main/java/com/dsh/activity/model/request/CommodityRequest.java
new file mode 100644
index 0000000..e98eb6d
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/model/request/CommodityRequest.java
@@ -0,0 +1,18 @@
+package com.dsh.activity.model.request;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class CommodityRequest {
+
+    @ApiModelProperty(value = "经度")
+    private String lon;
+
+    @ApiModelProperty(value = "纬度")
+    private String lat;
+
+
+
+}
diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java b/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java
index dfbb732..2ba5aa7 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java
@@ -63,8 +63,38 @@
     private IPaymentCompetitionService paymentCompetitionService;
 
 
+    @PostMapping("/base/competition/getPayedCompetitions")
+    public List<PaymentCompetition> getAllCompetitionPayRecord(@RequestBody Integer appUserId){
+        List<Integer> integers = new ArrayList<>();
+        integers.add(1);
+        integers.add(2);
+        return paymentCompetitionService.list(new QueryWrapper<PaymentCompetition>()
+                .in("payType",integers)
+                .eq("appUserId",appUserId)
+                .eq("payStatus",2));
+    }
 
 
+    @PostMapping("/base/competition/getCancelOrderOfUserPay")
+    public List<PaymentCompetition> getCancelOrderOfUserPayRecord(@RequestBody Integer appUserId){
+        List<Integer> integers = new ArrayList<>();
+        integers.add(1);
+        integers.add(2);
+        return paymentCompetitionService.list(new QueryWrapper<PaymentCompetition>()
+                .in("payType",integers)
+                .eq("appUserId",appUserId)
+                .eq("payStatus",3));
+    }
+
+
+    @PostMapping("/base/competition/getPlayPaiFGoldPayRecord")
+    public List<PaymentCompetition> getPlayPaiFGoldPayRecord(@RequestBody Integer appUserId){
+        return paymentCompetitionService.list(new QueryWrapper<PaymentCompetition>()
+                .eq("payType",3)
+                .eq("appUserId",appUserId)
+                .eq("payStatus",3));
+    }
+
 
 
     @PostMapping("/base/competition/getCompetitionsDetails")
diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/feignclient/DeductionCompetitionsClient.java b/cloud-server-competition/src/main/java/com/dsh/competition/feignclient/DeductionCompetitionsClient.java
index e23d5b5..c7292bb 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/feignclient/DeductionCompetitionsClient.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/feignclient/DeductionCompetitionsClient.java
@@ -1,6 +1,7 @@
 package com.dsh.competition.feignclient;
 
 
+import com.dsh.competition.entity.PaymentCompetition;
 import com.dsh.competition.feignclient.model.GetStuSourseList;
 import com.dsh.competition.feignclient.model.PurchaseRecordVo;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -15,4 +16,13 @@
     @PostMapping("/base/competition/getCompetitionsDetails")
     public List<PurchaseRecordVo> getStuSourseList(@RequestBody GetStuSourseList sourseList);
 
+    @PostMapping("/base/competition/getPayedCompetitions")
+    List<PaymentCompetition> getAllCompetitionPayRecord(@RequestBody Integer appUserId);
+
+    @PostMapping("/base/competition/getCancelOrderOfUserPay")
+    public List<PaymentCompetition> getCancelOrderOfUserPayRecord(@RequestBody Integer appUserId);
+
+    @PostMapping("/base/competition/getPlayPaiFGoldPayRecord")
+    List<PaymentCompetition> getPlayPaiFGoldPayRecord(@RequestBody Integer appUserId);
+
 }
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 90843b4..2159d03 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
@@ -56,7 +56,9 @@
     @ApiOperation(value = "本周福利-限时折扣列表", tags = {"APP-使用福利"})
     @ApiImplicitParams({
             @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
-            @ApiImplicitParam(name = "discountType",value = "默认显示 限时折扣 (1限时折扣 2赠送课时)")
+            @ApiImplicitParam(name = "discountType",value = "默认显示 限时折扣 (1限时折扣 2赠送课时)",dataType = "int"),
+            @ApiImplicitParam(name = "lon",value = "经度",dataType = "String"),
+            @ApiImplicitParam(name = "lat",value = "纬度",dataType = "String"),
     })
     public ResultUtil<WeekLimitedResponse> thisWeeksBenefitList(Integer discountType,String lon,String lat){
         try {
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 1b0d7a6..574528c 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
@@ -2,29 +2,20 @@
 
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.dsh.course.entity.TCoursePackage;
-import com.dsh.course.entity.TCoursePackageDiscount;
-import com.dsh.course.entity.TCoursePackagePayment;
-import com.dsh.course.entity.TCoursePackageType;
 import com.dsh.course.entity.*;
-import com.dsh.course.feignclient.account.StudentClient;
+import com.dsh.course.feignclient.account.AppUserClient;
+import com.dsh.course.feignclient.account.model.AppUser;
 import com.dsh.course.feignclient.model.*;
 import com.dsh.course.model.BaseVo;
 import com.dsh.course.model.dto.DiscountJsonDto;
 import com.dsh.course.model.vo.CourseDetailRequest;
 import com.dsh.course.model.vo.RegisterCourseVo;
-import com.dsh.course.model.vo.request.ClasspaymentRequest;
-import com.dsh.course.model.vo.request.CourseOfAfterRequest;
-import com.dsh.course.model.vo.request.CourseWithDetailsRequest;
-import com.dsh.course.model.vo.request.UpdateCourseVideoStatusRequest;
+import com.dsh.course.model.vo.request.*;
 import com.dsh.course.model.vo.response.AppUserVideoResponse;
 import com.dsh.course.model.vo.response.CourseDetailsResponse;
 import com.dsh.course.model.vo.response.CourseOfVideoResponse;
 import com.dsh.course.service.*;
-import com.dsh.course.util.DateUtil;
-import com.dsh.course.util.ResultUtil;
-import com.dsh.course.util.StrUtils;
-import com.dsh.course.util.TokenUtil;
+import com.dsh.course.util.*;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import io.swagger.annotations.Api;
@@ -72,6 +63,17 @@
     private CancelledClassesService cacService;
 
     @Autowired
+    private ICoursePackagePaymentConfigService icppcService;
+
+    @Autowired
+    private UserVideoDetailsService uvdsService;
+
+    @Autowired
+    private TCourseService tcService;
+
+
+
+    @Autowired
     private TCoursePackageTypeService coursePackageTypeService;
 
     @Autowired
@@ -79,6 +81,9 @@
 
     @Autowired
     private CancelledClassesService cancelledClassesService;
+
+    @Autowired
+    private AppUserClient appuClient;
 
     private final SimpleDateFormat format = new SimpleDateFormat("MM-dd HH:mm");
 
@@ -304,11 +309,23 @@
     @PostMapping("/base/coursePack/afterCourseTwos")
     public List<AfterVideoVo> getAfterCourseTwos(@RequestParam("appUserId") Integer appUserId){
         List<AfterVideoVo> videoVos = new ArrayList<>();
-        List<TCoursePackagePayment> tCoursePackagePayments = packagePaymentService.list(new QueryWrapper<TCoursePackagePayment>()
-                .eq("appUserId", appUserId));
-        List<Integer> coursePackageIds = tCoursePackagePayments.stream().map(TCoursePackagePayment::getCoursePackageId).collect(Collectors.toList());
-//        List<PostCourseVideo> videoList = pcvService.queryAllVideoNoneShow(coursePackageIds);
-        // TODO: 2023/7/6 两个课后视频
+        List<UserVideoDetails> list = uvdsService.list(new QueryWrapper<UserVideoDetails>()
+                .eq("appUserId",appUserId)
+                .eq("state",1));
+        if (list.size() > 0 ){
+            List<Integer> courseIds = list.stream().map(UserVideoDetails::getCourseId).collect(Collectors.toList());
+            List<TCourse> courseList = tcService.list(new QueryWrapper<TCourse>()
+                    .in("id",courseIds)
+                    .eq("type",1)
+                    .eq("state",1)
+                    .last("ORDER BY insertTime desc LIMIT 2"));
+            for (TCourse tCourse : courseList) {
+                AfterVideoVo videoVo = new AfterVideoVo();
+                videoVo.setCourseId(tCourse.getId());
+                videoVo.setCourseUrl(tCourse.getCourseVideo());
+                videoVos.add(videoVo);
+            }
+        }
         return videoVos;
     }
 
@@ -317,6 +334,15 @@
         return packagePaymentService.list(new QueryWrapper<TCoursePackagePayment>()
                 .eq("appUserId",appUserId)
                 .eq("payType",3)
+                .eq("payStatus",2)
+                .eq("state",1));
+    }
+
+    @PostMapping("/base/coursePack/allAmountPayRecordOfUser")
+    public List<TCoursePackagePayment> getAmountPayRecord(@RequestBody Integer appUserId){
+        return packagePaymentService.list(new QueryWrapper<TCoursePackagePayment>()
+                .eq("appUserId",appUserId)
+                .notIn("payType",3)
                 .eq("payStatus",2)
                 .eq("state",1));
     }
@@ -478,14 +504,15 @@
     @ApiOperation(value = "已报名课程详情", tags = {"APP-开始上课"})
     @ApiImplicitParams({
             @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
+            @ApiImplicitParam(name = "coursePayId" ,value = "课包记录id",dataType = "long"),
     })
-    public ResultUtil<CourseDetailsResponse> getRegisteredData( Integer coursePackageId){
+    public ResultUtil<CourseDetailsResponse> getRegisteredData( Integer coursePayId){
         try {
             Integer appUserId = tokenUtil.getUserIdFormRedis();
             if(null == appUserId){
                 return ResultUtil.tokenErr();
             }
-            return ResultUtil.success(packagePaymentService.queryRegisteredCourseDetails(coursePackageId,appUserId));
+            return ResultUtil.success(packagePaymentService.queryRegisteredCourseDetails(coursePayId,appUserId));
         }catch (Exception e){
             return ResultUtil.runErr();
         }
@@ -605,4 +632,61 @@
             e.printStackTrace();
         }
     }
+
+
+    /**
+     * 课包续费玩湃币支付
+     * @param
+     */
+    @PostMapping("/coursePackagePayment/courseRenewPlayPaiPay")
+    public int paymentWanpaiRenewCourse(@RequestBody PlayPaiGoldCoursePackage coursePackage){
+        try {
+            Integer userIdFormRedis = tokenUtil.getUserIdFormRedis();
+            if (null == userIdFormRedis){
+                return 2;
+            }
+            CoursePackagePaymentConfig paymentConfig = icppcService.getById(coursePackage.getCoursePayConfigId());
+            AppUser appUser = appuClient.queryAppUser(userIdFormRedis);
+            if (appUser.getPlayPaiCoins() < paymentConfig.getPlayPaiCoin()){
+                return 3;
+            }
+            TCoursePackagePayment packagePayment = packagePaymentService.getOne(new QueryWrapper<TCoursePackagePayment>()
+                    .eq("code",coursePackage.getCode() ));
+            packagePayment.setPayStatus(2);
+            packagePayment.setPayUserId(userIdFormRedis);
+            packagePayment.setClassHours(paymentConfig.getClassHours());
+            packagePayment.setPlayPaiCoin(paymentConfig.getPlayPaiCoin());
+            packagePayment.setTotalClassHours(paymentConfig.getClassHours());
+            packagePayment.setLaveClassHours(paymentConfig.getClassHours());
+            packagePaymentService.updateById(packagePayment);
+
+            appUser.setPlayPaiCoins(appUser.getPlayPaiCoins()-paymentConfig.getPlayPaiCoin());
+            appuClient.updateAppUser(appUser);
+        } catch (Exception e) {
+            return 4;
+        }
+        return 1;
+    }
+
+    @PostMapping("/base/coursePack/getPaymentCoursePackage")
+    public TCoursePackagePayment getCoursePackagePaymentByCode(@RequestBody String code){
+        return packagePaymentService.getOne(new QueryWrapper<TCoursePackagePayment>()
+                .eq("code",code));
+    }
+
+    @PostMapping("/base/coursePack/delPaymentCoursePackage")
+    public boolean delPaymentCoursePackage(@RequestBody Integer payId){
+        return packagePaymentService.removeById(payId);
+    }
+    @PostMapping("/base/coursePack/updatePaymentCoursePackage")
+    public boolean updatePaymentCoursePackage(@RequestBody TCoursePackagePayment packagePayment){
+        return packagePaymentService.update(packagePayment,new QueryWrapper<TCoursePackagePayment>()
+                .eq("id",packagePayment.getId()));
+    }
+
+    @PostMapping("/base/coursePack/savePaymentCoursePackage")
+    public boolean savePaymentCoursePackage(@RequestBody TCoursePackagePayment packagePayment){
+        return packagePaymentService.save(packagePayment);
+    }
+
 }
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 68b1d06..d081599 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
@@ -3,6 +3,7 @@
 
 import com.dsh.course.entity.TCoursePackagePayment;
 import com.dsh.course.feignclient.model.*;
+import com.dsh.course.model.vo.request.PlayPaiGoldCoursePackage;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -35,4 +36,26 @@
 
     @PostMapping("/base/coursePack/allPaymentCourseList")
     public List<TCoursePackagePayment> getAppuserCourseList(@RequestBody Integer appUserId);
+
+
+    @PostMapping("/coursePackagePayment/courseRenewPlayPaiPay")
+    public int paymentWanpaiRenewCourse(@RequestBody PlayPaiGoldCoursePackage coursePackage);
+
+    @PostMapping("/base/coursePack/getPaymentCoursePackage")
+    public TCoursePackagePayment getCoursePackagePaymentByCode(@RequestBody String payId);
+
+
+    @PostMapping("/base/coursePack/delPaymentCoursePackage")
+    public boolean delPaymentCoursePackage(@RequestBody Integer payId);
+
+    @PostMapping("/base/coursePack/updatePaymentCoursePackage")
+    public boolean updatePaymentCoursePackage(@RequestBody TCoursePackagePayment packagePayment);
+
+
+    @PostMapping("/base/coursePack/savePaymentCoursePackage")
+    public boolean savePaymentCoursePackage(@RequestBody TCoursePackagePayment packagePayment);
+
+    @PostMapping("/base/coursePack/allAmountPayRecordOfUser")
+    public List<TCoursePackagePayment> getAmountPayRecord(@RequestBody Integer appUserId);
+
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/vo/RegisterCourseVo.java b/cloud-server-course/src/main/java/com/dsh/course/model/vo/RegisterCourseVo.java
index c9dc4d5..6ad8055 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/model/vo/RegisterCourseVo.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/vo/RegisterCourseVo.java
@@ -10,6 +10,9 @@
     @ApiModelProperty(value = "课包id")
     private Integer coursePackageId;
 
+    @ApiModelProperty(value = "课包记录id")
+    private Long coursePayId;
+
     @ApiModelProperty(value = "课包封面图")
     private String packageImg;
 
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/vo/request/ClasspaymentRequest.java b/cloud-server-course/src/main/java/com/dsh/course/model/vo/request/ClasspaymentRequest.java
index e8cada9..f56ccc1 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/model/vo/request/ClasspaymentRequest.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/vo/request/ClasspaymentRequest.java
@@ -22,8 +22,8 @@
     @ApiModelProperty(value = "优惠券Id")
     private Integer conponId;
 
-    @ApiModelProperty(value = "课时id")
-    private Long courseConfigId;
+    @ApiModelProperty(value = "支付记录id")
+    private Long coursePayId;
 
 
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/vo/request/PlayPaiGoldCoursePackage.java b/cloud-server-course/src/main/java/com/dsh/course/model/vo/request/PlayPaiGoldCoursePackage.java
new file mode 100644
index 0000000..37cd6cc
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/vo/request/PlayPaiGoldCoursePackage.java
@@ -0,0 +1,22 @@
+package com.dsh.course.model.vo.request;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PlayPaiGoldCoursePackage {
+
+    @ApiModelProperty(value = "支付配置id")
+    Integer coursePayConfigId;
+
+    @ApiModelProperty(value = "学员id")
+    Integer stuId;
+
+    @ApiModelProperty(value = "课包id")
+    Integer coursePackageId;
+
+    @ApiModelProperty(value = "课包id")
+    String code;
+
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/vo/response/CourseDetailsResponse.java b/cloud-server-course/src/main/java/com/dsh/course/model/vo/response/CourseDetailsResponse.java
index 820d95d..d98b2db 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/model/vo/response/CourseDetailsResponse.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/vo/response/CourseDetailsResponse.java
@@ -10,6 +10,9 @@
     @ApiModelProperty(value = "课包id")
     private Integer coursePackageId;
 
+    @ApiModelProperty(value = "支付记录id")
+    private Long coursePayId;
+
     @ApiModelProperty(value = "课包封面图")
     private String coverDrawing;
 
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 35a855e..8d57092 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
@@ -67,11 +67,11 @@
 
     /**
      * 获取已报名课包详情
-     * @param coursePackageId
+     * @param coursePayId
      * @param appUserId
      * @return
      */
-    CourseDetailsResponse queryRegisteredCourseDetails(Integer coursePackageId, Integer appUserId);
+    CourseDetailsResponse queryRegisteredCourseDetails(Integer coursePayId, Integer appUserId);
 
 
 
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 e147946..93feb54 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
@@ -6,7 +6,9 @@
 import com.dsh.course.feignclient.account.CoachClient;
 import com.dsh.course.feignclient.account.model.Coach;
 import com.dsh.course.feignclient.activity.BenefitVideoClient;
+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.other.StoreClient;
 import com.dsh.course.feignclient.other.model.Store;
 import com.dsh.course.mapper.*;
@@ -20,8 +22,10 @@
 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.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,6 +33,7 @@
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -74,6 +79,11 @@
     @Resource
     private TCoursePackageDiscountMapper tcpdMapper;
 
+    @Resource
+    private CouponClient client;
+
+    @Autowired
+    private PayMoneyUtil payMoneyUtil;
 
 
     /**
@@ -178,6 +188,7 @@
                 TCoursePackage coursePackage = tcpmapper.selectById(tCoursePackagePayment.getCoursePackageId());
                 Store store = stoClient.queryStoreById(coursePackage.getStoreId());
                 RegisterCourseVo registerCourseVo = new RegisterCourseVo();
+                registerCourseVo.setCoursePayId(tCoursePackagePayment.getId());
                 registerCourseVo.setCoursePackageId(tCoursePackagePayment.getCoursePackageId());
                 registerCourseVo.setPackageImg(coursePackage.getCoverDrawing());
                 String storeAndCourse = coursePackage.getName()+"("+ store.getName() +")";
@@ -197,18 +208,16 @@
     }
 
     @Override
-    public CourseDetailsResponse queryRegisteredCourseDetails(Integer coursePackageId, Integer appUserId) {
+    public CourseDetailsResponse queryRegisteredCourseDetails(Integer coursePayId, Integer appUserId) {
         CourseDetailsResponse response = new CourseDetailsResponse();
-        List<TCoursePackagePayment> tCoursePackagePayments = this.list(new QueryWrapper<TCoursePackagePayment>()
-                .eq("coursePackageId",coursePackageId )
-                .eq("appUserId",appUserId));
+        TCoursePackagePayment tCoursePackagePayment = this.baseMapper.selectById(coursePayId);
 
-        if (tCoursePackagePayments.size() > 0){
-            TCoursePackagePayment tCoursePackagePayment = tCoursePackagePayments.get(0);
+        if (null != tCoursePackagePayment){
             TCoursePackage coursePackage = tcpmapper.selectById(tCoursePackagePayment.getCoursePackageId());
             response.setCoursePackageId(tCoursePackagePayment.getCoursePackageId());
             response.setCoverDrawing(coursePackage.getCoverDrawing());
             response.setCoursePackageName(coursePackage.getName());
+            response.setCoursePayId(tCoursePackagePayment.getId());
             List<Integer> integers = StrUtils.dealStrToList(coursePackage.getClassWeeks());
             if (integers.size() > 0){
                 StringBuilder courWeeks = new StringBuilder("每");
@@ -282,16 +291,39 @@
 
     @Override
     public ResultUtil ContinuationOrpaymentCourse(Integer userIdFormRedis, ClasspaymentRequest request) {
-        // TODO: 2023/7/5 报名课程支付
+        TCoursePackagePayment tCoursePackagePayment = this.baseMapper.selectById(request.getCoursePayId());
+        String code = "";
+        if (tCoursePackagePayment.getPayStatus() == 1){
+            code = tCoursePackagePayment.getCode();
+        }else {
+            TCoursePackagePayment newPayment = new TCoursePackagePayment();
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+            newPayment.setCode(sdf.format(new Date()) + UUIDUtil.getNumberRandom(5));
+            newPayment.setAppUserId(userIdFormRedis);
+            newPayment.setStudentId(request.getStuId());
+            newPayment.setCoursePackageId(request.getLessonId());
+            newPayment.setClassHours(tCoursePackagePayment.getClassHours());
+            newPayment.setOriginalPrice(tCoursePackagePayment.getOriginalPrice());
+            newPayment.setTotalClassHours(tCoursePackagePayment.getTotalClassHours());
+            newPayment.setLaveClassHours(tCoursePackagePayment.getTotalClassHours());
+            newPayment.setAbsencesNumber(0);
+            newPayment.setPayUserType(1);
+            newPayment.setPayStatus(1);
+            newPayment.setStatus(1);
+            newPayment.setState(1);
+            newPayment.setInsertTime(new Date());
+            this.baseMapper.insert(newPayment);
+            code = newPayment.getCode();
+        }
         switch (request.getPayType()){
             case 1:
-                WeChatPayment();
+                WeChatPayment(code,request);
                 break;
             case 2:
-                AlipayPayment();
+                AlipayPayment(code,request);
                 break;
             case 3:
-                PlaypaiGoldPayment();
+                PlaypaiGoldPayment(code,request);
                 break;
             default:
                 break;
@@ -300,15 +332,72 @@
     }
 
 
-    public void WeChatPayment(){
+    public void WeChatPayment(String code, ClasspaymentRequest request){
 
     }
 
-    public void AlipayPayment(){
 
+    public ResultUtil AlipayPayment(String code, ClasspaymentRequest request){
+        BigDecimal amount = BigDecimal.ZERO;
+        if (request.getUseConpon() == 1){
+            Coupon coupon = client.queryCouponById(request.getConponId());
+            // TODO: 2023/7/11 课包购买的微信支付
+        }
+
+        ResultUtil alipay = payMoneyUtil.alipay("课包购买", "", "", code, amount.toString(),
+                "/base/coursePackage/alipayNewPaymentCallback");
+//        if(alipay.getCode() == 200){
+//            new Thread(new Runnable() {
+//                @Override
+//                public void run() {
+//                    try {
+//                        int num = 1;
+//                        int wait = 0;
+//                        while (num <= 10){
+//                            int min = 5000;
+//                            wait += (min * num);
+//                            Thread.sleep(wait);
+//                            TCoursePackagePayment coursePackagePayment = couPayClient.getCoursePackagePaymentByCode(code);
+//                            if(coursePackagePayment.getPayStatus() == 2){
+//                                break;
+//                            }
+//                            ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryALIOrder(code);
+//                            if(resultUtil.getCode() == 200 && coursePackagePayment.getPayStatus() == 1){
+//                                /**
+//                                 * WAIT_BUYER_PAY(交易创建,等待买家付款)、
+//                                 * TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、
+//                                 * TRADE_SUCCESS(交易支付成功)、
+//                                 * TRADE_FINISHED(交易结束,不可退款)
+//                                 */
+//                                Map<String, String> data1 = resultUtil.getData();
+//                                String s = data1.get("tradeStatus");
+//                                String tradeNo = data1.get("tradeNo");
+//                                if("TRADE_CLOSED".equals(s) || "TRADE_FINISHED".equals(s) || num == 10){
+//                                    coursePackagePayment.setState(3);
+//                                    couPayClient.delPaymentCoursePackage(coursePackagePayment.getId());
+//                                    break;
+//                                }
+//                                if("TRADE_SUCCESS".equals(s)){
+//                                    coursePackagePayment.setPayStatus(2);
+//                                    coursePackagePayment.setOrderNumber(tradeNo);
+//                                    couPayClient.updatePaymentCoursePackage(coursePackagePayment);
+//                                    break;
+//                                }
+//                                if("WAIT_BUYER_PAY".equals(s)){
+//                                    num++;
+//                                }
+//                            }
+//                        }
+//                    }catch (Exception e){
+//                        e.printStackTrace();
+//                    }
+//                }
+//            }).start();
+//        }
+        return alipay;
     }
 
-    public void PlaypaiGoldPayment(){
+    public void PlaypaiGoldPayment(String code, ClasspaymentRequest request){
 
     }
 

--
Gitblit v1.7.1