Joburgess 5 years ago
parent
commit
d1d82f3e59
22 changed files with 376 additions and 59 deletions
  1. 10 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java
  2. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java
  3. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseAttendanceDetailHeadInfoDto.java
  4. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  5. 13 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleStudentPayment.java
  6. 26 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleTeacherSalary.java
  7. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserCashAccount.java
  8. 9 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  9. 10 2
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java
  10. 6 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  11. 133 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java
  12. 36 13
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  13. 41 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  14. 14 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  15. 7 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/DemoGroupServiceImpl.java
  16. 5 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  17. 6 0
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml
  18. 3 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  19. 15 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  20. 7 2
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherController.java
  21. 1 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseScheduleController.java
  22. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java

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

@@ -96,4 +96,13 @@ public interface ClassGroupStudentMapperDao extends BaseDAO<Long, ClassGroupStud
      * @return
      */
     ClassGroupStudentMapper findClassStudentMapperByUserIdAndClassGroupId(@Param("userId") Integer userId, @Param("classGroupId") Integer classGroupId);
-}
+
+    /**
+     * @describe 根据班级获取学员
+     * @author Joburgess
+     * @date 2019/10/24
+     * @param classGroupIds: 班级编号列表
+     * @return java.util.List<com.ym.mec.biz.dal.entity.ClassGroupStudentMapper>
+     */
+    List<ClassGroupStudentMapper> findByClassGroups(@Param("classGroupIds") List<Integer> classGroupIds);
+}

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

