Kaynağa Gözat

Merge branch 'master' of http://git.dayaedu.com/yonge/mec

zouxuan 5 yıl önce
ebeveyn
işleme
9a3dcbe96b

+ 25 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ContractService.java

@@ -1,5 +1,8 @@
 package com.ym.mec.biz.service;
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 import com.ym.mec.biz.dal.entity.SysUserTsign;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
 
@@ -80,4 +83,26 @@ public interface ContractService {
 	 * @return
 	 */
 	String queryGoodsContract(Integer userId, String musicGroupId, String goodsIds, KitGroupPurchaseTypeEnum kitGroupPurchaseTypeEnum);
+
+	/**
+	 * 查询陪练课购买协议
+	 * @param userId
+	 * @param courseSectionNum 课程数
+	 * @param startDate 开始日期
+	 * @param endDate 结束日期
+	 * @param fee 费用
+	 * @return
+	 */
+	String queryPracticeCoursesContract(Integer userId, int courseSectionNum, Date startDate, Date endDate, BigDecimal fee);
+
+	/**
+	 * 生成陪练课购买协议
+	 * @param userId
+	 * @param courseSectionNum
+	 * @param startDate
+	 * @param endDate
+	 * @param fee
+	 * @return
+	 */
+	boolean transferPracticeCoursesContract(Integer userId, int courseSectionNum, Date startDate, Date endDate, BigDecimal fee);
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -988,7 +988,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 Map<Integer, Long> reportMap = courseScheduleEvaluates.stream().collect(Collectors.toMap(CourseScheduleEvaluate::getClassGroupId, CourseScheduleEvaluate::getId));
                 if(reportMap.containsKey(teacherClassGroupDto.getClassGroupId().intValue())){
                     teacherClassGroupDto.setHasReport(true);
-                    String studyReportUrl = sysConfigDao.findConfigValue(SysConfigService.TEACHER_STUDY_REPORT_URL);
+                    String studyReportUrl = sysConfigDao.findConfigValue(SysConfigService.STUDENT_STUDY_REPORT_URL);
                     teacherClassGroupDto.setStudyReportUrl(studyReportUrl+teacherClassGroupDto.getClassGroupId());
                 }else if(classGroupNoStartClassTimes.intValue()==0 && classGroupTeacherMap.get(teacherClassGroupDto.getClassGroupId().intValue()).equals(user.getId())){
                    String studyReportUrl = sysConfigDao.findConfigValue(SysConfigService.TEACHER_STUDY_REPORT_URL);

+ 129 - 24
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service.impl;
 
 import java.io.File;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -81,7 +82,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 	@Autowired
 	private MusicGroupSubjectPlanService musicGroupSubjectPlanService;
-	
+
 	@Autowired
 	private MusicGroupSubjectGoodsGroupService musicGroupSubjectGoodsGroupService;
 
@@ -116,7 +117,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 	private String contractBaseDir;
 
 	private DateFormat dateFormatOss = new SimpleDateFormat("yyyy/MM/dd");
-	
+
 	private DateFormat dateFormat1 = new SimpleDateFormat("yyMMddHHmmSS");
 
 	@Override
@@ -215,8 +216,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 		// 生成借款协议PDF
 		try {
-			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath,
-					"simsun.ttc");
+			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath, "simsun.ttc");
 		} catch (IOException e) {
 			throw new BizException("生成pdf协议失败", e);
 		}
@@ -267,8 +267,9 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			result = FileUtils.readFileToString(srcFile);
 		} catch (IOException e) {
 			throw new BizException("读取注册协议出错", e);
+		} finally {
+			FileUtils.deleteQuietly(srcFile);
 		}
-		FileUtils.deleteQuietly(srcFile);
 
 		return result;
 	}
@@ -348,22 +349,21 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 		// 生成借款协议PDF
 		try {
-			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath,
-					"simsun.ttc");
+			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath, "simsun.ttc");
 		} catch (IOException e) {
 			throw new BizException("生成pdf协议失败", e);
 		}
 		String organCode = "";
