瀏覽代碼

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

zouxuan 4 年之前
父節點
當前提交
1fadc8ba6c
共有 29 個文件被更改,包括 454 次插入118 次删除
  1. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  2. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/DegreeRegistrationDao.java
  3. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/DegreeRegistrationActivityDto.java
  4. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RemainCourseTypeDurationDto.java
  5. 29 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/DegreeRegistration.java
  6. 80 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/PracticeGroupSellPrice.java
  7. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Student.java
  8. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderDetailTypeEnum.java
  9. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java
  10. 5 2
      mec-biz/src/main/java/com/ym/mec/biz/service/DegreeRegistrationService.java
  11. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  12. 41 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  13. 7 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  14. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  15. 102 37
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/DegreeRegistrationServiceImpl.java
  16. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  17. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  18. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SporadicChargeInfoImpl.java
  19. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  20. 60 26
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  21. 2 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  22. 3 2
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  23. 18 4
      mec-biz/src/main/resources/config/mybatis/DegreeRegistrationMapper.xml
  24. 8 0
      mec-biz/src/main/resources/config/mybatis/PracticeGroupSellPriceMapper.xml
  25. 4 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  26. 15 22
      mec-student/src/main/java/com/ym/mec/student/controller/DegreeController.java
  27. 2 2
      mec-student/src/main/java/com/ym/mec/student/controller/PracticeGroupController.java
  28. 11 1
      mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java
  29. 2 2
      mec-web/src/main/java/com/ym/mec/web/controller/StudentRegistrationController.java

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -50,7 +50,7 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @param courseScheduleList
      * @return
      */
-    int deleteStudentCourseSchedule(@Param("userId") Integer userId, @Param("courseScheduleList") List<CourseSchedule> courseScheduleList);
+    int deleteStudentCourseSchedule(@Param("userId") Integer userId, @Param("courseScheduleIdList") List<Long> courseScheduleIdList);
 
     /**
      * @param courseScheduleIds: 课程编号列表

+ 4 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/DegreeRegistrationDao.java

@@ -14,4 +14,7 @@ public interface DegreeRegistrationDao extends BaseDAO<Integer, DegreeRegistrati
     DegreeRegistration getLock(@Param("id") Integer id);
 
     DegreeRegistration getTotalAmount(Map<String, Object> params);
-}
+
+    DegreeRegistration getWithUserIdAndActivityTag(@Param("userId") Integer userId,
+                                                   @Param("activityTag") String activityTag);
+}

+ 23 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/DegreeRegistrationActivityDto.java

@@ -0,0 +1,23 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.DegreeRegistration;
+
+import java.util.Map;
+
+/**
+ * @Author qnc99
+ * @Date 2020/12/3 0003
+ */
+public class DegreeRegistrationActivityDto extends DegreeRegistration {
+
+    private Map<CourseSchedule.CourseScheduleType, Integer> additionCourseInfo;
+
+    public Map<CourseSchedule.CourseScheduleType, Integer> getAdditionCourseInfo() {
+        return additionCourseInfo;
+    }
+
+    public void setAdditionCourseInfo(Map<CourseSchedule.CourseScheduleType, Integer> additionCourseInfo) {
+        this.additionCourseInfo = additionCourseInfo;
+    }
+}

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