@@ -91,6 +91,15 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	List<Map<String,String>> findMusicGroupSettlementTypeByCourse(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 
 	/**
+	 * @describe 根据课程获取对应的教学点补贴
+	 * @author Joburgess
+	 * @date 2019/10/24
+	 * @param courseScheduleIds: 课程编号列表
+	 * @return java.util.List<java.util.Map<java.lang.Integer,java.math.BigDecimal>>
+	 */
+	List<Map<Integer,BigDecimal>> findCourseSubsidyByCourses(@Param("courseScheduleIds") List<Long> courseScheduleIds);
+
+	/**
 	 * 乐团详情--课酬调整--课程教师列表
 	 * @param courseScheduleId
 	 * @return

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

@@ -40,9 +40,20 @@ public class CourseAttendanceDetailHeadInfoDto {
     @ApiModelProperty(value = "到课学生数量")
     private Integer studentNum;
 
+    @ApiModelProperty(value = "学生总数")
+    private Integer totalStudentNum;
+
     @ApiModelProperty(value = "请假人数")
     private Integer leaveStudentNum;
 
+    public Integer getTotalStudentNum() {
+        return totalStudentNum;
+    }
+
+    public void setTotalStudentNum(Integer totalStudentNum) {
+        this.totalStudentNum = totalStudentNum;
+    }
+
     public Long getCourseScheduleId() {
         return courseScheduleId;
     }

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

@@ -114,6 +114,17 @@ public class CourseSchedule {
 	
 	private Integer schoolId;
 
+	/** 主教是否不需要重新生成课酬 */
+	private boolean bishopTeacherSalaryNotCreate;
+
+	public boolean isBishopTeacherSalaryNotCreate() {
+		return bishopTeacherSalaryNotCreate;
+	}
+
+	public void setBishopTeacherSalaryNotCreate(boolean bishopTeacherSalaryNotCreate) {
+		this.bishopTeacherSalaryNotCreate = bishopTeacherSalaryNotCreate;
+	}
+
 	public List<Integer> getTeachingTeacherIdList() {
 		return teachingTeacherIdList;
 	}

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

@@ -2,6 +2,8 @@ package com.ym.mec.biz.dal.entity;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
+import java.math.BigDecimal;
+
 /**
  * 对应数据库表(course_schedule_student_payment):
  */
@@ -32,7 +34,17 @@ public class CourseScheduleStudentPayment {
 	private java.util.Date settlementTime;
 	
 	private Integer classGroupId;
-	
+
+	public CourseScheduleStudentPayment() {
+	}
+
+	public CourseScheduleStudentPayment(Long courseScheduleId, Integer userId, BigDecimal expectPrice, Integer classGroupId) {
+		this.courseScheduleId = courseScheduleId;
+		this.userId = userId;
+		this.expectPrice = expectPrice;
+		this.classGroupId = classGroupId;
+	}
+
 	public void setId(Long id){
 		this.id = id;
 	}

+ 26 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleTeacherSalary.java

@@ -4,6 +4,8 @@ import com.ym.mec.biz.dal.enums.TeachTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
+import java.math.BigDecimal;
+
 /**
  * 对应数据库表(course_schedule_teacher_salary):
  */
@@ -44,6 +46,30 @@ public class CourseScheduleTeacherSalary {
 	
 	private Integer classGroupId;
 
+	public CourseScheduleTeacherSalary() {
+	}
+
+	/**
+	 * @describe
+	 * @author Joburgess
+	 * @date 2019/10/24
+	 * @param courseScheduleId: 课程编号
+	 * @param teacherRole: 教师角色
+	 * @param userId: 教师编号
+	 * @param expectSalary: 预计薪酬
+	 * @param subsidy: 补贴
+	 * @param classGroupId: 班级编号
+	 * @return
+	 */
+	public CourseScheduleTeacherSalary(Long courseScheduleId, TeachTypeEnum teacherRole, Integer userId, BigDecimal expectSalary, BigDecimal subsidy, Integer classGroupId) {
+		this.courseScheduleId = courseScheduleId;
+		this.teacherRole = teacherRole;
+		this.userId = userId;
+		this.expectSalary = expectSalary;
+		this.subsidy = subsidy;
+		this.classGroupId = classGroupId;
+	}
+
 	public String getUserName() {
 		return userName;
 	}

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserCashAccount.java

@@ -43,6 +43,8 @@ public class SysUserCashAccount {
 	/** 修改时间 */
 	private java.util.Date updateTime;
 
+
+
 	public SysUserCashAccount(Integer userId, String currency) {
 		this.userId = userId;
 		this.currency = currency;

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

@@ -1,7 +1,6 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.CourseAttendanceDetailHeadInfoDto;
-import com.ym.mec.biz.dal.dto.CourseAttendanceDetailHeadInfoDto;
 import com.ym.mec.biz.dal.dto.CourseScheduleDto;
 import com.ym.mec.biz.dal.dto.TeacherAttendanceDto;
 import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
@@ -44,6 +43,15 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
     void batchAddCourseSchedule(List<CourseSchedule> courseSchedules);
 
     /**
+     * @describe 创建乐团课课程计划
+     * @author Joburgess
+     * @date 2019/10/24
+     * @param courseSchedules: 课程计划列表
+     * @return void
+     */
+	void createCourseSchedules(List<CourseSchedule> courseSchedules);
+
+    /**
      * @Author: Joburgess
      * @Date: 2019/9/17
      * 批量更新课程计划

+ 10 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java

@@ -3,7 +3,6 @@ package com.ym.mec.biz.service;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
 import com.ym.mec.common.service.BaseService;
-import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -27,4 +26,13 @@ public interface CourseScheduleStudentPaymentService extends BaseService<Long, C
 	 */
 	int deleteStudentCourseSchedule(Integer userId, List<CourseSchedule> courseScheduleList);
 
-}
+	/**
+	 * @describe 根据课表创建学生的缴费记录
+	 * @author Joburgess
+	 * @date 2019/10/24
+	 * @param courseSchedules: 课程计划列表
+	 * @return void
+	 */
+	void createCourseScheduleStudentPaymentByCourseSchedules(List<CourseSchedule> courseSchedules);
+
+}

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

@@ -81,9 +81,14 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
 	String TEACHER_SALARY_TIME_UNIT="teacher_salary_time_unit";
 
 	/**
+	 * 试听课默认单节课时长
+	 */
+	String DEMO_GROUP_SINGLE_CLASS_MINUTES_="demo_group_single_class_minutes_";
+
+	/**
 	 * @params paramName
 	 * @return com.ym.mec.biz.dal.entity.SysConfig
 	 * @describe 根据配置名称获取配置信息
 	 */
 	SysConfig findByParamName(String paramName);
-}
+}

+ 133 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java

@@ -8,14 +8,17 @@ import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
 import com.ym.mec.biz.dal.enums.TeachTypeEnum;
 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.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.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.util.*;
@@ -32,6 +35,8 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
     @Autowired
     private TeacherDefaultMusicGroupSalaryDao teacherDefaultMusicGroupSalaryDao;
+    @Autowired
+    private SysConfigService sysConfigService;
 
     @Override
     public BaseDAO<Long, ClassGroupTeacherMapper> getDAO() {
@@ -90,18 +95,6 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                     }
                 }
 
