瀏覽代碼

Merge branch 'online1' into grade_feature

周箭河 4 年之前
父節點
當前提交
3bb7fb75a5
共有 33 個文件被更改,包括 590 次插入138 次删除
  1. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  2. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserContractsDao.java
  3. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentManageListDto.java
  4. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Goods.java
  5. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroup.java
  6. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupSubjectGoodsGroup.java
  7. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrderDetail.java
  8. 33 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/CourseViewTypeEnum.java
  9. 0 3
      mec-biz/src/main/java/com/ym/mec/biz/service/ContractService.java
  10. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java
  11. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserContractsService.java
  12. 6 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  13. 31 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  14. 50 46
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  15. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  16. 17 14
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectPlanServiceImpl.java
  17. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  18. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java
  19. 26 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  20. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentVisitServiceImpl.java
  21. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java
  22. 8 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserContractsServiceImpl.java
  23. 4 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherDefaultPracticeGroupSalaryServiceImpl.java
  24. 212 0
      mec-biz/src/main/resources/config/contracts/product2.ftl
  25. 17 21
      mec-biz/src/main/resources/config/contracts/product3.ftl
  26. 16 4
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  27. 4 3
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  28. 6 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  29. 2 1
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  30. 13 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  31. 16 1
      mec-biz/src/main/resources/config/mybatis/SysUserContractsMapper.xml
  32. 2 1
      mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java
  33. 18 5
      mec-web/src/main/java/com/ym/mec/web/controller/SysUserContractsController.java

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

@@ -462,4 +462,13 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
      * @return java.util.List<com.ym.mec.biz.dal.entity.MusicGroup>
      */
     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);
 }

+ 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);
 	
     /**
      * 获取最近一次的协议

+ 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;
     }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Goods.java

@@ -111,6 +111,7 @@ public class Goods {
 	private String complementGoodsIdList;
 
 	/** 辅件列表 */
+	@ApiModelProperty(value = "辅件列表(子商品)",required = false)
 	private List<Goods> goodsList;
 
 	/** 声部列表编号 */

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroup.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.entity;
 
