From 1882d607549762a84b1a5326f7262eba01363b85 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期一, 14 八月 2023 10:00:16 +0800
Subject: [PATCH] 更新课包功能

---
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/ICoursePackageService.java                |  170 +
 cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageStudentController.java                     |  121 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/dept/dept_edit.html                                     |    2 
 cloud-server-course/src/main/resources/mapper/CoursePackageStudentMapper.xml                                        |   23 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/ICourseService.java                       |    8 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/dept/dept_add.html                                      |    2 
 cloud-server-course/src/main/java/com/dsh/course/mapper/CoursePackageStudentMapper.java                             |   15 
 cloud-server-course/src/main/java/com/dsh/course/util/TaskUtil.java                                                 |   41 
 cloud-server-management/src/main/webapp/WEB-INF/view/blackboardBlank.html                                           |    2 
 cloud-server-course/src/main/java/com/dsh/course/model/QueryCoursePackageSchedulingList.java                        |   20 
 cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackage.js                        |   62 
 cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackageMapper.java                                   |   11 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage_add.html                    |  107 
 cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageSchedulingController.java                  |   61 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryExamineCoursePackageLists.java   |   36 
 cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageSchedulingServiceImpl.java               |  131 +
 cloud-server-course/src/main/java/com/dsh/course/mapper/CoursePackageSchedulingMapper.java                          |   26 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/CourseServiceImpl.java               |   11 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackageStudent.html                 |   43 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageClient.java                    |   38 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackagePaymentConfig.java       |   35 
 cloud-server-course/src/main/java/com/dsh/course/model/WeekEnum.java                                                |   51 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/examineCoursePackage.html                 |   82 
 cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageController.java                            |   40 
 cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java                     |   53 
 cloud-server-course/src/main/java/com/dsh/course/model/QueryCoursePackageStudentList.java                           |   28 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tEnsureIncomeRule/tEnsureIncomeRule_edit.html           |    2 
 cloud-server-course/src/main/java/com/dsh/course/service/ICoursePackageSchedulingService.java                       |   37 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/TCoursePackagePayment.java            |  127 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java                           |    9 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/course/course.html                                      |    4 
 cloud-server-course/src/main/java/com/dsh/course/feignclient/account/StudentClient.java                             |   11 
 cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageStudentServiceImpl.java                  |   61 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackageDiscount.html                |   86 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tAuditRecord/tAuditRecord_edit.html                     |    2 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CancelledClasses.java                 |   69 
 cloud-server-account/src/main/java/com/dsh/account/controller/AppUserController.java                                |   14 
 cloud-server-course/src/main/resources/sharding-jdbc.properties                                                     |    2 
 cloud-server-course/src/main/java/com/dsh/course/model/QueryExamineCoursePackageLists.java                          |   36 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageDiscountClient.java            |   32 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_add.html                                      |    2 
 cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackagePaymentMapper.java                            |   25 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage_edit.html                   |  241 +
 cloud-server-course/src/main/resources/mapper/CoursePackageSchedulingMapper.xml                                     |   30 
 cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageDiscountController.java                    |   54 
 cloud-server-management/src/main/webapp/static/modular/system/course/course_info.js                                 |   25 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/classRecord.html                          |   58 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user.html                                          |    6 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_chpwd.html                                    |    2 
 cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackageDiscount.js                |  819 ++++++
 cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/examineCoursePackage_info.html            |  229 +
 cloud-server-management/src/main/webapp/static/modular/system/coursePackage/examineCoursePackage.js                 |  185 +
 cloud-server-management/src/main/webapp/static/modular/system/coursePackage/classRecord.js                          |  428 +++
 cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackageScheduling.java                                |   66 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/TCoursePackage.java                   |  128 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/CoursePackageService.java            |  578 ++++
 cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/manualReservation.html                    |   42 
 cloud-server-course/src/main/resources/mapper/TCoursePackagePaymentMapper.xml                                       |   61 
 cloud-server-course/src/main/java/com/dsh/course/model/QueryRegistrationRecord.java                                 |   28 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/registrationRecord.html                   |   53 
 cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java                                 |   25 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryCoursePackageStudent.java        |   39 
 cloud-server-course/src/main/resources/mapper/TCoursePackageMapper.xml                                              |   35 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachClient.java                           |    9 
 cloud-server-course/src/main/java/com/dsh/course/entity/CancelledClasses.java                                       |    7 
 cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java                        |  191 +
 cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_edit.html                                     |    2 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageSchedulingClient.java          |   43 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryCoursePackageStudentList.java    |   28 
 cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentConfigController.java               |   55 
 cloud-server-course/src/main/java/com/dsh/config/Sharding_jdbc/ShardingConfig.java                                  |   20 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCoursePackageController.java     |  581 ++++
 cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java                 |  110 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCourseController.java            |   13 
 cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java                                   |   12 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CancelledClassesClient.java                 |   21 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackagePaymentConfigClient.java       |   41 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryCoursePackageSchedulingList.java |   20 
 cloud-server-course/src/main/java/com/dsh/course/model/QueryWalkInStudentList.java                                  |   28 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryRegistrationRecord.java          |   28 
 cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackageStudent.java                                   |    9 
 cloud-server-course/src/main/java/com/dsh/course/feignclient/account/AppUserClient.java                             |   11 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackageStudent.java             |   71 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tAuditRecord/tAuditRecord.html                          |    2 
 cloud-server-account/src/main/java/com/dsh/account/controller/StudentController.java                                |   12 
 cloud-server-course/src/main/java/com/dsh/course/controller/CancelledClassesController.java                         |   31 
 cloud-server-course/src/main/java/com/dsh/course/model/QueryCoursePackageStudent.java                               |   39 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackageScheduling.java          |   56 
 cloud-server-account/src/main/resources/sharding-jdbc.properties                                                    |    2 
 cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackagePaymentService.java                          |   21 
 cloud-server-management/src/main/webapp/static/modular/system/coursePackage/registrationRecord.js                   |  210 +
 cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage.html                        |    8 
 cloud-server-course/src/main/java/com/dsh/course/service/CoursePackageStudentService.java                           |   11 
 cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackagePayment.java                                  |    8 
 cloud-server-management/src/main/webapp/static/modular/system/coursePackage/examineCoursePackage_info.js            |   43 
 cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackage_info.js                   |  430 +++
 cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage_info.html                   |  202 +
 cloud-server-course/src/main/java/com/dsh/CourseApplication.java                                                    |    2 
 cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackageDiscount.java                                 |    2 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/TCoursePackageDiscount.java           |   67 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryWalkInStudentList.java           |   28 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_view.html                                     |    2 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackagePaymentClient.java             |   53 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageStudentClient.java             |   71 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/menu/menu_edit.html                                     |    2 
 cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackageStudent.js                 |  159 +
 cloud-server-management/src/main/webapp/static/modular/system/coursePackage/manualReservation.js                    |   96 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tAuditRecord/tAuditRecord_add.html                      |    2 
 108 files changed, 7,630 insertions(+), 99 deletions(-)

diff --git a/cloud-server-account/src/main/java/com/dsh/account/controller/AppUserController.java b/cloud-server-account/src/main/java/com/dsh/account/controller/AppUserController.java
index a108ba5..46643ca 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/controller/AppUserController.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/controller/AppUserController.java
@@ -1,5 +1,6 @@
 package com.dsh.account.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.dsh.account.entity.TAppUser;
 import com.dsh.account.model.AddAppUserVo;
 import com.dsh.account.model.JoinPlayPaiVo;
@@ -20,6 +21,7 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.PrintWriter;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -336,4 +338,16 @@
             e.printStackTrace();
         }
     }
+
+
+    /**
+     * 根据名称模糊搜索用户
+     * @param name
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/appUser/queryAppUserListByName")
+    public List<TAppUser> queryAppUserListByName(@RequestBody String name){
+        return appUserService.list(new QueryWrapper<TAppUser>().eq("state", 1).like("name", name));
+    }
 }
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 7a37553..85db5fe 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
@@ -125,4 +125,16 @@
         TStudent student = studentService.getById(id);
         return student;
     }
+
+
+    /**
+     * 根据名称模糊搜索学员
+     * @param name
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/student/queryStudentListByName")
+    public List<TStudent> queryStudentListByName(@RequestBody String name){
+        return studentService.list(new QueryWrapper<TStudent>().eq("state", 1).like("name", name));
+    }
 }
diff --git a/cloud-server-account/src/main/resources/sharding-jdbc.properties b/cloud-server-account/src/main/resources/sharding-jdbc.properties
index d3f7a4e..e4e730e 100644
--- a/cloud-server-account/src/main/resources/sharding-jdbc.properties
+++ b/cloud-server-account/src/main/resources/sharding-jdbc.properties
@@ -3,7 +3,7 @@
 #��������
 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_account?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
+datasource.master0.url=jdbc:mysql://127.0.0.1:3306/playpai_account?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
diff --git a/cloud-server-course/src/main/java/com/dsh/CourseApplication.java b/cloud-server-course/src/main/java/com/dsh/CourseApplication.java
index 78da217..081c0bc 100644
--- a/cloud-server-course/src/main/java/com/dsh/CourseApplication.java
+++ b/cloud-server-course/src/main/java/com/dsh/CourseApplication.java
@@ -11,6 +11,7 @@
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Import;
 import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
+import org.springframework.scheduling.annotation.EnableScheduling;
 import springfox.documentation.swagger2.annotations.EnableSwagger2;
 
 import javax.annotation.PostConstruct;
@@ -20,6 +21,7 @@
  * @author jason
  */
 @EnableSwagger2
+@EnableScheduling
 @EnableFeignClients
 @MBCloudApplication
 @Import({WebConfig.class})
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
index 66183bb..3508912 100644
--- 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
@@ -94,6 +94,14 @@
         props4.setProperty("algorithm-expression", "t_user_video_details$->{appUserId % 5 + 1}");
         result1.getShardingAlgorithms().put("t_user_video_details-inline", new AlgorithmConfiguration("INLINE", props4));
         result1.getKeyGenerators().put("t_user_video_details-snowflake", new AlgorithmConfiguration("SNOWFLAKE", new Properties()));
+
+        //分片规则配置
+        result1.getTables().add(getCoursePackageSchedulingTableRuleConfiguration());
+        Properties props5 = new Properties();
+        props5.setProperty("algorithm-expression", "t_course_package_scheduling$->{coursePackageId % 5 + 1}");
+        result1.getShardingAlgorithms().put("t_course_package_scheduling-inline", new AlgorithmConfiguration("INLINE", props5));
+        result1.getKeyGenerators().put("t_course_package_scheduling-snowflake", new AlgorithmConfiguration("SNOWFLAKE", new Properties()));
+
         linkedList.add(result1);
 
         return linkedList;
@@ -149,4 +157,16 @@
         return result;
     }
 
+
+    /**
+     * 分片算法配置
+     * @return
+     */
+    private ShardingTableRuleConfiguration getCoursePackageSchedulingTableRuleConfiguration() {
+        ShardingTableRuleConfiguration result = new ShardingTableRuleConfiguration("t_course_package_scheduling", "m_$->{0}.t_course_package_scheduling$->{1..5}");//30
+        result.setTableShardingStrategy(new StandardShardingStrategyConfiguration("coursePackageId", "t_course_package_scheduling-inline"));
+        result.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("id", "t_course_package_scheduling-snowflake"));
+        return result;
+    }
+
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CancelledClassesController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CancelledClassesController.java
new file mode 100644
index 0000000..39d5b40
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CancelledClassesController.java
@@ -0,0 +1,31 @@
+package com.dsh.course.controller;
+
+import com.dsh.course.entity.CancelledClasses;
+import com.dsh.course.service.CancelledClassesService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/12 3:47
+ */
+@RestController
+@RequestMapping("")
+public class CancelledClassesController {
+
+    @Autowired
+    private CancelledClassesService cancelledClassesService;
+
+
+
+
+    /**
+     * 添加数据
+     * @param cancelledClasses
+     */
+    @ResponseBody
+    @PostMapping("/cancelledClasses/addCancelledClasses")
+    public void addCancelledClasses(@RequestBody CancelledClasses cancelledClasses){
+        cancelledClassesService.save(cancelledClasses);
+    }
+}
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 c312630..e171113 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
@@ -345,4 +345,16 @@
             courseService.updateById(course);
         }
     }
+
+
+    /**
+     * 根据类型获取数据
+     * @param type
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/course/queryCourseByType")
+    public List<TCourse> queryCourseByType(@RequestBody Integer type){
+        return courseService.list(new QueryWrapper<TCourse>().eq("type", type).eq("state", 1));
+    }
 }
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 2a36239..75ed806 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
@@ -11,6 +11,7 @@
 import com.dsh.course.feignclient.other.model.Store;
 import com.dsh.course.model.BaseVo;
 import com.dsh.course.model.QueryCoursePackageLists;
+import com.dsh.course.model.QueryExamineCoursePackageLists;
 import com.dsh.course.model.vo.response.Details;
 import com.dsh.course.model.vo.response.ExchangeCoursePackageResponse;
 import com.dsh.course.service.ICoursePackagePaymentConfigService;
@@ -182,4 +183,43 @@
         Page<Map<String, Object>> mapPage = page.setRecords(coursePackageService.queryCoursePackageLists(page, queryCoursePackageLists));
         return mapPage;
     }
+
+
+    /**
+     * 添加数据
+     * @param coursePackage
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/coursePackage/addCoursePackage")
+    public Integer addCoursePackage(@RequestBody TCoursePackage coursePackage){
+        return coursePackageService.addCoursePackage(coursePackage);
+    }
+
+
+    /**
+     * 修改数据
+     * @param coursePackage
+     */
+    @ResponseBody
+    @PostMapping("/coursePackage/updateCoursePackageById")
+    public void updateCoursePackageById(@RequestBody TCoursePackage coursePackage){
+        coursePackageService.updateCoursePackageById(coursePackage);
+    }
+
+
+
+    /**
+     * 获取课包审核列表
+     * @param queryExamineCoursePackageLists
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/coursePackage/queryExamineCoursePackageLists")
+    public Page<Map<String, Object>> queryExamineCoursePackageLists(@RequestBody QueryExamineCoursePackageLists queryExamineCoursePackageLists){
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage(queryExamineCoursePackageLists.getLimit(), queryExamineCoursePackageLists.getOffset(),
+                queryExamineCoursePackageLists.getSort(), queryExamineCoursePackageLists.getOrder());
+        Page<Map<String, Object>> mapPage = page.setRecords(coursePackageService.queryExamineCoursePackageLists(page, queryExamineCoursePackageLists));
+        return mapPage;
+    }
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageDiscountController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageDiscountController.java
new file mode 100644
index 0000000..d5649f6
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageDiscountController.java
@@ -0,0 +1,54 @@
+package com.dsh.course.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.dsh.course.entity.TCoursePackageDiscount;
+import com.dsh.course.service.TCoursePackageDiscountService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/8 14:50
+ */
+@RestController
+@RequestMapping("")
+public class CoursePackageDiscountController {
+
+    @Autowired
+    private TCoursePackageDiscountService coursePackageDiscountService;
+
+
+    /**
+     * 获取课包折扣
+     * @param coursePackagePaymentConfigId
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/coursePackageDiscount/queryCoursePackageDiscount")
+    public List<TCoursePackageDiscount> queryCoursePackageDiscount(@RequestBody Integer coursePackagePaymentConfigId){
+        return coursePackageDiscountService.list(new QueryWrapper<TCoursePackageDiscount>().eq("coursePackagePaymentConfigId", coursePackagePaymentConfigId)
+                .eq("auditStatus", 2));
+    }
+
+
+    /**
+     * 编辑课包折扣
+     * @param list
+     */
+    @ResponseBody
+    @PostMapping("/coursePackageDiscount/setCoursePackageDiscount")
+    public void setCoursePackageDiscount(@RequestBody List<TCoursePackageDiscount> list){
+        TCoursePackageDiscount tCoursePackageDiscount = list.get(0);
+        coursePackageDiscountService.remove(new QueryWrapper<TCoursePackageDiscount>().eq("coursePackageId", tCoursePackageDiscount.getCoursePackageId()));
+        if(list.size() > 0){
+            coursePackageDiscountService.saveBatch(list);
+        }
+    }
+
+
+
+
+
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentConfigController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentConfigController.java
new file mode 100644
index 0000000..dc5c9f3
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentConfigController.java
@@ -0,0 +1,55 @@
+package com.dsh.course.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.dsh.course.entity.CoursePackagePaymentConfig;
+import com.dsh.course.service.ICoursePackagePaymentConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/7 11:46
+ */
+@RestController
+@RequestMapping("")
+public class CoursePackagePaymentConfigController {
+
+    @Autowired
+    private ICoursePackagePaymentConfigService coursePackagePaymentConfigService;
+
+
+    /**
+     * 添加数据
+     * @param coursePackagePaymentConfig
+     */
+    @ResponseBody
+    @PostMapping("/coursePackagePaymentConfig/addCoursePackagePaymentConfig")
+    public void addCoursePackagePaymentConfig(@RequestBody CoursePackagePaymentConfig coursePackagePaymentConfig){
+        coursePackagePaymentConfigService.save(coursePackagePaymentConfig);
+    }
+
+
+    /**
+     * 根据课包id获取价格配置
+     * @param coursePackageId
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/coursePackagePaymentConfig/queryCoursePackagePaymentConfigList")
+    public List<CoursePackagePaymentConfig> queryCoursePackagePaymentConfigList(@RequestBody Integer coursePackageId){
+        return coursePackagePaymentConfigService.list(new QueryWrapper<CoursePackagePaymentConfig>().eq("coursePackageId", coursePackageId));
+    }
+
+
+    /**
+     * 删除数据
+     * @param coursePackageId
+     */
+    @ResponseBody
+    @PostMapping("/coursePackagePaymentConfig/delCoursePackagePaymentConfig")
+    public void delCoursePackagePaymentConfig(@RequestBody Integer coursePackageId){
+        coursePackagePaymentConfigService.remove(new QueryWrapper<CoursePackagePaymentConfig>().eq("coursePackageId", coursePackageId));
+    }
+}
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 25393f0..0934313 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,6 +2,7 @@
 
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dsh.course.entity.*;
 import com.dsh.course.feignclient.account.AppUserClient;
 import com.dsh.course.feignclient.account.StudentClient;
@@ -11,6 +12,8 @@
 import com.dsh.course.feignclient.other.StoreClient;
 import com.dsh.course.feignclient.other.model.Store;
 import com.dsh.course.model.BaseVo;
+import com.dsh.course.model.QueryRegistrationRecord;
+import com.dsh.course.model.QueryWalkInStudentList;
 import com.dsh.course.model.dto.DiscountJsonDto;
 import com.dsh.course.model.vo.CourseDetailRequest;
 import com.dsh.course.model.vo.RegisterCourseVo;
@@ -790,4 +793,54 @@
                 .eq("code",code));
     }
 