-                //班级与老师课酬表
-//                ClassGroupTeacherSalary classGroupTeacherSalary = new ClassGroupTeacherSalary();
-//                classGroupTeacherSalary.setMusicGroupId(classGroupTeacherMapper.getMusicGroupId());
-//                classGroupTeacherSalary.setClassGroupId(classGroupTeacherMapper.getClassGroupId());
-//                classGroupTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
-//                classGroupTeacherSalary.setUserId(classGroupTeacherMapper.getUserId());
-//                classGroupTeacherSalary.setDuration(duration);
-//                classGroupTeacherSalary.setSalary(salary);
-//                classGroupTeacherSalary.setCreateTime(date);
-//                classGroupTeacherSalary.setUpdateTime(date);
-//                classGroupTeacherSalaryList.add(classGroupTeacherSalary);
-
                 //课程与老师薪水表
                 CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
                 courseScheduleTeacherSalary.setCourseScheduleId(classGroupNoStartCourseSchedule.getId());
@@ -119,7 +112,12 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void createCourseScheduleTeacherSalary(List<CourseSchedule> courseSchedules) {
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+
+        BigDecimal teacherSalaryTimeUnit=new BigDecimal(sysConfigService.findByParamName(SysConfigService.TEACHER_SALARY_TIME_UNIT).getParanValue());
+
         //课程编号列表
         List<Long> courseScheduleIds = courseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
         //主教老师列表
@@ -135,15 +133,135 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalaries = teacherDefaultMusicGroupSalaryDao.findByTeacher(allTeacherIds);
         Map<CourseSchedule.CourseScheduleType, List<TeacherDefaultMusicGroupSalary>> teacherDefaultMusicGroupSalariesGroupByCourseType = teacherDefaultMusicGroupSalaries.stream().collect(Collectors.groupingBy(TeacherDefaultMusicGroupSalary::getCourseScheduleType));
 
-        //乐团结算方式集合
+        //获取课程对应教学点补贴
+        List<Map<Integer, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
+        Map<Integer,BigDecimal> courseSubsidyMap= MapUtil.convertMybatisMap(courseSubsidyByCourses);
+
+        //课程对应乐团结算方式集合
         List<Map<String, String>> musicGroupSettlementTypeByCourse = courseScheduleTeacherSalaryDao.findMusicGroupSettlementTypeByCourse(courseScheduleIds);
-        Map<String, String> musicGroupSettilementsMap = MapUtil.convertMybatisMap(musicGroupSettlementTypeByCourse);
+        Map<String, String> musicGroupSettlementsMap = MapUtil.convertMybatisMap(musicGroupSettlementTypeByCourse);
 
         courseSchedules.forEach(courseSchedule -> {
             if(Objects.isNull(courseSchedule.getType())){
-                throw new BizException("课程类型未指定");
+                throw new BizException("存在未指定课程类型的课程");
+            }
+
+            //获取结算方式
+            String settlementType = musicGroupSettlementsMap.get(courseSchedule.getId());
+            if(StringUtils.isBlank(settlementType)){
+                throw new BizException("存在未指定结算方式的课程");
+            }
+
+            //根据课程类型获取对应的默认课酬设置列表
+            List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithCourseType = teacherDefaultMusicGroupSalariesGroupByCourseType.get(courseSchedule.getType());
+            if(CollectionUtils.isEmpty(teacherDefaultMusicGroupSalariesWithCourseType)){
+                throw new BizException("存在未指定结算方式的课程类型");
+            }
+
+            //根据结算方式将对应课程类型下的默认课酬设置列表分组
+            Map<String, List<TeacherDefaultMusicGroupSalary>> teacherDefaultMusicGroupSalaryGroupBySettlementType = teacherDefaultMusicGroupSalariesWithCourseType.stream().collect(Collectors.groupingBy(teacherDefaultMusicGroupSalary->teacherDefaultMusicGroupSalary.getSettlementType().getCode()));
+
+            //获取对应结算方式下的默认课酬设置列表
+            List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithSettlementType = teacherDefaultMusicGroupSalaryGroupBySettlementType.get(settlementType);
+            if(CollectionUtils.isEmpty(teacherDefaultMusicGroupSalariesWithSettlementType)){
+                throw new BizException("未找到结算方式对应的默认课酬");
+            }
+
+            //根据教师编号将对应结算方式下的默认课酬设置分组
+            Map<Integer, List<TeacherDefaultMusicGroupSalary>> teacherDefaultMusicGroupSalariesGroupByTeacherId = teacherDefaultMusicGroupSalariesWithSettlementType.stream().collect(Collectors.groupingBy(TeacherDefaultMusicGroupSalary::getUserId));
+
+            //课时长度
+            int duration = DateUtil.minutesBetween(courseSchedule.getEndClassTime(), courseSchedule.getStartClassTime());
+
+            //课程时长与结算单位时长占比
+            BigDecimal classTimeDuty=new BigDecimal(duration).divide(teacherSalaryTimeUnit);
+
+            if(!courseSchedule.isBishopTeacherSalaryNotCreate()){
+                //根据课程获取主教的默认课酬设置列表
+                List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithTeacherId = teacherDefaultMusicGroupSalariesGroupByTeacherId.get(courseSchedule.getActualTeacherId());
+                courseScheduleTeacherSalaryList.add(countMusicGroupTeacherSalary(
+                        courseSchedule,
+                        TeachTypeEnum.BISHOP,
+                        settlementType,
+                        classTimeDuty,
+                        courseSubsidyMap.get(courseSchedule.getId()),
+                        duration,
+                        courseSchedule.getActualTeacherId().intValue(),
+                        teacherDefaultMusicGroupSalariesWithTeacherId));
             }
 
+            //计算助教课程薪酬
+            //助教编号列表
+            List<Integer> teachingTeacherIdList = courseSchedule.getTeachingTeacherIdList();
+            if(CollectionUtils.isEmpty(teachingTeacherIdList)){
+                return;
+            }
+            teachingTeacherIdList.forEach(teacherId->{
+                List<TeacherDefaultMusicGroupSalary> teachingTeacherDefaultMusicGroupSalariesWithTeacherId = teacherDefaultMusicGroupSalariesGroupByTeacherId.get(teacherId);
+                courseScheduleTeacherSalaryList.add(countMusicGroupTeacherSalary(
+                        courseSchedule,
+                        TeachTypeEnum.TEACHING,
+                        settlementType,
+                        classTimeDuty,
+                        courseSubsidyMap.get(courseSchedule.getId()),
+                        duration,
+                        teacherId,
+                        teachingTeacherDefaultMusicGroupSalariesWithTeacherId));
+            });
         });
+        courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaryList);
+    }
+
+    /**
+     * @describe 计算教师课酬
+     * @author Joburgess
+     * @date 2019/10/24
+     * @param courseSchedule:
+     * @param teachType:
+     * @param settlementType:
+     * @param classTimeDuty:
+     * @param subsidy:
+     * @param duration:
+     * @param teacherId:
+     * @param teacherDefaultMusicGroupSalariesWithTeacherId:
+     * @return com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary
+     */
+    private CourseScheduleTeacherSalary countMusicGroupTeacherSalary(CourseSchedule courseSchedule,
+                                                                     TeachTypeEnum teachType,
+                                                                     String settlementType,
+                                                                     BigDecimal classTimeDuty,
+                                                                     BigDecimal subsidy,
+                                                                     int duration,
+                                                                     Integer teacherId,
+                                                                     List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithTeacherId){
+        if(CollectionUtils.isEmpty(teacherDefaultMusicGroupSalariesWithTeacherId)){
+            throw new BizException("存在未设置默认课酬的教师");
+        }
+        //教师课酬
+        BigDecimal teacherSalary=new BigDecimal(0);
+
+        //如果结算方式是教师默认课酬
+        if(settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)){
+            TeacherDefaultMusicGroupSalary bishopTeacherDefaultMusicGroupSalary = teacherDefaultMusicGroupSalariesWithTeacherId.get(0);
+            if(Objects.isNull(bishopTeacherDefaultMusicGroupSalary)){
+                throw new BizException("存在未设置默认课酬的教师");
+            }
+            BigDecimal bishopTeacherDefaultSalary = teachType==TeachTypeEnum.BISHOP?bishopTeacherDefaultMusicGroupSalary.getMainTeacherSalary():bishopTeacherDefaultMusicGroupSalary.getAssistantTeacherSalary();
+            teacherSalary=bishopTeacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+        }else if(settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)){
+            for (TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary : teacherDefaultMusicGroupSalariesWithTeacherId) {
+                if(duration >= teacherDefaultMusicGroupSalary.getDurationMin() && duration <= teacherDefaultMusicGroupSalary.getDurationMin()){
+                    teacherSalary=teachType==TeachTypeEnum.BISHOP?teacherDefaultMusicGroupSalary.getMainTeacherSalary():teacherDefaultMusicGroupSalary.getAssistantTeacherSalary();
+                    break;
+                }
+            }
+        }
+        return new CourseScheduleTeacherSalary(
+                courseSchedule.getId(),
+                TeachTypeEnum.BISHOP,
+                teacherId,
+                teacherSalary,
+                subsidy,
+                courseSchedule.getClassGroupId());
     }
 }

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

