Pārlūkot izejas kodu

Merge branch 'online1' of http://git.dayaedu.com/yonge/mec into saas

zouxuan 3 gadi atpakaļ
vecāks
revīzija
13481fff31
100 mainītis faili ar 3388 papildinājumiem un 235 dzēšanām
  1. 20 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/LoginEntity.java
  2. 10 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/filter/PhoneLoginAuthenticationFilter.java
  3. 1 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/PhoneAuthenticationProvider.java
  4. 1 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysUserService.java
  5. 11 2
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserServiceImpl.java
  6. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperAdjustLogDao.java
  7. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperDao.java
  8. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  9. 5 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/DegreeRegistrationDao.java
  10. 55 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/FinancialExpenditureDao.java
  11. 12 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LuckDrawLogDao.java
  12. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LuckDrawPrizeDao.java
  13. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/QuestionnaireUserResultDao.java
  14. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  15. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicScoreCategoriesDao.java
  16. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  17. 35 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityStudentAdjustDto.java
  18. 124 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityStudentDto.java
  19. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityUserMapperAddDto.java
  20. 26 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OaColumnDto.java
  21. 25 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OaFormStructureDto.java
  22. 56 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OaInputDto.java
  23. 93 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PWorkOrderInfo.java
  24. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PageInfoDegree.java
  25. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PracticeBuyResultDto.java
  26. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/QuestionnaireResultDto.java
  27. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ActivityUserMapper.java
  28. 146 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ActivityUserMapperAdjustLog.java
  29. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/DegreeRegistration.java
  30. 54 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/FinancialExpenditure.java
  31. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/PracticeGroup.java
  32. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPreRegistration.java
  33. 50 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScore.java
  34. 33 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScoreAccompaniment.java
  35. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScoreCategories.java
  36. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroupActivity.java
  37. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExpenditureTypeEnum.java
  38. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/FeeProjectEnum.java
  39. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/GroupType.java
  40. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/QuestionnaireActiveTypeEnum.java
  41. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ReturnFeeEnum.java
  42. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ActivityStudentQueryInfo.java
  43. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/DegreeQueryInfo.java
  44. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/LuckDrawQueryInfo.java
  45. 68 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentActivityQueryInfo.java
  46. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperAdjustLogService.java
  47. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperService.java
  48. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/service/FinancialExpenditureService.java
  49. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/service/GroupClassService.java
  50. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/service/LuckDrawLogService.java
  51. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  52. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/PracticeGroupService.java
  53. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/service/QuestionnaireUserResultService.java
  54. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  55. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  56. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  57. 1 2
      mec-biz/src/main/java/com/ym/mec/biz/service/UploadFileService.java
  58. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java
  59. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperAdjustLogServiceImpl.java
  60. 192 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperServiceImpl.java
  61. 18 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/DegreeRegistrationServiceImpl.java
  62. 22 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EduPracticeGroupServiceImpl.java
  63. 322 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/FinancialExpenditureServiceImpl.java
  64. 130 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/GroupClassServiceImpl.java
  65. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/LuckDrawLogServiceImpl.java
  66. 38 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/LuckDrawPrizeServiceImpl.java
  67. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java
  68. 257 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  69. 123 57
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  70. 41 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/QuestionnaireUserResultServiceImpl.java
  71. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ReplacementInstrumentActivityServiceImpl.java
  72. 48 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  73. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  74. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java
  75. 122 19
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  76. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java
  77. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreServiceImpl.java
  78. 159 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  79. 109 0
      mec-biz/src/main/resources/config/mybatis/ActivityUserMapperAdjustLogMapper.xml
  80. 80 5
      mec-biz/src/main/resources/config/mybatis/ActivityUserMapperMapper.xml
  81. 36 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  82. 27 2
      mec-biz/src/main/resources/config/mybatis/DegreeRegistrationMapper.xml
  83. 35 0
      mec-biz/src/main/resources/config/mybatis/FinancialExpenditureMapper.xml
  84. 9 1
      mec-biz/src/main/resources/config/mybatis/LuckDrawLogMapper.xml
  85. 45 0
      mec-biz/src/main/resources/config/mybatis/LuckDrawPrizeMapper.xml
  86. 1 1
      mec-biz/src/main/resources/config/mybatis/PracticeGroupMapper.xml
  87. 24 1
      mec-biz/src/main/resources/config/mybatis/QuestionnaireUserResultMapper.xml
  88. 48 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  89. 13 10
      mec-biz/src/main/resources/config/mybatis/SysMusicScoreAccompanimentMapper.xml
  90. 21 5
      mec-biz/src/main/resources/config/mybatis/SysMusicScoreCategoriesMapper.xml
  91. 18 4
      mec-biz/src/main/resources/config/mybatis/SysMusicScoreMapper.xml
  92. 22 0
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  93. 10 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/UploadReturnBean.java
  94. 75 46
      mec-student/src/main/java/com/ym/mec/student/controller/DegreeController.java
  95. 4 4
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  96. 5 3
      mec-student/src/main/java/com/ym/mec/student/controller/PracticeGroupController.java
  97. 2 2
      mec-student/src/main/java/com/ym/mec/student/controller/RepairController.java
  98. 2 2
      mec-student/src/main/java/com/ym/mec/student/controller/ReplacementInstrumentActivityController.java
  99. 2 2
      mec-student/src/main/java/com/ym/mec/student/controller/SporadicChargeInfoController.java
  100. 36 0
      mec-student/src/main/java/com/ym/mec/student/controller/StudentController.java

+ 20 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/LoginEntity.java

@@ -12,6 +12,10 @@ public class LoginEntity {
     private String phone;
     
     private String deviceNum;
+    
+    private String tenantId;
+    
+    private String organId;
 
     public Boolean getIsRegister() {
 		return isRegister;
@@ -60,4 +64,20 @@ public class LoginEntity {
 	public void setDeviceNum(String deviceNum) {
 		this.deviceNum = deviceNum;
 	}
+
+	public String getTenantId() {
+		return tenantId;
+	}
+
+	public void setTenantId(String tenantId) {
+		this.tenantId = tenantId;
+	}
+
+	public String getOrganId() {
+		return organId;
+	}
+
+	public void setOrganId(String organId) {
+		this.organId = organId;
+	}
 }

+ 10 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/filter/PhoneLoginAuthenticationFilter.java

@@ -25,6 +25,10 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 	private static final String SPRING_SECURITY_RESTFUL_VERIFY_CODE_KEY = "smsCode";
 	private static final String clientIdParameter = "clientId";
 	private static final String IS_LESSEE = "isLessee";
+
+	private static final String TENANT_ID = "tenantId";
+
+	private static final String ORGAN_ID = "organId";
 	
 	private static final String DEVICE_NUM = "deviceNum";
 
@@ -47,6 +51,10 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 		String credentials = obtainParameter(request, SPRING_SECURITY_RESTFUL_VERIFY_CODE_KEY);
 		// 是否是租户
 		String isLessee = obtainParameter(request, IS_LESSEE);
+		
+		String tenantId = obtainParameter(request, TENANT_ID);
+		
+		String organId = obtainParameter(request, ORGAN_ID);
 
 		boolean isRegister = StringUtils.equals("1", isLessee) || StringUtils.equals("true", isLessee);
 
@@ -66,6 +74,8 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 		loginEntity.setSmsCode(credentials);
 		loginEntity.setIsRegister(isRegister);
 		loginEntity.setDeviceNum(deviceNum);
+		loginEntity.setOrganId(organId);
+		loginEntity.setTenantId(tenantId);
 
 		authRequest = new PhoneAuthenticationToken(SecurityConstants.PHONE_PRINCIPAL_PREFIX + principal, loginEntity);
 

+ 1 - 1
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/PhoneAuthenticationProvider.java

@@ -71,7 +71,7 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
 				throw new LockedException("用户不存在");
 			}
 			
-			userInfo = sysUserService.initUser(loginEntity.getPhone(), clientId);
+			userInfo = sysUserService.initUser(loginEntity.getTenantId(), loginEntity.getOrganId(), loginEntity.getPhone(), clientId);
 			
 			if (StringUtils.isNotBlank(deviceNum)) {
 				sysUserDeviceService.bindDevice(clientId, userInfo.getSysUser().getId(), deviceNum);

+ 1 - 1
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysUserService.java

@@ -103,7 +103,7 @@ public interface SysUserService extends BaseService<Integer, SysUser> {
 	 * @param clientId
 	 * @return
 	 */
-	SysUserInfo initUser(String phone,String clientId);
+	SysUserInfo initUser(String tenantId, String organId, String phone,String clientId);
 
 	/**
 	 * 刷新token

+ 11 - 2
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserServiceImpl.java

@@ -153,7 +153,7 @@ public class SysUserServiceImpl extends BaseServiceImpl<Integer, SysUser> implem
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public SysUserInfo initUser(String phone, String clientId) {
+	public SysUserInfo initUser(String tenantId, String organId, String phone,String clientId) {
 		if(StringUtils.equalsIgnoreCase(clientId,"TEACHER")){
 			SysUser sysUser = new SysUser();
 			sysUser.setPhone(phone);
@@ -171,7 +171,16 @@ public class SysUserServiceImpl extends BaseServiceImpl<Integer, SysUser> implem
 			SysUser sysUser = new SysUser();
 			sysUser.setPhone(phone);
 			sysUser.setUserType("STUDENT");
-			sysUser.setOrganId(lesseeOrganId);
+			if(StringUtils.isBlank(organId)){
+				sysUser.setOrganId(lesseeOrganId);
+			}else{
+				sysUser.setOrganId(Integer.parseInt(organId));
+			}
+			//注册是否赠送会员
+			if(sysUser.getOrganId() == 59){
+				
+			}
+			
 			sysUserDao.insert(sysUser);
 			sysUserService.saveStudent(sysUser.getId());
 			//添加用户现金账户

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperAdjustLogDao.java

@@ -0,0 +1,13 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.entity.ActivityUserMapperAdjustLog;
+import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface ActivityUserMapperAdjustLogDao extends BaseDAO<Integer, ActivityUserMapperAdjustLog> {
+
+
+    void batchInsert(@Param("logs") List<ActivityUserMapperAdjustLog> activityUserMapperAdjustLogs);
+}

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperDao.java

@@ -1,11 +1,13 @@
 package com.ym.mec.biz.dal.dao;
 
+import com.ym.mec.biz.dal.dto.ActivityStudentDto;
 import com.ym.mec.biz.dal.entity.ActivityUserMapper;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
+import java.util.Map;
 
 @Component
 public interface ActivityUserMapperDao extends BaseDAO<Integer, ActivityUserMapper> {
@@ -85,4 +87,22 @@ public interface ActivityUserMapperDao extends BaseDAO<Integer, ActivityUserMapp
      * @date 2021/11/1 16:21
      */
     void updateTeacherId(@Param("userId") Integer userId, @Param("teacherId") Integer teacherId);
+
+    /**
+    * @description: 获取学员活动排课资格列表
+     * @param params
+    * @return int
+    * @author zx
+    * @date 2021/11/15 16:38
+    */
+    int countActivityUserMapper(Map<String, Object> params);
+
+    /**
+     * @description: 获取学员活动排课资格列表
+     * @param params
+     * @return int
+     * @author zx
+     * @date 2021/11/15 16:38
+     */
+    List<ActivityStudentDto> queryActivityUserMapper(Map<String, Object> params);
 }

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

@@ -1962,4 +1962,13 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @return
      */
     int getCourseNumNo(@Param("schoolTerm") MusicGroupTrainPlanSaveDto schoolTerm);
+
+    /**
+    * @description: 获取有课、没课的学员列表
+     * @param params
+    * @return java.util.List<java.lang.Integer>
+    * @author zx
+    * @date 2021/11/15 17:23
+    */
+    List<Integer> queryHasCourseStudentIds(Map<String, Object> params);
 }

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

@@ -17,8 +17,12 @@ public interface DegreeRegistrationDao extends BaseDAO<Integer, DegreeRegistrati
 
     DegreeRegistration getTotalAmount(Map<String, Object> params);
 
+    int countApplyNum(Map<String, Object> params);
+
     DegreeRegistration getWithUserIdAndActivityTag(@Param("degree") DegreeRegistration degree);
 
     List<DegreeRegistration> getUserLevelDegrees(@Param("userId") Integer userId,
-                                                 @Param("activityTag") String activityTag);
+                                                 @Param("activityTag") String activityTag,
+                                                 @Param("degreeType") Integer degreeType,
+                                                 @Param("sporadicId") Integer sporadicId);
 }

+ 55 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/FinancialExpenditureDao.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.FinancialExpenditureDto;
+import com.ym.mec.biz.dal.dto.PWorkOrderInfo;
 import com.ym.mec.biz.dal.entity.FinancialExpenditure;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
@@ -36,4 +37,58 @@ public interface FinancialExpenditureDao extends BaseDAO<Long, FinancialExpendit
      * @time 11:38
      */
     List<String> countBydingTalk(@Param("collect") List<Object> collect);
+
+    /**
+    * @description: 同步oa审批到支出记录
+     * @param workOrderId
+    * @return java.lang.Boolean
+    * @author zx
+    * @date 2021/11/25 16:09
+    */
+    PWorkOrderInfo getWorkOrderInfo(Integer workOrderId);
+
+    /**
+    * @description: 获取oa表单模板
+     * @param workOrderId
+    * @return java.lang.String
+    * @author zx
+    * @date 2021/11/25 16:55
+    */
+    String getFormStructure(Integer workOrderId);
+
+    /**
+    * @description: 获取oa表单
+     * @param workOrderId
+    * @return java.lang.String
+    * @author zx
+    * @date 2021/11/26 10:09
+    */
+    String getFormData(Integer workOrderId);
+
+    /**
+    * @description: 获取模板
+     * @param tplInfoId
+    * @return java.lang.String
+    * @author zx
+    * @date 2021/11/29 15:16
+    */
+    String getTplInfo(String tplInfoId);
+
+    /**
+    * @description: 是否同步过数据
+     * @param workOrderId
+    * @return java.lang.Boolean
+    * @author zx
+    * @date 2021/11/29 16:48
+    */
+    Integer findByBatchNoAndProcessNo(Integer workOrderId);
+
+    /**
+    * @description: 获取社保分部
+     * @param deptId
+    * @return java.lang.Integer
+    * @author zx
+    * @date 2021/11/30 14:40
+    */
+    Integer getDeptId(Integer deptId);
 }

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

@@ -2,7 +2,18 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.entity.LuckDrawLog;
 import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface LuckDrawLogDao extends BaseDAO<Long, LuckDrawLog> {
-	
+
+    /**
+    * @description: 奖品已使用的名称
+     * @param allPrizeIds
+    * @return java.lang.String
+    * @author zx
+    * @date 2021/11/19 15:46
+    */
+    String countUseNumByIds(@Param("prizeIds") List<Integer> allPrizeIds);
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LuckDrawPrizeDao.java

@@ -5,6 +5,7 @@ import java.util.List;
 import com.ym.mec.biz.dal.dto.HorseRaceLampDto;
 import com.ym.mec.biz.dal.entity.LuckDrawPrize;
 import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
 
 public interface LuckDrawPrizeDao extends BaseDAO<Integer, LuckDrawPrize> {
 
@@ -44,4 +45,10 @@ public interface LuckDrawPrizeDao extends BaseDAO<Integer, LuckDrawPrize> {
 	* @date 2021/10/19 15:35
 	*/
     List<HorseRaceLampDto> queryHorseRaceLampDto(int groupId);
+
+	void batchUpdate(@Param("updateDraw") List<LuckDrawPrize> updateDraw);
+
+    void deleteByIds(@Param("prizeIds") List<Integer> allPrizeIds);
+
+	List<LuckDrawPrize> findByGroupId(@Param("groupId") Integer groupId);
 }

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/QuestionnaireUserResultDao.java

@@ -38,4 +38,8 @@ public interface QuestionnaireUserResultDao extends BaseDAO<Long, QuestionnaireU
     List<QuestionnaireResultDto> getQuestionResult(@Param("activeId") Integer activeId, @Param("activeType") String activeType);
 
     List<Map<Integer, String>> queryUserName(String activeType);
+
+    List<QuestionnaireUserResultDto> findResultCount(Map<String, Object> params);
+
+    int countResultCount(Map<String, Object> params);
 }

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -414,4 +414,10 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     * @date 2021/10/13 13:34
     */
     void updateStudentMember(@Param("student") Student student);
+
+    int countStudent(Map<String, Object> params);
+
+    List<Student> queryStudent(Map<String, Object> params);
+
+    List<Map<Integer, String>> getStudentTeacherMap(List<Integer> studentIds);
 }

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicScoreCategoriesDao.java

@@ -6,6 +6,8 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 public interface SysMusicScoreCategoriesDao extends BaseDAO<Integer, SysMusicScoreCategories> {
 
@@ -20,4 +22,6 @@ public interface SysMusicScoreCategoriesDao extends BaseDAO<Integer, SysMusicSco
     void batchUpdate(@Param("categories") List<SysMusicScoreCategories> updateCategories, @Param("organId") String organId, @Param("enable") Boolean enable);
 
     void enable(@Param("categoriesIds") String categoriesIds, @Param("enable") boolean enable);
+
+    List<Map<Integer, String>> queryOrganByIds(@Param("categoriesIds") Set<Integer> categoriesIds);
 }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java

@@ -130,6 +130,9 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
     List<ExtendTeacherBasicDto> findTeaTeachersByOrganAndSubject3(@Param("organId") Integer organId,
                                                                   @Param("subjectId") Integer subjectId);
 
+    List<ExtendTeacherBasicDto> findTeaTeachersByOrganAndSubject4(@Param("organIdList") String organIdList,
+                                                                  @Param("subjectId") Integer subjectId);
+
     /**
      * @param organIds:   部门编号列表
      * @param subjectIds: 声部编号列表

+ 35 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityStudentAdjustDto.java

@@ -0,0 +1,35 @@
+package com.ym.mec.biz.dal.dto;
+
+public class ActivityStudentAdjustDto {
+
+    private Integer userId;
+
+    private Integer courseNum = 0;
+
+    private Integer giveCourseNum = 0;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getCourseNum() {
+        return courseNum;
+    }
+
+    public void setCourseNum(Integer courseNum) {
+        this.courseNum = courseNum;
+    }
+
+    public Integer getGiveCourseNum() {
+        return giveCourseNum;
+    }
+
+    public void setGiveCourseNum(Integer giveCourseNum) {
+        this.giveCourseNum = giveCourseNum;
+    }
+
+}

+ 124 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityStudentDto.java

@@ -0,0 +1,124 @@
+package com.ym.mec.biz.dal.dto;
+
+public class ActivityStudentDto{
+
+    private String organName;
+
+    private Integer userId;
+
+    private String username;
+
+    private String phone;
+
+    private Integer freeVipNum;
+
+    private Integer useVipNum;
+
+    private Integer freeGiveVipNum;
+
+    private Integer useGiveVipNum;
+
+    private Integer freePracticeNum;
+
+    private Integer usePracticeNum;
+
+    private Integer freeGivePracticeNum;
+
+    private Integer useGivePracticeNum;
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getFreeVipNum() {
+        return freeVipNum;
+    }
+
+    public void setFreeVipNum(Integer freeVipNum) {
+        this.freeVipNum = freeVipNum;
+    }
+
+    public Integer getUseVipNum() {
+        return useVipNum;
+    }
+
+    public void setUseVipNum(Integer useVipNum) {
+        this.useVipNum = useVipNum;
+    }
+
+    public Integer getFreeGiveVipNum() {
+        return freeGiveVipNum;
+    }
+
+    public void setFreeGiveVipNum(Integer freeGiveVipNum) {
+        this.freeGiveVipNum = freeGiveVipNum;
+    }
+
+    public Integer getUseGiveVipNum() {
+        return useGiveVipNum;
+    }
+
+    public void setUseGiveVipNum(Integer useGiveVipNum) {
+        this.useGiveVipNum = useGiveVipNum;
+    }
+
+    public Integer getFreePracticeNum() {
+        return freePracticeNum;
+    }
+
+    public void setFreePracticeNum(Integer freePracticeNum) {
+        this.freePracticeNum = freePracticeNum;
+    }
+
+    public Integer getUsePracticeNum() {
+        return usePracticeNum;
+    }
+
+    public void setUsePracticeNum(Integer usePracticeNum) {
+        this.usePracticeNum = usePracticeNum;
+    }
+
+    public Integer getFreeGivePracticeNum() {
+        return freeGivePracticeNum;
+    }
+
+    public void setFreeGivePracticeNum(Integer freeGivePracticeNum) {
+        this.freeGivePracticeNum = freeGivePracticeNum;
+    }
+
+    public Integer getUseGivePracticeNum() {
+        return useGivePracticeNum;
+    }
+
+    public void setUseGivePracticeNum(Integer useGivePracticeNum) {
+        this.useGivePracticeNum = useGivePracticeNum;
+    }
+}

+ 36 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityUserMapperAddDto.java

@@ -0,0 +1,36 @@
+package com.ym.mec.biz.dal.dto;
+
+import java.util.List;
+
+public class ActivityUserMapperAddDto {
+
+    private Integer activityId;
+
+    private String memo;
+
+    private List<ActivityStudentAdjustDto> activityStudentAdjustDtos;
+
+    public List<ActivityStudentAdjustDto> getActivityStudentAdjustDtos() {
+        return activityStudentAdjustDtos;
+    }
+
+    public void setActivityStudentAdjustDtos(List<ActivityStudentAdjustDto> activityStudentAdjustDtos) {
+        this.activityStudentAdjustDtos = activityStudentAdjustDtos;
+    }
+
+    public Integer getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(Integer activityId) {
+        this.activityId = activityId;
+    }
+
+    public String getMemo() {
+        return memo;
+    }
+
+    public void setMemo(String memo) {
+        this.memo = memo;
+    }
+}

+ 26 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OaColumnDto.java

@@ -0,0 +1,26 @@
+package com.ym.mec.biz.dal.dto;
+
+import java.util.List;
+
+public class OaColumnDto {
+
+    private Integer span;
+
+    private List<OaInputDto> list;
+
+    public Integer getSpan() {
+        return span;
+    }
+
+    public void setSpan(Integer span) {
+        this.span = span;
+    }
+
+    public List<OaInputDto> getList() {
+        return list;
+    }
+
+    public void setList(List<OaInputDto> list) {
+        this.list = list;
+    }
+}

+ 25 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OaFormStructureDto.java

@@ -0,0 +1,25 @@
+package com.ym.mec.biz.dal.dto;
+
+import java.util.List;
+
+public class OaFormStructureDto {
+    private Integer id;
+
+    private List<OaInputDto> list;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public List<OaInputDto> getList() {
+        return list;
+    }
+
+    public void setList(List<OaInputDto> list) {
+        this.list = list;
+    }
+}

+ 56 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OaInputDto.java

@@ -0,0 +1,56 @@
+package com.ym.mec.biz.dal.dto;
+
+import java.util.List;
+
+public class OaInputDto {
+
+    private String key;
+
+    private String type;
+
+    private String model;
+
+    private String name;
+
+    private List<OaColumnDto> columns;
+
+    public List<OaColumnDto> getColumns() {
+        return columns;
+    }
+
+    public void setColumns(List<OaColumnDto> columns) {
+        this.columns = columns;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getModel() {
+        return model;
+    }
+
+    public void setModel(String model) {
+        this.model = model;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 93 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PWorkOrderInfo.java

@@ -0,0 +1,93 @@
+package com.ym.mec.biz.dal.dto;
+
+public class PWorkOrderInfo {
+    private Integer id;
+
+    private Integer process;
+
+    private Integer classify;
+
+    private Boolean isEnd;
+
+    private Boolean isDenied;
+
+    private Boolean isCancel;
+
+    private Integer creator;
+
+    private String title;
+
+    private Integer deptId;
+
+    public Integer getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(Integer deptId) {
+        this.deptId = deptId;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getProcess() {
+        return process;
+    }
+
+    public void setProcess(Integer process) {
+        this.process = process;
+    }
+
+    public Integer getClassify() {
+        return classify;
+    }
+
+    public void setClassify(Integer classify) {
+        this.classify = classify;
+    }
+
+    public Boolean getEnd() {
+        return isEnd;
+    }
+
+    public void setEnd(Boolean end) {
+        isEnd = end;
+    }
+
+    public Boolean getDenied() {
+        return isDenied;
+    }
+
+    public void setDenied(Boolean denied) {
+        isDenied = denied;
+    }
+
+    public Boolean getCancel() {
+        return isCancel;
+    }
+
+    public void setCancel(Boolean cancel) {
+        isCancel = cancel;
+    }
+
+    public Integer getCreator() {
+        return creator;
+    }
+
+    public void setCreator(Integer creator) {
+        this.creator = creator;
+    }
+}

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PageInfoDegree.java

@@ -16,6 +16,17 @@ public class PageInfoDegree<T> extends PageInfo<T> {
     @ApiModelProperty(value = "考级总金额", required = true)
     private BigDecimal totalAmount = BigDecimal.ZERO;
 
+    @ApiModelProperty(value = "报考人数", required = true)
+    private Integer applyNum;
+
+    public Integer getApplyNum() {
+        return applyNum;
+    }
+
+    public void setApplyNum(Integer applyNum) {
+        this.applyNum = applyNum;
+    }
+
     public PageInfoDegree() {
     }
 

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

@@ -30,6 +30,8 @@ public class PracticeBuyResultDto {
     private String type;
 
     private Object detail;
+    
+    private Integer courseNum;
 
     public String getOrderNo() {
         return orderNo;
@@ -110,4 +112,12 @@ public class PracticeBuyResultDto {
     public void setDetail(Object detail) {
         this.detail = detail;
     }
+
+	public Integer getCourseNum() {
+		return courseNum;
+	}
+
+	public void setCourseNum(Integer courseNum) {
+		this.courseNum = courseNum;
+	}
 }

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

@@ -15,6 +15,16 @@ public class QuestionnaireResultDto{
 
     private String additionalValue;
 
+    private String type;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
     public String getAdditionalValue() {
         return additionalValue;
     }

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ActivityUserMapper.java

@@ -56,6 +56,10 @@ public class ActivityUserMapper {
 	private Boolean returnFee = false;
 
 	private BigDecimal actualPrice = BigDecimal.ZERO;
+
+	private String addMemo;
+
+	private String cutMemo;
 	
 	/**  */
 	private java.util.Date createTime;