+
+    /**
+     * 获取课包报名信息列表
+     * @param queryRegistrationRecord
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/coursePackagePayment/queryRegistrationRecord")
+    public Page<Map<String, Object>> queryRegistrationRecord(@RequestBody QueryRegistrationRecord queryRegistrationRecord){
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage(queryRegistrationRecord.getLimit(), queryRegistrationRecord.getOffset(), queryRegistrationRecord.getSort(), queryRegistrationRecord.getOrder());
+        Page<Map<String, Object>> mapPage = page.setRecords(packagePaymentService.queryRegistrationRecord(page, queryRegistrationRecord));
+        return mapPage;
+    }
+
+
+    /**
+     * 获取未预约排课学员列表
+     * @param queryWalkInStudentList
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/coursePackagePayment/queryWalkInStudentList")
+    public Page<Map<String, Object>> queryWalkInStudentList(@RequestBody QueryWalkInStudentList queryWalkInStudentList){
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage(queryWalkInStudentList.getLimit(), queryWalkInStudentList.getOffset(), queryWalkInStudentList.getSort(), queryWalkInStudentList.getOrder());
+        Page<Map<String, Object>> mapPage = page.setRecords(packagePaymentService.queryWalkInStudentList(page, queryWalkInStudentList));
+        return mapPage;
+    }
+
+
+    /**
+     * 根据id获取数据
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/coursePackagePayment/queryCoursePackagePaymentById")
+    public TCoursePackagePayment queryCoursePackagePaymentById(@RequestBody Long id){
+        return packagePaymentService.getById(id);
+    }
+
+
+    /**
+     * 修改数据
+     * @param coursePackagePayment
+     */
+    @ResponseBody
+    @PostMapping("/coursePackagePayment/editCoursePackagePayment")
+    public void editCoursePackagePayment(TCoursePackagePayment coursePackagePayment){
+        packagePaymentService.updateById(coursePackagePayment);
+    }
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageSchedulingController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageSchedulingController.java
new file mode 100644
index 0000000..9fb040b
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageSchedulingController.java
@@ -0,0 +1,61 @@
+package com.dsh.course.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dsh.course.entity.CoursePackageScheduling;
+import com.dsh.course.model.QueryCoursePackageSchedulingList;
+import com.dsh.course.service.ICoursePackageSchedulingService;
+import com.dsh.course.util.PageFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/11 10:58
+ */
+@RestController
+@RequestMapping("")
+public class CoursePackageSchedulingController {
+
+    @Autowired
+    private ICoursePackageSchedulingService coursePackageSchedulingService;
+
+
+    /**
+     * 获取课包排课列表
+     * @param queryCoursePackageSchedulingList
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/coursePackageScheduling/queryCoursePackageSchedulingList")
+    public Page<Map<String, Object>> queryCoursePackageSchedulingList(@RequestBody QueryCoursePackageSchedulingList queryCoursePackageSchedulingList){
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage(queryCoursePackageSchedulingList.getLimit(), queryCoursePackageSchedulingList.getOffset(),
+                queryCoursePackageSchedulingList.getSort(), queryCoursePackageSchedulingList.getOrder());
+        Page<Map<String, Object>> mapPage = page.setRecords(coursePackageSchedulingService.queryCoursePackageSchedulingList(page, queryCoursePackageSchedulingList));
+        return mapPage;
+    }
+
+
+    /**
+     * 根据id获取数据
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/coursePackageScheduling/queryCoursePackageSchedulingById")
+    public CoursePackageScheduling queryCoursePackageSchedulingById(@RequestBody Long id){
+        return coursePackageSchedulingService.getById(id);
+    }
+
+
+    /**
+     * 编辑数据
+     * @param coursePackageScheduling
+     */
+    @ResponseBody
+    @PostMapping("/coursePackageScheduling/editCoursePackageScheduling")
+    public void editCoursePackageScheduling(@RequestBody CoursePackageScheduling coursePackageScheduling){
+        coursePackageSchedulingService.updateById(coursePackageScheduling);
+    }
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageStudentController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageStudentController.java
new file mode 100644
index 0000000..0cce987
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageStudentController.java
@@ -0,0 +1,121 @@
+package com.dsh.course.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dsh.course.entity.CoursePackageStudent;
+import com.dsh.course.model.QueryCoursePackageStudent;
+import com.dsh.course.model.QueryCoursePackageStudentList;
+import com.dsh.course.service.CoursePackageStudentService;
+import com.dsh.course.util.PageFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/11 17:39
+ */
+@RestController
+@RequestMapping("")
+public class CoursePackageStudentController {
+
+    @Autowired
+    private CoursePackageStudentService coursePackageStudentService;
+
+
+    /**
+     * 根据排课id获取预约数据
+     * @param queryCoursePackageStudentList
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/coursePackageStudent/queryCoursePackageStudentList")
+    public Page<Map<String, Object>> queryCoursePackageStudentList(@RequestBody QueryCoursePackageStudentList queryCoursePackageStudentList){
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage(queryCoursePackageStudentList.getLimit(), queryCoursePackageStudentList.getOffset(),
+                queryCoursePackageStudentList.getSort(), queryCoursePackageStudentList.getOrder());
+        Page<Map<String, Object>> mapPage = page.setRecords(coursePackageStudentService.queryCoursePackageStudentList(page, queryCoursePackageStudentList));
+        return mapPage;
+    }
+
+
+    /**
+     * 根据id获取数据
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/coursePackageStudent/queryCoursePackageStudentById")
+    public CoursePackageStudent queryCoursePackageStudentById(@RequestBody Long id){
+        return coursePackageStudentService.getById(id);
+    }
+
+
+    /**
+     * 修改数据
+     * @param coursePackageStudent
+     */
+    @ResponseBody
+    @PostMapping("/coursePackageStudent/editCoursePackageStudent")
+    public void editCoursePackageStudent(@RequestBody CoursePackageStudent coursePackageStudent){
+        coursePackageStudentService.updateById(coursePackageStudent);
+    }
+
+
+    /**
+     * 根据排课id获取预约数据
+     * @param coursePackageSchedulingId
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/coursePackageStudent/queryByCoursePackageSchedulingId")
+    public List<CoursePackageStudent> queryByCoursePackageSchedulingId(@RequestBody Long coursePackageSchedulingId){
+        return coursePackageStudentService.list(new QueryWrapper<CoursePackageStudent>().eq("coursePackageSchedulingId", coursePackageSchedulingId));
+    }
+
+
+    /**
+     * 获取上课记录数据
+     * @param queryCoursePackageStudent
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/coursePackageStudent/queryCoursePackageStudent")
+    public List<CoursePackageStudent> queryCoursePackageStudent(@RequestBody QueryCoursePackageStudent queryCoursePackageStudent){
+        QueryWrapper<CoursePackageStudent> wrapper = new QueryWrapper<>();
+        if(null != queryCoursePackageStudent.getAppUserId()){
+            wrapper.eq("appUserId", queryCoursePackageStudent.getAppUserId());
+        }
+        if(null != queryCoursePackageStudent.getStudentId()){
+            wrapper.eq("studentId", queryCoursePackageStudent.getStudentId());
+        }
+        if(null != queryCoursePackageStudent.getCoursePackageId()){
+            wrapper.eq("coursePackageId", queryCoursePackageStudent.getCoursePackageId());
+        }
+        if(null != queryCoursePackageStudent.getCoursePackagePaymentId()){
+            wrapper.eq("coursePackagePaymentId", queryCoursePackageStudent.getCoursePackagePaymentId());
+        }
+        if(null != queryCoursePackageStudent.getCoursePackageSchedulingId()){
+            wrapper.eq("coursePackageSchedulingId", queryCoursePackageStudent.getCoursePackageSchedulingId());
+        }
+        if(null != queryCoursePackageStudent.getSignInOrNot()){
+            wrapper.eq("signInOrNot", queryCoursePackageStudent.getSignInOrNot());
+        }
+        if(null != queryCoursePackageStudent.getReservationStatus()){
+            wrapper.eq("reservationStatus", queryCoursePackageStudent.getReservationStatus());
+        }
+        return coursePackageStudentService.list(wrapper);
+    }
+
+
+    /**
+     * 添加学员上课数据
+     * @param coursePackageStudent
+     */
+    @ResponseBody
+    @PostMapping("/coursePackageStudent/addCoursePackageStudent")
+    public void addCoursePackageStudent(@RequestBody CoursePackageStudent coursePackageStudent){
+        coursePackageStudentService.save(coursePackageStudent);
+    }
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/CancelledClasses.java b/cloud-server-course/src/main/java/com/dsh/course/entity/CancelledClasses.java
index dcb3bc7..7a88b5c 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/entity/CancelledClasses.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/entity/CancelledClasses.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -49,6 +50,11 @@
     @TableField("coursePackagePaymentId")
     private Long coursePackagePaymentId;
     /**
+     * 排课记录id
+     */
+    @TableField("coursePackageSchedulingId")
+    private Long coursePackageSchedulingId;
+    /**
      * 消课凭证
      */
     @TableField("voucher")
@@ -62,6 +68,7 @@
      * 添加时间
      */
     @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date insertTime;
 
 
diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackageScheduling.java b/cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackageScheduling.java
new file mode 100644
index 0000000..360b35a
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/entity/CoursePackageScheduling.java
@@ -0,0 +1,66 @@
+package com.dsh.course.entity;
+
+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 com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/11 10:46
+ */
+@Data
+@TableName("t_course_package_scheduling")
+public class CoursePackageScheduling {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.NONE)
+    private Long id;
+    /**
+     * 课包id
+     */
+    @TableField("coursePackageId")
+    private Integer coursePackageId;
+    /**
+     * 上课日期
+     */
+    @TableField("classDate")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date classDate;
+    /**
+     * 结束时间
+     */
+    @TableField("endDate")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endDate;
+    /**
+     * 课后练习课程id
+     */
+    @TableField("courseId")
+    private Integer courseId;
+    /**
+     * 可获得积分
+     */
+    @TableField("integral")
+    private Integer integral;
+    /**
+     * 消课凭证
+     */
+    @TableField("cancelClasses")
+    private String cancelClasses;
+    /**
+     * 扣除课时
+     */
+    @TableField("deductClassHour")
+    private Integer deductClassHour;
+    /**
+     * 状态(1=未开始,2=已开始,3=已结束,4=已取消)
+     */
+    @TableField("status")
+    private Integer status;
+}
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 986b38d..767ae15 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
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -52,7 +53,12 @@
      * 课包购买记录id
      */
     @TableField("coursePackagePaymentId")
-    private Integer coursePackagePaymentId;
+    private Long coursePackagePaymentId;
+    /**
+     * 排课记录id
+     */
+    @TableField("coursePackageSchedulingId")
+    private Long coursePackageSchedulingId;
     /**
      * 到课状态(0=否,1=是)
      */
@@ -64,6 +70,7 @@
     @TableField("reservationStatus")
     private Integer reservationStatus;
     @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date insertTime;
 
 
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 268ad4b..48ac5e9 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
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -71,6 +72,7 @@
      * 添加时间
      */
     @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date insertTime;
 
 
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 bfd418b..466651b 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
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -98,6 +99,11 @@
     @TableField("absencesNumber")
     private Integer absencesNumber;
     /**
+     * 退课课时
+     */
+    @TableField("dropoutsNumber")
+    private Integer dropoutsNumber;
+    /**
      * 支付用户类型(1=用户,2=管理员)
      */
     @TableField("payUserType")
@@ -126,6 +132,7 @@
      * 退课时间
      */
     @TableField("withdrawalTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date withdrawalTime;
     /**
      * 退课凭证
@@ -141,6 +148,7 @@
      * 添加时间
      */
     @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date insertTime;
 
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/feignclient/account/AppUserClient.java b/cloud-server-course/src/main/java/com/dsh/course/feignclient/account/AppUserClient.java
index 884dc02..ccfb109 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/feignclient/account/AppUserClient.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/feignclient/account/AppUserClient.java
@@ -4,6 +4,8 @@
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 
+import java.util.List;
+
 /**
  * @author zhibing.pu
  * @date 2023/6/29 14:09
@@ -26,4 +28,13 @@
      */
     @PostMapping("/base/appUser/updateAppUser")
     void updateAppUser(AppUser appUser);
+
+
+    /**
+     * 根据名称模糊查询用户信息
+     * @param name
+     * @return
+     */
+    @PostMapping("/appUser/queryAppUserListByName")
+    List<AppUser> queryAppUserListByName(String name);
 }
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
index 6512bb9..5754fcc 100644
--- 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
@@ -4,6 +4,8 @@
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 
+import java.util.List;
+
 /**
  * @author zhibing.pu
  * @date 2023/7/4 23:38
@@ -28,4 +30,13 @@
      */
     @PostMapping("/student/queryStudentById")
     Student queryStudentById(Integer id);
+
+
+    /**
+     * 根据名称模糊搜索数据
+     * @param name
+     * @return
+     */
+    @PostMapping("/student/queryStudentListByName")
+    List<Student> queryStudentListByName(String name);
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/mapper/CoursePackageSchedulingMapper.java b/cloud-server-course/src/main/java/com/dsh/course/mapper/CoursePackageSchedulingMapper.java
new file mode 100644
index 0000000..fde8a3a
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/mapper/CoursePackageSchedulingMapper.java
@@ -0,0 +1,26 @@
+package com.dsh.course.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dsh.course.entity.CoursePackageScheduling;
+import com.dsh.course.model.QueryCoursePackageSchedulingList;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/11 10:55
+ */
+public interface CoursePackageSchedulingMapper extends BaseMapper<CoursePackageScheduling> {
+
+
+    /**
+     * 获取课包排课数据
+     * @param page
+     * @param queryCoursePackageSchedulingList
+     * @return
+     */
+    List<Map<String, Object>> queryCoursePackageSchedulingList(Page<Map<String, Object>> page, @Param("item") QueryCoursePackageSchedulingList queryCoursePackageSchedulingList);
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/mapper/CoursePackageStudentMapper.java b/cloud-server-course/src/main/java/com/dsh/course/mapper/CoursePackageStudentMapper.java
index d6057a6..3a6eba8 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/mapper/CoursePackageStudentMapper.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/mapper/CoursePackageStudentMapper.java
@@ -1,7 +1,12 @@
 package com.dsh.course.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dsh.course.entity.CoursePackageStudent;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -14,4 +19,14 @@
 public interface CoursePackageStudentMapper extends BaseMapper<CoursePackageStudent> {
 
 
+    /**
+     * 获取排课预约信息
+     * @param page
+     * @param coursePackageSchedulingId
+     * @param userId
+     * @param studentId
+     * @return
+     */
+    List<Map<String, Object>> queryCoursePackageStudentList(Page<Map<String, Object>> page, @Param("coursePackageSchedulingId") Long coursePackageSchedulingId,
+                                                            @Param("userId") List<Integer> userId, @Param("studentId") List<Integer> studentId);
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackageMapper.java b/cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackageMapper.java
index 7fc5e6c..f85010f 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackageMapper.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackageMapper.java
@@ -5,6 +5,7 @@
 import com.dsh.course.entity.TCoursePackage;
 import com.dsh.course.feignclient.model.CourseOfStoreVo;
 import com.dsh.course.model.QueryCoursePackageLists;
+import com.dsh.course.model.QueryExamineCoursePackageLists;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -31,4 +32,14 @@
      */
     List<Map<String, Object>> queryCoursePackageLists(Page<Map<String, Object>> page, @Param("item") QueryCoursePackageLists queryCoursePackageLists);
 
+
+
+    /**
+     * 获取课包审核列表
+     * @param page
+     * @param queryExamineCoursePackageLists
+     * @return
+     */
+    List<Map<String, Object>> queryExamineCoursePackageLists(Page<Map<String, Object>> page, @Param("item") QueryExamineCoursePackageLists queryExamineCoursePackageLists);
+
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackagePaymentMapper.java b/cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackagePaymentMapper.java
index ad694c5..f2f44d9 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackagePaymentMapper.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackagePaymentMapper.java
@@ -1,8 +1,13 @@
 package com.dsh.course.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dsh.course.entity.TCoursePackagePayment;
+import com.dsh.course.model.QueryRegistrationRecord;
 import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -25,4 +30,24 @@
 
     TCoursePackagePayment getCoursePackagePaymentByCode(@Param("code") String code);
 
+
+    /**
+     * 获取课包报名信息
+     * @param page
+     * @return
+     */
+    List<Map<String, Object>> queryRegistrationRecord(Page<Map<String, Object>> page, @Param("coursePackageId") Integer coursePackageId,
+                                                      @Param("userIds") List<Integer> userIds, @Param("studentIds") List<Integer> studentIds);
+
+
+    /**
+     * 获取未预约排课学员列表
+     * @param page
+     * @param coursePackagePaymentId
+     * @param userIds
+     * @param studentIds
+     * @return
+     */
+    List<Map<String, Object>> queryWalkInStudentList(Page<Map<String, Object>> page, @Param("coursePackageId") Integer coursePackageId, @Param("coursePackagePaymentId") List<Long> coursePackagePaymentId,
+                                                     @Param("userIds") List<Integer> userIds, @Param("studentIds") List<Integer> studentIds);
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/QueryCoursePackageSchedulingList.java b/cloud-server-course/src/main/java/com/dsh/course/model/QueryCoursePackageSchedulingList.java
new file mode 100644
index 0000000..d2d9ff2
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/QueryCoursePackageSchedulingList.java
@@ -0,0 +1,20 @@
+package com.dsh.course.model;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/11 11:00
+ */
+@Data
+public class QueryCoursePackageSchedulingList {
+    /**
+     * 课包id
+     */
+    private Integer coursePackageId;
+
+    private String order;
+    private Integer offset;
+    private Integer limit;
+    private String sort;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/QueryCoursePackageStudent.java b/cloud-server-course/src/main/java/com/dsh/course/model/QueryCoursePackageStudent.java
new file mode 100644
index 0000000..86cc81c
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/QueryCoursePackageStudent.java
@@ -0,0 +1,39 @@
+package com.dsh.course.model;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/12 3:12
+ */
+@Data
+public class QueryCoursePackageStudent {
+    /**
+     * 用户id
+     */
+    private Integer appUserId;
+    /**
+     * 学员id
+     */
+    private Integer studentId;
+    /**
+     * 课包id
+     */
+    private Integer coursePackageId;
+    /**
+     * 课包购买记录id
+     */
+    private Long coursePackagePaymentId;
+    /**
+     * 排课记录id
+     */
+    private Long coursePackageSchedulingId;
+    /**
+     * 到课状态(0=否,1=是)
+     */
+    private Integer signInOrNot;
+    /**
+     * 预约状态(0=取消,1=预约)
+     */
+    private Integer reservationStatus;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/QueryCoursePackageStudentList.java b/cloud-server-course/src/main/java/com/dsh/course/model/QueryCoursePackageStudentList.java
new file mode 100644
index 0000000..b35f3a3
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/QueryCoursePackageStudentList.java
@@ -0,0 +1,28 @@
+package com.dsh.course.model;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/11 17:07
+ */
+@Data
+public class QueryCoursePackageStudentList {
+    /**
+     * 排课id
+     */
+    private Long coursePackageSchedulingId;
+    /**
+     * 用户姓名
+     */
+    private String userName;
+    /**
+     * 学员姓名
+     */
+    private String studentName;
+
+    private String order;
+    private Integer offset;
+    private Integer limit;
+    private String sort;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/QueryExamineCoursePackageLists.java b/cloud-server-course/src/main/java/com/dsh/course/model/QueryExamineCoursePackageLists.java
new file mode 100644
index 0000000..0e50791
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/QueryExamineCoursePackageLists.java
@@ -0,0 +1,36 @@
+package com.dsh.course.model;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/13 3:22
+ */
+@Data
+public class QueryExamineCoursePackageLists {
+    /**
+     * 省编号
+     */
+    private String provinceCode;
+    /**
+     * 市编号
+     */
+    private String cityCode;
+    /**
+     * 课程类型id
+     */
+    private Integer coursePackageTypeId;
+    /**
+     * 课程名称
+     */
+    private String name;
+    /**
+     * 审核状态(1=待审核,2=已同意,3=已拒绝)
+     */
+    private Integer auditStatus;
+
+    private String order;
+    private Integer offset;
+    private Integer limit;
+    private String sort;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/QueryRegistrationRecord.java b/cloud-server-course/src/main/java/com/dsh/course/model/QueryRegistrationRecord.java
new file mode 100644
index 0000000..880b91d
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/QueryRegistrationRecord.java
@@ -0,0 +1,28 @@
+package com.dsh.course.model;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/10 19:47
+ */
+@Data
+public class QueryRegistrationRecord {
+    /**
+     * 课程id
+     */
+    private Integer coursePackageId;
+    /**
+     * 用户名称
+     */
+    private String userName;
+    /**
+     * 学员名称
+     */
+    private String studentName;
+
+    private String order;
+    private Integer offset;
+    private Integer limit;
+    private String sort;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/QueryWalkInStudentList.java b/cloud-server-course/src/main/java/com/dsh/course/model/QueryWalkInStudentList.java
new file mode 100644
index 0000000..2f14e62
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/QueryWalkInStudentList.java
@@ -0,0 +1,28 @@
+package com.dsh.course.model;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/12 2:46
+ */
+@Data
+public class QueryWalkInStudentList {
+    /**
+     * 课程id
+     */
+    private Long coursePackageSchedulingId;
+    /**
+     * 用户名称
+     */
+    private String userName;
+    /**
+     * 学员名称
+     */
+    private String studentName;
+
+    private String order;
+    private Integer offset;
+    private Integer limit;
+    private String sort;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/WeekEnum.java b/cloud-server-course/src/main/java/com/dsh/course/model/WeekEnum.java
new file mode 100644
index 0000000..b1dca78
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/WeekEnum.java
@@ -0,0 +1,51 @@
+package com.dsh.course.model;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/11 14:05
+ */
+public enum WeekEnum {
+    Sunday(1, "周日"),
+    Monday(2, "周一"),
+    Tuesday(3, "周二"),
+    Wednesday(4, "周三"),
+    Thursday(5, "周四"),
+    Friday(6, "周五"),
+    Saturday(7, "周六");
+
+
+    WeekEnum(Integer week, String chineseName) {
+        this.week = week;
+        this.chineseName = chineseName;
+    }
+
+    private Integer week;
+    private String chineseName;
+
+    public Integer getWeek() {
+        return week;
+    }
+
+    public void setWeek(Integer week) {
+        this.week = week;
+    }
+
+    public String getChineseName() {
+        return chineseName;
+    }
+
+    public void setChineseName(String chineseName) {
+        this.chineseName = chineseName;
+    }
+
+
+    public static WeekEnum getWeekEnum(Integer week){
+        WeekEnum[] values = WeekEnum.values();
+        for (WeekEnum value : values) {
+            if(week == value.getWeek()){
+                return value;
+            }
+        }
+        return null;
+    }
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/CoursePackageStudentService.java b/cloud-server-course/src/main/java/com/dsh/course/service/CoursePackageStudentService.java
index 3f623f4..817ccc0 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/service/CoursePackageStudentService.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/CoursePackageStudentService.java
@@ -1,7 +1,12 @@
 package com.dsh.course.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dsh.course.entity.CoursePackageStudent;
+import com.dsh.course.model.QueryCoursePackageStudentList;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -14,5 +19,11 @@
 public interface CoursePackageStudentService extends IService<CoursePackageStudent> {
 
 
+    /**
+     * 获取排课预约数据
+     * @param queryCoursePackageStudentList
+     * @return
+     */
+    List<Map<String, Object>> queryCoursePackageStudentList(Page<Map<String, Object>> page, QueryCoursePackageStudentList queryCoursePackageStudentList);
 
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/ICoursePackageSchedulingService.java b/cloud-server-course/src/main/java/com/dsh/course/service/ICoursePackageSchedulingService.java
new file mode 100644
index 0000000..b337bd7
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/ICoursePackageSchedulingService.java
@@ -0,0 +1,37 @@
+package com.dsh.course.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dsh.course.entity.CoursePackageScheduling;
+import com.dsh.course.model.QueryCoursePackageSchedulingList;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/11 10:57
+ */
+public interface ICoursePackageSchedulingService extends IService<CoursePackageScheduling> {
+
+
+    /**
+     * 获取课包排课数据
+     * @param page
+     * @param queryCoursePackageSchedulingList
+     * @return
+     */
+    List<Map<String, Object>> queryCoursePackageSchedulingList(Page<Map<String, Object>> page, QueryCoursePackageSchedulingList queryCoursePackageSchedulingList);
+
+
+    /**
+     * 定时任务添加排课数据
+     */
+    void taskAddData();
+
+
+    /**
+     * 定时修改状态
+     */
+    void taskSetStatus();
+}
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 13ebdf2..e92e51f 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
@@ -1,8 +1,11 @@
 package com.dsh.course.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dsh.course.entity.TCoursePackagePayment;
 import com.dsh.course.feignclient.model.RecordAppoint;
+import com.dsh.course.model.QueryRegistrationRecord;
+import com.dsh.course.model.QueryWalkInStudentList;
 import com.dsh.course.model.vo.RegisterCourseVo;
 import com.dsh.course.model.vo.request.ClasspaymentRequest;
 import com.dsh.course.model.vo.request.CourseOfAfterRequest;
@@ -14,6 +17,7 @@
 import com.dsh.course.util.ResultUtil;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -88,4 +92,21 @@
 
     ResultUtil insertVipPaymentCallback(String code, String orderNumber);
 
+
+    /**
+     * 获取课包报名信息
+     * @param page
+     * @param queryRegistrationRecord
+     * @return
+     */
+    List<Map<String, Object>> queryRegistrationRecord(Page<Map<String, Object>> page, QueryRegistrationRecord queryRegistrationRecord);
+
+
+    /**
+     * 获取未预约排课学员列表
+     * @param page
+     * @param queryWalkInStudentList
+     * @return
+     */
+    List<Map<String, Object>> queryWalkInStudentList(Page<Map<String, Object>> page, QueryWalkInStudentList queryWalkInStudentList);
 }
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 69b376c..d7d6a12 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
@@ -6,6 +6,7 @@
 import com.dsh.course.feignclient.model.CourseOfStoreVo;
 import com.dsh.course.model.*;
 import com.dsh.course.util.ResultUtil;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.List;
 import java.util.Map;
@@ -59,4 +60,28 @@
      * @return
      */
     List<Map<String, Object>> queryCoursePackageLists(Page<Map<String, Object>> page, QueryCoursePackageLists queryCoursePackageLists);
+
+
+    /**
+     * 添加课包
+     * @param coursePackage
+     * @return
+     */
+    Integer addCoursePackage(TCoursePackage coursePackage);
+
+
+    /**
+     * 修改数据
+     * @param coursePackage
+     */
+    void updateCoursePackageById(TCoursePackage coursePackage);
+
+
+
+    /**
+     * 获取课包审核列表
+     * @param queryExamineCoursePackageLists
+     * @return
+     */
+    List<Map<String, Object>> queryExamineCoursePackageLists(Page<Map<String, Object>> page, QueryExamineCoursePackageLists queryExamineCoursePackageLists);
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageSchedulingServiceImpl.java b/cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageSchedulingServiceImpl.java
new file mode 100644
index 0000000..97cab75
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageSchedulingServiceImpl.java
@@ -0,0 +1,131 @@
+package com.dsh.course.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dsh.course.entity.CoursePackageScheduling;
+import com.dsh.course.entity.CoursePackageStudent;
+import com.dsh.course.entity.TCoursePackage;
+import com.dsh.course.mapper.CoursePackageSchedulingMapper;
+import com.dsh.course.model.QueryCoursePackageSchedulingList;
+import com.dsh.course.service.CoursePackageStudentService;
+import com.dsh.course.service.ICoursePackageSchedulingService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/11 10:58
+ */
+@Service
+public class CoursePackageSchedulingServiceImpl extends ServiceImpl<CoursePackageSchedulingMapper, CoursePackageScheduling> implements ICoursePackageSchedulingService {
+
+    @Autowired
+    private CoursePackageStudentService coursePackageStudentService;
+
+    @Autowired
+    private TCoursePackageServiceImpl coursePackageService;
+
+    @Resource
+    private CoursePackageSchedulingMapper coursePackageSchedulingMapper;
+
+
+
+
+
+    /**
+     * 获取课包排课数据
+     * @param page
+     * @param queryCoursePackageSchedulingList
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> queryCoursePackageSchedulingList(Page<Map<String, Object>> page, QueryCoursePackageSchedulingList queryCoursePackageSchedulingList) {
+        List<Map<String, Object>> list = this.baseMapper.queryCoursePackageSchedulingList(page, queryCoursePackageSchedulingList);
+        for (Map<String, Object> map : list) {
+            Long id = Long.valueOf(map.get("id").toString());
+            int count = coursePackageStudentService.count(new QueryWrapper<CoursePackageStudent>().eq("coursePackageSchedulingId", id).eq("reservationStatus", 1));
+            map.put("registered", count);
+            int count1 = coursePackageStudentService.count(new QueryWrapper<CoursePackageStudent>().eq("coursePackageSchedulingId", id).eq("signInOrNot", 1));
+            map.put("actualArrival", count1);
+            map.put("nonArrival", count - count1);
+        }
+        return list;
+    }
+
+
+    /**
+     * 定时添加排课数据
+     */
+    @Override
+    public void taskAddData() {
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    List<TCoursePackage> list = coursePackageService.list(new QueryWrapper<TCoursePackage>().eq("status", 2).eq("auditStatus", 2).eq("state", 1));
+                    for (TCoursePackage tCoursePackage : list) {
+                        CoursePackageScheduling coursePackageScheduling = coursePackageSchedulingMapper.selectOne(new QueryWrapper<CoursePackageScheduling>().eq("coursePackageId", tCoursePackage.getId()).last(" order by classDate desc limit 0, 1"));
+                        Calendar calendar = Calendar.getInstance();
+                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                        if(null != coursePackageScheduling){
+                            calendar.setTime(sdf1.parse(sdf.format(coursePackageScheduling.getClassDate()) + " 00:00:00"));
+                            calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 1);
+                        }else{
+                            calendar.setTime(sdf1.parse(sdf.format(new Date()) + " 00:00:00"));
+                        }
+                        coursePackageScheduling = new CoursePackageScheduling();
+                        coursePackageScheduling.setCoursePackageId(tCoursePackage.getId());
+                        coursePackageScheduling.setClassDate(calendar.getTime());
+                        coursePackageScheduling.setStatus(1);
+                        coursePackageSchedulingMapper.insert(coursePackageScheduling);
+                    }
+                }catch (Exception e){
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+    }
+
+
+    /**
+     * 定时修改状态
+     */
+    @Override
+    public void taskSetStatus() {
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                //开始数据
+                List<CoursePackageScheduling> coursePackageSchedulings = coursePackageSchedulingMapper.selectList(new QueryWrapper<CoursePackageScheduling>().eq("status", 1).last(" and now() >= classDate and now() < endDate"));
+                for (CoursePackageScheduling coursePackageScheduling : coursePackageSchedulings) {
+                    coursePackageScheduling.setStatus(2);
+                    coursePackageScheduling.setCoursePackageId(null);
+                    coursePackageSchedulingMapper.updateById(coursePackageScheduling);
+
+                    TCoursePackage coursePackage = coursePackageService.getById(coursePackageScheduling.getCoursePackageId());
+                    if(coursePackage.getStatus() == 1){
+                        coursePackage.setStatus(2);
+                        coursePackageService.updateById(coursePackage);
+                    }
+                }
+
+                //结束数据
+                coursePackageSchedulings = coursePackageSchedulingMapper.selectList(new QueryWrapper<CoursePackageScheduling>().eq("status", 2).last(" and now() >= endDate"));
+                for (CoursePackageScheduling coursePackageScheduling : coursePackageSchedulings) {
+                    coursePackageScheduling.setStatus(3);
+                    coursePackageScheduling.setCoursePackageId(null);
+                    coursePackageSchedulingMapper.updateById(coursePackageScheduling);
+                }
+            }
+        }).start();
+    }
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageStudentServiceImpl.java b/cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageStudentServiceImpl.java
index 7d1f58c..c420f00 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageStudentServiceImpl.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageStudentServiceImpl.java
@@ -1,10 +1,25 @@
 package com.dsh.course.service.impl;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dsh.course.entity.CoursePackageStudent;
+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.mapper.CoursePackageStudentMapper;
+import com.dsh.course.model.QueryCoursePackageStudentList;
 import com.dsh.course.service.CoursePackageStudentService;
+import com.dsh.course.util.ToolUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -17,5 +32,51 @@
 @Service
 public class CoursePackageStudentServiceImpl extends ServiceImpl<CoursePackageStudentMapper, CoursePackageStudent> implements CoursePackageStudentService {
 
+    @Resource
+    private AppUserClient appUserClient;
 
+    @Resource
+    private StudentClient studentClient;
+
+
+
+
+
+    /**
+     * 获取排课预约数据
+     * @param queryCoursePackageStudentList
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> queryCoursePackageStudentList(Page<Map<String, Object>> page, QueryCoursePackageStudentList queryCoursePackageStudentList) {
+        List<Integer> userId = null;
+        List<Integer> studentId = null;
+        if(ToolUtil.isNotEmpty(queryCoursePackageStudentList.getUserName())){
+            List<AppUser> appUsers = appUserClient.queryAppUserListByName(queryCoursePackageStudentList.getUserName());
+            if(appUsers.size() > 0){
+                userId = appUsers.stream().map(AppUser::getId).collect(Collectors.toList());
+            }
+        }
+        if(ToolUtil.isNotEmpty(queryCoursePackageStudentList.getStudentName())){
+            List<Student> students = studentClient.queryStudentListByName(queryCoursePackageStudentList.getStudentName());
+            if(students.size() > 0){
+                studentId = students.stream().map(Student::getId).collect(Collectors.toList());
+            }
+        }
+        List<Map<String, Object>> list = this.baseMapper.queryCoursePackageStudentList(page, queryCoursePackageStudentList.getCoursePackageSchedulingId(), userId, studentId);
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
+        Integer now = Integer.valueOf(sdf.format(new Date()));
+        for (Map<String, Object> map : list) {
+            Integer appUserId = Integer.valueOf(map.get("appUserId").toString());
+            Integer student_Id = Integer.valueOf(map.get("studentId").toString());
+            AppUser appUser = appUserClient.queryAppUser(appUserId);
+            Student student = studentClient.queryStudentById(student_Id);
+            map.put("userName", appUser.getName());
+            map.put("phone", student.getPhone());
+            map.put("studentName", student.getName());
+            map.put("age", null != student.getBirthday() ? now - Integer.valueOf(sdf.format(student.getBirthday())) : "-");
+            map.put("sex", student.getSex());
+        }
+        return list;
+    }
 }
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 6e19834..7502215 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
@@ -5,12 +5,15 @@
 import com.alipay.api.domain.Person;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dsh.course.entity.*;
 import com.dsh.course.feignclient.account.AppUserClient;
 import com.dsh.course.feignclient.account.CoachClient;
+import com.dsh.course.feignclient.account.StudentClient;
 import com.dsh.course.feignclient.account.model.AppUser;
 import com.dsh.course.feignclient.account.model.Coach;
+import com.dsh.course.feignclient.account.model.Student;
 import com.dsh.course.feignclient.activity.BenefitVideoClient;
 import com.dsh.course.feignclient.activity.CouponClient;
 import com.dsh.course.feignclient.activity.model.BenefitsVideos;
@@ -19,6 +22,8 @@
 import com.dsh.course.feignclient.other.StoreClient;
 import com.dsh.course.feignclient.other.model.Store;
 import com.dsh.course.mapper.*;
+import com.dsh.course.model.QueryRegistrationRecord;
+import com.dsh.course.model.QueryWalkInStudentList;
 import com.dsh.course.model.dto.DiscountJsonDto;
 import com.dsh.course.model.vo.RegisterCourseVo;
 import com.dsh.course.model.vo.request.ClasspaymentRequest;
@@ -28,10 +33,12 @@
 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.ICoursePackageSchedulingService;
 import com.dsh.course.service.TCoursePackagePaymentService;
 import com.dsh.course.util.*;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -58,7 +65,6 @@
     @Resource
     private BenefitVideoClient bfvoClient;
 
-
     @Resource
     private UserVideoDetailsMapper uvdmapper;
 
@@ -83,7 +89,6 @@
     @Resource
     private TCoursePackageDiscountMapper tcpdMapper;
 
-
     @Resource
     private CoursePackagePaymentConfigMapper cpConfigMapper;
 
@@ -95,6 +100,16 @@
 
     @Resource
     private AppUserClient appuClient;
+
+    @Resource
+    private StudentClient studentClient;
+
+    @Autowired
+    private ICoursePackageSchedulingService coursePackageSchedulingService;
+
+
+
+
 
 
     /**
@@ -633,4 +648,95 @@
     }
 
 
+    /**
+     * 获取课包报名信息
+     * @param page
+     * @param queryRegistrationRecord
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> queryRegistrationRecord(Page<Map<String, Object>> page, QueryRegistrationRecord queryRegistrationRecord) {
+        Integer coursePackageId = queryRegistrationRecord.getCoursePackageId();
+        String userName = queryRegistrationRecord.getUserName();
+        List<Integer> userIds = null;
+        List<Integer> studentIds = null;
+        if(ToolUtil.isNotEmpty(userName)){
+            List<AppUser> appUsers = appuClient.queryAppUserListByName(userName);
+            if(appUsers.size() > 0){
+                userIds = appUsers.stream().map(AppUser::getId).collect(Collectors.toList());
+            }
+        }
+        String studentName = queryRegistrationRecord.getStudentName();
+        if(ToolUtil.isNotEmpty(studentName)){
+            List<Student> students = studentClient.queryStudentListByName(studentName);
+            if(students.size() > 0){
+                studentIds = students.stream().map(Student::getId).collect(Collectors.toList());
+            }
+        }
+        List<Map<String, Object>> list = this.baseMapper.queryRegistrationRecord(page, coursePackageId, userIds, studentIds);
+        for (Map<String, Object> map : list) {
+            Long id = Long.valueOf(map.get("id").toString());
+            Integer appUserId = Integer.valueOf(map.get("appUserId").toString());
+            Integer studentId = Integer.valueOf(map.get("studentId").toString());
+            AppUser appUser = appuClient.queryAppUser(appUserId);
+            map.put("userName", null != appUser ? appUser.getName() : "");
+            map.put("phone", null != appUser ? appUser.getPhone() : "");
+            Student student = studentClient.queryStudentById(studentId);
+            map.put("studentName", null != student ? student.getName() : "");
+            Integer integer = cpsMapper.selectCount(new QueryWrapper<CoursePackageStudent>().eq("appUserId", appUserId)
+                    .eq("studentId", studentId).eq("coursePackagePaymentId", id).eq("signInOrNot", 1));
+            map.put("already", integer);
+        }
+        return list;
+    }
+
+
+    /**
+     * 获取未预约排课学员列表
+     * @param page
+     * @param queryWalkInStudentList
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> queryWalkInStudentList(Page<Map<String, Object>> page, QueryWalkInStudentList queryWalkInStudentList) {
+        Long coursePackageSchedulingId = queryWalkInStudentList.getCoursePackageSchedulingId();
+        CoursePackageScheduling coursePackageScheduling = coursePackageSchedulingService.getById(coursePackageSchedulingId);
+        String userName = queryWalkInStudentList.getUserName();
+        List<Integer> userIds = null;
+        List<Integer> studentIds = null;
+        if(ToolUtil.isNotEmpty(userName)){
+            List<AppUser> appUsers = appuClient.queryAppUserListByName(userName);
+            if(appUsers.size() > 0){
+                userIds = appUsers.stream().map(AppUser::getId).collect(Collectors.toList());
+            }
+        }
+        String studentName = queryWalkInStudentList.getStudentName();
+        if(ToolUtil.isNotEmpty(studentName)){
+            List<Student> students = studentClient.queryStudentListByName(studentName);
+            if(students.size() > 0){
+                studentIds = students.stream().map(Student::getId).collect(Collectors.toList());
+            }
+        }
+        List<Long> coursePackagePaymentId = null;
+        List<CoursePackageStudent> coursePackageStudents = cpsMapper.selectList(new QueryWrapper<CoursePackageStudent>().eq("coursePackageSchedulingId", coursePackageSchedulingId).eq("reservationStatus", 1));
+        if(coursePackageStudents.size() > 0){
+            coursePackagePaymentId = coursePackageStudents.stream().map(CoursePackageStudent::getCoursePackagePaymentId).collect(Collectors.toList());
+        }
+
+        List<Map<String, Object>> list = this.baseMapper.queryWalkInStudentList(page, coursePackageScheduling.getCoursePackageId(), coursePackagePaymentId, userIds, studentIds);
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
+        Integer now = Integer.valueOf(sdf.format(new Date()));
+        for (Map<String, Object> map : list) {
+            Integer appUserId = Integer.valueOf(map.get("appUserId").toString());
+            Integer student_Id = Integer.valueOf(map.get("studentId").toString());
+            AppUser appUser = appuClient.queryAppUser(appUserId);
+            Student student = studentClient.queryStudentById(student_Id);
+            map.put("userName", appUser.getName());
+            map.put("phone", student.getPhone());
+            map.put("studentName", student.getName());
+            map.put("age", null != student.getBirthday() ? now - Integer.valueOf(sdf.format(student.getBirthday())) : "-");
+            map.put("sex", student.getSex());
+        }
+        return list;
+    }
 }
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 4fbff94..43d329d 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
@@ -7,10 +7,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.dsh.course.entity.CoursePackagePaymentConfig;
-import com.dsh.course.entity.TCoursePackage;
-import com.dsh.course.entity.TCoursePackageDiscount;
-import com.dsh.course.entity.TCoursePackagePayment;
+import com.dsh.course.entity.*;
 import com.dsh.course.feignclient.account.AppUserClient;
 import com.dsh.course.feignclient.account.StudentClient;
 import com.dsh.course.feignclient.account.model.AppUser;
@@ -24,10 +21,7 @@
 import com.dsh.course.mapper.TCoursePackageMapper;
 import com.dsh.course.feignclient.model.CourseOfStoreVo;
 import com.dsh.course.model.*;
-import com.dsh.course.service.ICoursePackagePaymentConfigService;
-import com.dsh.course.service.TCoursePackageDiscountService;
-import com.dsh.course.service.TCoursePackagePaymentService;
-import com.dsh.course.service.TCoursePackageService;
+import com.dsh.course.service.*;
 import com.dsh.course.util.*;
 import com.dsh.course.util.httpClinet.HttpResult;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -80,6 +74,12 @@
 
     @Autowired
     private PayMoneyUtil payMoneyUtil;
+
+    @Autowired
+    private ICoursePackageSchedulingService coursePackageSchedulingService;
+
+    @Autowired
+    private CoursePackageStudentService coursePackageStudentService;
 
 
 
@@ -775,4 +775,179 @@
         }
         return list;
     }
+
+
+    /**
+     * 添加课包
+     * @param coursePackage
+     * @return
+     */
+    @Override
+    public Integer addCoursePackage(TCoursePackage coursePackage) {
+        try {
+            this.baseMapper.insert(coursePackage);
+            //生成排课数据
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            Date date = sdf1.parse(sdf.format(new Date()) + " 00:00:00");
+            List<String> list = Arrays.asList(coursePackage.getClassWeeks().split(";"));
+            String classStartTime = coursePackage.getClassStartTime();
+            String[] split = classStartTime.split(":");
+            String classEndTime = coursePackage.getClassEndTime();
+            String[] split1 = classEndTime.split(":");
+            Calendar s = Calendar.getInstance();
+            s.setTime(date);
+            s.set(Calendar.DAY_OF_YEAR, s.get(Calendar.DAY_OF_YEAR) + 1);
+            s.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0]));
+            s.set(Calendar.MINUTE, Integer.valueOf(split[1]));
+            s.set(Calendar.SECOND, 0);
+
+            Calendar e = Calendar.getInstance();
+            e.setTime(date);
+            e.set(Calendar.DAY_OF_YEAR, s.get(Calendar.DAY_OF_YEAR) + 13);
+            long timeInMillis = e.getTimeInMillis();
+
+            while (true){
+                int w = s.get(Calendar.DAY_OF_WEEK);
+                WeekEnum weekEnum = WeekEnum.getWeekEnum(w);
+                if(list.contains(weekEnum.getChineseName())){
+                    Calendar classDate = Calendar.getInstance();
+                    classDate.setTime(s.getTime());
+                    classDate.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0]));
+                    classDate.set(Calendar.MINUTE, Integer.valueOf(split[1]));
+                    classDate.set(Calendar.SECOND, 0);
+
+                    Calendar endDate = Calendar.getInstance();
+                    endDate.setTime(s.getTime());
+                    endDate.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split1[0]));
+                    endDate.set(Calendar.MINUTE, Integer.valueOf(split1[1]));
+                    endDate.set(Calendar.SECOND, 0);
+
+                    CoursePackageScheduling coursePackageScheduling = new CoursePackageScheduling();
+                    coursePackageScheduling.setCoursePackageId(coursePackage.getId());
+                    coursePackageScheduling.setClassDate(classDate.getTime());
+                    coursePackageScheduling.setEndDate(endDate.getTime());
+                    coursePackageScheduling.setStatus(1);
+                    coursePackageSchedulingService.save(coursePackageScheduling);
+                }
+                s.set(Calendar.DAY_OF_YEAR, s.get(Calendar.DAY_OF_YEAR) + 1);
+                if(s.getTimeInMillis() > timeInMillis){
+                    break;
+                }
+            }
+            return coursePackage.getId();
+        }catch (Exception e){
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+    /**
+     * 修改数据
+     * @param coursePackage
+     */
+    @Override
+    public void updateCoursePackageById(TCoursePackage coursePackage) {
+        try {
+            List<CoursePackageStudent> coursePackageStudents = coursePackageStudentService.list(new QueryWrapper<CoursePackageStudent>().eq("coursePackageId", coursePackage.getId()));
+            List<Long> collect = coursePackageStudents.stream().map(CoursePackageStudent::getCoursePackageSchedulingId).collect(Collectors.toList());
+
+            QueryWrapper<CoursePackageScheduling> coursePackageSchedulingQueryWrapper = new QueryWrapper<CoursePackageScheduling>().eq("coursePackageId", coursePackage.getId());
+            if(collect.size() > 0){
+                coursePackageSchedulingQueryWrapper.notIn("id", collect);
+            }
+            coursePackageSchedulingService.remove(coursePackageSchedulingQueryWrapper);
+
+            this.baseMapper.updateById(coursePackage);
+            //生成排课数据
+            Date date = null;
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            CoursePackageScheduling coursePackageScheduling = coursePackageSchedulingService.getOne(new QueryWrapper<CoursePackageScheduling>().eq("coursePackageId", coursePackage.getId()).last(" and classDate > now() order by classDate desc limit 0, 1"));
+            if(null != coursePackageScheduling){
+                date = sdf1.parse(sdf.format(coursePackageScheduling.getClassDate()) + " 00:00:00");
+            }else{
+                date = sdf1.parse(sdf.format(new Date()) + " 00:00:00");
+            }
+            List<String> list = Arrays.asList(coursePackage.getClassWeeks().split(";"));
+            String classStartTime = coursePackage.getClassStartTime();
+            String[] split = classStartTime.split(":");
+            String classEndTime = coursePackage.getClassEndTime();
+            String[] split1 = classEndTime.split(":");
+            Calendar s = Calendar.getInstance();
+            s.setTime(date);
+            s.set(Calendar.DAY_OF_YEAR, s.get(Calendar.DAY_OF_YEAR) + 1);
+
+            Calendar e = Calendar.getInstance();
+            e.setTime(date);
+            if(null != coursePackageScheduling){
+                long time = sdf1.parse(sdf.format(new Date()) + " 00:00:00").getTime();
+                int d = Long.valueOf(14L - ((s.getTimeInMillis() - time) / 86400000L)).intValue();
+                e.set(Calendar.DAY_OF_YEAR, s.get(Calendar.DAY_OF_YEAR) + d);
+            }else{
+                e.set(Calendar.DAY_OF_YEAR, s.get(Calendar.DAY_OF_YEAR) + 13);
+            }
+            long timeInMillis = e.getTimeInMillis();
+
+            while (true){
+                int w = s.get(Calendar.DAY_OF_WEEK);
+                WeekEnum weekEnum = WeekEnum.getWeekEnum(w);
+                if(list.contains(weekEnum.getChineseName())){
+                    Calendar classDate = Calendar.getInstance();
+                    classDate.setTime(s.getTime());
+                    classDate.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0]));
+                    classDate.set(Calendar.MINUTE, Integer.valueOf(split[1]));
+                    classDate.set(Calendar.SECOND, 0);
+
+                    Calendar endDate = Calendar.getInstance();
+                    endDate.setTime(s.getTime());
+                    endDate.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split1[0]));
+                    endDate.set(Calendar.MINUTE, Integer.valueOf(split1[1]));
+                    endDate.set(Calendar.SECOND, 0);
+
+                    CoursePackageScheduling coursePackageScheduling1 = new CoursePackageScheduling();
+                    coursePackageScheduling1.setCoursePackageId(coursePackage.getId());
+                    coursePackageScheduling1.setClassDate(classDate.getTime());
+                    coursePackageScheduling1.setEndDate(endDate.getTime());
+                    coursePackageScheduling1.setStatus(1);
+                    coursePackageSchedulingService.save(coursePackageScheduling1);
+                }
+                s.set(Calendar.DAY_OF_YEAR, s.get(Calendar.DAY_OF_YEAR) + 1);
+                if(s.getTimeInMillis() > timeInMillis){
+                    break;
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 获取课包审核列表
+     * @param page
+     * @param queryExamineCoursePackageLists
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> queryExamineCoursePackageLists(Page<Map<String, Object>> page, QueryExamineCoursePackageLists queryExamineCoursePackageLists) {
+        List<Map<String, Object>> list = this.baseMapper.queryExamineCoursePackageLists(page, queryExamineCoursePackageLists);
+        for (Map<String, Object> map : list) {
+            Integer id = Integer.valueOf(map.get("id").toString());
+            boolean cash = false;
+            boolean coin = false;
+            List<CoursePackagePaymentConfig> coursePackagePaymentConfigs = coursePackagePaymentConfigService.list(new QueryWrapper<CoursePackagePaymentConfig>().eq("coursePackageId", id));
+            for (CoursePackagePaymentConfig coursePackagePaymentConfig : coursePackagePaymentConfigs) {
+                if(0 != coursePackagePaymentConfig.getCashPayment()){
+                    cash = true;
+                }
+                if(0 != coursePackagePaymentConfig.getPlayPaiCoin()){
+                    coin = true;
+                }
+            }
+            map.put("payType", (cash ? "现金支付" : "") + (coin ?  cash ? "&玩湃币支付" : "玩湃币支付" : ""));
+        }
+        return list;
+    }
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/util/TaskUtil.java b/cloud-server-course/src/main/java/com/dsh/course/util/TaskUtil.java
new file mode 100644
index 0000000..fb26c90
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/util/TaskUtil.java
@@ -0,0 +1,41 @@
+package com.dsh.course.util;
+
+import com.dsh.course.service.ICoursePackageSchedulingService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/11 15:01
+ */
+@Component
+public class TaskUtil {
+
+    @Autowired
+    private ICoursePackageSchedulingService coursePackageSchedulingService;
+
+    /**
+     * 每隔一分钟去处理的定时任务
+     */
+    @Scheduled(fixedRate = 60000)
+    public void taskMinute(){
+        try {
+            //定时修改排课状态
+            coursePackageSchedulingService.taskSetStatus();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+
+    /**
+     * 零时任务
+     */
+    @Scheduled(cron = "0 0 0 * * *")
+    public void zeroTask(){
+        //定时添加排课数据
+        coursePackageSchedulingService.taskAddData();
+    }
+}
diff --git a/cloud-server-course/src/main/resources/mapper/CoursePackageSchedulingMapper.xml b/cloud-server-course/src/main/resources/mapper/CoursePackageSchedulingMapper.xml
new file mode 100644
index 0000000..fdf9e32
--- /dev/null
+++ b/cloud-server-course/src/main/resources/mapper/CoursePackageSchedulingMapper.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dsh.course.mapper.CoursePackageSchedulingMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.dsh.course.entity.CoursePackageScheduling">
+        <id column="id" property="id" />
+        <result column="coursePackageId" property="coursePackageId" />
+        <result column="classDate" property="classDate" />
+        <result column="courseId" property="courseId" />
+        <result column="integral" property="integral" />
+        <result column="cancelClasses" property="cancelClasses" />
+        <result column="deductClassHour" property="deductClassHour" />
+        <result column="status" property="status" />
+    </resultMap>
+
+
+
+    <select id="queryCoursePackageSchedulingList" resultType="map">
+        select
+        CAST(id AS CHAR(20)) as id,
+        DATE_FORMAT(classDate, '%Y-%m-%d') as classDate,
+        courseId,
+        `status`,
+        cancelClasses,
+        deductClassHour,
+        integral
+        from t_course_package_scheduling where coursePackageId = #{item.coursePackageId} order by classDate desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/cloud-server-course/src/main/resources/mapper/CoursePackageStudentMapper.xml b/cloud-server-course/src/main/resources/mapper/CoursePackageStudentMapper.xml
index 63b7bd3..3b900eb 100644
--- a/cloud-server-course/src/main/resources/mapper/CoursePackageStudentMapper.xml
+++ b/cloud-server-course/src/main/resources/mapper/CoursePackageStudentMapper.xml
@@ -3,4 +3,27 @@
 <mapper namespace="com.dsh.course.mapper.CoursePackageStudentMapper">
 
 
+
+    <select id="queryCoursePackageStudentList" resultType="map">
+        select
+        CAST(id AS CHAR(20)) as id,
+        appUserId,
+        studentId,
+        signInOrNot,
+        reservationStatus
+        from t_course_package_student where coursePackageSchedulingId = #{coursePackageSchedulingId}
+        <if test="null != userId">
+            and appUserId in
+            <foreach collection="appUserId" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="null != studentId">
+            and studentId in
+            <foreach collection="studentId" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        order by insertTime desc
+    </select>
 </mapper>
diff --git a/cloud-server-course/src/main/resources/mapper/TCoursePackageMapper.xml b/cloud-server-course/src/main/resources/mapper/TCoursePackageMapper.xml
index 25c46c6..bf5df87 100644
--- a/cloud-server-course/src/main/resources/mapper/TCoursePackageMapper.xml
+++ b/cloud-server-course/src/main/resources/mapper/TCoursePackageMapper.xml
@@ -68,7 +68,7 @@
         a.state
         from t_course_package a
         left join t_course_package_type b on (a.coursePackageTypeId = b.id)
-        where a.state != 3
+        where a.state != 3 and a.auditStatus = 2
         <if test="null != item.provinceCode and '' != item.provinceCode">
             and a.provinceCode = #{item.provinceCode}
         </if>
@@ -92,4 +92,37 @@
         </if>
         order by a.insertTime desc
     </select>
+
+
+    <select id="queryExamineCoursePackageLists" resultType="map">
+        select
+        a.id,
+        CONCAT(a.province, a.city) as city,
+        a.storeId,
+        b.`name` as coursePackageType,
+        a.`name`,
+        a.maxSubscribeNumber,
+        CONCAT('购买后', a.validDays, '天内有效') as validDays,
+        a.sort,
+        a.auditStatus
+        from t_course_package a
+        left join t_course_package_type b on (a.coursePackageTypeId = b.id)
+        where a.state = 1 and a.auditStatus != 2
+        <if test="null != item.provinceCode and '' != item.provinceCode">
+            and a.provinceCode = #{item.provinceCode}
+        </if>
+        <if test="null != item.cityCode and '' != item.cityCode">
+            and a.cityCode = #{item.cityCode}
+        </if>
+        <if test="null != item.coursePackageTypeId">
+            and a.coursePackageTypeId = #{item.coursePackageTypeId}
+        </if>
+        <if test="null != item.name and '' != item.name">
+            and a.name line CONCAT('%', #{item.name}, '%')
+        </if>
+        <if test="null != item.auditStatus">
+            and a.auditStatus = #{item.auditStatus}
+        </if>
+        order by a.insertTime desc
+    </select>
 </mapper>
diff --git a/cloud-server-course/src/main/resources/mapper/TCoursePackagePaymentMapper.xml b/cloud-server-course/src/main/resources/mapper/TCoursePackagePaymentMapper.xml
index 6df7fb4..506c725 100644
--- a/cloud-server-course/src/main/resources/mapper/TCoursePackagePaymentMapper.xml
+++ b/cloud-server-course/src/main/resources/mapper/TCoursePackagePaymentMapper.xml
@@ -42,4 +42,65 @@
         and `code` = #{code}
     </if>
     </select>
+
+
+
+    <select id="queryRegistrationRecord" resultType="map">
+        select
+        CAST(id AS CHAR(20)) as id,
+        appUserId,
+        studentId,
+        DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as insertTime,
+        totalClassHours,
+        absencesNumber,
+        `status`
+        from t_course_package_payment where payStatus = 2 and state = 1
+        <if test="null != coursePackageId">
+            and coursePackageId = #{coursePackageId}
+        </if>
+        <if test="null != userIds">
+            and appUserId in
+            <foreach collection="userIds" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="null != studentIds">
+            and studentId in
+            <foreach collection="studentIds" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        order by insertTime desc
+    </select>
+
+
+    <select id="queryWalkInStudentList" resultType="map">
+        select
+        CAST(id AS CHAR(20)) as id,
+        appUserId,
+        studentId
+        from t_course_package_payment where payStatus = 2 and state = 1
+        <if test="null != coursePackageId">
+            and coursePackageId = #{coursePackageId}
+        </if>
+        <if test="null != coursePackagePaymentId">
+            and id not in
+            <foreach collection="coursePackagePaymentId" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="null != userIds">
+            and appUserId in
+            <foreach collection="userIds" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="null != studentIds">
+            and studentId in
+            <foreach collection="studentIds" item="item" index="index" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        order by insertTime desc
+    </select>
 </mapper>
diff --git a/cloud-server-course/src/main/resources/sharding-jdbc.properties b/cloud-server-course/src/main/resources/sharding-jdbc.properties
index 09e20a5..4153469 100644
--- a/cloud-server-course/src/main/resources/sharding-jdbc.properties
+++ b/cloud-server-course/src/main/resources/sharding-jdbc.properties
@@ -3,7 +3,7 @@
 #��������
 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.url=jdbc:mysql://127.0.0.1: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
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachClient.java
index 304d193..84688f3 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachClient.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachClient.java
@@ -21,4 +21,13 @@
      */
     @PostMapping("/coach/queryCoachByCity")
     List<Coach> queryCoachByCity(String cityCode);
+
+
+    /**
+     * 根据id获取教练
+     * @param id
+     * @return
+     */
+    @PostMapping("/coach/queryCoachById")
+    Coach queryCoachById(Integer id);
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CancelledClassesClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CancelledClassesClient.java
new file mode 100644
index 0000000..d6560c1
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CancelledClassesClient.java
@@ -0,0 +1,21 @@
+package com.dsh.course.feignClient.course;
+
+import com.dsh.course.feignClient.course.model.CancelledClasses;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/12 3:45
+ */
+@FeignClient("mb-cloud-course")
+public interface CancelledClassesClient {
+
+
+    /**
+     * 添加数据
+     * @param cancelledClasses
+     */
+    @PostMapping("/cancelledClasses/addCancelledClasses")
+    void addCancelledClasses(CancelledClasses cancelledClasses);
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java
index ed3b04b..73aca6a 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java
@@ -66,4 +66,13 @@
      */
     @PostMapping("/course/editCourseState")
     void editCourseState(EditCourseState editCourseState);
+
+
+    /**
+     * 根据类型获取数据
+     * @param type
+     * @return
+     */
+    @PostMapping("/course/queryCourseByType")
+    List<TCourse> queryCourseByType(Integer type);
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageClient.java
index ba8a483..87ca0c9 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageClient.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageClient.java
@@ -2,6 +2,9 @@
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dsh.course.feignClient.course.model.QueryCoursePackageLists;
+import com.dsh.course.feignClient.course.model.QueryExamineCoursePackageLists;
+import com.dsh.course.feignClient.course.model.QueryRegistrationRecord;
+import com.dsh.course.feignClient.course.model.TCoursePackage;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 
@@ -22,4 +25,39 @@
      */
     @PostMapping("/coursePackage/queryCoursePackageLists")
     Page<Map<String, Object>> queryCoursePackageLists(QueryCoursePackageLists queryCoursePackageLists);
+
+
+    /**
+     * 添加数据
+     * @param coursePackage
+     */
+    @PostMapping("/coursePackage/addCoursePackage")
+    Integer addCoursePackage(TCoursePackage coursePackage);
+
+
+    /**
+     * 根据id查询数据
+     * @param id
+     * @return
+     */
+    @PostMapping("/base/coursePackage/queryCoursePackageById")
+    TCoursePackage queryById(Integer id);
+
+
+    /**
+     * 修改数据
+     * @param coursePackage
+     */
+    @PostMapping("/coursePackage/updateCoursePackageById")
+    void updateCoursePackage(TCoursePackage coursePackage);
+
+
+    /**
+     * 获取课包审核列表
+     * @param queryExamineCoursePackageLists
+     * @return
+     */
+    @PostMapping("/coursePackage/queryExamineCoursePackageLists")
+    Page<Map<String, Object>> queryExamineCoursePackageLists(QueryExamineCoursePackageLists queryExamineCoursePackageLists);
+
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageDiscountClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageDiscountClient.java
new file mode 100644
index 0000000..b3faf17
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageDiscountClient.java
@@ -0,0 +1,32 @@
+package com.dsh.course.feignClient.course;
+
+import com.dsh.course.feignClient.course.model.TCoursePackageDiscount;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+
+import java.util.List;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/8 14:46
+ */
+@FeignClient("mb-cloud-course")
+public interface CoursePackageDiscountClient {
+
+    /**
+     * 获取课包折扣
+     * @param coursePackagePaymentConfigId
+     * @return
+     */
+    @PostMapping("/coursePackageDiscount/queryCoursePackageDiscount")
+    List<TCoursePackageDiscount> queryCoursePackageDiscount(Integer coursePackagePaymentConfigId);
+
+
+    /**
+     * 配置课包折扣数据
+     * @param list
+     */
+    @PostMapping("/coursePackageDiscount/setCoursePackageDiscount")
+    void setCoursePackageDiscount(List<TCoursePackageDiscount> list);
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackagePaymentClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackagePaymentClient.java
new file mode 100644
index 0000000..3bfda52
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackagePaymentClient.java
@@ -0,0 +1,53 @@
+package com.dsh.course.feignClient.course;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dsh.course.feignClient.course.model.QueryRegistrationRecord;
+import com.dsh.course.feignClient.course.model.QueryWalkInStudentList;
+import com.dsh.course.feignClient.course.model.TCoursePackagePayment;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+
+import java.util.Map;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/10 19:51
+ */
+@FeignClient("mb-cloud-course")
+public interface CoursePackagePaymentClient {
+
+
+    /**
+     * 获取课程报名信息列表
+     * @param queryRegistrationRecord
+     * @return
+     */
+    @PostMapping("/coursePackagePayment/queryRegistrationRecord")
+    Page<Map<String, Object>> queryRegistrationRecord(QueryRegistrationRecord queryRegistrationRecord);
+
+
+    /**
+     * 获取未预约排课学员列表
+     * @param queryWalkInStudentList
+     * @return
+     */
+    @PostMapping("/coursePackagePayment/queryWalkInStudentList")
+    Page<Map<String, Object>> queryWalkInStudentList(QueryWalkInStudentList queryWalkInStudentList);
+
+
+    /**
+     * 根据id获取数据
+     * @param id
+     * @return
+     */
+    @PostMapping("/coursePackagePayment/queryCoursePackagePaymentById")
+    TCoursePackagePayment queryCoursePackagePaymentById(Long id);
+
+
+    /**
+     * 修改数据
+     * @param coursePackagePayment
+     */
+    @PostMapping("/coursePackagePayment/editCoursePackagePayment")
+    void editCoursePackagePayment(TCoursePackagePayment coursePackagePayment);
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackagePaymentConfigClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackagePaymentConfigClient.java
new file mode 100644
index 0000000..8f8663b
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackagePaymentConfigClient.java
@@ -0,0 +1,41 @@
+package com.dsh.course.feignClient.course;
+
+import com.dsh.course.feignClient.course.model.CoursePackagePaymentConfig;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+
+import java.util.List;
+
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/7 11:45
+ */
+@FeignClient("mb-cloud-course")
+public interface CoursePackagePaymentConfigClient {
+
+
+    /**
+     * 添加数据
+     * @param coursePackagePaymentConfig
+     */
+    @PostMapping("/coursePackagePaymentConfig/addCoursePackagePaymentConfig")
+    void addCoursePackagePaymentConfig(CoursePackagePaymentConfig coursePackagePaymentConfig);
+
+
+    /**
+     * 根据课包id获取价格配置
+     * @param coursePackageId
+     * @return
+     */
+    @PostMapping("/coursePackagePaymentConfig/queryCoursePackagePaymentConfigList")
+    List<CoursePackagePaymentConfig> queryCoursePackagePaymentConfigList(Integer coursePackageId);
+
+
+    /**
+     * 删除数据
+     * @param coursePackageId
+     */
+    @PostMapping("/coursePackagePaymentConfig/delCoursePackagePaymentConfig")
+    void delCoursePackagePaymentConfig(Integer coursePackageId);
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageSchedulingClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageSchedulingClient.java
new file mode 100644
index 0000000..0dec91e
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageSchedulingClient.java
@@ -0,0 +1,43 @@
+package com.dsh.course.feignClient.course;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dsh.course.feignClient.course.model.CoursePackageScheduling;
+import com.dsh.course.feignClient.course.model.QueryCoursePackageSchedulingList;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+
+import java.util.Map;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/11 10:59
+ */
+@FeignClient("mb-cloud-course")
+public interface CoursePackageSchedulingClient {
+
+
+    /**
+     * 获取课包排课记录
+     * @param queryCoursePackageSchedulingList
+     * @return
+     */
+    @PostMapping("/coursePackageScheduling/queryCoursePackageSchedulingList")
+    Page<Map<String, Object>> queryCoursePackageSchedulingList(QueryCoursePackageSchedulingList queryCoursePackageSchedulingList);
+
+
+    /**
+     * 根据id查询排课数据
+     * @param id
+     * @return
+     */
+    @PostMapping("/coursePackageScheduling/queryCoursePackageSchedulingById")
+    CoursePackageScheduling queryCoursePackageSchedulingById(Long id);
+
+
+    /**
+     * 编辑数据
+     * @param coursePackageScheduling
+     */
+    @PostMapping("/coursePackageScheduling/editCoursePackageScheduling")
+    void editCoursePackageScheduling(CoursePackageScheduling coursePackageScheduling);
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageStudentClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageStudentClient.java
new file mode 100644
index 0000000..d9a706c
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageStudentClient.java
@@ -0,0 +1,71 @@
+package com.dsh.course.feignClient.course;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dsh.course.feignClient.course.model.CoursePackageStudent;
+import com.dsh.course.feignClient.course.model.QueryCoursePackageStudent;
+import com.dsh.course.feignClient.course.model.QueryCoursePackageStudentList;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/11 17:38
+ */
+@FeignClient("mb-cloud-course")
+public interface CoursePackageStudentClient {
+
+
+    /**
+     * 获取课程排课预约数据
+     * @param queryCoursePackageStudentList
+     * @return
+     */
+    @PostMapping("/coursePackageStudent/queryCoursePackageStudentList")
+    Page<Map<String, Object>> queryCoursePackageStudentList(QueryCoursePackageStudentList queryCoursePackageStudentList);
+
+
+    /**
+     * 根据id查询数据
+     * @param id
+     * @return
+     */
+    @PostMapping("/coursePackageStudent/queryCoursePackageStudentById")
+    CoursePackageStudent queryCoursePackageStudentById(Long id);
+
+
+    /**
+     * 修改数据
+     * @param coursePackageStudent
+     */
+    @PostMapping("/coursePackageStudent/editCoursePackageStudent")
+    void editCoursePackageStudent(CoursePackageStudent coursePackageStudent);
+
+
+    /**
+     * 根据排课id获取预约数据
+     * @param coursePackageSchedulingId
+     * @return
+     */
+    @PostMapping("/coursePackageStudent/queryByCoursePackageSchedulingId")
+    List<CoursePackageStudent> queryByCoursePackageSchedulingId(Long coursePackageSchedulingId);
+
+
+    /**
+     * 获取学员上课数据
+     * @param queryCoursePackageStudent
+     * @return
+     */
+    @PostMapping("/coursePackageStudent/queryCoursePackageStudent")
+    List<CoursePackageStudent> queryCoursePackageStudent(QueryCoursePackageStudent queryCoursePackageStudent);
+
+
+    /**
+     * 添加学员上课数据
+     * @param coursePackageStudent
+     */
+    @PostMapping("/coursePackageStudent/addCoursePackageStudent")
+    void addCoursePackageStudent(CoursePackageStudent coursePackageStudent);
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CancelledClasses.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CancelledClasses.java
new file mode 100644
index 0000000..787078b
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CancelledClasses.java
@@ -0,0 +1,69 @@
+package com.dsh.course.feignClient.course.model;
+
+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 com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 课包消课记录
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-06-29
+ */
+@Data
+public class CancelledClasses extends Model<CancelledClasses> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Integer id;
+    /**
+     * 消课类型(1=上课消课,2=支付消课)
+     */
+    private Integer type;
+    /**
+     * 课包id
+     */
+    private Integer coursePackageId;
+    /**
+     * 课程支付记录id
+     */
+    private Long coursePackagePaymentId;
+    /**
+     * 排课记录id
+     */
+    private Long coursePackageSchedulingId;
+    /**
+     * 消课凭证
+     */
+    private String voucher;
+    /**
+     * 消课数量
+     */
+    private Integer cancelledClassesNumber;
+    /**
+     * 添加时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date insertTime;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackagePaymentConfig.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackagePaymentConfig.java
new file mode 100644
index 0000000..6533a11
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackagePaymentConfig.java
@@ -0,0 +1,35 @@
+package com.dsh.course.feignClient.course.model;
+
+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;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/6/29 10:42
+ */
+@Data
+public class CoursePackagePaymentConfig {
+    /**
+     * 主键
+     */
+    private Integer id;
+    /**
+     * 课包id
+     */
+    private Integer coursePackageId;
+    /**
+     * 课时数
+     */
+    private Integer classHours;
+    /**
+     * 现金支付价格
+     */
+    private Double cashPayment;
+    /**
+     * 玩湃币价格
+     */
+    private Integer playPaiCoin;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackageScheduling.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackageScheduling.java
new file mode 100644
index 0000000..83f5d5f
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackageScheduling.java
@@ -0,0 +1,56 @@
+package com.dsh.course.feignClient.course.model;
+
+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 com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/11 10:46
+ */
+@Data
+public class CoursePackageScheduling {
+    /**
+     * 主键
+     */
+    private Long id;
+    /**
+     * 课包id
+     */
+    private Integer coursePackageId;
+    /**
+     * 上课日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date classDate;
+    /**
+     * 结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endDate;
+    /**
+     * 课后练习课程id
+     */
+    private Integer courseId;
+    /**
+     * 可获得积分
+     */
+    private Integer integral;
+    /**
+     * 消课凭证
+     */
+    private String cancelClasses;
+    /**
+     * 扣除课时
+     */
+    private Integer deductClassHour;
+    /**
+     * 状态(1=未开始,2=已开始,3=已结束,4=已取消)
+     */
+    private Integer status;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackageStudent.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackageStudent.java
new file mode 100644
index 0000000..3fb4383
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackageStudent.java
@@ -0,0 +1,71 @@
+package com.dsh.course.feignClient.course.model;
+
+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 com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 学员上课记录
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-06-30
+ */
+@Data
+public class CoursePackageStudent extends Model<CoursePackageStudent> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+    /**
+     * 用户id
+     */
+    private Integer appUserId;
+    /**
+     * 学员id
+     */
+    private Integer studentId;
+    /**
+     * 课包id
+     */
+    private Integer coursePackageId;
+    /**
+     * 课包购买记录id
+     */
+    private Long coursePackagePaymentId;
+    /**
+     * 排课记录id
+     */
+    private Long coursePackageSchedulingId;
+    /**
+     * 到课状态(0=否,1=是)
+     */
+    private Integer signInOrNot;
+    /**
+     * 预约状态(0=取消,1=预约)
+     */
+    private Integer reservationStatus;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date insertTime;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryCoursePackageSchedulingList.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryCoursePackageSchedulingList.java
new file mode 100644
index 0000000..4207918
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryCoursePackageSchedulingList.java
@@ -0,0 +1,20 @@
+package com.dsh.course.feignClient.course.model;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/11 11:00
+ */
+@Data
+public class QueryCoursePackageSchedulingList {
+    /**
+     * 课包id
+     */
+    private Integer coursePackageId;
+
+    private String order;
+    private Integer offset;
+    private Integer limit;
+    private String sort;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryCoursePackageStudent.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryCoursePackageStudent.java
new file mode 100644
index 0000000..cc6ce81
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryCoursePackageStudent.java
@@ -0,0 +1,39 @@
+package com.dsh.course.feignClient.course.model;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/12 3:12
+ */
+@Data
+public class QueryCoursePackageStudent {
+    /**
+     * 用户id
+     */
+    private Integer appUserId;
+    /**
+     * 学员id
+     */
+    private Integer studentId;
+    /**
+     * 课包id
+     */
+    private Integer coursePackageId;
+    /**
+     * 课包购买记录id
+     */
+    private Long coursePackagePaymentId;
+    /**
+     * 排课记录id
+     */
+    private Long coursePackageSchedulingId;
+    /**
+     * 到课状态(0=否,1=是)
+     */
+    private Integer signInOrNot;
+    /**
+     * 预约状态(0=取消,1=预约)
+     */
+    private Integer reservationStatus;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryCoursePackageStudentList.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryCoursePackageStudentList.java
new file mode 100644
index 0000000..6023bcd
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryCoursePackageStudentList.java
@@ -0,0 +1,28 @@
+package com.dsh.course.feignClient.course.model;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/11 17:07
+ */
+@Data
+public class QueryCoursePackageStudentList {
+    /**
+     * 排课id
+     */
+    private Long coursePackageSchedulingId;
+    /**
+     * 用户姓名
+     */
+    private String userName;
+    /**
+     * 学员姓名
+     */
+    private String studentName;
+
+    private String order;
+    private Integer offset;
+    private Integer limit;
+    private String sort;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryExamineCoursePackageLists.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryExamineCoursePackageLists.java
new file mode 100644
index 0000000..290b462
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryExamineCoursePackageLists.java
@@ -0,0 +1,36 @@
+package com.dsh.course.feignClient.course.model;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/13 3:22
+ */
+@Data
+public class QueryExamineCoursePackageLists {
+    /**
+     * 省编号
+     */
+    private String provinceCode;
+    /**
+     * 市编号
+     */
+    private String cityCode;
+    /**
+     * 课程类型id
+     */
+    private Integer coursePackageTypeId;
+    /**
+     * 课程名称
+     */
+    private String name;
+    /**
+     * 审核状态(1=待审核,2=已同意,3=已拒绝)
+     */
+    private Integer auditStatus;
+
+    private String order;
+    private Integer offset;
+    private Integer limit;
+    private String sort;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryRegistrationRecord.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryRegistrationRecord.java
new file mode 100644
index 0000000..967a03f
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryRegistrationRecord.java
@@ -0,0 +1,28 @@
+package com.dsh.course.feignClient.course.model;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/10 19:47
+ */
+@Data
+public class QueryRegistrationRecord {
+    /**
+     * 课程id
+     */
+    private Integer coursePackageId;
+    /**
+     * 用户名称
+     */
+    private String userName;
+    /**
+     * 学员名称
+     */
+    private String studentName;
+
+    private String order;
+    private Integer offset;
+    private Integer limit;
+    private String sort;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryWalkInStudentList.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryWalkInStudentList.java
new file mode 100644
index 0000000..36a4e78
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryWalkInStudentList.java
@@ -0,0 +1,28 @@
+package com.dsh.course.feignClient.course.model;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/12 2:46
+ */
+@Data
+public class QueryWalkInStudentList {
+    /**
+     * 课程id
+     */
+    private Long coursePackageSchedulingId;
+    /**
+     * 用户名称
+     */
+    private String userName;
+    /**
+     * 学员名称
+     */
+    private String studentName;
+
+    private String order;
+    private Integer offset;
+    private Integer limit;
+    private String sort;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/TCoursePackage.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/TCoursePackage.java
new file mode 100644
index 0000000..3e75872
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/TCoursePackage.java
@@ -0,0 +1,128 @@
+package com.dsh.course.feignClient.course.model;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 课包
+ * </p>
+ *
+ * @author administrator
+ * @since 2023-06-14
+ */
+@Data
+public class TCoursePackage extends Model<TCoursePackage>{
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    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;
+    /**
+     * 课程状态(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-management/src/main/java/com/dsh/course/feignClient/course/model/TCoursePackageDiscount.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/TCoursePackageDiscount.java
new file mode 100644
index 0000000..32dc3c1
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/TCoursePackageDiscount.java
@@ -0,0 +1,67 @@
+package com.dsh.course.feignClient.course.model;
+
+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 com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 课包折扣
+ * </p>
+ *
+ * @author administrator
+ * @since 2023-06-14
+ */
+@Data
+public class TCoursePackageDiscount extends Model<TCoursePackageDiscount>{
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Integer id;
+    /**
+     * 课包id
+     */
+    private Integer coursePackageId;
+    /**
+     * 课包价格规则id
+     */
+    private Integer coursePackagePaymentConfigId;
+    /**
+     * 折扣类型(1=会员折扣,2=续课优惠,3=限时折扣,4=赠送课时)
+     */
+    private Integer type;
+    /**
+     * 折扣优惠规则JSON ->详见 DiscountJsonDto类
+     */
+    private String content;
+    /**
+     * 审核状态(1=待审核,2=已通过,3=已拒绝)
+     */
+    private Integer auditStatus;
+    /**
+     * 审核人id
+     */
+    private Integer auditUserId;
+    /**
+     * 审核备注
+     */
+    private String auditRemark;
+    /**
+     * 添加时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date insertTime;
+
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/TCoursePackagePayment.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/TCoursePackagePayment.java
new file mode 100644
index 0000000..c73435a
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/TCoursePackagePayment.java
@@ -0,0 +1,127 @@
+package com.dsh.course.feignClient.course.model;
+
+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 com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 用户课程包购买记录
+ * </p>
+ *
+ * @author administrator
+ * @since 2023-06-14
+ */
+@Data
+public class TCoursePackagePayment extends Model<TCoursePackagePayment>{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+    /**
+     * 业务编号
+     */
+    private String code;
+    /**
+     * 用户id
+     */
+    private Integer appUserId;
+    /**
+     * 学员id
+     */
+    private Integer studentId;
+    /**
+     * 课包id
+     */
+    private Integer coursePackageId;
+    /**
+     * 支付方式(1=微信,2=支付宝,3=玩湃币,4=积分,5=积分+微信,6=积分+支付宝)
+     */
+    private Integer payType;
+    /**
+     * 课时数
+     */
+    private Integer classHours;
+    /**
+     * 原价
+     */
+    private Double originalPrice;
+    /**
+     * 优惠券id
+     */
+    private Long userCouponId;
+    /**
+     * 现金支付价格
+     */
+    private BigDecimal cashPayment;
+    /**
+     * 玩湃币价格/积分
+     */
+    private Integer playPaiCoin;
+    /**
+     * 总课时
+     */
+    private Integer totalClassHours;
+    /**
+     * 剩余课时
+     */
+    private Integer laveClassHours;
+    /**
+     * 缺课次数
+     */
+    private Integer absencesNumber;
+    /**
+     * 退课课时
+     */
+    private Integer dropoutsNumber;
+    /**
+     * 支付用户类型(1=用户,2=管理员)
+     */
+    private Integer payUserType;
+    /**
+     * 支付状态(1=待支付,2=已支付)
+     */
+    private Integer payStatus;
+    /**
+     * 第三方支付流水号
+     */
+    private String orderNumber;
+    /**
+     * 支付用户id
+     */
+    private Integer payUserId;
+    /**
+     * 课程状态(1=正常,2=已退课)
+     */
+    private Integer status;
+    /**
+     * 退课时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date withdrawalTime;
+    /**
+     * 退课凭证
+     */
+    private String certificate;
+    /**
+     * 状态(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-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCourseController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCourseController.java
index b600818..a4f036a 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCourseController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCourseController.java
@@ -11,6 +11,7 @@
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -146,4 +147,16 @@
         courseService.editCourseState(id, state);
         return ResultUtil.success();
     }
+
+
+    /**
+     * 根据类型获取数据
+     * @param type
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryCourseByType")
+    public List<TCourse> queryCourseByType(Integer type){
+        return courseService.queryCourseByType(type);
+    }
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCoursePackageController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCoursePackageController.java
index 4c8dc1a..62c7ec2 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCoursePackageController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCoursePackageController.java
@@ -1,20 +1,26 @@
 package com.dsh.guns.modular.system.controller.code;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dsh.course.feignClient.account.CityManagerClient;
 import com.dsh.course.feignClient.account.CoachClient;
 import com.dsh.course.feignClient.account.model.CityManager;
 import com.dsh.course.feignClient.account.model.Coach;
+import com.dsh.course.feignClient.course.CoursePackageClient;
+import com.dsh.course.feignClient.course.CoursePackageDiscountClient;
+import com.dsh.course.feignClient.course.CoursePackagePaymentConfigClient;
 import com.dsh.course.feignClient.course.CoursePackageTypeClient;
-import com.dsh.course.feignClient.course.model.TCoursePackageType;
+import com.dsh.course.feignClient.course.model.*;
 import com.dsh.guns.config.UserExt;
 import com.dsh.guns.core.base.controller.BaseController;
+import com.dsh.guns.core.util.ToolUtil;
 import com.dsh.guns.modular.system.model.TSite;
 import com.dsh.guns.modular.system.model.TStore;
 import com.dsh.guns.modular.system.service.ICoursePackageService;
 import com.dsh.guns.modular.system.service.IStoreService;
 import com.dsh.guns.modular.system.service.ITSiteService;
+import com.dsh.guns.modular.system.util.ResultUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -24,8 +30,7 @@
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.annotation.Resource;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @author zhibing.pu
@@ -55,6 +60,15 @@
     @Resource
     private CoachClient coachClient;
 
+    @Resource
+    private CoursePackagePaymentConfigClient coursePackagePaymentConfigClient;
+
+    @Resource
+    private CoursePackageDiscountClient coursePackageDiscountClient;
+
+    @Resource
+    private CoursePackageClient coursePackageClient;
+
 
 
 
@@ -82,7 +96,11 @@
     }
 
 
-
+    /**
+     * 跳转到添加页
+     * @param model
+     * @return
+     */
     @GetMapping("/openAddCoursePackage")
     public String openAddCoursePackage(Model model){
         Integer objectType = UserExt.getUser().getObjectType();
@@ -111,6 +129,264 @@
     }
 
 
+    /**
+     * 跳转到编辑页
+     * @param model
+     * @param id
+     * @return
+     */
+    @GetMapping("/openEditCoursePackage")
+    public String openEditCoursePackage(Model model, Integer id){
+        TCoursePackage tCoursePackage = coursePackageService.queryById(id);
+        model.addAttribute("item", tCoursePackage);
+        model.addAttribute("classTime", tCoursePackage.getClassStartTime() + ":00 - " + tCoursePackage.getClassEndTime() + ":00");
+        String[] split = tCoursePackage.getClassWeeks().split(";");
+        List<String> list5 = Arrays.asList("周一", "周二", "周三", "周四", "周五", "周六", "周日");
+        List<Map<String, Object>> classWeeks = new ArrayList<>();
+        for (String s : list5) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("value", s);
+            map.put("checked", false);
+            for (String s1 : split) {
+                if(s.equals(s1)){
+                    map.put("checked", true);
+                }
+            }
+            classWeeks.add(map);
+        }
+        model.addAttribute("classWeeks", classWeeks);
+        List<TCoursePackageType> tCoursePackageTypes = coursePackageTypeClient.queryAllCoursePackageType();
+        model.addAttribute("coursePackageType", tCoursePackageTypes);
+        String cityCode = tCoursePackage.getCityCode();
+        String provinceCode = tCoursePackage.getProvinceCode();
+        List<Map<String, Object>> list = storeService.queryProvince(cityCode);
+        model.addAttribute("province", list);
+        List<Map<String, Object>> list1 = storeService.queryCity(provinceCode, cityCode);
+        model.addAttribute("city", list1);
+        List<TStore> list2 = storeService.list(new QueryWrapper<TStore>().eq("cityCode", cityCode).eq("state", 1));
+        model.addAttribute("store", list2);
+        List<TSite> list3 = siteService.list(new QueryWrapper<TSite>().eq("storeId", tCoursePackage.getStoreId()).eq("state", 1));
+        model.addAttribute("site", list3);
+        List<Coach> coaches = coachClient.queryCoachByCity(cityCode);
+        model.addAttribute("coach", coaches);
+        List<CoursePackagePaymentConfig> list4 = coursePackagePaymentConfigClient.queryCoursePackagePaymentConfigList(id);
+        model.addAttribute("coursePackagePaymentConfig", list4.remove(0));
+        model.addAttribute("coursePackagePaymentConfigs", list4);
+        CoursePackagePaymentConfig coursePackagePaymentConfig = list4.get(0);
+        model.addAttribute("cashPayment", coursePackagePaymentConfig.getCashPayment() == 0 ? false : true);
+        model.addAttribute("playPaiCoin", coursePackagePaymentConfig.getPlayPaiCoin() == 0 ? false : true);
+        return PREFIX + "coursePackage_edit.html";
+    }
+
+
+    /**
+     * 跳转详情页
+     * @param model
+     * @param id
+     * @return
+     */
+    @GetMapping("/showCoursePackageDetails")
+    public String showCoursePackageDetails(Model model, Integer id){
+        TCoursePackage tCoursePackage = coursePackageService.queryById(id);
+        model.addAttribute("item", tCoursePackage);
+        model.addAttribute("classTime", tCoursePackage.getClassStartTime() + ":00 - " + tCoursePackage.getClassEndTime() + ":00");
+        String[] split = tCoursePackage.getClassWeeks().split(";");
+        List<String> list5 = Arrays.asList("周一", "周二", "周三", "周四", "周五", "周六", "周日");
+        List<Map<String, Object>> classWeeks = new ArrayList<>();
+        for (String s : list5) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("value", s);
+            map.put("checked", false);
+            for (String s1 : split) {
+                if(s.equals(s1)){
+                    map.put("checked", true);
+                }
+            }
+            classWeeks.add(map);
+        }
+        model.addAttribute("classWeeks", classWeeks);
+        List<TCoursePackageType> tCoursePackageTypes = coursePackageTypeClient.queryAllCoursePackageType();
+        model.addAttribute("coursePackageType", tCoursePackageTypes);
+        String cityCode = tCoursePackage.getCityCode();
+        String provinceCode = tCoursePackage.getProvinceCode();
+        List<Map<String, Object>> list = storeService.queryProvince(cityCode);
+        model.addAttribute("province", list);
+        List<Map<String, Object>> list1 = storeService.queryCity(provinceCode, cityCode);
+        model.addAttribute("city", list1);
+        List<TStore> list2 = storeService.list(new QueryWrapper<TStore>().eq("cityCode", cityCode).eq("state", 1));
+        model.addAttribute("store", list2);
+        List<TSite> list3 = siteService.list(new QueryWrapper<TSite>().eq("storeId", tCoursePackage.getStoreId()).eq("state", 1));
+        model.addAttribute("site", list3);
+        List<Coach> coaches = coachClient.queryCoachByCity(cityCode);
+        model.addAttribute("coach", coaches);
+        List<CoursePackagePaymentConfig> list4 = coursePackagePaymentConfigClient.queryCoursePackagePaymentConfigList(id);
+        model.addAttribute("coursePackagePaymentConfig", list4.remove(0));
+        model.addAttribute("coursePackagePaymentConfigs", list4);
+        CoursePackagePaymentConfig coursePackagePaymentConfig = list4.get(0);
+        model.addAttribute("cashPayment", coursePackagePaymentConfig.getCashPayment() == 0 ? false : true);
+        model.addAttribute("playPaiCoin", coursePackagePaymentConfig.getPlayPaiCoin() == 0 ? false : true);
+        return PREFIX + "coursePackage_info.html";
+    }
+
+
+    /**
+     * 跳转到折扣页
+     * @param model
+     * @param id
+     * @return
+     */
+    @GetMapping("/showCoursePackageDiscount")
+    public String showCoursePackageDiscount(Model model, Integer id){
+        TCoursePackage tCoursePackage = coursePackageService.queryById(id);
+        model.addAttribute("item", tCoursePackage);
+        List<CoursePackagePaymentConfig> list4 = coursePackagePaymentConfigClient.queryCoursePackagePaymentConfigList(id);
+        List<Map<String, Object>> list = new ArrayList<>();
+        for (CoursePackagePaymentConfig coursePackagePaymentConfig : list4) {
+            if(coursePackagePaymentConfig.getCashPayment() == 0){
+                continue;
+            }
+            Map<String, Object> map = new HashMap<>();
+            map.put("coursePackagePaymentConfigId", coursePackagePaymentConfig.getId());
+            map.put("classHours", coursePackagePaymentConfig.getClassHours());
+            String payment = "";
+            if(coursePackagePaymentConfig.getCashPayment() > 0){
+                payment += "现金支付";
+            }
+            if(coursePackagePaymentConfig.getPlayPaiCoin() > 0){
+                payment += (ToolUtil.isNotEmpty(payment) ? "、" : "") + "玩湃币支付";
+            }
+            map.put("payment",  payment);
+            map.put("cashPayment", coursePackagePaymentConfig.getCashPayment());
+            List<TCoursePackageDiscount> tCoursePackageDiscounts = coursePackageDiscountClient.queryCoursePackageDiscount(coursePackagePaymentConfig.getId());
+            map.put("coursePackageDiscount", tCoursePackageDiscounts);
+            list.add(map);
+        }
+        model.addAttribute("coursePackagePaymentConfig", JSON.toJSONString(list));
+        return PREFIX + "coursePackageDiscount.html";
+    }
+
+
+    /**
+     * 跳转到报名列表页
+     * @param model
+     * @param id
+     * @return
+     */
+    @GetMapping("/registrationRecord")
+    public String registrationRecord(Model model, Integer id){
+        TCoursePackage tCoursePackage = coursePackageService.queryById(id);
+        model.addAttribute("item", tCoursePackage);
+        return PREFIX + "registrationRecord.html";
+    }
+
+
+    /**
+     * 跳转到上课记录列表页
+     * @param model
+     * @param id
+     * @return
+     */
+    @GetMapping("/openClassRecord")
+    public String openClassRecord(Model model, Integer id){
+        TCoursePackage tCoursePackage = coursePackageClient.queryById(id);
+        TStore store = storeService.getById(tCoursePackage.getStoreId());
+        Coach coach = coachClient.queryCoachById(tCoursePackage.getCoachId());
+        model.addAttribute("item", tCoursePackage);
+        model.addAttribute("store", store);
+        model.addAttribute("coach", coach);
+        return PREFIX + "classRecord.html";
+    }
+
+
+    /**
+     * 跳转到查看学员列表
+     * @param model
+     * @param id
+     * @return
+     */
+    @GetMapping("/openCoursePackageStudent")
+    public String openCoursePackageStudent(Model model, Long id){
+        model.addAttribute("id", id);
+        return PREFIX + "coursePackageStudent.html";
+    }
+
+
+    /**
+     * 跳转到手动预约列表
+     * @param model
+     * @param id
+     * @return
+     */
+    @GetMapping("/openManualReservation")
+    public String openManualReservation(Model model, Long id){
+        model.addAttribute("id", id);
+        return PREFIX + "manualReservation.html";
+    }
+
+
+    /**
+     * 跳转到课包审核列表页
+     * @return
+     */
+    @GetMapping("/examineCoursePackage")
+    public String examineCoursePackage(Model model){
+        List<TCoursePackageType> tCoursePackageTypes = coursePackageTypeClient.queryAllCoursePackageType();
+        model.addAttribute("coursePackageType", tCoursePackageTypes);
+        List<Map<String, Object>> list = storeService.queryProvince(null);
+        model.addAttribute("province", list);
+        return PREFIX + "examineCoursePackage.html";
+    }
+
+
+    /**
+     * 跳转到审核详情页
+     * @param model
+     * @param id
+     * @return
+     */
+    @GetMapping("/showExamineCoursePackageDetails")
+    public String showExamineCoursePackageDetails(Model model, Integer id){
+        TCoursePackage tCoursePackage = coursePackageService.queryById(id);
+        model.addAttribute("item", tCoursePackage);
+        model.addAttribute("classTime", tCoursePackage.getClassStartTime() + ":00 - " + tCoursePackage.getClassEndTime() + ":00");
+        String[] split = tCoursePackage.getClassWeeks().split(";");
+        List<String> list5 = Arrays.asList("周一", "周二", "周三", "周四", "周五", "周六", "周日");
+        List<Map<String, Object>> classWeeks = new ArrayList<>();
+        for (String s : list5) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("value", s);
+            map.put("checked", false);
+            for (String s1 : split) {
+                if(s.equals(s1)){
+                    map.put("checked", true);
+                }
+            }
+            classWeeks.add(map);
+        }
+        model.addAttribute("classWeeks", classWeeks);
+        List<TCoursePackageType> tCoursePackageTypes = coursePackageTypeClient.queryAllCoursePackageType();
+        model.addAttribute("coursePackageType", tCoursePackageTypes);
+        String cityCode = tCoursePackage.getCityCode();
+        String provinceCode = tCoursePackage.getProvinceCode();
+        List<Map<String, Object>> list = storeService.queryProvince(cityCode);
+        model.addAttribute("province", list);
+        List<Map<String, Object>> list1 = storeService.queryCity(provinceCode, cityCode);
+        model.addAttribute("city", list1);
+        List<TStore> list2 = storeService.list(new QueryWrapper<TStore>().eq("cityCode", cityCode).eq("state", 1));
+        model.addAttribute("store", list2);
+        List<TSite> list3 = siteService.list(new QueryWrapper<TSite>().eq("storeId", tCoursePackage.getStoreId()).eq("state", 1));
+        model.addAttribute("site", list3);
+        List<Coach> coaches = coachClient.queryCoachByCity(cityCode);
+        model.addAttribute("coach", coaches);
+        List<CoursePackagePaymentConfig> list4 = coursePackagePaymentConfigClient.queryCoursePackagePaymentConfigList(id);
+        model.addAttribute("coursePackagePaymentConfig", list4.remove(0));
+        model.addAttribute("coursePackagePaymentConfigs", list4);
+        CoursePackagePaymentConfig coursePackagePaymentConfig = list4.get(0);
+        model.addAttribute("cashPayment", coursePackagePaymentConfig.getCashPayment() == 0 ? false : true);
+        model.addAttribute("playPaiCoin", coursePackagePaymentConfig.getPlayPaiCoin() == 0 ? false : true);
+        return PREFIX + "examineCoursePackage_info.html";
+    }
+
 
 
 
@@ -131,6 +407,44 @@
         }
         return storeService.queryCity(code, cityCode);
     }
+
+
+    /**
+     * 根据城市code获取门店
+     * @param cityCode
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryStore")
+    public List<TStore> queryStore(String cityCode){
+        List<TStore> list = storeService.list(new QueryWrapper<TStore>().eq("cityCode", cityCode).eq("state", 1));
+        return list;
+    }
+
+    /**
+     * 根据门店id获取场地
+     * @param storeId
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/querySite")
+    public List<TSite> querySite(Integer storeId){
+        List<TSite> list = siteService.list(new QueryWrapper<TSite>().eq("storeId", storeId).eq("state", 1));
+        return list;
+    }
+
+    /**
+     * 获取城市教练
+     * @param cityCode
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryCoach")
+    public List<Coach> queryCoach(String cityCode){
+        List<Coach> coaches = coachClient.queryCoachByCity(cityCode);
+        return coaches;
+    }
+
 
 
     /**
@@ -162,7 +476,266 @@
     }
 
 
+    /**
+     * 添加课包数据
+     * @param coursePackage
+     * @param coursePackagePaymentConfig
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/addCoursePackage")
+    public ResultUtil addCoursePackage(TCoursePackage coursePackage, String coursePackagePaymentConfig){
+        String classStartTime = coursePackage.getClassStartTime();
+        String classEndTime = coursePackage.getClassEndTime();
+        classStartTime = classStartTime.substring(0, classStartTime.lastIndexOf(":"));
+        classEndTime = classEndTime.substring(0, classEndTime.lastIndexOf(":"));
+        coursePackage.setClassStartTime(classStartTime);
+        coursePackage.setClassEndTime(classEndTime);
+        coursePackage.setAuditStatus(1);
+        coursePackage.setStatus(1);
+        coursePackage.setState(1);
+        coursePackage.setInsertTime(new Date());
+        coursePackageService.addCoursePackage(coursePackage, coursePackagePaymentConfig);
+        return ResultUtil.success();
+    }
 
 
+    /**
+     * 修改数据
+     * @param coursePackage
+     * @param coursePackagePaymentConfig
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/updateCoursePackage")
+    public ResultUtil updateCoursePackage(TCoursePackage coursePackage, String coursePackagePaymentConfig){
+        String classStartTime = coursePackage.getClassStartTime();
+        String classEndTime = coursePackage.getClassEndTime();
+        classStartTime = classStartTime.substring(0, classStartTime.lastIndexOf(":"));
+        classEndTime = classEndTime.substring(0, classEndTime.lastIndexOf(":"));
+        coursePackage.setClassStartTime(classStartTime);
+        coursePackage.setClassEndTime(classEndTime);
+        coursePackageService.updateCoursePackage(coursePackage, coursePackagePaymentConfig);
+        return ResultUtil.success();
+    }
 
+
+    /**
+     * 修改数据状态
+     * @param id
+     * @param state
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/editCoursePackageState")
+    public ResultUtil editCoursePackageState(Integer id, Integer state){
+        TCoursePackage coursePackage = new TCoursePackage();
+        coursePackage.setId(id);
+        coursePackage.setState(state);
+        coursePackageService.editCoursePackageState(coursePackage);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 编辑课包折扣
+     * @param json
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/setCoursePackageDiscount")
+    public ResultUtil setCoursePackageDiscount(Integer id, String json){
+        return coursePackageService.setCoursePackageDiscount(id, json);
+    }
+
+
+    /**
+     * 获取课包报名信息列表
+     * @param id
+     * @param userName
+     * @param studentName
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryRegistrationRecord")
+    public Object queryRegistrationRecord(Integer id, String userName, String studentName){
+        Page<Map<String, Object>> mapPage = coursePackageService.queryRegistrationRecord(id, userName, studentName);
+        return super.packForBT(mapPage);
+    }
+
+
+    /**
+     * 获取课包排课数据
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryClassRecord")
+    public Object queryClassRecord(Integer id){
+        Page<Map<String, Object>> page = coursePackageService.queryCoursePackageSchedulingList(id);
+        return super.packForBT(page);
+    }
+
+
+    /**
+     * 根据排课id获取学员预约数据列表
+     * @param id
+     * @param userName
+     * @param studentName
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryCoursePackageStudentList")
+    public Object queryCoursePackageStudentList(Long id, String userName, String studentName){
+        Page<Map<String, Object>> page = coursePackageService.queryCoursePackageStudentList(id, userName, studentName);
+        return super.packForBT(page);
+    }
+
+
+    /**
+     * 取消预约
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/cancelReservation")
+    public ResultUtil cancelReservation(Long id){
+        return coursePackageService.cancelReservation(id);
+    }
+
+
+    /**
+     * 修改缺席状态
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/setAbsenceStatus")
+    public ResultUtil setAbsenceStatus(Long id){
+        return coursePackageService.setAbsenceStatus(id);
+    }
+
+
+    /**
+     * 取消排课记录
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/cancelClassSchedule")
+    public ResultUtil cancelClassSchedule(Long id){
+        return coursePackageService.cancelClassSchedule(id);
+    }
+
+
+    /**
+     * 发布课后练习
+     * @param id
+     * @param courseId
+     * @param integral
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/afterClassExercises")
+    public ResultUtil afterClassExercises(Long id, Integer courseId, Integer integral){
+        return coursePackageService.afterClassExercises(id, courseId, integral);
+    }
+
+
+    /**
+     * 添加消课凭证
+     * @param id
+     * @param cancelClasses
+     * @param deductClassHour
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/cancellationRecord")
+    public ResultUtil cancellationRecord(Long id, String cancelClasses, Integer deductClassHour){
+        return coursePackageService.cancellationRecord(id, cancelClasses, deductClassHour);
+    }
+
+
+    /**
+     * 获取未预约排课学员列表
+     * @param coursePackageSchedulingId
+     * @param userName
+     * @param studentName
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryWalkInStudentList")
+    public Object queryWalkInStudentList(Long coursePackageSchedulingId, String userName, String studentName){
+        Page<Map<String, Object>> page = coursePackageService.queryWalkInStudentList(coursePackageSchedulingId, userName, studentName);
+        return super.packForBT(page);
+    }
+
+
+    /**
+     * 手动预约课程
+     * @param coursePackagePaymentId
+     * @param coursePackageSchedulingId
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/courseReservation")
+    public ResultUtil courseReservation(Long coursePackagePaymentId, Long coursePackageSchedulingId){
+        return coursePackageService.courseReservation(coursePackagePaymentId, coursePackageSchedulingId);
+    }
+
+
+    /**
+     * 退课操作
+     * @param coursePackagePaymentId
+     * @param certificate
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/dropTheClass")
+    public ResultUtil dropTheClass(Long coursePackagePaymentId, String certificate){
+        return coursePackageService.dropTheClass(coursePackagePaymentId, certificate);
+    }
+
+
+    /**
+     * 补课操作
+     * @param coursePackagePaymentId
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/makeUpMissedLessons")
+    public ResultUtil makeUpMissedLessons(Long coursePackagePaymentId){
+        return coursePackageService.makeUpMissedLessons(coursePackagePaymentId);
+    }
+
+
+    /**
+     * 获取课包审核列表
+     * @param provinceCode
+     * @param cityCode
+     * @param coursePackageTypeId
+     * @param name
+     * @param auditStatus
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/queryExamineCoursePackageLists")
+    public Object queryExamineCoursePackageLists(String provinceCode, String cityCode, Integer coursePackageTypeId, String name, Integer auditStatus){
+        Page<Map<String, Object>> mapPage = coursePackageService.queryExamineCoursePackageLists(provinceCode, cityCode, coursePackageTypeId, name, auditStatus);
+        return super.packForBT(mapPage);
+    }
+
+
+    /**
+     * 审核课包
+     * @param id
+     * @param auditStatus
+     * @param authRemark
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/setCoursePackageAuditStatus")
+    public ResultUtil setCoursePackageAuditStatus(Integer id, Integer auditStatus, String authRemark){
+        return coursePackageService.setCoursePackageAuditStatus(id, auditStatus, authRemark);
+    }
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/ICoursePackageService.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/ICoursePackageService.java
index 52b537c..088082a 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/ICoursePackageService.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/ICoursePackageService.java
@@ -1,6 +1,9 @@
 package com.dsh.guns.modular.system.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dsh.course.feignClient.course.model.CoursePackageScheduling;
+import com.dsh.course.feignClient.course.model.TCoursePackage;
+import com.dsh.guns.modular.system.util.ResultUtil;
 
 import java.util.Map;
 
@@ -22,4 +25,171 @@
      * @return
      */
     Page<Map<String, Object>> queryCoursePackageLists(String provinceCode, String cityCode, Integer coursePackageTypeId, Integer storeId, String name, Integer status, Integer state);
+
+
+    /**
+     * 添加数据
+     * @param coursePackage
+     * @param coursePackagePaymentConfig
+     */
+    void addCoursePackage(TCoursePackage coursePackage, String coursePackagePaymentConfig);
+
+
+    /**
+     * 获取数据
+     * @param id
+     * @return
+     */
+    TCoursePackage queryById(Integer id);
+
+
+    /**
+     * 修改数据
+     * @param coursePackage
+     * @param coursePackagePaymentConfig
+     */
+    void updateCoursePackage(TCoursePackage coursePackage, String coursePackagePaymentConfig);
+
+
+    /**
+     * 修改数据
+     * @param coursePackage
+     */
+    void editCoursePackageState(TCoursePackage coursePackage);
+
+
+    /**
+     * 编辑课包折扣
+     * @param json
+     * @return
+     */
+    ResultUtil setCoursePackageDiscount(Integer id, String json);
+
+
+    /**
+     * 获取课程报名信息
+     * @param id
+     * @param userName
+     * @param studentName
+     * @return
+     */
+    Page<Map<String, Object>> queryRegistrationRecord(Integer id, String userName, String studentName);
+
+
+    /**
+     * 获取课包上课信息列表
+     * @param id
+     * @return
+     */
+    Page<Map<String, Object>> queryCoursePackageSchedulingList(Integer id);
+
+
+    /**
+     * 获取排课对应学员数据
+     * @param id
+     * @return
+     */
+    Page<Map<String, Object>> queryCoursePackageStudentList(Long id, String userName, String studentName);
+
+
+    /**
+     * 取消学员预约数据
+     * @param id
+     * @return
+     */
+    ResultUtil cancelReservation(Long id);
+
+
+    /**
+     * 修改缺席状态
+     * @param id
+     * @return
+     */
+    ResultUtil setAbsenceStatus(Long id);
+
+
+    /**
+     * 取消本次排课数据
+     * @param id
+     * @return
+     */
+    ResultUtil cancelClassSchedule(Long id);
+
+
+    /**
+     * 添加课后练习
+     * @param id
+     * @param courseId
+     * @param integral
+     * @return
+     */
+    ResultUtil afterClassExercises(Long id, Integer courseId, Integer integral);
+
+
+    /**
+     * 上传消课凭证
+     * @param id
+     * @param cancelClasses
+     * @param deductClassHour
+     * @return
+     */
+    ResultUtil cancellationRecord(Long id, String cancelClasses, Integer deductClassHour);
+
+
+    /**
+     * 获取未预约排课学员列表
+     * @param coursePackageSchedulingId
+     * @param userName
+     * @param studentName
+     * @return
+     */
+    Page<Map<String, Object>> queryWalkInStudentList(Long coursePackageSchedulingId, String userName, String studentName);
+
+
+    /**
+     * 手动预约课程
+     * @param coursePackagePaymentId
+     * @param coursePackageSchedulingId
+     * @return
+     */
+    ResultUtil courseReservation(Long coursePackagePaymentId, Long coursePackageSchedulingId);
+
+
+    /**
+     * 退课操作
+     * @param coursePackagePaymentId
+     * @param certificate
+     * @return
+     */
+    ResultUtil dropTheClass(Long coursePackagePaymentId, String certificate);
+
+
+    /**
+     * 补课操作
+     * @param coursePackagePaymentId
+     * @return
+     */
+    ResultUtil makeUpMissedLessons(Long coursePackagePaymentId);
+
+
+    /**
+     * 获取课包审核列表
+     * @param provinceCode
+     * @param cityCode
+     * @param coursePackageTypeId
+     * @param name
+     * @param auditStatus
+     * @return
+     */
+    Page<Map<String, Object>> queryExamineCoursePackageLists(String provinceCode, String cityCode, Integer coursePackageTypeId, String name, Integer auditStatus);
+
+
+    /**
+     * 审核课包
+     * @param id
+     * @param auditStatus
+     * @param authRemark
+     * @return
+     */
+    ResultUtil setCoursePackageAuditStatus(Integer id, Integer auditStatus, String authRemark);
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/ICourseService.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/ICourseService.java
index 79b8b07..6bc1e5a 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/ICourseService.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/ICourseService.java
@@ -57,4 +57,12 @@
      * @param state
      */
     void editCourseState(Integer id, Integer state);
+
+
+    /**
+     * 根据类型获取数据
+     * @param type
+     * @return
+     */
+    List<TCourse> queryCourseByType(Integer type);
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/CoursePackageService.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/CoursePackageService.java
index fc79a76..994cab8 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/CoursePackageService.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/CoursePackageService.java
@@ -1,17 +1,26 @@
 package com.dsh.guns.modular.system.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.dsh.course.feignClient.course.CoursePackageClient;
-import com.dsh.course.feignClient.course.model.QueryCoursePackageLists;
+import com.dsh.course.feignClient.course.*;
+import com.dsh.course.feignClient.course.model.*;
+import com.dsh.guns.config.UserExt;
 import com.dsh.guns.core.support.HttpKit;
+import com.dsh.guns.core.util.ToolUtil;
 import com.dsh.guns.modular.system.model.TStore;
 import com.dsh.guns.modular.system.service.ICoursePackageService;
 import com.dsh.guns.modular.system.service.IStoreService;
+import com.dsh.guns.modular.system.util.ResultUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -27,6 +36,24 @@
 
     @Autowired
     private IStoreService storeService;
+
+    @Resource
+    private CoursePackagePaymentConfigClient coursePackagePaymentConfigClient;
+
+    @Resource
+    private CoursePackageDiscountClient coursePackageDiscountClient;
+
+    @Resource
+    private CoursePackagePaymentClient coursePackagePaymentClient;
+
+    @Resource
+    private CoursePackageSchedulingClient coursePackageSchedulingClient;
+
+    @Resource
+    private CoursePackageStudentClient coursePackageStudentClient;
+
+    @Resource
+    private CancelledClassesClient cancelledClassesClient;
 
 
 
@@ -65,4 +92,551 @@
         }
         return mapPage;
     }
+
+
+    /**
+     * 添加课包数据
+     * @param coursePackage
+     * @param coursePackagePaymentConfig
+     */
+    @Override
+    public void addCoursePackage(TCoursePackage coursePackage, String coursePackagePaymentConfig) {
+        Integer integer = coursePackageClient.addCoursePackage(coursePackage);
+        JSONArray jsonArray = JSON.parseArray(coursePackagePaymentConfig);
+        for (int i = 0; i < jsonArray.size(); i++) {
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            Integer classHours = jsonObject.getInteger("classHours");
+            Double cashPayment = jsonObject.getDouble("cashPayment");
+            Integer playPaiCoin = jsonObject.getInteger("playPaiCoin");
+            CoursePackagePaymentConfig coursePackagePaymentConfig1 = new CoursePackagePaymentConfig();
+            coursePackagePaymentConfig1.setCoursePackageId(integer);
+            coursePackagePaymentConfig1.setClassHours(classHours);
+            coursePackagePaymentConfig1.setCashPayment(cashPayment);
+            coursePackagePaymentConfig1.setPlayPaiCoin(playPaiCoin);
+            coursePackagePaymentConfigClient.addCoursePackagePaymentConfig(coursePackagePaymentConfig1);
+        }
+    }
+
+
+    /**
+     * 根据id获取数据
+     * @param id
+     * @return
+     */
+    @Override
+    public TCoursePackage queryById(Integer id) {
+        return coursePackageClient.queryById(id);
+    }
+
+
+    /**
+     * 编辑数据
+     * @param coursePackage
+     * @param coursePackagePaymentConfig
+     */
+    @Override
+    public void updateCoursePackage(TCoursePackage coursePackage, String coursePackagePaymentConfig) {
+        coursePackageClient.updateCoursePackage(coursePackage);
+        coursePackagePaymentConfigClient.delCoursePackagePaymentConfig(coursePackage.getId());
+        JSONArray jsonArray = JSON.parseArray(coursePackagePaymentConfig);
+        for (int i = 0; i < jsonArray.size(); i++) {
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            Integer classHours = jsonObject.getInteger("classHours");
+            Double cashPayment = jsonObject.getDouble("cashPayment");
+            Integer playPaiCoin = jsonObject.getInteger("playPaiCoin");
+            CoursePackagePaymentConfig coursePackagePaymentConfig1 = new CoursePackagePaymentConfig();
+            coursePackagePaymentConfig1.setCoursePackageId(coursePackage.getId());
+            coursePackagePaymentConfig1.setClassHours(classHours);
+            coursePackagePaymentConfig1.setCashPayment(cashPayment);
+            coursePackagePaymentConfig1.setPlayPaiCoin(playPaiCoin);
+            coursePackagePaymentConfigClient.addCoursePackagePaymentConfig(coursePackagePaymentConfig1);
+        }
+    }
+
+
+    /**
+     * 修改数据
+     * @param coursePackage
+     */
+    @Override
+    public void editCoursePackageState(TCoursePackage coursePackage) {
+        coursePackageClient.updateCoursePackage(coursePackage);
+    }
+
+
+    /**
+     * 编辑课包折扣
+     * @param json
+     * @return
+     */
+    @Override
+    public ResultUtil setCoursePackageDiscount(Integer id, String json) {
+        List<TCoursePackageDiscount> list = new ArrayList<>();
+        JSONArray jsonArray = JSON.parseArray(json);
+        for (int i = 0; i < jsonArray.size(); i++) {
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            Integer coursePackagePaymentConfigId = jsonObject.getInteger("coursePackagePaymentConfigId");
+            JSONArray coursePackageDiscount = jsonObject.getJSONArray("coursePackageDiscount");
+            if(coursePackageDiscount.size() == 0){
+                continue;
+            }
+            for (int j = 0; j < coursePackageDiscount.size(); j++) {
+                JSONObject cpd = coursePackageDiscount.getJSONObject(j);
+                Integer type = cpd.getInteger("type");
+                switch (type){
+                    case 1:
+                        JSONObject content1 = cpd.getJSONObject("content");
+                        if(null == content1){
+                            return ResultUtil.error("请填写有效的会员折扣");
+                        }
+                        Double discountMember = content1.getDouble("discountMember");
+                        if(null == discountMember){
+                            return ResultUtil.error("请填写有效的会员折扣价格");
+                        }
+                        break;
+                    case 2:
+                        JSONObject content2 = cpd.getJSONObject("content");
+                        if(null == content2){
+                            return ResultUtil.error("请填写有效的续课优惠");
+                        }
+                        Double continuingMember = content2.getDouble("continuingMember");
+                        if(null == continuingMember){
+                            return ResultUtil.error("请填写有效的会员续课价格");
+                        }
+                        Double continuingUser = content2.getDouble("continuingUser");
+                        if(null == continuingUser){
+                            return ResultUtil.error("请填写有效的用户续课价格");
+                        }
+                        break;
+                    case 3:
+                        JSONArray content3 = cpd.getJSONArray("content");
+                        if(content3.size() == 0){
+                            return ResultUtil.error("请配置有效的限时折扣");
+                        }
+                        for (int k = 0; k < content3.size(); k++) {
+                            JSONObject jsonObject1 = content3.getJSONObject(k);
+                            String startDate = jsonObject1.getString("startDate");
+                            String endDate = jsonObject1.getString("endDate");
+                            String startTime = jsonObject1.getString("startTime");
+                            String endTime = jsonObject1.getString("endTime");
+                            JSONArray weeks = jsonObject1.getJSONArray("weeks");
+                            Double cashPayment = jsonObject1.getDouble("cashPayment");
+                            if(ToolUtil.isEmpty(startDate)){
+                                return ResultUtil.error("请填写有效的折扣有效期");
+                            }
+                            if(ToolUtil.isEmpty(endDate)){
+                                return ResultUtil.error("请填写有效的折扣有效期");
+                            }
+                            if(ToolUtil.isEmpty(startTime)){
+                                return ResultUtil.error("请填写有效的折扣时间");
+                            }
+                            if(ToolUtil.isEmpty(endTime)){
+                                return ResultUtil.error("请填写有效的折扣时间");
+                            }
+                            if(null == weeks || weeks.size() == 0){
+                                return ResultUtil.error("请选择有效的折扣时间星期天");
+                            }
+                            if(null == cashPayment){
+                                return ResultUtil.error("请填写有效的折扣金额");
+                            }
+                        }
+                        break;
+                    case 4:
+                        JSONArray content4 = cpd.getJSONArray("content");
+                        if(content4.size() == 0){
+                            return ResultUtil.error("请配置有效的赠送课时");
+                        }
+                        for (int k = 0; k < content4.size(); k++) {
+                            JSONObject jsonObject1 = content4.getJSONObject(k);
+                            String startDate = jsonObject1.getString("startDate");
+                            String endDate = jsonObject1.getString("endDate");
+                            String startTime = jsonObject1.getString("startTime");
+                            String endTime = jsonObject1.getString("endTime");
+                            JSONArray weeks = jsonObject1.getJSONArray("weeks");
+                            Double hour = jsonObject1.getDouble("hour");
+                            if(ToolUtil.isEmpty(startDate)){
+                                return ResultUtil.error("请填写有效的赠送有效期");
+                            }
+                            if(ToolUtil.isEmpty(endDate)){
+                                return ResultUtil.error("请填写有效的赠送有效期");
+                            }
+                            if(ToolUtil.isEmpty(startTime)){
+                                return ResultUtil.error("请填写有效的赠送时间");
+                            }
+                            if(ToolUtil.isEmpty(endTime)){
+                                return ResultUtil.error("请填写有效的赠送时间");
+                            }
+                            if(null == weeks || weeks.size() == 0){
+                                return ResultUtil.error("请选择有效的赠送时间星期天");
+                            }
+                            if(null == hour){
+                                return ResultUtil.error("请填写有效的赠送课时数");
+                            }
+                        }
+                        break;
+                }
+
+                TCoursePackageDiscount coursePackageDiscount1 = new TCoursePackageDiscount();
+                coursePackageDiscount1.setCoursePackageId(id);
+                coursePackageDiscount1.setCoursePackagePaymentConfigId(coursePackagePaymentConfigId);
+                coursePackageDiscount1.setType(type);
+                coursePackageDiscount1.setContent(cpd.getString("content"));
+                coursePackageDiscount1.setAuditStatus(2);
+                coursePackageDiscount1.setInsertTime(new Date());
+                list.add(coursePackageDiscount1);
+            }
+        }
+        coursePackageDiscountClient.setCoursePackageDiscount(list);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 获取课程报名信息
+     * @param id
+     * @param userName
+     * @param studentName
+     * @return
+     */
+    @Override
+    public Page<Map<String, Object>> queryRegistrationRecord(Integer id, String userName, String studentName) {
+        QueryRegistrationRecord queryRegistrationRecord = new QueryRegistrationRecord();
+        queryRegistrationRecord.setCoursePackageId(id);
+        queryRegistrationRecord.setUserName(userName);
+        queryRegistrationRecord.setStudentName(studentName);
+        HttpServletRequest request = HttpKit.getRequest();
+        queryRegistrationRecord.setLimit(Integer.valueOf(request.getParameter("limit")));
+        queryRegistrationRecord.setOffset(Integer.valueOf(request.getParameter("offset")));
+        queryRegistrationRecord.setSort(request.getParameter("sort"));
+        queryRegistrationRecord.setOrder(request.getParameter("order"));
+        Page<Map<String, Object>> mapPage = coursePackagePaymentClient.queryRegistrationRecord(queryRegistrationRecord);
+        return mapPage;
+    }
+
+
+    /**
+     * 获取课包上课信息
+     * @param id
+     * @return
+     */
+    @Override
+    public Page<Map<String, Object>> queryCoursePackageSchedulingList(Integer id) {
+        QueryCoursePackageSchedulingList queryClassRecord = new QueryCoursePackageSchedulingList();
+        queryClassRecord.setCoursePackageId(id);
+        HttpServletRequest request = HttpKit.getRequest();
+        queryClassRecord.setLimit(Integer.valueOf(request.getParameter("limit")));
+        queryClassRecord.setOffset(Integer.valueOf(request.getParameter("offset")));
+        queryClassRecord.setSort(request.getParameter("sort"));
+        queryClassRecord.setOrder(request.getParameter("order"));
+        Page<Map<String, Object>> mapPage = coursePackageSchedulingClient.queryCoursePackageSchedulingList(queryClassRecord);
+        return mapPage;
+    }
+
+
+    /**
+     * 获取排课对应学员数据
+     * @param id
+     * @return
+     */
+    @Override
+    public Page<Map<String, Object>> queryCoursePackageStudentList(Long id, String userName, String studentName) {
+        QueryCoursePackageStudentList queryCoursePackageStudentList = new QueryCoursePackageStudentList();
+        queryCoursePackageStudentList.setCoursePackageSchedulingId(id);
+        queryCoursePackageStudentList.setUserName(userName);
+        queryCoursePackageStudentList.setStudentName(studentName);
+        HttpServletRequest request = HttpKit.getRequest();
+        queryCoursePackageStudentList.setLimit(Integer.valueOf(request.getParameter("limit")));
+        queryCoursePackageStudentList.setOffset(Integer.valueOf(request.getParameter("offset")));
+        queryCoursePackageStudentList.setSort(request.getParameter("sort"));
+        queryCoursePackageStudentList.setOrder(request.getParameter("order"));
+        return coursePackageStudentClient.queryCoursePackageStudentList(queryCoursePackageStudentList);
+    }
+
+
+    /**
+     * 取消预约
+     * @param id
+     * @return
+     */
+    @Override
+    public ResultUtil cancelReservation(Long id) {
+        CoursePackageStudent coursePackageStudent = coursePackageStudentClient.queryCoursePackageStudentById(id);
+        if(coursePackageStudent.getSignInOrNot() == 1){
+            return ResultUtil.error("无法取消预约");
+        }
+        coursePackageStudent = new CoursePackageStudent();
+        coursePackageStudent.setId(id);
+        coursePackageStudent.setReservationStatus(0);
+        coursePackageStudentClient.editCoursePackageStudent(coursePackageStudent);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 修改缺席状态
+     * @param id
+     * @return
+     */
+    @Override
+    public ResultUtil setAbsenceStatus(Long id) {
+        CoursePackageStudent coursePackageStudent = coursePackageStudentClient.queryCoursePackageStudentById(id);
+        if(coursePackageStudent.getReservationStatus() == 0){
+            return ResultUtil.error("该数据已取消预约");
+        }
+        coursePackageStudent = new CoursePackageStudent();
+        coursePackageStudent.setId(id);
+        coursePackageStudent.setSignInOrNot(0);
+        coursePackageStudentClient.editCoursePackageStudent(coursePackageStudent);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 取消本次排课
+     * @param id
+     * @return
+     */
+    @Override
+    public ResultUtil cancelClassSchedule(Long id) {
+        CoursePackageScheduling coursePackageScheduling = coursePackageSchedulingClient.queryCoursePackageSchedulingById(id);
+        if(coursePackageScheduling.getStatus() != 1){
+            return ResultUtil.error("不能取消本次");
+        }
+        List<CoursePackageStudent> coursePackageStudents = coursePackageStudentClient.queryByCoursePackageSchedulingId(id);
+        if(coursePackageStudents.size() > 0){
+            return ResultUtil.error("不能取消本次");
+        }
+        coursePackageScheduling = new CoursePackageScheduling();
+        coursePackageScheduling.setId(id);
+        coursePackageScheduling.setStatus(4);
+        coursePackageSchedulingClient.editCoursePackageScheduling(coursePackageScheduling);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 添加课后练习
+     * @param id
+     * @param courseId
+     * @param integral
+     * @return
+     */
+    @Override
+    public ResultUtil afterClassExercises(Long id, Integer courseId, Integer integral) {
+        CoursePackageScheduling coursePackageScheduling = coursePackageSchedulingClient.queryCoursePackageSchedulingById(id);
+        if(coursePackageScheduling.getStatus() != 3){
+            return ResultUtil.error("不能发布课后练习");
+        }
+        coursePackageScheduling.setCourseId(courseId);
+        coursePackageScheduling.setIntegral(integral);
+        coursePackageSchedulingClient.editCoursePackageScheduling(coursePackageScheduling);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 上传消课凭证
+     * @param id
+     * @param cancelClasses
+     * @param deductClassHour
+     * @return
+     */
+    @Override
+    public ResultUtil cancellationRecord(Long id, String cancelClasses, Integer deductClassHour) {
+        CoursePackageScheduling coursePackageScheduling = coursePackageSchedulingClient.queryCoursePackageSchedulingById(id);
+        if(coursePackageScheduling.getStatus() == 1 || coursePackageScheduling.getStatus() == 4){
+            return ResultUtil.error("不能添加消课凭证");
+        }
+        coursePackageScheduling.setCancelClasses(cancelClasses);
+        coursePackageScheduling.setDeductClassHour(deductClassHour);
+        coursePackageSchedulingClient.editCoursePackageScheduling(coursePackageScheduling);
+
+        List<CoursePackageStudent> coursePackageStudents = coursePackageStudentClient.queryByCoursePackageSchedulingId(id);
+        for (CoursePackageStudent coursePackageStudent : coursePackageStudents) {
+            if(coursePackageStudent.getReservationStatus() == 0){
+                continue;
+            }
+            TCoursePackagePayment tCoursePackagePayment = coursePackagePaymentClient.queryCoursePackagePaymentById(coursePackageStudent.getCoursePackagePaymentId());
+            tCoursePackagePayment.setLaveClassHours(tCoursePackagePayment.getLaveClassHours() - deductClassHour);
+            if(coursePackageStudent.getSignInOrNot() == 0){
+                tCoursePackagePayment.setAbsencesNumber(tCoursePackagePayment.getAbsencesNumber() + 1);
+            }
+            coursePackagePaymentClient.editCoursePackagePayment(tCoursePackagePayment);
+
+            CancelledClasses cancelledClasses = new CancelledClasses();
+            cancelledClasses.setType(1);
+            cancelledClasses.setCoursePackageId(coursePackageStudent.getCoursePackageId());
+            cancelledClasses.setCoursePackagePaymentId(coursePackageStudent.getCoursePackagePaymentId());
+            cancelledClasses.setCoursePackageSchedulingId(coursePackageStudent.getCoursePackageSchedulingId());
+            cancelledClasses.setVoucher(cancelClasses);
+            cancelledClasses.setCancelledClassesNumber(deductClassHour);
+            cancelledClasses.setInsertTime(new Date());
+            cancelledClassesClient.addCancelledClasses(cancelledClasses);
+        }
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 获取未预约排课学员列表
+     * @param coursePackageSchedulingId
+     * @param userName
+     * @param studentName
+     * @return
+     */
+    @Override
+    public Page<Map<String, Object>> queryWalkInStudentList(Long coursePackageSchedulingId, String userName, String studentName) {
+        QueryWalkInStudentList queryWalkInStudentList = new QueryWalkInStudentList();
+        queryWalkInStudentList.setCoursePackageSchedulingId(coursePackageSchedulingId);
+        queryWalkInStudentList.setUserName(userName);
+        queryWalkInStudentList.setStudentName(studentName);
+        HttpServletRequest request = HttpKit.getRequest();
+        queryWalkInStudentList.setLimit(Integer.valueOf(request.getParameter("limit")));
+        queryWalkInStudentList.setOffset(Integer.valueOf(request.getParameter("offset")));
+        queryWalkInStudentList.setSort(request.getParameter("sort"));
+        queryWalkInStudentList.setOrder(request.getParameter("order"));
+        return coursePackagePaymentClient.queryWalkInStudentList(queryWalkInStudentList);
+    }
+
+
+    /**
+     * 手动预约课程
+     * @param coursePackagePaymentId
+     * @param coursePackageSchedulingId
+     * @return
+     */
+    @Override
+    public ResultUtil courseReservation(Long coursePackagePaymentId, Long coursePackageSchedulingId) {
+        QueryCoursePackageStudent queryCoursePackageStudent = new QueryCoursePackageStudent();
+        queryCoursePackageStudent.setCoursePackagePaymentId(coursePackagePaymentId);
+        queryCoursePackageStudent.setCoursePackageSchedulingId(coursePackageSchedulingId);
+        queryCoursePackageStudent.setReservationStatus(1);
+        List<CoursePackageStudent> coursePackageStudents = coursePackageStudentClient.queryCoursePackageStudent(queryCoursePackageStudent);
+        if(coursePackageStudents.size() > 0){
+            return ResultUtil.error("不能重复预约");
+        }
+
+        CoursePackageScheduling coursePackageScheduling = coursePackageSchedulingClient.queryCoursePackageSchedulingById(coursePackageSchedulingId);
+        TCoursePackage tCoursePackage = coursePackageClient.queryById(coursePackageScheduling.getCoursePackageId());
+        queryCoursePackageStudent = new QueryCoursePackageStudent();
+        queryCoursePackageStudent.setCoursePackageId(coursePackageScheduling.getCoursePackageId());
+        queryCoursePackageStudent.setReservationStatus(1);
+        List<CoursePackageStudent> coursePackageStudents1 = coursePackageStudentClient.queryCoursePackageStudent(queryCoursePackageStudent);
+        if(coursePackageStudents1.size() >= tCoursePackage.getMaxSubscribeNumber()){
+            return ResultUtil.error("已达到最多预约人数");
+        }
+
+        TCoursePackagePayment coursePackagePayment = coursePackagePaymentClient.queryCoursePackagePaymentById(coursePackagePaymentId);
+        CoursePackageStudent coursePackageStudent = new CoursePackageStudent();
+        coursePackageStudent.setAppUserId(coursePackagePayment.getAppUserId());
+        coursePackageStudent.setStudentId(coursePackagePayment.getStudentId());
+        coursePackageStudent.setCoursePackageId(coursePackagePayment.getCoursePackageId());
+        coursePackageStudent.setCoursePackagePaymentId(coursePackagePaymentId);
+        coursePackageStudent.setCoursePackageSchedulingId(coursePackageSchedulingId);
+        coursePackageStudent.setSignInOrNot(1);
+        coursePackageStudent.setReservationStatus(1);
+        coursePackageStudent.setInsertTime(new Date());
+        coursePackageStudentClient.addCoursePackageStudent(coursePackageStudent);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 退课操作
+     * @param coursePackagePaymentId
+     * @param certificate
+     * @return
+     */
+    @Override
+    public ResultUtil dropTheClass(Long coursePackagePaymentId, String certificate) {
+        TCoursePackagePayment coursePackagePayment = coursePackagePaymentClient.queryCoursePackagePaymentById(coursePackagePaymentId);
+        if(coursePackagePayment.getStatus() == 2){
+            return ResultUtil.error("不能重复操作");
+        }
+        coursePackagePayment.setStatus(2);
+        coursePackagePayment.setCertificate(certificate);
+        coursePackagePayment.setWithdrawalTime(new Date());
+        //修改课时,费用线下自己处理不走线上
+        Integer laveClassHours = coursePackagePayment.getLaveClassHours();
+        if(laveClassHours == 0){
+            return ResultUtil.error("无可退数量");
+        }
+        coursePackagePayment.setDropoutsNumber(laveClassHours);
+        coursePackagePayment.setLaveClassHours(0);
+        coursePackagePaymentClient.editCoursePackagePayment(coursePackagePayment);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 补课操作
+     * @param coursePackagePaymentId
+     * @return
+     */
+    @Override
+    public ResultUtil makeUpMissedLessons(Long coursePackagePaymentId) {
+        TCoursePackagePayment coursePackagePayment = coursePackagePaymentClient.queryCoursePackagePaymentById(coursePackagePaymentId);
+        if(coursePackagePayment.getStatus() == 2){
+            return ResultUtil.error("该学员已退课");
+        }
+        if(coursePackagePayment.getAbsencesNumber() == 0){
+            return ResultUtil.error("当前不需要补课");
+        }
+        coursePackagePayment.setAbsencesNumber(coursePackagePayment.getAbsencesNumber() - 1);
+        coursePackagePaymentClient.editCoursePackagePayment(coursePackagePayment);
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 获取课包审核列表
+     * @param provinceCode
+     * @param cityCode
+     * @param coursePackageTypeId
+     * @param name
+     * @param auditStatus
+     * @return
+     */
+    @Override
+    public Page<Map<String, Object>> queryExamineCoursePackageLists(String provinceCode, String cityCode, Integer coursePackageTypeId, String name, Integer auditStatus) {
+        QueryExamineCoursePackageLists queryExamineCoursePackageLists = new QueryExamineCoursePackageLists();
+        queryExamineCoursePackageLists.setProvinceCode(provinceCode);
+        queryExamineCoursePackageLists.setCityCode(cityCode);
+        queryExamineCoursePackageLists.setCoursePackageTypeId(coursePackageTypeId);
+        queryExamineCoursePackageLists.setName(name);
+        queryExamineCoursePackageLists.setAuditStatus(auditStatus);
+        HttpServletRequest request = HttpKit.getRequest();
+        queryExamineCoursePackageLists.setLimit(Integer.valueOf(request.getParameter("limit")));
+        queryExamineCoursePackageLists.setOffset(Integer.valueOf(request.getParameter("offset")));
+        queryExamineCoursePackageLists.setSort(request.getParameter("sort"));
+        queryExamineCoursePackageLists.setOrder(request.getParameter("order"));
+        Page<Map<String, Object>> mapPage = coursePackageClient.queryExamineCoursePackageLists(queryExamineCoursePackageLists);
+        List<Map<String, Object>> records = mapPage.getRecords();
+        for (Map<String, Object> record : records) {
+            TStore store = storeService.getById(Integer.valueOf(record.get("storeId").toString()));
+            record.put("store", store.getName());
+        }
+        return mapPage;
+    }
+
+
+    /**
+     * 审核课包
+     * @param id
+     * @param auditStatus
+     * @param authRemark
+     * @return
+     */
+    @Override
+    public ResultUtil setCoursePackageAuditStatus(Integer id, Integer auditStatus, String authRemark) {
+        TCoursePackage tCoursePackage = coursePackageClient.queryById(id);
+        if(tCoursePackage.getAuditStatus() != 1){
+            return ResultUtil.error("不能重复审核");
+        }
+        tCoursePackage.setAuditStatus(auditStatus);
+        tCoursePackage.setAuditUserId(UserExt.getUser().getId());
+        tCoursePackage.setAuthRemark(authRemark);
+        coursePackageClient.updateCoursePackage(tCoursePackage);
+        return ResultUtil.success();
+    }
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/CourseServiceImpl.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/CourseServiceImpl.java
index 88de32d..0de4017 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/CourseServiceImpl.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/CourseServiceImpl.java
@@ -99,4 +99,15 @@
         editCourseState.setState(state);
         courseClient.editCourseState(editCourseState);
     }
+
+
+    /**
+     * 根据类型获取数据
+     * @param type
+     * @return
+     */
+    @Override
+    public List<TCourse> queryCourseByType(Integer type) {
+        return courseClient.queryCourseByType(type);
+    }
 }
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/blackboardBlank.html b/cloud-server-management/src/main/webapp/WEB-INF/view/blackboardBlank.html
index e99fcc5..4f758da 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/blackboardBlank.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/blackboardBlank.html
@@ -53,7 +53,5 @@
         })
     });
 </script>
-
-<script type="text/javascript" src="http://tajs.qq.com/stats?sId=9051096" charset="UTF-8"></script>
 @}
 
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/course/course.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/course/course.html
index b017d62..5f50669 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/course/course.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/course/course.html
@@ -1,5 +1,5 @@
 @layout("/common/_container.html"){
-<link rel="stylesheet" href="${ctxPath}/static/js/layui/css/layui.css"  media="all">
+<link rel="stylesheet" href="${ctxPath}/layui/css/layui.css"  media="all">
 <div class="row">
     <div class="col-sm-12">
         <div class="ibox float-e-margins">
@@ -62,7 +62,7 @@
     </div>
 </div>
 <script src="${ctxPath}/modular/system/course/course.js"></script>
-<script src="${ctxPath}/js/layui/layui.js" charset="utf-8"></script>
+<script src="${ctxPath}/layui/layui.js" charset="utf-8"></script>
 <script>
     laydate.render({
         elem: '#beginTime'
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/classRecord.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/classRecord.html
new file mode 100644
index 0000000..36e6cfb
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/classRecord.html
@@ -0,0 +1,58 @@
+@layout("/common/_container.html"){
+<link rel="stylesheet" href="${ctxPath}/layui/css/layui.css"  media="all">
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <h3>课包信息</h3>
+                            <input type="hidden" id="id" value="${item.id}">
+                            <div class="form-group" style="height: 10px;">
+                                <label class="col-sm-1 control-label" style="text-align: right;">所属门店:</label>
+                                <span class="col-sm-2" style="text-align: left;">${store.name}</span>
+                            </div>
+                            <div class="form-group" style="height: 10px;">
+                                <label class="col-sm-1 control-label" style="text-align: right;">课包名称:</label>
+                                <span class="col-sm-1" style="text-align: left;" id="name">${item.name}</span>
+                            </div>
+                            <div class="form-group" style="height: 10px;">
+                                <label class="col-sm-1 control-label" style="text-align: right;">授课教师:</label>
+                                <span class="col-sm-2" style="text-align: left;">${coach.name}</span>
+                            </div>
+                            <div class="form-group" style="height: 10px;">
+                                <label class="col-sm-1 control-label" style="text-align: right;">上课时间:</label>
+                                <span class="col-sm-2" style="text-align: left;">${item.classWeeks}</span>
+                            </div>
+                            <div class="form-group" style="height: 10px;">
+                                <label class="col-sm-1 control-label" style="text-align: right;"></label>
+                                <span class="col-sm-2" style="text-align: left;">${item.classStartTime + ' - ' + item.classEndTime}</span>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="managerTableToolbar" role="group">
+                            <#button name="查看学员" icon="fa-plus" clickFun="ClassRecord.classRecord()"/>
+                            <#button name="取消本次" icon="fa-edit" clickFun="ClassRecord.cancelClassSchedule()" space="true"/>
+                            <#button name="发布课后练习" icon="fa-refresh" clickFun="ClassRecord.afterClassExercises()" space="true"/>
+                            <#button name="上传消课记录" icon="fa-refresh" clickFun="ClassRecord.cancellationRecord()" space="true"/>
+                            <#button name="查看消课记录" icon="fa-refresh" clickFun="ClassRecord.lookCancellationRecord()" space="true"/>
+                            <#button name="手动预约" icon="fa-refresh" clickFun="ClassRecord.manualReservation()" space="true"/>
+                        </div>
+                        <#table id="managerTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/coursePackage/classRecord.js"></script>
+<script src="${ctxPath}/layui/layui.js" charset="utf-8"></script>
+<script>
+    laydate.render({
+        elem: '#beginTime'
+    });
+    laydate.render({
+        elem: '#endTime'
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage.html
index ed531c2..7d082e6 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage.html
@@ -1,5 +1,5 @@
 @layout("/common/_container.html"){
-<link rel="stylesheet" href="${ctxPath}/static/js/layui/css/layui.css"  media="all">
+<link rel="stylesheet" href="${ctxPath}/layui/css/layui.css"  media="all">
 <div class="row">
     <div class="col-sm-12">
         <div class="ibox float-e-margins">
@@ -76,13 +76,13 @@
                             <#button name="下架" icon="fa-warning" clickFun="CoursePackage.editCoursePackageState(2)" space="true"/>
                             @}
                             @if(shiro.hasPermission("/coursePackage/coursePackageDiscount")){
-                            <#button name="折扣管理" icon="fa-check-circle" clickFun="CoursePackage.detailsCoursePackage()" space="true"/>
+                            <#button name="折扣管理" icon="fa-check-circle" clickFun="CoursePackage.coursePackageDiscount()" space="true"/>
                             @}
                             @if(shiro.hasPermission("/coursePackage/detailsCoursePackage")){
                             <#button name="详情" icon="fa-check-circle" clickFun="CoursePackage.detailsCoursePackage()" space="true"/>
                             @}
                             @if(shiro.hasPermission("/coursePackage/registrationRecord")){
-                            <#button name="报名信息" icon="fa-check-circle" clickFun="CoursePackage.detailsCoursePackage()" space="true"/>
+                            <#button name="报名信息" icon="fa-check-circle" clickFun="CoursePackage.registrationRecord()" space="true"/>
                             @}
                         </div>
                         <#table id="managerTable"/>
@@ -93,7 +93,7 @@
     </div>
 </div>
 <script src="${ctxPath}/modular/system/coursePackage/coursePackage.js"></script>
-<script src="${ctxPath}/js/layui/layui.js" charset="utf-8"></script>
+<script src="${ctxPath}/layui/layui.js" charset="utf-8"></script>
 <script>
     laydate.render({
         elem: '#beginTime'
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackageDiscount.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackageDiscount.html
new file mode 100644
index 0000000..e108ca7
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackageDiscount.html
@@ -0,0 +1,86 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="row">
+                <input type="hidden" id="id" value="${item.id}">
+                <input type="hidden" id="coursePackagePaymentConfig" value='${coursePackagePaymentConfig}'>
+                <div class="form-group">
+                    <div class="col-sm-2"></div>
+                    <div class="col-sm-10">
+                        <label class="col-sm-2 control-label">课包名称:</label>
+                        <div class="col-sm-4" style="margin-top: 6px;">
+                            <span>${item.name}</span>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-2"></div>
+                    <div class="col-sm-10">
+                        <div class="col-sm-2">
+                        </div>
+                        <div class="col-sm-6" id="classHours" style="margin-top: 6px;">
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-2"></div>
+                    <div class="col-sm-10">
+                        <label class="col-sm-2 control-label">支付方式:</label>
+                        <div class="col-sm-4" style="margin-top: 6px;">
+                            <span id="payment"></span>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-2"></div>
+                    <div class="col-sm-10">
+                        <label class="col-sm-2 control-label">现金支付:</label>
+                        <div class="col-sm-4" style="margin-top: 6px;">
+                            <span id="cashPayment"></span>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-2"></div>
+                    <div class="col-sm-10">
+                        <label class="col-sm-2 control-label">*折扣类型:</label>
+                        <div class="col-sm-6" id="types" style="margin-top: 6px;">
+                            <input type="checkbox" name="type" value="1"> 会员折扣&nbsp;&nbsp;&nbsp;&nbsp;
+                            <input type="checkbox" name="type" value="2"> 续课优惠&nbsp;&nbsp;&nbsp;&nbsp;
+                            <input type="checkbox" name="type" value="3"> 限时折扣&nbsp;&nbsp;&nbsp;&nbsp;
+                            <input type="checkbox" name="type" value="4"> 赠送课时&nbsp;&nbsp;&nbsp;&nbsp;
+                        </div>
+                    </div>
+                </div>
+                <div id="memberDiscount">
+
+                </div>
+                <div id="renewalOffer">
+
+                </div>
+                <div id="limitedTimeDiscount">
+
+                </div>
+                <div id="complimentaryClass">
+
+                </div>
+            </div>
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="CoursePackageDiscount.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="CoursePackageDiscount.close()"/>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/coursePackage/coursePackageDiscount.js"></script>
+<script type="text/javascript">
+    laydate.render({
+        elem: '#classStartTime'
+        ,type: 'time'
+        ,range: true
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackageStudent.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackageStudent.html
new file mode 100644
index 0000000..5dbed35
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackageStudent.html
@@ -0,0 +1,43 @@
+@layout("/common/_container.html"){
+<link rel="stylesheet" href="${ctxPath}/layui/css/layui.css"  media="all">
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <input type="hidden" id="id" value="${id}">
+                        <div class="row">
+                            <div class="col-lg-10 col-sm-9">
+                                <div class="row">
+                                    <div class="col-lg-4 col-sm-12">
+                                        <#NameCon id="userName" name="所属用户"/>
+                                    </div>
+                                    <div class="col-lg-4 col-sm-12">
+                                        <#NameCon id="studentName" name="姓名"/>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-lg-2 col-sm-3">
+                                <div class="row">
+                                    <div class="col-lg-12 col-sm-12">
+                                        <#button name="搜索" icon="fa-search" clickFun="CoursePackageStudent.search()"/>
+                                        <#button name="重置" icon="fa-trash" clickFun="CoursePackageStudent.resetSearch()" space="true"/>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="managerTableToolbar" role="group">
+                            <#button name="取消预约" icon="fa-plus" clickFun="CoursePackageStudent.cancelReservation()"/>
+                            <#button name="未到" icon="fa-edit" clickFun="CoursePackageStudent.absence()" space="true"/>
+                        </div>
+                        <#table id="managerTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/coursePackage/coursePackageStudent.js"></script>
+<script src="${ctxPath}/layui/layui.js" charset="utf-8"></script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage_add.html
index 12ab2ab..c0f1ae6 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage_add.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage_add.html
@@ -63,6 +63,7 @@
                     <label class="col-sm-3 control-label">*授课教师:</label>
                     <div class="col-sm-4">
                         <select class="form-control" id="coachId" name="coachId">
+                            <option value="">请选择</option>
                             @for(obj in coach){
                             <option value="${obj.id}">${obj.name}</option>
                             @}
@@ -72,17 +73,34 @@
                 <div class="form-group">
                     <label class="col-sm-3 control-label">*最多预约人数:</label>
                     <div class="col-sm-4">
-                        <input class="form-control" id="maxSubscribeNumber" name="maxSubscribeNumber" type="number" min="0">
+                        <input class="form-control" id="maxSubscribeNumber" name="maxSubscribeNumber" type="number" min="0" placeholder="请输入最多预约人数">
                     </div>
                 </div>
                 <div class="form-group">
-                    <label class="col-sm-3 control-label">课程简介:</label>
+                    <label class="col-sm-3 control-label">*上课时间:</label>
                     <div class="col-sm-4">
-                        <textarea class="form-control" id="introduce" name="introduce" style="height: 200px;"></textarea>
+                        <input class="form-control" id="classStartTime" name="classStartTime" placeholder="请选择">
                     </div>
                 </div>
                 <div class="form-group">
-                    <label class="col-sm-3 control-label head-scu-label">*课程封面</label>
+                    <label class="col-sm-3 control-label"></label>
+                    <div class="col-sm-8">
+                        <input type="checkbox" name="classWeeks" value="周一"> 周一&nbsp;&nbsp;&nbsp;&nbsp;
+                        <input type="checkbox" name="classWeeks" value="周二"> 周二&nbsp;&nbsp;&nbsp;&nbsp;
+                        <input type="checkbox" name="classWeeks" value="周三"> 周三&nbsp;&nbsp;&nbsp;&nbsp;
+                        <input type="checkbox" name="classWeeks" value="周四"> 周四&nbsp;&nbsp;&nbsp;&nbsp;
+                        <input type="checkbox" name="classWeeks" value="周五"> 周五&nbsp;&nbsp;&nbsp;&nbsp;
+                        <input type="checkbox" name="classWeeks" value="周六"> 周六&nbsp;&nbsp;&nbsp;&nbsp;
+                        <input type="checkbox" name="classWeeks" value="周日"> 周日&nbsp;&nbsp;&nbsp;&nbsp;
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*课包封面:</label>
+                    <div class="col-sm-4">
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label">*列表页</label>
                     <div class="col-sm-2">
                         <div id="coverDrawingPreId">
                             <div><img width="100px" height="100px" src="${ctxPath}/img/NoPIC.png"></div>
@@ -97,56 +115,103 @@
                 </div>
                 <div class="form-group">
                     <label class="col-sm-3 control-label head-scu-label"></label>
-                    <label>推荐像素:340 x 254px</label>
+                    <label>推荐像素:210x280px</label>
                 </div>
                 <div class="form-group">
-                    <label class="col-sm-3 control-label head-scu-label">*课程介绍</label>
+                    <label class="col-sm-3 control-label head-scu-label">*详情页</label>
                     <div class="col-sm-2">
-                        <div id="introductionDrawingPreId">
+                        <div id="detailDrawingPreId">
                             <div><img width="100px" height="100px" src="${ctxPath}/img/NoPIC.png"></div>
                         </div>
                     </div>
                     <div class="col-sm-2">
-                        <div class="head-scu-btn upload-btn" id="introductionDrawingBtnId">
+                        <div class="head-scu-btn upload-btn" id="detailDrawingBtnId">
                             <i class="fa fa-upload"></i>&nbsp;上传
                         </div>
                     </div>
-                    <input type="hidden" id="introductionDrawing" value=""/>
+                    <input type="hidden" id="detailDrawing" value=""/>
                 </div>
                 <div class="form-group">
                     <label class="col-sm-3 control-label head-scu-label"></label>
-                    <label>推荐像素:宽780px</label>
+                    <label>推荐像素:780x440px</label>
                 </div>
                 <div class="form-group">
-                    <label class="col-sm-3 control-label head-scu-label">*课程内容</label>
-                    <div class="col-sm-2" style="padding-top: 30px;">
-                        <input type="file" id="upFile" name="upFile" style="display: none">
-                        <input class="form-control" id="courseVideo" readonly/>
+                    <label class="col-sm-3 control-label head-scu-label">*课包介绍</label>
+                    <div class="col-sm-2">
+                        <div id="introduceDrawingPreId">
+                            <div><img width="100px" height="100px" src="${ctxPath}/img/NoPIC.png"></div>
+                        </div>
                     </div>
-                    <div class="col-sm-2" style="padding-top: 30px;">
-                        <button class="btn btn-outline btn-success" type="file" onclick="UploadFileFn()"><i class="fa fa-upload"></i>上传视频</button>
+                    <div class="col-sm-2">
+                        <div class="head-scu-btn upload-btn" id="introduceDrawingBtnId">
+                            <i class="fa fa-upload"></i>&nbsp;上传
+                        </div>
+                    </div>
+                    <input type="hidden" id="introduceDrawing" value=""/>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label"></label>
+                    <label>推荐像素:宽780x</label>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">排序:</label>
+                    <div class="col-sm-4">
+                        <input class="form-control" id="sort" name="sort" type="number" placeholder="请输入排序">
+                    </div>
+                </div>
+                <div class="hr-line-dashed"></div>
+                <h3>课时设置</h3>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*支付方式:</label>
+                    <div class="col-sm-4" style="margin-top: 6px;">
+                        <input type="checkbox" name="payType" value="1"> 现金&nbsp;&nbsp;&nbsp;&nbsp;
+                        <input type="checkbox" name="payType" value="2"> 玩湃币&nbsp;&nbsp;&nbsp;&nbsp;
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*课时有效期:</label>
+                    <div class="col-sm-4">
+                        购买后 <input id="validDays" name="validDays" type="number" min="0" placeholder="天数" style="width: 80px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"> 天内有效
+                    </div>
+                </div>
+                <div id="price">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">*课时数:</label>
+                        <div class="col-sm-8">
+                            <span class="classNumber_span"><input class="classNumber" type="number" min="0" placeholder="请输入" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                            <span class="cash_span"></span>
+                            <span class="paiCoin_span"></span>
+                            <i class="fa fa-plus-circle" style="font-size:24px" onclick="addPrice()"></i>
+                        </div>
                     </div>
                 </div>
             </div>
             <div class="row btn-group-m-t">
                 <div class="col-sm-10">
-                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="CourseInfo.addSubmit()"/>
-                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="CourseInfo.close()"/>
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="CoursePackageInfo.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="CoursePackageInfo.close()"/>
                 </div>
             </div>
         </div>
-
     </div>
 </div>
-<script src="${ctxPath}/modular/system/course/course_info.js"></script>
+<script src="${ctxPath}/modular/system/coursePackage/coursePackage_info.js"></script>
 <script type="text/javascript">
+    laydate.render({
+        elem: '#classStartTime'
+        ,type: 'time'
+        ,range: true
+    });
     var avatarUp = new $WebUpload("coverDrawing");
     avatarUp.setUploadBarId("progressBar");
     avatarUp.init();
 
-    var avatarUp1 = new $WebUpload("introductionDrawing");
+    var avatarUp1 = new $WebUpload("detailDrawing");
     avatarUp1.setUploadBarId("progressBar");
     avatarUp1.init();
 
+    var avatarUp1 = new $WebUpload("introduceDrawing");
+    avatarUp1.setUploadBarId("progressBar");
+    avatarUp1.init();
 </script>
 @}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage_edit.html
new file mode 100644
index 0000000..aab2577
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage_edit.html
@@ -0,0 +1,241 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="row">
+                <input type="hidden" id="id" value="${item.id}">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*所在省:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="provinceCode" name="provinceCode">
+                            @for(obj in province){
+                            <option value="${obj.code}" ${item.provinceCode == obj.code ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*所在市:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="cityCode" name="cityCode">
+                            @for(obj in city){
+                            <option value="${obj.code}" ${item.cityCode == obj.code ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*所属门店:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="storeId" name="storeId">
+                            @for(obj in store){
+                            <option value="${obj.id}" ${item.storeId == obj.id ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*课程类型:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="coursePackageTypeId" name="coursePackageTypeId">
+                            @for(obj in coursePackageType){
+                            <option value="${obj.id}" ${item.coursePackageTypeId == obj.id ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*课包名称:</label>
+                    <div class="col-sm-4">
+                        <input class="form-control" id="name" name="name" value="${item.name}">
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*上课场地:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="siteId" name="siteId">
+                            @for(obj in site){
+                            <option value="${obj.id}" ${item.siteId == obj.id ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*授课教师:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="coachId" name="coachId">
+                            <option value="">请选择</option>
+                            @for(obj in coach){
+                            <option value="${obj.id}" ${item.coachId == obj.id ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*最多预约人数:</label>
+                    <div class="col-sm-4">
+                        <input class="form-control" id="maxSubscribeNumber" name="maxSubscribeNumber" value="${item.maxSubscribeNumber}" type="number" min="0" placeholder="请输入最多预约人数">
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*上课时间:</label>
+                    <div class="col-sm-4">
+                        <input class="form-control" id="classStartTime" name="classStartTime" value="${classTime}" placeholder="请选择">
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label"></label>
+                    <div class="col-sm-8">
+                        @for(obj in classWeeks){
+                        <input type="checkbox" name="classWeeks" value="${obj.value}" ${obj.checked ? 'checked' : ''}> ${obj.value}&nbsp;&nbsp;&nbsp;&nbsp;
+                        @}
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*课包封面:</label>
+                    <div class="col-sm-4">
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label">*列表页</label>
+                    <div class="col-sm-2">
+                        <div id="coverDrawingPreId">
+                            <div><img width="100px" height="100px" src="${item.coverDrawing}"></div>
+                        </div>
+                    </div>
+                    <div class="col-sm-2">
+                        <div class="head-scu-btn upload-btn" id="coverDrawingBtnId">
+                            <i class="fa fa-upload"></i>&nbsp;上传
+                        </div>
+                    </div>
+                    <input type="hidden" id="coverDrawing" value="${item.coverDrawing}"/>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label"></label>
+                    <label>推荐像素:210x280px</label>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label">*详情页</label>
+                    <div class="col-sm-2">
+                        <div id="detailDrawingPreId">
+                            <div><img width="100px" height="100px" src="${item.detailDrawing}"></div>
+                        </div>
+                    </div>
+                    <div class="col-sm-2">
+                        <div class="head-scu-btn upload-btn" id="detailDrawingBtnId">
+                            <i class="fa fa-upload"></i>&nbsp;上传
+                        </div>
+                    </div>
+                    <input type="hidden" id="detailDrawing" value="${item.detailDrawing}"/>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label"></label>
+                    <label>推荐像素:780x440px</label>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label">*课包介绍</label>
+                    <div class="col-sm-2">
+                        <div id="introduceDrawingPreId">
+                            <div><img width="100px" height="100px" src="${item.introduceDrawing}"></div>
+                        </div>
+                    </div>
+                    <div class="col-sm-2">
+                        <div class="head-scu-btn upload-btn" id="introduceDrawingBtnId">
+                            <i class="fa fa-upload"></i>&nbsp;上传
+                        </div>
+                    </div>
+                    <input type="hidden" id="introduceDrawing" value="${item.introduceDrawing}"/>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label"></label>
+                    <label>推荐像素:宽780x</label>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">排序:</label>
+                    <div class="col-sm-4">
+                        <input class="form-control" id="sort" name="sort" value="${item.sort}" type="number" placeholder="请输入排序">
+                    </div>
+                </div>
+                <div class="hr-line-dashed"></div>
+                <h3>课时设置</h3>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*支付方式:</label>
+                    <div class="col-sm-4" style="margin-top: 6px;">
+                        <input type="checkbox" name="payType" value="1" ${cashPayment ? 'checked' : ''}> 现金&nbsp;&nbsp;&nbsp;&nbsp;
+                        <input type="checkbox" name="payType" value="2" ${playPaiCoin ? 'checked' : ''}> 玩湃币&nbsp;&nbsp;&nbsp;&nbsp;
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*课时有效期:</label>
+                    <div class="col-sm-4">
+                        购买后 <input id="validDays" name="validDays" type="number" value="${item.validDays}" min="0" placeholder="天数" style="width: 80px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"> 天内有效
+                    </div>
+                </div>
+                <div id="price">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">*课时数:</label>
+                        <div class="col-sm-8">
+                            <span class="classNumber_span"><input class="classNumber" type="number" value="${coursePackagePaymentConfig.classHours}" min="0" placeholder="请输入" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                            <span class="cash_span">
+                                @if(cashPayment){
+                                现金支付:<input class="cash" type="number" value="${coursePackagePaymentConfig.cashPayment}" min="0" placeholder="请输入金额" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"> ¥&nbsp;&nbsp;&nbsp;&nbsp;
+                                @}
+                            </span>
+                            <span class="paiCoin_span">
+                                @if(playPaiCoin){
+                                玩湃币支付:<input class="paiCoin" type="number" value="${coursePackagePaymentConfig.playPaiCoin}" min="0" placeholder="请输入金额" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"> 币&nbsp;&nbsp;&nbsp;&nbsp;
+                                @}
+                            </span>
+                            <i class="fa fa-plus-circle" style="font-size:24px" onclick="addPrice()"></i>
+                        </div>
+                    </div>
+                    @for(obj in coursePackagePaymentConfigs){
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">*课时数:</label>
+                        <div class="col-sm-8">
+                            <span class="classNumber_span"><input class="classNumber" type="number" value="${obj.classHours}" min="0" placeholder="请输入" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                            <span class="cash_span">
+                                @if(cashPayment){
+                                现金支付:<input class="cash" type="number" value="${obj.cashPayment}" min="0" placeholder="请输入金额" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"> ¥&nbsp;&nbsp;&nbsp;&nbsp;
+                                @}
+                            </span>
+                            <span class="paiCoin_span">
+                                @if(playPaiCoin){
+                                玩湃币支付:<input class="paiCoin" type="number" value="${obj.playPaiCoin}" min="0" placeholder="请输入金额" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"> 币&nbsp;&nbsp;&nbsp;&nbsp;
+                                @}
+                            </span>
+                            <i class="fa fa-trash-o" style="font-size:24px" onclick="removePrice(4, this)"></i>
+                        </div>
+                    </div>
+                    @}
+                </div>
+            </div>
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="CoursePackageInfo.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="CoursePackageInfo.close()"/>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/coursePackage/coursePackage_info.js"></script>
+<script type="text/javascript">
+    laydate.render({
+        elem: '#classStartTime'
+        ,type: 'time'
+        ,range: true
+    });
+    var avatarUp = new $WebUpload("coverDrawing");
+    avatarUp.setUploadBarId("progressBar");
+    avatarUp.init();
+
+    var avatarUp1 = new $WebUpload("detailDrawing");
+    avatarUp1.setUploadBarId("progressBar");
+    avatarUp1.init();
+
+    var avatarUp1 = new $WebUpload("introduceDrawing");
+    avatarUp1.setUploadBarId("progressBar");
+    avatarUp1.init();
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage_info.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage_info.html
new file mode 100644
index 0000000..6cc25f2
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/coursePackage_info.html
@@ -0,0 +1,202 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="row">
+                <input type="hidden" id="id" value="${item.id}">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*所在省:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="provinceCode" name="provinceCode" disabled>
+                            @for(obj in province){
+                            <option value="${obj.code}" ${item.provinceCode == obj.code ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*所在市:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="cityCode" name="cityCode" disabled>
+                            @for(obj in city){
+                            <option value="${obj.code}" ${item.cityCode == obj.code ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*所属门店:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="storeId" name="storeId" disabled>
+                            @for(obj in store){
+                            <option value="${obj.id}" ${item.storeId == obj.id ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*课程类型:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="coursePackageTypeId" name="coursePackageTypeId" disabled>
+                            @for(obj in coursePackageType){
+                            <option value="${obj.id}" ${item.coursePackageTypeId == obj.id ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*课包名称:</label>
+                    <div class="col-sm-4">
+                        <input class="form-control" id="name" name="name" value="${item.name}" readonly>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*上课场地:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="siteId" name="siteId" disabled>
+                            @for(obj in site){
+                            <option value="${obj.id}" ${item.siteId == obj.id ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*授课教师:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="coachId" name="coachId" disabled>
+                            <option value="">请选择</option>
+                            @for(obj in coach){
+                            <option value="${obj.id}" ${item.coachId == obj.id ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*最多预约人数:</label>
+                    <div class="col-sm-4">
+                        <input class="form-control" id="maxSubscribeNumber" name="maxSubscribeNumber" value="${item.maxSubscribeNumber}" type="number" min="0" placeholder="请输入最多预约人数" readonly>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*上课时间:</label>
+                    <div class="col-sm-4">
+                        <input class="form-control" id="classStartTime" name="classStartTime" value="${classTime}" placeholder="请选择" readonly>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label"></label>
+                    <div class="col-sm-8">
+                        @for(obj in classWeeks){
+                        <input type="checkbox" name="classWeeks" value="${obj.value}" ${obj.checked ? 'checked' : ''}> ${obj.value}&nbsp;&nbsp;&nbsp;&nbsp;
+                        @}
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*课包封面:</label>
+                    <div class="col-sm-4">
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label">*列表页</label>
+                    <div class="col-sm-2">
+                        <div id="coverDrawingPreId">
+                            <div><img width="100px" height="100px" src="${item.coverDrawing}"></div>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label"></label>
+                    <label>推荐像素:210x280px</label>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label">*详情页</label>
+                    <div class="col-sm-2">
+                        <div id="detailDrawingPreId">
+                            <div><img width="100px" height="100px" src="${item.detailDrawing}"></div>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label"></label>
+                    <label>推荐像素:780x440px</label>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label">*课包介绍</label>
+                    <div class="col-sm-2">
+                        <div id="introduceDrawingPreId">
+                            <div><img width="100px" height="100px" src="${item.introduceDrawing}"></div>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label"></label>
+                    <label>推荐像素:宽780x</label>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">排序:</label>
+                    <div class="col-sm-4">
+                        <input class="form-control" id="sort" name="sort" value="${item.sort}" type="number" placeholder="请输入排序">
+                    </div>
+                </div>
+                <div class="hr-line-dashed"></div>
+                <h3>课时设置</h3>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*支付方式:</label>
+                    <div class="col-sm-4" style="margin-top: 6px;">
+                        <input type="checkbox" name="payType" value="1" ${cashPayment ? 'checked' : ''}> 现金&nbsp;&nbsp;&nbsp;&nbsp;
+                        <input type="checkbox" name="payType" value="2" ${playPaiCoin ? 'checked' : ''}> 玩湃币&nbsp;&nbsp;&nbsp;&nbsp;
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*课时有效期:</label>
+                    <div class="col-sm-4">
+                        购买后 <input id="validDays" name="validDays" type="number" value="${item.validDays}" min="0" placeholder="天数" style="width: 80px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;" readonly> 天内有效
+                    </div>
+                </div>
+                <div id="price">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">*课时数:</label>
+                        <div class="col-sm-8">
+                            <span class="classNumber_span"><input class="classNumber" type="number" value="${coursePackagePaymentConfig.classHours}" min="0" placeholder="请输入" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;" readonly>&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                            <span class="cash_span">
+                                @if(cashPayment){
+                                现金支付:<input class="cash" type="number" value="${coursePackagePaymentConfig.cashPayment}" min="0" placeholder="请输入金额" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;" readonly> ¥&nbsp;&nbsp;&nbsp;&nbsp;
+                                @}
+                            </span>
+                            <span class="paiCoin_span">
+                                @if(playPaiCoin){
+                                玩湃币支付:<input class="paiCoin" type="number" value="${coursePackagePaymentConfig.playPaiCoin}" min="0" placeholder="请输入金额" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;" readonly> 币&nbsp;&nbsp;&nbsp;&nbsp;
+                                @}
+                            </span>
+                        </div>
+                    </div>
+                    @for(obj in coursePackagePaymentConfigs){
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">*课时数:</label>
+                        <div class="col-sm-8">
+                            <span class="classNumber_span"><input class="classNumber" type="number" value="${obj.classHours}" min="0" placeholder="请输入" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;" readonly>&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                            <span class="cash_span">
+                                @if(cashPayment){
+                                现金支付:<input class="cash" type="number" value="${obj.cashPayment}" min="0" placeholder="请输入金额" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;" readonly> ¥&nbsp;&nbsp;&nbsp;&nbsp;
+                                @}
+                            </span>
+                            <span class="paiCoin_span">
+                                @if(playPaiCoin){
+                                玩湃币支付:<input class="paiCoin" type="number" value="${obj.playPaiCoin}" min="0" placeholder="请输入金额" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;" readonly> 币&nbsp;&nbsp;&nbsp;&nbsp;
+                                @}
+                            </span>
+                        </div>
+                    </div>
+                    @}
+                </div>
+            </div>
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="danger" name="关闭" id="cancel" icon="fa-eraser" clickFun="CoursePackageInfo.close()"/>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/coursePackage/coursePackage_info.js"></script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/examineCoursePackage.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/examineCoursePackage.html
new file mode 100644
index 0000000..b490e0e
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/examineCoursePackage.html
@@ -0,0 +1,82 @@
+@layout("/common/_container.html"){
+<link rel="stylesheet" href="${ctxPath}/layui/css/layui.css"  media="all">
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>课包审核</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-lg-10 col-sm-9">
+                                <div class="row">
+                                    <div class="col-lg-4 col-sm-12">
+                                        <#SelectCon id="provinceCode" name="所在省">
+                                            <option value="">全部</option>
+                                            @for(obj in province){
+                                            <option value="${obj.code}">${obj.name}</option>
+                                            @}
+                                        </#SelectCon>
+                                    </div>
+                                    <div class="col-lg-4 col-sm-12">
+                                        <#SelectCon id="cityCode" name="所在市">
+                                            <option value="">全部</option>
+                                        </#SelectCon>
+                                    </div>
+                                    <div class="col-lg-4 col-sm-12">
+                                        <#SelectCon id="coursePackageTypeId" name="课包类型">
+                                            <option value="">全部</option>
+                                            @for(obj in coursePackageType){
+                                            <option value="${obj.id}">${obj.name}</option>
+                                            @}
+                                        </#SelectCon>
+                                    </div>
+                                    <div class="col-lg-4 col-sm-12">
+                                        <#NameCon id="name" name="课包名称"/>
+                                    </div>
+                                    <div class="col-lg-4 col-sm-12">
+                                        <#SelectCon id="auditStatus" name="审核状态">
+                                            <option value="">全部</option>
+                                            <option value="1">待审核</option>
+                                            <option value="3">未通过</option>
+                                        </#SelectCon>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-lg-2 col-sm-3">
+                                <div class="row">
+                                    <div class="col-lg-12 col-sm-12">
+                                        <#button name="搜索" icon="fa-search" clickFun="ExamineCoursePackage.search()"/>
+                                        <#button name="重置" icon="fa-trash" clickFun="ExamineCoursePackage.resetSearch()" space="true"/>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="managerTableToolbar" role="group">
+                            @if(shiro.hasPermission("/coursePackage/examineCoursePackage")){
+                            <#button name="审核" icon="fa-plus" clickFun="ExamineCoursePackage.examineCoursePackage()"/>
+                            @}
+                            @if(shiro.hasPermission("/coursePackage/detailsExamineCoursePackage")){
+                            <#button name="详情" icon="fa-check-circle" clickFun="ExamineCoursePackage.detailsExamineCoursePackage()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="managerTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/coursePackage/examineCoursePackage.js"></script>
+<script src="${ctxPath}/layui/layui.js" charset="utf-8"></script>
+<script>
+    laydate.render({
+        elem: '#beginTime'
+    });
+    laydate.render({
+        elem: '#endTime'
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/examineCoursePackage_info.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/examineCoursePackage_info.html
new file mode 100644
index 0000000..9fe4f92
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/examineCoursePackage_info.html
@@ -0,0 +1,229 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="row">
+                <input type="hidden" id="id" value="${item.id}">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">当前状态:</label>
+                    <div class="col-sm-4">
+                        @if(item.auditStatus == 1){
+                        <span style="color: #D99A0D;">待审核</span>
+                        @}
+                        @if(item.auditStatus == 3){
+                        <span style="color: #F11B1B;">未通过</span>
+                        @}
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*所在省:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="provinceCode" name="provinceCode" disabled>
+                            @for(obj in province){
+                            <option value="${obj.code}" ${item.provinceCode == obj.code ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*所在市:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="cityCode" name="cityCode" disabled>
+                            @for(obj in city){
+                            <option value="${obj.code}" ${item.cityCode == obj.code ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*所属门店:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="storeId" name="storeId" disabled>
+                            @for(obj in store){
+                            <option value="${obj.id}" ${item.storeId == obj.id ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*课程类型:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="coursePackageTypeId" name="coursePackageTypeId" disabled>
+                            @for(obj in coursePackageType){
+                            <option value="${obj.id}" ${item.coursePackageTypeId == obj.id ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*课包名称:</label>
+                    <div class="col-sm-4">
+                        <input class="form-control" id="name" name="name" value="${item.name}" readonly>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*上课场地:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="siteId" name="siteId" disabled>
+                            @for(obj in site){
+                            <option value="${obj.id}" ${item.siteId == obj.id ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*授课教师:</label>
+                    <div class="col-sm-4">
+                        <select class="form-control" id="coachId" name="coachId" disabled>
+                            <option value="">请选择</option>
+                            @for(obj in coach){
+                            <option value="${obj.id}" ${item.coachId == obj.id ? 'selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*最多预约人数:</label>
+                    <div class="col-sm-4">
+                        <input class="form-control" id="maxSubscribeNumber" name="maxSubscribeNumber" value="${item.maxSubscribeNumber}" type="number" min="0" placeholder="请输入最多预约人数" readonly>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*上课时间:</label>
+                    <div class="col-sm-4">
+                        <input class="form-control" id="classStartTime" name="classStartTime" value="${classTime}" placeholder="请选择" readonly>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label"></label>
+                    <div class="col-sm-8">
+                        @for(obj in classWeeks){
+                        <input type="checkbox" name="classWeeks" value="${obj.value}" ${obj.checked ? 'checked' : ''}> ${obj.value}&nbsp;&nbsp;&nbsp;&nbsp;
+                        @}
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*课包封面:</label>
+                    <div class="col-sm-4">
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label">*列表页</label>
+                    <div class="col-sm-2">
+                        <div id="coverDrawingPreId">
+                            <div><img width="100px" height="100px" src="${item.coverDrawing}"></div>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label"></label>
+                    <label>推荐像素:210x280px</label>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label">*详情页</label>
+                    <div class="col-sm-2">
+                        <div id="detailDrawingPreId">
+                            <div><img width="100px" height="100px" src="${item.detailDrawing}"></div>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label"></label>
+                    <label>推荐像素:780x440px</label>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label">*课包介绍</label>
+                    <div class="col-sm-2">
+                        <div id="introduceDrawingPreId">
+                            <div><img width="100px" height="100px" src="${item.introduceDrawing}"></div>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label"></label>
+                    <label>推荐像素:宽780x</label>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">排序:</label>
+                    <div class="col-sm-4">
+                        <input class="form-control" id="sort" name="sort" value="${item.sort}" type="number" placeholder="请输入排序">
+                    </div>
+                </div>
+                <div class="hr-line-dashed"></div>
+                <h3>课时设置</h3>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*支付方式:</label>
+                    <div class="col-sm-4" style="margin-top: 6px;">
+                        <input type="checkbox" name="payType" value="1" ${cashPayment ? 'checked' : ''}> 现金&nbsp;&nbsp;&nbsp;&nbsp;
+                        <input type="checkbox" name="payType" value="2" ${playPaiCoin ? 'checked' : ''}> 玩湃币&nbsp;&nbsp;&nbsp;&nbsp;
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*课时有效期:</label>
+                    <div class="col-sm-4">
+                        购买后 <input id="validDays" name="validDays" type="number" value="${item.validDays}" min="0" placeholder="天数" style="width: 80px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;" readonly> 天内有效
+                    </div>
+                </div>
+                <div id="price">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">*课时数:</label>
+                        <div class="col-sm-8">
+                            <span class="classNumber_span"><input class="classNumber" type="number" value="${coursePackagePaymentConfig.classHours}" min="0" placeholder="请输入" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;" readonly>&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                            <span class="cash_span">
+                                @if(cashPayment){
+                                现金支付:<input class="cash" type="number" value="${coursePackagePaymentConfig.cashPayment}" min="0" placeholder="请输入金额" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;" readonly> ¥&nbsp;&nbsp;&nbsp;&nbsp;
+                                @}
+                            </span>
+                            <span class="paiCoin_span">
+                                @if(playPaiCoin){
+                                玩湃币支付:<input class="paiCoin" type="number" value="${coursePackagePaymentConfig.playPaiCoin}" min="0" placeholder="请输入金额" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;" readonly> 币&nbsp;&nbsp;&nbsp;&nbsp;
+                                @}
+                            </span>
+                        </div>
+                    </div>
+                    @for(obj in coursePackagePaymentConfigs){
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">*课时数:</label>
+                        <div class="col-sm-8">
+                            <span class="classNumber_span"><input class="classNumber" type="number" value="${obj.classHours}" min="0" placeholder="请输入" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;" readonly>&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                            <span class="cash_span">
+                                @if(cashPayment){
+                                现金支付:<input class="cash" type="number" value="${obj.cashPayment}" min="0" placeholder="请输入金额" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;" readonly> ¥&nbsp;&nbsp;&nbsp;&nbsp;
+                                @}
+                            </span>
+                            <span class="paiCoin_span">
+                                @if(playPaiCoin){
+                                玩湃币支付:<input class="paiCoin" type="number" value="${obj.playPaiCoin}" min="0" placeholder="请输入金额" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;" readonly> 币&nbsp;&nbsp;&nbsp;&nbsp;
+                                @}
+                            </span>
+                        </div>
+                    </div>
+                    @}
+                </div>
+                <div class="hr-line-dashed"></div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*审核状态:</label>
+                    <div class="col-sm-8" style="margin-top: 6px;">
+                        <input name="auditStatus" type="radio" value="2"/> 通过&nbsp;&nbsp;&nbsp;&nbsp;
+                        <input name="auditStatus" type="radio" value="3"/> 拒绝&nbsp;&nbsp;&nbsp;&nbsp;
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">*拒绝理由:</label>
+                    <div class="col-sm-8" style="margin-top: 6px;">
+                        <textarea id="authRemark" style="width: 100%;height: 200px;" placeholder="请输入拒绝理由"></textarea>
+                    </div>
+                </div>
+
+            </div>
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="CoursePackageInfo.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="CoursePackageInfo.close()"/>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/coursePackage/examineCoursePackage_info.js"></script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/manualReservation.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/manualReservation.html
new file mode 100644
index 0000000..0fb01fc
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/manualReservation.html
@@ -0,0 +1,42 @@
+@layout("/common/_container.html"){
+<link rel="stylesheet" href="${ctxPath}/layui/css/layui.css"  media="all">
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <input type="hidden" id="id" value="${id}">
+                        <div class="row">
+                            <div class="col-lg-10 col-sm-9">
+                                <div class="row">
+                                    <div class="col-lg-4 col-sm-12">
+                                        <#NameCon id="userName" name="所属用户"/>
+                                    </div>
+                                    <div class="col-lg-4 col-sm-12">
+                                        <#NameCon id="studentName" name="姓名"/>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-lg-2 col-sm-3">
+                                <div class="row">
+                                    <div class="col-lg-12 col-sm-12">
+                                        <#button name="搜索" icon="fa-search" clickFun="ManualReservation.search()"/>
+                                        <#button name="重置" icon="fa-trash" clickFun="ManualReservation.resetSearch()" space="true"/>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="managerTableToolbar" role="group">
+                            <#button name="保存" icon="fa-plus" clickFun="ManualReservation.submit()"/>
+                        </div>
+                        <#table id="managerTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/coursePackage/manualReservation.js"></script>
+<script src="${ctxPath}/layui/layui.js" charset="utf-8"></script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/registrationRecord.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/registrationRecord.html
new file mode 100644
index 0000000..c193dc6
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackage/registrationRecord.html
@@ -0,0 +1,53 @@
+@layout("/common/_container.html"){
+<link rel="stylesheet" href="${ctxPath}/layui/css/layui.css"  media="all">
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <input type="hidden" id="id" value="${item.id}">
+                            <input type="hidden" id="name" value="${item.name}">
+                            <div class="col-lg-10 col-sm-9">
+                                <div class="row">
+                                    <div class="col-lg-4 col-sm-12">
+                                        <#NameCon id="userName" name="购买用户"/>
+                                    </div>
+                                    <div class="col-lg-4 col-sm-12">
+                                        <#NameCon id="studentName" name="购买学员"/>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-lg-2 col-sm-3">
+                                <div class="row">
+                                    <div class="col-lg-12 col-sm-12">
+                                        <#button name="搜索" icon="fa-search" clickFun="RegistrationRecord.search()"/>
+                                        <#button name="重置" icon="fa-trash" clickFun="RegistrationRecord.resetSearch()" space="true"/>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="managerTableToolbar" role="group">
+                            <#button name="上课记录" icon="fa-plus" clickFun="RegistrationRecord.classRecord()"/>
+                            <#button name="退课" icon="fa-edit" clickFun="RegistrationRecord.dropClass()" space="true"/>
+                            <#button name="补课" icon="fa-refresh" clickFun="RegistrationRecord.makeUpMissedLessons()" space="true"/>
+                        </div>
+                        <#table id="managerTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/coursePackage/registrationRecord.js"></script>
+<script src="${ctxPath}/layui/layui.js" charset="utf-8"></script>
+<script>
+    laydate.render({
+        elem: '#beginTime'
+    });
+    laydate.render({
+        elem: '#endTime'
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/dept/dept_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/dept/dept_add.html
index f19f8e6..2463845 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/dept/dept_add.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/dept/dept_add.html
@@ -38,5 +38,5 @@
 
     </div>
 </div>
-<script src="${ctxPath}/static/modular/system/dept/dept_info.js"></script>
+<script src="${ctxPath}/modular/system/dept/dept_info.js"></script>
 @}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/dept/dept_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/dept/dept_edit.html
index 76375ed..e99d2fd 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/dept/dept_edit.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/dept/dept_edit.html
@@ -39,5 +39,5 @@
 
     </div>
 </div>
-<script src="${ctxPath}/static/modular/system/dept/dept_info.js"></script>
+<script src="${ctxPath}/modular/system/dept/dept_info.js"></script>
 @}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/menu/menu_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/menu/menu_edit.html
index be64dd1..574b78c 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/menu/menu_edit.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/menu/menu_edit.html
@@ -38,5 +38,5 @@
 
 </div>
 </div>
-<script src="${ctxPath}/static/modular/system/menu/menu_info.js"></script>
+<script src="${ctxPath}/modular/system/menu/menu_info.js"></script>
 @}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tAuditRecord/tAuditRecord.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tAuditRecord/tAuditRecord.html
index 2913f18..cfb046f 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tAuditRecord/tAuditRecord.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tAuditRecord/tAuditRecord.html
@@ -34,5 +34,5 @@
         </div>
     </div>
 </div>
-<script src="${ctxPath}/static/modular/system/tAuditRecord/tAuditRecord.js"></script>
+<script src="${ctxPath}/modular/system/tAuditRecord/tAuditRecord.js"></script>
 @}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tAuditRecord/tAuditRecord_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tAuditRecord/tAuditRecord_add.html
index 03b81ad..9d15965 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tAuditRecord/tAuditRecord_add.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tAuditRecord/tAuditRecord_add.html
@@ -29,5 +29,5 @@
 
     </div>
 </div>
-<script src="${ctxPath}/static/modular/system/tAuditRecord/tAuditRecord_info.js"></script>
+<script src="${ctxPath}/modular/system/tAuditRecord/tAuditRecord_info.js"></script>
 @}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tAuditRecord/tAuditRecord_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tAuditRecord/tAuditRecord_edit.html
index 8ff5814..dc95986 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tAuditRecord/tAuditRecord_edit.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tAuditRecord/tAuditRecord_edit.html
@@ -29,5 +29,5 @@
 
     </div>
 </div>
-<script src="${ctxPath}/static/modular/system/tAuditRecord/tAuditRecord_info.js"></script>
+<script src="${ctxPath}/modular/system/tAuditRecord/tAuditRecord_info.js"></script>
 @}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tEnsureIncomeRule/tEnsureIncomeRule_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tEnsureIncomeRule/tEnsureIncomeRule_edit.html
index 0366fb0..edf9f97 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tEnsureIncomeRule/tEnsureIncomeRule_edit.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tEnsureIncomeRule/tEnsureIncomeRule_edit.html
@@ -31,5 +31,5 @@
 
     </div>
 </div>
-<script src="${ctxPath}/static/modular/system/tEnsureIncomeRule/tEnsureIncomeRule_info.js"></script>
+<script src="${ctxPath}/modular/system/tEnsureIncomeRule/tEnsureIncomeRule_info.js"></script>
 @}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user.html
index 53eee27..1346bd3 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user.html
@@ -1,5 +1,5 @@
 @layout("/common/_container.html"){
-<link rel="stylesheet" href="${ctxPath}/static/js/layui/css/layui.css"  media="all">
+<link rel="stylesheet" href="${ctxPath}/layui/css/layui.css"  media="all">
 <div class="row">
 	<div class="col-sm-12">
 		<div class="ibox float-e-margins">
@@ -59,8 +59,8 @@
 		</div>
 	</div>
 </div>
-<script src="${ctxPath}/static/modular/system/user/user.js"></script>
-<script src="${ctxPath}/static/js/layui/layui.js" charset="utf-8"></script>
+<script src="${ctxPath}/modular/system/user/user.js"></script>
+<script src="${ctxPath}/layui/layui.js" charset="utf-8"></script>
 <script>
 	laydate.render({
 		elem: '#beginTime'
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_add.html
index b0ff5b8..84673fc 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_add.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_add.html
@@ -57,7 +57,7 @@
 </div>
 </div>
 </div>
-<script src="${ctxPath}/static/modular/system/user/user_info.js"></script>
+<script src="${ctxPath}/modular/system/user/user_info.js"></script>
 <script>
 	laydate.render({
 		elem: '#birthday'
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_chpwd.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_chpwd.html
index a376cc2..2b16ce3 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_chpwd.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_chpwd.html
@@ -30,5 +30,5 @@
         </div>
     </div>
 </div>
-<script src="${ctxPath}/static/modular/system/user/user_info.js"></script>
+<script src="${ctxPath}/modular/system/user/user_info.js"></script>
 @}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_edit.html
index 6f68f95..1528104 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_edit.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_edit.html
@@ -65,7 +65,7 @@
 
 </div>
 </div>
-<script src="${ctxPath}/static/modular/system/user/user_info.js"></script>
+<script src="${ctxPath}/modular/system/user/user_info.js"></script>
 <script>
 	laydate.render({
 		elem: '#birthday'
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_view.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_view.html
index df6193c..45d82c6 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_view.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/user/user_view.html
@@ -66,7 +66,7 @@
     </div>
 </div>
 </div>
-<script src="${ctxPath}/static/modular/system/user/user_info.js"></script>
+<script src="${ctxPath}/modular/system/user/user_info.js"></script>
 <script>
     laydate.render({
         elem: '#birthday'
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/course/course_info.js b/cloud-server-management/src/main/webapp/static/modular/system/course/course_info.js
index 75f45e4..a659869 100644
--- a/cloud-server-management/src/main/webapp/static/modular/system/course/course_info.js
+++ b/cloud-server-management/src/main/webapp/static/modular/system/course/course_info.js
@@ -117,32 +117,7 @@
     ajax.start();
 };
 
-/**
- * 修改密码
- */
-CourseInfo.chPwd = function () {
-    let oldPwd = $('#oldPwd').val();
-    let newPwd = $('#newPwd').val();
-    if(oldPwd == newPwd){
-        Feng.error("新密码不能和原始密码相同");
-        return
-    }
-    let patt = /(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[^a-zA-Z0-9]).{8,30}/;
-    if(!patt.test(newPwd)){
-        Feng.error("密码中必须包含大小字母、数字、特称字符,至少8个字符,最多30个字符");
-        return
-    }
-    var ajax = new $ax(Feng.ctxPath + "/mgr/changePwd", function (data) {
-        Feng.success("修改成功!");
-    }, function (data) {
-        Feng.error("修改失败!" + data.responseJSON.message + "!");
-    });
-    ajax.set("oldPwd");
-    ajax.set("newPwd");
-    ajax.set("rePwd");
-    ajax.start();
 
-};
 
 function onBodyDown(event) {
     if (!(event.target.id == "menuBtn" || event.target.id == "menuContent" || $(
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/classRecord.js b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/classRecord.js
new file mode 100644
index 0000000..f3dfaa7
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/classRecord.js
@@ -0,0 +1,428 @@
+/**
+ * 系统管理--用户管理的单例对象
+ */
+let ClassRecord = {
+    id: "managerTable",//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1,
+    courseList: null
+};
+/**
+ * 初始化表格的列
+ */
+ClassRecord.initColumn = function () {
+    let columns = [
+        {field: 'selectItem', radio: true},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '日期', field: 'classDate', align: 'center', valign: 'middle'},
+        {title: '报名学员', field: 'registered', align: 'center', valign: 'middle'},
+        {title: '实到学员', field: 'actualArrival', align: 'center', valign: 'middle'},
+        {title: '未到学员', field: 'nonArrival', align: 'center', valign: 'middle'},
+        {title: '课后练习', field: 'courseId', align: 'center', valign: 'middle',
+            formatter: function (v) {
+                if(typeof v == "undefined"){
+                    return '未布置';
+                }else{
+                    return '已布置';
+                }
+            }
+        },
+        {title: '状态', field: 'status', align: 'center', valign: 'middle',
+            formatter: function (v) {
+                switch (v) {
+                    case 1:
+                        return '未开始';
+                    case 2:
+                        return '已开始';
+                    case 3:
+                        return '已结束';
+                    case 4:
+                        return '已取消';
+                }
+            }
+        },
+        {title: '扣除课时', field: 'deductClassHour', align: 'center', valign: 'middle'},
+        {title: '取消记录', field: 'absencesNumber', align: 'center', valign: 'middle',
+            formatter: function (v) {
+                if(typeof v == "undefined"){
+                    return '未上传';
+                }else{
+                    return '已上传';
+                }
+            }
+        },
+    ];
+    return columns;
+};
+
+/**
+ * 检查是否选中
+ */
+ClassRecord.check = function () {
+    let selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    } else {
+        ClassRecord.seItem = selected[0];
+        return true;
+    }
+};
+
+
+
+/**
+ * 点击修改按钮时
+ * @param userId 管理员id
+ */
+ClassRecord.classRecord = function () {
+    if (this.check()) {
+        let index = layer.open({
+            type: 2,
+            title: '查看学员',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/coursePackage/openCoursePackageStudent?id=' + this.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+
+
+/**
+ * 删除用户
+ */
+ClassRecord.cancelClassSchedule = function () {
+    if (this.check()) {
+        let operation = function(){
+            let ajax = new $ax(Feng.ctxPath + "/coursePackage/cancelClassSchedule", function (res) {
+                if(res.code == 200){
+                    Feng.success("取消成功!");
+                    ClassRecord.table.refresh();
+                }else{
+                    Feng.error(res.msg);
+                }
+            }, function (data) {
+                Feng.error("取消失败!" + data.responseJSON.message + "!");
+            });
+            ajax.set("id", ClassRecord.seItem.id);
+            ajax.start();
+        };
+
+        Feng.confirm("确定取消本次",operation);
+    }
+};
+
+
+
+ClassRecord.afterClassExercises = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/course/queryCourseByType", function (data) {
+            ClassRecord.courseList = data;
+            let htmlStr =
+                '<div class="form-horizontal">' +
+                '   <div class="col-sm-11" style="padding: 20px;">' +
+                '       <div class="form-group">\n' +
+                '           <label class="col-sm-3 control-label">视频类型:</label>\n' +
+                '           <div class="col-sm-9" style="margin-top: 6px;">\n' +
+                '               <span>课后练习</span>' +
+                '           </div>\n' +
+                '       </div>' +
+                '       <div class="form-group">\n' +
+                '           <label class="col-sm-3 control-label">视频名称:</label>\n' +
+                '           <div class="col-sm-9">\n' +
+                '               <select class="form-control" id="courseId">' +
+                '                   <option value="">请选择</option>';
+            for (let i = 0; i < data.length; i++) {
+                htmlStr += '<option value="' + data[i].id + '">' + data[i].name + '</option>';
+            }
+            htmlStr += '        </select>' +
+            '               </div>\n' +
+            '           </div>' +
+                '       <div class="form-group">\n' +
+                '           <label class="col-sm-3 control-label">视频封面:</label>\n' +
+                '           <div class="col-sm-9">\n' +
+                '               <img src="" style="height: 150px;" id="coverDrawing"/>' +
+                '           </div>\n' +
+                '       </div>' +
+                '       <div class="form-group">\n' +
+                '           <label class="col-sm-3 control-label">视频简介:</label>\n' +
+                '           <div class="col-sm-9">\n' +
+                '               <textarea class="form-control" id="introduce" style="height: 200px;"></textarea>' +
+                '           </div>\n' +
+                '       </div>' +
+                '       <div class="form-group">\n' +
+                '           <label class="col-sm-3 control-label">可获得积分:</label>\n' +
+                '           <div class="col-sm-9">\n' +
+                '               <input class="form-control" id="integral" type="number" min="0">' +
+                '           </div>\n' +
+                '       </div>' +
+            '       </div>' +
+            '</div>';
+            layer.open({
+                type: 1
+                , title: '选择课程'
+                , area: ['50%', '90%']
+                , offset: 'auto' //具体配置参考:http://www.layui.com/doc/modules/layer.html#offset
+                , id: 'layerDemo' //防止重复弹出cge
+                , content: htmlStr
+                , btn: ['保存', '关闭']
+                , btnAlign: 'c' //按钮居中
+                , shade: 0.5 //不显示遮罩
+                , yes: function () {
+                    let courseId = $('#courseId').val();
+                    let integral = $('#integral').val();
+                    if(null == courseId || '' == courseId){
+                        Feng.error("请选择有效的课程");
+                        return
+                    }
+                    if(null == integral || '' == integral){
+                        Feng.error("请输入有效的积分");
+                        return
+                    }
+                    let ajax = new $ax(Feng.ctxPath + "/coursePackage/afterClassExercises", function (res) {
+                        if(res.code == 200){
+                            Feng.success("保存成功!");
+                            layer.closeAll();
+                            RegistrationRecord.table.refresh();
+                        }else{
+                            Feng.error(res.msg);
+                        }
+                    }, function (data) {
+                        Feng.error("保存失败!" + data.responseJSON.message + "!");
+                    });
+                    ajax.set("id", ClassRecord.seItem.id);
+                    ajax.set("courseId", courseId);
+                    ajax.set("integral", integral);
+                    ajax.start();
+                },
+            });
+
+            $('#courseId').change(function () {
+                let id = $(this).val();
+                for (let i = 0; i < ClassRecord.courseList.length; i++) {
+                    if(ClassRecord.courseList[i].id == id){
+                        $('#coverDrawing').attr("src", ClassRecord.courseList[i].coverDrawing);
+                        $('#introduce').text(ClassRecord.courseList[i].introduce);
+                    }
+                }
+            })
+
+            $('#courseId').val(ClassRecord.seItem.courseId);
+            $('#integral').val(ClassRecord.seItem.integral);
+
+        }, function (data) {
+            Feng.error("获取失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set('type', 1);
+        ajax.start();
+    }
+};
+
+
+ClassRecord.cancellationRecord = function(){
+    if(this.check()){
+        let htmlStr =
+            '<div class="form-horizontal">' +
+            '   <div class="col-sm-11" style="padding: 20px;">' +
+            '       <div class="form-group">\n' +
+            '           <label class="col-sm-2"></label>'+
+            '           <label class="col-sm-8 control-label" style="text-align: left;">课程名称:' + $("#name").text() + '</label>\n' +
+            '       </div>' +
+            '       <div class="form-group">\n' +
+            '           <label class="col-sm-2"></label>'+
+            '           <label class="col-sm-8 control-label" style="text-align: left;">*上传凭证(请上传小于5张图片):</label>\n' +
+            '       </div>' +
+            '       <div class="form-group">\n' +
+            '           <label class="col-sm-2"></label>'+
+            '           <div class="col-sm-8" style="min-height: 200px;">\n' +
+            '               <div id="cancelClasses"></div>' +
+            '               <input type="file" id="file" style="display: none;"/>' +
+            '               <button onclick="uploadImgs()" style="width: 60px;padding: 10px; color: white;background-color: #0d8ddb;border-radius: 5px;border: none;bottom: 50%;position: absolute;"> 上传 </button>' +
+            '           </div>\n' +
+            '       </div>' +
+            '       <div class="form-group">\n' +
+            '           <label class="col-sm-2"></label>'+
+            '           <label class="control-label" style="text-align: left;">扣除课时数:</label>\n' +
+            '           <input id="deductClassHour" type="number" min="0" style="background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;">' +
+            '       </div>' +
+            '       </div>' +
+            '</div>';
+        layer.open({
+            type: 1
+            , title: '上传消课记录'
+            , area: ['80%', '90%']
+            , offset: 'auto' //具体配置参考:http://www.layui.com/doc/modules/layer.html#offset
+            , id: 'layerDemo' //防止重复弹出cge
+            , content: htmlStr
+            , btn: ['保存', '关闭']
+            , btnAlign: 'c' //按钮居中
+            , shade: 0.5 //不显示遮罩
+            , yes: function () {
+                let cancelClasses = $('#cancelClasses').html();
+                let deductClassHour = $('#deductClassHour').val();
+                if(null == cancelClasses || '' == cancelClasses){
+                    Feng.error("请上传凭证图片");
+                    return
+                }
+                if(null == deductClassHour || '' == deductClassHour){
+                    Feng.error("请输入有效的扣除课时数");
+                    return
+                }
+                let div_array = $('#cancelClasses').find('div');
+                let str = '';
+                for (let i = 0; i < div_array.length; i++) {
+                    let v = $($(div_array[i]).find('img')[0]).attr('src');
+                    str += v + ";";
+                }
+
+                let ajax = new $ax(Feng.ctxPath + "/coursePackage/cancellationRecord", function (res) {
+                    if(res.code == 200){
+                        Feng.success("保存成功!");
+                        layer.closeAll();
+                        RegistrationRecord.table.refresh();
+                    }else{
+                        Feng.error(res.msg);
+                    }
+                }, function (data) {
+                    Feng.error("保存失败!" + data.responseJSON.message + "!");
+                });
+                ajax.set("id", ClassRecord.seItem.id);
+                ajax.set("cancelClasses", str.substring(0, str.length - 1));
+                ajax.set("deductClassHour", deductClassHour);
+                ajax.start();
+            },
+        });
+
+        $('#file').on('change', function () {
+            var formData = new FormData()  //创建一个forData
+            formData.append('file', $('#file')[0].files[0]) //把file添加进去  name命名为img
+            layer.load(); //上传loading
+            $.ajax({
+                url: Feng.ctxPath + '/mgr/uploadImg',
+                data: formData,
+                type: "POST",
+                async: true,
+                cache: false,
+                contentType: false,
+                processData: false,
+                success: function(res) {
+                    layer.closeAll('loading'); //关闭loading
+                    $('#file').val('');
+                    $('#cancelClasses').append('' +
+                        '<div style="float: left; margin: 10px; width: 200px;">' +
+                        '   <i class="fa fa-close" style="font-size:24px;color: red;position: relative;top: 10px;right: -190px" onclick="removeImg(this)"></i>' +
+                        '   <div style="width: 100%;"><img src="' + res + '" style="width: 100%;"/></div>' +
+                        '</div>')
+                }
+            })
+        })
+    }
+}
+
+
+ClassRecord.lookCancellationRecord = function(){
+    if(this.check()){
+        if(ClassRecord.seItem.cancelClasses == '' || ClassRecord.seItem.cancelClasses == null){
+            Feng.error("请先上传消课凭证");
+            return
+        }
+        let imgs = ClassRecord.seItem.cancelClasses.split(";");
+        let htmlStr =
+            '<div class="form-horizontal">' +
+            '   <div class="col-sm-11" style="padding: 20px;">' +
+            '       <div class="form-group">\n' +
+            '           <label class="col-sm-8 control-label">课程名称:' + $("#name").text() + '</label>\n' +
+            '       </div>' +
+            '       <div class="form-group">\n' +
+            '           <label class="col-sm-8 control-label">*上传凭证(请上传小于5张图片):</label>\n' +
+            '       </div>' +
+            '       <div class="form-group">\n' +
+            '           <div class="col-sm-8" style="min-height: 200px;">\n' +
+            '               <div id="cancelClasses">';
+
+        for (let i = 0; i < imgs.length; i++) {
+            htmlStr += '<div><img src="' + imgs[i] + '" style="height: 150px;"/></div>&nbsp;&nbsp;&nbsp;&nbsp;';
+        }
+
+        htmlStr += '</div>' +
+            '           </div>\n' +
+            '       </div>' +
+            '       <div class="form-group">\n' +
+            '           <label class="col-sm-3 control-label">扣除课时数:</label>\n' +
+            '           <div class="col-sm-9">\n' +
+            '               <input class="form-control" id="deductClassHour" value="' + ClassRecord.seItem.deductClassHour + '" type="number" min="0">' +
+            '           </div>\n' +
+            '       </div>' +
+            '       </div>' +
+            '</div>';
+        layer.open({
+            type: 1
+            , title: '查看消课记录'
+            , area: ['50%', '90%']
+            , offset: 'auto' //具体配置参考:http://www.layui.com/doc/modules/layer.html#offset
+            , id: 'layerDemo' //防止重复弹出cge
+            , content: htmlStr
+            , btnAlign: 'c' //按钮居中
+            , shade: 0.5 //不显示遮罩
+            , yes: function () {
+            },
+        });
+    }
+}
+
+ClassRecord.manualReservation = function(){
+    if(this.check()){
+        let index = layer.open({
+            type: 2,
+            title: '手动预约',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/coursePackage/openManualReservation?id=' + this.seItem.id
+        });
+        this.layerIndex = index;
+    }
+}
+
+function uploadImgs(){
+    let num = $('#cancelClasses>div').length;
+    if(num >= 5){
+        Feng.error("最多只能上传5张图片");
+        return;
+    }
+    $('#file').click();
+}
+
+
+function removeImg(e){
+    $(e).parent('div').remove();
+}
+
+
+
+
+ClassRecord.resetSearch = function () {
+    ClassRecord.search();
+}
+
+ClassRecord.search = function () {
+    let queryData = {};
+    queryData['id'] = $('#id').val();
+    ClassRecord.table.refresh({query: queryData});
+}
+
+
+$(function () {
+    let defaultColunms = ClassRecord.initColumn();
+    let table = new BSTable(ClassRecord.id, "/coursePackage/queryClassRecord", defaultColunms);
+    // 设置物理分页server(逻辑分页client)
+    table.setPaginationType("server");
+    table.setQueryParams({
+        id: $('#id').val()
+    })
+    ClassRecord.table = table.init();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackage.js b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackage.js
index f0e372d..1e461a3 100644
--- a/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackage.js
+++ b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackage.js
@@ -5,10 +5,10 @@
     id: "managerTable",//表格id
     seItem: null,		//选中的条目
     table: null,
-    layerIndex: -1,
-    deptid:0
+    layerIndex: -1
 };
-let language =$("#language").val()
+
+
 /**
  * 初始化表格的列
  */
@@ -25,7 +25,7 @@
         {title: '课程有效期', field: 'validDays', align: 'center', valign: 'middle'},
         {title: '支付方式', field: 'payType', align: 'center', valign: 'middle'},
         {title: '排序', field: 'sort', align: 'center', valign: 'middle'},
-        {title: '课程封面', field: 'status', align: 'center', valign: 'middle',
+        {title: '课包状态', field: 'status', align: 'center', valign: 'middle',
             formatter: function (v) {
                 switch (v) {
                     case 1:
@@ -88,13 +88,17 @@
  */
 CoursePackage.editCoursePackage = function () {
     if (this.check()) {
+        if(CoursePackage.seItem.status != 1){
+            Feng.error("该状态不能编辑");
+            return
+        }
         let index = layer.open({
             type: 2,
             title: '编辑',
             area: ['100%', '100%'], //宽高
             fix: false, //不固定
             maxmin: true,
-            content: Feng.ctxPath + '/course/showEditCoursePackage?id=' + this.seItem.id
+            content: Feng.ctxPath + '/coursePackage/openEditCoursePackage?id=' + this.seItem.id
         });
         this.layerIndex = index;
     }
@@ -108,7 +112,7 @@
 CoursePackage.delCoursePackage = function () {
     if (this.check()) {
         let operation = function(){
-            let ajax = new $ax(Feng.ctxPath + "/course/delCoursePackage", function () {
+            let ajax = new $ax(Feng.ctxPath + "/coursePackage/delCoursePackage", function () {
                 Feng.success("删除成功!");
                 CoursePackage.table.refresh();
             }, function (data) {
@@ -132,11 +136,11 @@
             Feng.error("不能重复操作");
             return
         }
-        let ajax = new $ax(Feng.ctxPath + "/course/editCoursePackageState", function (data) {
-            Feng.success("下架成功!");
+        let ajax = new $ax(Feng.ctxPath + "/coursePackage/editCoursePackageState", function (data) {
+            Feng.success(state == 1 ? '上架' : "下架" + "成功!");
             CoursePackage.table.refresh();
         }, function (data) {
-            Feng.error("下架失败!" + data.responseJSON.message + "!");
+            Feng.error(state == 1 ? '上架' : "下架" + "失败!" + data.responseJSON.message + "!");
         });
         ajax.set("id", CoursePackage.seItem.id);
         ajax.set("state", state);
@@ -153,7 +157,43 @@
             area: ['100%', '100%'], //宽高
             fix: false, //不固定
             maxmin: true,
-            content: Feng.ctxPath + '/course/showCoursePackageDetails?id=' + this.seItem.id
+            content: Feng.ctxPath + '/coursePackage/showCoursePackageDetails?id=' + this.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+
+CoursePackage.coursePackageDiscount = function () {
+    if (this.check()) {
+        let payType = CoursePackage.seItem.payType;
+        if(payType.indexOf("现金支付") < 0){
+            Feng.error("该课程不能配置折扣");
+            return
+        }
+        let index = layer.open({
+            type: 2,
+            title: '折扣管理',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/coursePackage/showCoursePackageDiscount?id=' + this.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+
+
+CoursePackage.registrationRecord = function () {
+    if (this.check()) {
+        let index = layer.open({
+            type: 2,
+            title: '报名信息',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/coursePackage/registrationRecord?id=' + this.seItem.id
         });
         this.layerIndex = index;
     }
@@ -193,7 +233,7 @@
 
     $('#provinceCode').change(function () {
         let ajax = new $ax(Feng.ctxPath + "/coursePackage/queryCity", function (data) {
-            let htmlStr = '<option value="">全部</option>';
+            let htmlStr = '';
             for (let i = 0; i < data.length; i++) {
                 htmlStr += '<option value="' + data[i].code + '">' + data[i].name + '</option>'
             }
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackageDiscount.js b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackageDiscount.js
new file mode 100644
index 0000000..9b77955
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackageDiscount.js
@@ -0,0 +1,819 @@
+/**
+ * 用户详情对话框(可用于添加和修改对话框)
+ */
+var CoursePackageDiscount = {
+    userInfoData: {},
+    coursePackagePaymentConfig: {}
+};
+
+
+
+/**
+ * 关闭此对话框
+ */
+CoursePackageDiscount.close = function () {
+    parent.layer.close(window.parent.CoursePackage.layerIndex);
+};
+
+
+/**
+ * 提交修改
+ */
+CoursePackageDiscount.editSubmit = function () {
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/coursePackage/setCoursePackageDiscount", function (data) {
+        if(data.code == 200){
+            Feng.success("编辑成功!");
+            CoursePackageDiscount.close();
+            window.parent.CoursePackage.table.refresh();
+        }else{
+            Feng.error(data.msg);
+        }
+    }, function (data) {
+        Feng.error("编辑失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set('json', JSON.stringify(CoursePackageDiscount.coursePackagePaymentConfig));
+    ajax.set('id', $('#id').val());
+    ajax.start();
+};
+
+
+
+
+
+
+function addPrice(type){
+    let index = $('#classHours').find('button[checked]').attr('index');
+    if(type == 3){
+        let ll = $('#limitedTimeDiscount .limitedTimeDiscount').length;
+        let htmlStr =
+            '   <div class="form-group limitedTimeDiscount" index="' + ll + '">' +
+            '           <div class="col-sm-2"></div>\n' +
+            '           <div class="col-sm-8" style="border: 1px solid; padding: 20px;">\n' +
+            '                <div class="form-group">\n' +
+            '                    <label class="col-sm-2 control-label">折扣有效期:</label>\n' +
+            '                    <div class="col-sm-9">\n' +
+            '                         <input class="startAndEndDay" style="width: 300px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/>' +
+            '                    </div>\n' +
+            '                    <div class="col-sm-1"><i class="fa fa-trash-o" style="font-size:24px;color: red;" onclick="removePrice(3, this)"></i></div>\n' +
+            '                </div>' +
+            '                <div class="form-group">\n' +
+            '                    <label class="col-sm-2 control-label">*折扣时间:</label>\n' +
+            '                    <div class="col-sm-5">\n' +
+            '                        <input class="time" style="width: 200px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/>\n' +
+            '                    </div>\n' +
+            '                </div>' +
+            '                <div class="form-group">\n' +
+            '                    <label class="col-sm-2 control-label"></label>\n' +
+            '                    <div class="col-sm-8" style="margin-top: 6px;">\n' +
+            '                        <input type="checkbox" name="week" value="1" onclick="addPriceValue(3, this, \'weeks\')"/> 周一&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="2" onclick="addPriceValue(3, this, \'weeks\')"/> 周二&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="3" onclick="addPriceValue(3, this, \'weeks\')"/> 周三&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="4" onclick="addPriceValue(3, this, \'weeks\')"/> 周四&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="5" onclick="addPriceValue(3, this, \'weeks\')"/> 周五&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="6" onclick="addPriceValue(3, this, \'weeks\')"/> 周六&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="7" onclick="addPriceValue(3, this, \'weeks\')"/> 周日&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                    </div>\n' +
+            '                </div>' +
+            '                <div class="form-group">\n' +
+            '                    <label class="col-sm-2 control-label">*现金支付:</label>\n' +
+            '                    <div class="col-sm-4">\n' +
+            '                        <input type="number" class="price" onblur="addPriceValue(3, this, \'cashPayment\')" min="0" placeholder="请输入折扣后支付价格" style="width: 180px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/> ¥\n' +
+            '                    </div>\n' +
+            '                </div>' +
+            '           </div>' +
+            '   </div>';
+
+        $('#limitedTimeDiscount').append(htmlStr);
+        let arr = CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount;
+        for(let k in arr){
+            if(arr[k].type == 3){
+                arr[k].content.push({})
+            }
+        }
+        lay('.startAndEndDay').each(function(i, e){
+            laydate.render({
+                elem: this
+                ,type: 'datetime'
+                ,range: true
+                ,done: function(value, date, endDate){
+                    let index = $('#classHours').find('button[checked]').attr('index');
+                    let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+                    let ii = $(e).parent('div').parent('div').parent('div').parent('div').attr('index');
+                    for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+                        if(type == obj.coursePackageDiscount[i].type){
+                            let jsonArray = obj.coursePackageDiscount[i].content;
+                            for (let j = 0; j < jsonArray.length; j++) {
+                                if(j == ii){
+                                    let arr = value.split(" - ");
+                                    obj.coursePackageDiscount[i].content[j]['startDate'] = arr[0];
+                                    obj.coursePackageDiscount[i].content[j]['endDate'] = arr[1];
+                                }
+                            }
+                        }
+                    }
+                }
+            });
+        });
+        lay('.time').each(function(i, e){
+            laydate.render({
+                elem: this
+                ,type: 'time'
+                ,range: true
+                ,done: function(value, date, endDate){
+                    let index = $('#classHours').find('button[checked]').attr('index');
+                    let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+                    let ii = $(e).parent('div').parent('div').parent('div').parent('div').attr('index');
+                    for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+                        if(type == obj.coursePackageDiscount[i].type){
+                            let jsonArray = obj.coursePackageDiscount[i].content;
+                            for (let j = 0; j < jsonArray.length; j++) {
+                                if(j == ii){
+                                    let arr = value.split(" - ");
+                                    obj.coursePackageDiscount[i].content[j]['startTime'] = arr[0];
+                                    obj.coursePackageDiscount[i].content[j]['endTime'] = arr[1];
+                                }
+                            }
+                        }
+                    }
+                }
+            });
+        });
+    }
+    if(type == 4){
+        let ll = $('#complimentaryClass .complimentaryClass').length;
+        let htmlStr =
+            '   <div class="form-group complimentaryClass" index="' + ll + '">' +
+            '           <div class="col-sm-2"></div>\n' +
+            '           <div class="col-sm-8" style="border: 1px solid; padding: 20px;">\n' +
+            '                <div class="form-group">\n' +
+            '                    <label class="col-sm-2 control-label">*赠送有效期:</label>\n' +
+            '                    <div class="col-sm-9">\n' +
+            '                         <input class="startAndEndDay" style="width: 300px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/>' +
+            '                    </div>\n' +
+            '                    <div class="col-sm-1"><i class="fa fa-trash-o" style="font-size:24px;color: red;" onclick="removePrice(4, this)"></i></div>\n' +
+            '                </div>' +
+            '                <div class="form-group">\n' +
+            '                    <label class="col-sm-2 control-label">*赠送时间:</label>\n' +
+            '                    <div class="col-sm-5">\n' +
+            '                        <input class="time" style="width: 200px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/>\n' +
+            '                    </div>\n' +
+            '                </div>' +
+            '                <div class="form-group">\n' +
+            '                    <label class="col-sm-2 control-label"></label>\n' +
+            '                    <div class="col-sm-8" style="margin-top: 6px;">\n' +
+            '                        <input type="checkbox" name="week" value="1" onclick="addPriceValue(4, this, \'weeks\')"/> 周一&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="2" onclick="addPriceValue(4, this, \'weeks\')"/> 周二&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="3" onclick="addPriceValue(4, this, \'weeks\')"/> 周三&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="4" onclick="addPriceValue(4, this, \'weeks\')"/> 周四&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="5" onclick="addPriceValue(4, this, \'weeks\')"/> 周五&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="6" onclick="addPriceValue(4, this, \'weeks\')"/> 周六&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="7" onclick="addPriceValue(4, this, \'weeks\')"/> 周日&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                    </div>\n' +
+            '                </div>' +
+            '                <div class="form-group">\n' +
+            '                    <label class="col-sm-2 control-label">*赠送课时数:</label>\n' +
+            '                    <div class="col-sm-4">\n' +
+            '                        <input type="number" class="price" onblur="addPriceValue(4, this, \'hour\')" min="0" placeholder="请输入赠送课时数" style="width: 180px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/> ¥\n' +
+            '                    </div>\n' +
+            '                </div>' +
+            '           </div>' +
+            '   </div>';
+        $('#complimentaryClass').append(htmlStr);
+        let arr = CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount;
+        for(let k in arr){
+            if(arr[k].type == 4){
+                arr[k].content.push({})
+            }
+        }
+        lay('.startAndEndDay').each(function(i, e){
+            laydate.render({
+                elem: this
+                ,type: 'datetime'
+                ,range: true
+                ,done: function(value, date, endDate){
+                    let index = $('#classHours').find('button[checked]').attr('index');
+                    let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+                    let ii = $(e).parent('div').parent('div').parent('div').parent('div').attr('index');
+                    for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+                        if(type == obj.coursePackageDiscount[i].type){
+                            let jsonArray = obj.coursePackageDiscount[i].content;
+                            for (let j = 0; j < jsonArray.length; j++) {
+                                if(j == ii){
+                                    let arr = value.split(" - ");
+                                    obj.coursePackageDiscount[i].content[j]['startDate'] = arr[0];
+                                    obj.coursePackageDiscount[i].content[j]['endDate'] = arr[1];
+                                }
+                            }
+                        }
+                    }
+                }
+            });
+        });
+        lay('.time').each(function(i, e){
+            laydate.render({
+                elem: this
+                ,type: 'time'
+                ,range: true
+                ,done: function(value, date, endDate){
+                    let index = $('#classHours').find('button[checked]').attr('index');
+                    let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+                    let ii = $(e).parent('div').parent('div').parent('div').parent('div').attr('index');
+                    for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+                        if(type == obj.coursePackageDiscount[i].type){
+                            let jsonArray = obj.coursePackageDiscount[i].content;
+                            for (let j = 0; j < jsonArray.length; j++) {
+                                if(j == ii){
+                                    let arr = value.split(" - ");
+                                    obj.coursePackageDiscount[i].content[j]['startTime'] = arr[0];
+                                    obj.coursePackageDiscount[i].content[j]['endTime'] = arr[1];
+                                }
+                            }
+                        }
+                    }
+                }
+            });
+        });
+    }
+}
+
+
+function removePrice(type, e){
+    let index = $('#classHours').find('button[checked]').attr('index');
+    let object = $(e).parent('div').parent('div').parent('div').parent('div');
+    let ii = object.attr('index');
+    let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+    for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+        if(type == obj.coursePackageDiscount[i].type){
+            let jsonArray = null;
+            if(typeof obj.coursePackageDiscount[i].content == "string"){
+                jsonArray = JSON.parse(obj.coursePackageDiscount[i].content);
+            }else{
+                jsonArray = obj.coursePackageDiscount[i].content;
+            }
+
+            let arr = [];
+            for (let j = 0; j < jsonArray.length; j++) {
+                if(j == ii){
+                    continue
+                }
+                arr.push(jsonArray[j]);
+            }
+            CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount[i].content = arr;
+        }
+    }
+    object.remove();
+}
+
+
+function addPriceValue(type, e, name){
+    let index = $('#classHours').find('button[checked]').attr('index');
+    if(type == 1){
+        let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+        for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+            if(type == obj.coursePackageDiscount[i].type){
+                let content = null;
+                if(typeof obj.coursePackageDiscount[i].content == "string"){
+                    content = JSON.parse(obj.coursePackageDiscount[i].content);
+                }else{
+                    content = obj.coursePackageDiscount[i].content;
+                }
+                content[name] = parseFloat($(e).val());
+                CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount[i].content = content;
+            }
+        }
+    }
+    if(type == 2){
+        let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+        for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+            if(type == obj.coursePackageDiscount[i].type){
+                let content = null;
+                if(typeof obj.coursePackageDiscount[i].content == "string"){
+                    content = JSON.parse(obj.coursePackageDiscount[i].content);
+                }else{
+                    content = obj.coursePackageDiscount[i].content;
+                }
+                content[name] = parseFloat($(e).val());
+                CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount[i].content = content;
+            }
+        }
+    }
+    if(type == 3){
+        let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+        let ii = $(e).parent('div').parent('div').parent('div').parent('div').attr('index');
+        for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+            if(type == obj.coursePackageDiscount[i].type){
+                let jsonArray = null;
+                if(typeof obj.coursePackageDiscount[i].content == "string"){
+                    jsonArray = JSON.parse(obj.coursePackageDiscount[i].content);
+                }else{
+                    jsonArray = obj.coursePackageDiscount[i].content;
+                }
+
+                for (let j = 0; j < jsonArray.length; j++) {
+                    if(j == ii){
+                        if('weeks' == name){
+                            let weeks = jsonArray[j].weeks;
+                            let v = parseInt($(e).val());
+                            if(null != weeks && typeof weeks != "undefined"){
+                                if(e.checked){
+                                    weeks.push(v);
+                                }else{
+                                    let arr = [];
+                                    for (let k = 0; k < weeks.length; k++) {
+                                        if(weeks[k] == v){
+                                            continue
+                                        }
+                                        arr.push(weeks[k]);
+                                    }
+                                    weeks = arr;
+                                }
+                            }else{
+                                weeks = [v];
+                            }
+                            jsonArray[j].weeks = weeks;
+                        }else{
+                            jsonArray[j][name] = parseFloat($(e).val());
+                        }
+                    }
+                }
+                CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount[i].content = jsonArray;
+            }
+        }
+    }
+    if(type == 4){
+        let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+        let ii = $(e).parent('div').parent('div').parent('div').parent('div').attr('index');
+        for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+            if(type == obj.coursePackageDiscount[i].type){
+                let jsonArray = null;
+                if(typeof obj.coursePackageDiscount[i].content == "string"){
+                    jsonArray = JSON.parse(obj.coursePackageDiscount[i].content);
+                }else{
+                    jsonArray = obj.coursePackageDiscount[i].content;
+                }
+                for (let j = 0; j < jsonArray.length; j++) {
+                    if(j == ii){
+                        if('weeks' == name){
+                            let weeks = jsonArray[j].weeks;
+                            let v = parseInt($(e).val());
+                            if(null != weeks && typeof weeks != "undefined"){
+                                if(e.checked){
+                                    weeks.push(v);
+                                }else{
+                                    let arr = [];
+                                    for (let k = 0; k < weeks.length; k++) {
+                                        if(weeks[k] == v){
+                                            continue
+                                        }
+                                        arr.push(weeks[k]);
+                                    }
+                                    weeks = arr;
+                                }
+                            }else{
+                                weeks = [v];
+                            }
+                            jsonArray[j].weeks = weeks;
+                        }else{
+                            jsonArray[j][name] = parseFloat($(e).val());
+                        }
+                    }
+                }
+                CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount[i].content = jsonArray;
+            }
+        }
+    }
+}
+
+
+function selectedPperiod(e){
+    $('#classHours').find('button[checked]').attr('style', 'width: 60px;height: 30px;border: none;border-radius: 5px;');
+    $('#classHours').find('button[checked]').removeAttr('checked');
+    if(typeof e != "undefined"){
+        $(e).attr('style', 'width: 60px;height: 30px;background-color: #0086F6;border: none;border-radius: 5px;color: white;');
+        $(e).attr('checked', true);
+    }else{
+        $($('#classHours').find('button')[0]).attr('style', 'width: 60px;height: 30px;background-color: #0086F6;border: none;border-radius: 5px;color: white;');
+        $($('#classHours').find('button')[0]).attr('checked', true);
+    }
+
+    let index = $('#classHours').find('button[checked]').attr('index');
+    let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+    $('#payment').text(obj.payment);
+    $('#cashPayment').text(obj.cashPayment);
+
+    $('#memberDiscount').html('');
+    $('#renewalOffer').html('');
+    $('#limitedTimeDiscount').html('');
+    $('#complimentaryClass').html('');
+    let objv = CoursePackageDiscount.coursePackagePaymentConfig[index];
+    $('input[name="type"]').each(function (i, e) {
+        e.checked = false;
+        let v = $(e).val();
+        for (let i = 0; i < objv.coursePackageDiscount.length; i++) {
+            if(v == objv.coursePackageDiscount[i].type){
+                $(e).click();
+            }
+        }
+    })
+}
+
+
+
+
+$(function () {
+    CoursePackageDiscount.coursePackagePaymentConfig = JSON.parse($('#coursePackagePaymentConfig').val());
+    let htmlStr = '';
+    for (let i = 0; i < CoursePackageDiscount.coursePackagePaymentConfig.length; i++) {
+        let obj = CoursePackageDiscount.coursePackagePaymentConfig[i];
+        if(i == 0){
+            htmlStr += '<button checked onclick="selectedPperiod(this)" index="' + i + '" style="width: 60px;height: 30px;background-color: #0086F6;border: none;border-radius: 5px;color: white;">' + obj.classHours + '课时</button>&nbsp;&nbsp;&nbsp;&nbsp;';
+        }else{
+            htmlStr += '<button onclick="selectedPperiod(this)" index="' + i + '" style="width: 60px;height: 30px;border: none;border-radius: 5px;">' + obj.classHours + '课时</button>&nbsp;&nbsp;&nbsp;&nbsp;';
+        }
+    }
+    $('#classHours').html(htmlStr);
+
+    $('input[name="type"]').click(function () {
+        let v = $(this).val();
+        let index = $('#classHours').find('button[checked]').attr('index');
+        if(this.checked && v == '1'){
+            let discountMember = true;
+            let hh = '<div class="hr-line-dashed"></div>' +
+                '<h3>会员折扣</h3>\n' +
+                '                <div class="form-group">\n' +
+                '                   <div class="col-sm-2"></div>'+
+                '                   <div class="col-sm-10">' +
+                '                       <label class="col-sm-2 control-label">*现金支付:</label>\n' +
+                '                       <div class="col-sm-3">\n' +
+                '                           <input type="number" min="0" value="';
+            let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+            for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+                if(v == obj.coursePackageDiscount[i].type){
+                    let jsonObject = null;
+                    if(typeof obj.coursePackageDiscount[i].content == "string"){
+                        jsonObject = JSON.parse(obj.coursePackageDiscount[i].content);
+                    }else{
+                        jsonObject = obj.coursePackageDiscount[i].content;
+                    }
+                    hh += (null == jsonObject.discountMember ? '' : jsonObject.discountMember);
+                    discountMember = false;
+                }
+            }
+            hh += '" placeholder="请输入会员支付价格" onblur="addPriceValue(1, this, \'discountMember\')" style="width: 180px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/> ¥\n' +
+                '                       </div>\n' +
+                '                   </div>'+
+                '                </div>';
+
+            $('#memberDiscount').html(hh);
+            if(discountMember){
+                CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount.push({
+                    type: 1,
+                    content:{
+                        discountMember: null
+                    }
+                });
+            }
+        }else if(!this.checked && v == '1'){
+            $('#memberDiscount').html('');
+            let datas = CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount;
+            let arra = [];
+            for (let i = 0; i < datas.length; i++){
+                if(datas[i].type == v){
+                    continue;
+                }
+                arra.push(datas[i]);
+            }
+            CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount = arra;
+        }
+        if(this.checked && v == '2'){
+            let continuingMember = true;
+            let hh = '<div class="hr-line-dashed"></div>' +
+                '<h3>续课优惠</h3>\n' +
+                '                <div class="form-group">\n' +
+                '                   <div class="col-sm-2"></div>'+
+                '                   <div class="col-sm-10">' +
+                '                       <label class="col-sm-2 control-label">会员续课:</label>\n' +
+                '                       <div class="col-sm-3">\n' +
+                '                       </div>\n' +
+                '                       <label class="col-sm-2 control-label">用户续课:</label>\n' +
+                '                       <div class="col-sm-3">\n' +
+                '                       </div>\n' +
+                '                   </div>'+
+                '                </div>' +
+                '                <div class="form-group">\n' +
+                '                   <div class="col-sm-2"></div>'+
+                '                   <div class="col-sm-10">' +
+                '                       <label class="col-sm-2 control-label">*现金支付:</label>\n' +
+                '                       <div class="col-sm-3">\n' +
+                '                           <input type="number" min="0" value="';
+            let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+            for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+                if(v == obj.coursePackageDiscount[i].type){
+                    let jsonObject = null;
+                    if(typeof obj.coursePackageDiscount[i].content == "string"){
+                        jsonObject = JSON.parse(obj.coursePackageDiscount[i].content);
+                    }else{
+                        jsonObject = obj.coursePackageDiscount[i].content;
+                    }
+                    hh += (null == jsonObject.continuingMember ? '' : jsonObject.continuingMember);
+                    continuingMember = false;
+                }
+            }
+            hh += '" placeholder="请输入会员支付价格" onblur="addPriceValue(2, this, \'continuingMember\')" style="width: 180px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/> ¥\n' +
+                '                       </div>\n' +
+                '                       <label class="col-sm-2 control-label">*现金支付:</label>\n' +
+                '                       <div class="col-sm-3">\n' +
+                '                           <input type="number" min="0" value="';
+            let obje = CoursePackageDiscount.coursePackagePaymentConfig[index];
+            for (let i = 0; i < obje.coursePackageDiscount.length; i++) {
+                if(v == obje.coursePackageDiscount[i].type){
+                    let jsonObject = null;
+                    if(typeof obje.coursePackageDiscount[i].content == "string"){
+                        jsonObject = JSON.parse(obje.coursePackageDiscount[i].content);
+                    }else{
+                        jsonObject = obje.coursePackageDiscount[i].content;
+                    }
+                    hh += (null == jsonObject.continuingUser ? '' : jsonObject.continuingUser);
+                }
+            }
+            hh += '" placeholder="请输入用户支付价格" onblur="addPriceValue(2, this, \'continuingUser\')" style="width: 180px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/> ¥\n' +
+                '                       </div>\n' +
+                '                   </div>'+
+                '                </div>';
+            $('#renewalOffer').html(hh);
+            if(continuingMember){
+                CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount.push({
+                    type: 2,
+                    content: {
+                        continuingMember: null,
+                        continuingUser: null
+                    }
+                })
+            }
+        }else if(!this.checked && v == '2'){
+            $('#renewalOffer').html('');
+            let datas = CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount;
+            let arra = [];
+            for (let i = 0; i < datas.length; i++){
+                if(datas[i].type == v){
+                    continue;
+                }
+                arra.push(datas[i]);
+            }
+            CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount = arra;
+        }
+        if(this.checked && v == '3'){
+            let data_value = true;
+            let hh = '<div class="hr-line-dashed"></div>' +
+                '<span style="font-size: 16px;font-weight: 500;">限时折扣</span>&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa fa-plus-circle" style="font-size:24px" onclick="addPrice(3)"></i>\n';
+            let obje = CoursePackageDiscount.coursePackagePaymentConfig[index];
+            for (let i = 0; i < obje.coursePackageDiscount.length; i++) {
+                if(v == obje.coursePackageDiscount[i].type){
+                    data_value = false
+                    let jsonArray = null;
+                    if(typeof obje.coursePackageDiscount[i].content == "string"){
+                        jsonArray = JSON.parse(obje.coursePackageDiscount[i].content);
+                    }else{
+                        jsonArray = obje.coursePackageDiscount[i].content;
+                    }
+
+                    for (let j = 0; j < jsonArray.length; j++) {
+                        hh += '' +
+                            '   <div class="form-group limitedTimeDiscount" index="' + j + '">' +
+                            '           <div class="col-sm-2"></div>\n' +
+                            '           <div class="col-sm-8" style="border: 1px solid; padding: 20px;">\n' +
+                            '                <div class="form-group">\n' +
+                            '                    <label class="col-sm-2 control-label">折扣有效期:</label>\n' +
+                            '                    <div class="col-sm-9">\n' +
+                            '                         <input class="startAndEndDay" value="' + (jsonArray[j].startDate + " - " + jsonArray[j].endDate) + '" style="width: 300px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/>' +
+                            '                    </div>\n' +
+                            '                    <div class="col-sm-1"><i class="fa fa-trash-o" style="font-size:24px;color: red;" onclick="removePrice(3, this)"></i></div>\n' +
+                            '                </div>' +
+                            '                <div class="form-group">\n' +
+                            '                    <label class="col-sm-2 control-label">*折扣时间:</label>\n' +
+                            '                    <div class="col-sm-5">\n' +
+                            '                        <input class="time" value="' + jsonArray[j].startTime + " - " + jsonArray[j].endTime + '" style="width: 200px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/>\n' +
+                            '                    </div>\n' +
+                            '                </div>' +
+                            '                <div class="form-group">\n' +
+                            '                    <label class="col-sm-2 control-label"></label>\n' +
+                            '                    <div class="col-sm-8" style="margin-top: 6px;">\n' +
+                            '                        <input type="checkbox" name="week" value="1"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 1){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周一&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="2"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 2){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周二&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="3"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 3){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周三&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="4"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 4){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周四&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="5"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 5){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周五&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="6"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 6){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周六&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="7"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 7){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周日&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                    </div>\n' +
+                            '                </div>' +
+                            '                <div class="form-group">\n' +
+                            '                    <label class="col-sm-2 control-label">*现金支付:</label>\n' +
+                            '                    <div class="col-sm-4">\n' +
+                            '                        <input type="number" min="0" value="' + jsonArray[j].cashPayment + '" onblur="addPriceValue(3, this, \'cashPayment\')" placeholder="请输入折扣后支付价格" style="width: 180px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/> ¥\n' +
+                            '                    </div>\n' +
+                            '                </div>' +
+                            '           </div>' +
+                            '   </div>';
+                    }
+
+                }
+            }
+            $('#limitedTimeDiscount').html(hh);
+            if(data_value){
+                CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount.push({
+                    type: 3,
+                    content: []
+                })
+            }
+        }else if(!this.checked && v == '3'){
+            $('#limitedTimeDiscount').html('');
+            let datas = CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount;
+            let arra = [];
+            for (let i = 0; i < datas.length; i++){
+                if(datas[i].type == v){
+                    continue;
+                }
+                arra.push(datas[i]);
+            }
+            CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount = arra;
+        }
+        if(this.checked && v == '4'){
+            let data_value = true;
+            let hh =
+                '<div class="hr-line-dashed"></div>' +
+                '<span style="font-size: 16px;font-weight: 500;">赠送课时</span>&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa fa-plus-circle" style="font-size:24px" onclick="addPrice(4)"></i>\n';
+            let obje = CoursePackageDiscount.coursePackagePaymentConfig[index];
+            for (let i = 0; i < obje.coursePackageDiscount.length; i++) {
+                if (v == obje.coursePackageDiscount[i].type) {
+                    data_value = false;
+                    let jsonArray = null;
+                    if(typeof obje.coursePackageDiscount[i].content == "string"){
+                        jsonArray = JSON.parse(obje.coursePackageDiscount[i].content);
+                    }else{
+                        jsonArray = obje.coursePackageDiscount[i].content;
+                    }
+                    for (let j = 0; j < jsonArray.length; j++) {
+                        hh +=
+                            '   <div class="form-group complimentaryClass" index="' + j + '">' +
+                            '           <div class="col-sm-2"></div>\n' +
+                            '           <div class="col-sm-8" style="border: 1px solid; padding: 20px;">\n' +
+                            '                <div class="form-group">\n' +
+                            '                    <label class="col-sm-2 control-label">*赠送有效期:</label>\n' +
+                            '                    <div class="col-sm-9">\n' +
+                            '                         <input class="startAndEndDay" value="' + (jsonArray[j].startDate + " - " + jsonArray[j].endDate) + '" style="width: 300px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/>' +
+                            '                    </div>\n' +
+                            '                    <div class="col-sm-1"><i class="fa fa-trash-o" style="font-size:24px;color: red;" onclick="removePrice(4, this)"></i></div>\n' +
+                            '                </div>' +
+                            '                <div class="form-group">\n' +
+                            '                    <label class="col-sm-2 control-label">*赠送时间:</label>\n' +
+                            '                    <div class="col-sm-5">\n' +
+                            '                        <input class="time" value="' + jsonArray[j].startTime + " - " + jsonArray[j].endTime + '" style="width: 200px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/>\n' +
+                            '                    </div>\n' +
+                            '                </div>' +
+                            '                <div class="form-group">\n' +
+                            '                    <label class="col-sm-2 control-label"></label>\n' +
+                            '                    <div class="col-sm-8" style="margin-top: 6px;">\n' +
+                            '                        <input type="checkbox" name="week" value="1"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 1){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周一&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="2"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 2){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周二&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="3"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 3){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周三&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="4"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 4){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周四&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="5"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 5){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周五&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="6"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 6){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周六&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="7"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 7){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周日&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                    </div>\n' +
+                            '                </div>' +
+                            '                <div class="form-group">\n' +
+                            '                    <label class="col-sm-2 control-label">*赠送课时数:</label>\n' +
+                            '                    <div class="col-sm-4">\n' +
+                            '                        <input type="number" value="' + jsonArray[j].hour + '" onblur="addPriceValue(4, this, \'hour\')" min="0" placeholder="请输入赠送课时数" style="width: 180px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/> ¥\n' +
+                            '                    </div>\n' +
+                            '                </div>' +
+                            '           </div>' +
+                            '   </div>';
+                    }
+                }
+            }
+            $('#complimentaryClass').html(hh);
+            if(data_value){
+                CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount.push({
+                    type: 4,
+                    content: []
+                })
+            }
+        }else if(!this.checked && v == '4'){
+            $('#complimentaryClass').html('');
+            let datas = CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount;
+            let arra = [];
+            for (let i = 0; i < datas.length; i++){
+                if(datas[i].type == v){
+                    continue;
+                }
+                arra.push(datas[i]);
+            }
+            CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount = arra;
+        }
+    })
+
+
+    selectedPperiod();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackageStudent.js b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackageStudent.js
new file mode 100644
index 0000000..6cb31aa
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackageStudent.js
@@ -0,0 +1,159 @@
+/**
+ * 系统管理--用户管理的单例对象
+ */
+let CoursePackageStudent = {
+    id: "managerTable",//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+
+/**
+ * 初始化表格的列
+ */
+CoursePackageStudent.initColumn = function () {
+    let columns = [
+        {field: 'selectItem', radio: true},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '所属用户', field: 'userName', align: 'center', valign: 'middle'},
+        {title: '姓名', field: 'studentName', align: 'center', valign: 'middle'},
+        {title: '联系电话', field: 'phone', align: 'center', valign: 'middle'},
+        {title: '年龄', field: 'age', align: 'center', valign: 'middle'},
+        {title: '性别', field: 'sex', align: 'center', valign: 'middle',
+            formatter: function (v) {
+                if(v == 1){
+                    return '男';
+                }else{
+                    return '女';
+                }
+            }
+        },
+        {title: '到课状态', field: 'signInOrNot', align: 'center', valign: 'middle',
+            formatter: function (v) {
+                switch (v) {
+                    case 0:
+                        return '未到';
+                    case 1:
+                        return '已到';
+                }
+            }
+        },
+        {title: '预定状态', field: 'reservationStatus', align: 'center', valign: 'middle',
+            formatter: function (v) {
+                if(v == 0){
+                    return '已取消';
+                }else{
+                    return '正常';
+                }
+            }
+        },
+    ];
+    return columns;
+};
+
+/**
+ * 检查是否选中
+ */
+CoursePackageStudent.check = function () {
+    let selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    } else {
+        CoursePackageStudent.seItem = selected[0];
+        return true;
+    }
+};
+
+
+
+
+/**
+ * 取消预约
+ */
+CoursePackageStudent.cancelReservation = function () {
+    if (this.check()) {
+        if(CoursePackageStudent.seItem.reservationStatus == 0){
+            Feng.error("不能重复操作");
+            return
+        }
+        if(CoursePackageStudent.seItem.signInOrNot == 1){
+            Feng.error("不能取消预约操作");
+            return
+        }
+        let operation = function(){
+            let ajax = new $ax(Feng.ctxPath + "/coursePackage/cancelReservation", function (res) {
+                if(res.code == 200){
+                    Feng.success("取消成功!");
+                    CoursePackageStudent.table.refresh();
+                }else{
+                    Feng.error(res.msg);
+                }
+            }, function (data) {
+                Feng.error("取消失败!" + data.responseJSON.message + "!");
+            });
+            ajax.set("id", CoursePackageStudent.seItem.id);
+            ajax.start();
+        };
+        Feng.confirm("是否取消预约",operation);
+    }
+};
+
+
+CoursePackageStudent.absence = function () {
+    if (this.check()) {
+        if(CoursePackageStudent.seItem.signInOrNot == 0){
+            Feng.error("不能重复操作");
+            return
+        }
+        if(CoursePackageStudent.seItem.reservationStatus == 0){
+            Feng.error("该数据已取消预约");
+            return
+        }
+        let operation = function(){
+            let ajax = new $ax(Feng.ctxPath + "/coursePackage/setAbsenceStatus", function (res) {
+                if(res.code == 200){
+                    Feng.success("修改成功!");
+                    CoursePackageStudent.table.refresh();
+                }else{
+                    Feng.error(res.msg);
+                }
+            }, function (data) {
+                Feng.error("修改失败!" + data.responseJSON.message + "!");
+            });
+            ajax.set("id", CoursePackageStudent.seItem.id);
+            ajax.start();
+        };
+        Feng.confirm("是否标注未到",operation);
+    }
+};
+
+
+
+
+CoursePackageStudent.resetSearch = function () {
+    $('#userName').val('');
+    $('#studentName').val('');
+    CoursePackageStudent.search();
+}
+
+CoursePackageStudent.search = function () {
+    let queryData = {};
+    queryData['id'] = $('#id').val();
+    queryData['userName'] = $('#userName').val();
+    queryData['studentName'] = $('#studentName').val();
+    CoursePackageStudent.table.refresh({query: queryData});
+}
+
+
+$(function () {
+    let defaultColunms = CoursePackageStudent.initColumn();
+    let table = new BSTable(CoursePackageStudent.id, "/coursePackage/queryCoursePackageStudentList", defaultColunms);
+    // 设置物理分页server(逻辑分页client)
+    table.setPaginationType("server");
+    table.setQueryParams({
+        id: $('#id').val()
+    })
+    CoursePackageStudent.table = table.init();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackage_info.js b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackage_info.js
new file mode 100644
index 0000000..23da9f0
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/coursePackage_info.js
@@ -0,0 +1,430 @@
+/**
+ * 用户详情对话框(可用于添加和修改对话框)
+ */
+var CoursePackageInfo = {
+    userInfoData: {},
+};
+
+
+
+/**
+ * 关闭此对话框
+ */
+CoursePackageInfo.close = function () {
+    parent.layer.close(window.parent.CoursePackage.layerIndex);
+};
+
+
+/**
+ * 提交添加用户
+ */
+CoursePackageInfo.addSubmit = function () {
+    let province = $('#provinceCode option:checked').text();
+    let provinceCode = $('#provinceCode').val();
+    let city = $('#cityCode option:checked').text();
+    let cityCode = $('#cityCode').val();
+    let storeId = $('#storeId').val();
+    let coursePackageTypeId = $('#coursePackageTypeId').val();
+    let name = $('#name').val();
+    let siteId = $('#siteId').val();
+    let coachId = $('#coachId').val();
+    let maxSubscribeNumber = $('#maxSubscribeNumber').val();
+    let classStartTime = $('#classStartTime').val();
+    let classWeeks = '';
+    $('input[name="classWeeks"]:checked').each(function (index, e) {
+        classWeeks += $(e).val() + ";";
+    })
+    let coverDrawing = $('#coverDrawing').val();
+    let detailDrawing = $('#detailDrawing').val();
+    let introduceDrawing = $('#introduceDrawing').val();
+    let sort = $('#sort').val();
+    let validDays = $('#validDays').val();
+    let price = [];
+    $('#price>.form-group').each(function (i, e) {
+        let classHours = $($(e).find(".classNumber_span input[class='classNumber']")[0]).val();
+        let cash = $($(e).find(".cash_span input[class='cash']")[0]).val();
+        let paiCoin = $($(e).find(".paiCoin_span input[class='paiCoin']")[0]).val();
+        price.push({
+            classHours: classHours,
+            cashPayment: typeof cash == "undefined" ? 0 : cash,
+            playPaiCoin: typeof paiCoin == "undefined" ? 0 : paiCoin
+        })
+    });
+    if(null == provinceCode || '' == provinceCode){
+        Feng.error("所在省不能为空");
+        return
+    }
+    if(null == cityCode || '' == cityCode){
+        Feng.error("所在市不能为空");
+        return
+    }
+    if(null == storeId || '' == storeId){
+        Feng.error("所属门店不能为空");
+        return
+    }
+    if(null == coursePackageTypeId || '' == coursePackageTypeId){
+        Feng.error("课程类型不能为空");
+        return
+    }
+    if(null == name || '' == name){
+        Feng.error("课包名称不能为空");
+        return
+    }
+    if(null == siteId || '' == siteId){
+        Feng.error("上课场地不能为空");
+        return
+    }
+    if(null == coachId || '' == coachId){
+        Feng.error("授课教师不能为空");
+        return
+    }
+    if(null == maxSubscribeNumber || '' == maxSubscribeNumber){
+        Feng.error("最多预约人数不能为空");
+        return
+    }
+    if(null == classStartTime || '' == classStartTime){
+        Feng.error("上课时间不能为空");
+        return
+    }
+    if(null == classWeeks || '' == classWeeks){
+        Feng.error("上课时间不能为空");
+        return
+    }
+    classWeeks = classWeeks.substring(0, classWeeks.length - 1);
+
+    if(null == coverDrawing || '' == coverDrawing){
+        Feng.error("课包封面不能为空");
+        return
+    }
+    if(null == detailDrawing || '' == detailDrawing){
+        Feng.error("详情页不能为空");
+        return
+    }
+    if(null == introduceDrawing || '' == introduceDrawing){
+        Feng.error("课包介绍不能为空");
+        return
+    }
+    if(null == validDays || '' == validDays){
+        Feng.error("课时有效期不能为空");
+        return
+    }
+
+    let obj = {
+        province: province,
+        provinceCode: provinceCode,
+        city: city,
+        cityCode: cityCode,
+        storeId: storeId,
+        coursePackageTypeId: coursePackageTypeId,
+        name: name,
+        siteId: siteId,
+        coachId: coachId,
+        maxSubscribeNumber: maxSubscribeNumber,
+        classStartTime: classStartTime.split(" - ")[0],
+        classEndTime: classStartTime.split(" - ")[1],
+        classWeeks: classWeeks,
+        coverDrawing: coverDrawing,
+        detailDrawing: detailDrawing,
+        introduceDrawing: introduceDrawing,
+        sort: sort,
+        validDays: validDays,
+        coursePackagePaymentConfig: JSON.stringify(price)
+    }
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/coursePackage/addCoursePackage", function (data) {
+        if(data.code == 200){
+            Feng.success("添加成功!");
+            CoursePackageInfo.close();
+            window.parent.CoursePackage.table.refresh();
+        }else{
+            Feng.error(data.msg);
+        }
+    }, function (data) {
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(obj);
+    ajax.start();
+};
+
+/**
+ * 提交修改
+ */
+CoursePackageInfo.editSubmit = function () {
+    let id = $('#id').val();
+    let province = $('#provinceCode option:checked').text();
+    let provinceCode = $('#provinceCode').val();
+    let city = $('#cityCode option:checked').text();
+    let cityCode = $('#cityCode').val();
+    let storeId = $('#storeId').val();
+    let coursePackageTypeId = $('#coursePackageTypeId').val();
+    let name = $('#name').val();
+    let siteId = $('#siteId').val();
+    let coachId = $('#coachId').val();
+    let maxSubscribeNumber = $('#maxSubscribeNumber').val();
+    let classStartTime = $('#classStartTime').val();
+    let classWeeks = '';
+    $('input[name="classWeeks"]:checked').each(function (index, e) {
+        classWeeks += $(e).val() + ";";
+    })
+    let coverDrawing = $('#coverDrawing').val();
+    let detailDrawing = $('#detailDrawing').val();
+    let introduceDrawing = $('#introduceDrawing').val();
+    let sort = $('#sort').val();
+    let validDays = $('#validDays').val();
+    let price = [];
+    $('#price>.form-group').each(function (i, e) {
+        let classHours = $($(e).find(".classNumber_span input[class='classNumber']")[0]).val();
+        let cash = $($(e).find(".cash_span input[class='cash']")[0]).val();
+        let paiCoin = $($(e).find(".paiCoin_span input[class='paiCoin']")[0]).val();
+        price.push({
+            classHours: classHours,
+            cashPayment: typeof cash == "undefined" ? 0 : cash,
+            playPaiCoin: typeof paiCoin == "undefined" ? 0 : paiCoin
+        })
+    });
+    if(null == provinceCode || '' == provinceCode){
+        Feng.error("所在省不能为空");
+        return
+    }
+    if(null == cityCode || '' == cityCode){
+        Feng.error("所在市不能为空");
+        return
+    }
+    if(null == storeId || '' == storeId){
+        Feng.error("所属门店不能为空");
+        return
+    }
+    if(null == coursePackageTypeId || '' == coursePackageTypeId){
+        Feng.error("课程类型不能为空");
+        return
+    }
+    if(null == name || '' == name){
+        Feng.error("课包名称不能为空");
+        return
+    }
+    if(null == siteId || '' == siteId){
+        Feng.error("上课场地不能为空");
+        return
+    }
+    if(null == coachId || '' == coachId){
+        Feng.error("授课教师不能为空");
+        return
+    }
+    if(null == maxSubscribeNumber || '' == maxSubscribeNumber){
+        Feng.error("最多预约人数不能为空");
+        return
+    }
+    if(null == classStartTime || '' == classStartTime){
+        Feng.error("上课时间不能为空");
+        return
+    }
+    if(null == classWeeks || '' == classWeeks){
+        Feng.error("上课时间不能为空");
+        return
+    }
+    classWeeks = classWeeks.substring(0, classWeeks.length - 1);
+
+    if(null == coverDrawing || '' == coverDrawing){
+        Feng.error("课包封面不能为空");
+        return
+    }
+    if(null == detailDrawing || '' == detailDrawing){
+        Feng.error("详情页不能为空");
+        return
+    }
+    if(null == introduceDrawing || '' == introduceDrawing){
+        Feng.error("课包介绍不能为空");
+        return
+    }
+    if(null == validDays || '' == validDays){
+        Feng.error("课时有效期不能为空");
+        return
+    }
+
+    let obj = {
+        id: id,
+        province: province,
+        provinceCode: provinceCode,
+        city: city,
+        cityCode: cityCode,
+        storeId: storeId,
+        coursePackageTypeId: coursePackageTypeId,
+        name: name,
+        siteId: siteId,
+        coachId: coachId,
+        maxSubscribeNumber: maxSubscribeNumber,
+        classStartTime: classStartTime.split(" - ")[0],
+        classEndTime: classStartTime.split(" - ")[1],
+        classWeeks: classWeeks,
+        coverDrawing: coverDrawing,
+        detailDrawing: detailDrawing,
+        introduceDrawing: introduceDrawing,
+        sort: sort,
+        validDays: validDays,
+        coursePackagePaymentConfig: JSON.stringify(price)
+    }
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/coursePackage/updateCoursePackage", function (data) {
+        if(data.code == 200){
+            Feng.success("编辑成功!");
+            CoursePackageInfo.close();
+            window.parent.CoursePackage.table.refresh();
+        }else{
+            Feng.error(data.msg);
+        }
+    }, function (data) {
+        Feng.error("编辑失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(obj);
+    ajax.start();
+};
+
+
+
+
+function queryStore() {
+    let ajax = new $ax(Feng.ctxPath + "/coursePackage/queryStore", function (data) {
+        let htmlStr = '';
+        for (let i = 0; i < data.length; i++) {
+            htmlStr += '<option value="' + data[i].id + '">' + data[i].name + '</option>'
+        }
+        $('#storeId').html(htmlStr);
+
+        querySite();
+    }, function (data) {
+        Feng.error("获取失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("cityCode", $('#cityCode').val());
+    ajax.start();
+}
+
+
+
+function querySite(){
+    let ajax = new $ax(Feng.ctxPath + "/coursePackage/querySite", function (data) {
+        let htmlStr = '';
+        for (let i = 0; i < data.length; i++) {
+            htmlStr += '<option value="' + data[i].id + '">' + data[i].name + '</option>'
+        }
+        $('#siteId').html(htmlStr);
+    }, function (data) {
+        Feng.error("获取失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("storeId", $('#storeId').val());
+    ajax.start();
+}
+
+
+function queryCoach(){
+    let ajax = new $ax(Feng.ctxPath + "/coursePackage/queryCoach", function (data) {
+        let htmlStr = '';
+        for (let i = 0; i < data.length; i++) {
+            htmlStr += '<option value="' + data[i].id + '">' + data[i].name + '</option>'
+        }
+        $('#coachId').html(htmlStr);
+    }, function (data) {
+        Feng.error("获取失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("cityCode", $('#cityCode').val());
+    ajax.start();
+}
+
+
+function addPrice(){
+    let cash = false;
+    let paiCoin = false;
+    $('input[name="payType"]:checked').each(function (index, e) {
+        let v = $(e).val();
+        if(v == 1){
+            cash = true;
+        }
+        if(v == 2){
+            paiCoin = true;
+        }
+    })
+
+    let htmlStr = '' +
+        '<div class="form-group">\n' +
+        '                        <label class="col-sm-3 control-label">*课时数:</label>\n' +
+        '                        <div class="col-sm-8">\n' +
+        '                            <span class="classNumber_span"><input class="classNumber" type="number" min="0" placeholder="请输入" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;">&nbsp;&nbsp;&nbsp;&nbsp;</span> <span class="cash_span">\n';
+        if(cash){
+            htmlStr += '现金支付:<input class="cash" type="number" min="0" placeholder="请输入金额" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"> ¥&nbsp;&nbsp;&nbsp;&nbsp;\n';
+        }
+        htmlStr += '</span> <span class="paiCoin_span">';
+        if(paiCoin){
+            htmlStr += '玩湃币支付:<input class="paiCoin" type="number" min="0" placeholder="请输入金额" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"> 币&nbsp;&nbsp;&nbsp;&nbsp;\n';
+        }
+        htmlStr += '</span> <i class="fa fa-trash-o" style="font-size:24px" onclick="removePrice(this)"></i>\n' +
+        '</div>\n' +
+        '</div>';
+    $('#price').append(htmlStr);
+}
+
+
+function removePrice(e){
+    $(e).parent('div').parent('div').remove();
+}
+
+
+$(function () {
+    $('#provinceCode').change(function () {
+        let ajax = new $ax(Feng.ctxPath + "/coursePackage/queryCity", function (data) {
+            let htmlStr = '';
+            for (let i = 0; i < data.length; i++) {
+                htmlStr += '<option value="' + data[i].code + '">' + data[i].name + '</option>'
+            }
+            $('#cityCode').html(htmlStr);
+
+            queryStore();
+            queryCoach();
+        }, function (data) {
+            Feng.error("获取失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("code", $(this).val());
+        ajax.start();
+    })
+
+
+    $('#cityCode').change(function () {
+        queryStore();
+    })
+
+
+    $('#storeId').change(function () {
+        querySite();
+    })
+
+    $('input[name="payType"]').click(function () {
+        $('input[name="payType"]').each(function (index, e) {
+            let v = $(e).val();
+            if(v == 1) {
+                if (e.checked) {
+                    $('span[class="cash_span"]').each(function (index, e) {
+                        $(e).html('现金支付:<input class="cash" type="number" min="0" placeholder="请输入金额" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"> ¥&nbsp;&nbsp;&nbsp;&nbsp;');
+                    })
+                } else {
+                    $('span[class="cash_span"]').each(function (index, e) {
+                        $(e).html('');
+                    })
+                }
+            }
+
+            if(v == 2){
+                if (e.checked) {
+                    $('span[class="paiCoin_span"]').each(function (index, e) {
+                        $(e).html('玩湃币支付:<input class="paiCoin" type="number" min="0" placeholder="请输入金额" style="width: 110px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"> 币&nbsp;&nbsp;&nbsp;&nbsp;')
+                    })
+                } else {
+                    $('span[class="paiCoin_span"]').each(function (index, e) {
+                        $(e).html('');
+                    })
+                }
+            }
+        })
+    })
+
+
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/examineCoursePackage.js b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/examineCoursePackage.js
new file mode 100644
index 0000000..3e9d1a6
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/examineCoursePackage.js
@@ -0,0 +1,185 @@
+/**
+ * 系统管理--用户管理的单例对象
+ */
+let ExamineCoursePackage = {
+    id: "managerTable",//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+
+
+
+/**
+ * 初始化表格的列
+ */
+ExamineCoursePackage.initColumn = function () {
+    let columns = [
+        {field: 'selectItem', radio: true},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '所在省市', field: 'city', align: 'center', valign: 'middle'},
+        {title: '所属门店', field: 'store', align: 'center', valign: 'middle'},
+        {title: '课包类型', field: 'coursePackageType', align: 'center', valign: 'middle'},
+        {title: '课包名称', field: 'name', align: 'center', valign: 'middle'},
+        {title: '最多预约人数', field: 'maxSubscribeNumber', align: 'center', valign: 'middle'},
+        {title: '课程有效期', field: 'validDays', align: 'center', valign: 'middle'},
+        {title: '支付方式', field: 'payType', align: 'center', valign: 'middle'},
+        {title: '排序', field: 'sort', align: 'center', valign: 'middle'},
+        {title: '审核状态', field: 'auditStatus', align: 'center', valign: 'middle',
+            formatter: function (v) {
+                switch (v) {
+                    case 1:
+                        return '待审核';
+                    case 3:
+                        return '未通过';
+                }
+            }
+        }
+    ];
+    return columns;
+};
+
+/**
+ * 检查是否选中
+ */
+ExamineCoursePackage.check = function () {
+    let selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    } else {
+        ExamineCoursePackage.seItem = selected[0];
+        return true;
+    }
+};
+
+
+/**
+ * 点击修改按钮时
+ * @param userId 管理员id
+ */
+ExamineCoursePackage.examineCoursePackage = function () {
+    if (this.check()) {
+        if(ExamineCoursePackage.seItem.auditStatus != 1){
+            Feng.error("不能重复审核");
+            return
+        }
+        let htmlStr =
+            '<div class="form-horizontal">' +
+            '   <div class="col-sm-11" style="padding: 10px;">' +
+            '       <div class="form-group">\n' +
+            '           <label class="col-sm-3 control-label">*审核状态:</label>\n' +
+            '           <div class="col-sm-8">\n' +
+            '               <input name="auditStatus" type="radio" value="2"/> 通过&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '               <input name="auditStatus" type="radio" value="3"/> 拒绝&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '           </div>' +
+            '       </div>' +
+            '       <div class="form-group">\n' +
+            '           <label class="col-sm-3 control-label">*拒绝理由:</label>\n' +
+            '           <div class="col-sm-8">\n' +
+            '               <textarea id="authRemark" style="width: 100%;height: 200px;" placeholder="请输入拒绝理由"></textarea>' +
+            '           </div>' +
+            '       </div>' +
+            '   </div>' +
+            '</div>';
+        layer.open({
+            type: 1
+            , title: '课包审核'
+            , area: ['800px', '400px']
+            , offset: 'auto' //具体配置参考:http://www.layui.com/doc/modules/layer.html#offset
+            , id: 'layerDemo' //防止重复弹出cge
+            , content: htmlStr
+            , btn: ['保存', '关闭']
+            , btnAlign: 'c' //按钮居中
+            , shade: 0.5 //不显示遮罩
+            , yes: function () {
+                let auditStatus = $('input[name="auditStatus"]:checked').val();
+                if(typeof auditStatus == "undefined"){
+                    Feng.error("请选择审核结果");
+                    return
+                }
+                let authRemark = $('#authRemark').text();
+                if(3 == auditStatus && '' == authRemark){
+                    Feng.error("请输入拒绝理由");
+                    return
+                }
+                let ajax = new $ax(Feng.ctxPath + "/coursePackage/setCoursePackageAuditStatus", function (res) {
+                    if(res.code == 200){
+                        Feng.success("审核成功!");
+                        layer.closeAll();
+                        ExamineCoursePackage.table.refresh();
+                    }else{
+                        Feng.error(res.msg);
+                    }
+                }, function (data) {
+                    Feng.error("审核失败!" + data.responseJSON.message + "!");
+                });
+                ajax.set("id", ExamineCoursePackage.seItem.id);
+                ajax.set("auditStatus", auditStatus);
+                ajax.set("authRemark", authRemark);
+                ajax.start();
+            },
+        });
+    }
+};
+
+
+ExamineCoursePackage.detailsExamineCoursePackage = function () {
+    if (this.check()) {
+        let index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/coursePackage/showExamineCoursePackageDetails?id=' + this.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+
+
+ExamineCoursePackage.resetSearch = function () {
+    $("#provinceCode").val("");
+    $("#cityCode").val("");
+    $("#coursePackageTypeId").val("");
+    $("#name").val("");
+    $("#auditStatus").val("");
+    ExamineCoursePackage.search();
+}
+
+ExamineCoursePackage.search = function () {
+    let queryData = {};
+    queryData['provinceCode'] = $("#provinceCode").val();
+    queryData['cityCode'] = $("#cityCode").val();
+    queryData['coursePackageTypeId'] = $("#coursePackageTypeId").val();
+    queryData['name'] = $("#name").val();
+    queryData['auditStatus'] = $("#auditStatus").val();
+    ExamineCoursePackage.table.refresh({query: queryData});
+}
+
+
+$(function () {
+    let defaultColunms = ExamineCoursePackage.initColumn();
+    let table = new BSTable(ExamineCoursePackage.id, "/coursePackage/queryExamineCoursePackageLists", defaultColunms);
+    // 设置物理分页server(逻辑分页client)
+    table.setPaginationType("server");
+    ExamineCoursePackage.table = table.init();
+
+
+    $('#provinceCode').change(function () {
+        let ajax = new $ax(Feng.ctxPath + "/coursePackage/queryCity", function (data) {
+            let htmlStr = '';
+            for (let i = 0; i < data.length; i++) {
+                htmlStr += '<option value="' + data[i].code + '">' + data[i].name + '</option>'
+            }
+            $('#cityCode').html(htmlStr);
+        }, function (data) {
+            Feng.error("获取失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("code", $(this).val());
+        ajax.start();
+    })
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/examineCoursePackage_info.js b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/examineCoursePackage_info.js
new file mode 100644
index 0000000..5a114e0
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/examineCoursePackage_info.js
@@ -0,0 +1,43 @@
+/**
+ * 用户详情对话框(可用于添加和修改对话框)
+ */
+var ExamineCoursePackageInfo = {
+    userInfoData: {},
+};
+
+
+
+/**
+ * 关闭此对话框
+ */
+ExamineCoursePackageInfo.close = function () {
+    parent.layer.close(window.parent.ExamineCoursePackage.layerIndex);
+};
+
+
+ExamineCoursePackageInfo.addSubmit = function () {
+    let auditStatus = $('input[name="auditStatus"]:checked').val();;
+    if(typeof auditStatus == "undefined"){
+        Feng.error("请选择审核结果");
+        return
+    }
+    let authRemark = $('#authRemark').text();
+    if(3 == auditStatus && '' == authRemark){
+        Feng.error("请输入拒绝理由");
+        return
+    }
+    let ajax = new $ax(Feng.ctxPath + "/coursePackage/setCoursePackageAuditStatus", function (res) {
+        if(res.code == 200){
+            Feng.success("审核成功!");
+            ExamineCoursePackageInfo.close();
+        }else{
+            Feng.error(res.msg);
+        }
+    }, function (data) {
+        Feng.error("审核失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("id", $('#id').val());
+    ajax.set("auditStatus", auditStatus);
+    ajax.set("authRemark", authRemark);
+    ajax.start();
+};
\ No newline at end of file
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/manualReservation.js b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/manualReservation.js
new file mode 100644
index 0000000..ffd8e29
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/manualReservation.js
@@ -0,0 +1,96 @@
+/**
+ * 系统管理--用户管理的单例对象
+ */
+let ManualReservation = {
+    id: "managerTable",//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+/**
+ * 初始化表格的列
+ */
+ManualReservation.initColumn = function () {
+    let columns = [
+        {field: 'selectItem', radio: true},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '所属用户', field: 'userName', align: 'center', valign: 'middle'},
+        {title: '姓名', field: 'studentName', align: 'center', valign: 'middle'},
+        {title: '联系电话', field: 'phone', align: 'center', valign: 'middle'},
+        {title: '年龄', field: 'age', align: 'center', valign: 'middle'},
+        {title: '性别', field: 'sex', align: 'center', valign: 'middle',
+            formatter: function (v) {
+                if(v == 1){
+                    return '男';
+                }else{
+                    return '女';
+                }
+            }
+        }
+    ];
+    return columns;
+};
+
+/**
+ * 检查是否选中
+ */
+ManualReservation.check = function () {
+    let selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    } else {
+        ManualReservation.seItem = selected[0];
+        return true;
+    }
+};
+
+
+
+ManualReservation.submit = function () {
+    if (this.check()) {
+        let ajax = new $ax(Feng.ctxPath + "/coursePackage/courseReservation", function (res) {
+            if(res.code == 200){
+                Feng.success("预约成功!");
+                ManualReservation.table.refresh();
+            }else{
+                Feng.error(res.msg);
+            }
+        }, function (data) {
+            Feng.error("预约失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("coursePackageSchedulingId", $('#id').val());
+        ajax.set("coursePackagePaymentId", ManualReservation.seItem.id);
+        ajax.start();
+    }
+};
+
+
+
+
+
+ManualReservation.resetSearch = function () {
+    $('#userName').val('');
+    $('#studentName').val('');
+    ManualReservation.search();
+}
+
+ManualReservation.search = function () {
+    let queryData = {};
+    queryData['coursePackageSchedulingId'] = $('#id').val();
+    queryData['userName'] = $('#userName').val();
+    queryData['studentName'] = $('#studentName').val();
+    ManualReservation.table.refresh({query: queryData});
+}
+
+
+$(function () {
+    let defaultColunms = ManualReservation.initColumn();
+    let table = new BSTable(ManualReservation.id, "/coursePackage/queryWalkInStudentList", defaultColunms);
+    // 设置物理分页server(逻辑分页client)
+    table.setPaginationType("server");
+    table.setQueryParams({
+        coursePackageSchedulingId: $('#id').val()
+    })
+    ManualReservation.table = table.init();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/registrationRecord.js b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/registrationRecord.js
new file mode 100644
index 0000000..9d07773
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/coursePackage/registrationRecord.js
@@ -0,0 +1,210 @@
+/**
+ * 系统管理--用户管理的单例对象
+ */
+let RegistrationRecord = {
+    id: "managerTable",//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+let language =$("#language").val()
+/**
+ * 初始化表格的列
+ */
+RegistrationRecord.initColumn = function () {
+    let columns = [
+        {field: 'selectItem', radio: true},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '购买用户', field: 'userName', align: 'center', valign: 'middle'},
+        {title: '联系方式', field: 'phone', align: 'center', valign: 'middle'},
+        {title: '购课学员', field: 'studentName', align: 'center', valign: 'middle'},
+        {title: '报名时间', field: 'insertTime', align: 'center', valign: 'middle'},
+        {title: '已上课时数', field: 'already', align: 'center', valign: 'middle'},
+        {title: '缺课次数', field: 'absencesNumber', align: 'center', valign: 'middle'},
+        {title: '状态', field: 'status', align: 'center', valign: 'middle',
+            formatter: function (v) {
+                switch (v) {
+                    case 1:
+                        return '正常';
+                    case 2:
+                        return '<a href="#" onclick="">已退课-查看凭证</a>';
+                }
+            }
+        }
+    ];
+    return columns;
+};
+
+/**
+ * 检查是否选中
+ */
+RegistrationRecord.check = function () {
+    let selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    } else {
+        RegistrationRecord.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 上课记录
+ */
+RegistrationRecord.classRecord = function () {
+    let index = layer.open({
+        type: 2,
+        title: '上课记录',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/coursePackage/openClassRecord?id=' + $('#id').val()
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 点击修改按钮时
+ * @param userId 管理员id
+ */
+RegistrationRecord.dropClass = function () {
+    if (this.check()) {
+        if(ClassRecord.seItem.status == 2){
+            Feng.error("不能重复退课");
+            return
+        }
+        let htmlStr =
+            '<div class="form-horizontal">' +
+            '   <div class="col-sm-11">' +
+            '       <div class="form-group">\n' +
+            '           <label class="col-sm-8 control-label">课程名称:' + $("#name").text() + '</label>\n' +
+            '       </div>' +
+            '       <div class="form-group">\n' +
+            '           <label class="col-sm-8 control-label">用户姓名:' + ClassRecord.seItem.userName + '</label>\n' +
+            '       </div>' +
+            '       <div class="form-group">\n' +
+            '           <label class="col-sm-8 control-label">学员姓名:' + ClassRecord.seItem.studentName + '</label>\n' +
+            '       </div>' +
+            '       <div class="form-group">\n' +
+            '           <label class="col-sm-8 control-label">*上传凭证:</label>\n' +
+            '       </div>' +
+            '       <div class="form-group">\n' +
+            '           <div class="col-sm-8">\n' +
+            '               <img id="certificate" src="" style="height: 100px;">' +
+            '               <input type="file" id="file" style="display: none;"/>' +
+            '               <button onclick="uploadImgs()" style="width: 20px;padding: 10px; color: white;background-color: #0d8ddb;border-radius: 5px;"> 上传 </button>' +
+            '           </div>\n' +
+            '       </div>' +
+            '   </div>' +
+            '</div>';
+        layer.open({
+            type: 1
+            , title: '退课'
+            , area: ['50%', '50%']
+            , offset: 'auto' //具体配置参考:http://www.layui.com/doc/modules/layer.html#offset
+            , id: 'layerDemo' //防止重复弹出cge
+            , content: htmlStr
+            , btn: ['保存', '关闭']
+            , btnAlign: 'c' //按钮居中
+            , shade: 0.5 //不显示遮罩
+            , yes: function () {
+                let certificate = $('#certificate').attr('img');
+                if(null == certificate || '' == certificate){
+                    Feng.error("请上传凭证图片");
+                    return
+                }
+                let ajax = new $ax(Feng.ctxPath + "/coursePackage/dropTheClass", function (res) {
+                    if(res.code == 200){
+                        Feng.success("退课成功!");
+                        layer.closeAll();
+                        RegistrationRecord.table.refresh();
+                    }else{
+                        Feng.error(res.msg);
+                    }
+                }, function (data) {
+                    Feng.error("退课失败!" + data.responseJSON.message + "!");
+                });
+                ajax.set("coursePackagePaymentId", ClassRecord.seItem.id);
+                ajax.set("certificate", certificate);
+                ajax.start();
+            },
+        });
+
+        $('#file').on('change', function () {
+            var formData = new FormData()  //创建一个forData
+            formData.append('file', $('#file')[0].files[0]) //把file添加进去  name命名为img
+            layer.load(); //上传loading
+            $.ajax({
+                url: Feng.ctxPath + '/mgr/uploadImg',
+                data: formData,
+                type: "POST",
+                async: true,
+                cache: false,
+                contentType: false,
+                processData: false,
+                success: function(res) {
+                    layer.closeAll('loading'); //关闭loading
+                    $('#file').val('');
+                    $('#certificate').attr('src', res);
+                }
+            })
+        })
+    }
+};
+
+
+
+function uploadImgs(){
+    $('#file').click();
+}
+
+
+/**
+ * 删除用户
+ */
+RegistrationRecord.makeUpMissedLessons = function () {
+    if (this.check()) {
+        let operation = function(){
+            let ajax = new $ax(Feng.ctxPath + "/coursePackage/makeUpMissedLessons", function () {
+                Feng.success("补课成功!");
+                RegistrationRecord.table.refresh();
+            }, function (data) {
+                Feng.error("补课失败!" + data.responseJSON.message + "!");
+            });
+            ajax.set("id", RegistrationRecord.seItem.id);
+            ajax.start();
+        };
+
+        Feng.confirm("是否补课",operation);
+    }
+};
+
+
+
+
+RegistrationRecord.resetSearch = function () {
+    $("#userName").val("");
+    $("#studentName").val("");
+    RegistrationRecord.search();
+}
+
+RegistrationRecord.search = function () {
+    let queryData = {};
+    queryData['userName'] = $("#userName").val();
+    queryData['studentName'] = $("#studentName").val();
+    queryData['id'] = $('#id').val();
+    RegistrationRecord.table.refresh({query: queryData});
+}
+
+
+$(function () {
+    let defaultColunms = RegistrationRecord.initColumn();
+    let table = new BSTable(RegistrationRecord.id, "/coursePackage/queryRegistrationRecord", defaultColunms);
+    // 设置物理分页server(逻辑分页client)
+    table.setPaginationType("server");
+    table.setQueryParams({
+        id: $('#id').val()
+    })
+    RegistrationRecord.table = table.init();
+});

--
Gitblit v1.7.1