Browse Source

Merge remote-tracking branch 'origin/feature/0529-live' into feature/0529-live

zouxuan 2 năm trước cách đây
mục cha
commit
cb110f33d2
18 tập tin đã thay đổi với 458 bổ sung123 xóa
  1. 4 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseShareDao.java
  2. 16 5
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseShareDto.java
  3. 25 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/UpdateCourseShareModeDto.java
  4. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  5. 1 5
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseShare.java
  6. 13 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ShareModeEnum.java
  7. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseShareQueryInfo.java
  8. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/LiveGroupWrapper.java
  9. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  10. 9 4
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseShareService.java
  11. 32 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  12. 220 60
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseShareServiceImpl.java
  13. 7 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java
  14. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  15. 33 6
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  16. 14 10
      mec-biz/src/main/resources/config/mybatis/CourseShareMapper.xml
  17. 8 0
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java
  18. 29 19
      mec-web/src/main/java/com/ym/mec/web/controller/CourseShareController.java

+ 4 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseShareDao.java

@@ -10,9 +10,11 @@ public interface CourseShareDao extends BaseDAO<Integer, CourseShare> {
 
     int batchInsert(@Param("courseShares") List<CourseShare> courseShares);
 
-    List<CourseShare> selectByCourseId(@Param("courseId") Integer courseId);
+    List<CourseShare> selectByCourseId(@Param("courseId") Long courseId);
 
-    void deleteByCourseId(@Param("courseId") Integer courseId);
+    void deleteByCourseId(@Param("courseId") Long courseId);
 
     void deleteByIds(@Param("ids") List<Integer> ids);
+
+    void deleteByCourseAndUserIds(@Param("courseId") Long courseId, @Param("userIds") List<Integer> userIds);
 }

+ 16 - 5
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseShareDto.java

@@ -1,7 +1,6 @@
 package com.ym.mec.biz.dal.dto;
 
 
-import com.ym.mec.biz.dal.enums.ShareModeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -21,11 +20,23 @@ public class CourseShareDto {
 
     @NotNull(message = "课程不能为空")
     @ApiModelProperty(value = "课程ID")
-    private Integer courseId;
-
-    @ApiModelProperty(value = "课程ID,OPEN:公开,PRIVATE:私有")
-    private ShareModeEnum shareMode;
+    private Long courseId;
 
     @ApiModelProperty(value = "学生列表")
     private List<Integer> userIds;
+
+    @ApiModelProperty(value = "查询条件")
+    private String search;
+
+    @ApiModelProperty(value = "声部ID")
+    private String subjectId;
+
+    @ApiModelProperty(value = "分部ID,多个逗号隔开")
+    private String organIds;
+
+    @ApiModelProperty(value = "群聊ID")
+    private String groupIds;
+
+    @ApiModelProperty(value = "学校ID")
+    private String schoolIds;
 }

+ 25 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/UpdateCourseShareModeDto.java

@@ -0,0 +1,25 @@
+package com.ym.mec.biz.dal.dto;
+
+
+import com.ym.mec.biz.dal.enums.ShareModeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+
+/**
+ * @author 袁亮
+ * @apiNote 课程修改分享方式模型模型
+ */
+@ApiModel(value = "课程修改分享方式模型模型")
+@Data
+@NoArgsConstructor
+public class UpdateCourseShareModeDto {
+
+    @ApiModelProperty("课程ID")
+    private Long courseId;
+
+    @ApiModelProperty("课程分享方式,OPEN:公开,PRIVATE:私密")
+    private ShareModeEnum shareMode;
+}

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

