Explorar el Código

Merge remote-tracking branch 'origin/master_saas' into master_saas

shangke hace 2 años
padre
commit
41d99e4c8c
Se han modificado 46 ficheros con 1061 adiciones y 71 borrados
  1. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  2. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupQuitDao.java
  3. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SubjectDao.java
  4. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysNewsInformationDao.java
  5. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SchoolStaff.java
  6. 139 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysNewsInformation.java
  7. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  8. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/SchoolStaffMapper.java
  9. 37 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/school/dto/NewsInformationDto.java
  10. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/SchoolActivityWrapper.java
  11. 32 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/SchoolStaffWrapper.java
  12. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/StudentWrapper.java
  13. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  14. 11 2
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  15. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysNewsInformationService.java
  16. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  17. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CooperationOrganServiceImpl.java
  18. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CoursePatrolEvaluationServiceImpl.java
  19. 14 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  20. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java
  21. 73 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  22. 89 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolStaffServiceImpl.java
  23. 30 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  24. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  25. 9 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  26. 81 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysNewsInformationServiceImpl.java
  27. 63 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  28. 53 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherLeaveRecordServiceImpl.java
  29. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  30. 2 2
      mec-biz/src/main/resources/config/mybatis/CooperationOrganLinkmanMapper.xml
  31. 8 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  32. 7 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupQuitMapper.xml
  33. 8 0
      mec-biz/src/main/resources/config/mybatis/SchoolActivityMapper.xml
  34. 57 19
      mec-biz/src/main/resources/config/mybatis/SchoolStaffMapper.xml
  35. 2 4
      mec-biz/src/main/resources/config/mybatis/StudentPlusMapper.xml
  36. 17 0
      mec-biz/src/main/resources/config/mybatis/SubjectMapper.xml
  37. 3 1
      mec-biz/src/main/resources/config/mybatis/SysMessageMapper.xml
  38. 5 0
      mec-biz/src/main/resources/config/mybatis/SysNewsInformationMapper.xml
  39. 1 1
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  40. 1 1
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  41. 4 0
      mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java
  42. 83 0
      mec-web/src/main/java/com/ym/mec/web/controller/SchoolMessageController.java
  43. 13 4
      mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java
  44. 8 1
      mec-web/src/main/java/com/ym/mec/web/controller/school/SchoolStaffController.java
  45. 37 4
      mec-web/src/main/java/com/ym/mec/web/controller/school/SchoolStudentHomeworkController.java
  46. 41 0
      mec-web/src/main/java/com/ym/mec/web/controller/school/SchoolSysNewsInformationController.java

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

@@ -2022,4 +2022,6 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
                                                                                                       @Param("endTerm") String endTerm);
 
     List<ClassesForDayDto> getListClassesForDay(@Param("musicGroupIds") List<String> musicGroupIds, @Param("classDate") String classDate, @Param("courseId") Long courseId);
+
+    List<CourseSchedule> getByTeacherAndTime(@Param("teacherId") Integer teacherId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
 }

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

@@ -69,4 +69,6 @@ public interface MusicGroupQuitDao extends BaseDAO<Long, MusicGroupQuit> {
     * @date 2023/5/11 09:39
     */
     List<MusicGroupQuitPageDto> queryPageBySchool(Map<String, Object> params);
+
+    Boolean countRedPointBySchool(@Param("musicGroupIds") List<String> musicGroupIds);
 }

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

@@ -171,4 +171,6 @@ public interface SubjectDao extends BaseDAO<Integer, Subject> {
 
     List<StudentSubjectDto> getSubjectByStudentId(@Param("studentIds") Set<Long> studentIds);
 
+
+    List<Subject> getSubjectListByIdAndCoopId(@Param("musicGroupId") String musicGroupId, @Param("coopId") Integer coopId);
 }

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysNewsInformationDao.java

@@ -0,0 +1,15 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.SysNewsInformation;
+
+/**
+ * 新闻资讯表(SysNewsInformation)表数据库访问层
+ *
+ * @author zx
+ * @since 2023-05-11 16:08:25
+ */
+public interface SysNewsInformationDao extends BaseMapper<SysNewsInformation> {
+
+}
+

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

@@ -47,7 +47,7 @@ public class SchoolStaff implements Serializable {
 	@TableField(value = "user_type_")
     private ESchoolStaffType userType;
 
-    @ApiModelProperty("帐号状态(注销,冻结,激活)") 
+    @ApiModelProperty("帐号状态(注销 -1,冻结 9,激活 0)")
 	@TableField(value = "status_")
     private String status;
 

+ 139 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysNewsInformation.java

@@ -0,0 +1,139 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ym.mec.common.enums.BaseEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.Getter;
+import org.springframework.web.bind.annotation.GetMapping;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 新闻资讯表(SysNewsInformation)表实体类
+ *
+ * @author zx
+ * @since 2023-05-11 16:08:27
+ */
+@Data
+@ApiModel(value = "sys_news_information-新闻资讯表")
+public class SysNewsInformation implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("title_")
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @TableField("content_")
+    @ApiModelProperty(value = "内容")
+    private String content;
+
+    @TableField("cover_image_")
+    @ApiModelProperty(value = "封面图片")
+    private String coverImage;
+
+    @TableField("type_")
+    @ApiModelProperty(value = "类型")
+    private Integer type;
+
+    @TableField("sub_type_")
+    @ApiModelProperty(value = "子类型")
+    private Integer subType;
+
+    @TableField("status_")
+    @ApiModelProperty(value = "状态(1-可见 0-不可见)")
+    private String status;
+
+    @TableField("online_time_")
+    @ApiModelProperty(value = "上线时间")
+    private Date onlineTime;
+
+    @TableField("offline_time_")
+    @ApiModelProperty(value = "下线时间")
+    private Date offlineTime;
+
+    @TableField("memo_")
+    @ApiModelProperty(value = "备注")
+    private String memo;
+
+    @TableField("create_time_")
+    private Date createTime;
+
+    @TableField("update_time_")
+    private Date updateTime;
+
+    @TableField("link_url_")
+    @ApiModelProperty(value = "链接地址")
+    private String linkUrl;
+
+    @TableField("href_target_")
+    @ApiModelProperty(value = "跳转类型_bank,_slef")
+    private String hrefTarget;
+
+    @TableField("order_")
+    @ApiModelProperty(value = "顺序号")
+    private Integer order;
+
+    @TableField("del_flag_")
+    @ApiModelProperty(value = "${column.comment}")
+    private Integer delFlag;
+
+    @TableField("tenant_id_")
+    @ApiModelProperty(value = "1-对内;2-对外")
+    private Integer tenantId;
+
+    @TableField("video_cover_image_")
+    @ApiModelProperty(value = "视频封面")
+    private String videoCoverImage;
+
+    @TableField("attribute1_")
+    @ApiModelProperty(value = "${column.comment}")
+    private String attribute1;
+
+    @TableField("attribute2_")
+    @ApiModelProperty(value = "${column.comment}")
+    private String attribute2;
+
+    @TableField("subject_id_list_")
+    @ApiModelProperty(value = "声部列表")
+    private String subjectIdList;
+
+    @TableField("organ_id_list_")
+    @ApiModelProperty(value = "所属分部")
+    private String organIdList;
+
+    @TableField("red_point_")
+    @ApiModelProperty(value = "红点类型")
+    private ERedPointEnum redPoint;
+
+    @Getter
+    public enum ERedPointEnum implements BaseEnum<String, ERedPointEnum> {
+
+        BACKLOG("待办事项"),
+        SITE_MANAGE("场地管理"),
+        ;
+
+        private final String describe;
+
+        @EnumValue
+        private final String code;
+
+        ERedPointEnum(String describe) {
+            this.describe = describe;
+            this.code = this.name();
+        }
+
+        @Override
+        public String getCode() {
+            return this.name();
+        }
+    }
+}
+

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

@@ -251,6 +251,38 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     //小小训练营-训练营开始训练推送
     JIGUANG_TEMP_LITTLE_ARTIST_START_TRAIN("JIGUANG_TEMP_LITTLE_ARTIST_START_TRAIN","训练营开始训练推送-极光推送"),
 