@@ -11,11 +11,7 @@ import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.CourseScheduleQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseScheduleRecordQueryInfo;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.CourseScheduleService;
-import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.SysMessageService;
+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;
@@ -63,7 +59,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	private TeacherDefaultVipGroupSalaryDao teacherDefaultVipGroupSalaryDao;
 	@Autowired
 	private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
-	
+	@Autowired
+	private ClassGroupTeacherMapperService classGroupTeacherMapperService;
+	@Autowired
+	private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
 	@Autowired
 	private ClassGroupService classGroupService;
 
@@ -114,6 +113,16 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void createCourseSchedules(List<CourseSchedule> courseSchedules) {
+		//添加课程计划
+		batchAddCourseSchedule(courseSchedules);
+		//创建学生单节课的缴费记录,乐团课的缴费为0
+		courseScheduleStudentPaymentService.createCourseScheduleStudentPaymentByCourseSchedules(courseSchedules);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public void batchAddCourseSchedule(List<CourseSchedule> courseSchedules) {
 		if(Objects.isNull(courseSchedules)&&courseSchedules.size()<=0){
 			throw new BizException("参数错误!");
@@ -329,6 +338,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			throw new BizException("课程信息错误");
 		}
 
+		//需要生成课程课酬的课程计划
+		List<CourseSchedule> needCreateCourseScheduleTeacherSalaryCourse=new ArrayList<>();
+
 		//课程对应助教集合
 		List<CourseScheduleTeacherSalary> teachingTeacherSalarys = courseScheduleDao.findTeachingTeachers(newCourseScheduleIds);
 		Map<Long, List<CourseScheduleTeacherSalary>> courseTeachingTeacherMaps = teachingTeacherSalarys.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getCourseScheduleId));