@@ -232,6 +232,9 @@ public class CourseSchedule  extends BaseEntity{
     @ApiModelProperty(value = "是否连堂课 continuous_course_")
     private Boolean continuousCourse;
 
+	@ApiModelProperty("直播课分享模式,默认:NO_SHARE(未分享),OPEN(公开),PRIVATE(私密)")
+	private ShareModeEnum shareMode;
+
     public Boolean getContinuousCourse() {
         return continuousCourse;
     }
@@ -754,6 +757,14 @@ public class CourseSchedule  extends BaseEntity{
 		this.liveRoomId = liveRoomId;
 	}
 
+	public ShareModeEnum getShareMode() {
+		return shareMode;
+	}
+
+	public void setShareMode(ShareModeEnum shareMode) {
+		this.shareMode = shareMode;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

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

@@ -29,11 +29,7 @@ public class CourseShare extends BaseEntity {
 
     @ApiModelProperty(value = "课程ID")
     @TableField(value = "course_id_")
-    private Integer courseId;
-
-    @ApiModelProperty(value = "分享模式")
-    @TableField(value = "share_mode_")
-    private ShareModeEnum shareMode;
+    private Long courseId;
 
     @ApiModelProperty(value = "学生用户ID")
     @TableField(value = "user_id_")

+ 13 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ShareModeEnum.java

@@ -7,11 +7,23 @@ import lombok.Getter;
 
 /**
  * @author 袁亮
- * @apiNote 课程共享方式:开放/私有
+ * @apiNote 课程共享方式:未分享/开放/私有
  */
 @Getter
 public enum ShareModeEnum implements BaseEnum<String, ShareModeEnum> {
+    /**
+     * 课程未分享
+     */
+    NO_SHARE("NO_SHARE"),
+
+    /**
+     * 公开分享
+     */
     OPEN("OPEN"),
+
+    /**
+     * 私密分享
+     */
     PRIVATE("PRIVATE");
 
     @EnumValue

+ 24 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseShareQueryInfo.java

@@ -0,0 +1,24 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author 袁亮
+ * @apiNote 课程分享分页查询模型
+ */
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("课程分享分页查询模型")
+@Data
+public class CourseShareQueryInfo extends QueryInfo {
+
+    @NotNull(message = "课程编号不能为空")
+    @ApiModelProperty(value = "课程编号")
+    private Long courseId;
+
+}

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

@@ -4,6 +4,7 @@ import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.enums.CourseStatusEnum;
 import com.ym.mec.biz.dal.enums.JoinCourseType;
+import com.ym.mec.biz.dal.enums.ShareModeEnum;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -37,6 +38,8 @@ public class LiveGroupWrapper {
 
         private Long classGroupId;
 
+        @ApiModelProperty("共享方式,NO_SHARE:未共享,OPEN:公开,PRIVATE:私密")
+        private ShareModeEnum shareMode;
     }
 
 

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

@@ -799,4 +799,6 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
      * @return
      */
     IPage<CourseScheduleDto> liveCoursePage(LiveGroupWrapper.LiveCoursePageQuery queryInfo);
+
+	void updateCourseScheduleShareMode(UpdateCourseShareModeDto updateCourseShareModeDto);
 }

+ 9 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/CourseShareService.java

@@ -3,17 +3,22 @@ package com.ym.mec.biz.service;
 import com.ym.mec.biz.dal.dto.CourseShareDto;
 import com.ym.mec.biz.dal.dto.StudentManageListDto;
 import com.ym.mec.biz.dal.entity.CourseShare;
+import com.ym.mec.biz.dal.page.CourseShareQueryInfo;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
 public interface CourseShareService extends BaseService<Integer, CourseShare> {
 
-    List<CourseShare> create(Integer tenantId, CourseShareDto courseShareDto);
+    List<CourseShare> saveCourseShare(CourseShareDto courseShareDto);
 
-    List<StudentManageListDto> queryCourseSharedStudent(Integer tenantId, Integer courseId);
+    PageInfo<StudentManageListDto> queryCourseSharedStudent(CourseShareQueryInfo shareQueryInfo);
 
-    List<StudentManageListDto> queryStudentList(Integer tenantId, Integer organId, Integer subjectId);
+    boolean createPaymentRecord(Long courseId, Integer userId);
 
-    boolean createPaymentRecord(Integer tenantId, Long courseId, Integer userId);
+    String importStudent(MultipartFile file, Long courseId);
+
+    boolean deleteStudent(CourseShareDto courseShareDto);
 }

+ 32 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -5854,6 +5854,29 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         return true;
     }
 
+	/**
+	 * 更新课程共享方式
+	 *
+	 * @param updateCourseShareModeDto 模型入参
+	 */
+	@Transactional(rollbackFor = Exception.class)
+	@Override
+	public void updateCourseScheduleShareMode(UpdateCourseShareModeDto updateCourseShareModeDto) {
+		Long courseId = updateCourseShareModeDto.getCourseId();
+		CourseSchedule courseSchedule = courseScheduleDao.get(courseId);
+		if (courseSchedule == null) {
+			throw new BizException("课程不存在");
+		}
+		ShareModeEnum shareMode = updateCourseShareModeDto.getShareMode();
+		if (ShareModeEnum.NO_SHARE.equals(shareMode)) {
+			throw new BizException("不支持修改为不共享模式");
+		}
+		if (!shareMode.equals(courseSchedule.getShareMode())) {
+			courseSchedule.setShareMode(shareMode);
+			courseScheduleDao.update(courseSchedule);
+		}
+	}
+
     @Override
     public List<CourseScheduleStudentDto> queryDetailList(CourseDetailQueryInfo courseDetailQueryInfo) {
         List<CourseScheduleStudentDto> courseScheduleStudentDtos = courseScheduleDao.queryDetailList(courseDetailQueryInfo);
@@ -6065,6 +6088,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			}
 		}
 
+		// 直播课关联直播间编号
+		String liveRoomId = courseSchedule.getLiveRoomId();
+
 		List<CourseScheduleWrapper.CourseScheduleTime> courseScheduleTimes = Lists.newArrayList();
 		if (CollectionUtils.isNotEmpty(newCourseSchedules)) {
 
@@ -6077,9 +6103,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			}
 
 			// 获取连堂课第一节信息
-			courseSchedule = newCourseSchedules.get(0);
-
-			CourseSchedule finalCourseSchedule = courseSchedule;
+			CourseSchedule finalCourseSchedule = newCourseSchedules.get(0);
 			CompletableFuture.runAsync(() -> {
 
 				List<Long> collect = newCourseSchedules.stream()
@@ -6101,7 +6125,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				}
 
 			});
-
+			// 连堂课直播间编号
+			liveRoomId = finalCourseSchedule.getLiveRoomId();
 		} else {
 
 			// 当前课程信息
@@ -6121,23 +6146,20 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 		// 直播间配置
 		ImLiveBroadcastRoom liveBroadcastRoom = imLiveBroadcastRoomService.lambdaQuery()
-				.eq(ImLiveBroadcastRoom::getRoomUid, courseSchedule.getLiveRoomId())
+				.eq(ImLiveBroadcastRoom::getRoomUid, liveRoomId)
 				.last("LIMIT 1")
 				.one();
 		if (Objects.isNull(liveBroadcastRoom)) {
 			throw new BizException("请先进入直播课教室");
 		}
 
-		// 当前时间
-		DateTime now = DateTime.now();
-
 		return CourseScheduleWrapper.LiveCourseSchedule.builder()
-				.liveRoomId(courseSchedule.getLiveRoomId())
+				.liveRoomId(liveRoomId)
 				.subjectId(liveBroadcastRoom.getSubjectId())
 				.autoCloseFlag(true)
 				.autoCloseNetworkRoomTime(getCloseNetworkRoomTime(courseSchedule, continueCourseTime))
 				.surplusTime(DateUtil.secondsBetween(new Date(), courseSchedule.getEndClassTime()))
-				.timestamp(now.getMillis())
+				.timestamp(DateTime.now().getMillis())
 				.courseScheduleTimes(courseScheduleTimes)
 				.build();
 	}

