소스 검색

Merge branch 'online1' into vip_price_827

yonge 3 년 전
부모
커밋
7ff1d8ef90
100개의 변경된 파일3657개의 추가작업 그리고 190개의 파일을 삭제
  1. 20 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/dto/MusicScoreQueryInfo.java
  2. 20 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/LoginEntity.java
  3. 10 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/filter/PhoneLoginAuthenticationFilter.java
  4. 1 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/PhoneAuthenticationProvider.java
  5. 1 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysUserService.java
  6. 11 2
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserServiceImpl.java
  7. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperAdjustLogDao.java
  8. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperDao.java
  9. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  10. 5 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/DegreeRegistrationDao.java
  11. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ExtracurricularExercisesReplyDao.java
  12. 55 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/FinancialExpenditureDao.java
  13. 12 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LuckDrawLogDao.java
  14. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LuckDrawPrizeDao.java
  15. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/QuestionnaireUserResultDao.java
  16. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  17. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java
  18. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  19. 4 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicScoreAccompanimentDao.java
  20. 15 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicScoreCategoriesDao.java
  21. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicScoreDao.java
  22. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  23. 35 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityStudentAdjustDto.java
  24. 124 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityStudentDto.java
  25. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityUserMapperAddDto.java
  26. 26 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OaColumnDto.java
  27. 25 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OaFormStructureDto.java
  28. 56 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OaInputDto.java
  29. 93 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PWorkOrderInfo.java
  30. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PageInfoDegree.java
  31. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PracticeBuyResultDto.java
  32. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/QuestionnaireResultDto.java
  33. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SubjectApplyDetailDto.java
  34. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ActivityUserMapper.java
  35. 146 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ActivityUserMapperAdjustLog.java
  36. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/DegreeRegistration.java
  37. 54 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/FinancialExpenditure.java
  38. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/PracticeGroup.java
  39. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPreRegistration.java
  40. 91 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScore.java
  41. 52 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScoreAccompaniment.java
  42. 70 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScoreCategories.java
  43. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroupActivity.java
  44. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExpenditureTypeEnum.java
  45. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/FeeProjectEnum.java
  46. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/GroupType.java
  47. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/QuestionnaireActiveTypeEnum.java
  48. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ReturnFeeEnum.java
  49. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ActivityStudentQueryInfo.java
  50. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/DegreeQueryInfo.java
  51. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/LuckDrawQueryInfo.java
  52. 68 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentActivityQueryInfo.java
  53. 23 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysExamSongQueryInfo.java
  54. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperAdjustLogService.java
  55. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperService.java
  56. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/service/FinancialExpenditureService.java
  57. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/service/GroupClassService.java
  58. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/service/LuckDrawLogService.java
  59. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  60. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/PracticeGroupService.java
  61. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/service/QuestionnaireUserResultService.java
  62. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  63. 5 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  64. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  65. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicScoreCategoriesService.java
  66. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicScoreService.java
  67. 1 2
      mec-biz/src/main/java/com/ym/mec/biz/service/UploadFileService.java
  68. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java
  69. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperAdjustLogServiceImpl.java
  70. 192 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperServiceImpl.java
  71. 18 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/DegreeRegistrationServiceImpl.java
  72. 22 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EduPracticeGroupServiceImpl.java
  73. 6 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  74. 60 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java
  75. 322 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/FinancialExpenditureServiceImpl.java
  76. 130 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/GroupClassServiceImpl.java
  77. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/LuckDrawLogServiceImpl.java
  78. 38 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/LuckDrawPrizeServiceImpl.java
  79. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java
  80. 257 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  81. 123 57
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  82. 41 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/QuestionnaireUserResultServiceImpl.java
  83. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ReplacementInstrumentActivityServiceImpl.java
  84. 48 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  85. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  86. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java
  87. 164 19
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  88. 24 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java
  89. 4 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectServiceImpl.java
  90. 17 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreAccompanimentServiceImpl.java
  91. 156 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreCategoriesServiceImpl.java
  92. 93 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreServiceImpl.java
  93. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  94. 159 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  95. 109 0
      mec-biz/src/main/resources/config/mybatis/ActivityUserMapperAdjustLogMapper.xml
  96. 80 5
      mec-biz/src/main/resources/config/mybatis/ActivityUserMapperMapper.xml
  97. 36 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  98. 27 2
      mec-biz/src/main/resources/config/mybatis/DegreeRegistrationMapper.xml
  99. 2 1
      mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesMapper.xml
  100. 35 0
      mec-biz/src/main/resources/config/mybatis/FinancialExpenditureMapper.xml

+ 20 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/dto/MusicScoreQueryInfo.java

@@ -6,6 +6,26 @@ public class MusicScoreQueryInfo {
     @ApiModelProperty(value = "父节点编号,默认0",required = false)
     private Integer parentId = 0;
 
+    private String organId;
+
+    private Boolean enable;
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public String getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(String organId) {
+        this.organId = organId;
+    }
+
     public Integer getParentId() {
         return parentId;
     }

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

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

@@ -42,7 +42,7 @@ public interface ExtracurricularExercisesReplyDao extends BaseDAO<Long, Extracur
      * @param extraExerciseIds:
      * @return java.util.List<com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply>
      */
-    List<ExtracurricularExercisesReply> findExtraExerciseStudentsByExtraExercises(@Param("extraExerciseIds") List<Long> extraExerciseIds);
+    List<ExtracurricularExercisesReply> findExtraExerciseStudentsByExtraExercises(@Param("extraExerciseIds") List extraExerciseIds);
 
     /**
      * @describe 获取学生课外训练详情

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

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

@@ -172,7 +172,7 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
      */
     BigDecimal sumGroupIncomeFee(@Param("vipGroupId") Long vipGroupId);
 
-    List<StudentPaymentOrder> findStudentPaymentOrder(@Param("groupType") String groupType, @Param("musicGroupId") String musicGroupId);
+    List<StudentPaymentOrder> findStudentPaymentOrder(@Param("musicGroupId") String musicGroupId);
 
     /**
      * 获取零星订单

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

@@ -723,4 +723,13 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     * @date 2021/11/10 17:55
     */
     List<MusicGroup> countInstrument(@Param("musicGroupIds") List<String> musicGroupIds);
+
+    /**
+    * @description: 获取分部缴费总金额
+     * @param musicGroupId
+    * @return java.util.List<java.util.Map<java.lang.Integer,java.math.BigDecimal>>
+    * @author zx
+    * @date 2021/11/16 10:26
+    */
+    List<Map<Long,BigDecimal>> querySubjectAmount(String musicGroupId);
 }

+ 4 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicScoreAccompanimentDao.java

@@ -13,13 +13,15 @@ public interface SysMusicScoreAccompanimentDao extends BaseDAO<Integer, SysMusic
 
 
     void batchInsert(@Param("sysMusicScoreAccompaniments") List<SysMusicScoreAccompaniment> sysMusicScoreAccompaniments,
-                     @Param("sysMusicScoreId") Integer sysMusicScoreId);
+                     @Param("sysMusicScoreId") Integer sysMusicScoreId,
+                     @Param("isOpenMetronome") Boolean isOpenMetronome);
 
     void batchDel(@Param("delExamSongAccompanimentIds") List<Integer> delExamSongAccompanimentIds);
 
     List<Integer> findSubjectByMusicScoreId(@Param("sysMusicScoreId") Integer sysMusicScoreId, @Param("idList") List<Integer> idList);
 