@@ -377,11 +389,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				}
 			}else{
 				if(Objects.isNull(oldCourseSchedule.getActualTeacherId())||!oldCourseSchedule.getActualTeacherId().equals(newCourseSchedule.getActualTeacherId())){
-					//如果主教被修改则调整课酬记录
-
 					if(Objects.nonNull(oldCourseSchedule.getActualTeacherId())){
 						beReplaceTeacherIds.add(oldCourseSchedule.getActualTeacherId().intValue());
 					}
+				}else{
+					//如果主教未修改则不需要调整课酬记录
+					newCourseSchedule.setBishopTeacherSalaryNotCreate(true);
 				}
 				List<CourseScheduleTeacherSalary> courseTeachingTeacherList=courseTeachingTeacherMaps.get(newCourseSchedule.getId());
 				//当前设置的课程助教编号列表
@@ -394,23 +407,33 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				//找出重复的助教编号
 				List<Integer> foundInCurrentCourseTeachingTeacherIds = newTeachingTeacherIdList.stream().filter(currentCourseTeachingTeacherIds::contains).collect(Collectors.toList());
 
-				newTeachingTeacherIdList.forEach(newTeacherId->{
+				//需要重新生成课酬的助教列表
+				List<Integer> newCreateSalaryTeachingTeacherIds=new ArrayList<>();
+
+				newTeachingTeacherIdList.forEach(newTeachingTeacherId->{
 					//如果不在重复列表中,则需要生成对应的课酬记录
-					if(!foundInCurrentCourseTeachingTeacherIds.contains(newTeacherId)){
+					if(!foundInCurrentCourseTeachingTeacherIds.contains(newTeachingTeacherId)){
 						//计算修改后的助教的课酬
+						newCreateSalaryTeachingTeacherIds.add(newTeachingTeacherId);
 
-
-						if(Objects.nonNull(oldCourseSchedule.getActualTeacherId())){
-							beReplaceTeacherIds.add(oldCourseSchedule.getActualTeacherId().intValue());
+						if(Objects.nonNull(newTeachingTeacherId)){
+							beReplaceTeacherIds.add(newTeachingTeacherId);
 						}
 					}
 				});
+				newCourseSchedule.setTeachingTeacherIdList(newCreateSalaryTeachingTeacherIds);
+				if(!newCourseSchedule.isBishopTeacherSalaryNotCreate()||!CollectionUtils.isEmpty(newCreateSalaryTeachingTeacherIds)){
+					//如果主教或者助教发生了变化,则需要重新生成课酬
+					needCreateCourseScheduleTeacherSalaryCourse.add(newCourseSchedule);
+				}
 			}
 			//将被修改的教师预计薪水置零
 			if(!CollectionUtils.isEmpty(beReplaceTeacherIds)){
 				courseScheduleTeacherSalaryDao.batchUpdateTeacherExpectSalary(newCourseSchedule.getId().intValue(),beReplaceTeacherIds);
 			}
 		});
+		//生成修改后的教师课酬
+		classGroupTeacherMapperService.createCourseScheduleTeacherSalary(needCreateCourseScheduleTeacherSalaryCourse);
 	}
 
 	@Transactional(rollbackFor = Exception.class)

+ 41 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -1,13 +1,7 @@
 package com.ym.mec.biz.service.impl;
 
-import com.ym.mec.biz.dal.dao.CourseScheduleDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
-import com.ym.mec.biz.dal.dao.VipGroupActivityDao;
-import com.ym.mec.biz.dal.dao.VipGroupDao;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
-import com.ym.mec.biz.dal.entity.VipGroup;
-import com.ym.mec.biz.dal.entity.VipGroupActivity;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.TeachModeEnum;
 import com.ym.mec.biz.dal.enums.VipGroupActivityTypeEnum;
 import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
@@ -33,6 +27,8 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 	private VipGroupActivityDao vipGroupActivityDao;
 	@Autowired
 	private CourseScheduleDao courseScheduleDao;
+	@Autowired
+	private ClassGroupStudentMapperDao classGroupStudentMapperDao;
 
 	@Override
 	public BaseDAO<Long, CourseScheduleStudentPayment> getDAO() {
@@ -127,4 +123,40 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
     public int deleteStudentCourseSchedule(Integer userId, List<CourseSchedule> courseScheduleList) {
 		return courseScheduleStudentPaymentDao.deleteStudentCourseSchedule(userId,courseScheduleList);
     }
-}
+
+	@Override
+	public void createCourseScheduleStudentPaymentByCourseSchedules(List<CourseSchedule> courseSchedules) {
+		if(CollectionUtils.isEmpty(courseSchedules)){
+			return;
+		}
+
+		List<CourseScheduleStudentPayment> courseScheduleStudentPayments=new ArrayList<>();
+
+		BigDecimal zeroPrice=new BigDecimal(0);
+
+		//班级编号列表
+		List<Integer> classGroupIds = courseSchedules.stream().map(CourseSchedule::getClassGroupId).collect(Collectors.toList());
+		Map<Integer, List<CourseSchedule>> courseSchedulesByClassGroupMap = courseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getClassGroupId));
+
+		//班级学生对应列表
+		List<ClassGroupStudentMapper> classGroupStudentMappers = classGroupStudentMapperDao.findByClassGroups(classGroupIds);
+		Map<Integer, List<ClassGroupStudentMapper>> studentsByClassMap = classGroupStudentMappers.stream().collect(Collectors.groupingBy(ClassGroupStudentMapper::getClassGroupId));
+
+		courseSchedulesByClassGroupMap.forEach((classGroupId,courseSchedulesByClassGroup)->{
+			List<ClassGroupStudentMapper> studentsWithClassGroup = studentsByClassMap.get(classGroupId);
+			if(CollectionUtils.isEmpty(studentsWithClassGroup)){
+				return;
+			}
+			studentsWithClassGroup.forEach(classGroupStudent->{
+				courseSchedulesByClassGroup.forEach(courseSchedule -> {
+					courseScheduleStudentPayments.add(new CourseScheduleStudentPayment(
+							courseSchedule.getId(),
+							classGroupStudent.getUserId(),
+							zeroPrice,
+							courseSchedule.getClassGroupId()));
+				});
+			});
+		});
+		courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
+	}
+}