+import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.util.Date;
@@ -76,6 +77,9 @@ public class MusicGroup {
 
 	@ApiModelProperty(value = "老师课酬结算方式",required = false)
 	private SalarySettlementTypeEnum settlementType;
+
+	@ApiModelProperty(value = "课程展现形式",required = false)
+	private CourseViewTypeEnum courseViewType;
 	
 	/**  */
 	private java.util.Date createTime;
@@ -568,4 +572,12 @@ public class MusicGroup {
 	public void setHasVerifyMusicalList(Boolean hasVerifyMusicalList) {
 		this.hasVerifyMusicalList = hasVerifyMusicalList;
 	}
+
+	public CourseViewTypeEnum getCourseViewType() {
+		return courseViewType;
+	}
+
+	public void setCourseViewType(CourseViewTypeEnum courseViewType) {
+		this.courseViewType = courseViewType;
+	}
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupSubjectGoodsGroup.java

@@ -64,6 +64,10 @@ public class MusicGroupSubjectGoodsGroup {
 	private String coursePurchaseTypeJson;
 
 
+	@ApiModelProperty(value = "子商品列表",required = false)
+	private List<Goods> childGoodsList;
+
+
 	/**  */
 	private java.util.Date createTime;
 	
@@ -215,4 +219,12 @@ public class MusicGroupSubjectGoodsGroup {
 	public void setGroupRemissionCourseFee(Integer groupRemissionCourseFee) {
 		this.groupRemissionCourseFee = groupRemissionCourseFee;
 	}
+
+	public List<Goods> getChildGoodsList() {
+		return childGoodsList;
+	}
+
+	public void setChildGoodsList(List<Goods> childGoodsList) {
+		this.childGoodsList = childGoodsList;
+	}
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrderDetail.java

@@ -51,6 +51,9 @@ public class StudentPaymentOrderDetail {
 	//减免费用
 	private BigDecimal remitFee;
 
+	@ApiModelProperty(value = "子商品列表",required = false)
+	private List<Goods> childGoodsList;
+
 	public void setId(Long id){
 		this.id = id;
 	}
@@ -143,4 +146,12 @@ public class StudentPaymentOrderDetail {
 	public void setRemitFee(BigDecimal remitFee) {
 		this.remitFee = remitFee;
 	}
+
+	public List<Goods> getChildGoodsList() {
+		return childGoodsList;
+	}
+
+	public void setChildGoodsList(List<Goods> childGoodsList) {
+		this.childGoodsList = childGoodsList;
+	}
 }

+ 33 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/CourseViewTypeEnum.java

@@ -0,0 +1,33 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+public enum CourseViewTypeEnum implements BaseEnum<Integer, CourseViewTypeEnum> {
+    COURSE_lIST(0,"课程详情"),
+    AMR(1,"器乐练习系统");
+
+    private Integer code;
+
+    private String msg;
+
+    CourseViewTypeEnum(Integer code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    @Override
+    public Integer getCode() {
+        return this.code;
+    }}

+ 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

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java

@@ -139,4 +139,12 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
 	 * @return
 	 */
 	List<StudentPaymentOrder> reConfirmOrder(Date startTime,Date endTime);
+
+	/**
+	 * 获取学生报名的订单
+	 * @param studentId
+	 * @param musicGroupId
+	 * @return
+	 */
+	List<StudentPaymentOrderExportDto> getUserApplyOrders(Integer studentId,String musicGroupId);
 }

+ 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);
 }

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

@@ -454,12 +454,12 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         //线上基础技能班,原始分班人数不能小于3人大于6人
         if (classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE)) {
 
-            if (studentIds.size() < 3 && musicGroup.getStatus().equals(MusicGroupStatusEnum.PREPARE)) {
-                throw new BizException("线上基础技能班人数不能少于3人");
-            }
-            if (studentIds.size() < 3 && !musicGroup.getStatus().equals(MusicGroupStatusEnum.PREPARE) && oldNormalStudentIds.size() <= 0) {
-                throw new BizException("线上基础技能班人数不能少于3人");
-            }
+//            if (studentIds.size() < 3 && musicGroup.getStatus().equals(MusicGroupStatusEnum.PREPARE)) {
+//                throw new BizException("线上基础技能班人数不能少于3人");
+//            }
+//            if (studentIds.size() < 3 && !musicGroup.getStatus().equals(MusicGroupStatusEnum.PREPARE) && oldNormalStudentIds.size() <= 0) {
+//                throw new BizException("线上基础技能班人数不能少于3人");
+//            }
             if (studentIds.size() > 6) {
                 throw new BizException("线上基础技能班人数不能多于6人");
             }

+ 31 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java

@@ -5,10 +5,13 @@ import java.io.IOException;
 import java.math.BigDecimal;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
 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 +27,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 +84,9 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 	private StudentRegistrationService studentRegistrationService;
 
 	@Autowired
+	private StudentRegistrationDao studentRegistrationDao;
+
+	@Autowired
 	private StudentPaymentOrderService studentPaymentOrderService;
 
 	@Autowired
@@ -971,11 +973,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;
@@ -993,7 +990,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		Date date = new Date();
 
 		// 合成freemarker
-		String srcPdfPath = contractBaseDir + "/product/" + dateFormat1.format(date) + "/" + userId + ".pdf";
+		String srcPdfPath = contractBaseDir + "/product/" + dateFormat1.format(date) + "/" + userId + "_" + LocalDateTime.now().getSecond() + ".pdf";
 
 		File srcFile = new File(srcPdfPath);
 
@@ -1013,8 +1010,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 +1025,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 +1071,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 +1107,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 +1136,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;

+ 50 - 46
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -3,9 +3,7 @@ package com.ym.mec.biz.service.impl;
 import static com.ym.mec.biz.dal.enums.GroupType.MUSIC;
 import static com.ym.mec.biz.dal.enums.GroupType.PRACTICE;
 import static com.ym.mec.biz.dal.enums.GroupType.VIP;
-import static com.ym.mec.biz.dal.enums.PracticeGroupType.CHARGE;
-import static com.ym.mec.biz.dal.enums.PracticeGroupType.FREE;
-import static com.ym.mec.biz.dal.enums.PracticeGroupType.TRIAL;
+import static com.ym.mec.biz.dal.enums.PracticeGroupType.*;
 
 import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
@@ -3325,6 +3323,13 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				// 删除课酬
 				List<Long> courseScheduleIdList = new ArrayList<Long>();
 				courseScheduleIdList.add(courseScheduleId);
+
+				List<CourseScheduleTeacherSalary> oldCourseScheduleTeacherSalaryList = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseScheduleIds);
+				Map<Long, List<CourseScheduleTeacherSalary>> courseSalaryListMap = new HashMap<>();
+				if(!CollectionUtils.isEmpty(oldCourseScheduleTeacherSalaryList)){
+					courseSalaryListMap = oldCourseScheduleTeacherSalaryList.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getCourseScheduleId));
+				}
+
 				courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIdList);
 
 				for (Integer teacherId : newTeacherIdList) {
@@ -3357,20 +3362,20 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 						ts.setExpectSalary(teacherSalary);
 
 					} else if (newCourseSchedule.getGroupType() == PRACTICE) {
-						PracticeGroup practiceGroup = practiceGroupDao.get(Long.valueOf(newCourseSchedule.getMusicGroupId()));
-						if(Objects.isNull(practiceGroup)){
-							throw new BizException("课程组信息错误");
-						}
+						SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
+						BigDecimal freeTeacherSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
+
 						List<TeacherDefaultPracticeGroupSalary> teacherDefaultPracticeGroupSalaryList = teacherDefaultPracticeGroupSalaryDao
 								.queryByUserId(teacherId);
-						if (teacherDefaultPracticeGroupSalaryList != null && teacherDefaultPracticeGroupSalaryList.size() > 0) {
-							ts.setExpectSalary(teacherDefaultPracticeGroupSalaryList.get(0).getMainTeacherSalary());
-						} else {
-							throw new BizException("请设置老师 的网管课课酬");
-						}
-						if(Objects.nonNull(practiceGroup)&& !PracticeGroupType.CHARGE.equals(practiceGroup.getType()) && !PracticeGroupType.COME_ON_PACKAGE.equals(practiceGroup.getType())){
-							SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
-							ts.setExpectSalary(new BigDecimal(practiceCourseSalaryConfig.getParanValue()));
+						List<CourseScheduleTeacherSalary> teacherSalaries = courseSalaryListMap.get(ts.getCourseScheduleId());
+						if(!CollectionUtils.isEmpty(teacherSalaries)&&freeTeacherSalary.compareTo(teacherSalaries.get(0).getExpectSalary())==0){
+							ts.setExpectSalary(freeTeacherSalary);
+						}else{
+							if (teacherDefaultPracticeGroupSalaryList != null && teacherDefaultPracticeGroupSalaryList.size() > 0) {
+								ts.setExpectSalary(teacherDefaultPracticeGroupSalaryList.get(0).getMainTeacherSalary());
+							} else {
+								throw new BizException("请设置老师 的网管课课酬");
+							}
 						}
 					}
 					if(ts.getExpectSalary() == null){
@@ -4571,26 +4576,26 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         courseScheduleDao.update(oldCourseSchedule);
 
         PracticeGroup practiceGroup = practiceGroupDao.get(Long.valueOf(oldCourseSchedule.getMusicGroupId()));
-		if(practiceGroup.getType() != TRIAL){
-			if(practiceGroup.getType() != FREE){
+
+		List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedule(courseScheduleId);
+		if(!CollectionUtils.isEmpty(courseScheduleTeacherSalaries)){
+			SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
+			BigDecimal teacherSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
+			for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
+				courseScheduleTeacherSalary.setUserId(teacherId);
+				if(teacherSalary.compareTo(courseScheduleTeacherSalary.getExpectSalary())==0){
+					continue;
+				}
 				List<TeacherDefaultPracticeGroupSalary> teacherDefaultPracticeGroupSalaries = teacherDefaultPracticeGroupSalaryDao.queryByUserId(teacherId);
 				if(teacherDefaultPracticeGroupSalaries == null || teacherDefaultPracticeGroupSalaries.size() == 0){
 					throw new BizException("请设置老师默认课酬");
 				}
-				courseScheduleTeacherSalaryDao.batchUpdateTeacher(courseScheduleIds,teacherId);
-			}else{
-				List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedule(courseScheduleId);
-				if(!CollectionUtils.isEmpty(courseScheduleTeacherSalaries)){
-					SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
-					BigDecimal teacherSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
-					for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
-						courseScheduleTeacherSalary.setUserId(teacherId);
-						courseScheduleTeacherSalary.setExpectSalary(teacherSalary);
-					}
-					courseScheduleTeacherSalaryDao.batchUpdate(courseScheduleTeacherSalaries);
-				}
+				courseScheduleTeacherSalary.setExpectSalary(teacherDefaultPracticeGroupSalaries.get(0).getMainTeacherSalary());
 			}
+			courseScheduleTeacherSalaryDao.batchUpdate(courseScheduleTeacherSalaries);
 		}
+
+
         teacherAttendanceDao.batchUpdateTeacher(courseScheduleIds,teacherId);
 		//删除申述
 		courseScheduleComplaintsDao.delByCourseScheduleId(courseScheduleId);
@@ -4675,25 +4680,24 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			courseScheduleDao.batchUpdate(courseSchedules);
 			Set<Long> courseScheduleIds = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toSet());
 			if(practiceGroup.getType() != TRIAL){
-				if(CHARGE == practiceGroup.getType()){
-					List<TeacherDefaultPracticeGroupSalary> teacherDefaultPracticeGroupSalaries = teacherDefaultPracticeGroupSalaryDao.queryByUserId(teacherId);
-					if(teacherDefaultPracticeGroupSalaries == null || teacherDefaultPracticeGroupSalaries.size() == 0){
-						throw new BizException("请设置老师默认课酬");
-					}
-					courseScheduleTeacherSalaryDao.batchUpdateTeacher(courseScheduleIds,teacherId);
-				}else{
-					List<CourseSchedule> groupNotStartCourses = courseScheduleDao.findGroupNotStartCourses(practiceGroupId, PRACTICE);
-					if(!CollectionUtils.isEmpty(groupNotStartCourses)){
-						SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
-						BigDecimal teacherSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
-						List<Long> courseIds = groupNotStartCourses.stream().map(CourseSchedule::getId).collect(Collectors.toList());
-						List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseIds);
-						for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
-							courseScheduleTeacherSalary.setUserId(teacherId);
-							courseScheduleTeacherSalary.setExpectSalary(teacherSalary);
+				List<CourseSchedule> groupNotStartCourses = courseScheduleDao.findGroupNotStartCourses(practiceGroupId, PRACTICE);
+				if(!CollectionUtils.isEmpty(groupNotStartCourses)){
+					SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
+					BigDecimal teacherSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
+					List<Long> courseIds = groupNotStartCourses.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+					List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseIds);
+					for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
+						courseScheduleTeacherSalary.setUserId(teacherId);
+						if(teacherSalary.compareTo(courseScheduleTeacherSalary.getExpectSalary())==0){
+							continue;
 						}
-						courseScheduleTeacherSalaryDao.batchUpdate(courseScheduleTeacherSalaries);
+						List<TeacherDefaultPracticeGroupSalary> teacherDefaultPracticeGroupSalaries = teacherDefaultPracticeGroupSalaryDao.queryByUserId(teacherId);
+						if(teacherDefaultPracticeGroupSalaries == null || teacherDefaultPracticeGroupSalaries.size() == 0){
+							throw new BizException("请设置老师默认课酬");
+						}
+						courseScheduleTeacherSalary.setExpectSalary(teacherDefaultPracticeGroupSalaries.get(0).getMainTeacherSalary());
 					}
+					courseScheduleTeacherSalaryDao.batchUpdate(courseScheduleTeacherSalaries);
 				}
 			}
 			teacherAttendanceDao.batchUpdateTeacher(courseScheduleIds,teacherId);

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

