Browse Source

Merge branch 'feature/1106_homework' into test

刘俊驰 8 months ago
parent
commit
11dda115dd
45 changed files with 779 additions and 97 deletions
  1. 10 0
      mec-application/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java
  2. 13 0
      mec-application/src/main/java/com/ym/mec/student/controller/SysConfigController.java
  3. 7 0
      mec-application/src/main/java/com/ym/mec/web/controller/LessonExaminationController.java
  4. 8 0
      mec-application/src/main/java/com/ym/mec/web/controller/TaskController.java
  5. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentLessonExaminationDao.java
  6. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentLessonTrainingDetailMapper.java
  7. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkWrapper.java
  8. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationDetailDto.java
  9. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationResultDto.java
  10. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationResultDto1.java
  11. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationSubmitDto.java
  12. 17 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationDetailDto.java
  13. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationDetailDto1.java
  14. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationDto.java
  15. 20 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonTrainingDetailWrapper.java
  16. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseHomework.java
  17. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ExtracurricularExercises.java
  18. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/LessonExamination.java
  19. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonExaminationDetail.java
  20. 17 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonTrainingDetail.java
  21. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java
  22. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/MusicPracticeRecordWrapper.java
  23. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentCourseHomeworkService.java
  24. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentLessonExaminationDetailService.java
  25. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentLessonTrainingDetailService.java
  26. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  27. 4 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseHomeworkServiceImpl.java
  28. 11 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java
  29. 15 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/LessonExaminationServiceImpl.java
  30. 167 33
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  31. 115 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonExaminationDetailServiceImpl.java
  32. 71 20
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonExaminationServiceImpl.java
  33. 22 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonTrainingDetailServiceImpl.java
  34. 10 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  35. 5 2
      mec-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml
  36. 2 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  37. 8 5
      mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesMapper.xml
  38. 25 1
      mec-biz/src/main/resources/config/mybatis/StudentCourseHomeworkMapper.xml
  39. 10 4
      mec-biz/src/main/resources/config/mybatis/StudentLessonExaminationDetailMapper.xml
  40. 12 1
      mec-biz/src/main/resources/config/mybatis/StudentLessonExaminationMapper.xml
  41. 11 0
      mec-biz/src/main/resources/config/mybatis/StudentLessonTrainingDetailMapper.xml
  42. 2 2
      mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  43. 7 0
      mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
  44. 8 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  45. 21 0
      mec-task/src/main/java/com/ym/mec/task/jobs/DeleteOverdueHomeworkTask.java

+ 10 - 0
mec-application/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java

@@ -139,6 +139,16 @@ public class StudentCourseHomeworkController extends BaseController {
         return succeed(studentCourseHomeworkService.addStudentHomeworkRecord(query));
     }
 
+
+
+    @ApiOperation(value = "添加作业练习记录")
+    @PostMapping(value = "/addStudentHomeworkRecord")
+    public HttpResponseResult<Boolean>
+    addStudentHomeworkRecordPost(@RequestBody CourseHomeworkWrapper.AddStudentHomeworkRecord query){
+        query.setUserId(sysUserService.getUserId().longValue());
+        return succeed(studentCourseHomeworkService.addStudentHomeworkRecord(query));
+    }
+
     @ApiOperation(value = "分页查询作业列表")
     @PostMapping(value = "/queryPage")
     public Object queryPage(@RequestBody(required = false) CourseHomeworkQueryInfo queryInfo){

+ 13 - 0
mec-application/src/main/java/com/ym/mec/student/controller/SysConfigController.java

@@ -3,11 +3,13 @@ package com.ym.mec.student.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,15 @@ 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));
+    }
 }

+ 7 - 0
mec-application/src/main/java/com/ym/mec/web/controller/LessonExaminationController.java

@@ -2,17 +2,21 @@ package com.ym.mec.web.controller;
 
 
 import com.ym.mec.biz.dal.dto.LessonExaminationResultDto;
+import com.ym.mec.biz.dal.dto.StudentLessonExaminationDetailDto;
 import com.ym.mec.biz.dal.dto.StudentLessonExaminationDto1;
 import com.ym.mec.biz.dal.entity.Subject;
 import com.ym.mec.biz.dal.page.LessonExaminationQueryInfo;
+import com.ym.mec.biz.dal.page.StudentLessonExaminationQueryDto;
 import com.ym.mec.biz.service.LessonExaminationService;
 import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.biz.service.StudentLessonExaminationDetailService;
 import com.ym.mec.biz.service.StudentLessonExaminationService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
@@ -37,6 +41,9 @@ public class LessonExaminationController extends BaseController {
     @Resource
     private StudentLessonExaminationService studentLessonExaminationService;
 
+    @Autowired
+    private StudentLessonExaminationDetailService studentLessonExaminationDetailService;
+
     @ApiOperation(value = "获取作业学员列表")
     @PostMapping("queryStudentPage")
     @PreAuthorize("@pcs.hasPermissions('lessonExamination/queryStudentPage')")

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

@@ -757,4 +757,12 @@ public class TaskController extends BaseController {
     public void workOverdue(){
         userMusicService.workOverdue();
     }
+
+    /**
+     * 删除过期作业
+     */
+    @GetMapping("/deleteOverdueHomework")
+    public void deleteOverdueHomework(){
+        studentCourseHomeworkService.deleteOverdueHomework();
+    }
 }

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentLessonExaminationDao.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ym.mec.biz.dal.dto.StudentLessonExaminationDto;
 import com.ym.mec.biz.dal.dto.StudentLessonExaminationDto1;
 import com.ym.mec.biz.dal.entity.StudentLessonExamination;
+import com.ym.mec.biz.dal.entity.StudentLessonExaminationDetail;
+import com.ym.mec.biz.dal.entity.StudentLessonTrainingDetail;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -38,5 +40,8 @@ public interface StudentLessonExaminationDao extends BaseMapper<StudentLessonExa
     List<Map<Long, String>> getStudentName(@Param("examinationIds") List<Long> examinationIds);
 
     List<StudentLessonExamination> queryEndList(@Param("date") String date);
+
+    List<StudentLessonExaminationDetail> queryExpired();
+
 }
 

+ 4 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentLessonTrainingDetailMapper.java

@@ -4,11 +4,14 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ym.mec.biz.dal.entity.StudentLessonTrainingDetail;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * 练习内容
  * 2023-03-31 14:18:47
  */
 @Repository
 public interface StudentLessonTrainingDetailMapper extends BaseMapper<StudentLessonTrainingDetail> {
-	
+
+    List<StudentLessonTrainingDetail> queryExpired();
 }

+ 36 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkWrapper.java

@@ -1,15 +1,20 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.StudentCourseHomework;
 import com.ym.mec.biz.dal.enums.EHomeWorkStatus;
 import com.ym.mec.biz.dal.enums.ELessonTrainingType;
 import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
+import com.ym.mec.biz.dal.enums.StandardEnum;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import javax.validation.constraints.NotNull;
 import java.util.Date;
