Browse Source

Merge branch 'saas' of http://git.dayaedu.com/yonge/mec into zx_saas_cbs

zouxuan 1 year ago
parent
commit
874384d186
38 changed files with 1086 additions and 644 deletions
  1. 2 1
      mec-application/src/main/java/com/ym/mec/config/ResourceServerConfig.java
  2. 15 7
      mec-application/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java
  3. 98 0
      mec-application/src/main/java/com/ym/mec/student/controller/StudentCoursewarePlayRecordController.java
  4. 12 14
      mec-application/src/main/java/com/ym/mec/teacher/controller/CourseHomeworkController.java
  5. 16 16
      mec-application/src/main/java/com/ym/mec/teacher/controller/ExtracurricularExercisesController.java
  6. 11 0
      mec-application/src/main/java/com/ym/mec/teacher/controller/SysConfigController.java
  7. 27 40
      mec-application/src/main/java/com/ym/mec/teacher/controller/TeacherAttendanceController.java
  8. 140 0
      mec-application/src/main/java/com/ym/mec/web/controller/StudentCoursewarePlayRecordController.java
  9. 9 1
      mec-application/src/main/resources/exportColumnMapper.ini
  10. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysConfigDao.java
  11. 5 252
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkStudentDetailDto.java
  12. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationDetailDto.java
  13. 15 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonTrainingDetailWrapper.java
  14. 4 147
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ExtracurricularExercisesReply.java
  15. 52 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentCoursewarePlayRecord.java
  16. 10 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonTrainingDetail.java
  17. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportEnum.java
  18. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java
  19. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/StudentCoursewarePlayRecordMapper.java
  20. 177 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/StudentCoursewarePlayRecordWrapper.java
  21. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentCourseHomeworkService.java
  22. 50 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentCoursewarePlayRecordService.java
  23. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentLessonTrainingDetailService.java
  24. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  25. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  26. 4 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java
  27. 61 84
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  28. 132 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCoursewarePlayRecordServiceImpl.java
  29. 86 45
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonTrainingDetailServiceImpl.java
  30. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysConfigServiceImpl.java
  31. 4 17
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  32. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/UserMusicServiceImpl.java
  33. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  34. 1 0
      mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesMapper.xml
  35. 1 3
      mec-biz/src/main/resources/config/mybatis/StudentCourseHomeworkMapper.xml
  36. 70 0
      mec-biz/src/main/resources/config/mybatis/StudentCoursewarePlayRecordMapper.xml
  37. 2 1
      mec-biz/src/main/resources/config/mybatis/StudentLessonExaminationDetailMapper.xml
  38. 3 0
      mec-biz/src/main/resources/config/mybatis/SysConfigMapper.xml

+ 2 - 1
mec-application/src/main/java/com/ym/mec/config/ResourceServerConfig.java

@@ -52,7 +52,8 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 
                 //teacher
                         "/api-teacher/teacher/queryStudentApply", "/api-teacher/teacher/querySubByMusicGroupId", "/api-teacher/studentRegistration/updateSubject",
-                        "/api-teacher/studyReport/createEvaluate", "/api-teacher/teacherOrder/*", "/api-teacher/teacher/getRegisterOrPreList", "/api-teacher/teacherContract/callback", "/api-teacher/eduPracticeGroup/queryOrderInfo",
+                        "/api-teacher/studyReport/createEvaluate", "/api-teacher/teacherOrder/*", "/api-teacher/teacher/getRegisterOrPreList",
+                        "/api-teacher/teacherContract/callback", "/api-teacher/eduPracticeGroup/queryOrderInfo", "/api-teacher/open/**",
 
                 //web
                         "/api-web/classGroup/highClassGroups", "/api-web/api/*", "/api-web/appVersionInfo/queryByPlatform", "/api-web/eduDegree/*",

+ 15 - 7
mec-application/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java

@@ -3,6 +3,7 @@ package com.ym.mec.student.controller;
 import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
 import com.ym.mec.biz.dal.dto.HomeworkStat;
 import com.ym.mec.biz.dal.dto.StudentHomeworkRecordDto;
+import com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper;
 import com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply;
 import com.ym.mec.biz.dal.entity.StudentCourseHomework;
 import com.ym.mec.biz.dal.entity.StudentLessonTrainingDetail;
