소스 검색

Merge remote-tracking branch 'origin/master'

zouxuan 4 년 전
부모
커밋
0e9dd85240

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java

@@ -464,6 +464,15 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     List<MusicGroup> getStudentNormalMusicGroups(@Param("studentIds") Set<Integer> studentIds);
 
     /**
+     * @describe 获取学员最后加入的在读进行中乐团
+     * @author Joburgess
+     * @date 2021/2/28 0028
+     * @param userId:
+     * @return com.ym.mec.biz.dal.entity.MusicGroup
+     */
+    MusicGroup getUserLastNormalMusicGroup(@Param("userId") Integer userId);
+
+    /**
      * @describe 查询学员在读进行中乐团报名信息
      * @author Joburgess
      * @date 2021/2/25 0025

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserContractsDao.java

@@ -20,6 +20,15 @@ public interface SysUserContractsDao extends BaseDAO<Long, SysUserContracts> {
     List<SysUserContracts> getUserContractWithType(@Param("userId") Integer userId,
                                                    @Param("contractType") SysUserContracts.ContractType contractType,
                                                    @Param("version") Integer version);
+
+    /**
+     * @describe 批量获取用户协议
+     * @author Joburgess
+     * @date 2021/2/28 0028
+     * @param userIds:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.SysUserContracts>
+     */
+    List<SysUserContracts> getUserAllContract(@Param("userIds") List<Integer> userIds);
 	
     /**
      * 获取最近一次的协议

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/IndexBaseDto.java

@@ -83,7 +83,7 @@ public class IndexBaseDto {
                     this.percent = activateNum.divide(total, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_DOWN);
                 }
             }else{
-                this.percent = indexMonthData.stream().filter(i->currentMonth.compareTo(i.getMonth())==0).max(Comparator.comparing(IndexBaseMonthData::getMonth)).get().getPercent();
+                this.percent = indexMonthData.stream().filter(i->currentMonth.compareTo(i.getMonth())>=0).max(Comparator.comparing(IndexBaseMonthData::getMonth)).get().getPercent();
             }
         }
     }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentManageListDto.java

@@ -83,12 +83,22 @@ public class StudentManageListDto {
     
     private boolean isSignedContract;
 
+    private String contractVersions;
+
     @ApiModelProperty(value = "关心包:0:默认不可用;1:可用;2:已使用;")
     private Integer carePackage;
 
     @ApiModelProperty(value = "加油包:0:默认不可用;1:可用;2:已使用;")
     private Integer comeOnPackage;
 
+    public String getContractVersions() {
+        return contractVersions;
+    }
+
+    public void setContractVersions(String contractVersions) {
+        this.contractVersions = contractVersions;
+    }
+
     public Integer getCarePackage() {
         return carePackage;
     }

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

@@ -9,9 +9,6 @@ import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
 
 public interface ContractService {
 
-	//协议版本
-	Integer CONTRACT_VERSION=2;
-
 	/**
 	 * 用户注册
 	 * @param userId

+ 3 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/SysUserContractsService.java

@@ -15,7 +15,7 @@ public interface SysUserContractsService extends BaseService<Long, SysUserContra
      * @param contractType:
      * @return java.util.List<com.ym.mec.biz.dal.entity.SysUserContracts>
      */
-    List<SysUserContracts> getUserContractWithType(Integer userId, SysUserContracts.ContractType contractType);
+    List<SysUserContracts> getUserContractWithType(Integer userId, SysUserContracts.ContractType contractType, Integer contractVersion);
 
     /**
      * 获取最近一次的协议
@@ -23,4 +23,6 @@ public interface SysUserContractsService extends BaseService<Long, SysUserContra
      * @return
      */
     SysUserContracts getLatestUserContract(Integer userId);
+
+    List<SysUserContracts> getUserAllContracts(Integer userId);
 }

+ 29 - 14
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java

@@ -9,6 +9,8 @@ import java.util.*;
 import java.util.Map.Entry;
 
 import com.ym.mec.auth.api.enums.CertificateTypeEnum;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -24,10 +26,6 @@ import org.springframework.util.CollectionUtils;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