-		if(musicGroup.getOwnershipType() == OwnershipType.OWN){
+		if (musicGroup.getOwnershipType() == OwnershipType.OWN) {
 			organCode = "91440300326364429H";
-		}else{
+		} else {
 			organCode = "91420106333619290A";
 		}
 		SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
-		if(organTsign == null){
+		if (organTsign == null) {
 			throw new BizException("甲方未创建签章");
 		}
-		
+
 		eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
 		eSealPlugin.userSign(sysUserTsign.getAccountId(), sysUserTsign.getSealData(), srcPdfPath, srcPdfPath);
 
@@ -454,8 +454,9 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			result = FileUtils.readFileToString(srcFile);
 		} catch (IOException e) {
 			throw new BizException("读取课程协议出错", e);
+		} finally {
+			FileUtils.deleteQuietly(srcFile);
 		}
-		FileUtils.deleteQuietly(new File(srcPdfPath));
 
 		return result;
 	}
@@ -513,17 +514,16 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 		// 生成借款协议PDF
 		try {
-			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath,
-					"simsun.ttc");
+			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath, "simsun.ttc");
 		} catch (IOException e) {
 			throw new BizException("生成pdf协议失败", e);
 		}
 		String organCode = "91440300326364429H";
 		SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
-		if(organTsign == null){
+		if (organTsign == null) {
 			throw new BizException("甲方未创建签章");
 		}
-		
+
 		eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
 
 		eSealPlugin.userSign(sysUserTsign.getAccountId(), sysUserTsign.getSealData(), srcPdfPath, srcPdfPath);
@@ -591,8 +591,9 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			result = FileUtils.readFileToString(srcFile);
 		} catch (IOException e) {
 			throw new BizException("读取课程协议出错", e);
+		} finally {
+			FileUtils.deleteQuietly(srcFile);
 		}
-		FileUtils.deleteQuietly(srcFile);
 
 		return result;
 	}
@@ -673,22 +674,21 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 		// 生成借款协议PDF
 		try {
-			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath,
-					"simsun.ttc");
+			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath, "simsun.ttc");
 		} catch (IOException e) {
 			throw new BizException("生成pdf协议失败", e);
 		}
 		String organCode = "";
-		if(musicGroup.getOwnershipType() == OwnershipType.OWN){
+		if (musicGroup.getOwnershipType() == OwnershipType.OWN) {
 			organCode = "91440300326364429H";
-		}else{
+		} else {
 			organCode = "91420106333619290A";
 		}
 		SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
-		if(organTsign == null){
+		if (organTsign == null) {
 			throw new BizException("甲方未创建签章");
 		}
-		
+
 		eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
 
 		eSealPlugin.userSign(sysUserTsign.getAccountId(), sysUserTsign.getSealData(), srcPdfPath, srcPdfPath);
@@ -781,10 +781,115 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			result = FileUtils.readFileToString(srcFile);
 		} catch (IOException e) {
 			throw new BizException("读取商品协议出错", e);
+		} finally {
+			FileUtils.deleteQuietly(srcFile);
 		}
-		FileUtils.deleteQuietly(srcFile);
 
 		return result;
 	}
 
