Переглянути джерело

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

 Conflicts:
	mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
	mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
zouxuan 4 роки тому
батько
коміт
0fa79cd473
70 змінених файлів з 2852 додано та 76 видалено
  1. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  2. 25 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/GoodsDao.java
  3. 147 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexErrDataRecordDao.java
  4. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  5. 10 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  6. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupActivityDao.java
  7. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/BasicUserDto.java
  8. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleEndDto.java
  9. 75 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/IndexErrorDataExportDto.java
  10. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentApplyDetailDto.java
  11. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SubjectApplyDetailDto.java
  12. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherClassCourseSchudeleDto.java
  13. 19 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherClassHeadInfo.java
  14. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherHomeworkListDto.java
  15. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupApplyBaseInfoDto.java
  16. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Goods.java
  17. 105 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/IndexErrDataRecord.java
  18. 22 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/InspectionItem.java
  19. 22 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/InspectionItemPlan.java
  20. 23 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRegistration.java
  21. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroupActivity.java
  22. 60 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/EndCourseScheduleQueryInfo.java
  23. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/GoodsQueryInfo.java
  24. 50 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/IndexErrRecordQueryInfo.java
  25. 50 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/InspectionItemPlanQueryInfo.java
  26. 50 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/InspectionQueryInfo.java
  27. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ReplacementInstrumentQueryInfo.java
  28. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentRegistrationQueryInfo.java
  29. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/VipGroupActivityQueryInfo.java
  30. 5 1
      mec-biz/src/main/java/com/ym/mec/biz/service/GoodsService.java
  31. 87 0
      mec-biz/src/main/java/com/ym/mec/biz/service/IndexErrDataRecordService.java
  32. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupActivityService.java
  33. 23 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  34. 8 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  35. 6 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java
  36. 19 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/GoodsServiceImpl.java
  37. 35 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImUserFriendServiceImpl.java
  38. 530 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexErrDataRecordServiceImpl.java
  39. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  40. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  41. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectPlanServiceImpl.java
  42. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  43. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  44. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectServiceImpl.java
  45. 7 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupActivityServiceImpl.java
  46. 6 1
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  47. 4 0
      mec-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml
  48. 6 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  49. 1 1
      mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml
  50. 32 4
      mec-biz/src/main/resources/config/mybatis/GoodsMapper.xml
  51. 642 0
      mec-biz/src/main/resources/config/mybatis/IndexErrDataRecordMapper.xml
  52. 1 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  53. 15 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  54. 30 8
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  55. 1 1
      mec-biz/src/main/resources/config/mybatis/StudentRepairMapper.xml
  56. 12 2
      mec-biz/src/main/resources/config/mybatis/VipGroupActivityMapper.xml
  57. 4 0
      mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
  58. 5 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  59. 15 2
      mec-student/src/main/java/com/ym/mec/student/controller/GoodsController.java
  60. 1 0
      mec-student/src/main/java/com/ym/mec/student/controller/ReplacementInstrumentController.java
  61. 23 0
      mec-task/src/main/java/com/ym/mec/task/jobs/IndexErrDataRecordTask.java
  62. 16 2
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherVipGroupController.java
  63. 34 2
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/VipGroupActivityController.java
  64. 63 2
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  65. 29 3
      mec-web/src/main/java/com/ym/mec/web/controller/GoodsController.java
  66. 197 0
      mec-web/src/main/java/com/ym/mec/web/controller/IndexErrDataRecordController.java
  67. 4 0
      mec-web/src/main/java/com/ym/mec/web/controller/ReplacementInstrumentController.java
  68. 9 0
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  69. 33 2
      mec-web/src/main/java/com/ym/mec/web/controller/VipGroupActivityController.java
  70. 11 5
      mec-web/src/main/java/com/ym/mec/web/controller/VipGroupManageController.java

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

@@ -834,4 +834,6 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @return
      */
     List<Long> queryGroupClassGroupIds(Integer userId);
+
+    int countCourseNum(@Param("classGroupId") Integer classGroupId, @Param("teachMode") String teachMode);
 }

+ 25 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/GoodsDao.java

@@ -21,7 +21,7 @@ public interface GoodsDao extends BaseDAO<Integer, Goods> {
      * @param subjectId
      * @return
      */
-    List<Goods> findGoodsBySubId(@Param("subjectId") Integer subjectId, @Param("type") String type);
+    List<Goods> findGoodsBySubId(@Param("subjectId") Integer subjectId, @Param("type") String type,@Param("organId")Integer organId);
 
     /**
      * 根据商品分类查找商品数量
@@ -115,8 +115,18 @@ public interface GoodsDao extends BaseDAO<Integer, Goods> {
      */
     List<Goods> findBySns(@Param("sns") List<String> sns);
 
+    /**
+     * 获取内部库存预警商品
+     * @param innerRepertoryWarnNum
+     * @return
+     */
     String getInnerRepertoryWarnName(@Param("innerRepertoryWarnNum") String innerRepertoryWarnNum);
 
+    /**
+     * 获取外部库存预警商品
+     * @param outerRepertoryWarnNum
+     * @return
+     */
     String getOuterRepertoryWarnName(@Param("outerRepertoryWarnNum") String outerRepertoryWarnNum);
 
     /**
@@ -135,9 +145,14 @@ public interface GoodsDao extends BaseDAO<Integer, Goods> {
      *
      * @return
      */
-    List<MusicGroupGoodsAndDiscountDto> getMusicGroupGoodsAndDiscount(@Param("subjectId") Integer subjectId, @Param("type") String type, @Param("courseViewType") Integer courseViewType);
+    List<MusicGroupGoodsAndDiscountDto> getMusicGroupGoodsAndDiscount(@Param("subjectId") Integer subjectId,
+                                                                      @Param("type") String type,
+                                                                      @Param("courseViewType") Integer courseViewType,
+                                                                      @Param("organId") Integer organId);
 
-    List<MusicGroupGoodsAndDiscountDto> getMusicGroupGoodsAndDiscountWithSubjects(@Param("subjectIds") String subjectIds, @Param("type") String type);
+    List<MusicGroupGoodsAndDiscountDto> getMusicGroupGoodsAndDiscountWithSubjects(@Param("subjectIds") String subjectIds,
+                                                                                  @Param("type") String type,
+                                                                                  @Param("organId") Integer organId);
 
     /**
      * 是否存在已上架的商品编号
@@ -184,4 +199,11 @@ public interface GoodsDao extends BaseDAO<Integer, Goods> {
      * @return
      */
     Integer getReplacementInstrumentCount(Map<String, Object> params);
+
+    /**
+     * 获取商品分部列表
+     * @param goodsIds
+     * @return
+     */
+    List<Map<Integer, String>> findGoodsOrganNames(@Param("goodsIds") List<Integer> goodsIds);
 }

+ 147 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexErrDataRecordDao.java

@@ -0,0 +1,147 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.dto.CourseScheduleEndDto;
+import com.ym.mec.biz.dal.entity.InspectionItem;
+import com.ym.mec.biz.dal.entity.InspectionItemPlan;
+import com.ym.mec.biz.dal.enums.IndexErrorType;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.biz.dal.entity.IndexErrDataRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public interface IndexErrDataRecordDao extends BaseDAO<Long, IndexErrDataRecord> {
+
+    int batchInsert(@Param("datas") List<IndexErrDataRecord> datas);
+
+    int batchUpdate(@Param("datas") List<IndexErrDataRecord> datas);
+
+    int deleteWithGenerateTimeAndType(@Param("generateTime") String generateTime,
+                                      @Param("dataType") IndexErrorType dataType);
+
+    /**
+     * @describe 统计指定日期产生的异常数量
+     * @author Joburgess
+     * @date 2021/5/28 0028
+     * @param generateTime:
+     * @return int
+     */
+    int countWithGenerateTime(@Param("generateTime") String generateTime);
+
+    /**
+     * @describe 获取所有异常相关教务老师编号
+     * @author Joburgess
+     * @date 2021/6/2 0002
+     * @param organIds:
+     * @return java.util.List<java.lang.Integer>
+     */
+    List<Integer> getAllDealUserIds(@Param("organIds") Collection organIds);
+
+    /**
+     * @describe 根据产生日期
+     * @author Joburgess
+     * @date 2021/5/28 0028
+     * @param generateStartTime:
+     * @param generateEndTime:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.IndexErrDataRecord>
+     */
+    List<IndexErrDataRecord> getWithGenerateTime(@Param("organIds") Set<Integer> organIds,
+                                                 @Param("generateStartTime") String generateStartTime,
+                                                @Param("generateEndTime") String generateEndTime);
+
+    /**
+     * @describe 查询未处理记录
+     * @author Joburgess
+     * @date 2021/5/28 0028
+     * @return java.util.List<com.ym.mec.biz.dal.entity.IndexErrDataRecord>
+     */
+    List<IndexErrDataRecord> findUntreatedRecord();
+
+    /**
+     * @describe 乐团巡查事项异常
+     * @author Joburgess
+     * @date 2021/5/27 0027
+     * @param date:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.IndexErrDataRecord>
+     */
+    List<IndexErrDataRecord> queryErrInspection(@Param("date") String date,
+                                                @Param("dates") Set<String> dates);
+
+    /**
+     * @describe 乐团巡查任务未提交
+     * @author Joburgess
+     * @date 2021/5/27 0027
+     * @param date:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.IndexErrDataRecord>
+     */
+    List<IndexErrDataRecord> queryInspectionItemPlan(@Param("date") String date,
+                                                     @Param("dates") Set<String> dates);
+
+    /**
+     * @describe 回访任务未完成
+     * @author Joburgess
+     * @date 2021/5/27 0027
+     * @param date:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.IndexErrDataRecord>
+     */
+    List<IndexErrDataRecord> queryStudentVisit(@Param("date") String date,
+                                               @Param("dates") Set<String> dates);
+
+    /**
+     * @describe 课程考勤异常
+     * @author Joburgess
+     * @date 2021/5/28 0028
+     * @param date:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.IndexErrDataRecord>
+     */
+    List<IndexErrDataRecord> getAttendanceError(@Param("date") String date,
+                                                @Param("dates") Set<String> dates);
+
+    /**
+     * @describe 课程异常
+     * @author Joburgess
+     * @date 2021/5/28 0028
+     * @param date:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.IndexErrDataRecord>
+     */
+    List<IndexErrDataRecord> getNoAttendance(@Param("date") String date,
+                                             @Param("dates") Set<String> dates);
+
+    List<String> queryErrStrings(Map<String, Object> params);
+    int queryErrStringsCount(Map<String, Object> params);
+    List<IndexErrDataRecord> getWithOrganMonthUserStr(@Param("omuStrings") List<String> omuStrings);
+    List<IndexErrDataRecord> getAllErrDatas(Map<String, Object> params);
+
+    /**
+     * @describe 历史异常数据-乐团巡查事项异常/乐团巡查任务未提交
+     * @author Joburgess
+     * @date 2021/5/28 0028
+     * @param params:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.InspectionItemPlan>
+     */
+    List<InspectionItemPlan> queryErrInspectionData(Map<String, Object> params);
+    int errInspectionDataCount(Map<String, Object> params);
+
+    /**
+     * @describe 历史异常数据-回访任务未完成
+     * @author Joburgess
+     * @date 2021/5/28 0028
+     * @param params:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.InspectionItem>
+     */
+    List<InspectionItem> queryErrStudentVisit(Map<String, Object> params);
+    int studentVisitCount(Map<String, Object> params);
+
+    /**
+     * @return java.util.List<com.ym.mec.biz.dal.dto.CourseScheduleEndDto>
+     * @describe 历史异常数据-课程(课程考勤异常/课程异常)
+     * @author Joburgess
+     * @date 2019/12/27
+     */
+    List<CourseScheduleEndDto> queryHistoryErrCourseData(Map<String, Object> params);
+    int historyErrCourseDataCount(Map<String, Object> params);
+	
+}

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

@@ -204,4 +204,21 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
      * @return java.util.List<com.ym.mec.biz.dal.entity.Student>
      */
     List<Student> getNoTeacherOrNoSubjectStudent();
+
+    /**
+     * @describe 从新学员中找出有VIP课的学员编号
+     * @author Joburgess
+     * @date 2021/6/3 0003
+     * @return java.util.List<java.lang.Integer>
+     */
+    List<Integer> getHasVipCourseStudentIdsFromNewStudents();
+
+    /**
+     * @describe 将指定学员更新为老学员
+     * @author Joburgess
+     * @date 2021/6/3 0003
+     * @param userIds:
+     * @return int
+     */
+    int updateNewStudentsToOld(@Param("userIds") List<Integer> userIds);
 }

+ 10 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java

@@ -528,12 +528,20 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     int quitAllStudent(@Param("musicGroupId") String musicGroupId, @Param("remark") String remark);
 
     /**
+     * @param groupIds:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.StudentRegistration>
      * @describe 获取指定乐团中的注册学员
      * @author Joburgess
      * @date 2021/5/24 0024
-     * @param groupIds:
-     * @return java.util.List<com.ym.mec.biz.dal.entity.StudentRegistration>
      */
     List<StudentRegistration> findByMusicGroupIds(@Param("groupIds") List<String> groupIds,
                                                   @Param("musicGroupStatus") StudentMusicGroupStatusEnum musicGroupStatus);
+
+    /**
+     * 获取支付中的缴费和审核的人数
+     * @param musicGroupId
+     * @param payingStatus
+     * @return
+     */
+    List<Map<Integer, Integer>> countPayingNum(@Param("musicGroupId") String musicGroupId, @Param("payingStatus") Integer payingStatus);
 }

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

@@ -15,7 +15,9 @@ public interface VipGroupActivityDao extends BaseDAO<Integer, VipGroupActivity>
 	 * @Date: 2019/10/2
 	 * 根据课程类型获取vip课 活动方案
 	 */
-	List<VipGroupActivity> findByCategory(@Param("categoryId") Long categoryId, @Param("organIds") String organIds);
+	List<VipGroupActivity> findByCategory(@Param("categoryId") Long categoryId,
+										  @Param("organIds") String organIds,
+										  @Param("applyToStudentType") Integer applyToStudentType);
 
 	/**
 	 * 根据活动方案编号列表获取名称

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

@@ -6,6 +6,8 @@ import java.util.Objects;
 
 public class BasicUserDto {
 
+    private Integer organId;
+
     private Integer userId;
 
     private String name;
@@ -32,6 +34,14 @@ public class BasicUserDto {
     @ApiModelProperty(value = "加油包:0:默认不可用;1:可用;2:已使用;")
     private Integer comeOnPackage;
 
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
     public Integer getCarePackage() {
         return carePackage;
     }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleEndDto.java

@@ -50,6 +50,27 @@ public class CourseScheduleEndDto extends CourseSchedule {
 
     private boolean beMerged;
 
+    private Date generateTime;
+
+    /** 处理时间 */
+    private java.util.Date dealTime;
+
+    public Date getGenerateTime() {
+        return generateTime;
+    }
+
+    public void setGenerateTime(Date generateTime) {
+        this.generateTime = generateTime;
+    }
+
+    public Date getDealTime() {
+        return dealTime;
+    }
+
+    public void setDealTime(Date dealTime) {
+        this.dealTime = dealTime;
+    }
+
     public String getEducationTeacherName() {
         return educationTeacherName;
     }

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