-    void batchUpdate(@Param("sysMusicScoreAccompaniments") List<SysMusicScoreAccompaniment> sysMusicScoreAccompaniments);
+    void batchUpdate(@Param("sysMusicScoreAccompaniments") List<SysMusicScoreAccompaniment> sysMusicScoreAccompaniments,
+                     @Param("isOpenMetronome") Boolean isOpenMetronome);
 
     void deleteBySongId(Integer id);
 

+ 15 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicScoreCategoriesDao.java

@@ -6,10 +6,22 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
-
-import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 public interface SysMusicScoreCategoriesDao extends BaseDAO<Integer, SysMusicScoreCategories> {
 
-    List<SysMusicScoreCategories> findByParentId(@Param("parentId") Integer parentId);
+    List<SysMusicScoreCategories> findByParentId(@Param("parentId") Integer parentId,@Param("organId") String organId, @Param("enable") Boolean enable);
+
+    void batchInsert(@Param("categoriesList") List<SysMusicScoreCategories> sysMusicScoreCategoriesList, @Param("organId") String organId, @Param("enable") Boolean enable);
+
+    void batchDel(@Param("categoriesIds") String categoriesIds);
+
+    String findByCategoriesIds(@Param("categoriesIds") String categoriesIds);
+
+    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);
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicScoreDao.java

@@ -10,4 +10,6 @@ import java.util.List;
 public interface SysMusicScoreDao extends BaseDAO<Integer, SysMusicScore> {
 
     List<SysMusicScore> findByIds(@Param("musicScoreIds") String musicScoreIds);
+
+    int countBuyCategoriesIds(@Param("categoriesIds") String delCategoriesIds);
 }

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

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SubjectApplyDetailDto.java

@@ -2,6 +2,8 @@ package com.ym.mec.biz.dal.dto;
 
 import io.swagger.annotations.ApiModelProperty;
 
+import java.math.BigDecimal;
+
 /**
  * 乐团声部报名详情
  */