+ 14 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -3,11 +3,9 @@ package com.ym.mec.biz.service.impl;
 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.CourseScheduleTeacherSalaryService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.SysUserCashAccountService;
-import com.ym.mec.biz.service.VipGroupService;
+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 org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -37,6 +35,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 	private SysUserCashAccountService sysUserCashAccountService;
 	@Autowired
 	private VipGroupService vipGroupService;
+	@Autowired
+	private SchoolService schoolService;
 	
 	@Autowired
 	private SysConfigDao sysConfigDao;
@@ -54,6 +54,12 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 													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());
 
@@ -71,6 +77,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 				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(),
@@ -145,7 +152,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 			//当前课程每个学生平均课酬
 			BigDecimal avgSalary=expectSalary.divide(courseStudentNum);
 			//教师当前课程责任总占比,当前课程应得课酬
-			BigDecimal teacherLiabilityAllratio,teacherCourseSalary;
+			BigDecimal teacherLiabilityAllratio;
 
 			//当前课程学生投诉记录
 			List<CourseScheduleComplaints> courseStudentComplaints=complaintsGroupByCourse.get(courseScheduleTeacherSalary.getCourseScheduleId());
@@ -169,7 +176,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 			//教师应扣除费用
 			BigDecimal deductPrice=avgSalary.multiply(teacherLiabilityAllratio);
 			//教师实际课酬