+	@Override
+	public String queryPracticeCoursesContract(Integer userId, int courseSectionNum, Date startDate, Date endDate, BigDecimal fee) {
+		// 合成freemarker
+		String srcPdfPath = contractBaseDir + "/practice/" + userId + ".pdf";
+
+		File srcFile = new File(srcPdfPath);
+
+		File debtFile = new File(srcFile.getParent());
+		if (!debtFile.exists()) {
+			debtFile.mkdirs();
+		}
+
+		FreemarkerTemplateEngine templateEngine = FreemarkerTemplateEngine.getInstance();
+		templateEngine.setClassForTemplateLoading(ContractServiceImpl.class, "/config/contracts/");
+
+		Map<String, Object> params = new HashMap<String, Object>();
+		params.put("courseSectionNum", courseSectionNum);
+		params.put("startDate", startDate);
+		params.put("endDate", endDate);
+		params.put("fee", fee);
+
+		templateEngine.render(params, "practice.ftl", srcFile);
+
+		String result = "";
+		try {
+			result = FileUtils.readFileToString(srcFile);
+		} catch (IOException e) {
+			throw new BizException("读取陪练课购买协议出错", e);
+		} finally {
+			FileUtils.deleteQuietly(srcFile);
+		}
+
+		return result;
+	}
+
+	@Override
+	public boolean transferPracticeCoursesContract(Integer userId, int courseSectionNum, Date startDate, Date endDate, BigDecimal fee) {
+		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
+
+		if (sysUserTsign == null) {
+			SysUser user = sysUserFeignService.queryUserById(userId);
+			if (user == null) {
+				throw new BizException("用户信息查询失败");
+			}
+			sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
+		}
+
+		Date date = new Date();
+
+		// 合成freemarker
+		String srcPdfPath = contractBaseDir + "/practice/" + userId + ".pdf";
+
+		File srcFile = new File(srcPdfPath);
+
+		File debtFile = new File(srcFile.getParent());
+		if (!debtFile.exists()) {
+			debtFile.mkdirs();
+		}
+
+		FreemarkerTemplateEngine templateEngine = FreemarkerTemplateEngine.getInstance();
+		templateEngine.setClassForTemplateLoading(ContractServiceImpl.class, "/config/contracts/");
+
+		Map<String, Object> params = new HashMap<String, Object>();
+		params.put("courseSectionNum", courseSectionNum);
+		params.put("startDate", startDate);
+		params.put("endDate", endDate);
+		params.put("fee", fee);
+
+		templateEngine.render(params, "practice.ftl", srcFile);
+
+		// 生成借款协议PDF
+		try {
+			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath, "simsun.ttc");
+		} catch (IOException e) {
+			throw new BizException("生成pdf协议失败", e);
+		}
+		String organCode = "91440300326364429H";
+		SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
+		if (organTsign == null) {
+			throw new BizException("甲方未创建签章");
+		}
+
+		eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
+
+		eSealPlugin.userSign(sysUserTsign.getAccountId(), sysUserTsign.getSealData(), srcPdfPath, srcPdfPath);
+
+		// 上传到oss
+		String dateStrOss = dateFormatOss.format(date);
+		dateStrOss = "practice/" + dateStrOss + "/" + DateUtil.getHour(date);
+		String pdfFilePath = storagePlugin.uploadFile(dateStrOss, srcFile);
+
+		SysUserContracts sysUserContracts = new SysUserContracts();
+		sysUserContracts.setCreateTime(date);
+		sysUserContracts.setType(ContractType.REGISTER);
+		sysUserContracts.setUrl(pdfFilePath);
+		sysUserContracts.setUserId(userId);
+
+		sysUserContractsService.insert(sysUserContracts);
+
+		FileUtils.deleteQuietly(srcFile);
+
+		return true;
+	}
+
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleEvaluateServiceImpl.java

@@ -68,7 +68,7 @@ public class CourseScheduleEvaluateServiceImpl extends BaseServiceImpl<Long, Cou
         Map<Integer, String> push = new HashMap<>(1);
         push.put(practiceGroup.getStudentId(), practiceGroup.getStudentId().toString());
         String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-        String memo = baseUrl + "/#/study?classGroupId=" + classGroup.getId();
+        String memo = baseUrl + "/#/reportDetail?classGroupId=" + classGroup.getId();
         BasicUserDto teacherInfo = teacherDao.findTeacherInfo(courseScheduleEvaluate.getTeacherId());
 
         sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.PUSH_STUDY_REPORT, push, null, 0, memo, "STUDENT",

+ 2 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java

@@ -2340,8 +2340,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         }
         now.plusDays(1);
         Date applyStartDate = Date.from(now.atStartOfDay(zoneId).toInstant());
