浏览代码

学校活动

liujc 2 年之前
父节点
当前提交
6c4d595362
共有 21 个文件被更改,包括 529 次插入62 次删除
  1. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SchoolActivityDetail.java
  2. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SchoolActivityDetailUser.java
  3. 5 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/SchoolActivityMapper.java
  4. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/CoursePatrolEvaluationWrapper.java
  5. 7 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/SchoolActivityDetailWrapper.java
  6. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/SchoolActivityWrapper.java
  7. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  8. 9 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SchoolActivityDetailService.java
  9. 25 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SchoolActivityDetailUserService.java
  10. 11 3
      mec-biz/src/main/java/com/ym/mec/biz/service/SchoolActivityService.java
  11. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  12. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SubjectService.java
  13. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CoursePatrolEvaluationServiceImpl.java
  14. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  15. 105 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolActivityDetailServiceImpl.java
  16. 141 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolActivityDetailUserServiceImpl.java
  17. 127 20
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolActivityServiceImpl.java
  18. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  19. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectServiceImpl.java
  20. 20 1
      mec-biz/src/main/resources/config/mybatis/SchoolActivityMapper.xml
  21. 16 14
      mec-web/src/main/java/com/ym/mec/web/controller/school/SchoolActivityController.java

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SchoolActivityDetail.java