@@ -63,6 +67,22 @@ public class ActivityUserMapper {
 	/**  */
 	private java.util.Date updateTime;
 
+	public String getAddMemo() {
+		return addMemo;
+	}
+
+	public void setAddMemo(String addMemo) {
+		this.addMemo = addMemo;
+	}
+
+	public String getCutMemo() {
+		return cutMemo;
+	}
+
+	public void setCutMemo(String cutMemo) {
+		this.cutMemo = cutMemo;
+	}
+
 	public BigDecimal getActualPrice() {
 		return actualPrice;
 	}

+ 146 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ActivityUserMapperAdjustLog.java

@@ -0,0 +1,146 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(activity_user_mapper_adjust_log):
+ */
+public class ActivityUserMapperAdjustLog {
+
+	/**  1加资格0减资格*/
+	private Integer type;
+
+	/**  */
+	private Integer id;
+	
+	/**  */
+	private Integer operatorId;
+	
+	/**  */
+	private String operatorName;
+	
+	/**  */
+	private Integer activityId;
+	
+	/**  */
+	private Integer courseNum;
+	
+	/**  */
+	private Integer giveCourseNum;
+	
+	/**  */
+	private String memo;
+	
+	/**  */
+	private Integer userId;
+	
+	/**  */
+	private java.util.Date createTime;
+	
+	/**  */
+	private java.util.Date updateTime;
+
+	private Integer activityUserMapperId;
+
+	public Integer getActivityUserMapperId() {
+		return activityUserMapperId;
+	}
+
+	public void setActivityUserMapperId(Integer activityUserMapperId) {
+		this.activityUserMapperId = activityUserMapperId;
+	}
+
+	public Integer getType() {
+		return type;
+	}
+
+	public void setType(Integer type) {
+		this.type = type;
+	}
+
+	public void setId(Integer id){
+		this.id = id;
+	}
+	
+	public Integer getId(){
+		return this.id;
+	}
+			
+	public void setOperatorId(Integer operatorId){
+		this.operatorId = operatorId;
+	}
+	
+	public Integer getOperatorId(){
+		return this.operatorId;
+	}
+			
+	public void setOperatorName(String operatorName){
+		this.operatorName = operatorName;
+	}
+	
+	public String getOperatorName(){
+		return this.operatorName;
+	}
+			
+	public void setActivityId(Integer activityId){
+		this.activityId = activityId;
+	}
+	
+	public Integer getActivityId(){
+		return this.activityId;
+	}
+			
+	public void setCourseNum(Integer courseNum){
+		this.courseNum = courseNum;
+	}
+	
+	public Integer getCourseNum(){
+		return this.courseNum;
+	}
+			
+	public void setGiveCourseNum(Integer giveCourseNum){
+		this.giveCourseNum = giveCourseNum;
+	}
+	
+	public Integer getGiveCourseNum(){
+		return this.giveCourseNum;
+	}
+			
+	public void setMemo(String memo){
+		this.memo = memo;
+	}
+	
+	public String getMemo(){
+		return this.memo;
+	}
+			
+	public void setUserId(Integer userId){
+		this.userId = userId;
+	}
+	
+	public Integer getUserId(){
+		return this.userId;
+	}
+			
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+			
+	public void setUpdateTime(java.util.Date updateTime){
+		this.updateTime = updateTime;
+	}
+	
+	public java.util.Date getUpdateTime(){
+		return this.updateTime;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/DegreeRegistration.java

@@ -73,6 +73,12 @@ public class DegreeRegistration {
     private String level;
 
     /**
+     * 考试类型
+     */
+    @ApiModelProperty(value = "考试类型",required = true)
+    private Integer degreeType;
+
+    /**
      * 乐理级别
      */
     @ApiModelProperty(value = "乐理级别",required = true)
@@ -140,6 +146,14 @@ public class DegreeRegistration {
 
     private String activityTag;
 
+    public Integer getDegreeType() {
+        return degreeType;
+    }
+
+    public void setDegreeType(Integer degreeType) {
+        this.degreeType = degreeType;
+    }
+
     public Boolean getRepay() {
         return isRepay;
     }

+ 54 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/FinancialExpenditure.java

@@ -7,6 +7,8 @@ import io.swagger.annotations.ApiModelProperty;
 import java.math.BigDecimal;
 import java.util.Date;
 
+import static com.ym.mec.biz.dal.enums.ExpenditureTypeEnum.REFUND;
+
 /**
  * 对应数据库表(financial_expenditure):
  */
@@ -33,10 +35,10 @@ public class FinancialExpenditure {
 	private String applyUser;
 
 	@ApiModelProperty(value = "支出类型(1:固定费用、2:变动费用:3:业务退费)",required = false)
-	private ExpenditureTypeEnum type;
+	private ExpenditureTypeEnum type = REFUND;
 
 	@ApiModelProperty(value = "费用项目",required = false)
-	private FeeProjectEnum feeProject;
+	private FeeProjectEnum feeProject = FeeProjectEnum.REFUND;
 	/**  */
 	@ApiModelProperty(value = "费用",required = false)
 	private BigDecimal amount;
@@ -68,6 +70,56 @@ public class FinancialExpenditure {
 	/**  */
 	private Integer delFlag;
 
+	private Long vipGroupId;
+
+	private String groupType;
+
+	private String musicGroupId;
+
+	private String returnFeeType;
+
+	private Integer studentId;
+
+	public String getGroupType() {
+		return groupType;
+	}
+
+	public void setGroupType(String groupType) {
+		this.groupType = groupType;
+	}
+
+	public String getMusicGroupId() {
+		return musicGroupId;
+	}
+
+	public void setMusicGroupId(String musicGroupId) {
+		this.musicGroupId = musicGroupId;
+	}
+
+	public String getReturnFeeType() {
+		return returnFeeType;
+	}
+
+	public void setReturnFeeType(String returnFeeType) {
+		this.returnFeeType = returnFeeType;
+	}
+
+	public Long getVipGroupId() {
+		return vipGroupId;
+	}
+
+	public void setVipGroupId(Long vipGroupId) {
+		this.vipGroupId = vipGroupId;
+	}
+
+	public Integer getStudentId() {
+		return studentId;
+	}
+
+	public void setStudentId(Integer studentId) {
+		this.studentId = studentId;
+	}
+
 	public String getApplyUser() {
 		return applyUser;
 	}

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

@@ -57,7 +57,7 @@ public class PracticeGroup {
 	
 	/**  */
 	private String memo;
-
+	
 	private Integer buyMonths;
 
 	private Integer drillTimesOnWeek;

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

@@ -10,6 +10,8 @@ public class StudentPreRegistration {
 	/**  */
 	private Long id;
 	
+	private Integer organId;
+	
 	private String musicGroupId;
 	
 	/** 用户编号 */
@@ -65,6 +67,14 @@ public class StudentPreRegistration {
 		return this.id;
 	}
 			
+	public Integer getOrganId() {
+		return organId;
+	}
+
+	public void setOrganId(Integer organId) {
+		this.organId = organId;
+	}
+
 	public String getMusicGroupId() {
 		return musicGroupId;
 	}

+ 50 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScore.java

@@ -29,6 +29,10 @@ public class SysMusicScore {
 	
 	/** 声部列表 */
 	private String subjectIds;
+
+	private Integer subjectId;
+
+	private String subjectName;
 	
 	/** 速度 */
 	private Integer speed;
@@ -61,6 +65,10 @@ public class SysMusicScore {
 
 	private String rankIds;
 	
+	private String renderFrom;
+	
+	private boolean enableEvaluation;
+	
 	/**  */
 	private java.util.Date updateTime;
 	
@@ -72,6 +80,32 @@ public class SysMusicScore {
 
 	private Boolean isOpenMetronome;
 
+	private String organName;
+
+	public Integer getSubjectId() {
+		return subjectId;
+	}
+
+	public void setSubjectId(Integer subjectId) {
+		this.subjectId = subjectId;
+	}
+
+	public String getSubjectName() {
+		return subjectName;
+	}
+
+	public void setSubjectName(String subjectName) {
+		this.subjectName = subjectName;
+	}
+
+	public String getOrganName() {
+		return organName;
+	}
+
+	public void setOrganName(String organName) {
+		this.organName = organName;
+	}
+
 	public Boolean getIsOpenMetronome() {
 		return isOpenMetronome;
 	}
@@ -120,6 +154,22 @@ public class SysMusicScore {
 		this.rankIds = rankIds;
 	}
 
+	public String getRenderFrom() {
+		return renderFrom;
+	}
+
+	public void setRenderFrom(String renderFrom) {
+		this.renderFrom = renderFrom;
+	}
+
+	public boolean isEnableEvaluation() {
+		return enableEvaluation;
+	}
+
+	public void setEnableEvaluation(boolean enableEvaluation) {
+		this.enableEvaluation = enableEvaluation;
+	}
+
 	public ClientTypeEnum getClientType() {
 		return clientType;
 	}

+ 33 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScoreAccompaniment.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.entity;
 
 import com.ym.mec.biz.dal.enums.ClientTypeEnum;
+
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 /**
@@ -24,7 +25,7 @@ public class SysMusicScoreAccompaniment {
 	private String mp3Url;
 
 	/** 带节拍器MP3 */
-	private String metronomeUrl;
+	private String metronomeMp3Url;
 	
 	/** 是否删除 */
 	private Integer delFlag;
@@ -51,6 +52,9 @@ public class SysMusicScoreAccompaniment {
 
 	/**  */
 	private String url;
+
+	/** 带节拍器MP3 */
+	private String metronomeUrl;
 	
 	/**  */
 	private java.util.Date createTime;
@@ -68,6 +72,10 @@ public class SysMusicScoreAccompaniment {
 	private String rankIds;
 
 	private ClientTypeEnum clientType;
+	
+	private String renderFrom;
+	
+	private boolean enableEvaluation;
 
 	public String getMetronomeUrl() {
 		return metronomeUrl;
@@ -245,6 +253,30 @@ public class SysMusicScoreAccompaniment {
 		this.isOpenMetronome = isOpenMetronome;
 	}
 
+	public String getRenderFrom() {
+		return renderFrom;
+	}
+
+	public void setRenderFrom(String renderFrom) {
+		this.renderFrom = renderFrom;
+	}
+
+	public boolean isEnableEvaluation() {
+		return enableEvaluation;
+	}
+
+	public void setEnableEvaluation(boolean enableEvaluation) {
+		this.enableEvaluation = enableEvaluation;
+	}
+
+	public String getMetronomeMp3Url() {
+		return metronomeMp3Url;
+	}
+
+	public void setMetronomeMp3Url(String metronomeMp3Url) {
+		this.metronomeMp3Url = metronomeMp3Url;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

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

@@ -41,6 +41,8 @@ public class SysMusicScoreCategories {
 	private Integer order;
 
 	private Integer musicScoreNum;
+	
+	private String soundResource;
 
 	public Integer getMusicScoreNum() {
 		return musicScoreNum;
@@ -156,6 +158,14 @@ public class SysMusicScoreCategories {
 		return this.updateTime;
 	}
 			
+	public String getSoundResource() {
+		return soundResource;
+	}
+
+	public void setSoundResource(String soundResource) {
+		this.soundResource = soundResource;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

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

@@ -93,7 +93,7 @@ public class VipGroupActivity {
 	private Integer givePrizeNum = 0;
 
 	@ApiModelProperty(value = "是否充值到余额")
-	private boolean isPayToBalance = true;
+	private boolean isPayToBalance = false;
 
 	@ApiModelProperty(value = "创建时间")
 	private java.util.Date createTime;

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExpenditureTypeEnum.java

@@ -15,6 +15,16 @@ public enum ExpenditureTypeEnum implements BaseEnum<Integer, ExpenditureTypeEnum
         this.desc = desc;
     }
 
+    public static ExpenditureTypeEnum valueOfDesc(String desc) {
+        ExpenditureTypeEnum[] values = ExpenditureTypeEnum.values();
+        for (ExpenditureTypeEnum value : values) {
+            if(value.getDesc().equals(desc)){
+                return value;
+            }
+        }
+        return null;
+    }
+
     @Override
     public Integer getCode() {
         return code;

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/FeeProjectEnum.java

@@ -32,6 +32,16 @@ public enum FeeProjectEnum implements BaseEnum<Integer, FeeProjectEnum> {
         this.desc = desc;
     }
 
+    public static FeeProjectEnum valueOfDesc(String desc) {
+        FeeProjectEnum[] values = FeeProjectEnum.values();
+        for (FeeProjectEnum value : values) {
+            if(value.getDesc().equals(desc)){
+                return value;
+            }
+        }
+        return null;
+    }
+
     @Override
     public Integer getCode() {
         return code;

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/GroupType.java

@@ -25,6 +25,16 @@ public enum GroupType implements BaseEnum<String, GroupType> {
 		this.desc = desc;
 	}
 
+	public static GroupType valueOfDesc(String desc) {
+		GroupType[] values = GroupType.values();
+		for (GroupType value : values) {
+			if(value.getDesc().equals(desc)){
+				return value;
+			}
+		}
+		return null;
+	}
+
 	@Override
 	public String getCode() {
 		return name();

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

@@ -5,7 +5,8 @@ import com.ym.mec.common.enums.BaseEnum;
 public enum QuestionnaireActiveTypeEnum implements BaseEnum<String, QuestionnaireActiveTypeEnum> {
 	REPLACEMENT("REPLACEMENT", "乐器置换"),
 	CLOUD_TEACHER_FEEDBACK("CLOUD_TEACHER_FEEDBACK", "云教练用户反馈"),
-	MUSIC_GROUP_QUESTION("MUSIC_GROUP_QUESTION", "乐团满意度调查");
+	MUSIC_GROUP_QUESTION("MUSIC_GROUP_QUESTION", "乐团满意度调查"),
+	ENTERPRISE_CUSTOMIZATION("ENTERPRISE_CUSTOMIZATION", "管乐迷定制问卷");
 
 	private String code;
 

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

@@ -10,7 +10,8 @@ public enum ReturnFeeEnum implements BaseEnum<String, ReturnFeeEnum> {
 	PRACTICE("PRACTICE", "网管课关闭"),
 	MUSIC("MUSIC", "乐团退团"),
 	GOODS("GOODS", "商品退费"),
-	SUBJECT_CHANGE("SUBJECT_CHANGE", "声部更换");
+	SUBJECT_CHANGE("SUBJECT_CHANGE", "声部更换"),
+	CANCEL_ACTIVITY_COURSE("CANCEL_ACTIVITY_COURSE", "取消活动排课");
 
 	private String code;
 

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ActivityStudentQueryInfo.java

@@ -15,6 +15,16 @@ public class ActivityStudentQueryInfo extends QueryInfo {
 
     private Boolean giveFlag;
 
+    private String organId;
+
+    public String getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(String organId) {
+        this.organId = organId;
+    }
+
     public Boolean getGiveFlag() {
         return giveFlag;
     }

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/DegreeQueryInfo.java

@@ -16,6 +16,8 @@ public class DegreeQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "零星支付id", required = true)
     private Integer sporadicId;
 
+    private String degreeType;
+
     /**
      * 订单编号
      */
@@ -134,6 +136,13 @@ public class DegreeQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "状态 reg-报名 pay-已缴费",required = false)
     private String status;
 
+    public String getDegreeType() {
+        return degreeType;
+    }
+
+    public void setDegreeType(String degreeType) {
+        this.degreeType = degreeType;
+    }
 
     public Integer getId() {
         return id;

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/LuckDrawQueryInfo.java

@@ -24,6 +24,16 @@ public class LuckDrawQueryInfo extends QueryInfo {
 
 	private Boolean allFlag = true;
 
+	private Boolean enable;
+
+	public Boolean getEnable() {
+		return enable;
+	}
+
+	public void setEnable(Boolean enable) {
+		this.enable = enable;
+	}
+
 	public Boolean getAllFlag() {
 		return allFlag;
 	}

+ 68 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentActivityQueryInfo.java

@@ -0,0 +1,68 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+
+import java.util.List;
+
+public class StudentActivityQueryInfo extends QueryInfo {
+
+    private String organId;
+
+    private Integer subjectId;
+
+    private Boolean hasMusicCourse;
+
+    private Boolean hasVipCourse;
+
+    private Boolean hasPracticeCourse;
+
+    private Boolean hasMember;
+
+    public String getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(String organId) {
+        this.organId = organId;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public Boolean getHasMusicCourse() {
+        return hasMusicCourse;
+    }
+
+    public void setHasMusicCourse(Boolean hasMusicCourse) {
+        this.hasMusicCourse = hasMusicCourse;
+    }
+
+    public Boolean getHasVipCourse() {
+        return hasVipCourse;
+    }
+
+    public void setHasVipCourse(Boolean hasVipCourse) {
+        this.hasVipCourse = hasVipCourse;
+    }
+
+    public Boolean getHasPracticeCourse() {
+        return hasPracticeCourse;
+    }
+
+    public void setHasPracticeCourse(Boolean hasPracticeCourse) {
+        this.hasPracticeCourse = hasPracticeCourse;
+    }
+
+    public Boolean getHasMember() {
+        return hasMember;
+    }
+
+    public void setHasMember(Boolean hasMember) {
+        this.hasMember = hasMember;
+    }
+}

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

@@ -0,0 +1,8 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.ActivityUserMapperAdjustLog;
+import com.ym.mec.common.service.BaseService;
+
+public interface ActivityUserMapperAdjustLogService extends BaseService<Integer, ActivityUserMapperAdjustLog> {
+
+}

+ 36 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperService.java

@@ -1,9 +1,16 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.ActivityQueryDto;
+import com.ym.mec.biz.dal.dto.ActivityStudentAdjustDto;
+import com.ym.mec.biz.dal.dto.ActivityStudentDto;
+import com.ym.mec.biz.dal.dto.ActivityUserMapperAddDto;
 import com.ym.mec.biz.dal.entity.ActivityUserMapper;
+import com.ym.mec.biz.dal.page.ActivityStudentQueryInfo;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 public interface ActivityUserMapperService extends BaseService<Integer, ActivityUserMapper> {
@@ -68,4 +75,33 @@ public interface ActivityUserMapperService extends BaseService<Integer, Activity
     * @date 2021/10/22 17:35
     */
     ActivityUserMapper findVipUserMapper(Long groupId,String groupType,Integer studentId);
+
+    /**
+    * @description: 获取学员活动排课资格列表
+     * @param queryInfo
+    * @return java.lang.Object
+    * @author zx
+    * @date 2021/11/15 16:34
+    */
+    PageInfo<ActivityStudentDto> queryActivityUserMapper(ActivityStudentQueryInfo queryInfo);
+
+    /**
+    * @description: 添加排课资格
+     * @param activityUserMapperAddDto
+    * @return void
+    * @author zx
+    * @date 2021/11/18 11:19
+    */
+    void add(ActivityUserMapperAddDto activityUserMapperAddDto);
+
+    /**
+    * @description: 取消排课资格
+     * @param activityUserMapperId
+     * @param memo
+    * @return void
+    * @author zx
+    * @date 2021/11/18 11:19
+    */
+    void cut(Integer activityUserMapperId, String memo, BigDecimal amount);
+
 }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/FinancialExpenditureService.java

@@ -1,8 +1,10 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.FinancialExpenditureDto;
+import com.ym.mec.biz.dal.dto.ReturnFeeDto;
 import com.ym.mec.biz.dal.entity.FinancialExpenditure;
 import com.ym.mec.biz.dal.page.FinancialExpenditureQueryInfo;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
@@ -10,6 +12,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 
 public interface FinancialExpenditureService extends BaseService<Long, FinancialExpenditure> {
     /**
@@ -44,4 +47,22 @@ public interface FinancialExpenditureService extends BaseService<Long, Financial
      * @return
      */
     List<FinancialExpenditure> batchAdd(List<FinancialExpenditure> financialExpenditures);
+
+    /**
+    * @description: 同步oa审批到支出记录
+     * @param workOrderId
+    * @return void
+    * @author zx
+    * @date 2021/11/25 16:07
+    */
+    void syncOaPayLog(Integer workOrderId);
+
+    /**
+    * @description: 校验课程、乐团退费参数
+     * @param paramMap
+    * @return com.ym.mec.common.entity.HttpResponseResult
+    * @author zx
+    * @date 2021/11/29 14:40
+    */
+    void checkCourseReturnFee(Map<String,String> paramMap);
 }

+ 18 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/GroupClassService.java

@@ -65,6 +65,24 @@ public interface GroupClassService {
     HttpResponseResult cancelGroup(ReturnFeeDto returnFeeDto);
 
     /**
+    * @description: OA审批关闭课程组
+     * @param returnFeeDto
+    * @return void
+    * @author zx
+    * @date 2021/11/30 11:16
+    */
+    void cancelGroupOa(ReturnFeeDto returnFeeDto);
+
+    /**
+    * @description: 校验OA审批关闭课程组参数
+     * @param returnFeeDto
+    * @return void
+    * @author zx
+    * @date 2021/11/30 11:16
+    */
+    void checkCancelGroupOa(ReturnFeeDto returnFeeDto);
+
+    /**
     * @description: 退还活动相关赠送
      * @param activityUserMapper
      * @param confirmReturnActivityGive

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/LuckDrawLogService.java

@@ -3,6 +3,8 @@ package com.ym.mec.biz.service;
 import com.ym.mec.biz.dal.entity.LuckDrawLog;
 import com.ym.mec.common.service.BaseService;
 
+import java.util.List;
+
 public interface LuckDrawLogService extends BaseService<Long, LuckDrawLog> {
 
 	/**
@@ -13,4 +15,13 @@ public interface LuckDrawLogService extends BaseService<Long, LuckDrawLog> {
 	 * @return
 	 */
 	boolean add(Long userId, Integer prizeId, Integer groupId);
+
+	/**
+	* @description: 奖品是否使用过
+	 * @param allPrizeIds
+	* @return void
+	* @author zx
+	* @date 2021/11/19 15:45
+	*/
+	String countUseNumByIds(List<Integer> allPrizeIds);
 }

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java

@@ -178,6 +178,26 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	 */
 	boolean directQuitMusicGroup(String musicGroupId, Integer userId, String reason, boolean isRefundCourseFee, boolean isRefundInstrumentFee,
 								 boolean isRefundTeachingAssistantsFee,boolean isRefundMemberFee, BigDecimal maintenanceFee, BigDecimal cloudTeacherAmount);
+	/**
+	 * 处理oa审批退团逻辑
+	 * @param musicGroupId
+	 * @param userId
+	 * @param reason
+	 * @param isRefundInstrumentFee 是否退还乐器费用
+	 * @param isRefundTeachingAssistantsFee 是否退还教辅费用
+	 * @param maintenanceFee
+	 * @return
+	 */
+	void directQuitMusicGroupOa(String musicGroupId, Integer userId, String reason, boolean isRefundInstrumentFee,
+								   boolean isRefundTeachingAssistantsFee, boolean maintenanceFee,BigDecimal amount);
+
+	/**
+	 * 检测oa退团参数
+	 * @param musicGroupId
+	 * @param userId
+	 * @return
+	 */
+	void checkDirectQuitMusicGroupOa(String musicGroupId, Integer userId);
 
 	/**
 	 *  续费

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

@@ -202,7 +202,7 @@ public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {
      * @param practiceGroupBuyParams: 购买参数
      * @return void
      */
-    HttpResponseResult buyPracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams);
+    HttpResponseResult buyPracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams, String operatorInfo);
 
 	/**
 	 * @describe 创建关心包课程
@@ -212,7 +212,7 @@ public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {
 	 * @param operatorInfo:
 	 * @return com.ym.mec.common.entity.HttpResponseResult
 	 */
-	HttpResponseResult createPackagePracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams);
+	HttpResponseResult createPackagePracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams, String operatorInfo);
 
     /**
      * @describe 支付订单回调
@@ -294,7 +294,7 @@ public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {
 	 * @param groupId:
 	 * @return void
 	 */
-	HttpResponseResult cancelWaitPayOrder(Integer userId, Integer groupId);
+	HttpResponseResult cancelWaitPayOrder(Integer userId, Integer groupId) throws Exception;
 
 	/**
 	 * @describe 推送练习报告

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/QuestionnaireUserResultService.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.service;
 import com.ym.mec.biz.dal.dto.ReplacementInstrumentActivityDto;
 import com.ym.mec.biz.dal.entity.QuestionnaireQuestion;
 import com.ym.mec.biz.dal.entity.QuestionnaireUserResult;
+import com.ym.mec.biz.dal.page.QuestionnaireUserResultQueryInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 import org.json.JSONObject;
@@ -29,4 +30,15 @@ public interface QuestionnaireUserResultService extends BaseService<Long, Questi
      * @return
      */
     void add(ReplacementInstrumentActivityDto replacementInstrumentActivityDto);
+
+    /**
+    * @description: 提交调查问卷(没有活动)
+     * @param replacementInstrumentActivity
+    * @return void
+    * @author zx
+    * @date 2021/12/2 17:24
+    */
+    void addResult(ReplacementInstrumentActivityDto replacementInstrumentActivity);
+
+    Object queryResultPage(QuestionnaireUserResultQueryInfo queryInfo);
 }

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

@@ -218,4 +218,6 @@ public interface StudentManageService {
      * @param activityCourseDetailDto
      */
     void updateChildrenDayStudent(ActivityCourseDetailDto activityCourseDetailDto);
+
+    PageInfo<Student> queryStudent(StudentActivityQueryInfo queryInfo);
 }

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

@@ -12,16 +12,18 @@ import com.ym.mec.biz.dal.dto.StatDto;
 import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.StudentPreRegistration;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
 import com.ym.mec.biz.dal.page.CloudTeacherActiveQueryInfo;
 import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.common.page.PageInfo;
-import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 
 public interface StudentService extends BaseService<Integer, Student> {
+	
+	boolean register(StudentPreRegistration studentPreRegistration);
 
     PageInfo findStudentVipGroupList(StudentQueryInfo queryInfo);
 

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java

@@ -149,6 +149,11 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
      * @describe 陪练课时长
      */
     String PRACTICE_COURSE_MINUTES = "practice_course_minutes";
+    
+    /**
+     * 陪练课可选老师的分部
+     */
+    String PRACTICE_TEACHER_ORGAN_RANGE = "practice_teacher_organ_range";
 
     /**
      * @describe 陪练课预约开始时间

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

@@ -31,7 +31,7 @@ public class UploadFileService {
 	private int maxSize;
 
 	/** 支持的扩展名 */
-	@Value("${common.upload.supportExtensions:jpg,jpeg,gif,png,mp3,mid,midi,aac,m4a,mp4,xml,xlsx,xls,doc,docx,txt,pdf}")
+	@Value("${common.upload.supportExtensions:jpg,jpeg,gif,png,mp3,mid,midi,aac,m4a,mp4,xml,xlsx,xls,doc,docx,txt,pdf,psd,eps,rar,zip}")
 	private String supportExtensions;
 
 	/** 文件根目录 */
@@ -69,7 +69,6 @@ public class UploadFileService {
 		String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME,staticFloder + folder, file);
 
 		FileUtils.deleteQuietly(file);
-
 		uploadReturn.setStatus(true);
 		uploadReturn.setUrl(url);
 		return uploadReturn;

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java

@@ -306,6 +306,26 @@ public interface VipGroupService extends BaseService<Long, VipGroup> {
     HttpResponseResult applyRefundForStudent(ReturnFeeDto returnFeeDto);
 
     /**
+     * @describe 校验Oa审批,vip退课参数
+     * @author Joburgess
+     * @date 2019/11/15
+     * @param vipGroupId: vip课程
+     * @param studentId: 学生编号
+     * @return void
+     */
+    void checkApplyRefundForStudentOa(ReturnFeeDto returnFeeDto);
+
+    /**
+     * @describe 处理oa审批的vip退费逻辑
+     * @author Joburgess
+     * @date 2019/11/15
+     * @param vipGroupId: vip课程
+     * @param studentId: 学生编号
+     * @return void
+     */
+    void applyRefundForStudentOa(ReturnFeeDto returnFeeDto);
+
+    /**
      * @describe 对某个学生进行休学
      * @author Joburgess
      * @date 2019/12/18

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperAdjustLogServiceImpl.java

@@ -0,0 +1,22 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.ActivityUserMapperAdjustLogDao;
+import com.ym.mec.biz.dal.entity.ActivityUserMapperAdjustLog;
+import com.ym.mec.biz.service.ActivityUserMapperAdjustLogService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ActivityUserMapperAdjustLogServiceImpl extends BaseServiceImpl<Integer, ActivityUserMapperAdjustLog>  implements ActivityUserMapperAdjustLogService {
+	
+	@Autowired
+	private ActivityUserMapperAdjustLogDao activityUserMapperAdjustLogDao;
+
+	@Override
+	public BaseDAO<Integer, ActivityUserMapperAdjustLog> getDAO() {
+		return activityUserMapperAdjustLogDao;
+	}
+	
+}

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

@@ -1,20 +1,53 @@
 package com.ym.mec.biz.service.impl;
 
-import com.ym.mec.biz.dal.dao.ActivityUserMapperDao;
-import com.ym.mec.biz.dal.entity.ActivityUserMapper;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.ActivityQueryDto;
+import com.ym.mec.biz.dal.dto.ActivityStudentAdjustDto;
+import com.ym.mec.biz.dal.dto.ActivityStudentDto;
+import com.ym.mec.biz.dal.dto.ActivityUserMapperAddDto;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.ReturnFeeEnum;
+import com.ym.mec.biz.dal.page.ActivityStudentQueryInfo;
 import com.ym.mec.biz.service.ActivityUserMapperService;
+import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static com.ym.mec.biz.dal.enums.GroupType.ACTIVITY;
+import static com.ym.mec.biz.dal.enums.GroupType.SUBJECT_CHANGE;
 
 @Service
 public class ActivityUserMapperServiceImpl extends BaseServiceImpl<Integer, ActivityUserMapper>  implements ActivityUserMapperService {
 	
 	@Autowired
 	private ActivityUserMapperDao activityUserMapperDao;
+	@Autowired
+	private ActivityUserMapperAdjustLogDao activityUserMapperAdjustLogDao;
+	@Autowired
+	private VipGroupActivityDao vipGroupActivityDao;
+	@Autowired
+	private StudentDao studentDao;
+	@Autowired
+	private TeacherDao teacherDao;
+	@Autowired
+	private SysUserCashAccountLogDao sysUserCashAccountLogDao;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
 
 	@Override
 	public BaseDAO<Integer, ActivityUserMapper> getDAO() {
@@ -50,4 +83,161 @@ public class ActivityUserMapperServiceImpl extends BaseServiceImpl<Integer, Acti
 	public ActivityUserMapper findVipUserMapper(Long groupId, String groupType,Integer studentId) {
 		return activityUserMapperDao.findVipUserMapper(groupId,groupType,studentId);
 	}
+
+    @Override
+    public PageInfo<ActivityStudentDto> queryActivityUserMapper(ActivityStudentQueryInfo queryInfo) {
+		PageInfo<ActivityStudentDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<ActivityStudentDto> dataList = null;
+		int count = activityUserMapperDao.countActivityUserMapper(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = activityUserMapperDao.queryActivityUserMapper(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+    }
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void add(ActivityUserMapperAddDto activityUserMapperAddDto) {
+		List<ActivityStudentAdjustDto> activityStudentAdjustDtos = activityUserMapperAddDto.getActivityStudentAdjustDtos();
+		if(activityStudentAdjustDtos == null || activityStudentAdjustDtos.size() == 0){
+        	throw new BizException("请选择学员");
+		}
+		Integer activityId = activityUserMapperAddDto.getActivityId();
+		String memo = activityUserMapperAddDto.getMemo();
+		VipGroupActivity activity = vipGroupActivityDao.get(activityId);
+		if(activity == null){
+			throw new BizException("活动信息不存在");
+		}
+		if(activity.getActivityType() != 0){
+			throw new BizException("操作失败:只有课程活动支持此操作");
+		}
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		Integer operatorId = sysUser.getId();
+		String operatorName = sysUser.getRealName();
+
+		List<Integer> studentIds = activityStudentAdjustDtos.stream().map(e -> e.getUserId()).collect(Collectors.toList());
+		List<Student> studentTeacher = studentDao.findByStudentIds(studentIds);
+		Map<Integer, List<Student>> collect = studentTeacher.stream().collect(Collectors.groupingBy(Student::getUserId));
+		String courseType = activity.getCourseType();
+		Integer giveCourseNum = activity.getGiveCourseNum();
+		String giveCourseType = activity.getGiveCourseType();
+		List<ActivityUserMapper> activityUserMappers = new ArrayList<>();
+		List<ActivityUserMapperAdjustLog> activityUserMapperAdjustLogs = new ArrayList<>();
+		for (ActivityStudentAdjustDto adjustDto : activityStudentAdjustDtos) {
+			//添加操作记录
+			ActivityUserMapperAdjustLog activityUserMapperAdjustLog = new ActivityUserMapperAdjustLog();
+			activityUserMapperAdjustLog.setActivityId(activityId);
+			activityUserMapperAdjustLog.setOperatorId(operatorId);
+			activityUserMapperAdjustLog.setOperatorName(operatorName);
+			activityUserMapperAdjustLog.setCourseNum(adjustDto.getCourseNum());
+			activityUserMapperAdjustLog.setGiveCourseNum(adjustDto.getGiveCourseNum());
+			activityUserMapperAdjustLog.setMemo(memo);
+			activityUserMapperAdjustLog.setUserId(adjustDto.getUserId());
+			activityUserMapperAdjustLog.setType(1);
+			activityUserMapperAdjustLogs.add(activityUserMapperAdjustLog);
+
+			int activityUserMapperNum = adjustDto.getCourseNum();
+			if(giveCourseNum != null && giveCourseNum > 0){
+				if(adjustDto.getGiveCourseNum() > activityUserMapperNum){
+					activityUserMapperNum = adjustDto.getGiveCourseNum();
+				}
+			}
+			if(activityUserMapperNum <= 0){
+				throw new BizException("操作失败:加课次数不可为空");
+			}
+			List<Student> students = collect.get(adjustDto.getUserId());
+			Integer teacherId = null;
+			if(students != null && students.size() > 0){
+				teacherId = students.get(0).getTeacherId();
+			}
+			for (int i = 0; i < activityUserMapperNum; i++) {
+				ActivityUserMapper activityUserMapper = new ActivityUserMapper();
+				activityUserMapper.setActivityId(activityId);
+				activityUserMapper.setUserId(adjustDto.getUserId());
+				activityUserMapper.setActualPrice(BigDecimal.ZERO);
+				activityUserMapper.setReturnFee(false);
+				activityUserMapper.setTeacherId(teacherId);
+				activityUserMapper.setAddMemo(memo);
+				if(adjustDto.getCourseNum() > i){
+					if("VIP".equals(courseType)){
+						activityUserMapper.setVipFlag(1);
+					}else {
+						activityUserMapper.setPracticeFlag(1);
+					}
+				}
+
+				if(adjustDto.getGiveCourseNum() > i && giveCourseNum != null && giveCourseNum > 0){
+					if("VIP".equals(giveCourseType)){
+						activityUserMapper.setGiveVipFlag(1);
+					}else {
+						activityUserMapper.setGivePracticeFlag(1);
+					}
+				}
+				activityUserMappers.add(activityUserMapper);
+			}
+		}
+		activityUserMapperAdjustLogDao.batchInsert(activityUserMapperAdjustLogs);
+		activityUserMapperDao.batchInsert(activityUserMappers);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void cut(Integer activityUserMapperId, String memo, BigDecimal amount) {
+		ActivityUserMapper activityUserMapper = activityUserMapperDao.get(activityUserMapperId);
+		if(activityUserMapper.getVipFlag() == 2 ||
+				activityUserMapper.getGiveVipFlag() == 2 ||
+				activityUserMapper.getPracticeFlag() == 2 ||
+				activityUserMapper.getGivePracticeFlag() == 2 || activityUserMapper.getReturnFee()){
+			throw new BizException("操作失败:活动已消耗");
+		}
+		activityUserMapper.setCutMemo(memo);
+		activityUserMapper.setReturnFee(true);
+		activityUserMapperDao.update(activityUserMapper);
+
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		Integer operatorId = sysUser.getId();
+		String operatorName = sysUser.getRealName();
+		//添加操作记录
+		ActivityUserMapperAdjustLog activityUserMapperAdjustLog = new ActivityUserMapperAdjustLog();
+		activityUserMapperAdjustLog.setActivityId(activityUserMapper.getActivityId());
+		activityUserMapperAdjustLog.setOperatorId(operatorId);
+		activityUserMapperAdjustLog.setOperatorName(operatorName);
+		if(activityUserMapper.getVipFlag() == 1 || activityUserMapper.getPracticeFlag() == 1){
+			activityUserMapperAdjustLog.setCourseNum(-1);
+		}
+		if(activityUserMapper.getGiveVipFlag() == 1 || activityUserMapper.getGivePracticeFlag() == 1){
+			activityUserMapperAdjustLog.setGiveCourseNum(-1);
+		}
+		activityUserMapperAdjustLog.setMemo(memo);
+		activityUserMapperAdjustLog.setUserId(activityUserMapper.getUserId());
+		activityUserMapperAdjustLog.setType(0);
+		activityUserMapperAdjustLog.setActivityUserMapperId(activityUserMapperId);
+		activityUserMapperAdjustLogDao.insert(activityUserMapperAdjustLog);
+		if(amount == null || amount.compareTo(BigDecimal.ZERO) <= 0){
+			return;
+		}
+		BigDecimal actualPrice = activityUserMapper.getActualPrice().multiply(new BigDecimal(0.995)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+		if(amount.compareTo(actualPrice) > 0){
+			throw new BizException("操作失败:退费金额不得超过购买金额{}",actualPrice);
+		}
+		SysUser user = teacherDao.getUser(activityUserMapper.getUserId());
+		SysUserCashAccountLog sysUserCashAccountLog = new SysUserCashAccountLog();
+		sysUserCashAccountLog.setUserId(activityUserMapper.getUserId());
+		sysUserCashAccountLog.setGroupType(ACTIVITY);
+		sysUserCashAccountLog.setOrganId(user.getOrganId());
+		sysUserCashAccountLog.setGroupId(activityUserMapperId.toString());
+		sysUserCashAccountLog.setAmount(amount);
+		sysUserCashAccountLog.setReturnFeeType(ReturnFeeEnum.CANCEL_ACTIVITY_COURSE);
+		sysUserCashAccountLog.setComment("取消活动排课");
+		sysUserCashAccountLogDao.insert(sysUserCashAccountLog);
+	}
 }

+ 18 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/impl/DegreeRegistrationServiceImpl.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service.impl;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.stream.Collectors;
 
 import com.alibaba.fastjson.JSON;
 import com.ym.mec.biz.dal.dao.*;
@@ -12,6 +13,7 @@ import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
@@ -77,7 +79,7 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
     public HttpResponseResult pay(DegreeRegistrationActivityDto degreeRegistration) throws Exception {
         Student student = studentDao.getLocked(degreeRegistration.getUserId());
 
-        List<DegreeRegistration> userLevelDegrees = degreeRegistrationDao.getUserLevelDegrees(degreeRegistration.getUserId(), ACTIVITY_TAG);
+        List<DegreeRegistration> userLevelDegrees = degreeRegistrationDao.getUserLevelDegrees(degreeRegistration.getUserId(), ACTIVITY_TAG,degreeRegistration.getDegreeType(),degreeRegistration.getSporadicId());
         long endLevelNum = userLevelDegrees.stream().filter(d -> Objects.nonNull(d.getSporadicId())&&d.getStatus().equals(2)).count();
         long ingLevelNum = userLevelDegrees.stream().filter(d -> Objects.nonNull(d.getSporadicId())&&d.getStatus().equals(1)).count();
         long endTheoryLevelNum = userLevelDegrees.stream().filter(d -> StringUtils.isNotBlank(d.getTheoryLevel())&&d.getStatus().equals(2)).count();
@@ -93,9 +95,15 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
         degreeRegistration.setActivityTag(ACTIVITY_TAG);
 
         Date nowDate = new Date();
-
-        if(ACTIVITY_END_TIME.compareTo(nowDate)<0){
-            throw new BizException("活动已截至");
+        String startTimeStr = sysConfigDao.findConfigValue("degree_activity_start_time");
+        Date startTime = DateUtil.stringToDate(startTimeStr);
+        if (startTime.compareTo(nowDate) > 0) {
+            throw new BizException("活动还未开始,谢谢关注");
+        }
+        String endTimeStr = sysConfigDao.findConfigValue("degree_activity_end_time");
+        Date endTime = DateUtil.stringToDate(endTimeStr);
+        if (endTime.compareTo(nowDate) <= 0) {
+            throw new BizException("活动已结束,谢谢关注");
         }
 
         String orderNo = idGeneratorService.generatorId("payment") + "";
@@ -175,8 +183,8 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
         }
 
         BigDecimal additionCoursePrice = new BigDecimal("0");
-        if(Objects.nonNull(degreeRegistration.getAdditionCourseInfo())){
-            Map<CourseSchedule.CourseScheduleType, Integer> additionCourseInfo = degreeRegistration.getAdditionCourseInfo();
+        Map<CourseSchedule.CourseScheduleType, Integer> additionCourseInfo = degreeRegistration.getAdditionCourseInfo();
+        if(additionCourseInfo != null && additionCourseInfo.size() > 0){
             PracticeGroupSellPrice practiceGroupSellPrice = practiceGroupSellPriceDao.get(degreeRegistration.getOrganId());
             if(Objects.isNull(practiceGroupSellPrice)){
                 throw new BizException("该分部暂未参与此活动");
@@ -297,8 +305,8 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
         if(BigDecimal.ZERO.compareTo(additionCoursePrice)<0){
             StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
             studentPaymentOrderDetail.setType(OrderDetailTypeEnum.DEGREE_REGISTRATION);
-            if(Objects.nonNull(degreeRegistration.getAdditionCourseInfo())){
-                studentPaymentOrderDetail.setGoodsIdList(JSON.toJSONString(degreeRegistration.getAdditionCourseInfo()));
+            if(additionCourseInfo != null && additionCourseInfo.size() > 0){
+            	studentPaymentOrderDetail.setGoodsIdList(JSON.toJSONString(degreeRegistration.getAdditionCourseInfo()));
             }
             studentPaymentOrderDetail.setPrice(additionCoursePrice);
             studentPaymentOrderDetail.setRemitFee(BigDecimal.ZERO);
@@ -348,7 +356,7 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
     public HttpResponseResult theoryPay(DegreeRegistrationActivityDto degreeRegistration) throws Exception {
         studentDao.getLocked(degreeRegistration.getUserId());
 
-        List<DegreeRegistration> userLevelDegrees = degreeRegistrationDao.getUserLevelDegrees(degreeRegistration.getUserId(), ACTIVITY_TAG);
+        List<DegreeRegistration> userLevelDegrees = degreeRegistrationDao.getUserLevelDegrees(degreeRegistration.getUserId(), ACTIVITY_TAG,degreeRegistration.getDegreeType(),degreeRegistration.getSporadicId());
 
         long endTheoryLevelNum = userLevelDegrees.stream().filter(d -> StringUtils.isNotBlank(d.getTheoryLevel())&&d.getStatus().equals(2)).count();
         long ingTheoryLevelNum = userLevelDegrees.stream().filter(d -> StringUtils.isNotBlank(d.getTheoryLevel())&&d.getStatus().equals(1)).count();
@@ -602,7 +610,7 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
             BigDecimal subjectLevelAmount = degree.getMoney() == null ? BigDecimal.ZERO : degree.getMoney();
             BigDecimal theoryLevelAmount = degree.getTheoryMoney() == null ? BigDecimal.ZERO : degree.getTheoryMoney();
             BigDecimal totalAmount = subjectLevelAmount.add(theoryLevelAmount);
-
+            pageInfo.setApplyNum(degreeRegistrationDao.countApplyNum(params));
             pageInfo.setSubjectLevelAmount(subjectLevelAmount);
             pageInfo.setTheoryLevelAmount(theoryLevelAmount);
             pageInfo.setTotalAmount(totalAmount);

+ 22 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EduPracticeGroupServiceImpl.java

@@ -1,5 +1,7 @@
 package com.ym.mec.biz.service.impl;
 
+import static java.math.BigDecimal.ROUND_DOWN;
+
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -725,9 +727,18 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
         if(teacherDefaultSalary == null){
             throw new BizException("请设置老师课酬");
         }
-        BigDecimal studentSingleCourseCost=price.divide(new BigDecimal(practiceCourses.size()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-        BigDecimal studentSingleCourseOriginalCost=price.divide(new BigDecimal(practiceCourses.size()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-        for (CourseSchedule courseSchedule : practiceCourses) {
+        
+        BigDecimal studentSingleCourseOriginalCost = price.divide(new BigDecimal(practiceCourses.size()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+
+        //使用优惠券
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(practiceGroupBuyParams.getCouponIdList(), price, true);
+        //实际支付金额,去除优惠券
+        BigDecimal actualPrice = studentPaymentOrder.getExpectAmount();
+        BigDecimal divide = actualPrice.divide(new BigDecimal(practiceCourses.size()), ROUND_DOWN);
+        BigDecimal firstAmount = actualPrice.subtract(divide.multiply(new BigDecimal(practiceCourses.size()))).add(divide);
+        
+        for (int i = 0; i < practiceCourses.size(); i++) {
+            CourseSchedule courseSchedule = practiceCourses.get(i);
             //课程与老师薪水表
             CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
             courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
@@ -747,8 +758,13 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
             courseScheduleStudentPayment.setMusicGroupId(practiceGroupBuyParams.getId().toString());
             courseScheduleStudentPayment.setCourseScheduleId(courseSchedule.getId());
             courseScheduleStudentPayment.setUserId(practiceGroupBuyParams.getStudentId());
-            courseScheduleStudentPayment.setExpectPrice(studentSingleCourseCost);
-            courseScheduleStudentPayment.setActualPrice(studentSingleCourseCost);
+            if(i == 0){
+                courseScheduleStudentPayment.setExpectPrice(firstAmount);
+                courseScheduleStudentPayment.setActualPrice(firstAmount);
+            }else {
+                courseScheduleStudentPayment.setExpectPrice(divide);
+                courseScheduleStudentPayment.setActualPrice(divide);
+            }
             courseScheduleStudentPayment.setOriginalPrice(studentSingleCourseOriginalCost);
             courseScheduleStudentPayment.setClassGroupId(classGroup.getId());
             courseScheduleStudentPayment.setCreateTime(now);
@@ -787,7 +803,6 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
             return BaseController.failed(HttpStatus.FOUND, errMessage);
         }
 
-        StudentPaymentOrder studentPaymentOrder=new StudentPaymentOrder();
         studentPaymentOrder.setUserId(practiceGroupBuyParams.getStudentId());
         studentPaymentOrder.setGroupType(GroupType.PRACTICE);
         String orderNo=idGeneratorService.generatorId("payment") + "";
@@ -795,7 +810,7 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
         studentPaymentOrder.setType(OrderTypeEnum.PRACTICE_GROUP_BUY);
 
-        studentPaymentOrder.setExpectAmount(price);
+        studentPaymentOrder.setExpectAmount(actualPrice);
         studentPaymentOrder.setMusicGroupId(practiceGroupBuyParams.getId().toString());
         studentPaymentOrder.setActualAmount(studentPaymentOrder.getExpectAmount());
         studentPaymentOrder.setClassGroupId(classGroup.getId());

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

@@ -1,17 +1,22 @@
 package com.ym.mec.biz.service.impl;
 
 
+import com.alibaba.druid.sql.visitor.functions.If;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.ym.mec.auth.api.entity.SysUserDevice;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dao.FinancialExpenditureDao;
-import com.ym.mec.biz.dal.dto.FinancialExpenditureDto;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.FinancialExpenditure;
-import com.ym.mec.biz.dal.enums.ExpenditureTypeEnum;
-import com.ym.mec.biz.dal.enums.FeeProjectEnum;
-import com.ym.mec.biz.dal.enums.GoodsType;
-import com.ym.mec.biz.dal.enums.TemplateTypeEnum;
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.FinancialExpenditureQueryInfo;
-import com.ym.mec.biz.service.FinancialExpenditureService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
+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;
@@ -32,6 +37,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -40,6 +46,16 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
 
     @Autowired
     private FinancialExpenditureDao financialExpenditureDao;
+    @Autowired
+    private OrganizationDao organizationDao;
+    @Autowired
+    private EmployeeDao employeeDao;
+    @Autowired
+    private VipGroupService vipGroupService;
+    @Autowired
+    private GroupClassService groupClassService;
+    @Autowired
+    private MusicGroupService musicGroupService;
 
     @Override
     public BaseDAO<Long, FinancialExpenditure> getDAO() {
@@ -198,5 +214,305 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
         return financialExpenditures;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void syncOaPayLog(Integer workOrderId) {
+        PWorkOrderInfo pWorkOrderInfo = financialExpenditureDao.getWorkOrderInfo(workOrderId);
+        if (pWorkOrderInfo != null){
+            Integer hasFinancial = financialExpenditureDao.findByBatchNoAndProcessNo(workOrderId);
+            if(hasFinancial != null){
+                return;
+            }
+            String formStructure = financialExpenditureDao.getFormStructure(workOrderId);
+            JSONObject formData = JSONObject.parseObject(financialExpenditureDao.getFormData(workOrderId));
+            OaFormStructureDto oaFormStructureDto = JSONObject.parseObject(formStructure, OaFormStructureDto.class);
+            List<OaInputDto> oaInputDtos = oaFormStructureDto.getList();
+            //课程退费和乐团退费需要单独处理
+            if(pWorkOrderInfo.getProcess().equals(22) || pWorkOrderInfo.getProcess().equals(19)){
+                List<FinancialExpenditure> financialExpenditureList = new ArrayList<>();
+                for (OaInputDto oaInputDto : oaInputDtos) {
+                    if(!"子表单".equals(oaInputDto.getName())){
+                        continue;
+                    }
+                    String submitForm = oaInputDto.getModel();
+                    List<HashMap> hashMaps = JSONObject.parseArray(formData.get(submitForm).toString(), HashMap.class);
+                    for (HashMap hashMap : hashMaps) {
+                        FinancialExpenditure financialExpenditure = new FinancialExpenditure();
+                        financialExpenditure.setBatchNo(pWorkOrderInfo.getId().toString());
+                        financialExpenditure.setFinancialProcessNo(pWorkOrderInfo.getId().toString());
+                        List<OaColumnDto> columns = oaInputDto.getColumns();
+                        if(columns != null && columns.size() > 0){
+                            for (OaColumnDto column : columns) {
+                                List<OaInputDto> columnList = column.getList();
+                                if(columnList != null && columnList.size() > 0){
 
+                                    Employee employee = employeeDao.get(pWorkOrderInfo.getCreator());
+                                    List<SimpleUserDto> byIds = new ArrayList<>();
+                                    if(employee != null){
+                                        List<Integer> userIds = new ArrayList<>();
+                                        userIds.add(employee.getUserId());
+                                        byIds = employeeDao.findByIds(userIds);
+                                    }
+                                    if(employee != null){
+                                        if(byIds != null && byIds.size() > 0){
+                                            SimpleUserDto simpleUserDto = byIds.get(0);
+                                            financialExpenditure.setApplyUser(simpleUserDto.getUserName());
+                                        }
+                                    }
+                                    for (OaInputDto inputDto : columnList) {
+                                        String name = inputDto.getName();
+                                        if(name.contains("课程组编号")){
+                                            Object o = hashMap.get(inputDto.getModel());
+                                            if(o != null){
+                                                financialExpenditure.setVipGroupId(Long.parseLong(o.toString()));
+                                                continue;
+                                            }
+                                        }else if(name.contains("课程类型")){
+                                            Object o = hashMap.get(inputDto.getModel());
+                                            if(o != null){
+                                                financialExpenditure.setGroupType(o.toString());
+                                                continue;
+                                            }
+                                        }else if(name.contains("乐团编号")){
+                                            Object o = hashMap.get(inputDto.getModel());
+                                            if(o != null){
+                                                financialExpenditure.setMusicGroupId(o.toString());
+                                                continue;
+                                            }
+                                        }else if(name.contains("退费项目")){
+                                            Object o = hashMap.get(inputDto.getModel());
+                                            if(o != null){
+                                                financialExpenditure.setReturnFeeType(o.toString());
+                                                continue;
+                                            }
+                                        }else if(name.contains("学员编号")){
+                                            Object o = hashMap.get(inputDto.getModel());
+                                            if(o != null){
+                                                financialExpenditure.setStudentId(Integer.parseInt(o.toString()));
+                                                continue;
+                                            }
+                                        }else if(name.contains("分部")){
+                                            Object o = hashMap.get(inputDto.getModel());
+                                            if(o != null){
+                                                int organId = Integer.parseInt(o.toString());
+                                                Organization organization = organizationDao.get(organId);
+                                                if(organization != null){
+                                                    financialExpenditure.setOrganId(organization.getId());
+                                                    financialExpenditure.setOrganName(organization.getName());
+                                                }
+                                                continue;
+                                            }
+                                        }else if(name.contains("金额")){
+                                            Object o = hashMap.get(inputDto.getModel());
+                                            if(o != null){
+                                                financialExpenditure.setAmount(new BigDecimal(Double.parseDouble(o.toString())));
+                                                continue;
+                                            }
+                                        }else if(name.contains("情况说明")){
+                                            Object o = hashMap.get(inputDto.getModel());
+                                            if(o != null){
+                                                financialExpenditure.setCause(o.toString());
+                                                continue;
+                                            }
+                                        }else if(name.contains("支出类型")){
+                                            Object o = hashMap.get(inputDto.getModel());
+                                            if(o != null){
+                                                financialExpenditure.setType(ExpenditureTypeEnum.valueOfDesc(o.toString()));
+                                                continue;
+                                            }
+                                        }else if(name.contains("费用类型")){
+                                            Object o = hashMap.get(inputDto.getModel());
+                                            if(o != null){
+                                                financialExpenditure.setFeeProject(FeeProjectEnum.valueOfDesc(o.toString()));
+                                                continue;
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                        financialExpenditureList.add(financialExpenditure);
+                    }
+                }
+                //课程退费
+                if(pWorkOrderInfo.getProcess().equals(22)){
+                    for (FinancialExpenditure financialExpenditure : financialExpenditureList) {
+                        ReturnFeeDto returnFeeDto = new ReturnFeeDto();
+                        returnFeeDto.setGroupType(GroupType.valueOfDesc(financialExpenditure.getGroupType()));
+                        returnFeeDto.setAmount(financialExpenditure.getAmount());
+                        returnFeeDto.setStudentId(financialExpenditure.getStudentId());
+                        returnFeeDto.setConfirmReturnActivityGive(true);
+                        returnFeeDto.setGroupId(financialExpenditure.getVipGroupId());
+                        returnFeeDto.setVipGroupId(financialExpenditure.getVipGroupId());
+                        if(returnFeeDto.getGroupType() == GroupType.VIP){
+                            vipGroupService.applyRefundForStudentOa(returnFeeDto);
+                        }else if(returnFeeDto.getGroupType() == GroupType.COMM || returnFeeDto.getGroupType() == GroupType.PRACTICE){
+                            groupClassService.cancelGroupOa(returnFeeDto);
+                        }
+                    }
+                }else {
+                    //退团
+                    for (FinancialExpenditure financialExpenditure : financialExpenditureList) {
+                        Boolean isRefundInstrumentFee = false;
+                        Boolean isRefundTeachingAssistantsFee = false;
+                        Boolean maintenanceFee = false;
+                        String returnFeeType = financialExpenditure.getReturnFeeType();
+                        if(StringUtils.isNotEmpty(returnFeeType)){
+                            if(returnFeeType.contains("乐器")){
+                                isRefundInstrumentFee = true;
+                            }
+                            if(returnFeeType.contains("乐保")){
+                                maintenanceFee = true;
+                            }
+                            if(returnFeeType.contains("教辅")){
+                                isRefundTeachingAssistantsFee = true;
+                            }
+                        }
+                        musicGroupService.directQuitMusicGroupOa(financialExpenditure.getMusicGroupId(), financialExpenditure.getStudentId(),
+                                financialExpenditure.getCause(), isRefundInstrumentFee,
+                                isRefundTeachingAssistantsFee, maintenanceFee, financialExpenditure.getAmount());
+                    }
+                }
+                financialExpenditureDao.batchInsert(financialExpenditureList);
+            }else {
+                FinancialExpenditure financialExpenditure = new FinancialExpenditure();
+                financialExpenditure.setBatchNo(workOrderId.toString());
+                financialExpenditure.setFinancialProcessNo(workOrderId.toString());
+                Employee employee = employeeDao.get(pWorkOrderInfo.getCreator());
+                Integer organId = financialExpenditureDao.getDeptId(pWorkOrderInfo.getDeptId());
+                Organization organization = organizationDao.get(organId);
+                if(organization != null){
+                    financialExpenditure.setOrganId(organization.getId());
+                    financialExpenditure.setOrganName(organization.getName());
+                }
+                if(employee != null){
+                    List<Integer> userIds = new ArrayList<>();
+                    userIds.add(employee.getUserId());
+                    List<SimpleUserDto> byIds = employeeDao.findByIds(userIds);
+                    if(byIds != null && byIds.size() > 0){
+                        SimpleUserDto simpleUserDto = byIds.get(0);
+                        financialExpenditure.setApplyUser(simpleUserDto.getUserName());
+                    }
+                }
+                for (OaInputDto oaInputDto : oaInputDtos) {
+                    String name = oaInputDto.getName();
+                    if(name.contains("金额")){
+                        Object o = formData.get(oaInputDto.getModel());
+                        if(o != null){
+                            financialExpenditure.setAmount(new BigDecimal(Double.parseDouble(o.toString())));
+                            continue;
+                        }
+                    }else if(name.contains("情况说明")){
+                        Object o = formData.get(oaInputDto.getModel());
+                        if(o != null){
+                            financialExpenditure.setCause(o.toString());
+                            continue;
+                        }
+                    }else if(name.contains("支出类型")){
+                        Object o = formData.get(oaInputDto.getModel());
+                        if(o != null){
+                            financialExpenditure.setType(ExpenditureTypeEnum.valueOfDesc(o.toString()));
+                            continue;
+                        }
+                    }else if(name.contains("费用类型")){
+                        Object o = formData.get(oaInputDto.getModel());
+                        if(o != null){
+                            financialExpenditure.setFeeProject(FeeProjectEnum.valueOfDesc(o.toString()));
+                            continue;
+                        }
+                    }
+                }
+                financialExpenditureDao.insert(financialExpenditure);
+            }
+        }
+    }
+
+    @Override
+    public void checkCourseReturnFee(Map<String,String> paramMap) {
+        String tplInfoId = paramMap.get("tplInfoId");
+        if(StringUtils.isEmpty(tplInfoId)){
+            throw new BizException("参数校验失败");
+        }
+        if(tplInfoId.equals("11") || tplInfoId.equals("8")){
+            JSONObject formData = JSONObject.parseObject(paramMap.get("formData"));
+            String formStructure = financialExpenditureDao.getTplInfo(tplInfoId);
+            OaFormStructureDto oaFormStructureDto = JSONObject.parseObject(formStructure, OaFormStructureDto.class);
+            List<OaInputDto> oaInputDtos = oaFormStructureDto.getList();
+            List<FinancialExpenditure> financialExpenditureList = new ArrayList<>();
+            for (OaInputDto oaInputDto : oaInputDtos) {
+                if(!"子表单".equals(oaInputDto.getName())){
+                    continue;
+                }
+                String submitForm = oaInputDto.getModel();
+                List<HashMap> hashMaps = JSONObject.parseArray(formData.get(submitForm).toString(), HashMap.class);
+                for (HashMap hashMap : hashMaps) {
+                    FinancialExpenditure financialExpenditure = new FinancialExpenditure();
+                    List<OaColumnDto> columns = oaInputDto.getColumns();
+                    if(columns != null && columns.size() > 0){
+                        for (OaColumnDto column : columns) {
+                            List<OaInputDto> columnList = column.getList();
+                            if(columnList != null && columnList.size() > 0){
+                                for (OaInputDto inputDto : columnList) {
+                                    String name = inputDto.getName();
+                                    if(name.contains("课程组编号")){
+                                        Object o = hashMap.get(inputDto.getModel());
+                                        if(o != null){
+                                            financialExpenditure.setVipGroupId(Long.parseLong(o.toString()));
+                                            continue;
+                                        }
+                                    }else if(name.contains("课程类型")){
+                                        Object o = hashMap.get(inputDto.getModel());
+                                        if(o != null){
+                                            financialExpenditure.setGroupType(o.toString());
+                                            continue;
+                                        }
+                                    }else if(name.contains("乐团编号")){
+                                        Object o = hashMap.get(inputDto.getModel());
+                                        if(o != null){
+                                            financialExpenditure.setMusicGroupId(o.toString());
+                                            continue;
+                                        }
+                                    }else if(name.contains("学员编号")){
+                                        Object o = hashMap.get(inputDto.getModel());
+                                        if(o != null){
+                                            financialExpenditure.setStudentId(Integer.parseInt(o.toString()));
+                                            continue;
+                                        }
+                                    }else if(name.contains("金额")){
+                                        Object o = hashMap.get(inputDto.getModel());
+                                        if(o != null){
+                                            financialExpenditure.setAmount(new BigDecimal(Double.parseDouble(o.toString())));
+                                            continue;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    financialExpenditureList.add(financialExpenditure);
+                }
+            }
+            //课程退费
+            if(tplInfoId.equals("11")){
+                for (FinancialExpenditure financialExpenditure : financialExpenditureList) {
+                    ReturnFeeDto returnFeeDto = new ReturnFeeDto();
+                    returnFeeDto.setGroupType(GroupType.valueOfDesc(financialExpenditure.getGroupType()));
+                    returnFeeDto.setAmount(financialExpenditure.getAmount());
+                    returnFeeDto.setStudentId(financialExpenditure.getStudentId());
+                    returnFeeDto.setConfirmReturnActivityGive(true);
+                    returnFeeDto.setGroupId(financialExpenditure.getVipGroupId());
+                    returnFeeDto.setVipGroupId(financialExpenditure.getVipGroupId());
+                    if(returnFeeDto.getGroupType() == GroupType.VIP){
+                        vipGroupService.checkApplyRefundForStudentOa(returnFeeDto);
+                    }else if(returnFeeDto.getGroupType() == GroupType.COMM || returnFeeDto.getGroupType() == GroupType.PRACTICE){
+                        groupClassService.checkCancelGroupOa(returnFeeDto);
+                    }
+                }
+            }else {
+                for (FinancialExpenditure financialExpenditure : financialExpenditureList) {
+                    musicGroupService.checkDirectQuitMusicGroupOa(financialExpenditure.getMusicGroupId(), financialExpenditure.getStudentId());
+                }
+            }
+        }
+    }
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.ReturnFeeDto;
 import com.ym.mec.biz.dal.entity.*;
@@ -9,6 +10,8 @@ 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.util.date.DateUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
@@ -55,7 +58,7 @@ public class GroupClassServiceImpl implements GroupClassService {
     @Autowired
     private PracticeGroupDao practiceGroupDao;
     @Autowired
-    private SysUserCashAccountService sysUserCashAccountService;
+    private TeacherDao teacherDao;
     @Autowired
     private SysUserCashAccountLogDao sysUserCashAccountLogDao;
     @Autowired
@@ -81,6 +84,8 @@ public class GroupClassServiceImpl implements GroupClassService {
     @Autowired
     private PracticeGroupService practiceGroupService;
 
+    private final static Logger LOGGER = LoggerFactory.getLogger(GroupClassServiceImpl.class);
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean deleteAllGroupInfo(String groupId, GroupType groupType) {
@@ -223,6 +228,130 @@ public class GroupClassServiceImpl implements GroupClassService {
         return BaseController.succeed();
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void cancelGroupOa(ReturnFeeDto returnFeeDto) {
+        Long groupId = returnFeeDto.getGroupId();
+        if (Objects.isNull(groupId)) {
+            LOGGER.error("请指定课程组");
+            return;
+        }
+        GroupType groupType = returnFeeDto.getGroupType();
+        if (Objects.isNull(groupType)) {
+            LOGGER.error("请指定课程组类型");
+            return;
+        }
+        Date now = new Date();
+        if (groupType.equals(GroupType.PRACTICE)) {
+            PracticeGroup practiceGroup = practiceGroupDao.get(groupId);
+            if (Objects.isNull(practiceGroup)) {
+                LOGGER.error("课程组 {} 不存在",groupId);
+                return;
+            }
+            if (!practiceGroup.getGroupStatus().equals(GroupStatusEnum.NORMAL) || practiceGroup.getCoursesExpireDate().before(now)) {
+                LOGGER.error("课程组 {} {} 不可关闭",groupId,practiceGroup.getName());
+                return;
+            }
+            if (Objects.nonNull(returnFeeDto.getAmount()) && returnFeeDto.getAmount().compareTo(BigDecimal.ZERO) > 0) {
+                SysUserCashAccountLog sysUserCashAccountLog = new SysUserCashAccountLog();
+                sysUserCashAccountLog.setGroupType(GroupType.PRACTICE);
+                sysUserCashAccountLog.setUserId(practiceGroup.getStudentId());
+                sysUserCashAccountLog.setOrganId(practiceGroup.getOrganId());
+                sysUserCashAccountLog.setGroupId(practiceGroup.getId().toString());
+                sysUserCashAccountLog.setAmount(returnFeeDto.getAmount());
+                sysUserCashAccountLog.setReturnFeeType(ReturnFeeEnum.PRACTICE);
+                sysUserCashAccountLog.setComment("OA审批关闭网管课");
+                sysUserCashAccountLogDao.insert(sysUserCashAccountLog);
+            }
+            ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(practiceGroup.getId(),"PRACTICE",null);
+            quitActivityGive(activityUserMapper, returnFeeDto.getConfirmReturnActivityGive(), practiceGroup.getId(),GroupType.PRACTICE);
+            cleanGroupInfo(groupId.toString(), GroupType.PRACTICE);
+            practiceGroup.setMemo("OA审批关闭网管课");
+            practiceGroup.setGroupStatus(GroupStatusEnum.CANCEL);
+            practiceGroup.setUpdateTime(now);
+            practiceGroupDao.update(practiceGroup);
+        } else if (groupType.equals(GroupType.COMM)) {
+            CoursesGroup coursesGroup = coursesGroupDao.get(groupId);
+            if (Objects.isNull(coursesGroup)) {
+                LOGGER.error("课程组 {} 不存在",groupId);
+                return;
+            }
+            if (coursesGroup.getStatus().equals(GroupStatusEnum.CANCEL)) {
+                LOGGER.error("课程组 {} {} 已关闭",groupId,coursesGroup.getName());
+                return;
+            }
+            List<CourseSchedule> groupNotStartCourses = courseScheduleDao.findGroupNotStartCourses(groupId.toString(), groupType);
+            if (!CollectionUtils.isEmpty(groupNotStartCourses)) {
+                //剩余课程时长
+                Integer totalCourseTime = groupNotStartCourses.size() * coursesGroup.getSingleClassMinutes();
+                sysTenantAccountService.update(coursesGroup.getTeacherId(), totalCourseTime, "", SysTenantAccountDetail.TransType.RETURN, "", BigDecimal.ZERO, "关闭课程组");
+            } else {
+                LOGGER.error("课程组 {} {} 已结束",groupId,coursesGroup.getName());
+                return;
+            }
+            cleanGroupInfo(groupId.toString(), GroupType.COMM);
+            coursesGroup.setMemo("OA审批关闭课程组");
+            coursesGroup.setStatus(GroupStatusEnum.CANCEL);
+            coursesGroupDao.update(coursesGroup);
+        }
+    }
+
+    @Override
+    public void checkCancelGroupOa(ReturnFeeDto returnFeeDto) {
+        Long groupId = returnFeeDto.getGroupId();
+        Integer studentId = returnFeeDto.getStudentId();
+        if (Objects.isNull(groupId)) {
+            throw new BizException("请指定课程组");
+        }
+        if (Objects.isNull(studentId)) {
+            throw new BizException("请指定学员");
+        }
+        GroupType groupType = returnFeeDto.getGroupType();
+        if (Objects.isNull(groupType)) {
+            throw new BizException("请指定课程组类型");
+        }
+        SysUser user = teacherDao.getUser(studentId);
+        if(user == null){
+            throw new BizException("用户 {} 信息不存在",studentId);
+        }
+        Student student = studentDao.get(studentId);
+        if(student == null){
+            throw new BizException("学员 {} 信息不存在",studentId);
+        }
+        Date now = new Date();
+        if (groupType.equals(GroupType.PRACTICE)) {
+            PracticeGroup practiceGroup = practiceGroupDao.get(groupId);
+            if (Objects.isNull(practiceGroup)) {
+                throw new BizException("课程组 {} 不存在",groupId);
+            }
+            if (!returnFeeDto.getStudentId().equals(practiceGroup.getStudentId())) {
+                throw new BizException("学员 {} 不在 {} 课程组内",user.getUsername(),practiceGroup.getName());
+            }
+            if (!practiceGroup.getGroupStatus().equals(GroupStatusEnum.NORMAL) || practiceGroup.getCoursesExpireDate().before(now)) {
+                throw new BizException("课程组 {} {} 不可关闭",groupId,practiceGroup.getName());
+            }
+            if (Objects.nonNull(returnFeeDto.getAmount()) && returnFeeDto.getAmount().compareTo(BigDecimal.ZERO) > 0) {
+                Map<String, BigDecimal> studentSurplusCourseFee = practiceGroupService.getStudentSurplusCourseFee(groupId);
+                BigDecimal suplusCourseFee = studentSurplusCourseFee.get("suplusCourseOriginalFee");
+                if(returnFeeDto.getAmount().compareTo(suplusCourseFee) > 0){
+                    throw new BizException("学员 {} {} 最大可退费金额为{}元",studentId,user.getUsername(),suplusCourseFee.toString());
+                }
+            }
+        } else if (groupType.equals(GroupType.COMM)) {
+            CoursesGroup coursesGroup = coursesGroupDao.get(groupId);
+            if (Objects.isNull(coursesGroup)) {
+                throw new BizException("课程组 {} 不存在",groupId);
+            }
+            if (coursesGroup.getStatus().equals(GroupStatusEnum.CANCEL)) {
+                throw new BizException("课程组 {} {} 已关闭",groupId,coursesGroup.getName());
+            }
+            List<CourseSchedule> groupNotStartCourses = courseScheduleDao.findGroupNotStartCourses(groupId.toString(), groupType);
+            if (CollectionUtils.isEmpty(groupNotStartCourses)) {
+                throw new BizException("课程组 {} {} 已结束",groupId,coursesGroup.getName());
+            }
+        }
+    }
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service.impl;
 
 import java.util.Date;
+import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -32,4 +33,9 @@ public class LuckDrawLogServiceImpl extends BaseServiceImpl<Long, LuckDrawLog> i
 		return luckDrawLogDao.insert(log) > 0;
 	}
 
+    @Override
+    public String countUseNumByIds(List<Integer> allPrizeIds) {
+		return luckDrawLogDao.countUseNumByIds(allPrizeIds);
+    }
+
 }

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

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service.impl;
 
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import com.ym.mec.biz.dal.dto.HorseRaceLampDto;
 import org.apache.commons.lang3.RandomUtils;
@@ -47,9 +48,44 @@ public class LuckDrawPrizeServiceImpl extends BaseServiceImpl<Integer, LuckDrawP
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public boolean batchInsert(List<LuckDrawPrize> luckDrawPrizeList) {
-		if (luckDrawPrizeList != null && luckDrawPrizeList.size() > 0) {
-			luckDrawPrizeDao.batchInsert(luckDrawPrizeList);
+		if (luckDrawPrizeList == null || luckDrawPrizeList.size() == 0) {
+			throw new BizException("请设置奖品");
+		}
+		Double reduce = luckDrawPrizeList.stream().map(e -> e.getChances()).reduce(0d, Double::sum);
+		if(reduce != 1d){
+			throw new BizException("中奖概率总和必须是100%");
+		}
+
+		List<LuckDrawPrize> defaultDraw = luckDrawPrizeList.stream().filter(e -> e.getIsDefault()).collect(Collectors.toList());
+		if(defaultDraw == null || defaultDraw.size() == 0){
+			throw new BizException("请配置默认奖品");
+		}
+		List<LuckDrawPrize> insertDraw = luckDrawPrizeList.stream().filter(e -> e.getId() == null).collect(Collectors.toList());
+		List<LuckDrawPrize> updateDraw = luckDrawPrizeList.stream().filter(e -> e.getId() != null).collect(Collectors.toList());
+		//全量奖品
+		List<LuckDrawPrize> luckDrawPrizes = luckDrawPrizeDao.findByGroupId(luckDrawPrizeList.get(0).getGroupId());
+		if(luckDrawPrizes != null && luckDrawPrizes.size() > 0){
+			List<Integer> allPrizeIds = luckDrawPrizes.stream().map(e -> e.getId()).collect(Collectors.toList());
+			if(updateDraw != null && updateDraw.size() > 0){
+				List<Integer> updatePrizeIds = updateDraw.stream().map(e -> e.getId()).collect(Collectors.toList());
+				allPrizeIds.removeAll(updatePrizeIds);
+			}
+			if(allPrizeIds.size() > 0){
+				//是否使用过
+				String prizeName = luckDrawLogService.countUseNumByIds(allPrizeIds);
+				if(StringUtils.isNotEmpty(prizeName)){
+					throw new BizException("奖品 {} 已使用,无法删除",prizeName);
+				}
+				luckDrawPrizeDao.deleteByIds(allPrizeIds);
+			}
+		}
+		if(insertDraw != null && insertDraw.size() > 0){
+			luckDrawPrizeDao.batchInsert(insertDraw);
+		}
+		if(updateDraw != null && updateDraw.size() > 0){
+			luckDrawPrizeDao.batchUpdate(updateDraw);
 		}
 		return true;
 	}

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

@@ -421,9 +421,9 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 			PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
 			if(payStatus == PayStatus.SUCCESSED){
 				throw new BizException("订单已支付成功,请勿重复支付");
-			}else if(payStatus == PayStatus.PAYING){
+			}/*else if(payStatus == PayStatus.PAYING){
 				throw new BizException("订单还在交易中,请稍后重试");
-			}
+			}*/
 			if(repay){
 				//处理关闭订单
 				applyOrder.setStatus(DealStatusEnum.CLOSE);

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

@@ -720,7 +720,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             throw new BizException("报名信息有误,请核查");
         }
         
-        MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.getMusicGroupRegCalender(studentRegistration.getMusicGroupId());
+        MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(studentRegistration.getMusicGroupId());
         if(musicGroupRegCalender == null){
         	throw new BizException("缴费信息不存在");
         }
@@ -792,7 +792,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         //新课程形态
         List<MusicGroupPaymentCalenderCourseSettings> newCourses = new ArrayList<>();
-        if (registerPayDto.getNewCourse() != null && registerPayDto.getNewCourse().size() > 0) {
+        if (musicGroupRegCalender.getPayUserType() == PayUserType.STUDENT && registerPayDto.getNewCourse() != null && registerPayDto.getNewCourse().size() > 0) {
             newCourses = musicGroupPaymentCalenderCourseSettingsDao.getCalenderCourseSettings(registerPayDto.getNewCourse());
             for (MusicGroupPaymentCalenderCourseSettings calenderCourseSetting : newCourses) {
                 if (remitCourseRFeeFlag && !calenderCourseSetting.getIsStudentOptional()) {
@@ -993,12 +993,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if(payStatus != PayStatus.FAILED){
         	if(payStatus == PayStatus.SUCCESSED){
         		throw new BizException("订单已支付成功,请勿重复支付");
-        	}else if(payStatus == PayStatus.PAYING){
+        	}/*else if(payStatus == PayStatus.PAYING){
         		throw new BizException("订单还在交易中,请稍后重试");
-        	}
+        	}*/
         }
 
-    	MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.getMusicGroupRegCalender(studentRegistration.getMusicGroupId());
+    	MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(studentRegistration.getMusicGroupId());
         if(musicGroupRegCalender == null){
         	throw new BizException("缴费信息不存在");
         }
@@ -1072,7 +1072,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         //新课程形态
         List<MusicGroupPaymentCalenderCourseSettings> newCourses = new ArrayList<>();
-        if (registerPayDto.getNewCourse() != null && registerPayDto.getNewCourse().size() > 0) {
+        if (musicGroupRegCalender.getPayUserType() == PayUserType.STUDENT && registerPayDto.getNewCourse() != null && registerPayDto.getNewCourse().size() > 0) {
             newCourses = musicGroupPaymentCalenderCourseSettingsDao.getCalenderCourseSettings(registerPayDto.getNewCourse());
             for (MusicGroupPaymentCalenderCourseSettings calenderCourseSetting : newCourses) {
                 if (remitCourseRFeeFlag && !calenderCourseSetting.getIsStudentOptional()) {
@@ -2767,6 +2767,255 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public void directQuitMusicGroupOa(String musicGroupId, Integer userId, String reason, boolean isRefundInstrumentFee,
+                                        boolean isRefundTeachingAssistantsFee, boolean maintenanceFee,BigDecimal amount) {
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        if (musicGroup == null) {
+            return ;
+        }
+        if (musicGroup.getStatus() == MusicGroupStatusEnum.CANCELED || musicGroup.getStatus() == MusicGroupStatusEnum.PAUSE) {
+            return;
+        }
+
+        StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
+        if (studentRegistration == null) {
+            return;
+        }
+
+        StudentMusicGroupStatusEnum currentStudentMusicGroupStatus = studentRegistration.getMusicGroupStatus();
+        if (currentStudentMusicGroupStatus != StudentMusicGroupStatusEnum.NORMAL && currentStudentMusicGroupStatus != StudentMusicGroupStatusEnum.APPLY) {
+            return;
+        }
+
+        // 有进行中的课程不能退团
+        List<CourseSchedule> courseScheduleList = courseScheduleDao.findMusicGroupCourseSchedulesWithStudent(musicGroupId, GroupType.MUSIC.getCode(),
+                "UNDERWAY", userId);
+        if (courseScheduleList != null && courseScheduleList.size() > 0) {
+            return;
+        }
+
+        boolean hasPaid = studentRegistration.getMusicGroupStatus().equals(StudentMusicGroupStatusEnum.NORMAL);
+
+        //如果是会员团,并且有预排课计划
+        MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.findByCourseDateAndMusicGroupId(musicGroupId, null, 0);
+        if(termCourseDetail != null){
+            //是否已经预排部分课程
+            List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(musicGroup.getId());
+            if(courseSchedules.size() > 0){
+                return;
+            }else {
+                musicGroupSchoolTermStudentCourseDetailDao.deleteByDetailId(termCourseDetail.getId(),userId);
+            }
+        }
+
+        courseScheduleStudentPaymentService.updateCourseActualPrice(Arrays.asList(musicGroupId), Arrays.asList(userId), GroupType.MUSIC);
+
+        Date date = new Date();
+
+        MusicGroupQuit musicGroupQuit = new MusicGroupQuit();
+        musicGroupQuit.setCreateTime(date);
+        musicGroupQuit.setJoinDate(studentRegistration.getCreateTime());
+        musicGroupQuit.setMusicGroupId(musicGroupId);
+        musicGroupQuit.setUserId(userId);
+        musicGroupQuit.setStatus(ApprovalStatus.APPROVED);
+        musicGroupQuit.setReason(reason);
+        musicGroupQuit.setQuitDate(date);
+        musicGroupQuitDao.insert(musicGroupQuit);
+
+        List<Integer> classGroupIdList = classGroupStudentMapperDao.queryClassGroupIdList(musicGroupId, userId, GroupType.MUSIC);
+        for (Integer classGroupId : classGroupIdList) {
+            ClassGroup classGroup = classGroupService.get(classGroupId);
+            if (classGroup.getType().equals(ClassGroupTypeEnum.MUSIC_NETWORK)) {
+                classGroupService.delSingle(classGroupId);
+            } else {
+                classGroupStudentMapperService.delClassGroupStudent(userId, classGroupId, true);
+            }
+        }
+
+        //删除续费周期
+        musicGroupStudentFeeDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
+
+        // 退团
+        studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.QUIT);
+        studentRegistration.setSurplusCourseFee(BigDecimal.ZERO);
+        studentRegistration.setHasCloudTeacher(0);
+        studentRegistration.setUpdateTime(date);
+        studentRegistrationDao.update(studentRegistration);
+
+        //删除进行中加学生,且在审批中或拒绝的缴费
+        List<Long> paymentCalenderIdList = musicGroupPaymentCalenderDao.findStudentNoPaymentCalender(userId, musicGroupId);
+        if (paymentCalenderIdList != null && paymentCalenderIdList.size() > 0) {
+            musicGroupPaymentCalenderDao.delByIds(paymentCalenderIdList);
+        }
+
+        //查询未交费的项目
+        List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetailList = musicGroupPaymentCalenderDetailDao.queryNotPaymentStudentByUserIdAndMusicGroupId(userId, musicGroupId);
+
+        for (MusicGroupPaymentCalenderDetail mgpcd : musicGroupPaymentCalenderDetailList) {
+            MusicGroupPaymentCalender mgpc = musicGroupPaymentCalenderDao.get(mgpcd.getMusicGroupPaymentCalenderId());
+            if (mgpc != null) {
+                if (mgpc.getPaymentType() == PaymentType.ADD_STUDENT) {
+                    musicGroupPaymentCalenderDao.delete(mgpc.getId());
+                } else {
+                    // 缴费项目预计人数减一
+                    mgpc.setExpectNum(mgpc.getExpectNum() - 1);
+                    mgpc.setUpdateTime(date);
+                    musicGroupPaymentCalenderDao.update(mgpc);
+                }
+            }
+            musicGroupPaymentCalenderDetailDao.delete(mgpcd.getId());
+        }
+        //删除用户购买的课程记录
+        musicGroupPaymentStudentCourseDetailDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
+
+        List<StudentPaymentOrder> studentPaymentOrderList = new ArrayList<StudentPaymentOrder>();
+
+		if (studentRegistration.getMusicGroupPaymentCalenderId() == null) {
+			if(currentStudentMusicGroupStatus == StudentMusicGroupStatusEnum.NORMAL || (currentStudentMusicGroupStatus == StudentMusicGroupStatusEnum.APPLY && studentRegistration.getPaymentStatus() == PaymentStatusEnum.YES)){
+				studentPaymentOrderList = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, SUCCESS);
+			}
+
+		} else {
+			studentPaymentOrderList = studentPaymentOrderService.queryByBatchNo(userId, studentRegistration.getMusicGroupPaymentCalenderId() + "",
+					DealStatusEnum.SUCCESS);
+		}
+
+        // 判断乐器是否是租赁
+        MusicGroupSubjectPlan musicGroupSubjectPlan = musicGroupSubjectPlanDao.getMusicOneSubjectClassPlan(musicGroupId, studentRegistration.getActualSubjectId());
+        if (hasPaid && musicGroupSubjectPlan != null) {
+            musicGroupSubjectPlan.setUpdateTime(date);
+            //减去缴费人数(器乐收费,0元时不减缴费人数)
+            if (musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE) {
+
+            	for(StudentPaymentOrder studentPaymentOrder : studentPaymentOrderList){
+            		if (studentPaymentOrder != null && studentPaymentOrder.getPaymentAccountNo() != null && studentPaymentOrder.getPaymentAccountNo().equals("200")) {
+                        musicGroupSubjectPlan.setPaidZeroNum(musicGroupSubjectPlan.getPaidZeroNum() - 1);
+                        musicGroupSubjectPlan.setPaidStudentNum(musicGroupSubjectPlan.getPaidStudentNum() - 1);
+                        break;
+                    } else if (studentPaymentOrder != null && studentPaymentOrder.getPaymentAccountNo() == null) {
+                        musicGroupSubjectPlan.setPaidStudentNum(musicGroupSubjectPlan.getPaidStudentNum() - 1);
+                        break;
+                    }
+            	}
+            } else {
+                musicGroupSubjectPlan.setPaidStudentNum(musicGroupSubjectPlan.getPaidStudentNum() - 1);
+            }
+            musicGroupSubjectPlanDao.update(musicGroupSubjectPlan);
+        }
+
+        if (MusicGroupStatusEnum.PROGRESS.equals(musicGroup.getStatus())) {
+            //统计变更学员数
+            groupEventSource.musicGroupStudentChangeEvent(musicGroupId, StudentMusicGroupStatusEnum.QUIT, new ArrayList<>(Arrays.asList(userId)));
+        }
+
+        if (studentPaymentOrderList.size() > 0) {
+
+        	List<Long> paymentOrderIdList = studentPaymentOrderList.stream().map(t -> t.getId()).collect(Collectors.toList());
+
+        	Long minPaymentOrderId = Collections.min(paymentOrderIdList);
+
+            List<StudentPaymentOrderDetail> orderDetailList = studentPaymentOrderDetailDao.getWithIds(paymentOrderIdList);
+
+            SubjectChange studentLastChange = null;
+            if (isRefundInstrumentFee || isRefundTeachingAssistantsFee) {
+                studentLastChange = subjectChangeDao.getStudentLastChange(userId, musicGroupId);
+            }
+
+			if (studentLastChange != null && minPaymentOrderId <= studentLastChange.getOriginalOrderId()) {
+				if (isRefundInstrumentFee) {
+					StudentInstrument studentMaintenance = studentInstrumentDao.getByOrderId(studentLastChange.getOrderId().longValue());
+		            if (studentMaintenance != null) {
+		                studentMaintenance.setDelFlag(1);
+		                studentInstrumentDao.update(studentMaintenance);
+		            }
+				}
+			} else {
+				for (StudentPaymentOrderDetail detail : orderDetailList) {
+					// 退乐器费用
+					if (isRefundInstrumentFee && detail.getType() == MUSICAL) {
+						StudentInstrument studentMaintenance = studentInstrumentDao.getStudentMaintenance(userId, musicGroupId);
+			            if (studentMaintenance != null) {
+			                studentMaintenance.setDelFlag(1);
+			                studentInstrumentDao.update(studentMaintenance);
+			            }
+					}
+				}
+			}
+
+        }
+        //退乐保费用
+        if (maintenanceFee) {
+            StudentInstrument studentMaintenance = studentInstrumentDao.getStudentMaintenance(userId, musicGroupId);
+            if (studentMaintenance != null) {
+                studentMaintenance.setStatus(0);
+                studentMaintenance.setStartTime(null);
+                studentMaintenance.setEndTime(null);
+                studentInstrumentDao.update(studentMaintenance);
+            }
+        }
+
+        if (amount.doubleValue() > 0) {
+            //这个接口没有退费的操作了
+            SysUserCashAccountLog sysUserCashAccountLog = new SysUserCashAccountLog();
+            sysUserCashAccountLog.setGroupType(GroupType.MUSIC);
+            sysUserCashAccountLog.setUserId(userId);
+            sysUserCashAccountLog.setOrganId(musicGroup.getOrganId());
+            sysUserCashAccountLog.setGroupId(musicGroupId);
+            sysUserCashAccountLog.setAmount(amount);
+            sysUserCashAccountLog.setReturnFeeType(ReturnFeeEnum.MUSIC);
+            sysUserCashAccountLog.setComment("OA审批退团");
+            sysUserCashAccountLogDao.insert(sysUserCashAccountLog);
+        }
+    }
+
+    @Override
+    public void checkDirectQuitMusicGroupOa(String musicGroupId, Integer userId) {
+        SysUser user = teacherDao.getUser(userId);
+        if (user == null) {
+            throw new BizException("学员 {} 信息不存在",userId);
+        }
+        Student student = studentDao.get(userId);
+        if(student == null){
+            throw new BizException("学员 {} 信息不存在",userId);
+        }
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        if (musicGroup == null) {
+            throw new BizException("乐团 {} 不存在",musicGroupId);
+        }
+        if (musicGroup.getStatus() == MusicGroupStatusEnum.CANCELED || musicGroup.getStatus() == MusicGroupStatusEnum.PAUSE) {
+            throw new BizException("退团失败,乐团 {} {} 状态[已取消]或[已暂停]",musicGroupId,musicGroup.getName());
+        }
+
+        StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
+        if (studentRegistration == null) {
+            throw new BizException("学员 {} {} 注册信息不存在",userId,user.getUsername());
+        }
+
+        StudentMusicGroupStatusEnum currentStudentMusicGroupStatus = studentRegistration.getMusicGroupStatus();
+        if (currentStudentMusicGroupStatus != StudentMusicGroupStatusEnum.NORMAL && currentStudentMusicGroupStatus != StudentMusicGroupStatusEnum.APPLY) {
+            throw new BizException("学员 {} {} 当前在团状态不能退团",userId,user.getUsername());
+        }
+
+        // 有进行中的课程不能退团
+        List<CourseSchedule> courseScheduleList = courseScheduleDao.findMusicGroupCourseSchedulesWithStudent(musicGroupId, GroupType.MUSIC.getCode(),
+                "UNDERWAY", userId);
+        if (courseScheduleList != null && courseScheduleList.size() > 0) {
+            throw new BizException("学员 {} {} 存在[进行中]的课程",userId,user.getUsername());
+        }
+
+        //如果是会员团,并且有预排课计划
+        MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.findByCourseDateAndMusicGroupId(musicGroupId, null, 0);
+        if(termCourseDetail != null){
+            //是否已经预排部分课程
+            List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(musicGroup.getId());
+            if(courseSchedules.size() > 0){
+                throw new BizException("乐团 {} {} 存在预排课课程,请优先完成预排课",musicGroupId,musicGroup.getName());
+            }
+        }
+    }
+
+    @Override
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public Map renew(RenewParamDto renewParamDto) throws Exception {
         Long calenderId = renewParamDto.getCalenderId();
         Integer userId = renewParamDto.getUserId();
@@ -2790,9 +3039,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 if(payStatus != PayStatus.FAILED){
                 	if(payStatus == PayStatus.SUCCESSED){
                 		throw new BizException("订单已支付成功,请勿重复支付");
-                	}else if(payStatus == PayStatus.PAYING){
+                	}/*else if(payStatus == PayStatus.PAYING){
                 		throw new BizException("订单还在交易中,请稍后重试");
-                	}
+                	}*/
                 }
                 oldStudentPaymentOrder.setStatus(CLOSE);
                 studentPaymentOrderService.update(oldStudentPaymentOrder);

+ 123 - 57
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java

@@ -28,6 +28,7 @@ import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
 import com.ym.mec.util.string.MessageFormatter;
+
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -41,6 +42,7 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.CollectionUtils;
+
 import java.math.BigDecimal;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
@@ -2406,9 +2408,15 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         if (Objects.nonNull(practiceCourseMinutesConfig)) {
             practiceCourseMinutes = practiceCourseMinutesConfig.getParanValue(Integer.class);
         }
+        
+        SysConfig organIdConfig = sysConfigDao.findByParamName(SysConfigService.PRACTICE_TEACHER_ORGAN_RANGE);
+        
+        if(organIdConfig == null || StringUtils.isBlank(organIdConfig.getParanValue())){
+        	throw new BizException("系统参数[{}]未配置", SysConfigService.PRACTICE_TEACHER_ORGAN_RANGE);
+        }
 
         List<Integer> includeTeacherIds = new ArrayList<>();
-        List<ExtendTeacherBasicDto> organAndSubjectTeachers = teacherDao.findTeaTeachersByOrganAndSubject2(sysUser.getOrganId(), subjectId);
+        List<ExtendTeacherBasicDto> organAndSubjectTeachers = teacherDao.findTeaTeachersByOrganAndSubject4(organIdConfig.getParanValue(), subjectId);
         if (CollectionUtils.isEmpty(organAndSubjectTeachers)) {
             return new ArrayList<>();
         }
@@ -2613,7 +2621,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         }
         now = now.plusDays(1);
         Date applyStartDate = Date.from(now.atStartOfDay(zoneId).toInstant());
-        Date applyEndDate = Date.from(now.plusMonths(buyMonths).atStartOfDay(zoneId).toInstant());
+        Date applyEndDate = Date.from(now.plusDays(buyMonths).atStartOfDay(zoneId).toInstant());
         Date firstMonday = DateUtil.getWeekDayWithDate(applyStartDate, Calendar.MONDAY);
         Date secondSunday = DateUtil.getWeekDayWithDate(applyEndDate, Calendar.SUNDAY);
 
@@ -2820,15 +2828,15 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 
     @Override
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-    public HttpResponseResult buyPracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams) {
+    public HttpResponseResult buyPracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams, String operatorInfo) {
         if (Objects.isNull(practiceGroupBuyParams.getUserId())) {
             return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择教师");
         }
         if (Objects.isNull(practiceGroupBuyParams.getSubjectId())) {
             return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择声部");
         }
-        if (Objects.isNull(practiceGroupBuyParams.getBuyMonths())) {
-            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择需要购买的数");
+        if (Objects.isNull(practiceGroupBuyParams.getAllCourseNum())) {
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择需要购买的课时数");
         }
         if (Objects.isNull(practiceGroupBuyParams.getDrillTimesOnWeek())) {
             return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择单周陪练次数");
@@ -2855,14 +2863,14 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         SysConfig practiceCourseMinutesConfig = sysConfigDao.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
         Integer practiceCourseMinutes = practiceCourseMinutesConfig.getParanValue(Integer.class);
         SysConfig practiceCourseSalaryConfig = sysConfigDao.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
-        SysConfig practiceBuyActivityExpireDateConfig = sysConfigDao.findByParamName(SysConfigService.PRACTICE_BUY_ACTIVITY_EXPIRE_DATE);
+        /*SysConfig practiceBuyActivityExpireDateConfig = sysConfigDao.findByParamName(SysConfigService.PRACTICE_BUY_ACTIVITY_EXPIRE_DATE);
         Date practiceBuyActivityExpireDate = DateUtil.stringToDate(practiceBuyActivityExpireDateConfig.getParanValue(), "yyyy-MM-dd HH:mm:ss");
         SysConfig practicePromotionActivityStartDateConfig = sysConfigDao.findByParamName(SysConfigService.PRACTICE_PROMOTION_ACTIVITY_START_DATE);
         Date practicePromotionActivityStartDate = DateUtil.stringToDate(practicePromotionActivityStartDateConfig.getParanValue(), "yyyy-MM-dd HH:mm:ss");
-
+*/
         Date now = new Date();
 
-        int studentExitChargePractices = practiceGroupDao.checkStudentExitChargePractice(practiceGroupBuyParams.getStudentId(),"2021-03-09 00:00:00");
+//        int studentExitChargePractices = practiceGroupDao.checkStudentExitChargePractice(practiceGroupBuyParams.getStudentId(),"2021-03-09 00:00:00");
 
         LocalDate courseStartDay = LocalDate.now();
         LocalDate tempCourseLocalDate = LocalDate.parse("2020-03-01", DateUtil.dateFormatter);
@@ -2902,7 +2910,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         courseStartDay = courseStartDay.plusDays(1);
         Date courseStartDate = Date.from(courseStartDay.atStartOfDay(DateUtil.zoneId).toInstant());
         practiceGroupBuyParams.setCoursesStartDate(courseStartDate);
-        LocalDate currentExpiredDay = courseStartDay.plusMonths(practiceGroupBuyParams.getBuyMonths());
+        LocalDate currentExpiredDay = courseStartDay.plusDays(practiceGroupBuyParams.getBuyMonths());
         Date courseExpiredDate = Date.from(currentExpiredDay.atStartOfDay(DateUtil.zoneId).toInstant());
         courseExpiredDate = DateUtil.addSeconds(courseExpiredDate, -1);
         practiceGroupBuyParams.setCoursesExpireDate(courseExpiredDate);
@@ -2969,8 +2977,8 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         if (Objects.isNull(practiceGroupSellPrice)) {
             throw new BizException("所在城市暂不参与此活动");
         }
-        BigDecimal oneMonthPrice;
-        if (practiceBuyActivityExpireDate.after(now)&&Objects.nonNull(sysUser.getOrganId())&&sysUser.getOrganId()==14&& studentExitChargePractices <= 0) {
+        BigDecimal oneMonthPrice = practiceGroupSellPrice.getSingleClassMinutesPrice();
+        /*if (practiceBuyActivityExpireDate.after(now)&&Objects.nonNull(sysUser.getOrganId())&&sysUser.getOrganId()==14&& studentExitChargePractices <= 0) {
 //            oneMonthPrice = practiceGroupBuyParams.getDrillTimesOnWeek() == 1 ? practiceGroupSellPrice.getOnceActivityPrice() : practiceGroupSellPrice.getTwiceActivityPrice();
             oneMonthPrice = practiceGroupBuyParams.getDrillTimesOnWeek() == 1 ? practiceGroupSellPrice.getOnceOriginalPrice() : practiceGroupSellPrice.getTwiceOriginalPrice();
             if (!now.before(practicePromotionActivityStartDate) && practiceGroupBuyParams.getBuyMonths() >= 3 && studentExitChargePractices > 0) {
@@ -2980,17 +2988,17 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             }
         } else {
             oneMonthPrice = practiceGroupBuyParams.getDrillTimesOnWeek() == 1 ? practiceGroupSellPrice.getOnceOriginalPrice() : practiceGroupSellPrice.getTwiceOriginalPrice();
-        }
-        BigDecimal amount = oneMonthPrice.multiply(new BigDecimal(practiceGroupBuyParams.getBuyMonths()));
-        if (!now.before(practicePromotionActivityStartDate) && now.before(practiceBuyActivityExpireDate) && Objects.nonNull(sysUser.getOrganId())&&sysUser.getOrganId()==14 && studentExitChargePractices <= 0) {
-            amount = oneMonthPrice.multiply(new BigDecimal(1));
-        }
+        }*/
+        BigDecimal amount = oneMonthPrice.multiply(new BigDecimal(practiceGroupBuyParams.getAllCourseNum()));
 
         practiceGroupBuyParams.setDrillTimesJson(drillTimesObject.toJSONString());
         practiceGroupBuyParams.setOrganId(sysUser.getOrganId());
         practiceGroupBuyParams.setSingleClassMinutes(practiceCourseMinutes);
         practiceGroupBuyParams.setGroupStatus(GroupStatusEnum.LOCK);
         practiceGroupBuyParams.setType(PracticeGroupType.CHARGE);
+        if(StringUtils.isNotBlank(operatorInfo)){
+        	practiceGroupBuyParams.setMemo(operatorInfo+",教务代买");
+        }
         practiceGroupDao.insert(practiceGroupBuyParams);
 
         //创建班级信息
@@ -3007,6 +3015,26 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         classGroup.setCreateTime(now);
         classGroup.setUpdateTime(now);
         classGroupDao.insert(classGroup);
+        
+        //使用优惠券
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(practiceGroupBuyParams.getCouponIdList(),amount,true);
+        amount = studentPaymentOrder.getActualAmount();
+        studentPaymentOrder.setUserId(practiceGroupBuyParams.getStudentId());
+        studentPaymentOrder.setGroupType(GroupType.PRACTICE);
+        String orderNo = idGeneratorService.generatorId("payment") + "";
+        studentPaymentOrder.setOrderNo(orderNo);
+        studentPaymentOrder.setStatus(DealStatusEnum.ING);
+        studentPaymentOrder.setType(OrderTypeEnum.PRACTICE_GROUP_BUY);
+        if (practiceGroupBuyParams.isRenew()) {
+            studentPaymentOrder.setType(OrderTypeEnum.PRACTICE_GROUP_RENEW);
+        }
+        studentPaymentOrder.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+        studentPaymentOrder.setClassGroupId(classGroup.getId());
+        studentPaymentOrder.setVersion(0);
+        if(StringUtils.isNotBlank(operatorInfo)){
+        	studentPaymentOrder.setMemo(operatorInfo+",教务代买");
+        }
+        studentPaymentOrderService.insert(studentPaymentOrder);
 
         //创建班级老师关联记录
         ClassGroupTeacherMapper classGroupTeacherMapper = new ClassGroupTeacherMapper();
@@ -3068,13 +3096,18 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         if(teacherDefaultSalary == null){
         	throw new BizException("请设置教师课酬");
         }
-        BigDecimal studentSingleCourseCost = amount.divide(new BigDecimal(practiceCourses.size()), CommonConstants.DECIMAL_PLACE, ROUND_DOWN);
+//        BigDecimal studentSingleCourseCost = amount.divide(new BigDecimal(practiceCourses.size()), CommonConstants.DECIMAL_PLACE, ROUND_DOWN);
 
-        BigDecimal oneMonthOriginalPrice=practiceGroupBuyParams.getDrillTimesOnWeek()==1?practiceGroupSellPrice.getOnceOriginalPrice():practiceGroupSellPrice.getTwiceOriginalPrice();
-        BigDecimal originalAmount = oneMonthOriginalPrice.multiply(new BigDecimal(practiceGroupBuyParams.getBuyMonths()));
-        BigDecimal studentSingleCourseOriginalCost=originalAmount.divide(new BigDecimal(practiceCourses.size()), CommonConstants.DECIMAL_PLACE, ROUND_DOWN);
+//        BigDecimal oneMonthOriginalPrice=practiceGroupBuyParams.getDrillTimesOnWeek()==1?practiceGroupSellPrice.getOnceOriginalPrice():practiceGroupSellPrice.getTwiceOriginalPrice();
+//        BigDecimal originalAmount = oneMonthOriginalPrice.multiply(new BigDecimal(practiceGroupBuyParams.getBuyMonths()));
+//        BigDecimal studentSingleCourseOriginalCost=originalAmount.divide(new BigDecimal(practiceCourses.size()), CommonConstants.DECIMAL_PLACE, ROUND_DOWN);
 
-        for (CourseSchedule courseSchedule : practiceCourses) {
+        //实际支付金额,去除优惠券
+        BigDecimal actualPrice = studentPaymentOrder.getExpectAmount();
+        BigDecimal divide = actualPrice.divide(new BigDecimal(practiceCourses.size()), ROUND_DOWN);
+        BigDecimal firstAmount = actualPrice.subtract(divide.multiply(new BigDecimal(practiceCourses.size()))).add(divide);
+        for (int i = 0; i < practiceCourses.size(); i++) {
+            CourseSchedule courseSchedule = practiceCourses.get(i);
             //课程与老师薪水表
             CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
             courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
@@ -3094,9 +3127,16 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             courseScheduleStudentPayment.setMusicGroupId(practiceGroupBuyParams.getId().toString());
             courseScheduleStudentPayment.setCourseScheduleId(courseSchedule.getId());
             courseScheduleStudentPayment.setUserId(practiceGroupBuyParams.getStudentId());
-            courseScheduleStudentPayment.setExpectPrice(studentSingleCourseCost);
-            courseScheduleStudentPayment.setActualPrice(studentSingleCourseCost);
-            courseScheduleStudentPayment.setOriginalPrice(studentSingleCourseOriginalCost);
+            if(i == 0){
+                courseScheduleStudentPayment.setExpectPrice(firstAmount);
+                courseScheduleStudentPayment.setActualPrice(firstAmount);
+            }else {
+                courseScheduleStudentPayment.setExpectPrice(divide);
+                courseScheduleStudentPayment.setActualPrice(divide);
+            }
+//            courseScheduleStudentPayment.setExpectPrice(oneMonthPrice);
+//            courseScheduleStudentPayment.setActualPrice(studentSingleCourseCost);
+            courseScheduleStudentPayment.setOriginalPrice(oneMonthPrice);
             courseScheduleStudentPayment.setClassGroupId(classGroup.getId());
             courseScheduleStudentPayment.setCreateTime(now);
             courseScheduleStudentPayment.setUpdateTime(now);
@@ -3133,24 +3173,6 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             }
             return BaseController.failed(HttpStatus.FOUND, errMessage);
         }
-        //使用优惠券
-        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(practiceGroupBuyParams.getCouponIdList(),amount,true);
-        amount = studentPaymentOrder.getActualAmount();
-        studentPaymentOrder.setUserId(practiceGroupBuyParams.getStudentId());
-        studentPaymentOrder.setGroupType(GroupType.PRACTICE);
-        String orderNo = idGeneratorService.generatorId("payment") + "";
-        studentPaymentOrder.setOrderNo(orderNo);
-        studentPaymentOrder.setStatus(DealStatusEnum.ING);
-        studentPaymentOrder.setType(OrderTypeEnum.PRACTICE_GROUP_BUY);
-        if (practiceGroupBuyParams.isRenew()) {
-            studentPaymentOrder.setType(OrderTypeEnum.PRACTICE_GROUP_RENEW);
-        }
-        studentPaymentOrder.setExpectAmount(amount);
-        studentPaymentOrder.setMusicGroupId(practiceGroupBuyParams.getId().toString());
-        studentPaymentOrder.setActualAmount(studentPaymentOrder.getExpectAmount());
-        studentPaymentOrder.setClassGroupId(classGroup.getId());
-        studentPaymentOrder.setVersion(0);
-        studentPaymentOrderService.insert(studentPaymentOrder);
 
         BigDecimal balance = BigDecimal.ZERO;
         if (practiceGroupBuyParams.isUseBalancePayment() || studentPaymentOrder.getExpectAmount().doubleValue() == 0) {
@@ -3257,7 +3279,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 
     @Override
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-    public HttpResponseResult createPackagePracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams) {
+    public HttpResponseResult createPackagePracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams, String operatorInfo) {
         studentDao.lockUser(practiceGroupBuyParams.getStudentId());
         if (Objects.isNull(practiceGroupBuyParams.getUserId())) {
             return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择教师");
@@ -3439,6 +3461,9 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         practiceGroupBuyParams.setSingleClassMinutes(practiceCourseMinutes);
         practiceGroupBuyParams.setGroupStatus(GroupStatusEnum.LOCK);
         practiceGroupBuyParams.setType(PracticeGroupType.COME_ON_PACKAGE);
+        if(StringUtils.isNotBlank(operatorInfo)){
+        	practiceGroupBuyParams.setMemo(operatorInfo+",教务代买");
+        }
         practiceGroupDao.insert(practiceGroupBuyParams);
 
         //创建班级信息
@@ -3522,7 +3547,14 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         BigDecimal originalAmount = oneMonthOriginalPrice.multiply(new BigDecimal(practiceGroupBuyParams.getBuyMonths()));
         BigDecimal studentSingleCourseOriginalCost=originalAmount.divide(new BigDecimal(practiceCourses.size()), CommonConstants.DECIMAL_PLACE, ROUND_DOWN);
 
-        for (CourseSchedule courseSchedule : practiceCourses) {
+        //使用优惠券
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(practiceGroupBuyParams.getCouponIdList(),amount,true);
+        //实际支付金额,去除优惠券
+        BigDecimal actualPrice = studentPaymentOrder.getExpectAmount();
+        BigDecimal divide = actualPrice.divide(new BigDecimal(practiceCourses.size()), ROUND_DOWN);
+        BigDecimal firstAmount = actualPrice.subtract(divide.multiply(new BigDecimal(practiceCourses.size()))).add(divide);
+        for (int i = 0; i < practiceCourses.size(); i++) {
+            CourseSchedule courseSchedule = practiceCourses.get(i);
             //课程与老师薪水表
             CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
             courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
@@ -3542,8 +3574,13 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             courseScheduleStudentPayment.setMusicGroupId(practiceGroupBuyParams.getId().toString());
             courseScheduleStudentPayment.setCourseScheduleId(courseSchedule.getId());
             courseScheduleStudentPayment.setUserId(practiceGroupBuyParams.getStudentId());
-            courseScheduleStudentPayment.setExpectPrice(studentSingleCourseCost);
-            courseScheduleStudentPayment.setActualPrice(studentSingleCourseCost);
+            if(i == 0){
+                courseScheduleStudentPayment.setExpectPrice(firstAmount);
+                courseScheduleStudentPayment.setActualPrice(firstAmount);
+            }else {
+                courseScheduleStudentPayment.setExpectPrice(divide);
+                courseScheduleStudentPayment.setActualPrice(divide);
+            }
             courseScheduleStudentPayment.setOriginalPrice(studentSingleCourseOriginalCost);
             courseScheduleStudentPayment.setClassGroupId(classGroup.getId());
             courseScheduleStudentPayment.setCreateTime(now);
@@ -3580,9 +3617,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             }
             return BaseController.failed(HttpStatus.FOUND, errMessage);
         }
-
-        //使用优惠券
-        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(practiceGroupBuyParams.getCouponIdList(),amount,true);
+        
         amount = studentPaymentOrder.getActualAmount();
         studentPaymentOrder.setUserId(practiceGroupBuyParams.getStudentId());
         studentPaymentOrder.setGroupType(GroupType.PRACTICE);
@@ -3598,6 +3633,9 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         studentPaymentOrder.setActualAmount(studentPaymentOrder.getExpectAmount());
         studentPaymentOrder.setClassGroupId(classGroup.getId());
         studentPaymentOrder.setVersion(0);
+        if(StringUtils.isNotBlank(operatorInfo)){
+        	studentPaymentOrder.setMemo(operatorInfo+",教务代买");
+        }
         studentPaymentOrderService.insert(studentPaymentOrder);
 
         BigDecimal balance = BigDecimal.ZERO;
@@ -4376,6 +4414,8 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         if(Objects.nonNull(practiceGroup.getType())&&(PracticeGroupType.CARE_PACKAGE.equals(practiceGroup.getType())||PracticeGroupType.COME_ON_PACKAGE.equals(practiceGroup.getType()))){
             practiceCourseMinutes = 50;
         }
+        
+        practiceBuyResult.setCourseNum(practiceGroup.getAllCourseNum());
 
         if(StringUtils.isNotEmpty(practiceGroup.getDrillTimesJson())){
             JSONArray coursesArry = new JSONArray();
@@ -4557,14 +4597,40 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-    public HttpResponseResult cancelWaitPayOrder(Integer userId, Integer groupId) {
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResponseResult cancelWaitPayOrder(Integer userId, Integer groupId) throws Exception {
         PracticeGroup practiceGroup = practiceGroupDao.get(groupId.longValue());
         if (practiceGroup.getGroupStatus().equals(GroupStatusEnum.LOCK)) {
             groupService.deleteGroupOtherInfo(groupId.toString(), GroupType.PRACTICE);
             practiceGroup.setGroupStatus(GroupStatusEnum.CANCEL);
             practiceGroup.setMemo("用户手动取消");
             practiceGroupDao.update(practiceGroup);
+            
+			// 判断是否存在支付中的记录
+			List<StudentPaymentOrder> list = studentPaymentOrderService.queryByCondition(GroupType.PRACTICE, groupId + "", userId, DealStatusEnum.ING,
+					OrderTypeEnum.PRACTICE_GROUP_BUY);
+			
+			if (list.size() > 0) {
+				StudentPaymentOrder applyOrder = list.get(list.size() - 1);
+				// 查询订单状态
+				PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
+				if(payStatus == PayStatus.SUCCESSED){
+					throw new BizException("订单已支付成功,请勿重复支付");
+				}/*else if(payStatus == PayStatus.PAYING){
+					throw new BizException("订单还在交易中,请稍后重试");
+				}*/
+				//处理关闭订单
+				applyOrder.setStatus(DealStatusEnum.CLOSE);
+				applyOrder.setMemo("主动关闭订单");
+				if (applyOrder.getBalancePaymentAmount() != null && applyOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
+					sysUserCashAccountService.updateBalance(applyOrder.getUserId(), applyOrder.getBalancePaymentAmount(),
+							PlatformCashAccountDetailTypeEnum.REFUNDS, "购买网管课支付失败");
+				}
+				studentPaymentOrderService.update(applyOrder);
+				sysCouponCodeService.quit(applyOrder.getCouponCodeId());
+			}
+    		
+    		
         } else if (practiceGroup.getGroupStatus().equals(GroupStatusEnum.NORMAL)) {
             return BaseController.failed(HttpStatus.CREATED, "该订单已经支付成功");
         } else if (practiceGroup.getGroupStatus().equals(GroupStatusEnum.CANCEL)) {
@@ -5328,9 +5394,9 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
             if(payStatus == PayStatus.SUCCESSED){
                 throw new BizException("订单已支付成功,请勿重复支付");
-            }else if(payStatus == PayStatus.PAYING){
+            }/*else if(payStatus == PayStatus.PAYING){
                 throw new BizException("订单还在交易中,请稍后重试");
-            }
+            }*/
             if(!practiceGroupBuyParams.isRepeatPay()){
                 return BaseController.failed(HttpStatus.CONTINUE, "您有待支付的订单");
             }
@@ -5515,9 +5581,9 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             PayStatus payStatus = studentPaymentOrderService.queryPayStatus(order.getPaymentChannel(), order.getOrderNo(), order.getTransNo());
             if(payStatus == PayStatus.SUCCESSED){
                 throw new BizException("订单已支付成功,请勿重复支付");
-            }else if(payStatus == PayStatus.PAYING){
+            }/*else if(payStatus == PayStatus.PAYING){
                 throw new BizException("订单还在交易中,请稍后重试");
-            }
+            }*/
             if(practiceGroupBuyParams.isRepeatPay()){
                 //处理关闭订单
                 order.setStatus(DealStatusEnum.CLOSE);
@@ -5703,9 +5769,9 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             PayStatus payStatus = studentPaymentOrderService.queryPayStatus(order.getPaymentChannel(), order.getOrderNo(), order.getTransNo());
             if(payStatus == PayStatus.SUCCESSED){
                 throw new BizException("订单已支付成功,请勿重复支付");
-            }else if(payStatus == PayStatus.PAYING){
+            }/*else if(payStatus == PayStatus.PAYING){
                 throw new BizException("订单还在交易中,请稍后重试");
-            }
+            }*/
             if(buyDoubleEleven2021Dto.isRepeatPay()){
                 //处理关闭订单
                 order.setStatus(DealStatusEnum.CLOSE);

+ 41 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/QuestionnaireUserResultServiceImpl.java

@@ -9,6 +9,7 @@ import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.QuestionnaireActiveTypeEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.page.QuestionnaireUserResultQueryInfo;
 import com.ym.mec.biz.dal.page.ReplacementInstrumentActivityQueryInfo;
 import com.ym.mec.biz.service.CooperationOrganService;
 import com.ym.mec.common.dal.BaseDAO;
@@ -17,6 +18,7 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.json.JSONObject;
@@ -194,4 +196,43 @@ public class QuestionnaireUserResultServiceImpl extends BaseServiceImpl<Long, Qu
 		//新增问卷结果
 		questionnaireUserResultDao.batchInsert1(questionnaireUserResultList);
 	}
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void addResult(ReplacementInstrumentActivityDto replacementInstrumentActivity) {
+		Integer topicId = replacementInstrumentActivity.getTopicId();
+
+		List<QuestionnaireUserResult> questionnaireUserResultList = replacementInstrumentActivity.getQuestionnaireUserResultList();
+		if(questionnaireUserResultList == null || questionnaireUserResultList.size() == 0){
+			throw new BizException("请填写问卷结果");
+		}
+		Long time = new Date().getTime();
+		for (QuestionnaireUserResult result : questionnaireUserResultList) {
+			result.setUserId(time.intValue());
+			result.setQuestionnaireTopicId(topicId);
+			result.setActiveType(QuestionnaireActiveTypeEnum.ENTERPRISE_CUSTOMIZATION);
+		}
+		//新增问卷结果
+		questionnaireUserResultDao.batchInsert1(questionnaireUserResultList);
+    }
+
+	@Override
+	public Object queryResultPage(QuestionnaireUserResultQueryInfo queryInfo) {
+		PageInfo<QuestionnaireUserResultDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<QuestionnaireUserResultDto> dataList = null;
+		int count = questionnaireUserResultDao.countResultCount(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = questionnaireUserResultDao.findResultCount(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
 }

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

@@ -285,9 +285,9 @@ public class ReplacementInstrumentActivityServiceImpl extends BaseServiceImpl<In
                 if(payStatus != PayStatus.FAILED){
                 	if(payStatus == PayStatus.SUCCESSED){
                 		throw new BizException("订单已支付成功,请勿重复支付");
-                	}else if(payStatus == PayStatus.PAYING){
+                	}/*else if(payStatus == PayStatus.PAYING){
                 		throw new BizException("订单还在交易中,请稍后重试");
-                	}
+                	}*/
                 }
                 
                 oldOrder.setStatus(DealStatusEnum.FAILED);

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

@@ -1013,4 +1013,52 @@ public class StudentManageServiceImpl implements StudentManageService {
         student.setActivityCourseDetail(JSON.toJSONString(activityCourseDetailDto));
         studentDao.update(student);
     }
+
+    @Override
+    public PageInfo<Student> queryStudent(StudentActivityQueryInfo queryInfo) {
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        List<Integer> studentIds = new ArrayList<>();
+        params.put("studentIds",studentIds);
+        PageInfo<Student> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        if(queryInfo.getHasMusicCourse() != null){
+            params.put("groupType","MUSIC");
+            params.put("hasCourse",queryInfo.getHasMusicCourse());
+            studentIds = courseScheduleDao.queryHasCourseStudentIds(params);
+            if(studentIds == null || studentIds.size() == 0){
+                return pageInfo;
+            }
+        }
+        if(queryInfo.getHasPracticeCourse() != null){
+            params.put("groupType","PRACTICE");
+            params.put("hasCourse",queryInfo.getHasPracticeCourse());
+            params.put("studentIds",studentIds);
+            studentIds = courseScheduleDao.queryHasCourseStudentIds(params);
+            if(studentIds == null || studentIds.size() == 0){
+                return pageInfo;
+            }
+        }
+        if(queryInfo.getHasVipCourse() != null){
+            params.put("groupType","VIP");
+            params.put("hasCourse",queryInfo.getHasVipCourse());
+            params.put("studentIds",studentIds);
+            studentIds = courseScheduleDao.queryHasCourseStudentIds(params);
+            if(studentIds == null || studentIds.size() == 0){
+                return pageInfo;
+            }
+        }
+        params.put("studentIds",studentIds);
+        List<Student> dataList = null;
+        int count = studentDao.countStudent(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = studentDao.queryStudent(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
 }

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

@@ -304,6 +304,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             	continue;
             }
             Map<String, Object> payment = Payment.queryPayment(payingOrder.getTransNo());
+            LOGGER.info("订单[{}]交易主动查询接口返回:{}", payingOrder.getTransNo(), payment);
+            
             Map<String, String> rpMap = new HashMap<>();
             rpMap.put("merOrderNo", payingOrder.getOrderNo());
             rpMap.put("orderNo", payingOrder.getTransNo());
@@ -314,8 +316,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             }
             if (status.equals("succeeded")) {
                 rpMap.put("tradeState", "1");
-            }
-            if (status.equals("failed") || (DateUtil.minutesBetween(DateUtil.addHours(payingOrder.getUpdateTime(), 2), date) > 0)) {
+            }else if (status.equals("failed") || (DateUtil.minutesBetween(DateUtil.addHours(payingOrder.getUpdateTime(), 2), date) > 0)) {
                 rpMap.put("tradeState", "0");
             }
 

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

@@ -137,9 +137,9 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
                 if(payStatus != PayStatus.FAILED){
                 	if(payStatus == PayStatus.SUCCESSED){
                 		throw new BizException("订单已支付成功,请勿重复支付");
-                	}else if(payStatus == PayStatus.PAYING){
+                	}/*else if(payStatus == PayStatus.PAYING){
                 		throw new BizException("订单还在交易中,请稍后重试");
-                	}
+                	}*/
                 }
                 
                 orderByOrderNo.setStatus(CLOSE);

+ 122 - 19
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -1,12 +1,75 @@
 package com.ym.mec.biz.service.impl;
 
+import static com.ym.mec.biz.dal.enums.IndexDataType.CLOUD_NEW_STUDENT_NUM;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
+import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.dao.CloudTeacherDao;
+import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dao.IndexBaseMonthDataDao;
+import com.ym.mec.biz.dal.dao.MemberRankSettingDao;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dao.PracticeGroupDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.SysMusicCompareRecordDao;
+import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dto.CloudStudyStudentDataDto;
+import com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDetailDto;
+import com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDto;
+import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
+import com.ym.mec.biz.dal.dto.EduOrganStudentListDto;
+import com.ym.mec.biz.dal.dto.EduOrganStudentListExportDto;
+import com.ym.mec.biz.dal.dto.StatDto;
+import com.ym.mec.biz.dal.dto.StudentClassInfoDto;
+import com.ym.mec.biz.dal.dto.StudentCourseTimesDto;
+import com.ym.mec.biz.dal.dto.StudentTeacherCourseDto;
+import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
+import com.ym.mec.biz.dal.entity.CooperationOrgan;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
+import com.ym.mec.biz.dal.entity.MemberRankSetting;
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.StudentPreRegistration;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.entity.SysConfig;
+import com.ym.mec.biz.dal.entity.SysUserCashAccount;
+import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
+import com.ym.mec.biz.dal.enums.GradeTypeEnum;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.PeriodEnum;
+import com.ym.mec.biz.dal.enums.SixPlusGradeEnum;
+import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
 import com.ym.mec.biz.dal.page.CloudTeacherActiveQueryInfo;
 import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
@@ -16,27 +79,13 @@ import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
+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.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.ss.formula.functions.T;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-
-import java.math.BigDecimal;
-import java.time.LocalDate;
-import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
-
-import static com.ym.mec.biz.dal.enums.IndexDataType.CLOUD_NEW_STUDENT_NUM;
 
 @Service
 public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implements StudentService {
@@ -74,12 +123,66 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     @Autowired
     private OrganizationService organizationService;
 
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    
+    @Autowired
+    private SysUserCashAccountDao sysUserCashAccountDao;
+
     @Override
     public BaseDAO<Integer, Student> getDAO() {
         return studentDao;
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
+	public boolean register(StudentPreRegistration studentPreRegistration) {
+    	
+    	Date date = new Date();
+    	// 判断用户是否存在
+        SysUser user = sysUserFeignService.queryUserByMobile(studentPreRegistration.getPhone());
+        
+        Integer userId = null;
+        
+        if(user != null && user.getId() != null){
+        	if(user.getUserType().contains("STUDENT")){
+        		throw new BizException("您已注册,请直接下载APP!");
+        	}
+        	userId = user.getId();
+
+            user.setUpdateTime(date);
+            teacherDao.updateUser(user);
+        }else{
+        	user = new SysUser();
+            user.setPhone(studentPreRegistration.getPhone());
+            user.setUsername(studentPreRegistration.getUserName());
+            user.setOrganId(studentPreRegistration.getOrganId());
+            user.setUserType("STUDENT");
+            user.setCreateTime(date);
+            user.setUpdateTime(date);
+            // 注册账户信息
+            HttpResponseResult<Integer> result = sysUserFeignService.addUser(user);
+
+            userId = result.getData();
+            user.setId(userId);
+            
+            sysUserCashAccountDao.insert(new SysUserCashAccount(userId, "CNY"));
+        }
+        
+        //添加student
+        Student student = new Student();
+        student.setUserId(userId);
+        student.setCreateTime(date);
+        student.setUpdateTime(date);
+        student.setIsNewUser(true);
+        student.setCurrentGradeNum(studentPreRegistration.getCurrentGradeNum());
+        student.setCurrentClass(studentPreRegistration.getCurrentClass());
+        studentDao.insert(student);
+        
+        return true;
+	}
+
+	@Override
     public PageInfo findStudentVipGroupList(StudentQueryInfo queryInfo) {
         PageInfo pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<String, Object>();

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

@@ -143,9 +143,9 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
                 if(payStatus != PayStatus.FAILED){
                 	if(payStatus == PayStatus.SUCCESSED){
                 		throw new BizException("订单已支付成功,请勿重复支付");
-                	}else if(payStatus == PayStatus.PAYING){
+                	}/*else if(payStatus == PayStatus.PAYING){
                 		throw new BizException("订单还在交易中,请稍后重试");
-                	}
+                	}*/
                 }
                 
                 studentPaymentOrder.setStatus(DealStatusEnum.CLOSE);

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreServiceImpl.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.SubjectDao;
 import com.ym.mec.biz.dal.dao.SysMusicScoreAccompanimentDao;
 import com.ym.mec.biz.dal.dao.SysMusicScoreCategoriesDao;
 import com.ym.mec.biz.dal.dao.SysMusicScoreDao;
@@ -16,6 +17,8 @@ import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -35,6 +38,8 @@ public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicS
 	private SysUserFeignService sysUserFeignService;
 	@Autowired
 	private SysMusicScoreCategoriesDao sysMusicScoreCategoriesDao;
+	@Autowired
+	private SubjectDao subjectDao;
 
 	@Override
 	public BaseDAO<Integer, SysMusicScore> getDAO() {
@@ -155,12 +160,23 @@ public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicS
 		List<SysMusicScore> rows = sysMusicScorePageInfo.getRows();
 		if(rows != null && rows.size() > 0){
 			Set<Integer> categoriesIds = rows.stream().map(e -> e.getMusicScoreCategoriesId()).collect(Collectors.toSet());
+			//获取分部列表
+			Map<Integer,String> organMap = MapUtil.convertMybatisMap(sysMusicScoreCategoriesDao.queryOrganByIds(categoriesIds));
+			//获取声部列表
+			Set<Integer> subjectIds = rows.stream().map(e -> e.getSubjectId()).collect(Collectors.toSet());
+			subjectIds.removeAll(Collections.singleton(null));
+			Map<Long, String> subjectMap = new HashMap();
+			if(subjectIds.size() > 0){
+				subjectMap = MapUtil.convertMybatisMap(subjectDao.findBySubjecIds(StringUtils.join(subjectIds, ",")));
+			}
 			Map<Integer,String> map = new HashMap<>(categoriesIds.size());
 			for (Integer categoriesId : categoriesIds) {
 				map.put(categoriesId,getParentTreeName(categoriesId));
 			}
 			for (SysMusicScore row : rows) {
 				row.setCategoriesName(map.get(row.getMusicScoreCategoriesId()));
+				row.setOrganName(organMap.get(row.getMusicScoreCategoriesId()));
+				row.setSubjectName(subjectMap.get(row.getSubjectId()));
 			}
 		}
 		return sysMusicScorePageInfo;

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

@@ -248,11 +248,12 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupApplyBaseInfo().getVipGroupActivityId());
 		if(!vipGroup.getAllowOverstepActivityStudentNum() && Objects.nonNull(vipGroupActivity)
 				&& Objects.nonNull(vipGroupActivity.getStudentMaxUsedTimes()) && vipGroupActivity.getStudentMaxUsedTimes()!=-1 &&
+
 				StringUtils.isNotBlank(vipGroupApplyBaseInfoDto.getStudentIdList())){
 			List<String> tempStudentIds = Arrays.asList(vipGroupApplyBaseInfoDto.getStudentIdList().split(","));
 			List<Integer> errStudentIds = new ArrayList<>();
 			for (String studentIdStr : tempStudentIds) {
-				int useNum = vipGroupDao.countStudentUserActivityNum(vipGroup.getVipGroupApplyBaseInfo().getVipGroupActivityId(), Integer.valueOf(studentIdStr));
+				int useNum = activityUserMapperService.countActivityBuyNum(vipGroupActivity.getId(),Integer.valueOf(studentIdStr));
 				if(useNum >= vipGroupActivity.getStudentMaxUsedTimes()){
 					errStudentIds.add(Integer.valueOf(studentIdStr));
 				}
@@ -2629,9 +2630,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
 			if(payStatus == PayStatus.SUCCESSED){
 				throw new BizException("订单已支付成功,请勿重复支付");
-			}else if(payStatus == PayStatus.PAYING){
+			}/*else if(payStatus == PayStatus.PAYING){
 				throw new BizException("订单还在交易中,请稍后重试");
-			}
+			}*/
 			if(!vipGroupBuyParams.isRepeatPay()){
 				return BaseController.failed(HttpStatus.CONTINUE, "您有待支付的订单,是否继续支付");
 			}
@@ -2655,13 +2656,13 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 		VipGroupActivity vipGroupActivity = null;
 		if(Objects.nonNull(vipGroup.getVipGroupActivityId())){
-			vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId().intValue());
+			vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId());
 		}
 
 		if(Objects.nonNull(vipGroupActivity) && Objects.nonNull(vipGroupActivity.getStudentMaxUsedTimes()) && vipGroupActivity.getStudentMaxUsedTimes() != -1){
-			int useNum = vipGroupDao.countStudentUseingActivityNum(vipGroup.getVipGroupActivityId(), Integer.valueOf(user.getId()));
+			int useNum = activityUserMapperService.countActivityBuyNum(vipGroupActivity.getId(),user.getId());
 			if(useNum >= vipGroupActivity.getStudentMaxUsedTimes()){
-				throw new BizException("您已超过该活动购买次数限制", vipGroupActivity.getStudentMaxUsedTimes());
+				throw new BizException("您已超过该活动购买限制{}次", vipGroupActivity.getStudentMaxUsedTimes());
 			}
 		}
 
@@ -3142,6 +3143,158 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 	}
 
 	@Override
+	public void checkApplyRefundForStudentOa(ReturnFeeDto returnFeeDto) {
+		Long vipGroupId = returnFeeDto.getVipGroupId();
+		Integer studentId = returnFeeDto.getStudentId();
+		if(Objects.isNull(vipGroupId) || Objects.isNull(studentId)){
+			throw new BizException("请指定小课与学生");
+		}
+		SysUser user = teacherDao.getUser(studentId);
+		if(user == null){
+			throw new BizException("用户 {} 信息不存在",studentId);
+		}
+		Student student = studentDao.get(studentId);
+		if(student == null){
+			throw new BizException("学员 {} 信息不存在",studentId);
+		}
+		VipGroup vipGroup = vipGroupDao.get(vipGroupId);
+		if(Objects.isNull(vipGroup)){
+			throw new BizException("课程 {} 不存在",vipGroupId);
+		}
+		if(vipGroup.getStatus().equals(VipGroupStatusEnum.CANCEL)){
+			throw new BizException("课程 {} {} 已停止",vipGroupId,vipGroup.getName());
+		}
+		if(vipGroup.getName().startsWith("考前辅导课")){
+			throw new BizException("课程 {} {} 不支持退学",vipGroupId,vipGroup.getName());
+		}
+
+		List<StudentApplyRefunds> studentApplyRefunds = studentApplyRefundsDao.findByGroupAndUser(vipGroupId.toString(), GroupType.VIP.getCode(), studentId);
+		if(!CollectionUtils.isEmpty(studentApplyRefunds)){
+			throw new BizException("学生 {} {} 存在退课申请",studentId,user.getUsername());
+		}
+
+		ClassGroup classGroup = classGroupDao.findByVipGroup(vipGroupId, null);
+
+		ClassGroupStudentMapper classStudentMapperByUserIdAndClassGroupId = classGroupStudentMapperDao.query(classGroup.getId(),
+				studentId);
+
+		if(Objects.isNull(classStudentMapperByUserIdAndClassGroupId)){
+			throw new BizException("学生 {} {} 不在此课程中",studentId,user.getUsername());
+		}
+
+		if(classStudentMapperByUserIdAndClassGroupId.getStatus().equals(ClassGroupStudentStatusEnum.QUIT)){
+			throw new BizException("学生 {} {} 已经是退学状态",studentId,user.getUsername());
+		}
+		BigDecimal amount = returnFeeDto.getAmount();
+		if(!classStudentMapperByUserIdAndClassGroupId.getStatus().equals(ClassGroupStudentStatusEnum.QUIT_SCHOOL)){
+			if(Objects.isNull(amount)){
+				throw new BizException("请确定退费金额");
+			}
+			Map<String, BigDecimal> studentSurplusCourseFee = getStudentSurplusCourseFee(vipGroupId, studentId);
+			BigDecimal suplusCourseFee = studentSurplusCourseFee.get("suplusCourseOriginalFee");
+			if(amount.compareTo(suplusCourseFee) > 0){
+				throw new BizException("学员 {} {} 最大可退费金额为{}元", studentId,user.getUsername(),suplusCourseFee.toString());
+			}
+		}
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void applyRefundForStudentOa(ReturnFeeDto returnFeeDto) {
+		Long vipGroupId = returnFeeDto.getVipGroupId();
+		Integer studentId = returnFeeDto.getStudentId();
+		if(Objects.isNull(vipGroupId) || Objects.isNull(studentId)){
+			return;
+		}
+		VipGroup vipGroup = vipGroupDao.get(vipGroupId);
+		if(Objects.isNull(vipGroup)){
+			return;
+		}
+		if(vipGroup.getStatus().equals(VipGroupStatusEnum.CANCEL)){
+			return;
+		}
+		if(vipGroup.getName().startsWith("考前辅导课")){
+			return;
+		}
+
+		VipGroupCategory vipGroupCategory = vipGroupCategoryDao.get(vipGroup.getVipGroupCategoryId());
+
+		List<StudentApplyRefunds> studentApplyRefunds = studentApplyRefundsDao.findByGroupAndUser(vipGroupId.toString(), GroupType.VIP.getCode(), studentId);
+		if(!CollectionUtils.isEmpty(studentApplyRefunds)){
+			return;
+        }
+
+        ClassGroup classGroup = classGroupDao.findByVipGroup(vipGroupId, null);
+
+		ClassGroupStudentMapper classStudentMapperByUserIdAndClassGroupId = classGroupStudentMapperDao.query(classGroup.getId(),
+				studentId);
+
+		if(Objects.isNull(classStudentMapperByUserIdAndClassGroupId)){
+			return;
+		}
+
+		if(classStudentMapperByUserIdAndClassGroupId.getStatus().equals(ClassGroupStudentStatusEnum.QUIT)){
+			return;
+		}
+		BigDecimal amount = returnFeeDto.getAmount();
+		if(!classStudentMapperByUserIdAndClassGroupId.getStatus().equals(ClassGroupStudentStatusEnum.QUIT_SCHOOL)){
+			if(Objects.isNull(amount)){
+				return;
+			}
+//			Map<String, BigDecimal> studentSurplusCourseFee = getStudentSurplusCourseFee(vipGroupId, studentId);
+//			BigDecimal suplusCourseFee = studentSurplusCourseFee.get("suplusCourseOriginalFee");
+//			if(amount.compareTo(suplusCourseFee) > 0){
+//				throw new BizException("学员最大可退费金额为{}元", suplusCourseFee.toString());
+//			}
+		}
+		//退还活动购买
+		ActivityUserMapper activityUserMapper = activityUserMapperService.findByStudentId(vipGroup.getId(),studentId);
+		HttpResponseResult result = groupClassService.quitActivityGive(activityUserMapper, returnFeeDto.getConfirmReturnActivityGive(),vipGroup.getId(),VIP);
+
+        if(classStudentMapperByUserIdAndClassGroupId.getStatus().equals(ClassGroupStudentStatusEnum.QUIT_SCHOOL)){
+			classStudentMapperByUserIdAndClassGroupId.setStatus(ClassGroupStudentStatusEnum.QUIT);
+			classGroupStudentMapperDao.update(classStudentMapperByUserIdAndClassGroupId);
+			studentPauseInfoDao.deleteUserPauseInfoWithGroup(GroupType.VIP, vipGroupId.toString(), studentId);
+
+			classGroup.setStudentNum(classGroup.getStudentNum()-1);
+			classGroupDao.update(classGroup);
+			return ;
+        }
+
+		//记录日志
+		SysUserCashAccountLog sysUserCashAccountLog = new SysUserCashAccountLog();
+		sysUserCashAccountLog.setUserId(studentId);
+		sysUserCashAccountLog.setGroupType(VIP);
+		sysUserCashAccountLog.setOrganId(vipGroup.getOrganId());
+		sysUserCashAccountLog.setGroupId(vipGroupId.toString());
+		sysUserCashAccountLog.setAmount(amount);
+		sysUserCashAccountLog.setReturnFeeType(ReturnFeeEnum.VIP);
+		sysUserCashAccountLog.setComment("OA审批VIP退课");
+		sysUserCashAccountLogDao.insert(sysUserCashAccountLog);
+
+		classStudentMapperByUserIdAndClassGroupId.setStatus(ClassGroupStudentStatusEnum.QUIT);
+		classGroupStudentMapperDao.update(classStudentMapperByUserIdAndClassGroupId);
+
+		courseScheduleService.batchDeleteMusicGroupCourseWithStudent(vipGroupId.toString(),studentId,GroupType.VIP);
+
+        List<Integer> studentPaymentIds = courseScheduleStudentPaymentDao.findNotStartCourseStudentPaymentIdsWithClassGroupAndStudent(classGroup.getId(), studentId);
+        if(!CollectionUtils.isEmpty(studentPaymentIds)){
+            courseScheduleStudentPaymentDao.batchDeleteWithID(studentPaymentIds);
+        }
+
+        if(!vipGroup.getStatus().equals(VipGroupStatusEnum.APPLYING) || (Objects.nonNull(vipGroupCategory) && vipGroupCategory.getMusicTheory())){
+			courseScheduleTeacherSalaryService.updateVipGroupCourseTeacherSalary(vipGroupId.intValue(), vipGroup.getUserId());
+		}
+
+		classGroup.setStudentNum(classGroup.getStudentNum()-1);
+
+        classGroupDao.update(classGroup);
+
+		//学员退出班级群
+		imGroupMemberService.quit(classGroup.getId().longValue(), studentId);
+	}
+
+	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void pauseForStudent(Long vipGroupId, Integer studentId) {
 		if(Objects.isNull(vipGroupId)||Objects.isNull(studentId)){

+ 109 - 0
mec-biz/src/main/resources/config/mybatis/ActivityUserMapperAdjustLogMapper.xml

@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.ActivityUserMapperAdjustLogDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.ActivityUserMapperAdjustLog" id="ActivityUserMapperAdjustLog">
+		<result column="id_" property="id" />
+		<result column="operator_id_" property="operatorId" />
+		<result column="operator_name_" property="operatorName" />
+		<result column="activity_id_" property="activityId" />
+		<result column="course_num_" property="courseNum" />
+		<result column="give_course_num_" property="giveCourseNum" />
+		<result column="memo_" property="memo" />
+		<result column="user_id_" property="userId" />
+		<result column="type_" property="type" />
+		<result column="activity_user_mapper_id_" property="activityUserMapperId" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="ActivityUserMapperAdjustLog" >
+		SELECT * FROM activity_user_mapper_adjust_log WHERE id_ = #{id} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="ActivityUserMapperAdjustLog">
+		SELECT * FROM activity_user_mapper_adjust_log ORDER BY id_
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.ActivityUserMapperAdjustLog" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO activity_user_mapper_adjust_log (operator_id_,operator_name_,activity_id_,
+		                                             course_num_,give_course_num_,memo_,user_id_,create_time_,update_time_,type_,activity_user_mapper_id_)
+		VALUES(#{operatorId},#{operatorName},#{activityId},#{courseNum},#{giveCourseNum},#{memo},#{userId},NOW(),NOW(),#{type},#{activityUserMapperId})
+	</insert>
+	<insert id="batchInsert">
+		INSERT INTO activity_user_mapper_adjust_log (operator_id_,operator_name_,activity_id_,course_num_,
+		                                             give_course_num_,memo_,user_id_,create_time_,update_time_,type_,activity_user_mapper_id_)
+		VALUES
+		<foreach collection="logs" separator="," item="bean">
+			(#{bean.operatorId},#{bean.operatorName},#{bean.activityId},#{bean.courseNum},#{bean.giveCourseNum},#{bean.memo},#{bean.userId},NOW(),NOW(),#{bean.type},#{bean.activityUserMapperId})
+		</foreach>
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.ActivityUserMapperAdjustLog">
+		UPDATE activity_user_mapper_adjust_log <set>
+		<if test="operatorId != null">
+		operator_id_ = #{operatorId},
+		</if>
+		<if test="userId != null">
+		user_id_ = #{userId},
+		</if>
+		<if test="courseNum != null">
+		course_num_ = #{courseNum},
+		</if>
+		<if test="memo != null">
+		memo_ = #{memo},
+		</if>
+		<if test="operatorName != null">
+		operator_name_ = #{operatorName},
+		</if>
+		<if test="giveCourseNum != null">
+		give_course_num_ = #{giveCourseNum},
+		</if>
+		<if test="activityId != null">
+		activity_id_ = #{activityId},
+		</if>
+		update_time_ = NOW()
+		</set> WHERE id_ = #{id}
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM activity_user_mapper_adjust_log WHERE id_ = #{id} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="ActivityUserMapperAdjustLog" parameterType="map">
+		SELECT * FROM activity_user_mapper_adjust_log
+		<where>
+			<if test="userId != null">
+				AND user_id_ = #{userId}
+			</if>
+			<if test="activityId != null">
+				AND activity_id_ = #{activityId}
+			</if>
+		</where>
+		ORDER BY id_ DESC
+		<include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM activity_user_mapper_adjust_log
+		<where>
+			<if test="userId != null">
+				AND user_id_ = #{userId}
+			</if>
+			<if test="activityId != null">
+				AND activity_id_ = #{activityId}
+			</if>
+		</where>
+	</select>
+</mapper>

+ 80 - 5
mec-biz/src/main/resources/config/mybatis/ActivityUserMapperMapper.xml

@@ -26,6 +26,8 @@
 		<result column="give_practice_group_id_" property="givePracticeGroupId" />
 		<result column="return_fee_" property="returnFee" />
 		<result column="actual_price_" property="actualPrice" />
+		<result column="add_memo_" property="addMemo" />
+		<result column="cut_memo_" property="cutMemo" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
 	</resultMap>
@@ -45,23 +47,23 @@
 		INSERT INTO activity_user_mapper (activity_id_,user_id_,vip_flag_,give_vip_flag_,
 		                                  practice_flag_,give_practice_flag_,member_flag_,give_member_flag_,create_time_,update_time_,payment_order_id_,
 										  vip_group_id_,give_vip_group_id_,practice_group_id_,give_practice_group_id_,return_fee_,
-		                                  member_order_id_,give_member_order_id_,teacher_id_,actual_price_)
+		                                  member_order_id_,give_member_order_id_,teacher_id_,actual_price_,add_memo_,cut_memo_)
 		                                  VALUES(#{activityId},#{userId},#{vipFlag},#{giveVipFlag},#{practiceFlag},
 		                                         #{givePracticeFlag},#{memberFlag},#{giveMemberFlag},NOW(),NOW(),#{paymentOrderId},#{vipGroupId},
 		                                         #{giveVipGroupId},#{practiceGroupId},#{givePracticeGroupId},#{returnFee},
-		                                         #{memberOrderId},#{giveMemberOrderId},#{teacherId},#{actualPrice})
+		                                         #{memberOrderId},#{giveMemberOrderId},#{teacherId},#{actualPrice},#{addMemo},#{cutMemo})
 	</insert>
     <insert id="batchInsert">
 		INSERT INTO activity_user_mapper (activity_id_,user_id_,vip_flag_,give_vip_flag_,
 		practice_flag_,give_practice_flag_,member_flag_,give_member_flag_,create_time_,update_time_,payment_order_id_,
 		vip_group_id_,give_vip_group_id_,practice_group_id_,give_practice_group_id_,return_fee_,member_order_id_,
-		                                  give_member_order_id_,teacher_id_,actual_price_)
+		                                  give_member_order_id_,teacher_id_,actual_price_,add_memo_,cut_memo_)
 		VALUES
 		<foreach collection="activityUserMappers" item="item" separator=",">
 			(#{item.activityId},#{item.userId},#{item.vipFlag},#{item.giveVipFlag},#{item.practiceFlag},
 			#{item.givePracticeFlag},#{item.memberFlag},#{item.giveMemberFlag},NOW(),NOW(),#{item.paymentOrderId},#{item.vipGroupId},
 			#{item.giveVipGroupId},#{item.practiceGroupId},#{item.givePracticeGroupId},#{item.returnFee},
-			 #{item.memberOrderId},#{item.giveMemberOrderId},#{item.teacherId},#{item.actualPrice})
+			 #{item.memberOrderId},#{item.giveMemberOrderId},#{item.teacherId},#{item.actualPrice},#{item.addMemo},#{item.cutMemo})
 		</foreach>
 	</insert>
 
@@ -69,6 +71,12 @@
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.ActivityUserMapper">
 		UPDATE activity_user_mapper
 		<set>
+			<if test="cutMemo != null">
+				cut_memo_ = #{cutMemo},
+			</if>
+			<if test="addMemo != null">
+				add_memo_ = #{addMemo},
+			</if>
 			<if test="actualPrice != null">
 				actual_price_ = #{actualPrice},
 			</if>
@@ -157,13 +165,30 @@
 	
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="ActivityUserMapper" parameterType="map">
-		SELECT * FROM activity_user_mapper ORDER BY id_
+		SELECT * FROM activity_user_mapper
+		<where>
+			<if test="userId != null">
+				AND user_id_ = #{userId}
+			</if>
+			<if test="activityId != null">
+				AND activity_id_ = #{activityId}
+			</if>
+		</where>
+		ORDER BY id_ DESC
 		<include refid="global.limit"/>
 	</select>
 	
 	<!-- 查询当前表的总记录数 -->
 	<select id="queryCount" resultType="int">
 		SELECT COUNT(*) FROM activity_user_mapper
+		<where>
+			<if test="userId != null">
+				AND user_id_ = #{userId}
+			</if>
+			<if test="activityId != null">
+				AND activity_id_ = #{activityId}
+			</if>
+		</where>
 	</select>
     <select id="findByStudentIdList" resultMap="ActivityUserMapper">
 		SELECT * FROM activity_user_mapper
@@ -203,4 +228,54 @@
 		</if>
 		LIMIT 1
 	</select>
+	<select id="countActivityUserMapper" resultType="java.lang.Integer">
+		SELECT COUNT(DISTINCT aum.user_id_)
+		FROM activity_user_mapper aum
+		LEFT JOIN sys_user su ON su.id_ = aum.user_id_
+		LEFT JOIN organization o ON o.id_ = su.organ_id_
+		WHERE aum.return_fee_ = 0 AND aum.activity_id_ = #{activityId}
+		<if test="search != null and search != ''">
+			AND (aum.user_id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+		</if>
+		<if test="organId != null and organId != ''">
+			AND FIND_IN_SET(su.organ_id_,#{organId})
+		</if>
+	</select>
+	<resultMap id="ActivityStudentDto" type="com.ym.mec.biz.dal.dto.ActivityStudentDto">
+		<result property="userId" column="user_id_"/>
+		<result property="username" column="username_"/>
+		<result property="organName" column="name_"/>
+		<result property="phone" column="phone_"/>
+		<result property="freeVipNum" column="free_vip_num_"/>
+		<result property="useVipNum" column="use_vip_num_"/>
+		<result property="freeGiveVipNum" column="free_give_vip_num_"/>
+		<result property="useGiveVipNum" column="use_give_vip_num_"/>
+		<result property="freePracticeNum" column="free_practice_num_"/>
+		<result property="usePracticeNum" column="use_practice_num_"/>
+		<result property="freeGivePracticeNum" column="free_give_practice_num_"/>
+		<result property="useGivePracticeNum" column="use_give_practice_num_"/>
+	</resultMap>
+	<select id="queryActivityUserMapper" resultMap="ActivityStudentDto">
+		SELECT o.name_,aum.user_id_,su.username_,su.phone_,
+		COUNT(CASE WHEN aum.vip_flag_ = 1 THEN 1 ELSE NULL END) free_vip_num_,
+		COUNT(CASE WHEN aum.vip_flag_ = 2 THEN 1 ELSE NULL END) use_vip_num_,
+		COUNT(CASE WHEN aum.give_vip_flag_ = 1 THEN 1 ELSE NULL END) free_give_vip_num_,
+		COUNT(CASE WHEN aum.give_vip_flag_ = 2 THEN 1 ELSE NULL END) use_give_vip_num_,
+		COUNT(CASE WHEN aum.practice_flag_ = 1 THEN 1 ELSE NULL END) free_practice_num_,
+		COUNT(CASE WHEN aum.practice_flag_ = 2 THEN 1 ELSE NULL END) use_practice_num_,
+		COUNT(CASE WHEN aum.give_practice_flag_ = 1 THEN 1 ELSE NULL END) free_give_practice_num_,
+		COUNT(CASE WHEN aum.give_practice_flag_ = 2 THEN 1 ELSE NULL END) use_give_practice_num_
+		FROM activity_user_mapper aum
+		LEFT JOIN sys_user su ON su.id_ = aum.user_id_
+		LEFT JOIN organization o ON o.id_ = su.organ_id_
+		WHERE aum.return_fee_ = 0 AND aum.activity_id_ = #{activityId}
+		<if test="search != null and search != ''">
+			AND (aum.user_id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+		</if>
+		<if test="organId != null and organId != ''">
+			AND FIND_IN_SET(su.organ_id_,#{organId})
+		</if>
+		GROUP BY aum.user_id_
+		<include refid="global.limit"/>
+	</select>
 </mapper>

+ 36 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -4083,4 +4083,40 @@
             AND FIND_IN_SET(cs.type_,#{courseType})
         </if>
     </select>
+    <select id="queryHasCourseStudentIds" resultType="java.lang.Integer">
+        SELECT DISTINCT s.user_id_ FROM student s
+        LEFT JOIN course_schedule_student_payment cssp ON s.user_id_ = cssp.user_id_
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_ AND cs.group_type_ = #{groupType} AND cs.del_flag_ = 0 AND cs.pre_course_flag_ = 0
+        LEFT JOIN sys_user su ON su.id_ = s.user_id_
+        WHERE 1=1
+        <if test="hasMember != null">
+            <if test="hasMember == 1">
+                AND s.member_rank_setting_id_ IS NOT NULL
+            </if>
+            <if test="hasMember == 0">
+                AND s.member_rank_setting_id_ IS NULL
+            </if>
+        </if>
+        <if test="subjectId != null">
+            AND s.subject_id_list_ = #{subjectId}
+        </if>
+        <if test="search != null and search != ''">
+            AND (s.user_id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+        </if>
+        <if test="organId != null and organId != ''">
+            AND FIND_IN_SET(su.organ_id_,#{organId})
+        </if>
+        <if test="studentIds != null and studentIds.size > 0">
+            AND s.user_id_ IN
+            <foreach collection="studentIds" separator="," item="studentId" open="(" close=")">
+                #{studentId}
+            </foreach>
+        </if>
+        <if test="hasCourse == 1">
+            GROUP BY s.user_id_ HAVING COUNT(CASE WHEN cs.status_ = 'NOT_START' THEN 1 ELSE NULL END) > 0
+        </if>
+        <if test="hasCourse == 0">
+            GROUP BY s.user_id_ HAVING COUNT(CASE WHEN cs.status_ = 'NOT_START' THEN 1 ELSE NULL END) &lt;= 0 OR MAX(cs.id_) IS NULL
+        </if>
+    </select>
 </mapper>

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

@@ -27,6 +27,7 @@
         <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime"/>
         <result column="status_" jdbcType="TINYINT" property="status"/>
         <result column="activity_tag_" property="activityTag"/>
+        <result column="degree_type_" property="degreeType"/>
     </resultMap>
 
     <select id="get" parameterType="java.lang.Integer" resultMap="DegreeRegistration">
@@ -53,6 +54,9 @@
             <if test="status != null and status=='pay'">
                 AND status_ = 2
             </if>
+            <if test="degreeType != null">
+                AND degree_type_ = #{degreeType}
+            </if>
             <if test="id != null">
                 AND id_ = #{id}
             </if>
@@ -115,6 +119,12 @@
         <include refid="queryPageSql"/>
     </select>
 
+    <select id="countApplyNum" parameterType="map" resultType="int">
+        SELECT COUNT(DISTINCT user_id_)
+        FROM degree_registration
+        <include refid="queryPageSql"/>
+    </select>
+
     <delete id="delete" parameterType="java.lang.Integer">
         delete
         from degree_registration
@@ -127,13 +137,13 @@
         idcard_, city_, school_,
         subject_,level_, theory_level_,theory_money_, theory_cert_,mobile_,
         money_, memo_, create_time_,
-        update_time_, status_, activity_tag_)
+        update_time_, status_, activity_tag_,degree_type_)
         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}, #{activityTag})
+        #{createTime}, #{updateTime}, #{status,jdbcType=TINYINT}, #{activityTag}, #{degreeType})
     </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.DegreeRegistration">
         <!--@mbg.generated-->
@@ -142,6 +152,9 @@
             <if test="userId != null">
                 user_id_ = #{userId},
             </if>
+            <if test="degreeType != null">
+                degree_type_ = #{degreeType},
+            </if>
             <if test="organId != null">
                 organ_id_ = #{organId,jdbcType=INTEGER},
             </if>
@@ -214,6 +227,9 @@
                 <if test="degree.userId != null">
                     user_id_ = #{degree.userId},
                 </if>
+                <if test="degree.degreeType != null">
+                    degree_type_ = #{degree.degreeType},
+                </if>
                 <if test="degree.organId != null">
                     organ_id_ = #{degree.organId,jdbcType=INTEGER},
                 </if>
@@ -309,6 +325,9 @@
             <if test="degree.theoryLevel!=null">
                 AND theory_level_ = #{degree.theoryLevel}
             </if>
+            <if test="degree.degreeType != null">
+                AND degree_type_ = #{degree.degreeType}
+            </if>
     </select>
 
     <select id="getUserLevelDegrees" resultMap="DegreeRegistration">
@@ -318,5 +337,11 @@
             user_id_ = #{userId}
             AND activity_tag_=#{activityTag}
             AND (sporadic_id_ IS NOT NULL OR theory_level_ IS NOT NULL)
+            <if test="degreeType != null">
+                AND degree_type_ = #{degreeType}
+            </if>
+            <if test="sporadicId != null">
+                AND sporadic_id_ = #{sporadicId}
+            </if>
     </select>
 </mapper>

+ 35 - 0
mec-biz/src/main/resources/config/mybatis/FinancialExpenditureMapper.xml

@@ -196,6 +196,7 @@
         LEFT JOIN organization o ON o.id_ = fe.organ_id_
         LEFT JOIN cooperation_organ co ON co.id_ = fe.cooperation_organ_id_
         <include refid="queryPageSql"/>
+        ORDER BY fe.id_ DESC
         <include refid="global.limit"/>
     </select>
 
@@ -215,4 +216,38 @@
         </foreach>
         GROUP BY dingtalk_process_no_
     </select>
+    <resultMap id="PWorkOrderInfo" type="com.ym.mec.biz.dal.dto.PWorkOrderInfo">
+        <result property="id" column="id"/>
+        <result property="classify" column="classify"/>
+        <result property="isEnd" column="is_end"/>
+        <result property="isDenied" column="is_denied"/>
+        <result property="isCancel" column="is_cancel"/>
+        <result property="creator" column="mec_user_id"/>
+        <result property="process" column="process"/>
+        <result property="title" column="title"/>
+        <result property="deptId" column="dept_id"/>
+    </resultMap>
+    <select id="getWorkOrderInfo" resultMap="PWorkOrderInfo">
+        SELECT woi.*,su.mec_user_id FROM mec_dev_api.p_work_order_info woi
+        LEFT JOIN mec_dev_api.p_work_order_circulation_history woch ON woi.id = woch.work_order
+        LEFT JOIN mec_dev_api.p_process_info pi ON pi.id = woi.classify
+        LEFT JOIN mec_dev_api.sys_user su ON su.user_id = woi.creator
+        WHERE woi.is_end = 1  AND woi.is_denied = 0  AND woi.is_cancel = 0
+        AND woch.`status` != 0 AND woi.id = #{workOrderId} AND pi.fee_type = 1 LIMIT 1
+    </select>
+    <select id="getFormStructure" resultType="java.lang.String">
+        SELECT form_structure FROM mec_dev_api.p_work_order_tpl_data WHERE work_order = #{workOrderId}
+    </select>
+    <select id="getFormData" resultType="java.lang.String">
+        SELECT form_data FROM mec_dev_api.p_work_order_tpl_data WHERE work_order = #{workOrderId}
+    </select>
+    <select id="getTplInfo" resultType="java.lang.String">
+        SELECT form_structure FROM mec_dev_api.p_tpl_info WHERE id = #{tplInfoId}
+    </select>
+    <select id="findByBatchNoAndProcessNo" resultType="integer">
+        SELECT id_ FROM financial_expenditure WHERE batch_no_ = #{workOrderId} AND financial_process_no_ = #{workOrderId} LIMIT 1
+    </select>
+    <select id="getDeptId" resultType="java.lang.Integer">
+        SELECT organ_id FROM mec_dev_api.sys_dept WHERE dept_id = #{deptId}
+    </select>
 </mapper>

+ 9 - 1
mec-biz/src/main/resources/config/mybatis/LuckDrawLogMapper.xml

@@ -80,8 +80,16 @@
 		ORDER BY l.create_on_ DESC
 		<include refid="global.limit" />
 	</select>
+    <select id="countUseNumByIds" resultType="java.lang.String">
+		SELECT GROUP_CONCAT(DISTINCT ldp.name_) FROM luck_draw_log ldl
+		LEFT JOIN luck_draw_prize ldp ON ldl.prize_id_ = ldp.id_
+		WHERE ldl.prize_id_ IN
+		<foreach collection="prizeIds" open="(" close=")" item="id" separator=",">
+			#{id}
+		</foreach>
+	</select>
 
-	<sql id="queryCondition">
+    <sql id="queryCondition">
 		<where>
 			<if test="prizeId != null">
 				AND l.prize_id_ = #{id}

+ 45 - 0
mec-biz/src/main/resources/config/mybatis/LuckDrawPrizeMapper.xml

@@ -21,6 +21,9 @@
 
 	<sql id="queryCondition">
 		<where>
+			<if test="enabled != null">
+				and enabled_ = #{enabled}
+			</if>
 			<if test="id != null">
 				and id_ = #{id}
 			</if>
@@ -54,6 +57,12 @@
 		delete from luck_draw_prize
 		where id_ = #{id,jdbcType=INTEGER}
 	</delete>
+	<delete id="deleteByIds">
+		DELETE FROM luck_draw_prize WHERE id_ IN
+		<foreach collection="prizeIds" open="(" close=")" item="id" separator=",">
+			#{id}
+		</foreach>
+	</delete>
 
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.LuckDrawPrize" useGeneratedKeys="true" keyColumn="id"
             keyProperty="id">
@@ -115,6 +124,39 @@
 		</set>
 		where id_ = #{id,jdbcType=INTEGER}
 	</update>
+	<update id="batchUpdate">
+		<foreach collection="updateDraw" item="draw" separator=";">
+			UPDATE luck_draw_prize
+			<set>
+				<if test="draw.name != null">
+					name_ = #{draw.name,jdbcType=VARCHAR},
+				</if>
+				<if test="draw.chances != null">
+					chances_ = #{draw.chances,jdbcType=DOUBLE},
+				</if>
+				<if test="draw.stock != null">
+					stock_ = #{draw.stock,jdbcType=INTEGER},
+				</if>
+				<if test="draw.enabled != null">
+					enabled_ = #{draw.enabled,jdbcType=BIT},
+				</if>
+				<if test="draw.rewardType != null">
+					reward_type_ = #{draw.rewardType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+				</if>
+				<if test="draw.memo != null">
+					memo_ = #{draw.memo,jdbcType=VARCHAR},
+				</if>
+				<if test="draw.groupId != null">
+					group_id_ = #{draw.groupId,jdbcType=INTEGER},
+				</if>
+				<if test="draw.isDefault != null">
+					is_default_ = #{draw.isDefault},
+				</if>
+				modify_on_ = NOW()
+			</set>
+			WHERE id_ = #{draw.id,jdbcType=INTEGER}
+		</foreach>
+	</update>
 
 	<select id="queryCount" parameterType="map" resultType="int">
 		select count(*) from luck_draw_prize
@@ -147,4 +189,7 @@
 		LEFT JOIN luck_draw_prize ldp ON ldp.id_ = ldl.prize_id_
 		WHERE ldl.group_id_ = #{groupId} AND ldl.prize_id_ != 8
 	</select>
+	<select id="findByGroupId" resultMap="BaseResultMap">
+		SELECT * FROM luck_draw_prize WHERE group_id_ = #{groupId}
+	</select>
 </mapper>

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

@@ -245,7 +245,7 @@
                  LEFT JOIN sys_user su ON pg.user_id_ = su.id_
                  LEFT JOIN `subject` s ON pg.subject_id_ = s.id_
         WHERE student_id_ = #{userId}
-          AND (pg.group_status_ = 'NORMAL' OR pg.group_status_ = 'LOCK')
+          AND (pg.group_status_ = 'LOCK')
           <if test="type!=null">
               AND pg.type_=#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
           </if>

+ 24 - 1
mec-biz/src/main/resources/config/mybatis/QuestionnaireUserResultMapper.xml

@@ -106,14 +106,36 @@
 	</delete>
 
     <!-- 分页查询 -->
+	<select id="findResultCount" resultMap="QuestionnaireUserResultDto" parameterType="map">
+		SELECT qu1.*,qq.content_,GROUP_CONCAT(qqi.answer_value_ ORDER BY qqi.sort_) answer_value_,qq.type_
+		FROM (SELECT qu.user_id_ id_ FROM questionnaire_user_result qu
+		WHERE qu.questionnaire_topic_id_ = #{topicId}
+		<if test="search != null and search != ''">
+			AND (qu.user_id_ = #{search} OR qu.additional_value_ LIKE CONCAT('%',#{search},'%'))
+		</if>
+		GROUP BY qu.user_id_ <include refid="global.limit"/>) qur
+		LEFT JOIN questionnaire_user_result qu1 ON qur.id_ = qu1.user_id_
+		LEFT JOIN questionnaire_question qq ON qq.id_ = qu1.questionnaire_question_id_
+		LEFT JOIN questionnaire_question_item qqi ON FIND_IN_SET(qqi.id_,qu1.questionnaire_question_item_id_list_)
+		WHERE qu1.questionnaire_topic_id_ = #{topicId}
+		GROUP BY qu1.user_id_,qq.id_
+		ORDER BY qu1.user_id_,qq.sort_
+	</select>
+	<!-- 查询当前表的总记录数 -->
+	<select id="countResultCount" resultType="int">
+		SELECT COUNT(DISTINCT qu.user_id_) FROM questionnaire_user_result qu WHERE qu.questionnaire_topic_id_ = #{topicId}
+	</select>
+
+	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="QuestionnaireUserResult" parameterType="map">
 		SELECT * FROM questionnaire_user_result ORDER BY id_ <include refid="global.limit"/>
 	</select>
-	
+
 	<!-- 查询当前表的总记录数 -->
 	<select id="queryCount" resultType="int">
 		SELECT COUNT(*) FROM questionnaire_user_result
 	</select>
+
     <select id="countByTopicId" resultType="java.lang.Integer">
 		SELECT COUNT(id_) FROM questionnaire_user_result WHERE questionnaire_topic_id_ = #{topicId}
 	</select>
@@ -137,6 +159,7 @@
 			<result column="questionnaire_question_id_" property="questionnaireQuestionId" />
 			<result column="questionnaire_question_item_id_list_" property="questionnaireQuestionItemIdList" />
 			<result column="additional_value_" property="additionalValue" />
+			<result column="type_" property="type" />
 		</collection>
 	</resultMap>
 	<sql id="queryDetailPageSql">

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

@@ -9,6 +9,7 @@
     <resultMap type="com.ym.mec.biz.dal.entity.Student" id="Student">
         <result column="user_id_" property="userId"/>
         <result column="subject_id_list_" property="subjectIdList"/>
+        <result column="subject_name_" property="subjectNames"/>
         <result column="service_tag_" property="serviceTag"/>
         <result column="operating_tag_" property="operatingTag"/>
         <result column="operating_temp_tag_" property="operatingTempTag"/>
@@ -1375,4 +1376,51 @@
         AND sr.music_group_status_ = 'NORMAL' AND mg.course_view_type_ != 2 AND mg.`status_` = 'PROGRESS'
         GROUP BY sr.user_id_)t)
     </update>
+
+    <select id="queryStudent" resultMap="Student">
+        SELECT s.*,su.username_,su.phone_,o.name_ organ_name_,sb.name_ subject_name_ FROM student s
+        LEFT JOIN sys_user su ON su.id_ = s.user_id_
+        LEFT JOIN organization o ON o.id_ = su.organ_id_
+        LEFT JOIN subject sb ON sb.id_ = s.subject_id_list_
+        <where>
+            <if test="studentIds != null and studentIds.size > 0">
+                AND s.user_id_ IN
+                <foreach collection="studentIds" separator="," item="studentId" open="(" close=")">
+                    #{studentId}
+                </foreach>
+            </if>
+            <if test="subjectId != null">
+                AND s.subject_id_list_ = #{subjectId}
+            </if>
+            <if test="search != null and search != ''">
+                AND (s.user_id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+            </if>
+            <if test="organId != null and organId != ''">
+                AND FIND_IN_SET(su.organ_id_,#{organId})
+            </if>
+        </where>
+        ORDER BY user_id_
+        <include refid="global.limit"></include>
+    </select>
+    <select id="countStudent" resultType="int">
+        SELECT count(s.user_id_) FROM student s
+        LEFT JOIN sys_user su ON su.id_ = s.user_id_
+        <where>
+            <if test="studentIds != null and studentIds.size > 0">
+                AND s.user_id_ IN
+                <foreach collection="studentIds" separator="," item="studentId" open="(" close=")">
+                    #{studentId}
+                </foreach>
+            </if>
+            <if test="subjectId != null">
+                AND s.subject_id_list_ = #{subjectId}
+            </if>
+            <if test="search != null and search != ''">
+                AND (s.user_id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+            </if>
+            <if test="organId != null and organId != ''">
+                AND FIND_IN_SET(su.organ_id_,#{organId})
+            </if>
+        </where>
+    </select>
 </mapper>

+ 13 - 10
mec-biz/src/main/resources/config/mybatis/SysMusicScoreAccompanimentMapper.xml

@@ -12,7 +12,7 @@
 		<result column="subject_id_" property="subjectId" />
 		<result column="subject_name_" property="subjectName" />
 		<result column="mp3_url_" property="mp3Url" />
-		<result column="metronome_url_" property="metronomeUrl" />
+		<result column="metronome_mp3_url_" property="metronomeMp3Url" />
 		<result column="xml_url_" property="xmlUrl" />
 		<result column="name_" property="examSongName" />
 		<result column="categories_name_" property="categoriesName" />
@@ -20,6 +20,7 @@
 		<result column="parent_categories_id_" property="parentCategoriesId" />
 		<result column="type_" property="type" />
 		<result column="url_" property="url" />
+		<result column="metronome_url_" property="metronomeUrl" />
 		<result column="del_flag_" property="delFlag" />
 		<result column="speed_" property="speed" />
 		<result column="create_time_" property="createTime" />
@@ -28,6 +29,8 @@
 		<result column="is_open_metronome_" property="isOpenMetronome" />
 		<result column="memo_" property="memo" />
 		<result column="rank_ids_" property="rankIds" />
+		<result column="render_from_" property="renderFrom" />
+		<result column="enable_evaluation_" property="enableEvaluation" />
 		<result column="client_type_" property="clientType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 	</resultMap>
 
@@ -37,7 +40,7 @@
 
 	<!-- 根据主键查询一条记录 -->
 	<select id="get" resultMap="SysMusicScoreAccompaniment" >
-		SELECT sesa.*,ses.name_,ses.type_,ses.url_,sesc.name_ categories_name_,sesc.id_ categories_id_,ses.client_type_
+		SELECT sesa.*,ses.name_,ses.type_,ses.url_,sesc.name_ categories_name_,sesc.id_ categories_id_,ses.client_type_,ses.metronome_url_
 		FROM sys_music_score ses
 		LEFT JOIN sys_music_score_accompaniment sesa ON ses.id_ = sesa.exam_song_id_
 		LEFT JOIN sys_music_score_categories sesc ON sesc.id_ = ses.music_score_categories_id_
@@ -51,15 +54,15 @@
 	
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysMusicScoreAccompaniment" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO sys_music_score_accompaniment (exam_song_id_,subject_id_,mp3_url_,metronome_url_,speed_,xml_url_,create_time_,update_time_,is_open_metronome_)
-		VALUES(#{examSongId},#{subjectId},#{mp3Url},#{metronomeUrl},#{speed},#{xmlUrl},NOW(),NOW(),#{isOpenMetronome})
+		INSERT INTO sys_music_score_accompaniment (exam_song_id_,subject_id_,mp3_url_,metronome_mp3_url_,speed_,xml_url_,create_time_,update_time_,is_open_metronome_)
+		VALUES(#{examSongId},#{subjectId},#{mp3Url},#{metronomeMp3Url},#{speed},#{xmlUrl},NOW(),NOW(),#{isOpenMetronome})
 	</insert>
     <insert id="batchInsert">
-		INSERT INTO sys_music_score_accompaniment (exam_song_id_,subject_id_,mp3_url_,speed_,xml_url_,
+		INSERT INTO sys_music_score_accompaniment (exam_song_id_,subject_id_,mp3_url_,metronome_mp3_url_,speed_,xml_url_,
 		                                           create_time_,update_time_,is_show_fingering_,memo_,is_open_metronome_)
 		VALUES
 		<foreach collection="sysMusicScoreAccompaniments" item="item"  separator=",">
-			(#{sysMusicScoreId},#{item.subjectId},#{item.mp3Url},#{item.speed},
+			(#{sysMusicScoreId},#{item.subjectId},#{item.mp3Url},#{item.metronomeMp3Url},#{item.speed},
 			 #{item.xmlUrl},NOW(),NOW(),#{item.isShowFingering},#{item.memo},#{isOpenMetronome})
 		</foreach>
 	</insert>
@@ -84,7 +87,7 @@
 			exam_song_id_ = #{examSongId},
 		</if>
 			subject_id_ = #{subjectId},xml_url_ = #{xmlUrl},
-			mp3_url_ = #{mp3Url},metronome_url_ = #{metronomeUrl}, update_time_ = NOW()
+			mp3_url_ = #{mp3Url},metronome_mp3_url_ = #{metronomeMp3Url}, update_time_ = NOW()
 	</set>WHERE id_ = #{id}
 	</update>
 	<update id="batchDel">
@@ -112,7 +115,7 @@
 				<if test="item.examSongId != null">
 					exam_song_id_ = #{item.examSongId},
 				</if>
-				subject_id_ = #{item.subjectId},xml_url_ = #{item.xmlUrl},metronome_url_ = #{item.metronomeUrl},
+				subject_id_ = #{item.subjectId},xml_url_ = #{item.xmlUrl},metronome_mp3_url_ = #{item.metronomeMp3Url},
 				mp3_url_ = #{item.mp3Url}, update_time_ = NOW()
 			</set> WHERE id_ = #{item.id}
 		</foreach>
@@ -125,7 +128,7 @@
 	
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="SysMusicScoreAccompaniment" parameterType="map">
-		SELECT sesa.*,ses.name_,ses.type_,ses.url_,s.name_ subject_name_,sesc.name_ categories_name_,sesc.id_ categories_id_,sesc.parent_id_ parent_categories_id_,ses.client_type_,ses.rank_ids_
+		SELECT sesa.*,ses.name_,ses.type_,ses.url_,s.name_ subject_name_,sesc.name_ categories_name_,sesc.id_ categories_id_,sesc.parent_id_ parent_categories_id_,ses.client_type_,ses.rank_ids_,ses.render_from_,ses.enable_evaluation_,ses.metronome_url_
 		FROM sys_music_score ses
 		LEFT JOIN sys_music_score_accompaniment sesa ON ses.id_ = sesa.exam_song_id_
 		LEFT JOIN sys_music_score_categories sesc ON sesc.id_ = ses.music_score_categories_id_
@@ -160,7 +163,7 @@
 		</where>
 	</select>
 	<select id="queryAccPage" resultMap="SysMusicScoreAccompaniment">
-		SELECT sesa.*,ses.name_,ses.type_,ses.url_,s.name_ subject_name_,sesc.name_ categories_name_,sesc.id_ categories_id_,sesc.parent_id_ parent_categories_id_,ses.client_type_
+		SELECT sesa.*,ses.name_,ses.type_,ses.url_,s.name_ subject_name_,sesc.name_ categories_name_,sesc.id_ categories_id_,sesc.parent_id_ parent_categories_id_,ses.client_type_,ses.enable_evaluation_,ses.metronome_url_
 		FROM sys_music_score ses
 		LEFT JOIN sys_music_score_accompaniment sesa ON ses.id_ = sesa.exam_song_id_
 		LEFT JOIN sys_music_score_categories sesc ON sesc.id_ = ses.music_score_categories_id_

+ 21 - 5
mec-biz/src/main/resources/config/mybatis/SysMusicScoreCategoriesMapper.xml

@@ -17,6 +17,7 @@
 		<result column="order_" property="order" />
 		<result column="organ_name_" property="organNames" />
 		<result column="music_score_num_" property="musicScoreNum" />
+		<result column="sound_resource_" property="soundResource" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
 	</resultMap>
@@ -33,14 +34,14 @@
 	
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysMusicScoreCategories" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO sys_music_score_categories (parent_id_,name_,cover_img_,operator_id_,create_time_,update_time_,organ_id_,order_)
-		VALUES(#{parentId},#{name},#{coverImg},#{operatorId},NOW(),NOW(),#{organId},#{order})
+		INSERT INTO sys_music_score_categories (parent_id_,name_,cover_img_,operator_id_,create_time_,update_time_,organ_id_,order_,sound_resource_)
+		VALUES(#{parentId},#{name},#{coverImg},#{operatorId},NOW(),NOW(),#{organId},#{order},#{soundResource})
 	</insert>
 	<insert id="batchInsert">
-		INSERT INTO sys_music_score_categories (parent_id_,name_,cover_img_,operator_id_,create_time_,update_time_,organ_id_,enable_,order_)
+		INSERT INTO sys_music_score_categories (parent_id_,name_,cover_img_,operator_id_,create_time_,update_time_,organ_id_,enable_,order_,sound_resource_)
 		VALUES
 		<foreach collection="categoriesList" item="bean" separator=",">
-			(#{bean.parentId},#{bean.name},#{bean.coverImg},#{bean.operatorId},NOW(),NOW(),#{organId},#{enable},#{bean.order})
+			(#{bean.parentId},#{bean.name},#{bean.coverImg},#{bean.operatorId},NOW(),NOW(),#{organId},#{enable},#{bean.order},#{bean.soundResource})
 		</foreach>
 	</insert>
 
@@ -71,6 +72,9 @@
 			<if test="name != null">
 				name_ = #{name},
 			</if>
+			<if test="soundResource != null">
+				sound_resource_ = #{soundResource},
+			</if>
 				update_time_ = NOW()
 	</set> WHERE id_ = #{id}
 	</update>
@@ -95,6 +99,9 @@
 			<if test="bean.name != null">
 				name_ = #{bean.name},
 			</if>
+			<if test="bean.soundResource != null">
+				sound_resource_ = #{bean.soundResource},
+			</if>
 			update_time_ = NOW()
 		</set> WHERE id_ = #{bean.id}
 		</foreach>
@@ -161,7 +168,16 @@
 		SELECT GROUP_CONCAT(id_) FROM sys_music_score_categories
 		WHERE FIND_IN_SET(id_,#{categoriesIds}) OR FIND_IN_SET(parent_id_,#{categoriesIds})
 	</select>
-	<sql id="queryTree">
+    <select id="queryOrganByIds" resultType="java.util.Map">
+		SELECT sms.id_ 'key',GROUP_CONCAT(DISTINCT o.name_) 'value' FROM sys_music_score_categories sms
+		LEFT JOIN organization o ON FIND_IN_SET(o.id_,sms.organ_id_)
+		WHERE sms.id_ IN
+		<foreach collection="categoriesIds" item="id" open="(" close=")" separator=",">
+			#{id}
+		</foreach>
+		GROUP BY sms.id_
+	</select>
+    <sql id="queryTree">
 		<where>
 			<if test="enable != null">
 				AND sm.enable_ = #{enable}

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

@@ -26,6 +26,9 @@
 		<result column="show_flag_" property="showFlag" />
 		<result column="order_" property="order" />
 		<result column="rank_ids_" property="rankIds" />
+		<result column="render_from_" property="renderFrom" />
+		<result column="enable_evaluation_" property="enableEvaluation" />
+		<result column="subject_id_" property="subjectId" />
 		<result column="client_type_" property="clientType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="update_time_" property="updateTime" />
 		<result column="create_time_" property="createTime" />
@@ -44,9 +47,10 @@
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysMusicScore" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO sys_music_score (music_score_categories_id_,name_,type_,speed_,url_,metronome_url_,create_user_id_,order_,
-		                             update_time_,create_time_,client_type_,rank_ids_,show_flag_)
+		                             update_time_,create_time_,client_type_,rank_ids_,render_from_,enable_evaluation_,show_flag_)
 		VALUES(#{musicScoreCategoriesId},#{name},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-		       #{speed},#{url},#{metronomeUrl},#{createUserId},#{order},NOW(),NOW(),#{clientType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{rankIds},#{showFlag})
+		       #{speed},#{url},#{metronomeUrl},#{createUserId},#{order},NOW(),NOW(),#{clientType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+		       #{rankIds},#{renderFrom},#{enableEvaluation},#{showFlag})
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
@@ -59,6 +63,12 @@
 			client_type_ = #{clientType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
 		</if>
 			rank_ids_ = #{rankIds},
+		<if test="renderFrom != null">
+			render_from_ = #{renderFrom},
+		</if>
+		<if test="enableEvaluation != null">
+			enable_evaluation_ = #{enableEvaluation},
+		</if>
 		<if test="order != null">
 			order_ = #{order},
 		</if>
@@ -98,14 +108,14 @@
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="SysMusicScore" parameterType="map">
 		SELECT ses.*,su.real_name_ create_user_name_,smsc.name_ categories_name_,smsc.id_ categories_id_,
-		smsa.mp3_url_ accompaniment_url_,smsa.metronome_url_ accompaniment_metronome_url_,smsa.is_open_metronome_
+		smsa.mp3_url_ accompaniment_url_,smsa.metronome_mp3_url_ accompaniment_metronome_url_,smsa.is_open_metronome_,smsa.subject_id_
 		FROM sys_music_score ses
 		LEFT JOIN sys_music_score_accompaniment smsa ON smsa.exam_song_id_ = ses.id_
 		LEFT JOIN sys_user su ON ses.create_user_id_ = su.id_
 		LEFT JOIN sys_music_score_categories smsc ON smsc.id_ = ses.music_score_categories_id_
 		<include refid="queryPageSql"/>
 		GROUP BY ses.id_
-		ORDER BY ses.music_score_categories_id_ desc,ses.order_ asc,ses.create_time_ desc
+		ORDER BY ses.music_score_categories_id_ DESC,ses.order_ ASC,ses.create_time_ DESC
 		<include refid="global.limit"/>
 	</select>
 	
@@ -113,6 +123,7 @@
 	<select id="queryCount" resultType="int">
 		SELECT COUNT(DISTINCT ses.id_) FROM sys_music_score ses
 		LEFT JOIN sys_music_score_categories smsc ON smsc.id_ = ses.music_score_categories_id_
+		LEFT JOIN sys_music_score_accompaniment smsa ON smsa.exam_song_id_ = ses.id_
 		<include refid="queryPageSql"/>
 	</select>
     <select id="findByIds" resultMap="SysMusicScore">
@@ -136,6 +147,9 @@
 			<if test="showFlag != null">
 				AND ses.show_flag_ = #{showFlag}
 			</if>
+			<if test="subjectId != null">
+				AND smsa.subject_id_ = #{subjectId}
+			</if>
 			<if test="clientType != null">
 				AND ses.client_type_ = #{clientType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
 			</if>

+ 22 - 0
mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -608,6 +608,28 @@
             GROUP BY su.id_
     </select>
 
+    <select id="findTeaTeachersByOrganAndSubject4" resultMap="ExtendTeacherBasicDto">
+        SELECT
+            su.id_,
+            su.username_,
+            su.real_name_,
+            su.avatar_,
+            t.introduction_,
+            t.organ_id_,
+            t.is_support_extra_practice_lesson_,
+            GROUP_CONCAT(s.name_) subject_names_
+        FROM
+            teacher t
+            LEFT JOIN sys_user su ON t.id_ = su.id_
+            LEFT JOIN subject s ON FIND_IN_SET(s.id_,t.subject_id_)
+        WHERE
+            FIND_IN_SET(#{subjectId},t.subject_id_)
+            AND FIND_IN_SET(t.organ_id_,#{organIdList})
+            AND su.del_flag_=0 AND su.lock_flag_=0
+            AND t.is_support_extra_practice_lesson_=1
+            GROUP BY su.id_
+    </select>
+
     <select id="findTeacherByOrganAndSubject" resultMap="TeacherBasicDto">
         SELECT
             su.id_,

+ 10 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/UploadReturnBean.java

@@ -20,6 +20,16 @@ public class UploadReturnBean {
 
 	private String message;// 上传失败 返回原因
 
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
 	public String getUrl() {
 		return url;
 	}

+ 75 - 46
mec-student/src/main/java/com/ym/mec/student/controller/DegreeController.java

@@ -1,36 +1,52 @@
 package com.ym.mec.student.controller;
 
 
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
 import com.alibaba.fastjson.JSON;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dao.DegreeRegistrationDao;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dao.SporadicChargeInfoDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dto.DegreeRegistrationActivityDto;
-import com.ym.mec.biz.dal.dto.SporadicPayDto;
-import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.DegreeRegistration;
+import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
+import com.ym.mec.biz.dal.entity.SysConfig;
 import com.ym.mec.biz.dal.enums.OrderTypeEnum;
 import com.ym.mec.biz.dal.enums.SporadicChargeTypeEnum;
 import com.ym.mec.biz.dal.page.SporadicChargeInfoQueryInfo;
 import com.ym.mec.biz.service.DegreeRegistrationService;
 import com.ym.mec.biz.service.SporadicChargeInfoService;
-import com.ym.mec.biz.service.StudentPaymentOrderService;
 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.util.idcard.IdcardValidator;
-import com.ym.mec.util.validator.CommonValidator;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.transaction.annotation.Isolation;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.*;
 
 @RequestMapping("degree")
 @Api(tags = "考级报名服务")
@@ -54,10 +70,16 @@ public class DegreeController extends BaseController {
 
     @Autowired
     private StudentDao studentDao;
+    
+    @Autowired
+    private SysConfigDao sysConfigDao;
 
     @Autowired
     private OrganizationDao organizationDao;
 
+	@Value("${message.debugMode: false}")
+	private boolean debugMode;
+
     @Autowired
     private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
 
@@ -69,25 +91,26 @@ public class DegreeController extends BaseController {
             return failed(HttpStatus.FORBIDDEN,"请登录");
         }
         degreeRegistration.setUserId(user.getId());
-
-        if(Objects.nonNull(degreeRegistration.getSporadicId())&&Objects.nonNull(degreeRegistration.getTheoryLevel())){
-            IdcardValidator idcardValidator = new IdcardValidator();
-            if (!idcardValidator.isValidatedAllIdcard(degreeRegistration.getIdcard())) {
-                throw new BizException("身份证号不正确,请核对");
-            }
-            SporadicChargeInfo info = sporadicChargeInfoDao.get(degreeRegistration.getSporadicId());
-            if (info == null || info.getDelFlag().equals(1)) {
-                return failed("报名信息不存在");
-            }
-            if (info.getOrganId() != 42 || !info.getChargeType().equals(SporadicChargeTypeEnum.LEVEL)) {
-                return failed("报名信息不存在");
-            }
-        }else{
-            degreeRegistration.setOrganId(user.getOrganId());
+        
+        if(degreeRegistration.getSporadicId() == null){
+        	return failed("请从正确入口进行报名");
+        }
+        
+        IdcardValidator idcardValidator = new IdcardValidator();
+        if (!debugMode && !idcardValidator.isValidatedAllIdcard(degreeRegistration.getIdcard())) {
+            throw new BizException("身份证号不正确,请核对");
+        }
+        SporadicChargeInfo info = sporadicChargeInfoDao.get(degreeRegistration.getSporadicId());
+        if (info == null || info.getDelFlag().equals(1)) {
+            return failed("报名信息不存在");
         }
+        if (info.getOrganId() != 42 || !info.getChargeType().equals(SporadicChargeTypeEnum.LEVEL)) {
+            return failed("报名信息不存在");
+        }
+        degreeRegistration.setOrganId(user.getOrganId());
 
-        if(Objects.isNull(degreeRegistration.getOrganId()) || degreeRegistration.getOrganId() != 40){
-            return failed("该分部暂未参与此活动");
+        if(Objects.isNull(degreeRegistration.getOrganId()) || degreeRegistration.getOrganId() == 4){
+            return failed("该分部暂未开放此活动");
         }
 
         return degreeRegistrationService.pay(degreeRegistration);
@@ -111,8 +134,8 @@ public class DegreeController extends BaseController {
             degreeRegistration.setOrganId(user.getOrganId());
         }
 
-        if(Objects.isNull(degreeRegistration.getOrganId()) || degreeRegistration.getOrganId() != 40){
-            return failed("该分部暂未参与此活动");
+        if(Objects.isNull(degreeRegistration.getOrganId()) || degreeRegistration.getOrganId() == 4){
+            return failed("该分部暂未开放此活动");
         }
 
         return degreeRegistrationService.theoryPay(degreeRegistration);
@@ -129,11 +152,12 @@ public class DegreeController extends BaseController {
         degreeRegistration.setUserId(user.getId());
         degreeRegistration.setActivityTag(DegreeRegistrationService.ACTIVITY_TAG);
         studentDao.getLocked(degreeRegistration.getUserId());
-        List<DegreeRegistration> userLevelDegrees = degreeRegistrationDao.getUserLevelDegrees(degreeRegistration.getUserId(), DegreeRegistrationService.ACTIVITY_TAG);
+        List<DegreeRegistration> userLevelDegrees = degreeRegistrationDao.getUserLevelDegrees(degreeRegistration.getUserId(),
+                DegreeRegistrationService.ACTIVITY_TAG,degreeRegistration.getDegreeType(),degreeRegistration.getSporadicId());
         long levelNum = userLevelDegrees.stream().filter(d -> Objects.nonNull(d.getSporadicId())&&d.getStatus().equals(2)).count();
         long theoryLevelNum = userLevelDegrees.stream().filter(d -> StringUtils.isNotBlank(d.getTheoryLevel())&&d.getStatus().equals(2)).count();
 
-        if(Objects.nonNull(degreeRegistration.getSporadicId())&&levelNum>0){
+        if(Objects.nonNull(degreeRegistration.getSporadicId()) && levelNum > 0){
             return failed(HttpStatus.CREATED, "您已报考过选择的考级项目");
         }
         if(StringUtils.isNotBlank(degreeRegistration.getTheoryLevel())&&theoryLevelNum>0){
@@ -172,18 +196,23 @@ public class DegreeController extends BaseController {
 
         Map<String, Object> result = new HashMap<>();
 
-        Student student = studentDao.get(user.getId());
+//        Student student = studentDao.get(user.getId());
         result.put("userInfo", user);
-        result.put("isNewUser", student.getIsNewUser());
-        result.put("organs", organizationDao.getActivityOrgans());
+        //result.put("isNewUser", student.getIsNewUser());
+        
+        SysConfig organConfig = sysConfigDao.findByParamName("degree_support_organ_list");
+        if(StringUtils.isNotEmpty(organConfig.getParanValue())){
+            List<Integer> userIds = Arrays.stream(organConfig.getParanValue().split(",")).mapToInt(Integer::valueOf).boxed().collect(Collectors.toList());
+            result.put("organs", organizationDao.findOrgans(userIds));
+        }
         result.put("sporadicChargeInfo", sporadicChargeInfoService.queryDetailPage(queryInfo));
 
-        List<DegreeRegistration> userLevelDegrees = degreeRegistrationDao.getUserLevelDegrees(user.getId(), DegreeRegistrationService.ACTIVITY_TAG);
-        long levelNum = userLevelDegrees.stream().filter(d -> Objects.nonNull(d.getSporadicId())&&d.getStatus().equals(2)).count();
-        long theoryLevelNum = userLevelDegrees.stream().filter(d -> StringUtils.isNotBlank(d.getTheoryLevel())&&d.getStatus().equals(2)).count();
+//        List<DegreeRegistration> userLevelDegrees = degreeRegistrationDao.getUserLevelDegrees(user.getId(), DegreeRegistrationService.ACTIVITY_TAG,2);
+//        long levelNum = userLevelDegrees.stream().filter(d -> Objects.nonNull(d.getSporadicId())&&d.getStatus().equals(2)).count();
+//        long theoryLevelNum = userLevelDegrees.stream().filter(d -> StringUtils.isNotBlank(d.getTheoryLevel())&&d.getStatus().equals(2)).count();
 
-        result.put("levelApplied", levelNum>0?1:0);
-        result.put("theoryLevelApplied", theoryLevelNum>0?1:0);
+//        result.put("levelApplied", levelNum>0?1:0);
+//        result.put("theoryLevelApplied", theoryLevelNum>0?1:0);
 
         List<StudentPaymentOrderDetail> historyOrderDetails = studentPaymentOrderDetailDao.getWithUserAndOrderType(user.getId(), OrderTypeEnum.DEGREE_REGISTRATION);
         int historyVipNum = 0, historyPracticeNum = 0, historyHighNum = 0;

+ 4 - 4
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java

@@ -251,9 +251,9 @@ public class MusicGroupController extends BaseController {
                     PayStatus payStatus = studentPaymentOrderService.queryPayStatus(order.getPaymentChannel(), order.getOrderNo(), order.getTransNo());
                     if(payStatus == PayStatus.SUCCESSED){
                         throw new BizException("订单已支付成功,请勿重复支付");
-                    }else if(payStatus == PayStatus.PAYING){
+                    }/*else if(payStatus == PayStatus.PAYING){
                         throw new BizException("订单还在交易中,请稍后重试");
-                    }
+                    }*/
                     return failed(HttpStatus.CONTINUE, "您有待支付的订单");
                 }
             }
@@ -354,9 +354,9 @@ public class MusicGroupController extends BaseController {
             PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
             if(payStatus == PayStatus.SUCCESSED){
         		throw new BizException("订单已支付成功,请勿重复支付");
-        	}else if(payStatus == PayStatus.PAYING){
+        	}/*else if(payStatus == PayStatus.PAYING){
         		throw new BizException("订单还在交易中,请稍后重试");
-        	}
+        	}*/
             return failed(HttpStatus.CONTINUE, "您有待支付的订单");
         }
         Map payMap = musicGroupService.pay(registerPayDto);

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

@@ -23,8 +23,10 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
 import com.yonge.log.model.AuditLogAnnotation;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.util.CollectionUtils;
@@ -262,9 +264,9 @@ public class PracticeGroupController extends BaseController {
         }
         practiceGroupBuyParams.setStudentId(sysUser.getId());
         if(Objects.isNull(practiceGroupBuyParams.getType())||PracticeGroupType.CHARGE.equals(practiceGroupBuyParams.getType())){
-            return practiceGroupService.buyPracticeGroup(practiceGroupBuyParams);
+            return practiceGroupService.buyPracticeGroup(practiceGroupBuyParams, null);
         }else{
-            return practiceGroupService.createPackagePracticeGroup(practiceGroupBuyParams);
+            return practiceGroupService.createPackagePracticeGroup(practiceGroupBuyParams, null);
         }
     }
 
@@ -423,7 +425,7 @@ public class PracticeGroupController extends BaseController {
     @ApiOperation("取消待支付的订单")
     @PostMapping(value = "/cancelWaitPayOrder")
     @AuditLogAnnotation(operateName = "取消待支付的订单")
-    public HttpResponseResult cancelWaitPayOrder(Integer groupId){
+    public HttpResponseResult cancelWaitPayOrder(Integer groupId) throws Exception{
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");

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

@@ -66,9 +66,9 @@ public class RepairController extends BaseController {
                 PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
                 if(payStatus == PayStatus.SUCCESSED){
             		throw new BizException("订单已支付成功,请勿重复支付");
-            	}else if(payStatus == PayStatus.PAYING){
+            	}/*else if(payStatus == PayStatus.PAYING){
             		throw new BizException("订单还在交易中,请稍后重试");
-            	}
+            	}*/
                 return failed(HttpStatus.CONTINUE, "您有待支付的订单");
             }
         }

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

@@ -174,9 +174,9 @@ public class ReplacementInstrumentActivityController extends BaseController {
             PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
             if(payStatus == PayStatus.SUCCESSED){
         		throw new BizException("订单已支付成功,请勿重复支付");
-        	}else if(payStatus == PayStatus.PAYING){
+        	}/*else if(payStatus == PayStatus.PAYING){
         		throw new BizException("订单还在交易中,请稍后重试");
-        	}
+        	}*/
             return failed(HttpStatus.CONTINUE, "您有待支付的订单");
         }
         Map payMap = replacementInstrumentActivityService.pay(replacementPayDto);

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

@@ -77,9 +77,9 @@ public class SporadicChargeInfoController extends BaseController {
                 PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
                 if(payStatus == PayStatus.SUCCESSED){
             		throw new BizException("订单已支付成功,请勿重复支付");
-            	}else if(payStatus == PayStatus.PAYING){
+            	}/*else if(payStatus == PayStatus.PAYING){
             		throw new BizException("订单还在交易中,请稍后重试");
-            	}
+            	}*/
                 
                 return failed(HttpStatus.CONTINUE, "您有待支付的订单");
             }

+ 36 - 0
mec-student/src/main/java/com/ym/mec/student/controller/StudentController.java

@@ -0,0 +1,36 @@
+package com.ym.mec.student.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import javax.annotation.Resource;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.biz.dal.entity.StudentPreRegistration;
+import com.ym.mec.biz.service.StudentService;
+import com.ym.mec.common.controller.BaseController;
+
+@RequestMapping("student")
+@Api(tags = "学生服务")
+@RestController
+public class StudentController extends BaseController {
+
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+    
+    @Autowired
+    private StudentService studentService;
+
+    @ApiOperation("注册")
+    @PostMapping(value = "/registering")
+    public Object preRegister(@RequestBody StudentPreRegistration studentPreRegistration) {
+        return studentService.register(studentPreRegistration) ? succeed() : failed();
+    }
+
+}

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels