Bladeren bron

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

周箭河 4 jaren geleden
bovenliggende
commit
23e61ae612
28 gewijzigde bestanden met toevoegingen van 1569 en 113 verwijderingen
  1. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java
  2. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java
  3. 36 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java
  4. 169 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/BatchCourseAdjustDto.java
  5. 184 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/IndexErrorDataExportDto.java
  6. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  7. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupQueryInfo.java
  8. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  9. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java
  10. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/IndexBaseMonthDataService.java
  11. 23 17
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  12. 296 26
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  13. 34 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  14. 257 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  15. 27 36
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  16. 9 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  17. 1 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  18. 11 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  19. 315 0
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  20. 1 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  21. 1 1
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMapper.xml
  22. 9 0
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  23. 35 0
      mec-util/src/main/java/com/ym/mec/util/collection/MapUtil.java
  24. 12 0
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java
  25. 58 0
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  26. 20 0
      mec-web/src/main/java/com/ym/mec/web/controller/IndexController.java
  27. 10 10
      mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupController.java
  28. 15 0
      mec-web/src/main/java/com/ym/mec/web/controller/PracticeGroupManageController.java

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

@@ -45,7 +45,7 @@ public interface ClassGroupStudentMapperDao extends BaseDAO<Long, ClassGroupStud
      * @author Joburgess
      * @date 2019/12/18
      */
-    ClassGroupStudentMapper findClassGroupStudent(@Param("classGroupId") int classGroupId, @Param("userId") Integer userId);
+    ClassGroupStudentMapper findClassGroupStudent(@Param("classGroupId") Integer classGroupId, @Param("userId") Integer userId);
 
     /**
      * 根据乐团编号删除指定学生

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

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
 import com.ym.mec.biz.dal.entity.TeacherSalaryModifyLog;
 import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.TeachTypeEnum;
 import com.ym.mec.biz.dal.enums.TeacherSalaryConfirmStatus;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
@@ -36,6 +37,17 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	int batchDeleteByCourseScheduleIds(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 
 	/**
+	 * @describe 根据课程和教师类型删除教师课酬记录
+	 * @author Joburgess
+	 * @date 2021/4/9 0009
+	 * @param courseIds:
+	 * @param teachType:
+	 * @return int
+	 */
+	int deleteWithCourseAndTeachRole(@Param("courseIds") List<Long> courseIds,
+									 @Param("teachType") TeachTypeEnum teachType);
+
+	/**
 	 * @return java.util.List<com.ym.mec.biz.dal.dto.VipGroupSalaryDto>
 	 * @Author: Joburgess
 	 * @Date: 2019/10/11

+ 36 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java

@@ -7,10 +7,7 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 import org.apache.poi.ss.formula.functions.Index;
 
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData> {
 
@@ -145,17 +142,29 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
                                                 @Param("courseStatus") CourseStatusEnum courseStatus);
 
     int countLessThenThreeClassGroupNum(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId);
+
+    List<Map<Integer, Integer>> countLessThenThreeClassOrganGroupNum(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId);
+
     List<String> getLessThenThreeMusicGroup(@Param("organIds") Set<Integer> organIds);
 
     int queryErrInspection(@Param("organIds") Set<Integer> organIds, @Param("startTime") String startTime);
 
+    List<Map<Integer, Integer>> queryOrganErrInspection(@Param("organIds") Set<Integer> organIds, @Param("startTime") String startTime);
+
     IndexErrInfoDto getNoClassMusicGroupStudentInfo(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId);
 
+    List<Map<Integer, Integer>> getOrganNoClassMusicGroupStudentNum(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId);
+
     int countNoPaymentStudentNum(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId);
+
+    List<Map<Integer, Integer>> countOrganNoPaymentStudentNum(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId);
+
     List<String> getNoPaymentMusicGroup(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId);
 
     List<Long> queryApplyForQuitGroupNum(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId);
 
+    List<Map<Integer, Integer>> queryOrganApplyForQuitGroupNum(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId);
+
     int queryStudentAttendanceInfo(@Param("organIds") Set<Integer> organIds,
                                           @Param("type") String type, @Param("startTime") String startTime);
 
@@ -166,6 +175,7 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
      * @return
      */
     int getCourseTimeError(@Param("organIds") Set<Integer> organIds, @Param("classGroupIds") List<Long> classGroupIds);
+    List<Map<Integer, Integer>> getOrganCourseTimeError(@Param("organIds") Set<Integer> organIds, @Param("classGroupIds") List<Long> classGroupIds);
 
     /**
      * 获取考勤异常编号
@@ -173,6 +183,7 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
      * @return
      */
     int getAttendanceError(@Param("organIds") Set<Integer> organIds, @Param("startTime") String startTime, @Param("classGroupIds") List<Long> classGroupIds);
+    List<Map<Integer, Integer>> getOrganAttendanceError(@Param("organIds") Set<Integer> organIds, @Param("startTime") String startTime, @Param("classGroupIds") List<Long> classGroupIds);
 
     /**
      * 获取旷课考勤
@@ -180,6 +191,7 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
      * @return
      */
     int getNoAttendance(@Param("organIds") Set<Integer> organIds, @Param("startTime") String startTime, @Param("classGroupIds") List<Long> classGroupIds);
+    List<Map<Integer, Integer>> getOrganNoAttendance(@Param("organIds") Set<Integer> organIds, @Param("startTime") String startTime, @Param("classGroupIds") List<Long> classGroupIds);
 
     /**
      * 获取老师离职申请数
@@ -197,11 +209,20 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
     int queryLowTeacherSalary(@Param("organIdsStr") String organIdsStr, @Param("monthStr") String monthStr);
 
     /**
+     * 获取预计课酬偏低的老师编号
+     * @param organIdsStr
+     * @param monthStr
+     * @return
+     */
+    List<Map<Integer, Integer>> queryOrganLowTeacherSalary(@Param("organIdsStr") String organIdsStr, @Param("monthStr") String monthStr);
+
+    /**
      * 乐团巡查任务未计划
      * @param organIdsStr
      * @return
      */
     int queryInspectionItem(@Param("organIdsStr") String organIdsStr, @Param("startTime") String startTime, @Param("userId") Integer userId);
+    List<Map<Integer, Integer>> queryOrganInspectionItem(@Param("organIdsStr") String organIdsStr, @Param("startTime") String startTime, @Param("userId") Integer userId);
 
     /**
      * 乐团巡查任务未提交
@@ -209,6 +230,7 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
      * @return
      */
     int queryInspectionItemPlan(@Param("organIdsStr") String organIdsStr, @Param("startTime") String startTime);
+    List<Map<Integer, Integer>> queryOrganInspectionItemPlan(@Param("organIdsStr") String organIdsStr, @Param("startTime") String startTime);
 
     /**
      * 未完成的回访任务
@@ -216,6 +238,7 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
      * @return
      */
     int queryStudentVisit(@Param("organIdsStr") String organIdsStr, @Param("startTime") String startTime, @Param("userId") Integer userId);
+    List<Map<Integer, Integer>> queryOrganStudentVisit(@Param("organIdsStr") String organIdsStr, @Param("startTime") String startTime, @Param("userId") Integer userId);
 
     List<IndexBaseMonthData> getFinancePayData(@Param("dayStr") String dayStr);
 
@@ -234,4 +257,13 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
     List<IndexBaseMonthData> getFinanceActualDataWithTimely(@Param("startDate") String startDate,
                                                             @Param("endDate") String endDate,
                                                             @Param("organIds") List<Integer> organIds);
+
+    /**
+     * @describe 各分部教师服务指标异常
+     * @author Joburgess
+     * @date 2021/4/15 0015
+     * @param params:
+     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
+     */
+    List<Map<Integer, Integer>> countOrganTeacherServeInfo(Map<String, Object> params);
 }

+ 169 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/BatchCourseAdjustDto.java

@@ -0,0 +1,169 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
+import com.ym.mec.biz.dal.enums.TeachModeEnum;
+import io.swagger.annotations.ApiModelProperty;
+import org.codehaus.jackson.map.ObjectMapper;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/4/9 0009
+ */
+public class BatchCourseAdjustDto {
+
+    @ApiModelProperty(value = "需要调整的课程编号")
+    private List<Long> courseScheduleIds;
+
+    @ApiModelProperty(value = "是否修改主教")
+    private Boolean changeMainTeacher = false;
+
+    @ApiModelProperty(value = "是否修改助教")
+    private Boolean changeTeachingTeacher = false;
+
+    @ApiModelProperty(value = "是否跳过节假日 true-跳过 false-不跳过", required = true)
+    private Boolean isHoliday = false;
+
+    @ApiModelProperty(value = "开始日期", required = true)
+    private String startDate;
+
+    @ApiModelProperty(value = "开始时间")
+    private String startTime;
+
+    @ApiModelProperty(value = "课程暂停时间")
+    private String pauseDate;
+
+    @ApiModelProperty(value = "课程恢复时间")
+    private String recoveryDate;
+
+    @ApiModelProperty(value = "老师设置", required = true)
+    private List<ClassGroupTeacherMapper> classGroupTeacherMapperList;
+
+    @ApiModelProperty(value = "教学形式")
+    private TeachModeEnum teachMode;
+
+    @ApiModelProperty(value = "是否允许0课酬")
+    private Boolean allowZeroSalary = false;
+
+    @ApiModelProperty(value = "教学点")
+    private Integer schoolId;
+
+    @ApiModelProperty(value = "确认生成课程")
+    private Boolean confirmGenerate = false;
+
+    private Integer operatorId;
+
+    public Integer getOperatorId() {
+        return operatorId;
+    }
+
+    public void setOperatorId(Integer operatorId) {
+        this.operatorId = operatorId;
+    }
+
+    public String getPauseDate() {
+        return pauseDate;
+    }
+
+    public void setPauseDate(String pauseDate) {
+        this.pauseDate = pauseDate;
+    }
+
+    public String getRecoveryDate() {
+        return recoveryDate;
+    }
+
+    public void setRecoveryDate(String recoveryDate) {
+        this.recoveryDate = recoveryDate;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public TeachModeEnum getTeachMode() {
+        return teachMode;
+    }
+
+    public void setTeachMode(TeachModeEnum teachMode) {
+        this.teachMode = teachMode;
+    }
+
+    public List<ClassGroupTeacherMapper> getClassGroupTeacherMapperList() {
+        return classGroupTeacherMapperList;
+    }
+
+    public void setClassGroupTeacherMapperList(List<ClassGroupTeacherMapper> classGroupTeacherMapperList) {
+        this.classGroupTeacherMapperList = classGroupTeacherMapperList;
+    }
+
+    public Boolean getConfirmGenerate() {
+        return confirmGenerate;
+    }
+
+    public void setConfirmGenerate(Boolean confirmGenerate) {
+        this.confirmGenerate = confirmGenerate;
+    }
+
+    public Boolean getChangeMainTeacher() {
+        return changeMainTeacher;
+    }
+
+    public void setChangeMainTeacher(Boolean changeMainTeacher) {
+        this.changeMainTeacher = changeMainTeacher;
+    }
+
+    public List<Long> getCourseScheduleIds() {
+        return courseScheduleIds;
+    }
+
+    public void setCourseScheduleIds(List<Long> courseScheduleIds) {
+        this.courseScheduleIds = courseScheduleIds;
+    }
+
+    public Boolean getChangeTeachingTeacher() {
+        return changeTeachingTeacher;
+    }
+
+    public void setChangeTeachingTeacher(Boolean changeTeachingTeacher) {
+        this.changeTeachingTeacher = changeTeachingTeacher;
+    }
+
+    public Boolean getHoliday() {
+        return isHoliday;
+    }
+
+    public void setHoliday(Boolean holiday) {
+        isHoliday = holiday;
+    }
+
+    public String getStartDate() {
+        return startDate;
+    }
+
+    public void setStartDate(String startDate) {
+        this.startDate = startDate;
+    }
+
+    public Boolean getAllowZeroSalary() {
+        return allowZeroSalary;
+    }
+
+    public void setAllowZeroSalary(Boolean allowZeroSalary) {
+        this.allowZeroSalary = allowZeroSalary;
+    }
+
+    public Integer getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Integer schoolId) {
+        this.schoolId = schoolId;
+    }
+}

+ 184 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/IndexErrorDataExportDto.java

