From 35c07cedf67346e9d79449ed185af39a567fa60b Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期三, 05 七月 2023 08:31:11 +0800
Subject: [PATCH] 更新部分功能接口

---
 cloud-server-course/pom.xml                                                                  |    5 
 cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/DatasourceModel.java          |   86 +++++
 cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackageStudent.java            |    4 
 cloud-server-account/src/main/java/com/dsh/account/model/StudentVo.java                      |   20 +
 cloud-server-account/src/main/java/com/dsh/account/entity/TStudent.java                      |    3 
 cloud-server-course/src/main/java/com/dsh/course/model/StudentVo.java                        |   20 +
 cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/model/Student.java  |    3 
 cloud-server-course/src/main/java/com/dsh/course/feignclient/account/model/Student.java      |   73 ++++
 cloud-server-course/src/main/resources/mapper/TCoursePackageDiscountMapper.xml               |    1 
 cloud-server-account/src/main/java/com/dsh/account/controller/StudentController.java         |   59 +++
 cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java               |    2 
 cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java          |   11 
 cloud-server-course/src/main/java/com/dsh/course/feignclient/account/StudentClient.java      |   22 +
 cloud-server-course/src/main/resources/sharding-jdbc.properties                              |   25 +
 cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/Master0DataSource.java        |   18 +
 cloud-server-course/src/main/java/com/dsh/course/model/CoursePackagePaymentConfigVo.java     |   28 +
 cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java |  341 ++++++++++++++++----
 cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackagePayment.java           |    4 
 cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackageDiscount.java          |    6 
 cloud-server-course/src/main/java/com/dsh/course/model/CoursePackageListVo.java              |    4 
 cloud-server-course/src/main/java/com/dsh/course/model/CoursePackageInfo.java                |   46 ++
 cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackage.java                  |    2 
 cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java           |  113 +++++++
 cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java            |   28 +
 cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackagePaymentConfig.java      |    5 
 25 files changed, 839 insertions(+), 90 deletions(-)

diff --git a/cloud-server-account/src/main/java/com/dsh/account/controller/StudentController.java b/cloud-server-account/src/main/java/com/dsh/account/controller/StudentController.java
index 674b0e8..c264ecf 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/controller/StudentController.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/controller/StudentController.java
@@ -2,11 +2,20 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.dsh.account.entity.TStudent;
+import com.dsh.account.model.StudentVo;
+import com.dsh.account.service.TAppUserService;
 import com.dsh.account.service.TStudentService;
+import com.dsh.account.util.ResultUtil;
+import com.dsh.account.util.TokenUtil;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -19,6 +28,9 @@
 
     @Autowired
     private TStudentService studentService;
+
+    @Autowired
+    private TokenUtil tokenUtil;
 
 
     /**
@@ -37,4 +49,51 @@
             return new ArrayList<>();
         }
     }
+
+
+
+    @ResponseBody
+    @PostMapping("/student/queryDefaultStudent")
+    public TStudent queryDefaultStudent(@RequestBody Integer appUserId){
+        try {
+            TStudent one = studentService.getOne(new QueryWrapper<TStudent>().eq("appUserId", appUserId).eq("isDefault", 1).eq("state", 1));
+            return one;
+        }catch (Exception e){
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+    @ResponseBody
+    @PostMapping("/api/student/queryStudentList")
+    @ApiOperation(value = "获取学员列表", tags = {"APP-课程列表"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "经度", name = "lon", dataType = "string", required = true),
+            @ApiImplicitParam(value = "纬度", name = "lat", dataType = "string", required = true),
+            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<StudentVo>> queryStudentList(){
+        try {
+            Integer uid = tokenUtil.getUserIdFormRedis();
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            List<TStudent> list = studentService.list(new QueryWrapper<TStudent>().eq("appUserId", uid).eq("state", 1));
+            List<StudentVo> listVo = new ArrayList<>();
+            for (TStudent tStudent : list) {
+                StudentVo studentVo = new StudentVo();
+                studentVo.setId(tStudent.getId());
+                studentVo.setPhone(tStudent.getPhone());
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
+                studentVo.setAge(Integer.valueOf(sdf.format(new Date())) - Integer.valueOf(sdf.format(tStudent.getBirthday())));
+                listVo.add(studentVo);
+            }
+            return ResultUtil.success(listVo);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
 }
diff --git a/cloud-server-account/src/main/java/com/dsh/account/entity/TStudent.java b/cloud-server-account/src/main/java/com/dsh/account/entity/TStudent.java
index f059637..632e798 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/entity/TStudent.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/entity/TStudent.java
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -46,6 +47,7 @@
     /**
      * 生日
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date birthday;
     /**
      * 性别(1=男,2=女)
@@ -78,6 +80,7 @@
     /**
      * 添加时间
      */