@@ -7,6 +7,8 @@ public class RemainCourseTypeDurationDto {
 	private CourseScheduleType courseType;
 	
 	private Integer remainMinutes;
+	
+	private Integer tempMergedCourseNum;
 
 	public CourseScheduleType getCourseType() {
 		return courseType;
@@ -23,4 +25,12 @@ public class RemainCourseTypeDurationDto {
 	public void setRemainMinutes(Integer remainMinutes) {
 		this.remainMinutes = remainMinutes;
 	}
+
+	public Integer getTempMergedCourseNum() {
+		return tempMergedCourseNum;
+	}
+
+	public void setTempMergedCourseNum(Integer tempMergedCourseNum) {
+		this.tempMergedCourseNum = tempMergedCourseNum;
+	}
 }

+ 29 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/DegreeRegistration.java

@@ -14,6 +14,8 @@ public class DegreeRegistration {
     @ApiModelProperty(value = "零星支付id",required = true)
     private Integer sporadicId;
 
+    private Integer userId;
+
     /**
      * 订单编号
      */
@@ -136,6 +138,16 @@ public class DegreeRegistration {
 
     private Integer organId;
 
+    private String activityTag;
+
+    public Boolean getRepay() {
+        return isRepay;
+    }
+
+    public void setRepay(Boolean repay) {
+        isRepay = repay;
+    }
+
     public Integer getId() {
         return id;
     }
@@ -144,6 +156,22 @@ public class DegreeRegistration {
         this.id = id;
     }
 
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getActivityTag() {
+        return activityTag;
+    }
+
+    public void setActivityTag(String activityTag) {
+        this.activityTag = activityTag;
+    }
+
     public Integer getSporadicId() {
         return sporadicId;
     }
@@ -319,4 +347,4 @@ public class DegreeRegistration {
     public void setOrganId(Integer organId) {
         this.organId = organId;
     }
-}
+}

+ 80 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/PracticeGroupSellPrice.java

@@ -23,6 +23,22 @@ public class PracticeGroupSellPrice {
 
     private BigDecimal twiceQuartActivityPrice;
 
+    private BigDecimal vipOneStudentTwelveCourseOriginalPriceWithNewUser;
+
+    private BigDecimal vipOneStudentTwelveCourseActivityPriceWithNewUser;
+
+    private BigDecimal vipOneStudentTwelveCourseOriginalPriceWithOldUser;
+
+    private BigDecimal vipOneStudentTwelveCourseActivityPriceWithOldUser;
+
+    private BigDecimal highOnlineTenCourseOriginalPriceWithNewUser;
+
+    private BigDecimal highOnlineTenCourseActivityPriceWithNewUser;
+
+    private BigDecimal highOnlineTenCourseOriginalPriceWithOldUser;
+
+    private BigDecimal highOnlineTenCourseActivityPriceWithOldUser;
+
     private Date createTime;
 
     private Date updateTime;
@@ -98,4 +114,68 @@ public class PracticeGroupSellPrice {
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
+
+    public BigDecimal getVipOneStudentTwelveCourseOriginalPriceWithNewUser() {
+        return vipOneStudentTwelveCourseOriginalPriceWithNewUser;
+    }
+
+    public void setVipOneStudentTwelveCourseOriginalPriceWithNewUser(BigDecimal vipOneStudentTwelveCourseOriginalPriceWithNewUser) {
+        this.vipOneStudentTwelveCourseOriginalPriceWithNewUser = vipOneStudentTwelveCourseOriginalPriceWithNewUser;
+    }
+
+    public BigDecimal getVipOneStudentTwelveCourseActivityPriceWithNewUser() {
+        return vipOneStudentTwelveCourseActivityPriceWithNewUser;
+    }
+
+    public void setVipOneStudentTwelveCourseActivityPriceWithNewUser(BigDecimal vipOneStudentTwelveCourseActivityPriceWithNewUser) {
+        this.vipOneStudentTwelveCourseActivityPriceWithNewUser = vipOneStudentTwelveCourseActivityPriceWithNewUser;
+    }
+
+    public BigDecimal getVipOneStudentTwelveCourseOriginalPriceWithOldUser() {
+        return vipOneStudentTwelveCourseOriginalPriceWithOldUser;
+    }
+
+    public void setVipOneStudentTwelveCourseOriginalPriceWithOldUser(BigDecimal vipOneStudentTwelveCourseOriginalPriceWithOldUser) {
+        this.vipOneStudentTwelveCourseOriginalPriceWithOldUser = vipOneStudentTwelveCourseOriginalPriceWithOldUser;
+    }
+
+    public BigDecimal getVipOneStudentTwelveCourseActivityPriceWithOldUser() {
+        return vipOneStudentTwelveCourseActivityPriceWithOldUser;
+    }
+
+    public void setVipOneStudentTwelveCourseActivityPriceWithOldUser(BigDecimal vipOneStudentTwelveCourseActivityPriceWithOldUser) {
+        this.vipOneStudentTwelveCourseActivityPriceWithOldUser = vipOneStudentTwelveCourseActivityPriceWithOldUser;
+    }
+
+    public BigDecimal getHighOnlineTenCourseOriginalPriceWithNewUser() {
+        return highOnlineTenCourseOriginalPriceWithNewUser;
+    }
+
+    public void setHighOnlineTenCourseOriginalPriceWithNewUser(BigDecimal highOnlineTenCourseOriginalPriceWithNewUser) {
+        this.highOnlineTenCourseOriginalPriceWithNewUser = highOnlineTenCourseOriginalPriceWithNewUser;
+    }
+
+    public BigDecimal getHighOnlineTenCourseActivityPriceWithNewUser() {
+        return highOnlineTenCourseActivityPriceWithNewUser;
+    }
+
+    public void setHighOnlineTenCourseActivityPriceWithNewUser(BigDecimal highOnlineTenCourseActivityPriceWithNewUser) {
+        this.highOnlineTenCourseActivityPriceWithNewUser = highOnlineTenCourseActivityPriceWithNewUser;
+    }
+
+    public BigDecimal getHighOnlineTenCourseOriginalPriceWithOldUser() {
+        return highOnlineTenCourseOriginalPriceWithOldUser;
+    }
+
+    public void setHighOnlineTenCourseOriginalPriceWithOldUser(BigDecimal highOnlineTenCourseOriginalPriceWithOldUser) {
+        this.highOnlineTenCourseOriginalPriceWithOldUser = highOnlineTenCourseOriginalPriceWithOldUser;
+    }
+
+    public BigDecimal getHighOnlineTenCourseActivityPriceWithOldUser() {
+        return highOnlineTenCourseActivityPriceWithOldUser;
+    }
+
+    public void setHighOnlineTenCourseActivityPriceWithOldUser(BigDecimal highOnlineTenCourseActivityPriceWithOldUser) {
+        this.highOnlineTenCourseActivityPriceWithOldUser = highOnlineTenCourseActivityPriceWithOldUser;
+    }
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Student.java

@@ -39,6 +39,8 @@ public class Student extends SysUser {
 
 	private String teacherName;
 
+	private Boolean isNewUser;
+
 	public Student(Integer userId, String subjectIdList) {
 		this.userId = userId;
 		this.subjectIdList = subjectIdList;
@@ -46,6 +48,14 @@ public class Student extends SysUser {
 		this.serviceTag = 1;
 	}
 
+	public Boolean getIsNewUser() {
+		return isNewUser;
+	}
+
+	public void setIsNewUser(Boolean isNewUser) {
+		this.isNewUser = isNewUser;
+	}
+
 	public String getSubjectNames() {
 		return subjectNames;
 	}

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderDetailTypeEnum.java

@@ -23,8 +23,8 @@ public enum OrderDetailTypeEnum implements BaseEnum<String, OrderDetailTypeEnum>
     TRAINING_MIX("TRAINING_MIX", "集训合奏课"),
     HIGH_ONLINE("HIGH_ONLINE", "网络基础训练课"),
     MUSIC_NETWORK("MUSIC_NETWORK", "乐团网管课"),
-    CLASSROOM("CLASSROOM", "课堂课");
-
+    CLASSROOM("CLASSROOM", "课堂课"),
+	DEGREE_REGISTRATION("DEGREE_REGISTRATION", "考级报名");
 
     private String code;
 

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java

@@ -20,7 +20,8 @@ public enum OrderTypeEnum implements BaseEnum<String, OrderTypeEnum> {
 	GOODS_SELL("GOODS_SELL","商品销售"),
 	OUTORDER("OUTORDER", "外部订单"),
 	REPAIR("REPAIR","乐器维修"),
-	SUBJECT_CHANGE("SUBJECT_CHANGE","声部更换");
+	SUBJECT_CHANGE("SUBJECT_CHANGE","声部更换"),
+	DEGREE_REGISTRATION("DEGREE_REGISTRATION", "考级报名");
 
 
 	private String code;

+ 5 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/DegreeRegistrationService.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.DegreeRegistrationActivityDto;
 import com.ym.mec.biz.dal.dto.PageInfoDegree;
 import com.ym.mec.biz.dal.dto.PageInfoOrder;
 import com.ym.mec.biz.dal.entity.DegreeRegistration;
@@ -11,9 +12,11 @@ import java.util.Map;
 
 public interface DegreeRegistrationService extends BaseService<Integer, DegreeRegistration> {
 
-    Map pay(DegreeRegistration degreeRegistration) throws Exception;
+    String ACTIVITY_TAG = "DEGREE_REGISTRATION_2020_12";
 
-    Boolean updateStatus(Integer id , Integer status,String orderNo);
+    Map pay(DegreeRegistrationActivityDto degreeRegistration) throws Exception;
+
+    Boolean updateStatus(StudentPaymentOrder order);
 
     PageInfoDegree<DegreeRegistration> getPageList(DegreeQueryInfo queryInfo);
 }

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

@@ -254,7 +254,7 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      * @param subjectId
      * @return
      */
-    List<StudentRegistration> findMusicGroupStuNoClassType(String musicGroupId, ClassGroupTypeEnum type, Integer subjectId);
+    List<StudentRegistration> findMusicGroupStuNoClassType(String musicGroupId, Long classGroupId, ClassGroupTypeEnum type, Integer subjectId);
 
     /**
      * 获取乐团下所有学员身上的声部列表

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

@@ -2,19 +2,40 @@ package com.ym.mec.biz.service.impl;
 
 import java.io.IOException;
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 
-import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.entity.*;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import com.alibaba.fastjson.JSON;
+import com.ym.mec.biz.dal.dao.ClassGroupDao;
+import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
 import com.ym.mec.biz.dal.dto.ClassGroupStudentInfoDto;
+import com.ym.mec.biz.dal.entity.ClassGroup;
+import com.ym.mec.biz.dal.entity.ClassGroupRelation;
+import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
+import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
+import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.entity.TeacherDefaultMusicGroupSalary;
 import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
@@ -35,7 +56,6 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.util.http.HttpUtil;
-import org.springframework.util.CollectionUtils;
 
 @Service
 public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, ClassGroupStudentMapper> implements ClassGroupStudentMapperService {
@@ -69,6 +89,9 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
     private CourseScheduleDao courseScheduleDao;
     @Autowired
     private ClassGroupDao classGroupDao;
+    
+    @Autowired
+    private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
 
     private static String holidayUrl = "http://tool.bitefu.net/jiari/?d=";
 
@@ -110,7 +133,19 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         //3、删除学生对应班级的课程
         List<CourseSchedule> courseScheduleList = courseScheduleService.findNoStartCoursesByClassGroupId(classGroupId);
         if (courseScheduleList.size() > 0) {
-            courseScheduleStudentPaymentService.deleteStudentCourseSchedule(userId, courseScheduleList);
+
+            //临时合课的情况
+            List<Long> tempMergedCourseIdList = new ArrayList<Long>();
+            for(CourseSchedule courseSchedule : courseScheduleList){
+            	if(courseSchedule.getNewCourseId() != null){
+            		tempMergedCourseIdList.add(courseSchedule.getNewCourseId());
+            	}
+            }
+            
+            tempMergedCourseIdList.addAll(courseScheduleList.stream().map(CourseSchedule :: getId).collect(Collectors.toList()));
+            if(tempMergedCourseIdList.size() > 0){
+            	courseScheduleStudentPaymentDao.deleteStudentCourseSchedule(userId, tempMergedCourseIdList);
+            }
         }
 
         //4、调整未上课课酬

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

@@ -37,6 +37,7 @@ import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.event.source.CourseEventSource;
 import org.apache.commons.collections.ListUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.tomcat.jni.Local;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -5250,6 +5251,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void courseMerge(CourseMergeDto courseMergeInfo) {
+		Date now = new Date();
+		Date thirdDay = Date.from(LocalDate.now().plusDays(3).atStartOfDay(DateUtil.zoneId).toInstant());
+
 		if(CollectionUtils.isEmpty(courseMergeInfo.getMergeCourseIds())){
 			throw new BizException("请选择需要合并的课程");
 		}
@@ -5265,7 +5269,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		if(courseTypeNum>1){
 			throw new BizException("课程合并仅支持同课程类型");
 		}
-		Date now = new Date();
 		for (CourseSchedule courseSchedule : allCourses) {
 			if(Objects.nonNull(courseSchedule.getNewCourseId())){
 				throw new BizException("存在已合并课程");
@@ -5273,6 +5276,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			if(courseSchedule.getStartClassTime().compareTo(now)<=0){
 				throw new BizException("课程合并仅支持未开始的课程");
 			}
+			if(courseSchedule.getEndClassTime().compareTo(thirdDay)>0){
+				throw new BizException("仅支持合并三天以内的课程");
+			}
 			if(VIP.equals(courseSchedule.getGroupType())||PRACTICE.equals(courseSchedule.getGroupType())){
 				throw new BizException("VIP课、网管课暂不支持课程合并");
 			}

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

@@ -177,7 +177,8 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 		if(courseScheduleList.size() == 0){
 			return 0;
 		}
-		return courseScheduleStudentPaymentDao.deleteStudentCourseSchedule(userId,courseScheduleList);
+		List<Long> courseScheduleIdList = courseScheduleList.stream().map(CourseSchedule :: getId).collect(Collectors.toList());
+		return courseScheduleStudentPaymentDao.deleteStudentCourseSchedule(userId,courseScheduleIdList);
     }
 
 	@Override

+ 102 - 37
mec-biz/src/main/java/com/ym/mec/biz/service/impl/DegreeRegistrationServiceImpl.java

@@ -1,23 +1,20 @@
 package com.ym.mec.biz.service.impl;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
+import com.alibaba.fastjson.JSON;
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.biz.dal.dto.DegreeRegistrationActivityDto;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.ym.mec.biz.dal.dto.PageInfoDegree;
-import com.ym.mec.biz.dal.entity.DegreeRegistration;
-import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.OrderTypeEnum;
@@ -53,7 +50,13 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
     private PayService payService;
 
     @Autowired
-    private OrganizationDao organizationDao;
+    private PracticeGroupSellPriceDao practiceGroupSellPriceDao;
+
+    @Autowired
+    private StudentDao studentDao;
+
+    @Autowired
+    private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
 
     @Override
     public BaseDAO<Integer, DegreeRegistration> getDAO() {
@@ -61,8 +64,12 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Map pay(DegreeRegistration degreeRegistration) throws Exception {
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public Map pay(DegreeRegistrationActivityDto degreeRegistration) throws Exception {
+        Student student = studentDao.getLocked(degreeRegistration.getUserId());
+
+        DegreeRegistration degree = degreeRegistrationDao.getWithUserIdAndActivityTag(degreeRegistration.getUserId(), ACTIVITY_TAG);
+
         Date nowDate = new Date();
         //获取收费项价格
         SporadicChargeInfo chargeInfo = sporadicChargeInfoDao.get(degreeRegistration.getSporadicId());
@@ -75,20 +82,11 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
             throw new BizException("报考级别为“" + chargeInfo.getTitle() + "”且乐理级别是“免考”时,必须上传证书");
         }
 
-        List<Organization> organs = organizationDao.findAllOrgans();
-        Integer organId = chargeInfo.getOrganId();
-        for (Organization organ : organs) {
-            if (degreeRegistration.getCity().contains(organ.getName())) {
-                organId = organ.getId();
-                break;
-            }
-        }
-
         String orderNo = idGeneratorService.generatorId("payment") + "";
 
+        degreeRegistration.setActivityTag(ACTIVITY_TAG);
         degreeRegistration.setLevel(chargeInfo.getTitle());
         degreeRegistration.setOrderNo(orderNo);
-        degreeRegistration.setOrganId(organId);
         BigDecimal theoryMoney = BigDecimal.ZERO;
         switch (degreeRegistration.getTheoryLevel()) {
             case "一级":
@@ -109,7 +107,6 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
                 throw new BizException("您选择的乐理级别不存在,请核对");
         }
         degreeRegistration.setTheoryMoney(theoryMoney);
-        DegreeRegistration degree = degreeRegistrationDao.findByMobileAndSporadicId(degreeRegistration.getMobile(), degreeRegistration.getSporadicId());
         if (degree == null) {
             degreeRegistration.setMoney(chargeInfo.getAmount());
             degreeRegistration.setStatus(1);
@@ -117,7 +114,7 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
             degreeRegistration.setUpdateTime(nowDate);
             degreeRegistrationDao.insert(degreeRegistration);
         } else if (degree.getStatus().equals(2)) {
-            throw new BizException("您本次已报名,请勿重复报名");
+            //throw new BizException("您本次已报名,请勿重复报名");
         } else {
             degreeRegistration.setId(degree.getId());
             degreeRegistration.setStatus(1);
@@ -125,13 +122,62 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
             degreeRegistration.setUpdateTime(nowDate);
             degreeRegistrationDao.update(degreeRegistration);
         }
-        degreeRegistrationDao.getLock(degreeRegistration.getId());
 
+        BigDecimal additionCoursePrice = new BigDecimal("0");
+        Map<CourseSchedule.CourseScheduleType, Integer> typeCourseTime = new HashMap<>();
+        if(Objects.nonNull(degreeRegistration.getAdditionCourseInfo())){
+            Map<CourseSchedule.CourseScheduleType, Integer> additionCourseInfo = degreeRegistration.getAdditionCourseInfo();
+            PracticeGroupSellPrice practiceGroupSellPrice = practiceGroupSellPriceDao.get(degreeRegistration.getId());
+            if(Objects.isNull(practiceGroupSellPrice)){
+                throw new BizException("该分部暂未参与此活动");
+            }
+            BigDecimal practiceUnitPrice = practiceGroupSellPrice.getOnceActivityPrice(),
+                    vipUnitPrice = new BigDecimal("0"), highUnitPrice;
+            if(student.getIsNewUser()){
+                vipUnitPrice = practiceGroupSellPrice.getVipOneStudentTwelveCourseActivityPriceWithNewUser();
+                highUnitPrice = practiceGroupSellPrice.getHighOnlineTenCourseOriginalPriceWithNewUser();
+                if(!additionCourseInfo.containsKey(CourseSchedule.CourseScheduleType.VIP)){
+                    additionCourseInfo.remove(CourseSchedule.CourseScheduleType.PRACTICE);
+                }
+                boolean vipMoreThan2 = additionCourseInfo.containsKey(CourseSchedule.CourseScheduleType.VIP)&&additionCourseInfo.get(CourseSchedule.CourseScheduleType.VIP)>=2;
+                if(vipMoreThan2){
+                    degreeRegistration.setMoney(BigDecimal.ZERO);
+                    highUnitPrice = practiceGroupSellPrice.getHighOnlineTenCourseActivityPriceWithNewUser();
+
+                }
+                if(vipMoreThan2&&additionCourseInfo.containsKey(CourseSchedule.CourseScheduleType.HIGH)){
+                    degreeRegistration.setTheoryMoney(BigDecimal.ZERO);
+                }
+            }else{
+                highUnitPrice = practiceGroupSellPrice.getHighOnlineTenCourseActivityPriceWithOldUser();
+                if(!additionCourseInfo.containsKey(CourseSchedule.CourseScheduleType.HIGH)){
+                    additionCourseInfo.remove(CourseSchedule.CourseScheduleType.PRACTICE);
+                }
+            }
+            for (Map.Entry<CourseSchedule.CourseScheduleType, Integer> courseScheduleTypeIntegerEntry : additionCourseInfo.entrySet()) {
+                BigDecimal courseTime = new BigDecimal(courseScheduleTypeIntegerEntry.getValue());
+                switch (courseScheduleTypeIntegerEntry.getKey()){
+                    case VIP:
+                        additionCoursePrice = additionCoursePrice.add(vipUnitPrice.multiply(courseTime));
+                        typeCourseTime.put(courseScheduleTypeIntegerEntry.getKey(), courseScheduleTypeIntegerEntry.getValue()*12);
+                        break;
+                    case PRACTICE:
+                        additionCoursePrice = additionCoursePrice.add(practiceUnitPrice.multiply(courseTime));
+                        typeCourseTime.put(courseScheduleTypeIntegerEntry.getKey(), courseScheduleTypeIntegerEntry.getValue()*12);
+                        break;
+                    case HIGH:
+                        additionCoursePrice = additionCoursePrice.add(highUnitPrice.multiply(courseTime));
+                        typeCourseTime.put(courseScheduleTypeIntegerEntry.getKey(), courseScheduleTypeIntegerEntry.getValue()*10);
+                        break;
+                }
+            }
+        }
 
-        BigDecimal amount = chargeInfo.getAmount();
+        BigDecimal amount = degreeRegistration.getMoney();
         amount = amount.add(theoryMoney);
+        amount = amount.add(additionCoursePrice);
 
-        OrderTypeEnum type = OrderTypeEnum.SPORADIC;
+        OrderTypeEnum type = OrderTypeEnum.DEGREE_REGISTRATION;
 
         Integer userId = degreeRegistration.getId();
         String channelType = "";
@@ -144,8 +190,8 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
         studentPaymentOrder.setActualAmount(amount);
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
         studentPaymentOrder.setMusicGroupId(degreeRegistration.getSporadicId().toString());
-        studentPaymentOrder.setOrganId(organId);
-        studentPaymentOrder.setRoutingOrganId(organId);
+        studentPaymentOrder.setOrganId(degreeRegistration.getOrganId());
+        studentPaymentOrder.setRoutingOrganId(degreeRegistration.getOrganId());
         if (theoryMoney.compareTo(BigDecimal.ZERO) > 0) {
             studentPaymentOrder.setMemo("乐理" + degreeRegistration.getTheoryLevel() + ",费用:" + theoryMoney);
         }
@@ -162,6 +208,18 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
             return notifyMap;
         }
 
+        if(BigDecimal.ZERO.compareTo(additionCoursePrice)>0){
+            StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
+            studentPaymentOrderDetail.setType(OrderDetailTypeEnum.DEGREE_REGISTRATION);
+            studentPaymentOrderDetail.setGoodsIdList(JSON.toJSONString(typeCourseTime));
+            studentPaymentOrderDetail.setPrice(additionCoursePrice);
+            studentPaymentOrderDetail.setRemitFee(BigDecimal.ZERO);
+            studentPaymentOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
+            studentPaymentOrderDetail.setCreateTime(nowDate);
+            studentPaymentOrderDetail.setUpdateTime(nowDate);
+            studentPaymentOrderDetailDao.insert(studentPaymentOrderDetail);
+        }
+
         String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
 
         String receiver = "kjRegister";
@@ -173,11 +231,11 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
                 baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
                 chargeInfo.getDetail(),
                 chargeInfo.getDetail(),
-                organId,
+                degreeRegistration.getOrganId(),
                 receiver
         );
 
-        studentPaymentOrder.setOrganId(organId);
+        studentPaymentOrder.setOrganId(degreeRegistration.getOrganId());
         studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
         studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
         studentPaymentOrder.setUpdateTime(nowDate);
@@ -186,15 +244,22 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
     }
 
     @Override
-    public Boolean updateStatus(Integer id, Integer status, String orderNo) {
-        DegreeRegistration degree = degreeRegistrationDao.getLock(id);
+    public Boolean updateStatus(StudentPaymentOrder studentPaymentOrder) {
+        DegreeRegistration degree = degreeRegistrationDao.getLock(studentPaymentOrder.getUserId());
         if (degree == null || degree.getStatus().equals(2)) {
             return true;
         }
-        StudentPaymentOrder order = studentPaymentOrderService.findOrderByOrderNo(orderNo);
-        degree.setOrderNo(orderNo);
-        degree.setTransNo(order.getTransNo());
-        degree.setStatus(status);
+        degree.setOrderNo(studentPaymentOrder.getOrderNo());
+        degree.setTransNo(studentPaymentOrder.getTransNo());
+        switch (studentPaymentOrder.getStatus()){
+            case SUCCESS:
+                degree.setStatus(2);
+                break;
+            case FAILED:
+            case CLOSE:
+                degree.setStatus(0);
+                break;
+        }
         degree.setUpdateTime(new Date());
         if (degreeRegistrationDao.update(degree) <= 0) {
             throw new BizException("更新支付状态失败");

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

@@ -282,6 +282,8 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 						tempPccs.setCourseCurrentPrice(pccs.getCourseCurrentPrice().divide(new BigDecimal(times), 2, BigDecimal.ROUND_DOWN));
 						tempPccs.setCourseOriginalPrice(pccs.getCourseOriginalPrice().divide(new BigDecimal(times), 2, BigDecimal.ROUND_DOWN));
 						tempPccs.setCourseTotalMinuties(pccs.getCourseTotalMinuties() / times);
+					} else {
+						continue;
 					}
 				}
 				totalPaymentAmount = totalPaymentAmount.add(tempPccs.getCourseCurrentPrice());

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

@@ -1196,11 +1196,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         List<StudentRegistration> students = new ArrayList<>();
         if (classGroupTypeSet.contains(ClassGroupTypeEnum.HIGH)) {
-            List<StudentRegistration> noHighClassGroupStudents = studentRegistrationService.findMusicGroupStuNoClassType(musicGroupId, ClassGroupTypeEnum.HIGH, null);
+            List<StudentRegistration> noHighClassGroupStudents = studentRegistrationService.findMusicGroupStuNoClassType(musicGroupId, null, ClassGroupTypeEnum.HIGH, null);
             students.addAll(noHighClassGroupStudents);
         }
         if (classGroupTypeSet.contains(ClassGroupTypeEnum.HIGH_ONLINE)) {
-            List<StudentRegistration> noHighOnlineClassGroupStudents = studentRegistrationService.findMusicGroupStuNoClassType(musicGroupId, ClassGroupTypeEnum.HIGH_ONLINE, null);
+            List<StudentRegistration> noHighOnlineClassGroupStudents = studentRegistrationService.findMusicGroupStuNoClassType(musicGroupId, null, ClassGroupTypeEnum.HIGH_ONLINE, null);
             students.addAll(noHighOnlineClassGroupStudents);
         }
 

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

@@ -113,7 +113,7 @@ public class SporadicChargeInfoImpl extends BaseServiceImpl<Integer, SporadicCha
             } else if (info.getChargeType().getCode() == 9) { //零星收费账户充值
                 sysUserCashAccountService.updateBalance(userId, studentPaymentOrder.getActualAmount(), PlatformCashAccountDetailTypeEnum.RECHARGE, "零星收费账户充值", studentPaymentOrder.getTransNo());
             } else if (info.getOrganId().equals(42) && info.getChargeType().equals(SporadicChargeTypeEnum.LEVEL)) {
-                degreeRegistrationService.updateStatus(studentPaymentOrder.getUserId(), 2, studentPaymentOrder.getOrderNo());
+                degreeRegistrationService.updateStatus(studentPaymentOrder);
                 return true;
             } else {
                 //插入交易明细
@@ -164,7 +164,7 @@ public class SporadicChargeInfoImpl extends BaseServiceImpl<Integer, SporadicCha
         }
         if (studentPaymentOrder.getStatus() == DealStatusEnum.CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED) {
             if (info.getOrganId().equals(42) && info.getChargeType().equals(SporadicChargeTypeEnum.LEVEL)) {
-                degreeRegistrationService.updateStatus(studentPaymentOrder.getUserId(), 0, studentPaymentOrder.getOrderNo());
+                degreeRegistrationService.updateStatus(studentPaymentOrder);
                 return true;
             }
 

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

@@ -59,6 +59,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private SysUserCashAccountService sysUserCashAccountService;
     @Autowired
     private SubjectChangeService subjectChangeService;
+    @Autowired
+    private DegreeRegistrationService degreeRegistrationService;
 
     @Override
     public BaseDAO<Long, StudentPaymentOrder> getDAO() {
@@ -293,6 +295,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             studentRepairService.goodsSellOrderCallback(order);
         } else if (order.getType().equals(OrderTypeEnum.SUBJECT_CHANGE)) {
             subjectChangeService.orderCallback(order);
+        } else if (order.getType().equals(OrderTypeEnum.DEGREE_REGISTRATION)) {
+            degreeRegistrationService.updateStatus(order);
         }
     }
 

+ 60 - 26
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -16,6 +16,8 @@ import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
 
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -28,23 +30,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
-import com.ym.mec.biz.dal.dao.GoodsDao;
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderCourseSettingsDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentStudentCourseDetailDao;
-import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
-import com.ym.mec.biz.dal.dao.MusicGroupSubjectPlanDao;
-import com.ym.mec.biz.dal.dao.StudentCourseFeeDetailDao;
-import com.ym.mec.biz.dal.dao.StudentDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
-import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
-import com.ym.mec.biz.dal.dao.SubjectChangeDao;
-import com.ym.mec.biz.dal.dao.SubjectDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.CourseFormDto;
 import com.ym.mec.biz.dal.dto.StudentAddDto;
 import com.ym.mec.biz.dal.dto.StudentApplyDetailDto;
@@ -115,6 +100,7 @@ import com.ym.mec.im.ImFeignService;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.http.HttpUtil;
+import org.springframework.util.CollectionUtils;
 
 @Service
 public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, StudentRegistration> implements StudentRegistrationService {
@@ -187,6 +173,8 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
     @Autowired
     private StudentCourseFeeDetailDao studentCourseFeeDetailDao;
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
 
     @Override
     public BaseDAO<Long, StudentRegistration> getDAO() {
@@ -1106,14 +1094,22 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         }
         musicGroupStudentFeeDao.insert(musicGroupStudentFee);
         
-        for(MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenderList){
-        	if(currentPaymentCalenderId.longValue() == musicGroupPaymentCalender.getId()){
-                //更新实际缴费人数
-        		musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + 1);
-        	}
-        	musicGroupPaymentCalender.setExpectNum(musicGroupPaymentCalender.getExpectNum() + 1);
-        	musicGroupPaymentCalender.setUpdateTime(nowDate);
-        }
+		for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenderList) {
+			if (currentPaymentCalenderId.longValue() == musicGroupPaymentCalender.getId()) {
+				// 更新实际缴费人数
+				if (musicGroupPaymentCalender.getActualNum() == null) {
+					musicGroupPaymentCalender.setActualNum(1);
+				} else {
+					musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + 1);
+				}
+			}
+			if (musicGroupPaymentCalender.getExpectNum() == null) {
+				musicGroupPaymentCalender.setExpectNum(1);
+			} else {
+				musicGroupPaymentCalender.setExpectNum(musicGroupPaymentCalender.getExpectNum() + 1);
+			}
+			musicGroupPaymentCalender.setUpdateTime(nowDate);
+		}
         if(musicGroupPaymentCalenderList.size() > 0){
         	musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenderList);
         }
@@ -1290,14 +1286,52 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
-    public List<StudentRegistration> findMusicGroupStuNoClassType(String musicGroupId, ClassGroupTypeEnum type, Integer subjectId) {
+    public List<StudentRegistration> findMusicGroupStuNoClassType(String musicGroupId, Long classGroupId, ClassGroupTypeEnum type, Integer subjectId) {
         List<StudentRegistration> students = studentRegistrationDao.findMusicGroupStudent(musicGroupId, subjectId);
         List<Subject> subjectList = subjectService.findAll(new HashMap<>());
 
+        Map<CourseSchedule.CourseScheduleType, Integer> courseTypeCourseDurationMap = new HashMap<>();
+        Map<CourseSchedule.CourseScheduleType, List<CourseSchedule>> typeCourseMap = new HashMap<>();
+        if(Objects.nonNull(classGroupId)){
+            List<CourseSchedule> classGroupNotStartCourse = courseScheduleDao.getClassGroupNotStartCourse(classGroupId);
+            typeCourseMap = classGroupNotStartCourse.stream().collect(Collectors.groupingBy(CourseSchedule::getType));
+            for (Map.Entry<CourseSchedule.CourseScheduleType, List<CourseSchedule>> typeCoursesEntry : typeCourseMap.entrySet()) {
+                int totalCourseDuration = 0;
+                for (CourseSchedule courseSchedule : typeCoursesEntry.getValue()) {
+                    //课程时长
+                    int courseDuration = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
+                    totalCourseDuration += courseDuration;
+                }
+                courseTypeCourseDurationMap.put(typeCoursesEntry.getKey(), totalCourseDuration);
+            }
+        }
+
         List<ClassGroupStudentMapper> classGroupStudentMappers = classGroupStudentMapperDao.findMusicGroupClassGroupByType(musicGroupId, type);
         Iterator<StudentRegistration> iterator = students.iterator();
         while (iterator.hasNext()) {
             StudentRegistration student = iterator.next();
+
+            boolean courseMinutesNotEnough = false;
+
+            for (Map.Entry<CourseSchedule.CourseScheduleType, List<CourseSchedule>> courseScheduleTypeListEntry : typeCourseMap.entrySet()) {
+                //当前课程类型总课程时长
+                Integer typeCourseDuration = courseTypeCourseDurationMap.get(courseScheduleTypeListEntry.getKey());
+
+                String batchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, student.getUserId(), courseScheduleTypeListEntry.getKey());
+
+                List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails = musicGroupPaymentStudentCourseDetailDao.getUnUseWithStudentAndCourseTypeAndCourseMinutes(batchNo, student.getUserId(), courseScheduleTypeListEntry.getKey());
+                int totalCourseMinutes = musicGroupPaymentStudentCourseDetails.stream().mapToInt(MusicGroupPaymentStudentCourseDetail::getTotalCourseMinutes).reduce(0, Integer::sum);
+                if(CollectionUtils.isEmpty(musicGroupPaymentStudentCourseDetails)||totalCourseMinutes<typeCourseDuration){
+                    iterator.remove();
+                    courseMinutesNotEnough = true;
+                    break;
+                }
+            }
+
+            if(courseMinutesNotEnough){
+                continue;
+            }
+
             for (Subject subject : subjectList) {
                 if (student.getActualSubjectId().equals(subject.getId())) {
                     student.setSubjectName(subject.getName());

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

@@ -45,6 +45,7 @@
     <resultMap type="com.ym.mec.biz.dal.dto.RemainCourseTypeDurationDto" id="RemainCourseTypeDurationDto">
         <result column="course_type_" property="courseType"/>
         <result column="remain_minutes_" property="remainMinutes"/>
+        <result column="temp_merged_course_num_" property="tempMergedCourseNum"/>
     </resultMap>
 
     <resultMap id="CourseScheduleEndDto" type="com.ym.mec.biz.dal.dto.CourseScheduleEndDto" extends="CourseSchedule">
@@ -3331,7 +3332,7 @@
 
     <select id="queryRemainCourseTypeDuration" resultMap="RemainCourseTypeDurationDto">
         SELECT cs.type_ course_type_,SUM(TIMESTAMPDIFF(MINUTE,STR_TO_DATE(concat(cs.class_date_,' ',cs.start_class_time_),'%Y-%m-%d %H:%i:%s'),
-        STR_TO_DATE(concat(cs.class_date_,' ',cs.end_class_time_),'%Y-%m-%d %H:%i:%s'))) remain_minutes_
+        STR_TO_DATE(concat(cs.class_date_,' ',cs.end_class_time_),'%Y-%m-%d %H:%i:%s'))) remain_minutes_,sum(case when cs.new_course_id_ is null then 0 else 1 end) temp_merged_course_num_
 		from course_schedule cs where FIND_IN_SET(cs.class_group_id_,#{classgroupId}) and cs.status_ = 'NOT_START' group by cs.type_
     </select>
 

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

@@ -395,8 +395,8 @@
 
 	<delete id="deleteStudentCourseSchedule">
 		DELETE FROM course_schedule_student_payment WHERE user_id_ = #{userId} AND course_schedule_id_ IN
-		<foreach collection="courseScheduleList" item="courseSchedule" index="index" open="(" close=")" separator=",">
-			#{courseSchedule.id}
+		<foreach collection="courseScheduleIdList" item="courseScheduleId" index="index" open="(" close=")" separator=",">
+			#{courseScheduleId}
 		</foreach>
 	</delete>
     <delete id="deleteByCourseSchedule">
@@ -607,6 +607,7 @@
 			LEFT JOIN vip_group_category vgc ON vg.vip_group_category_id_ = vgc.id_
 		WHERE
 			cssp.group_type_ = 'VIP'
+			AND cssp.create_time_ > '2020-11-11 00:00:00'
 			AND cssp.user_id_ IN
 			<foreach collection="userIds" item="userId" open="(" close=")" separator=",">
 				#{userId}

+ 18 - 4
mec-biz/src/main/resources/config/mybatis/DegreeRegistrationMapper.xml

@@ -5,6 +5,7 @@
         <!--@mbg.generated-->
         <!--@Table degree_registration-->
         <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="user_id_" property="userId"/>
         <result column="sporadic_id_" jdbcType="INTEGER" property="sporadicId"/>
         <result column="organ_id_" jdbcType="INTEGER" property="organId"/>
         <result column="order_no_" jdbcType="VARCHAR" property="orderNo"/>
@@ -25,6 +26,7 @@
         <result column="create_time_" jdbcType="TIMESTAMP" property="createTime"/>
         <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime"/>
         <result column="status_" jdbcType="TINYINT" property="status"/>
+        <result column="activity_tag_" property="activityTag"/>
     </resultMap>
 
     <select id="get" parameterType="java.lang.Integer" resultMap="DegreeRegistration">
@@ -121,22 +123,25 @@
     <insert id="insert" keyColumn="id_" keyProperty="id" parameterType="com.ym.mec.biz.dal.entity.DegreeRegistration"
             useGeneratedKeys="true">
         <!--@mbg.generated-->
-        insert into degree_registration (sporadic_id_,organ_id_,order_no_, name_, gender_,
+        insert into degree_registration (user_id_,sporadic_id_,organ_id_,order_no_, name_, gender_,
         idcard_, city_, school_,
         subject_,level_, theory_level_,theory_money_, theory_cert_,mobile_,
         money_, memo_, create_time_,
-        update_time_, status_)
-        values (#{sporadicId,jdbcType=INTEGER},#{organId,jdbcType=INTEGER}, #{orderNo,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{gender,jdbcType=VARCHAR},
+        update_time_, status_, activity_tag_)
+        values (#{userId},#{sporadicId,jdbcType=INTEGER},#{organId,jdbcType=INTEGER}, #{orderNo,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{gender,jdbcType=VARCHAR},
         #{idcard,jdbcType=VARCHAR}, #{city,jdbcType=VARCHAR}, #{school,jdbcType=VARCHAR},
         #{subject,jdbcType=VARCHAR},#{level,jdbcType=VARCHAR},
         #{theoryLevel,jdbcType=VARCHAR},#{theoryMoney,jdbcType=DECIMAL},
         #{theoryCert,jdbcType=VARCHAR},#{mobile,jdbcType=VARCHAR},#{money,jdbcType=DECIMAL}, #{memo,jdbcType=VARCHAR},
-        #{createTime}, #{updateTime}, #{status,jdbcType=TINYINT})
+        #{createTime}, #{updateTime}, #{status,jdbcType=TINYINT}, #{activityTag})
     </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.DegreeRegistration">
         <!--@mbg.generated-->
         update degree_registration
         <set>
+            <if test="userId != null">
+                user_id_ = #{userId},
+            </if>
             <if test="organId != null">
                 organ_id_ = #{organId,jdbcType=INTEGER},
             </if>
@@ -197,6 +202,9 @@
             <if test="status != null">
                 status_ = #{status,jdbcType=INTEGER},
             </if>
+            <if test="activityTag != null">
+                activity_tag_ = #{activityTag},
+            </if>
         </set>
         where id_ = #{id,jdbcType=INTEGER}
     </update>
@@ -214,4 +222,10 @@
         WHERE id_ = #{id} FOR
         UPDATE
     </select>
+
+    <select id="getWithUserIdAndActivityTag" resultMap="DegreeRegistration">
+        select *
+        from degree_registration
+        where user_id_ = #{userId} AND activity_tag_=#{activityTag}
+    </select>
 </mapper>

+ 8 - 0
mec-biz/src/main/resources/config/mybatis/PracticeGroupSellPriceMapper.xml

@@ -11,6 +11,14 @@
 		<result column="twice_original_price" property="twiceOriginalPrice" />
 		<result column="twice_activity_price" property="twiceActivityPrice" />
 		<result column="twice_quart_activity_price_" property="twiceQuartActivityPrice" />
+		<result column="vip_one_student_twelve_course_original_price_with_new_user" property="vipOneStudentTwelveCourseOriginalPriceWithNewUser" />
+		<result column="vip_one_student_twelve_course_activity_price_with_new_user" property="vipOneStudentTwelveCourseActivityPriceWithNewUser" />
+		<result column="vip_one_student_twelve_course_original_price_with_old_user" property="vipOneStudentTwelveCourseOriginalPriceWithOldUser" />
+		<result column="vip_one_student_twelve_course_activity_price_with_old_user" property="vipOneStudentTwelveCourseActivityPriceWithOldUser" />
+		<result column="high_online_ten_course_original_price_with_new_user" property="highOnlineTenCourseOriginalPriceWithNewUser" />
+		<result column="high_online_ten_course_activity_price_with_new_user" property="highOnlineTenCourseActivityPriceWithNewUser" />
+		<result column="high_online_ten_course_original_price_with_old_user" property="highOnlineTenCourseOriginalPriceWithOldUser" />
+		<result column="high_online_ten_course_activity_price_with_old_user" property="highOnlineTenCourseActivityPriceWithOldUser" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
 	</resultMap>

+ 4 - 0
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -14,6 +14,7 @@
         <result column="operating_temp_tag_" property="operatingTempTag"/>
         <result column="teacher_id_" property="teacherId"/>
         <result column="teacher_name_" property="teacherName"/>
+        <result column="is_new_user_" property="isNewUser"/>
         <result column="create_time_" property="createTime"/>
         <result column="update_time_" property="updateTime"/>
     </resultMap>
@@ -91,6 +92,9 @@
             <if test="teacherId != null">
                 teacher_id_=#{teacherId},
             </if>
+            <if test="isNewUser != null">
+                is_new_user_=#{isNewUser},
+            </if>
                 update_time_ = NOW()
         </set>
         WHERE user_id_ = #{userId}

+ 15 - 22
mec-student/src/main/java/com/ym/mec/student/controller/DegreeController.java

@@ -1,9 +1,11 @@
 package com.ym.mec.student.controller;
 
 
+import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.DegreeRegistrationDao;
 import com.ym.mec.biz.dal.dao.SporadicChargeInfoDao;
+import com.ym.mec.biz.dal.dto.DegreeRegistrationActivityDto;
 import com.ym.mec.biz.dal.dto.SporadicPayDto;
 import com.ym.mec.biz.dal.entity.DegreeRegistration;
 import com.ym.mec.biz.dal.entity.Employee;
@@ -30,6 +32,7 @@ import org.springframework.web.bind.annotation.*;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 @RequestMapping("degree")
 @Api(tags = "考级报名服务")
@@ -51,33 +54,27 @@ public class DegreeController extends BaseController {
     @Autowired
     private SporadicChargeInfoService sporadicChargeInfoService;
 
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
 
     @ApiOperation(value = "考级报名支付")
     @PostMapping("/pay")
-    public HttpResponseResult pay(DegreeRegistration degreeRegistration) throws Exception {
-        if (degreeRegistration == null ||
-                degreeRegistration.getSporadicId() == null ||
-                degreeRegistration.getName() == null ||
-                degreeRegistration.getGender() == null ||
-                degreeRegistration.getIdcard() == null ||
-                degreeRegistration.getCity() == null ||
-                degreeRegistration.getSchool() == null ||
-                degreeRegistration.getSubject() == null ||
-                degreeRegistration.getTheoryLevel() == null ||
-                degreeRegistration.getMobile() == null
-
-        ) {
-            throw new BizException("必填参数不能为空");
-        }
-        if (!CommonValidator.isMobileNo(degreeRegistration.getMobile())) {
-            throw new BizException("手机号码不正确,请核对");
+    public HttpResponseResult pay(DegreeRegistrationActivityDto degreeRegistration) throws Exception {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(user)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
         }
+        degreeRegistration.setUserId(user.getId());
 
         IdcardValidator idcardValidator = new IdcardValidator();
         if (!idcardValidator.isValidatedAllIdcard(degreeRegistration.getIdcard())) {
             throw new BizException("身份证号不正确,请核对");
         }
 
+        if(Objects.isNull(degreeRegistration.getOrganId())){
+            return failed("该分部暂未参与此活动");
+        }
+
         SporadicChargeInfo info = sporadicChargeInfoDao.get(degreeRegistration.getSporadicId());
         if (info == null || info.getDelFlag().equals(1)) {
             return failed("报名信息不存在");
@@ -88,11 +85,7 @@ public class DegreeController extends BaseController {
 
         DegreeRegistration degree = degreeRegistrationDao.findByMobileAndSporadicId(degreeRegistration.getMobile(), degreeRegistration.getSporadicId());
 
-        if (degree != null && degree.getStatus().equals(2)) {
-            return failed("您本次已报名,请勿重复报名");
-        }
-
-        if (!degreeRegistration.getIsRepay() && degree != null) {
+        if (!degreeRegistration.getIsRepay() && degree != null && degree.getStatus().equals(1)) {
             Integer ingOrder = studentPaymentOrderService.findOrderByGroupType(degree.getId(), degreeRegistration.getSporadicId(), "SPORADIC", DealStatusEnum.ING);
             if (ingOrder != null && ingOrder > 0) {
                 return failed(HttpStatus.CONTINUE, "您有待支付的订单");

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

@@ -161,12 +161,12 @@ public class PracticeGroupController extends BaseController {
 
     @ApiOperation("获取陪练课预约参数——付费")
     @GetMapping(value = "/getPayPracticeApplyParams")
-    public Object getPayPracticeApplyParams(){
+    public Object getPayPracticeApplyParams(Integer organId){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        return succeed(practiceGroupService.getPayPracticeApplyParams(sysUser.getId(), sysUser.getOrganId()));
+        return succeed(practiceGroupService.getPayPracticeApplyParams(sysUser.getId(), Objects.nonNull(organId)?organId:sysUser.getOrganId()));
     }
 
     @ApiOperation("获取指定教师的空闲时间——付费")

+ 11 - 1
mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java

@@ -1,6 +1,7 @@
 package com.ym.mec.web.controller;
 
 import com.ym.mec.biz.dal.dto.MergeClassSplitClassAffirmDto;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -26,6 +27,7 @@ import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.ClassGroup4MixDto;
 import com.ym.mec.biz.dal.dto.HighClassGroupDto;
+import com.ym.mec.biz.dal.dto.RemainCourseTypeDurationDto;
 import com.ym.mec.biz.dal.dto.TestDto;
 import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
@@ -39,6 +41,7 @@ import com.ym.mec.biz.service.ClassGroupService;
 import com.ym.mec.biz.service.ClassGroupTeacherMapperService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 
@@ -333,7 +336,14 @@ public class ClassGroupController extends BaseController {
     @GetMapping("/queryRemainCourseTypeDuration")
     @PreAuthorize("@pcs.hasPermissions('classGroup/queryRemainCourseTypeDuration')")
     public HttpResponseResult queryRemainCourseTypeDuration(String classGroupIdList){
-        return succeed(classGroupService.queryRemainCourseTypeDuration(classGroupIdList));
+    	
+    	List<RemainCourseTypeDurationDto> remainCourseTypeDurationDtoList = classGroupService.queryRemainCourseTypeDuration(classGroupIdList);
+    	for (RemainCourseTypeDurationDto dto : remainCourseTypeDurationDtoList) {
+			if(dto.getTempMergedCourseNum() > 0){
+				throw new BizException("班级中含有临时合并的课程,不能");
+			}
+		}
+        return succeed(remainCourseTypeDurationDtoList);
     }
 
     @ApiOperation(value = "进行中乐团-修改-班级详情-学员班级调整-班级剩余课次")

+ 2 - 2
mec-web/src/main/java/com/ym/mec/web/controller/StudentRegistrationController.java

@@ -136,8 +136,8 @@ public class StudentRegistrationController extends BaseController {
     @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团编号", required = true, dataType = "String"),
             @ApiImplicitParam(name = "type", value = "类型(MIX,HIGH)", required = true, dataType = "ClassGroupTypeEnum"),
             @ApiImplicitParam(name = "actualSubjectId", value = "科目(声部)id,", required = false, dataType = "int")})
-    public HttpResponseResult getMusicGroupStuNoClassType(String musicGroupId, ClassGroupTypeEnum type, Integer actualSubjectId) {
-        return succeed(studentRegistrationService.findMusicGroupStuNoClassType(musicGroupId, type, actualSubjectId));
+    public HttpResponseResult getMusicGroupStuNoClassType(String musicGroupId, Long classGroupId, ClassGroupTypeEnum type, Integer actualSubjectId) {
+        return succeed(studentRegistrationService.findMusicGroupStuNoClassType(musicGroupId, classGroupId, type, actualSubjectId));
     }
 
     @ApiOperation(value = "获取学生报名缴费详情")