-			BigDecimal actualSalary=expectSalary.subtract(deductPrice);
+			BigDecimal actualSalary=expectSalary.subtract(deductPrice).add(courseScheduleTeacherSalary.getSubsidy());
 
 			//更新教师结算信息
 			courseScheduleTeacherSalary.setActualSalary(actualSalary);
@@ -221,7 +228,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 				sysUserCashAccountService.updateBalance(studentPayment.getUserId(),returnPrice);
 				SysUserCashAccount studentCashAccount = sysUserCashAccountService.get(studentPayment.getUserId().intValue());
 				SysUserCashAccountDetail studentAccountDetail=new SysUserCashAccountDetail();
-//				studentAccountDetail.setTransNo(studentPayment.get());
 				studentAccountDetail.setUserId(studentPayment.getUserId());
 				studentAccountDetail.setType(PlatformCashAccountDetailTypeEnum.REFUNDS);
 				studentAccountDetail.setStatus(DealStatusEnum.SUCCESS);
@@ -236,4 +242,4 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 		});
 
 	}
-}
+}

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

@@ -12,6 +12,7 @@ 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.DemoGroupService;
+import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -47,6 +48,8 @@ public class DemoGroupServiceImpl extends BaseServiceImpl<Long, DemoGroup>  impl
 	private SysUserFeignService sysUserFeignService;
 	@Autowired
 	private SubjectDao subjectDao;
+	@Autowired
+	private SysConfigService sysConfigService;
 
 	@Override
 	public BaseDAO<Long, DemoGroup> getDAO() {
@@ -62,8 +65,11 @@ public class DemoGroupServiceImpl extends BaseServiceImpl<Long, DemoGroup>  impl
 			throw new BizException("请勿多次创建试听课!");
 		}
 
+		SysConfig singleClassMinutes = sysConfigService.findByParamName(SysConfigService.DEMO_GROUP_SINGLE_CLASS_MINUTES_);
+
 		demoGroupApplyDto.setUserId(user.getId());
 		demoGroupApplyDto.setOrganIdList(user.getOrganId().toString());
+		demoGroupApplyDto.setSingleClassMinutes(Integer.parseInt(singleClassMinutes.getParanValue()));
 		demoGroupDao.insert(demoGroupApplyDto);
 		demoGroupCoursesPlanDao.batchInsertByDates(demoGroupApplyDto.getCourseDates(),
 				demoGroupApplyDto.getId(),
@@ -201,4 +207,4 @@ public class DemoGroupServiceImpl extends BaseServiceImpl<Long, DemoGroup>  impl
 	public DemoGroup findByTeacherId(Integer teacherId) {
 		return demoGroupDao.findDemoGroupByTeacherId(teacherId);
 	}
-}
+}

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

@@ -107,6 +107,10 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			throw new BizException("请选择指导老师");
 		}
 
+		if(Objects.isNull(vipGroup.getVipGroupApplyBaseInfo().getTeacherSchoolId())){
+			throw new BizException("请设置教学点");
+		}
+
 	    if(vipGroup.getCourseSchedules().size()!=(vipGroup.getVipGroupApplyBaseInfo().getOfflineClassesNum()+vipGroup.getVipGroupApplyBaseInfo().getOnlineClassesNum())){
 	        throw new BizException("课时总数不匹配!");
         }
@@ -892,4 +896,4 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 	public List<School> querySchoolByUserId(Integer userId) {
 		return vipGroupDao.querySchoolByUserId(userId);
 	}
-}
+}

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

@@ -145,4 +145,10 @@
     <select id="findClassStudentMapperByUserIdAndClassGroupId" resultMap="ClassGroupStudentMapper">
         SELECT * FROM class_group_student_mapper WHERE user_id_=#{userId} AND class_group_id_=#{classGroupId} AND status_ = 'NORMAL'
     </select>
+    <select id="findByClassGroups" resultMap="ClassGroupStudentMapper">
+        SELECT * FROM class_group_student_mapper WHERE class_group_id_ IN
+        <foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
+            #{classGroupId}
+        </foreach>
+    </select>
 </mapper>

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