-        now.plusMonths(buyMonths);
-        Date applyEndDate = Date.from(now.atStartOfDay(zoneId).toInstant());
+        Date applyEndDate = Date.from(now.plusMonths(buyMonths).atStartOfDay(zoneId).toInstant());
         Date firstMonday = DateUtil.getWeekDayWithDate(applyStartDate, Calendar.MONDAY);
         Date secondSunday = DateUtil.getWeekDayWithDate(applyEndDate, Calendar.SUNDAY);
 
@@ -2842,7 +2841,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     private List<CourseSchedule> createPracticeCourses(PracticeGroupBuyDto practiceGroupBuyParams, Integer practiceCourseMinutes){
         List<CourseSchedule> courseSchedules=new ArrayList<>();
         LocalDate courseStartDay=LocalDateTime.ofInstant(practiceGroupBuyParams.getCoursesStartDate().toInstant(),DateUtil.zoneId).toLocalDate();
-        LocalDate courseEndDay=LocalDateTime.ofInstant(practiceGroupBuyParams.getCoursesExpireDate().toInstant(),DateUtil.zoneId).toLocalDate();
+        LocalDate courseEndDay=LocalDateTime.ofInstant(practiceGroupBuyParams.getCoursesExpireDate().toInstant(),DateUtil.zoneId).plusSeconds(1).toLocalDate();
         while (courseStartDay.compareTo(courseEndDay)<0){
             int dayOfWeek = courseStartDay.get(DateUtil.weekFields.dayOfWeek());
             for (PracticeDrillTimeDto drillTime : practiceGroupBuyParams.getDrillTimes()) {

+ 161 - 0
mec-biz/src/main/resources/config/contracts/practice.ftl

@@ -0,0 +1,161 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
+    <meta http-equiv="Pragma" content="no-cache" />
+    <meta http-equiv="Cache-Control" content="no-cache" />
+    <meta http-equiv="Expires" content="0" />
+    <title>网络管乐基础课购买协议</title>
+    <style>
+        body { margin: 0; }
+        header {
+            height: 40px;
+            line-height: .40px;
+            color: #000;
+            font-size: 17px;
+            background: #fff;
+            box-shadow: 0px 1px 8px 0px rgba(0, 0, 0, 0.07);
+            text-align: center;
+        }
+        header .back {
+            width: 20px;
+            height: 20px;
+            position: absolute;
+            left: 12px;
+            top: 10px;
+        }
+        .container {
+            padding: 22px 20px 3px;
+            font-size: 14px;
+        }
+        h1 {
+            font-size: 16px;
+            text-align: center;
+        }
+        h2 {
+            font-size: 16px;
+            font-weight: bold;
+            padding-top: 15px;
+        }
+        h3 {
+            font-size: 14px;
+            font-weight: bold;
+        }
+        .signature {
+            padding-top: 50px;
+        }
+        .signature .sign {
+            position: relative;
+            width: 49%;
+            display: inline-block;
+        }
+        .signature span {
+            display: block;
+        }
+        .signature .cachet {
+            position: absolute;
+            top: -60px;
+            left: 0;
+            width: 150px;
+            height: 150px;
+        }
+        .iInfo {
+            display: flex;
+        }
+        .iInfo span {
+            flex: 1;
+        }
+        .iInfoContent, .iInfoContent span {
+            display: block;
+        }
+    </style>
+</head>
+<body style="font-family:'SimSun'">
+    <div class="container">
+        <h1>《网络管乐基础课购买协议》</h1>
+        <h2>重要提示</h2>
+        欢迎使用大雅乐盟(下称“本公司”)在线网络管乐基础课程服务,本协议为用户购买本公司在线网络管乐基础课程(下称“课程”)之事宜订立的协议。请用户在购买和使用在线网络管乐基础课程服务前仔细阅读本协议。如用户不同意本协议任何条款,请勿购买或使用在线网络管乐基础课程服务(下称“本服务”)。用户点击“购买”选项并支付网络管乐基础课程费用,即视为用户已阅读并同意接受本协议的约束,本协议即构成本公司与用户之间具有约束力的法律文件。<br />
+        未满18周岁的用户应在法定监护人的陪同下阅读后,并且应在法定监护人的同意和指导下购买和使用本服务。
+
+
+        <h2>第一条 协议接受与修订、更新</h2>
+        1.1 本协议正文内容、《隐私协议》以及本公司已经发布的或将来发布或更新的各类规则均为本协议不可分割的组成部分,与本协议具有同等法律效力。若本协议正文与前述协议、规则内容不一致或冲突的,以本协议内容为准;本协议未约定的内容以前述协议、规则内容为准。<br />
+        1.2 本公司可以随时更新本协议的各项条款,包括但不限于增加新的服务类型或功能,更新后的协议条款一经本公司公布或更新即生效并代替原来的协议条款,无需另行通知,用户可以及时关注并阅读本协议最新版本;用户继续使用本服务的,视为用户接受本协议的最新更新版本;用户不接受本协议最新版本的,应立即停止使用本服务。
+        
+        <h2>第二条 课程的购买、授课及退费</h2>
+        2.1 用户购买的课程为在线网络管乐基础课程。每节课的时长为25分钟,每周授课次数为1~2次。具体收费标准、课时、有效期等如下表:
+        <table border="1" style="width: 100%; border-collapse: collapse;">
+            <tr>
+                <th>课程类型</th>
+                <th>课时数</th>
+                <th>有效期</th>
+                <th>费用</th>
+            </tr>
+            <tr>
+                <td style="text-align: center;">网管课</td>
+                <td style="text-align: center;">${courseSectionNum}</td>
+                <td style="text-align: center;">${startDate?string("yyyy-MM-dd")}/${endDate?string("yyyy-MM-dd")}</td>
+                <td style="text-align: center;">${fee?string("0.00")}</td>
+            </tr>
+        </table>
+        2.2 用户购课后,需在有效期内完成所购全部课程(以课程后台有效期为准)。除本协议另有约定外,若用户未能在课程有效期内上完课程,则课程自动结束,本公司不再提供课程。<br />
+        2.3 课程内容以及授课时间以课程表为准。<br />
+        2.4 为保证良好的学习效果,用户及本公司安排的授课老师均不能随意调整课程表。用户申请调课应当通过管乐迷APP申请,用户和授课老师不得私自约定调课。用户或授课老师要求调整上课时间的,经双方协商一致后,须至少提前1天调整课程,如遇到不可抗力事件、意外等紧急情况须至少提前4小时取消课程。如用户未按照规定申请调课,则按照原课程安排执行课程计划。<br />
+        2.5 用户未能按时上课的,课程将按时开始和结束,用户不得要求延时。<br />
+        2.6 由于本公司的原因(包括但不限于指导老师未能按时上线、临时无法授课、中途因故终止授课、授课过程中软件系统出现故障持续10分钟等)导致用户无法正常上课的,该次课程不扣除课时。<br />
+        2.7 用户在购买课程前,应当仔细阅读本协议。用户购课后,非因本公司原因,用户所购课程不予退款。<br />
+        2.8 因本公司原因造成退款的,双方按照用户时间上课时长计算费用。用户使用支付宝、微信支付方式缴费,退费收取银行手续费,金额为退费金额的0.6%。退费时,用户须退回本公司已开的发票和收据。
+
+        <h2>第三条 本公司权利和义务</h2>
+        3.1 本公司有权根据本协议相关条款获得用户支付的课程费用。<br />
+        3.2 本公司有权根据本协议的约定获得、持有和核对用户提供的有关个人信息、资料。<br />
+        3.3 本公司应提供本协议约定的课程服务。<br />
+        3.4 本公司将尽全力保证所提供的各项服务均能够正常使用;但是因不可抗力以及用户一方的原因造成不能正常使用本公司所提供的各项服务,包括但不限于互联网运营商提供的网络中断、用户不具备上网条件(包括不具备软硬件条件或者软硬件故障)等,则本公司不承担相应责任。
+
+        <h2>第四条 用户的权利和义务</h2>
+        4.1 用户应具备完全民事权利能力和完全民事行为能力,有能力对用户使用在线课程服务过程中的一切行为独立承担法律责任。如果用户不具备前述条件的,本公司有权要求用户的法定监护人承担相应的法律责任。<br />
+        4.2 用户购买在线网络管乐基础课程并付费成功后,本公司为用户开通在线网络管乐基础课程,非本公司原因致使用户购买的课程产生损耗的,由用户自行承担相应责任。<br />
+        4.3 用户应应妥善保管账户和密码,用户账号下发生的所有行为均视为用户行为。用户如果用户的账户、密码丢失的,应在在服务结束前及时联系本公司,并按照本公司要求提供身份认证信息、付款凭证等资料,经本公司确认无误后将恢复用户权益,否则,用户自行承担相应损失及责任。<br />
+        4.4 用户在购买课程后,有权利享受本公司所提供的网络管乐基础课程服务。<br />
+        4.5 用户向本公司提供信息应当合法、真实和有效。<br />
+        4.6 用户应遵守课程安排,按照本协议的约定按时完成全部网络管乐基础课程。用户因故需要调整既定上课时间的,须按照本协议约定进行申请;如未按约定申请调课,所产生后果均由用户自行承担。<br />
+        4.7 用户购买的在线网络管乐基础课程,用户只可以自行使用,不得与其他第三方(用户的法定监护人除外)共同参加网络管乐基础课程,也不得将自己的账号转让或提供给任何第三方。<br />
+        4.8 用户不得对授课内容录音、录像、直播或者组织多人同时观看,不得将获得的课程资料进行复制、销售、出租或授权给任何第三方。如本公司发现用户存在上述行为的,本公司有权停止对用户提供课程,并有权追究相关法律责任。<br />
+        4.9 用户不得通过非本公司认可的方式或者非法途径获取在线课程服务,给本公司造成损失的,本公司有权追偿。<br />
+        4.10 用户在参加课程时,应遵守课堂纪律,尊重他人合法权益。如果用户上课过程中侵犯他人权益、扰乱正常的上课秩序或者发布不当言论的,本公司有权暂停向用户提供课程服务。如用户多次出现前述情形的,本公司有权终止向用户提供课程服务。<br />
+        4.11 用户应始终维护本公司的知识产权以及品牌形象,本协议期间以及本协议因任何原因失效、被撤销、解除或终止后,均不得直接或间接通过任何公众媒体(包括但不限于传统大众媒体,以及微信、微博、博客、直播平台等社交平台)发表损害本公司(包括但不限于其产品、服务及本公司授课老师)声誉的言论或实施任何类似行为,否则本公司有权追究用户的法律责任。
+        
+        <h2>第五条 知识产权</h2>
+        5.1 以下所述资料的所有权及全部、完整的知识产权归本公司享有:<br />
+        1. 本公司为课程所制作的全部资料(包括但不限于教材教辅、课件及教学相关材料等);<br />
+        2. 在上课过程中产生的全部资料(包括但不限于任何教学视频、教学方案等);<br />
+        3. 用户网站上所显示、使用或提供之软件、程序及内容。<br />
+        5.2 未经本公司同意,用户在任何时候(包括本协议有效期内及协议终止后)均不得对第5.1款约定的资料为任何商业目的进行利用,也不得以任何方式翻译、复制、传播、编辑,以及透露给任何第三方。
+
+        <h2>第六条 保密条款</h2>
+        6.1 双方对本协议的条款、本协议的签订及履行情况以及通过签订和履行本协议而获知的对方及对方关联公司的任何信息均负有保密义务。任何一方不得以任何形式透露给第三方(有关法律法规要求和双方的法律、会计顾问、授权雇员除外),也不得擅自使用。<br />
+        6.2 本保密义务期限不受本协议期限的限制。本协议失效、被撤销、解除或终止等任何情况下,双方仍应遵守本保密义务。
+
+        <h2>第七条 违约责任</h2>
+        一方不履行合同义务或者履行合同义务不符合约定的,均构成违约,守约方有权以书面通知的方式要求违约方纠正其违约行为并采取及时、有效的补救措施消除违约后果,并赔偿守约方因违约方之违约行为而遭致的损失。若违约方在收到守约方的上述通知后5日内未纠正其违约行为的,守约方有权在做出书面通知的情况下,单方解除本协议,违约方应赔偿守约方因此遭致的全部损失。
+
+        <h2>第八条 不可抗力</h2>
+        8.1 一方遇到不可抗力事件(指甲乙双方无法控制、无法预见或即使预见也无法避免的事件,该事件妨碍、影响或延误任何一方履行本协议的全部或部分义务,该事件包括但不限于自然灾害(如水灾、地震等)、火灾、政府行为、法律或政策变化、战争或其他任何类似事件)时,受影响方应当立即书面通知对方,并告知该不可抗力事件对本协议可能产生的影响,并在该不可抗力事件发生后5日内向对方提供该事件的详细信息及由有关机构出具的解释受影响方因此无法履行本协议项下全部或部分义务的相关证明。<br />
+        8.2 由于上述不可抗力事件致使受影响方无法履行或无法按时履行本协议项下全部或部分义务的,双方于彼此间均不承担违约责任,但双方应在相互信任的基础上协商解决,尽力减少不可抗力事件对本协议的影响,并采取合理方式进行调整(包括但不限于另行签订补充协议等),尽量避免损失的扩大。<br />
+        8.3 不可抗力事件消失或结束后,除双方另行协商一致外,受到不可抗力影响的一方应当立即采取措施继续履行本协议,如不可抗力事件持续30日以上的,则任何一方有权以书面通知对方的方式单方解除本协议。
+
+        <h2>第九条 适用法律及争议解决方式</h2>
+        9.1 本协议的订立、效力、履行、解释及争议解决均适用中华人民共和国法律。<br />
+        9.2 因履行本协议发生的一切争议,甲乙双方应友好协商解决;如双方在发生争议后30日内无法通过协商解决时,任何一方有权向湖北省武汉市有管辖权的人民法院提起诉讼解决。
+
+        <h2>第十条 其他</h2>
+        10.1双方因履行本协议而相互发出或者提供的所有通知、文件、资料,均以本协议中所列明的电话、APP推送消息送达,用户如果变更电话号码的,应当自变更后1日内通知本公司且获得本公司确认,本公司通过电话、APP方式无法联系用户或者本公司认为必要时,本公司也可以通过特快专递至用户住址的方式向用户发出上述任何通知、文件、资料等,并在本公司寄出特快专递后第5日视为送达成功。<br />
+        10.2本协议自用户点击“购买”选项并支付费用完成购买课程之日起生效。协议内容已电子协议为准,本公司不再提供纸质协议。<br />
+        10.3用户对本服务或本协议有任何疑问、意见或建议的,可通过以下方式联系本公司,本公司将及时回复和处理用户请求。<br />
+        本公司联系方式:027-87718176
+
+    </div>
+</body>
+</html>

+ 13 - 0
mec-student/src/main/java/com/ym/mec/student/controller/ContractsController.java

@@ -1,5 +1,8 @@
 package com.ym.mec.student.controller;
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
@@ -65,4 +68,14 @@ public class ContractsController extends BaseController {
 		return succeed(contractService.queryVipGroupCoursesContract(sysUser.getId(), vipGroupId));
 	}
 
+	@ApiOperation("查询陪练课课程协议")
+	@GetMapping(value = "queryPracticeCoursesContract")
+	public Object queryPracticeCoursesContract(int courseSectionNum, Date startDate, Date endDate, BigDecimal fee) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("获取用户信息失败");
+		}
+		return succeed(contractService.queryPracticeCoursesContract(sysUser.getId(), courseSectionNum, startDate, endDate, fee));
+	}
+
 }