+
+    //  老师异常签到
+    JIGUANG_TEACHER_SIGN_IN_EXCEPTION("JIGUANG_TEACHER_SIGN_IN_EXCEPTION","老师异常签到-极光推送"),
+
+    // 老师异常签退
+    JIGUANG_TEACHER_SIGN_OUT_EXCEPTION("JIGUANG_TEACHER_SIGN_OUT_EXCEPTION","老师异常签退-极光推送"),
+
+    // 老师请假
+    JIGUANG_TEACHER_LEAVE("JIGUANG_TEACHER_LEAVE","老师请假-极光推送"),
+
+    // 学员退团申请消息
+    JIGUANG_STUDENT_QUIT_GROUP_APPLY("JIGUANG_STUDENT_QUIT_GROUP_APPLY","学员退团申请消息-极光推送"),
+    // 学员退团消息
+    JIGUANG_STUDENT_QUIT_GROUP("JIGUANG_STUDENT_QUIT_GROUP","学员退团消息-极光推送"),
+
+    // 学员请假消息
+    JIGUANG_STUDENT_LEAVE("JIGUANG_STUDENT_LEAVE","学员请假消息-极光推送"),
+
+    // 课程变更消息
+    JIGUANG_COURSE_CHANGE("JIGUANG_COURSE_CHANGE","课程变更消息-极光推送"),
+
+    // 课程安排
+    JIGUANG_COURSE_ARRANGE("JIGUANG_COURSE_ARRANGE","课程安排-极光推送"),
+
+    // 学校端账户注册
+    JIGUANG_SCHOOL_ACCOUNT_REGISTER("JIGUANG_SCHOOL_ACCOUNT_REGISTER","学校端账户注册-极光推送"),
+
+    // 学校端账户注册通知
+    JIGUANG_SCHOOL_ACCOUNT_REGISTER_NOTICE("JIGUANG_SCHOOL_ACCOUNT_REGISTER_NOTICE","学校端账户注册通知-极光推送"),
+
+    // 学校端注册短信通知
+    SMS_SCHOOL_ACCOUNT_REGISTER("SMS_SCHOOL_ACCOUNT_REGISTER","学校端注册短信通知-极光推送"),
     ;
 
     MessageTypeEnum(String code, String msg) {

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

@@ -31,4 +31,12 @@ public interface SchoolStaffMapper extends BaseMapper<SchoolStaff> {
 	 * @return List<StatGroupWrapper>
 	 */
     List<StatGroupWrapper> selectUserTypeNumsStat(@Param("schoolId") Integer schoolId);
+
+    /**
+     * 修改学校用户状态
+     *
+     * @param status 状态
+     * @param cooperationOrganId 合作单位ID
+     */
+    void updateStatusAndRecoveryStatus(@Param("status") Boolean status, @Param("cooperationOrganId") Integer cooperationOrganId);
 }

+ 37 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/school/dto/NewsInformationDto.java

@@ -0,0 +1,37 @@
+package com.ym.mec.biz.dal.school.dto;
+
+import com.ym.mec.biz.dal.entity.SysNewsInformation;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class NewsInformationDto {
+    private Long id;
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty(value = "内容")
+    private String content;
+
+    @ApiModelProperty(value = "封面图片")
+    private String coverImage;
+
+    @ApiModelProperty(value = "类型")
+    private Integer type;
+
+    @ApiModelProperty(value = "子类型")
+    private Integer subType;
+
+    @ApiModelProperty(value = "链接地址")
+    private String linkUrl;
+
+    @ApiModelProperty(value = "跳转类型_bank,_slef")
+    private String hrefTarget;
+
+    @ApiModelProperty(value = "红点类型")
+    private SysNewsInformation.ERedPointEnum redPoint;
+
+    @ApiModelProperty(value = "是否有红点")
+    private Boolean redPointFlag = false;
+}

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

@@ -151,6 +151,10 @@ public class SchoolActivityWrapper {
     @ApiModel(" SchoolActivityStudentQuery-学校活动学生查询对象")
     public static class SchoolActivityStudentQuery {
 
+
+        @ApiModelProperty("活动节目编号")
+        private Integer activityDetailId;
+
         @ApiModelProperty("乐团ID")
         private String musicGroupId;
 
@@ -197,6 +201,9 @@ public class SchoolActivityWrapper {
         @ApiModelProperty("学生名")
         private String studentName;
 
+        @ApiModelProperty("是否已经选择")
+        private Boolean selected;
+
 
         @ApiModelProperty("学生头像")
         private String studentAvatar;

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.wrapper;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.ym.mec.auth.api.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;
@@ -17,6 +18,7 @@ import org.joda.time.DateTime;
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 import java.util.Optional;
 
 /**
@@ -45,9 +47,21 @@ public class SchoolStaffWrapper {
         @ApiModelProperty("合作单位编号")
         private Long schoolId;
 
+
+        @ApiModelProperty("合作单位编号")
+        private List<Long> schoolIds;
+
+
         @ApiModelProperty("机构编号")
         private Integer tenantId;
-        
+
+        @ApiModelProperty("分布ID")
+        private String organId;
+
+
+        @ApiModelProperty("合作单位禁用")
+        private Boolean coopStatus;
+
         public String getKeyword() {
             return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
         }
@@ -75,9 +89,18 @@ public class SchoolStaffWrapper {
         @ApiModelProperty("主键")
         private Long id;
 
+        @ApiModelProperty("分部ID")
+        private String organId;
+
+        @ApiModelProperty("分部名称")
+        private String organName;
+
         @ApiModelProperty("学校ID")
         private Long schoolId;
 
+        @ApiModelProperty("学校名称")
+        private String schoolName;
+
         @ApiModelProperty("用户帐号ID")
         private Long userId;
 
@@ -99,6 +122,12 @@ public class SchoolStaffWrapper {
         @ApiModelProperty("用户头像")
         private String avatar;
 
+        @ApiModelProperty("帐号状态(注销 -1,冻结 9,激活 0)")
+        private String status;
+
+        @ApiModelProperty("注册时间")
+        private Date createTime;
+
         @ApiModelProperty("验证码")
         private String smsCode;
         
@@ -334,6 +363,8 @@ public class SchoolStaffWrapper {
         @ApiModelProperty("机构编号")
         private Integer tenantId;
 
+        @ApiModelProperty("帐号状态(注销 -1,冻结 9,激活 0)")
+        private String status;
         public Date getUpdateTime() {
             return Optional.ofNullable(updateTime).orElse(DateTime.now().toDate());
         }

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

@@ -189,6 +189,8 @@ public class StudentWrapper {
         @ApiModelProperty(value = "在团状态 在团 IN 退团 OUT 申请退团 APPLY_OUT 报名:APPLY 休学:QUIT_SCHOOL")
         private EInGroupStatus inGroupStatus;
 
+        @ApiModelProperty(value = "退团时间")
+        private Date quitTime;
     }
 
 

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

@@ -761,4 +761,14 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
      * @param teachingPoint 教学点信息
      */
     Boolean teachingPoint(TeachingPointWrapper.TeachingPoint teachingPoint);
+
+
+    /**
+     * 时间段内的课程
+     *
+     * @param teacherId 老师ID
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     */
+    List<CourseSchedule> getByTeacherAndTime(Integer teacherId, Date startTime, Date endTime);
 }

+ 11 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java

@@ -29,7 +29,6 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	 */
 	boolean importStudentToMusicGroup(String musicGroupId, Map<String, List<Map<String, Object>>> excelData);
 
-    @Transactional(rollbackFor = Exception.class)
     void importStudentToMusicGroup1(List<MusicGroupPaymentImportDto> importDtos, MusicGroupPaymentCalender calender) throws Exception;
 
     /**
@@ -76,7 +75,6 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
      */
     Map sporadicPay(SporadicPayDto sporadicPayDto) throws Exception;
 
-    @Transactional(rollbackFor = Exception.class)
     void importRenew(List<MusicGroupPaymentImportDto> importDtos) throws Exception;
 
     /**
@@ -176,6 +174,9 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
     boolean applyQuitMusicGroup(List<SysUserRoleEnum> currentOperatorRoleIds, MusicGroupQuit reqMusicGroupQuit);
 
 
+    @Transactional(rollbackFor = Exception.class)
+    boolean applyQuitMusicGroup(List<SysUserRoleEnum> currentOperatorRoleIds, MusicGroupQuit reqMusicGroupQuit, String client);
+
     /**
      * 取消退团
      *
@@ -470,4 +471,12 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
      * 获取乐团信息
      */
     Map<Long,MusicGroup> getMapByIds(List<Long> musicGroupIds);
+
+    /**
+     * 获取乐团信息
+     *
+     * @param musicGroupId 乐团id
+     * @param coopId 合作单位id
+     */
+    List<Subject> getSubjectListByIdAndCoopId(String musicGroupId, Integer coopId);
 }

+ 24 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysNewsInformationService.java

@@ -0,0 +1,24 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dao.SysNewsInformationDao;
+import com.ym.mec.biz.dal.entity.SysNewsInformation;
+import com.ym.mec.biz.dal.school.dto.NewsInformationDto;
+import com.ym.mec.common.exception.BizException;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+
+/**
+ * 新闻资讯表(SysNewsInformation)表服务接口
+ *
+ * @author zx
+ * @since 2023-05-11 16:08:27
+ */
+public interface SysNewsInformationService extends IService<SysNewsInformation> {
+
+    SysNewsInformationDao getDao();
+
+    List<NewsInformationDto> queryPage(Integer type,Integer coopId) throws Exception;
+}
+

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

@@ -2668,6 +2668,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (musicGroup.getStatus() == PROGRESS) {
             imUserFriendService.refreshClassImUserFriend(classGroupId);
         }
+
+        // 通知学校端
+
+
         return BaseController.succeed(classGroup);
     }
 

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

@@ -5,9 +5,11 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
+import com.ym.mec.biz.dal.mapper.SchoolStaffMapper;
 import com.ym.mec.biz.service.CooperationOrganService;
 import com.ym.mec.biz.service.ImGroupMemberService;
 import com.ym.mec.biz.service.ImGroupService;
+import com.ym.mec.biz.service.SchoolStaffService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import org.apache.commons.collections.CollectionUtils;
@@ -41,6 +43,9 @@ public class CooperationOrganServiceImpl extends BaseServiceImpl<Integer, Cooper
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private SchoolStaffMapper schoolStaffMapper;
+
 	@Override
 	public BaseDAO<Integer, CooperationOrgan> getDAO() {
 		return cooperationOrganDao;
@@ -129,6 +134,10 @@ public class CooperationOrganServiceImpl extends BaseServiceImpl<Integer, Cooper
 		}
 		
 		cooperationOrganDao.update(cooperationOrgan);
+
+        // 修改合作单位下的用户,改为锁定
+
+        schoolStaffMapper.updateStatusAndRecoveryStatus(cooperationOrgan.getIsEnable(), cooperationOrgan.getId());
 	}
 
 	@Override

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