@@ -17,10 +18,10 @@ import com.yonge.log.model.AuditLogAnnotation;
 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.MediaType;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import java.util.List;
 
 /**
@@ -32,16 +33,15 @@ import java.util.List;
 @RestController
 public class StudentCourseHomeworkController extends BaseController {
 
-    @Autowired
+    @Resource
     private StudentCourseHomeworkService studentCourseHomeworkService;
-    @Autowired
+    @Resource
     private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
-    @Autowired
+    @Resource
     private SysUserService sysUserService;
-    @Autowired
+    @Resource
     private StudentServeService studentServeService;
-
-    @Autowired
+    @Resource
     private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
 
     @ApiOperation(value = "提交作业")
@@ -121,6 +121,14 @@ public class StudentCourseHomeworkController extends BaseController {
         return succeed(studentCourseHomeworkService.findStudentHomeworkRecordDetail(query));
     }
 
+    @ApiOperation(value = "获取学生作业课件列表")
+    @PostMapping(value = "/findStudentHomeworkCourseware")
+    public HttpResponseResult<List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>>
+    findStudentHomeworkCourseware(@RequestBody CourseHomeworkWrapper.StudentCourseHomeworkQuery query){
+        query.setUserId(sysUserService.getUserId().longValue());
+        return succeed(studentCourseHomeworkService.findStudentHomeworkCourseware(query));
+    }
+
 
 
     @ApiOperation(value = "添加作业练习记录")

+ 98 - 0
mec-application/src/main/java/com/ym/mec/student/controller/StudentCoursewarePlayRecordController.java

@@ -0,0 +1,98 @@
+package com.ym.mec.student.controller;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.StudentCoursewarePlayRecord;
+import com.ym.mec.biz.dal.wrapper.StudentCoursewarePlayRecordWrapper;
+import com.ym.mec.biz.service.StudentCoursewarePlayRecordService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.PageUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+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 javax.annotation.Resource;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("${app-config.url.student:}/studentCoursewarePlayRecord")
+@Api(tags = "学生课件播放统计记录")
+public class StudentCoursewarePlayRecordController extends BaseController {
+
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private StudentCoursewarePlayRecordService studentCoursewarePlayRecordService;
+
+    @ApiOperation(value = "详情", notes = "学生课件播放统计记录-根据详情ID查询单条, 传入id")
+    @PreAuthorize("@pcs.hasPermissions('studentCoursewarePlayRecord/detail')")
+//    @GetMapping("/detail/{id}")
+    public HttpResponseResult<StudentCoursewarePlayRecord> detail(@PathVariable("id") Long id) {
+
+        StudentCoursewarePlayRecord wrapper = studentCoursewarePlayRecordService.detail(id);
+
+        return succeed(wrapper);
+    }
+
+    @ApiOperation(value = "查询分页", notes = "学生课件播放统计记录- 传入 StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecordQuery")
+    @PreAuthorize("@pcs.hasPermissions('studentCoursewarePlayRecord/page')")
+//    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<StudentCoursewarePlayRecord>> page(@RequestBody StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecordQuery query) {
+
+        IPage<StudentCoursewarePlayRecord> pages = studentCoursewarePlayRecordService.selectPage(QueryInfo.getPage(query), query);
+
+        return succeed(PageUtil.pageInfo(pages));
+    }
+
+    @ApiOperation(value = "新增", notes = "学生课件播放统计记录- 传入 StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecord")
+    @PostMapping("/save")
+    public HttpResponseResult<JSONObject> add(@Validated @RequestBody StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecordSave studentCoursewarePlayRecord) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        studentCoursewarePlayRecord.setUserId(sysUser.getId());
+        studentCoursewarePlayRecord.setOrganizationId(sysUser.getOrganId());
+        // 新增数据
+        studentCoursewarePlayRecordService.save(studentCoursewarePlayRecord);
+
+        return succeed();
+    }
+
+    @ApiOperation(value = "修改", notes = "学生课件播放统计记录- 传入 StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecord")
+    @PreAuthorize("@pcs.hasPermissions('studentCoursewarePlayRecord/update')")
+//    @PostMapping("/update")
+    public HttpResponseResult<JSONObject> update(@Validated @RequestBody StudentCoursewarePlayRecord studentCoursewarePlayRecord) {
+
+        // 更新数据
+        studentCoursewarePlayRecordService.updateById(studentCoursewarePlayRecord);
+
+        return succeed();
+    }
+
+    @ApiOperation(value = "删除", notes = "学生课件播放统计记录- 传入id")
+    @PreAuthorize("@pcs.hasPermissions('studentCoursewarePlayRecord/remove')")
+//    @PostMapping("/remove")
+    public HttpResponseResult<Boolean> remove(@RequestParam Long id) {
+
+        return succeed(studentCoursewarePlayRecordService.removeById(id));
+    }
+}

+ 12 - 14
mec-application/src/main/java/com/ym/mec/teacher/controller/CourseHomeworkController.java

@@ -17,10 +17,10 @@ import com.ym.mec.common.exception.BizException;
 import com.yonge.log.model.AuditLogAnnotation;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-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.Map;
 import java.util.Objects;
@@ -34,25 +34,23 @@ import java.util.Objects;
 @RestController
 public class CourseHomeworkController extends BaseController {
 
-    @Autowired
+    @Resource
     private CourseHomeworkService courseHomeworkService;
-    @Autowired
+    @Resource
     private StudentCourseHomeworkService studentCourseHomeworkService;
-    @Autowired
+    @Resource
     private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
-    @Autowired
+    @Resource
     private SysUserService sysUserService;
-
-    @Autowired
+    @Resource
     private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
-
-    @Autowired
+    @Resource
     private CourseHomeworkDao courseHomeworkDao;
 
     @ApiOperation(value = "布置课堂作业")
     @GetMapping("/addCourseHomework")
     @AuditLogAnnotation(operateName = "布置课堂作业")
-    public HttpResponseResult addCourseHomework(CourseHomework courseHomework){
+    public HttpResponseResult<Object> addCourseHomework(CourseHomework courseHomework){
         courseHomeworkService.addCourseHomework(courseHomework);
         return succeed();
     }
@@ -66,7 +64,7 @@ public class CourseHomeworkController extends BaseController {
 
     @ApiOperation(value = "根据课程计划获取需要交作业的学生")
     @GetMapping("/findCourseStudents")
-    public Object findCourseStudents(Long courseScheduleId,String userName){
+    public HttpResponseResult<List<StudentCourseHomework>> findCourseStudents(Long courseScheduleId, String userName){
         if (Objects.isNull(courseScheduleId)) {
             throw new BizException("请指定课程");
         }
@@ -75,7 +73,7 @@ public class CourseHomeworkController extends BaseController {
 
     @ApiOperation(value = "根据课程计划获取需要交作业的学生-公用")
     @GetMapping("/findCourseStudentsPublic")
-    public Object findCourseStudentsPublic(Long courseScheduleId,String userName, boolean extra){
+    public HttpResponseResult<List<StudentCourseHomework>> findCourseStudentsPublic(Long courseScheduleId, String userName, boolean extra){
         if(!extra){
             if (Objects.isNull(courseScheduleId)) {
                 throw new BizException("请指定课程");
@@ -88,7 +86,7 @@ public class CourseHomeworkController extends BaseController {
 
     @ApiOperation(value = "获取学生作业界面详细信息")
     @GetMapping(value = "/findCourseHomeworkStudentDetail")
-    public Object findCourseHomeworkStudentDetail(Long courseScheduleID,Long userId){
+    public HttpResponseResult<CourseHomeworkStudentDetailDto> findCourseHomeworkStudentDetail(Long courseScheduleID,Long userId){
         StudentCourseHomework studentCourseHomework1 = studentCourseHomeworkService.get(courseScheduleID);
         if(Objects.isNull(studentCourseHomework1)){
             return failed("训练不存在");
@@ -105,7 +103,7 @@ public class CourseHomeworkController extends BaseController {
 
     @ApiOperation(value = "获取学生作业界面详细信息-公用")
     @GetMapping(value = "/findCourseHomeworkStudentDetailPublic")
-    public Object findCourseHomeworkStudentDetailPublic(Long courseScheduleID,Long userId, boolean extra){
+    public HttpResponseResult<CourseHomeworkStudentDetailDto> findCourseHomeworkStudentDetailPublic(Long courseScheduleID,Long userId, boolean extra){
         if(!extra){
             StudentCourseHomework studentCourseHomework1 = studentCourseHomeworkService.get(courseScheduleID);
             if(Objects.isNull(studentCourseHomework1)){

+ 16 - 16
mec-application/src/main/java/com/ym/mec/teacher/controller/ExtracurricularExercisesController.java

@@ -3,8 +3,7 @@ package com.ym.mec.teacher.controller;
 import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
 import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
 import com.ym.mec.biz.dal.dao.SubjectDao;
-import com.ym.mec.biz.dal.dto.BasicUserDto;
-import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.ExtracurricularExercises;
 import com.ym.mec.biz.dal.entity.MusicGroup;
@@ -26,6 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -38,24 +38,24 @@ import java.util.stream.Collectors;
 @RestController
 public class ExtracurricularExercisesController extends BaseController {
 
-    @Autowired
+    @Resource
     private ExtracurricularExercisesService extracurricularExercisesService;
-    @Autowired
+    @Resource
     private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
-    @Autowired
+    @Resource
     private StudentExtracurricularExercisesSituationService studentExtracurricularExercisesSituationService;
-    @Autowired
+    @Resource
     private SysUserService sysUserService;
-    @Autowired
+    @Resource
     private StudentRegistrationDao studentRegistrationDao;
-    @Autowired
+    @Resource
     private ClassGroupStudentMapperDao classGroupStudentMapperDao;
-    @Autowired
+    @Resource
     private SubjectDao subjectDao;
 
     @ApiOperation(value = "获取教师有服务指标的课程列表")
     @GetMapping("/queryTeacherServeHomeworkDetail")
-    public HttpResponseResult queryTeacherServeHomeworkDetail(TeacherServeHomeworkQueryInfo queryInfo) {
+    public HttpResponseResult<PageInfo<TeacherServeHomeworkPojo>> queryTeacherServeHomeworkDetail(TeacherServeHomeworkQueryInfo queryInfo) {
         queryInfo.setTeacherId(sysUserService.getUserId());
         return succeed(studentExtracurricularExercisesSituationService.queryTeacherServeHomeworkDetail1(queryInfo));
     }
@@ -78,21 +78,21 @@ public class ExtracurricularExercisesController extends BaseController {
 
     @ApiOperation(value = "获取老师训练统计")
     @GetMapping("/getStatistics")
-    public HttpResponseResult getStatistics(ExtraExercilseQueryInfo queryInfo) {
+    public HttpResponseResult<TeacherExercisesServiceDto> getStatistics(ExtraExercilseQueryInfo queryInfo) {
         queryInfo.setTeacherId(sysUserService.getUserId());
         return succeed(studentExtracurricularExercisesSituationService.getStatistics(queryInfo));
     }
 
     @ApiOperation(value = "统计老师当前时间能布置作业的课程数量")
     @GetMapping("/countWaitCreateHomeworkNum")
-    public HttpResponseResult countWaitCreateHomeworkNum() {
+    public HttpResponseResult<Integer> countWaitCreateHomeworkNum() {
         return succeed(studentExtracurricularExercisesSituationService.countWaitCreateHomeworkNum());
     }
 
     @ApiOperation(value = "创建课外训练")
     @PostMapping("/createExtraExercises")
     @AuditLogAnnotation(operateName = "创建课外训练")
-    private HttpResponseResult createExtraExercises(ExtracurricularExercises exercises){
+    private HttpResponseResult<Object> createExtraExercises(ExtracurricularExercises exercises){
         exercises.setTeacherId(sysUserService.getUserId());
         exercises.setGroupType(ELessonTrainingType.EXTRACURRICULAR.getCode());
         extracurricularExercisesService.createExtraExercises(exercises);
@@ -102,7 +102,7 @@ public class ExtracurricularExercisesController extends BaseController {
     @ApiOperation(value = "创建课外训练")
     @PostMapping("/createExtraExercisesForJson")
     @AuditLogAnnotation(operateName = "创建课外训练")
-    private HttpResponseResult createExtraExercisesForJson(@RequestBody ExtracurricularExercises exercises){
+    private HttpResponseResult<Object> createExtraExercisesForJson(@RequestBody ExtracurricularExercises exercises){
         if(null == exercises.getExpireDate()){
             Calendar instance = Calendar.getInstance();
             instance.add(Calendar.WEEK_OF_MONTH,1);
@@ -116,14 +116,14 @@ public class ExtracurricularExercisesController extends BaseController {
 
     @ApiOperation(value = "获取课外训练列表")
     @GetMapping("/findExtraExercilses")
-    private HttpResponseResult findExtraExercilses(ExtraExercilseQueryInfo queryInfo){
+    private HttpResponseResult<List<Map<String, Object>>> findExtraExercilses(ExtraExercilseQueryInfo queryInfo){
         queryInfo.setTeacherId(sysUserService.getUserId());
         return succeed(extracurricularExercisesService.findExtraExercilses(queryInfo));
     }
 
     @ApiOperation(value = "获取已布置训练列表(包含课后,课外)")
     @GetMapping("/findExtraExercilsesHomeworks")
-    private HttpResponseResult findExtraExercilsesHomeworks(ExtraExercilseQueryInfo queryInfo){
+    private HttpResponseResult<PageInfo<TeacherHomeworkListDto>> findExtraExercilsesHomeworks(ExtraExercilseQueryInfo queryInfo){
         queryInfo.setTeacherId(sysUserService.getUserId());
         return succeed(extracurricularExercisesService.findExtraExercilsesHomeworks(queryInfo));
     }

+ 11 - 0
mec-application/src/main/java/com/ym/mec/teacher/controller/SysConfigController.java

@@ -3,11 +3,13 @@ package com.ym.mec.teacher.controller;
 import com.ym.mec.biz.dal.entity.SysConfig;
 import com.ym.mec.biz.service.SysConfigService;
 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.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 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;
 
@@ -43,4 +45,13 @@ public class SysConfigController extends BaseController {
 		}
 		return succeed(sysConfigService.findByParamName(paramName));
 	}
+
+	@ApiOperation(value = "查询参数(多个逗号分隔)")
+	@PostMapping(value = "queryByParamNames")
+	public HttpResponseResult<List<SysConfig>> queryByParamNames(String paramName) {
+		if(StringUtils.isBlank(paramName)){
+			return failed("参数不能为空");
+		}
+		return succeed(sysConfigService.findByParamNames(paramName));
+	}
 }

+ 27 - 40
mec-application/src/main/java/com/ym/mec/teacher/controller/TeacherAttendanceController.java

@@ -1,13 +1,13 @@
 package com.ym.mec.teacher.controller;
 
-import com.ym.mec.auth.api.client.SysUserFeignService;
-import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.StudentAttendanceDao;
 import com.ym.mec.biz.dal.dto.StudentAttendanceDto;
+import com.ym.mec.biz.dal.dto.StudentAttendanceViewDto;
 import com.ym.mec.biz.dal.dto.TeacherSignOutDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.StudentAttendance;
+import com.ym.mec.biz.dal.entity.TeacherAttendance;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
@@ -17,17 +17,16 @@ import com.ym.mec.biz.dal.wrapper.LiveGroupWrapper;
 import com.ym.mec.biz.service.*;
 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.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.date.DateUtil;
 import com.yonge.log.model.AuditLogAnnotation;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.util.CollectionUtils;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -36,42 +35,42 @@ import java.util.stream.Collectors;
 @RestController
 public class TeacherAttendanceController extends BaseController {
 
-    @Autowired
+    @Resource
     private TeacherAttendanceService teacherAttendanceService;
-    @Autowired
+    @Resource
     private StudentAttendanceService studentAttendanceService;
-    @Autowired
+    @Resource
     private StudentAttendanceDao studentAttendanceDao;
-    @Autowired
+    @Resource
     private ClassGroupService classGroupService;
-    @Autowired
-    private SysUserFeignService sysUserFeignService;
-    @Autowired
+    @Resource
+    private SysUserService sysUserService;
+    @Resource
     private SysMessageService sysMessageService;
-    @Autowired
+    @Resource
     private CourseScheduleService courseScheduleService;
-    @Autowired
+    @Resource
     private MusicGroupService musicGroupService;
-    @Autowired
+    @Resource
     private OrganizationService organizationService;
 
     @ApiOperation(value = "新增教师签到")
     @PostMapping("/add")
     @AuditLogAnnotation(operateName = "新增教师签到")
-    public Object add(@RequestBody TeacherSignOutDto teacherSignOutDto) {
+    public HttpResponseResult<Map<String, Object>> add(@RequestBody TeacherSignOutDto teacherSignOutDto) {
         return succeed(teacherAttendanceService.addTeacherAttendanceRecord(teacherSignOutDto));
     }
 
     @ApiOperation(value = "分页查询教师签到列表")
     @GetMapping("/queryPage")
-    public Object queryPage(TeacherAttendanceQueryInfo queryInfo) {
+    public HttpResponseResult<PageInfo<TeacherAttendance>> queryPage(TeacherAttendanceQueryInfo queryInfo) {
         return succeed(teacherAttendanceService.queryPage(queryInfo));
     }
 
 
     @ApiOperation(value = "根据班级ID获取当前课程的学生")
     @GetMapping("/getCurrentCourseStudents")
-    public Object getCurrentCourseStudents(Long courseScheduleId){
+    public HttpResponseResult<List<StudentAttendanceViewDto>> getCurrentCourseStudents(Long courseScheduleId){
         return succeed(classGroupService.findAttendanceStudentByCourse(courseScheduleId));
     }
 
@@ -79,7 +78,7 @@ public class TeacherAttendanceController extends BaseController {
 
     @ApiOperation(value = "根据班级ID获取当前课程的学生")
     @PostMapping("/getLiveCurrentCourseStudents")
-    public Object getLiveCurrentCourseStudents(@RequestBody LiveGroupWrapper.LiveCourseStudentQuery query){
+    public HttpResponseResult<List<StudentAttendanceViewDto>> getLiveCurrentCourseStudents(@RequestBody LiveGroupWrapper.LiveCourseStudentQuery query){
         return succeed(classGroupService.getLiveCurrentCourseStudents(query));
     }
 
@@ -87,23 +86,19 @@ public class TeacherAttendanceController extends BaseController {
     @GetMapping("/getGradeList")
     public HttpResponseResult<Map<Integer,String>> getGradeList(Long courseScheduleId) {
         CourseSchedule courseSchedule = courseScheduleService.get(courseScheduleId);
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if(sysUser == null){
-            return failed("请重新登录");
-        }
         return succeed(organizationService.getGradeList(courseSchedule.getOrganId()));
     }
 
     @ApiOperation(value = "点名")
     @PostMapping("/addStudentAttendances")
     @AuditLogAnnotation(operateName = "点名")
-    public Object addStudentAttendances(@RequestBody StudentAttendanceDto studentAttendanceInfo){
+    public HttpResponseResult<Map<String, Object>> addStudentAttendances(@RequestBody StudentAttendanceDto studentAttendanceInfo){
         return succeed(studentAttendanceService.addStudentAttendances(studentAttendanceInfo));
     }
 
     @ApiOperation(value = "学员到课提醒")
     @PostMapping("/studentAttendanceNormalRemind")
-    public HttpResponseResult studentAttendanceNormalRemind(Long courseId){
+    public HttpResponseResult<Object> studentAttendanceNormalRemind(Long courseId){
         int remindNum = studentAttendanceDao.countNormalRemindNum(courseId);
         if(remindNum > 0){
             return failed("您已发送过到课提醒");
@@ -129,7 +124,7 @@ public class TeacherAttendanceController extends BaseController {
             }
         }
 
-        if (normal != null && normal.size() > 0) {
+        if (CollectionUtils.isNotEmpty(normal)) {
             Map<Integer, String> receivers = new HashMap<>(normal.size());
             normal.forEach(e -> receivers.put(e.getUserId(), e.getUserId().toString()));
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_NAMES_ACHIEVE,
@@ -143,29 +138,21 @@ public class TeacherAttendanceController extends BaseController {
 
     @ApiOperation(value = "获取签退详情")
     @GetMapping("/getTeacherSignDetail")
-    public Object getTeacherSignDetail(Integer courseScheduleId){
-        SysUser user = sysUserFeignService.queryUserInfo();
-        if(Objects.isNull(user)){
-            return failed(HttpStatus.FORBIDDEN,"请登录");
-        }
-        return succeed(teacherAttendanceService.getTeacherSignDetail(courseScheduleId, user.getId()));
+    public HttpResponseResult<TeacherSignOutDto> getTeacherSignDetail(Integer courseScheduleId){
+        return succeed(teacherAttendanceService.getTeacherSignDetail(courseScheduleId, sysUserService.getUserId()));
     }
 
     @ApiOperation(value = "提交考勤申述")
     @PostMapping("/addComplaints")
-    public Object addComplaints(Long courseScheduleId, String content, String url, UpdateAttendanceEnum complaintsType){
+    public HttpResponseResult<Object> addComplaints(Long courseScheduleId, String content, String url, UpdateAttendanceEnum complaintsType){
         teacherAttendanceService.addComplaints(courseScheduleId,content,url,null,complaintsType);
         return succeed();
     }
 
     @ApiOperation(value = "撤销考勤申述")
     @PostMapping("/repealComplaints")
-    public Object repealComplaints(Long courseScheduleId){
-        SysUser user = sysUserFeignService.queryUserInfo();
-        if(Objects.isNull(user)){
-            throw new BizException("请登录");
-        }
-        teacherAttendanceService.repealComplaints(courseScheduleId,user.getId());
+    public HttpResponseResult<Object> repealComplaints(Long courseScheduleId){
+        teacherAttendanceService.repealComplaints(courseScheduleId,sysUserService.getUserId());
         return succeed();
     }
 }

+ 140 - 0
mec-application/src/main/java/com/ym/mec/web/controller/StudentCoursewarePlayRecordController.java

@@ -0,0 +1,140 @@
+package com.ym.mec.web.controller;
+
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.ym.mec.biz.dal.entity.StudentCoursewarePlayRecord;
+import com.ym.mec.biz.dal.enums.ExportEnum;
+import com.ym.mec.biz.dal.wrapper.StudentCoursewarePlayRecordWrapper;
+import com.ym.mec.biz.service.ExportService;
+import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.biz.service.StudentCoursewarePlayRecordService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.PageUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.beanutils.BeanUtils;
+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.PathVariable;
+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 javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("${app-config.url.web:}/studentCoursewarePlayRecord")
+@Api(tags = "学生课件播放统计记录")
+public class StudentCoursewarePlayRecordController extends BaseController {
+
+    @Autowired
+    private StudentCoursewarePlayRecordService studentCoursewarePlayRecordService;
+
+    @Autowired
+    private ExportService exportService;
+
+    @Autowired
+    private OrganizationService organizationService;
+
+    @ApiOperation(value = "详情", notes = "学生课件播放统计记录-根据详情ID查询单条, 传入id")
+    @PreAuthorize("@pcs.hasPermissions('studentCoursewarePlayRecord/detail')")
+//    @GetMapping("/detail/{id}")
+    public HttpResponseResult<StudentCoursewarePlayRecord> detail(@PathVariable("id") Long id) {
+
+        StudentCoursewarePlayRecord wrapper = studentCoursewarePlayRecordService.detail(id);
+
+        return succeed(wrapper);
+    }
+
+    @ApiOperation(value = "查询分页", notes = "学生课件播放统计记录- 传入 StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecordQuery")
+    @PreAuthorize("@pcs.hasPermissions('studentCoursewarePlayRecord/page')")
+//    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<StudentCoursewarePlayRecord>> page(@RequestBody StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecordQuery query) {
+
+        IPage<StudentCoursewarePlayRecord> pages = studentCoursewarePlayRecordService.selectPage(QueryInfo.getPage(query), query);
+
+        return succeed(PageUtil.pageInfo(pages));
+    }
+
+    @ApiOperation(value = "新增", notes = "学生课件播放统计记录- 传入 StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecord")
+    @PreAuthorize("@pcs.hasPermissions('studentCoursewarePlayRecord/save')")
+//    @PostMapping("/save")
+    public HttpResponseResult<JSONObject> add(@Validated @RequestBody StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecord studentCoursewarePlayRecord) {
+        return succeed();
+    }
+
+    @ApiOperation(value = "修改", notes = "学生课件播放统计记录- 传入 StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecord")
+    @PreAuthorize("@pcs.hasPermissions('studentCoursewarePlayRecord/update')")
+//    @PostMapping("/update")
+    public HttpResponseResult<JSONObject> update(@Validated @RequestBody StudentCoursewarePlayRecord studentCoursewarePlayRecord) {
+
+        // 更新数据
+        studentCoursewarePlayRecordService.updateById(studentCoursewarePlayRecord);
+
+        return succeed();
+    }
+
+    @ApiOperation(value = "删除", notes = "学生课件播放统计记录- 传入id")
+    @PreAuthorize("@pcs.hasPermissions('studentCoursewarePlayRecord/remove')")
+//    @PostMapping("/remove")
+    public HttpResponseResult<Boolean> remove(@RequestParam Long id) {
+
+        return succeed(studentCoursewarePlayRecordService.removeById(id));
+    }
+
+    /**
+     * 练习统计
+     */
+    @PostMapping("/statList")
+    @PreAuthorize("@pcs.hasPermissions('studentCoursewarePlayRecord/statList')")
+    public HttpResponseResult<List<StudentCoursewarePlayRecordWrapper.StatQueryData>> statList(@RequestBody StudentCoursewarePlayRecordWrapper.StatQuery statQuery) {
+        statQuery.setOrganizationId(organizationService.getEmployeeOrgan(statQuery.getOrganizationId()));
+        return succeed(studentCoursewarePlayRecordService.statList(statQuery));
+    }
+
+
+    /**
+     * 练习统计导出
+     */
+    @PostMapping("/exportStatList")
+    @PreAuthorize("@pcs.hasPermissions('studentCoursewarePlayRecord/exportStatList')")
+    public HttpResponseResult exportStatList(@RequestBody StudentCoursewarePlayRecordWrapper.StatQuery statQuery) {
+        statQuery.setOrganizationId(organizationService.getEmployeeOrgan(statQuery.getOrganizationId()));
+        return exportService.getExportManageFuncMap().get(ExportEnum.VIDEO_PLAY_STAT).apply(JSON.parseObject(JSON.toJSONString(statQuery), Map.class));
+    }
+
+
+    /**
+     * 练习详情统计
+     */
+    @PostMapping("/statDetailPage")
+    @PreAuthorize("@pcs.hasPermissions('studentCoursewarePlayRecord/statDetailPage')")
+    public HttpResponseResult<PageInfo<StudentCoursewarePlayRecordWrapper.StatQueryData>> statDetailPage(@RequestBody StudentCoursewarePlayRecordWrapper.StatQuery statQuery) {
+        return succeed(PageUtil.pageInfo(studentCoursewarePlayRecordService.statDetailPage(statQuery)));
+    }
+
+    /**
+     * 练习统计详情导出
+     */
+    @PostMapping("/exportStatDetailPage")
+    @PreAuthorize("@pcs.hasPermissions('studentCoursewarePlayRecord/exportStatDetailPage')")
+    public HttpResponseResult exportStatDetailPage(@RequestBody StudentCoursewarePlayRecordWrapper.StatQuery statQuery) {
+        statQuery.setPage(1);
+        statQuery.setRows(9999);
+        return exportService.getExportManageFuncMap().get(ExportEnum.VIDEO_PLAY_DETAIL_STAT).apply(JSON.parseObject(JSON.toJSONString(statQuery), Map.class));
+    }
+}