@@ -12,12 +12,19 @@ public class IndexErrorDataExportDto {
 
     private String organName;
 
+    private String generateTime;
+
+    private String dealUserName;
+
     @ApiModelProperty(value = "基础技能班学员数量异常")
     private int highClassStudentLessThanThreeNum;
 
     @ApiModelProperty(value = "乐团巡查事项异常")
     private int musicPatrolItem;
 
+    @ApiModelProperty(value = "乐团巡查事项异常-剩余")
+    private int musicPatrolItemSurplus;
+
     @ApiModelProperty(value = "未加入任何班级学员")
     private int noClassMusicGroupStudentInfo;
 
@@ -39,15 +46,27 @@ public class IndexErrorDataExportDto {
     @ApiModelProperty(value = "乐团巡查任务未提交")
     private int inspectionItemPlan;
 
+    @ApiModelProperty(value = "乐团巡查任务未提交-剩余")
+    private int inspectionItemPlanSurplus;
+
     @ApiModelProperty(value = "回访任务未完成")
     private int studentVisit;
 
+    @ApiModelProperty(value = "回访任务未完成-剩余")
+    private int studentVisitSurplus;
+
     @ApiModelProperty(value = "课程考勤异常")
     private int teacherExceptionAttendance;
 
+    @ApiModelProperty(value = "课程考勤异常-剩余")
+    private int teacherExceptionAttendanceSurplus;
+
     @ApiModelProperty(value = "课程异常")
     private int teacherNotAClass;
 
+    @ApiModelProperty(value = "课程异常-剩余")
+    private int teacherNotAClassSurplus;
+
     @ApiModelProperty(value = "服务指标异常")
     private int teacherServeError;
 
@@ -70,6 +89,22 @@ public class IndexErrorDataExportDto {
         this.organName = organName;
     }
 
+    public String getGenerateTime() {
+        return generateTime;
+    }
+
+    public void setGenerateTime(String generateTime) {
+        this.generateTime = generateTime;
+    }
+
+    public String getDealUserName() {
+        return dealUserName;
+    }
+
+    public void setDealUserName(String dealUserName) {
+        this.dealUserName = dealUserName;
+    }
+
     public int getHighClassStudentLessThanThreeNum() {
         return highClassStudentLessThanThreeNum;
     }
@@ -181,4 +216,44 @@ public class IndexErrorDataExportDto {
     public void setTotal(int total) {
         this.total = total;
     }
+
+    public int getMusicPatrolItemSurplus() {
+        return musicPatrolItemSurplus;
+    }
+
+    public void setMusicPatrolItemSurplus(int musicPatrolItemSurplus) {
+        this.musicPatrolItemSurplus = musicPatrolItemSurplus;
+    }
+
+    public int getInspectionItemPlanSurplus() {
+        return inspectionItemPlanSurplus;
+    }
+
+    public void setInspectionItemPlanSurplus(int inspectionItemPlanSurplus) {
+        this.inspectionItemPlanSurplus = inspectionItemPlanSurplus;
+    }
+
+    public int getStudentVisitSurplus() {
+        return studentVisitSurplus;
+    }
+
+    public void setStudentVisitSurplus(int studentVisitSurplus) {
+        this.studentVisitSurplus = studentVisitSurplus;
+    }
+
+    public int getTeacherExceptionAttendanceSurplus() {
+        return teacherExceptionAttendanceSurplus;
+    }
+
+    public void setTeacherExceptionAttendanceSurplus(int teacherExceptionAttendanceSurplus) {
+        this.teacherExceptionAttendanceSurplus = teacherExceptionAttendanceSurplus;
+    }
+
+    public int getTeacherNotAClassSurplus() {
+        return teacherNotAClassSurplus;
+    }
+
+    public void setTeacherNotAClassSurplus(int teacherNotAClassSurplus) {
+        this.teacherNotAClassSurplus = teacherNotAClassSurplus;
+    }
 }

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentApplyDetailDto.java

@@ -81,6 +81,14 @@ public class StudentApplyDetailDto{
     @ApiModelProperty(value = "云教练金额",required = false)
     private BigDecimal cloudTeacherAmount = BigDecimal.ZERO;
 
+    @ApiModelProperty(value = "缴费中状态 0-正常 1-缴费中 2-审核中",required = false)
+    private Integer payingStatus;
+
+    @ApiModelProperty(value = "是否购买云教练",required = false)
+    private Integer hasCloudTeacher;
+
+    private String payingStatusStr;
+
     public KitGroupPurchaseTypeEnum getKitGroupPurchaseTypeEnum() {
         return kitGroupPurchaseTypeEnum;
     }
@@ -248,4 +256,28 @@ public class StudentApplyDetailDto{
     public void setCloudTeacherAmount(BigDecimal cloudTeacherAmount) {
         this.cloudTeacherAmount = cloudTeacherAmount;
     }
+
+    public Integer getHasCloudTeacher() {
+        return hasCloudTeacher;
+    }
+
+    public void setHasCloudTeacher(Integer hasCloudTeacher) {
+        this.hasCloudTeacher = hasCloudTeacher;
+    }
+
+    public Integer getPayingStatus() {
+        return payingStatus;
+    }
+
+    public void setPayingStatus(Integer payingStatus) {
+        this.payingStatus = payingStatus;
+    }
+
+    public String getPayingStatusStr() {
+        return payingStatusStr;
+    }
+
+    public void setPayingStatusStr(String payingStatusStr) {
+        this.payingStatusStr = payingStatusStr;
+    }
 }

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

@@ -28,6 +28,12 @@ public class SubjectApplyDetailDto {
     @ApiModelProperty(value = "未分班人数",required = false)
     private Integer notPartClassNum;
 
+    @ApiModelProperty(value = "缴费中人数",required = false)
+    private Integer payingNum=0;
+
+    @ApiModelProperty(value = "审核中人数",required = false)
+    private Integer checkNum=0;
+
     public Integer getMusicGroupSubjectPlanId() {
         return musicGroupSubjectPlanId;
     }
@@ -83,4 +89,20 @@ public class SubjectApplyDetailDto {
     public void setPayNum(Integer payNum) {
         this.payNum = payNum;
     }
+
+    public Integer getPayingNum() {
+        return payingNum;
+    }
+
+    public void setPayingNum(Integer payingNum) {
+        this.payingNum = payingNum;
+    }
+
+    public Integer getCheckNum() {
+        return checkNum;
+    }
+
+    public void setCheckNum(Integer checkNum) {
+        this.checkNum = checkNum;
+    }
 }

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

@@ -70,6 +70,16 @@ public class TeacherClassCourseSchudeleDto {
     @ApiModelProperty(value = "助教名称")
     private String teachingNames;
 
+    private Date expiryDate;
+
+    public Date getExpiryDate() {
+        return expiryDate;
+    }
+
+    public void setExpiryDate(Date expiryDate) {
+        this.expiryDate = expiryDate;
+    }
+
     public String getTeachingNames() {
         return teachingNames;
     }

+ 19 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherClassHeadInfo.java

@@ -36,6 +36,8 @@ public class TeacherClassHeadInfo {
     @ApiModelProperty(value = "当前课次",required = false)
     private Integer currentClassTimes;
 
+    private Integer surplusClassTimes;
+
     @ApiModelProperty(value = "声部信息",required = false)
     private String subjectNames;
 
@@ -54,6 +56,23 @@ public class TeacherClassHeadInfo {
     @ApiModelProperty(value = "课程类型",required = false)
     private CourseScheduleType CourseScheduleType;
 
+    private String teachMode;
+
+    public Integer getSurplusClassTimes() {
+        return surplusClassTimes;
+    }
+
+    public void setSurplusClassTimes(Integer surplusClassTimes) {
+        this.surplusClassTimes = surplusClassTimes;
+    }
+
+    public String getTeachMode() {
+        return teachMode;
+    }
+
+    public void setTeachMode(String teachMode) {
+        this.teachMode = teachMode;
+    }
 
     public Integer getTotalClassTimes() {
         return totalClassTimes;

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherHomeworkListDto.java

@@ -46,12 +46,32 @@ public class TeacherHomeworkListDto {
 
     private Date startClassTime;
 
+    private Date endClassTime;
+
+    private Date expiryDate;
+
     private int isReplied;
 
     private int isSubmit;
 
     private int status;
 
+    public Date getEndClassTime() {
+        return endClassTime;
+    }
+
+    public void setEndClassTime(Date endClassTime) {
+        this.endClassTime = endClassTime;
+    }
+
+    public Date getExpiryDate() {
+        return expiryDate;
+    }
+
+    public void setExpiryDate(Date expiryDate) {
+        this.expiryDate = expiryDate;
+    }
+
     public int getStatus() {
         return status;
     }

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

@@ -37,6 +37,17 @@ public class VipGroupApplyBaseInfoDto extends VipGroup {
     @ApiModelProperty(value = "课程组学员缴费设置")
     private List<VipGroupStudentCoursePrice> vipGroupStudentCoursePrices;
 
+    @ApiModelProperty(value = "第一个选择的学员")
+    private Integer firstStudentId;
+
+    public Integer getFirstStudentId() {
+        return firstStudentId;
+    }
+
+    public void setFirstStudentId(Integer firstStudentId) {
+        this.firstStudentId = firstStudentId;
+    }
+
     public List<VipGroupStudentCoursePrice> getVipGroupStudentCoursePrices() {
         return vipGroupStudentCoursePrices;
     }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Goods.java

@@ -150,6 +150,27 @@ public class Goods {
 	@ApiModelProperty(value = "库存预警")
 	private YesOrNoEnum stockWarning;
 
+	@ApiModelProperty(value = "商品所属分部")
+	private String organIdList;
+
+	private String organName;
+
+	public String getOrganName() {
+		return organName;
+	}
+
+	public void setOrganName(String organName) {
+		this.organName = organName;
+	}
+
+	public String getOrganIdList() {
+		return organIdList;
+	}
+
+	public void setOrganIdList(String organIdList) {
+		this.organIdList = organIdList;
+	}
+
 	public String getCourseViewType() {
 		return courseViewType;
 	}

+ 105 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/IndexErrDataRecord.java

@@ -0,0 +1,105 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.ym.mec.biz.dal.enums.IndexErrorType;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.util.Date;
+
+/**
+ * 对应数据库表(index_err_data_record):
+ */
+public class IndexErrDataRecord {
+
+	/**  */
+	private Long id;
+	
+	/** 分部编号 */
+	private Integer organId;
+	
+	/** 数据id */
+	private String dataId;
+	
+	/** 数据类型 */
+	private IndexErrorType dataType;
+	
+	/** 处理人编号 */
+	private Integer dealUserId = -1;
+	
+	/** 生成时间 */
+	private java.util.Date createTime;
+
+	private Date generateTime;
+	
+	/** 处理时间 */
+	private java.util.Date dealTime;
+	
+	public void setId(Long id){
+		this.id = id;
+	}
+	
+	public Long getId(){
+		return this.id;
+	}
+			
+	public void setOrganId(Integer organId){
+		this.organId = organId;
+	}
+	
+	public Integer getOrganId(){
+		return this.organId;
+	}
+			
+	public void setDataId(String dataId){
+		this.dataId = dataId;
+	}
+	
+	public String getDataId(){
+		return this.dataId;
+	}
+
+	public IndexErrorType getDataType() {
+		return dataType;
+	}
+
+	public void setDataType(IndexErrorType dataType) {
+		this.dataType = dataType;
+	}
+
+	public void setDealUserId(Integer dealUserId){
+		this.dealUserId = dealUserId;
+	}
+	
+	public Integer getDealUserId(){
+		return this.dealUserId;
+	}
+			
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+
+	public Date getGenerateTime() {
+		return generateTime;
+	}
+
+	public void setGenerateTime(Date generateTime) {
+		this.generateTime = generateTime;
+	}
+
+	public void setDealTime(java.util.Date dealTime){
+		this.dealTime = dealTime;
+	}
+	
+	public java.util.Date getDealTime(){
+		return this.dealTime;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

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

@@ -88,6 +88,27 @@ public class InspectionItem {
     @ApiModelProperty(value = "主管名字")
     private String userName;
 
+    private Date generateTime;
+
+    /** 处理时间 */
+    private java.util.Date dealTime;
+
+    public Date getGenerateTime() {
+        return generateTime;
+    }
+
+    public void setGenerateTime(Date generateTime) {
+        this.generateTime = generateTime;
+    }
+
+    public Date getDealTime() {
+        return dealTime;
+    }
+
+    public void setDealTime(Date dealTime) {
+        this.dealTime = dealTime;
+    }
+
     public Long getId() {
         return id;
     }
@@ -207,4 +228,4 @@ public class InspectionItem {
     public void setUserName(String userName) {
         this.userName = userName;
     }
-}
+}

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

@@ -136,6 +136,27 @@ public class InspectionItemPlan {
     @ApiModelProperty(value = "乐团主管名字")
     private String realName;
 
+    private Date generateTime;
+
+    /** 处理时间 */
+    private java.util.Date dealTime;
+
+    public Date getGenerateTime() {
+        return generateTime;
+    }
+
+    public void setGenerateTime(Date generateTime) {
+        this.generateTime = generateTime;
+    }
+
+    public Date getDealTime() {
+        return dealTime;
+    }
+
+    public void setDealTime(Date dealTime) {
+        this.dealTime = dealTime;
+    }
+
     public Long getId() {
         return id;
     }
@@ -327,4 +348,4 @@ public class InspectionItemPlan {
     public void setOperatorUserId(Integer operatorUserId) {
         this.operatorUserId = operatorUserId;
     }
-}
+}

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

@@ -121,12 +121,18 @@ public class StudentRegistration {
 
     //乐团
     private OwnershipType ownershipType;
-    
+
     private Integer chargeTypeId;
 
     @ApiModelProperty(value = "是否是合并的学员 0-否 1-是",required = true)
     private Integer isMerge = 0;
 
+    @ApiModelProperty(value = "缴费中状态 0-正常 1-缴费中 2-审核中",required = true)
+    private Integer payingStatus = 0;
+
+    @ApiModelProperty(value = "是否购买云教练 0-没有 1-有",required = true)
+    private Integer hasCloudTeacher = 0;
+
     public String getCertificateType() {
         return certificateType;
     }
@@ -445,4 +451,20 @@ public class StudentRegistration {
     public void setCurrentGradeNum(Integer currentGradeNum) {
         this.currentGradeNum = currentGradeNum;
     }
+
+    public Integer getPayingStatus() {
+        return payingStatus;
+    }
+
+    public void setPayingStatus(Integer payingStatus) {
+        this.payingStatus = payingStatus;
+    }
+
+    public Integer getHasCloudTeacher() {
+        return hasCloudTeacher;
+    }
+
+    public void setHasCloudTeacher(Integer hasCloudTeacher) {
+        this.hasCloudTeacher = hasCloudTeacher;
+    }
 }

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

@@ -89,6 +89,17 @@ public class VipGroupActivity {
 	@ApiModelProperty(value = "每位学员最大使用次数")
 	private Integer studentMaxUsedTimes;
 
+	@ApiModelProperty(value = "适用学生类型:-1:所有;0:老用户;1:新用户")
+	private int  applyToStudentType = -1;
+
+	public int getApplyToStudentType() {
+		return applyToStudentType;
+	}
+
+	public void setApplyToStudentType(int applyToStudentType) {
+		this.applyToStudentType = applyToStudentType;
+	}
+
 	public Integer getMinCourseNum() {
 		return minCourseNum;
 	}

+ 60 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/EndCourseScheduleQueryInfo.java

@@ -81,6 +81,34 @@ public class EndCourseScheduleQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "课程编号搜索")
     private Long courseIdSearch;
 
+    private String generateStartTime;
+
+    private String generateEndTime;
+
+    private String dealStartTime;
+
+    private String dealEndTime;
+
+    private Boolean hasDealTime;
+
+    private Integer educationUserId;
+
+    public Integer getEducationUserId() {
+        return educationUserId;
+    }
+
+    public void setEducationUserId(Integer educationUserId) {
+        this.educationUserId = educationUserId;
+    }
+
+    public Boolean getHasDealTime() {
+        return hasDealTime;
+    }
+
+    public void setHasDealTime(Boolean hasDealTime) {
+        this.hasDealTime = hasDealTime;
+    }
+
     public Long getCourseIdSearch() {
         return courseIdSearch;
     }
@@ -264,4 +292,36 @@ public class EndCourseScheduleQueryInfo extends QueryInfo {
     public void setTeachType(TeachTypeEnum teachType) {
         this.teachType = teachType;
     }
+
+    public String getGenerateStartTime() {
+        return generateStartTime;
+    }
+
+    public void setGenerateStartTime(String generateStartTime) {
+        this.generateStartTime = generateStartTime;
+    }
+
+    public String getGenerateEndTime() {
+        return generateEndTime;
+    }
+
+    public void setGenerateEndTime(String generateEndTime) {
+        this.generateEndTime = generateEndTime;
+    }
+
+    public String getDealStartTime() {
+        return dealStartTime;
+    }
+
+    public void setDealStartTime(String dealStartTime) {
+        this.dealStartTime = dealStartTime;
+    }
+
+    public String getDealEndTime() {
+        return dealEndTime;
+    }
+
+    public void setDealEndTime(String dealEndTime) {
+        this.dealEndTime = dealEndTime;
+    }
 }

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

@@ -42,6 +42,16 @@ public class GoodsQueryInfo extends QueryInfo {
 
     private String courseViewType;
 
+    private String organId;
+
+    public String getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(String organId) {
+        this.organId = organId;
+    }
+
     public String getCourseViewType() {
         return courseViewType;
     }

+ 50 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/IndexErrRecordQueryInfo.java

@@ -0,0 +1,50 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/5/31 0031
+ */
+public class IndexErrRecordQueryInfo extends QueryInfo {
+
+    private String organIds;
+
+    private Integer educationUserId;
+
+    private String startDate;
+
+    private String endDate;
+
+    public String getOrganIds() {
+        return organIds;
+    }
+
+    public void setOrganIds(String organIds) {
+        this.organIds = organIds;
+    }
+
+    public Integer getEducationUserId() {
+        return educationUserId;
+    }
+
+    public void setEducationUserId(Integer educationUserId) {
+        this.educationUserId = educationUserId;
+    }
+
+    public String getStartDate() {
+        return startDate;
+    }
+
+    public void setStartDate(String startDate) {
+        this.startDate = startDate;
+    }
+
+    public String getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(String endDate) {
+        this.endDate = endDate;
+    }
+}

+ 50 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/InspectionItemPlanQueryInfo.java

@@ -46,6 +46,24 @@ public class InspectionItemPlanQueryInfo extends QueryInfo {
 
     private String searchStartTime;
 
+    private String generateStartTime;
+
+    private String generateEndTime;
+
+    private String dealStartTime;
+
+    private String dealEndTime;
+
+    private Boolean hasDealTime;
+
+    public Boolean getHasDealTime() {
+        return hasDealTime;
+    }
+
+    public void setHasDealTime(Boolean hasDealTime) {
+        this.hasDealTime = hasDealTime;
+    }
+
     public String getSearchStartTime() {
         return searchStartTime;
     }
@@ -158,4 +176,36 @@ public class InspectionItemPlanQueryInfo extends QueryInfo {
     public void setIds(String ids) {
         this.ids = ids;
     }
+
+    public String getGenerateStartTime() {
+        return generateStartTime;
+    }
+
+    public void setGenerateStartTime(String generateStartTime) {
+        this.generateStartTime = generateStartTime;
+    }
+
+    public String getGenerateEndTime() {
+        return generateEndTime;
+    }
+
+    public void setGenerateEndTime(String generateEndTime) {
+        this.generateEndTime = generateEndTime;
+    }
+
+    public String getDealStartTime() {
+        return dealStartTime;
+    }
+
+    public void setDealStartTime(String dealStartTime) {
+        this.dealStartTime = dealStartTime;
+    }
+
+    public String getDealEndTime() {
+        return dealEndTime;
+    }
+
+    public void setDealEndTime(String dealEndTime) {
+        this.dealEndTime = dealEndTime;
+    }
 }

+ 50 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/InspectionQueryInfo.java

@@ -31,6 +31,24 @@ public class InspectionQueryInfo extends QueryInfo {
 
     private String searchStartTime;
 
+    private String generateStartTime;
+
+    private String generateEndTime;
+
+    private String dealStartTime;
+
+    private String dealEndTime;
+
+    private Boolean hasDealTime;
+
+    public Boolean getHasDealTime() {
+        return hasDealTime;
+    }
+
+    public void setHasDealTime(Boolean hasDealTime) {
+        this.hasDealTime = hasDealTime;
+    }
+
     public String getSearchStartTime() {
         return searchStartTime;
     }
@@ -102,4 +120,36 @@ public class InspectionQueryInfo extends QueryInfo {
     public void setIds(String ids) {
         this.ids = ids;
     }
+
+    public String getGenerateStartTime() {
+        return generateStartTime;
+    }
+
+    public void setGenerateStartTime(String generateStartTime) {
+        this.generateStartTime = generateStartTime;
+    }
+
+    public String getGenerateEndTime() {
+        return generateEndTime;
+    }
+
+    public void setGenerateEndTime(String generateEndTime) {
+        this.generateEndTime = generateEndTime;
+    }
+
+    public String getDealStartTime() {
+        return dealStartTime;
+    }
+
+    public void setDealStartTime(String dealStartTime) {
+        this.dealStartTime = dealStartTime;
+    }
+
+    public String getDealEndTime() {
+        return dealEndTime;
+    }
+
+    public void setDealEndTime(String dealEndTime) {
+        this.dealEndTime = dealEndTime;
+    }
 }

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

@@ -5,12 +5,22 @@ import com.ym.mec.common.page.QueryInfo;
 
 public class ReplacementInstrumentQueryInfo extends QueryInfo {
 
+    private Integer organId;
+
     private Integer subjectId;
 
     private String brand;
 
     private String specification;
 
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
     public Integer getSubjectId() {
         return subjectId;
     }

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentRegistrationQueryInfo.java

@@ -36,6 +36,12 @@ public class StudentRegistrationQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "是否已回访",required = false)
     private Boolean visited;
 
+    @ApiModelProperty(value = "缴费中状态 0-正常 1-缴费中 2-审核中",required = false)
+    private Integer payingStatus;
+
+    @ApiModelProperty(value = "是否购买云教练 0-没有 1-有",required = false)
+    private Integer hasCloudTeacher;
+
     private boolean isExport = false;
 
     public boolean getIsExport() {
@@ -117,4 +123,20 @@ public class StudentRegistrationQueryInfo extends QueryInfo {
     public void setVisited(Boolean visited) {
         this.visited = visited;
     }
+
+    public Integer getPayingStatus() {
+        return payingStatus;
+    }
+
+    public void setPayingStatus(Integer payingStatus) {
+        this.payingStatus = payingStatus;
+    }
+
+    public Integer getHasCloudTeacher() {
+        return hasCloudTeacher;
+    }
+
+    public void setHasCloudTeacher(Integer hasCloudTeacher) {
+        this.hasCloudTeacher = hasCloudTeacher;
+    }
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/VipGroupActivityQueryInfo.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.page;
 
 import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
 
 /**
  * @Author Joburgess
@@ -12,6 +13,9 @@ public class VipGroupActivityQueryInfo extends QueryInfo {
 
     private Boolean enable;
 
+    @ApiModelProperty(value = "适用学生类型:-1:所有;0:老用户;1:新用户")
+    private Integer  applyToStudentType;
+
     public Boolean getEnable() {
         return enable;
     }
@@ -27,4 +31,12 @@ public class VipGroupActivityQueryInfo extends QueryInfo {
     public void setOrganId(String organId) {
         this.organId = organId;
     }
+
+    public Integer getApplyToStudentType() {
+        return applyToStudentType;
+    }
+
+    public void setApplyToStudentType(Integer applyToStudentType) {
+        this.applyToStudentType = applyToStudentType;
+    }
 }

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

@@ -5,6 +5,8 @@ import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.GoodsProcurement;
 import com.ym.mec.biz.dal.entity.SellOrder;
 import com.ym.mec.biz.dal.enums.AccountType;
+import com.ym.mec.biz.dal.page.GoodsQueryInfo;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.web.multipart.MultipartFile;
@@ -32,7 +34,7 @@ public interface GoodsService extends BaseService<Integer, Goods> {
      * @param subjectId
      * @return
      */
-    List<Goods> findGoodsBySubId(Integer subjectId,String type);
+    List<Goods> findGoodsBySubId(Integer subjectId,String type,Integer organId);
 
     /**
      * 根据商品分类id查找商品数量
@@ -114,4 +116,6 @@ public interface GoodsService extends BaseService<Integer, Goods> {
      * @return java.util.List<com.ym.mec.biz.dal.dto.GoodsSellDto>
      */
     List<GoodsSellDto> queryGoodsSellDtos(String goodsId);
+
+    PageInfo<Goods> queryGoodsPage(GoodsQueryInfo queryInfo);
 }

+ 87 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/IndexErrDataRecordService.java

@@ -0,0 +1,87 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.dto.CourseScheduleEndDto;
+import com.ym.mec.biz.dal.dto.IndexErrorDataExportDto;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.entity.IndexErrDataRecord;
+import com.ym.mec.biz.dal.entity.InspectionItem;
+import com.ym.mec.biz.dal.entity.InspectionItemPlan;
+import com.ym.mec.biz.dal.page.EndCourseScheduleQueryInfo;
+import com.ym.mec.biz.dal.page.IndexErrRecordQueryInfo;
+import com.ym.mec.biz.dal.page.InspectionItemPlanQueryInfo;
+import com.ym.mec.biz.dal.page.InspectionQueryInfo;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.common.service.BaseService;
+
+import java.util.List;
+
+public interface IndexErrDataRecordService extends BaseService<Long, IndexErrDataRecord> {
+
+    /**
+     * @describe 历史异常数据记录
+     * @author Joburgess
+     * @date 2021/5/28 0028
+     * @param date:
+     * @return void
+     */
+    void indexErrDataRecordTask(String date);
+
+    /**
+     * @describe 历史异常数据记录导出
+     * @author Joburgess
+     * @date 2021/5/28 0028
+     * @param startDate:
+     * @param endDate:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.IndexErrDataRecord>
+     */
+    List<IndexErrorDataExportDto> errRecordExport(String organIds, String startDate, String endDate);
+
+    /**
+     * @describe 获取所有异常相关教务人员
+     * @author Joburgess
+     * @date 2021/6/2 0002
+     * @param organIds:
+     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
+     */
+    List<SimpleUserDto> getAllEducationUsers(String organIds);
+
+    PageInfo<IndexErrorDataExportDto> queryRecord(IndexErrRecordQueryInfo queryInfo);
+
+    /**
+     * @describe 异常数据汇总
+     * @author Joburgess
+     * @date 2021/6/2 0002
+     * @param queryInfo:
+     * @return com.ym.mec.biz.dal.dto.IndexErrorDataExportDto
+     */
+    IndexErrorDataExportDto errDataSummarizing(IndexErrRecordQueryInfo queryInfo);
+
+    /**
+     * @describe 历史异常数据-乐团巡查事项异常
+     * @author Joburgess
+     * @date 2021/5/28 0028
+     * @param queryInfo:
+     * @return com.ym.mec.common.page.PageInfo
+     */
+    PageInfo<InspectionItemPlan> queryErrInspectionData(InspectionItemPlanQueryInfo queryInfo);
+
+    /**
+     * @describe 历史异常数据-回访任务未完成
+     * @author Joburgess
+     * @date 2021/5/28 0028
+     * @param queryInfo:
+     * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.entity.InspectionItem>
+     */
+    PageInfo<InspectionItem> queryErrStudentVisit(InspectionQueryInfo queryInfo);
+
+    /**
+     * @describe 历史异常数据-课程(课程考勤异常/课程异常)
+     * @author Joburgess
+     * @date 2021/5/28 0028
+     * @param queryInfo:
+     * @return com.ym.mec.common.page.PageInfo<java.util.List<com.ym.mec.biz.dal.dto.CourseScheduleEndDto>>
+     */
+    PageInfo<CourseScheduleEndDto> queryHistoryErrCourseData(EndCourseScheduleQueryInfo queryInfo);
+
+}

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

@@ -29,7 +29,7 @@ public interface VipGroupActivityService extends BaseService<Integer, VipGroupAc
      * @Date: 2019/10/2
      * 根据课程类型获取VIP课相关活动方案
      */
-    List<VipGroupActivity> findByVipGroupCategory(Long categoryId, Integer teacherId);
+    List<VipGroupActivity> findByVipGroupCategory(Long categoryId, String organIds, Integer teacherId, Integer applyToStudentType);
 
     /**
      * 导出vip活动

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

@@ -1516,18 +1516,18 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 String[] studentNums = classGroupStudentMapperDao.findStudentNumByClassGroupId(teacherClassGroupDto.getClassGroupId());
                 teacherClassGroupDto.setStudentNames(StringUtils.join(studentNums, ","));
             }
+            if (teacherClassGroupDto.getOnlineClassesNum() > 0 && teacherClassGroupDto.getOffLineClassesNum() <= 0) {
+                teacherClassGroupDto.setClassMode(1);
+            } else if (teacherClassGroupDto.getOnlineClassesNum() > 0 && teacherClassGroupDto.getOffLineClassesNum() > 0) {
+                teacherClassGroupDto.setClassMode(3);
+            } else if (teacherClassGroupDto.getOnlineClassesNum() <= 0 && teacherClassGroupDto.getOffLineClassesNum() > 0) {
+                teacherClassGroupDto.setClassMode(2);
+            } else {
+                teacherClassGroupDto.setClassMode(0);
+            }
             if (teacherClassGroupDto.getType() == ClassGroupTypeEnum.VIP) {
                 String[] studentNums = classGroupStudentMapperDao.findStudentNumByClassGroupId(teacherClassGroupDto.getClassGroupId());
                 teacherClassGroupDto.setStudentNames(StringUtils.join(studentNums, ","));
-                if (teacherClassGroupDto.getOnlineClassesNum() > 0 && teacherClassGroupDto.getOffLineClassesNum() <= 0) {
-                    teacherClassGroupDto.setClassMode(1);
-                } else if (teacherClassGroupDto.getOnlineClassesNum() > 0 && teacherClassGroupDto.getOffLineClassesNum() > 0) {
-                    teacherClassGroupDto.setClassMode(3);
-                } else if (teacherClassGroupDto.getOnlineClassesNum() <= 0 && teacherClassGroupDto.getOffLineClassesNum() > 0) {
-                    teacherClassGroupDto.setClassMode(2);
-                } else {
-                    teacherClassGroupDto.setClassMode(0);
-                }
 
                 Integer overCourses = vipGroupOverCourseMaps.get(teacherClassGroupDto.getMusicGroupId());
                 if (Objects.isNull(overCourses)) {
@@ -1639,9 +1639,23 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         String subjectNames = subjectDao.findNames(classGroup.getSubjectIdList());
 
         TeacherClassHeadInfo teacherClassHeadInfo = new TeacherClassHeadInfo();
+        //获取班级的线上、线下课数量
+        int onlineCourseNum = classGroupDao.countCourseNum(classGroupId,"ONLINE");
+        int offlineCourseNum = classGroupDao.countCourseNum(classGroupId,"OFFLINE");
+
+        if (onlineCourseNum > 0 && offlineCourseNum <= 0) {
+            teacherClassHeadInfo.setTeachMode("1");
+        } else if (onlineCourseNum > 0 && offlineCourseNum > 0) {
+            teacherClassHeadInfo.setTeachMode("3");
+        } else if (onlineCourseNum <= 0 && offlineCourseNum > 0) {
+            teacherClassHeadInfo.setTeachMode("2");
+        } else {
+            teacherClassHeadInfo.setTeachMode("0");
+        }
         teacherClassHeadInfo.setStudentNum(classGroupStudentMapperDao.countClassGroupStudentNum(classGroup.getId()));
         teacherClassHeadInfo.setCurrentClassTimes(courseScheduleDao.countCurrentTimes(classGroup.getId(), new Date()));
         teacherClassHeadInfo.setTotalClassTimes(courseScheduleDao.countClassGroupCourses(classGroup.getId()));
+        teacherClassHeadInfo.setSurplusClassTimes(teacherClassHeadInfo.getTotalClassTimes()-teacherClassHeadInfo.getCurrentClassTimes());
         if (subjectNames != null && !subjectNames.isEmpty()) {
             teacherClassHeadInfo.setSubjectNames(subjectNames);
         }

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

@@ -2765,9 +2765,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
                     courseSchedules.get(courseStartDates.size() - 1).setEndClassTime(courseEndTime);
                     if (Objects.nonNull(vipGroupCourseAdjustInfo.getTeachMode())) {
                         if(courseSchedules.get(courseStartDates.size() - 1).getTeachMode().equals(TeachModeEnum.ONLINE)
-                            &&vipGroupCourseAdjustInfo.getTeachMode().equals(TeachModeEnum.OFFLINE)
-							&&Objects.isNull(vipGroupCourseAdjustInfo.getSchoolId())){
-                            throw new BizException("请选择教学点");
+                            &&vipGroupCourseAdjustInfo.getTeachMode().equals(TeachModeEnum.OFFLINE)){
+                            throw new BizException("VIP课不支持从线上调整到线下");
                         }
                         courseSchedules.get(courseStartDates.size() - 1).setTeachMode(vipGroupCourseAdjustInfo.getTeachMode());
                         if (vipGroupCourseAdjustInfo.getTeachMode().equals(TeachModeEnum.OFFLINE)) {
@@ -3380,6 +3379,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				}
 			}
 
+			if (VIP.equals(newCourseSchedule.getGroupType())){
+				if(TeachModeEnum.OFFLINE.equals(newCourseSchedule.getTeachMode())&&TeachModeEnum.ONLINE.equals(oldCourseSchedule.getTeachMode())){
+					throw new BizException("VIP课不支持从线上调整到线下");
+				}
+			}
+
             if(!CollectionUtils.isEmpty(newCourseSchedule.getTeachingTeacherIdList())){
                 if (newCourseSchedule.getTeachingTeacherIdList().contains(newCourseSchedule.getActualTeacherId())){
                     throw new BizException("主教和助教不可重复");

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

@@ -264,12 +264,6 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 	public void level(List<EmployeeLevelDto> employeeLevelDtos) {
 		Integer levelUserId = employeeLevelDtos.get(0).getLevelUserId();
 		List<ImGroupModel> educationGroupModels = new ArrayList<>();
-		//获取用户担任教务老师的所有乐团列表
-		List<String> musicGroupIds = employeeDao.queryMusicGroupIdByUserId(levelUserId);
-		//获取用户担任教务老师的所有网管课列表
-		List<String> practiceGroupIds = employeeDao.queryPracticeGroupIdByUserId(levelUserId);
-		//获取用户担任教务老师的所有VIP课列表
-		List<String> vipGroupIds = employeeDao.queryVipGroupIdByUserId(levelUserId);
 		//获取用户需要加入的群组列表
 		Map<String, List<EmployeeLevelDto>> collect = employeeLevelDtos.stream().collect(Collectors.groupingBy(e -> e.getRoleName()));
 		Set<String> roleNames = collect.keySet();
@@ -356,6 +350,12 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 		employeeDao.updateUserDemissionDate(levelUserId);
 		//冻结用户
 		employeeDao.updateUserLock(levelUserId,1);
+		//获取用户担任教务老师、维修技师的所有乐团列表
+		List<String> musicGroupIds = employeeDao.queryMusicGroupIdByUserId(levelUserId);
+		//获取用户担任教务老师的所有网管课列表
+		List<String> practiceGroupIds = employeeDao.queryPracticeGroupIdByUserId(levelUserId);
+		//获取用户担任教务老师的所有VIP课列表
+		List<String> vipGroupIds = employeeDao.queryVipGroupIdByUserId(levelUserId);
 		if(musicGroupIds.size() > 0){
 			for (String musicGroupId : musicGroupIds) {
 				imUserFriendService.refreshGroupImUserFriend(musicGroupId, GroupType.MUSIC);

+ 19 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/GoodsServiceImpl.java

@@ -15,6 +15,9 @@ import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.page.GoodsQueryInfo;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.util.collection.MapUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.PictureData;
 import org.slf4j.Logger;
@@ -174,8 +177,8 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 	}
 
 	@Override
-	public List<Goods> findGoodsBySubId(Integer subjectId,String type) {
-		return goodsDao.findGoodsBySubId(subjectId,type);
+	public List<Goods> findGoodsBySubId(Integer subjectId,String type,Integer organId) {
+		return goodsDao.findGoodsBySubId(subjectId,type,organId);
 	}
 
 	public int findGoodsNumByCategoryId(Integer goodsCategoryId){
@@ -670,4 +673,18 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 	public List<GoodsSellDto> queryGoodsSellDtos(String goodsId) {
 		return goodsDao.queryGoodsSellDtos(goodsId);
 	}
+
+    @Override
+    public PageInfo<Goods> queryGoodsPage(GoodsQueryInfo queryInfo) {
+		PageInfo<Goods> goodsPageInfo = this.queryPage(queryInfo);
+		List<Goods> rows = goodsPageInfo.getRows();
+		if(rows != null && rows.size() > 0){
+			List<Integer> goodsIds = rows.stream().map(e -> e.getId()).collect(Collectors.toList());
+			Map<Integer,String> goodsNameMap = MapUtil.convertMybatisMap(goodsDao.findGoodsOrganNames(goodsIds));
+			for (Goods row : rows) {
+				row.setOrganName(goodsNameMap.get(row.getId()));
+			}
+		}
+		return goodsPageInfo;
+    }
 }

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

@@ -187,6 +187,8 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
 	public List<ImUserFriend> saveImUserFriends(Set<Integer> studentIds,Set<Integer> teacherIds,GroupType groupType,String musicGroupId){
 		List<ImUserFriend> imUserFriends = new ArrayList<>();
 		Set<Integer> educationIds = new HashSet<>();
+		Integer repairUserId = null;
+		String repairUserName = null;
 		MusicGroup musicGroup = new MusicGroup();
 		//获取当前学员声部
 		Map<Integer,String> studentSubjectName = new HashMap<>();
@@ -200,6 +202,10 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
 			educationIds.add(musicGroup.getDirectorUserId());
 			educationIds.add(musicGroup.getEducationalTeacherId());
 			educationIds.add(musicGroup.getTeamTeacherId());
+			if(musicGroup.getRepairUserId() != null){
+				repairUserId = musicGroup.getRepairUserId();
+				repairUserName = teacherDao.queryNameById(repairUserId);
+			}
 			if(studentIds.size() > 0){
 				studentSubjectName = MapUtil.convertMybatisMap(studentRegistrationDao.getStudentSubjectNameByStuIds(musicGroup.getId(),studentIds));
 			}
@@ -282,7 +288,7 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
 				imUserFriends.add(imUserFriend);
 			}
 		}
-		//学员关联的老师、教务
+		//学员关联的老师、教务、维修技师
 		for (Integer studentId : studentIds) {
 			//学员关联的老师
 			for (Integer teacher : teacherIds) {
@@ -308,6 +314,34 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
 				imUserFriend.setFriendNickname(educationRealNameMap.get(education));
 				imUserFriends.add(imUserFriend);
 			}
+			//学员关联维修技师
+			if(repairUserId != null){
+				if(repairUserId == studentId){
+					continue;
+				}
+				ImUserFriend imUserFriend = new ImUserFriend();
+				imUserFriend.setUserId(studentId);
+				imUserFriend.setFriendId(repairUserId);
+				imUserFriend.setFriendNickname(repairUserName);
+				imUserFriend.setMemo(musicGroup.getName());
+				imUserFriend.setTags("维修技师");
+				imUserFriends.add(imUserFriend);
+			}
+		}
+		//维修技师关联学员
+		if(repairUserId != null){
+			for (Integer studentId : studentIds) {
+				if(repairUserId == studentId){
+					continue;
+				}
+				ImUserFriend imUserFriend = new ImUserFriend();
+				imUserFriend.setUserId(repairUserId);
+				imUserFriend.setFriendId(studentId);
+				imUserFriend.setFriendNickname(usernameMap.get(studentId));
+				imUserFriend.setMemo(musicGroup.getName());
+				imUserFriend.setTags(studentSubjectName.get(studentId));
+				imUserFriends.add(imUserFriend);
+			}
 		}
 		return imUserFriends;
 	}

+ 530 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexErrDataRecordServiceImpl.java

@@ -0,0 +1,530 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.auth.api.entity.SysUserRole;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.CourseScheduleEndDto;
+import com.ym.mec.biz.dal.dto.IndexErrorDataExportDto;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.dto.TeacherVisitDto;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.IndexErrorType;
+import com.ym.mec.biz.dal.enums.InspectionItemEnum;
+import com.ym.mec.biz.dal.page.EndCourseScheduleQueryInfo;
+import com.ym.mec.biz.dal.page.IndexErrRecordQueryInfo;
+import com.ym.mec.biz.dal.page.InspectionItemPlanQueryInfo;
+import com.ym.mec.biz.dal.page.InspectionQueryInfo;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.biz.service.IndexErrDataRecordService;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.ym.mec.biz.dal.enums.GroupType.*;
+
+@Service
+public class IndexErrDataRecordServiceImpl extends BaseServiceImpl<Long, IndexErrDataRecord>  implements IndexErrDataRecordService {
+	
+	@Autowired
+	private IndexErrDataRecordDao indexErrDataRecordDao;
+	@Autowired
+	private StudentVisitDao studentVisitDao;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+	@Autowired
+	private EmployeeDao employeeDao;
+	@Autowired
+	private ClassGroupDao classGroupDao;
+	@Autowired
+	private TeacherDao teacherDao;
+	@Autowired
+	private CourseScheduleDao courseScheduleDao;
+	@Autowired
+	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+	@Autowired
+	private MusicGroupDao musicGroupDao;
+	@Autowired
+	private VipGroupDao vipGroupDao;
+	@Autowired
+	private PracticeGroupDao practiceGroupDao;
+	@Autowired
+	private OrganizationDao organizationDao;
+
+	@Override
+	public BaseDAO<Long, IndexErrDataRecord> getDAO() {
+		return indexErrDataRecordDao;
+	}
+
+	@Override
+	public void indexErrDataRecordTask(String date) {
+		if(StringUtils.isBlank(date)){
+			date = LocalDate.now().plusDays(-1).toString();
+		}
+		Date dt = DateUtil.stringToDate(date, "yyyy-MM-dd");
+
+		int errDateNum = indexErrDataRecordDao.countWithGenerateTime(date);
+
+		if(errDateNum<=0){
+			//乐团巡查事项异常
+			List<IndexErrDataRecord> errInspections = indexErrDataRecordDao.queryErrInspection(date, null);
+			if(!CollectionUtils.isEmpty(errInspections)){
+				errInspections.forEach(e->{
+					e.setDataType(IndexErrorType.MUSIC_PATROL_ITEM);
+					e.setGenerateTime(dt);
+				});
+				indexErrDataRecordDao.batchInsert(errInspections);
+			}
+
+			//乐团巡查任务未提交
+			List<IndexErrDataRecord> errInspectionItemPlans = indexErrDataRecordDao.queryInspectionItemPlan(date, null);
+			if(!CollectionUtils.isEmpty(errInspectionItemPlans)) {
+				errInspectionItemPlans.forEach(e -> {
+					e.setDataType(IndexErrorType.INSPECTION_ITEM_PLAN);
+					e.setGenerateTime(dt);
+				});
+				indexErrDataRecordDao.batchInsert(errInspectionItemPlans);
+			}
+
+			//回访任务未完成
+//			List<IndexErrDataRecord> errStudentVisits = indexErrDataRecordDao.queryStudentVisit(date, null);
+//			if(!CollectionUtils.isEmpty(errStudentVisits)) {
+//				errStudentVisits.forEach(e -> {
+//					e.setDataType(IndexErrorType.STUDENT_VISIT);
+//					e.setGenerateTime(dt);
+//				});
+//				indexErrDataRecordDao.batchInsert(errStudentVisits);
+//			}
+
+			//课程考勤异常
+			List<IndexErrDataRecord> errStudentAttendances = indexErrDataRecordDao.getAttendanceError(date, null);
+			if(!CollectionUtils.isEmpty(errStudentAttendances)) {
+				errStudentAttendances.forEach(e -> {
+					e.setDataType(IndexErrorType.TEACHER_EXCEPTION_ATTENDANCE);
+					e.setGenerateTime(dt);
+				});
+				indexErrDataRecordDao.batchInsert(errStudentAttendances);
+			}
+
+			//课程异常
+			List<IndexErrDataRecord> errNoAttendances = indexErrDataRecordDao.getNoAttendance(date, null);
+			if(!CollectionUtils.isEmpty(errNoAttendances)) {
+				errNoAttendances.forEach(e -> {
+					e.setDataType(IndexErrorType.TEACHER_NOT_A_CLASS);
+					e.setGenerateTime(dt);
+				});
+				indexErrDataRecordDao.batchInsert(errNoAttendances);
+			}
+		}
+
+		//处理历史异常数据
+		checkUntreatedRecord();
+	}
+
+	private void checkUntreatedRecord(){
+		List<IndexErrDataRecord> untreatedRecord = indexErrDataRecordDao.findUntreatedRecord();
+		if(CollectionUtils.isEmpty(untreatedRecord)){
+			return;
+		}
+		Map<IndexErrorType, List<IndexErrDataRecord>> typeDataMap = untreatedRecord.stream().collect(Collectors.groupingBy(IndexErrDataRecord::getDataType));
+
+		List<IndexErrDataRecord> needUpdateRecord = new ArrayList<>();
+		Date now = new Date();
+
+		for (Map.Entry<IndexErrorType, List<IndexErrDataRecord>> typeDataMapEntry : typeDataMap.entrySet()) {
+			Set<String> dates = typeDataMapEntry.getValue().stream().map(i -> DateUtil.dateToString(i.getGenerateTime(), "yyyy-MM-dd")).collect(Collectors.toSet());
+			List<IndexErrDataRecord> newRecord = new ArrayList<>();
+			switch (typeDataMapEntry.getKey()){
+				case MUSIC_PATROL_ITEM:
+					newRecord = indexErrDataRecordDao.queryErrInspection(null, dates);
+					break;
+				case INSPECTION_ITEM_PLAN:
+					newRecord = indexErrDataRecordDao.queryInspectionItemPlan(null, dates);
+					break;
+				case STUDENT_VISIT:
+					newRecord = indexErrDataRecordDao.queryStudentVisit(null, dates);
+					break;
+				case TEACHER_EXCEPTION_ATTENDANCE:
+					newRecord = indexErrDataRecordDao.getAttendanceError(null, dates);
+					break;
+				case TEACHER_NOT_A_CLASS:
+					newRecord = indexErrDataRecordDao.getNoAttendance(null, dates);
+					break;
+			}
+			Set<String> dataIds = newRecord.stream().map(IndexErrDataRecord::getDataId).collect(Collectors.toSet());
+			for (IndexErrDataRecord record : typeDataMapEntry.getValue()) {
+				if(dataIds.contains(record.getDataId())){
+					continue;
+				}
+				record.setDealTime(now);
+				needUpdateRecord.add(record);
+			}
+		}
+		if(!CollectionUtils.isEmpty(needUpdateRecord)){
+			indexErrDataRecordDao.batchUpdate(needUpdateRecord);
+		}
+	}
+
+	@Override
+	public List<SimpleUserDto> getAllEducationUsers(String organIds) {
+		Set<Integer> queryOrganIds = null;
+		if(StringUtils.isNotBlank(organIds)){
+			queryOrganIds = Arrays.stream(organIds.split(",")).map(Integer::new).collect(Collectors.toSet());
+		}
+		List<Integer> allDealUserIds = indexErrDataRecordDao.getAllDealUserIds(queryOrganIds);
+		List<SimpleUserDto> users = new ArrayList<>();
+		if(!CollectionUtils.isEmpty(allDealUserIds)){
+			users = teacherDao.getUsersSimpleInfo(allDealUserIds);
+		}
+		return users;
+	}
+
+	@Override
+	public List<IndexErrorDataExportDto> errRecordExport(String organIdsStr, String startDate, String endDate) {
+		List<IndexErrorDataExportDto> result = new ArrayList<>();
+		Set<Integer> queryOrganIds = null;
+		if(StringUtils.isNotBlank(organIdsStr)){
+			queryOrganIds = Arrays.stream(organIdsStr.split(",")).map(Integer::new).collect(Collectors.toSet());
+		}
+		List<IndexErrDataRecord> errRecords = indexErrDataRecordDao.getWithGenerateTime(queryOrganIds, startDate, endDate);
+		if(CollectionUtils.isEmpty(errRecords)){
+			return result;
+		}
+		List<Integer> organIds = errRecords.stream().map(IndexErrDataRecord::getOrganId).collect(Collectors.toList());
+		List<Organization> organs = organizationDao.findOrgans(organIds);
+		Map<Integer, String> idOrganNameMap = organs.stream().collect(Collectors.toMap(Organization::getId, o -> o.getName()));
+
+		List<Integer> userIds = errRecords.stream().map(IndexErrDataRecord::getDealUserId).collect(Collectors.toList());
+		Map<Integer, SimpleUserDto> idUserMap = new HashMap<>();
+		if(!CollectionUtils.isEmpty(userIds)){
+			List<SimpleUserDto> users = teacherDao.getUsersSimpleInfo(userIds);
+			idUserMap = users.stream().collect(Collectors.toMap(SimpleUserDto::getUserId, u->u, (u1, u2)->u1));
+		}
+		Map<Integer, List<IndexErrDataRecord>> organDataMap = errRecords.stream().collect(Collectors.groupingBy(IndexErrDataRecord::getOrganId));
+		for (Map.Entry<Integer, List<IndexErrDataRecord>> organDataMapEntry : organDataMap.entrySet()) {
+			Map<Date, Map<Integer, List<IndexErrDataRecord>>> dateUserRecordMap = organDataMapEntry.getValue().stream().collect(Collectors.groupingBy(IndexErrDataRecord::getGenerateTime, Collectors.groupingBy(IndexErrDataRecord::getDealUserId)));
+			for (Map.Entry<Date, Map<Integer, List<IndexErrDataRecord>>> dateUserRecordMapEntry : dateUserRecordMap.entrySet()) {
+				String generateTimeStr = DateUtil.dateToString(dateUserRecordMapEntry.getKey(), DateUtil.DATE_FORMAT_MIN);
+				for (Map.Entry<Integer, List<IndexErrDataRecord>> userRecordMapEntry : dateUserRecordMapEntry.getValue().entrySet()) {
+					IndexErrorDataExportDto record = new IndexErrorDataExportDto();
+					record.setGenerateTime(generateTimeStr);
+					record.setOrganName(idOrganNameMap.get(organDataMapEntry.getKey()));
+					if(idUserMap.containsKey(userRecordMapEntry.getKey())){
+						record.setDealUserName(idUserMap.get(userRecordMapEntry.getKey()).getUserName());
+					}
+					Map<IndexErrorType, Long> typeDataNumMap = userRecordMapEntry.getValue().stream().collect(Collectors.groupingBy(IndexErrDataRecord::getDataType, Collectors.counting()));
+					for (Map.Entry<IndexErrorType, Long> typeDataNumMapEntry : typeDataNumMap.entrySet()) {
+						switch (typeDataNumMapEntry.getKey()){
+							case MUSIC_PATROL_ITEM:
+								record.setMusicPatrolItem(typeDataNumMapEntry.getValue().intValue());
+								break;
+							case INSPECTION_ITEM_PLAN:
+								record.setInspectionItemPlan(typeDataNumMapEntry.getValue().intValue());
+								break;
+							case STUDENT_VISIT:
+								record.setStudentVisit(typeDataNumMapEntry.getValue().intValue());
+								break;
+							case TEACHER_EXCEPTION_ATTENDANCE:
+								record.setTeacherExceptionAttendance(typeDataNumMapEntry.getValue().intValue());
+								break;
+							case TEACHER_NOT_A_CLASS:
+								record.setTeacherNotAClass(typeDataNumMapEntry.getValue().intValue());
+								break;
+						}
+					}
+					result.add(record);
+				}
+			}
+		}
+
+		return result;
+	}
+
+	@Override
+	public PageInfo<IndexErrorDataExportDto> queryRecord(IndexErrRecordQueryInfo queryInfo) {
+		PageInfo<IndexErrorDataExportDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+		Set<Integer> queryOrganIds = null;
+		if(StringUtils.isNotBlank(queryInfo.getOrganIds())){
+			queryOrganIds = Arrays.stream(queryInfo.getOrganIds().split(",")).map(Integer::new).collect(Collectors.toSet());
+		}
+		params.put("queryOrganIds", queryOrganIds);
+
+		int count = indexErrDataRecordDao.queryErrStringsCount(params);
+		pageInfo.setTotal(count);
+		params.put("offset", pageInfo.getOffset());
+		List<IndexErrorDataExportDto> dataList = new ArrayList<>();
+		List<String> strings = indexErrDataRecordDao.queryErrStrings(params);
+		if (!CollectionUtils.isEmpty(strings)) {
+			List<IndexErrDataRecord> errRecords = indexErrDataRecordDao.getWithOrganMonthUserStr(strings);
+			List<Integer> organIds = errRecords.stream().map(IndexErrDataRecord::getOrganId).collect(Collectors.toList());
+			List<Organization> organs = organizationDao.findOrgans(organIds);
+			Map<Integer, String> idOrganNameMap = organs.stream().collect(Collectors.toMap(Organization::getId, o -> o.getName()));
+
+			List<Integer> userIds = errRecords.stream().map(IndexErrDataRecord::getDealUserId).collect(Collectors.toList());
+			Map<Integer, SimpleUserDto> idUserMap = new HashMap<>();
+			if(!CollectionUtils.isEmpty(userIds)){
+				List<SimpleUserDto> users = teacherDao.getUsersSimpleInfo(userIds);
+				idUserMap = users.stream().collect(Collectors.toMap(SimpleUserDto::getUserId, u->u, (u1, u2)->u1));
+			}
+			Map<Integer, List<IndexErrDataRecord>> organDataMap = errRecords.stream().collect(Collectors.groupingBy(IndexErrDataRecord::getOrganId));
+			for (Map.Entry<Integer, List<IndexErrDataRecord>> organDataMapEntry : organDataMap.entrySet()) {
+				Map<Date, Map<Integer, List<IndexErrDataRecord>>> dateUserRecordMap = organDataMapEntry.getValue().stream().collect(Collectors.groupingBy(IndexErrDataRecord::getGenerateTime, Collectors.groupingBy(IndexErrDataRecord::getDealUserId)));
+				for (Map.Entry<Date, Map<Integer, List<IndexErrDataRecord>>> dateUserRecordMapEntry : dateUserRecordMap.entrySet()) {
+					String generateTimeStr = DateUtil.dateToString(dateUserRecordMapEntry.getKey(), DateUtil.DATE_FORMAT_MIN);
+					for (Map.Entry<Integer, List<IndexErrDataRecord>> userRecordMapEntry : dateUserRecordMapEntry.getValue().entrySet()) {
+						IndexErrorDataExportDto record = new IndexErrorDataExportDto();
+						record.setGenerateTime(generateTimeStr);
+						record.setOrganName(idOrganNameMap.get(organDataMapEntry.getKey()));
+						if(idUserMap.containsKey(userRecordMapEntry.getKey())){
+							record.setDealUserName(idUserMap.get(userRecordMapEntry.getKey()).getUserName());
+						}
+						Map<IndexErrorType, Long> typeDataNumMap = userRecordMapEntry.getValue().stream().collect(Collectors.groupingBy(IndexErrDataRecord::getDataType, Collectors.counting()));
+						Map<IndexErrorType, Long> typeSurplusDataNumMap = userRecordMapEntry.getValue().stream().filter(e->Objects.isNull(e.getDealTime())).collect(Collectors.groupingBy(IndexErrDataRecord::getDataType, Collectors.counting()));
+						for (Map.Entry<IndexErrorType, Long> typeDataNumMapEntry : typeDataNumMap.entrySet()) {
+							switch (typeDataNumMapEntry.getKey()){
+								case MUSIC_PATROL_ITEM:
+									record.setMusicPatrolItem(typeDataNumMapEntry.getValue().intValue());
+									if(typeSurplusDataNumMap.containsKey(typeDataNumMapEntry.getKey())) {
+										record.setMusicPatrolItemSurplus(typeSurplusDataNumMap.get(typeDataNumMapEntry.getKey()).intValue());
+									}
+									break;
+								case INSPECTION_ITEM_PLAN:
+									record.setInspectionItemPlan(typeDataNumMapEntry.getValue().intValue());
+									if(typeSurplusDataNumMap.containsKey(typeDataNumMapEntry.getKey())) {
+										record.setInspectionItemPlanSurplus(typeSurplusDataNumMap.get(typeDataNumMapEntry.getKey()).intValue());
+									}
+									break;
+								case STUDENT_VISIT:
+									record.setStudentVisit(typeDataNumMapEntry.getValue().intValue());
+									if(typeSurplusDataNumMap.containsKey(typeDataNumMapEntry.getKey())) {
+										record.setStudentVisitSurplus(typeSurplusDataNumMap.get(typeDataNumMapEntry.getKey()).intValue());
+									}
+									break;
+								case TEACHER_EXCEPTION_ATTENDANCE:
+									record.setTeacherExceptionAttendance(typeDataNumMapEntry.getValue().intValue());
+									if(typeSurplusDataNumMap.containsKey(typeDataNumMapEntry.getKey())) {
+										record.setTeacherExceptionAttendanceSurplus(typeSurplusDataNumMap.get(typeDataNumMapEntry.getKey()).intValue());
+									}
+									break;
+								case TEACHER_NOT_A_CLASS:
+									record.setTeacherNotAClass(typeDataNumMapEntry.getValue().intValue());
+									if(typeSurplusDataNumMap.containsKey(typeDataNumMapEntry.getKey())) {
+										record.setTeacherNotAClassSurplus(typeSurplusDataNumMap.get(typeDataNumMapEntry.getKey()).intValue());
+									}
+									break;
+							}
+						}
+						dataList.add(record);
+					}
+				}
+			}
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+
+	@Override
+	public IndexErrorDataExportDto errDataSummarizing(IndexErrRecordQueryInfo queryInfo) {
+		PageInfo<IndexErrorDataExportDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+		Set<Integer> queryOrganIds = null;
+		if(StringUtils.isNotBlank(queryInfo.getOrganIds())){
+			queryOrganIds = Arrays.stream(queryInfo.getOrganIds().split(",")).map(Integer::new).collect(Collectors.toSet());
+		}
+		params.put("queryOrganIds", queryOrganIds);
+
+		List<IndexErrDataRecord> allErrDatas = indexErrDataRecordDao.getAllErrDatas(params);
+		IndexErrorDataExportDto record = new IndexErrorDataExportDto();
+
+		Map<IndexErrorType, Long> typeDataNumMap = allErrDatas.stream().collect(Collectors.groupingBy(IndexErrDataRecord::getDataType, Collectors.counting()));
+		Map<IndexErrorType, Long> typeSurplusDataNumMap = allErrDatas.stream().filter(e->Objects.isNull(e.getDealTime())).collect(Collectors.groupingBy(IndexErrDataRecord::getDataType, Collectors.counting()));
+		for (Map.Entry<IndexErrorType, Long> typeDataNumMapEntry : typeDataNumMap.entrySet()) {
+			switch (typeDataNumMapEntry.getKey()){
+				case MUSIC_PATROL_ITEM:
+					record.setMusicPatrolItem(typeDataNumMapEntry.getValue().intValue());
+					if(typeSurplusDataNumMap.containsKey(typeDataNumMapEntry.getKey())) {
+						record.setMusicPatrolItemSurplus(typeSurplusDataNumMap.get(typeDataNumMapEntry.getKey()).intValue());
+					}
+					break;
+				case INSPECTION_ITEM_PLAN:
+					record.setInspectionItemPlan(typeDataNumMapEntry.getValue().intValue());
+					if(typeSurplusDataNumMap.containsKey(typeDataNumMapEntry.getKey())) {
+						record.setInspectionItemPlanSurplus(typeSurplusDataNumMap.get(typeDataNumMapEntry.getKey()).intValue());
+					}
+					break;
+				case STUDENT_VISIT:
+					record.setStudentVisit(typeDataNumMapEntry.getValue().intValue());
+					if(typeSurplusDataNumMap.containsKey(typeDataNumMapEntry.getKey())) {
+						record.setStudentVisitSurplus(typeSurplusDataNumMap.get(typeDataNumMapEntry.getKey()).intValue());
+					}
+					break;
+				case TEACHER_EXCEPTION_ATTENDANCE:
+					record.setTeacherExceptionAttendance(typeDataNumMapEntry.getValue().intValue());
+					if(typeSurplusDataNumMap.containsKey(typeDataNumMapEntry.getKey())) {
+						record.setTeacherExceptionAttendanceSurplus(typeSurplusDataNumMap.get(typeDataNumMapEntry.getKey()).intValue());
+					}
+					break;
+				case TEACHER_NOT_A_CLASS:
+					record.setTeacherNotAClass(typeDataNumMapEntry.getValue().intValue());
+					if(typeSurplusDataNumMap.containsKey(typeDataNumMapEntry.getKey())) {
+						record.setTeacherNotAClassSurplus(typeSurplusDataNumMap.get(typeDataNumMapEntry.getKey()).intValue());
+					}
+					break;
+			}
+		}
+
+		return record;
+	}
+
+	@Override
+	public PageInfo<InspectionItemPlan> queryErrInspectionData(InspectionItemPlanQueryInfo queryInfo) {
+		PageInfo<InspectionItemPlan> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		int count = indexErrDataRecordDao.errInspectionDataCount(params);
+		pageInfo.setTotal(count);
+		params.put("offset", pageInfo.getOffset());
+		List<InspectionItemPlan> dataList = indexErrDataRecordDao.queryErrInspectionData(params);
+
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+
+	@Override
+	public PageInfo<InspectionItem> queryErrStudentVisit(InspectionQueryInfo queryInfo) {
+		if (queryInfo.getMonth() != null) {
+			queryInfo.setStartTime(DateUtil.getFirstDayOfMonth(queryInfo.getMonth()));
+			queryInfo.setEndTime(DateUtil.getLastTimeWithDay(DateUtil.getLastDayOfMonth(queryInfo.getMonth())));
+		}
+		if (queryInfo.getStartTime() != null) {
+			queryInfo.setStartTime(DateUtil.getFirstDayOfMonth(queryInfo.getStartTime()));
+		}
+		if (queryInfo.getEndTime() != null) {
+			queryInfo.setEndTime(DateUtil.getLastTimeWithDay(DateUtil.getLastDayOfMonth(queryInfo.getEndTime())));
+		}
+		PageInfo<InspectionItem> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		int count = indexErrDataRecordDao.studentVisitCount(params);
+		pageInfo.setTotal(count);
+		params.put("offset", pageInfo.getOffset());
+		List<InspectionItem> dataList = indexErrDataRecordDao.queryErrStudentVisit(params);
+		pageInfo.setRows(dataList);
+		if (pageInfo.getRows().size() <= 0) {
+			return pageInfo;
+		}
+		List<InspectionItem> rows = pageInfo.getRows();
+		List<Integer> teacherIds = rows.stream().filter(e -> e.getItem().equals(InspectionItemEnum.VISIT)).map(InspectionItem::getUserId).collect(Collectors.toList());
+		if (teacherIds.size() > 0) {
+			Date startTime = rows.stream().map(InspectionItem::getMonth).min(Date::compareTo).get();
+			Date EndTime = rows.stream().map(InspectionItem::getMonth).max(Date::compareTo).get();
+			startTime = DateUtil.getFirstDayOfMonth(startTime);
+			EndTime = DateUtil.getLastTimeWithDay(DateUtil.getLastDayOfMonth(EndTime));
+			List<TeacherVisitDto> teacherVisitCounts = studentVisitDao.getTeacherVisitCount(teacherIds, startTime, EndTime);
+			for (InspectionItem row : rows) {
+				if (row.getItem().equals(InspectionItemEnum.INSPECT)) continue;
+				for (TeacherVisitDto teacherVisitCount : teacherVisitCounts) {
+					if (teacherVisitCount.getTeacherId().equals(row.getUserId()) &&
+							DateUtil.dateToString(row.getMonth(), "yyyy-MM").equals(teacherVisitCount.getMonth())
+					) {
+						row.setSubmittedTimes(teacherVisitCount.getNum());
+					}
+				}
+			}
+		}
+		return pageInfo;
+	}
+
+	@Override
+	public PageInfo<CourseScheduleEndDto> queryHistoryErrCourseData(EndCourseScheduleQueryInfo queryInfo) {
+		PageInfo<CourseScheduleEndDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<>(16);
+		MapUtil.populateMap(params, queryInfo);
+
+		List<CourseScheduleEndDto> results;
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
+		//如果当前用户只有教务老师角色,那么只能看到他所管理的课程组的信息
+		if (!sysUser.getIsSuperAdmin() && userRole.size() == 1 && userRole.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+			List<Long> classGroupIds = classGroupDao.queryGroupClassGroupIds(sysUser.getId());
+			if(classGroupIds.size() == 0){
+				return pageInfo;
+			}
+			params.put("classGroupIds",classGroupIds);
+		}
+		int count = indexErrDataRecordDao.historyErrCourseDataCount(params);
+		if(queryInfo.getIsExport() && count > 50000){
+			throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
+		}
+		pageInfo.setTotal(count);
+		params.put("offset", pageInfo.getOffset());
+		results = indexErrDataRecordDao.queryHistoryErrCourseData(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());
+
+			List<Map<Integer, String>> nameIdMaps = teacherDao.queryNameByIdList(teacherIds);
+			Map<Integer, String> nameIdMap=MapUtil.convertIntegerMap(nameIdMaps);
+
+			List<Map<Long, Long>> courseMergeCourseNum = courseScheduleDao.countCourseMergeCourseNum(courseScheduleIds);
+			Map<Long, Long> courseMergeCourseNumMap = new HashMap<>();
+			if(!CollectionUtils.isEmpty(courseMergeCourseNum)){
+				courseMergeCourseNumMap = MapUtil.convertIntegerMap(courseMergeCourseNum);
+			}
+			//获取课程的预计人数
+			List<CourseSchedule> courseScheduleStudentNum = courseScheduleStudentPaymentDao.getCourseScheduleStudentNum(courseScheduleIds);
+			Map<Long, Integer> courseScheduleStudentNumMap = courseScheduleStudentNum.stream().collect(Collectors.toMap(CourseSchedule::getId, CourseSchedule::getStudentNum));
+			//获取班级声部名称
+			List<Map<Integer, String>> classGroupSubjectNameMaps = classGroupDao.findClassGroupSubjectNameMaps(courseScheduleIds);
+			Map<Integer, String> classGroupSubjectNameMap = MapUtil.convertIntegerMap(classGroupSubjectNameMaps);
+			Map<Long, String> eduName = null;
+			if(queryInfo.getIsExport()){
+				List<Long> musicCourseIds = results.stream().filter(e -> e.getGroupType() == MUSIC).map(CourseScheduleEndDto::getId).collect(Collectors.toList());
+				eduName = new HashMap<>(courseScheduleIds.size());
+				if(musicCourseIds != null && musicCourseIds.size() > 0){
+					eduName.putAll(MapUtil.convertMybatisMap(musicGroupDao.queryEduNameMapByCourseId(musicCourseIds)));
+				}
+				List<Long> vipCourseIds = results.stream().filter(e -> e.getGroupType() == VIP).map(CourseScheduleEndDto::getId).collect(Collectors.toList());
+				if(vipCourseIds != null && vipCourseIds.size() > 0){
+					eduName.putAll(MapUtil.convertMybatisMap(vipGroupDao.queryEduNameMapByCourseId(vipCourseIds)));
+				}
+				List<Long> practiceCourseIds = results.stream().filter(e -> e.getGroupType() == PRACTICE).map(CourseScheduleEndDto::getId).collect(Collectors.toList());
+				if(practiceCourseIds != null && practiceCourseIds.size() > 0){
+					eduName.putAll(MapUtil.convertMybatisMap(practiceGroupDao.queryEduNameMapByCourseId(practiceCourseIds)));
+				}
+			}
+			for (CourseScheduleEndDto result : results) {
+				if(eduName != null){
+					result.setEducationTeacherName(eduName.get(result.getId()));
+				}
+				result.setTeacher(null);
+				result.setTeacherName(nameIdMap.get(result.getActualTeacherId()));
+				result.setSubjectName(classGroupSubjectNameMap.get(result.getId()));
+				result.setIsSettlement(Objects.isNull(result.getSettlementTime())?0:1);
+				if(courseMergeCourseNumMap.containsKey(result.getId())){
+					result.setBeMerged(courseMergeCourseNumMap.get(result.getId())>0?true:false);
+				}
+				result.setStudentNum(courseScheduleStudentNumMap.getOrDefault(result.getId(), 0));
+			}
+		}
+		pageInfo.setRows(results);
+		return pageInfo;
+	}
+}

+ 3 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -1191,8 +1191,6 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				if(musicGroupStudentClassAdjust != null){
 					//如果是合班缴费
 					autoClassGroupAdjust(musicGroupStudentClassAdjust);
-				}else {
-					imUserFriendService.refreshGroupImUserFriend(calender.getMusicGroupId(),GroupType.MUSIC);
 				}
 			}else if(calender.getPaymentType() == SPAN_GROUP_CLASS_ADJUST){
 				//删除和解冻班级,课程信息
@@ -1212,6 +1210,9 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				musicGroupPaymentCalender.setActualNum((musicGroupPaymentCalender.getActualNum()==null?0:musicGroupPaymentCalender.getActualNum()) + j);
 			}
 			musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenders);
+			if (calender.getPaymentType() == ADD_STUDENT){
+				imUserFriendService.refreshGroupImUserFriend(calender.getMusicGroupId(),GroupType.MUSIC);
+			}
 		}
 	}
 

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -685,11 +685,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
         studentRegistration.setOrganId(musicGroup.getOrganId());
+        studentRegistration.setPayingStatus(1);
+
         //云教练/云教练+
         if (registerPayDto.getBuyCloudTeacher() || registerPayDto.getBuyCloudTeacherPlus()) {
             OrganizationCloudTeacherFee cloudTeacher = organizationCloudTeacherFeeDao.getByOrganId(studentRegistration.getOrganId());
             BigDecimal cloudTeacherPrice = registerPayDto.getBuyCloudTeacher() ? cloudTeacher.getPrice() : cloudTeacher.getPlusPrice();
             orderAmount = orderAmount.add(cloudTeacherPrice);
+            studentRegistration.setHasCloudTeacher(1);
         }
 
         if (amount.compareTo(orderAmount) != 0) {
@@ -731,10 +734,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         if ("205".equals(studentPaymentOrder.getPaymentAccountNo())) {
             studentPaymentOrder.setPaymentChannel("ADAPAY");
+            studentRegistration.setPayingStatus(2);
         }
         studentPaymentOrderService.update(studentPaymentOrder);
         studentPaymentOrder.setVersion(studentPaymentOrder.getVersion() + 1);
 
+        //更新注册信息
+        studentRegistrationService.update(studentRegistration);
+
         if ("205".equals(studentPaymentOrder.getPaymentAccountNo())) {
             Map<String, String> notifyMap = new HashMap<>();
             notifyMap.put("hasPaidZero", "205");
@@ -859,11 +866,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
         studentRegistration.setOrganId(musicGroup.getOrganId());
+        studentRegistration.setPayingStatus(1);
+
         //云教练/云教练+
         if (registerPayDto.getBuyCloudTeacher() || registerPayDto.getBuyCloudTeacherPlus()) {
             OrganizationCloudTeacherFee cloudTeacher = organizationCloudTeacherFeeDao.getByOrganId(studentRegistration.getOrganId());
             BigDecimal cloudTeacherPrice = registerPayDto.getBuyCloudTeacher() ? cloudTeacher.getPrice() : cloudTeacher.getPlusPrice();
             orderAmount = orderAmount.add(cloudTeacherPrice);
+            studentRegistration.setHasCloudTeacher(1);
         }
 
         if (amount.compareTo(orderAmount) != 0) {
@@ -906,10 +916,13 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         if ("205".equals(studentPaymentOrder.getPaymentAccountNo())) {
             studentPaymentOrder.setPaymentChannel("ADAPAY");
+            studentRegistration.setPayingStatus(2);
         }
         studentPaymentOrderService.update(studentPaymentOrder);
         studentPaymentOrder.setVersion(studentPaymentOrder.getVersion() + 1);
 
+        studentRegistrationService.update(studentRegistration);
+
         if ("205".equals(studentPaymentOrder.getPaymentAccountNo())) {
             Map<String, String> notifyMap = new HashMap<>();
             notifyMap.put("hasPaidZero", "205");
@@ -1755,6 +1768,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             StudentMusicGroupStatusEnum currentStudentMusicGroupStatus = studentRegistration.getMusicGroupStatus();
             studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.QUIT);
             studentRegistration.setSurplusCourseFee(BigDecimal.ZERO);
+            studentRegistration.setHasCloudTeacher(0);
             studentRegistration.setUpdateTime(date);
 
             studentRegistrationDao.update(studentRegistration);
@@ -1989,6 +2003,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         // 退团
         studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.QUIT);
         studentRegistration.setSurplusCourseFee(BigDecimal.ZERO);
+        studentRegistration.setHasCloudTeacher(0);
         studentRegistration.setUpdateTime(date);
 
         studentRegistrationDao.update(studentRegistration);
@@ -2652,6 +2667,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             refresh = true;
             updateTeamTeacher(group, musicGroup);
         }
+        //修改了维修技师
+        if(musicGroup.getRepairUserId() != null && !musicGroup.getRepairUserId().equals(group.getRepairUserId())){
+            refresh = true;
+        }
         //不是导入的乐团
         if (musicGroupId.length() > 10) {
             //是否有预报名的群聊
@@ -2984,6 +3003,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 studentRegistration.setActualSubjectId(subjectId);
                 studentRegistration.setIsMerge(1);
                 studentRegistration.setTemporaryCourseFee(null);
+                studentRegistration.setHasCloudTeacher(0);
             }
             studentRegistrationList.addAll(regs);
         });

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

@@ -239,12 +239,14 @@ public class MusicGroupSubjectPlanServiceImpl extends BaseServiceImpl<Integer, M
 
     @Override
     public List<MusicGroupGoodsAndDiscountDto> getSubjectGoods(Integer subjectId, String type, Integer chargeTypeId, Integer courseViewType, String musicGroupId) {
+        Integer organId = null;
         if (StringUtils.isNotEmpty(musicGroupId)) {
             MusicGroup musicGroup = musicGroupService.get(musicGroupId);
             courseViewType = musicGroup.getCourseViewType().getCode();
             courseViewType = courseViewType == 3?2:courseViewType;
+            organId = musicGroup.getOrganId();
         }
-        List<MusicGroupGoodsAndDiscountDto> goodsList = goodsDao.getMusicGroupGoodsAndDiscount(subjectId, type, courseViewType);
+        List<MusicGroupGoodsAndDiscountDto> goodsList = goodsDao.getMusicGroupGoodsAndDiscount(subjectId, type, courseViewType,organId);
         if (chargeTypeId == null || (type != null && !"INSTRUMENT".equals(type))) {
             return goodsList;
         }

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

@@ -1095,6 +1095,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             }
             studentRegistration.setPaymentStatus(YES);
             studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
+            studentRegistration.setPayingStatus(0);
 
             List<StudentPaymentOrderDetail> orderDetails = studentPaymentOrderDetailService.getOrderDetail(studentPaymentOrder.getId());
 
@@ -1219,6 +1220,10 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 
         if (studentPaymentOrder.getStatus().equals(DealStatusEnum.FAILED)) {
             MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
+            studentRegistration.setPayingStatus(0);
+            studentRegistration.setHasCloudTeacher(0);
+            studentRegistrationDao.update(studentRegistration);
+
             //减去缴费人数(器乐收费,0元时不减缴费人数)
             if (musicGroup.getCourseViewType().equals(CourseViewTypeEnum.CLOUD_TEACHER) || musicGroup.getCourseViewType().equals(CourseViewTypeEnum.CLOUD_TEACHER_PLUS)) {
                 if (studentPaymentOrder.getPaymentAccountNo() != null && studentPaymentOrder.getPaymentAccountNo().equals("200")) {

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -205,7 +205,14 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void updateStudentTeacherAndSubject() {
+        //更新新学员状态
+        List<Integer> newStudentIds = studentDao.getHasVipCourseStudentIdsFromNewStudents();
+        if(!CollectionUtils.isEmpty(newStudentIds)){
+            studentDao.updateNewStudentsToOld(newStudentIds);
+        }
+
         List<Student> noTeacherOrNoSubjectStudent = studentDao.getNoTeacherOrNoSubjectStudent();
         if (CollectionUtils.isEmpty(noTeacherOrNoSubjectStudent)) {
             return;
@@ -215,6 +222,7 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         if (CollectionUtils.isEmpty(studentClassInfo)) {
             return;
         }
+        //更新学员指导老师和声部信息
         List<Student> needUpdateStudents = new ArrayList<>();
         Map<Integer, List<StudentClassInfoDto>> scm = studentClassInfo.stream().collect(Collectors.groupingBy(StudentClassInfoDto::getStudentId));
         for (Student student : noTeacherOrNoSubjectStudent) {

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectServiceImpl.java

@@ -79,11 +79,17 @@ public class SubjectServiceImpl extends BaseServiceImpl<Integer, Subject> implem
 //        //统计当前乐团不同声部的报名人数
         Map<Integer, Integer> applyNum = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(studentRegistrationDao.countApplyNum(musicGroupId))), HashMap.class);
         Map<Integer, Integer> payNumMap = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(studentRegistrationDao.countPayNum(musicGroupId))), HashMap.class);
+        Map<Integer, Integer> payingMap = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(studentRegistrationDao.countPayingNum(musicGroupId, 1))), HashMap.class);
+        Map<Integer, Integer> payCheckMap = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(studentRegistrationDao.countPayingNum(musicGroupId, 2))), HashMap.class);
         subApplyDetail.forEach(detail -> {
             Integer num = payNumMap.get(detail.getSubjectId());
             detail.setPayNum(num == null ? 0 : num);
             num = applyNum.get(detail.getSubjectId());
             detail.setApplyStudentNum(num == null ? 0 : num);
+            num = payingMap.get(detail.getSubjectId());
+            detail.setPayingNum(num == null ? 0 : num);
+            num = payCheckMap.get(detail.getSubjectId());
+            detail.setCheckNum(num == null ? 0 : num);
         });
         return subApplyDetail;
     }

+ 7 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupActivityServiceImpl.java

@@ -146,7 +146,7 @@ public class VipGroupActivityServiceImpl extends BaseServiceImpl<Integer, VipGro
 	}
 
 	@Override
-	public List<VipGroupActivity> findByVipGroupCategory(Long categoryId, Integer teacherId) {
+	public List<VipGroupActivity> findByVipGroupCategory(Long categoryId, String organIds, Integer teacherId, Integer applyToStudentType) {
 		if(Objects.isNull(categoryId)){
 			throw new BizException("请选择课程形态!");
 		}
@@ -157,11 +157,13 @@ public class VipGroupActivityServiceImpl extends BaseServiceImpl<Integer, VipGro
 		if(Objects.isNull(teacher)){
 			throw new BizException("未找到指定教师");
 		}
-		String organIds = teacher.getTeacherOrganId().toString();
-		if (StringUtils.isNotEmpty(teacher.getFlowOrganRange())) {
-			organIds += "," + teacher.getFlowOrganRange();
+		if(StringUtils.isBlank(organIds)){
+			organIds = teacher.getTeacherOrganId().toString();
+			if (StringUtils.isNotEmpty(teacher.getFlowOrganRange())) {
+				organIds += "," + teacher.getFlowOrganRange();
+			}
 		}
-		return vipGroupActivityDao.findByCategory(categoryId,organIds);
+		return vipGroupActivityDao.findByCategory(categoryId,organIds, applyToStudentType);
 	}
 
 	@Override

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

@@ -652,6 +652,8 @@
             mg.id_ music_group_id_,
             mg.name_ music_group_name_,
             s.id_ school_id_,
+            COUNT(CASE WHEN cs.teach_mode_ = 'ONLINE' THEN 1 ELSE NULL END) online_classes_num_,
+            COUNT(CASE WHEN cs.teach_mode_ = 'OFFLINE' THEN 1 ELSE NULL END) offline_classes_num_,
             CASE WHEN cg.type_ IN ('HIGH_ONLINE','MUSIC_NETWORK') THEN '网络教室' ELSE s.name_ END school_name_
         FROM
             course_schedule_teacher_salary csts
@@ -714,7 +716,7 @@
             vg.payment_expire_date_,
             vg.courses_expire_date_,
             vg.single_class_minutes_,
-            vg.courses_start_date,
+            vg.courses_start_date courses_start_date_,
             IF(vg.online_classes_num_ IS NULL,0,vg.online_classes_num_) online_classes_num_,
             IF(vg.offline_classes_num_ IS NULL,0,vg.offline_classes_num_) offline_classes_num_,
             cg.total_class_times_,
@@ -1516,4 +1518,7 @@
         LEFT JOIN class_group cg ON cg.music_group_id_ = pg.id_
         WHERE pg.educational_teacher_id_ = #{userId} AND cg.group_type_ = 'PRACTICE' AND cg.del_flag_ = 0
     </select>
+    <select id="countCourseNum" resultType="int">
+        SELECT COUNT(id_) FROM course_schedule WHERE class_group_id_ = #{teachMode} AND teach_mode_ = #{teachMode}
+    </select>
 </mapper>

+ 4 - 0
mec-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml

@@ -168,6 +168,8 @@
 		<result property="createTime" column="create_time_"/>
 		<result property="day" column="day_"/>
 		<result property="startClassTime" column="start_class_time_"/>
+		<result property="endClassTime" column="end_class_time_"/>
+		<result property="expiryDate" column="expiry_date_"/>
 	</resultMap>
 
 	<select id="findByClassGroupAndTeacher" resultMap="teacherHomeworkListDto">
@@ -177,6 +179,8 @@
 			ch.create_time_,
 			DATE_FORMAT(cs.class_date_,'%Y-%m-%d') 'day_',
 			CONCAT( class_date_, ' ', start_class_time_ ) start_class_time_,
+			CONCAT( class_date_, ' ', end_class_time_ ) end_class_time_,
+			ch.expiry_date_,
 			ch.expect_num_,
 			ch.completed_num_,
 			cs.name_ course_schedule_name_,

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

@@ -1391,6 +1391,7 @@
         <result column="teach_mode_" property="teachMode" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="school_id_" property="schoolId"/>
         <result column="school_name_" property="schoolName"/>
+        <result column="expiry_date_" property="expiryDate"/>
     </resultMap>
 
     <sql id="teacherClassCourseScheduleQueryCondition">
@@ -1433,10 +1434,12 @@
         su.real_name_ username_,
         cg.total_class_times_,
         cs.schoole_id_ school_id_,
-        s.name_ school_name_
+        s.name_ school_name_,
+        ch.expiry_date_
         FROM
         course_schedule_teacher_salary csts
         LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
+        LEFT JOIN course_homework ch ON ch.course_schedule_id_ = cs.id_
         LEFT JOIN class_group cg ON cs.class_group_id_=cg.id_
         LEFT JOIN sys_user su ON cs.actual_teacher_id_ = su.id_
         LEFT JOIN school s ON cs.schoole_id_=s.id_
@@ -1499,10 +1502,12 @@
         GROUP_CONCAT(IF(sa.status_='NORMAL',ssu.username_,NULL)) student_names_,
         MAX(sa.current_class_times_) current_class_times_,
         cs.schoole_id_ school_id_,
+        ch.expiry_date_,
         s.name_ school_name_
         FROM
         student_attendance sa
         LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
+        LEFT JOIN course_homework ch ON ch.course_schedule_id_ = cs.id_
         LEFT JOIN class_group cg ON cs.class_group_id_=cg.id_
         LEFT JOIN sys_user su ON cs.actual_teacher_id_ = su.id_
         LEFT JOIN sys_user ssu ON sa.user_id_=ssu.id_

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

@@ -358,7 +358,7 @@
 
     <select id="queryMusicGroupIdByUserId" resultType="java.lang.String">
         SELECT DISTINCT id_ FROM music_group
-        WHERE (director_user_id_ = #{levelUserId} OR educational_teacher_id_ = #{levelUserId} OR team_teacher_id_ = #{levelUserId})
+        WHERE (director_user_id_ = #{levelUserId} OR educational_teacher_id_ = #{levelUserId} OR team_teacher_id_ = #{levelUserId} OR repair_user_id_ = #{levelUserId})
         AND status_ IN ('PROGRESS','PAUSE','PREPARE')
     </select>
 

+ 32 - 4
mec-biz/src/main/resources/config/mybatis/GoodsMapper.xml

@@ -41,6 +41,8 @@
         <result column="replacement_show_" property="replacementShow" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="stock_warning_" property="stockWarning" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="course_view_type_" property="courseViewType"/>
+        <result column="organ_id_list_" property="organIdList"/>
+        <result column="organ_name_" property="organName"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -63,20 +65,21 @@
         INSERT INTO goods
         (goods_category_id_,sn_,name_,brand_,specification_,image_,stock_count_,tax_stock_count_,sell_count_,market_price_,
         discount_price_,group_purchase_price_,brief_,desc_,is_new_,is_top_,status_,memo_,publish_time_,
-        complement_goods_id_list_,update_time_,create_time_,type_,agree_cost_price_,client_show_,educational_show_,music_group_show_,replacement_show_,stock_warning_,stock_type_,course_view_type_)
+        complement_goods_id_list_,update_time_,create_time_,type_,agree_cost_price_,client_show_,educational_show_,
+         music_group_show_,replacement_show_,stock_warning_,stock_type_,course_view_type_,organ_id_list_)
         VALUES(#{goodsCategoryId},#{sn},#{name},#{brand},#{specification},#{image},#{stockCount},#{taxStockCount},#{sellCount},#{marketPrice},
         #{discountPrice},#{groupPurchasePrice},#{brief},#{desc},
         #{isNew,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{isTop,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
         #{memo},#{publishTime},#{complementGoodsIdList},now(),now(),#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{agreeCostPrice},
         #{clientShow,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{educationalShow,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
         #{musicGroupShow,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{replacementShow,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-        #{stockWarning,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{courseViewType})
+        #{stockWarning,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{courseViewType},#{organIdList})
     </insert>
     <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
         INSERT INTO goods
         (goods_category_id_,name_,brand_,specification_,image_,market_price_,
         discount_price_,group_purchase_price_,brief_,desc_,update_time_,create_time_,type_,agree_cost_price_,sn_,
-        stock_count_,tax_stock_count_,client_show_,educational_show_,music_group_show_,replacement_show_,stock_warning_,stock_type_,course_view_type_)
+        stock_count_,tax_stock_count_,client_show_,educational_show_,music_group_show_,replacement_show_,stock_warning_,stock_type_,course_view_type_,organ_id_list_)
         VALUES
         <foreach collection="list" separator="," item="goods">
             (#{goods.goodsCategoryId},#{goods.name},#{goods.brand},#{goods.specification},#{goods.image},#{goods.marketPrice},
@@ -87,7 +90,7 @@
         	#{goods.musicGroupShow,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
         	#{goods.replacementShow,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{goods.stockWarning,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-            #{goods.stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{goods.courseViewType})
+            #{goods.stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{goods.courseViewType},#{goods.organIdList})
         </foreach>
     </insert>
     <!-- 根据主键查询一条记录 -->
@@ -293,6 +296,7 @@
         SELECT g.*,gc.name_ goods_category_name_ FROM goods g
         LEFT JOIN goods_category gc ON g.goods_category_id_ = gc.id_
         <include refid="queryGoodsPageSql"/>
+        GROUP BY g.id_
         ORDER BY g.id_ DESC
         <include refid="global.limit"/>
     </select>
@@ -304,6 +308,9 @@
 
     <sql id="queryGoodsPageSql">
         <where>
+            <if test="organId != null and organId != ''">
+                AND INTE_ARRAY(#{organId},g.organ_id_list_)
+            </if>
             <if test="goodsCategoryId != null">
                 AND g.goods_category_id_ = #{goodsCategoryId}
             </if>
@@ -350,6 +357,9 @@
         SELECT g.* FROM subject_goods_mapper sgm
         LEFT JOIN goods g ON sgm.goods_category_id_ = g.goods_category_id_
         WHERE sgm.subject_id_ = #{subjectId} AND g.type_ = #{type} and g.status_ != 0
+        <if test="organId != null">
+            AND FIND_IN_SET(#{organId},g.organ_id_list_)
+        </if>
     </select>
 
     <!-- 根据 -->
@@ -418,6 +428,9 @@
         SELECT g.* FROM subject_goods_mapper sgm
         LEFT JOIN goods g ON sgm.goods_category_id_ = g.goods_category_id_
         WHERE sgm.subject_id_ = #{subjectId} AND g.music_group_show_ = 1 AND g.status_ != 0
+        <if test="organId != null">
+            AND FIND_IN_SET(#{organId},g.organ_id_list_)
+        </if>
         <if test="type!=null">
             AND g.type_ = #{type}
         </if>
@@ -430,6 +443,9 @@
         SELECT g.* FROM subject_goods_mapper sgm
         LEFT JOIN goods g ON sgm.goods_category_id_ = g.goods_category_id_
         WHERE FIND_IN_SET(sgm.subject_id_, #{subjectIds}) and g.status_ != 0
+        <if test="organId != null">
+            AND FIND_IN_SET(#{organId},g.organ_id_list_)
+        </if>
         <if test="type!=null">
             AND g.type_ = #{type}
         </if>
@@ -477,6 +493,15 @@
         <include refid="replacementQuerySql"/>
         <include refid="global.limit"/>
     </select>
+    <select id="findGoodsOrganNames" resultType="java.util.Map">
+        SELECT g.id_ 'key',GROUP_CONCAT(DISTINCT o.name_) 'value' FROM goods g
+        LEFT JOIN organization o ON FIND_IN_SET(o.id_,g.organ_id_list_)
+        WHERE g.id_ IN
+        <foreach collection="goodsIds" open="(" close=")" item="organId" separator=",">
+            #{organId}
+        </foreach>
+        GROUP BY g.id_
+    </select>
 
     <sql id="replacementQuerySql">
         <where>
@@ -484,6 +509,9 @@
             AND g.status_ != 0
             AND g.type_ = 'INSTRUMENT'
             AND gc.del_flag_ = 0
+            <if test="organId != null">
+                AND FIND_IN_SET(#{organId},g.organ_id_list_)
+            </if>
             <if test="subjectId != null">
                 AND sgm.subject_id_ = #{subjectId}
             </if>

+ 642 - 0
mec-biz/src/main/resources/config/mybatis/IndexErrDataRecordMapper.xml

@@ -0,0 +1,642 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.IndexErrDataRecordDao">
+
+	<resultMap type="com.ym.mec.biz.dal.entity.IndexErrDataRecord" id="IndexErrDataRecord">
+		<result column="id_" property="id" />
+		<result column="organ_id_" property="organId" />
+		<result column="data_id_" property="dataId" />
+		<result column="data_type_" property="dataType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
+		<result column="deal_user_id_" property="dealUserId" />
+		<result column="generate_time_" property="generateTime"/>
+		<result column="create_time_" property="createTime" />
+		<result column="deal_time_" property="dealTime" />
+	</resultMap>
+
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="IndexErrDataRecord" >
+		SELECT * FROM index_err_data_record WHERE id_ = #{id}
+	</select>
+
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="IndexErrDataRecord">
+		SELECT * FROM index_err_data_record ORDER BY id_
+	</select>
+
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.IndexErrDataRecord" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!--
+		<selectKey resultClass="int" keyProperty="id" > 
+		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
+		</selectKey>
+		-->
+		INSERT INTO index_err_data_record (organ_id_,data_id_,data_type_,deal_user_id_,generate_time_,deal_time_,create_time_)
+		VALUES(#{organId},#{dataId},#{dataType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{dealUserId},#{generateTime},#{dealTime},NOW())
+	</insert>
+
+	<insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.IndexErrDataRecord" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO index_err_data_record (organ_id_,data_id_,data_type_,deal_user_id_,generate_time_,deal_time_,create_time_)
+		VALUE
+		<foreach collection="datas" item="data" separator=",">
+			(#{data.organId},#{data.dataId},#{data.dataType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{data.dealUserId},
+			#{data.generateTime},#{data.dealTime},NOW())
+		</foreach>
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.IndexErrDataRecord">
+		UPDATE index_err_data_record
+		<set>
+			<if test="organId != null">
+				organ_id_ = #{organId},
+			</if>
+			<if test="dealUserId != null">
+				deal_user_id_ = #{dealUserId},
+			</if>
+			<if test="dataId != null">
+				data_id_ = #{dataId},
+			</if>
+			<if test="dataType != null">
+				data_type_ = #{dataType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+			</if>
+			<if test="generateTime != null">
+				generate_time_ = #{generateTime},
+			</if>
+			<if test="dealTime != null">
+				deal_time_ = #{dealTime},
+			</if>
+		</set>
+		WHERE id_ = #{id}
+	</update>
+
+	<update id="batchUpdate" parameterType="com.ym.mec.biz.dal.entity.IndexErrDataRecord">
+		<foreach collection="datas" item="data" separator=";">
+			UPDATE index_err_data_record
+			<set>
+				<if test="data.organId != null">
+					organ_id_ = #{data.organId},
+				</if>
+				<if test="data.dealUserId != null">
+					deal_user_id_ = #{data.dealUserId},
+				</if>
+				<if test="data.dataId != null">
+					data_id_ = #{data.dataId},
+				</if>
+				<if test="data.dataType != null">
+					data_type_ = #{data.dataType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+				</if>
+				<if test="data.generateTime != null">
+					generate_time_ = #{data.generateTime},
+				</if>
+				<if test="data.dealTime != null">
+					deal_time_ = #{data.dealTime},
+				</if>
+			</set>
+			WHERE id_ = #{data.id}
+		</foreach>
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM index_err_data_record WHERE id_ = #{id}
+	</delete>
+
+	<delete id="deleteWithGenerateTimeAndType" >
+		DELETE FROM index_err_data_record
+		WHERE
+			generate_time_ = #{generateTime}
+			<if test="dataType!=null">
+				AND data_type_=#{dataType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
+	</delete>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="IndexErrDataRecord" parameterType="map">
+		SELECT * FROM index_err_data_record ORDER BY id_ <include refid="global.limit"/>
+	</select>
+
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM index_err_data_record
+	</select>
+
+	<select id="countWithGenerateTime" resultType="int">
+		SELECT COUNT(id_) FROM index_err_data_record WHERE generate_time_=#{generateTime}
+	</select>
+
+	<select id="getWithGenerateTime" resultMap="IndexErrDataRecord">
+		SELECT * FROM index_err_data_record
+		<where>
+			<if test="organIds!=null and organIds.size()>0">
+				AND organ_id_ IN
+				<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+					#{organId}
+				</foreach>
+			</if>
+			<if test="generateStartTime!=null and generateStartTime!=''">
+				AND generate_time_&gt;=#{generateStartTime}
+			</if>
+			<if test="generateEndTime!=null and generateEndTime!=''">
+				AND generate_time_&lt;=#{generateEndTime}
+			</if>
+		</where>
+	</select>
+
+	<select id="findUntreatedRecord" resultMap="IndexErrDataRecord">
+		SELECT * FROM index_err_data_record WHERE deal_time_ IS NULL
+	</select>
+
+	<select id="queryErrInspection" resultMap="IndexErrDataRecord">
+		SELECT
+			id_ data_id_,
+		    organ_id_,
+		    user_id_ deal_user_id_
+		FROM
+			inspection_item_plan
+		WHERE
+			conclusion_status_ = 1 AND memo_ = ''
+			<if test="date!=null">
+				AND DATE_FORMAT(plan_start_,'%Y-%m-%d') = #{date}
+			</if>
+			<if test="dates!=null and dates.size()>0">
+				AND DATE_FORMAT(plan_start_,'%Y-%m-%d') IN
+				<foreach collection="dates" item="dt" separator="," open="(" close=")">
+					#{dt}
+				</foreach>
+			</if>
+	</select>
+
+	<select id="queryInspectionItemPlan" resultMap="IndexErrDataRecord">
+		SELECT
+			iip.id_ data_id_,
+			iip.organ_id_,
+			iip.user_id_ deal_user_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')
+			AND DATE_FORMAT(iip.plan_start_,'%Y-%m-%d') &lt;= DATE_FORMAT(NOW(),'%Y-%m-%d')
+			<if test="date!=null">
+		  		AND DATE_FORMAT(iip.plan_start_,'%Y-%m-%d') = #{date}
+			</if>
+			<if test="dates!=null and dates.size()>0">
+				AND DATE_FORMAT(iip.plan_start_,'%Y-%m-%d') IN
+				<foreach collection="dates" item="dt" separator="," open="(" close=")">
+					#{dt}
+				</foreach>
+			</if>
+	</select>
+
+	<select id="queryStudentVisit" resultMap="IndexErrDataRecord">
+		SELECT
+			ii.id_ data_id_,
+		    ii.organ_id_,
+		    ii.user_id_ deal_user_id_
+		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_ &lt;= DATE_FORMAT(NOW(),'%Y-%m-%d')
+			<if test="date!=null">
+				AND i.month_ = #{date}
+			</if>
+			<if test="dates!=null and dates.size()>0">
+				AND i.month_ IN
+				<foreach collection="dates" item="dt" separator="," open="(" close=")">
+					#{dt}
+				</foreach>
+			</if>
+	</select>
+
+	<select id="getAttendanceError" resultMap="IndexErrDataRecord">
+		SELECT
+			DISTINCT cs.id_ data_id_,
+			cs.organ_id_,
+			CASE cs.group_type_ WHEN 'MUSIC' THEN mg.educational_teacher_id_ WHEN 'VIP' THEN vg.educational_teacher_id_ WHEN 'PRACTICE' THEN pg.educational_teacher_id_ END deal_user_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_
+			LEFT JOIN music_group mg ON cs.music_group_id_=mg.id_ AND cs.group_type_='MUSIC'
+			LEFT JOIN vip_group vg ON cs.music_group_id_=vg.id_ AND cs.group_type_='VIP'
+			LEFT JOIN practice_group pg ON cs.music_group_id_=pg.id_ AND cs.group_type_='PRACTICE'
+		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_in_status_ IS NULL OR ta.sign_out_status_ = 0 OR ta.sign_out_status_ IS NULL) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ = 'TRUANT' AND sa.visit_flag_ = 0)))
+			AND ((ta.sign_in_status_ IS NULL AND ta.sign_out_status_ IS NOT NULL) OR (ta.sign_out_status_ IS NULL AND ta.sign_in_status_ IS NOT NULL) OR (ta.sign_out_status_ IS NOT NULL AND ta.sign_in_status_ IS NOT NULL))
+			AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_) AND cssp.id_ IS NOT NULL
+			AND EXISTS (SELECT id_ FROM course_schedule_teacher_salary WHERE cs.id_=course_schedule_id_ AND settlement_time_ IS NULL)
+			<if test="date!=null">
+				AND cs.class_date_=#{date}
+			</if>
+			<if test="dates!=null and dates.size()>0">
+				AND cs.class_date_ IN
+				<foreach collection="dates" item="dt" separator="," open="(" close=")">
+					#{dt}
+				</foreach>
+			</if>
+	</select>
+
+	<select id="getNoAttendance" resultMap="IndexErrDataRecord">
+		SELECT
+			cs.id_ data_id_,
+			cs.organ_id_,
+			CASE cs.group_type_ WHEN 'MUSIC' THEN mg.educational_teacher_id_ WHEN 'VIP' THEN vg.educational_teacher_id_ WHEN 'PRACTICE' THEN pg.educational_teacher_id_ END deal_user_id_
+		FROM course_schedule cs
+			LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
+			LEFT JOIN music_group mg ON cs.music_group_id_=mg.id_ AND cs.group_type_='MUSIC'
+			LEFT JOIN vip_group vg ON cs.music_group_id_=vg.id_ AND cs.group_type_='VIP'
+			LEFT JOIN practice_group pg ON cs.music_group_id_=pg.id_ AND cs.group_type_='PRACTICE'
+		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_)
+			AND EXISTS (SELECT id_ FROM course_schedule_teacher_salary WHERE cs.id_=course_schedule_id_ AND settlement_time_ IS NULL)
+			<if test="date!=null">
+		  		AND cs.class_date_=#{date}
+			</if>
+			<if test="dates!=null and dates.size()>0">
+				AND cs.class_date_ IN
+				<foreach collection="dates" item="dt" separator="," open="(" close=")">
+					#{dt}
+				</foreach>
+			</if>
+	</select>
+
+	<sql id="queryErrStringsCondition">
+		<where>
+			<if test="queryOrganIds!=null and queryOrganIds.size()>0">
+				AND organ_id_ IN
+				<foreach collection="queryOrganIds" item="organId" open="(" close=")" separator=",">
+					#{organId}
+				</foreach>
+			</if>
+			<if test="startDate!=null and startDate!=''">
+				AND generate_time_&gt;=#{startDate}
+			</if>
+			<if test="endDate!=null and endDate!=''">
+				AND generate_time_&lt;=#{endDate}
+			</if>
+			<if test="educationUserId!=null">
+				AND deal_user_id_ = #{educationUserId}
+			</if>
+		</where>
+	</sql>
+
+	<select id="queryErrStrings" resultType="string">
+		SELECT CONCAT(generate_time_, organ_id_, deal_user_id_) FROM index_err_data_record
+		<include refid="queryErrStringsCondition"></include>
+		GROUP BY generate_time_,organ_id_,deal_user_id_
+		ORDER BY generate_time_ DESC,organ_id_,deal_user_id_
+		<include refid="global.limit"></include>
+	</select>
+
+	<select id="queryErrStringsCount" resultType="int">
+		SELECT COUNT(DISTINCT CONCAT(generate_time_,organ_id_,deal_user_id_)) FROM index_err_data_record
+		<include refid="queryErrStringsCondition"></include>
+	</select>
+
+	<select id="getWithOrganMonthUserStr" resultMap="IndexErrDataRecord">
+		SELECT * FROM index_err_data_record WHERE CONCAT(generate_time_, organ_id_, deal_user_id_) IN
+		<foreach collection="omuStrings" item="omuString" open="(" close=")" separator=",">
+			#{omuString}
+		</foreach>
+	</select>
+
+	<select id="getAllErrDatas" resultMap="IndexErrDataRecord">
+		SELECT * FROM index_err_data_record
+		<include refid="queryErrStringsCondition"></include>
+	</select>
+
+	<select id="queryErrInspectionData" resultMap="com.ym.mec.biz.dal.dao.InspectionItemPlanDao.InspectionItemPlan" parameterType="map">
+		SELECT iip.*,su.real_name_ realName,o.name_ organName,co.name_ cooperationName,mg.name_ musicGroupName,
+		       irdr.generate_time_ generateTime,irdr.deal_time_ dealTime
+		FROM index_err_data_record irdr
+		LEFT JOIN inspection_item_plan iip ON irdr.data_id_=iip.id_
+		LEFT JOIN sys_user su ON su.id_ = iip.user_id_
+		LEFT JOIN organization o ON o.id_=iip.organ_id_
+		LEFT JOIN cooperation_organ co ON co.id_=iip.cooperation_organ_id_
+		LEFT JOIN music_group mg ON mg.id_ = iip.music_group_id_
+		<include refid="queryErrInspectionDataCondition"/>
+		ORDER BY iip.plan_start_ ASC
+		<include refid="global.limit"/>
+	</select>
+
+	<select id="errInspectionDataCount" resultType="int">
+		SELECT COUNT(*)
+		FROM index_err_data_record irdr
+		LEFT JOIN inspection_item_plan iip ON irdr.data_id_=iip.id_
+		LEFT JOIN music_group mg ON mg.id_ = iip.music_group_id_
+		<include refid="queryErrInspectionDataCondition"/>
+	</select>
+
+	<sql id="queryErrInspectionDataCondition">
+		<where>
+			<if test="searchType != null and searchType != ''">
+				<if test="searchType == 'MUSIC_PATROL_ITEM'">
+					irdr.data_type_ = 'MUSIC_PATROL_ITEM'
+				</if>
+				<if test="searchType == 'INSPECTION_ITEM_PLAN'">
+					irdr.data_type_ = 'INSPECTION_ITEM_PLAN'
+				</if>
+			</if>
+			<if test="hasDealTime!=null and hasDealTime">
+				AND irdr.deal_time_ IS NOT NULL
+			</if>
+			<if test="hasDealTime!=null and !hasDealTime">
+				AND irdr.deal_time_ IS NULL
+			</if>
+			<if test="itemId != null">
+				AND iip.item_id_ = #{itemId}
+			</if>
+			<if test="userId != null">
+				AND iip.user_id_ = #{userId}
+			</if>
+			<if test="organId != null">
+				AND FIND_IN_SET(iip.organ_id_,#{organId})
+			</if>
+			<if test="cooperationOrganId != null">
+				AND iip.cooperation_organ_id_ = #{cooperationOrganId}
+			</if>
+			<if test="musicGroupId != null">
+				AND iip.music_group_id_ = #{musicGroupId}
+			</if>
+			<if test="conclusionStatus != null">
+				AND iip.conclusion_status_ = #{conclusionStatus}
+			</if>
+			<if test="status !=null">
+				AND iip.status_ = #{status}
+			</if>
+			<if test='hasSubmit != null and hasSubmit.toString()=="1".toString()'>
+				AND iip.status_ > 0
+			</if>
+			<if test='hasSubmit != null and hasSubmit.toString()=="0".toString()'>
+				AND iip.status_ = 0
+			</if>
+			<if test="startTime != null">
+				AND iip.plan_start_ >= #{startTime}
+			</if>
+			<if test="endTime != null">
+				<![CDATA[AND iip.plan_start_ <= #{endTime}]]>
+			</if>
+			<if test="generateStartTime != null">
+				AND irdr.generate_time_ >= #{generateStartTime}
+			</if>
+			<if test="generateEndTime != null">
+				<![CDATA[AND irdr.generate_time_ <= #{generateEndTime}]]>
+			</if>
+			<if test="dealStartTime != null">
+				AND DATE_FORMAT(irdr.deal_time_,"%Y-%m-%d") >= #{dealStartTime}
+			</if>
+			<if test="dealEndTime != null">
+				<![CDATA[AND DATE_FORMAT(irdr.deal_time_,"%Y-%m-%d") <= #{dealEndTime}]]>
+			</if>
+			<if test="search != null">
+				AND mg.name_ LIKE CONCAT('%', #{search}, '%')
+			</if>
+			<if test="ids != null and ids != ''">
+				AND FIND_IN_SET(iip.id_,#{ids})
+			</if>
+		</where>
+	</sql>
+
+	<select id="queryErrStudentVisit" resultMap="com.ym.mec.biz.dal.dao.InspectionItemDao.InspectionItem" parameterType="map">
+		SELECT ii.*,i.month_ month,o.name_ organName,su.real_name_ userName,
+			irdr.generate_time_ generateTime,irdr.deal_time_ dealTime
+		FROM index_err_data_record irdr
+		LEFT JOIN inspection_item ii ON irdr.data_id_=ii.id_
+		LEFT JOIN inspection i ON i.id_ = ii.inspection_id_
+		LEFT JOIN organization o ON o.id_=ii.organ_id_
+		LEFT JOIN sys_user su ON su.id_ = ii.user_id_
+		<include refid="queryErrStudentVisitCondition"/>
+		ORDER BY i.month_ DESC ,ii.id_ DESC
+		<include refid="global.limit"/>
+	</select>
+
+	<!-- 查询当前表的总记录数 -->
+	<select id="studentVisitCount" resultType="int">
+		SELECT COUNT(*)
+		FROM index_err_data_record irdr
+		LEFT JOIN inspection_item ii ON irdr.data_id_=ii.id_
+		LEFT JOIN inspection i ON i.id_ = ii.inspection_id_
+		<include refid="queryErrStudentVisitCondition"/>
+	</select>
+
+	<sql id="queryErrStudentVisitCondition">
+		<where>
+			irdr.data_type_ = 'STUDENT_VISIT'
+			<if test="hasDealTime!=null and hasDealTime">
+				AND irdr.deal_time_ IS NOT NULL
+			</if>
+			<if test="hasDealTime!=null and !hasDealTime">
+				AND irdr.deal_time_ IS NULL
+			</if>
+			<if test="organId != null">
+				AND FIND_IN_SET(ii.organ_id_,#{organId})
+			</if>
+			<if test="userId != null">
+				AND ii.user_id_ = #{userId}
+			</if>
+			<if test="operation != null">
+				AND ii.operation_ = #{operation}
+			</if>
+			<if test="ids != null">
+				AND FIND_IN_SET(ii.id_,#{ids})
+			</if>
+			<if test="startTime != null">
+				AND i.month_ >= #{startTime}
+			</if>
+			<if test="endTime != null">
+				<![CDATA[AND i.month_ <= #{endTime}]]>
+			</if>
+			<if test="generateStartTime != null">
+				AND irdr.generate_time_ >= #{generateStartTime}
+			</if>
+			<if test="generateEndTime != null">
+				<![CDATA[AND irdr.generate_time_ <= #{generateEndTime}]]>
+			</if>
+			<if test="dealStartTime != null">
+				AND DATE_FORMAT(irdr.deal_time_,"%Y-%m-%d") >= #{dealStartTime}
+			</if>
+			<if test="dealEndTime != null">
+				<![CDATA[AND DATE_FORMAT(irdr.deal_time_,"%Y-%m-%d") <= #{dealEndTime}]]>
+			</if>
+		</where>
+	</sql>
+
+	<select id="queryHistoryErrCourseData" resultMap="com.ym.mec.biz.dal.dao.CourseScheduleDao.CourseScheduleEndDto">
+		SELECT
+			cs.id_ id_,
+			cs.new_course_id_,
+			cs.group_type_,
+			cs.music_group_id_,
+			cs.class_group_id_,
+			cs.status_,
+			cs.name_,
+			cs.class_date_,
+			CONCAT(cs.class_date_,' ',cs.start_class_time_) course_start_time_,
+			CONCAT(cs.class_date_,' ',cs.end_class_time_) course_end_time_,
+			cs.actual_teacher_id_,
+			cs.teach_mode_,
+			cs.type_,
+			cs.schoole_id_,
+			cs.create_time_,
+			cs.is_lock_,
+			cs.organ_id_,
+			s.name_ schoole_name_,
+			o.name_ organ_name_,
+			irdr.generate_time_ generateTime,
+		    irdr.deal_time_ dealTime,
+		    eu.real_name_ educationTeacherName,
+			CASE WHEN COUNT(CASE WHEN sa.id_ IS NULL OR (sa.status_ = 'LEAVE' AND sa.remark_ IS NOT NULL) THEN NULL ELSE 1 END) > 0 THEN 1 ELSE 0 END isCallNames,
+			CASE WHEN COUNT(CASE WHEN ta.is_complaints_ = 1 THEN 1 ELSE NULL END) > 0 THEN '1' ELSE '0' END is_complaints_
+		FROM index_err_data_record irdr
+			LEFT JOIN course_schedule cs ON irdr.data_id_=cs.id_
+			LEFT JOIN school s ON cs.schoole_id_=s.id_
+			LEFT JOIN organization o ON cs.organ_id_=o.id_
+			LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_
+			left join teacher_attendance ta on ta.course_schedule_id_ = cs.id_
+			<if test="searchType == 'ERR_ATTENDANCE'">
+				LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
+			</if>
+			LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_
+			<if test="searchType == 'ERR_ATTENDANCE'">
+				AND cssp.user_id_ = sa.user_id_
+			</if>
+			LEFT JOIN sys_user eu ON irdr.deal_user_id_ = eu.id_
+		<include refid="endFindCourseSchedulesCondition"/>
+		GROUP BY cs.class_date_,cs.start_class_time_,cs.id_
+		ORDER BY cs.class_date_,cs.start_class_time_,cs.id_
+		<include refid="global.limit"/>
+	</select>
+
+	<select id="historyErrCourseDataCount" resultType="int">
+		SELECT
+			COUNT(DISTINCT cs.id_)
+		FROM index_err_data_record irdr
+			LEFT JOIN course_schedule cs ON irdr.data_id_=cs.id_
+			<if test="searchType == 'ERR_ATTENDANCE'">
+				LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
+			</if>
+			LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_
+			<if test="searchType == 'ERR_ATTENDANCE'">
+				AND cssp.user_id_ = sa.user_id_
+			</if>
+			LEFT JOIN teacher_attendance ta on ta.course_schedule_id_ = cs.id_
+			LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_
+		<include refid="endFindCourseSchedulesCondition"/>
+	</select>
+
+	<select id="getAllDealUserIds" resultType="int">
+		SELECT DISTINCT deal_user_id_ FROM index_err_data_record
+		<where>
+			<if test="organIds!=null and organIds.size()>0">
+				AND organ_id_ IN
+				<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+					#{organId}
+				</foreach>
+			</if>
+		</where>
+	</select>
+
+	<sql id="endFindCourseSchedulesCondition">
+		<where>
+			<if test="searchType == 'ERR_ATTENDANCE'">
+				AND irdr.data_type_ = 'TEACHER_EXCEPTION_ATTENDANCE'
+			</if>
+			<if test="searchType == 'NO_ATTENDANCE'">
+				AND irdr.data_type_ = 'TEACHER_NOT_A_CLASS'
+			</if>
+			<if test="hasDealTime!=null and hasDealTime">
+				AND irdr.deal_time_ IS NOT NULL
+			</if>
+			<if test="hasDealTime!=null and !hasDealTime">
+				AND irdr.deal_time_ IS NULL
+			</if>
+			<if test="educationUserId!=null">
+				AND irdr.deal_user_id_ = #{educationUserId}
+			</if>
+			<if test="mergeCourseType != null and mergeCourseType != ''">
+				<if test="mergeCourseType == 'MASTER'">
+					AND cs.new_course_id_ = cs.id_
+				</if>
+				<if test="mergeCourseType == 'ASSIST'">
+					AND cs.new_course_id_ > 0 AND cs.new_course_id_ != cs.id_
+				</if>
+				<if test="mergeCourseType == 'ALL'">
+					AND cs.new_course_id_ > 0
+				</if>
+			</if>
+			<if test="isCallNames != null and isCallNames == 1">
+				AND sa.id_ IS NOT NULL
+			</if>
+			<if test="isCallNames != null and isCallNames == 0">
+				AND sa.id_ IS NULL
+			</if>
+			<if test="startTime!=null">
+				AND cs.class_date_ &gt;= DATE_FORMAT(#{startTime},"%Y-%m-%d")
+			</if>
+			<if test="endTime!=null">
+				AND cs.class_date_ &lt;= DATE_FORMAT(#{endTime},"%Y-%m-%d")
+			</if>
+			<if test="generateStartTime != null">
+				AND irdr.generate_time_ >= #{generateStartTime}
+			</if>
+			<if test="generateEndTime != null">
+				<![CDATA[AND irdr.generate_time_ <= #{generateEndTime}]]>
+			</if>
+			<if test="dealStartTime != null">
+				AND DATE_FORMAT(irdr.deal_time_,"%Y-%m-%d") >= #{dealStartTime}
+			</if>
+			<if test="dealEndTime != null">
+				<![CDATA[AND DATE_FORMAT(irdr.deal_time_,"%Y-%m-%d") <= #{dealEndTime}]]>
+			</if>
+			<if test="courseStatus!=null">
+				AND cs.status_ = #{courseStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
+			<if test="createStartDate!=null">
+				AND date(cs.create_time_) &gt;= date(#{createStartDate})
+			</if>
+			<if test="createEndDate!=null">
+				AND date(cs.create_time_) &lt;= date(#{createEndDate})
+			</if>
+			<if test="courseType!=null">
+				AND cs.type_ = #{courseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
+			<if test="groupType!=null">
+				AND cs.group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
+			<if test="schoolId!=null">
+				AND cs.schoole_id_ = #{schoolId}
+			</if>
+			<if test="teachMode!=null">
+				AND cs.teach_mode_ = #{teachMode,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
+			<if test="teacherIdList != null">
+				AND csts.user_id_=#{teacherIdList}
+			</if>
+			<if test="teachType != null">
+				AND csts.teacher_role_ = #{teachType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
+			<if test="organIdList!=null">
+				AND FIND_IN_SET(cs.organ_id_,#{organIdList})
+			</if>
+			<if test="search != null and search != ''">
+				AND (cs.music_group_id_ = #{search} OR cs.id_=#{search} OR cs.name_ LIKE CONCAT('%' ,#{search}, '%' ))
+			</if>
+			<if test="courseIdSearch != null">
+				AND cs.id_ = #{courseIdSearch}
+			</if>
+			<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>
+		</where>
+	</sql>
+</mapper>

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

@@ -308,6 +308,7 @@
         <result column="subject_name_" property="subjectName"/>
         <result column="username_" property="name"/>
         <result column="user_id_" property="userId"/>
+        <result column="organ_id_" property="organId"/>
         <result column="head_url_" property="headUrl"/>
         <result column="gender_" property="gender"/>
         <result column="music_group_id_" property="musicGroupId"/>

+ 15 - 0
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -688,6 +688,13 @@
         SELECT * FROM student WHERE teacher_id_ IS NULL OR subject_id_list_ IS NULL OR cooperation_organ_id_ IS NULL;
     </select>
 
+    <select id="getHasVipCourseStudentIdsFromNewStudents" resultType="int">
+        SELECT DISTINCT s.user_id_
+        FROM student s
+        LEFT JOIN course_schedule_student_payment cssp ON s.user_id_=cssp.user_id_
+        WHERE s.is_new_user_=1 AND cssp.group_type_='VIP'
+    </select>
+
     <update id="updateGrade"><![CDATA[
         UPDATE student SET current_grade_num_=current_grade_num_+1
         WHERE current_grade_num_>=1
@@ -695,4 +702,12 @@
         ]]>
     </update>
 
+    <update id="updateNewStudentsToOld">
+        UPDATE student SET is_new_user_=0
+        WHERE user_id_ IN
+        <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
+            #{userId}
+        </foreach>
+    </update>
+
 </mapper>

+ 30 - 8
mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml

@@ -42,8 +42,10 @@
         <result column="username_" property="name" />
         <result column="deposit_fee_" property="depositFee" />
         <result column="surplus_course_fee_" property="surplusCourseFee"/>
+        <result column="paying_status_" property="payingStatus"/>
+        <result column="has_cloud_teacher_" property="hasCloudTeacher"/>
     </resultMap>
-    
+
     <resultMap type="com.ym.mec.biz.dal.dto.StudentMusicGroupDto" id="StudentMusicGroupDto" extends="StudentRegistration">
     	<result column="music_group_quit_status_" property="musicGroupQuit.status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="group_status_" property="musicGroup.status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
@@ -240,6 +242,12 @@
             <if test="surplusCourseFee != null">
                 surplus_course_fee_ =#{surplusCourseFee},
             </if>
+            <if test="payingStatus != null">
+                paying_status_ =#{payingStatus},
+            </if>
+            <if test="hasCloudTeacher != null">
+                has_cloud_teacher_ =#{hasCloudTeacher},
+            </if>
         </set>
         WHERE id_ = #{id}
     </update>
@@ -306,6 +314,12 @@
             <if test="createYear != null">
                 AND DATE_FORMAT(sr.create_time_,'%Y') =  #{createYear}
             </if>
+            <if test="hasCloudTeacher != null">
+                AND sr.has_cloud_teacher_ =  #{hasCloudTeacher}
+            </if>
+            <if test="payingStatus != null">
+                AND sr.paying_status_ =  #{payingStatus}
+            </if>
         </where>
     </sql>
 
@@ -327,11 +341,13 @@
         <result column="remark_" property="remark"/>
         <result column="create_time_" property="createTime"/>
         <result column="visit_num_" property="visitNum"/>
+        <result column="paying_status_" property="payingStatus"/>
+        <result column="has_cloud_teacher_" property="hasCloudTeacher"/>
     </resultMap>
     <select id="queryStudentDetailPage" resultMap="studentApplyDetail">
         SELECT sr.id_,sr.create_time_, sr.user_id_,su.username_ username_,sr.parents_name_,sr.current_class_,sr.current_grade_,sr.current_grade_date_,
         su.gender_,sr.is_allow_adjust_, s.name_ subject_name_,ss.name_
-        actual_subject_name_,su.phone_ parents_phone_,sr.payment_status_,sr.remark_,sr.actual_subject_id_,IFNULL(sv.num,0) visit_num_
+        actual_subject_name_,su.phone_ parents_phone_,sr.payment_status_,sr.remark_,sr.actual_subject_id_,IFNULL(sv.num,0) visit_num_,sr.has_cloud_teacher_,sr.paying_status_
         FROM student_registration sr
         LEFT JOIN sys_user su ON sr.user_id_ = su.id_
         LEFT JOIN `subject` s ON sr.subject_id_ = s.id_
@@ -786,16 +802,16 @@
         SELECT COUNT(*) FROM student_registration WHERE music_group_id_=#{musicGroupId}
         AND INTE_ARRAY(actual_subject_id_,#{subjectIds}) AND music_group_status_ = 'NORMAL'
     </select>
-    
+
     <select id="queryStudentMusicGroupInfo" resultMap="StudentMusicGroupDto">
-    	select sr.*,s.name_ subject_name_,mg.status_ group_status_,mg.name_ music_group_name_,mgq.status_ music_group_quit_status_ 
+    	select sr.*,s.name_ subject_name_,mg.status_ group_status_,mg.name_ music_group_name_,mgq.status_ music_group_quit_status_
     	from student_registration sr left join subject s on s.id_ = sr.actual_subject_id_
     	left join music_group mg on sr.music_group_id_ = mg.id_
-    	left join (select mgq.* from music_group_quit mgq 
-		 where mgq.id_ in (select max(id_) from music_group_quit group by music_group_id_,user_id_)) mgq  ON mgq.music_group_id_ = sr.music_group_id_ 
+    	left join (select mgq.* from music_group_quit mgq
+		 where mgq.id_ in (select max(id_) from music_group_quit group by music_group_id_,user_id_)) mgq  ON mgq.music_group_id_ = sr.music_group_id_
 		 AND mgq.user_id_ = sr.user_id_ AND mgq.join_date_ = sr.create_time_
-    	where sr.user_id_ = #{userId} 
-    	order by sr.id_ 
+    	where sr.user_id_ = #{userId}
+    	order by sr.id_
     </select>
 
     <select id="querySurplusCourseFeeByClassGroupId" resultType="java.util.Map">
@@ -1006,4 +1022,10 @@
         UPDATE student_registration SET music_group_status_ = 'QUIT',remark_=#{remark} WHERE music_group_id_ = #{musicGroupId}
         AND music_group_status_ IN ('APPLY','NORMAL')
     </update>
+
+    <select id="countPayingNum" resultType="map">
+        SELECT COUNT(DISTINCT user_id_) `value`,actual_subject_id_ `key` FROM student_registration
+        WHERE music_group_id_ = #{musicGroupId} AND paying_status_=#{payingStatus} AND music_group_status_ != 'QUIT' GROUP BY actual_subject_id_
+    </select>
+
 </mapper>

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

@@ -143,7 +143,7 @@
     </update>
 
     <select id="getStudents" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.BasicUserDto">
-        SELECT su.username_ ,su.id_ user_id_,su.avatar_ head_url_,su.gender_,su.phone_,s.care_package_,s.come_on_package_
+        SELECT su.username_ ,su.id_ user_id_,su.avatar_ head_url_,su.gender_,su.phone_,s.care_package_,s.come_on_package_,su.organ_id_
         FROM sys_user su
         LEFT JOIN student s ON su.id_=s.user_id_
         WHERE FIND_IN_SET(organ_id_,#{organIdList})

+ 12 - 2
mec-biz/src/main/resources/config/mybatis/VipGroupActivityMapper.xml

@@ -34,6 +34,7 @@
 		<result property="minCourseNum" column="min_course_num_"/>
 		<result property="maxCourseNum" column="max_course_num_"/>
 		<result property="studentMaxUsedTimes" column="student_max_used_times_"/>
+		<result property="applyToStudentType" column="apply_to_student_type_"/>
 	</resultMap>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -56,10 +57,10 @@
 		INSERT INTO vip_group_activity (id_,name_,description_,vip_group_category_id_list_,start_time_,end_time_,organ_id_,courses_start_time_,courses_end_time_,type_,
 		                                attribute1_,attribute2_,attribute3_,salary_readonly_flag_,give_class_pay_salary_flag_,create_time_,update_time_,salary_settlement_json_,del_flag_,
 		                                payment_readonly_flag_,online_class_join_gradient_rewards_,offline_class_join_gradient_rewards_,min_course_num_,max_course_num_,
-										student_max_used_times_)
+										student_max_used_times_, apply_to_student_type_)
 		VALUES(#{id},#{name},#{description},#{vipGroupCategoryIdList},#{startTime},#{endTime},#{organId},#{coursesStartTime},#{coursesEndTime},#{type},#{attribute1},#{attribute2},#{attribute3},
 		       #{salaryReadonlyFlag},#{giveClassPaySalaryFlag},now(),now(),#{salarySettlementJson},#{delFlag},#{paymentReadonlyFlag},#{onlineClassJoinGradientRewards},
-		       #{offlineClassJoinGradientRewards},#{minCourseNum},#{maxCourseNum},#{studentMaxUsedTimes})
+		       #{offlineClassJoinGradientRewards},#{minCourseNum},#{maxCourseNum},#{studentMaxUsedTimes},#{applyToStudentType})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -138,6 +139,9 @@
 			<if test="studentMaxUsedTimes!=null">
 				student_max_used_times_=#{studentMaxUsedTimes},
 			</if>
+			<if test="applyToStudentType!=null">
+				apply_to_student_type_=#{applyToStudentType},
+			</if>
 			update_time_ = NOW(),
 		</set>WHERE id_ = #{id}
 	</update>
@@ -162,6 +166,9 @@
 			<if test="search != null and search != ''">
 				AND (vga.id_=#{search} OR vga.name_ LIKE CONCAT('%', #{search}, '%'))
 			</if>
+			<if test="applyToStudentType!=null">
+				AND apply_to_student_type_=#{applyToStudentType}
+			</if>
 		</where>
 	</sql>
 
@@ -193,6 +200,9 @@
 			AND (end_time_ IS NULL OR NOW() BETWEEN start_time_ AND end_time_)
 			AND del_flag_=0
 			AND INTE_ARRAY(organ_id_,#{organIds})
+			<if test="applyToStudentType!=null">
+				AND (apply_to_student_type_=#{applyToStudentType} OR apply_to_student_type_=-1)
+			</if>
 	</select>
     <select id="queryNamesById" resultType="java.util.Map">
 		SELECT vga.id_ `key`,vga.name_ `value` FROM vip_group_activity vga WHERE FIND_IN_SET(vga.id_,#{activityIds}) AND vga.del_flag_=0

+ 4 - 0
mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java

@@ -195,4 +195,8 @@ public interface TaskRemoteService {
 	//同步即时通讯聊天记录
 	@GetMapping("task/syncImHistoryMessageTask")
     void syncImHistoryMessageTask();
+
+	//历史异常数据记录
+	@GetMapping("task/indexErrDataRecordTask")
+	void indexErrDataRecord();
 }

+ 5 - 0
mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java

@@ -242,4 +242,9 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
     public void syncImHistoryMessageTask() {
 		logger.error("同步即时通讯聊天记录失败");
     }
+
+	@Override
+	public void indexErrDataRecord() {
+		logger.error("历史异常数据记录失败");
+	}
 }

+ 15 - 2
mec-student/src/main/java/com/ym/mec/student/controller/GoodsController.java

@@ -1,8 +1,10 @@
 package com.ym.mec.student.controller;
 
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.GoodsCategory;
 import com.ym.mec.biz.service.GoodsCategoryService;
+import com.ym.mec.common.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -54,8 +56,19 @@ public class GoodsController extends BaseController {
     @ApiOperation(value = "通过科目编号、商品分类 查询商品(教材、辅件)列表")
     @GetMapping("/queryGoodsBySubId")
     @ApiImplicitParams({ @ApiImplicitParam(name = "subjectId", value = "科目编号", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "organId", value = "分部编号", required = true, dataType = "Integer"),
             @ApiImplicitParam(name = "type", value = "INSTRUMENT 乐器, ACCESSORIES 教辅", required = true, dataType = "String")})
-    public Object findGoodsBySubId(Integer subjectId,String type){
-        return succeed(goodsService.findGoodsBySubId(subjectId,type));
+    public Object findGoodsBySubId(Integer subjectId,String type,Integer organId){
+        if(organId == null){
+            SysUser sysUser = sysUserFeignService.queryUserInfo();
+            if(sysUser == null){
+                throw new BizException("请先登录");
+            }
+            organId = sysUser.getOrganId();
+            if(organId == null){
+                throw new BizException("学员分部异常,请联系管理员");
+            }
+        }
+        return succeed(goodsService.findGoodsBySubId(subjectId,type,organId));
     }
 }

+ 1 - 0
mec-student/src/main/java/com/ym/mec/student/controller/ReplacementInstrumentController.java

@@ -34,6 +34,7 @@ public class ReplacementInstrumentController extends BaseController {
         if (sysUser == null) {
             return failed("用户信息获取失败");
         }
+        queryInfo.setOrganId(sysUser.getOrganId());
         return succeed(replacementInstrumentService.getPageList(queryInfo));
     }
 

+ 23 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/IndexErrDataRecordTask.java

@@ -0,0 +1,23 @@
+package com.ym.mec.task.jobs;
+
+import com.ym.mec.task.TaskRemoteService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/5/28 0028
+ */
+@Service
+public class IndexErrDataRecordTask extends BaseTask {
+
+    @Autowired
+    private TaskRemoteService taskRemoteService;
+
+    @Override
+    public void execute() throws TaskException {
+        taskRemoteService.indexErrDataRecord();
+    }
+}

+ 16 - 2
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherVipGroupController.java

@@ -62,7 +62,13 @@ public class TeacherVipGroupController extends BaseController {
 		vipGroupApplyDto.getVipGroupApplyBaseInfo().setUserId(userId);
 		vipGroupApplyDto.getVipGroupApplyBaseInfo().setTeacherId(Long.valueOf(userId));
 		vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganIdList(teacher.getTeacherOrganId().toString());
-		vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganId(teacher.getTeacherOrganId());
+//		vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganId(teacher.getTeacherOrganId());
+		Integer firstStudentId = vipGroupApplyDto.getVipGroupApplyBaseInfo().getFirstStudentId();
+		SysUser student = teacherDao.getUser(firstStudentId);
+		if(Objects.isNull(student)||Objects.isNull(student.getOrganId())){
+			return failed("学员信息异常");
+		}
+		vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganId(student.getOrganId());
 		return vipGroupService.createVipGroup(vipGroupApplyDto);
 	}
 
@@ -79,7 +85,15 @@ public class TeacherVipGroupController extends BaseController {
 		vipGroupApplyDto.getVipGroupApplyBaseInfo().setUserId(userId);
 		vipGroupApplyDto.getVipGroupApplyBaseInfo().setTeacherId(Long.valueOf(userId));
 		vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganIdList(teacher.getTeacherOrganId().toString());
-		vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganId(teacher.getTeacherOrganId());
+//		vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganId(teacher.getTeacherOrganId());
+
+		Integer firstStudentId = vipGroupApplyDto.getVipGroupApplyBaseInfo().getFirstStudentId();
+		SysUser student = teacherDao.getUser(firstStudentId);
+		if(Objects.isNull(student)||Objects.isNull(student.getOrganId())){
+			return failed("学员信息异常");
+		}
+		vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganId(student.getOrganId());
+
 		vipGroupApplyDto.getVipGroupApplyBaseInfo().setRegistrationStartTime(DateUtil.addDays(new Date(), -1));
 		vipGroupApplyDto.getVipGroupApplyBaseInfo().setPaymentExpireDate(vipGroupApplyDto.getVipGroupApplyBaseInfo().getRegistrationStartTime());
 		vipGroupApplyDto.setOnlyProgress(true);

+ 34 - 2
mec-teacher/src/main/java/com/ym/mec/teacher/controller/VipGroupActivityController.java

@@ -2,7 +2,10 @@ package com.ym.mec.teacher.controller;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.VipGroupActivityAddDto;
+import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.entity.SysConfig;
 import com.ym.mec.biz.dal.entity.VipGroupActivity;
 import com.ym.mec.biz.dal.page.VipGroupActivityQueryInfo;
@@ -13,6 +16,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.*;
@@ -34,6 +38,10 @@ public class VipGroupActivityController extends BaseController {
     private SysUserFeignService sysUserFeignService;
     @Autowired
     private SysConfigService sysConfigService;
+    @Autowired
+    private TeacherDao teacherDao;
+    @Autowired
+    private StudentDao studentDao;
 
     @ApiOperation(value = "新增vip课活动方案")
     @PostMapping("/addVipGroupActivity")
@@ -61,12 +69,36 @@ public class VipGroupActivityController extends BaseController {
 
     @ApiOperation(value = "根据课程类型获取对应课程活动方案")
     @GetMapping("/findByVipGroupCategory")
-    public Object findByVipGroupCategory(Long categoryId, boolean onlySpecialActivity){
+    public Object findByVipGroupCategory(Long categoryId, String studentIds, boolean onlySpecialActivity){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if(sysUser == null){
             return failed("用户信息获取失败");
         }
-        List<VipGroupActivity> vipGroupActivities = vipGroupActivityService.findByVipGroupCategory(categoryId, sysUser.getId());
+
+        if(StringUtils.isBlank(studentIds)){
+            return failed("请选择学员");
+        }
+        List<Integer> userIds = Arrays.stream(studentIds.split(",")).map(id -> Integer.valueOf(id)).collect(Collectors.toList());
+        List<Student> students = studentDao.findByStudentIds(userIds);
+        if(CollectionUtils.isEmpty(students)||students.size()!=userIds.size()){
+            return failed("学员信息不存在");
+        }
+        long newStudentNum = students.stream().filter(s -> s.getIsNewUser()).count();
+
+        Integer applyToStudentType = -1;
+        if(newStudentNum==0){
+            applyToStudentType = 0;
+        }else if(newStudentNum==userIds.size()){
+            applyToStudentType = 1;
+        }
+
+        SysUser student = teacherDao.getUser(userIds.get(0));
+        if(Objects.isNull(student)){
+            return failed("学员信息不存在");
+        }
+        String organIds = student.getOrganId().toString();
+
+        List<VipGroupActivity> vipGroupActivities = vipGroupActivityService.findByVipGroupCategory(categoryId, organIds, sysUser.getId(),applyToStudentType);
         SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.VIP_SPECIAL_ACTIVITY_IDS);
         if(onlySpecialActivity){
             if(Objects.isNull(sysConfig)|| StringUtils.isBlank(sysConfig.getParanValue())){

+ 63 - 2
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -140,6 +140,8 @@ public class ExportController extends BaseController {
     private SysUserCoursesAccountDetailDao sysUserCoursesAccountDetailDao;
     @Autowired
     private ChildrenDayReserveService childrenDayReserveService;
+    @Autowired
+    private IndexErrDataRecordService indexErrDataRecordService;
 
     @ApiOperation(value = "21年暑期考级活动统计页面详情导出")
     @PostMapping("export/statisticsDetail")
@@ -1301,11 +1303,16 @@ public class ExportController extends BaseController {
             if (PaymentStatusEnum.YES.equals(studentApplyDetailDto.getPaymentStatus()) && studentApplyDetailDto.getKitGroupPurchaseTypeEnum() == null) {
                 studentApplyDetailDto.setKitGroupPurchaseTypeEnum(KitGroupPurchaseTypeEnum.OWNED);
             }
+            if(studentApplyDetailDto.getPayingStatus().equals(1)){
+                studentApplyDetailDto.setPayingStatusStr("缴费中");
+            }else if(studentApplyDetailDto.getPayingStatus().equals(2)){
+                studentApplyDetailDto.setPayingStatusStr("审核中");
+            }
         }
         OutputStream outputStream = response.getOutputStream();
         try {
-            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"学生姓名", "家长姓名", "年级", "班级", "性别", "服从调剂", "报名专业", "实际专业", "联系电话", "学员缴费状态", "乐器购买方式"}, new String[]{
-                    "studentName", "parentsName", "currentGrade", "currentClass", "gender.description", "isAllowAdjust.msg", "subjectName", "actualSubjectName", "parentsPhone", "paymentStatus.desc", "kitGroupPurchaseTypeEnum.msg"}, studentApplyDetail);
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"学生姓名", "家长姓名", "年级", "班级", "性别", "服从调剂", "报名专业", "实际专业", "联系电话", "学员缴费状态", "乐器购买方式","缴费中/审核中","是否购买云教练"}, new String[]{
+                    "studentName", "parentsName", "currentGrade", "currentClass", "gender.description", "isAllowAdjust.msg", "subjectName", "actualSubjectName", "parentsPhone", "paymentStatus.desc", "kitGroupPurchaseTypeEnum.msg","payingStatusStr","hasCloudTeacher==1?'有':'没有'"}, studentApplyDetail);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
             response.flushBuffer();
@@ -2942,4 +2949,58 @@ public class ExportController extends BaseController {
             }
         }
     }
+
+    @ApiOperation(value = "首页历史异常统计导出")
+    @RequestMapping("export/exportIndexHistoryErrData")
+    @PreAuthorize("@pcs.hasPermissions('export/exportIndexHistoryErrData')")
+    public void exportIndexHistoryErrData(IndexErrRecordQueryInfo queryInfo, HttpServletResponse response) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        Employee employee = employeeService.get(sysUser.getId());
+        if (StringUtils.isBlank(queryInfo.getOrganIds())) {
+            queryInfo.setOrganIds(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(queryInfo.getOrganIds().split(",")))){
+                throw new BizException("非法请求");
+            }
+        }
+        List<IndexErrorDataExportDto> result = indexErrDataRecordService.queryRecord(queryInfo).getRows();
+        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 = {"generateTime", "organName", "dealUserName", "musicPatrolItem", "musicPatrolItemSurplus", "inspectionItemPlan", "inspectionItemPlanSurplus",
+                    "teacherExceptionAttendance", "teacherExceptionAttendanceSurplus", "teacherNotAClass", "teacherNotAClassSurplus"};
+            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();
+                }
+            }
+        }
+    }
 }

+ 29 - 3
mec-web/src/main/java/com/ym/mec/web/controller/GoodsController.java

@@ -2,11 +2,14 @@ package com.ym.mec.web.controller;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.GoodsCategory;
 import com.ym.mec.biz.dal.entity.GoodsProcurement;
 import com.ym.mec.biz.dal.enums.AccountType;
 import com.ym.mec.biz.service.GoodsCategoryService;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -15,8 +18,10 @@ import io.swagger.annotations.ApiParam;
 
 import java.util.Arrays;
 import java.util.Date;
+import java.util.List;
 import java.util.Objects;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.transaction.annotation.Transactional;
@@ -39,6 +44,8 @@ public class GoodsController extends BaseController {
     private GoodsCategoryService goodsCategoryService;
     @Autowired
     private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private EmployeeDao employeeDao;
 
     @ApiOperation(value = "新增商品(教材、辅件)")
     @PostMapping("/add")
@@ -111,15 +118,34 @@ public class GoodsController extends BaseController {
     @GetMapping("/queryPage")
     @PreAuthorize("@pcs.hasPermissions('goods/queryPage')")
     public Object queryPage(GoodsQueryInfo queryInfo){
-        return succeed(goodsService.queryPage(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(goodsService.queryGoodsPage(queryInfo));
     }
 
     @ApiOperation(value = "通过科目编号、商品分类 查询商品(教材、辅件)列表")
     @GetMapping("/queryGoodsBySubId")
     @PreAuthorize("@pcs.hasPermissions('goods/queryGoodsBySubId')")
     @ApiImplicitParams({ @ApiImplicitParam(name = "subjectId", value = "科目编号", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "organId", value = "分部编号", required = true, dataType = "Integer"),
             @ApiImplicitParam(name = "type", value = "INSTRUMENT 乐器, ACCESSORIES 教辅", required = true, dataType = "String")})
-    public Object findGoodsBySubId(Integer subjectId,String type){
-        return succeed(goodsService.findGoodsBySubId(subjectId,type));
+    public Object findGoodsBySubId(Integer subjectId,String type,Integer organId){
+        if(organId == null){
+            throw new BizException("请选择用户分部");
+        }
+        return succeed(goodsService.findGoodsBySubId(subjectId,type,organId));
     }
 }

+ 197 - 0
mec-web/src/main/java/com/ym/mec/web/controller/IndexErrDataRecordController.java

@@ -0,0 +1,197 @@
+package com.ym.mec.web.controller;
+
+import com.netflix.discovery.converters.Auto;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.auth.api.entity.SysUserRole;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dto.CourseScheduleEndDto;
+import com.ym.mec.biz.dal.dto.IndexErrorDataExportDto;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.InspectionItem;
+import com.ym.mec.biz.dal.entity.InspectionItemPlan;
+import com.ym.mec.biz.dal.page.EndCourseScheduleQueryInfo;
+import com.ym.mec.biz.dal.page.IndexErrRecordQueryInfo;
+import com.ym.mec.biz.dal.page.InspectionItemPlanQueryInfo;
+import com.ym.mec.biz.dal.page.InspectionQueryInfo;
+import com.ym.mec.biz.service.IndexErrDataRecordService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.util.date.DateUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/5/28 0028
+ */
+@Api(tags = "异常数据")
+@RequestMapping("indexErrDataRecord")
+@RestController
+public class IndexErrDataRecordController extends BaseController {
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private EmployeeDao employeeDao;
+    @Autowired
+    private IndexErrDataRecordService indexErrDataRecordService;
+
+    @ApiOperation(value = "历史异常记录")
+    @GetMapping("/queryRecord")
+    @PreAuthorize("@pcs.hasPermissions('indexErrDataRecord/queryRecord')")
+    public HttpResponseResult<PageInfo<IndexErrorDataExportDto>> queryRecord(IndexErrRecordQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        if (StringUtils.isEmpty(queryInfo.getOrganIds())) {
+            queryInfo.setOrganIds(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.getOrganIds().split(",")))) {
+                return failed("非法请求");
+            }
+        }
+        return succeed(indexErrDataRecordService.queryRecord(queryInfo));
+    }
+
+    @ApiOperation(value = "异常记录汇总")
+    @GetMapping("/errDataSummarizing")
+    @PreAuthorize("@pcs.hasPermissions('indexErrDataRecord/errDataSummarizing')")
+    public HttpResponseResult errDataSummarizing(IndexErrRecordQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        if (StringUtils.isEmpty(queryInfo.getOrganIds())) {
+            queryInfo.setOrganIds(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.getOrganIds().split(",")))) {
+                return failed("非法请求");
+            }
+        }
+        return succeed(indexErrDataRecordService.errDataSummarizing(queryInfo));
+    }
+
+    @ApiOperation(value = "获取所有异常相关教务人员")
+    @GetMapping("/getAllEducationUsers")
+    @PreAuthorize("@pcs.hasPermissions('indexErrDataRecord/getAllEducationUsers')")
+    public HttpResponseResult getAllEducationUsers(String organIds){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        if (StringUtils.isEmpty(organIds)) {
+            organIds = employee.getOrganIdList();
+        } else if (StringUtils.isEmpty(employee.getOrganIdList())) {
+            return failed("用户所在分部异常");
+        } else {
+            List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+            if (!list.containsAll(Arrays.asList(organIds.split(",")))) {
+                return failed("非法请求");
+            }
+        }
+        return succeed(indexErrDataRecordService.getAllEducationUsers(organIds));
+    }
+
+    @ApiOperation(value = "乐团巡查事项异常/乐团巡查任务未提交")
+    @GetMapping("/queryErrInspectionData")
+    @PreAuthorize("@pcs.hasPermissions('indexErrDataRecord/queryErrInspectionData')")
+    public HttpResponseResult<PageInfo<InspectionItemPlan>> queryErrInspectionData(InspectionItemPlanQueryInfo 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("非法请求");
+            }
+        }
+        if (queryInfo.getStartTime() != null) {
+            queryInfo.setStartTime(DateUtil.trunc(queryInfo.getStartTime()));
+        }
+        if (queryInfo.getEndTime() != null) {
+            queryInfo.setEndTime(DateUtil.getLastTimeWithDay(queryInfo.getEndTime()));
+        }
+        String startTime = DateUtil.format(DateUtil.getFirstDayOfMonth(DateUtil.addMonths(new Date(), -2)), DateUtil.ISO_EXPANDED_DATE_FORMAT);
+        queryInfo.setSearchStartTime(startTime);
+
+        return succeed(indexErrDataRecordService.queryErrInspectionData(queryInfo));
+    }
+
+    @ApiOperation(value = "回访任务未完成")
+    @GetMapping("/queryErrStudentVisit")
+    @PreAuthorize("@pcs.hasPermissions('indexErrDataRecord/queryErrStudentVisit')")
+    public HttpResponseResult<PageInfo<InspectionItem>> queryErrStudentVisit(InspectionQueryInfo 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("非法请求");
+            }
+        }
+        List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
+        if (!userRole.contains(SysUserRole.SECTION_MANAGER) && !sysUser.getIsSuperAdmin()) {
+            queryInfo.setUserId(sysUser.getId());
+        }
+        String startTime = DateUtil.format(DateUtil.getFirstDayOfMonth(DateUtil.addMonths(new Date(), -2)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
+        queryInfo.setSearchStartTime(startTime);
+        return succeed(indexErrDataRecordService.queryErrStudentVisit(queryInfo));
+    }
+
+    @ApiOperation(value = "课程考勤异常/课程异常")
+    @GetMapping("/queryHistoryErrCourseData")
+    @PreAuthorize("@pcs.hasPermissions('indexErrDataRecord/queryHistoryErrCourseData')")
+    public HttpResponseResult<PageInfo<CourseScheduleEndDto>> queryHistoryErrCourseData(EndCourseScheduleQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        if (org.apache.commons.lang3.StringUtils.isEmpty(queryInfo.getOrganIdList())) {
+            queryInfo.setOrganIdList(employee.getOrganIdList());
+        }else if(org.apache.commons.lang3.StringUtils.isEmpty(employee.getOrganIdList())){
+            return failed("用户所在分部异常");
+        }else {
+            List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+            if(!list.containsAll(Arrays.asList(queryInfo.getOrganIdList().split(",")))){
+                return failed("非法请求");
+            }
+        }
+        return succeed(indexErrDataRecordService.queryHistoryErrCourseData(queryInfo));
+    }
+}

+ 4 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ReplacementInstrumentController.java

@@ -7,6 +7,7 @@ import com.ym.mec.biz.dal.page.ReplacementInstrumentQueryInfo;
 import com.ym.mec.biz.service.ReplacementInstrumentService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -31,6 +32,9 @@ public class ReplacementInstrumentController extends BaseController {
         if (sysUser == null) {
             return failed("用户信息获取失败");
         }
+        if(queryInfo.getOrganId() == null){
+            throw new BizException("参数校验失败:学员分部为空");
+        }
         return succeed(replacementInstrumentService.getPageList(queryInfo));
     }
 

+ 9 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -138,6 +138,9 @@ public class TaskController extends BaseController {
 		}
 	}
 
+	@Autowired
+	private IndexErrDataRecordService indexErrDataRecordService;
+
 	@GetMapping(value = "/autoAffirmReceiveTask")
 	// 自动确认收货
 	public void affirmReceive(){
@@ -430,4 +433,10 @@ public class TaskController extends BaseController {
 	public void checkCloudOrderStart(){
 		cloudTeacherOrderService.checkCloudOrderStart();
 	}
+
+	//历史异常数据记录
+	@GetMapping("/indexErrDataRecordTask")
+	public void indexErrDataRecordTask(String date){
+		indexErrDataRecordService.indexErrDataRecordTask(date);
+	}
 }

+ 33 - 2
mec-web/src/main/java/com/ym/mec/web/controller/VipGroupActivityController.java

@@ -3,8 +3,11 @@ package com.ym.mec.web.controller;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.VipGroupActivityAddDto;
 import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.page.VipGroupActivityQueryInfo;
 import com.ym.mec.biz.service.VipGroupActivityService;
 import com.ym.mec.common.controller.BaseController;
@@ -16,11 +19,13 @@ import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * @Author Joburgess
@@ -38,6 +43,10 @@ public class VipGroupActivityController extends BaseController {
     private SysUserFeignService sysUserFeignService;
 	@Autowired
 	private EmployeeDao employeeDao;
+	@Autowired
+    private TeacherDao teacherDao;
+	@Autowired
+    private StudentDao studentDao;
 
     @ApiOperation(value = "新增vip课活动方案")
     @PostMapping("/addVipGroupActivity")
@@ -95,8 +104,30 @@ public class VipGroupActivityController extends BaseController {
     @ApiOperation(value = "根据课程类型获取对应课程活动方案")
     @GetMapping("/findByVipGroupCategory")
     @PreAuthorize("@pcs.hasPermissions('vipGroupActivity/findByVipGroupCategory')")
-    public Object findByVipGroupCategory(Long categoryId, Integer teacherId){
-        return succeed(vipGroupActivityService.findByVipGroupCategory(categoryId, teacherId));
+    public Object findByVipGroupCategory(Long categoryId, String studentIds, Integer teacherId){
+        if(StringUtils.isBlank(studentIds)){
+            return failed("请选择学员");
+        }
+        List<Integer> userIds = Arrays.stream(studentIds.split(",")).map(id -> Integer.valueOf(id)).collect(Collectors.toList());
+        List<Student> students = studentDao.findByStudentIds(userIds);
+        if(CollectionUtils.isEmpty(students)||students.size()!=userIds.size()){
+            return failed("学员信息不存在");
+        }
+        long newStudentNum = students.stream().filter(s -> s.getIsNewUser()).count();
+
+        Integer applyToStudentType = -1;
+        if(newStudentNum==0){
+            applyToStudentType = 0;
+        }else if(newStudentNum==userIds.size()){
+            applyToStudentType = 1;
+        }
+
+        SysUser student = teacherDao.getUser(userIds.get(0));
+        if(Objects.isNull(student)){
+            return failed("学员信息不存在");
+        }
+        String organIds = student.getOrganId().toString();
+        return succeed(vipGroupActivityService.findByVipGroupCategory(categoryId, organIds, teacherId, applyToStudentType));
     }
 
 }

+ 11 - 5
mec-web/src/main/java/com/ym/mec/web/controller/VipGroupManageController.java

@@ -151,12 +151,18 @@ public class VipGroupManageController extends BaseController {
             return failed("请指定指导老师!");
         }
         if(Objects.isNull(vipGroupApplyDto.getVipGroupApplyBaseInfo().getOrganId())){
-            Employee employee = employeeDao.get(sysUser.getId());
-            if(StringUtils.isEmpty(employee.getOrganIdList()) || employee.getOrganIdList().contains(",")){
-                vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganId(teacher.getTeacherOrganId());
-            }else {
-                vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganId(Integer.parseInt(employee.getOrganIdList()));
+//            Employee employee = employeeDao.get(sysUser.getId());
+//            if(StringUtils.isEmpty(employee.getOrganIdList()) || employee.getOrganIdList().contains(",")){
+//                vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganId(teacher.getTeacherOrganId());
+//            }else {
+//                vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganId(Integer.parseInt(employee.getOrganIdList()));
+//            }
+            Integer firstStudentId = vipGroupApplyDto.getVipGroupApplyBaseInfo().getFirstStudentId();
+            SysUser student = teacherDao.getUser(firstStudentId);
+            if(Objects.isNull(student)||Objects.isNull(student.getOrganId())){
+                return failed("学员信息异常");
             }
+            vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganId(student.getOrganId());
         }
         return vipGroupService.createVipGroup(vipGroupApplyDto);
     }