فهرست منبع

Merge branch 'feature/0427-school' into master_saas

liujc 2 سال پیش
والد
کامیت
f1fd2d03e9
38فایلهای تغییر یافته به همراه1087 افزوده شده و 284 حذف شده
  1. 5 0
      mec-biz/pom.xml
  2. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupDao.java
  3. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupMemberDao.java
  4. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImUserFriendDao.java
  5. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LessonExaminationDao.java
  6. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java
  7. 29 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SchoolIndexStatDto.java
  8. 11 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SysMessageDto.java
  9. 13 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroup.java
  10. 11 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMessage.java
  11. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/SchoolStaffMapper.java
  12. 0 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/school/dto/ClassesForDayDto.java
  13. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/SchoolActivityDetailWrapper.java
  14. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/SchoolActivityWrapper.java
  15. 127 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/SchoolIndexStatWrapper.java
  16. 26 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java
  17. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/SchoolActivityService.java
  18. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SchoolIndexStatService.java
  19. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SchoolStaffService.java
  20. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  21. 0 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  22. 317 190
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java
  23. 11 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolActivityServiceImpl.java
  24. 187 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolIndexStatServiceImpl.java
  25. 57 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolStaffServiceImpl.java
  26. 64 43
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java
  27. 13 2
      mec-biz/src/main/resources/config/mybatis/ImGroupMapper.xml
  28. 10 0
      mec-biz/src/main/resources/config/mybatis/ImGroupMemberMapper.xml
  29. 4 0
      mec-biz/src/main/resources/config/mybatis/ImUserFriendMapper.xml
  30. 25 0
      mec-biz/src/main/resources/config/mybatis/LessonExaminationMapper.xml
  31. 5 0
      mec-biz/src/main/resources/config/mybatis/SchoolStaffMapper.xml
  32. 18 2
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  33. 5 3
      mec-biz/src/main/resources/config/mybatis/SysMessageMapper.xml
  34. 3 2
      mec-web/src/main/java/com/ym/mec/web/controller/SchoolMessageController.java
  35. 14 0
      mec-web/src/main/java/com/ym/mec/web/controller/open/OpenSchoolController.java
  36. 4 5
      mec-web/src/main/java/com/ym/mec/web/controller/school/SchoolActivityController.java
  37. 45 0
      mec-web/src/main/java/com/ym/mec/web/controller/school/SchoolIndexController.java
  38. 2 2
      mec-web/src/main/java/com/ym/mec/web/controller/school/SchoolStaffController.java

+ 5 - 0
mec-biz/pom.xml

@@ -78,6 +78,11 @@
             <artifactId>microsvc-config-validator</artifactId>
             <version>1.0.0</version>
         </dependency>
+        <dependency>
+            <groupId>com.microsvc.toolkit.middleware</groupId>
+            <artifactId>microsvc-middleware-im</artifactId>
+            <version>1.0.0</version>
+        </dependency>
 
 	</dependencies>
 </project>

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

@@ -42,4 +42,8 @@ public interface ImGroupDao extends BaseDAO<String, ImGroup> {
     List<ImGroup> queryByUserIdV2(@Param("userId") Integer userId, @Param("search") String search, @Param("groupType") String groupType, @Param("musicGroupId") String musicGroupId, @Param("classType") String classType);
 
     List<ImGroupMemberDto> queryMemberByIdV2(@Param("imGroupId") String imGroupId, @Param("search") String search, @Param("subjectId") Integer subjectId, @Param("vipFlag") Boolean vipFlag);
+
+    ImGroup queryBySchoolId(@Param("schoolId") Long schoolId);
+
+    List<ImGroup> getByIds(@Param("musicGroupIds") List<String> musicGroupIds);
 }

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

@@ -35,4 +35,8 @@ public interface ImGroupMemberDao extends BaseDAO<Long, ImGroupMember> {
     int countGroupMember(Map<String, Object> params);
 
 	List<ImGroupMemberDto> queryGroupMemberPage(Map<String, Object> params);
+
+    List<ImGroupMember> queryMembersByUserId(@Param("userId") Long userId);
+
+    void deleteByUserId(Long userId);
 }

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

@@ -43,4 +43,11 @@ public interface ImUserFriendDao extends BaseDAO<Long, ImUserFriend> {
     List<NameDto> queryNameByIds(@Param("ids") String ids, @Param("userId") Integer userId);
 
     List<ImUserFriendDto> queryFriendListByUserIdV2(@Param("userId") Integer userId, @Param("search") String search, @Param("musicGroupId") String musicGroupId, @Param("subjectId") Integer subjectId, @Param("vipFlag") Boolean vipFlag);
+
+    /**
+     *  删除好友关系
+     *
+     * @param userId 用户id
+     */
+    void deleteByUserIdAndFriendId(Long userId);
 }

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

@@ -7,6 +7,7 @@ import com.ym.mec.biz.dal.dto.LessonExaminationResultDto2;
 import com.ym.mec.biz.dal.dto.LessonExaminationSaveDto;
 import com.ym.mec.biz.dal.entity.LessonExamination;
 import com.ym.mec.biz.dal.entity.Subject;
+import com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
@@ -40,5 +41,8 @@ public interface LessonExaminationDao extends BaseMapper<LessonExamination> {
     List<LessonExamination> queryEndList();
 
     List<Subject> querySubject(@Param("lessonExaminationId") Long lessonExaminationId);
+
+    SchoolIndexStatWrapper.StudentLesson schoolLessonStat(@Param("musicGroupIds") List<String> musicGroupIds,
+                                                          @Param("queryDto") SchoolIndexStatWrapper.QueryDto queryDto);
 }
 

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

@@ -6,6 +6,7 @@ import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.dal.school.dto.ClassesForDayDto;
 import com.ym.mec.biz.dal.school.dto.CourseStudentDto;
+import com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper;
 import com.ym.mec.biz.dal.wrapper.StudentWrapper;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Delete;
@@ -381,4 +382,15 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
      * @return
      */
     List<StudentAttendance> getStudentAttendance(@Param("param") StudentWrapper.StudentAttendanceQuery studentAttendanceQuery);
+
+    /**
+    * @description: 统计学校端学员考勤信息
+     * @param musicGroupIds
+     * @param queryDto
+    * @return java.util.List<com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper.StudentAttendance>
+    * @author zx
+    * @date 2023/5/12 16:25
+    */
+    SchoolIndexStatWrapper.StudentAttendance statCoopAttendance(@Param("musicGroupIds") List<String> musicGroupIds,
+                                                                      @Param("queryDto") SchoolIndexStatWrapper.QueryDto queryDto);
 }

+ 29 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SchoolIndexStatDto.java

@@ -0,0 +1,29 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SchoolIndexStatDto {
+
+    @ApiModelProperty("年级分布")
+    private List<SchoolIndexStatWrapper.GradeDistribution> gradeDistributions;
+
+    @ApiModelProperty("声部分布")
+    private List<SchoolIndexStatWrapper.SubjectDistribution> subjectDistributions;
+
+    @ApiModelProperty("乐团年级分布")
+    private List<SchoolIndexStatWrapper.MusicGradeDistribution> musicGradeDistributions;
+
+    @ApiModelProperty("年级声部分布")
+    private List<SchoolIndexStatWrapper.SubjectGradeDistribution> subjectGradeDistributions;
+
+    @ApiModelProperty("学员出勤")
+    private SchoolIndexStatWrapper.StudentAttendance studentAttendance;
+
+    @ApiModelProperty("学员练习")
+    private SchoolIndexStatWrapper.StudentLesson studentLessons;
+}

+ 11 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SysMessageDto.java