+ 220 - 60
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseShareServiceImpl.java

@@ -1,36 +1,44 @@
 package com.ym.mec.biz.service.impl;
 
 import com.google.common.collect.Lists;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.CourseScheduleDao;
 import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
 import com.ym.mec.biz.dal.dao.CourseShareDao;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
 import com.ym.mec.biz.dal.dao.StudentDao;
 import com.ym.mec.biz.dal.dao.StudentManageDao;
+import com.ym.mec.biz.dal.dao.SubjectDao;
 import com.ym.mec.biz.dal.dto.CourseShareDto;
 import com.ym.mec.biz.dal.dto.StudentManageListDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
 import com.ym.mec.biz.dal.entity.CourseShare;
+import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.enums.JoinCourseType;
-import com.ym.mec.biz.dal.enums.ShareModeEnum;
+import com.ym.mec.biz.dal.page.CourseShareQueryInfo;
 import com.ym.mec.biz.service.CourseShareService;
 import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.filters.TenantIdThreadLocal;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.excel.POIUtil;
 import org.apache.commons.collections.CollectionUtils;
-import org.springframework.beans.BeanUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.ByteArrayInputStream;
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 
@@ -41,11 +49,17 @@ import java.util.stream.Collectors;
 @Service
 public class CourseShareServiceImpl extends BaseServiceImpl<Integer, CourseShare> implements CourseShareService {
 
+    private static final Logger LOG = LoggerFactory.getLogger(CourseShareServiceImpl.class);
     /**
      * 批量操作,分批数据最大限制
      */
     private static final int BATCH_OPE_MAX_SIZE = 500;
 
+    /**
+     * 导入数据错误信息最大长度
+     */
+    private static final int IMPORT_ERR_MSG_MAX_LEN = 1000;
+
     private static final String TENANT_ID = "tenantId";
 
     @Autowired
@@ -66,6 +80,11 @@ public class CourseShareServiceImpl extends BaseServiceImpl<Integer, CourseShare
     @Autowired
     private CourseScheduleDao courseScheduleDao;
 
+    @Autowired
+    private OrganizationDao organizationDao;
+
+    private static final List<String> STUDENT_TEMPLATE_FIELDS = Arrays.asList("分部", "学生姓名", "手机号");
+
     @Override
     public BaseDAO<Integer, CourseShare> getDAO() {
         return courseShareDao;
@@ -73,88 +92,73 @@ public class CourseShareServiceImpl extends BaseServiceImpl<Integer, CourseShare
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public List<CourseShare> create(Integer tenantId, CourseShareDto courseShareDto) {
-        List<CourseShare> courseShares = new ArrayList<>();
+    public List<CourseShare> saveCourseShare(CourseShareDto courseShareDto) {
+        CourseSchedule courseSchedule = getCourseScheduleById(courseShareDto.getCourseId());
         Integer userId = userService.getUserId();
-        if (ShareModeEnum.PRIVATE.equals(courseShareDto.getShareMode())) {
-            if (CollectionUtils.isEmpty(courseShareDto.getUserIds())) {
-                // 不分享,清理数据并返回
-                courseShareDao.deleteByCourseId(courseShareDto.getCourseId());
-                return new ArrayList<>();
-            }
-            List<Student> students = studentDao.findByStudentIds(courseShareDto.getUserIds());
-            courseShares = students.stream().map(next -> {
-                CourseShare courseShare = new CourseShare();
-                BeanUtils.copyProperties(courseShareDto, courseShare);
-                courseShare.setUserId(next.getUserId());
-                courseShare.setTenantId(tenantId);
-                courseShare.setCreateTime(new Date());
-                courseShare.setCreateBy(userId);
-                return courseShare;
-            }).collect(Collectors.toList());
-        } else {
+        if (CollectionUtils.isEmpty(courseShareDto.getUserIds())) {
+            // 不分享,清理数据并返回
+            courseShareDao.deleteByCourseId(courseShareDto.getCourseId());
+            return new ArrayList<>();
+        }
+
+        List<Student> students = studentDao.findByStudentIds(courseShareDto.getUserIds());
+        List<CourseShare> courseShares = students.stream().map(next -> {
             CourseShare courseShare = new CourseShare();
-            BeanUtils.copyProperties(courseShareDto, courseShare);
-            courseShare.setTenantId(tenantId);
+            courseShare.setCourseId(courseShareDto.getCourseId());
+            courseShare.setTenantId(courseSchedule.getTenantId());
+            courseShare.setUserId(next.getUserId());
             courseShare.setCreateTime(new Date());
             courseShare.setCreateBy(userId);
-            courseShares.add(courseShare);
-        }
+            return courseShare;
+        }).collect(Collectors.toList());
 
         // 处理已经分享过的数据
         List<CourseShare> existShares = courseShareDao.selectByCourseId(courseShareDto.getCourseId());
-        if (CollectionUtils.isNotEmpty(existShares) && (courseShareDto.getShareMode().equals(ShareModeEnum.PRIVATE))) {
+        if (CollectionUtils.isNotEmpty(existShares)) {
             // 私有分享,删除历史数据
             List<Integer> sharedHistoryRecords = existShares.stream()
                     .map(CourseShare::getId)
                     .collect(Collectors.toList());
-            if (CollectionUtils.isNotEmpty(sharedHistoryRecords)) {
-                courseShareDao.deleteByIds(sharedHistoryRecords);
-            }
+            courseShareDao.deleteByIds(sharedHistoryRecords);
         }
         // 数据入库
-        List<List<CourseShare>> groupList = Lists.partition(courseShares, BATCH_OPE_MAX_SIZE);
-        for (List<CourseShare> shares : groupList) {
-            courseShareDao.batchInsert(shares);
-        }
+        batchInsert(courseShares);
         return courseShareDao.selectByCourseId(courseShareDto.getCourseId());
     }
 
     @Override
-    public List<StudentManageListDto> queryCourseSharedStudent(Integer tenantId, Integer courseId) {
+    public PageInfo<StudentManageListDto> queryCourseSharedStudent(CourseShareQueryInfo shareQueryInfo) {
+        CourseSchedule courseSchedule = getCourseScheduleById(shareQueryInfo.getCourseId());
+        PageInfo<StudentManageListDto> pageInfo = new PageInfo<>(shareQueryInfo.getPage(), shareQueryInfo.getRows());
         // 查询该课程已经分享的学生列表
         Map<String, Object> courseParam = new HashMap<>(2);
-        courseParam.put("courseId", courseId);
-        courseParam.put(TENANT_ID, tenantId);
+        courseParam.put("courseId", shareQueryInfo.getCourseId());
+        courseParam.put(TENANT_ID, courseSchedule.getTenantId());
         List<CourseShare> courseShareRecords = courseShareDao.findAll(courseParam);
         if (CollectionUtils.isEmpty(courseShareRecords)) {
-            return new ArrayList<>();
+            pageInfo.setTotal(0);
+            pageInfo.setRows(new ArrayList<>());
+            return pageInfo;
         }
 
         // 查询学生列表
         Map<String, Object> param = new HashMap<>(2);
-        param.put(TENANT_ID, tenantId);
+        param.put(TENANT_ID, courseSchedule.getTenantId());
+        MapUtil.populateMap(param, shareQueryInfo);
         param.put("userIds", courseShareRecords.stream().map(CourseShare::getUserId).toArray());
-        return studentManageDao.findStudentsByOrganId(param);
-    }
-
-    @Override
-    public List<StudentManageListDto> queryStudentList(Integer tenantId, Integer organId, Integer subjectId) {
-        Map<String, Object> param = new HashMap<>(2);
-        if (organId != null) {
-            param.put("organIds", new int[]{organId});
+        int count = studentManageDao.countStudentAttendances(param);
+        pageInfo.setTotal(count);
+        if (count > 0) {
+            param.put("offset", pageInfo.getOffset());
+            pageInfo.setRows(studentManageDao.findStudentsByOrganId(param));
         }
-        if (subjectId != null) {
-            param.put("subjectId", subjectId);
-        }
-        param.put(TENANT_ID, tenantId);
-        // 查询指定分部和声部对应的学生列表
-        return studentManageDao.findStudentsByOrganId(param);
+        return pageInfo;
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public boolean createPaymentRecord(Integer tenantId, Long courseId, Integer userId) {
+    public boolean createPaymentRecord(Long courseId, Integer userId) {
+        CourseSchedule courseSchedule = getCourseScheduleById(courseId);
         // 查询是否已经进入直播间,进入即表示存在记录,不需要重复插入数据
         int haveCourse = courseScheduleStudentPaymentDao.checkStudentHaveCourse(courseId, userId);
         if (haveCourse == 0) {
@@ -173,7 +177,7 @@ public class CourseShareServiceImpl extends BaseServiceImpl<Integer, CourseShare
             payment.setExpectPriceBak(sharePrice);
             payment.setActualPriceBak(sharePrice);
             payment.setCreateTime(new Date());
-            payment.setTenantId(tenantId);
+            payment.setTenantId(courseSchedule.getTenantId());
             payment.setClassGroupId(schedule.getClassGroupId());
             payment.setJoinCourseType(JoinCourseType.SHARE);
             courseScheduleStudentPaymentDao.insert(payment);
@@ -181,4 +185,160 @@ public class CourseShareServiceImpl extends BaseServiceImpl<Integer, CourseShare
         return true;
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public String importStudent(MultipartFile file, Long courseId) {
+        CourseSchedule courseSchedule = getCourseScheduleById(courseId);
+        Map<String, List<Map<String, Object>>> sheetsListMap;
+        try {
+            sheetsListMap = POIUtil.importExcel(
+                    new ByteArrayInputStream(file.getBytes()), 0, file.getOriginalFilename());
+        } catch (Exception e) {
+            LOG.error("导入课程分享学员数据失败", e);
+            throw new BizException("文件读取失败");
+        }
+        List<Map<String, Object>> students = sheetsListMap.get("student");
+        if (CollectionUtils.isEmpty(students)) {
+            throw new BizException("文件格式错误,无法获取[student]页签数据");
+        }
+        if (!students.get(0).keySet().containsAll(STUDENT_TEMPLATE_FIELDS)) {
+            throw new BizException("页签必须包含[分部/学生姓名/手机号]");
+        }
+        List<Organization> allOrgans = organizationDao.findAllOrgans(courseSchedule.getTenantId());
+        Set<String> orgNames = allOrgans.stream().map(Organization::getName).collect(Collectors.toSet());
+        StringBuilder sb = new StringBuilder();
+        List<Student> studentList = new ArrayList<>();
+        Set<String> phoneNos = new HashSet<>();
+        for (int index = 0; index < students.size(); index++) {
+            Map<String, Object> row = students.get(index);
+            Student student = checkExcelData(sb, orgNames, phoneNos, index, row);
+            if (student == null) {
+                // 空行过滤
+                continue;
+            }
+            // 避免导入数据存在大量错误数据,出现长时间等待
+            if (sb.length() > IMPORT_ERR_MSG_MAX_LEN) {
+                break;
+            }
+            studentList.add(student);
+        }
+        if (sb.length() > 0) {
+            throw new BizException(sb.toString());
+        }
+
+        // 判断导入的学生数据是否在库中匹配到,过滤非法的学生数据
+        SysUser sysUser = userService.getUser();
+        Map<Integer, String> orgIdNameMap = allOrgans.stream()
+                .collect(Collectors.toMap(Organization::getId, Organization::getName));
+
+        Map<String, List<Student>> studentGroupByOrg = studentList.stream()
+                .collect(Collectors.groupingBy(Student::getOrganName));
+
+        // 按分部分批处理,避免大量加载数据库数据
+        Map<String, Object> params = new HashMap<>();
+        params.put(TENANT_ID, courseSchedule.getTenantId());
+        for (Map.Entry<String, List<Student>> entry : studentGroupByOrg.entrySet()) {
+            Optional<Map.Entry<Integer, String>> orgIdName = orgIdNameMap.entrySet()
+                    .stream().filter(next -> next.getValue().equals(entry.getKey())).findFirst();
+            if (!orgIdName.isPresent()) {
+                // 不会发生
+                continue;
+            }
+            Integer orgId = orgIdName.get().getKey();
+            params.put("organIds", new int[]{orgId});
+            List<StudentManageListDto> manageListDtos = studentManageDao.findStudentsByOrganId(params);
+            // 判断学生的姓名和手机号是否匹配上,不匹配的数据过滤掉
+            Map<String, StudentManageListDto> legalStudentMap = manageListDtos.stream()
+                    .collect(Collectors.toMap(next -> (next.getUsername() + "_" + next.getParentsPhone()),
+                            Function.identity()));
+            Set<String> legalKeys = legalStudentMap.keySet();
+            entry.getValue().removeIf(next -> {
+                String key = next.getUsername() + "_" + next.getPhone();
+                if (legalKeys.contains(key)) {
+                    next.setUserId(legalStudentMap.get(key).getUserId());
+                    return false;
+                }
+                return true;
+            });
+        }
+        List<Student> legalStudents = studentGroupByOrg.values().stream()
+                .flatMap(Collection::stream).collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(legalStudents)) {
+            throw new BizException("未解析到合法的学生");
+        }
+
+        // 处理导入数据中存在已经分享的数据再次入库
+        List<CourseShare> existShares = courseShareDao.selectByCourseId(courseId);
+        if (CollectionUtils.isNotEmpty(existShares)) {
+            Set<String> existShareKeys = existShares.stream()
+                    .map(next -> (next.getCourseId() + "_" + next.getUserId())).collect(Collectors.toSet());
+            legalStudents.removeIf(next -> existShareKeys.contains(courseId + "_" + next.getUserId()));
+        }
+        List<CourseShare> courseShares = legalStudents.stream().map(next -> {
+            CourseShare courseShare = new CourseShare();
+            courseShare.setUserId(next.getUserId());
+            courseShare.setTenantId(TenantIdThreadLocal.get());
+            courseShare.setCourseId(courseId);
+            courseShare.setCreateTime(new Date());
+            courseShare.setCreateBy(sysUser.getId());
+            return courseShare;
+        }).collect(Collectors.toList());
+        batchInsert(courseShares);
+        return String.format("成功导入%s条数据", courseShares.size());
+    }
+
+    @Override
+    public boolean deleteStudent(CourseShareDto courseShareDto) {
+        courseShareDao.deleteByCourseAndUserIds(courseShareDto.getCourseId(), courseShareDto.getUserIds());
+        return true;
+    }
+
+    private Student checkExcelData(StringBuilder sb, Set<String> orgNames, Set<String> phoneNos, int i, Map<String,
+            Object> row) {
+        Student student = new Student();
+        if (row.size() == 0) {
+            return null;
+        }
+        Object orgName = row.get(STUDENT_TEMPLATE_FIELDS.get(0));
+        if (Objects.isNull(orgName) || !orgNames.contains(orgName.toString().trim())) {
+            sb.append(String.format("第%s行分部数据格式错误或者所属分部不存在%n", (i + 2)));
+        } else {
+            student.setOrganName(orgName.toString().trim());
+        }
+        Object studentName = row.get(STUDENT_TEMPLATE_FIELDS.get(1));
+        if (Objects.nonNull(studentName)) {
+            student.setUsername(studentName.toString().trim());
+        } else {
+            sb.append(String.format("第%s行学生姓名数据格式错误%n", (i + 2)));
+        }
+        Object phoneNo = row.get(STUDENT_TEMPLATE_FIELDS.get(2));
+        if (Objects.nonNull(phoneNo)) {
+            String phone = phoneNo.toString().trim();
+            if (phoneNos.contains(phone)) {
+                sb.append(String.format("第%s行手机号重复%n", (i + 2)));
+                return null;
+            }
+            student.setPhone(phone);
+            phoneNos.add(phone);
+        } else {
+            sb.append(String.format("第%s行手机号数据格式错误%n", (i + 2)));
+        }
+        return student;
+    }
+
+
+    private void batchInsert(List<CourseShare> courseShares) {
+        List<List<CourseShare>> groupList = Lists.partition(courseShares, BATCH_OPE_MAX_SIZE);
+        for (List<CourseShare> shares : groupList) {
+            courseShareDao.batchInsert(shares);
+        }
+    }
+
+    private CourseSchedule getCourseScheduleById(Long courseId) {
+        CourseSchedule courseSchedule = courseScheduleDao.get(courseId);
+        if (courseSchedule == null) {
+            throw new BizException("课程不存在");
+        }
+        return courseSchedule;
+    }
 }

+ 7 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -129,6 +129,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     private RedissonMessageService redissonMessageService;
 
     @Autowired
+    private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
+
+    @Autowired
     private ImFeignService imFeignService;
 
     //待替换的变量
@@ -445,7 +448,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 
             Date endTime = DateUtil.addMinutes(now, PRE_LIVE_TIME_MINUTE);
             if (endTime.getTime() >= dto.getLiveStartTime().getTime()) {
-                this.createLiveRoom(obj);
+                imLiveBroadcastRoomService.createLiveRoom(obj);
             }
         });
     }
@@ -2194,6 +2197,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void createLiveRoom(ImLiveBroadcastRoom room) {
+        if (StringUtils.isBlank(room.getGroupType())) {
+            room.setGroupType("NORMAL");
+        }
         log.info("createLiveRoom>>>>>>roomUid:{}", room.getRoomUid());
         try {
             //生成主讲人信息到缓存

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -4931,9 +4931,16 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         List<CourseSchedule> courseSchedules;
         if (vipGroup.getStatus().equals(VipGroupStatusEnum.APPLYING)) {
             courseSchedules =  JSON.parseArray(vipGroup.getCourseSchedulesJson(), CourseSchedule.class);
+            // 报名中的课程默认未分享,不能修改
+            courseSchedules.forEach(next->next.setShareMode(ShareModeEnum.NO_SHARE));
         } else {
             courseSchedules =  courseScheduleDao.findGroupCourseSchedules(vipGroup.getId().toString(), GroupType.LIVE.getCode());
         }
+        // 添加共享方式过滤
+        ShareModeEnum shareMode = query.getShareMode();
+        if (shareMode != null) {
+            courseSchedules.removeIf(next -> !shareMode.equals(next.getShareMode()));
+        }
 
 
         Map<String, Object> result = new HashMap<>();

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

@@ -49,6 +49,7 @@
         <result column="live_remind_" property="liveRemind"/>
         <result column="live_room_id_" property="liveRoomId" />
         <result column="continuous_course_" property="continuousCourse" />
+        <result column="share_mode_" property="shareMode" />
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
@@ -100,6 +101,7 @@
         <result column="complaint_status_" property="complaintStatus"/>
         <result column="student_id_" property="studentId"/>
         <result column="live_room_id_" property="liveRoomId" />
+        <result column="share_mode_" property="shareMode" />
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.entity.StudentCourseScheduleRecordDto" id="studentCourseScheduleRecord">
@@ -187,7 +189,8 @@
         cs.service_provider_,
         cs.mute_all_,
         cs.live_room_id_,
-        cs.continuous_course_
+        cs.continuous_course_,
+        cs.share_mode_
     </sql>
 
     <sql id="courseIgnore">
@@ -342,6 +345,9 @@
             <if test="liveRoomId != null">
                 live_room_id_ = #{liveRoomId},
             </if>
+            <if test="shareMode != null">
+                share_mode_ = #{shareMode},
+            </if>
         </set>
         WHERE id_ = #{id} and tenant_id_ = #{tenantId}
     </update>
@@ -594,6 +600,7 @@
             cs.group_type_,
             cs.class_group_id_,
             cs.new_course_id_,
+            cs.share_mode_,
             cg.student_num_ total_student_num_,
             su.real_name_ teacher_name_,
             su.avatar_,
@@ -697,7 +704,8 @@
             cs.teach_mode_,
             cs.new_course_id_,
             cs.group_type_,
-        cs.live_room_id_
+            cs.live_room_id_,
+            cs.share_mode_
         FROM
             course_schedule_student_payment cssp
             LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
@@ -744,7 +752,8 @@
         cs.teach_mode_,
         cs.live_room_id_,
         cs.group_type_,
-        cs.music_group_id_
+        cs.music_group_id_,
+        cs.share_mode_
         FROM
         course_schedule_teacher_salary csts
         LEFT JOIN course_schedule cs ON csts.course_schedule_id_=cs.id_
@@ -782,7 +791,8 @@
         s.name_ school_name_,
         if(ta.sign_in_status_ IS NULL,0,1) sign_in_status_,
         if(ta.sign_out_status_ IS NULL,0,1) sign_out_status_,
-        cs.teach_mode_
+        cs.teach_mode_,
+        cs.share_mode_
         FROM
         course_schedule cs
         LEFT JOIN sys_user su ON cs.actual_teacher_id_ = su.id_
@@ -835,7 +845,8 @@
                ta.complaints_type_,
                ta.url_,
                ta.dispose_content_,
-               cs.teach_mode_
+               cs.teach_mode_,
+               cs.share_mode_
         FROM course_schedule_teacher_salary csts
                  LEFT JOIN course_schedule cs ON csts.course_schedule_id_ = cs.id_
                  LEFT JOIN sys_user su ON csts.user_id_ = su.id_
@@ -926,7 +937,8 @@
         cs.name_,
         cs.student_num_,
         cs.leave_student_num_,
-        cs.schoole_id_
+        cs.schoole_id_,
+        cs.share_mode_
         FROM
         course_schedule cs
         LEFT JOIN course_schedule_teacher_salary csts ON cs.id_ = csts.course_schedule_id_
@@ -1144,6 +1156,9 @@
             <if test="type!=null and type!=''">
                 AND cs.group_type_ = #{type}
             </if>
+            <if test="shareMode != null and shareMode != ''">
+                AND cs.share_mode_ = #{shareMode}
+            </if>
             <if test="status != null and status != 'TRUANT'">
                 AND sa.status_ = #{status}
             </if>
@@ -1275,6 +1290,7 @@
                cs.student_num_,
                cs.leave_student_num_,
                cs.schoole_id_,
+               cs.share_mode_,
                s.name_                                           schoole_name_
         FROM course_schedule cs
                  LEFT JOIN school s ON cs.schoole_id_ = s.id_
@@ -1303,6 +1319,7 @@
         create_time_,
         update_time_,
         type_,name_,
+        share_mode_,
         teach_mode_
         FROM
         course_schedule
@@ -1406,6 +1423,9 @@
                 <if test="item.note != null">
                     note_ = #{item.note},
                 </if>
+                <if test="item.shareMode != null">
+                    share_mode_ = #{item.shareMode},
+                </if>
                 update_time_ = NOW()
             </set>
             WHERE id_ = #{item.id} and tenant_id_ = #{item.tenantId}
@@ -1725,6 +1745,7 @@
         cg.name_,
         cs.student_num_,
         cs.leave_student_num_,
+        cs.share_mode_,
         cs.schoole_id_
         FROM course_schedule cs
         LEFT JOIN class_group cg ON cs.class_group_id_=cg.id_
@@ -1853,6 +1874,7 @@
         CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
         cs.type_,
         cs.name_,
+        cs.share_mode_,
         cs.actual_teacher_id_
         FROM
         course_schedule cs
@@ -1945,6 +1967,7 @@
                cs.name_,
                cs.student_num_,
                cs.leave_student_num_,
+               cs.share_mode_,
                cs.schoole_id_
         FROM course_schedule cs
         WHERE
@@ -1974,6 +1997,7 @@
                cs.name_,
                cs.student_num_,
                cs.leave_student_num_,
+               cs.share_mode_,
                cs.schoole_id_
         from course_schedule cs
                  LEFT JOIN course_schedule_teacher_salary csts ON cs.id_ = csts.course_schedule_id_
@@ -2000,6 +2024,7 @@
                cs.name_,
                cs.student_num_,
                cs.leave_student_num_,
+               cs.share_mode_,
                cs.schoole_id_
         from course_schedule cs
                  LEFT JOIN course_schedule_teacher_salary csts ON cs.id_ = csts.course_schedule_id_
@@ -2027,6 +2052,7 @@
         cs.student_num_,
         cs.leave_student_num_,
         cs.schoole_id_,
+        cs.share_mode_,
         cg.name_ class_group_name_
         from course_schedule cs
         LEFT JOIN class_group cg ON cs.class_group_id_=cg.id_
@@ -2185,6 +2211,7 @@
                cs.leave_student_num_,
                cs.teaching_point_,
                cs.teaching_content_,
+               cs.share_mode_,
                cs.schoole_id_
         FROM course_schedule cs
         WHERE cs.class_group_id_ = #{classGroupId}

+ 14 - 10
mec-biz/src/main/resources/config/mybatis/CourseShareMapper.xml

@@ -4,7 +4,6 @@
     <resultMap type="com.ym.mec.biz.dal.entity.CourseShare" id="courseShare">
         <result column="id_" property="id"/>
         <result column="course_id_" property="courseId"/>
-        <result column="share_mode_" property="shareMode"/>
         <result column="user_id_" property="userId"/>
         <result column="create_time_" property="createTime"/>
         <result column="create_by_" property="createBy"/>
@@ -38,8 +37,8 @@
     <!-- 向数据库增加一条记录 -->
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.CourseShare" useGeneratedKeys="true" keyColumn="id"
             keyProperty="id">
-        INSERT INTO course_share (id_, course_id_, share_mode_, user_id_, create_time_, create_by_, tenant_id_)
-        VALUES (#{id}, #{courseId}, #{shareMode}, #{userId}, NOW(), #{createBy}, #{tenantId})
+        INSERT INTO course_share (id_, course_id_, user_id_, create_time_, create_by_, tenant_id_)
+        VALUES (#{id}, #{courseId}, #{userId}, NOW(), #{createBy}, #{tenantId})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -49,9 +48,6 @@
             <if test="courseId != null">
                 course_id_ = #{courseId},
             </if>
-            <if test="shareMode != null">
-                share_mode_ = #{shareMode},
-            </if>
             <if test="userId != null">
                 user_id_ = #{userId},
             </if>
@@ -80,17 +76,16 @@
     </select>
 
     <select id="selectByCourseId" resultMap="courseShare">
-        select id_, course_id_, share_mode_, user_id_, create_time_, create_by_, tenant_id_
+        select id_, course_id_, user_id_, create_time_, create_by_, tenant_id_
         from course_share
         where course_id_ = #{courseId}
     </select>
 
     <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-        INSERT INTO course_share (id_, course_id_, share_mode_, user_id_, create_time_, create_by_, tenant_id_)
+        INSERT INTO course_share (id_, course_id_, user_id_, create_time_, create_by_, tenant_id_)
         VALUES
         <foreach collection="courseShares" item="item" separator=",">
-            (#{item.id},#{item.courseId},#{item.shareMode},
-            #{item.userId},NOW(),#{item.createBy},#{item.tenantId})
+            (#{item.id},#{item.courseId},#{item.userId},NOW(),#{item.createBy},#{item.tenantId})
         </foreach>
     </insert>
 
@@ -106,4 +101,13 @@
             #{id}
         </foreach>
     </delete>
+
+    <delete id="deleteByCourseAndUserIds">
+        DELETE FROM course_share WHERE
+        course_id_ = #{courseId} and
+        user_id_ IN
+        <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
+            #{userId}
+        </foreach>
+    </delete>
 </mapper>

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

@@ -325,6 +325,14 @@ public class CourseScheduleController extends BaseController {
         return succeed();
     }
 
+    @ApiOperation(value = "课程共享方式调整")
+    @PostMapping("/updateCourseScheduleShareMode")
+    @PreAuthorize("@pcs.hasPermissions('courseSchedule/updateCourseScheduleShareMode')")
+    public Object updateCourseScheduleShareMode(@RequestBody UpdateCourseShareModeDto updateCourseShareModeDto){
+        courseScheduleService.updateCourseScheduleShareMode(updateCourseShareModeDto);
+        return succeed();
+    }
+
     @ApiOperation(value = "vip课批量新增")
     @PostMapping("/batchAppendVipGroupCourses")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/batchAppendVipGroupCourses')")

+ 29 - 19
mec-web/src/main/java/com/ym/mec/web/controller/CourseShareController.java

@@ -4,20 +4,23 @@ package com.ym.mec.web.controller;
 import com.ym.mec.biz.dal.dto.CourseShareDto;
 import com.ym.mec.biz.dal.dto.StudentManageListDto;
 import com.ym.mec.biz.dal.entity.CourseShare;
+import com.ym.mec.biz.dal.page.CourseShareQueryInfo;
 import com.ym.mec.biz.service.CourseShareService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
-import com.ym.mec.common.tenant.TenantContextHolder;
+import com.ym.mec.common.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -34,30 +37,37 @@ public class CourseShareController extends BaseController {
     @Autowired
     private CourseShareService courseShareService;
 
-    @ApiOperation(value = "创建分享")
-    @PostMapping("/create")
-    @PreAuthorize("@pcs.hasPermissions('courseShare/create')")
-    public HttpResponseResult<List<CourseShare>> create(@RequestBody CourseShareDto courseShareDto) {
-        Integer tenantId = TenantContextHolder.getTenantId();
-        return succeed(courseShareService.create(tenantId, courseShareDto));
+    @ApiOperation(value = "保存分享列表")
+    @PostMapping("/saveCourseShare")
+    @PreAuthorize("@pcs.hasPermissions('courseShare/saveCourseShare')")
+    public HttpResponseResult<List<CourseShare>> saveCourseShare(@Validated @RequestBody CourseShareDto courseShareDto) {
+        return succeed(courseShareService.saveCourseShare(courseShareDto));
     }
 
     @ApiOperation(value = "查询已经分享过的学生")
     @GetMapping("/queryCourseSharedStudent")
     @PreAuthorize("@pcs.hasPermissions('courseShare/queryCourseSharedStudent')")
-    public HttpResponseResult<List<StudentManageListDto>> queryCourseSharedStudent(
-            @RequestParam(value = "courseId") Integer courseId) {
-        Integer tenantId = TenantContextHolder.getTenantId();
-        return succeed(courseShareService.queryCourseSharedStudent(tenantId,courseId));
+    public HttpResponseResult<PageInfo<StudentManageListDto>> queryCourseSharedStudent(
+            CourseShareQueryInfo shareQueryInfo) {
+        return succeed(courseShareService.queryCourseSharedStudent(shareQueryInfo));
     }
 
-    @ApiOperation(value = "查询学生列表")
-    @GetMapping("/queryStudentList")
-    @PreAuthorize("@pcs.hasPermissions('courseShare/queryStudentList')")
-    public HttpResponseResult<List<StudentManageListDto>> queryStudentList(
-            @RequestParam(value = "organId", required = false) Integer organId,
-            @RequestParam(value = "subjectId", required = false) Integer subjectId) {
-        Integer tenantId = TenantContextHolder.getTenantId();
-        return succeed(courseShareService.queryStudentList(tenantId, organId, subjectId));
+    @ApiOperation(value = "导入学员")
+    @PostMapping(value = "/importStudent")
+    @PreAuthorize("@pcs.hasPermissions('courseShare/importStudent')")
+    public HttpResponseResult<String> importStudent(@RequestParam("file") MultipartFile file,
+                                                    @RequestParam("courseId") Long courseId) {
+        String msg = courseShareService.importStudent(file, courseId);
+        HttpResponseResult<String> succeed = succeed();
+        succeed.setMsg(msg);
+        return succeed;
+    }
+
+    @ApiOperation("删除共享的学员")
+    @PostMapping("/deleteShareStudent")
+    @PreAuthorize("@pcs.hasPermissions('courseShare/deleteShareStudent')")
+    public Object deleteShareStudent(@Validated @RequestBody CourseShareDto courseShareDto) {
+        courseShareService.deleteStudent(courseShareDto);
+        return succeed();
     }
 }