@@ -0,0 +1,184 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/4/15 0015
+ */
+public class IndexErrorDataExportDto {
+
+    private Integer organId;
+
+    private String organName;
+
+    @ApiModelProperty(value = "基础技能班学员数量异常")
+    private int highClassStudentLessThanThreeNum;
+
+    @ApiModelProperty(value = "乐团巡查事项异常")
+    private int musicPatrolItem;
+
+    @ApiModelProperty(value = "未加入任何班级学员")
+    private int noClassMusicGroupStudentInfo;
+
+    @ApiModelProperty(value = "未缴费学员数")
+    private int studentNotPayment;
+
+    @ApiModelProperty(value = "申请退团学员数")
+    private int studentApplyForQuitMusicGroup;
+
+    @ApiModelProperty(value = "预计课酬较低")
+    private int teacherExpectSalaryBeLow;
+
+    @ApiModelProperty(value = "课程时间安排异常")
+    private int courseTimeError;
+
+    @ApiModelProperty(value = "乐团巡查任务未计划")
+    private int inspectionItem;
+
+    @ApiModelProperty(value = "乐团巡查任务未提交")
+    private int inspectionItemPlan;
+
+    @ApiModelProperty(value = "回访任务未完成")
+    private int studentVisit;
+
+    @ApiModelProperty(value = "课程考勤异常")
+    private int teacherExceptionAttendance;
+
+    @ApiModelProperty(value = "课程异常")
+    private int teacherNotAClass;
+
+    @ApiModelProperty(value = "服务指标异常")
+    private int teacherServeError;
+
+    @ApiModelProperty(value = "总计")
+    private int total;
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public int getHighClassStudentLessThanThreeNum() {
+        return highClassStudentLessThanThreeNum;
+    }
+
+    public void setHighClassStudentLessThanThreeNum(int highClassStudentLessThanThreeNum) {
+        this.highClassStudentLessThanThreeNum = highClassStudentLessThanThreeNum;
+    }
+
+    public int getMusicPatrolItem() {
+        return musicPatrolItem;
+    }
+
+    public void setMusicPatrolItem(int musicPatrolItem) {
+        this.musicPatrolItem = musicPatrolItem;
+    }
+
+    public int getNoClassMusicGroupStudentInfo() {
+        return noClassMusicGroupStudentInfo;
+    }
+
+    public void setNoClassMusicGroupStudentInfo(int noClassMusicGroupStudentInfo) {
+        this.noClassMusicGroupStudentInfo = noClassMusicGroupStudentInfo;
+    }
+
+    public int getStudentNotPayment() {
+        return studentNotPayment;
+    }
+
+    public void setStudentNotPayment(int studentNotPayment) {
+        this.studentNotPayment = studentNotPayment;
+    }
+
+    public int getStudentApplyForQuitMusicGroup() {
+        return studentApplyForQuitMusicGroup;
+    }
+
+    public void setStudentApplyForQuitMusicGroup(int studentApplyForQuitMusicGroup) {
+        this.studentApplyForQuitMusicGroup = studentApplyForQuitMusicGroup;
+    }
+
+    public int getTeacherExpectSalaryBeLow() {
+        return teacherExpectSalaryBeLow;
+    }
+
+    public void setTeacherExpectSalaryBeLow(int teacherExpectSalaryBeLow) {
+        this.teacherExpectSalaryBeLow = teacherExpectSalaryBeLow;
+    }
+
+    public int getCourseTimeError() {
+        return courseTimeError;
+    }
+
+    public void setCourseTimeError(int courseTimeError) {
+        this.courseTimeError = courseTimeError;
+    }
+
+    public int getInspectionItem() {
+        return inspectionItem;
+    }
+
+    public void setInspectionItem(int inspectionItem) {
+        this.inspectionItem = inspectionItem;
+    }
+
+    public int getInspectionItemPlan() {
+        return inspectionItemPlan;
+    }
+
+    public void setInspectionItemPlan(int inspectionItemPlan) {
+        this.inspectionItemPlan = inspectionItemPlan;
+    }
+
+    public int getStudentVisit() {
+        return studentVisit;
+    }
+
+    public void setStudentVisit(int studentVisit) {
+        this.studentVisit = studentVisit;
+    }
+
+    public int getTeacherExceptionAttendance() {
+        return teacherExceptionAttendance;
+    }
+
+    public void setTeacherExceptionAttendance(int teacherExceptionAttendance) {
+        this.teacherExceptionAttendance = teacherExceptionAttendance;
+    }
+
+    public int getTeacherNotAClass() {
+        return teacherNotAClass;
+    }
+
+    public void setTeacherNotAClass(int teacherNotAClass) {
+        this.teacherNotAClass = teacherNotAClass;
+    }
+
+    public int getTeacherServeError() {
+        return teacherServeError;
+    }
+
+    public void setTeacherServeError(int teacherServeError) {
+        this.teacherServeError = teacherServeError;
+    }
+
+    public int getTotal() {
+        return total;
+    }
+
+    public void setTotal(int total) {
+        this.total = total;
+    }
+}

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java

@@ -99,6 +99,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     TEACHER_PUSH_LEAVE_RESULT("TEACHER_PUSH_LEAVE_RESULT", "请假结果"),
     TEACHER_PUSH_COURSE_SCHEDULE_CHANGE_RESULT("TEACHER_PUSH_COURSE_SCHEDULE_CHANGE_RESULT", "课时调整结果"),
     TEACHER_PUSH_STUDENT_LEAVE("TEACHER_PUSH_STUDENT_LEAVE", "学员请假"),
+    TEACHER_IM_STUDENT_LEAVE("TEACHER_IM_STUDENT_LEAVE", "学员请假"),
     TEACHER_PUSH_CLASS_MESSAGE("TEACHER_PUSH_CLASS_MESSAGE", "班级消息"),
     COURSE_SALARY_COMPLAINTS_RESULT("COURSE_SALARY_COMPLAINTS_RESULT", "课酬申述结果"),
     PUSH_TEACHER_EXCEPTION_ATTENDANCE("PUSH_TEACHER_EXCEPTION_ATTENDANCE", "异常考勤通知"),

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