@@ -21,6 +21,8 @@ import com.ym.mec.biz.dal.wrapper.CoursePatrolEvaluationWrapper;
 import com.ym.mec.biz.dal.mapper.CoursePatrolEvaluationMapper;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDate;
+import java.time.ZoneId;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -159,6 +161,10 @@ public class CoursePatrolEvaluationServiceImpl extends ServiceImpl<CoursePatrolE
         if (courseSchedule.getStatus().equals(CourseStatusEnum.NOT_START)) {
             throw new BizException("课程未开始,不允许做巡堂评价");
         }
+        LocalDate localDate = courseSchedule.getClassDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        if (localDate.isBefore(LocalDate.now())) {
+            throw new BizException("不可添加昨天及昨天之前的课堂评价");
+        }
 
         CoursePatrolEvaluation one = this.lambdaQuery().eq(CoursePatrolEvaluation::getCourseScheduleId, coursePatrolEvaluation.getCourseScheduleId())
                 .last("limit 1")

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

@@ -3604,6 +3604,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_COURSE_SCHEDULE_CHANGE_RESULT, map, null, 0, "7",
 						"TEACHER");
 			}
+
+            // 推送消息到学校端
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
@@ -6039,11 +6041,15 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		LocalDate endDate = LocalDate.parse(endTerm, formatter);
 		Map<String, List<DailySummaryOfClassesForTheCurrentSemesterDto>> result = new LinkedHashMap<>(30);
 		LocalDate currentWeekStart = startDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
+		DateTimeFormatter format = DateTimeFormatter.ofPattern("yy年MM月dd日");
 		StringBuffer sb;
 		while (!currentWeekStart.isAfter(endDate)) {
 			int currentWeekNumber = (int) ChronoUnit.WEEKS.between(startDate, currentWeekStart);
-			sb = new StringBuffer("第").append(toChineseNumber(currentWeekNumber)).append("周");
+			String weekStart = currentWeekStart.format(format);
+			sb = new StringBuffer("第").append(toChineseNumber(currentWeekNumber)).append("周 (").append(weekStart).append("-");
 			LocalDate currentWeekEnd = currentWeekStart.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
+			String endStart = currentWeekEnd.format(format);
+			sb.append(endStart).append(")");
 			List<DailySummaryOfClassesForTheCurrentSemesterDto> currentWeekDates = new ArrayList<>();
 			for (DailySummaryOfClassesForTheCurrentSemesterDto dto : summary) {
 				if (!dto.getCourseDate().isBefore(currentWeekStart) && dto.getCourseDate().isBefore(currentWeekEnd)) {
@@ -6196,8 +6202,14 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         return true;
     }
 
+    @Override
+    public List<CourseSchedule> getByTeacherAndTime(Integer teacherId, Date startTime, Date endTime) {
+        return courseScheduleDao.getByTeacherAndTime(teacherId,startTime,endTime);
+    }
 
-	@Override
+
+
+    @Override
 	public List<CourseStudentDto> queryCourseStudentList(Long courseId) {
 		List<CourseStudentDto> courseStudentDtos = studentAttendanceDao.queryCourseStudentList(courseId);
 		if(CollectionUtils.isNotEmpty(courseStudentDtos)){

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

@@ -131,6 +131,9 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
             throw new BizException("请勿重复提交");
         }
         SysUser user = teacherDao.getUserWithPhone(employee.getPhone());
+        if (user !=null && user.getUserType().contains("SCHOOL")) {
+            throw new BizException("用户已存在学校账户");
+        }
         Integer tenantId = employee.getTenantId();
         if (user != null && user.getId() != null) {
             checkTenantId(tenantId, user.getTenantId());

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

@@ -2,6 +2,8 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
@@ -15,6 +17,7 @@ import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.MusicGroupQueryInfo;
 import com.ym.mec.biz.dal.page.MusicMemberQueryInfo;
 import com.ym.mec.biz.dal.vo.MusicGroupDeliveryVo;
+import com.ym.mec.biz.dal.wrapper.SchoolStaffWrapper;
 import com.ym.mec.biz.event.source.GroupEventSource;
 import com.ym.mec.biz.event.source.SendSeoMessageSource;
 import com.ym.mec.biz.service.*;
@@ -34,6 +37,7 @@ import com.ym.mec.util.excel.POIUtil;
 import com.ym.mec.util.http.HttpUtil;
 import com.ym.mec.util.ini.IniFileUtil;
 import com.ym.mec.util.json.JsonUtil;
+import com.ym.mec.util.string.MessageFormatter;
 import com.ym.mec.util.validator.CommonValidator;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -217,6 +221,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Autowired
     private MusicGroupPaymentCalenderActivityDao musicGroupPaymentCalenderActivityDao;
 
+    @Autowired
+    private SchoolStaffService schoolStaffService;
+
+    @Autowired
+    private SysMessageConfigDao sysMessageConfigDao;
+
     private SimpleDateFormat sdf_ymd = new SimpleDateFormat("yyyy-MM-dd");
 
     private SimpleDateFormat sdf_hms = new SimpleDateFormat("HH:mm:ss");
@@ -2238,6 +2248,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean applyQuitMusicGroup(List<SysUserRoleEnum> currentOperatorRoleIds, MusicGroupQuit reqMusicGroupQuit) {
+        return applyQuitMusicGroup(currentOperatorRoleIds, reqMusicGroupQuit, null);
+    }
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean applyQuitMusicGroup(List<SysUserRoleEnum> currentOperatorRoleIds, MusicGroupQuit reqMusicGroupQuit, String client) {
         Integer userId = reqMusicGroupQuit.getUserId();
         String musicGroupId = reqMusicGroupQuit.getMusicGroupId();
         String reason = reqMusicGroupQuit.getReason();
@@ -2329,6 +2344,36 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         musicGroupQuitDao.insert(musicGroupQuit);
 
+
+        // 学生端提交退团申请推送
+        // 推送异常考勤消息
+        if("STUDENT".equals(client)){
+
+            // 乐团信息
+            SysUser student = sysUserFeignService.queryUserById(musicGroupQuit.getUserId());
+
+            IPage<SchoolStaffWrapper.SchoolStaff> page = schoolStaffService.selectPage(new Page<>(1, -1),
+                    SchoolStaffWrapper.SchoolStaffQuery.builder().schoolId(musicGroup.getCooperationOrganId().longValue()).build());
+            List<SchoolStaffWrapper.SchoolStaff> records = page.getRecords();
+            if (CollectionUtils.isNotEmpty(records)) {
+
+                Map<Integer, String> userMap = new HashMap<>();
+                records.forEach(o -> {
+                    userMap.put(o.getUserId().intValue(), o.getUserId().toString());
+                });
+
+                SysMessageConfig sysMessageConfig = sysMessageConfigDao.queryByType(MessageTypeEnum.JIGUANG_STUDENT_QUIT_GROUP_APPLY.getCode());
+                String url = sysMessageConfig.getUrl();
+
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.JIGUANG_STUDENT_QUIT_GROUP_APPLY,
+                        userMap, null, 0, url,
+                        "SCHOOL",musicGroup.getName(),student.getUsername());
+            }
+        }
+
+        // 后台通过退团申请推送
+
+
         if (reqMusicGroupQuit.getStatus() == PROCESSING) {
             SysUser sysUser = sysUserFeignService.queryUserById(userId);
 
@@ -2694,6 +2739,22 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 //                        PlatformCashAccountDetailTypeEnum.REFUNDS, null, SUCCESS, "退出乐团", null);
             }
         }
+
+        // 推送退团消息
+        IPage<SchoolStaffWrapper.SchoolStaff> page = schoolStaffService.selectPage(new Page<>(1, -1),
+                SchoolStaffWrapper.SchoolStaffQuery.builder().schoolId(musicGroup.getCooperationOrganId().longValue()).build());
+        List<SchoolStaffWrapper.SchoolStaff> records = page.getRecords();
+        if (CollectionUtils.isNotEmpty(records)) {
+
+            SysUser sysUser = sysUserFeignService.queryUserById(userId);
+
+            Map<Integer, String> userMap = new HashMap<>();
+            records.forEach(o -> userMap.put(o.getUserId().intValue(), o.getUserId().toString()));
+
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.JIGUANG_STUDENT_QUIT_GROUP,
+                    userMap, null, 0, null,
+                    "SCHOOL",musicGroup.getName(),sysUser.getUsername());
+        }
         return true;
     }
 
@@ -4207,4 +4268,16 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
         return musicGroupByIds.stream().collect(Collectors.toMap(o -> Long.parseLong(o.getId()), Function.identity()));
     }