@@ -7,7 +7,17 @@ public class SysMessageDto extends SysMessage {
 
 	private SysUser user = new SysUser();
 
-	public SysUser getUser() {
+    private String icon;
+
+    public String getIcon() {
+        return icon;
+    }
+
+    public void setIcon(String icon) {
+        this.icon = icon;
+    }
+
+    public SysUser getUser() {
 		return user;
 	}
 

+ 13 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroup.java

@@ -11,6 +11,8 @@ public class ImGroup extends BaseEntity {
 
 	/**  */
 	private String id;
+
+    private Long schoolId;
 	
 	/** 群名称 */
 	private String name;
@@ -37,7 +39,7 @@ public class ImGroup extends BaseEntity {
 		VIP("VIP", "vip课"), DEMO("DEMO", "试听课"), PRACTICE("PRACTICE", "网管课"),
 		SNAP("SNAP","临时班级"), COMM("COMM", "对外课程"), HIGH_ONLINE("HIGH_ONLINE", "线上基础技能课"),
 		MUSIC_NETWORK("MUSIC_NETWORK","乐团网管课"),PARENT_MEETING("PARENT_MEETING","家长会"),
-		TRAINING("TRAINING","训练营"),REPERTOIRE_PLAY("REPERTOIRE_PLAY","曲目演奏课");
+		TRAINING("TRAINING","训练营"),REPERTOIRE_PLAY("REPERTOIRE_PLAY","曲目演奏课"),SHOOL("SCHOOL","学校衔接群");
 
 		private String code;
 
@@ -82,8 +84,16 @@ public class ImGroup extends BaseEntity {
 	
 	/**  */
 	private java.util.Date updateTime;
-	
-	public void setId(String id){
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public void setId(String id){
 		this.id = id;
 	}
 	

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

@@ -15,6 +15,8 @@ public class SysMessage extends BaseEntity {
 
 	/** 主键 */
 	private Long id;
+
+    private Integer messageConfigId;
 	
 	/** 标题 */
 	@ApiModelProperty(value = "标题",required = false)
@@ -72,7 +74,15 @@ public class SysMessage extends BaseEntity {
 		return jpushType;
 	}
 
-	public void setJpushType(String jpushType) {
+    public Integer getMessageConfigId() {
+        return messageConfigId;
+    }
+
+    public void setMessageConfigId(Integer messageConfigId) {
+        this.messageConfigId = messageConfigId;
+    }
+
+    public void setJpushType(String jpushType) {
 		this.jpushType = jpushType;
 	}
 

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/SchoolStaffMapper.java

@@ -39,4 +39,6 @@ public interface SchoolStaffMapper extends BaseMapper<SchoolStaff> {
      * @param cooperationOrganId 合作单位ID
      */
     void updateStatusAndRecoveryStatus(@Param("status") Boolean status, @Param("cooperationOrganId") Integer cooperationOrganId);
+
+    void delUser(@Param("userId") Long userId);
 }

+ 0 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/school/dto/ClassesForDayDto.java

@@ -49,9 +49,6 @@ public class ClassesForDayDto {
     @ApiModelProperty(value = "旷课人数",required = false)
     private Integer attendanceTruantNum;
 
-    @ApiModelProperty(value = "退学人数",required = false)
-    private Integer attendanceDropNum;
-
     @ApiModelProperty(value = "教学模式",required = false)
     private TeachModeEnum teachMode;
 

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/SchoolActivityDetailWrapper.java

@@ -61,7 +61,7 @@ public class SchoolActivityDetailWrapper {
     }  
 
     @Data
-	@ApiModel(" SchoolActivityDetail-活动详情")
+	@ApiModel(" SchoolActivityDetail-活动详情列表")
     public static class SchoolActivityDetail {
 
         @ApiModelProperty("活动详情编号")

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/SchoolActivityWrapper.java

@@ -110,8 +110,8 @@ public class SchoolActivityWrapper {
 
 
     @Data
-    @ApiModel(" SchoolActivityDetail-学校活动详情")
-    public static class SchoolActivityDetail {
+    @ApiModel(" SchoolActivityInfo-学校活动详情")
+    public static class SchoolActivityInfo {
 
         @ApiModelProperty("活动编号")
         @NotNull(message = "活动编号不能为空",groups = {ValidGroups.Update.class})

+ 127 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/SchoolIndexStatWrapper.java

@@ -0,0 +1,127 @@
+package com.ym.mec.biz.dal.wrapper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+public class SchoolIndexStatWrapper {
+
+    @Data
+    @ApiModel(" QueryDto-查询接口参数")
+    public static class QueryDto {
+
+        @ApiModelProperty("合作单位编号")
+        private Integer coopId;
+
+        @ApiModelProperty("乐团编号")
+        private String musicGroupId;
+
+        @ApiModelProperty("开始时间(年月日)")
+        private String startTime;
+
+        @ApiModelProperty("截止时间(年月日)")
+        private String endTime;
+    }
+
+    @Data
+    @ApiModel(" GradeDistribution-年级分布")
+    public static class GradeDistribution {
+
+        @ApiModelProperty("年级")
+        private String grade;
+
+        @ApiModelProperty("在读人数")
+        private Long studentNum;
+    }
+
+    @Data
+    @ApiModel(" GradeDistribution-声部分布")
+    public static class SubjectDistribution {
+
+        @ApiModelProperty("声部")
+        private String subjectName;
+
+        @ApiModelProperty("在读人数")
+        private Long studentNum;
+    }
+
+    @Data
+    @ApiModel(" MusicGradeDistribution-乐团年级分布")
+    public static class MusicGradeDistribution {
+
+        @ApiModelProperty("乐团名称")
+        private String musicGroupName;
+
+        @ApiModelProperty("声部名称")
+        private String subjectName;
+
+        @ApiModelProperty("声部编号")
+        private Integer subjectId;
+
+        @ApiModelProperty("年级")
+        private String grade;
+
+        @ApiModelProperty("在读人数")
+        private Long studentNum;
+    }
+
+    @Data
+    @ApiModel(" MusicGradeDistribution-声部年级分布")
+    public static class SubjectGradeDistribution {
+
+        @ApiModelProperty("声部编号")
+        private Integer subjectId;
+
+        @ApiModelProperty("声部名称")
+        private String subjectName;
+
+        @ApiModelProperty("年级")
+        private String grade;
+
+        @ApiModelProperty("在读人数")
+        private Long studentNum;
+    }
+
+    @Data
+    @ApiModel(" StudentAttendance-学员考勤数据")
+    public static class StudentAttendance {
+
+        @ApiModelProperty("正常人数")
+        private Integer normalNum = 0;
+
+        @ApiModelProperty("迟到人数")
+        private Integer lateNum = 0;
+
+        @ApiModelProperty("旷课人数")
+        private Integer truantNum = 0;
+
+        @ApiModelProperty("请假人数")
+        private Integer leaveNum = 0;
+
+        @ApiModelProperty("总人数")
+        private Integer totalNum = 0;
+
+        @ApiModelProperty("出勤率")
+        private Integer attendanceRate = 0;
+    }
+
+    @Data
+    @ApiModel(" StudentLesson-学员练习数据")
+    public static class StudentLesson {
+
+        @ApiModelProperty("应交人数")
+        private Integer expectNum;
+
+        @ApiModelProperty("实际提交人数")
+        private Integer actualNum;
+
+        @ApiModelProperty("合格提交人数")
+        private Integer passNum;
+
+        @ApiModelProperty("提交率")
+        private Integer commitRate;
+
+        @ApiModelProperty("合格率")
+        private Integer passRate;
+    }
+}

+ 26 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java

@@ -1,9 +1,11 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.ImGroupDto;
 import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import com.ym.mec.biz.dal.dto.NameDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
+import com.ym.mec.biz.dal.enums.school.ESchoolStaffType;
 import com.ym.mec.common.service.BaseService;
 
 import java.util.Arrays;
@@ -96,4 +98,28 @@ public interface ImGroupService extends BaseService<String, ImGroup> {
     List<ImGroup> queryByUserIdV2(Integer userId, String search, String groupType, String musicGroupId, String classType);
 
     List<ImGroupMemberDto> queryMemberByIdV2(String imGroupId,String search,Integer subjectId,Boolean vipFlag);
+
+    /**
+     * 用户退出所有群
+     *
+     * @param userId 用户id
+     */
+    void quit(Long userId);
+
+    /**
+     * 用户加入群
+     *
+     * @param schoolId 学校id
+     * @param userId 用户id
+     * @param leader 是否是群主
+     */
+    void addSchoolStaffGroup(Long schoolId, Integer userId, ESchoolStaffType leader) throws Exception;
+
+    /**
+     * 加群
+     *
+     * @param musicGroupIds 群组ID
+     * @param user 用户信息
+     */
+    void addImGroup(List<String> musicGroupIds, SysUser user);
 }

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

@@ -18,7 +18,7 @@ public interface SchoolActivityService extends IService<SchoolActivity>  {
      * @param id 详情ID
      * @return SchoolActivity
      */
-    SchoolActivityWrapper.SchoolActivityDetail detail(Long id);
+    SchoolActivityWrapper.SchoolActivityInfo detail(Long id);
 
     /**
      * 分页查询
@@ -33,14 +33,14 @@ public interface SchoolActivityService extends IService<SchoolActivity>  {
      * @param schoolActivity SchoolActivityWrapper.SchoolActivity
      * @return Boolean
      */
-     Boolean add(SchoolActivityWrapper.SchoolActivityDetail schoolActivity);
+     Boolean add(SchoolActivityWrapper.SchoolActivityInfo schoolActivity);
 
     /**
      * 更新
      * @param schoolActivity SchoolActivityWrapper.SchoolActivity
      * @return Boolean
      */
-     Boolean update(SchoolActivityWrapper.SchoolActivityDetail schoolActivity);
+     Boolean update(SchoolActivityWrapper.SchoolActivityInfo schoolActivity);
 
     /**
      * 获取学生列表

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SchoolIndexStatService.java

@@ -0,0 +1,34 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.dto.SchoolIndexStatDto;
+import com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper;
+
+public interface SchoolIndexStatService{
+
+    /**
+    * @description: 学校首页统计
+     * @param queryDto
+    * @return com.ym.mec.biz.dal.dto.SchoolIndexStatDto
+    * @author zx
+    * @date 2023/5/12 10:57
+    */
+    SchoolIndexStatDto stat(SchoolIndexStatWrapper.QueryDto queryDto);
+
+    /**
+    * @description: 学员出勤统计
+     * @param queryDto
+    * @return com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper.StudentAttendance
+    * @author zx
+    * @date 2023/5/12 17:05
+    */
+    SchoolIndexStatWrapper.StudentAttendance attendanceStat(SchoolIndexStatWrapper.QueryDto queryDto);
+
+    /**
+    * @description: 学员练习统计
+     * @param queryDto
+    * @return com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper.StudentLesson
+    * @author zx
+    * @date 2023/5/12 17:05
+    */
+    SchoolIndexStatWrapper.StudentLesson lessonStat(SchoolIndexStatWrapper.QueryDto queryDto);
+}

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

@@ -68,4 +68,10 @@ public interface SchoolStaffService extends IService<SchoolStaff>  {
      * @param info SchoolStaffWrapper.Cooperation
      */
     void updateCooperation(SchoolStaffWrapper.Cooperation info);
+
+    /**
+     * 删除用户
+     * @param id 用户ID
+     */
+    Boolean del(Long id);
 }

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

@@ -399,6 +399,8 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     String TENANT_CLOUD_ROOM_BALANCE_NOTICE = "tenant_cloud_room_balance_notice_";
     // 学校端默认用户头象
     String USER_DEFAULT_AVATAR = "user_default_avatar";
+    // IM服务方案(rongCloud,tencentCloud
+    String IM_SERVICE_PROVIDER = "im_service_provider";
 
     // 游客默认头像
     String VISITOR_DEFAULT_AVATAR = "visitor_default_avatar";

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

@@ -6267,7 +6267,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					dto.setAttendanceLateNum(dayDto.getAttendanceLateNum());
 					dto.setAttendanceLeaveNum(dayDto.getAttendanceLeaveNum());
 					dto.setAttendanceTruantNum(dayDto.getAttendanceTruantNum());
-					dto.setAttendanceDropNum(dayDto.getAttendanceDropNum());
 				}
 				Long homeworkId = homeworkMap.get(dayDto.getCourseId());
 				if(homeworkId != null){

+ 317 - 190
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java

@@ -1,5 +1,9 @@
 package com.ym.mec.biz.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.microsvc.toolkit.middleware.im.ImPluginContext;
+import com.microsvc.toolkit.middleware.im.ImPluginService;
+import com.microsvc.toolkit.middleware.im.message.ImGroupMemberWrapper;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.ImGroupDao;
@@ -11,8 +15,10 @@ import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import com.ym.mec.biz.dal.dto.NameDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
 import com.ym.mec.biz.dal.entity.ImGroupMember;
+import com.ym.mec.biz.dal.enums.school.ESchoolStaffType;
 import com.ym.mec.biz.service.ImGroupMemberService;
 import com.ym.mec.biz.service.ImGroupService;
+import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImUserModel;
@@ -22,6 +28,7 @@ import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.im.entity.GroupMember;
 import com.ym.mec.im.entity.GroupModel;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,216 +40,222 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
+@Slf4j
 public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> implements ImGroupService {
 
-	@Autowired
-	private ImGroupDao imGroupDao;
-
-	@Autowired
-	private ImGroupMemberDao imGroupMemberDao;
-
-	@Autowired
-	private ImGroupNoticeDao imGroupNoticeDao;
-
-	@Autowired
-	private ImGroupMemberService imGroupMemberService;
-
-	@Autowired
-	private ImFeignService imFeignService;
-
-	@Autowired
-	private SysUserService sysUserService;
-
-	@Autowired
-	private ImUserFriendDao imUserFriendDao;
-
-	@Override
-	public BaseDAO<String, ImGroup> getDAO() {
-		return imGroupDao;
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public ImGroup create(String id, Integer userId, String name, String introduce, String memo, String tags, String img, String type, ImGroup.GroupTypeEnum groupType) {
-		ImGroup imGroup = imGroupDao.get(id);
-		if (imGroup != null) {
-			return imGroup;
-		}
-
-		imGroup = new ImGroup();
-
-		Date date = new Date();
-
-		imGroup.setId(id);
-		imGroup.setCreateTime(date);
-		imGroup.setIntroduce(introduce);
-		
-		if(userId != null){
-			imGroup.setMemberNum(1);
-		}else{
-			imGroup.setMemberNum(0);
-		}
-		imGroup.setMemo(memo);
-		imGroup.setName(name);
-		imGroup.setTags(tags);
-		imGroup.setImg(img);
-		imGroup.setType(type);
-		imGroup.setGroupType(groupType);
-		imGroup.setUpdateTime(date);
-		imGroupDao.insert(imGroup);
-
-		String groupId = imGroup.getId();
-		
-		if(userId != null){
-			imGroupMemberService.join(id, userId, null, true);
-
-			GroupMember groupMember = new GroupMember(userId.toString(), groupId);
-
-			imFeignService.groupCreate(new GroupModel(groupId, new GroupMember[] { groupMember }, name));
-		}else{
-			imFeignService.groupCreate(new GroupModel(groupId, null, name));
-		}
-
-		return imGroup;
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public String createGroup(ImGroupDto imGroupDto){
-		List<String> userIdList = imGroupDto.getUserIdList();
-		Integer currentUserId = null;
-		if (CollectionUtils.isEmpty(userIdList)){
-			userIdList.add(sysUserService.getUserId().toString());
-		}
-		String groupName = imGroupDto.getGroupName();
-		String type = imGroupDto.getType();
-		Optional.ofNullable(groupName).filter(StringUtils::isNotBlank).orElseThrow(() -> new BizException("群名称不能为空"));
-		Optional.ofNullable(type).filter(StringUtils::isNotBlank).orElseThrow(() -> new BizException("群类型不能为空"));
-		Date date = new Date();
-		ImGroup imGroup = new ImGroup();
-		String groupId = UUID.randomUUID().toString();
-		imGroup.setId(groupId);
-		imGroup.setCreateTime(date);
-		imGroup.setIntroduce(groupName);
-		imGroup.setMemo(groupName);
-		imGroup.setMemberNum(userIdList.size());
-		imGroup.setName(groupName);
-		imGroup.setType(type);
-		imGroup.setGroupType(imGroupDto.getGroupType());
-		imGroup.setUpdateTime(date);
-		imGroupDao.insert(imGroup);
-		List<ImGroupMember> groupMemberList = imGroupMemberDao.queryMembers(groupId, userIdList, TenantContextHolder.getTenantId());
-		if(currentUserId != null){
-			groupMemberList.get(0).setRoleType("乐团主管");
-		}
-		imGroupMemberDao.batchInsert(groupMemberList);
+    @Autowired
+    private ImGroupDao imGroupDao;
+
+    @Autowired
+    private ImGroupMemberDao imGroupMemberDao;
+
+    @Autowired
+    private ImGroupNoticeDao imGroupNoticeDao;
+
+    @Autowired
+    private ImGroupMemberService imGroupMemberService;
+
+    @Autowired
+    private ImFeignService imFeignService;
+
+    @Autowired
+    private SysUserService sysUserService;
+
+    @Autowired
+    private ImUserFriendDao imUserFriendDao;
+
+    @Autowired
+    private SysConfigService sysConfigService;
+    @Autowired
+    private ImPluginContext imPluginContext;
+
+    @Override
+    public BaseDAO<String, ImGroup> getDAO() {
+        return imGroupDao;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public ImGroup create(String id, Integer userId, String name, String introduce, String memo, String tags, String img, String type, ImGroup.GroupTypeEnum groupType) {
+        ImGroup imGroup = imGroupDao.get(id);
+        if (imGroup != null) {
+            return imGroup;
+        }
+
+        imGroup = new ImGroup();
+
+        Date date = new Date();
+
+        imGroup.setId(id);
+        imGroup.setCreateTime(date);
+        imGroup.setIntroduce(introduce);
+
+        if(userId != null){
+            imGroup.setMemberNum(1);
+        }else{
+            imGroup.setMemberNum(0);
+        }
+        imGroup.setMemo(memo);
+        imGroup.setName(name);
+        imGroup.setTags(tags);
+        imGroup.setImg(img);
+        imGroup.setType(type);
+        imGroup.setGroupType(groupType);
+        imGroup.setUpdateTime(date);
+        imGroupDao.insert(imGroup);
+
+        String groupId = imGroup.getId();
+
+        if(userId != null){
+            imGroupMemberService.join(id, userId, null, true);
+
+            GroupMember groupMember = new GroupMember(userId.toString(), groupId);
+
+            imFeignService.groupCreate(new GroupModel(groupId, new GroupMember[] { groupMember }, name));
+        }else{
+            imFeignService.groupCreate(new GroupModel(groupId, null, name));
+        }
+
+        return imGroup;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String createGroup(ImGroupDto imGroupDto){
+        List<String> userIdList = imGroupDto.getUserIdList();
+        Integer currentUserId = null;
+        if (CollectionUtils.isEmpty(userIdList)){
+            userIdList.add(sysUserService.getUserId().toString());
+        }
+        String groupName = imGroupDto.getGroupName();
+        String type = imGroupDto.getType();
+        Optional.ofNullable(groupName).filter(StringUtils::isNotBlank).orElseThrow(() -> new BizException("群名称不能为空"));
+        Optional.ofNullable(type).filter(StringUtils::isNotBlank).orElseThrow(() -> new BizException("群类型不能为空"));
+        Date date = new Date();
+        ImGroup imGroup = new ImGroup();
+        String groupId = UUID.randomUUID().toString();
+        imGroup.setId(groupId);
+        imGroup.setCreateTime(date);
+        imGroup.setIntroduce(groupName);
+        imGroup.setMemo(groupName);
+        imGroup.setMemberNum(userIdList.size());
+        imGroup.setName(groupName);
+        imGroup.setType(type);
+        imGroup.setGroupType(imGroupDto.getGroupType());
+        imGroup.setUpdateTime(date);
+        imGroupDao.insert(imGroup);
+        List<ImGroupMember> groupMemberList = imGroupMemberDao.queryMembers(groupId, userIdList, TenantContextHolder.getTenantId());
+        if(currentUserId != null){
+            groupMemberList.get(0).setRoleType("乐团主管");
+        }
+        imGroupMemberDao.batchInsert(groupMemberList);
         Function<String,GroupMember> newGroup = userId ->new GroupMember(userId, groupId);
-		List<GroupMember> groupMembers =  userIdList.stream().map(newGroup).collect(Collectors.toList());
-		GroupMember[] members = new GroupMember[groupMembers.size()];
-		groupMembers.toArray(members);
-		imFeignService.groupCreate(new GroupModel(groupId,members,groupName));
+        List<GroupMember> groupMembers =  userIdList.stream().map(newGroup).collect(Collectors.toList());
+        GroupMember[] members = new GroupMember[groupMembers.size()];
+        groupMembers.toArray(members);
+        imFeignService.groupCreate(new GroupModel(groupId,members,groupName));
         return groupId;
-	}
+    }
 
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public boolean cancel(String imGroupId) {
-		// 删除群成员
-		imGroupMemberDao.deleteByImGroupId(imGroupId);
-		// 删除群公告
-		imGroupNoticeDao.deleteByImGroupId(imGroupId);
-		// 删除群信息
-		imGroupDao.delete(imGroupId);
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean cancel(String imGroupId) {
+        // 删除群成员
+        imGroupMemberDao.deleteByImGroupId(imGroupId);
+        // 删除群公告
+        imGroupNoticeDao.deleteByImGroupId(imGroupId);
+        // 删除群信息
+        imGroupDao.delete(imGroupId);
+
+        imFeignService.groupDismiss(new GroupModel(imGroupId, null));
+
+        return true;
+    }
 
-		imFeignService.groupDismiss(new GroupModel(imGroupId, null));
+    @Override
+    public List<ImGroup> queryByUserId(Integer userId, String search,String groupType) {
+        return imGroupDao.queryByUserId(userId, search,groupType);
+    }
 
-		return true;
-	}
+    @Override
+    public List<ImGroupMemberDto> queryMemberById(String imGroupId) {
+        return imGroupDao.queryMemberById(imGroupId);
+    }
 
     @Override
-    public List<ImGroup> queryByUserId(Integer userId, String search,String groupType) {
-		return imGroupDao.queryByUserId(userId, search,groupType);
+    public ImGroupMemberDto queryMember(String imGroupId, Integer userId) {
+        ImGroupMemberDto imGroupMemberDto = imGroupDao.queryMember(imGroupId, userId);
+        if(Objects.isNull(imGroupMemberDto)){
+            imGroupMemberDto = imGroupDao.queryMember(null, userId);
+            if (Objects.nonNull(imGroupMemberDto)){
+                imGroupMemberDto.setRoleType(null);
+            }
+        }
+        return imGroupMemberDto;
     }
 
     @Override
-	public List<ImGroupMemberDto> queryMemberById(String imGroupId) {
-		return imGroupDao.queryMemberById(imGroupId);
-	}
-
-	@Override
-	public ImGroupMemberDto queryMember(String imGroupId, Integer userId) {
-		ImGroupMemberDto imGroupMemberDto = imGroupDao.queryMember(imGroupId, userId);
-		if(Objects.isNull(imGroupMemberDto)){
-			imGroupMemberDto = imGroupDao.queryMember(null, userId);
-			if (Objects.nonNull(imGroupMemberDto)){
-				imGroupMemberDto.setRoleType(null);
-			}
-		}
-		return imGroupMemberDto;
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public int updateNickName(Integer userId, String nickName) {
-		//修改群成员备注
-		int i = imGroupDao.updateNickname(userId, nickName);
-		imGroupDao.updateUserFriendNickname(userId, nickName);
-		return i;
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void updateNickName1(Integer userId, String nickName) {
-		//修改群成员备注
-		imGroupDao.updateNickname(userId, nickName);
-		imGroupDao.updateUserFriendNickname(userId, nickName);
-		//修改sysUser名称,如果包含学员的角色,那么修改userName。否则修改realName
-		SysUser sysUser = sysUserService.queryUserById(userId);
-		if(sysUser.getUserType().contains("STUDENT")){
-			sysUser.setUsername(nickName);
-		}else {
-			sysUser.setRealName(nickName);
-		}
-		sysUserService.updateSysUser(sysUser);
-		//同步融云基本信息
-		imFeignService.update(new ImUserModel(sysUser.getId().toString(),nickName,sysUser.getAvatar()));
-	}
+    @Transactional(rollbackFor = Exception.class)
+    public int updateNickName(Integer userId, String nickName) {
+        //修改群成员备注
+        int i = imGroupDao.updateNickname(userId, nickName);
+        imGroupDao.updateUserFriendNickname(userId, nickName);
+        return i;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateNickName1(Integer userId, String nickName) {
+        //修改群成员备注
+        imGroupDao.updateNickname(userId, nickName);
+        imGroupDao.updateUserFriendNickname(userId, nickName);
+        //修改sysUser名称,如果包含学员的角色,那么修改userName。否则修改realName
+        SysUser sysUser = sysUserService.queryUserById(userId);
+        if(sysUser.getUserType().contains("STUDENT")){
+            sysUser.setUsername(nickName);
+        }else {
+            sysUser.setRealName(nickName);
+        }
+        sysUserService.updateSysUser(sysUser);
+        //同步融云基本信息
+        imFeignService.update(new ImUserModel(sysUser.getId().toString(),nickName,sysUser.getAvatar()));
+    }
 
     @Override
-	@Transactional(rollbackFor = Exception.class)
+    @Transactional(rollbackFor = Exception.class)
     public void updateImGroup(ImGroup imGroup) {
-		imGroup.setMemberNum(null);
-		imGroupDao.update(imGroup);
-		imFeignService.groupUpdate(new GroupModel(imGroup.getId(),null,imGroup.getName()));
+        imGroup.setMemberNum(null);
+        imGroupDao.update(imGroup);
+        imFeignService.groupUpdate(new GroupModel(imGroup.getId(),null,imGroup.getName()));
     }
 
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void dismissGroup(String imGroupId) {
-		imFeignService.groupDismiss(new GroupModel(imGroupId, null));
-		imGroupDao.delete(imGroupId);
-		imGroupMemberDao.deleteByImGroupId(imGroupId);
-		imGroupNoticeDao.deleteByImGroupId(imGroupId);
-	}
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void dismissGroup(String imGroupId) {
+        imFeignService.groupDismiss(new GroupModel(imGroupId, null));
+        imGroupDao.delete(imGroupId);
+        imGroupMemberDao.deleteByImGroupId(imGroupId);
+        imGroupNoticeDao.deleteByImGroupId(imGroupId);
+    }
 
     @Override
     public List<NameDto> queryDetail(List<NameDto> nameDto) {
-		List<NameDto> dtos = new ArrayList<>();
-		if(CollectionUtils.isNotEmpty(nameDto)){
-			Map<Integer, List<NameDto>> collect = nameDto.stream().collect(Collectors.groupingBy(NameDto::getType));
-			for (Integer integer : collect.keySet()) {
-				List<NameDto> nameDtos = collect.get(integer);
-				if(CollectionUtils.isNotEmpty(nameDtos)){
-					String idList = nameDtos.stream().map(e -> e.getId()).collect(Collectors.joining(","));
-					if(integer.equals(3)){
-						dtos.addAll(imGroupDao.queryNameByIds(idList));
-					}else if (integer.equals(1)){
-						Integer userId = sysUserService.getUserId();
-						dtos.addAll(imUserFriendDao.queryNameByIds(idList,userId));
-					}
-				}
-			}
-		}
+        List<NameDto> dtos = new ArrayList<>();
+        if(CollectionUtils.isNotEmpty(nameDto)){
+            Map<Integer, List<NameDto>> collect = nameDto.stream().collect(Collectors.groupingBy(NameDto::getType));
+            for (Integer integer : collect.keySet()) {
+                List<NameDto> nameDtos = collect.get(integer);
+                if(CollectionUtils.isNotEmpty(nameDtos)){
+                    String idList = nameDtos.stream().map(e -> e.getId()).collect(Collectors.joining(","));
+                    if(integer.equals(3)){
+                        dtos.addAll(imGroupDao.queryNameByIds(idList));
+                    }else if (integer.equals(1)){
+                        Integer userId = sysUserService.getUserId();
+                        dtos.addAll(imUserFriendDao.queryNameByIds(idList,userId));
+                    }
+                }
+            }
+        }
         return dtos;
     }
 
@@ -255,4 +268,118 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
     public List<ImGroupMemberDto> queryMemberByIdV2(String imGroupId, String search, Integer subjectId, Boolean vipFlag) {
         return imGroupDao.queryMemberByIdV2(imGroupId,search,subjectId,vipFlag);
     }
+
+    /**
+     * 用户退出所有群
+     *
+     * @param userId 用户id
+     */
+    @Override
+    public void quit(Long userId) {
+
+        // 退出群组
+        // 查询用户默认头象
+        String serviceProvider = sysConfigService.findByParamName(SysConfigService.IM_SERVICE_PROVIDER).getParanValue();
+
+        ImPluginService imPluginService =imPluginContext.getPluginService(serviceProvider);
+
+        List<ImGroupMember> imGroupMembers = imGroupMemberDao.queryMembersByUserId(userId);
+        if (CollectionUtils.isNotEmpty(imGroupMembers)) {
+            for (ImGroupMember imGroupMember : imGroupMembers) {
+                try {
+                    imPluginService.groupQuit(imGroupMember.getImGroupId(), ImGroupMemberWrapper.ImGroupMember.builder().userId(userId).build());
+                } catch (Exception e) {
+                    log.error("用户退出群失败{},{}", userId, imGroupMember.getImGroupId(), e);
+                }
+            }
+        }
+        imGroupMemberDao.deleteByUserId(userId);
+    }
+
+    /**
+     * 用户加入群
+     *
+     * @param schoolId 学校id
+     * @param userId   用户id
+     * @param leader   是否是群主
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addSchoolStaffGroup(Long schoolId, Integer userId, ESchoolStaffType schoolStaffType) throws Exception {
+
+        // 查询群是否存在
+        ImGroup imGroup = imGroupDao.queryBySchoolId(schoolId);
+
+        String serviceProvider = sysConfigService.findByParamName(SysConfigService.IM_SERVICE_PROVIDER).getParanValue();
+
+        ImPluginService imPluginService =imPluginContext.getPluginService(serviceProvider);
+
+        if (Objects.isNull(imGroup)) {
+            imGroup = new ImGroup();
+            imGroup.setSchoolId(schoolId);
+            imGroup.setId(IdWorker.getIdStr());
+            imGroup.setName("教学团队衔接群");
+            imGroup.setIntroduce(imGroup.getName());
+            imGroup.setMemberNum(1);
+            imGroup.setType(ImGroup.GroupTypeEnum.SHOOL.getCode());
+            imGroup.setGroupType(ImGroup.GroupTypeEnum.SHOOL);
+            imGroup.setCreateTime(new Date());
+            imGroup.setUpdateTime(new Date());
+            imGroup.setTenantId(TenantContextHolder.getTenantId());
+            imGroupDao.insert(imGroup);
+            imPluginService.groupCreate(imGroup.getId(), imGroup.getName(), userId.toString());
+        } else {
+
+            if (!schoolStaffType.equals(ESchoolStaffType.ORCHESTRA_LEADER)) {
+                imPluginService.groupJoin(imGroup.getId(), imGroup.getName(), ImGroupMemberWrapper.ImGroupMember.builder().userId(userId.longValue()).build());
+            } else {
+
+            }
+        }
+        ImGroupMember imGroupMember = new ImGroupMember();
+        imGroupMember.setImGroupId(imGroup.getId());
+        imGroupMember.setUserId(userId);
+        imGroupMember.setIsAdmin(schoolStaffType.equals(ESchoolStaffType.ORCHESTRA_LEADER));
+        imGroupMember.setRoleType(schoolStaffType.getDescribe());
+        imGroupMember.setTenantId(imGroup.getTenantId());
+        imGroupMemberDao.insert(imGroupMember);
+
+
+    }
+
+    /**
+     * 加群
+     *
+     * @param musicGroupIds 群组ID
+     * @param user          用户信息
+     */
+    @Override
+    public void addImGroup(List<String> musicGroupIds, SysUser user) {
+        if (CollectionUtils.isEmpty(musicGroupIds)) {
+            return;
+        }
+
+        String serviceProvider = sysConfigService.findByParamName(SysConfigService.IM_SERVICE_PROVIDER).getParanValue();
+
+        ImPluginService imPluginService =imPluginContext.getPluginService(serviceProvider);
+
+        List<ImGroup> groupList = imGroupDao.getByIds(musicGroupIds);
+
+        // id 分组
+        Map<String, ImGroup> map = groupList.stream().collect(Collectors.toMap(o -> o.getId(), Function.identity()));
+
+
+        for (String musicGroupId : musicGroupIds) {
+            ImGroup imGroup = map.get(musicGroupId);
+            if (imGroup == null) {
+                continue;
+            }
+            try {
+                imPluginService.groupJoin(imGroup.getId(), imGroup.getName(), ImGroupMemberWrapper.ImGroupMember.builder().userId(user.getId().longValue()).build());
+            } catch (Exception e) {
+                log.error("加入群聊失败",e);
+            }
+
+        }
+    }
 }

+ 11 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolActivityServiceImpl.java

@@ -3,16 +3,12 @@ package com.ym.mec.biz.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.google.common.collect.Lists;
 import com.ym.mec.biz.dal.entity.SchoolActivityDetail;
-import com.ym.mec.biz.dal.entity.Student;
-import com.ym.mec.biz.dal.entity.Subject;
 import com.ym.mec.biz.dal.enums.ESchoolActivityStatus;
 import com.ym.mec.biz.dal.wrapper.SchoolActivityDetailWrapper;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.exception.BizException;
 import org.apache.commons.collections.CollectionUtils;
-import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.BeanUtils;
@@ -50,27 +46,27 @@ public class SchoolActivityServiceImpl extends ServiceImpl<SchoolActivityMapper,
      * @return SchoolActivity
      */
     @Override
-    public SchoolActivityWrapper.SchoolActivityDetail detail(Long id) {
+    public SchoolActivityWrapper.SchoolActivityInfo detail(Long id) {
         SchoolActivity schoolActivity = getById(id);
         if(schoolActivity == null)
             return null;
-        SchoolActivityWrapper.SchoolActivityDetail schoolActivityDetail = new SchoolActivityWrapper.SchoolActivityDetail();
-        BeanUtils.copyProperties(schoolActivity, schoolActivityDetail);
+        SchoolActivityWrapper.SchoolActivityInfo schoolActivityInfo = new SchoolActivityWrapper.SchoolActivityInfo();
+        BeanUtils.copyProperties(schoolActivity, schoolActivityInfo);
         Date now = new Date();
         if (schoolActivity.getStartTime().after(now)) {
-            schoolActivityDetail.setStatus(ESchoolActivityStatus.NOT_START);
+            schoolActivityInfo.setStatus(ESchoolActivityStatus.NOT_START);
         } else if (schoolActivity.getEndTime().before(now)) {
-            schoolActivityDetail.setStatus(ESchoolActivityStatus.END);
+            schoolActivityInfo.setStatus(ESchoolActivityStatus.END);
         } else {
-            schoolActivityDetail.setStatus(ESchoolActivityStatus.PROCESSING);
+            schoolActivityInfo.setStatus(ESchoolActivityStatus.PROCESSING);
         }
 
         // 设置节目信息
         List<SchoolActivityDetailWrapper.SchoolActivityDetail> schoolActivityDetails = schoolActivityDetailService.selectListByActivityId(id);
 
-        schoolActivityDetail.setDetail(schoolActivityDetails);
+        schoolActivityInfo.setDetail(schoolActivityDetails);
 
-        return schoolActivityDetail;
+        return schoolActivityInfo;
     }
     
     /**
@@ -106,14 +102,14 @@ public class SchoolActivityServiceImpl extends ServiceImpl<SchoolActivityMapper,
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean add(SchoolActivityWrapper.SchoolActivityDetail schoolActivity) {
+    public Boolean add(SchoolActivityWrapper.SchoolActivityInfo schoolActivity) {
 
         saveOrUpdate(schoolActivity,true);
 
         return true;
     }
 
-    private void saveOrUpdate(SchoolActivityWrapper.SchoolActivityDetail schoolActivity,Boolean create) {
+    private void saveOrUpdate(SchoolActivityWrapper.SchoolActivityInfo schoolActivity, Boolean create) {
         Date now = new Date();
         // 保存活动
         SchoolActivity activity = JSON.parseObject(JSON.toJSONString(schoolActivity), SchoolActivity.class);
@@ -171,7 +167,7 @@ public class SchoolActivityServiceImpl extends ServiceImpl<SchoolActivityMapper,
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean update(SchoolActivityWrapper.SchoolActivityDetail schoolActivity){
+    public Boolean update(SchoolActivityWrapper.SchoolActivityInfo schoolActivity){
 
         SchoolActivity activity = getById(schoolActivity.getId());
         if(activity == null){

+ 187 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolIndexStatServiceImpl.java

@@ -0,0 +1,187 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.SchoolIndexStatDto;
+import com.ym.mec.biz.dal.entity.LessonExamination;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.entity.Subject;
+import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
+import com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper;
+import com.ym.mec.biz.service.SchoolIndexStatService;
+import com.ym.mec.util.collection.MapUtil;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class SchoolIndexStatServiceImpl implements SchoolIndexStatService {
+
+    @Resource
+    private MusicGroupDao musicGroupDao;
+    @Resource
+    private StudentRegistrationDao studentRegistrationDao;
+    @Resource
+    private SubjectDao subjectDao;
+    @Resource
+    private StudentAttendanceDao studentAttendanceDao;
+    @Resource
+    private LessonExaminationDao lessonExaminationDao;
+
+    @Override
+    public SchoolIndexStatDto stat(SchoolIndexStatWrapper.QueryDto queryDto) {
+        List<String> musicGroupIds = new ArrayList<>();
+        if(StringUtils.isNotEmpty(queryDto.getMusicGroupId())){
+            musicGroupIds.add(queryDto.getMusicGroupId());
+        }else {
+            musicGroupIds = musicGroupDao.findNormalByCooperationId(queryDto.getCoopId());
+        }
+        SchoolIndexStatDto result = new SchoolIndexStatDto();
+        if(CollectionUtils.isEmpty(musicGroupIds)){
+            return result;
+        }
+        List<StudentRegistration> studentRegistrations = studentRegistrationDao.findByMusicGroupIds(musicGroupIds, StudentMusicGroupStatusEnum.NORMAL);
+        if(CollectionUtils.isEmpty(studentRegistrations)){
+            return result;
+        }
+        Map<String, String> musicNameMap = MapUtil.convertMybatisMap(musicGroupDao.queryMusicGroupNameMap(new HashSet<>(musicGroupIds)));
+
+        List<Integer> subjectIdList = studentRegistrations.stream().map(e -> e.getActualSubjectId()).collect(Collectors.toList());
+        Map<Integer, String> subjectMap = subjectDao.findBySubjectIds(subjectIdList).stream().collect(Collectors.toMap(Subject::getId, s -> s.getName(), (s1, s2) -> s1));
+        //年级分布
+        List<SchoolIndexStatWrapper.GradeDistribution> gradeDistributions = studentRegistrations.stream()
+                .collect(Collectors.groupingBy(
+                        e -> e.getCurrentGrade(),
+                        Collectors.collectingAndThen(
+                                Collectors.toList(),
+                                v -> v.stream().map(e -> e.getUserId()).distinct().count()
+                        )
+                ))
+                .entrySet().stream()
+                .map(entry -> {
+                    SchoolIndexStatWrapper.GradeDistribution distribution = new SchoolIndexStatWrapper.GradeDistribution();
+                    distribution.setGrade(entry.getKey());
+                    distribution.setStudentNum(entry.getValue());
+                    return distribution;
+                })
+                .sorted(Comparator.comparing(SchoolIndexStatWrapper.GradeDistribution::getGrade))
+                .collect(Collectors.toList());
+        result.setGradeDistributions(gradeDistributions);
+        //声部分布
+        List<SchoolIndexStatWrapper.SubjectDistribution> subjectDistributions = studentRegistrations.stream()
+                .collect(Collectors.groupingBy(
+                        e -> e.getActualSubjectId(),
+                        Collectors.collectingAndThen(
+                                Collectors.toList(),
+                                v -> v.stream().map(e -> e.getUserId()).distinct().count()
+                        )
+                ))
+                .entrySet().stream()
+                .map(entry -> {
+                    SchoolIndexStatWrapper.SubjectDistribution distribution = new SchoolIndexStatWrapper.SubjectDistribution();
+                    distribution.setSubjectName(subjectMap.get(entry.getKey()));
+                    distribution.setStudentNum(entry.getValue());
+                    return distribution;
+                })
+                .collect(Collectors.toList());
+        result.setSubjectDistributions(subjectDistributions);
+        //乐团年级分布
+        List<SchoolIndexStatWrapper.MusicGradeDistribution> musicGradeDistributions = new ArrayList<>();
+        //按乐团分组
+        Map<String, List<StudentRegistration>> musicGroupMap = studentRegistrations.stream().collect(Collectors.groupingBy(StudentRegistration::getMusicGroupId));
+        musicGroupMap.forEach((musicGroupId, registrations) -> {
+            //按年级分组
+            Map<String, List<StudentRegistration>> gradeMap = registrations.stream().collect(Collectors.groupingBy(StudentRegistration::getCurrentGrade));
+            gradeMap.forEach((grade, registrationList) -> {
+                SchoolIndexStatWrapper.MusicGradeDistribution gradeDistribution = new SchoolIndexStatWrapper.MusicGradeDistribution();
+                gradeDistribution.setGrade(grade);
+                gradeDistribution.setStudentNum(registrationList.stream().map(StudentRegistration::getUserId).distinct().count());
+                gradeDistribution.setMusicGroupName(musicNameMap.get(musicGroupId));
+                gradeDistribution.setSubjectId(0);
+                musicGradeDistributions.add(gradeDistribution);
+
+                //按声部分组
+                Map<Integer, Long> registrationSubjectMap = registrationList.stream()
+                        .collect(Collectors.groupingBy(StudentRegistration::getActualSubjectId,
+                                Collectors.collectingAndThen(
+                                        Collectors.toList(),
+                                        v -> v.stream().map(StudentRegistration::getUserId).distinct().count())
+                        ));
+                registrationSubjectMap.forEach((subjectId, studentNum) -> {
+                    SchoolIndexStatWrapper.MusicGradeDistribution musicGradeDistribution = new SchoolIndexStatWrapper.MusicGradeDistribution();
+                    musicGradeDistribution.setGrade(grade);
+                    musicGradeDistribution.setStudentNum(studentNum);
+                    musicGradeDistribution.setSubjectName(subjectMap.get(subjectId));
+                    musicGradeDistribution.setMusicGroupName(musicNameMap.get(musicGroupId));
+                    musicGradeDistribution.setSubjectId(subjectId);
+                    musicGradeDistributions.add(musicGradeDistribution);
+                });
+            });
+        });
+        result.setMusicGradeDistributions(musicGradeDistributions);
+
+        //声部年级分组
+        List<SchoolIndexStatWrapper.SubjectGradeDistribution> subjectGradeDistributions = new ArrayList<>();
+        Map<Integer, List<StudentRegistration>> subjectGradeMap = studentRegistrations.stream().collect(Collectors.groupingBy(e -> e.getActualSubjectId()));
+        for (Integer subjectId : subjectGradeMap.keySet()) {
+            List<StudentRegistration> registrations = subjectGradeMap.get(subjectId);
+            SchoolIndexStatWrapper.SubjectGradeDistribution subjectGradeDistribution = new SchoolIndexStatWrapper.SubjectGradeDistribution();
+            subjectGradeDistribution.setGrade("总人数");
+            subjectGradeDistribution.setStudentNum(registrations.stream().map(e-> e.getUserId()).distinct().count());
+            subjectGradeDistribution.setSubjectName(subjectMap.get(subjectId));
+            subjectGradeDistribution.setSubjectId(subjectId);
+            subjectGradeDistributions.add(subjectGradeDistribution);
+            //按年级分组
+            Map<String, List<StudentRegistration>> gradeMap = registrations.stream().collect(Collectors.groupingBy(e -> e.getCurrentGrade()));
+            for (String grade : gradeMap.keySet()) {
+                SchoolIndexStatWrapper.SubjectGradeDistribution gradeDistribution = new SchoolIndexStatWrapper.SubjectGradeDistribution();
+                gradeDistribution.setGrade(grade);
+                gradeDistribution.setStudentNum(gradeMap.get(grade).stream().map(e-> e.getUserId()).distinct().count());
+                gradeDistribution.setSubjectName(subjectMap.get(subjectId));
+                gradeDistribution.setSubjectId(subjectId);
+                subjectGradeDistributions.add(gradeDistribution);
+            }
+        }
+        result.setSubjectGradeDistributions(subjectGradeDistributions);
+        return result;
+    }
+
+    @Override
+    public SchoolIndexStatWrapper.StudentAttendance attendanceStat(SchoolIndexStatWrapper.QueryDto queryDto) {
+        List<String> musicGroupIds = new ArrayList<>();
+        if(StringUtils.isNotEmpty(queryDto.getMusicGroupId())){
+            musicGroupIds.add(queryDto.getMusicGroupId());
+        }else {
+            musicGroupIds = musicGroupDao.findNormalByCooperationId(queryDto.getCoopId());
+        }
+        if(CollectionUtils.isEmpty(musicGroupIds)){
+            return new SchoolIndexStatWrapper.StudentAttendance();
+        }
+        //获取学员考勤数据
+        SchoolIndexStatWrapper.StudentAttendance studentAttendance = studentAttendanceDao.statCoopAttendance(musicGroupIds,queryDto);
+        if(Objects.nonNull(studentAttendance)){
+            int num = studentAttendance.getNormalNum() + studentAttendance.getLateNum();
+            if(num > 0){
+                studentAttendance.setAttendanceRate(num / studentAttendance.getTotalNum());
+            }
+        }
+        return studentAttendance;
+    }
+
+    @Override
+    public SchoolIndexStatWrapper.StudentLesson lessonStat(SchoolIndexStatWrapper.QueryDto queryDto) {
+        List<String> musicGroupIds = new ArrayList<>();
+        if(StringUtils.isNotEmpty(queryDto.getMusicGroupId())){
+            musicGroupIds.add(queryDto.getMusicGroupId());
+        }else {
+            musicGroupIds = musicGroupDao.findNormalByCooperationId(queryDto.getCoopId());
+        }
+        if(CollectionUtils.isEmpty(musicGroupIds)){
+            return new SchoolIndexStatWrapper.StudentLesson();
+        }
+        return lessonExaminationDao.schoolLessonStat(musicGroupIds,queryDto);
+    }
+}

+ 57 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolStaffServiceImpl.java

@@ -6,12 +6,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.microsvc.toolkit.middleware.im.ImPluginContext;
+import com.microsvc.toolkit.middleware.im.ImPluginService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.enums.SysUserType;
 import com.ym.mec.auth.api.enums.YesOrNoEnum;
-import com.ym.mec.biz.dal.dao.SysMessageConfigDao;
-import com.ym.mec.biz.dal.dao.CooperationOrganDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.school.ESchoolStaffType;
@@ -60,6 +60,10 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
     @Autowired
     private SmsCodeService smsCodeService;
 
+    @Autowired
+    private ImUserFriendDao imUserFriendDao;
+
+
 
     @Value("${message.debugMode:false}")
     private boolean debugMode;
@@ -76,6 +80,9 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
     @Autowired
     private OrganizationService organizationService;
 
+    @Autowired
+    private ImGroupService imGroupService;
+
     /**
      * 查询详情
      * @param id 详情ID
@@ -204,8 +211,22 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
         // 添加学校员工信息
         this.save(JSON.parseObject(schoolStaff.jsonString(), SchoolStaff.class));
 
-        // 自动创建学校管理IM群
-        // 自动添加员工到学校乐团群
+
+        // 自动创建学校管理IM群 自动添加员工到学校乐团群
+        try {
+            imGroupService.addSchoolStaffGroup(schoolStaff.getSchoolId(), user.getId(),ESchoolStaffType.ORCHESTRA_LEADER);
+        } catch (Exception e) {
+            log.error("加入群组失败 {}",e);
+            throw new BizException("加入群组失败");
+        }
+
+        // 乐团领队添加到所有乐团群
+        List<MusicGroup> musicGroups = cooperationOrganService.musicGroupPage(schoolStaff.getSchoolId().intValue());
+
+        // id 集合
+        List<String> musicGroupIds = musicGroups.stream().map(o -> o.getId()).collect(Collectors.toList());
+        imGroupService.addImGroup(musicGroupIds,user);
+
 
         // 删除缓存锁
         redissonClient.getBucket(submitLockKey).delete();
@@ -451,5 +472,36 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
         cooperationOrganDao.update(JSON.parseObject(info.jsonString(), CooperationOrgan.class));
     }
 
+    /**
+     * 删除用户
+     *
+     * @param id 用户ID
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean del(Long id) {
+        // 删除用户信息
+        SchoolStaff schoolStaff = schoolStaffService.getById(id);
+        if (schoolStaff == null) {
+            throw new BizException("用户信息不存在");
+        }
+        schoolStaff.setStatus("-1");
+        this.updateById(schoolStaff);
+
+        // sys_user 删除
+        baseMapper.delUser(schoolStaff.getUserId());
+
+
+        // 解除im好友关联
+        imUserFriendDao.deleteByUserIdAndFriendId(schoolStaff.getUserId());
+
+
+        imGroupService.quit(schoolStaff.getUserId());
+
+
+        return true;
+
+    }
+
 
 }

+ 64 - 43
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java

@@ -133,47 +133,68 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	 */
 	private int addMessage(Integer receiverTenantId, Map<Integer, String> receivers, String subject, String content, Date triggerTime, MessageSendMode mode, SendStatusEnum status,
 			String errorMsg, Integer readStatus, String memo, String group,String jpushType) {
-		SysMessage message = null;
-		Date date = new Date();
-
-		List<SysMessage> messages = new ArrayList<>();
-
-		Integer userId = null;
-		String receiver;
-		for (Entry<Integer, String> entry : receivers.entrySet()) {
-			userId = entry.getKey();
-			receiver = entry.getValue();
-
-			message = new SysMessage();
-			if (userId == null) {
-				SysUser user = sysUserFeignService.queryUserByMobile(receiver);
-				if (user != null) {
-					userId = user.getId();
-				}
-			}
-			message.setTenantId(receiverTenantId);
-			message.setUserId(userId);
-			message.setContent(content);
-			message.setCreateOn(date);
-			message.setModifyOn(date);
-			message.setReceiver(receiver);
-			if (triggerTime == null) {
-				triggerTime = date;
-			}
-			message.setSendTime(triggerTime);
-			message.setTitle(subject);
-			message.setStatus(status);
-			message.setType(mode);
-			message.setErrorMsg(errorMsg);
-			message.setReadStatus(readStatus);
-			message.setMemo(memo);
-			message.setGroup(group);
-			message.setJpushType(jpushType);
-			messages.add(message);
-		}
-
-		return sysMessageDao.batchInsert(messages);
-	}
+		return addMessage(receiverTenantId,receivers,subject,content,triggerTime,mode,status,errorMsg,readStatus,memo,group,jpushType,null);
+	}
+
+
+    /**
+     * 添加消息
+     * @param subject 消息主题
+     * @param content 消息内容
+     * @param receivers 接收人,多个人用逗号分开
+     * @param triggerTime 触发时间
+     * @param mode 消息的发送模式
+     * @param status 消息的当前状态
+     * @param errorMsg 错误消息
+     * @param readStatus 阅读状态
+     * @param memo 备注
+     * @param group 消息组
+     * @return
+     */
+    private int addMessage(Integer receiverTenantId, Map<Integer, String> receivers, String subject, String content, Date triggerTime, MessageSendMode mode, SendStatusEnum status,
+                           String errorMsg, Integer readStatus, String memo, String group,String jpushType,Integer messageConfigId) {
+        SysMessage message = null;
+        Date date = new Date();
+
+        List<SysMessage> messages = new ArrayList<>();
+
+        Integer userId = null;
+        String receiver;
+        for (Entry<Integer, String> entry : receivers.entrySet()) {
+            userId = entry.getKey();
+            receiver = entry.getValue();
+
+            message = new SysMessage();
+            if (userId == null) {
+                SysUser user = sysUserFeignService.queryUserByMobile(receiver);
+                if (user != null) {
+                    userId = user.getId();
+                }
+            }
+            message.setTenantId(receiverTenantId);
+            message.setUserId(userId);
+            message.setContent(content);
+            message.setCreateOn(date);
+            message.setModifyOn(date);
+            message.setReceiver(receiver);
+            if (triggerTime == null) {
+                triggerTime = date;
+            }
+            message.setMessageConfigId(messageConfigId);
+            message.setSendTime(triggerTime);
+            message.setTitle(subject);
+            message.setStatus(status);
+            message.setType(mode);
+            message.setErrorMsg(errorMsg);
+            message.setReadStatus(readStatus);
+            message.setMemo(memo);
+            message.setGroup(group);
+            message.setJpushType(jpushType);
+            messages.add(message);
+        }
+
+        return sysMessageDao.batchInsert(messages);
+    }
 
 	@Override
 	public int updateMessage(SysMessage message) {
@@ -481,10 +502,10 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 			return;
 		}
 		addMessage(receiverTenantId, receivers, messageConfig.getDescription(), MessageFormatter.arrayFormat(messageConfig.getContent(), args), triggerTime, mode, status, errorMsg, readStatus,
-				url, messageConfig.getGroup(),jpushType);
+				url, messageConfig.getGroup(),jpushType,messageConfig.getId());
 	}
 
-	@Override
+    @Override
 	public void batchSendMessage(MessageSender messageSender, MessageTypeEnum type, Map<Integer, String> receivers, Date triggerTime, Integer readStatus,
 			String url,String jpushType, Object... args) {
 		batchSendMessage(TenantContextHolder.getTenantId(), messageSender, type, receivers, triggerTime, readStatus, url, jpushType, args);

+ 13 - 2
mec-biz/src/main/resources/config/mybatis/ImGroupMapper.xml

@@ -54,8 +54,8 @@
 	
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.ImGroup" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO im_group (id_,name_,introduce_,member_num_,memo_,tags_,img_,type_,create_time_,update_time_,tenant_id_,group_type_)
-		VALUES(#{id},#{name},#{introduce},#{memberNum},#{memo},#{tags},#{img},#{type},#{createTime},#{updateTime},#{tenantId},#{groupType})
+		INSERT INTO im_group (id_,name_,introduce_,member_num_,memo_,tags_,img_,type_,create_time_,update_time_,tenant_id_,group_type_,school_id_)
+		VALUES(#{id},#{name},#{introduce},#{memberNum},#{memo},#{tags},#{img},#{type},#{createTime},#{updateTime},#{tenantId},#{groupType},#{schoolId})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -238,4 +238,15 @@
         </if>
 
     </select>
+
+	<select id="queryBySchoolId" resultMap="ImGroup">
+        SELECT ig.* FROM im_group ig where school_id_ = #{schoolId} limit 1
+    </select>
+
+	<select id="getByIds" resultMap="ImGroup">
+        select ig.* FROM im_group ig where ig.id_ in
+        <foreach collection="musicGroupIds" separator="," item="item" open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
 </mapper>

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

@@ -172,4 +172,14 @@
 		LEFT JOIN sys_user u ON igm.user_id_ = u.id_
 		<include refid="queryGroupMemberPageSql"/>
 	</select>
+
+	<select id="queryMembersByUserId" resultMap="ImGroupMember">
+        SELECT igm.*
+        FROM im_group_member igm
+        WHERE igm.user_id_ = #{userId}
+    </select>
+
+	<delete id="deleteByUserId">
+        DELETE FROM im_group_member WHERE user_id_ = #{userId}
+    </delete>
 </mapper>

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

@@ -158,4 +158,8 @@
             </if>
         </if>
     </select>
+
+	<delete id="deleteByUserIdAndFriendId">
+        DELETE FROM im_user_friend WHERE user_id_ = #{userId} or friend_id_ = #{userId}
+    </delete>
 </mapper>

+ 25 - 0
mec-biz/src/main/resources/config/mybatis/LessonExaminationMapper.xml

@@ -161,5 +161,30 @@
         where sle.lesson_examination_id_ = #{lessonExaminationId}
         group by s.id_
     </select>
+    <select id="schoolLessonStat" resultType="com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper$StudentLesson">
+        select SUM(cs.expectNum) expectNum,SUM(cs.actualNum) actualNum,SUM(cs.passNum) passNum,
+        TRUNCATE(SUM(cs.actualNum)/SUM(cs.expectNum),1) commitRate,
+        TRUNCATE(SUM(cs.passNum)/SUM(cs.expectNum),1) passRate
+        from (
+        select ch.expect_num_ expectNum,ch.completed_num_ actualNum,ch.completed_num_ passNum from
+        course_homework ch
+        left join course_schedule cs ON cs.id_ = ch.course_schedule_id_
+        where CONCAT(cs.class_date_,' ',cs.start_class_time_) &lt; NOW()
+        AND cs.music_group_id_ IN
+        <foreach collection="musicGroupIds" close=")" open="(" separator="," item="item">
+            #{item}
+        </foreach>
+        AND cs.class_date_ BETWEEN #{queryDto.startTime} AND #{queryDto.endTime}
+        UNION ALL
+        select le.expect_num_ expectNum,le.training_num_ actualNum,le.standard_num_ passNum from lesson_examination le
+        left join course_schedule cs ON cs.id_ = le.course_schedule_id_
+        where CONCAT(cs.class_date_,' ',cs.start_class_time_) &lt; NOW()
+        AND cs.music_group_id_ IN
+        <foreach collection="musicGroupIds" close=")" open="(" separator="," item="item">
+            #{item}
+        </foreach>
+        AND cs.class_date_ BETWEEN #{queryDto.startTime} AND #{queryDto.endTime}
+        )
+    </select>
 
 </mapper>

+ 5 - 0
mec-biz/src/main/resources/config/mybatis/SchoolStaffMapper.xml

@@ -20,6 +20,7 @@
                  JOIN sys_user t2 ON (t1.user_id_ = t2.id_)
                  left join cooperation_organ co on t1.school_id_ = co.id_
         <where>
+            t1.status_ != -1
             <if test="param.schoolId != null">
                 AND t1.school_id_ = #{param.schoolId}
             </if>
@@ -65,6 +66,10 @@
             and (ss.status_ = 0  or ss.status_ is null)
         </if>
     </update>
+
+    <delete id="delUser">
+        update sys_user set user_type_ = '' ,del_flag_ = 1 where id_ = #{userId}
+    </delete>
     <!--学校员工身份数统计-->
 
 </mapper>

+ 18 - 2
mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml

@@ -679,7 +679,6 @@
                COUNT(CASE WHEN sa.status_ = 'NORMAL' THEN 1 END) attendanceNormalNum,
                COUNT(CASE WHEN sa.status_ = 'TRUANT' OR sa.id_ IS NULL THEN 1 END) attendanceTruantNum,
                COUNT(CASE WHEN sa.status_ = 'LEAVE' THEN 1 END) attendanceLeaveNum,
-               COUNT(CASE WHEN sa.status_ = 'DROP_OUT' THEN 1 END) attendanceDropNum,
                COUNT(CASE WHEN sa.status_ = 'LATE' THEN 1 END) attendanceLateNum,
         cssp.course_schedule_id_ courseId
         from course_schedule_student_payment cssp
@@ -726,4 +725,21 @@
             </if>
         </where>
     </select>
-</mapper>
+    <select id="statCoopAttendance"
+            resultType="com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper$StudentAttendance">
+        select COUNT(cssp.user_id_) totalNum,
+        COUNT(CASE WHEN sa.status_ = 'NORMAL' THEN 1 END) normalNum,
+        COUNT(CASE WHEN sa.status_ = 'TRUANT' OR sa.id_ IS NULL THEN 1 END) truantNum,
+        COUNT(CASE WHEN sa.status_ = 'LEAVE' THEN 1 END) leaveNum,
+        COUNT(CASE WHEN sa.status_ = 'LATE' THEN 1 END) lateNum
+        from course_schedule cs
+        left join course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
+        left join student_attendance sa ON sa.course_schedule_id_ = cssp.course_schedule_id_ AND cssp.user_id_ = sa.user_id_
+        where CONCAT(cs.class_date_,' ',cs.start_class_time_) &lt; NOW()
+        AND cs.music_group_id_ IN
+        <foreach collection="musicGroupIds" close=")" open="(" separator="," item="item">
+            #{item}
+        </foreach>
+        AND cs.class_date_ BETWEEN #{queryDto.startTime} AND #{queryDto.endTime}
+    </select>
+</mapper>

+ 5 - 3
mec-biz/src/main/resources/config/mybatis/SysMessageMapper.xml

@@ -92,7 +92,7 @@
 		title_, content_,
 		type_, status_, receiver_,
 		send_time_, error_msg_,read_status_,memo_, create_on_,
-		modify_on_,group_,jpush_type_,tenant_id_)
+		modify_on_,group_,jpush_type_,tenant_id_,message_config_id_)
 		values
 		<foreach collection="list" item="item" index="index"
 			separator=",">
@@ -103,7 +103,7 @@
 			#{item.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{item.receiver,jdbcType=VARCHAR},
 			#{item.sendTime},#{item.errorMsg,jdbcType=VARCHAR},#{item.readStatus},#{item.memo},
 			#{item.createOn},
-			#{item.modifyOn},#{item.group},#{item.jpushType},#{item.tenantId}
+			#{item.modifyOn},#{item.group},#{item.jpushType},#{item.tenantId},#{item.messageConfigId}
 			)
 		</foreach>
 	</insert>
@@ -177,7 +177,9 @@
 	</select>
 
 	<select id="queryListPage" parameterType="map" resultMap="messageDto">
-		select m.*,u.username_ from sys_message m left join sys_user u on m.user_id_ = u.id_
+		select m.*,u.username_,mg.icon_ from sys_message m
+        left join sys_message_config mg on mg.id_ = m.message_config_id_
+        left join sys_user u on m.user_id_ = u.id_
 		<include refid="queryCondition" />
 		order by m.read_status_,m.create_on_ desc
 		<include refid="global.limit" />

+ 3 - 2
mec-web/src/main/java/com/ym/mec/web/controller/SchoolMessageController.java

@@ -13,6 +13,7 @@ import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
@@ -37,7 +38,7 @@ public class SchoolMessageController extends BaseController {
 
     @ApiOperation("获取所有消息列表")
     @GetMapping(value = "list")
-    public Object list(SysMessageQueryInfo queryInfo){
+    public Object list(@ApiParam SysMessageQueryInfo queryInfo){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
@@ -72,7 +73,7 @@ public class SchoolMessageController extends BaseController {
     }
     @ApiOperation("设置已读")
     @PostMapping("setRead")
-    public Object setRead(Long id) {
+    public Object setRead(@ApiParam("id") Long id) {
         int status = 1;
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {

+ 14 - 0
mec-web/src/main/java/com/ym/mec/web/controller/open/OpenSchoolController.java

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.dal.wrapper.SchoolStaffWrapper;
 import com.ym.mec.biz.service.CooperationOrganService;
 import com.ym.mec.biz.service.SchoolStaffService;
+import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
@@ -14,7 +15,9 @@ import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -37,6 +40,8 @@ public class OpenSchoolController extends BaseController {
     private SchoolStaffService schoolStaffService;
     @Autowired
     private CooperationOrganService cooperationOrganService;
+    @Autowired
+    private SysConfigService sysConfigService;
 
 
     @ApiOperation(value = "学校员工新增", notes = "学校员工- 传入 SchoolStaffWrapper.SchoolStaff")
@@ -81,4 +86,13 @@ public class OpenSchoolController extends BaseController {
         return succeed(schoolCooperation);
     }
 
+    @ApiOperation(value = "查询参数")
+    @GetMapping(value = "queryByParamName")
+    public Object queryByParamName(String paramName) {
+        if(StringUtils.isBlank(paramName)){
+            return failed("参数不能为空");
+        }
+        return succeed(sysConfigService.findByParamName(paramName));
+    }
+
 }

+ 4 - 5
mec-web/src/main/java/com/ym/mec/web/controller/school/SchoolActivityController.java

@@ -1,6 +1,5 @@
 package com.ym.mec.web.controller.school;
 
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.microsvc.toolkit.config.validator.group.ValidGroups;
@@ -31,9 +30,9 @@ public class SchoolActivityController extends BaseController {
 
 	@ApiOperation(value = "详情", notes = "学校活动-根据详情ID查询单条, 传入id")
     @GetMapping("/detail/{id}")
-    public HttpResponseResult<SchoolActivityWrapper.SchoolActivityDetail> detail(@PathVariable("id") Long id) {
+    public HttpResponseResult<SchoolActivityWrapper.SchoolActivityInfo> detail(@PathVariable("id") Long id) {
 
-        SchoolActivityWrapper.SchoolActivityDetail wrapper = schoolActivityService.detail(id);
+        SchoolActivityWrapper.SchoolActivityInfo wrapper = schoolActivityService.detail(id);
         
         return succeed(wrapper);
 	}
@@ -61,7 +60,7 @@ public class SchoolActivityController extends BaseController {
     
     @ApiOperation(value = "新增", notes = "学校活动- 传入 SchoolActivityWrapper.SchoolActivity")
 	@PostMapping("/save")
-	public HttpResponseResult<Boolean> add(@Validated @RequestBody SchoolActivityWrapper.SchoolActivityDetail schoolActivity, @RequestHeader Integer coopId) {
+	public HttpResponseResult<Boolean> add(@Validated @RequestBody SchoolActivityWrapper.SchoolActivityInfo schoolActivity, @RequestHeader Integer coopId) {
         if (coopId == null) {
             return succeed();
         }
@@ -72,7 +71,7 @@ public class SchoolActivityController extends BaseController {
     
     @ApiOperation(value = "修改", notes = "学校活动- 传入 SchoolActivityWrapper.SchoolActivity")
 	@PostMapping("/update")
-	public HttpResponseResult<Boolean> update(@Validated(value = ValidGroups.Update.class) @RequestBody SchoolActivityWrapper.SchoolActivityDetail schoolActivity, @RequestHeader Integer coopId) {
+	public HttpResponseResult<Boolean> update(@Validated(value = ValidGroups.Update.class) @RequestBody SchoolActivityWrapper.SchoolActivityInfo schoolActivity, @RequestHeader Integer coopId) {
         if (coopId == null) {
             return succeed();
         }

+ 45 - 0
mec-web/src/main/java/com/ym/mec/web/controller/school/SchoolIndexController.java

@@ -0,0 +1,45 @@
+package com.ym.mec.web.controller.school;
+
+import com.ym.mec.biz.dal.dto.SchoolIndexStatDto;
+import com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper;
+import com.ym.mec.biz.service.SchoolIndexStatService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/schoolIndex")
+@Api(tags = "学校端首页")
+public class SchoolIndexController extends BaseController {
+
+    @Autowired
+    private SchoolIndexStatService schoolIndexStatService;
+
+	@ApiOperation(value = "统计", notes = "学校端首页数据统计")
+    @PostMapping("/stat")
+    public HttpResponseResult<SchoolIndexStatDto> stat(@RequestBody SchoolIndexStatWrapper.QueryDto queryDto, @RequestHeader Integer coopId) {
+        queryDto.setCoopId(coopId);
+        return succeed(schoolIndexStatService.stat(queryDto));
+	}
+
+	@ApiOperation(value = "学员出勤统计")
+    @PostMapping("/attendanceStat")
+    public HttpResponseResult<SchoolIndexStatWrapper.StudentAttendance> attendanceStat(@RequestBody SchoolIndexStatWrapper.QueryDto queryDto, @RequestHeader Integer coopId) {
+        queryDto.setCoopId(coopId);
+        return succeed(schoolIndexStatService.attendanceStat(queryDto));
+	}
+
+	@ApiOperation(value = "学员练习统计")
+    @PostMapping("/lessonStat")
+    public HttpResponseResult<SchoolIndexStatWrapper.StudentLesson> lessonStat(@RequestBody SchoolIndexStatWrapper.QueryDto queryDto, @RequestHeader Integer coopId) {
+        queryDto.setCoopId(coopId);
+        return succeed(schoolIndexStatService.lessonStat(queryDto));
+	}
+}

+ 2 - 2
mec-web/src/main/java/com/ym/mec/web/controller/school/SchoolStaffController.java

@@ -71,7 +71,7 @@ public class SchoolStaffController extends BaseController {
     public HttpResponseResult<PageInfo<SchoolStaffWrapper.SchoolStaff>> page(@RequestBody SchoolStaffWrapper.SchoolStaffQuery query) {
         query.setOrganId(organizationService.getEmployeeOrgan(query.getOrganId()));
         query.setTenantId(TenantContextHolder.getTenantId());
-        query.setCoopStatus(true);
+//        query.setCoopStatus(true);
 
         IPage<SchoolStaffWrapper.SchoolStaff> pages = schoolStaffService.selectPage(QueryInfo.getPage(query), query);
         
@@ -120,7 +120,7 @@ public class SchoolStaffController extends BaseController {
 	@PostMapping("/remove")    
 	public HttpResponseResult<Boolean> remove(@RequestParam Long id) {
     
-		return succeed(schoolStaffService.removeById(id));
+		return succeed(schoolStaffService.del(id));
 	}
 
     @ApiOperation(value = "查询学校员工信息")