+    @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/model/StudentVo.java b/cloud-server-account/src/main/java/com/dsh/account/model/StudentVo.java
new file mode 100644
index 0000000..7736a58
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/model/StudentVo.java
@@ -0,0 +1,20 @@
+package com.dsh.account.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/4 10:58
+ */
+@Data
+@ApiModel
+public class StudentVo {
+    @ApiModelProperty("学员id")
+    private Integer id;
+    @ApiModelProperty("学员电话")
+    private String phone;
+    @ApiModelProperty("学员年龄")
+    private Integer age;
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/model/Student.java b/cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/model/Student.java
index fa891cd..3731742 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/model/Student.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/feginClient/account/model/Student.java
@@ -1,5 +1,6 @@
 package com.dsh.activity.feginClient.account.model;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.util.Date;
@@ -26,6 +27,7 @@
     /**
      * 生日
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date birthday;
     /**
      * 性别(1=男,2=女)
@@ -58,6 +60,7 @@
     /**
      * 添加时间
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date insertTime;
     /**
      * 头像
diff --git a/cloud-server-course/pom.xml b/cloud-server-course/pom.xml
index 2ba631f..191c909 100644
--- a/cloud-server-course/pom.xml
+++ b/cloud-server-course/pom.xml
@@ -114,6 +114,11 @@
             <artifactId>geodesy</artifactId>
             <version>1.1.3</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-jdbc-core</artifactId>
+            <version>5.2.0</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/DatasourceModel.java b/cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/DatasourceModel.java
new file mode 100644
index 0000000..ea4cd0f
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/DatasourceModel.java
@@ -0,0 +1,86 @@
+package com.dsh.config.Sharding_jdbc;
+
+
+/**
+* 数据源
+* @author pzb
+* @Date 2022/11/21 21:13
+*/
+public class DatasourceModel {
+    private String url;
+    private String username;
+    private String password;
+    private String driverClassName;
+    private Integer maxActive;
+    private Long maxWait;
+    private Integer minIdle;
+    private Integer initialSize;
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getDriverClassName() {
+        return driverClassName;
+    }
+
+    public void setDriverClassName(String driverClassName) {
+        this.driverClassName = driverClassName;
+    }
+
+    public DatasourceModel getDatasourceModel(){
+        return this;
+    }
+
+    public Integer getMaxActive() {
+        return maxActive;
+    }
+
+    public void setMaxActive(Integer maxActive) {
+        this.maxActive = maxActive;
+    }
+
+    public Long getMaxWait() {
+        return maxWait;
+    }
+
+    public void setMaxWait(Long maxWait) {
+        this.maxWait = maxWait;
+    }
+
+    public Integer getMinIdle() {
+        return minIdle;
+    }
+
+    public void setMinIdle(Integer minIdle) {
+        this.minIdle = minIdle;
+    }
+
+    public Integer getInitialSize() {
+        return initialSize;
+    }
+
+    public void setInitialSize(Integer initialSize) {
+        this.initialSize = initialSize;
+    }
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/Master0DataSource.java b/cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/Master0DataSource.java
new file mode 100644
index 0000000..e1bbbaa
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/Master0DataSource.java
@@ -0,0 +1,18 @@
+package com.dsh.config.Sharding_jdbc;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+
+/**
+* 数据源配置
+* @author pzb
+* @Date 2022/11/21 20:32
+*/
+@Component
+@PropertySource(value = "classpath:sharding-jdbc.properties")
+@ConfigurationProperties(prefix = "datasource.master0")
+public class Master0DataSource extends DatasourceModel {
+
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java b/cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java
new file mode 100644
index 0000000..dbac4e9
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java
@@ -0,0 +1,113 @@
+package com.dsh.config.Sharding_jdbc;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory;
+import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
+import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
+import org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
+import org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.util.*;
+
+@Configuration
+public class ShardingConfig {
+
+    @Autowired
+    private Master0DataSource master0DataSource;
+
+
+    @Bean
+    public DataSource getDataSource(){
+        DataSource dataSource = null;
+        try {
+            Properties properties = new Properties();
+            properties.setProperty("sql-show", "true");
+            String databaseName = "m_0";//真实数据源名称,多个数据源用逗号区分
+            dataSource = ShardingSphereDataSourceFactory.createDataSource(databaseName, createDataSourceMap(), createShardingRuleConfiguration(), properties);
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+        return dataSource;
+    }
+
+
+    /**
+     * 配置多数据源
+     * @return
+     */
+    private Map<String, DataSource> createDataSourceMap() {
+        Map<String, DataSource> dataSourceMap = new HashMap<>();
+        // 配置第 1 个数据源
+        DruidDataSource dataSource1 = new DruidDataSource();
+        dataSource1.setDriverClassName(master0DataSource.getDriverClassName());
+        dataSource1.setUrl(master0DataSource.getUrl());
+        dataSource1.setUsername(master0DataSource.getUsername());
+        dataSource1.setPassword(master0DataSource.getPassword());
+        dataSource1.setMaxActive(master0DataSource.getMaxActive());
+        dataSource1.setMaxWait(master0DataSource.getMaxWait());
+        dataSource1.setMinIdle(master0DataSource.getMinIdle());
+        dataSource1.setInitialSize(master0DataSource.getInitialSize());
+        dataSourceMap.put("m_0", dataSource1);
+        return dataSourceMap;
+    }
+
+
+    /**
+     * 分片配置
+     * @return
+     */
+    private Collection<RuleConfiguration> createShardingRuleConfiguration() {
+        LinkedList<RuleConfiguration> linkedList = new LinkedList();
+
+        //分片规则配置
+        ShardingRuleConfiguration result1 = new ShardingRuleConfiguration();
+        result1.getTables().add(gettCoursePackagePaymentTableRuleConfiguration());
+        Properties props1 = new Properties();
+        props1.setProperty("algorithm-expression", "t_course_package_payment$->{appUserId % 5 + 1}");
+        result1.getShardingAlgorithms().put("t_course_package_payment-inline", new AlgorithmConfiguration("INLINE", props1));
+        result1.getKeyGenerators().put("t_course_package_payment-snowflake", new AlgorithmConfiguration("SNOWFLAKE", new Properties()));
+
+        //分片规则配置
+        result1.getTables().add(getCoursePackageStudentTableRuleConfiguration());
+        Properties props2 = new Properties();
+        props2.setProperty("algorithm-expression", "t_course_package_student$->{appUserId % 5 + 1}");
+        result1.getShardingAlgorithms().put("t_course_package_student-inline", new AlgorithmConfiguration("INLINE", props2));
+        result1.getKeyGenerators().put("t_course_package_student-snowflake", new AlgorithmConfiguration("SNOWFLAKE", new Properties()));
+
+        linkedList.add(result1);
+
+        return linkedList;
+    }
+
+    /**
+     * 分片算法配置
+     * @return
+     */
+    private ShardingTableRuleConfiguration gettCoursePackagePaymentTableRuleConfiguration() {
+        ShardingTableRuleConfiguration result = new ShardingTableRuleConfiguration("t_course_package_payment", "m$->{0}.t_course_package_payment$->{1..5}");//50
+        result.setTableShardingStrategy(new StandardShardingStrategyConfiguration("appUserId", "t_course_package_payment-inline"));
+        result.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("id", "t_course_package_payment-snowflake"));
+        return result;
+    }
+
+
+
+    /**
+     * 分片算法配置
+     * @return
+     */
+    private ShardingTableRuleConfiguration getCoursePackageStudentTableRuleConfiguration() {
+        ShardingTableRuleConfiguration result = new ShardingTableRuleConfiguration("t_course_package_student", "m$->{0}.t_course_package_student$->{1..5}");//30
+        result.setTableShardingStrategy(new StandardShardingStrategyConfiguration("appUserId", "t_course_package_student-inline"));
+        result.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("id", "t_course_package_student-snowflake"));
+        return result;
+    }
+
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java
index 1953673..ac142ba 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java
@@ -6,6 +6,7 @@
 import com.dsh.course.entity.TCoursePackageType;
 import com.dsh.course.feignclient.model.ExerciseVideo;
 import com.dsh.course.model.BaseVo;
+import com.dsh.course.model.CoursePackageInfo;
 import com.dsh.course.model.CoursePackageList;
 import com.dsh.course.model.CoursePackageListVo;
 import com.dsh.course.service.TCoursePackageService;
@@ -72,7 +73,7 @@
 
     @ResponseBody
     @PostMapping("/api/course/queryCoursePackageType")
-    @ApiOperation(value = "获取课程类型列表", tags = {"APP-加入玩湃"})
+    @ApiOperation(value = "获取课程类型列表", tags = {"APP-课程列表"})
     @ApiImplicitParams({
     })
     public ResultUtil<List<BaseVo>> queryCoursePackageType(){
@@ -97,7 +98,7 @@
 
     @ResponseBody
     @PostMapping("/api/course/queryCourseList")
-    @ApiOperation(value = "获取课程列表", tags = {"APP-加入玩湃"})
+    @ApiOperation(value = "获取课程列表", tags = {"APP-课程列表"})
     @ApiImplicitParams({
             @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
     })
@@ -117,6 +118,27 @@
 
 
 
-
+    @ResponseBody
+    @PostMapping("/api/course/queryCourseInfo")
+    @ApiOperation(value = "获取课程详情", tags = {"APP-课程列表"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "课包id", name = "id", dataType = "int", required = true),
+            @ApiImplicitParam(value = "经度", name = "lon", dataType = "string", required = true),
+            @ApiImplicitParam(value = "纬度", name = "lat", dataType = "string", required = true),
+            @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<CoursePackageInfo> queryCourseInfo(@RequestBody Integer id, @RequestBody String lon, @RequestBody String lat){
+        try {
+            Integer uid = tokenUtil.getUserIdFormRedis();
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            CoursePackageInfo coursePackageInfo = coursePackageService.queryCourseInfo(uid, id, lon, lat);
+            return ResultUtil.success(coursePackageInfo);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
 
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackagePaymentConfig.java b/cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackagePaymentConfig.java
index 6200eec..1b9c125 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackagePaymentConfig.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackagePaymentConfig.java
@@ -24,11 +24,6 @@
     @TableField("coursePackageId")
     private Integer coursePackageId;
     /**
-     * 支付方式(1=现金,2=玩湃币)
-     */
-    @TableField("payType")
-    private Integer payType;
-    /**
      * 课时数
      */
     @TableField("classHours")
diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackageStudent.java b/cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackageStudent.java
index d18a280..8a2802b 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackageStudent.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackageStudent.java
@@ -30,8 +30,8 @@
     /**
      * 主键
      */
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
     /**
      * 用户id
      */
diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackage.java b/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackage.java
index 7d160ea..d6c3bc8 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackage.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackage.java
@@ -100,7 +100,7 @@
     /**
      * 支付方式(1=现金,2=玩湃币)
      */
-    private String payType;
+    private Integer payType;
     /**
      * 有效天数
      */
diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackageDiscount.java b/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackageDiscount.java
index 3542754..66956dd 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackageDiscount.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackageDiscount.java
@@ -4,6 +4,7 @@
 import java.io.Serializable;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
@@ -36,6 +37,11 @@
      */
     private Integer coursePackageId;
     /**
+     * 课包价格规则id
+     */
+    @TableField("coursePackagePaymentConfigId")
+    private Integer coursePackagePaymentConfigId;
+    /**
      * 折扣类型(1=会员折扣,2=续课优惠,3=限时折扣,4=赠送课时)
      */
     private Integer type;
diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackagePayment.java b/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackagePayment.java
index 5fa4ee6..b60ce2b 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackagePayment.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackagePayment.java
@@ -28,8 +28,8 @@
     /**
      * 主键
      */
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
     /**
      * 用户id
      */
diff --git a/cloud-server-course/src/main/java/com/dsh/course/feignclient/account/StudentClient.java b/cloud-server-course/src/main/java/com/dsh/course/feignclient/account/StudentClient.java
new file mode 100644
index 0000000..d655517
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/feignclient/account/StudentClient.java
@@ -0,0 +1,22 @@
+package com.dsh.course.feignclient.account;
+
+import com.dsh.course.feignclient.account.model.Student;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/4 23:38
+ */
+@FeignClient("mb-cloud-account")
+public interface StudentClient {
+
+
+    /**
+     * 获取默认学员
+     * @param appUserId
+     * @return
+     */
+    @PostMapping("/student/queryDefaultStudent")
+    Student queryDefaultStudent(Integer appUserId);
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/feignclient/account/model/Student.java b/cloud-server-course/src/main/java/com/dsh/course/feignclient/account/model/Student.java
new file mode 100644
index 0000000..9f62653
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/feignclient/account/model/Student.java
@@ -0,0 +1,73 @@
+package com.dsh.course.feignclient.account.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/4 23:39
+ */
+@Data
+public class Student {
+    private Integer id;
+    /**
+     * 用户id
+     */
+    private Integer appUserId;
+    /**
+     * 学员姓名
+     */
+    private String name;
+    /**
+     * 学员电话
+     */
+    private String phone;
+    /**
+     * 生日
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date birthday;
+    /**
+     * 性别(1=男,2=女)
+     */
+    private Integer sex;
+    /**
+     * 身高
+     */
+    private Double height;
+    /**
+     * 体重
+     */
+    private Double weight;
+    /**
+     * bmi健康值
+     */
+    private Double bmi;
+    /**
+     * 身份证号
+     */
+    private String idCard;
+    /**
+     * 体侧表
+     */
+    private String lateralSurface;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date insertTime;
+    /**
+     * 头像
+     */
+    private String headImg;
+    /**
+     * 是否默认 1默认 2不是默认
+     */
+    private Integer isDefault;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/CoursePackageInfo.java b/cloud-server-course/src/main/java/com/dsh/course/model/CoursePackageInfo.java
new file mode 100644
index 0000000..82469df
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/CoursePackageInfo.java
@@ -0,0 +1,46 @@
+package com.dsh.course.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/4 10:28
+ */
+@Data
+@ApiModel
+public class CoursePackageInfo {
+    @ApiModelProperty("id")
+    private Integer id;
+    @ApiModelProperty("封面图")
+    private String coverDrawing;
+    @ApiModelProperty("课程名称")
+    private String name;
+    @ApiModelProperty("门店名称")
+    private String storeName;
+    @ApiModelProperty("门店照片")
+    private String storeCoverDrawing;
+    @ApiModelProperty("门店地址")
+    private String storeAddress;
+    @ApiModelProperty("门店经度")
+    private String lon;
+    @ApiModelProperty("门店纬度")
+    private String lat;
+    @ApiModelProperty("距离")
+    private Double distance;
+    @ApiModelProperty("上课周")
+    private List<String> weeks;
+    @ApiModelProperty("上课时间")
+    private String times;
+    @ApiModelProperty("详情图片")
+    private String detailDrawing;
+    @ApiModelProperty("介绍图")
+    private String introduceDrawing;
+    @ApiModelProperty("课时套餐")
+    private List<CoursePackagePaymentConfigVo> list;
+    @ApiModelProperty("学员")
+    private StudentVo student;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/CoursePackageListVo.java b/cloud-server-course/src/main/java/com/dsh/course/model/CoursePackageListVo.java
index 4d62b27..e9da1da 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/model/CoursePackageListVo.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/CoursePackageListVo.java
@@ -23,12 +23,16 @@
     private String classStartTime;
     @ApiModelProperty("已报名人数")
     private Integer applicantsNumber;
+    @ApiModelProperty("支付方式(1=现金,2=玩湃币)")
+    private Integer payType;
     @ApiModelProperty("原价")
     private Double originalPrice;
     @ApiModelProperty("会员价")
     private Double vipPrice;
     @ApiModelProperty("支付价")
     private Double paymentPrice;
+    @ApiModelProperty("玩湃价")
+    private Integer playPaiCoin;
     @ApiModelProperty("距离")
     private Double distance;
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/CoursePackagePaymentConfigVo.java b/cloud-server-course/src/main/java/com/dsh/course/model/CoursePackagePaymentConfigVo.java
new file mode 100644
index 0000000..dd84450
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/CoursePackagePaymentConfigVo.java
@@ -0,0 +1,28 @@
+package com.dsh.course.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/4 10:44
+ */
+@Data
+@ApiModel
+public class CoursePackagePaymentConfigVo {
+    @ApiModelProperty("套餐id")
+    private Integer id;
+    @ApiModelProperty("课时数")
+    private Integer classHours;
+    @ApiModelProperty("支付方式(1=现金,2=玩湃币)")
+    private Integer payType;
+    @ApiModelProperty("支付价")
+    private Double paymentPrice;
+    @ApiModelProperty("原价")
+    private Double originalPrice;
+    @ApiModelProperty("会员价")
+    private Double vipPrice;
+    @ApiModelProperty("玩湃价")
+    private Integer playPaiCoin;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/StudentVo.java b/cloud-server-course/src/main/java/com/dsh/course/model/StudentVo.java
new file mode 100644
index 0000000..6ed571b
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/StudentVo.java
@@ -0,0 +1,20 @@
+package com.dsh.course.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/4 10:58
+ */
+@Data
+@ApiModel
+public class StudentVo {
+    @ApiModelProperty("学员id")
+    private Integer id;
+    @ApiModelProperty("学员电话")
+    private String phone;
+    @ApiModelProperty("学员年龄")
+    private Integer age;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java b/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java
index 7034949..0bb29d3 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dsh.course.entity.TCoursePackage;
 import com.dsh.course.feignclient.model.CourseOfStoreVo;
+import com.dsh.course.model.CoursePackageInfo;
 import com.dsh.course.model.CoursePackageList;
 import com.dsh.course.model.CoursePackageListVo;
 
@@ -29,4 +30,14 @@
      * @throws Exception
      */
     List<CoursePackageListVo> queryCourseList(Integer uid, CoursePackageList coursePackageList) throws Exception;
+
+
+    /**
+     * 获取课包详情
+     * @param uid
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    CoursePackageInfo queryCourseInfo(Integer uid, Integer id, String lon, String lat) throws Exception;
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java
index ebc9270..cade892 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java
@@ -9,13 +9,14 @@
 import com.dsh.course.entity.TCoursePackage;
 import com.dsh.course.entity.TCoursePackageDiscount;
 import com.dsh.course.feignclient.account.AppUserClient;
+import com.dsh.course.feignclient.account.StudentClient;
 import com.dsh.course.feignclient.account.model.AppUser;
+import com.dsh.course.feignclient.account.model.Student;
 import com.dsh.course.feignclient.other.StoreClient;
 import com.dsh.course.feignclient.other.model.Store;
 import com.dsh.course.mapper.TCoursePackageMapper;
 import com.dsh.course.feignclient.model.CourseOfStoreVo;
-import com.dsh.course.model.CoursePackageList;
-import com.dsh.course.model.CoursePackageListVo;
+import com.dsh.course.model.*;
 import com.dsh.course.service.ICoursePackagePaymentConfigService;
 import com.dsh.course.service.TCoursePackageDiscountService;
 import com.dsh.course.service.TCoursePackagePaymentService;
@@ -27,6 +28,8 @@
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -59,6 +62,9 @@
 
     @Resource
     private AppUserClient appUserClient;
+
+    @Resource
+    private StudentClient studentClient;
 
 
 
@@ -106,7 +112,7 @@
             Store store = storeClient.queryStoreById(coursePackage.getStoreId());
             Integer integer = coursePackagePaymentService.queryCountNumber(coursePackage.getId());
             CoursePackagePaymentConfig coursePackagePaymentConfig = coursePackagePaymentConfigService.getOne(new QueryWrapper<CoursePackagePaymentConfig>()
-                    .eq("coursePackageId", coursePackage.getId()).last(" order by if(payType = 1, cashPayment, playPaiCoin)"));
+                    .eq("coursePackageId", coursePackage.getId()).orderByAsc("classHours limit 0, 1"));
             CoursePackageListVo coursePackageListVo = new CoursePackageListVo();
             coursePackageListVo.setId(coursePackage.getId());
             coursePackageListVo.setName(coursePackage.getName());
@@ -114,86 +120,113 @@
             coursePackageListVo.setCoverDrawing(coursePackage.getCoverDrawing());
             coursePackageListVo.setClassStartTime(coursePackage.getClassStartTime() + "-" + coursePackage.getClassEndTime());
             coursePackageListVo.setApplicantsNumber(integer);
+            coursePackageListVo.setPayType(coursePackage.getPayType());
+            coursePackageListVo.setPlayPaiCoin(coursePackageListVo.getPlayPaiCoin());
 
-            coursePackageListVo.setOriginalPrice(coursePackagePaymentConfig.getPayType() == 1 ? coursePackagePaymentConfig.getCashPayment() : coursePackagePaymentConfig.getPlayPaiCoin().doubleValue());
-            TCoursePackageDiscount coursePackageDiscount = coursePackageDiscountService.getOne(new QueryWrapper<TCoursePackageDiscount>().eq("coursePackageId", coursePackage.getId()).eq("auditStatus", 2).eq("type", 1));
-            if(1 == appUser.getIsVip() && null != coursePackageDiscount){
-                //{"num1":100}
-                JSONObject jsonObject = JSON.parseObject(coursePackageDiscount.getContent());
-                coursePackageListVo.setVipPrice(jsonObject.getDouble("num1"));
-            }
-            coursePackageDiscount = coursePackageDiscountService.getOne(new QueryWrapper<TCoursePackageDiscount>().eq("coursePackageId", coursePackage.getId()).eq("auditStatus", 2).eq("type", 3));
-            if(null == coursePackageDiscount){
-                coursePackageListVo.setPaymentPrice(coursePackageListVo.getOriginalPrice());
-            }else{
+            //会员显示原价和会员价(最低)。非会员显示会员价和支付价(最低)
+            if(appUser.getIsVip() == 0){//非会员
+                List<TCoursePackageDiscount> list2 = coursePackageDiscountService.list(new QueryWrapper<TCoursePackageDiscount>().eq("coursePackagePaymentConfigId", coursePackagePaymentConfig.getId())
+                        .eq("type", 1).eq("auditStatus", 2));
+                Double vipPrice = coursePackagePaymentConfig.getCashPayment();
+                for (TCoursePackageDiscount coursePackageDiscount : list2) {
+                    Double num1 = JSON.parseObject(coursePackageDiscount.getContent()).getDouble("num1");
+                    if(vipPrice.compareTo(num1) > 0){
+                        vipPrice = num1;
+                    }
+                }
+                coursePackageListVo.setVipPrice(vipPrice);
+
+                Double paymentPrice = coursePackagePaymentConfig.getCashPayment();
+                List<TCoursePackageDiscount> list3 = coursePackageDiscountService.list(new QueryWrapper<TCoursePackageDiscount>().eq("coursePackagePaymentConfigId", coursePackagePaymentConfig.getId())
+                        .eq("type", 3).eq("auditStatus", 2));
                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-                /**
-                 * [{
-                 * 	"startDate": "2023-01-01 00:00:00",
-                 * 	"endDate": "2023-12-31 23:59:59",
-                 * 	"startTime": "02:00:00",
-                 * 	"endTime": "23:00:00",
-                 * 	"weeks": [1, 2, 7],
-                 * 	"cashPayment": 100
-                 * }]
-                 */
-                JSONArray jsonArray = JSON.parseArray(coursePackageDiscount.getContent());
-                for (int i = 0; i < jsonArray.size(); i++) {
-                    JSONObject jsonObject = jsonArray.getJSONObject(i);
-                    String startDate = jsonObject.getString("startDate");
-                    String endDate = jsonObject.getString("endDate");
-                    String startTime = jsonObject.getString("startTime");
-                    String endTime = jsonObject.getString("endTime");
-                    List<Integer> weeks = jsonObject.getJSONArray("weeks").toJavaList(Integer.class);
-                    Double cashPayment = jsonObject.getDouble("cashPayment");
-                    Date startDate_date = sdf.parse(startDate);
-                    Date endDate_date = sdf.parse(endDate);
-                    long timeMillis = System.currentTimeMillis();
-                    if(timeMillis >= startDate_date.getTime() && timeMillis < endDate_date.getTime()){
-                        Date date = new Date();
-                        Calendar calendar = Calendar.getInstance();
-                        calendar.setTime(date);
-                        int week = calendar.get(Calendar.DAY_OF_WEEK);
-                        boolean isFirstSunday = (calendar.getFirstDayOfWeek() == Calendar.SUNDAY);
-                        if(isFirstSunday){
-                            week = week - 1;
-                            if(week == 0){
-                                week = 7;
+                for (TCoursePackageDiscount coursePackageDiscount : list3) {
+                    /**
+                     * [{
+                     * 	"startDate": "2023-01-01 00:00:00",
+                     * 	"endDate": "2023-12-31 23:59:59",
+                     * 	"startTime": "02:00:00",
+                     * 	"endTime": "23:00:00",
+                     * 	"weeks": [1, 2, 7],
+                     * 	"cashPayment": 100
+                     * }]
+                     */
+                    JSONArray jsonArray = JSON.parseArray(coursePackageDiscount.getContent());
+                    for (int i = 0; i < jsonArray.size(); i++) {
+                        try {
+                            JSONObject jsonObject = jsonArray.getJSONObject(i);
+                            String startDate = jsonObject.getString("startDate");
+                            String endDate = jsonObject.getString("endDate");
+                            String startTime = jsonObject.getString("startTime");
+                            String endTime = jsonObject.getString("endTime");
+                            List<Integer> weeks = jsonObject.getJSONArray("weeks").toJavaList(Integer.class);
+                            Double cashPayment = jsonObject.getDouble("cashPayment");
+                            Date startDate_date = sdf.parse(startDate);
+                            Date endDate_date = sdf.parse(endDate);
+                            long timeMillis = System.currentTimeMillis();
+                            if(timeMillis >= startDate_date.getTime() && timeMillis < endDate_date.getTime()){
+                                Date date = new Date();
+                                Calendar calendar = Calendar.getInstance();
+                                calendar.setTime(date);
+                                int week = calendar.get(Calendar.DAY_OF_WEEK);
+                                boolean isFirstSunday = (calendar.getFirstDayOfWeek() == Calendar.SUNDAY);
+                                if(isFirstSunday){
+                                    week = week - 1;
+                                    if(week == 0){
+                                        week = 7;
+                                    }
+                                }
+                                if(!weeks.contains(week)){
+                                    continue;
+                                }
+
+                                String[] split1 = startTime.split(":");
+                                Integer hour1 = Integer.valueOf(split1[0]);
+                                Calendar s = Calendar.getInstance();
+                                s.setTime(date);
+                                s.set(Calendar.HOUR_OF_DAY, hour1);
+                                s.set(Calendar.MINUTE, Integer.valueOf(split1[1]));
+                                s.set(Calendar.SECOND, Integer.valueOf(split1[2]));
+
+                                String[] split2 = endTime.split(":");
+                                Integer hour2 = Integer.valueOf(split2[0]);
+                                Calendar e = Calendar.getInstance();
+                                e.setTime(date);
+                                e.set(Calendar.HOUR_OF_DAY, hour2);
+                                e.set(Calendar.MINUTE, Integer.valueOf(split2[1]));
+                                e.set(Calendar.SECOND, Integer.valueOf(split2[2]));
+
+                                if(hour1 > hour2){
+                                    if(s.getTimeInMillis() > date.getTime()){
+                                        s.set(Calendar.DAY_OF_YEAR, s.get(Calendar.DAY_OF_YEAR) - 1);
+                                    }else{
+                                        e.set(Calendar.DAY_OF_YEAR, e.get(Calendar.DAY_OF_YEAR) + 1);
+                                    }
+                                }
+                                if(timeMillis >= s.getTimeInMillis() && timeMillis < e.getTimeInMillis() && paymentPrice.compareTo(cashPayment) > 0){
+                                    paymentPrice = cashPayment;
+                                }
                             }
-                        }
-                        if(!weeks.contains(week)){
-                            continue;
-                        }
-
-                        String[] split = startTime.split(":");
-                        Integer hour1 = Integer.valueOf(split[0]);
-                        Calendar s = Calendar.getInstance();
-                        s.setTime(date);
-                        s.set(Calendar.HOUR_OF_DAY, hour1);
-                        s.set(Calendar.MINUTE, Integer.valueOf(split[1]));
-                        s.set(Calendar.SECOND, Integer.valueOf(split[2]));
-
-                        String[] split1 = endTime.split(":");
-                        Integer hour2 = Integer.valueOf(split1[0]);
-                        Calendar e = Calendar.getInstance();
-                        e.setTime(date);
-                        e.set(Calendar.HOUR_OF_DAY, hour2);
-                        e.set(Calendar.MINUTE, Integer.valueOf(split1[1]));
-                        e.set(Calendar.SECOND, Integer.valueOf(split1[2]));
-
-                        if(hour1 > hour2){
-                            if(s.getTimeInMillis() > date.getTime()){
-                                s.set(Calendar.DAY_OF_YEAR, s.get(Calendar.DAY_OF_YEAR) - 1);
-                            }else{
-                                e.set(Calendar.DAY_OF_YEAR, e.get(Calendar.DAY_OF_YEAR) + 1);
-                            }
-                        }
-                        if(timeMillis >= s.getTimeInMillis() && timeMillis < e.getTimeInMillis()){
-                            coursePackageListVo.setPaymentPrice(cashPayment);
+                        }catch (Exception e){
+                            e.printStackTrace();
                         }
                     }
                 }
+                coursePackageListVo.setPaymentPrice(paymentPrice);
+            }else{
+                List<TCoursePackageDiscount> list2 = coursePackageDiscountService.list(new QueryWrapper<TCoursePackageDiscount>().eq("coursePackagePaymentConfigId", coursePackagePaymentConfig.getId())
+                        .eq("type", 1).eq("auditStatus", 2));
+                Double vipPrice = coursePackagePaymentConfig.getCashPayment();
+                for (TCoursePackageDiscount coursePackageDiscount : list2) {
+                    Double num1 = JSON.parseObject(coursePackageDiscount.getContent()).getDouble("num1");
+                    if(vipPrice.compareTo(num1) > 0){
+                        vipPrice = num1;
+                    }
+                }
+                coursePackageListVo.setPaymentPrice(vipPrice);
+                coursePackageListVo.setOriginalPrice(coursePackagePaymentConfig.getCashPayment());
             }
+
             Map<String, Double> distance = GeodesyUtil.getDistance(coursePackageList.getLon() + "," + coursePackageList.getLat(), store.getLon() + "," + store.getLat());
             coursePackageListVo.setDistance(distance.get("WGS84") / 1000);
             listVos.add(coursePackageListVo);
@@ -217,4 +250,160 @@
         }
         return listVos;
     }
+
+
+    /**
+     * 获取课包详情
+     * @param uid
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public CoursePackageInfo queryCourseInfo(Integer uid, Integer id, String lon, String lat) throws Exception {
+        AppUser appUser = appUserClient.queryAppUser(uid);
+        TCoursePackage coursePackage = this.getById(id);
+        CoursePackageInfo coursePackageInfo = new CoursePackageInfo();
+        coursePackageInfo.setId(id);
+        coursePackageInfo.setCoverDrawing(coursePackage.getCoverDrawing());
+        coursePackageInfo.setName(coursePackage.getName());
+        Store store = storeClient.queryStoreById(coursePackage.getStoreId());
+        coursePackageInfo.setStoreName(store.getName());
+        coursePackageInfo.setStoreCoverDrawing(store.getCoverDrawing());
+        coursePackageInfo.setStoreAddress(store.getAddress());
+        coursePackageInfo.setLon(store.getLon());
+        coursePackageInfo.setLat(store.getLat());
+        Map<String, Double> distance = GeodesyUtil.getDistance(lon + "," + lat, store.getLon() + "," + store.getLat());
+        double wgs84 = new BigDecimal(distance.get("WGS84")).divide(new BigDecimal(1000)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
+        coursePackageInfo.setDistance(wgs84);
+
+        String[] split = coursePackage.getClassWeeks().split(";");
+        coursePackageInfo.setWeeks(Arrays.asList(split));
+        coursePackageInfo.setTimes(coursePackage.getClassStartTime() + "-" + coursePackage.getClassEndTime());
+        coursePackageInfo.setDetailDrawing(coursePackage.getDetailDrawing());
+        coursePackageInfo.setIntroduceDrawing(coursePackage.getIntroduceDrawing());
+        List<CoursePackagePaymentConfigVo> list = new ArrayList<>();
+        List<CoursePackagePaymentConfig> list1 = coursePackagePaymentConfigService.list(new QueryWrapper<CoursePackagePaymentConfig>().eq("coursePackageId", id).orderByAsc("classHours"));
+        list1.forEach(coursePackagePaymentConfig -> {
+            CoursePackagePaymentConfigVo coursePackagePaymentConfigVo = new CoursePackagePaymentConfigVo();
+            coursePackagePaymentConfigVo.setId(coursePackagePaymentConfig.getId());
+            coursePackagePaymentConfigVo.setClassHours(coursePackagePaymentConfig.getClassHours());
+            coursePackagePaymentConfigVo.setPayType(coursePackage.getPayType());
+            coursePackagePaymentConfigVo.setPlayPaiCoin(coursePackagePaymentConfig.getPlayPaiCoin());
+            //会员显示原价和会员价(最低)。非会员显示会员价和支付价(最低)
+            if(appUser.getIsVip() == 0){//非会员
+                List<TCoursePackageDiscount> list2 = coursePackageDiscountService.list(new QueryWrapper<TCoursePackageDiscount>().eq("coursePackagePaymentConfigId", coursePackagePaymentConfig.getId())
+                        .eq("type", 1).eq("auditStatus", 2));
+                Double vipPrice = coursePackagePaymentConfig.getCashPayment();
+                for (TCoursePackageDiscount coursePackageDiscount : list2) {
+                    Double num1 = JSON.parseObject(coursePackageDiscount.getContent()).getDouble("num1");
+                    if(vipPrice.compareTo(num1) > 0){
+                        vipPrice = num1;
+                    }
+                }
+                coursePackagePaymentConfigVo.setVipPrice(vipPrice);
+
+                Double paymentPrice = coursePackagePaymentConfig.getCashPayment();
+                List<TCoursePackageDiscount> list3 = coursePackageDiscountService.list(new QueryWrapper<TCoursePackageDiscount>().eq("coursePackagePaymentConfigId", coursePackagePaymentConfig.getId())
+                        .eq("type", 3).eq("auditStatus", 2));
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                for (TCoursePackageDiscount coursePackageDiscount : list3) {
+                    /**
+                     * [{
+                     * 	"startDate": "2023-01-01 00:00:00",
+                     * 	"endDate": "2023-12-31 23:59:59",
+                     * 	"startTime": "02:00:00",
+                     * 	"endTime": "23:00:00",
+                     * 	"weeks": [1, 2, 7],
+                     * 	"cashPayment": 100
+                     * }]
+                     */
+                    JSONArray jsonArray = JSON.parseArray(coursePackageDiscount.getContent());
+                    for (int i = 0; i < jsonArray.size(); i++) {
+                        try {
+                            JSONObject jsonObject = jsonArray.getJSONObject(i);
+                            String startDate = jsonObject.getString("startDate");
+                            String endDate = jsonObject.getString("endDate");
+                            String startTime = jsonObject.getString("startTime");
+                            String endTime = jsonObject.getString("endTime");
+                            List<Integer> weeks = jsonObject.getJSONArray("weeks").toJavaList(Integer.class);
+                            Double cashPayment = jsonObject.getDouble("cashPayment");
+                            Date startDate_date = sdf.parse(startDate);
+                            Date endDate_date = sdf.parse(endDate);
+                            long timeMillis = System.currentTimeMillis();
+                            if(timeMillis >= startDate_date.getTime() && timeMillis < endDate_date.getTime()){
+                                Date date = new Date();
+                                Calendar calendar = Calendar.getInstance();
+                                calendar.setTime(date);
+                                int week = calendar.get(Calendar.DAY_OF_WEEK);
+                                boolean isFirstSunday = (calendar.getFirstDayOfWeek() == Calendar.SUNDAY);
+                                if(isFirstSunday){
+                                    week = week - 1;
+                                    if(week == 0){
+                                        week = 7;
+                                    }
+                                }
+                                if(!weeks.contains(week)){
+                                    continue;
+                                }
+
+                                String[] split1 = startTime.split(":");
+                                Integer hour1 = Integer.valueOf(split1[0]);
+                                Calendar s = Calendar.getInstance();
+                                s.setTime(date);
+                                s.set(Calendar.HOUR_OF_DAY, hour1);
+                                s.set(Calendar.MINUTE, Integer.valueOf(split1[1]));
+                                s.set(Calendar.SECOND, Integer.valueOf(split1[2]));
+
+                                String[] split2 = endTime.split(":");
+                                Integer hour2 = Integer.valueOf(split2[0]);
+                                Calendar e = Calendar.getInstance();
+                                e.setTime(date);
+                                e.set(Calendar.HOUR_OF_DAY, hour2);
+                                e.set(Calendar.MINUTE, Integer.valueOf(split2[1]));
+                                e.set(Calendar.SECOND, Integer.valueOf(split2[2]));
+
+                                if(hour1 > hour2){
+                                    if(s.getTimeInMillis() > date.getTime()){
+                                        s.set(Calendar.DAY_OF_YEAR, s.get(Calendar.DAY_OF_YEAR) - 1);
+                                    }else{
+                                        e.set(Calendar.DAY_OF_YEAR, e.get(Calendar.DAY_OF_YEAR) + 1);
+                                    }
+                                }
+                                if(timeMillis >= s.getTimeInMillis() && timeMillis < e.getTimeInMillis() && paymentPrice.compareTo(cashPayment) > 0){
+                                    paymentPrice = cashPayment;
+                                }
+                            }
+                        }catch (Exception e){
+                            e.printStackTrace();
+                        }
+                    }
+                }
+                coursePackagePaymentConfigVo.setPaymentPrice(paymentPrice);
+            }else{
+                List<TCoursePackageDiscount> list2 = coursePackageDiscountService.list(new QueryWrapper<TCoursePackageDiscount>().eq("coursePackagePaymentConfigId", coursePackagePaymentConfig.getId())
+                        .eq("type", 1).eq("auditStatus", 2));
+                Double vipPrice = coursePackagePaymentConfig.getCashPayment();
+                for (TCoursePackageDiscount coursePackageDiscount : list2) {
+                    Double num1 = JSON.parseObject(coursePackageDiscount.getContent()).getDouble("num1");
+                    if(vipPrice.compareTo(num1) > 0){
+                        vipPrice = num1;
+                    }
+                }
+                coursePackagePaymentConfigVo.setPaymentPrice(vipPrice);
+                coursePackagePaymentConfigVo.setOriginalPrice(coursePackagePaymentConfig.getCashPayment());
+            }
+            list.add(coursePackagePaymentConfigVo);
+        });
+        coursePackageInfo.setList(list);
+
+        Student student = studentClient.queryDefaultStudent(uid);
+        StudentVo studentVo = new StudentVo();
+        studentVo.setId(student.getId());
+        studentVo.setPhone(student.getPhone());
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
+        studentVo.setAge(Integer.valueOf(sdf.format(new Date())) - Integer.valueOf(sdf.format(student.getBirthday())));
+        coursePackageInfo.setStudent(studentVo);
+        return coursePackageInfo;
+    }
 }
diff --git a/cloud-server-course/src/main/resources/mapper/TCoursePackageDiscountMapper.xml b/cloud-server-course/src/main/resources/mapper/TCoursePackageDiscountMapper.xml
index bf24c93..95fc2a7 100644
--- a/cloud-server-course/src/main/resources/mapper/TCoursePackageDiscountMapper.xml
+++ b/cloud-server-course/src/main/resources/mapper/TCoursePackageDiscountMapper.xml
@@ -6,6 +6,7 @@
     <resultMap id="BaseResultMap" type="com.dsh.course.entity.TCoursePackageDiscount">
         <id column="id" property="id" />
         <result column="coursePackageId" property="coursePackageId" />
+        <result column="coursePackagePaymentConfigId" property="coursePackagePaymentConfigId"/>
         <result column="type" property="type" />
         <result column="content" property="content" />
         <result column="auditStatus" property="auditStatus" />
diff --git a/cloud-server-course/src/main/resources/sharding-jdbc.properties b/cloud-server-course/src/main/resources/sharding-jdbc.properties
new file mode 100644
index 0000000..09e20a5
--- /dev/null
+++ b/cloud-server-course/src/main/resources/sharding-jdbc.properties
@@ -0,0 +1,25 @@
+datasource.names=master0
+
+#��������
+datasource.master0.type=com.alibaba.druid.pool.DruidDataSource
+datasource.master0.driverClassName=com.mysql.cj.jdbc.Driver
+datasource.master0.url=jdbc:mysql://192.168.110.80:3306/playpai_course?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
+datasource.master0.username=root
+datasource.master0.password=123456
+datasource.master0.maxActive=20
+datasource.master0.maxWait=60000
+datasource.master0.minIdle=5
+datasource.master0.initialSize=2
+
+#��������
+#datasource.master0.type=com.alibaba.druid.pool.DruidDataSource
+#datasource.master0.driverClassName=com.mysql.cj.jdbc.Driver
+#datasource.master0.url=jdbc:mysql://110.239.68.140:3306/playpai_course?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B7
+#datasource.master0.username=root
+#datasource.master0.password=G4LLlNouAGH1dijbyU&xDo$X
+#datasource.master0.maxActive=200
+#datasource.master0.maxWait=60000
+#datasource.master0.minIdle=100
+#datasource.master0.initialSize=100
+
+
diff --git a/cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java b/cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java
index 76be081..3ab7122 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java
@@ -136,7 +136,7 @@
 
     @ResponseBody
     @PostMapping("/base/store/queryStoreLists")
-    @ApiOperation(value = "获取门店列表", tags = {"APP-加入玩湃"})
+    @ApiOperation(value = "获取门店列表", tags = {"APP-加入玩湃", "APP-课程列表"})
     @ApiImplicitParams({
             @ApiImplicitParam(value = "经纬", name = "lon", dataType = "string", required = true),
             @ApiImplicitParam(value = "纬度", name = "lat", dataType = "string", required = true),

--
Gitblit v1.7.1