+
+
+    /**
+     * 获取乐团信息
+     *
+     * @param musicGroupId 乐团id
+     * @param coopId 合作单位id
+     */
+    @Override
+    public List<Subject> getSubjectListByIdAndCoopId(String musicGroupId, Integer coopId) {
+        return subjectDao.getSubjectListByIdAndCoopId(musicGroupId,coopId);
+    }
 }

+ 89 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolStaffServiceImpl.java

@@ -2,26 +2,26 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+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.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.entity.CooperationOrgan;
-import com.ym.mec.biz.dal.entity.SchoolStaff;
-import com.ym.mec.biz.dal.entity.SysConfig;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.school.ESchoolStaffType;
 import com.ym.mec.biz.dal.mapper.SchoolStaffMapper;
 import com.ym.mec.biz.dal.wrapper.SchoolStaffWrapper;
 import com.ym.mec.biz.dal.wrapper.StatGroupWrapper;
-import com.ym.mec.biz.service.CooperationOrganService;
-import com.ym.mec.biz.service.SchoolStaffService;
-import com.ym.mec.biz.service.SmsCodeService;
-import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
+import com.ym.mec.util.string.MessageFormatter;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -35,12 +35,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.text.MessageFormat;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -69,12 +64,24 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
     @Value("${message.debugMode:false}")
     private boolean debugMode;
 
-	/**
+    @Autowired
+    private SysMessageService sysMessageService;
+
+    @Autowired
+    private SchoolStaffService schoolStaffService;
+
+    @Autowired
+    private SysMessageConfigDao sysMessageConfigDao;
+
+    @Autowired
+    private OrganizationService organizationService;
+
+    /**
      * 查询详情
      * @param id 详情ID
      * @return SchoolStaff
      */