@@ -21,6 +21,8 @@ import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.*;
 import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
@@ -229,6 +231,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     private SubjectDao subjectDao;
     @Autowired
     private SysUserCashAccountDao sysUserCashAccountDao;
+    @Autowired
+    private ContractService contractService;
 
     @Autowired
     private StudentPreRegistrationDao studentPreRegistrationDao;
@@ -239,6 +243,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     private SimpleDateFormat sdf_ymdhms = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
     @Override
     public BaseDAO<String, MusicGroup> getDAO() {
         return musicGroupDao;
@@ -2367,6 +2373,13 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                         studentRegistration.getName(), studentPaymentOrder.getActualAmount());
             }
             studentRegistrationService.updateUserSurplusCourseFee(userId, musicGroupId, studentPaymentOrder.getExpectAmount(), "乐团续费", userId);
+
+            try {
+                contractService.transferProduceContract(userId, musicGroupId);
+            } catch (Exception e) {
+                logger.error("产品协议生成失败", e);
+            }
+
             return true;
         } else {
             if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().doubleValue() > 0) {

+ 17 - 14
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectPlanServiceImpl.java

@@ -10,6 +10,7 @@ import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.MusicGroupGoodsAndDiscountDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -107,24 +108,26 @@ public class MusicGroupSubjectPlanServiceImpl extends BaseServiceImpl<Integer, M
         //乐团乐器及辅件信息
         List<MusicGroupSubjectGoodsGroup> goodsGroups = musicGroupSubjectGoodsGroupService.findGoodsGroup(musicGroupId, subjectId);
 
-        List<Goods> accessoriesList = goodsService.findGoodsBySubId(subjectId, GoodsType.ACCESSORIES.getCode());
-
-        goodsGroups.forEach(goodsGroup -> {
-            if (goodsGroup.getType().equals(GoodsType.INSTRUMENT)) {
-                goodsGroup.getGoodsList().forEach(goods -> {
-                    goods.setGoodsList(accessoriesList);
-                });
+        for (MusicGroupSubjectGoodsGroup goodsGroup : goodsGroups) {
+            String childGoodIds = "";
+            for (Goods goods : goodsGroup.getGoodsList()) {
+                if (StringUtils.isNotBlank(goods.getComplementGoodsIdList())) {
+                    childGoodIds += StringUtils.isNotBlank(childGoodIds) ? "," : "" + goods.getComplementGoodsIdList();
+                }
             }
-        });
-        //获取声部(科目)下其他商品
-        List<Goods> otherGoods = goodsService.findTypeGoods("OTHER");
+            if(StringUtils.isNotBlank(childGoodIds)) {
+                goodsGroup.setChildGoodsList(goodsDao.findGoodsByIds(childGoodIds));
+            }
+        }
+
 
+        //获取声部(科目)下其他商品
         MusicGroupSubjectGoodsAndInfoDto musicGroupSubjectGoodsAndInfo = new MusicGroupSubjectGoodsAndInfoDto();
         musicGroupSubjectGoodsAndInfo.setMusicGroupSubjectPlan(musicOneSubjectClassPlan);
         musicGroupSubjectGoodsAndInfo.setCourseScheduleInfo(courseForm);
         musicGroupSubjectGoodsAndInfo.setMusicGroupPaymentCalender(musicGroupRegCalender);
         musicGroupSubjectGoodsAndInfo.setMusicGroupSubjectGoodsGroupList(goodsGroups);
-        musicGroupSubjectGoodsAndInfo.setOtherGoods(otherGoods);
+        musicGroupSubjectGoodsAndInfo.setMusicGroup(musicGroup);
         return musicGroupSubjectGoodsAndInfo;
     }
 
@@ -144,14 +147,14 @@ public class MusicGroupSubjectPlanServiceImpl extends BaseServiceImpl<Integer, M
     }
 
     @Override