-import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
-import com.ym.mec.biz.dal.dao.StudentDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
 import com.ym.mec.biz.dal.dto.StudentInfo;
 import com.ym.mec.biz.dal.entity.CooperationOrgan.OwnershipType;
 import com.ym.mec.biz.dal.entity.Goods;
@@ -85,6 +83,9 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 	private StudentRegistrationService studentRegistrationService;
 
 	@Autowired
+	private StudentRegistrationDao studentRegistrationDao;
+
+	@Autowired
 	private StudentPaymentOrderService studentPaymentOrderService;
 
 	@Autowired
@@ -971,11 +972,6 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			return false;
 		}
 
-		List<SysUserContracts> userContracts = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT);
-		if(!CollectionUtils.isEmpty(userContracts)){
-			return true;
-		}
-
 		if(StringUtils.isBlank(user.getRealName())||StringUtils.isBlank(user.getIdCardNo())){
 			logger.error("身份信息缺失({})", userId);
 			return false;
@@ -1013,8 +1009,14 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 		params.put("isShowVisualSeal", false);
 
+		CourseViewTypeEnum ownershipType = CourseViewTypeEnum.COURSE_lIST;
+
 		if(StringUtils.isBlank(musicGroupId)){
 			params.put("ownershipType", "OWN");
+			MusicGroup userLastNormalMusicGroup = studentRegistrationDao.getUserLastNormalMusicGroup(userId);
+			if(Objects.nonNull(userLastNormalMusicGroup)){
+				ownershipType = userLastNormalMusicGroup.getCourseViewType();
+			}
 		}else{
 			MusicGroup musicGroup = musicGroupService.get(musicGroupId);
 			if (musicGroup == null) {
@@ -1022,9 +1024,15 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 				return false;
 			}
 			params.put("ownershipType", musicGroup.getOwnershipType().name());
+			ownershipType = musicGroup.getCourseViewType();
 		}
 
-		templateEngine.render(params, "product.ftl", srcFile);
+		List<SysUserContracts> userContracts = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT, CourseViewTypeEnum.COURSE_lIST.equals(ownershipType)?2:3);
+		if(!CollectionUtils.isEmpty(userContracts)){
+			return true;
+		}
+
+		templateEngine.render(params, "product"+(CourseViewTypeEnum.COURSE_lIST.equals(ownershipType)?2:3)+".ftl", srcFile);
 
 		// 生成借款协议PDF
 		try {
@@ -1062,7 +1070,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		sysUserContracts.setType(ContractType.PRODUCT);
 		sysUserContracts.setUrl(pdfFilePath);
 		sysUserContracts.setUserId(userId);
-		sysUserContracts.setVersion(CONTRACT_VERSION);
+		sysUserContracts.setVersion(CourseViewTypeEnum.COURSE_lIST.equals(ownershipType)?2:3);
 
 		sysUserContractsService.insert(sysUserContracts);
 
@@ -1098,17 +1106,25 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		params.put("studentInfo", studentInfo);
 		params.put("isShowVisualSeal", true);
 
+		Map<String, Object> result = new HashMap<>();
+		result.put("courseViewType", CourseViewTypeEnum.COURSE_lIST);
+
 		if(StringUtils.isBlank(musicGroupId)){
 			params.put("ownershipType", "OWN");
+			MusicGroup userLastNormalMusicGroup = studentRegistrationDao.getUserLastNormalMusicGroup(userId);
+			if(Objects.nonNull(userLastNormalMusicGroup)){
+				result.put("courseViewType", userLastNormalMusicGroup.getCourseViewType());
+			}
 		}else{
 			MusicGroup musicGroup = musicGroupService.get(musicGroupId);
 			if (musicGroup == null) {
 				throw new BizException("乐团信息没找到");
 			}
 			params.put("ownershipType", musicGroup.getOwnershipType().name());
+			result.put("courseViewType", musicGroup.getCourseViewType());
 		}
 
-		templateEngine.render(params, "product.ftl", srcFile);
+		templateEngine.render(params, "product"+(CourseViewTypeEnum.COURSE_lIST.equals(result.get("courseViewType"))?2:3)+".ftl", srcFile);
 
 		String html = "";
 		try {
@@ -1119,9 +1135,8 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			FileUtils.deleteQuietly(srcFile);
 		}
 
-		List<SysUserContracts> userContractWithType = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT);
+		List<SysUserContracts> userContractWithType = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT, CourseViewTypeEnum.COURSE_lIST.equals(result.get("courseViewType"))?2:3);
 