@@ -32,6 +32,16 @@ public class MusicGroupQueryInfo extends QueryInfo {
 
     private List<String> musicGroupIds;
 
+    private String searchType;
+
+    public String getSearchType() {
+        return searchType;
+    }
+
+    public void setSearchType(String searchType) {
+        this.searchType = searchType;
+    }
+
     public List<String> getMusicGroupIds() {
         return musicGroupIds;
     }

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

@@ -238,6 +238,15 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	void vipCourseAdjust(VipGroupCourseAdjustInfoDto vipGroupCourseAdjustInfo);
 
 	/**
+	 * @describe 课程批量调整
+	 * @author Joburgess
+	 * @date 2021/4/9 0009
+	 * @param batchCourseAdjustInfo:
+	 * @return void
+	 */
+	HttpResponseResult batchCourseAdjust(BatchCourseAdjustDto batchCourseAdjustInfo);
+
+	/**
 	 * @describe 课程顺延
 	 * @author Joburgess
 	 * @date 2020/1/2

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

@@ -169,6 +169,16 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
     List<CourseScheduleTeacherSalary> createTeacherCourseSalary(CourseSchedule courseSchedule, List<Integer> teacherIds);
 
     /**
+     * @describe 计算课程课酬
+     * @author Joburgess
+     * @date 2021/4/12 0012
+     * @param courseSchedule:
+     * @param courseScheduleTeacherSalaries:
+     * @return void
+     */
+    void updateSingleCourseTeacherSalary(CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalaries);
+
+    /**
      * @describe 计算乐团课教师课酬
      * @author Joburgess
      * @date 2020/12/16 0016

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

@@ -4,6 +4,7 @@ import java.util.List;
 import java.util.Map;
 
 import com.ym.mec.biz.dal.dto.IndexBaseDto;
+import com.ym.mec.biz.dal.dto.IndexErrorDataExportDto;
 import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
 import com.ym.mec.biz.dal.entity.IndexErrInfoDto;
 import com.ym.mec.biz.dal.enums.IndexErrorType;
@@ -18,6 +19,8 @@ public interface IndexBaseMonthDataService extends BaseService<Long, IndexBaseMo
 
     Map<String, Object> getIndexErrData(String organIds, IndexErrorType errorType);
 
+    List<IndexErrorDataExportDto> exportIndexErrData(String organIds, IndexErrorType errorType);
+
     /**
      * 事项提醒
      * @param organIds

+ 23 - 17
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -601,12 +601,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         PageInfo<TeacherMusicClassInfoDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
-        List<TeacherMusicClassInfoDto> dataList = null;
         int count = classGroupDao.countGroupCourses(params);
-        if (count > 0) {
-            pageInfo.setTotal(count);
-            params.put("offset", pageInfo.getOffset());
-            dataList = classGroupDao.queryGroupCourses(params);
+        pageInfo.setTotal(count);
+        params.put("offset", pageInfo.getOffset());
+        List<TeacherMusicClassInfoDto> dataList = classGroupDao.queryGroupCourses(params);
+        if (!CollectionUtils.isEmpty(dataList)) {
             HashMap<String, Object> param = new HashMap<>();
             param.put("teacherId", queryInfo.getSearch());
             param.put("attendanceStatus", YesOrNoEnum.YES);
@@ -633,10 +632,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         MapUtil.populateMap(params, queryInfo);
         List<TeacherVipClassInfoDto> dataList = null;
         int count = vipGroupDao.countTeacherVipClass(queryInfo.getTeacherId());
-        if (count > 0) {
-            pageInfo.setTotal(count);
-            params.put("offset", pageInfo.getOffset());
-            dataList = vipGroupDao.getTeacherVipClass(params);
+        pageInfo.setTotal(count);
+        params.put("offset", pageInfo.getOffset());
+        dataList = vipGroupDao.getTeacherVipClass(params);
+        if (!CollectionUtils.isEmpty(dataList)) {
 //            Set<Integer> activityIds = dataList.stream().map(e -> e.getActivityId()).collect(Collectors.toSet());
 //            List<Map<Integer, String>> names = vipGroupActivityDao.queryNamesById(StringUtils.join(activityIds, ","));
 //            Map<Integer, String> nameMap = MapUtil.convertMybatisMap(names);
@@ -1226,14 +1225,21 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             classGroupDao.addStudentNum(classGroup);
 
             // 2、插入关联关系
-            ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
-            classGroupStudentMapper.setMusicGroupId(classGroup.getMusicGroupId());
-            classGroupStudentMapper.setClassGroupId(classGroup.getId());
-            classGroupStudentMapper.setUserId(studentId);
-            classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
-            classGroupStudentMapper.setGroupType(classGroup.getGroupType());
-            classGroupStudentMapper.setCreateTime(date);
-            classGroupStudentMapperDao.insert(classGroupStudentMapper);
+            ClassGroupStudentMapper classGroupStudent = classGroupStudentMapperDao.findClassGroupStudent(classGroup.getId(), studentId);
+            if(Objects.nonNull(classGroupStudent)){
+                classGroupStudent.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+                classGroupStudent.setUpdateTime(date);
+                classGroupStudentMapperDao.update(classGroupStudent);
+            }else {
+                ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
+                classGroupStudentMapper.setMusicGroupId(classGroup.getMusicGroupId());
+                classGroupStudentMapper.setClassGroupId(classGroup.getId());
+                classGroupStudentMapper.setUserId(studentId);
+                classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+                classGroupStudentMapper.setGroupType(classGroup.getGroupType());
+                classGroupStudentMapper.setCreateTime(date);
+                classGroupStudentMapperDao.insert(classGroupStudentMapper);
+            }
 
             // 3、学生加入级未开始课程
             List<CourseSchedule> courseScheduleList = courseScheduleService.findNoStartCoursesByClassGroupId(classGroup.getId());

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

@@ -7,24 +7,12 @@ import static com.ym.mec.biz.dal.enums.PracticeGroupType.*;
 
 import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.TreeSet;
+import java.time.LocalTime;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -36,6 +24,7 @@ import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import org.apache.commons.collections.ListUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.codehaus.jackson.map.util.BeanUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -269,16 +258,24 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 		List<CourseSchedule> courseScheduleList = courseScheduleDao.findByCourseScheduleIds(courseScheduleIds);
 
+		List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseScheduleIds);
+		Set<Long> settlementCourseIds = new HashSet<>();
+		if(!CollectionUtils.isEmpty(courseScheduleTeacherSalaries)){
+			settlementCourseIds = courseScheduleTeacherSalaries.stream().filter(c->Objects.nonNull(c.getSettlementTime())).map(CourseScheduleTeacherSalary::getCourseScheduleId).collect(Collectors.toSet());
+		}
+
 		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 		Date date = new Date();
 		if (courseScheduleList != null) {
 			for (CourseSchedule cs : courseScheduleList) {
-				if (cs.getStatus() != CourseStatusEnum.NOT_START) {
-					throw new BizException("删除失败,未开始的课程才能删除");
+				if(settlementCourseIds.contains(cs.getId())){
+					throw new BizException("删除失败,已结算的课程不能删除");
+				}
+				if (CourseStatusEnum.UNDERWAY.equals(cs.getStatus())) {
+					throw new BizException("删除失败,进行中的课程不能删除");
 				}
-				String endDateStr = DateUtil.format(cs.getClassDate(), "yyyy-MM-dd") + " " + DateUtil.format(cs.getStartClassTime(), "HH:mm:ss");
-				if (DateUtil.stringToDate(endDateStr, sdf).before(date)) {
-					throw new BizException("删除失败,未开始的课程才能删除");
+				if (Objects.nonNull(cs.getIsLock())&&cs.getIsLock()==1) {
+					throw new BizException("删除失败,被锁定的课程不能删除");
 				}
 				if(Objects.nonNull(cs.getNewCourseId())){
 					throw new BizException("删除失败,被合并课程不能删除");
@@ -2822,7 +2819,268 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		saveModifyLog(modifyLogs,courseScheduleIds);
     }
 
-    @Override
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public HttpResponseResult batchCourseAdjust(BatchCourseAdjustDto courseAdjustInfo) {
+		if(CollectionUtils.isEmpty(courseAdjustInfo.getCourseScheduleIds())){
+			return BaseController.failed("请指定需要调整的课程");
+		}
+
+		//未更新课程列表
+		List<CourseSchedule> oldCourses = courseScheduleDao.findByCourseScheduleIds(courseAdjustInfo.getCourseScheduleIds());
+
+		if(CollectionUtils.isEmpty(oldCourses)){
+			return BaseController.succeed();
+		}
+
+		Set<String> musicGroupIds = oldCourses.stream().filter(c -> MUSIC.equals(c.getGroupType())).map(CourseSchedule::getMusicGroupId).collect(Collectors.toSet());
+		if(!CollectionUtils.isEmpty(musicGroupIds)){
+			List<MusicGroup> musicGroups = musicGroupDao.getMusicGroupByIds(new ArrayList<>(musicGroupIds));
+			if(CollectionUtils.isEmpty(musicGroups)){
+				throw new BizException("调整失败:乐团信息异常");
+			}
+			long errMusicGroupNum = musicGroups.stream().filter(m -> !MusicGroupStatusEnum.PROGRESS.equals(m.getStatus())).count();
+			if(errMusicGroupNum>0){
+				throw new BizException("调整失败:调整的课程所在乐团处于非进行中");
+			}
+		}
+
+		Date now = new Date();
+
+		//获取修改日志
+		List<CourseScheduleModifyLog> modifyLogs = getModifyLogs(courseAdjustInfo.getCourseScheduleIds(),oldCourses,courseAdjustInfo.getOperatorId(),now);
+
+		List<CourseScheduleTeacherSalary> oldCourseScheduleTeacherSalaryList = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseAdjustInfo.getCourseScheduleIds());
+		Map<Long, List<CourseScheduleTeacherSalary>> courseSalaryListMap = new HashMap<>();
+		if(!CollectionUtils.isEmpty(oldCourseScheduleTeacherSalaryList)){
+			courseSalaryListMap = oldCourseScheduleTeacherSalaryList.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getCourseScheduleId));
+		}
+
+		//需要变更课酬的教师类型
+		Set<TeachTypeEnum> changeSalaryTeachTypes = new HashSet<>();
+
+		if(courseAdjustInfo.getChangeMainTeacher()){
+			changeSalaryTeachTypes.add(TeachTypeEnum.BISHOP);
+			courseScheduleTeacherSalaryDao.deleteWithCourseAndTeachRole(courseAdjustInfo.getCourseScheduleIds(), TeachTypeEnum.BISHOP);
+		}
+		if(courseAdjustInfo.getChangeTeachingTeacher()){
+			changeSalaryTeachTypes.add(TeachTypeEnum.TEACHING);
+			courseScheduleTeacherSalaryDao.deleteWithCourseAndTeachRole(courseAdjustInfo.getCourseScheduleIds(), TeachTypeEnum.TEACHING);
+		}
+
+		if(CollectionUtils.isEmpty(courseAdjustInfo.getClassGroupTeacherMapperList())){
+			courseAdjustInfo.setClassGroupTeacherMapperList(new ArrayList<>());
+		}
+
+		//获取主教编号
+		Integer mainTeacherId = null;
+		if(!CollectionUtils.isEmpty(courseAdjustInfo.getClassGroupTeacherMapperList())){
+			Map<Integer, Long> userNumMap = courseAdjustInfo.getClassGroupTeacherMapperList().stream().collect(Collectors.groupingBy(ClassGroupTeacherMapper::getUserId, Collectors.counting()));
+			if(userNumMap.containsValue(Long.valueOf("2"))){
+				throw new BizException("主教与助教不可重复");
+			}
+			ClassGroupTeacherMapper classGroupTeacherMapper = courseAdjustInfo.getClassGroupTeacherMapperList().stream().filter(c -> TeachTypeEnum.BISHOP.equals(c.getTeacherRole())).findAny().get();
+			if(Objects.nonNull(classGroupTeacherMapper)){
+				mainTeacherId = classGroupTeacherMapper.getUserId();
+			}
+		}
+
+		//上课日期变更
+		//间隔天数
+		int betweenDays = 0;
+		//节假日
+		Set<String> holidayDays = new HashSet<>();
+		if(Objects.nonNull(courseAdjustInfo.getPauseDate())&&Objects.nonNull(courseAdjustInfo.getRecoveryDate())){
+			if (courseAdjustInfo.getHoliday()) {
+				SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
+				if(Objects.nonNull(holidaySetting)&&StringUtils.isNotBlank(holidaySetting.getParanValue())){
+					holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
+				}
+			}
+
+			LocalDate pauseDate = LocalDate.parse(courseAdjustInfo.getPauseDate(), DateUtil.dateFormatter);
+			LocalDate recoveryDate = LocalDate.parse(courseAdjustInfo.getRecoveryDate(), DateUtil.dateFormatter);
+
+			betweenDays = (int) (recoveryDate.toEpochDay()-pauseDate.toEpochDay());
+		}
+
+		//上课时间变更
+		LocalTime startTime = null;
+		if(Objects.nonNull(courseAdjustInfo.getStartTime())){
+			startTime = LocalTime.parse(courseAdjustInfo.getStartTime(), DateUtil.timeFormatter);
+		}
+
+		List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
+
+		oldCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+		for (int i = 0; i < oldCourses.size(); i++) {
+			if(Objects.nonNull(oldCourses.get(i).getNewCourseId())){
+				throw new BizException("选择的课程中存在已合并课程,无法进行调整");
+			}
+			if(!CourseStatusEnum.NOT_START.equals(oldCourses.get(i).getStatus())){
+				throw new BizException("选择的课程中存在进行中或已结束的课程,无法进行调整");
+			}
+			//上课日期变更
+			if(betweenDays!=0){
+				LocalDate classDate = LocalDateTime.ofInstant(oldCourses.get(i).getClassDate().toInstant(), DateUtil.zoneId).toLocalDate();
+				classDate = classDate.plusDays(betweenDays);
+				if (courseAdjustInfo.getHoliday() && holidayDays.contains(classDate.toString())) {
+					betweenDays=betweenDays+7;
+					i=i-1;
+					continue;
+				}
+				oldCourses.get(i).setClassDate(Date.from(classDate.atStartOfDay().atZone(DateUtil.zoneId).toInstant()));
+			}
+
+			//上课时间变更
+			if(Objects.nonNull(startTime)){
+				//课程时长
+				int minutes = DateUtil.minutesBetween(oldCourses.get(i).getStartClassTime(), oldCourses.get(i).getEndClassTime());
+				LocalTime endTime = startTime.plusMinutes(minutes);
+				String courseStartTimeStr = DateUtil.dateToString(oldCourses.get(i).getClassDate(), "yyyy-MM-dd") + " " + startTime.toString();
+				String courseEndTimeStr = DateUtil.dateToString(oldCourses.get(i).getClassDate(), "yyyy-MM-dd") + " " + endTime.toString();
+				oldCourses.get(i).setStartClassTime(DateUtil.stringToDate(courseStartTimeStr, "yyyy-MM-dd HH:mm"));
+				try {
+					oldCourses.get(i).setStartClassTimeStr(startTime.toString());
+				} catch (ParseException e) {
+					e.printStackTrace();
+				}
+				oldCourses.get(i).setEndClassTime(DateUtil.stringToDate(courseEndTimeStr, "yyyy-MM-dd HH:mm"));
+				try {
+					oldCourses.get(i).setEndClassTimeStr(endTime.toString());
+				} catch (ParseException e) {
+					e.printStackTrace();
+				}
+			}
+
+			if(Objects.nonNull(courseAdjustInfo.getSchoolId())){
+				oldCourses.get(i).setSchoolId(courseAdjustInfo.getSchoolId());
+			}
+
+			if(Objects.nonNull(courseAdjustInfo.getTeachMode())&&!courseAdjustInfo.getTeachMode().equals(oldCourses.get(i).getTeachMode())){
+				oldCourses.get(i).setTeachMode(courseAdjustInfo.getTeachMode());
+				if(VIP.equals(oldCourses.get(i).getGroupType())){
+					changeSalaryTeachTypes.add(TeachTypeEnum.BISHOP);
+					if(courseSalaryListMap.containsKey(oldCourses.get(i).getId())){
+						List<CourseScheduleTeacherSalary> ctss = courseSalaryListMap.get(oldCourses.get(i).getId());
+						for (CourseScheduleTeacherSalary teacherSalary : ctss) {
+							courseScheduleTeacherSalaryService.updateSingleCourseTeacherSalary(oldCourses.get(i), teacherSalary);
+						}
+						courseScheduleTeacherSalaryDao.batchUpdate(ctss);
+					}
+				}
+			}
+
+			if(TeachModeEnum.ONLINE.equals(oldCourses.get(i).getTeachMode())){
+				oldCourses.get(i).setSchoolId(null);
+			}
+
+			//主教变更
+			if(Objects.nonNull(mainTeacherId)){
+				oldCourses.get(i).setActualTeacherId(mainTeacherId);
+			}
+
+			if(oldCourses.get(i).getStartClassTime().compareTo(now)<0){
+				throw new BizException("上课时间不得早于当前时间");
+			}
+
+			for (ClassGroupTeacherMapper classGroupTeacherMapper : courseAdjustInfo.getClassGroupTeacherMapperList()) {
+				if(!changeSalaryTeachTypes.contains(classGroupTeacherMapper.getTeacherRole())){
+					continue;
+				}
+				CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+				courseScheduleTeacherSalary.setCourseScheduleId(oldCourses.get(i).getId());
+				courseScheduleTeacherSalary.setGroupType(oldCourses.get(i).getGroupType());
+				courseScheduleTeacherSalary.setMusicGroupId(oldCourses.get(i).getMusicGroupId());
+				courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
+				courseScheduleTeacherSalary.setUserId(classGroupTeacherMapper.getUserId());
+				courseScheduleTeacherSalary.setClassGroupId(oldCourses.get(i).getClassGroupId());
+				courseScheduleTeacherSalary.setCreateTime(now);
+				courseScheduleTeacherSalary.setUpdateTime(now);
+				if(CourseScheduleType.PRACTICE.equals(oldCourses.get(i).getType())&&courseSalaryListMap.containsKey(oldCourses.get(i).getId())){
+					courseScheduleTeacherSalary.setExpectSalary(courseSalaryListMap.get(oldCourses.get(i).getId()).get(0).getExpectSalary());
+				}
+				courseScheduleTeacherSalaryService.updateSingleCourseTeacherSalary(oldCourses.get(i), courseScheduleTeacherSalary);
+				courseScheduleTeacherSalaries.add(courseScheduleTeacherSalary);
+
+				if (courseAdjustInfo.getConfirmGenerate() && !courseAdjustInfo.getAllowZeroSalary() && BigDecimal.ZERO.compareTo(courseScheduleTeacherSalary.getExpectSalary()) == 0) {
+					TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+					return BaseController.failed(HttpStatus.MULTI_STATUS, "当前课程课酬预计为0,是否继续");
+				}
+			}
+		}
+
+		//老师结算表
+		if (courseScheduleTeacherSalaries.size() > 0) {
+			teacherAttendanceDao.batchDeleteByCourseSchedules(courseAdjustInfo.getCourseScheduleIds());
+			courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaries);
+		}
+
+		try {
+			checkNewCourseSchedules(oldCourses, false, false);
+		} catch (Exception e) {
+			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+			String errMessage = e.getMessage();
+			if (errMessage.equals("您设置的循环周期存在时间冲突")) {
+				errMessage = "日期相同课程不可批量调整上课时间";
+			}
+			return BaseController.failed(HttpStatus.INTERNAL_SERVER_ERROR, errMessage);
+		}
+
+		if (!courseAdjustInfo.getConfirmGenerate()) {
+			List<CourseScheduleTeacherSalary> cstss = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseAdjustInfo.getCourseScheduleIds());
+			Map<Long, Set<Integer>> courseTeachTypeTeacherIdsMap = new HashMap<>();
+			if(!CollectionUtils.isEmpty(cstss)){
+				courseTeachTypeTeacherIdsMap = cstss.stream().filter(c->TeachTypeEnum.TEACHING.equals(c.getTeacherRole())).collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getCourseScheduleId, Collectors.mapping(CourseScheduleTeacherSalary::getUserId, Collectors.toSet())));
+			}
+			Set<Integer> allTeacherIds = cstss.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toSet());
+			List<SimpleUserDto> teachers = teacherDao.getUsersSimpleInfo(new ArrayList<>(allTeacherIds));
+			Map<Integer, String> idNameMap = new HashMap<>();
+			if(!CollectionUtils.isEmpty(teachers)){
+				idNameMap = teachers.stream().collect(Collectors.toMap(SimpleUserDto::getUserId, s->s.getRealName(), (s1, s2)->s1));
+			}
+			//获取班级声部名称
+			List<Map<Integer, String>> classGroupSubjectNameMaps = classGroupDao.findClassGroupSubjectNameMaps(courseAdjustInfo.getCourseScheduleIds());
+			Map<Integer, String> classGroupSubjectNameMap = MapUtil.convertIntegerMap(classGroupSubjectNameMaps);
+
+			List<Integer> schoolIds = oldCourses.stream().filter(o -> Objects.nonNull(o.getSchoolId())).map(CourseSchedule::getSchoolId).collect(Collectors.toList());
+			Map<Integer, String> idSchoolNameMap = new HashMap<>();
+			if(!CollectionUtils.isEmpty(schoolIds)){
+				List<School> schools = schoolDao.getSchools(schoolIds);
+				idSchoolNameMap = schools.stream().collect(Collectors.toMap(School::getId, s->s.getName(), (s1, s2)->s1));
+			}
+
+			List<CourseScheduleEndDto> results = new ArrayList<>();
+			for (CourseSchedule oldCours : oldCourses) {
+				CourseScheduleEndDto courseEnd = new CourseScheduleEndDto();
+				BeanUtils.copyProperties(oldCours, courseEnd);
+				courseEnd.setTeacherName(idNameMap.get(oldCours.getActualTeacherId()));
+				if(courseTeachTypeTeacherIdsMap.containsKey(oldCours.getId())){
+					Set<Integer> teacherIds = courseTeachTypeTeacherIdsMap.get(oldCours.getId());
+					Set<String> teacherNames = new HashSet<>();
+					for (Integer teacherId : teacherIds) {
+						teacherNames.add(idNameMap.get(teacherId));
+					}
+					courseEnd.setTeachingTeacherNames(StringUtils.join(teacherNames, ","));
+				}
+				courseEnd.setSubjectName(classGroupSubjectNameMap.get(oldCours.getId()));
+				courseEnd.setSchoolName(idSchoolNameMap.get(oldCours.getSchoolId()));
+
+				results.add(courseEnd);
+			}
+			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+			oldCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+			return BaseController.failed(HttpStatus.PARTIAL_CONTENT, results, "");
+		}
+
+		courseScheduleDao.batchUpdate(oldCourses);
+
+		saveModifyLog(modifyLogs, courseAdjustInfo.getCourseScheduleIds());
+
+		return BaseController.succeed();
+	}
+
+	@Override
     @Transactional(rollbackFor = Exception.class)
     public void coursePostpone(CoursePostponeDto coursePostPoneInfo) {
         SysUser user = sysUserFeignService.queryUserInfo();
@@ -3160,7 +3418,19 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			}
         }
 
-        //课程冲突检测
+		Set<String> musicGroupIds = oldCourseScheduleList.stream().filter(c -> MUSIC.equals(c.getGroupType())).map(CourseSchedule::getMusicGroupId).collect(Collectors.toSet());
+        if(!CollectionUtils.isEmpty(musicGroupIds)){
+			List<MusicGroup> musicGroups = musicGroupDao.getMusicGroupByIds(new ArrayList<>(musicGroupIds));
+			if(CollectionUtils.isEmpty(musicGroups)){
+				throw new BizException("调整失败:乐团信息异常");
+			}
+			long errMusicGroupNum = musicGroups.stream().filter(m -> !MusicGroupStatusEnum.PROGRESS.equals(m.getStatus())).count();
+			if(errMusicGroupNum>0){
+				throw new BizException("调整失败:调整的课程所在乐团处于非进行中");
+			}
+		}
+
+		//课程冲突检测
         checkNewCourseSchedules(newCourseSchedules, false,false);
 
 		Map<Long, List<TeacherAttendance>> teacherAttendanceMap = new HashMap<Long, List<TeacherAttendance>>();
@@ -4449,10 +4719,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         if(queryInfo.getIsExport() && count > 50000){
             throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
         }
-        if (count > 0) {
-            pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-            results = courseScheduleDao.endFindCourseSchedules(params);
+		pageInfo.setTotal(count);
+		params.put("offset", pageInfo.getOffset());
+		results = courseScheduleDao.endFindCourseSchedules(params);
+        if (!CollectionUtils.isEmpty(results)) {
             List<Long> courseScheduleIds = results.stream().map(CourseScheduleEndDto::getId).collect(Collectors.toList());
             List<Integer> teacherIds=results.stream().filter(t->Objects.nonNull(t.getActualTeacherId())).map(CourseSchedule::getActualTeacherId).collect(Collectors.toList());
 

+ 34 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -1160,6 +1160,27 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     }
 
     @Override
+    public void updateSingleCourseTeacherSalary(CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalary) {
+        List<CourseScheduleTeacherSalary> teacherSalaries = new ArrayList<>();
+        teacherSalaries.add(courseScheduleTeacherSalary);
+        switch (courseSchedule.getGroupType()){
+            case MUSIC:
+                //生成乐团课课酬
+                createMusicGroupCourseTeacherSalaries(null, courseSchedule, teacherSalaries);
+                break;
+            case VIP:
+                //生成vip课课酬
+                createVipGroupCourseTeacherSalaries(courseSchedule, teacherSalaries);
+                break;
+            case PRACTICE:
+                //生成网管课课酬
+                createPracticeGroupCourseTeacherSalaries(courseSchedule, teacherSalaries);
+                break;
+        }
+        courseScheduleTeacherSalary.setExpectSalary(teacherSalaries.get(0).getExpectSalary());
+    }
+
+    @Override
     public void createMusicGroupCourseTeacherSalary(MusicGroup musicGroup, CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalary) {
         List<CourseScheduleTeacherSalary> teacherSalaries = new ArrayList<>();
         teacherSalaries.add(courseScheduleTeacherSalary);
@@ -1306,14 +1327,22 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     private void createPracticeGroupCourseTeacherSalaries(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries){
         List<Integer> teacherIds = courseScheduleTeacherSalaries.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toList());
 
+        SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
+        BigDecimal freeTeacherSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
+
         List<TeacherDefaultPracticeGroupSalary> allTeacherDefaultPracticeGroupSalaryList = teacherDefaultPracticeGroupSalaryDao.queryByUserIdList(teacherIds);
         Map<Integer, List<TeacherDefaultPracticeGroupSalary>> teacherSalaryMap = allTeacherDefaultPracticeGroupSalaryList.stream().collect(Collectors.groupingBy(TeacherDefaultPracticeGroupSalary::getUserId));
         for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
-            final List<TeacherDefaultPracticeGroupSalary> teacherDefaultPracticeGroupSalaryList = teacherSalaryMap.get(courseScheduleTeacherSalary.getUserId());
-            if (teacherDefaultPracticeGroupSalaryList != null && teacherDefaultPracticeGroupSalaryList.size() > 0) {
-                courseScheduleTeacherSalary.setExpectSalary(teacherDefaultPracticeGroupSalaryList.get(0).getMainTeacherSalary());
-            } else {
-                throw new BizException("请设置老师 的网管课课酬");
+            List<TeacherDefaultPracticeGroupSalary> teacherDefaultPracticeGroupSalaryList = teacherSalaryMap.get(courseScheduleTeacherSalary.getUserId());
+
+            if(Objects.nonNull(courseScheduleTeacherSalary.getExpectSalary())&&freeTeacherSalary.compareTo(courseScheduleTeacherSalary.getExpectSalary())==0){
+                courseScheduleTeacherSalary.setExpectSalary(freeTeacherSalary);
+            }else{
+                if (teacherDefaultPracticeGroupSalaryList != null && teacherDefaultPracticeGroupSalaryList.size() > 0) {
+                    courseScheduleTeacherSalary.setExpectSalary(teacherDefaultPracticeGroupSalaryList.get(0).getMainTeacherSalary());
+                } else {
+                    throw new BizException("请设置老师 的网管课课酬");
+                }
             }
         }
     }

+ 257 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java

@@ -5,6 +5,7 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.IndexBaseDto;
+import com.ym.mec.biz.dal.dto.IndexErrorDataExportDto;
 import com.ym.mec.biz.dal.entity.IndexErrInfoDto;
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.enums.*;
@@ -14,6 +15,7 @@ import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -311,10 +313,14 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			one.setDesc(IndexErrorType.MUSIC_PATROL.getMsg());
 			List<IndexErrInfoDto> oneChild = new ArrayList<>();
 
+			//基础技能班学员数量异常
 			oneChild.add(new IndexErrInfoDto(IndexErrorType.HIGH_CLASS_STUDENT_LESS_THAN_THREE, IndexErrorType.HIGH_CLASS_STUDENT_LESS_THAN_THREE.getMsg(), indexBaseMonthDataDao.countLessThenThreeClassGroupNum(organIds,educationUserId), null));
+
+			//乐团巡查事项异常
 			int errInspection = indexBaseMonthDataDao.queryErrInspection(organIds,startTime);
 			oneChild.add(new IndexErrInfoDto(IndexErrorType.MUSIC_PATROL_ITEM, IndexErrorType.MUSIC_PATROL_ITEM.getMsg(),errInspection, null));
 
+			//未加入任何班级学员
 			IndexErrInfoDto noClassMusicGroupStudentInfo = indexBaseMonthDataDao.getNoClassMusicGroupStudentInfo(organIds,educationUserId);
 			noClassMusicGroupStudentInfo.setDesc(IndexErrorType.NO_CLASS_MUSIC_GROUP_STUDENT_INFO.getMsg());
 			oneChild.add(noClassMusicGroupStudentInfo);
@@ -331,7 +337,10 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			two.setDesc(IndexErrorType.STUDENT_INFO.getMsg());
 			List<IndexErrInfoDto> twoChild = new ArrayList<>();
 
+			//未缴费学员数
 			twoChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_NOT_PAYMENT, IndexErrorType.STUDENT_NOT_PAYMENT.getMsg(), indexBaseMonthDataDao.countNoPaymentStudentNum(organIds,educationUserId), Arrays.asList(educationUserId)));
+
+			//申请退团学员数
 			List<Long> quitGroupNum = indexBaseMonthDataDao.queryApplyForQuitGroupNum(organIds,educationUserId);
 			twoChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_APPLY_FOR_QUIT_MUSIC_GROUP, IndexErrorType.STUDENT_APPLY_FOR_QUIT_MUSIC_GROUP.getMsg(), quitGroupNum.size(),  quitGroupNum));
 //			int attendanceInfo = indexBaseMonthDataDao.queryStudentAttendanceInfo(organIds, StudentAttendanceStatusEnum.TRUANT.getCode(),startTime);
@@ -353,10 +362,13 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 //			threeChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_LEAVE, IndexErrorType.TEACHER_LEAVE.getMsg(),teacherLeave, null));
 
 			String monthStr = DateUtil.format(date, DateUtil.ISO_YEAR_MONTH_FORMAT);
+
 			//全职未离职老师
+			//预计课酬较低
 			int lowTeacherSalary = indexBaseMonthDataDao.queryLowTeacherSalary(organIdsStr,monthStr);
 			threeChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_EXPECT_SALARY_BE_LOW, IndexErrorType.TEACHER_EXPECT_SALARY_BE_LOW.getMsg(),lowTeacherSalary, null));
 
+			//课程时间安排异常
 			Integer userId = null;
 			if (!userRole.contains(SysUserRole.SECTION_MANAGER) && !sysUser.getIsSuperAdmin()) {
 				userId = sysUser.getId();
@@ -367,12 +379,15 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			}
 			threeChild.add(new IndexErrInfoDto(IndexErrorType.COURSE_TIME_ERROR, IndexErrorType.COURSE_TIME_ERROR.getMsg(), courseTimeError, null));
 
+			//乐团巡查任务未计划
 			int inspectionItem = indexBaseMonthDataDao.queryInspectionItem(organIdsStr,startTime,userId);
 			threeChild.add(new IndexErrInfoDto(IndexErrorType.INSPECTION_ITEM, IndexErrorType.INSPECTION_ITEM.getMsg(),inspectionItem, null));
 
+			//乐团巡查任务未提交
 			int inspectionItemPlan = indexBaseMonthDataDao.queryInspectionItemPlan(organIdsStr,startTime);
 			threeChild.add(new IndexErrInfoDto(IndexErrorType.INSPECTION_ITEM_PLAN, IndexErrorType.INSPECTION_ITEM_PLAN.getMsg(),inspectionItemPlan, null));
 
+			//回访任务未完成
 			int studentVisit = indexBaseMonthDataDao.queryStudentVisit(organIdsStr,startTime,userId);
 			threeChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_VISIT, IndexErrorType.STUDENT_VISIT.getMsg(),studentVisit, null));
 
@@ -387,6 +402,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			four.setDesc(IndexErrorType.ATTENDANCE_SERVE.getMsg());
 			List<IndexErrInfoDto> fourChild = new ArrayList<>();
 
+			//课程考勤异常
 			int attendanceError = 0;
 			int noAttendance = 0;
 			if(classGroupIds == null || classGroupIds.size() > 0){
@@ -395,8 +411,10 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			}
 			fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_EXCEPTION_ATTENDANCE, IndexErrorType.TEACHER_EXCEPTION_ATTENDANCE.getMsg(), attendanceError, null));
 
+			//课程异常
 			fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_NOT_A_CLASS, IndexErrorType.TEACHER_NOT_A_CLASS.getMsg(), noAttendance, null));
 
+			//服务指标异常
 			Map<String, Object> params = new HashMap<>();
 			LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
 			LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
@@ -421,6 +439,235 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 	}
 
 	@Override
+	public List<IndexErrorDataExportDto> exportIndexErrData(String organIdsStr, IndexErrorType errorType) {
+		List<IndexErrorDataExportDto> results = new ArrayList<>();
+
+		//只筛选指定时间之后的数据
+		String startTime = DateUtil.format(DateUtil.getFirstDayOfMonth(DateUtil.addMonths(new Date(), -2)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
+
+		Set<Integer> organIds = null;
+		if(StringUtils.isNotBlank(organIdsStr)){
+			organIds = Arrays.stream(organIdsStr.split(",")).map(Integer::new).collect(Collectors.toSet());
+		}
+		Date date = new Date();
+
+		List<IndexErrInfoDto> all = new ArrayList<>();
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
+		//如果当前用户只有教务老师角色,那么只能看到他所管理的课程组的信息
+		List<Long> classGroupIds = null;
+		Integer educationUserId = null;
+		if (!sysUser.getIsSuperAdmin() && userRole.size() == 1 && userRole.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+			//获取教务老师关联的班级列表
+			classGroupIds = classGroupDao.queryGroupClassGroupIds(sysUser.getId());
+			educationUserId = sysUser.getId();
+		}
+
+		//基础技能班学员数量异常
+		Map<Integer, Integer> highClassStudentLessThanThreeMap = new HashMap<>();
+		//乐团巡查事项异常
+		Map<Integer, Integer> musicPatrolItemMap = new HashMap<>();
+		//未加入任何班级学员
+		Map<Integer, Integer> organNoClassMusicGroupStudentNumMap = new HashMap<>();
+		//未缴费学员数
+		Map<Integer, Integer> studentNotPaymentMap = new HashMap<>();
+		//申请退团学员数
+		Map<Integer, Integer> studentApplyForQuitMusicGroupMap = new HashMap<>();
+		//预计课酬较低
+		Map<Integer, Integer> teacherExpectSalaryBeLowMap = new HashMap<>();
+		//课程时间安排异常
+		Map<Integer, Integer> courseTimeErrorMap = new HashMap<>();
+		//乐团巡查任务未计划
+		Map<Integer, Integer> inspectionItemMap = new HashMap<>();
+		//乐团巡查任务未提交
+		Map<Integer, Integer> inspectionItemPlanMap = new HashMap<>();
+		//回访任务未完成
+		Map<Integer, Integer> studentVisitMap = new HashMap<>();
+		//课程考勤异常
+		Map<Integer, Integer> teacherExceptionAttendanceMap = new HashMap<>();
+		//课程异常
+		Map<Integer, Integer> teacherNotAClassMap = new HashMap<>();
+		//服务指标异常
+		Map<Integer, Integer> teacherServeErrorMap = new HashMap<>();
+
+		if(IndexErrorType.MUSIC_PATROL.equals(errorType)||Objects.isNull(errorType)){
+			//基础技能班学员数量异常
+			List<Map<Integer, Integer>> highClassStudentLessThanThreeMapList = indexBaseMonthDataDao.countLessThenThreeClassOrganGroupNum(organIds, educationUserId);
+			highClassStudentLessThanThreeMap = MapUtil.mapListToMap(highClassStudentLessThanThreeMapList, Integer.class, Integer.class);
+
+			//乐团巡查事项异常
+			List<Map<Integer, Integer>> musicPatrolItemMapList = indexBaseMonthDataDao.queryOrganErrInspection(organIds, startTime);
+			musicPatrolItemMap = MapUtil.mapListToMap(musicPatrolItemMapList, Integer.class, Integer.class);
+
+			//未加入任何班级学员
+			List<Map<Integer, Integer>> organNoClassMusicGroupStudentNumMapList = indexBaseMonthDataDao.getOrganNoClassMusicGroupStudentNum(organIds, educationUserId);
+			organNoClassMusicGroupStudentNumMap = MapUtil.mapListToMap(organNoClassMusicGroupStudentNumMapList, Integer.class, Integer.class);
+		}
+
+		if(IndexErrorType.STUDENT_INFO.equals(errorType)||Objects.isNull(errorType)){
+			//未缴费学员数
+			List<Map<Integer, Integer>> studentNotPaymentMapList = indexBaseMonthDataDao.countOrganNoPaymentStudentNum(organIds, educationUserId);
+			studentNotPaymentMap = MapUtil.mapListToMap(studentNotPaymentMapList, Integer.class, Integer.class);
+
+			//申请退团学员数
+			List<Map<Integer, Integer>> studentApplyForQuitMusicGroupMapList = indexBaseMonthDataDao.queryOrganApplyForQuitGroupNum(organIds, educationUserId);
+			studentApplyForQuitMusicGroupMap = MapUtil.mapListToMap(studentApplyForQuitMusicGroupMapList, Integer.class, Integer.class);
+		}
+
+		if(IndexErrorType.TEACHER_INFO.equals(errorType)||Objects.isNull(errorType)){
+			String monthStr = DateUtil.format(date, DateUtil.ISO_YEAR_MONTH_FORMAT);
+
+			//全职未离职老师
+			//预计课酬较低
+			List<Map<Integer, Integer>> teacherExpectSalaryBeLowMapList = indexBaseMonthDataDao.queryOrganLowTeacherSalary(organIdsStr, monthStr);
+			teacherExpectSalaryBeLowMap = MapUtil.mapListToMap(teacherExpectSalaryBeLowMapList, Integer.class, Integer.class);
+
+			//课程时间安排异常
+			Integer userId = null;
+			if (!userRole.contains(SysUserRole.SECTION_MANAGER) && !sysUser.getIsSuperAdmin()) {
+				userId = sysUser.getId();
+			}
+			if(classGroupIds == null || classGroupIds.size() > 0){
+				List<Map<Integer, Integer>> courseTimeErrorMapList = indexBaseMonthDataDao.getOrganCourseTimeError(organIds, classGroupIds);
+				courseTimeErrorMap = MapUtil.mapListToMap(courseTimeErrorMapList, Integer.class, Integer.class);
+			}
+
+			//乐团巡查任务未计划
+			List<Map<Integer, Integer>> inspectionItemMapList = indexBaseMonthDataDao.queryOrganInspectionItem(organIdsStr, startTime, userId);
+			inspectionItemMap = MapUtil.mapListToMap(inspectionItemMapList, Integer.class, Integer.class);
+
+			//乐团巡查任务未提交
+			List<Map<Integer, Integer>> inspectionItemPlanMapList = indexBaseMonthDataDao.queryOrganInspectionItemPlan(organIdsStr, startTime);
+			inspectionItemPlanMap = MapUtil.mapListToMap(inspectionItemPlanMapList, Integer.class, Integer.class);
+
+			//回访任务未完成
+			List<Map<Integer, Integer>> studentVisitMapList = indexBaseMonthDataDao.queryOrganStudentVisit(organIdsStr, startTime, userId);
+			studentVisitMap = MapUtil.mapListToMap(studentVisitMapList, Integer.class, Integer.class);
+		}
+
+		if(IndexErrorType.ATTENDANCE_SERVE.equals(errorType)||Objects.isNull(errorType)){
+			if(classGroupIds == null || classGroupIds.size() > 0){
+				//课程考勤异常
+				List<Map<Integer, Integer>> teacherExceptionAttendanceMapList = indexBaseMonthDataDao.getOrganAttendanceError(organIds, startTime, classGroupIds);
+				teacherExceptionAttendanceMap = MapUtil.mapListToMap(teacherExceptionAttendanceMapList, Integer.class, Integer.class);
+
+				//课程异常
+				List<Map<Integer, Integer>> teacherNotAClassMapList = indexBaseMonthDataDao.getOrganNoAttendance(organIds, startTime, classGroupIds);
+				teacherNotAClassMap = MapUtil.mapListToMap(teacherNotAClassMapList, Integer.class, Integer.class);
+			}
+
+			//服务指标异常
+			Map<String, Object> params = new HashMap<>();
+			LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
+			LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+			LocalDate sunDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.SUNDAY.getValue());
+			params.put("organIds", organIds);
+			params.put("monday",monDayDate.toString());
+			params.put("sunday",sunDayDate.toString());
+			params.put("jobNature", JobNatureEnum.FULL_TIME);
+			params.put("unDone",1);
+			List<Map<Integer, Integer>> teacherServeErrorMapList = indexBaseMonthDataDao.countOrganTeacherServeInfo(params);
+			teacherServeErrorMap = MapUtil.mapListToMap(teacherServeErrorMapList, Integer.class, Integer.class);
+		}
+
+		List<Organization> organs = organizationDao.findOrgans(new ArrayList<>(organIds));
+
+		IndexErrorDataExportDto totalData = new IndexErrorDataExportDto();
+		totalData.setOrganName("总计");
+		for (Organization organ : organs) {
+			IndexErrorDataExportDto indexErrorData = new IndexErrorDataExportDto();
+			indexErrorData.setOrganId(organ.getId());
+			indexErrorData.setOrganName(organ.getName());
+
+			int total = 0;
+			//基础技能班学员数量异常
+			if(highClassStudentLessThanThreeMap.containsKey(organ.getId())){
+				indexErrorData.setHighClassStudentLessThanThreeNum(highClassStudentLessThanThreeMap.get(organ.getId()));
+			}
+			total += indexErrorData.getHighClassStudentLessThanThreeNum();
+			totalData.setHighClassStudentLessThanThreeNum(totalData.getHighClassStudentLessThanThreeNum() + indexErrorData.getHighClassStudentLessThanThreeNum());
+			//乐团巡查事项异常
+			if(musicPatrolItemMap.containsKey(organ.getId())){
+				indexErrorData.setMusicPatrolItem(musicPatrolItemMap.get(organ.getId()));
+			}
+			total += indexErrorData.getMusicPatrolItem();
+			totalData.setMusicPatrolItem(totalData.getMusicPatrolItem() + indexErrorData.getMusicPatrolItem());
+			//未加入任何班级学员
+			if(organNoClassMusicGroupStudentNumMap.containsKey(organ.getId())){
+				indexErrorData.setNoClassMusicGroupStudentInfo(organNoClassMusicGroupStudentNumMap.get(organ.getId()));
+			}
+			total += indexErrorData.getNoClassMusicGroupStudentInfo();
+			totalData.setNoClassMusicGroupStudentInfo(totalData.getNoClassMusicGroupStudentInfo() + indexErrorData.getNoClassMusicGroupStudentInfo());
+			//未缴费学员数
+			if(studentNotPaymentMap.containsKey(organ.getId())){
+				indexErrorData.setStudentNotPayment(studentNotPaymentMap.get(organ.getId()));
+			}
+			total += indexErrorData.getStudentNotPayment();
+			totalData.setStudentNotPayment(totalData.getStudentNotPayment() + indexErrorData.getStudentNotPayment());
+			//申请退团学员数
+			if(studentApplyForQuitMusicGroupMap.containsKey(organ.getId())){
+				indexErrorData.setStudentApplyForQuitMusicGroup(studentApplyForQuitMusicGroupMap.get(organ.getId()));
+			}
+			total += indexErrorData.getStudentApplyForQuitMusicGroup();
+			totalData.setStudentApplyForQuitMusicGroup(totalData.getStudentApplyForQuitMusicGroup() + indexErrorData.getStudentApplyForQuitMusicGroup());
+			//预计课酬较低
+			if(teacherExpectSalaryBeLowMap.containsKey(organ.getId())){
+				indexErrorData.setTeacherExpectSalaryBeLow(teacherExpectSalaryBeLowMap.get(organ.getId()));
+			}
+			total += indexErrorData.getTeacherExpectSalaryBeLow();
+			totalData.setTeacherExpectSalaryBeLow(totalData.getTeacherExpectSalaryBeLow() + indexErrorData.getTeacherExpectSalaryBeLow());
+			//课程时间安排异常
+			if(courseTimeErrorMap.containsKey(organ.getId())){
+				indexErrorData.setCourseTimeError(courseTimeErrorMap.get(organ.getId()));
+			}
+			total += indexErrorData.getCourseTimeError();
+			totalData.setCourseTimeError(totalData.getCourseTimeError() + indexErrorData.getCourseTimeError());
+			//乐团巡查任务未计划
+			if(inspectionItemMap.containsKey(organ.getId())){
+				indexErrorData.setInspectionItem(inspectionItemMap.get(organ.getId()));
+			}
+			total += indexErrorData.getInspectionItem();
+			totalData.setInspectionItem(totalData.getInspectionItem() + indexErrorData.getInspectionItem());
+			//乐团巡查任务未提交
+			if(inspectionItemPlanMap.containsKey(organ.getId())){
+				indexErrorData.setInspectionItemPlan(inspectionItemPlanMap.get(organ.getId()));
+			}
+			total += indexErrorData.getInspectionItemPlan();
+			totalData.setInspectionItemPlan(totalData.getInspectionItemPlan() + indexErrorData.getInspectionItemPlan());
+			//回访任务未完成
+			if(studentVisitMap.containsKey(organ.getId())){
+				indexErrorData.setStudentVisit(studentVisitMap.get(organ.getId()));
+			}
+			total += indexErrorData.getStudentVisit();
+			totalData.setStudentVisit(totalData.getStudentVisit() + indexErrorData.getStudentVisit());
+			//课程考勤异常
+			if(teacherExceptionAttendanceMap.containsKey(organ.getId())){
+				indexErrorData.setTeacherExceptionAttendance(teacherExceptionAttendanceMap.get(organ.getId()));
+			}
+			total += indexErrorData.getTeacherExceptionAttendance();
+			totalData.setTeacherExceptionAttendance(totalData.getTeacherExceptionAttendance() + indexErrorData.getTeacherExceptionAttendance());
+			//课程异常
+			if(teacherNotAClassMap.containsKey(organ.getId())){
+				indexErrorData.setTeacherNotAClass(teacherNotAClassMap.get(organ.getId()));
+			}
+			total += indexErrorData.getTeacherNotAClass();
+			totalData.setTeacherNotAClass(totalData.getTeacherNotAClass() + indexErrorData.getTeacherNotAClass());
+			//服务指标异常
+			if(teacherServeErrorMap.containsKey(organ.getId())){
+				indexErrorData.setTeacherServeError(teacherServeErrorMap.get(organ.getId()));
+			}
+			total += indexErrorData.getTeacherServeError();
+			totalData.setTeacherServeError(totalData.getTeacherServeError() + indexErrorData.getTeacherServeError());
+			indexErrorData.setTotal(total);
+			totalData.setTotal(totalData.getTotal() + indexErrorData.getTotal());
+			results.add(indexErrorData);
+		}
+		results.add(totalData);
+
+		return results;
+	}
+
+	@Override
 	public List<IndexErrInfoDto> getRemindMatterData(String organIds) {
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if (sysUser == null) {
@@ -428,8 +675,12 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		}
 		//当前用户是否是分部经理
 		List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
+		Integer educationUserId = null;
+		if (!sysUser.getIsSuperAdmin() && userRole.size() == 1 && userRole.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+			educationUserId = sysUser.getId();
+		}
 		//获取关联的乐团列表
-		List<String> musicGroupIds = musicGroupDao.queryIdsByEduIdAndOrganIds(userRole.contains(3)?sysUser.getId():null,organIds);
+		List<String> musicGroupIds = musicGroupDao.queryIdsByEduIdAndOrganIds(educationUserId,organIds);
 		String configValue1 = sysConfigDao.findConfigValue("push_create_payment_calender");
 		Date date = new Date();
 		String format = DateUtil.format(date, DateUtil.DEFAULT_PATTERN);
@@ -442,8 +693,8 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			if(calenderIds.size() > 0){
 				List<String> musicGroupIdList = musicGroupPaymentCalenderDao.queryMusicGroupIds(calenderIds);
 				indexErrInfoDto.setResult(musicGroupIdList);
+				indexErrInfoDto.setNum(musicGroupIdList.size());
 			}
-			indexErrInfoDto.setNum(calenderIds.size());
 		}
 		result.add(indexErrInfoDto);
 		return result;
@@ -583,18 +834,12 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		}
 		resultMap.put("attendanceServe",flag4);
 
-//		SysUser sysUser = sysUserFeignService.queryUserInfo();
-//		if (sysUser == null) {
-//			throw new BizException("用户信息获取失败");
-//		}
-		//当前用户是否是分部经理
-//		List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
 		//获取关联的乐团列表
-		List<String> musicGroupIds = musicGroupDao.queryIdsByEduIdAndOrganIds(userRole.contains(3)?sysUser.getId():null,organIdsStr);
-		String configValue1 = sysConfigDao.findConfigValue("push_create_payment_calender");
-		date = new Date();
-		String format = DateUtil.format(date, DateUtil.DEFAULT_PATTERN);
+		List<String> musicGroupIds = musicGroupDao.queryIdsByEduIdAndOrganIds(educationUserId,organIdsStr);
 		if(musicGroupIds.size() > 0){
+			String configValue1 = sysConfigDao.findConfigValue("push_create_payment_calender");
+			date = new Date();
+			String format = DateUtil.format(date, DateUtil.DEFAULT_PATTERN);
 			List<Long> calenderIds = musicGroupPaymentCalenderDao.queryEndIds(configValue1, format,musicGroupIds);
 			if(calenderIds.size() > 0){
 				resultMap.put("remindMatterData",true);

+ 27 - 36
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.service.impl;
 import static com.ym.mec.biz.dal.enums.DealStatusEnum.CLOSE;
 import static com.ym.mec.biz.dal.enums.DealStatusEnum.ING;
 import static com.ym.mec.biz.dal.enums.DealStatusEnum.SUCCESS;
+import static com.ym.mec.biz.dal.enums.IndexErrorType.WAIT_CREATE_PAYMENT_CALENDER;
 import static com.ym.mec.biz.dal.enums.PaymentStatusEnum.YES;
 
 import java.io.IOException;
@@ -19,6 +20,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.entity.*;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -79,37 +81,8 @@ import com.ym.mec.biz.dal.dto.SporadicPayDto;
 import com.ym.mec.biz.dal.dto.SubFeeSettingDto;
 import com.ym.mec.biz.dal.dto.SubjectRegisterDto;
 import com.ym.mec.biz.dal.dto.UpdateExpectedNumDto;
-import com.ym.mec.biz.dal.entity.ApprovalStatus;
-import com.ym.mec.biz.dal.entity.ChargeType;
-import com.ym.mec.biz.dal.entity.ClassGroup;
-import com.ym.mec.biz.dal.entity.CooperationOrgan;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupBuildLog;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupPurchaseList;
-import com.ym.mec.biz.dal.entity.MusicGroupQuit;
-import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
-import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.entity.School;
-import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
-import com.ym.mec.biz.dal.entity.Student;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
-import com.ym.mec.biz.dal.entity.StudentPreRegistration;
-import com.ym.mec.biz.dal.entity.StudentRegistration;
-import com.ym.mec.biz.dal.entity.Subject;
-import com.ym.mec.biz.dal.entity.SubjectChange;
-import com.ym.mec.biz.dal.entity.SysUserCashAccount;
-import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import com.ym.mec.biz.dal.enums.CourseStatusEnum;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
@@ -2421,14 +2394,32 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         //获取用户权限列表
         List<Integer> roles = employeeDao.queryUserRole(sysUser.getId());
         PageInfo<MusicGroup> musicGroupPageInfo;
-        if (roles != null && roles.size() == 1 && roles.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
-            //只有教务老师权限
-            /*String musicGroupIds = musicGroupDao.queryEducationalMusicGroupId(sysUser.getId());
-            queryInfo.setMusicGroupId(musicGroupIds);*/
-            musicGroupPageInfo = queryPage(queryInfo);
-        } else {
-            musicGroupPageInfo = queryPage(queryInfo);
+        //待创建缴费项目提醒
+        if(queryInfo.getSearchType() == "WAIT_CREATE_PAYMENT_CALENDER"){
+            Integer educationUserId = null;
+            if (!sysUser.getIsSuperAdmin() && roles.size() == 1 && roles.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+                educationUserId = sysUser.getId();
+            }
+            //获取关联的乐团列表
+            List<String> musicGroupIds = musicGroupDao.queryIdsByEduIdAndOrganIds(educationUserId,queryInfo.getOrganId());
+            String configValue1 = sysConfigDao.findConfigValue("push_create_payment_calender");
+            Date date = new Date();
+            String format = DateUtil.format(date, DateUtil.DEFAULT_PATTERN);
+            if(musicGroupIds.size() > 0){
+                List<Long> calenderIds = musicGroupPaymentCalenderDao.queryEndIds(configValue1, format,musicGroupIds);
+                if(calenderIds.size() > 0){
+                    List<String> queryMusicGroupIds = musicGroupPaymentCalenderDao.queryMusicGroupIds(calenderIds);
+                    if(queryInfo.getMusicGroupIds() != null){
+                        queryMusicGroupIds.addAll(queryInfo.getMusicGroupIds());
+                    }
+                    queryInfo.setMusicGroupIds(queryMusicGroupIds);
+                }
+            }
+            if(queryInfo.getMusicGroupIds() == null || queryInfo.getMusicGroupIds().size() == 0){
+                return null;
+            }
         }
+        musicGroupPageInfo = queryPage(queryInfo);
         List<MusicGroup> musicGroupList = musicGroupPageInfo.getRows();
 
         if (musicGroupList == null || musicGroupList.size() == 0) {

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

@@ -433,7 +433,15 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
                 MessageTypeEnum.TEACHER_PUSH_STUDENT_LEAVE,
                 sendArgs,
-                null, 0, "1", "TEACHER", DateUtil.getDate(courseSchedule.getClassDate()), DateUtil.getTime(courseSchedule.getStartClassTime()), courseSchedule.getName(), sysUser.getUsername());
+                null, 0, "1", "TEACHER",
+                DateUtil.dateToString(courseSchedule.getStartClassTime(), "yyyy年MM月dd日 HH点mm分"),
+                courseSchedule.getType().getMsg(), sysUser.getUsername(), remark);
+
+        sysMessageService.batchSendImMessage(MessageTypeEnum.TEACHER_IM_STUDENT_LEAVE,
+                userId.toString(), null,
+                new String[]{courseSchedule.getActualTeacherId().toString()},
+                null, DateUtil.dateToString(courseSchedule.getStartClassTime(), "yyyy年MM月dd日 HH点mm分"),
+                courseSchedule.getType().getMsg(), sysUser.getUsername(), remark);
         return true;
     }
 

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

