Browse Source

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

yonge 5 years ago
parent
commit
a8bd2fea5d

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

@@ -7,7 +7,6 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -124,4 +123,13 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	 * @return
 	 */
     List<CourseScheduleTeachersDto> queryTeacherSalary(Integer courseScheduleId);
+
+    /**
+     * @describe 根据课程获取课程相关的老师课酬记录
+     * @author Joburgess
+     * @date 2019/11/3
+     * @param courseScheduleIds: 课程编号列表
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
+     */
+    List<CourseScheduleTeacherSalary> findByCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 }

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

@@ -2,8 +2,21 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
 import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface SysUserCashAccountDetailDao extends BaseDAO<Long, SysUserCashAccountDetail> {
 
     SysUserCashAccountDetail selectDetailByTransNo(String transNo);
-}
+
+    /**
+     * @describe 批量插入
+     * @author Joburgess
+     * @date 2019/11/4
+     * @param sysUserCashAccountDetails: 现金账户明细
+     * @return int
+     */
+    int batchInsert(@Param("sysUserCashAccountDetails") List<SysUserCashAccountDetail> sysUserCashAccountDetails);
+
+}

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

@@ -92,6 +92,10 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
 	/** 乐团课90分钟课酬计算时的收费类型 */
 	String MUSIC_GROUP_CHARGE_TYPE_90_="music_group_charge_type_90_";
 