-    public void addApplyStudentNum(String musicGroupId, Integer subjectId, int num){
+    public void addApplyStudentNum(String musicGroupId, Integer subjectId, int num) {
         boolean flag = false;
         for (int i = 10; i >= 1; i--) {
             MusicGroupSubjectPlan musicOneSubjectClassPlan = musicGroupSubjectPlanDao.getMusicOneSubjectClassPlan(musicGroupId, subjectId);
-            if(musicOneSubjectClassPlan == null){
+            if (musicOneSubjectClassPlan == null) {
                 MusicGroup musicGroup = musicGroupService.get(musicGroupId);
                 Subject subject = subjectService.get(subjectId);
-                throw new BizException("操作失败:{}乐团缺少{}声部",musicGroup.getName(),subject.getName());
+                throw new BizException("操作失败:{}乐团缺少{}声部", musicGroup.getName(), subject.getName());
             }
             int applyNum = musicOneSubjectClassPlan.getApplyStudentNum() == null ? 0 : musicOneSubjectClassPlan.getApplyStudentNum();
             musicOneSubjectClassPlan.setApplyStudentNum(applyNum + num);

+ 16 - 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())));
+        }
+
         StudentListCourseDto studentListCourseDto = null;
         for (StudentManageListDto dto : dataList) {
             studentListCourseDto = StudentListCourseDtoMap.get(dto.getUserId());
@@ -153,6 +162,13 @@ 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()), ","));
+                dto.setIsSignedContract(true);
+            }else{
+                dto.setIsSignedContract(false);
+            }
         }
 
         if (queryInfo.getIsExport()) {

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java

@@ -231,6 +231,8 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
                     goods.setSellCount(goods.getSellCount() + 1);
                 }
             }
+            if(StringUtils.isBlank(goods.getComplementGoodsIdList())) continue;
+            goods.setGoodsList(goodsService.findGoodsByIds(goods.getComplementGoodsIdList()));
         }
         return goodies;
     }

+ 26 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -11,6 +11,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
@@ -18,10 +20,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.alibaba.fastjson.JSON;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentRouteOrderDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dto.PageInfoOrder;
 import com.ym.mec.biz.dal.dto.SporadicChargeInfoDto;
 import com.ym.mec.biz.dal.dto.StudentPaymentOrderDto;
@@ -95,6 +93,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private IdGeneratorService idGeneratorService;
     @Autowired
     private SysConfigDao sysConfigDao;
+    @Autowired
+    private GoodsDao goodsDao;
 
     @Override
     public BaseDAO<Long, StudentPaymentOrder> getDAO() {
@@ -516,4 +516,26 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         }
         return orders;
     }