@@ -2416,6 +2416,7 @@
             cs.schoole_id_,
             cs.create_time_,
             cs.is_lock_,
+            cs.organ_id_,
             s.name_ schoole_name_,
             o.name_ organ_name_,
             CASE WHEN COUNT(sa.id_) > 0 THEN 1 ELSE 0 END isCallNames,

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

@@ -168,6 +168,17 @@
 		</foreach>
 	</delete>
 
+	<delete id="deleteWithCourseAndTeachRole">
+		DELETE FROM course_schedule_teacher_salary
+		WHERE course_schedule_id_ IN
+			<foreach collection="courseIds" item="courseScheduleId" open="(" close=")" separator=",">
+				#{courseScheduleId}
+			</foreach>
+			<if test="teachType!=null">
+				AND teacher_role_ = #{teachType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
+	</delete>
+
 	<sql id="courseScheduleTeacherSalaryQueryPage">
 		<where>
 			(cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)

+ 315 - 0
mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml

@@ -650,6 +650,36 @@
 		) t
 	</select>
 
+	<select id="countLessThenThreeClassOrganGroupNum" resultType="map">
+		SELECT t.organ_id_ AS 'key',
+		       COUNT(t.id_) AS 'value'
+		FROM (
+		SELECT mg.organ_id_,cg.id_ FROM
+		class_group cg
+		LEFT JOIN class_group_student_mapper cgsm ON cg.id_ = cgsm.class_group_id_
+		LEFT JOIN music_group mg ON cg.music_group_id_=mg.id_
+		LEFT JOIN course_schedule cs ON cs.class_group_id_=cg.id_
+		WHERE
+		cg.type_ IN ('HIGH', 'HIGH_ONLINE')
+		AND mg.status_ = 'PROGRESS' AND cg.del_flag_ = 0
+		AND cs.del_flag_=0
+		AND cs.status_='NOT_START'
+		AND ( cs.new_course_id_ IS NULL OR cs.new_course_id_ = cs.id_ )
+		<if test="educationUserId != null">
+			AND mg.educational_teacher_id_ = #{educationUserId}
+		</if>
+		<if test="organIds!=null and organIds.size()>0">
+			AND mg.organ_id_ IN
+			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+				#{organId}
+			</foreach>
+		</if>
+		GROUP BY cg.id_
+		HAVING
+		COUNT(DISTINCT CASE WHEN cgsm.status_ = 'NORMAL' THEN cgsm.user_id_ ELSE NULL END) &lt; 3
+		) t GROUP BY t.organ_id_
+	</select>
+
     <select id="getLessThenThreeMusicGroup" resultType="java.lang.String">
 		SELECT cg.music_group_id_ FROM
 		class_group cg