@@ -46,6 +48,16 @@ public class SubjectApplyDetailDto {
     @ApiModelProperty(value = "没买云教练入团人数", required = false)
     private Integer noCloudTeacherStudentNumOfNormal = 0;
 
+    private BigDecimal totalAmount;
+
+    public BigDecimal getTotalAmount() {
+        return totalAmount;
+    }
+
+    public void setTotalAmount(BigDecimal totalAmount) {
+        this.totalAmount = totalAmount;
+    }
+
     public Integer getMusicGroupSubjectPlanId() {
         return musicGroupSubjectPlanId;
     }

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

+ 91 - 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;
@@ -36,6 +40,13 @@ public class SysMusicScore {
 	/** 原音MP3 */
 	private String url;
 
+	/** 带节拍器原音MP3 */
+	private String metronomeUrl;
+
+	private String accompanimentUrl;
+
+	private String accompanimentMetronomeUrl;
+
 	/** 原音MP3 */
 	private String createUserName;
 	
@@ -54,6 +65,10 @@ public class SysMusicScore {
 
 	private String rankIds;
 	
+	private String renderFrom;
+	
+	private boolean enableEvaluation;
+	
 	/**  */
 	private java.util.Date updateTime;
 	
@@ -63,6 +78,66 @@ public class SysMusicScore {
 	//是否显示
 	private Integer showFlag = 0;
 
+	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;
+	}
+
+	public void setIsOpenMetronome(Boolean isOpenMetronome) {
+		this.isOpenMetronome = isOpenMetronome;
+	}
+
+	public String getAccompanimentUrl() {
+		return accompanimentUrl;
+	}
+
+	public void setAccompanimentUrl(String accompanimentUrl) {
+		this.accompanimentUrl = accompanimentUrl;
+	}
+
+	public String getAccompanimentMetronomeUrl() {
+		return accompanimentMetronomeUrl;
+	}
+
+	public void setAccompanimentMetronomeUrl(String accompanimentMetronomeUrl) {
+		this.accompanimentMetronomeUrl = accompanimentMetronomeUrl;
+	}
+
+	public String getMetronomeUrl() {
+		return metronomeUrl;
+	}
+
+	public void setMetronomeUrl(String metronomeUrl) {
+		this.metronomeUrl = metronomeUrl;
+	}
+
 	public Integer getShowFlag() {
 		return showFlag;
 	}
@@ -79,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;
 	}

+ 52 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScoreAccompaniment.java

@@ -23,6 +23,9 @@ public class SysMusicScoreAccompaniment {
 	
 	/**  */
 	private String mp3Url;
+
+	/** 带节拍器MP3 */
+	private String metronomeMp3Url;
 	
 	/** 是否删除 */
 	private Integer delFlag;
@@ -41,12 +44,17 @@ public class SysMusicScoreAccompaniment {
 
 	/**  */
 	private Integer categoriesId;
+	
+	private Integer parentCategoriesId;
 
 	/**  */
 	private String type;
 
 	/**  */
 	private String url;
+
+	/** 带节拍器MP3 */
+	private String metronomeUrl;
 	
 	/**  */
 	private java.util.Date createTime;
@@ -64,6 +72,18 @@ public class SysMusicScoreAccompaniment {
 	private String rankIds;
 
 	private ClientTypeEnum clientType;
+	
+	private String renderFrom;
+	
+	private boolean enableEvaluation;
+
+	public String getMetronomeUrl() {
+		return metronomeUrl;
+	}
+
+	public void setMetronomeUrl(String metronomeUrl) {
+		this.metronomeUrl = metronomeUrl;
+	}
 
 	public String getRankIds() {
 		return rankIds;
@@ -105,6 +125,14 @@ public class SysMusicScoreAccompaniment {
 		this.categoriesId = categoriesId;
 	}
 
+	public Integer getParentCategoriesId() {
+		return parentCategoriesId;
+	}
+
+	public void setParentCategoriesId(Integer parentCategoriesId) {
+		this.parentCategoriesId = parentCategoriesId;
+	}
+
 	public String getCategoriesName() {
 		return categoriesName;
 	}
@@ -225,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);

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

@@ -14,6 +14,10 @@ public class SysMusicScoreCategories {
 	
 	/**  */
 	private Integer parentId;
+
+	private String organId;
+
+	private Boolean enable = false;
 	
 	/** 名称 */
 	private String name;
@@ -30,8 +34,66 @@ public class SysMusicScoreCategories {
 	/**  */
 	private java.util.Date updateTime;
 
+	private String delCategoriesIds;
+
+	private String organNames;
+
+	private Integer order;
+
+	private Integer musicScoreNum;
+	
+	private String soundResource;
+
+	public Integer getMusicScoreNum() {
+		return musicScoreNum;
+	}
+
+	public void setMusicScoreNum(Integer musicScoreNum) {
+		this.musicScoreNum = musicScoreNum;
+	}
+
+	public Integer getOrder() {
+		return order;
+	}
+
+	public void setOrder(Integer order) {
+		this.order = order;
+	}
+
+	public String getOrganNames() {
+		return organNames;
+	}
+
+	public void setOrganNames(String organNames) {
+		this.organNames = organNames;
+	}
+
+	public Boolean getEnable() {
+		return enable;
+	}
+
+	public void setEnable(Boolean enable) {
+		this.enable = enable;
+	}
+
+	public String getOrganId() {
+		return organId;
+	}
+
+	public void setOrganId(String organId) {
+		this.organId = organId;
+	}
+
 	private List<SysMusicScoreCategories> sysMusicScoreCategoriesList;
 
+	public String getDelCategoriesIds() {
+		return delCategoriesIds;
+	}
+
+	public void setDelCategoriesIds(String delCategoriesIds) {
+		this.delCategoriesIds = delCategoriesIds;
+	}
+
 	public List<SysMusicScoreCategories> getSysMusicScoreCategoriesList() {
 		return sysMusicScoreCategoriesList;
 	}
@@ -96,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;
 

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

@@ -9,7 +9,9 @@ public enum ReturnFeeEnum implements BaseEnum<String, ReturnFeeEnum> {
 	VIP("VIP", "VIP退学"),
 	PRACTICE("PRACTICE", "网管课关闭"),
 	MUSIC("MUSIC", "乐团退团"),
-	GOODS("GOODS", "商品退费");
+	GOODS("GOODS", "商品退费"),
+	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;
+    }
+}

+ 23 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysExamSongQueryInfo.java

@@ -18,7 +18,7 @@ public class SysExamSongQueryInfo extends QueryInfo {
     private String type;
 
     @ApiModelProperty(value = "曲库分类",required = true)
-    private Integer categoriesId;
+    private String categoriesId;
 
     @ApiModelProperty(value = "是否收费",required = true)
     private Integer rankType;
@@ -35,6 +35,26 @@ public class SysExamSongQueryInfo extends QueryInfo {
 
     private Integer showFlag;
 
+    private Boolean enable;
+
+    private String organId;
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public String getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(String organId) {
+        this.organId = organId;
+    }
+
     public Integer getShowFlag() {
         return showFlag;
     }
@@ -83,11 +103,11 @@ public class SysExamSongQueryInfo extends QueryInfo {
         this.parentId = parentId;
     }
 
-    public Integer getCategoriesId() {
+    public String getCategoriesId() {
         return categoriesId;
     }
 
-    public void setCategoriesId(Integer categoriesId) {
+    public void setCategoriesId(String categoriesId) {
         this.categoriesId = categoriesId;
     }
 

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

+ 5 - 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);
 
@@ -81,6 +83,8 @@ public interface StudentService extends BaseService<Integer, Student> {
      * 更新学员会员信息
      */
     void updateMemberRank(CloudTeacherOrder cloudTeacherOrder, PeriodEnum periodEnum);
+    
+    void updateMemberRank(Integer userId, PeriodEnum periodEnum, int times, Integer memberRankSettingId);
 
     /**
      * 更新服务指标

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

@@ -110,6 +110,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 陪练课预约开始时间

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicScoreCategoriesService.java

@@ -10,4 +10,14 @@ import java.util.List;
 public interface SysMusicScoreCategoriesService extends BaseService<Integer, SysMusicScoreCategories> {
 
     List<SysMusicScoreCategories> queryTree(MusicScoreQueryInfo menuQueryInfo);
+
+    void save(SysMusicScoreCategories musicScoreCategories);
+
+    void updateCategories(SysMusicScoreCategories musicScoreCategories);
+
+    void del(Integer id);
+
+    void enable(Integer categoriesId);
+
+    SysMusicScoreCategories getDetail(Integer categoriesId);
 }

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

@@ -3,6 +3,8 @@ package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.MusicScoreDto;
 import com.ym.mec.biz.dal.entity.SysMusicScore;
+import com.ym.mec.biz.dal.page.SysExamSongQueryInfo;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
 public interface SysMusicScoreService extends BaseService<Integer, SysMusicScore> {
@@ -13,4 +15,5 @@ public interface SysMusicScoreService extends BaseService<Integer, SysMusicScore
 
     void del(Integer id);
 
+    PageInfo<SysMusicScore> queryMusicScorePage(SysExamSongQueryInfo queryInfo);
 }

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

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

@@ -680,12 +680,14 @@ public class ExportServiceImpl implements ExportService {
                     order.setPracticeCourseFee(BigDecimal.ZERO);
                     order.setTheoryCourseFee(BigDecimal.ZERO);
                     order.setDegreeFee(BigDecimal.ZERO);
+                    order.setMaintenanceFee(BigDecimal.ZERO);
                     order.setCloudTeacherFee(BigDecimal.ZERO);
                     order.setRepairFee(order.getMaintenanceProductFee());
                     continue;
                 } else if (order.getSaleAmount().compareTo(BigDecimal.ZERO) == 0 && order.getServiceAmount().compareTo(BigDecimal.ZERO) > 0) {
                     order.setRepairFee(order.getRepairFee());
                     order.setCloudTeacherFee(order.getCloudTeacherFee());
+                    order.setMaintenanceFee(order.getMaintenanceFee());
                     order.setMusicalFee(BigDecimal.ZERO);
                     order.setTeachingFee(BigDecimal.ZERO);
                     order.setOtherFee(BigDecimal.ZERO);
@@ -714,12 +716,12 @@ public class ExportServiceImpl implements ExportService {
                     theoryCourseFee = order.getTheoryCourseFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
                     degreeFee = order.getDegreeFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
                     repairFee = order.getRepairFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
-                    maintenanceFee = order.getMaintenanceFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
                     maintenanceProductFee = order.getMaintenanceProductFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
                     leaseFee = order.getLeaseFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
                     musicalFee = order.getMusicalFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
                     teachingFee = order.getTeachingFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
                     otherFee = order.getOtherFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
+                    maintenanceFee = order.getMaintenanceFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
                     cloudTeacherFee = order.getCloudTeacherFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
                 }
 
@@ -759,13 +761,13 @@ public class ExportServiceImpl implements ExportService {
                     theoryCourseFee = order.getTheoryCourseFee().subtract(routeTheoryCourseFee);
                     degreeFee = order.getDegreeFee().subtract(routeDegreeFee);
                     repairFee = order.getRepairFee().subtract(routeRepairFee);
-                    maintenanceFee = order.getMaintenanceFee().subtract(routeMaintenanceFee);
                     maintenanceProductFee = order.getMaintenanceProductFee().subtract(routeMaintenanceProductFee);
                     leaseFee = order.getLeaseFee().subtract(routeLeaseFee);
                     musicalFee = order.getMusicalFee().subtract(routeMusicalFee);
                     teachingFee = order.getTeachingFee().subtract(routeTeachingFee);
                     otherFee = order.getOtherFee().subtract(routeOtherFee);
                     rechargeFee = order.getRechargeFee().subtract(routeRechargeFee);
+                    maintenanceFee = order.getMaintenanceFee().subtract(routeMaintenanceFee);
                     cloudTeacherFee = order.getCloudTeacherFee().subtract(routeCloudTeacherFee);
                 }
                 j++;
@@ -776,13 +778,13 @@ public class ExportServiceImpl implements ExportService {
                 routeTheoryCourseFee = routeTheoryCourseFee.add(theoryCourseFee);
                 routeDegreeFee = routeDegreeFee.add(degreeFee);
                 routeRepairFee = routeRepairFee.add(repairFee);
-                routeMaintenanceFee = routeMaintenanceFee.add(maintenanceFee);
                 routeMaintenanceProductFee = routeMaintenanceProductFee.add(maintenanceProductFee);
                 routeLeaseFee = routeLeaseFee.add(leaseFee);
                 routeMusicalFee = routeMusicalFee.add(musicalFee);
                 routeTeachingFee = routeTeachingFee.add(teachingFee);
                 routeOtherFee = routeOtherFee.add(otherFee);
                 routeRechargeFee = routeRechargeFee.add(rechargeFee);
+                routeMaintenanceFee = routeMaintenanceFee.add(maintenanceFee);
                 routeCloudTeacherFee = routeCloudTeacherFee.add(cloudTeacherFee);
 
                 order.setMusicGroupCourseFee(musicGroupCourseFee);
@@ -791,13 +793,13 @@ public class ExportServiceImpl implements ExportService {
                 order.setTheoryCourseFee(theoryCourseFee);
                 order.setDegreeFee(degreeFee);
                 order.setRepairFee(repairFee.add(maintenanceProductFee));
-                order.setMaintenanceFee(maintenanceFee);
                 order.setMaintenanceProductFee(maintenanceProductFee);
                 order.setLeaseFee(leaseFee);
                 order.setMusicalFee(musicalFee);
                 order.setTeachingFee(teachingFee);
                 order.setOtherFee(otherFee);
                 order.setRechargeFee(rechargeFee);
+                order.setMaintenanceFee(maintenanceFee);
                 order.setCloudTeacherFee(cloudTeacherFee);
             }
         });

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

@@ -4,9 +4,11 @@ import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.ExtracurricularExercises;
 import com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply;
+import com.ym.mec.biz.dal.entity.StudentCourseHomework;
 import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.ExtraExercilseQueryInfo;
 import com.ym.mec.biz.service.ExtracurricularExercisesService;
 import com.ym.mec.biz.service.StudentServeService;
@@ -49,6 +51,8 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 	private CourseHomeworkDao courseHomeworkDao;
 	@Autowired
 	private StudentServeService studentServeService;
+	@Autowired
+	private StudentCourseHomeworkDao studentCourseHomeworkDao;
 
 	@Override
 	public BaseDAO<Long, ExtracurricularExercises> getDAO() {
@@ -236,13 +240,67 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 			List<ExtracurricularExercisesHomeworkListDto> exercises = homeworksExercises.stream().filter(e -> e.getType().equals("EXERCISES")).collect(Collectors.toList());
 			if(exercises.size() > 0){
 				List<Integer> exercisesIdList = exercises.stream().map(e -> e.getHomeworkId()).collect(Collectors.toList());
-				dataList.addAll(extracurricularExercisesDao.findByIdList(exercisesIdList));
+				List<TeacherHomeworkListDto> byIdList = extracurricularExercisesDao.findByIdList(exercisesIdList);
+				if(byIdList != null && byIdList.size() > 0){
+					List<Integer> extraExerciseIds = byIdList.stream().map(TeacherHomeworkListDto::getHomeworkId).collect(Collectors.toList());
+					List<ExtracurricularExercisesReply> extraExerciseStudentsByExtraExercises = extracurricularExercisesReplyDao.findExtraExerciseStudentsByExtraExercises(extraExerciseIds);
+					Map<Long, List<ExtracurricularExercisesReply>> idStudentsMap = extraExerciseStudentsByExtraExercises.stream().collect(Collectors.groupingBy(ExtracurricularExercisesReply::getExtracurricularExercisesId));
+					for (TeacherHomeworkListDto homeworkListDto : byIdList) {
+						List<ExtracurricularExercisesReply> extracurricularExercisesReplies = idStudentsMap.get(homeworkListDto.getHomeworkId().longValue());
+						if(CollectionUtils.isEmpty(extracurricularExercisesReplies)){
+							continue;
+						}
+						long noRepliedNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus()==1&&e.getIsReplied() == 0).count();
+						if(noRepliedNum<=0){
+							homeworkListDto.setIsReplied(1);
+						}
+						long notSubmitNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus() == 0).count();
+						if(notSubmitNum<=0){
+							homeworkListDto.setIsSubmit(1);
+						}
+						if(noRepliedNum>0){
+							homeworkListDto.setStatus(1);
+						}else if(noRepliedNum<=0&&notSubmitNum>0){
+							homeworkListDto.setStatus(2);
+						}else if(noRepliedNum<=0&&notSubmitNum<=0){
+							homeworkListDto.setStatus(3);
+						}
+					}
+					dataList.addAll(byIdList);
+				}
 			}
 			//课后作业
 			List<ExtracurricularExercisesHomeworkListDto> homeworkList = homeworksExercises.stream().filter(e -> e.getType().equals("HOMEWORK")).collect(Collectors.toList());
 			if(homeworkList.size() > 0){
 				List<Integer> homeworkIdList = homeworkList.stream().map(e -> e.getHomeworkId()).collect(Collectors.toList());
-				dataList.addAll(courseHomeworkDao.findByIdList(homeworkIdList));
+				List<TeacherHomeworkListDto> byIdList = courseHomeworkDao.findByIdList(homeworkIdList);
+				if(byIdList != null && byIdList.size() > 0){
+					List<Long> courseIds = byIdList.stream().mapToLong(TeacherHomeworkListDto::getCourseScheduleId).boxed().collect(Collectors.toList());
+					List<StudentCourseHomework> allStudentCourseHomeworks = studentCourseHomeworkDao.findByCourses(courseIds);
+					Map<Long, List<StudentCourseHomework>> homeworkStudentMap = allStudentCourseHomeworks.stream().collect(Collectors.groupingBy(StudentCourseHomework::getCourseScheduleId));
+					for (TeacherHomeworkListDto teacherHomeworkListDto : byIdList) {
+						List<StudentCourseHomework> studentCourseHomeworks = homeworkStudentMap.get(teacherHomeworkListDto.getCourseScheduleId().longValue());
+						if(CollectionUtils.isEmpty(studentCourseHomeworks)){
+							continue;
+						}
+						long noRepliedNum=studentCourseHomeworks.stream().filter(e -> YesOrNoEnum.YES.equals(e.getStatus())&&YesOrNoEnum.NO.equals(e.getIsReplied())).count();
+						if(noRepliedNum<=0){
+							teacherHomeworkListDto.setIsReplied(YesOrNoEnum.YES.getCode());
+						}
+						long notSubmitNum = studentCourseHomeworks.stream().filter(e -> e.getStatus().equals(YesOrNoEnum.NO)).count();
+						if(notSubmitNum<=0){
+							teacherHomeworkListDto.setIsSubmit(1);
+						}
+						if(noRepliedNum>0){
+							teacherHomeworkListDto.setStatus(1);
+						}else if(noRepliedNum<=0&&notSubmitNum>0){
+							teacherHomeworkListDto.setStatus(2);
+						}else if(noRepliedNum<=0&&notSubmitNum<=0){
+							teacherHomeworkListDto.setStatus(3);
+						}
+					}
+					dataList.addAll(byIdList);
+				}
 			}
 			dataList.removeAll(Collections.singleton(null));
 			dataList = dataList.stream().sorted(Comparator.comparing(TeacherHomeworkListDto::getDay).reversed()).collect(Collectors.toList());

+ 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

@@ -709,7 +709,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("缴费信息不存在");
         }
@@ -781,7 +781,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()) {
@@ -982,12 +982,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("缴费信息不存在");
         }
@@ -1061,7 +1061,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()) {
@@ -2744,6 +2744,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();
@@ -2767,9 +3016,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);

+ 164 - 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,70 @@ 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.setOrganId(studentPreRegistration.getOrganId());
+            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);
+        
+        if(user.getOrganId() == 59){
+        	updateMemberRank(userId, PeriodEnum.MONTH, 1, 1);
+        }
+        
+        return true;
+	}
+
+	@Override
     public PageInfo findStudentVipGroupList(StudentQueryInfo queryInfo) {
         PageInfo pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<String, Object>();
@@ -378,6 +485,44 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
+	public void updateMemberRank(Integer userId, PeriodEnum periodEnum, int times, Integer memberRankSettingId) {
+    	Student student = this.get(userId);
+        if (student == null) {
+            throw new BizException("学员信息不存在");
+        }
+        
+        Date nowDate = new Date();
+        
+        if(student.getMembershipStartTime() == null){
+            student.setMembershipStartTime(nowDate);
+        }
+        
+        if(student.getMembershipEndTime() != null && student.getMembershipEndTime().after(nowDate)){
+        	nowDate = student.getMembershipEndTime();
+        }
+        
+        switch (periodEnum) {
+		case DAY:
+            student.setMembershipEndTime(DateUtil.addDays(nowDate, times));
+			break;
+		case MONTH:
+		case QUARTERLY:
+		case YEAR_HALF:
+            student.setMembershipEndTime(DateUtil.addMonths(nowDate, times));
+			break;
+		case YEAR:
+            student.setMembershipEndTime(DateUtil.addYears(nowDate, times));
+			break;
+
+		default:
+			break;
+		}
+        student.setMemberRankSettingId(memberRankSettingId);
+        this.update(student);
+	}
+
+	@Override
     public void updateStudentServiceTag(Integer studentId,List<Integer> studentIds,Integer serviceTag) {
         studentDao.updateStudentServiceTag(studentId, studentIds, serviceTag);
     }

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

@@ -1,6 +1,8 @@
 package com.ym.mec.biz.service.impl;
 
 import static com.ym.mec.biz.dal.enums.DealStatusEnum.SUCCESS;
+import static com.ym.mec.biz.dal.enums.GroupType.SUBJECT_CHANGE;
+import static com.ym.mec.biz.dal.enums.GroupType.VIP;
 
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.SubjectChangeParamDto;
@@ -82,6 +84,8 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
     private MusicGroupSubjectPlanService musicGroupSubjectPlanService;
     @Autowired
     private SysCouponCodeService sysCouponCodeService;
+    @Autowired
+    private SysUserCashAccountLogDao sysUserCashAccountLogDao;
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
@@ -139,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);
@@ -175,7 +179,7 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
         StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(subjectChangeParamDto.getCouponIdList(),amount,true);
         amount = studentPaymentOrder.getActualAmount();
         studentPaymentOrder.setUserId(subjectChange.getStudentId());
-        studentPaymentOrder.setGroupType(GroupType.SUBJECT_CHANGE);
+        studentPaymentOrder.setGroupType(SUBJECT_CHANGE);
         studentPaymentOrder.setOrderNo(orderNo);
         studentPaymentOrder.setType(OrderTypeEnum.SUBJECT_CHANGE);
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
@@ -337,21 +341,32 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
             subjectChange.setSellAmount(BigDecimal.ZERO);
             subjectChange.setSellTime(nowDate);
         }
-        //差价小于0退到余额
-        if (amountMargin.compareTo(BigDecimal.ZERO) <= 0) {
-            sysUserCashAccountService.updateBalance(subjectChange.getStudentId(), amountMargin.negate(), PlatformCashAccountDetailTypeEnum.REFUNDS, "声部更换退还");
-            studentRegistrationService.changeStudentSubject(subjectChange.getStudentId(), subjectChange.getMusicGroupId(), subjectChange.getOriginalSubjectId(), subjectChange.getChangeSubjectId());
-        }
         subjectChange.setCreateTime(nowDate);
         subjectChange.setUpdateTime(nowDate);
         subjectChange.setVersion(0);
         subjectChangeDao.insert(subjectChange);
+        //差价小于0退到余额
+        if (amountMargin.compareTo(BigDecimal.ZERO) <= 0) {
+//            sysUserCashAccountService.updateBalance(subjectChange.getStudentId(), amountMargin.negate(), PlatformCashAccountDetailTypeEnum.REFUNDS, "声部更换退还");
+            if(amountMargin.compareTo(BigDecimal.ZERO) < 0){
+                SysUserCashAccountLog sysUserCashAccountLog = new SysUserCashAccountLog();
+                sysUserCashAccountLog.setUserId(subjectChange.getStudentId());
+                sysUserCashAccountLog.setGroupType(SUBJECT_CHANGE);
+                sysUserCashAccountLog.setOrganId(subjectChange.getOrganId());
+                sysUserCashAccountLog.setGroupId(subjectChange.getId().toString());
+                sysUserCashAccountLog.setAmount(amountMargin.negate());
+                sysUserCashAccountLog.setReturnFeeType(ReturnFeeEnum.SUBJECT_CHANGE);
+                sysUserCashAccountLog.setComment("声部更换退还");
+                sysUserCashAccountLogDao.insert(sysUserCashAccountLog);
+            }
+            studentRegistrationService.changeStudentSubject(subjectChange.getStudentId(), subjectChange.getMusicGroupId(), subjectChange.getOriginalSubjectId(), subjectChange.getChangeSubjectId());
+        }
 
         if (amountMargin.compareTo(BigDecimal.ZERO) <= 0) {
             String orderNo = idGeneratorService.generatorId("payment") + "";
             StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
             studentPaymentOrder.setUserId(subjectChange.getStudentId());
-            studentPaymentOrder.setGroupType(GroupType.SUBJECT_CHANGE);
+            studentPaymentOrder.setGroupType(SUBJECT_CHANGE);
             studentPaymentOrder.setOrderNo(orderNo);
             studentPaymentOrder.setType(OrderTypeEnum.SUBJECT_CHANGE);
             studentPaymentOrder.setExpectAmount(BigDecimal.ZERO);

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

@@ -86,13 +86,15 @@ public class SubjectServiceImpl extends BaseServiceImpl<Integer, Subject> implem
         List<SubjectApplyDetailDto> registers = studentRegistrationDao.queryStudentApplyDetail(musicGroupId);
         
         Map<Integer,SubjectApplyDetailDto> map = registers.stream().collect(Collectors.toMap(SubjectApplyDetailDto :: getSubjectId, t -> t));
-        
+
+        Map<Long,BigDecimal> maps = MapUtil.convertIntegerMap(studentRegistrationDao.querySubjectAmount(musicGroupId));
         subApplyDetail.forEach(detail -> {
         	SubjectApplyDetailDto dto = new SubjectApplyDetailDto();
         	if(map.containsKey(detail.getSubjectId())){
         		dto = map.get(detail.getSubjectId());
         	}
-    		detail.setPayNum(dto.getPayNum());
+        	detail.setTotalAmount(maps.get(detail.getSubjectId().longValue()));
+            detail.setPayNum(dto.getPayNum());
             detail.setApplyStudentNum(dto.getApplyStudentNum());
             detail.setPayingNum(dto.getPayingNum());
             detail.setCheckNum(dto.getCheckNum());

+ 17 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreAccompanimentServiceImpl.java

@@ -15,6 +15,7 @@ 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;
 
@@ -64,12 +65,18 @@ public class SysMusicScoreAccompanimentServiceImpl extends BaseServiceImpl<Integ
 		if(queryInfo.getCategoriesId() != null){
 			List<Integer> categoriesIdList = new ArrayList<>();
 			MusicScoreQueryInfo musicScoreQueryInfo = new MusicScoreQueryInfo();
-			musicScoreQueryInfo.setParentId(queryInfo.getCategoriesId());
+			Integer categoriesId = null;
+			if(StringUtils.isNotEmpty(queryInfo.getCategoriesId())){
+				categoriesId = Integer.parseInt(queryInfo.getCategoriesId());
+			}
+			musicScoreQueryInfo.setParentId(categoriesId);
+			musicScoreQueryInfo.setEnable(queryInfo.getEnable());
+			musicScoreQueryInfo.setOrganId(queryInfo.getOrganId());
 			List<SysMusicScoreCategories> scoreCategories = sysMusicScoreCategoriesService.queryTree(musicScoreQueryInfo);
 			if(scoreCategories.size() > 0){
 				categoriesIdList = scoreCategories.stream().map(e->e.getId()).collect(Collectors.toList());
 			}else {
-				categoriesIdList.add(queryInfo.getCategoriesId());
+				categoriesIdList.add(categoriesId);
 			}
 			queryInfo.setCategoriesIdList(categoriesIdList);
 		}
@@ -106,12 +113,18 @@ public class SysMusicScoreAccompanimentServiceImpl extends BaseServiceImpl<Integ
 		if(queryInfo.getCategoriesId() != null){
 			List<Integer> categoriesIdList = new ArrayList<>();
 			MusicScoreQueryInfo musicScoreQueryInfo = new MusicScoreQueryInfo();
-			musicScoreQueryInfo.setParentId(queryInfo.getCategoriesId());
+			Integer categoriesId = null;
+			if(StringUtils.isNotEmpty(queryInfo.getCategoriesId())){
+				categoriesId = Integer.parseInt(queryInfo.getCategoriesId());
+			}
+			musicScoreQueryInfo.setParentId(categoriesId);
+			musicScoreQueryInfo.setOrganId(queryInfo.getOrganId());
+			musicScoreQueryInfo.setEnable(queryInfo.getEnable());
 			List<SysMusicScoreCategories> scoreCategories = sysMusicScoreCategoriesService.queryTree(musicScoreQueryInfo);
 			if(scoreCategories.size() > 0){
 				categoriesIdList = scoreCategories.stream().map(e->e.getId()).collect(Collectors.toList());
 			}else {
-				categoriesIdList.add(queryInfo.getCategoriesId());
+				categoriesIdList.add(categoriesId);
 			}
 			queryInfo.setCategoriesIdList(categoriesIdList);
 		}

+ 156 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreCategoriesServiceImpl.java

@@ -4,13 +4,20 @@ package com.ym.mec.biz.service.impl;
 import com.ym.mec.auth.api.dto.MusicScoreQueryInfo;
 import com.ym.mec.auth.api.entity.SysMenu;
 import com.ym.mec.biz.dal.dao.SysMusicScoreCategoriesDao;
+import com.ym.mec.biz.dal.dao.SysMusicScoreDao;
 import com.ym.mec.biz.dal.entity.SysMusicScoreCategories;
+import com.ym.mec.biz.dal.page.SysExamSongQueryInfo;
 import com.ym.mec.biz.service.SysMusicScoreCategoriesService;
 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 org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -19,6 +26,8 @@ public class SysMusicScoreCategoriesServiceImpl extends BaseServiceImpl<Integer,
 	
 	@Autowired
 	private SysMusicScoreCategoriesDao sysMusicScoreCategoriesDao;
+	@Autowired
+	private SysMusicScoreDao sysMusicScoreDao;
 
 	@Override
 	public BaseDAO<Integer, SysMusicScoreCategories> getDAO() {
@@ -28,15 +37,159 @@ public class SysMusicScoreCategoriesServiceImpl extends BaseServiceImpl<Integer,
 
 	@Override
 	public List<SysMusicScoreCategories> queryTree(MusicScoreQueryInfo menuQueryInfo) {
-		List<SysMusicScoreCategories> scoreCategories = sysMusicScoreCategoriesDao.findByParentId(menuQueryInfo.getParentId());
-		List<SysMusicScoreCategories> scoreCategoriesAllList = sysMusicScoreCategoriesDao.findByParentId(null);
+		List<SysMusicScoreCategories> scoreCategories = sysMusicScoreCategoriesDao.findByParentId(menuQueryInfo.getParentId(),menuQueryInfo.getOrganId(),menuQueryInfo.getEnable());
+		List<SysMusicScoreCategories> scoreCategoriesAllList = sysMusicScoreCategoriesDao.findByParentId(null,menuQueryInfo.getOrganId(),menuQueryInfo.getEnable());
 		for (SysMusicScoreCategories categories : scoreCategories) {
 			categories = getTree(categories,scoreCategoriesAllList);
 		}
 		return scoreCategories;
 	}
 
-	private SysMusicScoreCategories getTree(SysMusicScoreCategories categories,List<SysMusicScoreCategories> scoreCategoriesAllList){
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void save(SysMusicScoreCategories musicScoreCategories) {
+		String organId = musicScoreCategories.getOrganId();
+		Boolean enable = musicScoreCategories.getEnable();
+		musicScoreCategories.setParentId(0);
+		musicScoreCategories.setOrder(0);
+		sysMusicScoreCategoriesDao.insert(musicScoreCategories);
+		List<SysMusicScoreCategories> sysMusicScoreCategoriesList = musicScoreCategories.getSysMusicScoreCategoriesList();
+		if(sysMusicScoreCategoriesList != null && sysMusicScoreCategoriesList.size() > 0){
+			int order = 0;
+			for (SysMusicScoreCategories categories : sysMusicScoreCategoriesList) {
+				categories.setOrder(order);
+				categories.setOrganId(organId);
+				categories.setEnable(enable);
+				categories.setParentId(musicScoreCategories.getId());
+				sysMusicScoreCategoriesDao.insert(categories);
+				order++;
+				List<SysMusicScoreCategories> categoriesList = categories.getSysMusicScoreCategoriesList();
+				if(categoriesList != null && categoriesList.size() > 0){
+					int order1 = 0;
+					for (SysMusicScoreCategories e : categoriesList) {
+						e.setOrder(order1);
+						e.setOrganId(organId);
+						e.setEnable(enable);
+						e.setParentId(categories.getId());
+						order1++;
+					}
+					sysMusicScoreCategoriesDao.batchInsert(categoriesList,organId,enable);
+				}
+			}
+		}
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void updateCategories(SysMusicScoreCategories musicScoreCategories) {
+		String organId = musicScoreCategories.getOrganId();
+		Boolean enable = musicScoreCategories.getEnable();
+		sysMusicScoreCategoriesDao.update(musicScoreCategories);
+		String delCategoriesIds = musicScoreCategories.getDelCategoriesIds();
+		if(StringUtils.isNotEmpty(delCategoriesIds)){
+			//获取当前节点以及子节点
+			delCategoriesIds = sysMusicScoreCategoriesDao.findByCategoriesIds(delCategoriesIds);
+			//是否有在使用的分类
+			int count = sysMusicScoreDao.countBuyCategoriesIds(delCategoriesIds);
+			if(count > 0){
+				throw new BizException("操作失败:当前分类已使用");
+			}
+			sysMusicScoreCategoriesDao.batchDel(delCategoriesIds);
+		}
+		List<SysMusicScoreCategories> sysMusicScoreCategoriesList = musicScoreCategories.getSysMusicScoreCategoriesList();
+		if(sysMusicScoreCategoriesList != null && sysMusicScoreCategoriesList.size() > 0){
+			int order = 0;
+			for (SysMusicScoreCategories categories : sysMusicScoreCategoriesList) {
+				categories.setOrder(order);
+				order++;
+				List<SysMusicScoreCategories> categoriesList = categories.getSysMusicScoreCategoriesList();
+				if(categoriesList != null && categoriesList.size() > 0){
+					int order1 = 0;
+					for (SysMusicScoreCategories e : categoriesList) {
+						e.setOrder(order1);
+						order1++;
+					}
+				}
+			}
+			List<SysMusicScoreCategories> insertCategoriesList = sysMusicScoreCategoriesList.stream().filter(e -> e.getId() == null).collect(Collectors.toList());
+			List<SysMusicScoreCategories> updateCategoriesList = sysMusicScoreCategoriesList.stream().filter(e -> e.getId() != null).collect(Collectors.toList());
+
+			if(insertCategoriesList != null && insertCategoriesList.size() > 0){
+				for (SysMusicScoreCategories categories : insertCategoriesList) {
+					categories.setOrganId(organId);
+					categories.setEnable(enable);
+					categories.setParentId(musicScoreCategories.getId());
+					sysMusicScoreCategoriesDao.insert(categories);
+					List<SysMusicScoreCategories> categoriesList = categories.getSysMusicScoreCategoriesList();
+					if(categoriesList != null && categoriesList.size() > 0){
+						categoriesList.forEach(e->{
+							e.setOrganId(organId);
+							e.setEnable(enable);
+							e.setParentId(categories.getId());
+						});
+						sysMusicScoreCategoriesDao.batchInsert(categoriesList,organId,enable);
+					}
+				}
+			}
+			if(updateCategoriesList != null && updateCategoriesList.size() > 0){
+				for (SysMusicScoreCategories categories : updateCategoriesList) {
+					List<SysMusicScoreCategories> categoriesList = categories.getSysMusicScoreCategoriesList();
+					if(categoriesList != null && categoriesList.size() > 0){
+						List<SysMusicScoreCategories> insertCategories = categoriesList.stream().filter(e -> e.getId() == null).collect(Collectors.toList());
+						if(insertCategories != null && insertCategories.size() > 0){
+							for (SysMusicScoreCategories insertCategory : insertCategories) {
+								insertCategory.setOrganId(organId);
+								insertCategory.setEnable(enable);
+								insertCategory.setParentId(categories.getId());
+							}
+							sysMusicScoreCategoriesDao.batchInsert(insertCategories,organId,enable);
+						}
+						List<SysMusicScoreCategories> updateCategories = categoriesList.stream().filter(e -> e.getId() != null).collect(Collectors.toList());
+						if(updateCategories != null && updateCategories.size() > 0){
+							sysMusicScoreCategoriesDao.batchUpdate(updateCategories,organId,enable);
+						}
+					}
+				}
+				sysMusicScoreCategoriesDao.batchUpdate(updateCategoriesList,organId,enable);
+			}
+		}
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void del(Integer id) {
+		String byCategoriesIds = sysMusicScoreCategoriesDao.findByCategoriesIds(id.toString());
+		byCategoriesIds = sysMusicScoreCategoriesDao.findByCategoriesIds(byCategoriesIds);
+		//是否有在使用的分类
+		int count = sysMusicScoreDao.countBuyCategoriesIds(byCategoriesIds);
+		if(count > 0){
+			throw new BizException("操作失败:当前分类已使用");
+		}
+		sysMusicScoreCategoriesDao.batchDel(byCategoriesIds);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void enable(Integer categoriesId) {
+		SysMusicScoreCategories categories = sysMusicScoreCategoriesDao.get(categoriesId);
+		if(categories == null){
+			throw new BizException("分类不存在");
+		}
+		String byCategoriesIds = sysMusicScoreCategoriesDao.findByCategoriesIds(categoriesId.toString());
+		byCategoriesIds = sysMusicScoreCategoriesDao.findByCategoriesIds(byCategoriesIds);
+		sysMusicScoreCategoriesDao.enable(byCategoriesIds,!categories.getEnable());
+	}
+
+    @Override
+    public SysMusicScoreCategories getDetail(Integer categoriesId) {
+		SysMusicScoreCategories categories = sysMusicScoreCategoriesDao.get(categoriesId);
+		MusicScoreQueryInfo musicScoreQueryInfo = new MusicScoreQueryInfo();
+		musicScoreQueryInfo.setParentId(categories.getId());
+		categories.setSysMusicScoreCategoriesList(queryTree(musicScoreQueryInfo));
+		return categories;
+    }
+
+    private SysMusicScoreCategories getTree(SysMusicScoreCategories categories,List<SysMusicScoreCategories> scoreCategoriesAllList){
 		//得到根节点对象
 		//获取子节点list
 		List<SysMusicScoreCategories> scoreCategories = scoreCategoriesAllList.stream().filter(e->e.getParentId().equals(categories.getId())).collect(Collectors.toList());

+ 93 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreServiceImpl.java

@@ -3,21 +3,30 @@ 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;
 import com.ym.mec.biz.dal.dto.MusicScoreDto;
 import com.ym.mec.biz.dal.entity.SysMusicScore;
 import com.ym.mec.biz.dal.entity.SysMusicScoreAccompaniment;
+import com.ym.mec.biz.dal.entity.SysMusicScoreCategories;
+import com.ym.mec.biz.dal.page.SysExamSongQueryInfo;
 import com.ym.mec.biz.service.SysMusicScoreService;
 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;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static com.ym.mec.biz.dal.enums.ClientTypeEnum.SMART_PRACTICE;
+
 @Service
 public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicScore> implements SysMusicScoreService {
 	
@@ -27,6 +36,10 @@ public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicS
 	private SysMusicScoreAccompanimentDao sysMusicScoreAccompanimentDao;
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
+	@Autowired
+	private SysMusicScoreCategoriesDao sysMusicScoreCategoriesDao;
+	@Autowired
+	private SubjectDao subjectDao;
 
 	@Override
 	public BaseDAO<Integer, SysMusicScore> getDAO() {
@@ -59,12 +72,12 @@ public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicS
 			//获取需要修改的伴奏
 			List<SysMusicScoreAccompaniment> updateCollect = sysMusicScoreAccompaniments.stream().filter(e -> e.getId() != null).collect(Collectors.toList());
 			if(updateCollect.size() > 0){
-				sysMusicScoreAccompanimentDao.batchUpdate(updateCollect);
+				sysMusicScoreAccompanimentDao.batchUpdate(updateCollect,sysMusicScore.getIsOpenMetronome());
 			}
 			//获取需要新增的伴奏
 			List<SysMusicScoreAccompaniment> addCollect = sysMusicScoreAccompaniments.stream().filter(e -> e.getId() == null).collect(Collectors.toList());
 			if(addCollect.size() > 0){
-				sysMusicScoreAccompanimentDao.batchInsert(addCollect,sysMusicScore.getId());
+				sysMusicScoreAccompanimentDao.batchInsert(addCollect,sysMusicScore.getId(),sysMusicScore.getIsOpenMetronome());
 			}
 		}
 	}
@@ -81,14 +94,91 @@ public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicS
 		sysMusicScoreDao.insert(sysMusicScore);
 		List<SysMusicScoreAccompaniment> sysMusicScoreAccompaniments = musicScoreDto.getSysMusicScoreAccompaniments();
 		if(sysMusicScoreAccompaniments != null && sysMusicScoreAccompaniments.size() > 0){
-			sysMusicScoreAccompanimentDao.batchInsert(sysMusicScoreAccompaniments,sysMusicScore.getId());
+			sysMusicScoreAccompanimentDao.batchInsert(sysMusicScoreAccompaniments,sysMusicScore.getId(),sysMusicScore.getIsOpenMetronome());
+		}
+		Integer categoriesId = sysMusicScore.getMusicScoreCategoriesId();
+		if(categoriesId != null && sysMusicScore.getClientType() == SMART_PRACTICE){
+			while (true){
+				SysMusicScoreCategories categories = sysMusicScoreCategoriesDao.get(categoriesId);
+				if(categories.getParentId() == 0){
+					categories.setMusicScoreNum(categories.getMusicScoreNum() + 1);
+					sysMusicScoreCategoriesDao.update(categories);
+					return;
+				}
+				categoriesId = categories.getParentId();
+			}
 		}
 	}
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void del(Integer id) {
+		SysMusicScore sysMusicScore = sysMusicScoreDao.get(id);
+		if(sysMusicScore == null){
+			throw new BizException("曲目不存在");
+		}
 		sysMusicScoreDao.delete(id);
 		sysMusicScoreAccompanimentDao.deleteBySongId(id);
+		Integer categoriesId = sysMusicScore.getMusicScoreCategoriesId();
+		if(categoriesId != null && sysMusicScore.getClientType() == SMART_PRACTICE){
+			while (true){
+				SysMusicScoreCategories categories = sysMusicScoreCategoriesDao.get(categoriesId);
+				if(categories.getParentId() == 0){
+					Integer musicScoreNum = categories.getMusicScoreNum() - 1;
+					if(musicScoreNum < 0){
+						musicScoreNum = 0;
+					}
+					categories.setMusicScoreNum(musicScoreNum);
+					sysMusicScoreCategoriesDao.update(categories);
+					return;
+				}
+				categoriesId = categories.getParentId();
+			}
+		}
+	}
+
+	private String getParentTreeName(Integer categoriesId){
+		StringBuffer sb = new StringBuffer();
+		while (true){
+			SysMusicScoreCategories categories = sysMusicScoreCategoriesDao.get(categoriesId);
+			if(sb.length() == 0){
+				sb.append(categories.getName());
+			}else {
+				sb.insert(0,"/");
+				sb.insert(0,categories.getName());
+			}
+			if(categories.getParentId() == 0){
+				return sb.toString();
+			}
+			categoriesId = categories.getParentId();
+		}
+	}
+
+	@Override
+	public PageInfo<SysMusicScore> queryMusicScorePage(SysExamSongQueryInfo queryInfo) {
+		PageInfo<SysMusicScore> sysMusicScorePageInfo = queryPage(queryInfo);
+		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;
 	}
 }

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

@@ -522,7 +522,7 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 			dataList = teacherDao.queryMusicGroupStudentApply(params);
 			String paymentStatus = queryInfo.getPaymentStatus();
 			if(StringUtils.isNotEmpty(paymentStatus) && paymentStatus.equals("2")){
-				List<StudentPaymentOrder> studentPaymentOrders = studentPaymentOrderDao.findStudentPaymentOrder("MUSIC",queryInfo.getMusicGroupId());
+				List<StudentPaymentOrder> studentPaymentOrders = studentPaymentOrderDao.findStudentPaymentOrder(queryInfo.getMusicGroupId());
 				Map<Integer, List<StudentPaymentOrder>> collect = studentPaymentOrders.stream().collect(Collectors.groupingBy(StudentPaymentOrder::getUserId));
 				dataList.forEach(e->{
 					List<StudentPaymentOrder> paymentOrders = collect.get(e.getUserId());

+ 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

@@ -4076,4 +4076,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>

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

@@ -268,7 +268,8 @@
 		<include refid="global.limit"/>
 	</select>
 	<select id="findByIdList" resultMap="com.ym.mec.biz.dal.dao.CourseHomeworkDao.teacherHomeworkListDto">
-		SELECT id_ homework_id_,title_,content_,completed_num_,expect_num_,music_score_id_,expire_date_ expiry_date_,DATE_FORMAT(create_time_,'%Y-%m-%d') 'day_'
+		SELECT id_ homework_id_,title_,content_,completed_num_,expect_num_,music_score_id_,
+		       expire_date_ expiry_date_,DATE_FORMAT(create_time_,'%Y-%m-%d') 'day_'
 		FROM extracurricular_exercises WHERE id_ IN
 		<foreach collection="exercisesIdList" separator="," item="item" open="(" close=")">
 			#{item}

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

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.