-	@Override
+    @Override
     public SchoolStaff detail(Long id) {
         
         return baseMapper.selectById(id);
@@ -88,10 +95,35 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
      */
     @Override
     public IPage<SchoolStaffWrapper.SchoolStaff> selectPage(IPage<SchoolStaffWrapper.SchoolStaff> page, SchoolStaffWrapper.SchoolStaffQuery query) {
-        
-        return page.setRecords(baseMapper.selectPage(page, query));
+        List<SchoolStaffWrapper.SchoolStaff> schoolStaffs = baseMapper.selectPage(page, query);
+        if (CollectionUtils.isEmpty(schoolStaffs)) {
+            return page;
+        }
+
+        // 设置分部名称
+
+        // 分部ID集合
+        List<Integer> organIds = schoolStaffs.stream()
+                .flatMap(o -> Arrays.stream(o.getOrganId().split(",")))
+                .map(Integer::parseInt)
+                .collect(Collectors.toList());
+
+
+        Map<Integer, Organization> organizationMap = organizationService.getMapByIds(organIds);
+
+        for (SchoolStaffWrapper.SchoolStaff schoolStaff : schoolStaffs) {
+            String collect = Arrays.stream(schoolStaff.getOrganId().split(","))
+                    .map(Integer::parseInt)
+                    .map(organizationMap::get)
+                    .filter(Objects::nonNull)
+                    .map(o -> o.getName())
+                    .collect(Collectors.joining(","));
+            schoolStaff.setOrganName(collect);
+        }
+
+        return page.setRecords(schoolStaffs);
     }
-	
+
     /**
      * 添加
      * @param schoolStaff SchoolStaffWrapper.SchoolStaff
@@ -178,6 +210,44 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
         // 删除缓存锁
         redissonClient.getBucket(submitLockKey).delete();
 
+        // 消息推送
+
+        // 推送给自己
+
+        Map<Integer, String> userMap = new HashMap<>();
+        userMap.put(user.getId(), user.getId().toString());
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.JIGUANG_SCHOOL_ACCOUNT_REGISTER_NOTICE,
+                userMap, null, 0, null,
+                "SCHOOL",cooperation.getName(),schoolStaff.getUserType().getDescribe());
+
+
+        // 推送给学校自己外的其他用户
+        IPage<SchoolStaffWrapper.SchoolStaff> page = schoolStaffService.selectPage(new Page<>(1, -1),
+                SchoolStaffWrapper.SchoolStaffQuery.builder().schoolId(schoolStaff.getSchoolId()).build());
+        List<SchoolStaffWrapper.SchoolStaff> records = page.getRecords();
+        if (CollectionUtils.isNotEmpty(records)) {
+
+            Map<Integer, String> usersMap = new HashMap<>();
+            records.stream()
+                    .filter( o -> !o.getUserId().equals(schoolStaff.getUserId()))
+                    .forEach(o -> usersMap.put(o.getUserId().intValue(), o.getUserId().toString()));
+
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.JIGUANG_SCHOOL_ACCOUNT_REGISTER,
+                    usersMap, null, 0, null,
+                    "SCHOOL",schoolStaff.getUsername(),cooperation.getName(),schoolStaff.getUserType().getDescribe());
+        }
+
+        // 推送给自己的短信
+        Map<Integer, String> selfMap = new HashMap<>();
+        selfMap.put(user.getId(), user.getPhone());
+
+
+        SysMessageConfig sysMessageConfig = sysMessageConfigDao.queryByType(MessageTypeEnum.JIGUANG_TEACHER_SIGN_IN_EXCEPTION.getCode());
+        String url = sysMessageConfig.getUrl();
+
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_SCHOOL_ACCOUNT_REGISTER,
+                selfMap, null, 0, null,
+                "SCHOOL",cooperation.getName(),schoolStaff.getUserType().getDescribe(),url);
         return true;
     }
 
@@ -376,6 +446,7 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
     @Override
     public void updateCooperation(SchoolStaffWrapper.Cooperation info) {
 
+        info.setStatus("0");
         // 合作单位信息
         cooperationOrganDao.update(JSON.parseObject(info.jsonString(), CooperationOrgan.class));
     }

+ 30 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java

@@ -1,6 +1,8 @@
 package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
@@ -10,10 +12,8 @@ import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.dal.page.ExportStudentAttendanceQueryInfo;
 import com.ym.mec.biz.dal.page.StudentAttendanceQueryInfo;
-import com.ym.mec.biz.service.StudentAttendanceService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.SysMessageService;
-import com.ym.mec.biz.service.SysTenantConfigService;
+import com.ym.mec.biz.dal.wrapper.SchoolStaffWrapper;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -74,6 +74,11 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
     @Autowired
     private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
 
+    @Autowired
+    private SchoolStaffService schoolStaffService;
+
+    @Autowired
+    private MusicGroupDao musicGroupDao;
     @Override
     public BaseDAO<Long, StudentAttendance> getDAO() {
         return studentAttendanceDao;
@@ -423,6 +428,27 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
                 new String[]{courseSchedule.getActualTeacherId().toString()},
                 null, DateUtil.dateToString(courseSchedule.getStartClassTime(), "yyyy年MM月dd日 HH点mm分"),
                 courseSchedule.getType().getMsg(), sysUser.getUsername(), remark);
+
+        // 发送消息到学校端
+        MusicGroup musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
+
+        IPage<SchoolStaffWrapper.SchoolStaff> page = schoolStaffService.selectPage(new Page<>(1, -1),
+                SchoolStaffWrapper.SchoolStaffQuery.builder().schoolId(musicGroup.getCooperationOrganId().longValue()).build());
+        List<SchoolStaffWrapper.SchoolStaff> records = page.getRecords();
+        if (org.apache.commons.collections.CollectionUtils.isNotEmpty(records)) {
+
+            Map<Integer, String> userMap = new HashMap<>();
+            records.forEach(o -> userMap.put(o.getUserId().intValue(), o.getUserId().toString()));
+
+            String classDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
+            String startClassTime = DateUtil.format(courseSchedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+            String endClassTime = DateUtil.format(courseSchedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+            String leaveTime = classDate + " " + startClassTime + "-" + endClassTime;
+
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.JIGUANG_STUDENT_LEAVE,
+                    userMap, null, 0, null,
+                    "SCHOOL",musicGroup.getName(),sysUser.getUsername(),leaveTime,courseSchedule.getName());
+        }
         return true;
     }
 

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

@@ -779,6 +779,9 @@ public class StudentManageServiceImpl implements StudentManageService {
         }
         Date date = new Date();
         SysUser sysUser = teacherDao.getUserWithPhone(student.getPhone());
+        if (sysUser !=null && sysUser.getUserType().contains("SCHOOL")) {
+            throw new BizException("用户已存在学校账户");
+        }
         if (sysUser != null) {
             EmployeeServiceImpl.checkTenantId(student.getTenantId(), sysUser.getTenantId());
             if (sysUser.getUserType().contains("STUDENT")) {

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

@@ -1323,7 +1323,9 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     @Override
     public IPage<StudentWrapper.StudentList> userPage(IPage<StudentWrapper.StudentList> page, StudentWrapper.StudentQuery queryInfo) {
 
-        queryInfo.setStatusList(Arrays.asList(StudentMusicGroupStatusEnum.NORMAL, StudentMusicGroupStatusEnum.QUIT, StudentMusicGroupStatusEnum.QUIT_SCHOOL));
+        if (CollectionUtils.isEmpty(queryInfo.getStatusList())) {
+            queryInfo.setStatusList(Arrays.asList(StudentMusicGroupStatusEnum.NORMAL, StudentMusicGroupStatusEnum.QUIT, StudentMusicGroupStatusEnum.QUIT_SCHOOL));
+        }
         List<StudentWrapper.StudentList> studentLists = studentPlusMapper.userPage(page, queryInfo);
 
         if (CollectionUtils.isEmpty(studentLists)) {
@@ -1364,7 +1366,6 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         // 查询作业
         studentHomeworkData(studentLists, studentAttendanceQuery);
 
-
         return page.setRecords(studentLists);
     }
 
@@ -1381,7 +1382,7 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         StudentWrapper.StudentDetail studentDetail = JSON.parseObject(JSON.toJSONString(studentList), StudentWrapper.StudentDetail.class);
 
         // 查询学生信息
-        StudentRegistration studentRegister = studentRegistrationService.getStudentRegister(queryInfo.getMusicGroupId().toString(), queryInfo.getStudentId());
+        StudentRegistration studentRegister = studentRegistrationService.getStudentRegister(queryInfo.getMusicGroupId(), queryInfo.getStudentId());
         if (studentRegister == null) {
             return studentDetail;
         }
@@ -1402,8 +1403,9 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
                 .cooperationOrganId(queryInfo.getCooperationOrganId())
                 .studentId(queryInfo.getStudentId())
                 .musicGroupId(queryInfo.getMusicGroupId())
-                .startTime(DateUtil.toDate(DateUtil.getStartTerm(new Date())))
-                .endTime(DateUtil.toDateTime(DateUtil.getEndTerm(new Date()) + " 23:59:59"))
+                // 时间为本学期
+//                .startTime(DateUtil.toDate(DateUtil.getStartTerm(new Date())))
+//                .endTime(DateUtil.toDateTime(DateUtil.getEndTerm(new Date()) + " 23:59:59"))
                 .build();
         List<SchoolActivityWrapper.SchoolActivity> schoolActivities = schoolActivityMapper.selectPage(new Page<>(1, -1), build);
         if (!CollectionUtils.isEmpty(schoolActivities)) {
@@ -1412,12 +1414,13 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
 
         // 在团状态
         MusicGroupQuit musicGroupQuit = musicGroupQuitDao
-                .queryByUserIdAndMusicGroupId(queryInfo.getStudentId(), queryInfo.getMusicGroupId().toString());
+                .queryByUserIdAndMusicGroupId(queryInfo.getStudentId(), queryInfo.getMusicGroupId());
 
         if (StudentMusicGroupStatusEnum.APPLY.equals(studentRegister.getMusicGroupStatus())) {
             studentDetail.setInGroupStatus(EInGroupStatus.APPLY);
         } else if (StudentMusicGroupStatusEnum.QUIT.equals(studentRegister.getMusicGroupStatus())) {
             studentDetail.setInGroupStatus(EInGroupStatus.OUT);
+            studentDetail.setQuitTime(musicGroupQuit.getQuitDate());
         } else if (StudentMusicGroupStatusEnum.NORMAL.equals(studentRegister.getMusicGroupStatus())) {
             studentDetail.setInGroupStatus(EInGroupStatus.IN);
             if (musicGroupQuit != null && musicGroupQuit.getStatus().equals(ApprovalStatus.PROCESSING)) {

+ 81 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysNewsInformationServiceImpl.java

@@ -0,0 +1,81 @@
+package com.ym.mec.biz.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.gson.JsonObject;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupQuitDao;
+import com.ym.mec.biz.dal.dao.SysNewsInformationDao;
+import com.ym.mec.biz.dal.entity.SysNewsInformation;
+import com.ym.mec.biz.dal.school.dto.NewsInformationDto;
+import com.ym.mec.biz.service.SysNewsInformationService;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.tenant.TenantContextHolder;
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.collections.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * 新闻资讯表(SysNewsInformation)表服务实现类
+ *
+ * @author zx
+ * @since 2023-05-11 16:08:28
+ */
+@Service("sysNewsInformationService")
+public class SysNewsInformationServiceImpl extends ServiceImpl<SysNewsInformationDao, SysNewsInformation> implements SysNewsInformationService {
+
+    private final static Logger log = LoggerFactory.getLogger(SysNewsInformationServiceImpl.class);
+
+    @Override
+    public SysNewsInformationDao getDao(){
+            return this.baseMapper;
+    }
+
+    @Resource
+    private MusicGroupQuitDao musicGroupQuitDao;
+    @Resource
+    private MusicGroupDao musicGroupDao;
+
+    @Override
+    public List<NewsInformationDto> queryPage(Integer type,Integer coopId) throws Exception {
+        List<SysNewsInformation> dtos = this.lambdaQuery()
+                .eq(SysNewsInformation::getType, type)
+                .eq(SysNewsInformation::getStatus, 1)
+                .eq(SysNewsInformation::getDelFlag, false)
+                .orderByAsc(SysNewsInformation::getOrder).list();
+        List<NewsInformationDto> resultList = new ArrayList<>();
+        if(CollectionUtils.isNotEmpty(dtos)){
+            List<String> musicGroupIds = musicGroupDao.findNormalByCooperationId(coopId);
+            if(CollectionUtils.isNotEmpty(musicGroupIds)){
+                for (SysNewsInformation dto : dtos) {
+                    NewsInformationDto informationDto = JSON.parseObject(JSON.toJSONString(dto), NewsInformationDto.class);
+                    if(informationDto.getRedPoint() != null){
+                        //统计是否有红点
+                        switch (informationDto.getRedPoint()) {
+                            //待办事项
+                            case BACKLOG:
+                                informationDto.setRedPointFlag(musicGroupQuitDao.countRedPointBySchool(musicGroupIds));
+                                break;
+                            case SITE_MANAGE:
+                                //todo 场地管理
+                                break;
+                        }
+                    }
+                    resultList.add(informationDto);
+                }
+            }
+        }
+        return resultList;
+    }
+
+}
+

+ 63 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -2,6 +2,8 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
@@ -13,6 +15,7 @@ import com.ym.mec.biz.dal.page.TeacherCloseQueryInfo;
 import com.ym.mec.biz.dal.school.dto.TeacherAttendanceListDto;
 import com.ym.mec.biz.dal.school.dto.TeacherAttendanceSumDto;
 import com.ym.mec.biz.dal.school.page.TeacherAttendanceQueryInfo;
+import com.ym.mec.biz.dal.wrapper.SchoolStaffWrapper;
 import com.ym.mec.biz.event.source.SendMessageSource;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
@@ -25,6 +28,7 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.string.MessageFormatter;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -91,6 +95,12 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
     @Autowired
     private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
 
+    @Autowired
+    private SchoolStaffService schoolStaffService;
+
+    @Autowired
+    private SysMessageConfigDao sysMessageConfigDao;
+
 	@Override
 	public BaseDAO<Long, TeacherAttendance> getDAO() {
 		return teacherAttendanceDao;
@@ -287,6 +297,33 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			}else{
 				teacherAttendanceDao.insert(teacherAttendance);
 			}
+            // 推送异常考勤消息
+            if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
+
+                // 乐团信息
+                MusicGroup musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
+
+                IPage<SchoolStaffWrapper.SchoolStaff> page = schoolStaffService.selectPage(new Page<>(1, -1),
+                        SchoolStaffWrapper.SchoolStaffQuery.builder().schoolId(musicGroup.getCooperationOrganId().longValue()).build());
+                List<SchoolStaffWrapper.SchoolStaff> records = page.getRecords();
+                if (CollectionUtils.isNotEmpty(records)) {
+
+                    Map<Integer, String> userMap = new HashMap<>();
+                    records.forEach(o -> userMap.put(o.getUserId().intValue(), o.getUserId().toString()));
+
+                    SysMessageConfig sysMessageConfig = sysMessageConfigDao.queryByType(MessageTypeEnum.JIGUANG_TEACHER_SIGN_IN_EXCEPTION.getCode());
+                    String url = MessageFormatter.arrayFormat(sysMessageConfig.getUrl(),courseSchedule.getActualTeacherId(), courseSchedule.getClassGroupId());
+
+                    // 课程时间
+                    String courseTime = classDate +" " + startClassTime + "-" + endClassTime;
+                    sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.JIGUANG_TEACHER_SIGN_IN_EXCEPTION,
+                            userMap, null, 0, url,
+                            "SCHOOL",musicGroup.getName(),user.getRealName(),courseTime,courseSchedule.getName());
+                }
+            }
+
+
+
 			return result;
 		}else if(teacherAttendance.getSignOutTime() == null && teacherSignOutDto.getTeacherAttendanceInfo().getStatus().equals(SignStatusEnum.SIGN_OUT.getCode())){
 			int i = studentAttendanceDao.countByCourseSchedule(courseSchedule.getId());
@@ -488,6 +525,32 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
                 examinationSaveDto.setMusicGroupId(teacherAttendance.getMusicGroupId());
 				lessonExaminationService.publish(examinationSaveDto);
 			}