+
+    @Override
+    public List<StudentPaymentOrderExportDto> getUserApplyOrders(Integer studentId, String musicGroupId) {
+        List<StudentPaymentOrderExportDto> orders = studentPaymentOrderDao.getUserApplyOrders(studentId, musicGroupId);
+        for (StudentPaymentOrderExportDto order : orders) {
+            if(order.getOrderDetailList()==null) continue;
+            for (StudentPaymentOrderDetail studentPaymentOrderDetail : order.getOrderDetailList()) {
+                if(studentPaymentOrderDetail.getGoodsList()==null) continue;
+
+                String childGoodIds = "";
+                for (Goods goods : studentPaymentOrderDetail.getGoodsList()) {
+                    if (StringUtils.isNotBlank(goods.getComplementGoodsIdList())) {
+                        childGoodIds += StringUtils.isNotBlank(childGoodIds) ? "," : "" + goods.getComplementGoodsIdList();
+                    }
+                }
+                if(StringUtils.isNotBlank(childGoodIds)) {
+                    studentPaymentOrderDetail.setChildGoodsList(goodsDao.findGoodsByIds(childGoodIds));
+                }
+            }
+        }
+        return orders;
+    }
 }

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

@@ -53,13 +53,13 @@ public class StudentVisitServiceImpl extends BaseServiceImpl<Integer, StudentVis
         SysUser user = teacherDao.getUser(studentVisit.getStudentId());
         studentVisit.setOrganId(user.getOrganId());
         studentVisit.setCreateTime(now);
-        if(Objects.nonNull(studentVisit.getObjectId())){
+        if(Objects.nonNull(studentVisit.getObjectId()) && "考勤申诉".equals(studentVisit.getPurpose())){
             CourseScheduleStudentPayment courseScheduleStudentPayment = courseScheduleStudentPaymentDao.get(studentVisit.getObjectId());
             if(Objects.isNull(courseScheduleStudentPayment)){
                 throw new BizException("学员课程信息不存在");
             }
             StudentAttendance studentAttendance = studentAttendanceDao.findByStatusAndCourseScheduleId(courseScheduleStudentPayment.getUserId(), courseScheduleStudentPayment.getCourseScheduleId().intValue());
-            if (studentAttendance == null && "考勤申诉".equals(studentVisit.getPurpose())) {
+            if (studentAttendance == null) {
                 studentAttendance = new StudentAttendance();
                 studentAttendance.setClassGroupId(courseScheduleStudentPayment.getClassGroupId());
                 studentAttendance.setCourseScheduleId(courseScheduleStudentPayment.getCourseScheduleId());

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

@@ -456,7 +456,7 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
 
         if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
             try {
-                contractService.transferProduceContract(userId, null);
+                contractService.transferProduceContract(userId, subjectChange.getMusicGroupId());
             } catch (Exception e) {
                 logger.error("产品协议生成失败", e);
             }

+ 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));
+	}
 }

+ 4 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherDefaultPracticeGroupSalaryServiceImpl.java

@@ -87,6 +87,7 @@ public class TeacherDefaultPracticeGroupSalaryServiceImpl extends BaseServiceImp
 					}
 
 					SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
+					BigDecimal freeTeacherSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
 
 					Date date = new Date();
 