+ 9 - 1
mec-application/src/main/resources/exportColumnMapper.ini

@@ -400,4 +400,12 @@ fieldColumns = ["organName","musicGroupId","musicGroupName","studentId","student
 
 [平衡关系(分表)-乐团退团学员]
 headColumns = ["分部","乐团编号","乐团名称","学员编号","学员名称"]
-fieldColumns = ["organName","musicGroupId","musicGroupName","studentId","studentName"]
+fieldColumns = ["organName","musicGroupId","musicGroupName","studentId","studentName"]
+
+[云课堂统计导出]
+headColumns = ["分部名称","会员人数","无练习人数","0-10分钟","10-60分钟","60-120分钟","120-240分钟",">240分钟","平均时长(分钟)"]
+fieldColumns = ["organizationName","memberNum","noPlayNum","playTimeLess10","playTimeLess60","playTimeLess120","playTimeLess240","playTimeRather240","avgPlayTime"]
+
+[云课堂统计详情导出]
+headColumns = ["声部老师","会员人数","无练习人数","0-10分钟","10-60分钟","60-120分钟","120-240分钟",">240分钟","平均时长(分钟)"]
+fieldColumns = ["teacherName","memberNum","noPlayNum","playTimeLess10","playTimeLess60","playTimeLess120","playTimeLess240","playTimeRather240","avgPlayTime"]

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

@@ -25,4 +25,6 @@ public interface SysConfigDao extends BaseDAO<Long, SysConfig> {
     String findConfigValue(String paramName);
 
     void batchUpdate(@Param("configList") List<SysConfig> configList);
+
+    List<SysConfig> findByParamNames(@Param("paramName") String paramName);
 }

+ 5 - 252
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkStudentDetailDto.java

@@ -1,19 +1,20 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.entity.MusicGroupTrainPlan;
+import com.ym.mec.biz.dal.entity.SysMusicScore;
 import com.ym.mec.biz.dal.enums.StandardEnum;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.util.Date;
 import java.util.List;
 
-import com.ym.mec.biz.dal.entity.MusicGroupTrainPlan;
-import com.ym.mec.biz.dal.entity.SysMusicScore;
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
-
 /**
  * @Author Joburgess
  * @Date 2019/9/18
  */
+@Data
 public class CourseHomeworkStudentDetailDto {
 
     @ApiModelProperty(value = "乐团名称",required = false)
@@ -94,254 +95,6 @@ public class CourseHomeworkStudentDetailDto {
     @ApiModelProperty(value = "作业创建时间",required = false)
     private Date createTime;
 
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
-    public Boolean getSubmitFlag() {
-        return submitFlag;
-    }
-
-    public void setSubmitFlag(Boolean submitFlag) {
-        this.submitFlag = submitFlag;
-    }
-
-    public Date getSubmitTime() {
-        return submitTime;
-    }
-
-    public void setSubmitTime(Date submitTime) {
-        this.submitTime = submitTime;
-    }
-
-    public boolean getExpire() {
-        return expire;
-    }
-
-    public void setExpire(boolean expire) {
-        this.expire = expire;
-    }
-
-    public StandardEnum getStandardFlag() {
-        return standardFlag;
-    }
-
-    public void setStandardFlag(StandardEnum standardFlag) {
-        this.standardFlag = standardFlag;
-    }
-
-    public String getMusicScoreContent() {
-        return musicScoreContent;
-    }
-
-    public void setMusicScoreContent(String musicScoreContent) {
-        this.musicScoreContent = musicScoreContent;
-    }
-
-    public SysMusicScore getSysMusicScore() {
-        return sysMusicScore;
-    }
-
-    public void setSysMusicScore(SysMusicScore sysMusicScore) {
-        this.sysMusicScore = sysMusicScore;
-    }
-
-    public List<SysMusicScore> getSysMusicScoreList() {
-        return sysMusicScoreList;
-    }
-
-    public void setSysMusicScoreList(List<SysMusicScore> sysMusicScoreList) {
-        this.sysMusicScoreList = sysMusicScoreList;
-    }
-
-    public Integer getHasMember() {
-        return hasMember;
-    }
-
-    public void setHasMember(Integer hasMember) {
-        this.hasMember = hasMember;
-    }
-
     @ApiModelProperty(value = "提交云教练的作业开关",required = false)
     private Integer homeworkOpenFlag;
-
-    public Integer getHomeworkOpenFlag() {
-        return homeworkOpenFlag;
-    }
-
-    public void setHomeworkOpenFlag(Integer homeworkOpenFlag) {
-        this.homeworkOpenFlag = homeworkOpenFlag;
-    }
-
-    public String getMusicScoreId() {
-        return musicScoreId;
-    }
-
-    public void setMusicScoreId(String musicScoreId) {
-        this.musicScoreId = musicScoreId;
-    }
-
-    public String getMusicScoreName() {
-        return musicScoreName;
-    }
-
-    public void setMusicScoreName(String musicScoreName) {
-        this.musicScoreName = musicScoreName;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public Long getCourseScheduleId() {
-        return courseScheduleId;
-    }
-
-    public void setCourseScheduleId(Long courseScheduleId) {
-        this.courseScheduleId = courseScheduleId;
-    }
-
-    public Integer getStudentId() {
-        return studentId;
-    }
-
-    public void setStudentId(Integer studentId) {
-        this.studentId = studentId;
-    }
-
-    public String getStudentName() {
-        return studentName;
-    }
-
-    public void setStudentName(String studentName) {
-        this.studentName = studentName;
-    }
-
-    public Integer getTeacherId() {
-        return teacherId;
-    }
-
-    public void setTeacherId(Integer teacherId) {
-        this.teacherId = teacherId;
-    }
-
-    public String getTeacherName() {
-        return teacherName;
-    }
-
-    public void setTeacherName(String teacherName) {
-        this.teacherName = teacherName;
-    }
-
-    public Long getStudentCourseHomeworkId() {
-        return studentCourseHomeworkId;
-    }
-
-    public void setStudentCourseHomeworkId(Long studentCourseHomeworkId) {
-        this.studentCourseHomeworkId = studentCourseHomeworkId;
-    }
-
-    public YesOrNoEnum getStatus() {
-        return status;
-    }
-
-    public void setStatus(YesOrNoEnum status) {
-        this.status = status;
-    }
-
-    public YesOrNoEnum getIsReplied() {
-        return isReplied;
-    }
-
-    public void setIsReplied(YesOrNoEnum isReplied) {
-        this.isReplied = isReplied;
-    }
-
-    public String getMusicGroupName() {
-        return musicGroupName;
-    }
-
-    public void setMusicGroupName(String musicGroupName) {
-        this.musicGroupName = musicGroupName;
-    }
-
-    public String getClassGroupName() {
-        return classGroupName;
-    }
-
-    public void setClassGroupName(String classGroupName) {
-        this.classGroupName = classGroupName;
-    }
-
-    public Long getCourseHomeworkId() {
-        return courseHomeworkId;
-    }
-
-    public void setCourseHomeworkId(Long courseHomeworkId) {
-        this.courseHomeworkId = courseHomeworkId;
-    }
-
-    public String getContent() {
-        return content;
-    }
-
-    public void setContent(String content) {
-        this.content = content;
-    }
-
-    public Date getExpiryDate() {
-        return expiryDate;
-    }
-
-    public void setExpiryDate(Date expiryDate) {
-        this.expiryDate = expiryDate;
-    }
-
-    public Integer getCompletedNum() {
-        return completedNum;
-    }
-
-    public void setCompletedNum(Integer completedNum) {
-        this.completedNum = completedNum;
-    }
-
-    public Integer getExpectNum() {
-        return expectNum;
-    }
-
-    public void setExpectNum(Integer expectNum) {
-        this.expectNum = expectNum;
-    }
-
-    public String getAttachments() {
-        return attachments;
-    }
-
-    public void setAttachments(String attachments) {
-        this.attachments = attachments;
-    }
-
-    public Long getScore() {
-        return score;
-    }
-
-    public void setScore(Long score) {
-        this.score = score;
-    }
-
-	public MusicGroupTrainPlan getMusicGroupTrainPlan() {
-		return musicGroupTrainPlan;
-	}
-
-	public void setMusicGroupTrainPlan(MusicGroupTrainPlan musicGroupTrainPlan) {
-		this.musicGroupTrainPlan = musicGroupTrainPlan;
-	}
 }

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

@@ -54,5 +54,8 @@ public class StudentLessonExaminationDetailDto {
     @ApiModelProperty(value = "分谱")
     private Integer partIndex;
 
+    @ApiModelProperty(value = "曲目是否有效")
+    private Boolean validFlag;
+
 }
 

+ 15 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonTrainingDetailWrapper.java

@@ -28,6 +28,9 @@ public class StudentLessonTrainingDetailWrapper {
         @ApiModelProperty("曲目id")
         private Long musicScoreId;
 
+        @ApiModelProperty("曲目名称")
+        private String musicScoreName;
+
         @ApiModelProperty("练习速度")
         private Integer trainingSpeed;
 
@@ -45,6 +48,9 @@ public class StudentLessonTrainingDetailWrapper {
 
         @ApiModelProperty("结束小节")
         private Integer end;
+
+        @ApiModelProperty("作业类型,VIDEO,MUSIC_SCORE")
+        private String homeworkType = "MUSIC_SCORE";
     }
 
     @Data
@@ -67,6 +73,9 @@ public class StudentLessonTrainingDetailWrapper {
         @ApiModelProperty("曲目名称")
         private String  musicScoreName;
 
+        @ApiModelProperty("作业类型,VIDEO,MUSIC_SCORE")
+        private String homeworkType = "MUSIC_SCORE";
+
         @ApiModelProperty("分谱")
         private Integer partIndex;
 
@@ -88,16 +97,20 @@ public class StudentLessonTrainingDetailWrapper {
         @ApiModelProperty("标准练习次数")
         private Integer times;
 
-
         @ApiModelProperty("声部id")
         private Long subjectId;
 
         @ApiModelProperty("声部名称")
         private String subjectName;
 
-
         @ApiModelProperty("作业分组")
         private Integer group;
+
+        @ApiModelProperty("播放地址")
+        private String content;
+
+        @ApiModelProperty("资源是否有效")
+        private Boolean validFlag = false;
         
         public String jsonString() {
             return JSON.toJSONString(this);

+ 4 - 147
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ExtracurricularExercisesReply.java

@@ -1,17 +1,18 @@
 package com.ym.mec.biz.dal.entity;
 
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.enums.StandardEnum;
+import com.ym.mec.common.entity.BaseEntity;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
-import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.common.entity.BaseEntity;
-
 import java.util.Date;
 
 /**
  * 对应数据库表(extracurricular_exercises_reply):
  */
+@Data
 public class ExtracurricularExercisesReply extends BaseEntity {
 
 	/**  */
@@ -71,150 +72,6 @@ public class ExtracurricularExercisesReply extends BaseEntity {
 	@ApiModelProperty(value = "作业评级",required = true)
 	private StandardEnum standardFlag;
 
-	public StandardEnum getStandardFlag() {
-		return standardFlag;
-	}
-
-	public void setStandardFlag(StandardEnum standardFlag) {
-		this.standardFlag = standardFlag;
-	}
-
-	public String getMusicScoreContent() {
-		return musicScoreContent;
-	}
-
-	public void setMusicScoreContent(String musicScoreContent) {
-		this.musicScoreContent = musicScoreContent;
-	}
-
-	public String getMusicScoreId() {
-		return musicScoreId;
-	}
-
-	public void setMusicScoreId(String musicScoreId) {
-		this.musicScoreId = musicScoreId;
-	}
-
-	public Integer getIsRepliedTimely() {
-		return isRepliedTimely;
-	}
-
-	public void setIsRepliedTimely(Integer isRepliedTimely) {
-		this.isRepliedTimely = isRepliedTimely;
-	}
-
-	public Date getSubmitTime() {
-		return submitTime;
-	}
-
-	public void setSubmitTime(Date submitTime) {
-		this.submitTime = submitTime;
-	}
-
-	public ExtracurricularExercises getExtracurricularExercises() {
-		return extracurricularExercises;
-	}
-
-	public void setExtracurricularExercises(ExtracurricularExercises extracurricularExercises) {
-		this.extracurricularExercises = extracurricularExercises;
-	}
-
-	public void setId(Long id){
-		this.id = id;
-	}
-	
-	public Long getId(){
-		return this.id;
-	}
-			
-	public void setExtracurricularExercisesId(Long extracurricularExercisesId){
-		this.extracurricularExercisesId = extracurricularExercisesId;
-	}
-	
-	public Long getExtracurricularExercisesId(){
-		return this.extracurricularExercisesId;
-	}
-			
-	public void setUserId(Integer userId){
-		this.userId = userId;
-	}
-	
-	public Integer getUserId(){
-		return this.userId;
-	}
-			
-	public void setAttachments(String attachments){
-		this.attachments = attachments;
-	}
-	
-	public String getAttachments(){
-		return this.attachments;
-	}
-			
-	public void setCreateTime(java.util.Date createTime){
-		this.createTime = createTime;
-	}
-	
-	public java.util.Date getCreateTime(){
-		return this.createTime;
-	}
-			
-	public void setUpdateTime(java.util.Date updateTime){
-		this.updateTime = updateTime;
-	}
-	
-	public java.util.Date getUpdateTime(){
-		return this.updateTime;
-	}
-			
-	public void setRemark(String remark){
-		this.remark = remark;
-	}
-	
-	public String getRemark(){
-		return this.remark;
-	}
-			
-	public void setStatus(Integer status){
-		this.status = status;
-	}
-	
-	public Integer getStatus(){
-		return this.status;
-	}
-			
-	public void setIsReplied(Integer isReplied){
-		this.isReplied = isReplied;
-	}
-	
-	public Integer getIsReplied(){
-		return this.isReplied;
-	}
-			
-	public void setIsView(Integer isView){
-		this.isView = isView;
-	}
-	
-	public Integer getIsView(){
-		return this.isView;
-	}
-			
-	public SysUser getUser() {
-		return user;
-	}
-
-	public void setUser(SysUser user) {
-		this.user = user;
-	}
-
-	public String getOrganName() {
-		return organName;
-	}
-
-	public void setOrganName(String organName) {
-		this.organName = organName;
-	}
-
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 52 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentCoursewarePlayRecord.java

@@ -0,0 +1,52 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * 学生课件播放统计记录
+ * 2024-07-04 14:48:14
+ */
+@Data
+@ApiModel(" StudentCoursewarePlayRecord-学生课件播放统计记录")
+@TableName("student_courseware_play_record")
+public class StudentCoursewarePlayRecord implements Serializable {
+
+    @ApiModelProperty("主键ID")
+    @TableId(value = "id_")
+    private Long id;
+
+    @ApiModelProperty("分部ID")
+    @TableField(value = "organization_id_")
+    private Integer organizationId;
+
+    @ApiModelProperty("用户编号")
+    @TableField(value = "user_id_")
+    private Integer userId;
+
+    @ApiModelProperty("播放时长,单位为秒")
+    @TableField(value = "play_time_")
+    private BigDecimal playTime;
+
+    @ApiModelProperty("创建的天")
+    @TableField(value = "create_date_")
+    private String createDate;
+
+    @ApiModelProperty("更新时间")
+    @TableField(value = "update_time_")
+    private Date updateTime;
+
+    @ApiModelProperty("创建时间")
+    @TableField(value = "create_time_")
+    private Date createTime;
+
+}

+ 10 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonTrainingDetail.java

@@ -25,8 +25,8 @@ import java.util.Date;
 public class StudentLessonTrainingDetail implements Serializable {
 
     @ApiModelProperty("主键ID") 
-	    @TableId(value = "id_",type = IdType.AUTO)
-	    private Long id;
+    @TableId(value = "id_",type = IdType.AUTO)
+    private Long id;
 
     @ApiModelProperty("用户ID") 
 	@TableField(value = "user_id_")
@@ -36,22 +36,18 @@ public class StudentLessonTrainingDetail implements Serializable {
     @TableField(value = "type_")
     private ELessonTrainingType type;
 
-
     @ApiModelProperty("作业分组")
     @TableField(value = "group_")
     private Integer group;
 
-
     @ApiModelProperty("练习编号") 
 	@TableField(value = "course_homework_id_")
     private Long courseHomeworkId;
 
-
     @ApiModelProperty("声部id")
     @TableField(value = "subject_id_")
     private Long subjectId;
 
-
     @ApiModelProperty("曲目id") 
 	@TableField(value = "music_score_id_")
     private Long musicScoreId;
@@ -84,6 +80,14 @@ public class StudentLessonTrainingDetail implements Serializable {
 	@TableField(value = "times_")
     private Integer times;
 
+    @ApiModelProperty("作业类型,VIDEO,MUSIC_SCORE")
+    @TableField(value = "homework_type_")
+    private String homeworkType = "MUSIC_SCORE";
+
+    @ApiModelProperty("曲目名称")
+    @TableField(value = "music_score_name_")
+    private String musicScoreName;
+
     @ApiModelProperty("创建时间") 
 	@TableField(value = "create_time_")
     private Date createTime;

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportEnum.java

@@ -103,6 +103,8 @@ public enum ExportEnum implements BaseEnum<String, ExportEnum> {
     EXPORT_BALANCED_RELATIONSHIP_STUDENT_INFO("EXPORT_BALANCED_RELATIONSHIP_STUDENT_INFO","平衡关系-学员情况总表"),
     EXPORT_BALANCED_RELATIONSHIP_STUDENT_NORMAL_DETAIL("EXPORT_BALANCED_RELATIONSHIP_STUDENT_NORMAL_DETAIL","平衡关系(分表)-乐团在读学员"),
     EXPORT_BALANCED_RELATIONSHIP_STUDENT_QUIT_DETAIL("EXPORT_BALANCED_RELATIONSHIP_STUDENT_QUIT_DETAIL","平衡关系(分表)-乐团退团学员"),
+    VIDEO_PLAY_STAT("VIDEO_PLAY_STAT","云课堂统计导出"),
+    VIDEO_PLAY_DETAIL_STAT("VIDEO_PLAY_DETAIL_STAT","云课堂统计详情导出"),
     ;
 
     private String code;

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java

@@ -41,6 +41,8 @@ public enum ExportTypeEnum implements BaseEnum<Integer, ExportTypeEnum> {
 	EXPORT_BALANCED_RELATIONSHIP_STUDENT_INFO(34,"平衡关系-学员情况总表"),
 	EXPORT_BALANCED_RELATIONSHIP_STUDENT_NORMAL_DETAIL(35,"平衡关系(分表)-乐团在读学员"),
 	EXPORT_BALANCED_RELATIONSHIP_STUDENT_QUIT_DETAIL(36,"平衡关系(分表)-乐团退团学员"),
+	VIDEO_PLAY_STAT(37,"云课堂统计导出"),
+	VIDEO_PLAY_DETAIL_STAT(38,"云课堂统计详情导出"),
 	;
 
 	private Integer code;

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/StudentCoursewarePlayRecordMapper.java

@@ -0,0 +1,34 @@
+package com.ym.mec.biz.dal.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import com.ym.mec.biz.dal.entity.StudentCoursewarePlayRecord;
+import com.ym.mec.biz.dal.wrapper.StudentCoursewarePlayRecordWrapper;
+
+/**
+ * 学生课件播放统计记录
+ * 2024-07-04 14:48:14
+ */
+@Repository
+public interface StudentCoursewarePlayRecordMapper extends BaseMapper<StudentCoursewarePlayRecord> {
+
+    /**
+     * 分页查询
+     *
+     * @param page  IPage<StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecord>
+     * @param param StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecordQuery
+     * @return List<StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecord>
+     */
+    List<StudentCoursewarePlayRecord> selectPage(@Param("page") IPage<StudentCoursewarePlayRecord> page, @Param("param") StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecordQuery param);
+
+    void save(@Param("record") StudentCoursewarePlayRecord record);
+
+    List<StudentCoursewarePlayRecordWrapper.StatQueryData> statList(@Param("statQuery") StudentCoursewarePlayRecordWrapper.StatQuery statQuery);
+
+    List<StudentCoursewarePlayRecordWrapper.StatQueryData> statDetailPage(@Param("page") IPage<StudentCoursewarePlayRecordWrapper.StatQueryData> page,
+                                                                          @Param("statQuery") StudentCoursewarePlayRecordWrapper.StatQuery statQuery);
+}

+ 177 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/StudentCoursewarePlayRecordWrapper.java

@@ -0,0 +1,177 @@
+package com.ym.mec.biz.dal.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 学生课件播放统计记录
+ * 2024-07-04 14:48:14
+ */
+@ApiModel(value = "StudentCoursewarePlayRecordWrapper对象", description = "学生课件播放统计记录查询对象")
+public class StudentCoursewarePlayRecordWrapper {
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" StudentCoursewarePlayRecordQuery-学生课件播放统计记录")
+    public static class StudentCoursewarePlayRecordQuery implements QueryInfo {
+
+        @ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+        @ApiModelProperty("关键字匹配")
+        private String keyword;
+
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static StudentCoursewarePlayRecordQuery from(String json) {
+            return JSON.parseObject(json, StudentCoursewarePlayRecordQuery.class);
+        }
+    }
+
+
+    @Data
+    @ApiModel(" StudentCoursewarePlayRecord-学生课件播放统计记录")
+    public static class StudentCoursewarePlayRecord {
+
+        @ApiModelProperty("乐团ID")
+        private String musicGroupId;
+
+        @ApiModelProperty("用户编号")
+        private Long userId;
+
+        @ApiModelProperty("在读状态")
+        private Boolean readingStatus;
+
+        @ApiModelProperty("播放时长,单位为秒")
+        private Float playTime;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static StudentCoursewarePlayRecord from(String json) {
+            return JSON.parseObject(json, StudentCoursewarePlayRecord.class);
+        }
+    }
+
+    @Data
+    @ApiModel(" StudentCoursewarePlayRecord-学生课件播放统计记录")
+    public static class StudentCoursewarePlayRecordSave {
+
+        @ApiModelProperty(value = "用户编号",hidden = true)
+        private Integer userId;
+
+        @ApiModelProperty(hidden = true)
+        private Integer organizationId;
+
+        @ApiModelProperty("播放时长,单位为秒")
+        @NotNull
+        private BigDecimal playTime;
+
+    }
+
+
+    @Data
+    @ApiModel("云课堂观看统计查询")
+    public static class StatQuery implements QueryInfo {
+
+        @ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+        @ApiModelProperty("开始时间")
+        private Date startTime;
+
+        @ApiModelProperty("结束时间")
+        private Date endTime;
+
+        @ApiModelProperty("分部ID")
+        private String organizationId;
+
+        @ApiModelProperty("排序值,1:会员,2:无练习,3:10分钟,4:60分钟,5:120分钟,6:240分钟,7:>240分钟,8:平均时长")
+        private Integer sort = 1;
+
+        @ApiModelProperty("声降序,true:升序,false:降序")
+        private Boolean asc = false;
+
+        @ApiModelProperty(hidden = true)
+        private String sortBy;
+
+        @ApiModelProperty(hidden = true)
+        private static List<String> sortKeys = Arrays.asList("memberNum", "noPlayNum", "playTimeLess10", "playTimeLess60", "playTimeLess120", "playTimeLess240", "playTimeRather240", "avgPlayTime");
+
+        public String getSortBy() {
+            String key = sortKeys.get(getSort() > sortKeys.size() ? 0 : getSort() - 1);
+            return key + (asc ? " asc" : " desc");
+        }
+    }
+
+    @Data
+    @ApiModel("云课堂观看统计查询结果")
+    public static class StatQueryData {
+
+        @ApiModelProperty("分部ID")
+        private Long organizationId;
+
+        @ApiModelProperty("分部名称")
+        private String organizationName;
+
+        @ApiModelProperty("声部老师")
+        private String teacherName;
+
+        @ApiModelProperty("会员数量")
+        private Integer memberNum;
+
+        @ApiModelProperty("无练习人数")
+        private Integer noPlayNum;
+
+        @ApiModelProperty("练习时长少于等于10分钟")
+        private Integer playTimeLess10;
+
+        @ApiModelProperty("练习时长少于等于60分钟")
+        private Integer playTimeLess60;
+
+        @ApiModelProperty("练习时长少于等于120分钟")
+        private Integer playTimeLess120;
+
+        @ApiModelProperty("练习时长少于等于240")
+        private Integer playTimeLess240;
+
+        @ApiModelProperty("练习时长大于240")
+        private Integer playTimeRather240;
+
+        @ApiModelProperty("平均练习时长")
+        private BigDecimal avgPlayTime;
+
+    }
+
+}

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

@@ -126,6 +126,8 @@ public interface StudentCourseHomeworkService extends BaseService<Long, StudentC
      */
     CourseHomeworkWrapper.CourseHomeworkList findStudentHomeworkRecordDetail(CourseHomeworkWrapper.StudentCourseHomeworkQuery query);
 
+    List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> findStudentHomeworkCourseware(CourseHomeworkWrapper.StudentCourseHomeworkQuery query);
+
     /**
      * 添加学生作业练习记录
      */

+ 50 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentCoursewarePlayRecordService.java

@@ -0,0 +1,50 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.wrapper.StudentCoursewarePlayRecordWrapper;
+import com.ym.mec.biz.dal.entity.StudentCoursewarePlayRecord;
+
+import java.util.List;
+
+/**
+ * 学生课件播放统计记录
+ * 2024-07-04 14:48:14
+ */
+public interface StudentCoursewarePlayRecordService extends IService<StudentCoursewarePlayRecord>  {
+
+    /**
+     * 查询详情
+     * @param id 详情ID
+     * @return StudentCoursewarePlayRecord
+     */
+    StudentCoursewarePlayRecord detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<StudentCoursewarePlayRecord>
+     * @param query StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecordQuery
+     * @return IPage<StudentCoursewarePlayRecord>
+     */
+    IPage<StudentCoursewarePlayRecord> selectPage(IPage<StudentCoursewarePlayRecord> page, StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecordQuery query);
+
+    /**
+     * 添加
+     * @param studentCoursewarePlayRecord StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecord
+     * @return Boolean
+     */
+    Boolean add(StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecord studentCoursewarePlayRecord);
+
+    /**
+     * 更新
+     * @param studentCoursewarePlayRecord StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecord
+     * @return Boolean
+     */
+    Boolean update(StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecord studentCoursewarePlayRecord);
+
+    void save(StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecordSave studentCoursewarePlayRecord);
+
+    List<StudentCoursewarePlayRecordWrapper.StatQueryData> statList(StudentCoursewarePlayRecordWrapper.StatQuery statQuery);
+
+    IPage<StudentCoursewarePlayRecordWrapper.StatQueryData> statDetailPage(StudentCoursewarePlayRecordWrapper.StatQuery statQuery);
+}

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

@@ -62,7 +62,9 @@ public interface StudentLessonTrainingDetailService extends IService<StudentLess
      * @param type 作业类型
      * @param userId 学生ID
      */
-    List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> getBaseLessonTrainingDetail(Long courseHomeworkId, ELessonTrainingType type, Long userId);
+    List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> getBaseLessonTrainingDetail(Long courseHomeworkId, ELessonTrainingType type, Long userId,String homeworkType);
+
+    void updateMusicScoreName(List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails);
 
     /**
      * 查询作业详情练习组

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

@@ -488,4 +488,6 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     void updateConfig(SysConfig config);
 
     void redisTransfer();
+
+    List<SysConfig> findByParamNames(String paramName);
 }

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -11,6 +11,7 @@ import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.dal.vo.TeacherCloudCourseReportDto;
+import com.ym.mec.biz.dal.wrapper.StudentCoursewarePlayRecordWrapper;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.controller.BaseController;
@@ -180,6 +181,9 @@ public class ExportServiceImpl implements ExportService {
     @Resource
     private HfMerchantConfigService hfMerchantConfigService;
 
+    @Resource
+    private StudentCoursewarePlayRecordService studentCoursewarePlayRecordService;
+
     private static final ExecutorService exportExecutorService = Executors.newFixedThreadPool(10);
 
     @Value("${spring.profiles.active:dev}")
@@ -384,6 +388,24 @@ public class ExportServiceImpl implements ExportService {
         exportManageFuncMap.put(ExportEnum.EXPORT_BALANCED_RELATIONSHIP_STUDENT_INFO, this::exportBalancedRelationshipStudentInfo);
         exportManageFuncMap.put(ExportEnum.EXPORT_BALANCED_RELATIONSHIP_STUDENT_NORMAL_DETAIL, this::exportBalancedRelationshipStudentNormalDetail);
         exportManageFuncMap.put(ExportEnum.EXPORT_BALANCED_RELATIONSHIP_STUDENT_QUIT_DETAIL, this::exportBalancedRelationshipStudentQuitDetail);
+        exportManageFuncMap.put(ExportEnum.VIDEO_PLAY_STAT, this::exportVideoPlayStat);
+        exportManageFuncMap.put(ExportEnum.VIDEO_PLAY_DETAIL_STAT, this::exportVideoPlayDetailStat);
+    }
+
+    private HttpResponseResult<String> exportVideoPlayStat(Map<String, Object> info) {
+        StudentCoursewarePlayRecordWrapper.StatQuery queryInfo = JSONObject.parseObject(JSONObject.toJSONString(info), StudentCoursewarePlayRecordWrapper.StatQuery.class);
+        SysUser sysUser = sysUserService.getUser();
+        ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.VIDEO_PLAY_STAT, sysUser.getId());
+        return this.asyncExport(() -> this.initExportInfo(studentCoursewarePlayRecordService.statList(queryInfo), managerDownload, ExportEnum.VIDEO_PLAY_STAT),
+                managerDownload.getName());
+    }
+
+    private HttpResponseResult<String> exportVideoPlayDetailStat(Map<String, Object> info) {
+        StudentCoursewarePlayRecordWrapper.StatQuery queryInfo = JSONObject.parseObject(JSONObject.toJSONString(info), StudentCoursewarePlayRecordWrapper.StatQuery.class);
+        SysUser sysUser = sysUserService.getUser();
+        ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.VIDEO_PLAY_DETAIL_STAT, sysUser.getId());
+        return this.asyncExport(() -> this.initExportInfo(studentCoursewarePlayRecordService.statDetailPage(queryInfo).getRecords(), managerDownload, ExportEnum.VIDEO_PLAY_DETAIL_STAT),
+                managerDownload.getName());
     }
 
     private HttpResponseResult<String> exportOaSummaryExpenses(Map<String, Object> info) {

+ 4 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java

@@ -18,13 +18,12 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-
 import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -74,7 +73,7 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
         }
         List<MusicScoreSubjectDto> scoreSubjectDtoList = exercises.getMusicScoreSubjectDtos();
         if(StringUtils.isBlank(exercises.getStudentIdList())){
-            if(scoreSubjectDtoList == null || scoreSubjectDtoList.size() == 0){
+            if(CollectionUtils.isEmpty(scoreSubjectDtoList)){
                 throw new BizException("请指定学生");
             }
             List<Integer> studentIdList = new ArrayList<>();
@@ -115,7 +114,7 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
         List<ExtracurricularExercisesReply> extracurricularExercisesReplies = new ArrayList<>();
 
         List<StudentLessonTrainingDetail> studentLessonTrainingDetailList = new ArrayList<>();
-        if(!CollectionUtils.isEmpty(scoreSubjectDtoList)){
+        if(CollectionUtils.isNotEmpty(scoreSubjectDtoList)){
             for (MusicScoreSubjectDto musicScoreSubjectDto : scoreSubjectDtoList) {
                 // 原本作业逻辑
                 for (Integer userId : musicScoreSubjectDto.getUserIdList()) {
@@ -150,7 +149,7 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
         for (ExtracurricularExercisesReply extracurricularExercisesReply : extracurricularExercisesReplies) {
             extracurricularExercisesReplyDao.insert(extracurricularExercisesReply);
         }
-        if (!CollectionUtils.isEmpty(studentLessonTrainingDetailList)) {
+        if (CollectionUtils.isNotEmpty(studentLessonTrainingDetailList)) {
             // 学生ID集合
             Set<Integer> userIdList = studentLessonTrainingDetailList.stream()
                     .map(StudentLessonTrainingDetail::getUserId)

+ 61 - 84
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java

@@ -1,47 +1,15 @@
 package com.ym.mec.biz.service.impl;
 
-import java.math.BigDecimal;
-import java.time.DayOfWeek;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.temporal.ChronoUnit;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.ELessonTrainingType;
-import com.ym.mec.biz.dal.enums.StandardEnum;
-import com.ym.mec.biz.service.*;
-import org.apache.commons.lang3.StringUtils;
-import org.jetbrains.annotations.NotNull;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-
-import com.ym.mec.auth.api.client.SysUserFeignService;
-import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
-import com.ym.mec.biz.dal.enums.GroupType;
-import com.ym.mec.biz.dal.enums.MessageTypeEnum;
-import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
-import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseHomeWorkQueryInfo;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
@@ -52,66 +20,73 @@ 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 org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 @Service
 public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, StudentCourseHomework> implements StudentCourseHomeworkService {
 
-    @Autowired
+    @Resource
     private StudentCourseHomeworkDao studentCourseHomeworkDao;
-    @Autowired
+    @Resource
     private CourseHomeworkService courseHomeworkService;
-    @Autowired
+    @Resource
     private CourseHomeworkDao courseHomeworkDao;
-    @Autowired
+    @Resource
     private CourseScheduleDao courseScheduleDao;
-    @Autowired
+    @Resource
     private ClassGroupDao classGroupDao;
-    @Autowired
+    @Resource
     private SysUserFeignService sysUserFeignService;
-    @Autowired
+    @Resource
     private SysMessageService sysMessageService;
-    @Autowired
+    @Resource
     private CourseScheduleReviewDao courseScheduleReviewDao;
-    @Autowired
+    @Resource
     private TeacherDao teacherDao;
-    @Autowired
+    @Resource
     private StudentDao studentDao;
-    @Autowired
+    @Resource
     private SubjectDao subjectDao;
-    @Autowired
+    @Resource
     private StudentServeService studentServeService;
-    @Autowired
-    private MusicGroupDao musicGroupDao;
-    @Autowired
+    @Resource
     private StudentRegistrationDao studentRegistrationDao;
-    @Autowired
+    @Resource
     private VipGroupDao vipGroupDao;
-    @Autowired
+    @Resource
     private PracticeGroupDao practiceGroupDao;
-    @Autowired
+    @Resource
     private ExtracurricularExercisesReplyDao extracurricularExercisesReplyDao;
-    @Autowired
+    @Resource
     private SysConfigDao sysConfigDao;
-    @Autowired
+    @Resource
     private SysMusicScoreDao sysMusicScoreDao;
-    @Autowired
+    @Resource
     private MusicGroupTrainPlanService musicGroupTrainPlanService;
-    @Autowired
+    @Resource
     private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
-
-    @Autowired
+    @Resource
     private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
-
-    @Autowired
+    @Resource
     private MusicGroupService musicGroupService;
-
-    @Autowired
+    @Resource
     private StudentLessonExaminationDao studentLessonExaminationDao;
-
-    @Autowired
+    @Resource
     private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
-
-    @Autowired
+    @Resource
     private ExtracurricularExercisesDao extracurricularExercisesDao;
 
     @Override
@@ -194,7 +169,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
             String courseDate = DateUtil.dateToString(courseSchedule.getClassDate(), "yyyy年MM月dd日");
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_HOMEWORK_SUBMIT,
                     userMap, null, 0, notifyUrl, "TEACHER", courseSchedule.getName(), courseDate, user.getUsername());
-            MusicGroup musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
+            MusicGroup musicGroup = musicGroupService.get(courseSchedule.getMusicGroupId());
 
             sysMessageService.batchSendImMessage(MessageTypeEnum.IM_HOMEWORK_SUBMIT_PUSH, bean.getUserId().toString(), extra,
                     new String[]{courseSchedule.getActualTeacherId().toString()},
@@ -608,7 +583,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
             Map<Long, List<VipGroup>> vipGroupMap = new HashMap<>();
             Map<Long, List<PracticeGroup>> practiceGroupMap = new HashMap<>();
             if (musicGroupIds.size() > 0) {
-                musicGroupMap = musicGroupDao.getMusicGroupByIds(musicGroupIds).stream().collect(Collectors.groupingBy(MusicGroup::getId));
+                musicGroupMap = musicGroupService.getDao().getMusicGroupByIds(musicGroupIds).stream().collect(Collectors.groupingBy(MusicGroup::getId));
             }
             if (vipGroupIds.size() > 0) {
                 vipGroupMap = vipGroupDao.getVipGroupByIds(vipGroupIds).stream().collect(Collectors.groupingBy(VipGroup::getId));
@@ -654,11 +629,11 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         MapUtil.populateMap(params, queryInfo);
         params.put("musicGroupStatus", MusicGroupStatusEnum.PROGRESS.getCode());
 
-        int count = musicGroupDao.queryCount(params);
+        int count = musicGroupService.getDao().queryCount(params);
         pageInfo.setTotal(count);
         params.put("offset", pageInfo.getOffset());
 //        StudentService
-        List<MusicGroup> musicGroups = musicGroupDao.queryPage(params);
+        List<MusicGroup> musicGroups = musicGroupService.getDao().queryPage(params);
 
         List<EduHomeworkStatDto> dataList = new ArrayList<>();
         if(!CollectionUtils.isEmpty(musicGroups)){
@@ -709,7 +684,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
     @Override
     public List<EduHomeworkStatDto> queryEduHomeworkStatDetail(StudentCourseHomeWorkQueryInfo queryInfo) {
         List<EduHomeworkStatDto> dataList = new ArrayList<>();
-        MusicGroup musicGroup = musicGroupDao.get(queryInfo.getGroupId());
+        MusicGroup musicGroup = musicGroupService.get(queryInfo.getGroupId());
         if(Objects.isNull(musicGroup)){
             return dataList;
         }
@@ -717,7 +692,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         Map<Integer, Long> subjectStudentNumMap = studentRegistrations.stream().collect(Collectors.groupingBy(StudentRegistration::getActualSubjectId, Collectors.counting()));
 
         Map<Integer, Subject> idSubjectMap = new HashMap<>();
-        if(!CollectionUtils.isEmpty(subjectStudentNumMap)){
+        if(!subjectStudentNumMap.isEmpty()){
             List<Subject> subjects = subjectDao.findBySubjectIds(new ArrayList<>(subjectStudentNumMap.keySet()));
             idSubjectMap = subjects.stream().collect(Collectors.toMap(Subject::getId, s -> s, (s1, s2) -> s1));
         }
@@ -789,7 +764,6 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         }
 
         // 设置是否会员
-
         // 获取用户id集合
         List<Integer> userIds = studentCourseHomeworkByCourse.stream().map(StudentCourseHomework::getUserId).collect(Collectors.toList());
 
@@ -814,11 +788,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
                 }
             }
         }
-
-
         // 设置声部
-
-        // 获取声部id集合
         List<Integer> voicePartIds = studentCourseHomeworkByCourse.stream().map(o -> o.getSubjectId()).collect(Collectors.toList());
 
         if (CollectionUtils.isEmpty(voicePartIds)) {
@@ -853,7 +823,9 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails = studentCourseHomeworkDao
             .findByStudentIdsAndCourseScheduleId(studentIds, studentCourseHomework.getCourseHomeworkId(),studentCourseHomework.getType());
 
-        if (!CollectionUtils.isEmpty(studentLessonTrainingDetails)) {
+        if (CollectionUtils.isNotEmpty(studentLessonTrainingDetails)) {
+            //设置曲目名称
+            studentLessonTrainingDetailService.updateMusicScoreName(studentLessonTrainingDetails);
             // 按userid分组 ,
             Map<Long, List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> studentLessonTrainingDetailMap = studentLessonTrainingDetails.stream()
                 .collect(Collectors.groupingBy(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail::getUserId,
@@ -877,9 +849,9 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         List<StudentCourseHomework> studentCourseHomeworks = getStudentCourseHomeworks(extraExerciseStudents);
         if (query.getSubjectId() != null) {
             studentCourseHomeworks = studentCourseHomeworks.stream()
-                                                         .filter(o ->o.getSubjectId() != null)
-                                                         .filter(o -> o.getSubjectId().equals(query.getSubjectId()))
-                                                         .collect(Collectors.toList());
+            .filter(o ->o.getSubjectId() != null)
+            .filter(o -> o.getSubjectId().equals(query.getSubjectId()))
+            .collect(Collectors.toList());
         }
         return studentCourseHomeworks;
     }
@@ -914,7 +886,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
 
         // 获取作业信息
         List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> detailList = studentLessonTrainingDetailService.getBaseLessonTrainingDetail(
-            courseHomeworkDetail.getCourseHomeworkId(), query.getType(), query.getUserId());
+            courseHomeworkDetail.getCourseHomeworkId(), query.getType(), query.getUserId(),null);
 
         long count = detailList.stream().filter(o -> o.getTrainingTimes() < o.getTimes()).count();
         if (count >0) {
@@ -928,6 +900,11 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
 
     }
 
+    @Override
+    public List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> findStudentHomeworkCourseware(CourseHomeworkWrapper.StudentCourseHomeworkQuery query) {
+        return studentLessonTrainingDetailService.getBaseLessonTrainingDetail(query.getCourseScheduleId().longValue(), query.getType(), query.getUserId(),"VIDEO");
+    }
+
     /**
      * 添加学生作业练习记录
      *

+ 132 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCoursewarePlayRecordServiceImpl.java

@@ -0,0 +1,132 @@
+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.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.service.StudentServeService;
+import com.ym.mec.common.page.PageInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import lombok.extern.slf4j.Slf4j;
+import com.ym.mec.biz.dal.entity.StudentCoursewarePlayRecord;
+import com.ym.mec.biz.dal.wrapper.StudentCoursewarePlayRecordWrapper;
+import com.ym.mec.biz.dal.mapper.StudentCoursewarePlayRecordMapper;
+import com.ym.mec.biz.service.StudentCoursewarePlayRecordService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * 学生课件播放统计记录
+ * 2024-07-04 14:48:14
+ */
+@Slf4j
+@Service
+public class StudentCoursewarePlayRecordServiceImpl extends ServiceImpl<StudentCoursewarePlayRecordMapper, StudentCoursewarePlayRecord> implements StudentCoursewarePlayRecordService {
+
+    @Autowired
+    private StudentDao studentDao;
+
+    @Autowired
+    private StudentRegistrationDao studentRegistrationDao;
+
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+
+    /**
+     * 查询详情
+     *
+     * @param id 详情ID
+     * @return StudentCoursewarePlayRecord
+     */
+    @Override
+    public StudentCoursewarePlayRecord detail(Long id) {
+
+        return baseMapper.selectById(id);
+    }
+
+    /**
+     * 分页查询
+     *
+     * @param page  IPage<StudentCoursewarePlayRecord>
+     * @param query StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecordQuery
+     * @return IPage<StudentCoursewarePlayRecord>
+     */
+    @Override
+    public IPage<StudentCoursewarePlayRecord> selectPage(IPage<StudentCoursewarePlayRecord> page, StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecordQuery query) {
+
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+
+    /**
+     * 添加
+     *
+     * @param studentCoursewarePlayRecord StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecord
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecord studentCoursewarePlayRecord) {
+
+        return this.save(JSON.parseObject(studentCoursewarePlayRecord.jsonString(), StudentCoursewarePlayRecord.class));
+    }
+
+    /**
+     * 更新
+     *
+     * @param studentCoursewarePlayRecord StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecord
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecord studentCoursewarePlayRecord) {
+
+        return this.updateById(JSON.parseObject(studentCoursewarePlayRecord.jsonString(), StudentCoursewarePlayRecord.class));
+    }
+
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void save(StudentCoursewarePlayRecordWrapper.StudentCoursewarePlayRecordSave studentCoursewarePlayRecord) {
+        Integer userId = studentCoursewarePlayRecord.getUserId();
+        Student student = studentDao.get(userId);
+        if (student == null) {
+            return;
+        }
+
+        StudentCoursewarePlayRecord record = new StudentCoursewarePlayRecord();
+        record.setOrganizationId(studentCoursewarePlayRecord.getOrganizationId());
+        record.setUserId(studentCoursewarePlayRecord.getUserId());
+        record.setPlayTime(studentCoursewarePlayRecord.getPlayTime());
+        record.setCreateDate(new SimpleDateFormat("yyyyMMdd").format(new Date()));
+        baseMapper.save(record);
+    }
+
+    @Override
+    public List<StudentCoursewarePlayRecordWrapper.StatQueryData> statList(StudentCoursewarePlayRecordWrapper.StatQuery statQuery) {
+        List<StudentCoursewarePlayRecordWrapper.StatQueryData> list = baseMapper.statList(statQuery);
+        list.forEach(n -> n.setAvgPlayTime(n.getAvgPlayTime().setScale(2, RoundingMode.HALF_UP)));
+        return list;
+    }
+
+    @Override
+    public IPage<StudentCoursewarePlayRecordWrapper.StatQueryData> statDetailPage(StudentCoursewarePlayRecordWrapper.StatQuery statQuery) {
+        IPage<StudentCoursewarePlayRecordWrapper.StatQueryData> page = QueryInfo.getPage(statQuery);
+        List<StudentCoursewarePlayRecordWrapper.StatQueryData> statQueryData = baseMapper.statDetailPage(page, statQuery);
+        statQueryData.forEach(n -> n.setAvgPlayTime(n.getAvgPlayTime().setScale(2, RoundingMode.HALF_UP)));
+        page.setRecords(statQueryData);
+        return page;
+    }
+
+
+}

+ 86 - 45
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonTrainingDetailServiceImpl.java

@@ -2,6 +2,10 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dayaedu.cbs.openfeign.client.CoursewareFeignService;
+import com.dayaedu.cbs.openfeign.wrapper.courseware.CbsMaterialWrapper;
+import com.microsvc.toolkit.common.response.paging.PageInfo;
+import com.microsvc.toolkit.common.response.template.R;
 import com.ym.mec.biz.dal.dao.CourseHomeworkDao;
 import com.ym.mec.biz.dal.dao.StudentLessonTrainingDetailMapper;
 import com.ym.mec.biz.dal.dao.SubjectDao;
@@ -16,12 +20,12 @@ import com.ym.mec.biz.service.ExtracurricularExercisesService;
 import com.ym.mec.biz.service.StudentLessonTrainingDetailService;
 import com.ym.mec.biz.service.SubjectService;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.jetbrains.annotations.NotNull;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
-import org.springframework.util.StringUtils;
 
+import javax.annotation.Resource;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -34,20 +38,18 @@ import java.util.stream.Collectors;
 @Service
 public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentLessonTrainingDetailMapper, StudentLessonTrainingDetail> implements StudentLessonTrainingDetailService {
 
-    @Autowired
+    @Resource
     private SysMusicScoreDao sysMusicScoreDao;
-
-    @Autowired
+    @Resource
     private SubjectDao subjectDao;
-
-    @Autowired
+    @Resource
     private CourseHomeworkDao courseHomeworkDao;
-
-    @Autowired
+    @Resource
     private SubjectService subjectService;
-
-    @Autowired
+    @Resource
     private ExtracurricularExercisesService extracurricularExercisesService;
+    @Resource
+    private CoursewareFeignService coursewareFeignService;
 
     /**
      * 查询详情
@@ -101,27 +103,22 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
             group = 1;
         }
 
-        List<StudentLessonTrainingDetail> result = new ArrayList<>();
-
-        List<StudentLessonTrainingDetail> details = JSON.parseArray(
-            JSON.toJSONString(detailList), StudentLessonTrainingDetail.class);
-        result.addAll(details);
+        List<StudentLessonTrainingDetail> result = JSON.parseArray(JSON.toJSONString(detailList), StudentLessonTrainingDetail.class);
         // 根据声部添加学生作业详情
         userIdList.forEach(userId -> {
-            List<StudentLessonTrainingDetail> detailsUser = JSON.parseArray(
-                JSON.toJSONString(detailList), StudentLessonTrainingDetail.class);
+            List<StudentLessonTrainingDetail> detailsUser = JSON.parseArray(JSON.toJSONString(detailList), StudentLessonTrainingDetail.class);
             for (StudentLessonTrainingDetail studentLessonTrainingDetail : detailsUser) {
                 studentLessonTrainingDetail.setUserId(userId.longValue());
             }
             result.addAll(detailsUser);
         });
+        Date date = new Date();
         for (StudentLessonTrainingDetail studentLessonTrainingDetail : result) {
-
             studentLessonTrainingDetail.setCourseHomeworkId(homeworkId);
             studentLessonTrainingDetail.setTrainingTimes(0);
             studentLessonTrainingDetail.setTrainingStatus(StandardEnum.NOT_START);
-            studentLessonTrainingDetail.setCreateTime(new Date());
-            studentLessonTrainingDetail.setUpdateTime(new Date());
+            studentLessonTrainingDetail.setCreateTime(date);
+            studentLessonTrainingDetail.setUpdateTime(date);
             studentLessonTrainingDetail.setGroup(group);
             studentLessonTrainingDetail.setType(type);
         }
@@ -136,7 +133,7 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
      */
     @Override
     public List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> getBaseLessonTrainingDetail(Long courseHomeworkId, ELessonTrainingType type) {
-        return getBaseLessonTrainingDetail(courseHomeworkId, type, null);
+        return getBaseLessonTrainingDetail(courseHomeworkId, type, null,null);
     }
 
     /**
@@ -147,11 +144,13 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
      * @param userId           学生ID
      */
     @Override
-    public List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> getBaseLessonTrainingDetail(Long courseHomeworkId, ELessonTrainingType type, Long userId) {
+    public List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>
+    getBaseLessonTrainingDetail(Long courseHomeworkId, ELessonTrainingType type, Long userId,String homeworkType) {
         List<StudentLessonTrainingDetail> list = this.lambdaQuery()
                                                      .eq(StudentLessonTrainingDetail::getCourseHomeworkId,courseHomeworkId)
                                                      .isNull(userId == null,StudentLessonTrainingDetail::getUserId)
                                                      .eq(StudentLessonTrainingDetail::getType, type)
+                                                     .eq(StringUtils.isNotEmpty(homeworkType),StudentLessonTrainingDetail::getHomeworkType, homeworkType)
                                                      .eq(userId != null, StudentLessonTrainingDetail::getUserId, userId)
                                                      .list();
         if (CollectionUtils.isEmpty(list)) {
@@ -160,27 +159,8 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
         List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails = JSON.parseArray(
             JSON.toJSONString(list), StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail.class);
 
-         // 曲目id集合
-        List<Long> collect = studentLessonTrainingDetails.stream()
-                                                         .map(
-                                                             StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail::getMusicScoreId)
-                                                         .distinct()
-                                                         .collect(Collectors.toList());
-
-        List<SysMusicScore> scoreList = sysMusicScoreDao.findByIds(
-            collect.stream().map(String::valueOf).collect(Collectors.joining(",")));
-
-        // id 分组
-        Map<Integer, SysMusicScore> musicScoreMap = scoreList.stream()
-                                                     .collect(Collectors.toMap(SysMusicScore::getId, Function.identity()));
-
-        for (StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail : studentLessonTrainingDetails) {
-            SysMusicScore sysMusicScore = musicScoreMap.get(studentLessonTrainingDetail.getMusicScoreId().intValue());
-            if (sysMusicScore != null) {
-                studentLessonTrainingDetail.setMusicScoreName(sysMusicScore.getName());
-            }
-        }
-
+        //更新曲目名称
+        this.updateMusicScoreName(studentLessonTrainingDetails);
         // 声部
         List<Integer> subjectIdList = studentLessonTrainingDetails.stream()
                                                           .map(o -> {
@@ -211,6 +191,67 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
     }
 
 
+    @Override
+    public void updateMusicScoreName(List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails){
+        // 曲目id集合
+        List<Long> musicScoreIdList = studentLessonTrainingDetails.stream()
+                .filter(o-> StringUtils.isEmpty(o.getHomeworkType()) || o.getHomeworkType().equals("MUSIC_SCORE"))
+                .map(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail::getMusicScoreId)
+                .distinct()
+                .collect(Collectors.toList());
+        if(CollectionUtils.isNotEmpty(musicScoreIdList)){
+            List<SysMusicScore> scoreList = sysMusicScoreDao.findByIds(musicScoreIdList.stream().map(String::valueOf).collect(Collectors.joining(",")));
+            if(CollectionUtils.isNotEmpty(scoreList)){
+                Map<Integer, SysMusicScore> musicScoreMap = scoreList.stream().collect(Collectors.toMap(SysMusicScore::getId, Function.identity()));
+                for (StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail : studentLessonTrainingDetails) {
+                    if(!StringUtils.equals(studentLessonTrainingDetail.getHomeworkType(),"VIDEO")){
+                        SysMusicScore sysMusicScore = musicScoreMap.get(studentLessonTrainingDetail.getMusicScoreId().intValue());
+                        if (sysMusicScore != null) {
+                            if(sysMusicScore.getShowFlag() == 1 && sysMusicScore.getDelFlag() == 0){
+                                studentLessonTrainingDetail.setValidFlag(true);
+                            }
+                            studentLessonTrainingDetail.setMusicScoreName(sysMusicScore.getName());
+                        }
+                    }
+                }
+            }
+        }
+        //课件素材编号列表
+        List<Long> materialList = studentLessonTrainingDetails.stream()
+                .filter(o->"VIDEO".equals(o.getHomeworkType()))
+                .map(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail::getMusicScoreId)
+                .distinct()
+                .collect(Collectors.toList());
+        if(CollectionUtils.isNotEmpty(materialList)){
+            CbsMaterialWrapper.MaterialQuery var1 = new CbsMaterialWrapper.MaterialQuery();
+            var1.setMaterialIdList(materialList);
+            var1.setPage(1);
+            var1.setRows(materialList.size());
+            R<PageInfo<CbsMaterialWrapper.MaterialDto>> pageInfoR = coursewareFeignService.materialPage(var1);
+            if(pageInfoR.getCode() != 200){
+                log.error("查询课件素材失败:{}",pageInfoR.getMessage());
+            }
+            List<CbsMaterialWrapper.MaterialDto> materialDtoList = pageInfoR.getData().getRows();
+            if(CollectionUtils.isNotEmpty(materialDtoList)){
+                Map<Long, CbsMaterialWrapper.MaterialDto> materialDtoMap = materialDtoList.stream()
+                        .collect(Collectors.toMap(CbsMaterialWrapper.MaterialDto::getId, Function.identity()));
+                for (StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail : studentLessonTrainingDetails) {
+                    if(StringUtils.equals(studentLessonTrainingDetail.getHomeworkType(),"VIDEO")){
+                        CbsMaterialWrapper.MaterialDto materialDto = materialDtoMap.get(studentLessonTrainingDetail.getMusicScoreId());
+                        if (materialDto != null) {
+                            if(!materialDto.getDelFlag() && materialDto.getEnableFlag()){
+                                studentLessonTrainingDetail.setValidFlag(true);
+                            }
+                            studentLessonTrainingDetail.setMusicScoreName(materialDto.getName());
+                            studentLessonTrainingDetail.setContent(materialDto.getContent());
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+
     /**
      * 查询作业详情练习组
      *

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

@@ -50,6 +50,11 @@ public class SysConfigServiceImpl extends BaseServiceImpl<Long, SysConfig>  impl
     }
 
     @Override
+    public List<SysConfig> findByParamNames(String paramName) {
+        return sysConfigDao.findByParamNames(paramName);
+    }
+
+    @Override
 	public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
 		this.applicationEventPublisher = applicationEventPublisher;
 	}

+ 4 - 17
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -150,11 +150,8 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 	public Map<String, Object> addTeacherAttendanceRecord(TeacherSignOutDto teacherSignOutDto) {
 		SysUser user = sysUserFeignService.queryUserInfo();
 		teacherDao.getLocked(user.getId());
-		if(Objects.isNull(user)){
-			throw new BizException("请登录");
-		}
 
-		if(Objects.isNull(teacherSignOutDto.getTeacherAttendanceInfo().getCourseScheduleId())){
+        if(Objects.isNull(teacherSignOutDto.getTeacherAttendanceInfo().getCourseScheduleId())){
 			throw new BizException("请选择课程!");
 		}
 		Integer tenantId = TenantContextHolder.getTenantId();
@@ -385,7 +382,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 				teacherAttendanceDao.insert(teacherAttendance);
 			}
 
-            if(!CollectionUtils.isEmpty(courseHomeworkInfo.getMusicScoreSubjectDto())){
+            if(CollectionUtils.isNotEmpty(courseHomeworkInfo.getMusicScoreSubjectDto())){
 				CourseHomework courseHomework = courseHomeworkDao.findByCourseSchedule(teacherAttendance.getCourseScheduleId());
 				if(Objects.isNull(courseHomework)){
 					//新增课堂作业
@@ -393,7 +390,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 					courseHomework.setCourseScheduleId(teacherAttendance.getCourseScheduleId());
 					courseHomework.setMusicGroupId(currentCourseDetail.getMusicGroupId());
 					courseHomework.setGroupType(teacherAttendance.getGroupType());
-					courseHomework.setClassGroupId(currentCourseDetail.getClassId().intValue());
+					courseHomework.setClassGroupId(currentCourseDetail.getClassId());
 
                     LocalDateTime localDateTime=LocalDateTime.now();
                     localDateTime=localDateTime.plusDays(Integer.parseInt(sysConfigService.findByParamName("homework_expire_time").getParanValue()))
@@ -453,16 +450,6 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
                     if (!CollectionUtils.isEmpty(studentLessonTrainingDetails)) {
                         versionTag ="v2";
                     }
-
-					//排除不被服务学员
-//					Set<Integer> serveStudentIds = studentServeService.getStudentWithCourse(teacherAttendance.getCourseScheduleId());
-//					Iterator<StudentCourseHomework> iterator = studentCourseHomeworks.iterator();
-//					while (iterator.hasNext()){
-//						StudentCourseHomework next = iterator.next();
-//						if(!serveStudentIds.contains(next.getUserId())){
-//							iterator.remove();
-//						}
-//					}
 					courseHomework.setExpectNum(studentCourseHomeworks.size());
                     courseHomework.setVersionTag(versionTag);
 
@@ -505,7 +492,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
                             }
 						}
 					}
-                    if (!CollectionUtils.isEmpty(studentLessonTrainingDetails)) {
+                    if (CollectionUtils.isNotEmpty(studentLessonTrainingDetails)) {
                         // 学生ID集合
                         Set<Integer> userIdList = studentLessonTrainingDetails.stream()
                                                                               .map(StudentLessonTrainingDetail::getUserId)

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

@@ -299,7 +299,7 @@ public class UserMusicServiceImpl extends ServiceImpl<UserMusicMapper, UserMusic
         for (UserMusicWrapper.UserMusic record : records) {
             SysUser sysUser = userMap.get(record.getUserId());
             if (sysUser != null) {
-                record.setUsername(sysUser.getUsername());
+                record.setUsername(StringUtils.isBlank(sysUser.getUsername())?sysUser.getRealName():sysUser.getUsername());
                 record.setAvatar(sysUser.getAvatar());
             }
             if (record.getClientType() == ClientEnum.STUDENT) {

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

@@ -227,7 +227,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
     }
 
 
-    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public HttpResponseResult updateLiveGroup(VipGroupApplyDto vipGroup) {
         VipGroupApplyBaseInfoDto applyBaseInfo = vipGroup.getVipGroupApplyBaseInfo();

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

@@ -219,6 +219,7 @@
 			GROUP_CONCAT(sub.name_) subjectName,
 		    stu.member_rank_setting_id_ memberRankSettingId,
             sub.id_ subjectIdList,
+            sub.id_ subjectId,
 			sees.music_group_id_ musicGroupId
 		FROM
 			student_extracurricular_exercises_situation_ sees

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

@@ -695,8 +695,7 @@
 
     <select id="findByStudentIdsAndCourseScheduleId"
             resultType="com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper$StudentLessonTrainingDetail">
-        SELECT s.*,sms.name_ as musicScoreName,s2.name_ as subjectName from student_lesson_training_detail s
-        left join sys_music_score sms on s.music_score_id_ = sms.id_
+        SELECT s.*,s2.name_ as subjectName from student_lesson_training_detail s
         left join subject s2 on s.subject_id_ = s2.id_
         where s.user_id_ in
         <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
@@ -704,7 +703,6 @@
         </foreach>
         and s.course_homework_id_ = #{courseHomeworkId}
         and s.type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
-
         order by s.id_
     </select>
 

+ 70 - 0
mec-biz/src/main/resources/config/mybatis/StudentCoursewarePlayRecordMapper.xml

@@ -0,0 +1,70 @@
+<?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.mapper.StudentCoursewarePlayRecordMapper">
+    <select id="selectPage" resultType="com.ym.mec.biz.dal.entity.StudentCoursewarePlayRecord">
+        SELECT t.*
+        FROM student_courseware_play_record t
+    </select>
+
+    <insert id="save">
+        INSERT INTO student_courseware_play_record (organization_id_, user_id_, play_time_, create_date_, update_time_, create_time_)
+        VALUES (#{record.organizationId}, #{record.userId}, #{record.playTime}, #{record.createDate}, NOW(), NOW())
+        ON DUPLICATE KEY UPDATE play_time_ = (ifnull(play_time_, 0) + #{record.playTime})
+    </insert>
+
+    <select id="statList" resultType="com.ym.mec.biz.dal.wrapper.StudentCoursewarePlayRecordWrapper$StatQueryData">
+        select o.id_                                                                                             as organizationId
+             , o.name_                                                                                           as organizationName
+             , count(distinct s.user_id_)                                                                        as memberNum
+             , (count(distinct s.user_id_) - count(distinct pr.user_id_))                                        as noPlayNum
+             , count(distinct if(10 * 60 >= pr.play_time_, pr.user_id_, null))                                   as playTimeLess10
+             , count(distinct if(pr.play_time_ > 10 * 60 and 60 * 60 >= pr.play_time_, pr.user_id_, null))       as playTimeLess60
+             , count(distinct if(pr.play_time_ > 60 * 60 and 120 * 60 >= pr.play_time_, pr.user_id_, null))      as playTimeLess120
+             , count(distinct if(pr.play_time_ > 120 * 60 and 240 * 60 >= pr.play_time_, pr.user_id_, null))     as playTimeLess240
+             , count(distinct if(pr.play_time_ > 240 * 60, pr.user_id_, null))                                   as playTimeRather240
+             , if(count(distinct pr.user_id_) = 0, 0, (sum(pr.play_time_) / (count(distinct pr.user_id_) * 60))) as avgPlayTime
+        from organization o
+                 left join sys_user su on o.id_ = su.organ_id_
+                 left join student s on s.user_id_ = su.id_
+                 left join (select user_id_, sum(play_time_) play_time_
+                            from student_courseware_play_record
+                            where create_time_ > #{statQuery.startTime}
+                              and #{statQuery.endTime} > create_time_
+                            group by user_id_) pr on s.user_id_ = pr.user_id_
+        <where>
+            s.membership_end_time_ >= now()
+            <if test="statQuery.organizationId != null and statQuery.organizationId.trim() !=''">
+                and find_in_set(o.id_,#{statQuery.organizationId})
+            </if>
+        </where>
+        group by o.id_
+        order by ${statQuery.sortBy}
+    </select>
+    <select id="statDetailPage" resultType="com.ym.mec.biz.dal.wrapper.StudentCoursewarePlayRecordWrapper$StatQueryData">
+        select o.id_                                                                                             as organizationId
+             , o.name_                                                                                           as organizationName
+             , su2.username_                                                                                     as teacherName
+             , count(distinct s.user_id_)                                                                        as memberNum
+             , (count(distinct s.user_id_) - count(distinct pr.user_id_))                                        as noPlayNum
+             , count(distinct if(10 * 60 >= pr.play_time_, pr.user_id_, null))                                   as playTimeLess10
+             , count(distinct if(pr.play_time_ > 10 * 60 and 60 * 60 >= pr.play_time_, pr.user_id_, null))       as playTimeLess60
+             , count(distinct if(pr.play_time_ > 60 * 60 and 120 * 60 >= pr.play_time_, pr.user_id_, null))      as playTimeLess120
+             , count(distinct if(pr.play_time_ > 120 * 60 and 240 * 60 >= pr.play_time_, pr.user_id_, null))     as playTimeLess240
+             , count(distinct if(pr.play_time_ > 240 * 60, pr.user_id_, null))                                   as playTimeRather240
+             , if(count(distinct pr.user_id_) = 0, 0, (sum(pr.play_time_) / (count(distinct pr.user_id_) * 60))) as avgPlayTime
+        from organization o
+                 left join sys_user su on su.organ_id_ = o.id_
+                 left join student s on s.user_id_ = su.id_
+                 left join student_teacher_mapper stm on stm.student_id_ = s.user_id_
+                 left join sys_user su2 on su2.id_ = stm.teacher_id_
+                 left join (select user_id_, sum(play_time_) play_time_
+                            from student_courseware_play_record
+                            where create_time_ > #{statQuery.startTime}
+                              and #{statQuery.endTime} > create_time_
+                            group by user_id_) pr on s.user_id_ = pr.user_id_
+        where o.id_ = #{statQuery.organizationId}
+          and s.membership_end_time_ >= now() and stm.id_ is not null
+        group by stm.teacher_id_
+        order by ${statQuery.sortBy}
+    </select>
+</mapper>

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

@@ -33,7 +33,8 @@
     <select id="queryAll" resultType="com.ym.mec.biz.dal.dto.StudentLessonExaminationDetailDto">
         select sms.name_ musicScoreName,sled.id_ studentLessonExaminationDetailId, sled.user_id_ userId, sled.lesson_examination_id_ lessonExaminationId, sled.music_score_id_ musicScoreId,
                sled.heard_level_ heardLevel, sled.training_score_ trainingScore,sled.avg_score_ avgScore, sled.actual_avg_score_ actualAvgScore, sled.start_ start, sled.end_ end,
-               sled.standard_score_ standardScore, sled.part_index_ partIndex,CASE WHEN sled.training_time_ IS NULL THEN 0 ELSE 1 END trainingFlag
+               sled.standard_score_ standardScore, sled.part_index_ partIndex,CASE WHEN sled.training_time_ IS NULL THEN 0 ELSE 1 END trainingFlag,
+               sms.del_flag_ = 0 AND sms.show_flag_ = 1 validFlag
         from student_lesson_examination_detail sled
         left join sys_music_score sms ON sms.id_ = sled.music_score_id_
         <where>

+ 3 - 0
mec-biz/src/main/resources/config/mybatis/SysConfigMapper.xml

@@ -103,4 +103,7 @@
     <select id="findConfigValue" resultType="java.lang.String">
 		SELECT paran_value_ FROM sys_config WHERE param_name_ = #{paramName}
 	</select>
+    <select id="findByParamNames" resultMap="SysConfig">
+		SELECT * FROM sys_config WHERE FIND_IN_SET(param_name_,#{paramName})
+	</select>
 </mapper>