@@ -691,6 +721,30 @@
 		</if>
 	</select>
 
+	<select id="countOrganNoPaymentStudentNum" resultType="map">
+		SELECT
+		    mg.organ_id_ AS 'key',
+			COUNT(DISTINCT mgpc.music_group_id_,mgpcd.user_id_) AS 'value'
+		FROM
+		music_group_payment_calender_detail mgpcd
+		LEFT JOIN music_group_payment_calender mgpc ON mgpcd.music_group_payment_calender_id_ = mgpc.id_
+		LEFT JOIN music_group mg ON mgpc.music_group_id_ = mg.id_
+		WHERE
+		mg.status_ = 'PROGRESS'
+		AND DATE_FORMAT(NOW(),'%Y-%m-%d') >= DATE_FORMAT(mgpc.payment_valid_start_date_,'%Y-%m-%d')
+		AND mgpcd.payment_status_ = 'NON_PAYMENT' AND mgpcd.expect_amount_ > 0 AND mgpc.batch_no_ IS NOT NULL AND mgpc.pay_user_type_ = 'STUDENT'
+		<if test="educationUserId != null">
+			AND mg.educational_teacher_id_ = #{educationUserId}
+		</if>
+		<if test="organIds!=null and organIds.size()>0">
+			AND mg.organ_id_ IN
+			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+				#{organId}
+			</foreach>
+		</if>
+		GROUP BY mg.organ_id_
+	</select>
+
 	<select id="getNoPaymentMusicGroup" resultType="java.lang.String">
 		SELECT
 			DISTINCT mg.id_
