Просмотр исходного кода

Merge remote-tracking branch 'origin/saas' into saas

hgw 4 лет назад
Родитель
Сommit
339a9eb3ce
100 измененных файлов с 2768 добавлено и 675 удалено
  1. 0 249
      cms/src/main/java/com/ym/mec/cms/service/SysConfigService.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. 6 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/filter/UsernameAuthenticationFilter.java
  5. 13 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/handler/TenantNotFoundException.java
  6. 1 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/PhoneAuthenticationProvider.java
  7. 5 5
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/service/DefaultUserDetailsService.java
  8. 1 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysUserService.java
  9. 18 12
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserDeviceServiceImpl.java
  10. 11 2
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserServiceImpl.java
  11. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/config/MecInstantiationAwareBeanPostProcessor.java
  12. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperAdjustLogDao.java
  13. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperDao.java
  14. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  15. 5 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/DegreeRegistrationDao.java
  16. 55 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/FinancialExpenditureDao.java
  17. 12 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LuckDrawLogDao.java
  18. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LuckDrawPrizeDao.java
  19. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/QuestionnaireUserResultDao.java
  20. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  21. 5 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysConfigDao.java
  22. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicScoreCategoriesDao.java
  23. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysTenantConfigDao.java
  24. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  25. 35 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityStudentAdjustDto.java
  26. 124 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityStudentDto.java
  27. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityUserMapperAddDto.java
  28. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/BasicUserDto.java
  29. 26 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OaColumnDto.java
  30. 25 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OaFormStructureDto.java
  31. 56 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OaInputDto.java
  32. 93 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PWorkOrderInfo.java
  33. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PageInfoDegree.java
  34. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PracticeBuyResultDto.java
  35. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/QuestionnaireResultDto.java
  36. 11 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceDto.java
  37. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ActivityUserMapper.java
  38. 146 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ActivityUserMapperAdjustLog.java
  39. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  40. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/DegreeRegistration.java
  41. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/DemoGroup.java
  42. 54 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/FinancialExpenditure.java
  43. 11 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/PracticeGroup.java
  44. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPreRegistration.java
  45. 50 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScore.java
  46. 33 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScoreAccompaniment.java
  47. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScoreCategories.java
  48. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroup.java
  49. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroupActivity.java
  50. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExpenditureTypeEnum.java
  51. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/FeeProjectEnum.java
  52. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/GroupType.java
  53. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/QuestionnaireActiveTypeEnum.java
  54. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ReturnFeeEnum.java
  55. 37 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/UnitEnum.java
  56. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ActivityStudentQueryInfo.java
  57. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/DegreeQueryInfo.java
  58. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/LuckDrawQueryInfo.java
  59. 68 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentActivityQueryInfo.java
  60. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/event/TenantConfigChangeEvent.java
  61. 46 0
      mec-biz/src/main/java/com/ym/mec/biz/event/listener/TenantConfigListener.java
  62. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperAdjustLogService.java
  63. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperService.java
  64. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  65. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java
  66. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/EduPracticeGroupService.java
  67. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/service/FinancialExpenditureService.java
  68. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/GoodsService.java
  69. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/service/GroupClassService.java
  70. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/IndexBaseMonthDataService.java
  71. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/service/LuckDrawLogService.java
  72. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  73. 8 8
      mec-biz/src/main/java/com/ym/mec/biz/service/PracticeGroupService.java
  74. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/service/QuestionnaireUserResultService.java
  75. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentAttendanceService.java
  76. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  77. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  78. 58 38
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  79. 7 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SysTenantConfigService.java
  80. 0 11
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherCourseScheduleService.java
  81. 1 2
      mec-biz/src/main/java/com/ym/mec/biz/service/UploadFileService.java
  82. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java
  83. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperAdjustLogServiceImpl.java
  84. 192 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperServiceImpl.java
  85. 21 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  86. 45 14
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  87. 87 160
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  88. 18 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/DegreeRegistrationServiceImpl.java
  89. 8 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/DemoGroupServiceImpl.java
  90. 31 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EduPracticeGroupServiceImpl.java
  91. 322 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/FinancialExpenditureServiceImpl.java
  92. 6 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/GoodsServiceImpl.java
  93. 130 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/GroupClassServiceImpl.java
  94. 17 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  95. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/LuckDrawLogServiceImpl.java
  96. 38 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/LuckDrawPrizeServiceImpl.java
  97. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java
  98. 266 64
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  99. 13 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectPlanServiceImpl.java
  100. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OnlineMusicGroupServiceImpl.java

+ 0 - 249
cms/src/main/java/com/ym/mec/cms/service/SysConfigService.java