@@ -211,6 +216,15 @@ public class CourseHomeworkWrapper {
 
         private String studentIdList;
 
+        @ApiModelProperty("训练说明")
+        private String memo;
+
+
+        @ApiModelProperty(value = "文件过期天数")
+        private Integer fileExpireDay;
+
+        @ApiModelProperty(value = "0未达标、1达标、2优秀",required = true)
+        private StandardEnum standardFlag;
 
         @ApiModelProperty("练习内容")
         private List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> trainingDetailList;
@@ -278,10 +292,32 @@ public class CourseHomeworkWrapper {
         @NotNull(message = "作业详情id不能为空")
         private Long id;
 
+        @ApiModelProperty("上传文件JSON")
+        private List<FileJson> fileJson;
     }
 
 
     @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class FileJson {
+
+        @ApiModelProperty("文件路径,如果是评测则为评测记录ID")
+        private String filePath;
+
+        @ApiModelProperty("文件类型:评测:EVALUATION,IMG:图片,SOUND:音频,VIDEO:视频")
+        private String fileType;
+
+        @ApiModelProperty("文件过期标志")
+        private Boolean expireFlag = false;
+
+        @ApiModelProperty("文件内容")
+        private String content;
+
+    }
+
+    @Data
     @ApiModel(value = "StudentCourseHomeworkDetail-学生课程作业详情")
     public static class StudentCourseHomeworkDetail {
 

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationDetailDto.java

@@ -30,5 +30,11 @@ public class LessonExaminationDetailDto{
 
     @ApiModelProperty("结束小节")
     private Integer end;
+
+    @ApiModelProperty("作业类型,MUSIC_SCORE:曲目评测,DESCRIPTION:描述")
+    private String homeworkType;
+
+    @ApiModelProperty("作业描述")
+    private String desc;
 }
 

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

@@ -61,5 +61,8 @@ public class LessonExaminationResultDto{
 
     @ApiModelProperty("作业分组")
     private Integer group;
+
+    @ApiModelProperty(value = "文件过期天数")
+    private Integer fileExpireDay;
 }
 

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationResultDto1.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -54,5 +55,8 @@ public class LessonExaminationResultDto1 {
 
     @ApiModelProperty(value = "是否测评")
     private Boolean trainingFlag;
+
+    @TableField("memo_")
+    private String memo;
 }
 

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LessonExaminationSubmitDto.java

@@ -4,6 +4,8 @@ package com.ym.mec.biz.dal.dto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  *
  * @author zx
@@ -16,5 +18,11 @@ public class LessonExaminationSubmitDto {
 
     @ApiModelProperty(value = "测评分数")
     private Integer score;
+
+    @ApiModelProperty(value = "评测记录ID")
+    private Long recordId;
+
+    @ApiModelProperty("上传文件JSON")
+    private List<CourseHomeworkWrapper.FileJson> fileJson;
 }
 

+ 17 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationDetailDto.java

@@ -1,11 +1,12 @@
 package com.ym.mec.biz.dal.dto;
 
 
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.ym.mec.biz.dal.enums.HardLevelEnum;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  *
  * @author zx
@@ -63,5 +64,20 @@ public class StudentLessonExaminationDetailDto {
     @ApiModelProperty("作业分组")
     private Integer group;
 
+    @ApiModelProperty("作业类型,MUSIC_SCORE:曲目评测,DESCRIPTION:描述")
+    private String homeworkType;
+
+
+
+    @ApiModelProperty("使用状态 锁定: LOCK 解锁:UNLOCK")
+    private String useStatus;
+
+    @ApiModelProperty("作业描述")
+    private String desc;
+
+    private String fileJsons;
+
+    @ApiModelProperty("上传文件JSON")
+    private List<CourseHomeworkWrapper.FileJson> fileJson;
 }
 

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationDetailDto1.java

@@ -1,10 +1,13 @@
 package com.ym.mec.biz.dal.dto;
 
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.ym.mec.biz.dal.enums.HardLevelEnum;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  *
  * @author zx
@@ -33,5 +36,18 @@ public class StudentLessonExaminationDetailDto1 {
 
     @ApiModelProperty(value = "训练说明")
     private String memo;
+
+    @ApiModelProperty("作业类型,MUSIC_SCORE:曲目评测,DESCRIPTION:描述")
+    private String homeworkType;
+
+    @ApiModelProperty("作业描述")
+    private String desc;
+
+    @ApiModelProperty("上传文件JSON")
+    private String fileJsons;
+
+
+    @ApiModelProperty("上传文件JSON")
+    private List<CourseHomeworkWrapper.FileJson> fileJson;
 }
 

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationDto.java

@@ -45,6 +45,10 @@ public class StudentLessonExaminationDto {
     @ApiModelProperty("作业分组")
     private Integer group;
 
+
+    @ApiModelProperty(value = "描述")
+    private String memo;
+
     @ApiModelProperty("作业详情")
     private StudentLessonExaminationDetailDto studentLessonExaminationDetail;
 }

+ 20 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonTrainingDetailWrapper.java

@@ -11,6 +11,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import javax.validation.constraints.NotNull;
+import java.io.File;
 import java.util.List;
 
 /**
@@ -52,8 +53,13 @@ public class StudentLessonTrainingDetailWrapper {
         @ApiModelProperty("结束小节")
         private Integer end;
 
-        @ApiModelProperty("作业类型,VIDEO,MUSIC_SCORE")
+        @ApiModelProperty("作业类型,VIDEO,MUSIC_SCORE,DESCRIPTION:描述")
         private String homeworkType = "MUSIC_SCORE";
+
+
+        @ApiModelProperty("作业描述")
+        private String desc;
+
     }
 
     @Data
@@ -123,6 +129,19 @@ public class StudentLessonTrainingDetailWrapper {
 
         @ApiModelProperty("使用状态 锁定: LOCK 解锁:UNLOCK")
         private String useStatus;
+
+
+
+        @ApiModelProperty("作业描述")
+        private String desc;
+
+        private String fileJsons;
+
+        @ApiModelProperty("上传文件JSON")
+        private List<CourseHomeworkWrapper.FileJson> fileJson;
+
+        @ApiModelProperty("上传作业文件失效删除标记")
+        private Boolean fileDelFlag;
         
         public String jsonString() {
             return JSON.toJSONString(this);

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.ym.mec.biz.dal.dto.LessonExaminationSaveDto;
 import com.ym.mec.biz.dal.dto.MusicScoreSubjectDto;
 import com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper;
@@ -52,6 +53,9 @@ public class CourseHomework extends BaseEntity {
 	private String musicGroupId;
 
     private String versionTag;
+
+    @ApiModelProperty(value = "文件过期天数")
+    private Integer fileExpireDay;
 	
 	private MusicGroup musicGroup = new MusicGroup();
 	

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

@@ -92,8 +92,11 @@ public class ExtracurricularExercises extends BaseEntity {
 	private int status;
 	
 	private String organName;
+    @ApiModelProperty(value = "文件过期天数")
+    private Integer fileExpireDay;
 
-	private ImSendTypeEnum msgType = ImSendTypeEnum.TXT;
+
+    private ImSendTypeEnum msgType = ImSendTypeEnum.TXT;
 
 	/** 伴奏列表(多个用逗号分隔) */
 	@ApiModelProperty(value="伴奏列表(多个用逗号分隔)")

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

@@ -71,5 +71,9 @@ public class LessonExamination{
 
     @TableField("tenant_id_")
     private Integer tenantId = TenantContextHolder.getTenantId();
+
+    @TableField("file_expire_day_")
+    @ApiModelProperty(value = "文件过期天数")
+    private Integer fileExpireDay;
 }
 

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonExaminationDetail.java

@@ -94,5 +94,26 @@ public class StudentLessonExaminationDetail implements Serializable {
     @ApiModelProperty(value = "更新时间")
     private Date updateTime;
 
+    @ApiModelProperty("作业类型,MUSIC_SCORE:曲目评测,DESCRIPTION:描述")
+    @TableField(value = "homework_type_")
+    private String homeworkType;
+
+
+    @ApiModelProperty("评测记录ID")
+    @TableField(value = "record_id_")
+    private Long recordId;
+
+
+    @ApiModelProperty("作业描述")
+    @TableField(value = "desc_")
+    private String desc;
+
+    @ApiModelProperty("上传文件JSON")
+    @TableField(value = "file_json_")
+    private String fileJson;
+
+    @ApiModelProperty("上传作业文件失效删除标记")
+    @TableField(value = "file_del_flag_")
+    private Boolean fileDelFlag;
 }
 

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

@@ -80,7 +80,7 @@ public class StudentLessonTrainingDetail implements Serializable {
 	@TableField(value = "times_")
     private Integer times;
 
-    @ApiModelProperty("作业类型,VIDEO,MUSIC_SCORE")
+    @ApiModelProperty("作业类型,VIDEO,MUSIC_SCORE,DESCRIPTION:描述")
     @TableField(value = "homework_type_")
     private String homeworkType = "MUSIC_SCORE";
 
@@ -104,4 +104,20 @@ public class StudentLessonTrainingDetail implements Serializable {
     @ApiModelProperty("课件ID 布置课件视频作业时")
     @TableField(value = "lesson_courseware_id_")
     private String lessonCoursewareId;
+
+
+
+    @ApiModelProperty("作业描述")
+    @TableField(value = "desc_")
+    private String desc;
+
+    @ApiModelProperty("上传文件JSON")
+    @TableField(value = "file_json_")
+    private String fileJson;
+
+    @ApiModelProperty("上传作业文件失效删除标记")
+    @TableField(value = "file_del_flag_")
+    private Boolean fileDelFlag;
+
+
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java

@@ -105,6 +105,8 @@ public class SysMusicCompareRecord extends BaseEntity {
 
     private Float playRate;
 
+    private Long lessonDetailId;
+
 	public SysMusicCompareRecord(FeatureType feature) {
 		this.feature = feature;
 	}

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/MusicPracticeRecordWrapper.java

@@ -318,6 +318,9 @@ public class MusicPracticeRecordWrapper {
 
         @ApiModelProperty("是否隐藏评测记录 0:不隐藏 1:隐藏")
         private Boolean hiddenFlag;
+
+        @ApiModelProperty("作业详情ID")
+        private Long lessonDetailId;
         public String jsonString() {
             return JSON.toJSONString(this);
         }
@@ -481,6 +484,8 @@ public class MusicPracticeRecordWrapper {
         @ApiModelProperty("假删除标识 0:未删除 1:已删除")
         private Boolean delFlag;
 
+        @ApiModelProperty("作业详情ID")
+        private Long lessonDetailId;
 
         public static MusicPracticeRecordWrapper.Entity toEntity(SysMusicCompareRecord record) {
             if (record ==null) {
@@ -552,6 +557,7 @@ public class MusicPracticeRecordWrapper {
             sysMusicCompareRecord.setInstrumentId(this.instrumentId!=null?Long.parseLong(this.instrumentId):null);
             sysMusicCompareRecord.setDelFlag(this.delFlag);
             sysMusicCompareRecord.setPlayRate(this.playRate);
+            sysMusicCompareRecord.setLessonDetailId(this.lessonDetailId);
 
             return sysMusicCompareRecord;
 

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

@@ -10,6 +10,7 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -118,6 +119,10 @@ public interface StudentCourseHomeworkService extends BaseService<Long, StudentC
 
     List<StudentCourseHomework> findStudentCourseHomeworkByCourseV2(StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query);
 
+    void studentLessonTrainingDetailFileJsonFormat(ELessonTrainingType type, Long homeworkId, List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails);
+
+    void studentLessonTrainingDetailFileJsonFormat(List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails, Date expireDate, Integer fileExpireDay);
+
     List<StudentCourseHomework> findExtraExerciseStudentsV2(StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query);
 
     /**
@@ -153,4 +158,9 @@ public interface StudentCourseHomeworkService extends BaseService<Long, StudentC
     StudentLessonTrainingDetailWrapper.StudentLessonTraining findExtracurricularExercisesDetailPublicV2(Long courseScheduleId, Long userId, ELessonTrainingType type);
 
     void pushEndMsg();
+
+    /**
+     * 删除过期作业
+     */
+    void deleteOverdueHomework();
 }

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

@@ -23,5 +23,7 @@ public interface StudentLessonExaminationDetailService extends IService<StudentL
     void save(Long lessonExaminationId,List<StudentLessonExaminationSaveDto> studentLessonExaminationSaveDtos);
 
     List<StudentLessonExaminationDetailDto> queryAll(StudentLessonExaminationQueryDto query);
+
+    List<StudentLessonExaminationDetail> queryByStudent(Integer userId, Long lessonExaminationId);
 }
 

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

@@ -84,4 +84,6 @@ public interface StudentLessonTrainingDetailService extends IService<StudentLess
 
     @NotNull
     Map<Integer, List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> getGroupMap(Long courseHomeworkId, ELessonTrainingType trainingType);
+
+    List<StudentLessonTrainingDetail> queryExpired();
 }

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

@@ -456,6 +456,26 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
      */
     String USER_MUSIC_DRAFT_TIME = "user_music_draft_time";
 
+
+    /**
+     * 作业文件有效时间(天)
+     */
+    String HOMEWORK_FILE_EXPIRE_TIME = "homework_file_expire_time";
+
+
+
+    /**
+     * 作业视频最大时长(秒)
+     */
+    String HOMEWORK_VIDEO_MAX_TIME = "homework_video_max_time";
+
+
+    /**
+     * 作业音频最大时长(分钟)
+     */
+    String HOMEWORK_AUDIO_MAX_TIME = "homework_audio_max_time";
+
+
     static void checkActivityDate(String startTimeStr, String endTimeStr) {
         if(StringUtils.isEmpty(startTimeStr) || StringUtils.isEmpty(startTimeStr)){
             return;

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

@@ -19,10 +19,7 @@ import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.CourseHomeWorkTemplateQueryInfo;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
-import com.ym.mec.biz.service.CourseHomeworkService;
-import com.ym.mec.biz.service.StudentExtracurricularExercisesSituationService;
-import com.ym.mec.biz.service.StudentLessonTrainingDetailService;
-import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -63,6 +60,9 @@ public class CourseHomeworkServiceImpl extends BaseServiceImpl<Long, CourseHomew
     @Autowired
     private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
 
+    @Autowired
+    private StudentCourseHomeworkService studentCourseHomeworkService;
+
 	@Override
 	public BaseDAO<Long, CourseHomework> getDAO() {
 		return courseHomeworkDao;

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

@@ -33,6 +33,8 @@ import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import static com.ym.mec.biz.service.SysConfigService.HOMEWORK_FILE_EXPIRE_TIME;
+
 @Service
 public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, ExtracurricularExercises> implements ExtracurricularExercisesService {
 
@@ -59,6 +61,9 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
     @Autowired
     private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
 
+    @Autowired
+    private SysConfigDao sysConfigDao;
+
     @Override
     public BaseDAO<Long, ExtracurricularExercises> getDAO() {
         return extracurricularExercisesDao;
@@ -98,6 +103,11 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
                     .withHour(21).withMinute(0).withSecond(0).withNano(0);
             exercises.setExpireDate(Date.from(localDateTime.atZone(DateUtil.zoneId).toInstant()));
         }
+        String fileExpireTime = sysConfigDao.findConfigValue(HOMEWORK_FILE_EXPIRE_TIME);
+        if (StringUtils.isNotBlank(fileExpireTime)) {
+            int fileExpireTimeInt = Integer.parseInt(fileExpireTime);
+            exercises.setFileExpireDay(fileExpireTimeInt==0?null:fileExpireTimeInt);
+        }
         List<Integer> studentIds = Arrays.asList(exercises.getStudentIdList().split(",")).stream().mapToInt(Integer::valueOf).boxed().collect(Collectors.toList());
         exercises.setBatchNo(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
         exercises.setExpectNum(studentIds.size());
@@ -125,7 +135,7 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
                     extracurricularExercisesReplies.add(JSON.parseObject(JSON.toJSONString(studentExtraExercise),ExtracurricularExercisesReply.class));
                 }
                 if (CollectionUtils.isEmpty(musicScoreSubjectDto.getStudentLessonTrainingDetails())) {
-                    throw new BizException("有部分声部未选择曲目");
+                    musicScoreSubjectDto.setStudentLessonTrainingDetails(new ArrayList<>());
                 }
                 for (StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail studentLessonTrainingDetail : musicScoreSubjectDto.getStudentLessonTrainingDetails()) {
                     studentLessonTrainingDetail.setSubjectId(0);

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

@@ -26,6 +26,8 @@ import org.springframework.transaction.annotation.Transactional;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static com.ym.mec.biz.service.SysConfigService.HOMEWORK_FILE_EXPIRE_TIME;
+
 /**
  * 进度评测表(LessonExamination)表服务实现类
  *
@@ -108,6 +110,11 @@ public class LessonExaminationServiceImpl extends ServiceImpl<LessonExaminationD
             }
         }
         lessonExamination.setExpireDate(expireDate);
+        String fileExpireTime = sysConfigDao.findConfigValue(HOMEWORK_FILE_EXPIRE_TIME);
+        if (StringUtils.isNotBlank(fileExpireTime)) {
+            int i = Integer.parseInt(fileExpireTime);
+            lessonExamination.setFileExpireDay(i==0?null:i);
+        }
         lessonExamination.setTeacherId(param.getTeacherId());
         baseMapper.insert(lessonExamination);
         List<Integer> studentIds = studentLessonExaminationService.save(lessonExamination.getId(), param.getStudentLessonExaminationSaveDtos());
@@ -205,7 +212,14 @@ public class LessonExaminationServiceImpl extends ServiceImpl<LessonExaminationD
 
     @Override
     public LessonExaminationResultDto1 getOne(Integer userId, Long lessonExaminationId) {
-        return baseMapper.getOneByStudent(userId,lessonExaminationId);
+        LessonExaminationResultDto1 oneByStudent = baseMapper.getOneByStudent(userId, lessonExaminationId);
+        if(Objects.nonNull(oneByStudent)){
+            List<StudentLessonExaminationDetail> details = studentLessonExaminationDetailService.queryByStudent(userId, lessonExaminationId);
+            if(CollectionUtils.isNotEmpty(details)){
+                oneByStudent.setMemo(details.get(0).getMemo());
+            }
+        }
+        return oneByStudent;
     }
 
     @Override

+ 167 - 33
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java

@@ -1,5 +1,9 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.google.common.collect.Lists;
+import com.microsvc.toolkit.middleware.oss.OssPluginContext;
+import com.microsvc.toolkit.middleware.oss.OssPluginService;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
@@ -25,6 +29,7 @@ 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.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -89,9 +94,15 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
     private StudentLessonExaminationDao studentLessonExaminationDao;
     @Resource
     private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
+
+    @Autowired
+    private StudentLessonExaminationDetailService studentLessonExaminationDetailService;
+
     @Resource
     private ExtracurricularExercisesDao extracurricularExercisesDao;
 
+    @Autowired
+    private OssPluginContext ossPluginContext;
     @Override
     public BaseDAO<Long, StudentCourseHomework> getDAO() {
         return studentCourseHomeworkDao;
@@ -827,6 +838,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         StudentCourseHomework studentCourseHomework = studentCourseHomeworkByCourse.get(0);
         List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails = studentCourseHomeworkDao
             .findByStudentIdsAndCourseScheduleId(studentIds, studentCourseHomework.getCourseHomeworkId(),studentCourseHomework.getType());
+        studentLessonTrainingDetailFileJsonFormat(studentCourseHomework.getType(), studentCourseHomework.getCourseHomeworkId(), studentLessonTrainingDetails);
 
         if (CollectionUtils.isNotEmpty(studentLessonTrainingDetails)) {
             //设置曲目名称
@@ -850,6 +862,49 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
     }
 
     @Override
+    public void studentLessonTrainingDetailFileJsonFormat(ELessonTrainingType type, Long homeworkId, List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails) {
+        Date expireDate = null;
+        Integer fileExpireDay = null;
+        if (type == ELessonTrainingType.HOMEWORK) {
+            CourseHomework courseHomework = courseHomeworkDao.get(homeworkId);
+            if (courseHomework != null) {
+                expireDate = courseHomework.getExpiryDate();
+                fileExpireDay = courseHomework.getFileExpireDay();
+            }
+        } else {
+            ExtracurricularExercises extracurricularExercises = extracurricularExercisesDao.get(homeworkId);
+            if (extracurricularExercises != null) {
+                expireDate = extracurricularExercises.getExpireDate();
+                fileExpireDay = extracurricularExercises.getFileExpireDay();
+            }
+        }
+        studentLessonTrainingDetailFileJsonFormat(studentLessonTrainingDetails, expireDate, fileExpireDay);
+    }
+
+    @Override
+    public void studentLessonTrainingDetailFileJsonFormat(List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails, Date expireDate, Integer fileExpireDay) {
+
+
+        boolean expireFlag = false;
+        if (fileExpireDay != null && fileExpireDay >0 && expireDate != null) {
+            expireFlag = DateUtil.addDays(expireDate, fileExpireDay).before(new Date());
+        }
+        for (StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail : studentLessonTrainingDetails) {
+            if (StringUtils.isNotBlank(studentLessonTrainingDetail.getFileJsons())) {
+                List<CourseHomeworkWrapper.FileJson> fileJsons = JSON.parseArray(studentLessonTrainingDetail.getFileJsons(), CourseHomeworkWrapper.FileJson.class);
+                studentLessonTrainingDetail.setFileJson(fileJsons);
+                studentLessonTrainingDetail.setFileJsons(null);
+            }
+            if (!CollectionUtils.isEmpty(studentLessonTrainingDetail.getFileJson())) {
+                for (CourseHomeworkWrapper.FileJson fileJson : studentLessonTrainingDetail.getFileJson()) {
+                    fileJson.setExpireFlag(expireFlag);
+                }
+            }
+        }
+
+    }
+
+    @Override
     public List<StudentCourseHomework> findExtraExerciseStudentsV2(StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query) {
         List<StudentCourseHomework> extraExerciseStudents = extracurricularExercisesReplyService.findExtraExerciseStudents(query);
 
@@ -882,6 +937,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
                 return BaseController.failed(HttpStatus.NO_CONTENT,"作业不存在");
             }
             courseHomeworkDetail.setSubmitTime(homework.getSubmitTime());
+            courseHomeworkDetail.setStandardFlag(homework.getStandardFlag());
         } else {
             courseHomeworkDetail = courseHomeworkService.findCourseExtraHomeworkDetail(query.getCourseScheduleId());
             ExtracurricularExercisesReply exercisesReply = extracurricularExercisesReplyDao.getByExtraIdAndUserId(courseHomeworkDetail.getCourseHomeworkId(), query.getUserId());
@@ -889,19 +945,28 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
                 return BaseController.failed(HttpStatus.NO_CONTENT,"作业不存在");
             }
             courseHomeworkDetail.setSubmitTime(exercisesReply.getSubmitTime());
+            courseHomeworkDetail.setStandardFlag(exercisesReply.getStandardFlag());
         }
 
         // 获取作业信息
         List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> detailList = studentLessonTrainingDetailService.getBaseLessonTrainingDetail(
             courseHomeworkDetail.getCourseHomeworkId(), query.getType(), query.getUserId(),null);
 
-        long count = detailList.stream().filter(o -> o.getTrainingTimes() < o.getTimes()).count();
-        if (count >0) {
+        if (courseHomeworkDetail.getStandardFlag() == null) {
             courseHomeworkDetail.setFinishStatus(false);
+        } else
+        if( courseHomeworkDetail.getStandardFlag().equals(StandardEnum.STANDARD) || courseHomeworkDetail.getStandardFlag().equals(StandardEnum.EXCELLENT)) {
+            courseHomeworkDetail.setFinishStatus(true);
         } else {
             courseHomeworkDetail.setFinishStatus(true);
         }
-        courseHomeworkDetail.setTrainingDetailList(detailList);
+        if (CollectionUtils.isNotEmpty(detailList)) {
+            //设置训练说明
+            courseHomeworkDetail.setMemo(detailList.get(0).getMemo());
+            // 过滤 描述 类的作业
+
+            courseHomeworkDetail.setTrainingDetailList(detailList);
+        }
 
         return BaseController.succeed(courseHomeworkDetail);
     }
@@ -925,14 +990,21 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         if (studentLessonTrainingDetail == null) {
             throw new BizException("练习记录不存在");
         }
-        // 设置个人作业练习详情记录
-        studentLessonTrainingDetail.setTrainingTimes(studentLessonTrainingDetail.getTrainingTimes() +1);
+        if (record.getFileJson() == null) {
+            // 设置个人作业练习详情记录
+            studentLessonTrainingDetail.setTrainingTimes(studentLessonTrainingDetail.getTrainingTimes() + 1);
 
-        if (studentLessonTrainingDetail.getTrainingTimes() >= studentLessonTrainingDetail.getTimes()) {
-            studentLessonTrainingDetail.setTrainingStatus(StandardEnum.STANDARD);
-        } else {
-            studentLessonTrainingDetail.setTrainingStatus(StandardEnum.NOT_STANDARD);
+            if (studentLessonTrainingDetail.getTrainingTimes() >= studentLessonTrainingDetail.getTimes()) {
+                studentLessonTrainingDetail.setTrainingStatus(StandardEnum.STANDARD);
+            } else {
+                studentLessonTrainingDetail.setTrainingStatus(StandardEnum.NOT_STANDARD);
 
+            }
+        } else if (studentLessonTrainingDetail.getTrainingStatus() == StandardEnum.NOT_START) {
+            studentLessonTrainingDetail.setTrainingStatus(StandardEnum.STANDARD);
+        }
+        if (CollectionUtils.isNotEmpty(record.getFileJson())) {
+            studentLessonTrainingDetail.setFileJson(JSON.toJSONString(record.getFileJson()));
         }
         studentLessonTrainingDetail.setUpdateTime(new Date());
         studentLessonTrainingDetailService.updateById(studentLessonTrainingDetail);
@@ -1048,7 +1120,6 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
     @Override
     public StudentLessonTrainingDetailWrapper.StudentLessonTraining findCourseHomeworkStudentDetailPublicV2(Long courseScheduleId, Long userId, ELessonTrainingType type) {
 
-        StudentLessonTrainingDetailWrapper.StudentLessonTraining studentLessonTraining = getUserInfo(userId);
 
         // 作业信息
         CourseHomeworkStudentDetailDto courseHomeworkStudentDetail = studentCourseHomeworkDao.findCourseHomeworkStudentDetail(
@@ -1056,13 +1127,20 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         if (courseHomeworkStudentDetail == null) {
             throw new BizException("作业不存在");
         }
-        studentLessonTraining.setStandardFlag(courseHomeworkStudentDetail.getStandardFlag());
+        return getStudentLessonTrainingDetails(courseHomeworkStudentDetail.getCourseHomeworkId(), userId, type, courseHomeworkStudentDetail.getStandardFlag());
+
+    }
+
+    private StudentLessonTrainingDetailWrapper.StudentLessonTraining getStudentLessonTrainingDetails(Long homeworkId, Long userId, ELessonTrainingType type, StandardEnum standardFlag) {
+
+        StudentLessonTrainingDetailWrapper.StudentLessonTraining studentLessonTraining = getUserInfo(userId);
+
+        studentLessonTraining.setStandardFlag(standardFlag);
 
         // 作业完成情况
-        if (courseHomeworkStudentDetail.getStandardFlag() == null) {
+        if (standardFlag == null) {
             studentLessonTraining.setFinishFlag(false);
-        } else
-        if( courseHomeworkStudentDetail.getStandardFlag().equals(StandardEnum.STANDARD) || courseHomeworkStudentDetail.getStandardFlag().equals(StandardEnum.EXCELLENT)) {
+        } else if( standardFlag.equals(StandardEnum.STANDARD) || standardFlag.equals(StandardEnum.EXCELLENT)) {
             studentLessonTraining.setFinishFlag(true);
         } else {
             studentLessonTraining.setFinishFlag(false);
@@ -1070,16 +1148,17 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
 
         // 练习内容
         List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails = studentCourseHomeworkDao
-            .findByStudentIdsAndCourseScheduleId(Collections.singletonList(userId.intValue()), courseHomeworkStudentDetail.getCourseHomeworkId(),type);
+            .findByStudentIdsAndCourseScheduleId(Collections.singletonList(userId.intValue()), homeworkId, type);
+
+
+        studentLessonTrainingDetailFileJsonFormat(type, homeworkId, studentLessonTrainingDetails);
 
         studentLessonTraining.setStudentLessonTrainingDetail(studentLessonTrainingDetails);
         return studentLessonTraining;
-
     }
 
     @Override
     public StudentLessonTrainingDetailWrapper.StudentLessonTraining findExtracurricularExercisesDetailPublicV2(Long courseScheduleId, Long userId, ELessonTrainingType type) {
-        StudentLessonTrainingDetailWrapper.StudentLessonTraining studentLessonTraining = getUserInfo(userId);
 
 
         // 作业信息
@@ -1088,23 +1167,8 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         if (exercisesReply == null) {
             throw new BizException("作业不存在");
         }
-        studentLessonTraining.setStandardFlag(exercisesReply.getStandardFlag());
-
-        // 作业完成情况
-        if (exercisesReply.getStandardFlag() == null) {
-            studentLessonTraining.setFinishFlag(false);
-        } else if( exercisesReply.getStandardFlag().equals(StandardEnum.STANDARD) || exercisesReply.getStandardFlag().equals(StandardEnum.EXCELLENT)) {
-            studentLessonTraining.setFinishFlag(true);
-        } else {
-            studentLessonTraining.setFinishFlag(false);
-        }
 
-        // 练习内容
-        List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails = studentCourseHomeworkDao
-            .findByStudentIdsAndCourseScheduleId(Collections.singletonList(userId.intValue()), exercisesReply.getExtracurricularExercisesId(),type);
-
-        studentLessonTraining.setStudentLessonTrainingDetail(studentLessonTrainingDetails);
-        return studentLessonTraining;
+        return getStudentLessonTrainingDetails(exercisesReply.getExtracurricularExercisesId(), userId, type, exercisesReply.getStandardFlag());
 
     }
 
@@ -1147,6 +1211,76 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
 
     }
 
+    /**
+     * 删除过期作业
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteOverdueHomework() {
+
+        OssPluginService pluginService = ossPluginContext.getPluginService("tencent");
+        // 删练习作业
+        {
+            List<StudentLessonTrainingDetail> trainingDetails = studentLessonTrainingDetailService.queryExpired();
+
+            List<String> delFileList = new ArrayList<>();
+            List<StudentLessonTrainingDetail> updateList = new ArrayList<>();
+            for (StudentLessonTrainingDetail trainingDetail : trainingDetails) {
+                StudentLessonTrainingDetail studentLessonTrainingDetail = new StudentLessonTrainingDetail();
+                studentLessonTrainingDetail.setId(trainingDetail.getId());
+                studentLessonTrainingDetail.setHomeworkType(null);
+                String fileJson = trainingDetail.getFileJson();
+                List<CourseHomeworkWrapper.FileJson> fileJsonList = JSON.parseArray(fileJson, CourseHomeworkWrapper.FileJson.class);
+                List<String> delFiles = fileJsonList.stream().map(CourseHomeworkWrapper.FileJson::getFilePath)
+                    .filter(StringUtils::isNotBlank)
+                    .collect(Collectors.toList());
+                delFileList.addAll(delFiles);
+                studentLessonTrainingDetail.setFileDelFlag(true);
+                updateList.add(studentLessonTrainingDetail);
+            }
+
+            if (!org.springframework.util.CollectionUtils.isEmpty(delFileList)) {
+                List<List<String>> partition = Lists.partition(delFileList, 10);
+                for (List<String> strings : partition) {
+                    pluginService.batchDeleteFile(strings);
+                }
+            }
+            if (CollectionUtils.isNotEmpty(updateList)) {
+                studentLessonTrainingDetailService.updateBatchById(updateList, 100);
+            }
+        }
+
+        // 删评测作业
+        {
+            List<StudentLessonExaminationDetail> studentLessonExaminationDetails = studentLessonExaminationDao.queryExpired();
+
+            List<String> delFileList = new ArrayList<>();
+            List<StudentLessonExaminationDetail> updateList = new ArrayList<>();
+            for (StudentLessonExaminationDetail examinationDetail : studentLessonExaminationDetails) {
+                StudentLessonExaminationDetail lessonExaminationDetail = new StudentLessonExaminationDetail();
+                lessonExaminationDetail.setId(examinationDetail.getId());
+                String fileJson = examinationDetail.getFileJson();
+                List<CourseHomeworkWrapper.FileJson> fileJsonList = JSON.parseArray(fileJson, CourseHomeworkWrapper.FileJson.class);
+                List<String> delFiles = fileJsonList.stream().map(CourseHomeworkWrapper.FileJson::getFilePath)
+                    .filter(StringUtils::isNotBlank)
+                    .collect(Collectors.toList());
+                delFileList.addAll(delFiles);
+                lessonExaminationDetail.setFileDelFlag(true);
+                updateList.add(lessonExaminationDetail);
+            }
+
+            if (!org.springframework.util.CollectionUtils.isEmpty(delFileList)) {
+                List<List<String>> partition = Lists.partition(delFileList, 10);
+                for (List<String> strings : partition) {
+                    pluginService.batchDeleteFile(strings);
+                }
+            }
+            if (CollectionUtils.isNotEmpty(updateList)) {
+                studentLessonExaminationDetailService.updateBatchById(updateList, 100);
+            }
+        }
+    }
+
     @NotNull
     private StudentLessonTrainingDetailWrapper.StudentLessonTraining getUserInfo(Long userId) {
         SysUser sysUser = sysUserFeignService.queryUserById(userId.intValue());

+ 115 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonExaminationDetailServiceImpl.java

@@ -1,23 +1,35 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
 import com.ym.mec.biz.dal.dao.StudentLessonExaminationDetailDao;
-import com.ym.mec.biz.dal.dto.LessonExaminationDetailDto;
-import com.ym.mec.biz.dal.dto.StudentLessonExaminationDetailDto;
-import com.ym.mec.biz.dal.dto.StudentLessonExaminationSaveDto;
+import com.ym.mec.biz.dal.dao.SysMusicScoreDao;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.LessonExamination;
+import com.ym.mec.biz.dal.entity.MemberRankCategoryMapper;
 import com.ym.mec.biz.dal.entity.StudentLessonExaminationDetail;
+import com.ym.mec.biz.dal.entity.SysMusicScore;
 import com.ym.mec.biz.dal.page.StudentLessonExaminationQueryDto;
+import com.ym.mec.biz.service.LessonExaminationService;
+import com.ym.mec.biz.service.MemberRankCategoryMapperService;
 import com.ym.mec.biz.service.StudentLessonExaminationDetailService;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.util.date.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * 进度评测详情表(StudentLessonExaminationDetail)表服务实现类
@@ -30,6 +42,18 @@ public class StudentLessonExaminationDetailServiceImpl extends ServiceImpl<Stude
 
     private final static Logger log = LoggerFactory.getLogger(StudentLessonExaminationDetailServiceImpl.class);
 
+    @Autowired
+    private LessonExaminationService lessonExaminationService;
+
+    @Autowired
+    private SysMusicScoreDao sysMusicScoreDao;
+
+    @Autowired
+    private CloudTeacherOrderDao cloudTeacherOrderDao;
+
+    @Autowired
+    private MemberRankCategoryMapperService memberRankCategoryMapperService;
+
     @Override
     public StudentLessonExaminationDetailDao getDao() {
         return this.baseMapper;
@@ -43,11 +67,11 @@ public class StudentLessonExaminationDetailServiceImpl extends ServiceImpl<Stude
             String[] studentIds = dto.getStudentIds().split(",");
             List<LessonExaminationDetailDto> detailDtos = dto.getExaminationDetailDtos();
             if (CollectionUtils.isEmpty(detailDtos)) {
-                throw new BizException("有部分声部未选择曲目");
+                throw new BizException("有部分声部未设置作业内容");
             }
             for (String id : studentIds) {
                 Integer studentId = Integer.parseInt(id);
-                Integer score = 100/detailDtos.size();
+                Integer score = 100 / detailDtos.size();
                 Integer subScore = 100 - score * detailDtos.size();
                 for (int i = 0; i < detailDtos.size(); i++) {
                     LessonExaminationDetailDto vo = detailDtos.get(i);
@@ -59,11 +83,13 @@ public class StudentLessonExaminationDetailServiceImpl extends ServiceImpl<Stude
                     studentLessonExaminationDetail.setHeardLevel(vo.getHeardLevel());
                     studentLessonExaminationDetail.setStandardScore(vo.getScore());
                     studentLessonExaminationDetail.setStart(vo.getStart());
+                    studentLessonExaminationDetail.setHomeworkType(vo.getHomeworkType());
+                    studentLessonExaminationDetail.setDesc(vo.getDesc());
                     studentLessonExaminationDetail.setEnd(vo.getEnd());
                     studentLessonExaminationDetail.setGroup(dto.getGroup());
-                    if(i == 0){
+                    if (i == 0) {
                         studentLessonExaminationDetail.setAvgScore(score + subScore);
-                    }else {
+                    } else {
                         studentLessonExaminationDetail.setAvgScore(score);
                     }
                     studentLessonExaminationDetail.setPartIndex(vo.getPartIndex());
@@ -76,7 +102,86 @@ public class StudentLessonExaminationDetailServiceImpl extends ServiceImpl<Stude
 
     @Override
     public List<StudentLessonExaminationDetailDto> queryAll(StudentLessonExaminationQueryDto query) {
-        return baseMapper.queryAll(query);
+
+        List<StudentLessonExaminationDetailDto> studentLessonExaminationDetailDtos = baseMapper.queryAll(query);
+        if (CollectionUtils.isEmpty(studentLessonExaminationDetailDtos)) {
+            return new ArrayList<>();
+        }
+        for (StudentLessonExaminationDetailDto studentLessonExaminationDetailDto : studentLessonExaminationDetailDtos) {
+            if (StringUtils.isEmpty(studentLessonExaminationDetailDto.getFileJsons())) {
+                continue;
+            }
+            studentLessonExaminationDetailDto.setFileJson(JSON.parseArray(studentLessonExaminationDetailDto.getFileJsons(), CourseHomeworkWrapper.FileJson.class));
+
+            studentLessonExaminationDetailDto.setFileJsons("");
+        }
+        // 曲目id集合
+        List<Integer> musicScoreIdList = studentLessonExaminationDetailDtos.stream()
+            .filter(o-> o.getHomeworkType().equals("MUSIC_SCORE"))
+            .map(StudentLessonExaminationDetailDto::getMusicScoreId)
+            .distinct()
+            .collect(Collectors.toList());
+
+        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(musicScoreIdList)) {
+
+            // 查询有效的会员
+            List<Integer> activationVipIds = cloudTeacherOrderDao.getActivationVipIds(query.getUserId());
+
+            // 获取会员的曲目分类
+            List<MemberRankCategoryMapper> categoryMapperList = memberRankCategoryMapperService.getByMemberRankId(activationVipIds);
+            if (org.apache.commons.collections.CollectionUtils.isEmpty(categoryMapperList)) {
+                categoryMapperList = Lists.newArrayList();
+            }
+            List<Integer> categoryIds = categoryMapperList.stream().map(MemberRankCategoryMapper::getCategoryId).distinct().collect(Collectors.toList());
+
+            // 查询曲目信息
+            List<SysMusicScore> scoreList = sysMusicScoreDao.findByIds(musicScoreIdList.stream().map(String::valueOf).collect(Collectors.joining(",")));
+            if (org.apache.commons.collections.CollectionUtils.isNotEmpty(scoreList)) {
+                Map<Integer, SysMusicScore> musicScoreMap = scoreList.stream().collect(Collectors.toMap(SysMusicScore::getId, Function.identity()));
+                for (StudentLessonExaminationDetailDto studentLessonExaminationDetailDto : studentLessonExaminationDetailDtos) {
+                    if (org.apache.commons.lang3.StringUtils.equals(studentLessonExaminationDetailDto.getHomeworkType(), "MUSIC_SCORE")) {
+                        SysMusicScore sysMusicScore = musicScoreMap.get(studentLessonExaminationDetailDto.getMusicScoreId());
+                        if (sysMusicScore != null) {
+
+                            // 用户VIP可查看曲目分类
+                            // 设置默认不可以查看
+                            if (categoryIds.contains(sysMusicScore.getCbsMusicCategoriesId())
+                                || org.apache.commons.lang3.StringUtils.isBlank(sysMusicScore.getRankIds())) {
+                                // 免费曲目,已购买曲目可直接查看
+                                studentLessonExaminationDetailDto.setUseStatus("UNLOCK");
+                            } else {
+                                studentLessonExaminationDetailDto.setUseStatus("LOCK");
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        if (query.getLessonExaminationId() != null) {
+            LessonExamination lessonExamination = lessonExaminationService.getById(query.getLessonExaminationId());
+            if (lessonExamination != null) {
+                boolean expireFlag = false;
+                if (lessonExamination.getFileExpireDay() != null && lessonExamination.getFileExpireDay() >0) {
+                    expireFlag = DateUtil.addDays(lessonExamination.getExpireDate(), lessonExamination.getFileExpireDay()).before(new Date());
+                }
+                for (StudentLessonExaminationDetailDto dto : studentLessonExaminationDetailDtos) {
+                    if (dto.getFileJson() != null) {
+                        for (CourseHomeworkWrapper.FileJson fileJson : dto.getFileJson()) {
+                            fileJson.setExpireFlag(expireFlag);
+                        };
+                    }
+                }
+            }
+        }
+        return studentLessonExaminationDetailDtos;
+    }
+
+    @Override
+    public List<StudentLessonExaminationDetail> queryByStudent(Integer userId, Long lessonExaminationId) {
+        return this.lambdaQuery()
+            .eq(StudentLessonExaminationDetail::getUserId, userId)
+            .eq(StudentLessonExaminationDetail::getLessonExaminationId, lessonExaminationId)
+            .list();
     }
 
 }

+ 71 - 20
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonExaminationServiceImpl.java

@@ -107,10 +107,11 @@ public class StudentLessonExaminationServiceImpl extends ServiceImpl<StudentLess
             dataList = baseMapper.queryPage(params);
             if(queryInfo.getLessonExaminationId() != null){
                 Map<Integer, StudentLessonExaminationDetail> examinationIdMap = new HashMap<>();
-                if(queryInfo.getLessonExaminationId() != null){
+                LessonExamination lessonExamination = lessonExaminationService.getById(queryInfo.getLessonExaminationId());
+                if(queryInfo.getLessonExaminationId() != null && lessonExamination !=null){
                     List<StudentLessonExaminationDetail> list = studentLessonExaminationDetailService.lambdaQuery().
                             eq(StudentLessonExaminationDetail::getLessonExaminationId, queryInfo.getLessonExaminationId()).list();
-                    String musicScoreIds = list.stream().map(e->e.getMusicScoreId().toString()).collect(Collectors.joining(","));
+                    String musicScoreIds = list.stream().filter(o-> "MUSIC_SCORE".equals(o.getHomeworkType())).map(e->e.getMusicScoreId().toString()).collect(Collectors.joining(","));
                     Map<Integer, SysMusicScore> musicScoreMap = new HashMap<>();
                     if (StringUtils.isNotEmpty(musicScoreIds)) {
                         List<SysMusicScore> musicScores = sysMusicScoreDao.findByIds(musicScoreIds);
@@ -120,17 +121,30 @@ public class StudentLessonExaminationServiceImpl extends ServiceImpl<StudentLess
                     }
                     examinationIdMap = list.stream().collect(Collectors.groupingBy(StudentLessonExaminationDetail::getUserId,
                             Collectors.collectingAndThen(Collectors.toList(), e -> e.get(0))));
+                    boolean expireFlag = false;
+                    if (lessonExamination.getFileExpireDay() != null && lessonExamination.getFileExpireDay() >0) {
+                        expireFlag = DateUtil.addDays(lessonExamination.getExpireDate(), lessonExamination.getFileExpireDay()).before(new Date());
+                    }
                     for (StudentLessonExaminationDto dto : dataList) {
                         StudentLessonExaminationDetail detail = examinationIdMap.get(dto.getUserId());
-                        if (detail != null) {
+                        if (detail != null ) {
+                            String fileJson1 = detail.getFileJson();
+                            detail.setFileJson(null);
                             StudentLessonExaminationDetailDto detailDto = JSON.parseObject(JSON.toJSONString(detail), StudentLessonExaminationDetailDto.class);
-                            if(detail.getMusicScoreId() != null){
+                            detailDto.setFileJson(JSON.parseArray(fileJson1, CourseHomeworkWrapper.FileJson.class));
+                            if(detail.getMusicScoreId() != null && "MUSIC_SCORE".equals(detail.getHomeworkType())){
                                 SysMusicScore musicScore = musicScoreMap.get(detail.getMusicScoreId().intValue());
                                 if (musicScore != null){
                                     detailDto.setMusicScoreName(musicScore.getName());
                                 }
                             }
+                            if (CollectionUtils.isNotEmpty(detailDto.getFileJson())) {
+                                for (CourseHomeworkWrapper.FileJson fileJson : detailDto.getFileJson()) {
+                                    fileJson.setExpireFlag(expireFlag);
+                                }
+                            }
                             dto.setStudentLessonExaminationDetail(detailDto);
+                            dto.setMemo(detailDto.getMemo());
                         }
                     }
                 }
@@ -171,34 +185,71 @@ public class StudentLessonExaminationServiceImpl extends ServiceImpl<StudentLess
         studentLessonExamination.setTrainingTime(now);
         this.updateById(studentLessonExamination);
         //是否达标
-        if(submitDto.getScore() >= detail.getStandardScore()){
-            detail.setStandardFlag(true);
-        }
-        //训练分数是否比上一次高
-        Boolean flag = submitDto.getScore() > detail.getTrainingScore();
-        if(flag){
-            detail.setTrainingScore(submitDto.getScore());
-            //计算分数
-            Double actualScore = detail.getTrainingScore() * 1D / detail.getStandardScore() * detail.getAvgScore();
-            //更新分数
-            detail.setActualAvgScore(actualScore.intValue() > detail.getAvgScore() ? detail.getAvgScore():actualScore.intValue());
+        if (submitDto.getScore() != null) {
+            if (submitDto.getScore() >= detail.getStandardScore()) {
+                detail.setStandardFlag(true);
+            }
+            //训练分数是否比上一次高
+            Boolean flag = submitDto.getScore() > detail.getTrainingScore();
+            if (flag) {
+                detail.setTrainingScore(submitDto.getScore());
+
+                detail.setRecordId(submitDto.getRecordId());
+                //计算分数
+                Double actualScore = detail.getTrainingScore() * 1D / detail.getStandardScore() * detail.getAvgScore();
+                //更新分数
+                detail.setActualAvgScore(actualScore.intValue() > detail.getAvgScore() ? detail.getAvgScore() : actualScore.intValue());
+            }
+            //更新总分
+            if(flag){
+                baseMapper.updateTrainingScore(lessonExaminationId,userId);
+            }
         }
         //更新详情
         detail.setTrainingTime(now);
+        if (CollectionUtils.isNotEmpty(submitDto.getFileJson())) {
+            for (CourseHomeworkWrapper.FileJson fileJson : submitDto.getFileJson()) {
+                if (fileJson != null) {
+                    fileJson.setExpireFlag(false);
+                }
+            }
+            detail.setFileJson(JSON.toJSONString(submitDto.getFileJson()));
+        }
         studentLessonExaminationDetailService.updateById(detail);
         //更新达标人数
         lessonExaminationDao.updateStandardNum(lessonExaminationId);
-        //更新总分
-        if(flag){
-            baseMapper.updateTrainingScore(lessonExaminationId,userId);
-        }
+
         //更新服务指标
         studentExtracurricularExercisesSituationService.updateLastSubmitTime(lessonExamination,studentLessonExamination);
     }
 
     @Override
     public List<StudentLessonExaminationDto1> queryStudentPage(Long lessonExaminationId,Integer subjectId) {
-        return baseMapper.queryStudentPage(lessonExaminationId,subjectId);
+        List<StudentLessonExaminationDto1> studentLessonExaminationDto1s = baseMapper.queryStudentPage(lessonExaminationId, subjectId);
+        if (CollectionUtils.isEmpty(studentLessonExaminationDto1s)) {
+            return new ArrayList<>();
+        }
+        LessonExamination lessonExamination = lessonExaminationService.getById(lessonExaminationId);
+        if (lessonExamination == null) {
+            throw new BizException("作业信息不存在");
+        }
+        boolean expireFlag = false;
+        if (lessonExamination.getFileExpireDay() != null && lessonExamination.getFileExpireDay() >0) {
+            expireFlag = DateUtil.addDays(lessonExamination.getExpireDate(), lessonExamination.getFileExpireDay()).before(new Date());
+        }
+        for (StudentLessonExaminationDto1 studentLessonExaminationDto1 : studentLessonExaminationDto1s) {
+            if (CollectionUtils.isNotEmpty(studentLessonExaminationDto1.getDetailDtos())) {
+                for (StudentLessonExaminationDetailDto1 detailDto : studentLessonExaminationDto1.getDetailDtos()) {
+                    if (StringUtils.isNotBlank(detailDto.getFileJsons())) {
+                        detailDto.setFileJson(JSON.parseArray(detailDto.getFileJsons(), CourseHomeworkWrapper.FileJson.class));
+                        for (CourseHomeworkWrapper.FileJson e : detailDto.getFileJson()) {
+                            e.setExpireFlag(expireFlag);
+                        }
+                    }
+                }
+            }
+        }
+        return studentLessonExaminationDto1s;
     }
 }
 

+ 22 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonTrainingDetailServiceImpl.java

@@ -64,6 +64,9 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
 
     @Autowired
     private MemberRankCourseTypeMapperService memberRankCourseTypeMapperService;
+
+    @Autowired
+    private StudentCourseHomeworkService studentCourseHomeworkService;
     /**
      * 查询详情
      * @param id 详情ID
@@ -119,6 +122,8 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
         if (group == null) {
             group = 1;
         }
+        // 描述类型的作业
+        Date date = new Date();
 
         List<StudentLessonTrainingDetail> result = JSON.parseArray(JSON.toJSONString(detailList), StudentLessonTrainingDetail.class);
         // 根据声部添加学生作业详情
@@ -129,7 +134,6 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
             }
             result.addAll(detailsUser);
         });
-        Date date = new Date();
         for (StudentLessonTrainingDetail studentLessonTrainingDetail : result) {
             studentLessonTrainingDetail.setCourseHomeworkId(homeworkId);
             studentLessonTrainingDetail.setTrainingTimes(0);
@@ -174,8 +178,17 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
         if (CollectionUtils.isEmpty(list)) {
             return new ArrayList<>();
         }
-        List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails = JSON.parseArray(
-            JSON.toJSONString(list), StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail.class);
+        List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails = list.stream()
+            .map( o->{
+                String fileJson = o.getFileJson();
+                if (StringUtils.isNotEmpty(fileJson)) {
+                    o.setFileJson(null);
+                }
+                StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail = JSON.parseObject(JSON.toJSONString(o), StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail.class);
+                studentLessonTrainingDetail.setFileJson(JSON.parseArray(fileJson, CourseHomeworkWrapper.FileJson.class));
+                return studentLessonTrainingDetail;
+            }).collect(Collectors.toList());
+        studentCourseHomeworkService.studentLessonTrainingDetailFileJsonFormat(type,courseHomeworkId,studentLessonTrainingDetails);
 
         //更新曲目名称
         this.updateMusicScoreName(studentLessonTrainingDetails);
@@ -246,7 +259,7 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
             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")){
+                    if(StringUtils.equals(studentLessonTrainingDetail.getHomeworkType(),"MUSIC_SCORE")){
                         SysMusicScore sysMusicScore = musicScoreMap.get(studentLessonTrainingDetail.getMusicScoreId().intValue());
                         if (sysMusicScore != null) {
                             if(sysMusicScore.getShowFlag() == 1 && sysMusicScore.getDelFlag() == 0){
@@ -502,4 +515,9 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
                                 .collect(Collectors.groupingBy(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail::getGroup,LinkedHashMap::new,Collectors.toList()));
         return groupDetailMap;
     }
+
+    @Override
+    public List<StudentLessonTrainingDetail> queryExpired() {
+        return baseMapper.queryExpired();
+    }
 }

+ 10 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -42,6 +42,7 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 import static com.ym.mec.biz.dal.enums.ComplaintsStatusEnum.REPEAL;
 import static com.ym.mec.biz.dal.enums.SignInStatusEnum.*;
+import static com.ym.mec.biz.service.SysConfigService.HOMEWORK_FILE_EXPIRE_TIME;
 
 @Service
 public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherAttendance>  implements TeacherAttendanceService {
@@ -99,6 +100,9 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
     @Autowired
     private SysMessageConfigDao sysMessageConfigDao;
 
+    @Autowired
+    private  SysConfigDao sysConfigDao;
+
 	@Override
 	public BaseDAO<Long, TeacherAttendance> getDAO() {
 		return teacherAttendanceDao;
@@ -316,9 +320,6 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
                             "SCHOOL",musicGroup.getName(),user.getRealName(),courseTime,courseSchedule.getName());
                 }
             }
-
-
-
 			return result;
 		}else if(teacherAttendance.getSignOutTime() == null && teacherSignOutDto.getTeacherAttendanceInfo().getStatus().equals(SignStatusEnum.SIGN_OUT.getCode())){
 			int i = studentAttendanceDao.countByCourseSchedule(courseSchedule.getId());
@@ -397,6 +398,12 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
                             .withHour(21).withMinute(0).withSecond(0).withNano(0);
 					courseHomework.setExpiryDate(Date.from(localDateTime.atZone(DateUtil.zoneId).toInstant()));
 
+                    String fileExpireTime = sysConfigDao.findConfigValue(HOMEWORK_FILE_EXPIRE_TIME);
+                    if (StringUtils.isNotBlank(fileExpireTime)) {
+                        int fileExpireTimeInt = Integer.parseInt(fileExpireTime);
+                        courseHomework.setFileExpireDay(fileExpireTimeInt==0?null:fileExpireTimeInt);
+                    }
+
 					courseHomeworkService.insert(courseHomework);
 					List<StudentCourseHomework> studentCourseHomeworks = new ArrayList<>();
 

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

@@ -66,10 +66,10 @@
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.CourseHomework" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO course_homework (group_type_,course_schedule_id_,attachments_,
 		                             title_,content_,create_time_,update_time_,music_group_id_,
-		                             class_group_id_,completed_num_,expect_num_,expiry_date_,tenant_id_)
+		                             class_group_id_,completed_num_,expect_num_,expiry_date_,tenant_id_,file_expire_day_)
 		VALUES(#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
 		       #{courseScheduleId},#{attachments},#{title},#{content},now(),now(),#{musicGroupId},
-		       #{classGroupId},#{completedNum},#{expectNum},#{expiryDate},#{tenantId})
+		       #{classGroupId},#{completedNum},#{expectNum},#{expiryDate},#{tenantId},#{fileExpireDay})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -109,6 +109,9 @@
             <if test="versionTag != null">
                 version_tag_ = #{versionTag},
             </if>
+            <if test="fileExpireDay != null">
+                file_expire_day_ = #{fileExpireDay},
+            </if>
 			update_time_ = NOW()
 		</set>
 		WHERE id_ = #{id} and tenant_id_ = #{tenantId}

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

@@ -4420,7 +4420,8 @@
         ch.expiry_date_ as expiryDate,
         ch.completed_num_ as finishNum,
         cs.name_ as courseScheduleName,
-        ch.expect_num_ as studentNum
+        ch.expect_num_ as studentNum,
+        ch.file_expire_day_ as fileExpireDay
         from course_schedule cs
         left join course_homework ch on cs.id_ = ch.course_schedule_id_
         <include refid="selectPage"/>

+ 8 - 5
mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesMapper.xml

@@ -31,6 +31,7 @@
 		<result column="type" property="type" />
 		<result column="push_flag_" property="pushFlag" />
 		<result column="group_type_" property="groupType" />
+		<result column="file_expire_day_" property="fileExpireDay" />
 	</resultMap>
 
 	<sql id="queryPageCondition">
@@ -100,9 +101,9 @@
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.ExtracurricularExercises" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO extracurricular_exercises (music_group_id_,teacher_id_,student_id_list_,batch_no_,
 		                                       title_,attachments_,content_,expire_date_,completed_num_,expect_num_,
-		                                       create_time_,update_time_,tenant_id_,group_type_)
+		                                       create_time_,update_time_,tenant_id_,group_type_,file_expire_day_)
 		VALUES(#{musicGroupId},#{teacherId},#{studentIdList},#{batchNo},#{title},#{attachments},
-		       #{content},#{expireDate},#{completedNum},#{expectNum},NOW(), NOW(),#{tenantId},#{groupType})
+		       #{content},#{expireDate},#{completedNum},#{expectNum},NOW(), NOW(),#{tenantId},#{groupType},#{fileExpireDay})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -156,7 +157,7 @@
 		SELECT ee.id_,ee.teacher_id_,ee.student_id_list_,ee.group_type_ as type,ee.batch_no_,ee.title_,ee.attachments_,ee.music_group_id_,
 		       ee.content_,ee.expire_date_,ee.completed_num_,ee.expect_num_,ee.create_time_,ee.update_time_,ee.tenant_id_
 		     ,u.real_name_ username_,o.name_ organ_name_,eer.music_score_id_,ee.create_time_ as assignTime,
-		      mg.name_ as musicGroupName,ee.class_group_id_ as classGroupId,ee.version_tag_ as versionTag
+		      mg.name_ as musicGroupName,ee.class_group_id_ as classGroupId,ee.version_tag_ as versionTag,ee.file_expire_day_
 		FROM extracurricular_exercises ee LEFT JOIN sys_user u ON ee.teacher_id_ = u.id_
 		LEFT JOIN teacher t ON t.id_ = ee.teacher_id_
         left join sys_user su on t.id_ = su.id_
@@ -405,7 +406,8 @@
             null as assignTime,
             null as expiryDate,
             null as studentIdList,
-            null as teacherId
+            null as teacherId,
+            null as fileExpireDay
             from music_group
             where id_ in
             <foreach collection="subjectIds" item="item" separator="," open="(" close=")">
@@ -426,7 +428,8 @@
         create_time_ as assignTime,
         expire_date_ as expiryDate,
         student_id_list_ as studentIdList,
-        teacher_id_ as teacherId
+        teacher_id_ as teacherId,
+        file_expire_day_ as fileExpireDay
         from extracurricular_exercises
         <where>
 

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

@@ -696,7 +696,31 @@
 
     <select id="findByStudentIdsAndCourseScheduleId"
             resultType="com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper$StudentLessonTrainingDetail">
-        SELECT s.*,s2.name_ as subjectName from student_lesson_training_detail s
+        SELECT s.id_,
+               s.user_id_,
+               s.course_homework_id_,
+               s.music_score_id_,
+               s.music_score_name_,
+               s.homework_type_,
+               s.start_,
+               s.end_,
+               s.subject_id_,
+               s.type_,
+               s.group_,
+               s.part_index_,
+               s.training_speed_,
+               s.training_times_,
+               s.training_status_,
+               s.times_,
+               s.memo_,
+               s.create_time_,
+               s.update_time_,
+               s.lesson_courseware_id_,
+               s.desc_,
+               s.file_json_ as fileJsons,
+               s.file_del_flag_,
+               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=",">

+ 10 - 4
mec-biz/src/main/resources/config/mybatis/StudentLessonExaminationDetailMapper.xml

@@ -20,23 +20,29 @@
         <result column="group_" property="group"/>
         <result column="create_time_" property="createTime"/>
         <result column="update_time_" property="updateTime"/>
+        <result column="homework_type_" property="homeworkType"/>
+        <result column="desc_" property="desc"/>
+        <result column="file_json_" property="fileJson"/>
+        <result column="file_del_flag_" property="fileDelFlag"/>
     </resultMap>
 
     <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
             parameterType="com.ym.mec.biz.dal.entity.StudentLessonExaminationDetail">
         insert into student_lesson_examination_detail(user_id_, lesson_examination_id_, music_score_id_, heard_level_,standard_score_,
-                                                      avg_score_, part_index_,start_,end_,memo_,group_)
+                                                      avg_score_, part_index_,start_,end_,memo_,group_,homework_type_,desc_,file_json_)
         values
         <foreach collection="entities" item="entity" separator=",">
-            (#{entity.userId}, #{entity.lessonExaminationId},#{entity.musicScoreId}, #{entity.heardLevel,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-             #{entity.standardScore}, #{entity.avgScore},#{entity.partIndex},#{entity.start},#{entity.end},#{entity.memo},#{entity.group})
+            (#{entity.userId}, #{entity.lessonExaminationId},#{entity.musicScoreId},
+            #{entity.heardLevel,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            #{entity.standardScore},
+            #{entity.avgScore},#{entity.partIndex},#{entity.start},#{entity.end},#{entity.memo},#{entity.group},#{entity.homeworkType},#{entity.desc},#{entity.fileJson})
         </foreach>
     </insert>
     <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,
-               sms.del_flag_ = 0 AND sms.show_flag_ = 1 validFlag,sled.memo_ memo,sled.group_ 'group'
+               sms.del_flag_ = 0 AND sms.show_flag_ = 1 validFlag,sled.memo_ memo,sled.group_ 'group',sled.homework_type_ homeworkType,sled.desc_ 'desc',sled.file_json_ fileJsons
         from student_lesson_examination_detail sled
         left join sys_music_score sms ON sms.id_ = sled.music_score_id_
         <where>

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

@@ -83,13 +83,16 @@
             <result property="avgScore" column="avg_score_"/>
             <result property="musicScoreName" column="musicScoreName"/>
             <result property="memo" column="memo_"/>
+            <result property="homeworkType" column="type"/>
+            <result property="fileJsons" column="file_json_"/>
+            <result property="desc" column="desc_"/>
             <result property="heardLevel" column="heard_level_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         </collection>
     </resultMap>
     <select id="queryStudentPage" resultMap="StudentLessonExaminationDtoMap">
         select sle.user_id_,su.username_,su.phone_,sb.name_ subjectName,sle.training_score_ trainingScore,
                sms.name_ musicScoreName,sled.actual_avg_score_,sled.standard_score_,sled.training_score_,
-               sled.avg_score_,sled.heard_level_,sle.training_time_,sle.group_,sled.memo_
+               sled.avg_score_,sled.heard_level_,sle.training_time_,sle.group_,sled.memo_,sled.homework_type_ as type,sled.file_json_,sled.desc_
         from student_lesson_examination sle
         left join student_lesson_examination_detail sled ON sled.lesson_examination_id_ = sle.lesson_examination_id_ AND sled.user_id_ = sle.user_id_
         left join sys_music_score sms ON sms.id_ = sled.music_score_id_
@@ -124,4 +127,12 @@
         left join lesson_examination le ON sle.lesson_examination_id_ = le.id_
         where sle.training_flag_ = false AND DATE_FORMAT(expire_date_,'%Y-%m-%d') = #{date}
     </select>
+
+    <select id="queryExpired" resultType="com.ym.mec.biz.dal.entity.StudentLessonExaminationDetail">
+
+        select t1.* from lesson_examination t
+        left join student_lesson_examination_detail t1 on t.id_ = t1.lesson_examination_id_
+        where t.expire_date_ is not null and t.file_expire_day_ is not null and t.file_expire_day_ >0
+          and date_add(t.expire_date_,interval t.file_expire_day_ day) &lt; now() and t1.file_del_flag_=0 and t1.file_json_ is not null
+    </select>
 </mapper>

+ 11 - 0
mec-biz/src/main/resources/config/mybatis/StudentLessonTrainingDetailMapper.xml

@@ -2,4 +2,15 @@
 <!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.ym.mec.biz.dal.dao.StudentLessonTrainingDetailMapper">
 
+    <select id="queryExpired" resultType="com.ym.mec.biz.dal.entity.StudentLessonTrainingDetail">
+        select b.* from (select t.id_,'HOMEWORK' as type from  course_homework t
+        where t.expiry_date_ is not null and t.file_expire_day_ is not null and t.file_expire_day_ >0
+            and date_add(t.expiry_date_,interval t.file_expire_day_ day) &lt; now()
+        union all
+        select t.id_,t.group_type_ as type from extracurricular_exercises t
+        where t.expire_date_ is not null and t.file_expire_day_ is not null and t.file_expire_day_ >0
+          and date_add(t.expire_date_,interval t.file_expire_day_ day) &lt; now()) a
+        left join student_lesson_training_detail b on b.course_homework_id_ = a.id_ and b.type_ = a.type
+        where b.file_del_flag_=0 and b.file_json_ is not null
+    </select>
 </mapper>

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

@@ -58,12 +58,12 @@
 		INSERT INTO sys_music_compare_record (id_,user_id_,sys_music_score_id_,heard_level_,behavior_id_,score_data_,score_,intonation_,cadence_,integrity_,
 		                                      record_file_path_,video_file_path_,device_type_,client_id_,play_time_,speed_,monday_,
 												source_time_,feature_,create_time_,create_date_,update_time_,part_index_,tenant_id_,subject_id_,
-        custom_configuration_,practice_time_,practice_source_,result_analyze_,headphone_flag_,instrument_id_,hidden_flag_,del_flag_,play_rate_)
+        custom_configuration_,practice_time_,practice_source_,result_analyze_,headphone_flag_,instrument_id_,hidden_flag_,del_flag_,play_rate_,lesson_detail_id_)
 		VALUES(#{id},#{userId},#{sysMusicScoreId},#{heardLevel,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{behaviorId},#{scoreData},
 		       #{score},#{intonation},#{cadence},#{integrity},
 		       #{recordFilePath},#{videoFilePath},#{deviceType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{clientId},#{playTime},#{speed},#{monday},
 		       #{sourceTime},#{feature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{createTime}, #{createDate}, NOW(),#{partIndex},#{tenantId},#{subjectId}
-            ,#{customConfiguration},#{practiceTime},#{practiceSource},#{resultAnalyze},#{headphoneFlag},#{instrumentId},#{hiddenFlag},#{delFlag},#{playRate})
+            ,#{customConfiguration},#{practiceTime},#{practiceSource},#{resultAnalyze},#{headphoneFlag},#{instrumentId},#{hiddenFlag},#{delFlag},#{playRate},#{lessonDetailId})
 	</insert>
 	<insert id="init">
 		insert into sys_music_compare_day_data (user_id_, day_, train_num_, train_time_, tenant_id_)

+ 7 - 0
mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java

@@ -324,4 +324,11 @@ public interface TaskRemoteService {
     @GetMapping("/task/workOverdue")
     void workOverdue();
 
+
+    /**
+     * 删除过期作业
+     */
+    @GetMapping("/task/deleteOverdueHomework")
+    void deleteOverdueHomework();
+
 }

+ 8 - 0
mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java

@@ -373,4 +373,12 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
     public void workOverdue() {
         logger.error("作品过期设置失败");
     }
+
+    /**
+     * 删除过期作业
+     */
+    @Override
+    public void deleteOverdueHomework() {
+        logger.error("删除过期作业失败");
+    }
 }

+ 21 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/DeleteOverdueHomeworkTask.java

@@ -0,0 +1,21 @@
+package com.ym.mec.task.jobs;
+
+import com.ym.mec.task.TaskRemoteService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DeleteOverdueHomeworkTask extends BaseTask {
+
+    @Autowired
+    private TaskRemoteService taskRemoteService;
+
+    @Override
+    public void execute() throws TaskException {
+        taskRemoteService.deleteOverdueHomework();
+    }
+
+}
+