@@ -729,6 +783,26 @@
 		</if>
 	</select>
 
+	<select id="queryOrganApplyForQuitGroupNum" resultType="map">
+		SELECT
+			mg.organ_id_ AS 'key',
+		    COUNT(mgq.id_) AS 'value'
+		FROM music_group_quit mgq
+		LEFT JOIN music_group mg ON mgq.music_group_id_=mg.id_
+		WHERE mg.status_='PROGRESS'
+		AND mgq.status_='PROCESSING'
+		<if test="educationUserId != null">
+			AND mg.educational_teacher_id_ = #{educationUserId}
+		</if>
+		<if test="organIds!=null and organIds.size() > 0">
+			AND mg.organ_id_ IN
+			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+				#{organId}
+			</foreach>
+		</if>
+		GROUP BY mg.organ_id_
+	</select>
+
 	<select id="queryStudentAttendanceInfo" resultType="int">
 		SELECT
 			COUNT(DISTINCT cssp.id_)
@@ -770,6 +844,29 @@
 			</foreach>
 		</if>
 	</select>
+
+	<select id="getOrganCourseTimeError" resultType="map">
+		SELECT
+		       cs.organ_id_ AS 'key',
+		       COUNT(cs.id_) AS 'value'
+		FROM course_schedule cs
+		WHERE cs.status_ = 'NOT_START' AND cs.del_flag_ = 0 AND cs.is_lock_ = 0 AND cs.start_class_time_ &lt; '06:00:00'
+		AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
+		<if test="classGroupIds != null and classGroupIds.size() > 0">
+			AND cs.class_group_id_ IN
+			<foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
+				#{classGroupId}
+			</foreach>
+		</if>
+		<if test="organIds != null and organIds.size()>0">
+			AND cs.organ_id_ IN
+			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+				#{organId}
+			</foreach>
+		</if>
+		GROUP BY cs.organ_id_
+	</select>
+
     <select id="getAttendanceError" resultType="int">
 		SELECT COUNT(DISTINCT c.id_) FROM (SELECT cs.id_ FROM course_schedule cs
 		LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
@@ -794,6 +891,35 @@
 		</if>
 		GROUP BY cs.id_) c
 	</select>