+
+
+            // 推送异常考勤消息
+            if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
+
+                // 乐团信息
+                MusicGroup musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
+
+                IPage<SchoolStaffWrapper.SchoolStaff> page = schoolStaffService.selectPage(new Page<>(1, -1),
+                        SchoolStaffWrapper.SchoolStaffQuery.builder().schoolId(musicGroup.getCooperationOrganId().longValue()).build());
+                List<SchoolStaffWrapper.SchoolStaff> records = page.getRecords();
+                if (CollectionUtils.isNotEmpty(records)) {
+
+                    Map<Integer, String> userMap = new HashMap<>();
+                    records.forEach(o -> userMap.put(o.getUserId().intValue(), o.getUserId().toString()));
+
+                    SysMessageConfig sysMessageConfig = sysMessageConfigDao.queryByType(MessageTypeEnum.JIGUANG_TEACHER_SIGN_OUT_EXCEPTION.getCode());
+                    String url = MessageFormatter.arrayFormat(sysMessageConfig.getUrl(),courseSchedule.getActualTeacherId(), courseSchedule.getClassGroupId());
+
+                    // 课程时间
+                    String courseTime = classDate +" " + startClassTime + "-" + endClassTime;
+                    sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.JIGUANG_TEACHER_SIGN_OUT_EXCEPTION,
+                            userMap, null, 0,url,
+                            "SCHOOL",musicGroup.getName(),user.getRealName(),courseTime,courseSchedule.getName());
+                }
+            }
 			return result;
 		}
 

+ 53 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherLeaveRecordServiceImpl.java

@@ -1,20 +1,26 @@
 package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dao.TeacherLeaveRecordDao;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
+import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.dal.entity.TeacherLeaveRecord;
 import com.ym.mec.biz.dal.entity.TeacherLeaveRecord.CoursesScheduleHistory;
 import com.ym.mec.biz.dal.enums.AuditStatusEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.SysUserRoleEnum;
+import com.ym.mec.biz.dal.wrapper.SchoolStaffWrapper;
 import com.ym.mec.biz.event.source.SendSeoMessageSource;
 import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.biz.service.SchoolStaffService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.biz.service.TeacherLeaveRecordService;
 import com.ym.mec.common.controller.BaseController;
@@ -55,6 +61,11 @@ public class TeacherLeaveRecordServiceImpl extends BaseServiceImpl<Long, Teacher
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private SchoolStaffService schoolStaffService;
+
+    @Autowired
+    private MusicGroupDao musicGroupDao;
 	@Override
 	public BaseDAO<Long, TeacherLeaveRecord> getDAO() {
 		return teacherLeaveRecordDao;
@@ -159,6 +170,48 @@ public class TeacherLeaveRecordServiceImpl extends BaseServiceImpl<Long, Teacher
 		map.put(teacher.getId(),teacher.getId() + "");
 		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_LEAVE_RESULT,
 				map,null,0,"7","TEACHER",status.getMsg());
+
+        // 老师请假推送
+
+        // 查询有课的老师的合作单位 发送请假推送
+
+        List<CourseSchedule> courseSchedules = courseScheduleService.getByTeacherAndTime(teacherLeaveRecord.getUserId(),teacherLeaveRecord.getStartTime(),teacherLeaveRecord.getEndTime());
+        if (!CollectionUtils.isEmpty(courseSchedules)) {
+            Set<String> musicGroupIds = courseSchedules.stream().map(CourseSchedule::getMusicGroupId).collect(Collectors.toSet());
+            if (!CollectionUtils.isEmpty(musicGroupIds)) {
+                List<MusicGroup> musicGroups = musicGroupDao.getMusicGroupByIds(new ArrayList<>(musicGroupIds));
+                Set<Integer> coopIds = musicGroups.stream().map(o -> o.getCooperationOrganId()).collect(Collectors.toSet());
+                IPage<SchoolStaffWrapper.SchoolStaff> page = schoolStaffService.selectPage(new Page<>(1, -1),
+                        SchoolStaffWrapper.SchoolStaffQuery.builder().schoolIds(new ArrayList<>(coopIds.stream().map(Long::valueOf).collect(Collectors.toList()))).build());
+                List<SchoolStaffWrapper.SchoolStaff> records = page.getRecords();
+                if (!CollectionUtils.isEmpty(records)) {
+
+                    // 按照合作单位分组
+                    Map<Long, List<SchoolStaffWrapper.SchoolStaff>> coopMap = records.stream().collect(Collectors.groupingBy(SchoolStaffWrapper.SchoolStaff::getSchoolId));
+
+                    // 乐团按照合作单位分组
+                    Map<Integer, List<MusicGroup>> musicGroupMap = musicGroups.stream().collect(Collectors.groupingBy(MusicGroup::getCooperationOrganId));
+
+                    StringBuilder leaveTime = new StringBuilder(DateUtil.dateTimeToString(teacherLeaveRecord.getStartTime()) + "-" + DateUtil.dateTimeToString(teacherLeaveRecord.getEndTime()));
+                    coopMap.forEach((k, v) -> {
+                        List<MusicGroup> musicGroupList = musicGroupMap.get(k.intValue());
+                        if (!CollectionUtils.isEmpty(musicGroupList)) {
+
+                            Map<Integer, String> userMap = new HashMap<>();
+                            v.forEach(o -> userMap.put(o.getUserId().intValue(), o.getUserId().toString()));
+                            musicGroupList.forEach(o -> {
+                                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.JIGUANG_TEACHER_LEAVE,
+                                        userMap, null, 0, null,
+                                        "SCHOOL",o.getName(),teacher.getRealName(), leaveTime.toString());
+                            });
+                        }
+                    });
+
+                }
+
+            }
+        }
+
 		return BaseController.succeed();
 	}
 

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