-		Map<String, Object> result = new HashMap<>();
 		result.put("exists", !CollectionUtils.isEmpty(userContractWithType));
 		result.put("productContract", html);
 		return result;

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java

@@ -116,6 +116,12 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			Set<String> hasMonths = typeDateMapEntry.getValue().stream().map(d -> DateUtil.dateToString(d.getMonth(), "yyyy-MM-dd")).collect(Collectors.toSet());
 			LocalDate currentMonthDate = startDate;
 			while (currentMonthDate.compareTo(endDate)<=0){
+				if(IndexDataType.HOMEWORK_CREATE_RATE.equals(typeDateMapEntry.getKey())
+					||IndexDataType.HOMEWORK_SUBMIT_RATE.equals(typeDateMapEntry.getKey())
+					||IndexDataType.HOMEWORK_COMMENT_RATE.equals(typeDateMapEntry.getKey())){
+					currentMonthDate = currentMonthDate.plusDays(1);
+					continue;
+				}
 				if(hasMonths.contains(currentMonthDate.toString())){
 					currentMonthDate = currentMonthDate.plusDays(1);
 					continue;

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -107,6 +107,8 @@ public class StudentManageServiceImpl implements StudentManageService {
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
     @Autowired
     private CourseScheduleDao courseScheduleDao;
+    @Autowired
+    private SysUserContractsDao sysUserContractsDao;
 
     @Override
     public PageInfo<StudentManageListDto> findStudentsByOrganId(StudentManageQueryInfo queryInfo) {
@@ -135,6 +137,13 @@ public class StudentManageServiceImpl implements StudentManageService {
         List<StudentListCourseDto> studentListCourseDtoList = studentManageDao.queryStudentRemianCourse(userIds);
         Map<Integer, StudentListCourseDto> StudentListCourseDtoMap = studentListCourseDtoList.stream().collect(Collectors.toMap(StudentListCourseDto::getUserId, studentListCourseDto -> studentListCourseDto));
 
+        //用户协议
+        List<SysUserContracts> userAllContract = sysUserContractsDao.getUserAllContract(new ArrayList<>(userIds));
+        Map<Integer, Set<Integer>> userContractVersionMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(userAllContract)){
+            userContractVersionMap = userAllContract.stream().collect(Collectors.groupingBy(SysUserContracts::getUserId, Collectors.mapping(SysUserContracts::getVersion, Collectors.toSet())));
+        }
+
         //List<Subject> studentSubject = studentManageDao.getStudentSubject(userIds);
         StudentListCourseDto studentListCourseDto = null;
         for (StudentManageListDto dto : dataList) {
@@ -154,6 +163,10 @@ public class StudentManageServiceImpl implements StudentManageService {
                 dto.setHasCourse(YesOrNoEnum.NO);
                 dto.setHasPracticeCourse(YesOrNoEnum.NO);
             }
+
+            if(userContractVersionMap.containsKey(dto.getUserId())){
+                dto.setContractVersions(StringUtils.join(userContractVersionMap.get(dto.getUserId()), ","));
+            }
 //            for (Subject subject : studentSubject) {
 //                if(!subject.getId().equals(dto.getUserId())) continue;
 //                dto.setSubjectName(subject.getName());

+ 8 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserContractsServiceImpl.java

@@ -10,6 +10,7 @@ import com.ym.mec.biz.service.SysUserContractsService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 
+import java.util.Arrays;
 import java.util.List;
 
 @Service
@@ -24,13 +25,17 @@ public class SysUserContractsServiceImpl extends BaseServiceImpl<Long, SysUserCo
 	}
 
 	@Override
-	public List<SysUserContracts> getUserContractWithType(Integer userId, SysUserContracts.ContractType contractType) {
-		return sysUserContractsDao.getUserContractWithType(userId, contractType, ContractService.CONTRACT_VERSION);
+	public List<SysUserContracts> getUserContractWithType(Integer userId, SysUserContracts.ContractType contractType, Integer contractVersion) {
+		return sysUserContractsDao.getUserContractWithType(userId, contractType, contractVersion);
 	}
 
 	@Override
 	public SysUserContracts getLatestUserContract(Integer userId) {
 		return sysUserContractsDao.getLatestUserContract(userId);
 	}
-	
+
+	@Override
+	public List<SysUserContracts> getUserAllContracts(Integer userId) {
+		return sysUserContractsDao.getUserAllContract(Arrays.asList(userId));
+	}
 }

+ 0 - 0
mec-biz/src/main/resources/config/contracts/product.ftl → mec-biz/src/main/resources/config/contracts/product2.ftl


+ 213 - 0
mec-biz/src/main/resources/config/contracts/product3.ftl

@@ -0,0 +1,213 @@
+<!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: 18px;
+            text-align: center;
+            margin-bottom: 8px;
+        }
+        h2 {
+            font-size: 16px;
+            font-weight: bold;
+            padding-top: 15px;
+        }
+        h3 {
+            font-size: 14px;
+            font-weight: bold;
+        }
+        .signature {
+            padding-top: 50px;
+            padding-bottom: 20px;
+        }
+        .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;
+        }
+
+        .underline {
+            text-decoration: underline;
+        }
+        .bold {
+            font-weight: bold;
+        }
+        .highlight{
+            color: red;
+        }
+    </style>
+</head>
+<body style="font-family:'SimSun'">
+    <div class="container">
+        <h1>《产品与服务协议》</h1>
+        <!-- 甲方:深圳大雅乐盟网络教育股份有限公司 <br/> -->
+        <#if ownershipType == 'OWN'>
+		甲方:深圳大雅乐盟网络教育股份有限公司
+		<#else>
+		甲方:武汉长乐长风乐器销售有限公司
+		</#if>
+		<br/>
+        <div style="display: flex;">乙方:
+            <div style="flex: 1 auto;">
+                <div class="iInfo">
+                    <span>家长姓名:${studentInfo.realName!}</span>
+                    <span>电话:${studentInfo.phone!}</span>
+                </div>
+                <#if studentInfo.certificateType == 'IDENTITY'>
+                    <div class="iInfo">
+                        <span>身份证号:${studentInfo.idCardNo!}</span>
+                    </div>
+                </#if>
+                <div class="iInfo">
+                    <span>学生姓名:${studentInfo.username!}</span>
+                </div>
+                <#if studentInfo.grade?default("")?trim?length gt 1>
+                <div class="iInfo">
+                    <span>所在班级:${studentInfo.grade!} ${studentInfo.clazz!}</span>
+                </div>
+                </#if>
+                <#if studentInfo.subject.name?default("")?trim?length gt 1>
+                <div class="iInfo">
+                    <span>所在声部:${studentInfo.subject.name!}</span>
+                </div>
+                </#if>
+            </div>
+        </div>
+        <div>(本协议中“乙方“指学员及家长;”乙方学员“指购买甲方产品或服务的学员;”乙方家长“仅指乙方学员的法定监护人。)</div>
+
+        <p class="underline bold">重要须知:在注册或购买使用甲方提供的产品、服务之前,请您务必审慎阅读、充分理解本使用协议各条款内容, 特别是免除或者限制甲方责任的条款、对您权利进行限制的条款、约定争议解决方式和司法管辖的条款等。 限制、免责条款或者其他涉及您重大权益的条款可能以加粗、加下划线等形式提示您重点注意。您注册或购买使用甲方提供的产品和服务,均视为您同意本使用协议,以及同意接受本使用协议的约束。</p>
+        <p class="underline bold">如无特别说明 ,下列术语在本协议中的定义为:管乐迷平台(下称“本平台”),即管乐迷APP;AMR器乐练习系统(下称“本系统”)指由甲方提供和维护的器乐教学全流程辅助系统。乙方通过该系统完成器乐学习。本系统提供包括媒体资料,老师互动点评,课前中后管理等服务。具体功能以该系统实际提供为准,且该系统将根据实际需要进行调整和增减,乙方使用平台时还需遵守本服务协议。</p>
+
+        <h2>一、注册及购买</h2>
+        <div>1、无论是否源自甲方建议,乙方选择报名注册加入乐团,或选择购买使用甲方提供的产品和服务,均为乙方自主意愿的表达及独立自主的选择。</div>
+        2、乙方完成所选产品或服务缴费后,甲方向乙方开具加盖公司印章的收款凭据,乙方务必妥善保管。
+
+        <h2>二、乐团及上课规范</h2>
+        1、乙方学员在应服从甲方的管理,遵守甲方的制度。<br />
+        2、乙方学员应按时到达甲方指定上课地点,作好课前准备;如发生迟到、早退或因其他乙方原因未能按时上课的,视为乙方学员放弃该次课程,为避免影响老师后续课程的正常进行,授课老师除完成原定时间安排的授课外,将不再提供额外延长课时,也不会因乙方学员缺席而暂停教学课程。<br />
+        3、乙方学员不得携带任何食品进入教室,所有进食应在课前完成;进入教室后,不得大声喧哗、追逐嬉戏,应当听从授课老师的安排;乙方学员应爱护公共财产和教学设施,严禁在桌椅上刻、划、涂、写等不文明行为;乙方学员未经授课老师同意,不得擅自使用教室内的乐器、音响、电视、空调等器材、设施,如造成此类器材、设施损坏的,乙方应照价赔偿。<br />
+        4、未经授课老师同意,乙方家长不得进入课堂,以免影响老师和学员上课;为保证训练质量及进度,乙方学员应保证按照指导老师或教务老师所提出的要求在家练习,遇到专业问题应及时向指导老师请教,非专业问题可随时向教务老师反映。<br />
+        5、乙方家长应教育及监督乙方学员务必注意个人安全,妥善保管个人财物,对于非甲方原因造成的人身安全事故或财物损失,由乙方自行承担。<br />
+        6、对于乐团学员出现以下情形时,甲方有权对乙方学员作出警告,如甲方作出警告后,乙方学员仍然不遵守甲方的管理制度的,甲方有权对其作出退团等处分。<br />
+        &#160;&#160;6.1上课、排练时不服从管理和指导,不遵守纪律,影响其他团员的正常上课、排练;<br />
+        &#160;&#160;6.2一个学期内发生两次及以上旷课行为;<br />
+        &#160;&#160;6.3一个学期内发生两次及以上未按老师要求回传视频作业的情形;<br />
+        &#160;&#160;6.4无特殊原因连续七天不练习,影响团员和乐团的整体水平的。<br />
+
+        <h2>三、请假</h2>
+        1、基于教学进度和质量保证,甲方对于课程延续性有严格要求,因此乙方学员应尽量参加课程,无特殊情况则应避免请假。
+        <div>2、VIP课程学员如有特殊情况需要请假的,应提前4小时以上通过管乐迷APP完成请假,否则当次课程将视同发生,系统将自动记录结算课时并扣除相应课程费用。</div>
+        VIP课程为一对二课程的,其中一位学员申请临时休会的,还需征得同组另一位学员的同意后方可申请休会。否则将不予受理。
+        <div>3、鉴于团体课的特殊性,团体课学员个人请假,当次课程仍视同发生。</div>
+
+        <h2>四、退费</h2>
+        1、乐器、教辅、配件等,未经签收,自购买缴款之日起15日内提出申请可全额退还,超过上述期限则不予受理退费申请;非因商品本身存在质量问题,一经签收,无论使用与否,均不予退费;<br />
+        2、乐保服务,在维修老师下校检查前提出申请可全额退还,下校检查日过后则不予退费;<br />
+        3、AMR器乐练习系统服务,自购买缴款之日起15日内提出申请可全额退还,超过上述期限或实际已提供相应服务则一律不予受理退费;<br />
+        4、正价购买的个别课程,包括但不限于VIP课程项下一对一、网管课等,课程有效期内可申请退费,可退款金额为:购买金额-课时原价*已消耗课时数量;<br />
+        5、活动期间以优惠价格购买的个别课程,自购买缴款之日起15日内提出申请可全额退还,超过上述期限或实际已发生课时消耗的则一律不予受理退费;<br />
+
+        <h2>五、违约责任</h2>
+        1、当事人一方不履行合同义务或者履行合同义务不符合约定的,均构成违约,守约方有权以书面通知的方式要求违约方纠正其违约行为并采取及时、有效的补救措施消除违约后果,并赔偿守约方因违约方之违约行为而遭致的损失。若违约方在收到守约方的上述通知后5日内未纠正其违约行为的,守约方有权在做出书面通知的情况下,单方解除本协议,违约方应赔偿守约方因此遭致的全部损失,包括但不限于守约方因此支付的律师费,差旅费等。<br />
+        2、乙方应始终维护甲方的知识产权以及品牌形象,本协议期间以及本协议因任何原因失效、被撤销、解除或终止后,均不得直接或间接通过任何公众媒体(包括但不限于传统大众媒体,以及微信、微博、博客、直播平台等社交平台)发表损害甲方(包括但不限于其产品、服务及甲方授课老师)声誉的言论或实施任何类似行为,否则乙方应赔偿甲方因此遭受的全部损失,包括但不限于守约方因此支付的律师费,差旅费等。<br />
+
+        <h2>六、保密条款</h2>
+        1、双方对本协议的条款、本协议的签订及履行情况以及通过签订和履行本协议而获知的对方及对方关联公司的任何信息均负有保密义务。任何一方不得以任何形式透露给第三方(有关法律法规要求和甲乙双方的法律、会计顾问、授权雇员除外),也不得擅自使用。<br />
+        2、本保密义务期限不受本协议期限的限制。本协议失效、被撤销、解除或终止等任何情况下,双方均应遵守本保密义务。<br />
+
+        <h2>七、不可抗力</h2>
+        1、一方遇到不可抗力事件(指甲乙双方无法控制、无法预见或即使预见也无法避免的事件,该事件妨碍、影响或延误任何一方履行本协议的全部或部分义务,该事件包括但不限于自然灾害(如水灾、地震等)、火灾、政府行为、法律或政策变化(含学校合作变化)、战争或其他任何类似事件)时,受影响方应当立即书面通知对方,并告知该不可抗力事件对本协议可能产生的影响,并在该不可抗力事件发生后5日内向对方提供该事件的详细信息及由有关机构出具的解释受影响方因此无法履行本协议项下全部或部分义务的相关证明。<br />
+        2、由于上述不可抗力事件致使受影响方无法履行或无法按时履行本协议项下全部或部分义务的,双方于彼此间均不承担违约责任,但双方应在相互信任的基础上协商解决,尽力减少不可抗力事件对本协议的影响,并采取合理方式进行调整(包括但不限于另行签订补充协议等),尽量避免损失的扩大。<br />
+        3、不可抗力事件消失或结束后,除双方另行协商一致外,受到不可抗力影响的一方应当立即采取措施继续履行本协议,如不可抗力事件持续30日以上的,则任何一方有权以书面通知对方的方式单方解除本协议。<br />
+
+        <h2>八、适用法律及争议解决方式</h2>
+        1、本协议的订立、效力、履行、解释及争议解决均适用中华人民共和国法律。<br />
+        2、因履行本协议发生的一切争议,甲乙双方应友好协商解决;如双方在发生争议后30日内无法通过协商解决时,任何一方有权向甲方所在地有管辖权的人民法院提起诉讼解决。<br />
+
+        <h2>九、其他</h2>
+        1、乙方同意,甲方有权在乙方学习、上课、排练和活动期间对其拍摄照片、视频,甲方对所拍摄的照片、视频享有著作权,乙方同意甲方可合理使用该等照片、视频。<br />
+        2、未经甲方事先书面同意,乙方不得将本课程转让给乙方以外的任何第三方。<br />
+        3、双方确认并同意,本协议的电子版本与纸质版本具有同等法律效力。双方发生争议时,电子合同打印件可作为证据提交。双方通过网络以在线方式签订本协议的 ,则以乙方点击“确认”或“同意”等相关按钮或以电子签名的方式作为对合同内容的同意、确认以及本协议的签署;如双方签订纸质版本协议的,则本协议壹式贰份,甲方盖公章或合同专用章并且乙方签字作为有效签署方式,并且双方各执壹份,每份具有同等法律效力。<br />
+        4、本协议自双方按照本协议约定方式签署之日起生效,有效期至双方履行完本协议约定的全部义务时止。<br />
+        5、本协议未尽事宜或对本协议的任何修改、补充,有双方另行协商后以签订补充协议的方式解决,补充协议与本协议具有同等法律效力;双方没有约定也没有协商一致的,遵照相关法律法规规定执行。<br />
+        6、双方因履行本协议而相互发出或者提供的所有通知、文件、资料,均以本协议中所列明的电话、APP推送消息送达,乙方如果变更电话号码的,应当自变更后1日内通知甲方且获得甲方确认,甲方通过电话、APP方式无法联系乙方或者甲方认为必要时,甲方也可以通过特快专递至乙方住址的方式向乙方发出上述任何通知、文件、资料等,并在甲方寄出特快专递后第5日视为送达成功。<br />
+
+        <div class="signature">
+        	<#if isShowVisualSeal>
+        	<#if ownershipType == 'OWN'>
+            <div class="sign">甲方签章:深圳大雅乐盟网络教育股份有限公司<img class="cachet" src="https://daya-online.oss-cn-beijing.aliyuncs.com/website/cachet.png" alt="" />
+                <span>日期:${.now?string("yyyy年MM月dd日")}</span>
+            </div>
+            <#else>
+            <div class="sign">甲方签章:武汉长乐长风乐器销售有限公司<img class="cachet" src="https://daya-online.oss-cn-beijing.aliyuncs.com/website/clcf.png" alt="" />
+                <span>日期:${.now?string("yyyy年MM月dd日")}</span>
+            </div>
+            </#if>
+            <div class="sign">乙方签章:${studentInfo.realName!}
+                <span>日期:${.now?string("yyyy年MM月dd日")} </span>
+            </div>
+        	<#else>
+        	<#if ownershipType == 'OWN'>
+            <div class="sign">甲方签章:深圳大雅乐盟网络教育股份有限公司
+                <span>日期:${.now?string("yyyy年MM月dd日")}</span>
+            </div>
+            <#else>
+            <div class="sign">甲方签章:武汉长乐长风乐器销售有限公司
+                <span>日期:${.now?string("yyyy年MM月dd日")}</span>
+            </div>
+            </#if>
+            <div class="sign">乙方签章:
+                <span>日期:${.now?string("yyyy年MM月dd日")} </span>
+            </div>
+        	</#if>
+        </div>
+    </div>
+</body>
+</html>

+ 2 - 2
mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml

@@ -83,7 +83,7 @@
                 #{cooperationOrganId}, #{enlightenmentCourseTime}, #{parentMeetingTime}, #{img}, #{directorUserId},
                 #{isClassroomLessons}, #{memo}, #{expectStartGroupDate},
                 #{ownershipType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{repairUserId},
-                #{delFlag},#{paymentValidStartDate},#{paymentValidEndDate},#{paymentPattern},#{courseViewType})
+                #{delFlag},#{paymentValidStartDate},#{paymentValidEndDate},#{paymentPattern},#{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -174,7 +174,7 @@
                 group_member_num_ = #{groupMemberNum},
             </if>
             <if test="courseViewType != null">
-                course_view_type_ = #{courseViewType},
+                course_view_type_ = #{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
             <if test="memo != null">
                 memo_ = #{memo},

+ 13 - 0
mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml

@@ -797,6 +797,19 @@
             </foreach>
         ORDER BY mg.create_time_ DESC
     </select>
+    <select id="getUserLastNormalMusicGroup" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.MusicGroup">
+        SELECT DISTINCT
+            mg.*
+        FROM
+            student_registration sr
+            LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
+        WHERE
+            mg.del_flag_ = 0
+            AND mg.status_ = 'PROGRESS'
+            AND sr.music_group_status_ = 'NORMAL'
+            AND sr.user_id_ = #{userId}
+        ORDER BY sr.create_time_ DESC LIMIT 1
+    </select>
     <select id="getStudentNormalRegistration" resultMap="StudentRegistration">
         SELECT
                sr.*

+ 14 - 1
mec-biz/src/main/resources/config/mybatis/SysUserContractsMapper.xml

@@ -86,10 +86,23 @@
 	</select>
 
 	<select id="getUserContractWithType" resultMap="SysUserContracts">
-		SELECT * FROM sys_user_contracts WHERE user_id_=#{userId} AND type_=#{contractType} AND version_=#{version}
+		SELECT * FROM sys_user_contracts
+		WHERE user_id_=#{userId}
+		  AND type_=#{contractType}
+		  <if test="version!=null">
+			  AND version_=#{version}
+		  </if>
 	</select>
 
 	<select id="getLatestUserContract" resultMap="SysUserContracts">
 		SELECT * FROM sys_user_contracts WHERE user_id_=#{userId} order by id_ desc limit 0,1
 	</select>
+
+	<select id="getUserAllContract" resultMap="SysUserContracts">
+		SELECT * FROM sys_user_contracts
+		WHERE user_id_ IN
+		<foreach collection="userIds" item="userId" open="(" close=")" separator=",">
+			#{userId}
+		</foreach>
+	</select>
 </mapper>

+ 23 - 5
mec-web/src/main/java/com/ym/mec/web/controller/SysUserContractsController.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiOperation;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -14,6 +15,11 @@ import com.ym.mec.biz.service.SysUserContractsService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
 @RequestMapping("sysUserContracts")
 @Api(tags = "用户协议服务")
 @RestController
@@ -25,15 +31,27 @@ public class SysUserContractsController extends BaseController {
     @ApiOperation(value = "查询学生最新协议")
     @GetMapping("/getLatest")
     @PreAuthorize("@pcs.hasPermissions('sysUserContracts/getLatest')")
-	public HttpResponseResult<SysUserContracts> getLatest(Integer userId) {
-		
-		SysUserContracts sysUserContracts = sysUserContractsService.getLatestUserContract(userId);
+	public HttpResponseResult<SysUserContracts> getLatest(Integer userId, Integer version) {
 		
-		if(sysUserContracts == null){
+//		SysUserContracts sysUserContracts = sysUserContractsService.getLatestUserContract(userId);
+		List<SysUserContracts> sysUserContracts = sysUserContractsService.getUserAllContracts(userId);
+		if(Objects.isNull(version)){
+			version = 2;
+		}
+
+		if(CollectionUtils.isEmpty(sysUserContracts)){
+			return failed("该学员尚未签署协议");
+		}
+
+		Integer finalVersion = version;
+		List<SysUserContracts> versionContracts = sysUserContracts.stream().filter(c -> c.getVersion().equals(finalVersion)).collect(Collectors.toList());
+
+		if(CollectionUtils.isEmpty(versionContracts)){
 			return failed("该学员尚未签署协议");
 		}
 
-		return succeed(sysUserContracts);
+		versionContracts.sort(Comparator.comparing(SysUserContracts::getCreateTime).reversed());
+		return succeed(versionContracts.get(0));
 	}
 
 }