@@ -95,12 +96,10 @@ public class TeacherDefaultPracticeGroupSalaryServiceImpl extends BaseServiceImp
 					for (CourseScheduleTeacherSalary ts : updateTeacherSalaryList) {
 						if (origSalary != null && origSalary.getMainTeacherSalary().compareTo(ts.getExpectSalary()) == 0
 								&& origSalary.getMainTeacherSalary().compareTo(salary) != 0) {
-							PracticeGroup practiceGroup = idGroupMap.get(Long.valueOf(ts.getMusicGroupId()));
-							if(Objects.nonNull(practiceGroup)&& !PracticeGroupType.CHARGE.equals(practiceGroup.getType()) && !PracticeGroupType.COME_ON_PACKAGE.equals(practiceGroup.getType())){
-								ts.setExpectSalary(new BigDecimal(practiceCourseSalaryConfig.getParanValue()));
-							}else{
-								ts.setExpectSalary(salary);
+							if(freeTeacherSalary.compareTo(ts.getExpectSalary())==0){
+								continue;
 							}
+							ts.setExpectSalary(salary);
 							ts.setUpdateTime(date);
 							list.add(ts);
 						}

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

@@ -0,0 +1,212 @@
+<!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;
+            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 class="underline">(本协议中“乙方“指学员及家长;”乙方学员“指购买甲方产品或服务的学员;”乙方家长“仅指乙方学员的法定监护人。)</div>
+
+    <p class="underline bold">重要须知:在注册或购买使用甲方提供的产品、服务之前,请您务必审慎阅读、充分理解本使用协议各条款内容, 特别是免除或者限制甲方责任的条款、对您权利进行限制的条款、约定争议解决方式和司法管辖的条款等。 限制、免责条款或者其他涉及您重大权益的条款可能以加粗、加下划线等形式提示您重点注意。您注册或购买使用甲方提供的产品和服务,均视为您同意本使用协议,以及同意接受本使用协议的约束。</p>
+    <h2>一、注册及购买</h2>
+    <div >1、无论是否源自甲方建议,乙方选择报名注册加入乐团,或选择购买使用甲方提供的产品和服务,均为乙方自主意愿的表达及独立自主的选择。</div>
+    2、乙方完成所选产品或服务缴费后,甲方向乙方开具加盖公司印章的收款凭据,乙方务必妥善保管。
+
+    <h2>二、乐团及上课规范</h2>
+    1、乙方学员在应服从甲方的管理,遵守甲方的制度。<br />
+    2、乙方学员应按时到达甲方指定上课地点,做好课前准备;如发生迟到、早退或因其他乙方原因未能按时上课的,视为乙方学员放弃该次课程,为避免影响老师后续课程的正常进行,授课老师除完成原定时间安排的授课外,将不再提供额外延长课时,也不会因乙方学员缺席而暂停教学课程。<br />
+    3、乙方学员不得携带任何食品进入教室,所有进食应在课前完成;进入教室后,不得大声喧哗、追逐嬉戏,应当听从授课老师的安排;乙方学员应爱护公共财产和教学设施,严禁在桌椅上刻、划、涂、写等不文明行为;乙方学员未经授课老师同意,不得擅自使用教室内的乐器、音响、电视、空调等器材、设施,如造成此类器材、设施损坏的,乙方应照价赔偿。<br />
+    4、未经授课老师同意,乙方家长不得进入课堂,以免影响老师和学员上课;为保证训练质量及进度,乙方学员应保证按照指导老师或教务老师所提出的要求在家练习,遇到专业问题应及时向指导老师请教,非专业问题可随时向教务老师反映。<br />
+    <span>5、乙方家长应教育及监督乙方学员务必注意个人安全,妥善保管个人财物,对于非甲方原因造成的人身安全事故或财物损失,由乙方自行承担。</span><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、基于教学进度和质量保证,甲方对于课程延续性有严格要求,因此乙方学员应尽量参加课程,无特殊情况则应避免请假。<br />
+    <div>2、VIP课程学员如有特殊情况需要请假的,应提前4小时以上通过管乐迷App完成请假,否则当次课程将视同发生,系统将自动记录结算课时并扣除相应课程费用。</div>
+    3、VIP学员如遇特殊情况需要长期请假时,可向甲方/授课老师申请办理临时休会。学员可在6个月内申请复学,超过6个月未申请复学的,甲方有权按自动退会处理。<span >VIP课程为一对二课程的,其中一位学员申请临时休会的,还需征得同组另一位学员的同意后方可申请休会。否则将不予受理。</span><br />
+    <span>4、鉴于团课的特殊性,团课学员个人请假,当次课程仍视同发生,系统将自动记录结算课时并扣除相应课程费用。</span><br />
+    5、每期课程均有相对应的有效期,乙方应在有效期内完成课程,10次课一期的,自交费之日起4个月内有效;20次课一期的,自交费之日起8个月内有效;40次课一期的,自交费之日起16个月内有效。<span>如果由于指导老师请假等原因造成课程不能如期完成的,课程有效期将顺延;如课程超出有效期限,乙方所缴纳的课程费用将自动扣除逾期未完成的课时后自动清零。</span><br />
+
+    <h2>四、退费</h2>
+    <span>1、乐器、教辅、配件等,未经签收,自购买缴款之日起15日内提出申请可全额退还,超过上述期限则不予受理退费申请;非因商品本身存在质量问题,一经签收,无论使用与否,均不予退费;</span><br />
+    <span>2、乐保服务,在维修老师下校检查前提出申请可全额退还,下校检查日过后则不予退费;</span><br />
+    <span>3、非个别课程,包括但不限于声部基础课、合奏课、基础技能课、网基课、集训课、VIP课程项下一对二等,自购买缴款之日起15日内提出申请可全额退还,超过上述期限或实际已发生课时消耗的则一律不予受理退费;</span><br />
+    <span>4、正价购买的个别课程,包括但不限于VIP课程项下一对一、网管课等,课程有效期内可申请退费,可退款金额为:购买金额-课时原价*已消耗课时数量;</span><br />
+    <span>5、活动期间以优惠价格购买的个别课程,自购买缴款之日起15日内提出申请可全额退还,超过上述期限或实际已发生课时消耗的则一律不予受理退费;</span><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>

+ 17 - 21
mec-biz/src/main/resources/config/contracts/product.ftl → mec-biz/src/main/resources/config/contracts/product3.ftl

@@ -46,7 +46,6 @@
         }
         .signature {
             padding-top: 50px;
-            padding-bottom: 20px;
         }
         .signature .sign {
             position: relative;
@@ -79,9 +78,6 @@
         .bold {
             font-weight: bold;
         }
-        .highlight{
-            color: red;
-        }
     </style>
 </head>
 <body style="font-family:'SimSun'">
@@ -123,29 +119,29 @@
         <div>(本协议中“乙方“指学员及家长;”乙方学员“指购买甲方产品或服务的学员;”乙方家长“仅指乙方学员的法定监护人。)</div>
 
         <p class="underline bold">重要须知:在注册或购买使用甲方提供的产品、服务之前,请您务必审慎阅读、充分理解本使用协议各条款内容, 特别是免除或者限制甲方责任的条款、对您权利进行限制的条款、约定争议解决方式和司法管辖的条款等。 限制、免责条款或者其他涉及您重大权益的条款可能以加粗、加下划线等形式提示您重点注意。您注册或购买使用甲方提供的产品和服务,均视为您同意本使用协议,以及同意接受本使用协议的约束。</p>
-        <p class="underline bold">如无特别说明 ,下列术语在本协议中的定义为:管乐迷平台(下称“本平台”),即管乐迷APP;AMR器乐练习系统(下称“本系统”)指由甲方提供和维护的器乐教学全流程辅助系统。乙方通过该系统完成器乐学习。本系统提供包括媒体资料,老师互动点评,课前中后管理等服务。具体功能以该系统实际提供为准,且该系统将根据实际需要进行调整和增减,乙方使用平台时需遵守本服务协议。</p>
+        <p class="underline bold">如无特别说明 ,下列术语在本协议中的定义为:管乐迷平台(下称“本平台”),即管乐迷APP;AMR器乐练习系统(下称“本系统”)指由甲方提供的器乐教学全流程辅助系统,包括媒体资料,教师点评,课前、课中、课后管理等服务,具体以该系统实际提供为准。该系统将根据实际需要进行调整和增减,乙方使用平台时需遵守本服务协议。</p>
 
         <h2>一、注册及购买</h2>
         <div>1、无论是否源自甲方建议,乙方选择报名注册加入乐团,或选择购买使用甲方提供的产品和服务,均为乙方自主意愿的表达及独立自主的选择。</div>
-        2、乙方完成所选产品或服务缴费后,甲方向乙方开具加盖公司印章的收款凭据,乙方务必妥善保管
+        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 />
+				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>
+        1、基于教学进度和质量保证,甲方对于课程延续性有严格要求,因此乙方学员应尽量参加课程,无特殊情况则应避免请假。<br />
+        2、VIP课程学员如有特殊情况需要请假的,应提前4小时以上通过管乐迷APP完成请假,否则当次课程将视同发生,系统将自动记录结算课时并扣除相应课程费用。<br />
+        3、VIP学员如遇特殊情况需要长期请假时,可向甲方/授课老师申请办理临时休会。学员可在6个月内申请复学,超过6个月未申请复学的,甲方有权按自动退会处理。VIP课程为一对二课程的,其中一位学员申请临时休会的,还需征得同组另一位学员的同意后方可申请休会。否则将不予受理。<br />
+        4、鉴于团体课的特殊性,团体课学员个人请假,当次课程仍视同发生。<br />
 
         <h2>四、退费</h2>
         1、乐器、教辅、配件等,未经签收,自购买缴款之日起15日内提出申请可全额退还,超过上述期限则不予受理退费申请;非因商品本身存在质量问题,一经签收,无论使用与否,均不予退费;<br />
@@ -172,7 +168,7 @@
         2、因履行本协议发生的一切争议,甲乙双方应友好协商解决;如双方在发生争议后30日内无法通过协商解决时,任何一方有权向甲方所在地有管辖权的人民法院提起诉讼解决。<br />
 
         <h2>九、其他</h2>
-        1、乙方同意,甲方有权在乙方学习、上课、排练和活动期间对其拍摄照片、视频,甲方对所拍摄的照片、视频享有著作权,乙方同意甲方可合理使用该等照片、视频。<br />
+        1、乙方同意,甲方有权在乙方学习、上课、排练和活动期间对其拍摄照片、视频,甲方对所拍摄的照片、视频享有著作权,乙方同意甲方可使用该等照片、视频。<br />
         2、未经甲方事先书面同意,乙方不得将本课程转让给乙方以外的任何第三方。<br />
         3、双方确认并同意,本协议的电子版本与纸质版本具有同等法律效力。双方发生争议时,电子合同打印件可作为证据提交。双方通过网络以在线方式签订本协议的 ,则以乙方点击“确认”或“同意”等相关按钮或以电子签名的方式作为对合同内容的同意、确认以及本协议的签署;如双方签订纸质版本协议的,则本协议壹式贰份,甲方盖公章或合同专用章并且乙方签字作为有效签署方式,并且双方各执壹份,每份具有同等法律效力。<br />
         4、本协议自双方按照本协议约定方式签署之日起生效,有效期至双方履行完本协议约定的全部义务时止。<br />

+ 16 - 4
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -2353,7 +2353,13 @@
             LEFT JOIN organization o ON cs.organ_id_=o.id_
             LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_
             left join teacher_attendance ta on ta.course_schedule_id_ = cs.id_
-            LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_
+            <if test="searchType == 'ERR_ATTENDANCE'">
+                LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
+                LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_ AND cssp.user_id_ = sa.user_id_
+            </if>
+            <if test="searchType != 'ERR_ATTENDANCE'">
+                LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_
+            </if>
             <include refid="endFindCourseSchedulesCondition"/>
         GROUP BY
             cs.class_date_,
@@ -2371,7 +2377,13 @@
         COUNT(DISTINCT cs.id_)
         FROM
         course_schedule cs
-        LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_
+        <if test="searchType == 'ERR_ATTENDANCE'">
+            LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
+            LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_ AND cssp.user_id_ = sa.user_id_
+        </if>
+        <if test="searchType != 'ERR_ATTENDANCE'">
+            LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_
+        </if>
         LEFT JOIN teacher_attendance ta on ta.course_schedule_id_ = cs.id_
         LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_
         <include refid="endFindCourseSchedulesCondition"/>
@@ -2493,8 +2505,8 @@
         <if test="searchType == 'ERR_ATTENDANCE'">
             AND ta.teacher_id_ = cs.actual_teacher_id_
             AND cs.status_ = 'OVER'
-            AND ta.sign_in_status_ IS NOT NULL AND ta.sign_out_status_ IS NOT NULL
-            AND (ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0 OR (sa.id_ IS NULL OR (sa.status_ != 'NORMAL' AND sa.visit_flag_ = 0))) AND ta.dispose_content_ IS NULL
+            AND (((ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ != 'NORMAL' AND sa.visit_flag_ = 0)))
+            AND (ta.dispose_content_ IS NOT NULL OR (ta.sign_in_status_ IS NOT NULL AND ta.sign_out_status_ IS NOT NULL))
             AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
         </if>
         <if test="searchType == 'NO_ATTENDANCE'">

+ 4 - 3
mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml

@@ -588,11 +588,12 @@
     <select id="getAttendanceError" resultType="int">
 		SELECT COUNT(DISTINCT c.id_) FROM (SELECT cs.id_ FROM course_schedule cs
 		LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
-		LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_
+		LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
+		LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cssp.course_schedule_id_ AND cssp.user_id_ = sa.user_id_
 		WHERE ta.teacher_id_ = cs.actual_teacher_id_
 		AND cs.status_ = 'OVER' AND cs.del_flag_ = 0 AND cs.class_date_ >= '2021-02-01'
-		AND ta.sign_in_status_ IS NOT NULL AND ta.sign_out_status_ IS NOT NULL
-		AND (ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0 OR (sa.id_ IS NULL OR (sa.status_ != 'NORMAL' AND sa.visit_flag_ = 0))) AND ta.dispose_content_ IS NULL
+		AND (((ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ != 'NORMAL' AND sa.visit_flag_ = 0)))
+		AND (ta.dispose_content_ IS NOT NULL OR (ta.sign_in_status_ IS NOT NULL AND ta.sign_out_status_ IS NOT NULL))
 		AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
 		<if test="organIds != null and organIds != ''">
 			AND FIND_IN_SET(cs.organ_id_,#{organIds})

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

@@ -40,6 +40,7 @@
         <result column="payment_valid_end_date_" property="paymentValidEndDate"/>
         <result column="payment_pattern_" property="paymentPattern"/>
         <result column="is_classroom_lessons_" property="isClassroomLessons"/>
+        <result column="course_view_type_" property="courseViewType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -72,7 +73,7 @@
          bill_start_date_, improvent_classes_num_, enroll_classes_, payment_expire_date_, is_extra_class_,
          settlement_type_, cooperation_organ_id_, enlightenment_course_time_,
          parent_meeting_time_, img_, director_user_id_, is_classroom_lessons_, memo_, expect_start_group_date_,
-         ownership_type_, repair_user_id_, del_flag_,payment_valid_start_date_,payment_valid_end_date_,payment_pattern_)
+         ownership_type_, repair_user_id_, del_flag_,payment_valid_start_date_,payment_valid_end_date_,payment_pattern_,course_view_type_)
         VALUES (#{id}, #{name}, #{organId}, #{schoolId}, #{applyExpireDate},#{preApplyExpireDate}, #{teamTeacherId}, #{educationalTeacherId},
                 #{chargeTypeId}, #{courseForm}, now(), now(),
                 #{status, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{billStartDate},
@@ -82,7 +83,7 @@
                 #{cooperationOrganId}, #{enlightenmentCourseTime}, #{parentMeetingTime}, #{img}, #{directorUserId},
                 #{isClassroomLessons}, #{memo}, #{expectStartGroupDate},
                 #{ownershipType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{repairUserId},
-                #{delFlag},#{paymentValidStartDate},#{paymentValidEndDate},#{paymentPattern})
+                #{delFlag},#{paymentValidStartDate},#{paymentValidEndDate},#{paymentPattern},#{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -172,6 +173,9 @@
             <if test="groupMemberNum != null">
                 group_member_num_ = #{groupMemberNum},
             </if>
+            <if test="courseViewType != null">
+                course_view_type_ = #{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            </if>
             <if test="memo != null">
                 memo_ = #{memo},
             </if>

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

@@ -854,13 +854,14 @@
             <collection property="goodsList" ofType="com.ym.mec.biz.dal.entity.Goods">
                 <result column="goods_id" property="id"/>
                 <result column="goods_name" property="name"/>
+                <result column="complementGoodsIdList" property="complementGoodsIdList"/>
             </collection>
         </collection>
     </resultMap>
     <select id="getUserApplyOrders" resultMap="applyOrderAndDetail" parameterType="map">
         SELECT spo.*,spod.id_ detail_id_,spod.type_ detail_type_,spod.price_
         detail_price_,spod.kit_group_purchase_type_ detail_kit_group_purchase_type_,
-        g.id_ goods_id, g.name_ goods_name
+        g.id_ goods_id, g.name_ goods_name,g.complement_goods_id_list_ complementGoodsIdList
         FROM student_payment_order spo
         LEFT JOIN student_payment_order_detail spod on spo.id_ = spod.payment_order_id_
         LEFT JOIN goods g on FIND_IN_SET(g.id_,spod.goods_id_list_)

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

@@ -810,6 +810,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>
     <!-- 批量删除信息 -->
     <delete id="batchDelete">
         DELETE FROM student_registration WHERE id_ IN

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

@@ -86,10 +86,25 @@
 	</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
+		    version_!=1
+		    AND user_id_ IN
+			<foreach collection="userIds" item="userId" open="(" close=")" separator=",">
+				#{userId}
+			</foreach>
+	</select>
 </mapper>

+ 2 - 1
mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java

@@ -148,6 +148,7 @@ public class StudentOrderController extends BaseController {
             orderDetail.put("ownershipType", musicGroup.getOwnershipType());
             orderDetail.put("detailType", orderDetailType);
             orderDetail.put("chargeTypeId", musicGroup.getChargeTypeId());
+            orderDetail.put("courseViewType", musicGroup.getCourseViewType());
 
             //新的课程形态10.27
             MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.getMusicGroupRegCalender(musicGroup.getId());
@@ -775,7 +776,7 @@ public class StudentOrderController extends BaseController {
         if (sysUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        return succeed(studentPaymentOrderDao.getUserApplyOrders(sysUser.getId(), musicGroupId));
+        return succeed(studentPaymentOrderService.getUserApplyOrders(sysUser.getId(), musicGroupId));
     }
 
     @GetMapping("/reConfirmOrder")

+ 18 - 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,9 @@ import com.ym.mec.biz.service.SysUserContractsService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 
+import java.util.*;
+import java.util.stream.Collectors;
+
 @RequestMapping("sysUserContracts")
 @Api(tags = "用户协议服务")
 @RestController
@@ -25,15 +29,24 @@ 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<List<SysUserContracts>> getLatest(Integer userId) {
 		
-		if(sysUserContracts == null){
+//		SysUserContracts sysUserContracts = sysUserContractsService.getLatestUserContract(userId);
+		List<SysUserContracts> sysUserContracts = sysUserContractsService.getUserAllContracts(userId);
+
+		if(CollectionUtils.isEmpty(sysUserContracts)){
 			return failed("该学员尚未签署协议");
 		}
 
-		return succeed(sysUserContracts);
+		Map<Integer, List<SysUserContracts>> versionContractMap = sysUserContracts.stream().collect(Collectors.groupingBy(SysUserContracts::getVersion));
+
+		List<SysUserContracts> result = new ArrayList<>();
+		for (Map.Entry<Integer, List<SysUserContracts>> versionContractMapEntry : versionContractMap.entrySet()) {
+			versionContractMapEntry.getValue().sort(Comparator.comparing(SysUserContracts::getCreateTime).reversed());
+			result.add(versionContractMapEntry.getValue().get(0));
+		}
+
+		return succeed(result);
 	}
 
 }