@@ -6,255 +6,6 @@ import com.ym.mec.common.service.BaseService;
 
 public interface SysConfigService extends BaseService<Long, SysConfig> {
 
-    public static final String BASE_API_URL = "base_api_url";
-
-    /**
-     * 缴费状态提前{}天刷新
-     */
-    public static final String REFRESH_PAYMENT_STATUS_EARLY_DAYS = "refresh_payment_status_early_days";
-
-    /**
-     * VIP课结束后,用户可申诉时间,为课程结束后的{}天
-     */
-    public static final String VIP_APPEAL_DAYS_RANGE = "vip_appeal_days_range";
-
-    /**
-     * 线下课最早打卡时间可提前分钟数
-     */
-    String OFFLINE_SIGN_IN_EARLY_FORWARD_TIME = "offline_sign_in_early_forward_time";
-
-    /**
-     * 老师正常打卡时间,为课程当天,距离开课时间前{}分钟
-     */
-    public static final String ADVANCE_SIGN_IN_MINUTES = "advance_sign_in_minutes";
-
-    String ADVANCE_SIGN_OUT_MINUTES = "advance_sign_out_minutes";
-
-    /**
-     * 老师可以打卡范围,为教学定位方圆{}米
-     */
-    public static final String ATTENDANCE_RANGE = "attendance_range";
-
-    String ATTENDANCE_RANGE_VIP = "attendance_range_vip";
-
-    /**
-     * 学生允许请假的时间,为开课前{}小时
-     */
-    public static final String ADVANCE_LEAVE_HOURS = "advance_leave_hours";
-
-    /**
-     * 最早请假提前时间
-     */
-    String EARLIEST_TIME_FOR_LEAVE="earliest_time_for_leave";
-
-    String ENABLE_TEACHER_COURSE_ADJUST_DEFAULT_HOURS = "enable_teacher_course_adjust_default_hours";
-
-    /**
-     * 单技课梯度结算规则设置
-     */
-    public static final String SIGLE_GRADIENT_SETTLEMENT_RULE = "sigle_gradient_settlement_rule";
-
-    /**
-     * 合奏课梯度结算规则设置
-     */
-    public static final String MAX_GRADIENT_SETTLEMENT_RULE = "max_gradient_settlement_rule";
-
-    /**
-     * 小班课梯度结算规则设置
-     */
-    public static final String HIGH_GRADIENT_SETTLEMENT_RULE = "high_gradient_settlement_rule";
-
-    /**
-     * 如果没有签退,{}分钟后自动发送推送信息
-     */
-    public static final String SIGN_OUT_MESSAGE_PUSH_MINUTE = "sign_out_message_push_minute";
-
-    /**
-     * 试听课默认单节课时长
-     */
-    String DEMO_GROUP_SINGLE_CLASS_MINUTES_ = "demo_group_single_class_minutes_";
-    String USER_DEFAULT_HEAD_URL = "user_default_head_url";
-    String STUDENT_APPLY_URL = "student_apply_url";
-    String SERVER_PHONE = "server_phone";
-
-    String MUSIC_GROUP_SETTLEMENT_CLASS_MINUTES = "music_group_settlement_class_minutes";
-
-    String MUSIC_GROUP_SETTLEMENT_DAY = "music_group_settlement_day";
-
-    String MUSIC_GROUP_SETTLEMENT_SINGLE_CLASS_MINUTES = "music_group_settlement_single_class_minutes";
-
-    String REFUND_PERIOD = "refund_period";
-
-    /**
-     * 可签退时间限制(自然天)
-     */
-    String ENABLE_SIGN_OUT_TIME_RANGE = "enable_sign_out_time_range";
-
-    /**
-     * 可更新学生签到状态时间限制,课程结束后{}分钟
-     */
-    String ENABLE_STUDENT_ATTENDANCE_TIME_RANGE = "enable_student_attendance_time_range";
-
-    /**
-     * vip课程可更新学生签到状态时间限制,课程结束后{}分钟
-     */
-    String ENABLE_STUDENT_ATTENDANCE_TIME_RANGE_VIP = "enable_student_attendance_time_range_vip";
-
-    String ENABLE_STUDENT_ATTENDANCE_BEFOR_COURSE_START_TIME_RANGE_VIP = "enable_student_attendance_befor_course_start_time_range_vip";
-
-    /**
-     * @describe 陪练课课酬
-     */
-    String PRACTICE_COURSE_SALARY = "practice_course_salary";
-
-    /**
-     * @describe 陪练课时长
-     */
-    String PRACTICE_COURSE_MINUTES = "practice_course_minutes";
-
-    /**
-     * @describe 陪练课预约开始时间
-     */
-    String PRACTICE_APPLY_START_TIME = "practice_apply_start_time";
-
-    /**
-     * @describe 陪练课预约结束时间
-     */
-    String PRACTICE_APPLY_END_TIME = "practice_apply_end_time";
-
-    /**
-     * @describe 陪练课预约时间间隔
-     */
-    String PRACTICE_APPLY_INTERVAL_TIME = "practice_apply_interval_time";
-
-    /**
-     * @describe 陪练课可预约声部列表
-     */
-    String PRACTICE_SUBJECT_ID_LIST = "practice_subject_id_list";
-
-    /**
-     * @describe 教师请假数据
-     */
-    String TEACHER_LEAVE_DATA = "teacher_leave_data";
-
-    /**
-     * 十分钟内最大可发送的短信次数
-     */
-    String SMS_MAX_TIMES = "sms_max_times";
-
-    /**
-     * 连堂课间隔时间
-     */
-    String ONLINE_CONTINUE_COURSE_TIME = "online_continue_course_time";
-
-    /**
-     * 连堂课间隔时间
-     */
-    String AUTO_CLOSE_NETWORK_ROOM = "auto_close_network_room";
-
-    /**
-     * @describe 付费陪练课可购买最大月数
-     */
-    String PRACTICE_PAY_MAX_MONTH = "practice_pay_max_month";
-
-    /**
-     * @describe 付费陪练课单月上课数量
-     */
-    String PRACTICE_PAY_DRILL_TIMES_ON_ONE_WEEK = "practice_pay_drill_times_on_one_week";
-
-    /**
-     * @describe 付费陪练课活动截至日期
-     */
-    String PRACTICE_BUY_ACTIVITY_EXPIRE_DATE = "practice_buy_activity_expire_date";
-
-    /**
-     * 陪练老师端入口地址
-     */
-    String TEACHER_STUDY_REPORT_URL = "teacher_study_report_url";
-
-    /**
-     * 陪练课报告地址
-     */
-    String STUDENT_STUDY_REPORT_URL = "student_study_report_url";
-
-    /**
-     * @describe 陪练课续费地址
-     */
-    String PRACTICE_RENEW_URL = "practice_renew_url";
-
-    /**
-     * @describe 老师端baseUrl
-     */
-    String TEACHER_BASE_URL = "teacher_base_url";
-
-    String COURSE_BEFORE_BUFFER_TIME = "course_before_buffer_time";
-
-    String COURSE_AFTER_BUFFER_TIME = "course_after_buffer_time";
-
-    String PRACTICE_PROMOTION_ACTIVITY_START_DATE = "practice_promotion_activity_start_date";
-
-    String NEW_MSG_PUSH = "您收到一条训练回复,请点击查看";
-
-    /**
-     * @describe 教务端baseUrl
-     */
-    String EDU_TEACHER_BASE_URL = "edu_teacher_base_url";
-
-    String HOLIDAY_SETTING = "holiday_setting";
-
-    String PRACTICE_FREE_APPLY_EXPIRE_DATE = "practice_free_apply_expire_date";
-    
-    String START_TIME_OF_1111 = "start_time_of_1111";
-    
-    String END_TIME_OF_1111 = "end_time_of_1111";
-
-    String VIP_SPECIAL_ACTIVITY_IDS = "vip_special_activity_ids";
-
-    String DAYA_BASE_SALARY_AMOUNT = "daya_base_salary_amount";
-
-    String WARNING_MIN_COURSE_SALARY = "warning_min_course_salary";
-
-    //提醒乐团主管排下学期的课程的时间节点(默认提前14天)
-    String REMIND_COURSE_TIME = "remind_course_time";
-
-    //会员结束前15天提醒学员续费(默认提前15天)
-    String PUSH_MEMBER_RENEW = "push_member_renew";
-
-    //试用会员结束前3天提醒学员续费(默认提前3天)
-    String EXPERIENCE_PUSH_MEMBER_RENEW = "experience_push_member_renew";
-
-    //会员结束前15天自动创建乐团续费(默认提前15天)
-    String AUTO_CREATE_MEMBER_RENEW = "auto_create_member_renew";
-
-    //会员结束前15天提醒学员续费(默认提前5天)
-    String PUSH_MEMBER_RENEW_AGAIN = "push_member_renew_again";
-
-    //会员结束前5天提醒学员续费(退团提醒)(默认提前5天)
-    String PUSH_MEMBER_RENEW_QUIT = "push_member_renew_quit";
-
-    String CHILDREN_DAY_VIP_ACTIVITY_IDS = "children_day_vip_activity_ids";
-
-    //云教练作业开关0关1开
-    String HOMEWORK_OPEN_FLAG = "homework_open_flag";
-
-    //云教练免费体验开关0关1开
-    String FREE_CLOUD_OPEN_FLAG = "free_cloud_open_flag";
-
-    //乐团问卷调查编号
-    String MUSIC_GROUP_TOPIC_ID = "music_group_topic_id";
-
-    //云教练试用时间最晚截止时间
-    String EXPERIENCE_MEMBERSHIP_END_TIME = "experience_membership_end_time";
-
-    //云教练训练时长小于80分钟需要回访
-    String STUDENT_CLOUD_TEACHER_TOTAL_PLAY_TIME = "student_cloud_teacher_total_play_time";
-
-    //云教练训练次数小于4次需要回访
-    String STUDENT_CLOUD_TEACHER_TRAIN_NUM = "student_cloud_teacher_train_num";
-
-    //云教练活动分部目标JSON
-    String CLOUD_TEACHER_ACTIVE_TARGET = "cloud_teacher_active_target";
-
     //云教练活动开屏广告编号
     String CLOUD_TEACHER_ACTIVE_BANNER_IDS = "cloud_teacher_active_banner_ids";
 

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

+ 6 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/filter/UsernameAuthenticationFilter.java

@@ -7,6 +7,8 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import com.ym.mec.auth.core.handler.TenantNotFoundException;
+import com.ym.mec.common.exception.BizException;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.security.authentication.AuthenticationServiceException;
 import org.springframework.security.authentication.LockedException;
@@ -73,6 +75,10 @@ public class UsernameAuthenticationFilter extends AbstractAuthenticationProcessi
 		if (userInfo == null) {
 			throw new UsernameNotFoundException("404.9");
 		}
+		Integer tenantId = userInfo.getSysUser().getTenantId();
+		if (tenantId == null || tenantId == 0) {
+			throw new TenantNotFoundException("机构信息异常,请联系管理员");
+		}
 	
 //		if (userInfo.getSysUser().getUserType() != SysUserType.SYSTEM && !StringUtils.equalsIgnoreCase(clientId, userInfo.getSysUser().getUserType().getCode())) {
 //			throw new LockedException("登录失败");

+ 13 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/handler/TenantNotFoundException.java

@@ -0,0 +1,13 @@
+package com.ym.mec.auth.core.handler;
+
+import org.springframework.security.core.AuthenticationException;
+
+public class TenantNotFoundException extends AuthenticationException {
+    public TenantNotFoundException(String msg, Throwable t) {
+        super(msg, t);
+    }
+
+    public TenantNotFoundException(String msg) {
+        super(msg);
+    }
+}

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

+ 5 - 5
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/service/DefaultUserDetailsService.java

@@ -2,6 +2,7 @@ package com.ym.mec.auth.core.provider.service;
 
 import com.ym.mec.auth.api.dto.SysUserInfo;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.auth.core.handler.TenantNotFoundException;
 import com.ym.mec.auth.service.SysUserService;
 import com.ym.mec.common.security.AuthUser;
 import com.ym.mec.common.security.SecurityConstants;
@@ -14,7 +15,6 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
@@ -24,9 +24,6 @@ import java.util.List;
 public class DefaultUserDetailsService implements UserDetailsService {
 
 	@Autowired
-	private PasswordEncoder passwordEncoder;
-
-	@Autowired
 	private SysUserService sysUserService;
 
 	private final String BCRYPT = "{bcrypt}";
@@ -36,7 +33,6 @@ public class DefaultUserDetailsService implements UserDetailsService {
 		if (StringUtils.isBlank(username)) {
 			return null;
 		}
-
 		SysUserInfo userInfo = null;
 
 		if (StringUtils.startsWith(username, SecurityConstants.PHONE_PRINCIPAL_PREFIX)) {
@@ -51,6 +47,10 @@ public class DefaultUserDetailsService implements UserDetailsService {
 		} else if (userInfo.getSysUser().getLockFlag() == 9) {
 			throw new LockedException("账户被锁定");
 		}
+		Integer tenantId = userInfo.getSysUser().getTenantId();
+		if (tenantId == null || tenantId == 0) {
+			throw new TenantNotFoundException("机构信息异常,请联系管理员");
+		}
 
 		List<GrantedAuthority> authorities = null;
 

+ 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

+ 18 - 12
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserDeviceServiceImpl.java

@@ -1,26 +1,28 @@
 package com.ym.mec.auth.service.impl;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.stereotype.Service;
-
 import com.ym.mec.auth.api.entity.SysUserDevice;
 import com.ym.mec.auth.dal.dao.SysUserDeviceDao;
 import com.ym.mec.auth.service.SysUserDeviceService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.web.WebFeignService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 public class SysUserDeviceServiceImpl extends BaseServiceImpl<Integer, SysUserDevice>  implements SysUserDeviceService {
 	
 	@Autowired
 	private SysUserDeviceDao sysUserDeviceDao;
+	@Autowired
+	private WebFeignService webFeignService;
 
 	@Override
 	public BaseDAO<Integer, SysUserDevice> getDAO() {
@@ -39,7 +41,6 @@ public class SysUserDeviceServiceImpl extends BaseServiceImpl<Integer, SysUserDe
 
 	@Override
 	public boolean bindDevice(String clientId, Integer userId, String deviceNum) {
-
 		if (StringUtils.equals(clientId, "STUDENT")) {
 			// 检查学生是否绑定了多个设备号
 			List<SysUserDevice> studentDeviceList = queryByUserId(clientId, userId);
@@ -54,7 +55,6 @@ public class SysUserDeviceServiceImpl extends BaseServiceImpl<Integer, SysUserDe
 				if (deviceList.size() >= 5) {
 					throw new BadCredentialsException("当前账号绑定设备过多,请联系主教老师");
 				}
-
 				SysUserDevice sysUserDevice = new SysUserDevice();
 				sysUserDevice.setUserId(userId);
 				sysUserDevice.setDeviceNum(deviceNum);
@@ -63,6 +63,12 @@ public class SysUserDeviceServiceImpl extends BaseServiceImpl<Integer, SysUserDe
 				sysUserDeviceDao.insert(sysUserDevice);
 			}
 		} else {
+			if(StringUtils.equals(clientId, "TEACHER")){
+
+			}
+			if(StringUtils.equals(clientId, "SYSTEM")){
+
+			}
 			// 查询设备号是否已存在
 			List<SysUserDevice> sysUserDeviceList = sysUserDeviceDao.queryByDeviceNum(null, deviceNum);
 

+ 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/config/MecInstantiationAwareBeanPostProcessor.java

@@ -0,0 +1,13 @@
+package com.ym.mec.biz.dal.config;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
+
+public class MecInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
+
+    @Override
+    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException{
+
+        return true;
+    }
+}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@@ -2,6 +2,9 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.entity.SysConfig;
 import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface SysConfigDao extends BaseDAO<Long, SysConfig> {
 
@@ -20,5 +23,6 @@ public interface SysConfigDao extends BaseDAO<Long, SysConfig> {
      * @return
      */
     String findConfigValue(String paramName);
-	
+
+    void batchUpdate(@Param("configList") List<SysConfig> configList);
 }

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

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

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

@@ -18,4 +18,6 @@ public interface SysTenantConfigDao extends BaseDAO<Integer, SysTenantConfig> {
     void batchInsert(@Param("sysConfigs") List<SysConfig> sysConfigs, @Param("tenantId") Integer tenantId);
 
     String getConfigValue(@Param("paramName") String paramName, @Param("tenantId") Integer tenantId);
+
+    List<Map<String, String>> queryAllMap(@Param("tenantId") Integer tenantId);
 }

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

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

@@ -38,6 +38,16 @@ public class BasicUserDto {
 
     private String subjectIdList;
 
+    private Integer tenantId;
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
     public Integer getMemberRankSettingId() {
         return memberRankSettingId;
     }

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

+ 11 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceDto.java

@@ -2,10 +2,7 @@ package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
-import com.ym.mec.biz.dal.enums.CourseStatusEnum;
-import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.enums.*;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.util.Date;
@@ -42,6 +39,8 @@ public class TeacherAttendanceDto {
 
     private CourseSchedule.CourseScheduleType courseType;
 
+    private TeachModeEnum teachMode;
+
     @ApiModelProperty(value = "乐团ID",required = false)
     private String musicGroupId;
 
@@ -112,6 +111,14 @@ public class TeacherAttendanceDto {
     @ApiModelProperty(value = "课程规划")
     private String coursePlan;
 
+    public TeachModeEnum getTeachMode() {
+        return teachMode;
+    }
+
+    public void setTeachMode(TeachModeEnum teachMode) {
+        this.teachMode = teachMode;
+    }
+
     public String getCoursePlan() {
         return coursePlan;
     }

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

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

@@ -188,6 +188,16 @@ public class CourseSchedule {
 	//课程调整不的超过该时间限制
 	private Date validEndTime;
 
+	private Integer tenantId;
+
+	public Integer getTenantId() {
+		return tenantId;
+	}
+
+	public void setTenantId(Integer tenantId) {
+		this.tenantId = tenantId;
+	}
+
 	public Date getValidStartTime() {
 		return validStartTime;
 	}

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

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

@@ -42,6 +42,16 @@ public class DemoGroup {
 	@ApiModelProperty(value = "科目名称")
 	private String subjectName;
 
+	private Integer tenantId;
+
+	public Integer getTenantId() {
+		return tenantId;
+	}
+
+	public void setTenantId(Integer tenantId) {
+		this.tenantId = tenantId;
+	}
+
 	public String getSubjectName() {
 		return subjectName;
 	}

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

+ 11 - 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;
@@ -93,6 +93,16 @@ public class PracticeGroup {
 	@ApiModelProperty(value = "总金额",required = false)
 	private BigDecimal totalPrice = BigDecimal.ZERO;
 
+	private Integer tenantId;
+
+	public Integer getTenantId() {
+		return tenantId;
+	}
+
+	public void setTenantId(Integer tenantId) {
+		this.tenantId = tenantId;
+	}
+
 	public Integer getActivityUserMapperId() {
 		return activityUserMapperId;
 	}

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

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

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

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

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

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

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

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

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

@@ -141,6 +141,16 @@ public class VipGroup {
 
 	private int enableDelete;
 
+	private Integer tenantId;
+
+	public Integer getTenantId() {
+		return tenantId;
+	}
+
+	public void setTenantId(Integer tenantId) {
+		this.tenantId = tenantId;
+	}
+
 	public Integer getEnableDelete() {
 		return enableDelete;
 	}

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

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

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

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

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

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

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

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

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

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

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

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

+ 37 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/UnitEnum.java

@@ -0,0 +1,37 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+/**
+ * 审核状态枚举(元、%)
+ */
+public enum UnitEnum implements BaseEnum<String, UnitEnum> {
+	PERCENTAGE("PERCENTAGE", "审核中"),
+	YUAN("YUAN", "元");
+
+	private String code;
+
+	private String msg;
+
+	UnitEnum(String code, String msg) {
+		this.code = code;
+		this.msg = msg;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+	@Override
+	public String getCode() {
+		return this.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;
+    }
+}

+ 24 - 0
mec-biz/src/main/java/com/ym/mec/biz/event/TenantConfigChangeEvent.java

@@ -0,0 +1,24 @@
+package com.ym.mec.biz.event;
+
+import org.springframework.context.ApplicationEvent;
+
+public class TenantConfigChangeEvent extends ApplicationEvent {
+    private Integer tenantId;
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public TenantConfigChangeEvent(Object source,Integer tenantId) {
+        super(source);
+        this.tenantId = tenantId;
+    }
+
+    public TenantConfigChangeEvent(Object source) {
+        super(source);
+    }
+}

+ 46 - 0
mec-biz/src/main/java/com/ym/mec/biz/event/listener/TenantConfigListener.java

@@ -0,0 +1,46 @@
+package com.ym.mec.biz.event.listener;
+
+import com.ym.mec.biz.dal.dao.TenantInfoDao;
+import com.ym.mec.biz.dal.entity.TenantInfo;
+import com.ym.mec.biz.event.TenantConfigChangeEvent;
+import com.ym.mec.biz.service.SysTenantConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationListener;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Component
+public class TenantConfigListener implements ApplicationListener<TenantConfigChangeEvent> {
+
+    @Autowired
+    private SysTenantConfigService sysTenantConfigService;
+    @Autowired
+    private TenantInfoDao tenantInfoDao;
+
+    @Override
+    public void onApplicationEvent(TenantConfigChangeEvent event) {
+        if(event.getTenantId() != null){
+            TenantInfo tenantInfo = tenantInfoDao.selectByPrimaryKey(event.getTenantId());
+            if(tenantInfo != null){
+                ConcurrentHashMap<Integer, ConcurrentHashMap<String, String>> allTenantConfig = sysTenantConfigService.getAllTenantConfig();
+                allTenantConfig.put(tenantInfo.getId(),sysTenantConfigService.queryAllMap(tenantInfo.getId()));
+                sysTenantConfigService.setTenantConfig(allTenantConfig);
+            }
+        }else {
+            Map<String,Object> paramMap = new HashMap<>(1);
+            paramMap.put("state",1);
+            List<TenantInfo> tenantInfos = tenantInfoDao.queryList(paramMap);
+            if(tenantInfos != null && tenantInfos.size() > 0){
+                ConcurrentHashMap<Integer,ConcurrentHashMap<String,String>> tenantConfig = new ConcurrentHashMap<>(tenantInfos.size());
+                for (TenantInfo tenantInfo : tenantInfos) {
+                    tenantConfig.put(tenantInfo.getId(),sysTenantConfigService.queryAllMap(tenantInfo.getId()));
+                }
+                sysTenantConfigService.setTenantConfig(tenantConfig);
+            }
+        }
+    }
+}

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

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

@@ -153,7 +153,7 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	 * @Date: 2019/9/17
 	 * 根据日期获取当日排课信息
 	 */
-	List<CourseScheduleDto> getTeacherCourseSchedulesWithDate(Integer userId, Date classDate, String type);
+	List<CourseScheduleDto> getTeacherCourseSchedulesWithDate(Integer userId, Date classDate, String type,Integer tenantId);
 
 	/**
 	 * @describe 根据日期获取

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

@@ -52,7 +52,7 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
      * @return void
      * @describe 教师vip课课酬结算
      */
-    void teacherSalarySettlement();
+    void teacherSalarySettlement(Integer tenantId);
 
     /**
      * @Author: Joburgess
@@ -61,7 +61,7 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
      * @return void
      * @describe 教师陪练课课酬结算
      */
-    void practiceTeacherSalarySettlement();
+    void practiceTeacherSalarySettlement(Integer tenantId);
 
     /**
      * @describe 教师乐团课课酬结算
@@ -69,7 +69,7 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
      * @date 2019/11/3
      * @return void
      */
-    void musicGroupTeacherSalarySettlement();
+    void musicGroupTeacherSalarySettlement(Integer tenantId);
 
     /**
      * 获取教师薪酬列表

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

@@ -51,7 +51,7 @@ public interface EduPracticeGroupService {
      * @param userId: 用户编号
      * @return java.util.Map
      */
-    Map getTrialPracticeApplyParams(Integer userId);
+    Map getTrialPracticeApplyParams(Integer userId,Integer tenantId);
 
     /**
      * @describe 获取可以指派试听课的老师列表

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

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

@@ -78,7 +78,7 @@ public interface GoodsService extends BaseService<Integer, Goods> {
      * @time 11:30
      * @return void
      */
-    void repertoryWarn();
+    void repertoryWarn(Integer tenantId);
 
     /**
      * @describe 给超售商品分配批次

+ 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

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

@@ -32,7 +32,7 @@ public interface IndexBaseMonthDataService extends BaseService<Long, IndexBaseMo
      * @param organIds
      * @return
      */
-    List<IndexErrInfoDto> getRemindMatterData(String organIds);
+    List<IndexErrInfoDto> getRemindMatterData(String organIds,Integer tenantId);
 
     /**
      * 是否有提醒事项

+ 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);
 
 	/**
 	 *  续费

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

@@ -59,7 +59,7 @@ public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {
      * @param userId: 用户编号
      * @return java.util.Map
      */
-    Map getPracticeApplyParams(Integer userId);
+    Map getPracticeApplyParams(Integer userId,Integer tenantId);
 
     /**
      * @describe 获取陪练课可预约声部
@@ -68,7 +68,7 @@ public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {
      * @param :
      * @return com.ym.mec.common.entity.HttpResponseResult
      */
-	Object getPracticeApplySubjects();
+	Object getPracticeApplySubjects(Integer tenantId);
 
     /**
      * @describe 获取可以预约的教师
@@ -110,10 +110,10 @@ public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {
      * @param endDay: 天数
      * @return java.util.Map
      */
-	List<Date> getEnableApplyDates(Date startDay,Date endDay);
+	List<Date> getEnableApplyDates(Date startDay,Date endDay,Integer tenantId);
 
 
-	List<Date> getEnableApplyDatesIncludeAllTimes(Date startDay,Date endDay);
+	List<Date> getEnableApplyDatesIncludeAllTimes(Date startDay,Date endDay,Integer tenantId);
 
 	/**
 	 * @describe 陪练课预约
@@ -163,7 +163,7 @@ public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {
      * @param userId: 用户编号
      * @return java.util.Map
      */
-    Map getPayPracticeApplyParams(Integer userId, Integer organId);
+    Map getPayPracticeApplyParams(Integer userId, Integer organId, Integer tenantId);
 
 	/**
 	 * @describe 获取可以预约的教师——付费
@@ -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);
 }

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

@@ -56,7 +56,7 @@ public interface StudentAttendanceService extends BaseService<Long, StudentAtten
 	 * @param remark 请假理由
 	 * @return
 	 */
-	boolean leave(Integer userId, Long courseScheduleId, String remark);
+	boolean leave(Integer userId, Long courseScheduleId, String remark,Integer tenantId);
 
 	/**
 	 * @describe 历史考勤详情

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

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

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

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

+ 58 - 38
mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java

@@ -3,6 +3,8 @@ package com.ym.mec.biz.service;
 import com.ym.mec.biz.dal.entity.SysConfig;
 import com.ym.mec.common.service.BaseService;
 
+import java.util.List;
+
 public interface SysConfigService extends BaseService<Long, SysConfig> {
     //乐团基础规则
 
@@ -18,6 +20,58 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     String MUSIC_GROUP_TOPIC_ID = "music_group_topic_id";
     //自动确认收货时间
     String AUTO_AFFIRM_RECEIVE_TIME = "music_group_topic_id";
+    //各声部不购买会员入团资格限制学员数
+    String MEMBER_GROUP_FEE_STUDENT_NUM = "member_group_fee_student_num";
+    //会员团每学期赠送课程分钟数
+    String MEMBER_GROUP_TERM_GIVE_COURSE_TIME = "member_group_term_give_course_time";
+    //提醒老师创建新的缴费项目,距离缴费项有效期前{}天
+    String PUSH_CREATE_PAYMENT_CALENDER = "push_create_payment_calender";
+    //线下课老师可以打卡范围,GPS定位距离教学点距离
+    String ATTENDANCE_RANGE = "attendance_range";
+    //线下课定位异常扣除金额
+    String OFFLINE_GPS_ERROR_CUT_SALARY = "offline_gps_error_cut_salary";
+    //线下课定位异常扣除金额
+    String OFFLINE_GPS_ERROR_CUT_SALARY_UNIT = "offline_gps_error_cut_salary_unit";
+    //试用期老师课酬发放百分比
+    String PROBATION_TEACHER_SALARY = "probation_teacher_salary";
+    //兼职老师考勤申诉时间限制
+    String PARP_TEACHER_SALARY = "probation_teacher_salary";
+    //兼职老师考勤申诉时间限制方式(1、固定时间、2、固定日期)
+    String PARP_TEACHER_SALARY_TYPE = "parp_teacher_salary_type";
+    //全职老师考勤申诉时间限制
+    String FULL_TEACHER_SALARY = "full_teacher_salary";
+    //全职老师考勤申诉时间限制方式(1、固定时间、2、固定日期)
+    String FULL_TEACHER_SALARY_TYPE = "full_teacher_salary_type";
+    //劳务考勤申诉时间限制
+    String LABOUR_TEACHER_SALARY = "labour_teacher_salary";
+    //劳务考勤申诉时间限制方式(1、固定时间、2、固定日期)
+    String LABOUR_TEACHER_SALARY_TYPE = "labour_teacher_salary_type";
+    //线上连堂课间隔时间
+    String ONLINE_CONTINUE_COURSE_TIME = "online_continue_course_time";
+    //线上连堂课间隔时间
+    String OFFLINE_CONTINUE_COURSE_MINUTES = "offline_continue_course_minutes";
+    //陪练课可选老师的分部
+    String PRACTICE_TEACHER_ORGAN_RANGE = "practice_teacher_organ_range";
+    //陪练课可预约声部列表
+    String PRACTICE_SUBJECT_ID_LIST = "practice_subject_id_list";
+    //陪练课预约开始时间
+    String PRACTICE_APPLY_START_TIME = "practice_apply_start_time";
+    //陪练课预约结束时间
+    String PRACTICE_APPLY_END_TIME = "practice_apply_end_time";
+    //试听课默认单节课时长
+    String DEMO_GROUP_SINGLE_CLASS_MINUTES_ = "demo_group_single_class_minutes_";
+    //学生允许请假的时间,为开课前{}小时
+    String ADVANCE_LEAVE_HOURS = "advance_leave_hours";
+    //教师可调整课程默认时间,开课前{}小时
+    String ENABLE_TEACHER_COURSE_ADJUST_DEFAULT_HOURS = "enable_teacher_course_adjust_default_hours";
+    //内部库存预警值
+    String INNER_REPERTORY_WARN_NUM = "inner_repertory_warn_num";
+    //外部库存预警值
+    String OUTER_REPERTORY_WARN_NUM = "outer_repertory_warn_num";
+    //库存预警手机号
+    String REPERTORY_WARN_PHONE = "repertory_warn_phone";
+    //退款周期
+    String REFUND_PERIOD = "refund_period";
 
     public static final String BASE_API_URL = "base_api_url";
 
@@ -44,23 +98,10 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     String ADVANCE_SIGN_OUT_MINUTES = "advance_sign_out_minutes";
 
     /**
-     * 老师可以打卡范围,为教学定位方圆{}米
-     */
-    public static final String ATTENDANCE_RANGE = "attendance_range";
-
-    String ATTENDANCE_RANGE_VIP = "attendance_range_vip";
-
-    /**
-     * 学生允许请假的时间,为开课前{}小时
-     */
-    public static final String ADVANCE_LEAVE_HOURS = "advance_leave_hours";
-
-    /**
      * 最早请假提前时间
      */
     String EARLIEST_TIME_FOR_LEAVE="earliest_time_for_leave";
 
-    String ENABLE_TEACHER_COURSE_ADJUST_DEFAULT_HOURS = "enable_teacher_course_adjust_default_hours";
 
     /**
      * 单技课梯度结算规则设置
@@ -82,10 +123,6 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
      */
     public static final String SIGN_OUT_MESSAGE_PUSH_MINUTE = "sign_out_message_push_minute";
 
-    /**
-     * 试听课默认单节课时长
-     */
-    String DEMO_GROUP_SINGLE_CLASS_MINUTES_ = "demo_group_single_class_minutes_";
     String USER_DEFAULT_HEAD_URL = "user_default_head_url";
     String STUDENT_APPLY_URL = "student_apply_url";
     String SERVER_PHONE = "server_phone";
@@ -96,8 +133,6 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
 
     String MUSIC_GROUP_SETTLEMENT_SINGLE_CLASS_MINUTES = "music_group_settlement_single_class_minutes";
 
-    String REFUND_PERIOD = "refund_period";
-
     /**
      * 可签退时间限制(自然天)
      */
@@ -126,26 +161,11 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     String PRACTICE_COURSE_MINUTES = "practice_course_minutes";
 
     /**
-     * @describe 陪练课预约开始时间
-     */
-    String PRACTICE_APPLY_START_TIME = "practice_apply_start_time";
-
-    /**
-     * @describe 陪练课预约结束时间
-     */
-    String PRACTICE_APPLY_END_TIME = "practice_apply_end_time";
-
-    /**
      * @describe 陪练课预约时间间隔
      */
     String PRACTICE_APPLY_INTERVAL_TIME = "practice_apply_interval_time";
 
     /**
-     * @describe 陪练课可预约声部列表
-     */
-    String PRACTICE_SUBJECT_ID_LIST = "practice_subject_id_list";
-
-    /**
      * @describe 教师请假数据
      */
     String TEACHER_LEAVE_DATA = "teacher_leave_data";
@@ -155,10 +175,6 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
      */
     String SMS_MAX_TIMES = "sms_max_times";
 
-    /**
-     * 连堂课间隔时间
-     */
-    String ONLINE_CONTINUE_COURSE_TIME = "online_continue_course_time";
 
     /**
      * 连堂课间隔时间
@@ -271,4 +287,8 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
      * @describe 根据配置名称获取配置信息
      */
     SysConfig findByParamName(String paramName);
+
+    void batchUpdate(List<SysConfig> configList);
+
+    void updateConfig(SysConfig config);
 }

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

@@ -3,15 +3,21 @@ package com.ym.mec.biz.service;
 import com.ym.mec.biz.dal.entity.SysConfig;
 import com.ym.mec.biz.dal.entity.SysTenantConfig;
 import com.ym.mec.common.service.BaseService;
-import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 public interface SysTenantConfigService extends BaseService<Integer, SysTenantConfig> {
+    void setTenantConfig(ConcurrentHashMap<Integer,ConcurrentHashMap<String,String>> tenantConfig);
+
+    String getTenantConfigValue(String paramName, Integer tenantId);
+
+    ConcurrentHashMap<Integer,ConcurrentHashMap<String,String>> getAllTenantConfig();
 
     List<SysConfig> queryAll(Map<String, Object> params);
 
     void batchUpSet(List<SysConfig> sysConfigs, Integer tenantId);
 
+    ConcurrentHashMap<String, String> queryAllMap(Integer tenantId);
 }

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

@@ -24,17 +24,6 @@ public interface TeacherCourseScheduleService {
     List<Date> findTeacherHaveClassesDates(Integer teacherId, Date month, String groupId, GroupType groupType);
 
     /**
-     * @describe 获取老师在指定日期的课程列表
-     * @author Joburgess
-     * @date 2020/3/10
-     * @param teacherId: 教师编号
-     * @param classDate: 上课日期
-     * @param groupType: 课程组类型
-     * @return java.util.List<com.ym.mec.biz.dal.dto.CourseScheduleDto>
-     */
-    List<CourseScheduleDto> findCourseSchedulesWithDate(Integer teacherId, Date classDate, String groupId, GroupType groupType);
-
-    /**
      * @describe 根据课程编号获取课程所在课程组的课程
      * @author Joburgess
      * @date 2020/3/10

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

+ 21 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -128,6 +128,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Autowired
     private SysConfigDao sysConfigDao;
     @Autowired
+    private SysTenantConfigDao sysTenantConfigDao;
+    @Autowired
     private SubjectDao subjectDao;
     @Autowired
     private GroupDao groupDao;
@@ -2790,6 +2792,17 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             throw new BizException("当前班级已冻结无法操作预排课");
         }
         MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
+        if(musicGroup == null){
+            throw new BizException("乐团信息查询失败");
+        }
+        if(musicGroup.getTenantId() == null){
+            throw new BizException("乐团机构信息异常,请联系管理员");
+        }
+        String configValue = sysTenantConfigDao.getConfigValue(SysConfigService.MEMBER_GROUP_TERM_GIVE_COURSE_TIME, musicGroup.getTenantId());
+        if(StringUtils.isEmpty(configValue)){
+            throw new BizException("请配置会员团每学期赠送课程分钟数");
+        }
+        Integer giveCourseTime = Integer.parseInt(configValue);
 
         Boolean confirmGenerate = false;
         if (Objects.nonNull(classGroup4MixDtos.get(0).getConfirmGenerate())) {
@@ -2834,25 +2847,25 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     classGroup4MixDto.getCourseType() == TRAINING_SINGLE || classGroup4MixDto.getCourseType() == TRAINING_MIX){
                 //单技课和合奏课最大的排课时长不能超过44 * 45 分钟
                 if(classGroup4MixDto.getCourseType() == SINGLE || classGroup4MixDto.getCourseType() == TRAINING_SINGLE){
-                    if(totalCourseMinutes > 44 * 45){
-                        throw new BizException("声部类型总时长不能超过最大限制(1980分钟)");
+                    if(totalCourseMinutes > giveCourseTime){
+                        throw new BizException("声部类型总时长不能超过最大限制({}分钟)",giveCourseTime);
                     }
                     singleCourseMinutes = totalCourseMinutes;
                     //获取所选学员最大的已消耗的单技课时长
                     int maxSingleCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMaxSingleCourseMinutes(musicGroupSchoolTermCourseDetailId,studentIds);
-                    if(44 * 45 - maxSingleCourseMinutes < totalCourseMinutes){
+                    if(giveCourseTime - maxSingleCourseMinutes < totalCourseMinutes){
 //                        throw new BizException("操作失败:所选学员可排单技课时长已不足{}分钟",totalCourseMinutes);
-                        throw new BizException("声部类型总时长不能超过最大限制(1980分钟)");
+                        throw new BizException("声部类型总时长不能超过最大限制({}分钟)",giveCourseTime);
                     }
                 } else {
-                    if(totalCourseMinutes > 44 * 45){
-                        throw new BizException("合奏类型总时长不能超过最大限制(1980分钟)");
+                    if(totalCourseMinutes > giveCourseTime){
+                        throw new BizException("合奏类型总时长不能超过最大限制({}分钟)",giveCourseTime);
                     }
                     totalMixCourseMinutes = totalCourseMinutes;
                     int maxMixCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMaxMixCourseMinutes(musicGroupSchoolTermCourseDetailId,studentIds);
-                    if(44 * 45 - maxMixCourseMinutes < totalCourseMinutes){
+                    if(giveCourseTime - maxMixCourseMinutes < totalCourseMinutes){
 //                        throw new BizException("操作失败:所选学员可排合奏课时长已不足{}分钟",totalCourseMinutes);
-                        throw new BizException("合奏类型总时长不能超过最大限制(1980分钟)");
+                        throw new BizException("合奏类型总时长不能超过最大限制({}分钟)",giveCourseTime);
                     }
                 }
             }

+ 45 - 14
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -81,6 +81,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     @Autowired
     private SysConfigDao sysConfigDao;
     @Autowired
+    private SysTenantConfigService sysTenantConfigService;
+    @Autowired
     private StudentAttendanceDao studentAttendanceDao;
     @Autowired
     private ClassGroupStudentMapperDao classGroupStudentMapperDao;
@@ -189,6 +191,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         if (null == user) {
             throw new BizException("获取用户信息失败");
         }
+        if (null == user.getTenantId()) {
+            throw new BizException("用户机构信息异常,请联系管理员");
+        }
         if (Objects.isNull(courseID)) {
             throw new BizException("参数错误!");
         }
@@ -226,7 +231,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         currentCourseDetail.setNormalRemind(normalRemindNum<=0?0:1);
 		currentCourseDetail.setCurrentTime(new Date());
         currentCourseDetail.setAdvanceSignInMinutes(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_IN_MINUTES)));
-		currentCourseDetail.setAttendanceRange(CourseScheduleType.VIP.equals(currentCourseDetail.getCourseType())?Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ATTENDANCE_RANGE_VIP)):Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ATTENDANCE_RANGE)));
+		String gpsRange = sysTenantConfigService.getTenantConfigValue(SysConfigService.ATTENDANCE_RANGE,user.getTenantId());
+		Integer attendanceRange = 0;
+		if(StringUtils.isNotEmpty(gpsRange)){
+			attendanceRange = Integer.parseInt(gpsRange);
+		}
+		currentCourseDetail.setAttendanceRange(attendanceRange);
         currentCourseDetail.setAdvanceSignOutMinutes(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_OUT_MINUTES)));
 		CourseSchedule courseSchedule = courseScheduleDao.get(courseID);
 		//获取课程规划
@@ -1032,13 +1042,21 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         if (null == user) {
             throw new BizException("请登录");
         }
+        if (null == user.getTenantId()) {
+            throw new BizException("用户机构信息异常");
+        }
         Date now = new Date();
         SysConfig studentAttendanceAfterTimeConfig = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_BEFOR_COURSE_START_TIME_RANGE_VIP);
 		SysConfig courseBeforeBufferTime = sysConfigService.findByParamName(SysConfigService.COURSE_BEFORE_BUFFER_TIME);
 		SysConfig courseAfterBufferTime = sysConfigService.findByParamName(SysConfigService.COURSE_AFTER_BUFFER_TIME);
         Map<String, Object> result = new HashMap<>(3);
         result.put("vipAppealDaysRange", sysConfigDao.findConfigValue(SysConfigService.VIP_APPEAL_DAYS_RANGE));
-        result.put("advanceLeaveHours", Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_LEAVE_HOURS)));
+		String tenantConfigValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.ADVANCE_LEAVE_HOURS, user.getTenantId());
+		Integer advanceLeaveHours = 0;
+		if(StringUtils.isNotEmpty(tenantConfigValue)){
+			advanceLeaveHours = Integer.parseInt(tenantConfigValue);
+		}
+		result.put("advanceLeaveHours", advanceLeaveHours);
         result.put("earliestTimeForLeave", Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.EARLIEST_TIME_FOR_LEAVE)));
         result.put("joinRoomBeforeTime",studentAttendanceAfterTimeConfig.getParanValue(Integer.class));
 		result.put("courseBeforeBufferTime", courseBeforeBufferTime.getParanValue(Integer.class));
@@ -1188,7 +1206,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     }
 
     @Override
-    public List<CourseScheduleDto> getTeacherCourseSchedulesWithDate(Integer userId, Date classDate, String type) {
+    public List<CourseScheduleDto> getTeacherCourseSchedulesWithDate(Integer userId, Date classDate, String type,Integer tenantId) {
         if (Objects.isNull(classDate)) {
             throw new BizException("请选择上课日期!");
         }
@@ -1227,8 +1245,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         List<Map<Integer, Integer>> classGroupStudentNumMaps = classGroupStudentMapperDao.countClassGroupsStudentNum(classGroupIds, ClassGroupStudentStatusEnum.NORMAL);
         Map<Integer, Long> classGroupStudentNumMap = MapUtil.convertIntegerMap(classGroupStudentNumMaps);
 
-        SysConfig advanceLeaveHoursConfig = sysConfigService.findByParamName(SysConfigService.ADVANCE_LEAVE_HOURS);
-        Integer advanceLeaveHours=advanceLeaveHoursConfig.getParanValue(Integer.class);
+		String tenantConfigValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.ADVANCE_LEAVE_HOURS,tenantId);
+		Integer advanceLeaveHours = 0;
+		if(StringUtils.isNotEmpty(tenantConfigValue)){
+			advanceLeaveHours = Integer.parseInt(tenantConfigValue);
+		}
         List<Map<Long, Integer>> courseLeaveStudentNumMaps = studentAttendanceDao.countCourseLeaveStudentNumWithFourHoursAgo(allCourseScheduleIds, advanceLeaveHours);
         Map<Long,Long> courseLeaveStudentNumMap = MapUtil.convertIntegerMap((courseLeaveStudentNumMaps));
 
@@ -3920,6 +3941,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         if (null == sysUser) {
             throw new BizException("获取用户信息失败");
         }
+        if (null == sysUser.getTenantId()) {
+            throw new BizException("获取用户机构信息失败");
+        }
         List<Long> newCourseScheduleIds = newCourseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
         //获取对应未修改的课程列表
         List<CourseSchedule> oldCourseScheduleList = courseScheduleDao.findByCourseScheduleIds(newCourseScheduleIds);
@@ -3949,19 +3973,20 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         Map<Long, CourseSchedule> oldCourseSchedules = new HashMap<>();
 
         List<Integer> classGroupIds = oldCourseScheduleList.stream().map(CourseSchedule::getClassGroupId).collect(Collectors.toList());
-//        List<ClassGroup> classGroups = classGroupDao.findByClassGroupIds(classGroupIds);
-//        Map<Integer, ClassGroup> idClassGroupMap = classGroups.stream().collect(Collectors.toMap(ClassGroup::getId, classGroup -> classGroup));
 
-        SysConfig advanceLeaveHoursConfig = sysConfigService.findByParamName(SysConfigService.ENABLE_TEACHER_COURSE_ADJUST_DEFAULT_HOURS);
-        Integer advanceLeaveHours=advanceLeaveHoursConfig.getParanValue(Integer.class);
+        String advanceLeaveHoursConfig = sysTenantConfigService.getTenantConfigValue(SysConfigService.ENABLE_TEACHER_COURSE_ADJUST_DEFAULT_HOURS,sysUser.getTenantId());
+		Integer advanceLeaveHours = 0;
+        if(StringUtils.isNotEmpty(advanceLeaveHoursConfig)){
+			advanceLeaveHours = Integer.parseInt(advanceLeaveHoursConfig);
+		}
         List<Map<Long, Integer>> courseLeaveStudentNumMaps = studentAttendanceDao.countCourseLeaveStudentNumWithFourHoursAgo(newCourseScheduleIds, advanceLeaveHours);
         Map<Long,Long> courseLeaveStudentNumMap = MapUtil.convertIntegerMap((courseLeaveStudentNumMaps));
 
         List<Map<Integer, Integer>> classGroupStudentNumMaps = classGroupStudentMapperDao.countClassGroupsStudentNum(classGroupIds, ClassGroupStudentStatusEnum.NORMAL);
         Map<Integer, Long> classGroupStudentNumMap = MapUtil.convertIntegerMap(classGroupStudentNumMaps);
 
-
-        newCourseSchedules.forEach(newCourseSchedule -> {
+		for (int i = 0; i < newCourseSchedules.size(); i++) {
+			CourseSchedule newCourseSchedule = newCourseSchedules.get(i);
             CourseSchedule oldCourseSchedule = oldCourseScheduleMap.get(newCourseSchedule.getId()).get(0);
             if (!sysUser.getUserType().contains("SYSTEM") && sysUser.getUserType().contains("TEACHER")) {
                 Long normalStudentNum = classGroupStudentNumMap.get(oldCourseSchedule.getClassGroupId());
@@ -4132,7 +4157,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
                 teacherAttendanceDao.batchDeleteByCourseAndUsers(newCourseSchedule.getId().intValue(), beReplaceTeacherIds);
             }
             classGroupService.updateClassGroupInfo(oldCourseSchedule.getClassGroupId());
-        });
+        }
         //生成修改后的教师课酬
         if (!CollectionUtils.isEmpty(needCreateCourseScheduleTeacherSalaryCourse)) {
             classGroupTeacherMapperService.createCourseScheduleTeacherSalary(needCreateCourseScheduleTeacherSalaryCourse, oldCourseSchedules);
@@ -4582,6 +4607,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		if (null == user) {
 			throw new BizException("请登录");
 		}
+		if (null == user.getTenantId()) {
+			throw new BizException("用户机构信息异常");
+		}
 		if(!queryInfo.getFindTotal()){
 			queryInfo.setUserId(user.getId().longValue());
 		}
@@ -4615,8 +4643,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			Map<Integer, Long> classGroupStudentNumMap = MapUtil.convertIntegerMap(classGroupStudentNumMaps);
 
 			List<Long> allCourseScheduleIds = dataList.stream().map(TeacherClassCourseSchudeleDto::getCourseScheduleId).collect(Collectors.toList());
-			SysConfig advanceLeaveHoursConfig = sysConfigService.findByParamName(SysConfigService.ADVANCE_LEAVE_HOURS);
-			Integer advanceLeaveHours=advanceLeaveHoursConfig.getParanValue(Integer.class);
+			String tenantConfigValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.ADVANCE_LEAVE_HOURS,user.getTenantId());
+			Integer advanceLeaveHours = 0;
+			if(StringUtils.isNotEmpty(tenantConfigValue)){
+				advanceLeaveHours = Integer.parseInt(tenantConfigValue);
+			}
 			List<Map<Long, Integer>> courseLeaveStudentNumMaps = studentAttendanceDao.countCourseLeaveStudentNumWithFourHoursAgo(allCourseScheduleIds, advanceLeaveHours);
 			Map<Long,Long> courseLeaveStudentNumMap = MapUtil.convertIntegerMap((courseLeaveStudentNumMaps));
 

+ 87 - 160
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -64,6 +64,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     @Autowired
     private SysConfigService sysConfigDao;
     @Autowired
+    private SysTenantConfigService sysTenantConfigService;
+    @Autowired
     private TeacherAttendanceDao teacherAttendanceDao;
     @Autowired
     private ClassGroupDao classGroupDao;
@@ -72,16 +74,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     @Autowired
     private ClassGroupStudentMapperDao classGroupStudentMapperDao;
     @Autowired
-    private TeacherDefaultVipGroupSalaryDao teacherDefaultVipGroupSalaryDao;
-    @Autowired
     private CourseScheduleRewardsRulesService courseScheduleRewardsRulesService;
     @Autowired
-    private StudentAttendanceDao studentAttendanceDao;
-    @Autowired
     private TeacherSalaryComplaintsDao teacherSalaryComplaintsDao;
     @Autowired
-    private TeacherCourseRewardService teacherCourseRewardService;
-    @Autowired
     private SysMessageService sysMessageService;
     @Autowired
     private TeacherCourseRewardDao teacherCourseRewardDao;
@@ -216,7 +212,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void practiceTeacherSalarySettlement() {
+    public void practiceTeacherSalarySettlement(Integer tenantId) {
         //获取教师未结算课程记录
         Date now = new Date();
         Date date = DateUtil.addMonths(now, -1);
@@ -242,28 +238,21 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             return;
         }
 
-        BigDecimal zero = new BigDecimal("0");
+        //试用期课酬规则
+        String configValue2 = sysTenantConfigService.getTenantConfigValue(SysConfigService.PROBATION_TEACHER_SALARY,tenantId);
+        Integer probationTeacherSalary = 100;
+        if(StringUtils.isNotEmpty(configValue2)){
+            probationTeacherSalary = Integer.parseInt(configValue2);
+        }
 
-        //获取课程对应教学点补贴
-//        List<Map<Long, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(new ArrayList<>(courseScheduleIds));
-//        Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertIntegerMap(courseSubsidyByCourses);
+        BigDecimal zero = new BigDecimal("0");
 
-        someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
+        for (int i = 0; i < someDayAgoTeacherCourseSalaryNoSettlement.size(); i++) {
+            CourseScheduleTeacherSalary courseScheduleTeacherSalary = someDayAgoTeacherCourseSalaryNoSettlement.get(i);
             List<String> deductReasons = new ArrayList<>();
 
             BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
 
-//            BigDecimal subsidy = courseSubsidyMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
-//            if (Objects.isNull(subsidy)) {
-//                subsidy = new BigDecimal(0);
-//            }
-//            courseScheduleTeacherSalary.setSubsidy(subsidy);
-//            expectSalary = expectSalary.add(subsidy);
-//
-//            if(BigDecimal.ZERO.compareTo(subsidy)!=0){
-//                deductReasons.add("教学点补贴:" + subsidy);
-//            }
-
             if(Objects.isNull(courseScheduleTeacherSalary.getSubsidy())){
                 courseScheduleTeacherSalary.setSubsidy(zero);
             }
@@ -286,22 +275,9 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 return;
             }
 
-//            boolean notPositive = Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseScheduleTeacherSalary.getCourseSchedule().getClassDate().compareTo(teacher.getFormalStaffDate())<0;
-//            boolean isProbationPeriod = Objects.nonNull(teacher)&&Objects.nonNull(teacher.getIsProbationPeriod())&&ProbationPeriodEnum.TRY.equals(teacher.getIsProbationPeriod());
-
             //判断课程是否在试用期内
-            boolean trail = false;
-
-            if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&courseScheduleTeacherSalary.getCourseSchedule().getClassDate().compareTo(teacher.getEntryDate())>=0){
-                trail = true;
-            }
-            if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseScheduleTeacherSalary.getCourseSchedule().getClassDate().compareTo(teacher.getFormalStaffDate())>=0){
-                trail = false;
-            }
-
-            //如果上课日期在试用期内按80%结算
-            if(trail){
-                expectSalary = expectSalary.multiply(new BigDecimal("0.8"));
+            if(isTrail(teacher,courseScheduleTeacherSalary.getCourseSchedule().getClassDate())){
+                expectSalary = expectSalary.multiply(new BigDecimal(probationTeacherSalary/100));
                 deductReasons.add("未转正");
             }
 
@@ -364,12 +340,12 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             courseScheduleTeacherSalary.setSettlementTime(now);
             courseScheduleTeacherSalary.setBelongToDaya(false);
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
-        });
+        }
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void teacherSalarySettlement() {
+    public void teacherSalarySettlement(Integer tenantId) {
         Date now = new Date();
         Date date = DateUtil.addMonths(now, -1);
         String startDate = DateUtil.format(DateUtil.getFirstDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
@@ -388,6 +364,13 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             LOGGER.info("未获取到未结算课酬记录!");
             return;
         }
+
+        //试用期课酬规则
+        String configValue2 = sysTenantConfigService.getTenantConfigValue(SysConfigService.PROBATION_TEACHER_SALARY,tenantId);
+        Integer probationTeacherSalary = 100;
+        if(StringUtils.isNotEmpty(configValue2)){
+            probationTeacherSalary = Integer.parseInt(configValue2);
+        }
         //获取未结算课程编号列表
         List<Long> courseScheduleIds = someDayAgoTeacherCourseSalaryNoSettlement.stream().map(CourseScheduleTeacherSalary::getCourseScheduleId).collect(Collectors.toList());
 
@@ -395,30 +378,15 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(courseScheduleIds);
         Map<String, List<TeacherAttendance>> teacherCourseAttendanceMap = allTeacherAttendances.stream().collect(Collectors.groupingBy(ta -> org.apache.commons.lang3.StringUtils.joinWith(":", ta.getCourseScheduleId(), ta.getTeacherId())));
 
-        BigDecimal zero = new BigDecimal(0);
-
-        //获取课程对应教学点补贴
-//        List<Map<Long, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
-//        Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertIntegerMap(courseSubsidyByCourses);
-
         //处理课酬信息
-        someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
+        for (int i = 0; i < someDayAgoTeacherCourseSalaryNoSettlement.size(); i++) {
+            CourseScheduleTeacherSalary courseScheduleTeacherSalary = someDayAgoTeacherCourseSalaryNoSettlement.get(i);
             List<String> deductReasons = new ArrayList<>();
 
             BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
 
-//            BigDecimal subsidy = courseSubsidyMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
-//            if (Objects.isNull(subsidy)) {
-//                subsidy = new BigDecimal(0);
-//            }
-//            courseScheduleTeacherSalary.setSubsidy(subsidy);
-//            expectSalary = expectSalary.add(subsidy);
-//            if(BigDecimal.ZERO.compareTo(subsidy)!=0){
-//                deductReasons.add("教学点补贴:" + subsidy);
-//            }
-
             if(Objects.isNull(courseScheduleTeacherSalary.getSubsidy())){
-                courseScheduleTeacherSalary.setSubsidy(zero);
+                courseScheduleTeacherSalary.setSubsidy(BigDecimal.ZERO);
             }
 
             if(BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getSubsidy())!=0){
@@ -439,22 +407,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 return;
             }
 
-//            boolean notPositive = Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseScheduleTeacherSalary.getCourseSchedule().getClassDate().compareTo(teacher.getFormalStaffDate())<0;
-//            boolean isProbationPeriod = Objects.nonNull(teacher)&&Objects.nonNull(teacher.getIsProbationPeriod())&&ProbationPeriodEnum.TRY.equals(teacher.getIsProbationPeriod());
-
             //判断课程是否在试用期内
-            boolean trail = false;
-
-            if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&courseScheduleTeacherSalary.getCourseSchedule().getClassDate().compareTo(teacher.getEntryDate())>=0){
-                trail = true;
-            }
-            if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseScheduleTeacherSalary.getCourseSchedule().getClassDate().compareTo(teacher.getFormalStaffDate())>=0){
-                trail = false;
-            }
-
             //如果上课日期在试用期内按80%结算
-            if(trail){
-                expectSalary = expectSalary.multiply(new BigDecimal("0.8"));
+            if(isTrail(teacher,courseScheduleTeacherSalary.getCourseSchedule().getClassDate())){
+                expectSalary = expectSalary.multiply(new BigDecimal(probationTeacherSalary/100));
                 deductReasons.add("未转正");
             }
 
@@ -462,7 +418,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             BigDecimal deductCost = new BigDecimal(0);
             List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
 
-//            TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
             if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(courseTeacherAttendances.get(0).getSignInStatus())){
                 //未签到扣除全部课酬
                 deductCost = deductCost.add(expectSalary.abs());
@@ -520,12 +475,24 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             courseScheduleTeacherSalary.setSettlementTime(now);
             courseScheduleTeacherSalary.setBelongToDaya(false);
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
-        });
+        }
+    }
+
+    Boolean isTrail(Teacher teacher,Date classDate){
+        //判断课程是否在试用期内
+        boolean trail = false;
+        if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&classDate.compareTo(teacher.getEntryDate())>=0){
+            trail = true;
+        }
+        if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&classDate.compareTo(teacher.getFormalStaffDate())>=0){
+            trail = false;
+        }
+        return trail;
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void musicGroupTeacherSalarySettlement() {
+    public void musicGroupTeacherSalarySettlement(Integer tenantId) {
         Date now = new Date();
         Date date = DateUtil.addMonths(now, -1);
         String startDate = DateUtil.format(DateUtil.getFirstDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
@@ -541,10 +508,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
         BigDecimal zero = new BigDecimal(0);
 
-        //获取课程对应教学点补贴
-//        List<Map<Long, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
-//        Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertIntegerMap(courseSubsidyByCourses);
-
         Set<Integer> schoolIds = yesterdayCourseSchedules.stream().map(CourseSchedule::getSchoolId).collect(Collectors.toSet());
         List<School> schools = schoolDao.getSchools(new ArrayList<>(schoolIds));
         Map<Integer, School> idSchoolMap = new HashMap<>();
@@ -563,20 +526,35 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             return;
         }
 
-        SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE);
+        //定位范围
+        String gpsRange = sysTenantConfigService.getTenantConfigValue(SysConfigService.ATTENDANCE_RANGE,tenantId);
         double attendanceRange = 0;
-        if(Objects.nonNull(sysConfig)){
-            attendanceRange = Double.valueOf(sysConfig.getParanValue());
+        if(StringUtils.isNotEmpty(gpsRange)){
+            attendanceRange = Double.valueOf(gpsRange);
+        }
+        //签到签退定位异常扣除金额
+//        String configValue = sysTenantConfigService.getConfigValue(SysConfigService.OFFLINE_GPS_ERROR_CUT_SALARY,tenantId);
+//        Integer gpsCutSalary = null;
+//        if(StringUtils.isNotEmpty(configValue)){
+//            gpsCutSalary = Integer.parseInt(configValue);
+//        }
+//        //签到签退定位异常扣除单位
+//        String configValue1 = sysTenantConfigService.getConfigValue(SysConfigService.OFFLINE_GPS_ERROR_CUT_SALARY_UNIT,tenantId);
+//        UnitEnum unitEnum = null;
+//        if(StringUtils.isNotEmpty(configValue1)){
+//            unitEnum = UnitEnum.valueOf(configValue1);
+//        }
+          //试用期课酬规则
+        String configValue2 = sysTenantConfigService.getTenantConfigValue(SysConfigService.PROBATION_TEACHER_SALARY,tenantId);
+        Integer probationTeacherSalary = 100;
+        if(StringUtils.isNotEmpty(configValue2)){
+            probationTeacherSalary = Integer.parseInt(configValue2);
         }
 
         //教师签到记录
         List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(courseScheduleIds);
         Map<String, List<TeacherAttendance>> teacherCourseAttendanceMap = allTeacherAttendances.stream().collect(Collectors.groupingBy(ta -> org.apache.commons.lang3.StringUtils.joinWith(":", ta.getCourseScheduleId(), ta.getTeacherId())));
 
-        //学员点名记录
-        List<StudentAttendance> allStudentAttendances = studentAttendanceDao.findByCourseIds(courseScheduleIds);
-        Map<Long, List<StudentAttendance>> courseStudentAttendanceMap = allStudentAttendances.stream().collect(Collectors.groupingBy(StudentAttendance::getCourseScheduleId));
-
         //需要根据实际上课学员结算课酬的课程编号
         List<Long> needStudentAttendanceCourseScheduleIds = yesterdayCourseSchedules.stream()
                 .filter(c -> CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(c.getType())
@@ -591,23 +569,9 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         Map<Long, Long> courseNormalStudentsMap = new HashMap<>();
         if(!CollectionUtils.isEmpty(studentAttendances)){
             courseNormalStudentsMap =studentAttendances.stream()
-//                    .filter(studentAttendance -> StudentAttendanceStatusEnum.NORMAL.equals(studentAttendance.getStatus()))
                     .collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseScheduleId, Collectors.counting()));
         }
 
-        //课程对应乐团结算方式集合
-        List<Map<String, String>> musicGroupSettlementTypeByCourse = courseScheduleTeacherSalaryDao.findMusicGroupSettlementTypeByCourse(courseScheduleIds);
-        Map<String, String> musicGroupSettlementsMap = MapUtil.convertMybatisMap(musicGroupSettlementTypeByCourse);
-
-        //所有老师编号
-        List<Integer> allTeacherIds = courseScheduleTeacherSalaries.stream()
-                .map(CourseScheduleTeacherSalary::getUserId)
-                .collect(Collectors.toList());
-
-        //所有老师默认乐团课酬
-        List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalaries = teacherDefaultMusicGroupSalaryDao.findByTeacher(allTeacherIds);
-        Map<CourseSchedule.CourseScheduleType, List<TeacherDefaultMusicGroupSalary>> teacherDefaultMusicGroupSalariesGroupByCourseType = teacherDefaultMusicGroupSalaries.stream().collect(Collectors.groupingBy(TeacherDefaultMusicGroupSalary::getCourseScheduleType));
-
         Set<Integer> teacherIds = courseScheduleTeacherSalaries.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toSet());
         List<Teacher> teachers = teacherDao.findByTeacherIds(new ArrayList<>(teacherIds));
         Map<Integer, Teacher> idTeacherMap = teachers.stream().collect(Collectors.toMap(Teacher::getId, t -> t, (t1, t2) -> t1));
@@ -644,15 +608,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
                 List<String> deductReasons = new ArrayList<>();
 
-//                BigDecimal subsidy = courseSubsidyMap.get(courseSchedule.getId());
-//                if (Objects.isNull(subsidy)) {
-//                    subsidy = new BigDecimal(0);
-//                }
-//                teacherSalary = teacherSalary.add(subsidy);
-//                if(BigDecimal.ZERO.compareTo(subsidy)!=0){
-//                    deductReasons.add("教学点补贴:" + subsidy);
-//                }
-
                 if(Objects.isNull(courseScheduleTeacherSalary.getSubsidy())){
                     courseScheduleTeacherSalary.setSubsidy(zero);
                 }
@@ -662,24 +617,9 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                     deductReasons.add("课程补贴:" + courseScheduleTeacherSalary.getSubsidy());
                 }
 
-                //未转正
-//                boolean notPositive = Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())<0;
-                //试用期
-//                boolean isProbationPeriod = Objects.nonNull(teacher)&&Objects.nonNull(teacher.getIsProbationPeriod())&&ProbationPeriodEnum.TRY.equals(teacher.getIsProbationPeriod());
-
-                //判断课程是否在试用期内
-                boolean trail = false;
-
-                if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getEntryDate())&&courseSchedule.getClassDate().compareTo(teacher.getEntryDate())>=0){
-                    trail = true;
-                }
-                if(Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())>=0){
-                    trail = false;
-                }
-
                 //如果上课日期在试用期内按80%结算
-                if(trail){
-                    teacherSalary = teacherSalary.multiply(new BigDecimal("0.8"));
+                if(isTrail(teacher,courseSchedule.getClassDate())){
+                    teacherSalary = teacherSalary.multiply(new BigDecimal(probationTeacherSalary/100));
                     deductReasons.add("未转正");
                 }
 
@@ -749,15 +689,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
             List<String> deductReasons = new ArrayList<>();
 
-//            BigDecimal subsidy = courseSubsidyMap.get(courseSchedule.getId());
-//            if (Objects.isNull(subsidy)) {
-//                subsidy = new BigDecimal(0);
-//            }
-//            teacherSalary = teacherSalary.add(subsidy);
-//            if(BigDecimal.ZERO.compareTo(subsidy)!=0){
-//                deductReasons.add("教学点补贴:" + subsidy);
-//            }
-
             if(Objects.isNull(courseScheduleTeacherSalary.getSubsidy())){
                 courseScheduleTeacherSalary.setSubsidy(zero);
             }
@@ -767,9 +698,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 deductReasons.add("课程补贴:" + courseScheduleTeacherSalary.getSubsidy());
             }
 
-//            boolean notPositive = Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())<0;
-//            boolean isProbationPeriod = Objects.nonNull(teacher)&&Objects.nonNull(teacher.getIsProbationPeriod())&&ProbationPeriodEnum.TRY.equals(teacher.getIsProbationPeriod());
-
             //判断课程是否在试用期内
             boolean trail = false;
 
@@ -790,15 +718,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             BigDecimal deductCost = BigDecimal.ZERO;
             List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
 
-            boolean isCallName = false;
-            List<StudentAttendance> courseStudentAttendance = courseStudentAttendanceMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
-            if(!CollectionUtils.isEmpty(courseStudentAttendance)){
-                long csaNum = courseStudentAttendance.stream().filter(csa -> DateUtil.hoursBetween(csa.getCreateTime(), courseSchedule.getStartClassTime()) < 4).count();
-                if(csaNum>0){
-                    isCallName = true;
-                }
-            }
-
             TeacherAttendance teacherAttendance = null;
             if(!CollectionUtils.isEmpty(courseTeacherAttendances)){
                 teacherAttendance = courseTeacherAttendances.get(0);
@@ -822,6 +741,13 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                     signOutInRange = true;
                 }
             }
+            //签到状态
+            if(Objects.isNull(teacherAttendance) || Objects.isNull(teacherAttendance.getSignInStatus())){
+                //无签到记录扣除全部课酬
+                deductCost = deductCost.add(teacherSalary.abs());
+                deductReasons.add("未签到扣除全部课酬");
+            }
+
 
             if(Objects.isNull(teacherAttendance)||Objects.isNull(teacherAttendance.getSignInStatus())){
                 //无签到记录扣除全部课酬
@@ -2160,11 +2086,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         }
 
         //签到GPS范围VIP
-        SysConfig vipSysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE_VIP);
-        double vipAttendanceRange = 0;
-        if(Objects.nonNull(vipSysConfig)){
-            vipAttendanceRange = Double.valueOf(vipSysConfig.getParanValue());
-        }
+//        SysConfig vipSysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE);
+//        double vipAttendanceRange = 0;
+//        if(Objects.nonNull(vipSysConfig)){
+//            vipAttendanceRange = Double.valueOf(vipSysConfig.getParanValue());
+//        }
 
         //教师签到记录
         List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(courseIds);
@@ -2203,7 +2129,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                     calMusicCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, attendanceRange, false);
                     break;
                 case VIP:
-                    calVipCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, vipAttendanceRange, false);
+                    calVipCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, attendanceRange, false);
                     break;
                 case PRACTICE:
                     calPracticeTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, false);
@@ -2228,7 +2154,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         }
 
         teacherSalaryOverview.setAttendanceRange(attendanceRange);
-        teacherSalaryOverview.setVipAttendanceRange(vipAttendanceRange);
+        teacherSalaryOverview.setVipAttendanceRange(attendanceRange);
 
         return teacherSalaryOverview;
     }
@@ -2277,11 +2203,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             }
 
             //签到GPS范围VIP
-            SysConfig vipSysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE_VIP);
-            double vipAttendanceRange = 0;
-            if(Objects.nonNull(vipSysConfig)){
-                vipAttendanceRange = Double.valueOf(vipSysConfig.getParanValue());
-            }
+//            SysConfig vipSysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE_VIP);
+//            double vipAttendanceRange = 0;
+//            if(Objects.nonNull(vipSysConfig)){
+//                vipAttendanceRange = Double.valueOf(vipSysConfig.getParanValue());
+//            }
 
             //教师签到记录
             List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(courseIds);
@@ -2323,7 +2249,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                         calMusicCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, attendanceRange, queryInfo.getUpdated());
                         break;
                     case VIP:
-                        calVipCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, vipAttendanceRange, queryInfo.getUpdated());
+                        calVipCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, attendanceRange, queryInfo.getUpdated());
                         break;
                     case PRACTICE:
                         calPracticeTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, queryInfo.getUpdated());
@@ -2567,4 +2493,5 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         sysMessageService.batchPushMessage(MessageTypeEnum.TEACHER_PUSH_INCOME_REMIND,
                 userMap, null, 0, "12", "TEACHER","income_remind.mp3","income_remind_channel");
     }
+
 }

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

+ 8 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/DemoGroupServiceImpl.java

@@ -13,10 +13,7 @@ import com.ym.mec.biz.dal.enums.TeachTypeEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.StudentDemoGroupQueryInfo;
 import com.ym.mec.biz.dal.page.TeacherManageDemoGroupQueryInfo;
-import com.ym.mec.biz.service.CourseScheduleService;
-import com.ym.mec.biz.service.DemoGroupService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.TeacherAttendanceService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -59,6 +56,8 @@ public class DemoGroupServiceImpl extends BaseServiceImpl<Long, DemoGroup>  impl
 	@Autowired
 	private SysConfigDao sysConfigDao;
 	@Autowired
+	private SysTenantConfigService sysTenantConfigService;
+	@Autowired
 	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
 	@Autowired
 	private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
@@ -84,7 +83,11 @@ public class DemoGroupServiceImpl extends BaseServiceImpl<Long, DemoGroup>  impl
 		//当前教师下周的试听课计划
 		List<DemoGroupCoursesPlan> nextWeekDemoGroupCoursePlan = demoGroupCoursesPlanDao.findByDateZone(nextMonday, nextSunday, demoGroupApplyDto.getUserId());
 
-		demoGroupApplyDto.setSingleClassMinutes(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.DEMO_GROUP_SINGLE_CLASS_MINUTES_)));
+		String configValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.DEMO_GROUP_SINGLE_CLASS_MINUTES_, demoGroupApplyDto.getTenantId());
+		if(StringUtils.isEmpty(configValue)){
+			throw new BizException("请配置试听课单课时时长");
+		}
+		demoGroupApplyDto.setSingleClassMinutes(Integer.parseInt(configValue));
 
 		if(CollectionUtils.isEmpty(nextWeekDemoGroupCoursePlan)){
 			demoGroupDao.insert(demoGroupApplyDto);

+ 31 - 10
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;
@@ -41,6 +43,7 @@ import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.WeekFields;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
 /**
@@ -55,6 +58,8 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
     @Autowired
     private SysConfigService sysConfigService;
     @Autowired
+    private SysTenantConfigService sysTenantConfigService;
+    @Autowired
     private SubjectDao subjectDao;
     @Autowired
     private TeacherService teacherService;
@@ -725,9 +730,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 +761,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 +806,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 +813,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());
@@ -991,13 +1009,16 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
     }
 
     @Override
-    public Map getTrialPracticeApplyParams(Integer userId) {
+    public Map getTrialPracticeApplyParams(Integer userId,Integer tenantId) {
         Map result = new HashMap();
-        SysConfig practiceSubjectIdListConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_SUBJECT_ID_LIST);
+        String practiceSubjectIdListConfig = sysTenantConfigService.getTenantConfigValue(SysConfigService.PRACTICE_SUBJECT_ID_LIST,tenantId);
+        if(StringUtils.isEmpty(practiceSubjectIdListConfig)){
+            throw new BizException("请配置陪练课可预约声部");
+        }
         SysConfig practiceApplyIntervalTimeConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_APPLY_INTERVAL_TIME);
         SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
 
-        List<Subject> subjects = subjectDao.findBySubjectByIdList(practiceSubjectIdListConfig.getParanValue());
+        List<Subject> subjects = subjectDao.findBySubjectByIdList(practiceSubjectIdListConfig);
         Integer userDefaultSubjectId = practiceGroupDao.findLastPracticeSubject(userId);
 
         Collections.swap(subjects,6,7);

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

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

@@ -19,6 +19,7 @@ import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.page.GoodsQuery;
 import com.ym.mec.biz.dal.page.GoodsQueryInfo;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.util.collection.MapUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -48,9 +49,6 @@ import com.ym.mec.biz.dal.enums.SellStatus;
 import com.ym.mec.biz.dal.enums.StockType;
 import com.ym.mec.biz.dal.enums.TemplateTypeEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
-import com.ym.mec.biz.service.GoodsService;
-import com.ym.mec.biz.service.SysMessageService;
-import com.ym.mec.biz.service.UploadFileService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.UploadReturnBean;
 import com.ym.mec.common.exception.BizException;
@@ -73,7 +71,7 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 	@Autowired
 	private GoodsProcurementDao goodsProcurementDao;
 	@Autowired
-	private SysConfigDao sysConfigDao;
+	private SysTenantConfigService sysTenantConfigService;
 	@Autowired
 	private SysMessageService sysMessageService;
 	@Autowired
@@ -435,9 +433,9 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 	}
 
 	@Override
-	public void repertoryWarn() {
+	public void repertoryWarn(Integer tenantId) {
 		//预警手机号
-		String repertoryWarnPhone = sysConfigDao.findConfigValue("repertory_warn_phone");
+		String repertoryWarnPhone = sysTenantConfigService.getTenantConfigValue(SysConfigService.REPERTORY_WARN_PHONE,tenantId);
 		if(StringUtils.isEmpty(repertoryWarnPhone)){
 			return;
 		}
@@ -448,7 +446,7 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		Map<Integer, String> receivers = new HashMap<>(1);
 		receivers.put(sysUser.getUserId(), repertoryWarnPhone);
 		//内部库存预警
-		String innerRepertoryWarnNum = sysConfigDao.findConfigValue("inner_repertory_warn_num");
+		String innerRepertoryWarnNum = sysTenantConfigService.getTenantConfigValue(SysConfigService.INNER_REPERTORY_WARN_NUM,sysUser.getTenantId());
 		if(StringUtils.isNotEmpty(innerRepertoryWarnNum)){
 			String goodsNames = goodsDao.getInnerRepertoryWarnName(innerRepertoryWarnNum);
 			if(StringUtils.isNotEmpty(goodsNames)){
@@ -458,7 +456,7 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 		}
 
 		//外部库存预警
-		String outerRepertoryWarnNum = sysConfigDao.findConfigValue("outer_repertory_warn_num");
+		String outerRepertoryWarnNum = sysTenantConfigService.getTenantConfigValue(SysConfigService.OUTER_REPERTORY_WARN_NUM,sysUser.getTenantId());
 		if(StringUtils.isNotEmpty(outerRepertoryWarnNum)){
 			String goodsNames = goodsDao.getOuterRepertoryWarnName(outerRepertoryWarnNum);
 			if(StringUtils.isNotEmpty(goodsNames)){

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

+ 17 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java

@@ -51,6 +51,8 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 	@Autowired
 	private SysConfigDao sysConfigDao;
 	@Autowired
+	private SysTenantConfigDao sysTenantConfigDao;
+	@Autowired
 	private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
@@ -1015,7 +1017,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 	}
 
 	@Override
-	public List<IndexErrInfoDto> getRemindMatterData(String organIds) {
+	public List<IndexErrInfoDto> getRemindMatterData(String organIds,Integer tenantId) {
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if (sysUser == null) {
 			throw new BizException("用户信息获取失败");
@@ -1033,21 +1035,25 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			//获取教务老师关联的班级列表
 			educationUserId = sysUser.getId();
 		}
-		//获取关联的乐团列表
-		List<String> musicGroupIds = musicGroupDao.queryIdsByEduIdAndOrganIds(educationUserId,organIds);
-		String configValue1 = sysConfigDao.findConfigValue("push_create_payment_calender");
 		Date date = new Date();
-		String format = DateUtil.format(date, DateUtil.DEFAULT_PATTERN);
+
 		List<IndexErrInfoDto> result = new ArrayList<>();
+
 		IndexErrInfoDto indexErrInfoDto = new IndexErrInfoDto();
 		indexErrInfoDto.setErrorType(WAIT_CREATE_PAYMENT_CALENDER);
 		indexErrInfoDto.setDesc(WAIT_CREATE_PAYMENT_CALENDER.getMsg());
-		if(musicGroupIds.size() > 0){
-			List<Long> calenderIds = musicGroupPaymentCalenderDao.queryEndIds(configValue1, format,musicGroupIds);
-			if(calenderIds.size() > 0){
-				List<String> musicGroupIdList = musicGroupPaymentCalenderDao.queryMusicGroupIds(calenderIds);
-				indexErrInfoDto.setResult(musicGroupIdList);
-				indexErrInfoDto.setNum(musicGroupIdList.size());
+		String configValue1 = sysTenantConfigDao.getConfigValue(SysConfigService.PUSH_CREATE_PAYMENT_CALENDER, tenantId);
+		if(StringUtils.isNotEmpty(configValue1)){
+			//获取关联的乐团列表
+			List<String> musicGroupIds = musicGroupDao.queryIdsByEduIdAndOrganIds(educationUserId,organIds);
+			String format = DateUtil.format(date, DateUtil.DEFAULT_PATTERN);
+			if(musicGroupIds.size() > 0){
+				List<Long> calenderIds = musicGroupPaymentCalenderDao.queryEndIds(configValue1, format,musicGroupIds);
+				if(calenderIds.size() > 0){
+					List<String> musicGroupIdList = musicGroupPaymentCalenderDao.queryMusicGroupIds(calenderIds);
+					indexErrInfoDto.setResult(musicGroupIdList);
+					indexErrInfoDto.setNum(musicGroupIdList.size());
+				}
 			}
 		}
 		result.add(indexErrInfoDto);

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

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

@@ -32,6 +32,7 @@ import java.util.stream.Collectors;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.service.*;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -65,30 +66,6 @@ import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
 import com.ym.mec.biz.dal.page.MusicGroupQueryInfo;
 import com.ym.mec.biz.dal.page.MusicMemberQueryInfo;
 import com.ym.mec.biz.event.source.GroupEventSource;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.ClassGroupStudentMapperService;
-import com.ym.mec.biz.service.CloudTeacherOrderService;
-import com.ym.mec.biz.service.ContractService;
-import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
-import com.ym.mec.biz.service.GoodsService;
-import com.ym.mec.biz.service.ImGroupMemberService;
-import com.ym.mec.biz.service.ImGroupService;
-import com.ym.mec.biz.service.ImUserFriendService;
-import com.ym.mec.biz.service.MusicGroupPaymentCalenderService;
-import com.ym.mec.biz.service.MusicGroupService;
-import com.ym.mec.biz.service.MusicGroupSubjectGoodsGroupService;
-import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
-import com.ym.mec.biz.service.PayService;
-import com.ym.mec.biz.service.StudentPaymentOrderDetailService;
-import com.ym.mec.biz.service.StudentPaymentOrderService;
-import com.ym.mec.biz.service.StudentPaymentRouteOrderService;
-import com.ym.mec.biz.service.StudentRegistrationService;
-import com.ym.mec.biz.service.StudentService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.SysCouponCodeService;
-import com.ym.mec.biz.service.SysMessageService;
-import com.ym.mec.biz.service.SysUserCashAccountDetailService;
-import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.ImGroupMember;
@@ -134,79 +111,54 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     private MusicGroupPurchaseListDao musicGroupPurchaseListDao;
     @Autowired
     private MusicGroupStudentFeeDao musicGroupStudentFeeDao;
-
     @Autowired
     private ClassGroupStudentMapperDao classGroupStudentMapperDao;
-
     @Autowired
     private ClassGroupTeacherMapperDao classGroupTeacherMapperDao;
-
     @Autowired
     private StudentPaymentOrderDao studentPaymentOrderDao;
-
     @Autowired
     private SysUserCashAccountService sysUserCashAccountService;
-
     @Autowired
     private SysUserCashAccountDetailService sysUserCashAccountDetailService;
-
     @Autowired
     private MusicGroupPaymentCalenderStudentDetailDao musicGroupPaymentCalenderStudentDetailDao;
-
     @Autowired
     private MusicGroupQuitDao musicGroupQuitDao;
-
     @Autowired
     private StudentRegistrationDao studentRegistrationDao;
-
     @Autowired
     private CourseScheduleDao courseScheduleDao;
-
     @Autowired
     private ClassGroupDao classGroupDao;
-
     @Autowired
     private OrganizationDao organizationDao;
-
     @Autowired
     private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
-
     @Autowired
     private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
-
     @Autowired
     private CooperationOrganDao cooperationOrganDao;
-
     @Autowired
     private TeacherAttendanceDao teacherAttendanceDao;
-
     @Autowired
     private StudentPaymentOrderService studentPaymentOrderService;
-
     @Autowired
     private StudentPaymentOrderDetailService studentPaymentOrderDetailService;
-
     @Autowired
     private PayService payService;
-
     @Autowired
     private SysUserFeignService sysUserFeignService;
-
     @Autowired
     private EmployeeDao employeeDao;
-
     @Autowired
     private SysMessageService sysMessageService;
-
     @Autowired
     private SysConfigDao sysConfigDao;
-
     @Autowired
-    private SysTenantConfigDao sysTenantConfigDao;
-
+    private SysTenantConfigService sysTenantConfigService;
     @Autowired
     private ClassGroupService classGroupService;
-
     @Autowired
     private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
     @Autowired
@@ -527,7 +479,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             throw new BizException("操作失败:只有乐团在[{}]状态才能操作", MusicGroupStatusEnum.PRE_APPLY.getMsg());
         }
         if (isCheckStudentNum) {
-            String configValue = sysTenantConfigDao.getConfigValue(SysConfigService.MUSIC_MIN_STUDENT_NUM, musicGroup.getTenantId());
+            String configValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.MUSIC_MIN_STUDENT_NUM, musicGroup.getTenantId());
             if(StringUtils.isNotEmpty(configValue)){
                 Integer minStudentNum = Integer.parseInt(configValue);
                 // 查询乐团已报名人数
@@ -720,7 +672,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             throw new BizException("报名信息有误,请核查");
         }
         
-        MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.getMusicGroupRegCalender(studentRegistration.getMusicGroupId());
+        MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(studentRegistration.getMusicGroupId());
         if(musicGroupRegCalender == null){
         	throw new BizException("缴费信息不存在");
         }
@@ -792,7 +744,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         //新课程形态
         List<MusicGroupPaymentCalenderCourseSettings> newCourses = new ArrayList<>();
-        if (registerPayDto.getNewCourse() != null && registerPayDto.getNewCourse().size() > 0) {
+        if (musicGroupRegCalender.getPayUserType() == PayUserType.STUDENT && registerPayDto.getNewCourse() != null && registerPayDto.getNewCourse().size() > 0) {
             newCourses = musicGroupPaymentCalenderCourseSettingsDao.getCalenderCourseSettings(registerPayDto.getNewCourse());
             for (MusicGroupPaymentCalenderCourseSettings calenderCourseSetting : newCourses) {
                 if (remitCourseRFeeFlag && !calenderCourseSetting.getIsStudentOptional()) {
@@ -993,12 +945,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if(payStatus != PayStatus.FAILED){
         	if(payStatus == PayStatus.SUCCESSED){
         		throw new BizException("订单已支付成功,请勿重复支付");
-        	}else if(payStatus == PayStatus.PAYING){
+        	}/*else if(payStatus == PayStatus.PAYING){
         		throw new BizException("订单还在交易中,请稍后重试");
-        	}
+        	}*/
         }
 
-    	MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.getMusicGroupRegCalender(studentRegistration.getMusicGroupId());
+    	MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(studentRegistration.getMusicGroupId());
         if(musicGroupRegCalender == null){
         	throw new BizException("缴费信息不存在");
         }
@@ -1072,7 +1024,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()) {
@@ -1461,7 +1413,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             throw new BizException("乐团机构信息异常,请联系管理员");
         }
         //预报名开关
-        String configValue = sysTenantConfigDao.getConfigValue(SysConfigService.MUSIC_PRE_APPLY_OPEN_FLAG, musicGroup.getTenantId());
+        String configValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.MUSIC_PRE_APPLY_OPEN_FLAG, musicGroup.getTenantId());
         if(StringUtils.isNotEmpty(configValue) && configValue.equals(1)){
             //记录操作日志
             musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "审核通过(审核中 -> 预报名)", sysUser.getId(), ""));
@@ -1686,14 +1638,15 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }*/
         //获取当前乐团所有已报名学员
         List<StudentRegistration> registrations = studentRegistrationDao.findClassGroupStu(musicGroupId, null);
-        if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN) {
+        String configValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.REFUND_PERIOD, musicGroup.getTenantId());
+        if (StringUtils.isNotEmpty(configValue) && musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN) {
             if (registrations != null && registrations.size() > 0) {
                 Map<Integer, String> map = new HashMap<>(registrations.size());
                 registrations.forEach(e -> {
                     map.put(e.getUserId(), e.getUserId().toString());
                 });
                 sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_MUSIC_GROUP_CLOSE,
-                        map, null, 0, "1", "STUDENT", musicGroup.getName(), sysConfigDao.findConfigValue(SysConfigService.REFUND_PERIOD));
+                        map, null, 0, "1", "STUDENT", musicGroup.getName(), configValue);
             }
         }
         //将学生退团
@@ -2767,6 +2720,255 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public void directQuitMusicGroupOa(String musicGroupId, Integer userId, String reason, boolean isRefundInstrumentFee,
+                                        boolean isRefundTeachingAssistantsFee, boolean maintenanceFee,BigDecimal amount) {
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        if (musicGroup == null) {
+            return ;
+        }
+        if (musicGroup.getStatus() == MusicGroupStatusEnum.CANCELED || musicGroup.getStatus() == MusicGroupStatusEnum.PAUSE) {
+            return;
+        }
+
+        StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
+        if (studentRegistration == null) {
+            return;
+        }
+
+        StudentMusicGroupStatusEnum currentStudentMusicGroupStatus = studentRegistration.getMusicGroupStatus();
+        if (currentStudentMusicGroupStatus != StudentMusicGroupStatusEnum.NORMAL && currentStudentMusicGroupStatus != StudentMusicGroupStatusEnum.APPLY) {
+            return;
+        }
+
+        // 有进行中的课程不能退团
+        List<CourseSchedule> courseScheduleList = courseScheduleDao.findMusicGroupCourseSchedulesWithStudent(musicGroupId, GroupType.MUSIC.getCode(),
+                "UNDERWAY", userId);
+        if (courseScheduleList != null && courseScheduleList.size() > 0) {
+            return;
+        }
+
+        boolean hasPaid = studentRegistration.getMusicGroupStatus().equals(StudentMusicGroupStatusEnum.NORMAL);
+
+        //如果是会员团,并且有预排课计划
+        MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.findByCourseDateAndMusicGroupId(musicGroupId, null, 0);
+        if(termCourseDetail != null){
+            //是否已经预排部分课程
+            List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(musicGroup.getId());
+            if(courseSchedules.size() > 0){
+                return;
+            }else {
+                musicGroupSchoolTermStudentCourseDetailDao.deleteByDetailId(termCourseDetail.getId(),userId);
+            }
+        }
+
+        courseScheduleStudentPaymentService.updateCourseActualPrice(Arrays.asList(musicGroupId), Arrays.asList(userId), GroupType.MUSIC);
+
+        Date date = new Date();
+
+        MusicGroupQuit musicGroupQuit = new MusicGroupQuit();
+        musicGroupQuit.setCreateTime(date);
+        musicGroupQuit.setJoinDate(studentRegistration.getCreateTime());
+        musicGroupQuit.setMusicGroupId(musicGroupId);
+        musicGroupQuit.setUserId(userId);
+        musicGroupQuit.setStatus(ApprovalStatus.APPROVED);
+        musicGroupQuit.setReason(reason);
+        musicGroupQuit.setQuitDate(date);
+        musicGroupQuitDao.insert(musicGroupQuit);
+
+        List<Integer> classGroupIdList = classGroupStudentMapperDao.queryClassGroupIdList(musicGroupId, userId, GroupType.MUSIC);
+        for (Integer classGroupId : classGroupIdList) {
+            ClassGroup classGroup = classGroupService.get(classGroupId);
+            if (classGroup.getType().equals(ClassGroupTypeEnum.MUSIC_NETWORK)) {
+                classGroupService.delSingle(classGroupId);
+            } else {
+                classGroupStudentMapperService.delClassGroupStudent(userId, classGroupId, true);
+            }
+        }
+
+        //删除续费周期
+        musicGroupStudentFeeDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
+
+        // 退团
+        studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.QUIT);
+        studentRegistration.setSurplusCourseFee(BigDecimal.ZERO);
+        studentRegistration.setHasCloudTeacher(0);
+        studentRegistration.setUpdateTime(date);
+        studentRegistrationDao.update(studentRegistration);
+
+        //删除进行中加学生,且在审批中或拒绝的缴费
+        List<Long> paymentCalenderIdList = musicGroupPaymentCalenderDao.findStudentNoPaymentCalender(userId, musicGroupId);
+        if (paymentCalenderIdList != null && paymentCalenderIdList.size() > 0) {
+            musicGroupPaymentCalenderDao.delByIds(paymentCalenderIdList);
+        }
+
+        //查询未交费的项目
+        List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetailList = musicGroupPaymentCalenderDetailDao.queryNotPaymentStudentByUserIdAndMusicGroupId(userId, musicGroupId);
+
+        for (MusicGroupPaymentCalenderDetail mgpcd : musicGroupPaymentCalenderDetailList) {
+            MusicGroupPaymentCalender mgpc = musicGroupPaymentCalenderDao.get(mgpcd.getMusicGroupPaymentCalenderId());
+            if (mgpc != null) {
+                if (mgpc.getPaymentType() == PaymentType.ADD_STUDENT) {
+                    musicGroupPaymentCalenderDao.delete(mgpc.getId());
+                } else {
+                    // 缴费项目预计人数减一
+                    mgpc.setExpectNum(mgpc.getExpectNum() - 1);
+                    mgpc.setUpdateTime(date);
+                    musicGroupPaymentCalenderDao.update(mgpc);
+                }
+            }
+            musicGroupPaymentCalenderDetailDao.delete(mgpcd.getId());
+        }
+        //删除用户购买的课程记录
+        musicGroupPaymentStudentCourseDetailDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
+
+        List<StudentPaymentOrder> studentPaymentOrderList = new ArrayList<StudentPaymentOrder>();
+
+		if (studentRegistration.getMusicGroupPaymentCalenderId() == null) {
+			if(currentStudentMusicGroupStatus == StudentMusicGroupStatusEnum.NORMAL || (currentStudentMusicGroupStatus == StudentMusicGroupStatusEnum.APPLY && studentRegistration.getPaymentStatus() == PaymentStatusEnum.YES)){
+				studentPaymentOrderList = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, SUCCESS);
+			}
+
+		} else {
+			studentPaymentOrderList = studentPaymentOrderService.queryByBatchNo(userId, studentRegistration.getMusicGroupPaymentCalenderId() + "",
+					DealStatusEnum.SUCCESS);
+		}
+
+        // 判断乐器是否是租赁
+        MusicGroupSubjectPlan musicGroupSubjectPlan = musicGroupSubjectPlanDao.getMusicOneSubjectClassPlan(musicGroupId, studentRegistration.getActualSubjectId());
+        if (hasPaid && musicGroupSubjectPlan != null) {
+            musicGroupSubjectPlan.setUpdateTime(date);
+            //减去缴费人数(器乐收费,0元时不减缴费人数)
+            if (musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE) {
+
+            	for(StudentPaymentOrder studentPaymentOrder : studentPaymentOrderList){
+            		if (studentPaymentOrder != null && studentPaymentOrder.getPaymentAccountNo() != null && studentPaymentOrder.getPaymentAccountNo().equals("200")) {
+                        musicGroupSubjectPlan.setPaidZeroNum(musicGroupSubjectPlan.getPaidZeroNum() - 1);
+                        musicGroupSubjectPlan.setPaidStudentNum(musicGroupSubjectPlan.getPaidStudentNum() - 1);
+                        break;
+                    } else if (studentPaymentOrder != null && studentPaymentOrder.getPaymentAccountNo() == null) {
+                        musicGroupSubjectPlan.setPaidStudentNum(musicGroupSubjectPlan.getPaidStudentNum() - 1);
+                        break;
+                    }
+            	}
+            } else {
+                musicGroupSubjectPlan.setPaidStudentNum(musicGroupSubjectPlan.getPaidStudentNum() - 1);
+            }
+            musicGroupSubjectPlanDao.update(musicGroupSubjectPlan);
+        }
+
+        if (MusicGroupStatusEnum.PROGRESS.equals(musicGroup.getStatus())) {
+            //统计变更学员数
+            groupEventSource.musicGroupStudentChangeEvent(musicGroupId, StudentMusicGroupStatusEnum.QUIT, new ArrayList<>(Arrays.asList(userId)));
+        }
+
+        if (studentPaymentOrderList.size() > 0) {
+
+        	List<Long> paymentOrderIdList = studentPaymentOrderList.stream().map(t -> t.getId()).collect(Collectors.toList());
+
+        	Long minPaymentOrderId = Collections.min(paymentOrderIdList);
+
+            List<StudentPaymentOrderDetail> orderDetailList = studentPaymentOrderDetailDao.getWithIds(paymentOrderIdList);
+
+            SubjectChange studentLastChange = null;
+            if (isRefundInstrumentFee || isRefundTeachingAssistantsFee) {
+                studentLastChange = subjectChangeDao.getStudentLastChange(userId, musicGroupId);
+            }
+
+			if (studentLastChange != null && minPaymentOrderId <= studentLastChange.getOriginalOrderId()) {
+				if (isRefundInstrumentFee) {
+					StudentInstrument studentMaintenance = studentInstrumentDao.getByOrderId(studentLastChange.getOrderId().longValue());
+		            if (studentMaintenance != null) {
+		                studentMaintenance.setDelFlag(1);
+		                studentInstrumentDao.update(studentMaintenance);
+		            }
+				}
+			} else {
+				for (StudentPaymentOrderDetail detail : orderDetailList) {
+					// 退乐器费用
+					if (isRefundInstrumentFee && detail.getType() == MUSICAL) {
+						StudentInstrument studentMaintenance = studentInstrumentDao.getStudentMaintenance(userId, musicGroupId);
+			            if (studentMaintenance != null) {
+			                studentMaintenance.setDelFlag(1);
+			                studentInstrumentDao.update(studentMaintenance);
+			            }
+					}
+				}
+			}
+
+        }
+        //退乐保费用
+        if (maintenanceFee) {
+            StudentInstrument studentMaintenance = studentInstrumentDao.getStudentMaintenance(userId, musicGroupId);
+            if (studentMaintenance != null) {
+                studentMaintenance.setStatus(0);
+                studentMaintenance.setStartTime(null);
+                studentMaintenance.setEndTime(null);
+                studentInstrumentDao.update(studentMaintenance);
+            }
+        }
+
+        if (amount.doubleValue() > 0) {
+            //这个接口没有退费的操作了
+            SysUserCashAccountLog sysUserCashAccountLog = new SysUserCashAccountLog();
+            sysUserCashAccountLog.setGroupType(GroupType.MUSIC);
+            sysUserCashAccountLog.setUserId(userId);
+            sysUserCashAccountLog.setOrganId(musicGroup.getOrganId());
+            sysUserCashAccountLog.setGroupId(musicGroupId);
+            sysUserCashAccountLog.setAmount(amount);
+            sysUserCashAccountLog.setReturnFeeType(ReturnFeeEnum.MUSIC);
+            sysUserCashAccountLog.setComment("OA审批退团");
+            sysUserCashAccountLogDao.insert(sysUserCashAccountLog);
+        }
+    }
+
+    @Override
+    public void checkDirectQuitMusicGroupOa(String musicGroupId, Integer userId) {
+        SysUser user = teacherDao.getUser(userId);
+        if (user == null) {
+            throw new BizException("学员 {} 信息不存在",userId);
+        }
+        Student student = studentDao.get(userId);
+        if(student == null){
+            throw new BizException("学员 {} 信息不存在",userId);
+        }
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        if (musicGroup == null) {
+            throw new BizException("乐团 {} 不存在",musicGroupId);
+        }
+        if (musicGroup.getStatus() == MusicGroupStatusEnum.CANCELED || musicGroup.getStatus() == MusicGroupStatusEnum.PAUSE) {
+            throw new BizException("退团失败,乐团 {} {} 状态[已取消]或[已暂停]",musicGroupId,musicGroup.getName());
+        }
+
+        StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
+        if (studentRegistration == null) {
+            throw new BizException("学员 {} {} 注册信息不存在",userId,user.getUsername());
+        }
+
+        StudentMusicGroupStatusEnum currentStudentMusicGroupStatus = studentRegistration.getMusicGroupStatus();
+        if (currentStudentMusicGroupStatus != StudentMusicGroupStatusEnum.NORMAL && currentStudentMusicGroupStatus != StudentMusicGroupStatusEnum.APPLY) {
+            throw new BizException("学员 {} {} 当前在团状态不能退团",userId,user.getUsername());
+        }
+
+        // 有进行中的课程不能退团
+        List<CourseSchedule> courseScheduleList = courseScheduleDao.findMusicGroupCourseSchedulesWithStudent(musicGroupId, GroupType.MUSIC.getCode(),
+                "UNDERWAY", userId);
+        if (courseScheduleList != null && courseScheduleList.size() > 0) {
+            throw new BizException("学员 {} {} 存在[进行中]的课程",userId,user.getUsername());
+        }
+
+        //如果是会员团,并且有预排课计划
+        MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.findByCourseDateAndMusicGroupId(musicGroupId, null, 0);
+        if(termCourseDetail != null){
+            //是否已经预排部分课程
+            List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(musicGroup.getId());
+            if(courseSchedules.size() > 0){
+                throw new BizException("乐团 {} {} 存在预排课课程,请优先完成预排课",musicGroupId,musicGroup.getName());
+            }
+        }
+    }
+
+    @Override
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public Map renew(RenewParamDto renewParamDto) throws Exception {
         Long calenderId = renewParamDto.getCalenderId();
         Integer userId = renewParamDto.getUserId();
@@ -2790,9 +2992,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);
@@ -3668,9 +3870,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         Integer paymentStudentNum = studentRegistrationDao.getPaymentStudentNum(musicGroupId);
 
         //若乐团新建团,则操作【确认开团】时,若【已缴费】学员达到98人,则无需对【未缴费】学员新增回访
-        String configValue = sysTenantConfigDao.getConfigValue(SysConfigService.NEW_MUSIC_PAYMENT_STUDENT_NUM, musicGroup.getTenantId());
+        String configValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.NEW_MUSIC_PAYMENT_STUDENT_NUM, musicGroup.getTenantId());
         //若乐团不是新建团,则操作【确认开团】时,若【已缴费】学员达到58人,则无需对【未缴费】学员新增回访
-        String configValue1 = sysTenantConfigDao.getConfigValue(SysConfigService.OLD_MUSIC_PAYMENT_STUDENT_NUM, musicGroup.getTenantId());
+        String configValue1 = sysTenantConfigService.getTenantConfigValue(SysConfigService.OLD_MUSIC_PAYMENT_STUDENT_NUM, musicGroup.getTenantId());
         if ((StringUtils.isNotEmpty(configValue) && cooperationMusicGroupNum <= 0 && paymentStudentNum < Integer.parseInt(configValue)) ||
                 (StringUtils.isNotEmpty(configValue1) && cooperationMusicGroupNum > 0 && paymentStudentNum < Integer.parseInt(configValue1))) {
             checkStudentVisit(musicGroupId);

+ 13 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectPlanServiceImpl.java

@@ -8,6 +8,8 @@ import java.util.Map;
 
 import javax.annotation.Resource;
 
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.service.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -15,13 +17,6 @@ import org.springframework.stereotype.Service;
 import com.alibaba.fastjson.JSON;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.ChargeTypeSubjectMapperDao;
-import com.ym.mec.biz.dal.dao.GoodsDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderCourseSettingsDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
-import com.ym.mec.biz.dal.dao.MusicGroupSubjectPlanDao;
-import com.ym.mec.biz.dal.dao.OrganizationCloudTeacherFeeDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
 import com.ym.mec.biz.dal.dto.MusicGroupGoodsAndDiscountDto;
 import com.ym.mec.biz.dal.dto.MusicGroupRegRespDto;
 import com.ym.mec.biz.dal.dto.MusicGroupSubjectGoodsAndInfoDto;
@@ -39,14 +34,6 @@ import com.ym.mec.biz.dal.entity.Subject;
 import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.GoodsType;
-import com.ym.mec.biz.service.GoodsService;
-import com.ym.mec.biz.service.MemberRankPrivilegesService;
-import com.ym.mec.biz.service.MusicGroupService;
-import com.ym.mec.biz.service.MusicGroupSubjectGoodsGroupService;
-import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
-import com.ym.mec.biz.service.OrganizationCourseUnitPriceSettingsService;
-import com.ym.mec.biz.service.StudentRegistrationService;
-import com.ym.mec.biz.service.SubjectService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
@@ -62,6 +49,8 @@ public class MusicGroupSubjectPlanServiceImpl extends BaseServiceImpl<Integer, M
 
     @Autowired
     private GoodsService goodsService;
+    @Autowired
+    private SysTenantConfigDao sysTenantConfigDao;
 
     @Autowired
     private MusicGroupSubjectGoodsGroupService musicGroupSubjectGoodsGroupService;
@@ -123,10 +112,16 @@ public class MusicGroupSubjectPlanServiceImpl extends BaseServiceImpl<Integer, M
     @Override
     public MusicGroupSubjectGoodsAndInfoDto getSubjectGoodsAndInfo(String musicGroupId, Integer subjectId) {
         MusicGroup musicGroup = musicGroupService.get(musicGroupId);
-        
         if(musicGroup == null){
         	throw new BizException("乐团信息查询失败");
         }
+        if(musicGroup.getTenantId() == null){
+        	throw new BizException("乐团机构信息异常,请联系管理员");
+        }
+        String configValue = sysTenantConfigDao.getConfigValue(SysConfigService.MEMBER_GROUP_TERM_GIVE_COURSE_TIME, musicGroup.getTenantId());
+        if(StringUtils.isEmpty(configValue)){
+            throw new BizException("请配置会员团每学期赠送课程分钟数");
+        }
 
         //课程形态
         Map<String, Object> courseForm = JSON.parseObject(musicGroup.getCourseForm(), Map.class);
@@ -189,12 +184,12 @@ public class MusicGroupSubjectPlanServiceImpl extends BaseServiceImpl<Integer, M
 			OrganizationCourseUnitPriceSettings singleUnitPriceSettings = organizationCourseUnitPriceSettingsService.queryByOrganIdAndCourseTypeAndChargeType(musicGroup.getOrganId(), CourseScheduleType.SINGLE, musicGroup.getChargeTypeId());
 			if (singleUnitPriceSettings != null) {
 				memberCoursePrice.put(CourseScheduleType.SINGLE.name(),
-						singleUnitPriceSettings.getUnitPrice().multiply(new BigDecimal(1980)).setScale(0, BigDecimal.ROUND_HALF_UP));
+						singleUnitPriceSettings.getUnitPrice().multiply(new BigDecimal(configValue)).setScale(0, BigDecimal.ROUND_HALF_UP));
 			}
 			OrganizationCourseUnitPriceSettings mixUnitPriceSettings = organizationCourseUnitPriceSettingsService.queryByOrganIdAndCourseTypeAndChargeType(musicGroup.getOrganId(), CourseScheduleType.MIX, musicGroup.getChargeTypeId());
 			if (mixUnitPriceSettings != null) {
 				memberCoursePrice.put(CourseScheduleType.MIX.name(),
-						mixUnitPriceSettings.getUnitPrice().multiply(new BigDecimal(1980)).setScale(0, BigDecimal.ROUND_HALF_UP));
+						mixUnitPriceSettings.getUnitPrice().multiply(new BigDecimal(configValue)).setScale(0, BigDecimal.ROUND_HALF_UP));
 			}
 			
 			musicGroupSubjectGoodsAndInfo.setMemberCoursePrice(memberCoursePrice);

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

@@ -396,6 +396,9 @@ public class OnlineMusicGroupServiceImpl implements OnlineMusicGroupService {
         if (Objects.isNull(student.getOrganId())) {
             throw new BizException("未找到用户分部属性");
         }
+        if (Objects.isNull(student.getTenantId())) {
+            throw new BizException("未找到用户机构属性");
+        }
         Teacher teacher = teacherDao.get(teacherId);
         if (Objects.isNull(teacher)) {
             throw new BizException("教师不存在");
@@ -486,7 +489,7 @@ public class OnlineMusicGroupServiceImpl implements OnlineMusicGroupService {
         Date firstMonday = DateUtil.getWeekDayWithDate(applyStartDate, Calendar.MONDAY);
         Date secondSunday = DateUtil.getWeekDayWithDate(applyEndDate, Calendar.SUNDAY);
 
-        List<Date> enableApplyDates = practiceGroupService.getEnableApplyDatesIncludeAllTimes(applyStartDate, applyEndDate);
+        List<Date> enableApplyDates = practiceGroupService.getEnableApplyDatesIncludeAllTimes(applyStartDate, applyEndDate,student.getTenantId());
         List<CourseSchedule> allTeacherCourses = courseScheduleDao.findTeacherCoursesWithDateRange(teacherId, firstMonday, secondSunday);
         allTeacherCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
 

Некоторые файлы не были показаны из-за большого количества измененных файлов