@@ -948,8 +948,9 @@
         <result property="classDate" column="class_date_"/>
         <result property="startClassTime" column="start_class_time_"/>
         <result property="endClassTime" column="end_class_time_"/>
-        <result property="latestAttendanceTime" column="leave_student_num_"/>
         <result property="studentNum" column="student_num_"/>
+        <result property="leaveStudentNum" column="leave_student_num_"/>
+        <result property="totalStudentNum" column="total_student_num_"/>
     </resultMap>
 
     <select id="findByCourse" resultMap="CourseAttendanceDetailHeadInfoDto">
@@ -960,6 +961,7 @@
             csts.user_id_,
             su.username_,
             cs.student_num_,
+            cg.student_num_ total_student_num_,
             cs.leave_student_num_,
             cs.class_date_,
             cs.start_class_time_,

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

@@ -38,7 +38,7 @@
 		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
 		</selectKey>
 		-->
-		INSERT INTO course_schedule_teacher_salary (id_,course_schedule_id_,teacher_role_,user_id_,expect_salary_,create_time_,update_time_,subsidy_,actual_salary_,settlement_time_,class_group_id_) VALUES(#{id},#{courseScheduleId},#{teacherRole},#{userId},#{expectSalary},#{createTime},#{updateTime},#{subsidy},#{actualSalary},#{settlementTime},#{classGroupId})
+		INSERT INTO course_schedule_teacher_salary (id_,course_schedule_id_,teacher_role_,user_id_,expect_salary_,create_time_,update_time_,subsidy_,actual_salary_,settlement_time_,class_group_id_) VALUES(#{id},#{courseScheduleId},#{teacherRole},#{userId},#{expectSalary},now(),now(),#{subsidy},#{actualSalary},#{settlementTime},#{classGroupId})
 	</insert>
     <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id_">
 		INSERT INTO course_schedule_teacher_salary (id_,course_schedule_id_,teacher_role_,user_id_,expect_salary_,create_time_,update_time_,subsidy_,actual_salary_,settlement_time_,class_group_id_)
@@ -185,6 +185,20 @@
 			#{courseScheduleId}
 		</foreach>
 	</select>
+	<select id="findCourseSubsidyByCourses" resultType="map">
+		SELECT
+			cs.id_,
+			s.subsidy_
+		FROM
+			course_schedule cs
+			LEFT JOIN class_group cg ON cs.class_group_id_=cg.id_
+			LEFT JOIN music_group mg ON cg.music_group_id_=mg.id_
+			LEFT JOIN school s ON mg.school_id_=s.id_
+		WHERE cs.id_ IN
+		<foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
+			#{courseScheduleId}
+		</foreach>
+	</select>
 
 	<resultMap id="CourseScheduleTeachersDto" type="com.ym.mec.biz.dal.dto.CourseScheduleTeachersDto">
 		<result property="teacherId" column="user_id_"/>

+ 7 - 2
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherController.java

@@ -15,6 +15,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -118,7 +119,11 @@ public class TeacherController extends BaseController {
 
     @ApiOperation(value = "获取教师vip课教学点")
     @GetMapping("/findVipSchoolByTeacher")
-    public Object findVipSchoolByTeacher(@ApiParam(value = "教师编号", required = true) Integer userId){
-        return succeed(schoolService.findVipSchoolByTeacher(userId));
+    public Object findVipSchoolByTeacher(){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        return succeed(schoolService.findVipSchoolByTeacher(sysUser.getId()));
     }
 }

+ 1 - 1
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseScheduleController.java

@@ -71,7 +71,7 @@ public class TeacherCourseScheduleController extends BaseController {
     }
 
     @ApiOperation(value = "获取点名详情头部信息")
-    @GetMapping("/queryTeacherClassCourseSchedule")
+    @GetMapping("/findCourseAttendanceDetailHeadInfo")
     public Object findCourseAttendanceDetailHeadInfo(Long courseScheduleId){
         return succeed(scheduleService.findCourseAttendanceDetailHeadInfo(courseScheduleId));
     }

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

@@ -75,7 +75,7 @@ public class CourseScheduleController extends BaseController {
             courseSchedule.setSchoolId(musicGroup.getSchoolId());
         });
 
-        scheduleService.batchAddCourseSchedule(createCourseScheduleDto.getCourseSchedules());
+        scheduleService.createCourseSchedules(createCourseScheduleDto.getCourseSchedules());
         return succeed();
     }