+	String MUSIC_GROUP_SETTLEMENT_CLASS_MINUTES="music_group_settlement_class_minutes";
+
+	String MUSIC_GROUP_SETTLEMENT_SINGLE_CLASS_MINUTES="music_group_settlement_single_class_minutes";
+
 	/**
 	 * @params paramName
 	 * @return com.ym.mec.biz.dal.entity.SysConfig

+ 77 - 44
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -54,6 +54,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Autowired
     private MusicGroupDao musicGroupDao;
     @Autowired
+    private MusicGroupBuildLogDao musicGroupBuildLogDao;
+    @Autowired
     private MusicGroupService musicGroupService;
     @Autowired
     private ClassGroupRelationService classGroupRelationService;
@@ -630,6 +632,17 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void addMusicGroupTeam(Integer teacherId, String musicGroupId, Integer improventClassesNum) throws Exception {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            throw new Exception("用户信息获取失败");
+        }
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        if(musicGroup == null){
+            throw new Exception("乐团信息不存在");
+        }
+        if(musicGroup.getStatus() != MusicGroupStatusEnum.PREPARE){
+            throw new Exception("当前乐团状态不允许此操作");
+        }
         //所有学员都已经分配
         List<StudentRegistration> students = studentRegistrationDao.getNoClassStuBySubjectId(musicGroupId, null);
         if (students != null && students.size() > 0) {
@@ -641,12 +654,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             throw new Exception("还有单技班未分配合奏");
         }
         //设置教学主管
-        MusicGroup musicGroup = new MusicGroup();
-        musicGroup.setId(musicGroupId);
         musicGroup.setDirectorUserId(teacherId);
         musicGroup.setImproventClassesNum(improventClassesNum);
         musicGroup.setUpdateTime(new Date());
         musicGroupDao.update(musicGroup);
+        musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId,"成团确认(学员、班级、教学主管已设置)",sysUser.getId(),""));
     }
 
     @Override
@@ -819,7 +831,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         Date date = new Date();
         String musicGroupId = classGroup4MixDto.getMusicGroupId();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
-        if (musicGroup != null) {
+        if (musicGroup == null) {
             throw new Exception("乐团不存在");
         }
         Integer schoolId = musicGroup.getSchoolId();
@@ -942,20 +954,27 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
                     List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacherMapper.getUserId(), "SINGLE", musicGroup.getSettlementType());
                     BigDecimal salary = new BigDecimal("0");
-                    for (TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary : teacherSalaryList) {
-                        //对应基准课酬
-                        BigDecimal baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                        //基准课酬
-//                        if (teacherDefaultMusicGroupSalary.getSettlementType().equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
-//                            salary = new BigDecimal(classCourseDuration).divide(new BigDecimal(30)).multiply(baseSalary).setScale(2, BigDecimal.ROUND_HALF_UP);
-//                            break;
-//                        }
-//                        //阶梯课酬
-//                        if (classCourseDuration >= teacherDefaultMusicGroupSalary.getDurationMin() && classCourseDuration <= teacherDefaultMusicGroupSalary.getDurationMin()) {
-//                            salary = baseSalary;
-//                            break;
-//                        }
+
+                    Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+
+                    TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary=collect.get(classGroup4MixDto.getCourseType());
+
+                    //对应基准课酬
+                    BigDecimal baseSalary = new BigDecimal(0),classTimeDuty=new BigDecimal(0);
+
+                    //基准课酬
+                    if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
+                        //课程时长与结算单位时长占比
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(30));
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                    }
+                    //阶梯课酬
+                    if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                        //课程时长与结算单位时长占比
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(90));
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                     }
+                    salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
                     CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
                     courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
@@ -1018,7 +1037,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         Date date = new Date();
         String musicGroupId = classGroup4MixDto.getMusicGroupId();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
-        if (musicGroup != null) {
+        if (musicGroup == null) {
             throw new Exception("乐团不存在");
         }
         ClassGroup classgroup = classGroupDao.get(classGroup4MixDto.getClassGroupId());
@@ -1143,20 +1162,27 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
                     List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacherMapper.getUserId(), "SINGLE", musicGroup.getSettlementType());
                     BigDecimal salary = new BigDecimal("0");
-                    for (TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary : teacherSalaryList) {
-                        //对应基准课酬
-                        BigDecimal baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                        //基准课酬
-//                        if (teacherDefaultMusicGroupSalary.getSettlementType().equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
-//                            salary = new BigDecimal(classCourseDuration).divide(new BigDecimal(30)).multiply(baseSalary).setScale(2, BigDecimal.ROUND_HALF_UP);
-//                            break;
-//                        }
-//                        //阶梯课酬
-//                        if (classCourseDuration >= teacherDefaultMusicGroupSalary.getDurationMin() && classCourseDuration <= teacherDefaultMusicGroupSalary.getDurationMin()) {
-//                            salary = baseSalary;
-//                            break;
-//                        }
+
+                    Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+
+                    TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary=collect.get(classGroup4MixDto.getCourseType());
+
+                    //对应基准课酬
+                    BigDecimal baseSalary = new BigDecimal(0),classTimeDuty=new BigDecimal(0);
+
+                    //基准课酬
+                    if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
+                        //课程时长与结算单位时长占比
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(30));
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                    }
+                    //阶梯课酬
+                    if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                        //课程时长与结算单位时长占比
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(90));
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                     }
+                    salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
                     CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
                     courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
@@ -1223,7 +1249,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         Date date = new Date();
         String musicGroupId = classGroup4MixDto.getMusicGroupId();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
-        if (musicGroup != null) {
+        if (musicGroup == null) {
             throw new Exception("乐团不存在");
         }
         Integer schoolId = musicGroup.getSchoolId();
@@ -1346,20 +1372,27 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
                     List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacherMapper.getUserId(), "SINGLE", musicGroup.getSettlementType());
                     BigDecimal salary = new BigDecimal("0");
-                    for (TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary : teacherSalaryList) {
-                        //对应基准课酬
-                        BigDecimal baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                        //基准课酬
-//                        if (teacherDefaultMusicGroupSalary.getSettlementType().equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
-//                            salary = new BigDecimal(classCourseDuration).divide(new BigDecimal(30)).multiply(baseSalary).setScale(2, BigDecimal.ROUND_HALF_UP);
-//                            break;
-//                        }
-                        //阶梯课酬
-//                        if (classCourseDuration >= teacherDefaultMusicGroupSalary.getDurationMin() && classCourseDuration <= teacherDefaultMusicGroupSalary.getDurationMin()) {
-//                            salary = baseSalary;
-//                            break;
-//                        }
+
+                    Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+
+                    TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary=collect.get(classGroup4MixDto.getCourseType());
+
+                    //对应基准课酬
+                    BigDecimal baseSalary = new BigDecimal(0),classTimeDuty=new BigDecimal(0);
+
+                    //基准课酬
+                    if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
+                        //课程时长与结算单位时长占比
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(30));
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                    }
+                    //阶梯课酬
+                    if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                        //课程时长与结算单位时长占比
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(90));
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                     }
+                    salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
                     CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
                     courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());

+ 27 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java

@@ -8,10 +8,7 @@ import com.ym.mec.biz.dal.dto.ClassGroupTeachersDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
 import com.ym.mec.biz.dal.enums.TeachTypeEnum;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.ClassGroupTeacherMapperService;
-import com.ym.mec.biz.service.CourseScheduleService;
-import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.entity.ImGroupModel;
@@ -47,6 +44,8 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     private ImFeignService imFeignService;
     @Autowired
     private ClassGroupService classGroupService;
+    @Autowired
+    private MusicGroupService musicGroupService;
 
     @Override
     public BaseDAO<Long, ClassGroupTeacherMapper> getDAO() {
@@ -104,7 +103,11 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         List<ClassGroupTeacherSalary> classGroupTeacherSalaryList = new ArrayList<>();
         List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
 
+        String musicGroupId = classGroupTeacherMapperList.get(0).getMusicGroupId();
+        MusicGroup musicGroup = musicGroupService.get(musicGroupId);
+
         List<CourseSchedule> classGroupNoStartCourseSchedules = courseScheduleService.findClassGroupNoStartCourseSchedules(classGroupTeacherMapperList);
+
         for (CourseSchedule classGroupNoStartCourseSchedule : classGroupNoStartCourseSchedules) {
 
             if (!classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.SINGLE) &&
@@ -122,20 +125,26 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                 BigDecimal salary = new BigDecimal("0");
                 List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalaryList = classGroupTeacherMapper.getTeacherDefaultMusicGroupSalaryList();
 
-                for (TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary : teacherDefaultMusicGroupSalaryList) {
-                    //对应基准课酬
-//                    BigDecimal baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-//                    //基准课酬
-//                    if (teacherDefaultMusicGroupSalary.getSettlementType().equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
-//                        salary = new BigDecimal(duration).divide(new BigDecimal(30),8,BigDecimal.ROUND_HALF_UP).multiply(baseSalary).setScale(2, BigDecimal.ROUND_HALF_UP);
-//                        break;
-//                    }
-//                    //阶梯课酬
-//                    if (duration >= teacherDefaultMusicGroupSalary.getDurationMin() && duration <= teacherDefaultMusicGroupSalary.getDurationMin()) {
-//                        salary = baseSalary;
-//                        break;
-//                    }
+                Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherDefaultMusicGroupSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+
+                TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary=collect.get(classGroupNoStartCourseSchedule.getType());
+
+                //对应基准课酬
+                BigDecimal baseSalary = new BigDecimal(0),classTimeDuty=new BigDecimal(0);
+
+                //基准课酬
+                if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
+                    //课程时长与结算单位时长占比
+                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(30));
+                    baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
                 }
+                //阶梯课酬
+                if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                    //课程时长与结算单位时长占比
+                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(90));
+                    baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+                }
+                salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
                 //课程与老师薪水表
                 CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
@@ -271,7 +280,7 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         } else if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
             //课程时长与结算单位时长占比
             BigDecimal classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(90));
-            BigDecimal teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+            BigDecimal teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
             teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
         }
         return new CourseScheduleTeacherSalary(

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

@@ -299,7 +299,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 //                    .map(CourseSchedule::getId)
 //                    .collect(Collectors.toList());
 
-        courseScheduleDao.findCourseScheduleIdAndUserIdsMap(new ArrayList<>());
+//        courseScheduleDao.findCourseScheduleIdAndUserIdsMap(new ArrayList<>());
 
 		//将课程计划按照开课时间排序
 		allCourseSchedules.sort(Comparator.comparing(CourseSchedule::getStartClassTime));

+ 361 - 231
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -7,6 +7,7 @@ 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.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -20,235 +21,364 @@ import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
-public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long, CourseScheduleTeacherSalary>  implements CourseScheduleTeacherSalaryService {
-	
-	@Autowired
-	private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
-	@Autowired
-	private VipGroupActivityDao vipGroupActivityDao;
-	@Autowired
-	private CourseScheduleComplaintsDao courseScheduleComplaintsDao;
-	@Autowired
-	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
-	@Autowired
-	private SysUserCashAccountService sysUserCashAccountService;
-	@Autowired
-	private VipGroupService vipGroupService;
-	@Autowired
-	private SchoolService schoolService;
-	@Autowired
-	private CourseScheduleDao courseScheduleDao;
-	@Autowired
-	private TeacherDefaultMusicGroupSalaryDao teacherDefaultMusicGroupSalaryDao;
-	
-	@Autowired
-	private SysConfigDao sysConfigDao;
-
-	private static final Logger LOGGER = LoggerFactory
-			.getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
-
-	@Override
-	public BaseDAO<Long, CourseScheduleTeacherSalary> getDAO() {
-		return courseScheduleTeacherSalaryDao;
-	}
-
-	@Override
-	public int createCourseScheduleTeacherVipSalary(VipGroup vipGroup,
-													List<CourseSchedule> vipCourseSchedules,
-													BigDecimal onlineTeacherSalary,
-													BigDecimal offlineTeacherSalary) {
-
-		School school = schoolService.get(vipGroup.getTeacherSchoolId());
-		if(Objects.isNull(school)){
-			throw new BizException("未找到该教学点");
-		}
-
-		//获取活动信息
-		VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId().intValue());
-
-		List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries=new ArrayList<>();
-		Map<TeachModeEnum, List<CourseSchedule>> courseScheduleGroupByTeachMode = vipCourseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getTeachMode));
-
-		for(TeachModeEnum teachModeEnum:courseScheduleGroupByTeachMode.keySet()){
-			List<CourseSchedule> courseSchedules = courseScheduleGroupByTeachMode.get(teachModeEnum)
-					.stream()
-					.sorted(Comparator.comparing(CourseSchedule::getStartClassTime)).collect(Collectors.toList());
-			for(int i=0;i<courseSchedules.size();i++){
-				//创建教师课程薪水记录
-				CourseScheduleTeacherSalary courseScheduleTeacherSalary=new CourseScheduleTeacherSalary();
-				courseScheduleTeacherSalary.setCourseScheduleId(courseSchedules.get(i).getId());
-				courseScheduleTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
-				courseScheduleTeacherSalary.setUserId(courseSchedules.get(i).getActualTeacherId().intValue());
-				courseScheduleTeacherSalary.setClassGroupId(courseSchedules.get(i).getClassGroupId());
-				courseScheduleTeacherSalary.setSubsidy(school.getSubsidy());
-
-				Map<String,BigDecimal> feeInfo = vipGroupService.countVipGroupPredictFee(vipGroup,
-						courseSchedules.get(i).getActualTeacherId().intValue(),
-						onlineTeacherSalary,
-						offlineTeacherSalary,
-						false,
-						false);
-
-				if(vipGroupActivity.getType()== VipGroupActivityTypeEnum.GIVE_CLASS
-						&&vipGroup.getGiveTeachMode()==teachModeEnum
-						&&i>=Integer.parseInt(vipGroupActivity.getAttribute1())
-						&&"0".equals(vipGroupActivity.getGiveClassPaySalaryFlag())){
-					courseScheduleTeacherSalary.setExpectSalary(new BigDecimal(0));
-				}else {
-					if(teachModeEnum==TeachModeEnum.ONLINE){
-						courseScheduleTeacherSalary.setExpectSalary(feeInfo.get("onlineTeacherSalary"));
-					}else{
-						courseScheduleTeacherSalary.setExpectSalary(feeInfo.get("offlineTeacherSalary"));
-					}
-				}
-				courseScheduleTeacherSalaries.add(courseScheduleTeacherSalary);
-			}
-		}
-		return courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void teacherSalarySettlement() {
-		
-		int days = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.VIP_SETTLEMENT_CYCLE));
-
-		//获取教师未结算课程记录
-		List<CourseScheduleTeacherSalary> someDayAgoTeacherCourseSalaryNoSettlement = courseScheduleTeacherSalaryDao.findSomeDayAgoTeacherCourseSalaryNoSettlement(days);
-		if(CollectionUtils.isEmpty(someDayAgoTeacherCourseSalaryNoSettlement)){
-			LOGGER.info("未获取到未结算课酬记录!");
-			return;
-		}
-		Date now=new Date();
-		//获取未结算课程编号列表
-		List<Long> courseScheduleIds = someDayAgoTeacherCourseSalaryNoSettlement.stream().map(CourseScheduleTeacherSalary::getCourseScheduleId).collect(Collectors.toList());
-		//获取未结算课程投诉记录
-		List<CourseScheduleComplaints> courseScheduleComplaints = courseScheduleComplaintsDao.findByCourseScheduleIds(courseScheduleIds);
-		//获取未结算课程学生缴费信息
-		List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByCourseScheduleIds(courseScheduleIds);
-
-		//根据课程将投诉信息分组
-		Map<Long, List<CourseScheduleComplaints>> complaintsGroupByCourse = courseScheduleComplaints.stream().collect(Collectors.groupingBy(CourseScheduleComplaints::getCourseScheduleId));
-		//根据课程将学生缴费信息分组
-		Map<Long, List<CourseScheduleStudentPayment>> studentPaymentGroupByCourse = courseScheduleStudentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseScheduleId));
-
-		//需更新教师课程结算记录
-		List<CourseScheduleTeacherSalary> updateTeacherSalarys=new ArrayList<>();
-		//需更新学生课程缴费记录
-		List<CourseScheduleStudentPayment> updateStudentPayments=new ArrayList<>();
-
-		//用户账户自己变动信息列表
-		List<SysUserCashAccountDetail> userCashAccountDetails=new ArrayList<>();
-
-		//处理课酬信息
-		someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
-			//获取当前课程学生缴费记录
-			List<CourseScheduleStudentPayment> studentPaymentsWithCourse = studentPaymentGroupByCourse.get(courseScheduleTeacherSalary.getCourseScheduleId());
-			//当前课程缴费学生数量
-			BigDecimal courseStudentNum=new BigDecimal(studentPaymentsWithCourse.size());
-			//教师预计课酬
-			BigDecimal expectSalary=courseScheduleTeacherSalary.getExpectSalary();
-			//当前课程每个学生平均课酬
-			BigDecimal avgSalary=expectSalary.divide(courseStudentNum);
-			//教师当前课程责任总占比,当前课程应得课酬
-			BigDecimal teacherLiabilityAllratio;
-
-			//当前课程学生投诉记录
-			List<CourseScheduleComplaints> courseStudentComplaints=complaintsGroupByCourse.get(courseScheduleTeacherSalary.getCourseScheduleId());
-
-			//如果存在投诉记录,需要扣除相应费用
-			if(Objects.nonNull(courseStudentComplaints)){
-				//获取审批中的投诉
-				List<CourseScheduleComplaints> auditIng = courseStudentComplaints.stream().filter(courseScheduleComplaint -> courseScheduleComplaint.getStatus() == AuditStatusEnum.ING).collect(Collectors.toList());
-				if(!CollectionUtils.isEmpty(auditIng)){
-					//如果当前课程存在未处理的投诉,则不做结算处理
-					return;
-				}
-				//计算教师责任总占比
-				double teacherLiabilityRatioSum = courseStudentComplaints.stream().mapToDouble(CourseScheduleComplaints::getTeacherLiabilityRatio).sum();
-				teacherLiabilityAllratio=new BigDecimal(teacherLiabilityRatioSum);
-			}else{
-				//如果没有投诉,则教师和学生的责任占比为0
-				teacherLiabilityAllratio=new BigDecimal(0);
-			}
-
-			//教师应扣除费用
-			BigDecimal deductPrice=avgSalary.multiply(teacherLiabilityAllratio);
-			//教师实际课酬
-			BigDecimal actualSalary=expectSalary.subtract(deductPrice).add(courseScheduleTeacherSalary.getSubsidy());
-
-			//更新教师结算信息
-			courseScheduleTeacherSalary.setActualSalary(actualSalary);
-			courseScheduleTeacherSalary.setSettlementTime(now);
-			courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
-			updateTeacherSalarys.add(courseScheduleTeacherSalary);
-
-			//生成教师账户资金变动记录
-			sysUserCashAccountService.updateBalance(courseScheduleTeacherSalary.getUserId(),actualSalary);
-			SysUserCashAccount teacherCashAccount = sysUserCashAccountService.get(courseScheduleTeacherSalary.getUserId().intValue());
-			SysUserCashAccountDetail teacherCashAccountDetail=new SysUserCashAccountDetail();
-			teacherCashAccountDetail.setUserId(courseScheduleTeacherSalary.getUserId());
-			teacherCashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.REFUNDS);
-			teacherCashAccountDetail.setStatus(DealStatusEnum.SUCCESS);
-			teacherCashAccountDetail.setAmount(actualSalary);
-			teacherCashAccountDetail.setBalance(teacherCashAccount.getBalance());
-			teacherCashAccountDetail.setAttribute(courseScheduleTeacherSalary.getCourseScheduleId().toString());
-
-			userCashAccountDetails.add(teacherCashAccountDetail);
-
-			//根据学生进行投诉分组
-			Map<Integer, List<CourseScheduleComplaints>> complainsGroupByStudent = courseStudentComplaints.stream().collect(Collectors.groupingBy(CourseScheduleComplaints::getUserId));
-
-			//计算学生当前课程应缴费用
-			studentPaymentsWithCourse.forEach(studentPayment -> {
-				//当前课程学生应缴费用
-				BigDecimal studentExpectPrice=studentPayment.getExpectPrice();
-				//当前课程学生责任占比
-				BigDecimal studentLiabilityRatio;
-				List<CourseScheduleComplaints> currentCourseScheduleComplaints = complainsGroupByStudent.get(studentPayment.getUserId());
-				if(CollectionUtils.isEmpty(currentCourseScheduleComplaints)){
-					Double temp=currentCourseScheduleComplaints.get(0).getStudentLiabilityRatio();
-					studentLiabilityRatio=new BigDecimal(temp);
-				}else{
-					studentLiabilityRatio=new BigDecimal(0);
-				}
-
-				//当前课程学生应退费用
-				BigDecimal returnPrice=studentExpectPrice.multiply(studentLiabilityRatio);
-				//当前课程学生实际缴费
-				BigDecimal actualPrice=expectSalary.subtract(returnPrice);
-				//更新学生结算信息
-				studentPayment.setActualPrice(actualPrice);
-				studentPayment.setSettlementTime(now);
-				courseScheduleStudentPaymentDao.update(studentPayment);
-				updateStudentPayments.add(studentPayment);
-
-				//生成学生账户资金变动记录
-				sysUserCashAccountService.updateBalance(studentPayment.getUserId(),returnPrice);
-				SysUserCashAccount studentCashAccount = sysUserCashAccountService.get(studentPayment.getUserId().intValue());
-				SysUserCashAccountDetail studentAccountDetail=new SysUserCashAccountDetail();
-				studentAccountDetail.setUserId(studentPayment.getUserId());
-				studentAccountDetail.setType(PlatformCashAccountDetailTypeEnum.REFUNDS);
-				studentAccountDetail.setStatus(DealStatusEnum.SUCCESS);
-				studentAccountDetail.setAmount(returnPrice);
-				studentAccountDetail.setBalance(studentCashAccount.getBalance());
-				studentAccountDetail.setAttribute(courseScheduleTeacherSalary.getCourseScheduleId().toString());
-
-				userCashAccountDetails.add(studentAccountDetail);
-
-			});
-
-		});
-
-	}
-
-	@Override
-	public void musicGroupTeacherSalarySettlement() {
-		Date now=new Date();
-		Date yesterday= DateUtil.addDays1(now,-1);
-		List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
-		//获取昨天的课程计划
-		List<CourseSchedule> yesterdayCourseSchedules = courseScheduleDao.findCourseScheduleWithDate(yesterday);
-
-	}
+public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long, CourseScheduleTeacherSalary> implements CourseScheduleTeacherSalaryService {
+
+    @Autowired
+    private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
+    @Autowired
+    private VipGroupActivityDao vipGroupActivityDao;
+    @Autowired
+    private CourseScheduleComplaintsDao courseScheduleComplaintsDao;
+    @Autowired
+    private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+    @Autowired
+    private SysUserCashAccountService sysUserCashAccountService;
+    @Autowired
+    private VipGroupService vipGroupService;
+    @Autowired
+    private SchoolService schoolService;
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
+    @Autowired
+    private TeacherDefaultMusicGroupSalaryDao teacherDefaultMusicGroupSalaryDao;
+    @Autowired
+    private SysUserCashAccountDetailDao sysUserCashAccountDetailDao;
+    @Autowired
+    private SysConfigService sysConfigDao;
+
+    private static final Logger LOGGER = LoggerFactory
+            .getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
+
+    @Override
+    public BaseDAO<Long, CourseScheduleTeacherSalary> getDAO() {
+        return courseScheduleTeacherSalaryDao;
+    }
+
+    @Override
+    public int createCourseScheduleTeacherVipSalary(VipGroup vipGroup,
+                                                    List<CourseSchedule> vipCourseSchedules,
+                                                    BigDecimal onlineTeacherSalary,
+                                                    BigDecimal offlineTeacherSalary) {
+
+        School school = schoolService.get(vipGroup.getTeacherSchoolId());
+        if (Objects.isNull(school)) {
+            throw new BizException("未找到该教学点");
+        }
+
+        //获取活动信息
+        VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId().intValue());
+
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
+        Map<TeachModeEnum, List<CourseSchedule>> courseScheduleGroupByTeachMode = vipCourseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getTeachMode));
+
+        for (TeachModeEnum teachModeEnum : courseScheduleGroupByTeachMode.keySet()) {
+            List<CourseSchedule> courseSchedules = courseScheduleGroupByTeachMode.get(teachModeEnum)
+                    .stream()
+                    .sorted(Comparator.comparing(CourseSchedule::getStartClassTime)).collect(Collectors.toList());
+            for (int i = 0; i < courseSchedules.size(); i++) {
+                //创建教师课程薪水记录
+                CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+                courseScheduleTeacherSalary.setCourseScheduleId(courseSchedules.get(i).getId());
+                courseScheduleTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
+                courseScheduleTeacherSalary.setUserId(courseSchedules.get(i).getActualTeacherId().intValue());
+                courseScheduleTeacherSalary.setClassGroupId(courseSchedules.get(i).getClassGroupId());
+                courseScheduleTeacherSalary.setSubsidy(school.getSubsidy());
+
+                Map<String, BigDecimal> feeInfo = vipGroupService.countVipGroupPredictFee(vipGroup,
+                        courseSchedules.get(i).getActualTeacherId().intValue(),
+                        onlineTeacherSalary,
+                        offlineTeacherSalary,
+                        false,
+                        false);
+
+                if (vipGroupActivity.getType() == VipGroupActivityTypeEnum.GIVE_CLASS
+                        && vipGroup.getGiveTeachMode() == teachModeEnum
+                        && i >= Integer.parseInt(vipGroupActivity.getAttribute1())
+                        && "0".equals(vipGroupActivity.getGiveClassPaySalaryFlag())) {
+                    courseScheduleTeacherSalary.setExpectSalary(new BigDecimal(0));
+                } else {
+                    if (teachModeEnum == TeachModeEnum.ONLINE) {
+                        courseScheduleTeacherSalary.setExpectSalary(feeInfo.get("onlineTeacherSalary"));
+                    } else {
+                        courseScheduleTeacherSalary.setExpectSalary(feeInfo.get("offlineTeacherSalary"));
+                    }
+                }
+                courseScheduleTeacherSalaries.add(courseScheduleTeacherSalary);
+            }
+        }
+        return courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void teacherSalarySettlement() {
+
+        int days = Integer.parseInt(sysConfigDao.findByParamName(SysConfigService.VIP_SETTLEMENT_CYCLE).getParanValue());
+
+        //获取教师未结算课程记录
+        List<CourseScheduleTeacherSalary> someDayAgoTeacherCourseSalaryNoSettlement = courseScheduleTeacherSalaryDao.findSomeDayAgoTeacherCourseSalaryNoSettlement(days);
+        if (CollectionUtils.isEmpty(someDayAgoTeacherCourseSalaryNoSettlement)) {
+            LOGGER.info("未获取到未结算课酬记录!");
+            return;
+        }
+        Date now = new Date();
+        //获取未结算课程编号列表
+        List<Long> courseScheduleIds = someDayAgoTeacherCourseSalaryNoSettlement.stream().map(CourseScheduleTeacherSalary::getCourseScheduleId).collect(Collectors.toList());
+        //获取未结算课程投诉记录
+        List<CourseScheduleComplaints> courseScheduleComplaints = courseScheduleComplaintsDao.findByCourseScheduleIds(courseScheduleIds);
+        //获取未结算课程学生缴费信息
+        List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByCourseScheduleIds(courseScheduleIds);
+
+        //根据课程将投诉信息分组
+        Map<Long, List<CourseScheduleComplaints>> complaintsGroupByCourse = courseScheduleComplaints.stream().collect(Collectors.groupingBy(CourseScheduleComplaints::getCourseScheduleId));
+        //根据课程将学生缴费信息分组
+        Map<Long, List<CourseScheduleStudentPayment>> studentPaymentGroupByCourse = courseScheduleStudentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseScheduleId));
+
+        //需更新教师课程结算记录
+        List<CourseScheduleTeacherSalary> updateTeacherSalarys = new ArrayList<>();
+        //需更新学生课程缴费记录
+        List<CourseScheduleStudentPayment> updateStudentPayments = new ArrayList<>();
+
+        //用户账户自己变动信息列表
+        List<SysUserCashAccountDetail> userCashAccountDetails = new ArrayList<>();
+
+        //处理课酬信息
+        someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
+            //获取当前课程学生缴费记录
+            List<CourseScheduleStudentPayment> studentPaymentsWithCourse = studentPaymentGroupByCourse.get(courseScheduleTeacherSalary.getCourseScheduleId());
+            //当前课程缴费学生数量
+            BigDecimal courseStudentNum = new BigDecimal(studentPaymentsWithCourse.size());
+            //教师预计课酬
+            BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
+            //当前课程每个学生平均课酬
+            BigDecimal avgSalary = expectSalary.divide(courseStudentNum);
+            //教师当前课程责任总占比,当前课程应得课酬
+            BigDecimal teacherLiabilityAllratio;
+
+            //当前课程学生投诉记录
+            List<CourseScheduleComplaints> courseStudentComplaints = complaintsGroupByCourse.get(courseScheduleTeacherSalary.getCourseScheduleId());
+
+            //如果存在投诉记录,需要扣除相应费用
+            if (Objects.nonNull(courseStudentComplaints)) {
+                //获取审批中的投诉
+                List<CourseScheduleComplaints> auditIng = courseStudentComplaints.stream().filter(courseScheduleComplaint -> courseScheduleComplaint.getStatus() == AuditStatusEnum.ING).collect(Collectors.toList());
+                if (!CollectionUtils.isEmpty(auditIng)) {
+                    //如果当前课程存在未处理的投诉,则不做结算处理
+                    return;
+                }
+                //计算教师责任总占比
+                double teacherLiabilityRatioSum = courseStudentComplaints.stream().mapToDouble(CourseScheduleComplaints::getTeacherLiabilityRatio).sum();
+                teacherLiabilityAllratio = new BigDecimal(teacherLiabilityRatioSum);
+            } else {
+                //如果没有投诉,则教师和学生的责任占比为0
+                teacherLiabilityAllratio = new BigDecimal(0);
+            }
+
+            //教师应扣除费用
+            BigDecimal deductPrice = avgSalary.multiply(teacherLiabilityAllratio);
+            //教师实际课酬
+            BigDecimal actualSalary = expectSalary.subtract(deductPrice).add(courseScheduleTeacherSalary.getSubsidy());
+
+            //更新教师结算信息
+            courseScheduleTeacherSalary.setActualSalary(actualSalary);
+            courseScheduleTeacherSalary.setSettlementTime(now);
+            courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
+            updateTeacherSalarys.add(courseScheduleTeacherSalary);
+
+            //生成教师账户资金变动记录
+            sysUserCashAccountService.updateBalance(courseScheduleTeacherSalary.getUserId(), actualSalary);
+            SysUserCashAccount teacherCashAccount = sysUserCashAccountService.get(courseScheduleTeacherSalary.getUserId().intValue());
+            SysUserCashAccountDetail teacherCashAccountDetail = new SysUserCashAccountDetail();
+            teacherCashAccountDetail.setUserId(courseScheduleTeacherSalary.getUserId());
+            teacherCashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.REFUNDS);
+            teacherCashAccountDetail.setStatus(DealStatusEnum.SUCCESS);
+            teacherCashAccountDetail.setAmount(actualSalary);
+            teacherCashAccountDetail.setBalance(teacherCashAccount.getBalance());
+            teacherCashAccountDetail.setAttribute(courseScheduleTeacherSalary.getCourseScheduleId().toString());
+
+            userCashAccountDetails.add(teacherCashAccountDetail);
+
+            //根据学生进行投诉分组
+            Map<Integer, List<CourseScheduleComplaints>> complainsGroupByStudent = courseStudentComplaints.stream().collect(Collectors.groupingBy(CourseScheduleComplaints::getUserId));
+
+            //计算学生当前课程应缴费用
+            studentPaymentsWithCourse.forEach(studentPayment -> {
+                //当前课程学生应缴费用
+                BigDecimal studentExpectPrice = studentPayment.getExpectPrice();
+                //当前课程学生责任占比
+                BigDecimal studentLiabilityRatio;
+                List<CourseScheduleComplaints> currentCourseScheduleComplaints = complainsGroupByStudent.get(studentPayment.getUserId());
+                if (CollectionUtils.isEmpty(currentCourseScheduleComplaints)) {
+                    Double temp = currentCourseScheduleComplaints.get(0).getStudentLiabilityRatio();
+                    studentLiabilityRatio = new BigDecimal(temp);
+                } else {
+                    studentLiabilityRatio = new BigDecimal(0);
+                }
+
+                //当前课程学生应退费用
+                BigDecimal returnPrice = studentExpectPrice.multiply(studentLiabilityRatio);
+                //当前课程学生实际缴费
+                BigDecimal actualPrice = expectSalary.subtract(returnPrice);
+                //更新学生结算信息
+                studentPayment.setActualPrice(actualPrice);
+                studentPayment.setSettlementTime(now);
+                courseScheduleStudentPaymentDao.update(studentPayment);
+                updateStudentPayments.add(studentPayment);
+
+                //生成学生账户资金变动记录
+                sysUserCashAccountService.updateBalance(studentPayment.getUserId(), returnPrice);
+                SysUserCashAccount studentCashAccount = sysUserCashAccountService.get(studentPayment.getUserId().intValue());
+                SysUserCashAccountDetail studentAccountDetail = new SysUserCashAccountDetail();
+                studentAccountDetail.setUserId(studentPayment.getUserId());
+                studentAccountDetail.setType(PlatformCashAccountDetailTypeEnum.REFUNDS);
+                studentAccountDetail.setStatus(DealStatusEnum.SUCCESS);
+                studentAccountDetail.setAmount(returnPrice);
+                studentAccountDetail.setBalance(studentCashAccount.getBalance());
+                studentAccountDetail.setAttribute(courseScheduleTeacherSalary.getCourseScheduleId().toString());
+
+                userCashAccountDetails.add(studentAccountDetail);
+
+            });
+
+        });
+        sysUserCashAccountDetailDao.batchInsert(userCashAccountDetails);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void musicGroupTeacherSalarySettlement() {
+        Date now = new Date();
+        Date yesterday = DateUtil.addDays1(now, -1);
+        Integer settlementClassMinutes = Integer.parseInt(sysConfigDao.findByParamName(SysConfigService.MUSIC_GROUP_SETTLEMENT_CLASS_MINUTES).getParanValue());
+        Integer singleClassTime = Integer.parseInt(sysConfigDao.findByParamName(SysConfigService.MUSIC_GROUP_SETTLEMENT_SINGLE_CLASS_MINUTES).getParanValue());
+        //获取昨天的课程计划
+        List<CourseSchedule> yesterdayCourseSchedules = courseScheduleDao.findCourseScheduleWithDate(yesterday);
+        //课程编号列表
+        List<Long> courseScheduleIds = yesterdayCourseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+        //获取课程对应教学点补贴
+        List<Map<Integer, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
+        Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertMybatisMap(courseSubsidyByCourses);
+
+        //课程编号与课程对应集合
+        Map<Long, CourseSchedule> courseScheduleIdMap = yesterdayCourseSchedules.stream()
+                .collect(Collectors.toMap(CourseSchedule::getId, courseSchedule -> courseSchedule));
+
+        //课程教师课酬
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseScheduleIds);
+
+        //课程对应乐团结算方式集合
+        List<Map<String, String>> musicGroupSettlementTypeByCourse = courseScheduleTeacherSalaryDao.findMusicGroupSettlementTypeByCourse(courseScheduleIds);
+        Map<String, String> musicGroupSettlementsMap = MapUtil.convertMybatisMap(musicGroupSettlementTypeByCourse);
+
+        //教师对应课程列表集合
+        Map<Integer, List<CourseScheduleTeacherSalary>> teacherSalarysByTeacher = courseScheduleTeacherSalaries.stream()
+                .collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getUserId));
+
+        //所有老师编号
+        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));
+
+
+        //教师对应的每个教学点的总课时
+        Map<Integer, Map<Integer, Integer>> teacherClassMinutesMap = new HashMap<>();
+        //计算老师对应的总课时
+        teacherSalarysByTeacher.forEach((teacherId, teacherSalarys) -> {
+            //当前老师所在课程的编号列表
+            List<Long> currentTeacherCourscheduleIds = teacherSalarys.stream()
+                    .map(CourseScheduleTeacherSalary::getCourseScheduleId)
+                    .collect(Collectors.toList());
+            //当前老师的课程列表
+            List<CourseSchedule> currentTeacherCourseSchedules = yesterdayCourseSchedules.stream()
+                    .filter(courseSchedule -> currentTeacherCourscheduleIds.contains(courseSchedule.getId()))
+                    .collect(Collectors.toList());
+            //根据教学点将当前老师的课程分组
+            Map<Integer, List<CourseSchedule>> schoolCourseSchedules = currentTeacherCourseSchedules.stream()
+                    .collect(Collectors.groupingBy(CourseSchedule::getSchoolId));
+            Map<Integer, Integer> schoolClassMinutesMap = new HashMap<>();
+            for (Integer schoolId : schoolCourseSchedules.keySet()) {
+                Integer classMinutes = 0;
+                //当前教学点的课程
+                List<CourseSchedule> currentSchoolCourseSchedules = schoolCourseSchedules.get(schoolId);
+                for (CourseSchedule courseSchedule : currentSchoolCourseSchedules) {
+                    //如果课程为单机课或者为合奏课,则算入总课时长
+                    if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.SINGLE)
+                            || courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MIX)) {
+                        classMinutes += DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
+                    }
+                }
+                schoolClassMinutesMap.put(schoolId, classMinutes);
+            }
+            teacherClassMinutesMap.put(teacherId, schoolClassMinutesMap);
+        });
+        //用户账户自己变动信息列表
+        List<SysUserCashAccountDetail> userCashAccountDetails = new ArrayList<>();
+        //计算课酬
+        courseScheduleTeacherSalaries.forEach(courseScheduleTeacherSalary -> {
+            //当前课酬对应的课程信息
+            CourseSchedule courseSchedule = courseScheduleIdMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
+            Map<Integer, Integer> schoolClassMinutesMap = teacherClassMinutesMap.get(courseScheduleTeacherSalary.getUserId());
+            Integer schoolClassMinutes = schoolClassMinutesMap.get(courseSchedule.getSchoolId());
+            //当前课程的时长
+            int duration = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
+            //如果是单技课或者合奏课
+            if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.SINGLE)
+                    || courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MIX)) {
+                if (schoolClassMinutes >= settlementClassMinutes && duration < singleClassTime) {
+                    duration = singleClassTime;
+                }
+            }
+            //根据课程类型获取对应的默认课酬设置列表
+            List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithCourseType = teacherDefaultMusicGroupSalariesGroupByCourseType.get(courseSchedule.getType());
+            if (CollectionUtils.isEmpty(teacherDefaultMusicGroupSalariesWithCourseType)) {
+                throw new BizException("存在未指定结算方式的课程类型");
+            }
+
+            //根据教师编号将对应结算方式下的默认课酬设置分组
+            Map<Integer, TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesGroupByTeacherId = teacherDefaultMusicGroupSalariesWithCourseType.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getUserId,teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+
+            TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryWithTeacherId=teacherDefaultMusicGroupSalariesGroupByTeacherId.get(courseScheduleTeacherSalary.getUserId());
+
+            //教师课酬
+            BigDecimal teacherSalary = new BigDecimal(0);
+
+            String settlementType=musicGroupSettlementsMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
+            //如果结算方式是教师默认课酬
+            if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
+                //课程时长与结算单位时长占比
+                BigDecimal classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(30));
+                BigDecimal teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+                teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+            } else if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                //课程时长与结算单位时长占比
+                BigDecimal classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(90));
+                BigDecimal teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
+                teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+            }
+            BigDecimal subsidy = courseSubsidyMap.get(courseSchedule.getSchoolId());
+            teacherSalary=teacherSalary.add(subsidy);
+            //更新教师结算信息
+            courseScheduleTeacherSalary.setActualSalary(teacherSalary);
+            courseScheduleTeacherSalary.setSettlementTime(now);
+            courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
+
+            //生成教师账户资金变动记录
+            sysUserCashAccountService.updateBalance(courseScheduleTeacherSalary.getUserId(), teacherSalary);
+            SysUserCashAccount teacherCashAccount = sysUserCashAccountService.get(courseScheduleTeacherSalary.getUserId().intValue());
+            SysUserCashAccountDetail teacherCashAccountDetail = new SysUserCashAccountDetail();
+            teacherCashAccountDetail.setUserId(courseScheduleTeacherSalary.getUserId());
+            teacherCashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.REFUNDS);
+            teacherCashAccountDetail.setStatus(DealStatusEnum.SUCCESS);
+            teacherCashAccountDetail.setAmount(teacherSalary);
+            teacherCashAccountDetail.setBalance(teacherCashAccount.getBalance());
+            teacherCashAccountDetail.setAttribute(courseScheduleTeacherSalary.getCourseScheduleId().toString());
+            userCashAccountDetails.add(teacherCashAccountDetail);
+
+        });
+        sysUserCashAccountDetailDao.batchInsert(userCashAccountDetails);
+    }
 }

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

@@ -125,7 +125,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         List<SubjectRegisterDto> subjectRegisters = subFeeSettingDto.getSubjectRegisters();
         String musicGroupId = idGeneratorService.generatorId() + "";
         musicGroup.setId(musicGroupId);
-        musicGroup.setStatus(MusicGroupStatusEnum.DRAFT);
+        if(musicGroup.getStatus() != MusicGroupStatusEnum.DRAFT && musicGroup.getStatus() != MusicGroupStatusEnum.AUDIT){
+            throw new Exception("乐团初始状态错误");
+        }
         // 保存乐团基本信息
         musicGroupDao.insert(musicGroup);
         // 保存乐团付费主体列表
@@ -173,7 +175,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             musicGroupSubjectGoodsGroupDao.batchInsert(musicGroupSubjectGoodsGroups,musicGroupId);
         }
         // 记录创建日志
-        musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "保存乐团草稿", sysUser.getId(), ""));
+        String event = musicGroup.getStatus() == MusicGroupStatusEnum.AUDIT?"新建乐团,提交审核":"保存乐团草稿";
+        musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, event, sysUser.getId(), ""));
         return musicGroupId;
     }
 

+ 28 - 11
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -326,8 +326,8 @@
             cs.status_,
             cs.subsidy_,
             cs.class_date_,
-            cs.start_class_time_,
-            cs.end_class_time_,
+            CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
+            CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
             cs.teacher_id_,
             csts.user_id_ actual_teacher_id_,
             cs.create_time_,
@@ -527,8 +527,8 @@
             cs.status_,
             cs.subsidy_,
             cs.class_date_,
-            cs.start_class_time_,
-            cs.end_class_time_,
+            CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
+            CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
             cs.teacher_id_,
             csts.user_id_ actual_teacher_id_,
             cs.create_time_,
@@ -674,8 +674,8 @@
         cs.id_ course_schedule_id_,
         cs.name_,
         cs.class_date_,
-        cs.start_class_time_,
-        cs.end_class_time_,
+        CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
+        CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
         cs.teacher_id_,
         cs.teach_mode_
         FROM
@@ -702,8 +702,8 @@
         cs.id_ course_schedule_id_,
         cs.name_,
         cs.class_date_,
-        cs.start_class_time_,
-        cs.end_class_time_,
+        CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
+        CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
         cs.teach_mode_,
         (cg.total_class_times_-cg.current_class_times_) rest_of_class_
         FROM
@@ -1045,8 +1045,8 @@
             cg.student_num_ total_student_num_,
             cs.leave_student_num_,
             cs.class_date_,
-            cs.start_class_time_,
-            cs.end_class_time_
+            CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
+            CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
         FROM
             course_schedule cs
             LEFT JOIN course_schedule_teacher_salary csts ON cs.id_=csts.course_schedule_id_ AND csts.teacher_role_='BISHOP'
@@ -1141,9 +1141,26 @@
     </select>
     <select id="findCourseScheduleWithDate" resultMap="CourseSchedule">
         SELECT
-            cs.*
+            cs.id_,
+            cs.class_group_id_,
+            cs.status_,
+            cs.subsidy_,
+            cs.class_date_,
+            CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
+            CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
+            cs.teacher_id_,
+            csts.actual_teacher_id_,
+            cs.create_time_,
+            cs.update_time_,
+            cs.teach_mode_,
+            cs.type_,
+            cs.name_,
+            cs.student_num_,
+            cs.leave_student_num_,
+            cs.schoole_id_
         FROM
             course_schedule cs
         WHERE cs.class_date_=DATE_FORMAT(#{date},'%Y-%m-%d %H:%i:%s')
+        AND cs.type_!='VIP'
     </select>
 </mapper>

+ 6 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml

@@ -232,6 +232,12 @@
 		LEFT JOIN sys_user su ON su.id_ = csts.user_id_
 		WHERE csts.course_schedule_id_ = #{courseScheduleId}
 	</select>
+	<select id="findByCourseSchedules" resultMap="CourseScheduleTeacherSalary">
+		SELECT * FROM  course_schedule_teacher_salary WHERE course_schedule_id_ IN
+		<foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
+			#{courseScheduleId}
+		</foreach>
+	</select>
 
 	<update id="batchUpdateWages" parameterType="map">
 		UPDATE course_schedule_teacher_salary set

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

@@ -101,7 +101,8 @@
         <collection property="goodsList" resultMap="com.ym.mec.biz.dal.dao.GoodsDao.Goods" columnPrefix="g_" />
     </resultMap>
     <select id="findGoodsGroup" resultMap="findGoodsGroupMap">
-        SELECT mgs.*, g.id_ g_id_,g.name_ g_name_,g.image_ g_image_,g.brief_ g_brief_, g.group_purchase_price_ g_group_purchase_price_,g.market_price_ g_market_price_,g.complement_goods_id_list_
+        SELECT mgs.*, g.id_ g_id_,g.name_ g_name_,g.image_ g_image_,g.brief_ g_brief_, g.group_purchase_price_ g_group_purchase_price_,
+        g.specification_ g_specification_,g.brand_ g_brand,g.desc_ g_desc, g.market_price_ g_market_price_,g.complement_goods_id_list_
         g_complement_goods_id_list_
         FROM music_group_subject_goods_group mgs,goods g
         WHERE FIND_IN_SET (g.id_ ,mgs.goods_id_list_)

+ 10 - 0
mec-biz/src/main/resources/config/mybatis/SysUserCashAccountDetailMapper.xml

@@ -45,6 +45,16 @@
         VALUES(#{userId},#{transNo},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{amount},#{balance},#{description},#{comment},now(),now(),#{attribute})
     </insert>
 
+    <insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.SysUserCashAccountDetail" useGeneratedKeys="true"
+            keyColumn="id" keyProperty="id">
+        INSERT INTO sys_user_cash_account_detail
+        (user_id_,trans_no_,type_,amount_,balance_,description_,comment_,create_time_,update_time_,attribute1_)
+        VALUE
+        <foreach collection="sysUserCashAccountDetails" item="sysUserCashAccountDetail" separator=",">
+            (#{sysUserCashAccountDetail.userId},#{sysUserCashAccountDetail.transNo},#{sysUserCashAccountDetail.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{sysUserCashAccountDetail.amount},#{sysUserCashAccountDetail.balance},#{sysUserCashAccountDetail.description},#{sysUserCashAccountDetail.comment},now(),now(),#{sysUserCashAccountDetail.attribute})
+        </foreach>
+    </insert>
+
     <!-- 根据主键查询一条记录 -->
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.SysUserCashAccountDetail">
         UPDATE sys_user_cash_account_detail

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

@@ -209,7 +209,7 @@ public class ClassGroupController extends BaseController {
     @ApiOperation(value = "调整班级(临时调整)")
     @PostMapping("/revisionClassGroup")
     @PreAuthorize("@pcs.hasPermissions('classGroup/revisionClassGroup')")
-    @ApiImplicitParams({@ApiImplicitParam(name = "classGroupIds", value = "添加班级结构", required = true, dataType = "String")})
+    @ApiImplicitParams({@ApiImplicitParam(name = "ClassGroup4MixDto", value = "添加班级结构", required = true, dataType = "String")})
     public HttpResponseResult revisionClassGroup(@RequestBody ClassGroup4MixDto classGroup4MixDto) throws Exception {
         return succeed(classGroupService.classGroupSnap(classGroup4MixDto));
     }

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

@@ -7,10 +7,7 @@ import io.swagger.annotations.ApiParam;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
 import com.ym.mec.common.controller.BaseController;
@@ -49,7 +46,7 @@ public class MusicGroupSubjectPlanController extends BaseController {
     @ApiOperation(value = "修改乐团声部规划费用")
     @GetMapping("/batchUpdateFee")
     @PreAuthorize("@pcs.hasPermissions('musicGroupSubjectPlan/batchUpdateFee')")
-    public Object batchUpdateFee(List<MusicGroupSubjectPlan> musicGroupSubjectPlans) {
+    public Object batchUpdateFee(@RequestBody List<MusicGroupSubjectPlan> musicGroupSubjectPlans) {
         return succeed(musicGroupSubjectPlanService.batchUpdateFee(musicGroupSubjectPlans));
     }