@@ -101,6 +101,9 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
     @Transactional(rollbackFor = Exception.class)
     public int add(Teacher teacher) throws Exception {
         SysUser user = teacherDao.getUserWithPhone(teacher.getPhone());
+        if (user !=null && user.getUserType().contains("SCHOOL")) {
+            throw new BizException("用户已存在学校账户");
+        }
         if (user != null && user.getId() != null) {
             EmployeeServiceImpl.checkTenantId(teacher.getTenantId(), user.getTenantId());
             if (user.getUserType().contains("TEACHER")) {

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

@@ -38,10 +38,10 @@
 	
 	<insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO cooperation_organ_linkman
-		(id_,cooperation_organ_id_,linkman_,mobile_no_,job_,create_time_,tenant_id_,logo_)
+		(id_,cooperation_organ_id_,linkman_,mobile_no_,job_,create_time_,tenant_id_)
 		VALUES
 		<foreach collection="list" item="item" separator=",">
-		(#{item.id},#{item.cooperationOrganId},#{item.linkman},#{item.mobileNo},#{item.job},#{item.createTime},#{item.tenantId},#{item.logo})
+		(#{item.id},#{item.cooperationOrganId},#{item.linkman},#{item.mobileNo},#{item.job},#{item.createTime},#{item.tenantId})
 		</foreach>
 	</insert>
 

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

@@ -4276,4 +4276,12 @@
             </foreach>
         </if>
     </select>
+
+    <select id="getByTeacherAndTime" resultMap="CourseSchedule">
+        select * from course_schedule
+        where teacher_id_ = #{teacherId}
+        and CONCAT(class_date_," ",end_class_time_) &gt;= #{startTime}
+        and CONCAT(class_date_," ",start_class_time_) &lt;= #{endTime}
+
+    </select>
 </mapper>

+ 7 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupQuitMapper.xml

@@ -245,4 +245,11 @@
             </if>
         </where>
     </select>
+    <select id="countRedPointBySchool" resultType="java.lang.Boolean">
+        select COUNT(0) from music_group_quit mgq WHERE mgq.school_staff_audit_status_ = 'ING'
+        AND mgq.music_group_id_ IN
+        <foreach collection="musicGroupIds" open="(" close=")" item="musicGroupId" separator=",">
+            #{musicGroupId}
+        </foreach>
+    </select>
 </mapper>

+ 8 - 0
mec-biz/src/main/resources/config/mybatis/SchoolActivityMapper.xml

@@ -38,14 +38,22 @@
                 AND t.type_ = #{param.type}
             </if>
         </where>
+        order by t.start_time_ desc
 	</select>
 
     <select id="getUserList" resultType="com.ym.mec.biz.dal.wrapper.SchoolActivityWrapper$SchoolActivityStudent">
         select distinct s.user_id_ as studentId
             , sr.actual_subject_id_ as subjectId
+        <if test="param.activityDetailId != null">
+            ,if(sadu.id_ is null, false, true) as selected
+        </if>
         from student s
         left join student_registration sr on sr.user_id_ = s.user_id_
 
+        <if test="param.activityDetailId != null">
+            left join school_activity_detail_user sadu on sadu.student_id_ = s.user_id_ and sadu.school_activity_detail_id_ = #{param.activityDetailId}
+        </if>
+
         <where>
             <if test="param.musicGroupId != null and param.musicGroupId != ''">
                 and sr.music_group_id_ = #{param.musicGroupId}

+ 57 - 19
mec-biz/src/main/resources/config/mybatis/SchoolStaffMapper.xml

@@ -3,30 +3,68 @@
 <mapper namespace="com.ym.mec.biz.dal.mapper.SchoolStaffMapper">
     
     <select id="selectPage" resultType="com.ym.mec.biz.dal.wrapper.SchoolStaffWrapper$SchoolStaff">
-		SELECT
-			t1.id_
-		     , t1.school_id_
-		     , t1.user_id_
-		     , t1.user_type_
-		     , t1.tenant_id_
-		     , t1.organ_id_list_
-		     , IFNULL(t2.real_name_, t2.username_) AS username
-		     , t2.avatar_
-		     , t2.phone_ AS mobile
-		FROM school_staff t1 JOIN sys_user t2 ON (t1.user_id_ = t2.id_)
-		<where>
-			<if test="param.schoolId != null">
-				AND t1.school_id_ = #{param.schoolId}
-			</if>
-		</where>
-		ORDER BY id_ DESC
-	</select>
+        SELECT t1.id_
+             , t1.organ_id_list_                   as organId
+             , t1.school_id_
+             , co.name_                            as schoolName
+             , t1.user_id_
+             , t1.user_type_
+             , t1.tenant_id_
+             , t1.organ_id_list_
+             , IFNULL(t2.real_name_, t2.username_) AS username
+             , t2.avatar_
+             , t2.phone_                           AS mobile
+             , t1.status_
+             , t1.create_time_
+        FROM school_staff t1
+                 JOIN sys_user t2 ON (t1.user_id_ = t2.id_)
+                 left join cooperation_organ co on t1.school_id_ = co.id_
+        <where>
+            <if test="param.schoolId != null">
+                AND t1.school_id_ = #{param.schoolId}
+            </if>
+            <if test="param.schoolIds != null and param.schoolIds.size() != 0">
+                and t1.school_id_ in
+                <foreach collection="param.schoolIds" item="schoolId" open="(" separator="," close=")">
+                    #{schoolId}
+                </foreach>
+            </if>
+            <if test="param.keyword != null and param.keyword != ''">
+                and (t2.id_ like concat('%', #{param.keyword}, '%')
+                    or t2.real_name_ like concat('%', #{param.keyword}, '%')
+                    or t2.phone_ like concat('%', #{param.keyword}, '%')
+                    )
+            </if>
+            <if test="param.tenantId != null">
+                and t1.tenant_id_ = #{param.tenantId}
+            </if>
+            <if test="param.organId != null and param.organId != ''">
+                and find_in_set(#{param.organId}, t1.organ_id_list_)
+            </if>
+            <if test="param.coopStatus != null">
+                and co.is_enable_ = #{param.coopStatus}
+            </if>
+        </where>
+        ORDER BY id_ DESC
+    </select>
 
 	<!--学校员工身份数统计-->
 	<select id="selectUserTypeNumsStat" resultType="com.ym.mec.biz.dal.wrapper.StatGroupWrapper">
 		SELECT t1.user_type_ AS gid, COUNT(t1.user_id_) AS total
 		FROM school_staff t1 WHERE t1.school_id_ = #{schoolId} GROUP BY t1.user_type_
 	</select>
-	<!--学校员工身份数统计-->
+
+    <update id="updateStatusAndRecoveryStatus">
+        update school_staff ss left join sys_user su on su.id_ = ss.user_id_
+        set ss.status_ = if(#{status},0,9),ss.recovery_status_ = if(#{status},0,1),su.lock_flag_ = if(#{status},0,9)
+        where ss.school_id_ = #{cooperationOrganId} and ss.status_ in (0,9)
+        <if test="status">
+            and ss.recovery_status_ = 1
+        </if>
+        <if test="status == false ">
+            and (ss.status_ = 0  or ss.status_ is null)
+        </if>
+    </update>
+    <!--学校员工身份数统计-->
 
 </mapper>

+ 2 - 4
mec-biz/src/main/resources/config/mybatis/StudentPlusMapper.xml

@@ -9,9 +9,7 @@
         group_concat(sr.music_group_id_) as musicGroupIds
         from student s
 
-        <if test="param.keyword != null and param.keyword != ''">
-            left join sys_user su on su.id_ = s.user_id_
-        </if>
+        left join sys_user su on su.id_ = s.user_id_
         left join student_registration sr on sr.user_id_ = s.user_id_
         <where>
             sr.music_group_status_ in
@@ -42,7 +40,7 @@
                 </if>
             </if>
         </where>
-        group by s.user_id_
+        group by su.username_ ,s.user_id_
     </select>
 
 </mapper>

+ 17 - 0
mec-biz/src/main/resources/config/mybatis/SubjectMapper.xml

@@ -285,4 +285,21 @@
             #{userId}
         </foreach>
     </select>
+    <select id="getSubjectListByIdAndCoopId" resultType="com.ym.mec.biz.dal.entity.Subject">
+        SELECT
+            s.id_ as id
+        ,s.name_ as name
+        FROM
+            `subject` s
+            LEFT JOIN music_group_subject_plan mgsp on s.id_ = mgsp.subject_id_
+            LEFT JOIN music_group mg on mg.id_ = mgsp.music_group_id_
+        WHERE
+            s.del_flag_ = 0
+            <if test="musicGroupId != null and musicGroupId != ''">
+                AND mg.id_ = #{musicGroupId}
+            </if>
+            <if test="coopId != null">
+                AND mg.cooperation_organ_id_ = #{coopId}
+            </if>
+    </select>
 </mapper>

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

@@ -192,7 +192,9 @@
 	<select id="queryCountOfUnread" resultMap="Mapper" parameterType="map">
 		SELECT group_ key_,COUNT(*) value_ FROM sys_message
 		WHERE user_id_ = #{userId} AND read_status_ = 0 and status_ = 2
-		AND tenant_id_ = #{tenantId}
+        <if test="tenantId != null">
+            AND tenant_id_ = #{tenantId}
+        </if>
 		AND (jpush_type_ = #{jpushType} OR jpush_type_ IS NULL)
 		<if test="type != null">
 		and (type_ = 3 or type_ = 4)

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

@@ -0,0 +1,5 @@
+<?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.SysNewsInformationDao">
+
+</mapper>

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

@@ -647,7 +647,7 @@
                 AND cs.class_group_id_ = #{queryInfo.classGroupId}
             </if>
             <if test="queryInfo.teacherId != null">
-                AND cs.actual_teacher_id_ #{queryInfo.teacherId}
+                AND cs.actual_teacher_id_ = #{queryInfo.teacherId}
             </if>
             <if test="queryInfo.musicGroupIds != null and queryInfo.musicGroupIds.size > 0">
                 AND cs.music_group_id_ IN

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

@@ -213,7 +213,7 @@ public class MusicGroupController extends BaseController {
 		musicGroupQuit.setStatus(ApprovalStatus.PROCESSING);
         musicGroupQuit.setOperatorId(userId);
         musicGroupQuit.setSchoolStaffAuditStatus(EQuitGroupAuditStatusEnum.ING);
-        return succeed(musicGroupService.applyQuitMusicGroup(null, musicGroupQuit));
+        return succeed(musicGroupService.applyQuitMusicGroup(null, musicGroupQuit,"STUDENT"));
     }
 
     @ApiOperation(value = "取消退团申请")

+ 4 - 0
mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java

@@ -946,6 +946,10 @@ public class DateUtil {
 		return df.format(date);
 	}
 
+    public static String dateTimeToString(Date date) {
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return df.format(date);
+    }
 	/**
 	 * 时间转字符串
 	 * @param date

+ 83 - 0
mec-web/src/main/java/com/ym/mec/web/controller/SchoolMessageController.java

@@ -0,0 +1,83 @@
+package com.ym.mec.web.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.AppVersionInfoDao;
+import com.ym.mec.biz.dal.dto.SysMessageDto;
+import com.ym.mec.biz.dal.entity.AppVersionInfo;
+import com.ym.mec.biz.dal.enums.MessageSendMode;
+import com.ym.mec.biz.dal.page.SysMessageQueryInfo;
+import com.ym.mec.biz.service.SysMessageService;
+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 org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@Api(tags = "消息服务")
+@RequestMapping("schoolMessage")
+public class SchoolMessageController extends BaseController {
+
+    @Autowired
+    private SysMessageService sysMessageService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private AppVersionInfoDao appVersionInfoDao;
+
+    @ApiOperation("获取所有消息列表")
+    @GetMapping(value = "list")
+    public Object list(SysMessageQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        queryInfo.setUserId(sysUserFeignService.queryUserInfo().getId());
+        queryInfo.setType(3);
+        queryInfo.setJpushType("SCHOOL");
+        PageInfo<SysMessageDto> pageInfo = sysMessageService.queryListPage(queryInfo);
+        return succeed(pageInfo);
+    }
+
+    @ApiOperation("获取消息分类类型")
+    @GetMapping(value = "typeList")
+    public Object typeList(String memo){
+
+        return succeed(JSON.parseArray("[{\"value\":\"全部消息\",\"key\":\"ALL\"}," +
+                "{\"value\":\"老师信息\",\"key\":\"TEACHER\"}," +
+                "{\"value\":\"学员信息\",\"key\":\"STUDENT\"}," +
+                "{\"value\":\"系统消息\",\"key\":\"SYSTEM\"},"));
+    }
+
+    @ApiOperation("设置已读")
+    @PostMapping("setRead")
+    public Object setRead(Long id) {
+        int status = 1;
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return sysMessageService.updateOneStatus(id, status) > 0 ? succeed() : failed();
+    }
+
+    @ApiOperation(value = "查询用户未读消息条数")
+    @GetMapping("/queryCountOfUnread")
+    public Object queryCountOfUnread() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(sysMessageService.queryCountOfUnread(null, sysUser.getId(),"SCHOOL", null));
+    }
+}

+ 13 - 4
mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java

@@ -2,10 +2,7 @@ package com.ym.mec.web.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.ApprovalStatus;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupQuit;
-import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.dal.wrapper.StudentWrapper;
@@ -505,4 +502,16 @@ public class StudentManageController extends BaseController {
         musicGroupQuit.setOperatorId(operatorId);
         return succeed(musicGroupService.applyQuitMusicGroup(null, musicGroupQuit));
     }
+
+
+    @ApiOperation(value = "学校端-声部列表")
+    @PostMapping("/coopSubjectList")
+    public HttpResponseResult<List<Subject>> HttpResponseResult(String musicGroupId, @RequestHeader Integer coopId) {
+        if (coopId == null) {
+            return succeed();
+        }
+
+        return succeed(musicGroupService.getSubjectListByIdAndCoopId(musicGroupId, coopId));
+    }
+
 }

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

@@ -11,12 +11,14 @@ import com.ym.mec.biz.dal.entity.SchoolStaff;
 import com.ym.mec.biz.dal.enums.ParamEnum;
 import com.ym.mec.biz.dal.wrapper.SchoolStaffWrapper;
 import com.ym.mec.biz.service.CooperationOrganService;
+import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.biz.service.SchoolStaffService;
 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 com.ym.mec.common.page.PageUtil;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -50,6 +52,8 @@ public class SchoolStaffController extends BaseController {
     @Autowired
     private CooperationOrganService cooperationOrganService;
 
+    @Autowired
+    private OrganizationService organizationService;
 
 	@ApiOperation(value = "详情", notes = "学校员工-根据详情ID查询单条, 传入id")
     @PreAuthorize("@pcs.hasPermissions('schoolStaff/detail')")
@@ -65,7 +69,10 @@ public class SchoolStaffController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('schoolStaff/page')")
     @PostMapping("/page")
     public HttpResponseResult<PageInfo<SchoolStaffWrapper.SchoolStaff>> page(@RequestBody SchoolStaffWrapper.SchoolStaffQuery query) {
-        
+        query.setOrganId(organizationService.getEmployeeOrgan(query.getOrganId()));
+        query.setTenantId(TenantContextHolder.getTenantId());
+        query.setCoopStatus(true);
+
         IPage<SchoolStaffWrapper.SchoolStaff> pages = schoolStaffService.selectPage(QueryInfo.getPage(query), query);
         
         return succeed(PageUtil.pageInfo(pages));

+ 37 - 4
mec-web/src/main/java/com/ym/mec/web/controller/school/SchoolStudentHomeworkController.java

@@ -3,22 +3,27 @@ package com.ym.mec.web.controller.school;
 
 import com.ym.mec.biz.dal.dto.StudentLessonExaminationDetailDto;
 import com.ym.mec.biz.dal.dto.StudentLessonExaminationDto;
+import com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper;
+import com.ym.mec.biz.dal.entity.StudentCourseHomework;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
 import com.ym.mec.biz.dal.page.StudentLessonExaminationQueryDto;
 import com.ym.mec.biz.dal.page.StudentLessonExaminationQueryInfo;
+import com.ym.mec.biz.service.StudentCourseHomeworkService;
 import com.ym.mec.biz.service.StudentLessonExaminationDetailService;
 import com.ym.mec.biz.service.StudentLessonExaminationService;
 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;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.Objects;
 
 @Api(tags = "学校学员课后作业")
 @RestController
@@ -30,6 +35,9 @@ public class SchoolStudentHomeworkController extends BaseController {
     @Resource
     private StudentLessonExaminationDetailService studentLessonExaminationDetailService;
 
+    @Autowired
+    private StudentCourseHomeworkService studentCourseHomeworkService;
+
     @ApiOperation(value = "获取课后评测学员列表")
     @PostMapping("queryLessonStudent")
     public HttpResponseResult<PageInfo<StudentLessonExaminationDto>> queryLessonStudent(@RequestBody StudentLessonExaminationQueryInfo queryInfo) {
@@ -49,5 +57,30 @@ public class SchoolStudentHomeworkController extends BaseController {
     }
 
 
+    @ApiOperation(value = "根据课程计划获取需要交作业的学生-公用")
+    @PostMapping("/findCourseStudentsPublic/v2")
+    public HttpResponseResult<List<StudentCourseHomework>> findCourseStudentsPublicV2(@Validated @RequestBody StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query){
+        if(ELessonTrainingType.HOMEWORK.equals(query.getType())){
+            if (Objects.isNull(query.getCourseScheduleId())) {
+                throw new BizException("请指定课程");
+            }
+            return succeed(studentCourseHomeworkService.findStudentCourseHomeworkByCourseV2(query));
+        }else{
+            return succeed(studentCourseHomeworkService.findExtraExerciseStudentsV2(query));
+        }
+    }
+
+    @ApiOperation(value = "查询单个学生的训练")
+    @GetMapping("/findCourseHomeworkStudentDetailPublic/v2")
+    public HttpResponseResult<StudentLessonTrainingDetailWrapper.StudentLessonTraining> findCourseHomeworkStudentDetailPublicV2(@RequestParam Long courseScheduleId, @RequestParam Long userId, @RequestParam ELessonTrainingType type){
+        if(ELessonTrainingType.HOMEWORK.equals(type)){
+
+            // 获取学生作业界面详细信息
+            return succeed(studentCourseHomeworkService.findCourseHomeworkStudentDetailPublicV2(courseScheduleId, userId,type));
+        }else{
+
+            return succeed(studentCourseHomeworkService.findExtracurricularExercisesDetailPublicV2(courseScheduleId, userId, type));
+        }
+    }
 }
 

+ 41 - 0
mec-web/src/main/java/com/ym/mec/web/controller/school/SchoolSysNewsInformationController.java

@@ -0,0 +1,41 @@
+package com.ym.mec.web.controller.school;
+
+
+import com.ym.mec.biz.dal.school.dto.NewsInformationDto;
+import com.ym.mec.biz.service.SysNewsInformationService;
+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 org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 新闻资讯表(SysNewsInformation)表控制层
+ *
+ * @author zx
+ * @since 2023-05-11 16:08:21
+ */
+@Api(tags = "新闻资讯表")
+@RestController
+@RequestMapping("/sysNewsInformation")
+public class SchoolSysNewsInformationController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private SysNewsInformationService sysNewsInformationService;
+
+    @ApiOperation(value = "分页查询")
+    @GetMapping("queryPage")
+    public HttpResponseResult<List<NewsInformationDto>> queryPage(Integer type, @RequestHeader Integer coopId) throws Exception {
+        return succeed(sysNewsInformationService.queryPage(type,coopId));
+    }
+
+}
+