@@ -58,6 +58,10 @@ public class SchoolActivityDetail implements Serializable {
 	@TableField(value = "time_")
     private Integer time;
 
+    @ApiModelProperty("节目排序")
+    @TableField(value = "sort_")
+    private Integer sort;
+
     @ApiModelProperty("附件") 
 	@TableField(value = "attachment_url_")
     private String attachmentUrl;

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SchoolActivityDetailUser.java

@@ -32,4 +32,8 @@ public class SchoolActivityDetailUser implements Serializable {
 	@TableField(value = "student_id_")
     private Integer studentId;
 
+    @ApiModelProperty("声部ID")
+    @TableField(value = "subject_id_")
+    private Integer subjectId;
+
 }

+ 5 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/SchoolActivityMapper.java

@@ -23,5 +23,9 @@ public interface SchoolActivityMapper extends BaseMapper<SchoolActivity> {
 	 * @return List<SchoolActivityWrapper.SchoolActivity>
 	 */
 	List<SchoolActivityWrapper.SchoolActivity> selectPage(@Param("page") IPage<SchoolActivityWrapper.SchoolActivity> page, @Param("param") SchoolActivityWrapper.SchoolActivityQuery param);
-	
+
+    /**
+     * 获取学生列表
+     */
+    List<SchoolActivityWrapper.SchoolActivityStudent> getUserList(@Param("param") SchoolActivityWrapper.SchoolActivityStudentQuery query);
 }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/CoursePatrolEvaluationWrapper.java

@@ -228,6 +228,9 @@ public class CoursePatrolEvaluationWrapper {
 
         @ApiModelProperty("附件")
         private String attachmentUrl;
+
+        @ApiModelProperty("评价状态")
+        private Boolean evaluateFlag;
         
         public String jsonString() {
             return JSON.toJSONString(this);

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

@@ -65,7 +65,6 @@ public class SchoolActivityDetailWrapper {
     public static class SchoolActivityDetail {
 
         @ApiModelProperty("活动详情编号")
-        @NotNull(message = "活动详情编号不能为空",groups = {ValidGroups.Update.class})
         private Integer id;
 
         @ApiModelProperty("合作单位ID")
@@ -95,11 +94,6 @@ public class SchoolActivityDetailWrapper {
         @ApiModelProperty("声部名称集合 逗号隔开")
         private String subjectNameList;
 
-
-        @ApiModelProperty(value = "学生id集合,新增,修改用",required = true)
-        @NotEmpty(message = "学生id集合不能为空")
-        private List<Integer> studentIdList;
-
         @ApiModelProperty(value = "学生人数",required = true)
         @NotNull(message = "学生人数不能为空")
         private Integer studentNum;
@@ -108,9 +102,16 @@ public class SchoolActivityDetailWrapper {
         @NotNull(message = "节目时长不能为空")
         private Integer time;
 
+        @ApiModelProperty(value = "节目排序",required = true)
+        @NotNull(message = "节目排序不能为空")
+        private Integer sort;
+
         @ApiModelProperty("附件")
         private String attachmentUrl;
 
+        @ApiModelProperty("学生数据集合")
+        @NotEmpty(message = "学生数据集合不能为空")
+        private List<SchoolActivityWrapper.SchoolActivitySubject> studentList;
 
         public String jsonString() {
             return JSON.toJSONString(this);

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

@@ -156,9 +156,6 @@ public class SchoolActivityWrapper {
     @ApiModel(" SchoolActivityStudentQuery-学校活动学生查询对象")
     public static class SchoolActivityStudentQuery {
 
-        @ApiModelProperty("活动节目编号")
-        private Integer activityDetailId;
-
         @ApiModelProperty("乐团ID")
         private Long musicGroupId;
 
@@ -175,6 +172,7 @@ public class SchoolActivityWrapper {
     public static class SchoolActivitySubject {
 
         @ApiModelProperty("声部ID")
+        @NotNull(message = "声部ID不能为空")
         private Integer subjectId;
 
         @ApiModelProperty("声部名称")
@@ -184,6 +182,7 @@ public class SchoolActivityWrapper {
         private Integer studentCount;
 
         @ApiModelProperty("学生列表")
+        @NotEmpty(message = "学生列表不能为空")
         private List<SchoolActivityStudent> studnetList;
 
     }
@@ -197,6 +196,7 @@ public class SchoolActivityWrapper {
     public static class SchoolActivityStudent {
 
         @ApiModelProperty("学生ID")
+        @NotNull(message = "学生ID不能为空")
         private Integer studentId;
 
         @ApiModelProperty("学生名")

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

@@ -448,4 +448,9 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
      * @return
      */
     boolean confirmDelivery(Integer userId, MusicGroupDeliveryVo musicGroupDeliveryVo);
+
+    /**
+     * 获取乐团信息
+     */
+    Map<Long,MusicGroup> getMapByIds(List<Long> musicGroupIds);
 }

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

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ym.mec.biz.dal.wrapper.SchoolActivityDetailWrapper;
 import com.ym.mec.biz.dal.entity.SchoolActivityDetail;
 
+import java.util.List;
+
 /**
  * 活动详情
  * 2023-05-04 11:32:00
@@ -39,5 +41,11 @@ public interface SchoolActivityDetailService extends IService<SchoolActivityDeta
      * @return Boolean
      */
      Boolean update(SchoolActivityDetailWrapper.SchoolActivityDetail schoolActivityDetail);
-     
+
+    /**
+     *  获取活动的节目列表
+     *
+     * @param activityId 活动ID
+     */
+    List<SchoolActivityDetailWrapper.SchoolActivityDetail> selectListByActivityId(Long activityId);
 }

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

@@ -4,6 +4,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ym.mec.biz.dal.wrapper.SchoolActivityDetailUserWrapper;
 import com.ym.mec.biz.dal.entity.SchoolActivityDetailUser;
+import com.ym.mec.biz.dal.wrapper.SchoolActivityWrapper;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * 活动详情人员
@@ -39,5 +43,25 @@ public interface SchoolActivityDetailUserService extends IService<SchoolActivity
      * @return Boolean
      */
      Boolean update(SchoolActivityDetailUserWrapper.SchoolActivityDetailUser schoolActivityDetailUser);
-     
+
+    /**
+     * 保存活动人员
+     *
+     * @param schoolActivityDetailId 活动详情ID
+     * @param studentList 学生ID列表
+     */
+    void save(Integer schoolActivityDetailId, List<SchoolActivityWrapper.SchoolActivitySubject> studentList);
+
+    /**
+     * 获取活动人员列表
+     *
+     * @param detailIds 活动详情ID列表
+     */
+    Map<Integer, List<SchoolActivityWrapper.SchoolActivitySubject>> getSchoolActivitySubjectMapByDetailIds(List<Integer> detailIds);
+    /**
+     * 获取活动人员列表数据
+     *
+     * @param schoolActivityStudents 活动人员列表
+     */
+    List<SchoolActivityWrapper.SchoolActivitySubject> getSchoolActivitySubjects(List<SchoolActivityWrapper.SchoolActivityStudent> schoolActivityStudents);
 }

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

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ym.mec.biz.dal.wrapper.SchoolActivityWrapper;
 import com.ym.mec.biz.dal.entity.SchoolActivity;
 
+import java.util.List;
+
 /**
  * 学校活动
  * 2023-05-04 11:32:00
@@ -31,13 +33,19 @@ public interface SchoolActivityService extends IService<SchoolActivity>  {
      * @param schoolActivity SchoolActivityWrapper.SchoolActivity
      * @return Boolean
      */
-     Boolean add(SchoolActivityWrapper.SchoolActivity schoolActivity);   
+     Boolean add(SchoolActivityWrapper.SchoolActivityDetail schoolActivity);
 
     /**
      * 更新
      * @param schoolActivity SchoolActivityWrapper.SchoolActivity
      * @return Boolean
      */
-     Boolean update(SchoolActivityWrapper.SchoolActivity schoolActivity);
-     
+     Boolean update(SchoolActivityWrapper.SchoolActivityDetail schoolActivity);
+
+    /**
+     * 获取学生列表
+     *
+     * @param query 查询条件
+     */
+    List<SchoolActivityWrapper.SchoolActivitySubject> getUserList(SchoolActivityWrapper.SchoolActivityStudentQuery query);
 }

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

@@ -230,4 +230,6 @@ public interface StudentService extends BaseService<Integer, Student> {
      * 学校端-学生统计
      */
     StudentWrapper.StudentStat userCount(StudentWrapper.StudentQuery queryInfo);
+
+    Map<Integer,Student> getMapByIds(List<Integer> studentIds);
 }

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

@@ -107,4 +107,6 @@ public interface SubjectService extends BaseService<Integer, Subject> {
      * @return
      */
     List<Subject> list();
+
+    Map<Integer,Subject> getMapByIds(List<Integer> subjectIds);
 }

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

@@ -126,6 +126,12 @@ public class CoursePatrolEvaluationServiceImpl extends ServiceImpl<CoursePatrolE
                 coursePatrolEvaluationInfo.setTeacherAvatar(teacher.getAvatar());
             }
 
+            if (coursePatrolEvaluationInfo.getId() == null) {
+                coursePatrolEvaluationInfo.setEvaluateFlag(false);
+            } else {
+                coursePatrolEvaluationInfo.setEvaluateFlag(true);
+            }
+
             // 设置上课时间
             coursePatrolEvaluationInfo.setStartClassTime(DateUtil.startDateAndEndTime(coursePatrolEvaluationInfo.getCourseDate(), coursePatrolEvaluationInfo.getStartClassTime()));
             coursePatrolEvaluationInfo.setEndClassTime(DateUtil.startDateAndEndTime(coursePatrolEvaluationInfo.getCourseDate(), coursePatrolEvaluationInfo.getEndClassTime()));

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

@@ -50,6 +50,7 @@ import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.Map.Entry;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import static com.ym.mec.biz.dal.entity.ApprovalStatus.APPROVED;
@@ -3885,4 +3886,20 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         return true;
     }
+
+
+    /**
+     * 获取乐团信息
+     */
+    @Override
+    public Map<Long, MusicGroup> getMapByIds(List<Long> musicGroupIds) {
+        if(CollectionUtils.isEmpty(musicGroupIds)){
+            return new HashMap<>();
+        }
+        List<MusicGroup> musicGroupByIds = musicGroupDao.getMusicGroupByIds(musicGroupIds.stream().map(String::valueOf).collect(Collectors.toList()));
+        if(CollectionUtils.isEmpty(musicGroupByIds)){
+            return new HashMap<>();
+        }
+        return musicGroupByIds.stream().collect(Collectors.toMap(o -> Long.parseLong(o.getId()), Function.identity()));
+    }
 }

+ 105 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolActivityDetailServiceImpl.java

@@ -3,6 +3,13 @@ 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.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.Subject;
+import com.ym.mec.biz.dal.wrapper.SchoolActivityWrapper;
+import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.biz.service.SchoolActivityDetailUserService;
+import com.ym.mec.biz.service.SubjectService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.BeanUtils;
 import lombok.extern.slf4j.Slf4j;
@@ -10,6 +17,13 @@ import com.ym.mec.biz.dal.entity.SchoolActivityDetail;
 import com.ym.mec.biz.dal.wrapper.SchoolActivityDetailWrapper;
 import com.ym.mec.biz.dal.mapper.SchoolActivityDetailMapper;
 import com.ym.mec.biz.service.SchoolActivityDetailService;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 活动详情
@@ -19,12 +33,21 @@ import com.ym.mec.biz.service.SchoolActivityDetailService;
 @Service
 public class SchoolActivityDetailServiceImpl extends ServiceImpl<SchoolActivityDetailMapper, SchoolActivityDetail> implements SchoolActivityDetailService {
 
-	/**
+    @Autowired
+    private MusicGroupService musicGroupService;
+
+    @Autowired
+    private SubjectService subjectService;
+
+    @Autowired
+    private SchoolActivityDetailUserService schoolActivityDetailUserService;
+
+    /**
      * 查询详情
      * @param id 详情ID
      * @return SchoolActivityDetail
      */
-	@Override
+    @Override
     public SchoolActivityDetail detail(Long id) {
         
         return baseMapper.selectById(id);
@@ -41,15 +64,15 @@ public class SchoolActivityDetailServiceImpl extends ServiceImpl<SchoolActivityD
         
         return page.setRecords(baseMapper.selectPage(page, query));
     }
-	
+
     /**
      * 添加
      * @param schoolActivityDetail SchoolActivityDetailWrapper.SchoolActivityDetail
      * @return Boolean
      */
     @Override
-    public Boolean add(SchoolActivityDetailWrapper.SchoolActivityDetail schoolActivityDetail) {    	
-        
+    public Boolean add(SchoolActivityDetailWrapper.SchoolActivityDetail schoolActivityDetail) {
+
         return this.save(JSON.parseObject(schoolActivityDetail.jsonString(), SchoolActivityDetail.class));
     }
 
@@ -63,4 +86,81 @@ public class SchoolActivityDetailServiceImpl extends ServiceImpl<SchoolActivityD
 
         return this.updateById(JSON.parseObject(schoolActivityDetail.jsonString(), SchoolActivityDetail.class));       
     }
+
+    /**
+     * 获取活动的节目列表
+     *
+     * @param activityId 活动ID
+     */
+    @Override
+    public List<SchoolActivityDetailWrapper.SchoolActivityDetail> selectListByActivityId(Long activityId) {
+        if (activityId == null) {
+            return null;
+        }
+
+        List<SchoolActivityDetail> list = this.lambdaQuery()
+                .eq(SchoolActivityDetail::getSchoolActivityId, activityId)
+                .orderByAsc(SchoolActivityDetail::getSort)
+                .list();
+        if (CollectionUtils.isEmpty(list)) {
+            return null;
+        }
+
+        List<SchoolActivityDetailWrapper.SchoolActivityDetail> schoolActivityDetails = JSON
+                .parseArray(JSON.toJSONString(list), SchoolActivityDetailWrapper.SchoolActivityDetail.class);
+
+        // 查询人员数据
+
+        // id 集合
+        List<Integer> detailIds = schoolActivityDetails.stream()
+                .map(SchoolActivityDetailWrapper.SchoolActivityDetail::getId)
+                .collect(Collectors.toList());
+
+        Map<Integer, List<SchoolActivityWrapper.SchoolActivitySubject>> studentListMap = schoolActivityDetailUserService.getSchoolActivitySubjectMapByDetailIds(detailIds);
+
+        // 设置乐团名
+        // 乐团ID集合
+        List<Long> musicGroupIds = schoolActivityDetails.stream()
+                .map(SchoolActivityDetailWrapper.SchoolActivityDetail::getMusicGroupId)
+                .collect(Collectors.toList());
+
+        Map<Long, MusicGroup> groupMap = musicGroupService.getMapByIds(musicGroupIds);
+
+        // 设置声部名
+        List<Integer> subjectIds = schoolActivityDetails.stream()
+                .flatMap(o -> Arrays.stream(o.getSubjectIdList().split(",")))
+                .filter(Objects::nonNull)
+                .map(Integer::parseInt)
+                .collect(Collectors.toList());
+
+        Map<Integer, Subject> subjectMap = subjectService.getMapByIds(subjectIds);
+
+        for (SchoolActivityDetailWrapper.SchoolActivityDetail schoolActivityDetail : schoolActivityDetails) {
+
+            // 设置声部 人员数据
+            List<SchoolActivityWrapper.SchoolActivitySubject> schoolActivitySubjects = studentListMap.get(schoolActivityDetail.getId());
+            if (!CollectionUtils.isEmpty(schoolActivitySubjects)) {
+                schoolActivityDetail.setStudentList(schoolActivitySubjects);
+            }
+
+            // 设置乐团名
+            MusicGroup musicGroup = groupMap.get(schoolActivityDetail.getMusicGroupId());
+            if (musicGroup != null) {
+                schoolActivityDetail.setMusicGroupName(musicGroup.getName());
+            }
+
+            // 设置声部名
+            String subjectNameList = Arrays.stream(schoolActivityDetail.getSubjectIdList().split(","))
+                    .filter(Objects::nonNull)
+                    .map(Integer::parseInt)
+                    .map(subjectMap::get)
+                    .filter(Objects::nonNull)
+                    .map(Subject::getName)
+                    .collect(Collectors.joining(","));
+            schoolActivityDetail.setSubjectNameList(subjectNameList);
+
+        }
+
+        return schoolActivityDetails;
+    }
 }

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

@@ -3,13 +3,24 @@ 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.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.Subject;
+import com.ym.mec.biz.dal.wrapper.SchoolActivityWrapper;
+import com.ym.mec.biz.service.StudentService;
+import com.ym.mec.biz.service.SubjectService;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.beans.BeanUtils;
 import lombok.extern.slf4j.Slf4j;
 import com.ym.mec.biz.dal.entity.SchoolActivityDetailUser;
 import com.ym.mec.biz.dal.wrapper.SchoolActivityDetailUserWrapper;
 import com.ym.mec.biz.dal.mapper.SchoolActivityDetailUserMapper;
 import com.ym.mec.biz.service.SchoolActivityDetailUserService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 活动详情人员
@@ -19,12 +30,18 @@ import com.ym.mec.biz.service.SchoolActivityDetailUserService;
 @Service
 public class SchoolActivityDetailUserServiceImpl extends ServiceImpl<SchoolActivityDetailUserMapper, SchoolActivityDetailUser> implements SchoolActivityDetailUserService {
 
-	/**
+    @Autowired
+    private StudentService studentService;
+
+    @Autowired
+    private SubjectService subjectService;
+
+    /**
      * 查询详情
      * @param id 详情ID
      * @return SchoolActivityDetailUser
      */
-	@Override
+    @Override
     public SchoolActivityDetailUser detail(Long id) {
         
         return baseMapper.selectById(id);
@@ -41,15 +58,15 @@ public class SchoolActivityDetailUserServiceImpl extends ServiceImpl<SchoolActiv
         
         return page.setRecords(baseMapper.selectPage(page, query));
     }
-	
+
     /**
      * 添加
      * @param schoolActivityDetailUser SchoolActivityDetailUserWrapper.SchoolActivityDetailUser
      * @return Boolean
      */
     @Override
-    public Boolean add(SchoolActivityDetailUserWrapper.SchoolActivityDetailUser schoolActivityDetailUser) {    	
-        
+    public Boolean add(SchoolActivityDetailUserWrapper.SchoolActivityDetailUser schoolActivityDetailUser) {
+
         return this.save(JSON.parseObject(schoolActivityDetailUser.jsonString(), SchoolActivityDetailUser.class));
     }
 
@@ -63,4 +80,122 @@ public class SchoolActivityDetailUserServiceImpl extends ServiceImpl<SchoolActiv
 
         return this.updateById(JSON.parseObject(schoolActivityDetailUser.jsonString(), SchoolActivityDetailUser.class));       
     }
+
+    /**
+     * 保存活动人员
+     *
+     * @param schoolActivityDetailId 活动详情ID
+     * @param studentList          学生ID列表
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void save(Integer schoolActivityDetailId, List<SchoolActivityWrapper.SchoolActivitySubject> studentList) {
+        if (CollectionUtils.isEmpty(studentList)) {
+            return;
+        }
+        // 删除旧的活动人员
+        this.lambdaUpdate()
+                .eq(SchoolActivityDetailUser::getSchoolActivityDetailId, schoolActivityDetailId)
+                .remove();
+
+        List<SchoolActivityDetailUser> schoolActivityDetailUsers = studentList.stream().flatMap(schoolActivitySubject -> {
+            if (CollectionUtils.isEmpty(schoolActivitySubject.getStudnetList())) {
+                return Stream.empty();
+            }
+            return schoolActivitySubject.getStudnetList().stream().map(o -> {
+                SchoolActivityDetailUser schoolActivityDetailUser = new SchoolActivityDetailUser();
+                schoolActivityDetailUser.setSchoolActivityDetailId(schoolActivityDetailId);
+                schoolActivityDetailUser.setStudentId(o.getStudentId());
+                schoolActivityDetailUser.setSubjectId(schoolActivitySubject.getSubjectId());
+                return schoolActivityDetailUser;
+            });
+        }).filter(Objects::nonNull).collect(Collectors.toList());
+
+        this.saveBatch(schoolActivityDetailUsers);
+
+    }
+
+    /**
+     * 获取活动人员列表
+     *
+     * @param detailIds 活动详情ID列表
+     */
+    @Override
+    public Map<Integer, List<SchoolActivityWrapper.SchoolActivitySubject>> getSchoolActivitySubjectMapByDetailIds(List<Integer> detailIds) {
+
+        if (CollectionUtils.isEmpty(detailIds)) {
+            return new HashMap<>();
+        }
+        List<SchoolActivityDetailUser> list = this.lambdaQuery()
+                .in(SchoolActivityDetailUser::getSchoolActivityDetailId, detailIds)
+                .list();
+        if (CollectionUtils.isEmpty(list)) {
+            return new HashMap<>();
+        }
+        Map<Integer, List<SchoolActivityDetailUser>> map = list.stream()
+                .collect(Collectors.groupingBy(SchoolActivityDetailUser::getSchoolActivityDetailId));
+
+        Map<Integer, List<SchoolActivityWrapper.SchoolActivitySubject>> resultMap = new HashMap<>();
+
+        map.forEach((id, schoolActivityDetailUsers) -> {
+            List<SchoolActivityWrapper.SchoolActivityStudent> schoolActivityStudents = JSON
+                    .parseArray(JSON.toJSONString(schoolActivityDetailUsers), SchoolActivityWrapper.SchoolActivityStudent.class);
+            resultMap.put(id,getSchoolActivitySubjects(schoolActivityStudents));
+        });
+        return resultMap;
+    }
+
+
+    /**
+     * 获取活动人员列表数据
+     *
+     * @param schoolActivityStudents 活动人员列表
+     */
+    @Override
+    public List<SchoolActivityWrapper.SchoolActivitySubject> getSchoolActivitySubjects(List<SchoolActivityWrapper.SchoolActivityStudent> schoolActivityStudents) {
+        if (CollectionUtils.isEmpty(schoolActivityStudents)) {
+            return new ArrayList<>();
+        }
+        // 设置学生信息
+
+        // 学生ID集合
+        Set<Integer> userIds = schoolActivityStudents.stream().map(SchoolActivityWrapper.SchoolActivityStudent::getStudentId).collect(Collectors.toSet());
+
+        Map<Integer, Student> studentMap = studentService.getMapByIds(new ArrayList<>(userIds));
+
+        // 设置声部名称
+
+        // 声部ID集合
+        Set<Integer> subjectIds = schoolActivityStudents.stream().map(SchoolActivityWrapper.SchoolActivityStudent::getSubjectId).collect(Collectors.toSet());
+
+        Map<Integer, Subject> subjectMap = subjectService.getMapByIds(new ArrayList<>(subjectIds));
+
+        for (SchoolActivityWrapper.SchoolActivityStudent schoolActivityStudent : schoolActivityStudents) {
+            Student student = studentMap.get(schoolActivityStudent.getStudentId());
+            if (student != null) {
+                schoolActivityStudent.setStudentName(student.getUsername());
+                schoolActivityStudent.setStudentAvatar(student.getAvatar());
+            }
+            Subject subject = subjectMap.get(schoolActivityStudent.getSubjectId());
+            if (subject != null) {
+                schoolActivityStudent.setSubjectName(subject.getName());
+            }
+        }
+
+        // 声部分组 设置人数
+        Map<Integer, List<SchoolActivityWrapper.SchoolActivityStudent>> subjectGroup = schoolActivityStudents.stream()
+                .collect(Collectors.groupingBy(SchoolActivityWrapper.SchoolActivityStudent::getSubjectId));
+        List<SchoolActivityWrapper.SchoolActivitySubject> schoolActivitySubjects = new ArrayList<>();
+        subjectGroup.forEach((k, v) -> {
+            SchoolActivityWrapper.SchoolActivitySubject schoolActivitySubject = new SchoolActivityWrapper.SchoolActivitySubject();
+            schoolActivitySubject.setSubjectId(k);
+            schoolActivitySubject.setSubjectName(v.get(0).getSubjectName());
+            schoolActivitySubject.setStudentCount(v.size());
+            schoolActivitySubject.setStudnetList(v);
+            schoolActivitySubjects.add(schoolActivitySubject);
+        });
+
+        return schoolActivitySubjects;
+    }
+
 }

+ 127 - 20
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolActivityServiceImpl.java

@@ -3,17 +3,27 @@ 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;
 import lombok.extern.slf4j.Slf4j;
 import com.ym.mec.biz.dal.entity.SchoolActivity;
 import com.ym.mec.biz.dal.wrapper.SchoolActivityWrapper;
 import com.ym.mec.biz.dal.mapper.SchoolActivityMapper;
-import com.ym.mec.biz.service.SchoolActivityService;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 学校活动
@@ -23,6 +33,17 @@ import java.util.List;
 @Service
 public class SchoolActivityServiceImpl extends ServiceImpl<SchoolActivityMapper, SchoolActivity> implements SchoolActivityService {
 
+
+    @Autowired
+    private SchoolActivityDetailService schoolActivityDetailService;
+
+    @Autowired
+    private SchoolActivityDetailUserService schoolActivityDetailUserService;
+
+
+    @Autowired
+    private SysUserService sysUserService;
+
     /**
      * 查询详情
      * @param id 详情ID
@@ -35,8 +56,21 @@ public class SchoolActivityServiceImpl extends ServiceImpl<SchoolActivityMapper,
             return null;
         SchoolActivityWrapper.SchoolActivityDetail schoolActivityDetail = new SchoolActivityWrapper.SchoolActivityDetail();
         BeanUtils.copyProperties(schoolActivity, schoolActivityDetail);
+        Date now = new Date();
+        if (schoolActivity.getStartTime().after(now)) {
+            schoolActivityDetail.setStatus(ESchoolActivityStatus.NOT_START);
+        } else if (schoolActivity.getEndTime().before(now)) {
+            schoolActivityDetail.setStatus(ESchoolActivityStatus.END);
+        } else {
+            schoolActivityDetail.setStatus(ESchoolActivityStatus.PROCESSING);
+        }
+
+        // 设置节目信息
+        List<SchoolActivityDetailWrapper.SchoolActivityDetail> schoolActivityDetails = schoolActivityDetailService.selectListByActivityId(id);
 
-        return null;
+        schoolActivityDetail.setDetail(schoolActivityDetails);
+
+        return schoolActivityDetail;
     }
     
     /**
@@ -52,32 +86,82 @@ public class SchoolActivityServiceImpl extends ServiceImpl<SchoolActivityMapper,
 
         // 设置状态
         for (SchoolActivityWrapper.SchoolActivity schoolActivity : schoolActivities) {
-            setStatus(schoolActivity);
+            Date now = new Date();
+            if (schoolActivity.getStartTime().after(now)) {
+                schoolActivity.setStatus(ESchoolActivityStatus.NOT_START);
+            } else if (schoolActivity.getEndTime().before(now)) {
+                schoolActivity.setStatus(ESchoolActivityStatus.END);
+            } else {
+                schoolActivity.setStatus(ESchoolActivityStatus.PROCESSING);
+            }
         }
 
         return page.setRecords(schoolActivities);
     }
 
-    private static void setStatus(SchoolActivityWrapper.SchoolActivity schoolActivity) {
-        Date now = new Date();
-        if (schoolActivity.getStartTime().after(now)) {
-            schoolActivity.setStatus(ESchoolActivityStatus.NOT_START);
-        } else if (schoolActivity.getEndTime().before(now)) {
-            schoolActivity.setStatus(ESchoolActivityStatus.END);
-        } else {
-            schoolActivity.setStatus(ESchoolActivityStatus.PROCESSING);
-        }
-    }
-
     /**
      * 添加
      * @param schoolActivity SchoolActivityWrapper.SchoolActivity
      * @return Boolean
      */
     @Override
-    public Boolean add(SchoolActivityWrapper.SchoolActivity schoolActivity) {
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean add(SchoolActivityWrapper.SchoolActivityDetail schoolActivity) {
+
+        saveOrUpdate(schoolActivity,true);
+
+        return true;
+    }
+
+    private void saveOrUpdate(SchoolActivityWrapper.SchoolActivityDetail schoolActivity,Boolean create) {
+        Date now = new Date();
+        // 保存活动
+        SchoolActivity activity = JSON.parseObject(JSON.toJSONString(schoolActivity), SchoolActivity.class);
+        if (Boolean.TRUE.equals(create)) {
+            activity.setId(null);
+            activity.setCreateTime(now);
+            activity.setCreateBy(sysUserService.getUserId());
+        }
+        activity.setUpdateTime(now);
+        this.saveOrUpdate(activity);
+
+        // 查询已有的节目
+        List<SchoolActivityDetailWrapper.SchoolActivityDetail> oldDetails = schoolActivityDetailService
+                .selectListByActivityId(activity.getId().longValue());
+
+        if (CollectionUtils.isNotEmpty(oldDetails)) {
+            // 查询被删除的节目
+            List<SchoolActivityDetailWrapper.SchoolActivityDetail> deleteDetails = oldDetails.stream()
+                    .filter(oldDetail -> schoolActivity.getDetail().stream()
+                            .noneMatch(newDetail -> newDetail.getId() != null && newDetail.getId().equals(oldDetail.getId())))
+                    .collect(Collectors.toList());
 
-        return this.save(JSON.parseObject(schoolActivity.jsonString(), SchoolActivity.class));
+            if (CollectionUtils.isNotEmpty(deleteDetails)) {
+                // 被删除的节目ID
+                List<Integer> deleteDetailIds = deleteDetails.stream().map(SchoolActivityDetailWrapper.SchoolActivityDetail::getId)
+                        .collect(Collectors.toList());
+                schoolActivityDetailService.removeByIds(deleteDetailIds);
+            }
+        }
+
+        // 保存节目
+        List<SchoolActivityDetailWrapper.SchoolActivityDetail> details = schoolActivity.getDetail();
+        for (SchoolActivityDetailWrapper.SchoolActivityDetail detail : details) {
+            detail.setSchoolActivityId(activity.getId());
+            detail.setCooperationOrganId(activity.getCooperationOrganId());
+            detail.setStudentNum(detail.getStudentNum());
+            SchoolActivityDetail schoolActivityDetail = JSON.parseObject(detail.jsonString(), SchoolActivityDetail.class);
+            if (Boolean.TRUE.equals(create)) {
+                schoolActivityDetail.setCreateTime(now);
+                schoolActivityDetail.setId(null);
+            }
+            schoolActivityDetail.setUpdateTime(now);
+            schoolActivityDetailService.saveOrUpdate(schoolActivityDetail);
+
+            // 保存节目人员关联
+            schoolActivityDetailUserService.save(schoolActivityDetail.getId(), detail.getStudentList());
+
+        }
     }
 
     /**
@@ -86,8 +170,31 @@ public class SchoolActivityServiceImpl extends ServiceImpl<SchoolActivityMapper,
      * @return Boolean
      */
     @Override
-    public Boolean update(SchoolActivityWrapper.SchoolActivity schoolActivity){
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean update(SchoolActivityWrapper.SchoolActivityDetail schoolActivity){
+
+        SchoolActivity activity = getById(schoolActivity.getId());
+        if(activity == null){
+            throw new BizException("活动不存在");
+        }
+        if (!activity.getCooperationOrganId().equals(schoolActivity.getCooperationOrganId())) {
+            throw new BizException("活动不属于当前合作机构");
+        }
+        saveOrUpdate(schoolActivity,false);
+        return true;
+
+    }
+
+    /**
+     * 获取学生列表
+     *
+     * @param query 查询条件
+     */
+    @Override
+    public List<SchoolActivityWrapper.SchoolActivitySubject> getUserList(SchoolActivityWrapper.SchoolActivityStudentQuery query) {
+
+        List<SchoolActivityWrapper.SchoolActivityStudent> schoolActivityStudents = baseMapper.getUserList(query);
 
-        return this.updateById(JSON.parseObject(schoolActivity.jsonString(), SchoolActivity.class));       
+        return schoolActivityDetailUserService.getSchoolActivitySubjects(schoolActivityStudents);
     }
 }

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -1565,7 +1565,8 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         }
     }
 
-    private Map<Integer,Student> getMapByIds(List<Integer> studentIds) {
+    @Override
+    public Map<Integer,Student> getMapByIds(List<Integer> studentIds) {
         if (CollectionUtils.isEmpty(studentIds)) {
             return Collections.emptyMap();
         }

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

@@ -7,6 +7,7 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.StringUtils;
@@ -227,4 +228,18 @@ public class SubjectServiceImpl extends BaseServiceImpl<Integer, Subject> implem
     public List<Subject> list() {
         return subjectDao.list();
     }
+
+    @Override
+    public Map<Integer, Subject> getMapByIds(List<Integer> subjectIds) {
+        if (CollectionUtils.isEmpty(subjectIds)) {
+            return new HashMap<>();
+        }
+
+        List<Subject> subjectList = subjectDao.findBySubjectIds(subjectIds);
+        if (CollectionUtils.isEmpty(subjectList)) {
+            return new HashMap<>();
+        }
+
+        return subjectList.stream().collect(Collectors.toMap(Subject::getId, Function.identity()));
+    }
 }

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

@@ -39,5 +39,24 @@
             </if>
         </where>
 	</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
+        from student s
+        left join student_registration sr on sr.user_id_ = s.user_id_
+
+        <where>
+            <if test="param.musicGroupId != null">
+                and sr.music_group_id_ = #{param.musicGroupId}
+                and sr.music_group_status_ = 'NORMAL'
+            </if>
+            <if test="param.subjectIds != null and param.subjectIds.size() != 0">
+                and sr.actual_subject_id_ in
+                <foreach collection="param.subjectIds" item="item" index="index" open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+    </select>
 </mapper>

+ 16 - 14
mec-web/src/main/java/com/ym/mec/web/controller/school/SchoolActivityController.java

@@ -17,6 +17,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 @Slf4j
 @Validated
 @RestController
@@ -52,30 +54,30 @@ public class SchoolActivityController extends BaseController {
 
     @ApiOperation(value = "查询乐团学生信息")
     @PostMapping("/userList")
-    public HttpResponseResult<PageInfo<SchoolActivityWrapper.SchoolActivitySubject>> userList(@RequestBody SchoolActivityWrapper.SchoolActivityStudentQuery query) {
-
+    public HttpResponseResult<List<SchoolActivityWrapper.SchoolActivitySubject>> userList(@RequestBody SchoolActivityWrapper.SchoolActivityStudentQuery query) {
 
-        return succeed(null);
+        return succeed(schoolActivityService.getUserList(query));
     }
     
     @ApiOperation(value = "新增", notes = "学校活动- 传入 SchoolActivityWrapper.SchoolActivity")
 	@PostMapping("/save")
-	public HttpResponseResult<JSONObject> add(@Validated @RequestBody SchoolActivityWrapper.SchoolActivityDetail schoolActivity) {
+	public HttpResponseResult<Boolean> add(@Validated @RequestBody SchoolActivityWrapper.SchoolActivityDetail schoolActivity, @RequestHeader Integer coopId) {
+        if (coopId == null) {
+            return succeed();
+        }
+        schoolActivity.setCooperationOrganId(coopId);
         
-        return succeed();
+        return succeed(schoolActivityService.add(schoolActivity));
 	}
     
     @ApiOperation(value = "修改", notes = "学校活动- 传入 SchoolActivityWrapper.SchoolActivity")
 	@PostMapping("/update")
-	public HttpResponseResult<JSONObject> update(@Validated(value = ValidGroups.Update.class) @RequestBody SchoolActivityWrapper.SchoolActivityDetail schoolActivity) {
-        
-        return succeed();
-	}
+	public HttpResponseResult<Boolean> update(@Validated(value = ValidGroups.Update.class) @RequestBody SchoolActivityWrapper.SchoolActivityDetail schoolActivity, @RequestHeader Integer coopId) {
+        if (coopId == null) {
+            return succeed();
+        }
+        schoolActivity.setCooperationOrganId(coopId);
 
-	@ApiOperation(value = "删除", notes = "学校活动- 传入id")
-//	@PostMapping("/remove")
-	public HttpResponseResult<Boolean> remove(@RequestParam Long id) {
-    
-		return succeed(schoolActivityService.removeById(id));
+        return succeed(schoolActivityService.update(schoolActivity));
 	}
 }