+
+	<select id="getOrganAttendanceError" resultType="map">
+		SELECT
+			c.organ_id_ AS 'key',
+		    COUNT(DISTINCT c.id_) AS 'value'
+		FROM (SELECT cs.organ_id_,cs.id_ FROM course_schedule cs
+		LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
+		LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
+		LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cssp.course_schedule_id_ AND cssp.user_id_ = sa.user_id_
+		WHERE ta.teacher_id_ = cs.actual_teacher_id_
+		AND cs.status_ = 'OVER' AND cs.del_flag_ = 0 AND cs.class_date_ >= '2021-02-01'
+		AND (((ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ != 'NORMAL' AND sa.visit_flag_ = 0)))
+		AND ta.sign_in_status_ IS NOT NULL AND ta.sign_out_status_ IS NOT NULL
+		AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
+		<if test="classGroupIds != null and classGroupIds.size() > 0">
+			AND cs.class_group_id_ IN
+			<foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
+				#{classGroupId}
+			</foreach>
+		</if>
+		<if test="organIds != null and organIds.size()>0">
+			AND cs.organ_id_ IN
+			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+				#{organId}
+			</foreach>
+		</if>
+		GROUP BY cs.id_) c GROUP BY c.organ_id_
+	</select>
+
 	<select id="getNoAttendance" resultType="int">
 		SELECT COUNT(DISTINCT cs.id_) FROM course_schedule cs
 		LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
@@ -814,6 +940,32 @@
 			</foreach>
 		</if>
 	</select>
+
+	<select id="getOrganNoAttendance" resultType="map">
+		SELECT
+		    cs.organ_id_ AS 'key',
+		    COUNT(DISTINCT cs.id_) AS 'value'
+		FROM course_schedule cs
+		LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
+		WHERE ta.teacher_id_ = cs.actual_teacher_id_
+		AND cs.status_ = 'OVER' AND cs.del_flag_ = 0 AND cs.class_date_>='2021-02-01'
+		AND ta.sign_in_time_ IS NULL AND ta.sign_out_time_ IS NULL AND ta.dispose_content_ IS NULL
+		AND (cs.new_course_id_ IS NULL OR cs.new_course_id_ = cs.id_)
+		<if test="classGroupIds != null and classGroupIds.size() > 0">
+			AND cs.class_group_id_ IN
+			<foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
+				#{classGroupId}
+			</foreach>
+		</if>
+		<if test="organIds!=null and organIds.size() > 0">
+			AND cs.organ_id_ IN
+			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+				#{organId}
+			</foreach>
+		</if>
+		GROUP BY cs.organ_id_
+	</select>
+
 	<select id="queryTeacherLeave" resultType="int">
 		SELECT COUNT(DISTINCT tlr.id_) FROM teacher_leave_record tlr
 		LEFT JOIN teacher t ON t.id_ = tlr.user_id_
@@ -832,6 +984,22 @@
 			AND FIND_IN_SET(tcs.organ_id_,#{organIdsStr})
 		</if>
 	</select>
+
+	<select id="queryOrganLowTeacherSalary" resultType="map">
+		SELECT
+			tcs.organ_id_ AS 'key',
+			COUNT(DISTINCT tcs.user_id_) AS 'value'
+		FROM teacher_course_statistics tcs
+		LEFT JOIN teacher t ON t.id_ = tcs.user_id_
+		LEFT JOIN sys_user su ON su.id_ = tcs.user_id_
+		WHERE su.lock_flag_ = 0 AND su.del_flag_ = 0 AND t.job_nature_ = 'FULL_TIME' AND t.demission_date_ IS NULL
+		AND DATE_FORMAT(tcs.month_,'%Y-%m') = #{monthStr} AND tcs.low_salary = 1
+		<if test="organIdsStr != null and organIdsStr != ''">
+			AND FIND_IN_SET(tcs.organ_id_,#{organIdsStr})
+		</if>
+		GROUP BY tcs.organ_id_
+	</select>
+
 	<select id="queryInspectionItem" resultType="int">
 		SELECT COUNT(DISTINCT ii.id_) FROM inspection_item ii
 		LEFT JOIN inspection i ON ii.inspection_id_ = i.id_
@@ -844,6 +1012,24 @@
 			AND ii.user_id_ = #{userId}
 		</if>
 	</select>
+
+	<select id="queryOrganInspectionItem" resultType="map">
+		SELECT
+		       ii.organ_id_ AS 'key',
+		       COUNT(DISTINCT ii.id_) AS 'value'
+		FROM inspection_item ii
+		LEFT JOIN inspection i ON ii.inspection_id_ = i.id_
+		WHERE ii.times_ > planned_times_ AND ii.item_ = 'INSPECT' AND ii.memo_ =''
+		AND DATE_FORMAT(i.month_,'%Y-%m-%d') >= #{startTime}
+		<if test="organIdsStr != null and organIdsStr != ''">
+			AND FIND_IN_SET(ii.organ_id_,#{organIdsStr})
+		</if>
+		<if test="userId != null">
+			AND ii.user_id_ = #{userId}
+		</if>
+		GROUP BY ii.organ_id_
+	</select>
+
 	<select id="queryInspectionItemPlan" resultType="int">
 		SELECT COUNT(DISTINCT iip.id_) FROM inspection_item_plan iip
 		WHERE iip.status_ = 0 AND iip.memo_ = '' AND DATE_FORMAT(iip.plan_start_,'%Y-%m-%d') &lt; DATE_FORMAT(NOW(),'%Y-%m-%d')
@@ -852,6 +1038,20 @@
 			AND FIND_IN_SET(iip.organ_id_,#{organIdsStr})
 		</if>
 	</select>
+
+	<select id="queryOrganInspectionItemPlan" resultType="map">
+		SELECT
+			iip.organ_id_ AS 'key',
+		    COUNT(DISTINCT iip.id_) AS 'value'
+		FROM inspection_item_plan iip
+		WHERE iip.status_ = 0 AND iip.memo_ = '' AND DATE_FORMAT(iip.plan_start_,'%Y-%m-%d') &lt; DATE_FORMAT(NOW(),'%Y-%m-%d')
+		AND DATE_FORMAT(iip.plan_start_,'%Y-%m-%d') >= #{startTime} AND DATE_FORMAT(iip.plan_start_,'%Y-%m-%d') &lt;= DATE_FORMAT(NOW(),'%Y-%m-%d')
+		<if test="organIdsStr != null and organIdsStr != ''">
+			AND FIND_IN_SET(iip.organ_id_,#{organIdsStr})
+		</if>
+		GROUP BY iip.organ_id_
+	</select>
+
 	<select id="queryStudentVisit" resultType="int">
 		SELECT COUNT(DISTINCT ii.id_) FROM inspection_item ii
 		LEFT JOIN inspection i ON ii.inspection_id_ = i.id_
@@ -867,6 +1067,25 @@
 		</if>
 	</select>
 
+	<select id="queryOrganStudentVisit" resultType="map">
+		SELECT
+			ii.organ_id_ AS 'key',
+		    COUNT(DISTINCT ii.id_) AS 'value'
+		FROM inspection_item ii
+		LEFT JOIN inspection i ON ii.inspection_id_ = i.id_
+		WHERE ii.item_ = 'VISIT' AND ii.memo_ =''
+		AND ii.times_ > (SELECT COUNT(DISTINCT sv.id_) FROM student_visit sv
+		WHERE sv.teacher_id_ = ii.user_id_ AND DATE_FORMAT(i.month_,'%Y-%m') = DATE_FORMAT(sv.visit_time_,'%Y-%m'))
+		AND i.month_ >= #{startTime} AND i.month_ &lt;= DATE_FORMAT(NOW(),'%Y-%m-%d')
+		<if test="organIdsStr != null and organIdsStr != ''">
+			AND FIND_IN_SET(ii.organ_id_,#{organIdsStr})
+		</if>
+		<if test="userId != null">
+			AND ii.user_id_ = #{userId}
+		</if>
+		GROUP BY ii.organ_id_
+	</select>
+
     <select id="queryErrInspection" resultType="int">
 		SELECT
 			COUNT(id_)
@@ -882,6 +1101,23 @@
 		</if>
 	</select>
 
+	<select id="queryOrganErrInspection" resultType="map">
+		SELECT
+			organ_id_ AS 'key',
+		    COUNT(id_) AS 'value'
+		FROM
+		inspection_item_plan
+		WHERE
+		conclusion_status_ = 1 AND memo_ = '' AND DATE_FORMAT(plan_start_,'%Y-%m-%d') >= #{startTime}
+		<if test="organIds!=null and organIds.size()>0">
+			AND organ_id_ IN
+			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+				#{organId}
+			</foreach>
+		</if>
+		GROUP BY organ_id_
+	</select>
+
 	<select id="getNoClassMusicGroupStudentInfo" resultType="com.ym.mec.biz.dal.entity.IndexErrInfoDto">
 		SELECT
 			'NO_CLASS_MUSIC_GROUP_STUDENT_INFO' errorType,
@@ -906,6 +1142,30 @@
 			</if>
 	</select>
 
+	<select id="getOrganNoClassMusicGroupStudentNum" resultType="map">
+		SELECT
+		mg.organ_id_ AS 'key',
+		COUNT( sr.user_id_ ) AS 'value'
+		FROM
+		student_registration sr
+		LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
+		LEFT JOIN class_group_student_mapper cgsm ON cgsm.group_type_='MUSIC' AND cgsm.music_group_id_=sr.music_group_id_ AND cgsm.user_id_=sr.user_id_ AND cgsm.status_='NORMAL'
+		WHERE
+		sr.music_group_status_ = 'NORMAL'
+		AND mg.status_ = 'PROGRESS'
+		AND cgsm.id_ IS NULL
+		<if test="educationUserId != null">
+			AND mg.educational_teacher_id_ = #{educationUserId}
+		</if>
+		<if test="organIds!=null and organIds.size()>0">
+			AND mg.organ_id_ IN
+			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+				#{organId}
+			</foreach>
+		</if>
+		GROUP BY mg.organ_id_
+	</select>
+
 	<select id="getFinancePayData"  resultMap="IndexBaseMonthData">
 		SELECT SUM(fe.amount_) total_num_,SUM(fe.amount_) activate_num_,SUM(fe.amount_) percent_,fe.organ_id_,#{dayStr} month_ FROM financial_expenditure fe
 		WHERE DATE_FORMAT(fe.create_time_,'%Y-%m-%d') = #{dayStr}
@@ -969,4 +1229,59 @@
 		</if>
 		GROUP BY DATE_FORMAT(spo.pay_time_,'%Y-%m-%d')
 	</select>
+
+	<sql id="queryTeacherServeInfoCondition">
+		<where>
+			<if test="organIds!=null and organIds.size()>0">
+				AND tea.organ_id_ IN
+				<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+					#{organId}
+				</foreach>
+			</if>
+			<if test="monday!=null and monday!='' and sunday!=null and sunday!=''">
+				AND sees.monday_ BETWEEN #{monday} AND #{sunday}
+			</if>
+			<if test="teacherId!=null">
+				AND sees.teacher_id_ = #{teacherId}
+			</if>
+			<if test="reminded!=null and reminded==0">
+				AND NOT EXISTS (SELECT id_ FROM teacher_remind WHERE teacher_id_=sees.teacher_id_ AND monday_ = sees.monday_ AND type_='SERVICE')
+			</if>
+			<if test="reminded!=null and reminded==1">
+				AND EXISTS (SELECT id_ FROM teacher_remind WHERE teacher_id_=sees.teacher_id_ AND monday_ = sees.monday_ AND type_='SERVICE')
+			</if>
+			<if test="operatorId!=null">
+				AND EXISTS (SELECT id_ FROM teacher_remind WHERE operator_id_=#{operatorId} AND teacher_id_=sees.teacher_id_ AND monday_ = sees.monday_ AND type_='SERVICE')
+			</if>
+			<if test="jobNature!=null">
+				AND tea.job_nature_=#{jobNature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
+		</where>
+	</sql>
+
+	<select id="countOrganTeacherServeInfo" resultType="map">
+		SELECT
+		    e.organ_id_ AS 'key',
+		    COUNT(1) AS 'value'
+		FROM (
+		SELECT
+			tea.organ_id_,
+			sees.id_
+		FROM
+		student_extracurricular_exercises_situation_ sees
+		LEFT JOIN teacher tea ON tea.id_=sees.teacher_id_
+		<include refid="queryTeacherServeInfoCondition" />
+		GROUP BY sees.monday_,sees.sunday_,sees.teacher_id_
+		<if test="unDone!=null">
+			HAVING
+			<if test="unDone==1">
+				SUM( sees.expect_exercises_num_-sees.not_over_course_num_ ) &gt; SUM( sees.actual_exercises_num_ )
+			</if>
+			<if test="unDone==0">
+				SUM( sees.expect_exercises_num_-sees.not_over_course_num_ ) &lt;= SUM( sees.actual_exercises_num_ )
+			</if>
+		</if>
+		ORDER BY sees.monday_,sees.sunday_,sees.teacher_id_
+		) e GROUP BY e.organ_id_
+	</select>
 </mapper>

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

@@ -645,6 +645,7 @@
     <select id="queryIdsByEduIdAndOrganIds" resultType="java.lang.String">
         SELECT DISTINCT id_ FROM music_group
         <where>
+            status_ = 'PROGRESS'
             <if test="educationId != null">
                 AND educational_teacher_id_ = #{educationId}
             </if>

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

@@ -570,7 +570,7 @@
         SELECT * FROM music_group_payment_calender WHERE id_ = #{calenderId} AND status_ IN ('NO', 'OPEN', 'OVER', 'PAID');
     </select>
     <select id="queryMusicGroupIds" resultType="java.lang.String">
-        SELECT music_group_id_ FROM music_group_payment_calender
+        SELECT DISTINCT music_group_id_ FROM music_group_payment_calender
         WHERE id_ IN
         <foreach collection="calenderIds" item="calenderId" open="(" close=")" separator=",">
             #{calenderId}

+ 9 - 0
mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml

@@ -509,6 +509,9 @@
 			<if test="monday!=null and monday!='' and sunday!=null and sunday!=''">
 				AND sees.monday_ BETWEEN #{monday} AND #{sunday}
 			</if>
+			<if test="unDone!=null and unDone==1">
+				AND tm.teacher_id_ IS NULL
+			</if>
 			<if test="teacherId!=null">
 				AND sees.teacher_id_ = #{teacherId}
 			</if>
@@ -541,6 +544,9 @@
 		FROM
 			student_extracurricular_exercises_situation_ sees
 			LEFT JOIN teacher tea ON tea.id_=sees.teacher_id_
+			<if test="unDone!=null and unDone==1">
+				LEFT JOIN teacher_remind tm ON sees.monday_=tm.monday_ AND sees.teacher_id_=tm.teacher_id_
+			</if>
 			LEFT JOIN organization organ ON organ.id_=tea.organ_id_
 			LEFT JOIN sys_user su ON tea.id_=su.id_
 		<include refid="queryTeacherServeInfoCondition" />
@@ -565,6 +571,9 @@
 			FROM
 				student_extracurricular_exercises_situation_ sees
 				LEFT JOIN teacher tea ON tea.id_=sees.teacher_id_
+				<if test="unDone!=null and unDone==1">
+					LEFT JOIN teacher_remind tm ON sees.monday_=tm.monday_ AND sees.teacher_id_=tm.teacher_id_
+				</if>
 			<include refid="queryTeacherServeInfoCondition" />
 			GROUP BY sees.monday_,sees.sunday_,sees.teacher_id_
 			<if test="unDone!=null">

+ 35 - 0
mec-util/src/main/java/com/ym/mec/util/collection/MapUtil.java

@@ -2,6 +2,7 @@ package com.ym.mec.util.collection;
 
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.util.CollectionUtils;
 
 import java.beans.BeanInfo;
 import java.beans.IntrospectionException;
@@ -9,6 +10,10 @@ import java.beans.Introspector;
 import java.beans.PropertyDescriptor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -153,6 +158,36 @@ public class MapUtil {
 		return result;
 	}
 
+
+	public static <Y, Z> Map<Y,Z> mapListToMap(List<Map<Y, Z>> maps, Class<Y> keyType, Class<Z> valueType){
+		Map<Y,Z> result = new HashMap();
+		try {
+			for (Map map : maps) {
+				Y key;
+				Z value;
+				if(keyType.isAssignableFrom(BigDecimal.class)){
+					key = (Y) BigDecimal.class.getDeclaredConstructor(String.class).newInstance(map.get("key"));
+				}else if(keyType.isAssignableFrom(String.class)){
+					key = (Y) String.valueOf(map.get("key"));
+				}else{
+					key = (Y) keyType.getMethod("valueOf", String.class).invoke(null, String.valueOf(map.get("key")));
+				}
+				if(valueType.isAssignableFrom(BigDecimal.class)){
+					value = (Z) BigDecimal.class.getDeclaredConstructor(String.class).newInstance(map.get("value"));
+				}else if(valueType.isAssignableFrom(String.class)){
+					value = (Z) String.valueOf(map.get("value"));
+				}else{
+					value = (Z) valueType.getMethod("valueOf", String.class).invoke(null, String.valueOf(map.get("value")));
+				}
+				result.put(key, value);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return result;
+	}
+
 	/**
 	 * 经纬度转化成弧度
 	 * @param d

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

@@ -382,6 +382,18 @@ public class CourseScheduleController extends BaseController {
         return succeed();
     }
 
+    @ApiOperation(value = "课程调整-批量")
+    @PostMapping("/batchCourseAdjust")
+    @PreAuthorize("@pcs.hasPermissions('courseSchedule/batchCourseAdjust')")
+    public Object batchCourseAdjust(@RequestBody BatchCourseAdjustDto batchCourseAdjustInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        batchCourseAdjustInfo.setOperatorId(sysUser.getId());
+        return courseScheduleService.batchCourseAdjust(batchCourseAdjustInfo);
+    }
+
     @ApiOperation(value = "课程顺延")
     @PostMapping("/coursePostpone")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/coursePostpone')")

+ 58 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -139,6 +139,8 @@ public class ExportController extends BaseController {
     private IdGeneratorService idGeneratorService;
     @Autowired
     private MusicGroupQuitService musicGroupQuitService;
+    @Autowired
+    private IndexBaseMonthDataService indexService;
 
     @Autowired
     private TeacherCourseStatisticsService teacherCourseStatisticsService;
@@ -2563,6 +2565,62 @@ public class ExportController extends BaseController {
         }
     }
 
+    @ApiOperation(value = "首页异常统计导出")
+    @RequestMapping("export/exportIndexErrData")
+    @PreAuthorize("@pcs.hasPermissions('export/exportIndexErrData')")
+    public void exportIndexErrData(String organId, IndexErrorType errorType, HttpServletResponse response) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        Employee employee = employeeService.get(sysUser.getId());
+        if (StringUtils.isBlank(organId)) {
+            organId = employee.getOrganIdList();
+        }else if(StringUtils.isEmpty(employee.getOrganIdList())){
+            throw new BizException("用户所在分部异常");
+        }else {
+            List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+            if(!list.containsAll(Arrays.asList(organId.split(",")))){
+                throw new BizException("非法请求");
+            }
+        }
+        List<IndexErrorDataExportDto> result = indexService.exportIndexErrData(organId, errorType);
+        if (CollectionUtils.isEmpty(result)) {
+            response.setStatus(200);
+            response.setContentType("Content-Type: application/json;charset=UTF-8");
+            response.getOutputStream().write("{\"data\": null, \"code\": 500, \"status\": false, \"msg\": \"没有可导出的记录\"}".getBytes());
+            response.flushBuffer();
+            return;
+        }
+        OutputStream outputStream = response.getOutputStream();
+
+        try {
+            String[] header = {"分部", "基础技能班学员数量异常", "乐团巡查事项异常", "未在班级学员数", "未缴费学员数",
+                    "申请退团学员数", "预计课酬较低", "课程时间安排异常", "乐团巡查未计划", "乐团巡查任务未提交",
+                    "回访任务未完成", "课程考勤异常", "课程异常", "服务指标异常", "总计",};
+            String[] body = {"organName", "highClassStudentLessThanThreeNum", "musicPatrolItem", "noClassMusicGroupStudentInfo", "studentNotPayment",
+                    "studentApplyForQuitMusicGroup", "teacherExpectSalaryBeLow", "courseTimeError", "inspectionItem", "inspectionItemPlan",
+                    "studentVisit", "teacherExceptionAttendance", "teacherNotAClass", "teacherServeError", "total",};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, result);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=teacherDefaultSalary-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
     @ApiOperation(value = "运营预警导出")
     @RequestMapping("export/teacherCourseStatistics")
     @PreAuthorize("@pcs.hasPermissions('export/teacherCourseStatistics')")

+ 20 - 0
mec-web/src/main/java/com/ym/mec/web/controller/IndexController.java

@@ -177,6 +177,26 @@ public class IndexController extends BaseController {
 		return succeed(indexService.getIndexErrData(organId, errorType));
 	}
 
+	@GetMapping("/exportIndexErrData")
+	public HttpResponseResult exportIndexErrData(String organId, IndexErrorType errorType){
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("用户信息获取失败");
+		}
+		Employee employee = employeeService.get(sysUser.getId());
+		if (StringUtils.isBlank(organId)) {
+			organId = employee.getOrganIdList();
+		}else if(StringUtils.isEmpty(employee.getOrganIdList())){
+			return failed("用户所在分部异常");
+		}else {
+			List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+			if(!list.containsAll(Arrays.asList(organId.split(",")))){
+				return failed("非法请求");
+			}
+		}
+		return succeed(indexService.exportIndexErrData(organId, errorType));
+	}
+
 	@GetMapping("/getRemindMatterData")
 	public HttpResponseResult getRemindMatterData(String organId){
 		SysUser sysUser = sysUserFeignService.queryUserInfo();

+ 10 - 10
mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupController.java

@@ -113,17 +113,17 @@ public class MusicGroupController extends BaseController {
 		if (sysUser == null) {
 			return failed("用户信息获取失败");
 		}
-			Employee employee = employeeDao.get(sysUser.getId());
-			if (StringUtils.isEmpty(queryInfo.getOrganId())) {
-				queryInfo.setOrganId(employee.getOrganIdList());
-			}else if(StringUtils.isEmpty(employee.getOrganIdList())){
-				return failed("用户所在分部异常");
-			}else {
-				List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
-				if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
-					return failed("非法请求");
-				}
+		Employee employee = employeeDao.get(sysUser.getId());
+		if (StringUtils.isEmpty(queryInfo.getOrganId())) {
+			queryInfo.setOrganId(employee.getOrganIdList());
+		}else if(StringUtils.isEmpty(employee.getOrganIdList())){
+			return failed("用户所在分部异常");
+		}else {
+			List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+			if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
+				return failed("非法请求");
 			}
+		}
 		return succeed(musicGroupService.queryMusicGroupPage(queryInfo));
 	}
 

+ 15 - 0
mec-web/src/main/java/com/ym/mec/web/controller/PracticeGroupManageController.java

@@ -138,6 +138,21 @@ public class PracticeGroupManageController extends BaseController {
     @GetMapping("studentBuys")
     @PreAuthorize("@pcs.hasPermissions('practiceGroupManage/studentBuys')")
     public Object studentBuys(StudentBuyPracticeQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        if (StringUtils.isEmpty(queryInfo.getOrganId())) {
+            queryInfo.setOrganId(employee.getOrganIdList());
+        } else if (StringUtils.isEmpty(employee.getOrganIdList())) {
+            return failed("用户所在分部异常");
+        } else {
+            List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+            if (!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))) {
+                return failed("非法请求");
+            }
+        }
         return succeed(practiceGroupService.studentBuys(queryInfo));
     }
 }