Преглед на файлове

Merge branch 'feature/0529-live' of http://git.dayaedu.com/yonge/mec into feature/0529-live

liujc преди 2 години
родител
ревизия
301d5c1d3a
променени са 55 файла, в които са добавени 1363 реда и са изтрити 1298 реда
  1. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentOperatingVisitDao.java
  2. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentVisitDao.java
  3. 52 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkWrapper.java
  4. 4 175
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleEndDto.java
  5. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicScoreSubjectDto.java
  6. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationSaveDto.java
  7. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonTrainingDetailWrapper.java
  8. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonExaminationDetail.java
  9. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentLessonTrainingDetail.java
  10. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrderDetail.java
  11. 4 144
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentVisit.java
  12. 12 7
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/CouponDetailTypeEnum.java
  13. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TemplateTypeEnum.java
  14. 4 263
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/EndCourseScheduleQueryInfo.java
  15. 21 3
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentLessonTrainingDetailService.java
  16. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentVisitService.java
  17. 16 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseHomeworkServiceImpl.java
  18. 33 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  19. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  20. 30 14
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java
  21. 239 220
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java
  22. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexErrDataRecordServiceImpl.java
  23. 32 124
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  24. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrderPayOpsServiceImpl.java
  25. 7 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  26. 4 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  27. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonExaminationDetailServiceImpl.java
  28. 29 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonExaminationServiceImpl.java
  29. 191 31
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonTrainingDetailServiceImpl.java
  30. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  31. 6 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  32. 157 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentVisitServiceImpl.java
  33. 22 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  34. 4 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  35. 2 2
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  36. 30 36
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  37. 7 3
      mec-biz/src/main/resources/config/mybatis/StudentCourseHomeworkMapper.xml
  38. 1 1
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  39. 12 6
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  40. 7 0
      mec-biz/src/main/resources/config/mybatis/StudentOperatingVisitMapper.xml
  41. 1 1
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  42. 20 1
      mec-biz/src/main/resources/config/mybatis/StudentVisitMapper.xml
  43. 2 2
      mec-biz/src/main/resources/config/mybatis/SubjectMapper.xml
  44. 1 1
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  45. 2 2
      mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java
  46. 177 197
      mec-common/common-core/src/main/java/com/ym/mec/common/service/impl/BaseServiceImpl.java
  47. 51 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/CourseHomeworkController.java
  48. 37 8
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherController.java
  49. 1 0
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/Payment.java
  50. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java
  51. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  52. 16 0
      mec-web/src/main/java/com/ym/mec/web/controller/ImportController.java
  53. 14 5
      mec-web/src/main/java/com/ym/mec/web/controller/TeacherController.java
  54. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/VisitController.java
  55. 9 1
      mec-web/src/main/resources/columnMapper.ini

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

@@ -16,6 +16,8 @@ public interface StudentOperatingVisitDao extends BaseDAO<Long, StudentOperating
     */
     void updateVisit(@Param("studentId") Integer studentId, @Param("month") String month);
 
+    void batchUpdateVisit(@Param("studentIds") List<Integer> studentIds, @Param("month") String month);
+
     void deleteByUserId(@Param("month") String month);
 
     void batchAdd(@Param("userIds") List<Integer> userIds, @Param("month") String month);

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentVisitDao.java

@@ -62,6 +62,15 @@ public interface StudentVisitDao extends BaseDAO<Integer, StudentVisit> {
     List<Integer> getMusicGroupVisitStudent(@Param("musicGroupId") String musicGroupId, @Param("studentIds") List<Integer> studentIds);
 
     /**
+     * 获取乐团回访的学生
+     *
+     * @param musicGroupId
+     * @param studentId
+     * @return
+     */
+    Integer getMusicVisitStudent(@Param("musicGroupId") String musicGroupId, @Param("studentId") Integer studentId);
+
+    /**
      * 获取老师时间段的回访次数
      *
      * @param teacherIds
@@ -92,4 +101,6 @@ public interface StudentVisitDao extends BaseDAO<Integer, StudentVisit> {
     int countWaitVisit(Map<String, Object> params);
 
     List<StudentPreVisitDto> queryWaitVisit(Map<String, Object> params);
+
+    void batchInsert(@Param("studentVisit") List<StudentVisit> studentVisit);
 }

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.auth.api.entity.SysUser;
+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;
@@ -146,6 +147,38 @@ public class CourseHomeworkWrapper {
 
         private String studentIdList;
 
+
+        @ApiModelProperty("练习内容")
+        private List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> trainingDetailList;
+
+        @ApiModelProperty("练习组内容")
+        private List<StudentLessonTrainingStat> trainingGroupList;
+    }
+
+
+    @Data
+    @ApiModel(value = "StudentLessonTrainingStat-练习组统计")
+    public static class StudentLessonTrainingStat {
+
+        @ApiModelProperty("练习组")
+        private Integer group;
+
+        @ApiModelProperty("声部名 逗号隔开")
+        private String subjectName;
+
+        @ApiModelProperty("练习组人数")
+        private Integer studentNum;
+
+        @ApiModelProperty("应提交人数")
+        private Integer shouldSubmitNum;
+
+        @ApiModelProperty("提交人数")
+        private Integer submitNum;
+
+        @ApiModelProperty("达标人数")
+        private Integer passNum;
+
+
         @ApiModelProperty("练习内容")
         private List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> trainingDetailList;
     }
@@ -335,4 +368,23 @@ public class CourseHomeworkWrapper {
     }
 
 
+
+
+    @Data
+    @ApiModel(value = "StudentHomeworkRecordStat-学生作业记录统计")
+    public static class StudentHomeworkRecordStat {
+
+        @ApiModelProperty(value = "全部")
+        private Integer allNum;
+
+        @ApiModelProperty(value = "已完成")
+        private Integer finishNum;
+
+        @ApiModelProperty(value = "未完成")
+        private Integer unFinishNum;
+
+        @ApiModelProperty(value = "列表")
+        private  List<StudentCourseHomework> studentCourseHomeworkList;
+
+    }
 }

+ 4 - 175
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleEndDto.java

@@ -6,6 +6,7 @@ import com.ym.mec.biz.dal.enums.SignInStatusEnum;
 import com.ym.mec.biz.dal.enums.SignOutStatusEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.util.Date;
 
@@ -13,6 +14,7 @@ import java.util.Date;
  * @Author Joburgess
  * @Date 2019/12/27
  */
+@Data
 public class CourseScheduleEndDto extends CourseSchedule {
 
     private String groupName;
@@ -61,179 +63,6 @@ public class CourseScheduleEndDto extends CourseSchedule {
     @ApiModelProperty(value = "被合并的课程ids,多个,分割")
     private String mergedCourseIds;
 
-    public Date getGenerateTime() {
-        return generateTime;
-    }
-
-    public void setGenerateTime(Date generateTime) {
-        this.generateTime = generateTime;
-    }
-
-    public Date getDealTime() {
-        return dealTime;
-    }
-
-    public void setDealTime(Date dealTime) {
-        this.dealTime = dealTime;
-    }
-
-    public String getEducationTeacherName() {
-        return educationTeacherName;
-    }
-
-    public void setEducationTeacherName(String educationTeacherName) {
-        this.educationTeacherName = educationTeacherName;
-    }
-
-    public boolean getBeMerged() {
-        return beMerged;
-    }
-
-    public void setBeMerged(boolean beMerged) {
-        this.beMerged = beMerged;
-    }
-
-    public PracticeGroup getPracticeGroup() {
-        return practiceGroup;
-    }
-
-    public void setPracticeGroup(PracticeGroup practiceGroup) {
-        this.practiceGroup = practiceGroup;
-    }
-
-    public String getSettlementTime() {
-        return settlementTime;
-    }
-
-    public void setSettlementTime(String settlementTime) {
-        this.settlementTime = settlementTime;
-    }
-
-    public SignInStatusEnum getSignInStatusEnum() {
-        return signInStatusEnum;
-    }
-
-    public void setSignInStatusEnum(SignInStatusEnum signInStatusEnum) {
-        this.signInStatusEnum = signInStatusEnum;
-    }
-
-    public SignOutStatusEnum getSignOutStatusEnum() {
-        return signOutStatusEnum;
-    }
-
-    public void setSignOutStatusEnum(SignOutStatusEnum signOutStatusEnum) {
-        this.signOutStatusEnum = signOutStatusEnum;
-    }
-
-    public String getStudentId() {
-        return studentId;
-    }
-
-    public void setStudentId(String studentId) {
-        this.studentId = studentId;
-    }
-
-    public String getSubjectName() {
-        return subjectName;
-    }
-
-    public void setSubjectName(String subjectName) {
-        this.subjectName = subjectName;
-    }
-
-    public String getRemark() {
-        return remark;
-    }
-
-    public void setRemark(String remark) {
-        this.remark = remark;
-    }
-
-    public Date getSignInTime() {
-        return signInTime;
-    }
-
-    public void setSignInTime(Date signInTime) {
-        this.signInTime = signInTime;
-    }
-
-    public Date getSignOutTime() {
-        return signOutTime;
-    }
-
-    public void setSignOutTime(Date signOutTime) {
-        this.signOutTime = signOutTime;
-    }
-
-    public int getIsSignIn() {
-        return isSignIn;
-    }
-
-    public void setIsSignIn(int isSignIn) {
-        this.isSignIn = isSignIn;
-    }
-
-    public int getIsSignOut() {
-        return isSignOut;
-    }
-
-    public void setIsSignOut(int isSignOut) {
-        this.isSignOut = isSignOut;
-    }
-
-    public YesOrNoEnum getIsCallNames() {
-        return isCallNames;
-    }
-
-    public void setIsCallNames(YesOrNoEnum isCallNames) {
-        this.isCallNames = isCallNames;
-    }
-
-    public String getOrganName() {
-        return organName;
-    }
-
-    public void setOrganName(String organName) {
-        this.organName = organName;
-    }
-
-    public String getTeacherName() {
-        return teacherName;
-    }
-
-    public void setTeacherName(String teacherName) {
-        this.teacherName = teacherName;
-    }
-
-    public String getGroupName() {
-        return groupName;
-    }
-
-    public void setGroupName(String groupName) {
-        this.groupName = groupName;
-    }
-
-	public String getIsComplaints() {
-		return isComplaints;
-	}
-
-	public void setIsComplaints(String isComplaints) {
-		this.isComplaints = isComplaints;
-	}
-
-    public String getCooperationOrgan() {
-        return cooperationOrgan;
-    }
-
-    public void setCooperationOrgan(String cooperationOrgan) {
-        this.cooperationOrgan = cooperationOrgan;
-    }
-
-    public String getMergedCourseIds() {
-        return mergedCourseIds;
-    }
-
-    public void setMergedCourseIds(String mergedCourseIds) {
-        this.mergedCourseIds = mergedCourseIds;
-    }
+    @ApiModelProperty(value = "助教老师姓名")
+    private String teachingUserNames;
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicScoreSubjectDto.java

@@ -12,6 +12,10 @@ public class MusicScoreSubjectDto {
     @ApiModelProperty(value = "学员编号",required = false)
     private List<Integer> userIdList;
 
+
+    @ApiModelProperty(value = "分组号")
+    private Integer group;
+
     @ApiModelProperty(value = "曲目编号(兼容旧数据)",required = false)
     private List<Integer> musicScoreIdList;
 
@@ -61,4 +65,12 @@ public class MusicScoreSubjectDto {
     public void setMusicScoreIdList(List<Integer> musicScoreIdList) {
         this.musicScoreIdList = musicScoreIdList;
     }
+
+    public Integer getGroup() {
+        return group;
+    }
+
+    public void setGroup(Integer group) {
+        this.group = group;
+    }
 }

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonExaminationSaveDto.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;
 
@@ -20,6 +21,10 @@ public class StudentLessonExaminationSaveDto {
     @ApiModelProperty(value = "声部")
     private Integer subjectId;
 
+
+    @ApiModelProperty("作业分组")
+    private Integer group;
+
     @ApiModelProperty(value = "作业内容")
     private List<LessonExaminationDetailDto> examinationDetailDtos;
 }

+ 23 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLessonTrainingDetailWrapper.java

@@ -82,6 +82,10 @@ public class StudentLessonTrainingDetailWrapper {
 
         @ApiModelProperty("声部名称")
         private String subjectName;
+
+
+        @ApiModelProperty("作业分组")
+        private Integer group;
         
         public String jsonString() {
             return JSON.toJSONString(this);
@@ -115,6 +119,25 @@ public class StudentLessonTrainingDetailWrapper {
 	}
 
 
+    @Data
+    @ApiModel(" HomeworkGroupInfoQuery-作业内容查询")
+    public static class HomeworkGroupInfoQuery {
+
+
+        @ApiModelProperty(value = "课程编号",required = true)
+        @NotNull(message = "课程编号不能为空")
+        private Integer courseScheduleId;
+
+        @ApiModelProperty(value = "作业类型 来源(HOMEWORK,EXTRACURRICULAR,EXTRA)",required = true)
+        @NotNull(message = "作业类型不能为空")
+        private ELessonTrainingType type;
+
+        @ApiModelProperty(value = "组号",required = true)
+        @NotNull(message = "组号不能为空")
+        private Integer group;
+
+    }
+
 
     @Data
     @ApiModel(" StudentLessonTraining-学生练习内容查询对象")

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

@@ -38,6 +38,10 @@ public class StudentLessonExaminationDetail implements Serializable {
     @ApiModelProperty(value = "曲目id")
     private Long musicScoreId;
 
+    @ApiModelProperty("作业分组")
+    @TableField(value = "group_")
+    private Integer group;
+
     @TableField("heard_level_")
     @ApiModelProperty(value = "评测难度")
     private HardLevelEnum heardLevel;

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

@@ -36,6 +36,12 @@ 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;

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrderDetail.java

@@ -1,12 +1,14 @@
 package com.ym.mec.biz.dal.entity;
 
 import com.ym.mec.biz.dal.dto.CloudTeacherOrderDto;
+import com.ym.mec.biz.dal.enums.CouponDetailTypeEnum;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
 import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.common.entity.BaseEntity;
 
 import io.swagger.annotations.ApiModelProperty;
 
+import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.math.BigDecimal;
@@ -15,6 +17,7 @@ import java.util.List;
 /**
  * 对应数据库表(student_payment_order_detail):
  */
+@Data
 public class StudentPaymentOrderDetail extends BaseEntity {
 
 	/**  */
@@ -78,6 +81,16 @@ public class StudentPaymentOrderDetail extends BaseEntity {
 	
 	private String deliveryBatchNo;//发货批次
 
+	private CouponDetailTypeEnum couponDetailTypeEnum;
+
+	public CouponDetailTypeEnum getCouponDetailTypeEnum() {
+		return couponDetailTypeEnum;
+	}
+
+	public void setCouponDetailTypeEnum(CouponDetailTypeEnum couponDetailTypeEnum) {
+		this.couponDetailTypeEnum = couponDetailTypeEnum;
+	}
+
 	public Integer getUserId() {
 		return userId;
 	}

+ 4 - 144
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentVisit.java

@@ -4,12 +4,14 @@ import com.ym.mec.biz.dal.enums.TeachModeEnum;
 import com.ym.mec.common.entity.BaseEntity;
 import com.ym.mec.common.enums.BaseEnum;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.PastOrPresent;
 import javax.validation.constraints.Positive;
 import java.util.Date;
 
+@Data
 public class StudentVisit extends BaseEntity {
 
     public enum VisiterTypeEnum implements BaseEnum<String, TeachModeEnum> {
@@ -130,6 +132,8 @@ public class StudentVisit extends BaseEntity {
     @Positive(message = "学生id必须大于0")
     private Integer studentId;
 
+    private String phone;
+
     /**
      * 老师id
      */
@@ -201,148 +205,4 @@ public class StudentVisit extends BaseEntity {
 
     @ApiModelProperty(value = "回访图片", required = true)
     private String attachments;
-
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    public String getMusicGroupId() {
-        return musicGroupId;
-    }
-
-    public void setMusicGroupId(String musicGroupId) {
-        this.musicGroupId = musicGroupId;
-    }
-
-    public Integer getOrganId() {
-        return organId;
-    }
-
-    public void setOrganId(Integer organId) {
-        this.organId = organId;
-    }
-
-    public Integer getStudentId() {
-        return studentId;
-    }
-
-    public void setStudentId(Integer studentId) {
-        this.studentId = studentId;
-    }
-
-    public Integer getTeacherId() {
-        return teacherId;
-    }
-
-    public void setTeacherId(Integer teacherId) {
-        this.teacherId = teacherId;
-    }
-
-    public VisiterTypeEnum getVisiterType() {
-        return visiterType;
-    }
-
-    public void setVisiterType(VisiterTypeEnum visiterType) {
-        this.visiterType = visiterType;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getPurpose() {
-        return purpose;
-    }
-
-    public void setPurpose(String purpose) {
-        this.purpose = purpose;
-    }
-
-    public String getOverview() {
-        return overview;
-    }
-
-    public void setOverview(String overview) {
-        this.overview = overview;
-    }
-
-    public FeedbackTypeEnum getFeedbackType() {
-        return feedbackType;
-    }
-
-    public void setFeedbackType(FeedbackTypeEnum feedbackType) {
-        this.feedbackType = feedbackType;
-    }
-
-    public FeedbackTypeDescEnum getFeedbackTypeDesc() {
-        return feedbackTypeDesc;
-    }
-
-    public void setFeedbackTypeDesc(FeedbackTypeDescEnum feedbackTypeDesc) {
-        this.feedbackTypeDesc = feedbackTypeDesc;
-    }
-
-    public String getFeedback() {
-        return feedback;
-    }
-
-    public void setFeedback(String feedback) {
-        this.feedback = feedback;
-    }
-
-    public Date getVisitTime() {
-        return visitTime;
-    }
-
-    public void setVisitTime(Date visitTime) {
-        this.visitTime = visitTime;
-    }
-
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
-    public Long getObjectId() {
-        return objectId;
-    }
-
-    public void setObjectId(Long objectId) {
-        this.objectId = objectId;
-    }
-
-    public Integer getProbStatus() {
-        return probStatus;
-    }
-
-    public void setProbStatus(Integer probStatus) {
-        this.probStatus = probStatus;
-    }
-
-    public String getVisitCyCle() {
-        return visitCyCle;
-    }
-
-    public void setVisitCyCle(String visitCyCle) {
-        this.visitCyCle = visitCyCle;
-    }
-
-    public String getAttachments() {
-        return attachments;
-    }
-
-    public void setAttachments(String attachments) {
-        this.attachments = attachments;
-    }
 }

+ 12 - 7
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/CouponDetailTypeEnum.java

@@ -30,9 +30,7 @@ public enum CouponDetailTypeEnum implements BaseEnum<String, CouponDetailTypeEnu
     //网管课
     PRACTICE("PRACTICE", "网管课"),
     //声部课 = 单技课 SINGLE、集训单技课 TRAINING_SINGLE
-    SINGLE("SINGLE", "声部课"),
-    //合奏课 = 合奏课 MIX、集训合奏课 TRAINING_MIX ,
-    MIX("MIX", "合奏课"),
+    MUSIC("MUSIC", "乐团课"),
     //VIP = vip课 VIP +乐理课 THEORY_COURSE
     VIP("VIP", "VIP"),
     //会员开通,团练宝   CLOUD_TEACHER  CLOUD_TEACHER_PLUS
@@ -92,15 +90,22 @@ public enum CouponDetailTypeEnum implements BaseEnum<String, CouponDetailTypeEnu
         switch (code) {
             case "INSTRUMENT":
                 return MUSICAL.getCode();
-            case "TRAINING_SINGLE":
-                return SINGLE.getCode();
             case "THEORY_COURSE":
                 return VIP.getCode();
-            case "TRAINING_MIX":
-                return MIX.getCode();
             case "CLOUD_TEACHER":
             case "CLOUD_TEACHER_PLUS":
                 return MEMBER.getCode();
+            case "MIX":
+            case "SINGLE":
+            case "TRAINING_MIX":
+            case "TRAINING_SINGLE":
+            case "HIGH":
+            case "COMPREHENSIVE":
+            case "ENLIGHTENMENT":
+            case "CLASSROOM":
+            case "HIGH_ONLINE":
+            case "MUSIC_NETWORK":
+                return MUSIC.getCode();
             default:
                 return null;
         }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TemplateTypeEnum.java

@@ -14,6 +14,7 @@ public enum TemplateTypeEnum implements BaseEnum<String, TemplateTypeEnum> {
     LIVE_ROOM_PURVIEW_USER("LIVE_ROOM_PURVIEW_USER", "直播间用户观看权限表"),
     ADDITIONAL_IMPORT("ADDITIONAL_IMPORT", "经营报表额外的收支导入"),
     MUSIC_GROUP_PAYMENT_IMPORT("MUSIC_GROUP_PAYMENT_IMPORT", "缴费项目外部订单导入"),
+    PAYMENT_MUSIC_VISIT_IMPORT("PAYMENT_MUSIC_VISIT_IMPORT", "缴费中乐团批量回访"),
     ;
 
     private String code;

+ 4 - 263
mec-biz/src/main/java/com/ym/mec/biz/dal/page/EndCourseScheduleQueryInfo.java

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.common.page.QueryInfo;
 
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.util.Date;
 
@@ -12,6 +13,7 @@ import java.util.Date;
  * @Author Joburgess
  * @Date 2019/12/27
  */
+@Data
 public class EndCourseScheduleQueryInfo extends QueryInfo {
 
     @ApiModelProperty(value = "部门编号列表")
@@ -106,267 +108,6 @@ public class EndCourseScheduleQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "是否云教练课程")
     private Integer memberFlag;
 
-    public Integer getStudentId() {
-        return studentId;
-    }
-
-    public void setStudentId(Integer studentId) {
-        this.studentId = studentId;
-    }
-
-    public Integer getMemberFlag() {
-        return memberFlag;
-    }
-
-    public void setMemberFlag(Integer memberFlag) {
-        this.memberFlag = memberFlag;
-    }
-
-    public Integer getEducationUserId() {
-        return educationUserId;
-    }
-
-    public void setEducationUserId(Integer educationUserId) {
-        this.educationUserId = educationUserId;
-    }
-
-    public Boolean getHasDealTime() {
-        return hasDealTime;
-    }
-
-    public void setHasDealTime(Boolean hasDealTime) {
-        this.hasDealTime = hasDealTime;
-    }
-
-    public Long getCourseIdSearch() {
-        return courseIdSearch;
-    }
-
-    public void setCourseIdSearch(Long courseIdSearch) {
-        this.courseIdSearch = courseIdSearch;
-    }
-
-    public String getSearchType() {
-        return searchType;
-    }
-
-    public void setSearchType(String searchType) {
-        this.searchType = searchType;
-    }
-
-    public String getMergeCourseType() {
-        return mergeCourseType;
-    }
-
-    public void setMergeCourseType(String mergeCourseType) {
-        this.mergeCourseType = mergeCourseType;
-    }
-
-    public TeachModeEnum getTeachMode() {
-        return teachMode;
-    }
-
-    public void setTeachMode(TeachModeEnum teachMode) {
-        this.teachMode = teachMode;
-    }
-
-    public Integer getIsCallNames() {
-        return isCallNames;
-    }
-
-    public void setIsCallNames(Integer isCallNames) {
-        this.isCallNames = isCallNames;
-    }
-
-    public boolean getIsExport() {
-        return isExport;
-    }
-
-    public void setIsExport(boolean export) {
-        isExport = export;
-    }
-
-    public Integer getSchoolId() {
-        return schoolId;
-    }
-
-    public void setSchoolId(Integer schoolId) {
-        this.schoolId = schoolId;
-    }
-
-    public String getStudentName() {
-        return studentName;
-    }
-
-    public void setStudentName(String studentName) {
-        this.studentName = studentName;
-    }
-
-    public String getTeacherName() {
-        return teacherName;
-    }
-
-    public void setTeacherName(String teacherName) {
-        this.teacherName = teacherName;
-    }
-
-    public ClassGroupTypeEnum getClassGroupType() {
-        return classGroupType;
-    }
-
-    public void setClassGroupType(ClassGroupTypeEnum classGroupType) {
-        this.classGroupType = classGroupType;
-    }
-
-    public CourseStatusEnum getCourseStatus() {
-        return courseStatus;
-    }
-
-    public void setCourseStatus(CourseStatusEnum courseStatus) {
-        this.courseStatus = courseStatus;
-    }
-
-    public CourseSchedule.CourseScheduleType getCourseType() {
-        return courseType;
-    }
-
-    public void setCourseType(CourseSchedule.CourseScheduleType courseType) {
-        this.courseType = courseType;
-    }
-
-    public Date getStartTime() {
-        return startTime;
-    }
-
-    public void setStartTime(Date startTime) {
-        this.startTime = startTime;
-    }
-
-    public Date getEndTime() {
-        return endTime;
-    }
-
-    public void setEndTime(Date endTime) {
-        this.endTime = endTime;
-    }
-
-    public String getOrganIdList() {
-        return organIdList;
-    }
-
-    public void setOrganIdList(String organIdList) {
-        this.organIdList = organIdList;
-    }
-
-    public String getStudentIdList() {
-        return studentIdList;
-    }
-
-    public void setStudentIdList(String studentIdList) {
-        this.studentIdList = studentIdList;
-    }
-
-    public String getTeacherIdList() {
-        return teacherIdList;
-    }
-
-    public void setTeacherIdList(String teacherIdList) {
-        this.teacherIdList = teacherIdList;
-    }
-
-    public GroupType getGroupType() {
-        return groupType;
-    }
-
-    public void setGroupType(GroupType groupType) {
-        this.groupType = groupType;
-    }
-
-    public String getGroupId() {
-        return groupId;
-    }
-
-    public void setGroupId(String groupId) {
-        this.groupId = groupId;
-    }
-
-    public Integer getClassGroupId() {
-        return classGroupId;
-    }
-
-    public void setClassGroupId(Integer classGroupId) {
-        this.classGroupId = classGroupId;
-    }
-
-	public Date getCreateStartDate() {
-		return createStartDate;
-	}
-
-	public void setCreateStartDate(Date createStartDate) {
-		this.createStartDate = createStartDate;
-	}
-
-	public Date getCreateEndDate() {
-		return createEndDate;
-	}
-
-	public void setCreateEndDate(Date createEndDate) {
-		this.createEndDate = createEndDate;
-	}
-
-    public TeachTypeEnum getTeachType() {
-        return teachType;
-    }
-
-    public void setTeachType(TeachTypeEnum teachType) {
-        this.teachType = teachType;
-    }
-
-    public String getGenerateStartTime() {
-        return generateStartTime;
-    }
-
-    public void setGenerateStartTime(String generateStartTime) {
-        this.generateStartTime = generateStartTime;
-    }
-
-    public String getGenerateEndTime() {
-        return generateEndTime;
-    }
-
-    public void setGenerateEndTime(String generateEndTime) {
-        this.generateEndTime = generateEndTime;
-    }
-
-    public String getDealStartTime() {
-        return dealStartTime;
-    }
-
-    public void setDealStartTime(String dealStartTime) {
-        this.dealStartTime = dealStartTime;
-    }
-
-    public String getDealEndTime() {
-        return dealEndTime;
-    }
-
-    public void setDealEndTime(String dealEndTime) {
-        this.dealEndTime = dealEndTime;
-    }
-
-	public String getStartClassTimeStr() {
-		return startClassTimeStr;
-	}
-
-	public void setStartClassTimeStr(String startClassTimeStr) {
-		this.startClassTimeStr = startClassTimeStr;
-	}
-
-	public String getEndClassTimeStr() {
-		return endClassTimeStr;
-	}
-
-	public void setEndClassTimeStr(String endClassTimeStr) {
-		this.endClassTimeStr = endClassTimeStr;
-	}
+    @ApiModelProperty(value = "是否有助教")
+    private Boolean hasTeaching;
 }

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

@@ -1,12 +1,15 @@
 package com.ym.mec.biz.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
 import com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper;
+import com.ym.mec.biz.dal.dto.StudentSubjectDto;
 import com.ym.mec.biz.dal.entity.StudentLessonTrainingDetail;
 import com.ym.mec.biz.dal.enums.ELessonTrainingType;
+import org.jetbrains.annotations.NotNull;
 
-import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 练习内容
@@ -39,9 +42,10 @@ public interface StudentLessonTrainingDetailService extends IService<StudentLess
      * 将作业标准 转换为 需要的作业详情
      *
      * @param studentLessonTrainingDetails 作业标准
-     * @param userIdList 学生ID
+     * @param userIdList                   学生ID
+     * @param group
      */
-    List<StudentLessonTrainingDetail> homeWorkDetail(List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> studentLessonTrainingDetails, List<Integer> userIdList,Long homeworkId,ELessonTrainingType type);
+    List<StudentLessonTrainingDetail> homeWorkDetail(List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> studentLessonTrainingDetails, List<Integer> userIdList, Long homeworkId, ELessonTrainingType type, Integer group);
 
     /**
      * 查询布置的作业详情
@@ -59,4 +63,18 @@ public interface StudentLessonTrainingDetailService extends IService<StudentLess
      * @param userId 学生ID
      */
     List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> getBaseLessonTrainingDetail(Long courseHomeworkId, ELessonTrainingType type, Long userId);
+
+    /**
+     * 查询作业详情练习组
+     *
+     * @param courseHomeworkId 作业ID
+     * @param trainingType 作业类型
+     */
+    List<CourseHomeworkWrapper.StudentLessonTrainingStat> getLessonTrainingStat(Long courseHomeworkId, ELessonTrainingType trainingType);
+
+    @NotNull
+    Map<Integer, StudentSubjectDto> getStudentMusicGroupSubject(List<Integer> userIdList, String musicGroupId);
+
+    @NotNull
+    Map<Integer, List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> getGroupMap(Long courseHomeworkId, ELessonTrainingType trainingType);
 }

+ 18 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentVisitService.java

@@ -10,6 +10,8 @@ import com.ym.mec.biz.dal.page.StudentPreVisitQueryInfo;
 import com.ym.mec.biz.dal.page.StudentVisitQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+import org.springframework.web.multipart.MultipartFile;
+
 import java.util.List;
 
 public interface StudentVisitService extends BaseService<Integer, StudentVisit> {
@@ -21,6 +23,13 @@ public interface StudentVisitService extends BaseService<Integer, StudentVisit>
      * @return
      */
     StudentVisit addVisit(StudentVisit studentVisit);
+
+    /**
+     * 添加访问记录
+     * @param studentVisit
+     * @return
+     */
+    void batchAddVisit(List<StudentVisit> studentVisit);
     /**
      * 获取访问详情
      *
@@ -68,4 +77,13 @@ public interface StudentVisitService extends BaseService<Integer, StudentVisit>
     PageInfo<BasicUserDto> getStudents(StudentVisitQueryInfo queryInfo);
 
     PageInfo<StudentPreVisitDto> queryWaitVisit(StudentPreVisitQueryInfo queryInfo);
+
+    /**
+    * @description: 缴费中乐团批量导入学员回访
+     * @param file
+    * @return java.util.List<java.lang.String>
+    * @author zx
+    * @date 2023/6/13 14:34
+    */
+    List<String> importMusicVisit(MultipartFile file) throws Exception;
 }

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

@@ -269,6 +269,14 @@ public class CourseHomeworkServiceImpl extends BaseServiceImpl<Long, CourseHomew
         List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> baseLessonTrainingDetail = studentLessonTrainingDetailService.getBaseLessonTrainingDetail(
             courseHomeworkList.getCourseHomeworkId(), ELessonTrainingType.HOMEWORK);
 
+
+        // 练习组
+        List<CourseHomeworkWrapper.StudentLessonTrainingStat> trainingStatList =  studentLessonTrainingDetailService
+                .getLessonTrainingStat(courseHomeworkList.getCourseHomeworkId(), ELessonTrainingType.HOMEWORK);
+
+
+
+        courseHomeworkList.setTrainingGroupList(trainingStatList);
         courseHomeworkList.setTrainingDetailList(baseLessonTrainingDetail);
         courseHomeworkList.setType(ELessonTrainingType.HOMEWORK);
         return courseHomeworkList;
@@ -300,9 +308,15 @@ public class CourseHomeworkServiceImpl extends BaseServiceImpl<Long, CourseHomew
             return courseHomeworkList;
         }
 
-        List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> baseLessonTrainingDetail = studentLessonTrainingDetailService.getBaseLessonTrainingDetail(
-            courseHomeworkList.getCourseHomeworkId(),courseHomeworkList.getType());
+        List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> baseLessonTrainingDetail = studentLessonTrainingDetailService
+                .getBaseLessonTrainingDetail(courseHomeworkList.getCourseHomeworkId(),courseHomeworkList.getType());
+
+        // 练习组信息
+        List<CourseHomeworkWrapper.StudentLessonTrainingStat> practiceGroupList = studentLessonTrainingDetailService
+                .getLessonTrainingStat(courseHomeworkList.getCourseHomeworkId(),courseHomeworkList.getType());
+
 
+        courseHomeworkList.setTrainingGroupList(practiceGroupList);
         courseHomeworkList.setTrainingDetailList(baseLessonTrainingDetail);
         return courseHomeworkList;
     }

+ 33 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -1874,6 +1874,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		if (CollectionUtils.isEmpty(courseSchedules)) {
 			return false;
 		}
+		//直播课不校验冲突
+		if(courseSchedules.get(0).getGroupType() == LIVE){
+			return true;
+		}
 		List<String> classDates = courseSchedules.stream().map(courseSchedule -> DateUtil.dateToString(courseSchedule.getClassDate(), "yyyy-MM-dd"))
 				.collect(Collectors.toList());
 
@@ -4363,7 +4367,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		}
 
         int count = courseScheduleDao.endCountCourseSchedules(params);
-        if(queryInfo.getIsExport() && count > 50000){
+        if(queryInfo.isExport() && count > 50000){
             throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
         }
 		pageInfo.setTotal(count);
@@ -4371,9 +4375,18 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		List<CourseScheduleEndDto> results = courseScheduleDao.endFindCourseSchedules(params);
         if (!CollectionUtils.isEmpty(results)) {
             List<Long> courseScheduleIds = results.stream().map(CourseScheduleEndDto::getId).collect(Collectors.toList());
-            List<Integer> teacherIds=results.stream().filter(t->Objects.nonNull(t.getActualTeacherId())).map(CourseSchedule::getActualTeacherId).collect(Collectors.toList());
-
-            List<Map<Integer, String>> nameIdMaps = teacherDao.queryNameByIdList(teacherIds);
+            List<Integer> teacherIds = results.stream().filter(t->Objects.nonNull(t.getActualTeacherId())).map(CourseSchedule::getActualTeacherId).collect(Collectors.toList());
+			List<Integer> teachingUserIdsList = results.stream()
+					.filter(u -> StringUtils.isNotEmpty(u.getTeachingTeacherIds()))
+					.flatMap(u -> Arrays.stream(u.getTeachingTeacherIds().split(",")))
+					.filter(StringUtils::isNotEmpty)
+					.map(Integer::parseInt)
+					.distinct()
+					.collect(Collectors.toList());
+			if(CollectionUtils.isNotEmpty(teachingUserIdsList)){
+				teacherIds.addAll(teachingUserIdsList);
+			}
+			List<Map<Integer, String>> nameIdMaps = teacherDao.queryNameByIdList(teacherIds);
             Map<Integer, String> nameIdMap = MapUtil.convertIntegerMap(nameIdMaps);
 
 			List<Map<Long, Long>> courseMergeCourseNum = courseScheduleDao.countCourseMergeCourseNum(courseScheduleIds);
@@ -4389,7 +4402,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             Map<Integer, String> classGroupSubjectNameMap = MapUtil.convertIntegerMap(classGroupSubjectNameMaps);
             Map<Long, String> eduName = null;
             Map<String, MusicGroupBasicDto> cooperationMap = new HashMap<>();
-            if (queryInfo.getIsExport()) {
+            if (queryInfo.isExport()) {
                 List<Long> musicCourseIds = results.stream().filter(e -> e.getGroupType() == MUSIC).map(CourseScheduleEndDto::getId).collect(Collectors.toList());
                 eduName = new HashMap<>(courseScheduleIds.size());
                 if (musicCourseIds != null && musicCourseIds.size() > 0) {
@@ -4411,6 +4424,20 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             }
 
             for (CourseScheduleEndDto result : results) {
+				if(StringUtils.isNotEmpty(result.getTeachingTeacherIds())){
+					List<String> ids = Arrays.stream(result.getTeachingTeacherIds().split(",")).collect(Collectors.toList());
+					StringBuffer sb = new StringBuffer();
+					for (String teachingId : ids) {
+						String teachingName = nameIdMap.get(Integer.parseInt(teachingId));
+						if(StringUtils.isNotEmpty(teachingName)){
+							if(sb.length() > 0){
+								sb.append(",");
+							}
+							sb.append(teachingName);
+						}
+					}
+					result.setTeachingUserNames(sb.toString());
+				}
                 if (eduName != null) {
                     result.setEducationTeacherName(eduName.get(result.getId()));
                 }
@@ -6416,7 +6443,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					CourseSchedule next = beforeCourse.get(i + 1);
 
 					if (!next.getContinuousCourse()) {
-						newCourseSchedules.add(next);
+						//newCourseSchedules.add(next);
 						break;
 					}
 				}

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

@@ -2824,9 +2824,9 @@ public class ExportServiceImpl implements ExportService {
                 row.setIsComplaints(StringUtils.equals(row.getIsComplaints(), "1") ? "有" : "无");
             }
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部名称", "乐团主管", "课程编号", "课程组编号", "开始时间", "结束时间","班级声部", "课程名称", "课程类型", "教学模式",
-                    "教学点", "课程状态", "指导老师", "是否点名", "是否有考勤申诉", "预计上课人数", "合作单位"}, new String[]{
+                    "教学点", "课程状态", "指导老师",  "助教", "是否点名", "是否有考勤申诉", "预计上课人数", "合作单位"}, new String[]{
                     "organName", "educationTeacherName", "id", "musicGroupId", "startClassTime", "endClassTime", "subjectName", "name",
-                    "groupType.desc", "teachMode.msg", "schoolName", "status.msg", "teacherName", "isCallNames.msg", "isComplaints", "studentNum", "cooperationOrgan"}, rows);
+                    "groupType.desc", "teachMode.msg", "schoolName", "status.msg", "teacherName",  "teachingUserNames", "isCallNames.msg", "isComplaints", "studentNum", "cooperationOrgan"}, rows);
             exportManagerDownload(workbook, managerDownload);
         } catch (Exception e) {
             e.printStackTrace();

+ 30 - 14
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java

@@ -3,24 +3,13 @@ package com.ym.mec.biz.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.CourseHomeworkStudentDetailDto;
-import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
-import com.ym.mec.biz.dal.dto.EduHomeworkCardDto;
-import com.ym.mec.biz.dal.dto.ExtraExerciseStudentsDto;
-import com.ym.mec.biz.dal.dto.SimpleUserDto;
-import com.ym.mec.biz.dal.dto.StudentHomeworkRecordDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.ExtraExercilseQueryInfo;
 import com.ym.mec.biz.dal.page.ExtraExercilseReplyQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseHomeWorkQueryInfo;
-import com.ym.mec.biz.service.CourseHomeworkService;
-import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
-import com.ym.mec.biz.service.ExtracurricularExercisesService;
-import com.ym.mec.biz.service.MusicGroupService;
-import com.ym.mec.biz.service.StudentServeService;
-import com.ym.mec.biz.service.SysConfigService;
-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;
@@ -73,6 +62,9 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
     @Autowired
     private CourseHomeworkService courseHomeworkService;
 
+    @Autowired
+    private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
+
 	@Override
 	public BaseDAO<Long, ExtracurricularExercisesReply> getDAO() {
 		return extracurricularExercisesReplyDao;
@@ -90,6 +82,21 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
             throw new BizException("课外训练不存在");
         }
 
+
+        // 设置乐团声部
+        Map<Integer, StudentSubjectDto> subjectDtoMap= new HashMap<>();
+        if (StringUtils.isNotBlank(extracurricularExercises.getMusicGroupId())) {
+
+            // 学生ID集合
+            Set<Integer> userIdList = extraExerciseStudents.stream()
+                    .map(ExtracurricularExercisesReply::getUserId)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toSet());
+            // 设置声部
+            subjectDtoMap = studentLessonTrainingDetailService
+                    .getStudentMusicGroupSubject(new ArrayList<>(userIdList), extracurricularExercises.getMusicGroupId());
+        }
+
         List<StudentCourseHomework> studentCourseHomeworks=new ArrayList<>();
         for (ExtraExerciseStudentsDto extraExerciseStudent : extraExerciseStudents) {
             StudentCourseHomework studentCourseHomework= JSON.parseObject(JSON.toJSONString(extraExerciseStudent),StudentCourseHomework.class);
@@ -103,8 +110,17 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 			studentCourseHomework.setIsView(extraExerciseStudent.getIsView()==0?YesOrNoEnum.NO:YesOrNoEnum.YES);
 			studentCourseHomework.setAvatar(extraExerciseStudent.getHeadUrl());
             studentCourseHomework.setType(ELessonTrainingType.valueOf(extracurricularExercises.getGroupType()));
-			studentCourseHomeworks.add(studentCourseHomework);
+
+            StudentSubjectDto studentSubjectDto = subjectDtoMap.get(extraExerciseStudent.getUserId());
+            if (studentSubjectDto != null) {
+                studentCourseHomework.setSubjectId(studentSubjectDto.getSubjectId());
+                studentCourseHomework.setSubjectName(studentSubjectDto.getSubjectName());
+            }
+
+            studentCourseHomeworks.add(studentCourseHomework);
 		}
+
+
 		return studentCourseHomeworks;
 	}
 

+ 239 - 220
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java

@@ -39,23 +39,23 @@ import java.util.stream.Collectors;
 
 @Service
 public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, ExtracurricularExercises> implements ExtracurricularExercisesService {
-	
-	@Autowired
-	private ExtracurricularExercisesDao extracurricularExercisesDao;
-	@Autowired
-	private ExtracurricularExercisesReplyDao extracurricularExercisesReplyDao;
-	@Autowired
-	private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
-	@Autowired
-	private SysMessageService sysMessageService;
-	@Autowired
-	private TeacherDao teacherDao;
-	@Autowired
-	private CourseHomeworkDao courseHomeworkDao;
-	@Autowired
-	private StudentServeService studentServeService;
-	@Autowired
-	private StudentCourseHomeworkDao studentCourseHomeworkDao;
+
+    @Autowired
+    private ExtracurricularExercisesDao extracurricularExercisesDao;
+    @Autowired
+    private ExtracurricularExercisesReplyDao extracurricularExercisesReplyDao;
+    @Autowired
+    private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Autowired
+    private TeacherDao teacherDao;
+    @Autowired
+    private CourseHomeworkDao courseHomeworkDao;
+    @Autowired
+    private StudentServeService studentServeService;
+    @Autowired
+    private StudentCourseHomeworkDao studentCourseHomeworkDao;
 
     @Autowired
     private ClassGroupStudentMapperDao classGroupStudentMapperDao;
@@ -68,20 +68,20 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
     @Autowired
     private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
 
-	@Override
-	public BaseDAO<Long, ExtracurricularExercises> getDAO() {
-		return extracurricularExercisesDao;
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-	public void createExtraExercises(ExtracurricularExercises exercises) {
-		if(StringUtils.isBlank(exercises.getTitle())){
-			// throw new BizException("请填写标题");
-		}
-		if(StringUtils.isBlank(exercises.getContent())){
-			// throw new BizException("请填写内容");
-		}
+    @Override
+    public BaseDAO<Long, ExtracurricularExercises> getDAO() {
+        return extracurricularExercisesDao;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public void createExtraExercises(ExtracurricularExercises exercises) {
+        if(StringUtils.isBlank(exercises.getTitle())){
+            // throw new BizException("请填写标题");
+        }
+        if(StringUtils.isBlank(exercises.getContent())){
+            // throw new BizException("请填写内容");
+        }
         if (exercises.getMusicGroupId() != null) {
             exercises.setGroupType(ELessonTrainingType.EXTRACURRICULAR.getCode());
         } else {
@@ -99,25 +99,25 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
             exercises.setStudentIdList(StringUtils.join(studentIdList,","));
         }
 
-		teacherDao.getLocked(exercises.getTeacherId());
-		Teacher teacher = teacherDao.get(exercises.getTeacherId());
+        teacherDao.getLocked(exercises.getTeacherId());
+        Teacher teacher = teacherDao.get(exercises.getTeacherId());
 
-		ExtracurricularExercises repeatLastExercises = extracurricularExercisesDao.findRepeatLastExercises(exercises.getTeacherId(), exercises.getStudentIdList(), exercises.getContent());
-		if(Objects.nonNull(repeatLastExercises)&&DateUtil.secondsBetween(repeatLastExercises.getCreateTime(),new Date())<60){
-			return;
-		}
+        ExtracurricularExercises repeatLastExercises = extracurricularExercisesDao.findRepeatLastExercises(exercises.getTeacherId(), exercises.getStudentIdList(), exercises.getContent());
+        if(Objects.nonNull(repeatLastExercises)&&DateUtil.secondsBetween(repeatLastExercises.getCreateTime(),new Date())<60){
+            return;
+        }
 
-		if(Objects.isNull(exercises.getExpireDate())){
-			LocalDateTime localDateTime=LocalDateTime.now();
-			localDateTime=localDateTime.plusDays(Integer.parseInt(sysConfigService.findByParamName("homework_expire_time").getParanValue()))
+        if(Objects.isNull(exercises.getExpireDate())){
+            LocalDateTime localDateTime=LocalDateTime.now();
+            localDateTime=localDateTime.plusDays(Integer.parseInt(sysConfigService.findByParamName("homework_expire_time").getParanValue()))
                     .withHour(21).withMinute(0).withSecond(0).withNano(0);
-			exercises.setExpireDate(Date.from(localDateTime.atZone(DateUtil.zoneId).toInstant()));
-		}
-		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());
-		extracurricularExercisesDao.insert(exercises);
-		String dateStr = DateUtil.dateToString(exercises.getExpireDate(), "MM月dd日HH点");
+            exercises.setExpireDate(Date.from(localDateTime.atZone(DateUtil.zoneId).toInstant()));
+        }
+        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());
+        extracurricularExercisesDao.insert(exercises);
+        String dateStr = DateUtil.dateToString(exercises.getExpireDate(), "MM月dd日HH点");
 
         ExtracurricularExercisesReply studentExtraExercise=new ExtracurricularExercisesReply();
         studentExtraExercise.setExtracurricularExercisesId(exercises.getId());
@@ -148,7 +148,7 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
                 // 作业详情
                 studentLessonTrainingDetailList.addAll(studentLessonTrainingDetailService
                                    .homeWorkDetail(musicScoreSubjectDto.getStudentLessonTrainingDetails(), musicScoreSubjectDto.getUserIdList(), exercises.getId(),
-                                                   ELessonTrainingType.valueOf(exercises.getGroupType())));
+                                                   ELessonTrainingType.valueOf(exercises.getGroupType()),musicScoreSubjectDto.getGroup()));
 
             }
         } else {
@@ -160,12 +160,31 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
             // 作业详情
             studentLessonTrainingDetailList.addAll(studentLessonTrainingDetailService
                                                        .homeWorkDetail(exercises.getStudentLessonTrainingDetails(), studentIds,exercises.getId(),
-                                                       ELessonTrainingType.valueOf(exercises.getGroupType())));
+                                                       ELessonTrainingType.valueOf(exercises.getGroupType()), null));
         }
         for (ExtracurricularExercisesReply extracurricularExercisesReply : extracurricularExercisesReplies) {
             extracurricularExercisesReplyDao.insert(extracurricularExercisesReply);
         }
         if (!CollectionUtils.isEmpty(studentLessonTrainingDetailList)) {
+            // 学生ID集合
+            Set<Integer> userIdList = studentLessonTrainingDetailList.stream()
+                    .map(StudentLessonTrainingDetail::getUserId)
+                    .filter(Objects::nonNull)
+                    .map(Long::intValue)
+                    .collect(Collectors.toSet());
+            // 设置声部
+            Map<Integer, StudentSubjectDto> subjectDtoMap = studentLessonTrainingDetailService
+                    .getStudentMusicGroupSubject(new ArrayList<>(userIdList), exercises.getMusicGroupId());
+
+            studentLessonTrainingDetailList.forEach(studentLessonTrainingDetail -> {
+                if (studentLessonTrainingDetail.getUserId() == null) {
+                    return;
+                }
+                StudentSubjectDto studentSubjectDto = subjectDtoMap.get(studentLessonTrainingDetail.getUserId().intValue());
+                if (Objects.nonNull(studentSubjectDto)) {
+                    studentLessonTrainingDetail.setSubjectId(studentSubjectDto.getSubjectId().longValue());
+                }
+            });
             studentLessonTrainingDetailService.saveBatch(studentLessonTrainingDetailList);
             exercises.setVersionTag("v2");
         } else {
@@ -207,177 +226,177 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
                         userMap, null, 0, 3 + notifyUrl, "STUDENT",
                         teacher.getRealName(), exercises.getTitle(), dateStr);
             }
-		}
-		studentServeService.updateExercisesSituation(exercises.getMusicGroupId(), new Date(), studentIds, exercises.getTeacherId());
-	}
-
-	@Override
-	public List<Map<String, Object>> findExtraExercilses(ExtraExercilseQueryInfo queryInfo) {
-		Map<String, Object> params = new HashMap<>();
-		MapUtil.populateMap(params, queryInfo);
-		List<Map<String, Object>> result = new ArrayList<>();
-
-		List<ExtracurricularExercises> dataList = extracurricularExercisesDao.findExtraExercises(params);
-		if(!CollectionUtils.isEmpty(dataList)){
-			List<Long> extraExerciseIds = dataList.stream().map(ExtracurricularExercises::getId).collect(Collectors.toList());
-			List<ExtracurricularExercisesReply> extraExerciseStudentsByExtraExercises = extracurricularExercisesReplyDao.findExtraExerciseStudentsByExtraExercises(extraExerciseIds);
-			Map<Long, List<ExtracurricularExercisesReply>> idStudentsMap = extraExerciseStudentsByExtraExercises.stream().collect(Collectors.groupingBy(ExtracurricularExercisesReply::getExtracurricularExercisesId));
-			for (ExtracurricularExercises extracurricularExercises : dataList) {
-				List<ExtracurricularExercisesReply> extracurricularExercisesReplies = idStudentsMap.get(extracurricularExercises.getId());
-				if(CollectionUtils.isEmpty(extracurricularExercisesReplies)){
-					continue;
-				}
-				long noRepliedNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus()==1&&e.getIsReplied() == 0).count();
-				if(noRepliedNum<=0){
-					extracurricularExercises.setIsReplied(1);
-				}
-				long notSubmitNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus() == 0).count();
-				if(notSubmitNum<=0){
-					extracurricularExercises.setIsSubmit(1);
-				}
-				if(noRepliedNum>0){
-					extracurricularExercises.setStatus(1);
-				}else if(noRepliedNum<=0&&notSubmitNum>0){
-					extracurricularExercises.setStatus(2);
-				}else if(noRepliedNum<=0&&notSubmitNum<=0){
-					extracurricularExercises.setStatus(3);
-				}
-			}
-
-			Map<String, List<ExtracurricularExercises>> collect = dataList.stream().collect(Collectors.groupingBy(e -> DateUtil.dateToString(e.getCreateTime(), "yyyy-MM-dd")));
-			List<Date> dates=new ArrayList<>();
-			collect.keySet().forEach(ds-> dates.add(DateUtil.stringToDate(ds,"yyyy-MM-dd")));
-			dates.sort(Comparator.comparing(Date::getTime));
-			dates.sort(Comparator.reverseOrder());
-			for (Date date : dates) {
-				String key=DateUtil.dateToString(date, "yyyy-MM-dd");
-				Map<String, Object> r = new HashMap<>();
-				r.put("day", key);
-				collect.get(key).sort(Comparator.comparing(ExtracurricularExercises::getCreateTime).reversed());
-				r.put("list", collect.get(key));
-				result.add(r);
-			}
-		}
-		return result;
-	}
-
-	@Override
-	public List<BasicUserDto> getDontServeStudents(Integer teacherId,
-												   String search,
-												   String musicGroupId,
-												   Long classGroupId,
-												   Integer subjectId,
-												   Integer hasMember,
-												   String studentIds) {
-		LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
-		LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
-		return extracurricularExercisesDao.findNoExercisesStudentsInThisWeekWithTeacher(teacherId, monDayDate.toString(), musicGroupId, classGroupId, subjectId, search,hasMember,studentIds);
-	}
-
-	@Override
-	public void studentServeRemind() {
-		LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
-		LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
-		List<Map<Integer, Long>> noFinishedServiceTeacher = studentExtracurricularExercisesSituationDao.getNoFinishedServiceTeacher(monDayDate.toString());
-		Map<Integer, Long> noFinishedServiceTeacherMap= MapUtil.convertIntegerMap(noFinishedServiceTeacher);
-		for (Map.Entry<Integer, Long> integerLongEntry : noFinishedServiceTeacherMap.entrySet()) {
-			Map<Integer, String> userMap = new HashMap<>();
-			userMap.put(integerLongEntry.getKey(), integerLongEntry.getKey().toString());
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_PUBLIC_EXTRA_REMIND,
-					userMap, null, 0, "11" , "TEACHER", integerLongEntry.getValue());
-		}
-	}
-
-	@Override
-	public PageInfo<TeacherHomeworkListDto> findExtraExercilsesHomeworks(ExtraExercilseQueryInfo queryInfo) {
-		PageInfo<TeacherHomeworkListDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<>();
-		MapUtil.populateMap(params, queryInfo);
-		int count = extracurricularExercisesDao.countExtraExercilsesHomeworks(params);
-		List<TeacherHomeworkListDto> dataList = new ArrayList<>();
-		if(count > 0){
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			List<ExtracurricularExercisesHomeworkListDto> homeworksExercises = extracurricularExercisesDao.findExtraExercilsesHomeworks(params);
-			if(homeworksExercises == null || homeworksExercises.size() == 0){
-				return pageInfo;
-			}
-			//课外训练
-			List<ExtracurricularExercisesHomeworkListDto> exercises = homeworksExercises.stream().filter(e -> e.getType().equals("EXERCISES")).collect(Collectors.toList());
-			if(exercises.size() > 0){
-				List<Integer> exercisesIdList = exercises.stream().map(e -> e.getHomeworkId()).collect(Collectors.toList());
-				List<TeacherHomeworkListDto> byIdList = extracurricularExercisesDao.findByIdList(exercisesIdList);
-				if(byIdList != null && byIdList.size() > 0){
-					List<Integer> extraExerciseIds = byIdList.stream().map(TeacherHomeworkListDto::getHomeworkId).collect(Collectors.toList());
-					List<ExtracurricularExercisesReply> extraExerciseStudentsByExtraExercises = extracurricularExercisesReplyDao.findExtraExerciseStudentsByExtraExercises(extraExerciseIds);
-					Map<Long, List<ExtracurricularExercisesReply>> idStudentsMap = extraExerciseStudentsByExtraExercises.stream().collect(Collectors.groupingBy(ExtracurricularExercisesReply::getExtracurricularExercisesId));
-					for (TeacherHomeworkListDto homeworkListDto : byIdList) {
-						List<ExtracurricularExercisesReply> extracurricularExercisesReplies = idStudentsMap.get(homeworkListDto.getHomeworkId().longValue());
-						if(CollectionUtils.isEmpty(extracurricularExercisesReplies)){
-							continue;
-						}
-						long noRepliedNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus()==1&&e.getIsReplied() == 0).count();
-						if(noRepliedNum<=0){
-							homeworkListDto.setIsReplied(1);
-						}
-						long notSubmitNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus() == 0).count();
-						if(notSubmitNum<=0){
-							homeworkListDto.setIsSubmit(1);
-						}
-						if(noRepliedNum>0){
-							homeworkListDto.setStatus(1);
-						}else if(noRepliedNum<=0&&notSubmitNum>0){
-							homeworkListDto.setStatus(2);
-						}else if(noRepliedNum<=0&&notSubmitNum<=0){
-							homeworkListDto.setStatus(3);
-						}
-					}
-					dataList.addAll(byIdList);
-				}
-			}
-			//课后作业
-			List<ExtracurricularExercisesHomeworkListDto> homeworkList = homeworksExercises.stream().filter(e -> e.getType().equals("HOMEWORK")).collect(Collectors.toList());
-			if(homeworkList.size() > 0){
-				List<Integer> homeworkIdList = homeworkList.stream().map(e -> e.getHomeworkId()).collect(Collectors.toList());
-				List<TeacherHomeworkListDto> byIdList = courseHomeworkDao.findByIdList(homeworkIdList);
-				if(byIdList != null && byIdList.size() > 0){
-					List<Long> courseIds = byIdList.stream().mapToLong(TeacherHomeworkListDto::getCourseScheduleId).boxed().collect(Collectors.toList());
-					List<StudentCourseHomework> allStudentCourseHomeworks = studentCourseHomeworkDao.findByCourses(courseIds);
-					Map<Long, List<StudentCourseHomework>> homeworkStudentMap = allStudentCourseHomeworks.stream().collect(Collectors.groupingBy(StudentCourseHomework::getCourseScheduleId));
-					for (TeacherHomeworkListDto teacherHomeworkListDto : byIdList) {
-						List<StudentCourseHomework> studentCourseHomeworks = homeworkStudentMap.get(teacherHomeworkListDto.getCourseScheduleId().longValue());
-						if(CollectionUtils.isEmpty(studentCourseHomeworks)){
-							continue;
-						}
-						long noRepliedNum=studentCourseHomeworks.stream().filter(e -> YesOrNoEnum.YES.equals(e.getStatus())&&YesOrNoEnum.NO.equals(e.getIsReplied())).count();
-						if(noRepliedNum<=0){
-							teacherHomeworkListDto.setIsReplied(YesOrNoEnum.YES.getCode());
-						}
-						long notSubmitNum = studentCourseHomeworks.stream().filter(e -> e.getStatus().equals(YesOrNoEnum.NO)).count();
-						if(notSubmitNum<=0){
-							teacherHomeworkListDto.setIsSubmit(1);
-						}
-						if(noRepliedNum>0){
-							teacherHomeworkListDto.setStatus(1);
-						}else if(noRepliedNum<=0&&notSubmitNum>0){
-							teacherHomeworkListDto.setStatus(2);
-						}else if(noRepliedNum<=0&&notSubmitNum<=0){
-							teacherHomeworkListDto.setStatus(3);
-						}
-					}
-					dataList.addAll(byIdList);
-				}
-			}
-			dataList.removeAll(Collections.singleton(null));
-			int startRow = queryInfo.getPage() * queryInfo.getRows() - queryInfo.getRows();
-			dataList = dataList.stream().sorted(Comparator.comparing(TeacherHomeworkListDto::getDay).reversed()).
-					sorted(Comparator.comparing(TeacherHomeworkListDto::getStatus))
-					.skip(startRow).limit(queryInfo.getRows()).
-					collect(Collectors.toList());
-			pageInfo.setRows(dataList);
-		}
-		return pageInfo;
-	}
+        }
+        studentServeService.updateExercisesSituation(exercises.getMusicGroupId(), new Date(), studentIds, exercises.getTeacherId());
+    }
+
+    @Override
+    public List<Map<String, Object>> findExtraExercilses(ExtraExercilseQueryInfo queryInfo) {
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        List<Map<String, Object>> result = new ArrayList<>();
+
+        List<ExtracurricularExercises> dataList = extracurricularExercisesDao.findExtraExercises(params);
+        if(!CollectionUtils.isEmpty(dataList)){
+            List<Long> extraExerciseIds = dataList.stream().map(ExtracurricularExercises::getId).collect(Collectors.toList());
+            List<ExtracurricularExercisesReply> extraExerciseStudentsByExtraExercises = extracurricularExercisesReplyDao.findExtraExerciseStudentsByExtraExercises(extraExerciseIds);
+            Map<Long, List<ExtracurricularExercisesReply>> idStudentsMap = extraExerciseStudentsByExtraExercises.stream().collect(Collectors.groupingBy(ExtracurricularExercisesReply::getExtracurricularExercisesId));
+            for (ExtracurricularExercises extracurricularExercises : dataList) {
+                List<ExtracurricularExercisesReply> extracurricularExercisesReplies = idStudentsMap.get(extracurricularExercises.getId());
+                if(CollectionUtils.isEmpty(extracurricularExercisesReplies)){
+                    continue;
+                }
+                long noRepliedNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus()==1&&e.getIsReplied() == 0).count();
+                if(noRepliedNum<=0){
+                    extracurricularExercises.setIsReplied(1);
+                }
+                long notSubmitNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus() == 0).count();
+                if(notSubmitNum<=0){
+                    extracurricularExercises.setIsSubmit(1);
+                }
+                if(noRepliedNum>0){
+                    extracurricularExercises.setStatus(1);
+                }else if(noRepliedNum<=0&&notSubmitNum>0){
+                    extracurricularExercises.setStatus(2);
+                }else if(noRepliedNum<=0&&notSubmitNum<=0){
+                    extracurricularExercises.setStatus(3);
+                }
+            }
+
+            Map<String, List<ExtracurricularExercises>> collect = dataList.stream().collect(Collectors.groupingBy(e -> DateUtil.dateToString(e.getCreateTime(), "yyyy-MM-dd")));
+            List<Date> dates=new ArrayList<>();
+            collect.keySet().forEach(ds-> dates.add(DateUtil.stringToDate(ds,"yyyy-MM-dd")));
+            dates.sort(Comparator.comparing(Date::getTime));
+            dates.sort(Comparator.reverseOrder());
+            for (Date date : dates) {
+                String key=DateUtil.dateToString(date, "yyyy-MM-dd");
+                Map<String, Object> r = new HashMap<>();
+                r.put("day", key);
+                collect.get(key).sort(Comparator.comparing(ExtracurricularExercises::getCreateTime).reversed());
+                r.put("list", collect.get(key));
+                result.add(r);
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public List<BasicUserDto> getDontServeStudents(Integer teacherId,
+                                                   String search,
+                                                   String musicGroupId,
+                                                   Long classGroupId,
+                                                   Integer subjectId,
+                                                   Integer hasMember,
+                                                   String studentIds) {
+        LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
+        LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+        return extracurricularExercisesDao.findNoExercisesStudentsInThisWeekWithTeacher(teacherId, monDayDate.toString(), musicGroupId, classGroupId, subjectId, search,hasMember,studentIds);
+    }
+
+    @Override
+    public void studentServeRemind() {
+        LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
+        LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+        List<Map<Integer, Long>> noFinishedServiceTeacher = studentExtracurricularExercisesSituationDao.getNoFinishedServiceTeacher(monDayDate.toString());
+        Map<Integer, Long> noFinishedServiceTeacherMap= MapUtil.convertIntegerMap(noFinishedServiceTeacher);
+        for (Map.Entry<Integer, Long> integerLongEntry : noFinishedServiceTeacherMap.entrySet()) {
+            Map<Integer, String> userMap = new HashMap<>();
+            userMap.put(integerLongEntry.getKey(), integerLongEntry.getKey().toString());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_PUBLIC_EXTRA_REMIND,
+                    userMap, null, 0, "11" , "TEACHER", integerLongEntry.getValue());
+        }
+    }
+
+    @Override
+    public PageInfo<TeacherHomeworkListDto> findExtraExercilsesHomeworks(ExtraExercilseQueryInfo queryInfo) {
+        PageInfo<TeacherHomeworkListDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        int count = extracurricularExercisesDao.countExtraExercilsesHomeworks(params);
+        List<TeacherHomeworkListDto> dataList = new ArrayList<>();
+        if(count > 0){
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            List<ExtracurricularExercisesHomeworkListDto> homeworksExercises = extracurricularExercisesDao.findExtraExercilsesHomeworks(params);
+            if(homeworksExercises == null || homeworksExercises.size() == 0){
+                return pageInfo;
+            }
+            //课外训练
+            List<ExtracurricularExercisesHomeworkListDto> exercises = homeworksExercises.stream().filter(e -> e.getType().equals("EXERCISES")).collect(Collectors.toList());
+            if(exercises.size() > 0){
+                List<Integer> exercisesIdList = exercises.stream().map(e -> e.getHomeworkId()).collect(Collectors.toList());
+                List<TeacherHomeworkListDto> byIdList = extracurricularExercisesDao.findByIdList(exercisesIdList);
+                if(byIdList != null && byIdList.size() > 0){
+                    List<Integer> extraExerciseIds = byIdList.stream().map(TeacherHomeworkListDto::getHomeworkId).collect(Collectors.toList());
+                    List<ExtracurricularExercisesReply> extraExerciseStudentsByExtraExercises = extracurricularExercisesReplyDao.findExtraExerciseStudentsByExtraExercises(extraExerciseIds);
+                    Map<Long, List<ExtracurricularExercisesReply>> idStudentsMap = extraExerciseStudentsByExtraExercises.stream().collect(Collectors.groupingBy(ExtracurricularExercisesReply::getExtracurricularExercisesId));
+                    for (TeacherHomeworkListDto homeworkListDto : byIdList) {
+                        List<ExtracurricularExercisesReply> extracurricularExercisesReplies = idStudentsMap.get(homeworkListDto.getHomeworkId().longValue());
+                        if(CollectionUtils.isEmpty(extracurricularExercisesReplies)){
+                            continue;
+                        }
+                        long noRepliedNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus()==1&&e.getIsReplied() == 0).count();
+                        if(noRepliedNum<=0){
+                            homeworkListDto.setIsReplied(1);
+                        }
+                        long notSubmitNum = extracurricularExercisesReplies.stream().filter(e -> e.getStatus() == 0).count();
+                        if(notSubmitNum<=0){
+                            homeworkListDto.setIsSubmit(1);
+                        }
+                        if(noRepliedNum>0){
+                            homeworkListDto.setStatus(1);
+                        }else if(noRepliedNum<=0&&notSubmitNum>0){
+                            homeworkListDto.setStatus(2);
+                        }else if(noRepliedNum<=0&&notSubmitNum<=0){
+                            homeworkListDto.setStatus(3);
+                        }
+                    }
+                    dataList.addAll(byIdList);
+                }
+            }
+            //课后作业
+            List<ExtracurricularExercisesHomeworkListDto> homeworkList = homeworksExercises.stream().filter(e -> e.getType().equals("HOMEWORK")).collect(Collectors.toList());
+            if(homeworkList.size() > 0){
+                List<Integer> homeworkIdList = homeworkList.stream().map(e -> e.getHomeworkId()).collect(Collectors.toList());
+                List<TeacherHomeworkListDto> byIdList = courseHomeworkDao.findByIdList(homeworkIdList);
+                if(byIdList != null && byIdList.size() > 0){
+                    List<Long> courseIds = byIdList.stream().mapToLong(TeacherHomeworkListDto::getCourseScheduleId).boxed().collect(Collectors.toList());
+                    List<StudentCourseHomework> allStudentCourseHomeworks = studentCourseHomeworkDao.findByCourses(courseIds);
+                    Map<Long, List<StudentCourseHomework>> homeworkStudentMap = allStudentCourseHomeworks.stream().collect(Collectors.groupingBy(StudentCourseHomework::getCourseScheduleId));
+                    for (TeacherHomeworkListDto teacherHomeworkListDto : byIdList) {
+                        List<StudentCourseHomework> studentCourseHomeworks = homeworkStudentMap.get(teacherHomeworkListDto.getCourseScheduleId().longValue());
+                        if(CollectionUtils.isEmpty(studentCourseHomeworks)){
+                            continue;
+                        }
+                        long noRepliedNum=studentCourseHomeworks.stream().filter(e -> YesOrNoEnum.YES.equals(e.getStatus())&&YesOrNoEnum.NO.equals(e.getIsReplied())).count();
+                        if(noRepliedNum<=0){
+                            teacherHomeworkListDto.setIsReplied(YesOrNoEnum.YES.getCode());
+                        }
+                        long notSubmitNum = studentCourseHomeworks.stream().filter(e -> e.getStatus().equals(YesOrNoEnum.NO)).count();
+                        if(notSubmitNum<=0){
+                            teacherHomeworkListDto.setIsSubmit(1);
+                        }
+                        if(noRepliedNum>0){
+                            teacherHomeworkListDto.setStatus(1);
+                        }else if(noRepliedNum<=0&&notSubmitNum>0){
+                            teacherHomeworkListDto.setStatus(2);
+                        }else if(noRepliedNum<=0&&notSubmitNum<=0){
+                            teacherHomeworkListDto.setStatus(3);
+                        }
+                    }
+                    dataList.addAll(byIdList);
+                }
+            }
+            dataList.removeAll(Collections.singleton(null));
+            int startRow = queryInfo.getPage() * queryInfo.getRows() - queryInfo.getRows();
+            dataList = dataList.stream().sorted(Comparator.comparing(TeacherHomeworkListDto::getDay).reversed()).
+                    sorted(Comparator.comparing(TeacherHomeworkListDto::getStatus))
+                    .skip(startRow).limit(queryInfo.getRows()).
+                    collect(Collectors.toList());
+            pageInfo.setRows(dataList);
+        }
+        return pageInfo;
+    }
 
     @Override
     public PageInfo<CourseHomeworkWrapper.WebExtraCourseHomework> findExtraExercilsesV2(ExtraExercilseQueryInfo queryInfo) {

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

@@ -408,7 +408,7 @@ public class IndexErrDataRecordServiceImpl extends BaseServiceImpl<Long, IndexEr
 			params.put("classGroupIds",classGroupIds);
 		}
 		int count = indexErrDataRecordDao.historyErrCourseDataCount(params);
-		if(queryInfo.getIsExport() && count > 50000){
+		if(queryInfo.isExport() && count > 50000){
 			throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
 		}
 		pageInfo.setTotal(count);
@@ -433,7 +433,7 @@ public class IndexErrDataRecordServiceImpl extends BaseServiceImpl<Long, IndexEr
 			List<Map<Integer, String>> classGroupSubjectNameMaps = classGroupDao.findClassGroupSubjectNameMaps(courseScheduleIds);
 			Map<Integer, String> classGroupSubjectNameMap = MapUtil.convertIntegerMap(classGroupSubjectNameMaps);
 			Map<Long, String> eduName = null;
-			if(queryInfo.getIsExport()){
+			if(queryInfo.isExport()){
 				List<Long> musicCourseIds = results.stream().filter(e -> e.getGroupType() == MUSIC).map(CourseScheduleEndDto::getId).collect(Collectors.toList());
 				eduName = new HashMap<>(courseScheduleIds.size());
 				if(musicCourseIds != null && musicCourseIds.size() > 0){

+ 32 - 124
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.beust.jcommander.internal.Lists;
 import com.microsvc.toolkit.middleware.im.message.ImGroupMemberWrapper;
-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.*;
@@ -39,7 +38,6 @@ import com.ym.mec.util.excel.POIUtil;
 import com.ym.mec.util.http.HttpUtil;
 import com.ym.mec.util.ini.IniFileUtil;
 import com.ym.mec.util.json.JsonUtil;
-import com.ym.mec.util.string.MessageFormatter;
 import com.ym.mec.util.validator.CommonValidator;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -150,7 +148,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Autowired
     private PayService payService;
     @Autowired
-    private SysUserFeignService sysUserFeignService;
+    private SysUserService sysUserService;
     @Autowired
     private SysMessageService sysMessageService;
     @Autowired
@@ -636,10 +634,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 	@Override
     @Transactional(rollbackFor = Exception.class)
     public String createGroup(SubFeeSettingDto subFeeSettingDto) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null || sysUser.getId() == null) {
-            throw new BizException("获取用户信息失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = subFeeSettingDto.getMusicGroup();
         if (StringUtils.isBlank(musicGroup.getGradeType()) && StringUtils.isNotBlank(subFeeSettingDto.getGradeType())) {
             musicGroup.setGradeType(subFeeSettingDto.getGradeType());
@@ -807,11 +802,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean finishPreApply(String musicGroupId, boolean isCheckStudentNum) {
-
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null || sysUser.getId() == null) {
-            throw new BizException("请重新登录");
-        }
+		SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团信息查询失败");
@@ -1454,7 +1445,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         if ("205".equals(studentPaymentOrder.getPaymentAccountNo())) {
             Integer teacherId = musicGroup.getEducationalTeacherId();
-            SysUser endTeacher = sysUserFeignService.queryUserById(teacherId);
+            SysUser endTeacher = sysUserService.queryUserById(teacherId);
             Map<Integer, String> userPhoneMap = new HashMap<>();
             userPhoneMap.put(endTeacher.getId(), endTeacher.getPhone());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.NO_BUY_CLOUD_TEACHER_MSG,
@@ -1509,10 +1500,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateSubjectInfo(SubFeeSettingDto subFeeSettingDto) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("身份校验失败");
-        }
+		SysUser sysUser = sysUserService.getUser();
         String musicGroupId = subFeeSettingDto.getMusicGroupId();
         //乐团状态是否正确
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
@@ -1610,10 +1598,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void musicGroupAction(String musicGroupId) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+		SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = saveLog(musicGroupId, MusicGroupStatusEnum.PREPARE);
 
         //乐器采购清单是否确认
@@ -1696,10 +1681,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void musicGroupAudit(String musicGroupId) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+		SysUser sysUser = sysUserService.getUser();
         Date date = new Date();
 
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
@@ -1744,10 +1726,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void musicGroupAuditFailed(String musicGroupId, String memo) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+		SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团信息不存在");
@@ -1807,10 +1786,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void musicGroupAuditSuccess(String musicGroupId) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+		SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团信息不存在");
@@ -1945,10 +1921,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     public MusicCardDto queryPersonalMusicGroups(Integer userId) {
-        SysUser sysUser = sysUserFeignService.queryUserById(userId);
-        if (sysUser == null) {
-            throw new BizException("用户不存在");
-        }
+        SysUser sysUser = sysUserService.queryUserById(userId);
         MusicCardDto musicCardDto = musicGroupDao.queryPersonalMusicGroups(userId);
         if (musicCardDto == null) {
             musicCardDto = new MusicCardDto();
@@ -1995,10 +1968,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean cancelMusicGroup(String musicGroupId) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+		SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.getLocked(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团找不到");
@@ -2089,10 +2059,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean pauseMusicGroup(String musicGroupId) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+		SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团找不到");
@@ -2122,10 +2089,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean resumeMusicGroup(String musicGroupId) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团找不到");
@@ -2164,10 +2128,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean extensionPaymentExpireDate(String musicGroupId, Date expireDate) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团找不到");
@@ -2207,10 +2168,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     public boolean extensionApplyExpireDate(String musicGroupId, Date expireDate) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团找不到");
@@ -2238,10 +2196,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     public boolean extensionPreApplyExpireDate(String musicGroupId, Date expireDate) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团找不到");
@@ -2381,7 +2336,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if("STUDENT".equals(client)){
 
             // 乐团信息
-            SysUser student = sysUserFeignService.queryUserById(musicGroupQuit.getUserId());
+            SysUser student = sysUserService.queryUserById(musicGroupQuit.getUserId());
 
             IPage<SchoolStaffWrapper.SchoolStaff> page = schoolStaffService.selectPage(new Page<>(1, -1),
                     SchoolStaffWrapper.SchoolStaffQuery.builder().schoolId(musicGroup.getCooperationOrganId().longValue()).build());
@@ -2406,7 +2361,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
 
         if (reqMusicGroupQuit.getStatus() == PROCESSING) {
-            SysUser sysUser = sysUserFeignService.queryUserById(userId);
+            SysUser sysUser = sysUserService.queryUserById(userId);
 
             Set<Integer> integers = employeePositionService.queryUserIdByRoleId(new SysUserRoleEnum[]{ORGAN_MANAGER}, musicGroup.getOrganId());
             if (currentOperatorRoleIds == null || currentOperatorRoleIds.size() == 0) {
@@ -2438,10 +2393,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (musicGroupQuit == null) {
             throw new BizException("操作失败,没有查询到退团记录");
         }
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团不存在");
@@ -2528,7 +2480,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (courseScheduleList != null && courseScheduleList.size() > 0) {
             throw new BizException("退团失败,存在[进行中]的课程");
         }
-        if(reqMusicGroupQuit.getStatus() != APPROVED){
+        if(musicGroupQuit.getStatus() == PROCESSING && reqMusicGroupQuit.getStatus() == APPROVED){
             //是否是特定的可以一键退团的乐团主管
             if(hasRole){
                 status = APPROVED;
@@ -2770,7 +2722,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 			List<SchoolStaffWrapper.SchoolStaff> records = page.getRecords();
 			if (CollectionUtils.isNotEmpty(records)) {
 
-				SysUser sysUser = sysUserFeignService.queryUserById(userId);
+				SysUser sysUser = sysUserService.queryUserById(userId);
 
 				Map<Integer, String> userMap = new HashMap<>();
 				records.forEach(o -> userMap.put(o.getUserId().intValue(), o.getUserId().toString()));
@@ -2785,7 +2737,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 			List<SchoolStaffWrapper.SchoolStaff> records = page.getRecords();
 			if (CollectionUtils.isNotEmpty(records)) {
 
-				SysUser sysUser = sysUserFeignService.queryUserById(userId);
+				SysUser sysUser = sysUserService.queryUserById(userId);
 
 				Map<Integer, String> userMap = new HashMap<>();
 				records.forEach(o -> userMap.put(o.getUserId().intValue(), o.getUserId().toString()));
@@ -2804,10 +2756,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     public boolean directQuitMusicGroup(MusicGroupQuitDto musicGroupQuitDto) {
 		Integer userId = musicGroupQuitDto.getUserId();
 		String musicGroupId = musicGroupQuitDto.getMusicGroupId();
-		SysUser sysUser = sysUserFeignService.queryUserById(userId);
-        if (sysUser == null) {
-            throw new BizException("获取用户信息失败");
-        }
+		SysUser sysUser = sysUserService.queryUserById(userId);
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团不存在");
@@ -3400,10 +3349,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean updateTeacherCoursesSalary(Long courseScheduleId, Integer teacherId, BigDecimal salary, BigDecimal subsidy, String scope) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("获取用户信息失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);
         if (courseSchedule == null) {
             throw new BizException("课程信息不存在");
@@ -3441,10 +3387,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     public PageInfo<MusicGroup> queryMusicGroupPage(MusicGroupQueryInfo queryInfo) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("获取用户信息失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         //查询有剩余排课时长的乐团
         if("MUSIC_GROUP_HAS_COURSE_TIMES".equals(queryInfo.getSearchType())){
             List<String> musicGroupIds = musicGroupDao.queryHasSubCourseTimes(queryInfo.getOrganId(),queryInfo.getTenantId());
@@ -3594,10 +3537,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateBaseInfo(SubFeeSettingDto subFeeSettingDto) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         String musicGroupId = subFeeSettingDto.getMusicGroup().getId();
         MusicGroup group = musicGroupDao.getLocked(musicGroupId);
         if (group == null) {
@@ -3756,10 +3696,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public MusicGroup openPay(String musicGroupId, String expireDate) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = saveLog(musicGroupId, MusicGroupStatusEnum.APPLY);
         //记录操作日志
         musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "开启缴费(报名中 -->  缴费中)", sysUser.getId(), ""));
@@ -3819,10 +3756,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void musicGroupFound(String musicGroupId) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团信息不存在");
@@ -3865,23 +3799,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, event, sysUser.getId(), ""));
         musicGroup.setStatus(MusicGroupStatusEnum.PREPARE);
         musicGroupDao.update(musicGroup);
-//        if (musicGroup.getOwnershipType() != null && musicGroup.getOwnershipType() == CooperationOrgan.OwnershipType.OWN) {
-//            //给家长发送乐团基础训练课短信
-//            //获取所有乐团学员列表
-//            List<StudentRegistration> students = studentRegistrationDao.queryStudentByMusicGroupId(musicGroupId);
-//            if (students != null && students.size() > 0) {
-//                // 获取所有家长电话
-//                Set<String> parentsPhones = students.stream().map(StudentRegistration::getParentsPhone).collect(Collectors.toSet());
-//                // 获取对应家长的用户编号
-//                Map<Integer, String> userIds = MapUtil.convertMybatisMap(studentRegistrationDao.findParentId(StringUtils.join(parentsPhones, ",")));
-//                userIds = JSONObject.parseObject(JSONObject.toJSONString(userIds), HashMap.class);
-//                if (userIds != null && userIds.size() > 0) {
-//                    String studentApplyUrl = sysConfigDao.findConfigValue(SysConfigService.STUDENT_APPLY_URL) + musicGroupId;
-//                    String serverPhone = sysConfigDao.findConfigValue(SysConfigService.SERVER_PHONE);
-//                    sysMessageService.batchSendMessage(MessageSender.YIMEI, MessageTypeEnum.SMS_BASICS_SKILL_APPLY_MESSAGE, userIds, null, 0, "", "", musicGroup.getName(), studentApplyUrl, serverPhone);
-//                }
-//            }
-//        }
         sendSeoMessageSource.sendSeoMessage(musicGroup.getOrganId(), new SysUserRoleEnum[]{ORGAN_MANAGER},
                 null, musicGroup.getEducationalTeacherId(), MessageTypeEnum.BACKSTAGE_MUSIC_GROUP_MARKING, musicGroup.getName());
     }
@@ -3914,10 +3831,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult addMusicGroupRegs(String musicGroupId, List<Long> registerIds) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null || sysUser.getId() == null) {
-            throw new BizException("获取用户信息失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         List<StudentRegistration> studentRegistrations = studentRegistrationDao.findStudentListByIdList(registerIds);
         List<StudentRegistration> oldRegs = studentRegistrationDao.getMusicGroupStu(musicGroupId);
         Map<Integer, List<StudentRegistration>> oldRegMap = oldRegs.stream().collect(Collectors.groupingBy(StudentRegistration::getUserId));
@@ -4007,10 +3921,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean closeMusicGroup(CloseMusicGroupDto closeMusicGroupDto) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser sysUser = sysUserService.getUser();
         String musicGroupId = closeMusicGroupDto.getMusicGroupId();
 
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
@@ -4119,10 +4030,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     public Object getQuitGroupDetail(String musicGroupId) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("请登录");
-        }
+        SysUser sysUser = sysUserService.getUser();
         Map<String, Object> resultMap = new HashMap<>(8);
         String username = sysUser.getUsername();
         resultMap.put("username", StringUtils.isEmpty(username) ? sysUser.getRealName() : username);
@@ -4140,7 +4048,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 			resultMap.put("quitTime", musicGroupQuit.getCreateTime());
         }
         if (musicGroup.getEducationalTeacherId() != null) {
-            SysUser user = sysUserFeignService.queryUserById(musicGroup.getEducationalTeacherId());
+            SysUser user = sysUserService.queryUserById(musicGroup.getEducationalTeacherId());
             resultMap.put("teacherMobile", user.getPhone());
         } else {
             resultMap.put("teacherMobile", "027-87718176");

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

@@ -17,6 +17,7 @@ import java.util.function.BiPredicate;
 import java.util.function.Consumer;
 import java.util.function.Function;
 
+import com.huifu.adapay.core.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RBucket;
 import org.redisson.api.RedissonClient;
@@ -104,6 +105,7 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         return payment;
     }
 
+
     private void checkSing(PaymentParam param) {
         
         //查询商户支付账户

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

@@ -114,7 +114,6 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
         }
         Integer tenantId = TenantContextHolder.getTenantId();
         Date date = new Date();
-        SysConfig attendanceTimeRange;
         if (courseSchedule.getGroupType().equals(GroupType.MUSIC)) {
             TeacherAttendance teacherAttendanceInfo = teacherAttendanceDao.findByTeacherAttendanceInfo(sysUser.getId().longValue(), courseSchedule.getId());
             if(Objects.isNull(teacherAttendanceInfo)||Objects.isNull(teacherAttendanceInfo.getSignInStatus())){
@@ -185,6 +184,10 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
                     studentAttendanceInfo.setSignInTime(courseSchedule.getStartClassTime());
                     studentAttendanceInfo.setSignOutTime(courseSchedule.getEndClassTime());
                 }
+                if (studentAttendanceInfo.getStatus() == StudentAttendanceStatusEnum.LATE) {
+                    studentAttendanceInfo.setSignInTime(date);
+                    studentAttendanceInfo.setSignOutTime(courseSchedule.getEndClassTime());
+                }
                 studentAttendanceInfo.setNormalRemind(remindNum>0?1:0);
                 studentAttendanceDao.insert(studentAttendanceInfo);
             } else {
@@ -313,6 +316,9 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
         }
         studentAttendanceDao.addStudentAttendances(studentAttendances);
         List<StudentAttendance> allStudentAttendances = studentAttendanceDao.findByCourseId(studentAttendanceInfo.getCourseScheduleId());
+        if(!CollectionUtils.isEmpty(allStudentAttendances)){
+            allStudentAttendances = allStudentAttendances.stream().filter(e->e.getStatus() != null).collect(Collectors.toList());
+        }
         Map<StudentAttendanceStatusEnum, List<StudentAttendance>> studentAttendanceGroupByStatus = allStudentAttendances.stream().collect(Collectors.groupingBy(StudentAttendance::getStatus));
         Integer studentNum = studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.NORMAL) == null ? 0 : studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.NORMAL).size();
         Integer leaveStudentNum = studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.LEAVE) == null ? 0 : studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.LEAVE).size();

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

@@ -807,7 +807,9 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
                 } else {
                     studentCourseHomework.setVipFlag(true);
                 }
-                studentCourseHomework.setSubjectId(Integer.parseInt(student.getSubjectIdList()));
+                if (studentCourseHomework.getSubjectId() == null) {
+                    studentCourseHomework.setSubjectId(Integer.parseInt(student.getSubjectIdList()));
+                }
             }
         }
 
@@ -815,7 +817,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         // 设置声部
 
         // 获取声部id集合
-        List<Integer> voicePartIds = students.stream().map(Student::getSubjectIdList).map(Integer::parseInt).collect(Collectors.toList());
+        List<Integer> voicePartIds = studentCourseHomeworkByCourse.stream().map(o -> o.getSubjectId()).collect(Collectors.toList());
 
         if (CollectionUtils.isEmpty(voicePartIds)) {
             return studentCourseHomeworkByCourse;

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

@@ -57,6 +57,7 @@ public class StudentLessonExaminationDetailServiceImpl extends ServiceImpl<Stude
                     studentLessonExaminationDetail.setMusicScoreId(vo.getMusicScoreId());
                     studentLessonExaminationDetail.setHeardLevel(vo.getHeardLevel());
                     studentLessonExaminationDetail.setStandardScore(vo.getScore());
+                    studentLessonExaminationDetail.setGroup(dto.getGroup());
                     if(i == 0){
                         studentLessonExaminationDetail.setAvgScore(score + subScore);
                     }else {

+ 29 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonExaminationServiceImpl.java

@@ -5,18 +5,13 @@ import com.ym.mec.biz.dal.dao.LessonExaminationDao;
 import com.ym.mec.biz.dal.dao.StudentExtracurricularExercisesSituationDao;
 import com.ym.mec.biz.dal.dao.StudentLessonExaminationDao;
 import com.ym.mec.biz.dal.dao.StudentLessonExaminationDetailDao;
-import com.ym.mec.biz.dal.dto.LessonExaminationSubmitDto;
-import com.ym.mec.biz.dal.dto.StudentLessonExaminationDto;
-import com.ym.mec.biz.dal.dto.StudentLessonExaminationDto1;
-import com.ym.mec.biz.dal.dto.StudentLessonExaminationSaveDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.LessonExamination;
 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 com.ym.mec.biz.dal.page.StudentLessonExaminationQueryInfo;
-import com.ym.mec.biz.service.LessonExaminationService;
-import com.ym.mec.biz.service.StudentExtracurricularExercisesSituationService;
-import com.ym.mec.biz.service.StudentLessonExaminationDetailService;
-import com.ym.mec.biz.service.StudentLessonExaminationService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.util.collection.MapUtil;
@@ -28,6 +23,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 学生进度评测表(StudentLessonExamination)表服务实现类
@@ -45,8 +41,13 @@ public class StudentLessonExaminationServiceImpl extends ServiceImpl<StudentLess
     @Autowired
     private LessonExaminationDao lessonExaminationDao;
     @Autowired
+    private LessonExaminationService lessonExaminationService;
+    @Autowired
     private StudentExtracurricularExercisesSituationService studentExtracurricularExercisesSituationService;
 
+    @Autowired
+    private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
+
     @Override
     public StudentLessonExaminationDao getDao() {
         return this.baseMapper;
@@ -69,6 +70,26 @@ public class StudentLessonExaminationServiceImpl extends ServiceImpl<StudentLess
                 studentLessonExaminations.add(studentLessonExamination);
             }
         }
+        LessonExamination examination = lessonExaminationService.getById(lessonExaminationId);
+
+        // 学生ID集合
+        Set<Integer> userIdList = studentLessonExaminations.stream()
+                .map(StudentLessonExamination::getUserId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+        // 设置声部
+        Map<Integer, StudentSubjectDto> subjectDtoMap = studentLessonTrainingDetailService
+                .getStudentMusicGroupSubject(new ArrayList<>(userIdList), examination.getMusicGroupId());
+
+        studentLessonExaminations.forEach(studentLessonTrainingDetail -> {
+            if (studentLessonTrainingDetail.getUserId() == null) {
+                return;
+            }
+            StudentSubjectDto studentSubjectDto = subjectDtoMap.get(studentLessonTrainingDetail.getUserId());
+            if (Objects.nonNull(studentSubjectDto)) {
+                studentLessonTrainingDetail.setSubjectId(studentSubjectDto.getSubjectId());
+            }
+        });
 
         baseMapper.insertBatch(studentLessonExaminations);
         return studentIdList;

+ 191 - 31
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonTrainingDetailServiceImpl.java

@@ -2,25 +2,27 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.CourseHomeworkDao;
 import com.ym.mec.biz.dal.dao.StudentLessonTrainingDetailMapper;
 import com.ym.mec.biz.dal.dao.SubjectDao;
 import com.ym.mec.biz.dal.dao.SysMusicScoreDao;
+import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
 import com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper;
-import com.ym.mec.biz.dal.entity.StudentLessonTrainingDetail;
-import com.ym.mec.biz.dal.entity.Subject;
-import com.ym.mec.biz.dal.entity.SysMusicScore;
+import com.ym.mec.biz.dal.dto.StudentSubjectDto;
+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.ExtracurricularExercisesService;
 import com.ym.mec.biz.service.StudentLessonTrainingDetailService;
+import com.ym.mec.biz.service.SubjectService;
 import lombok.extern.slf4j.Slf4j;
+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 java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -38,25 +40,34 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
     @Autowired
     private SubjectDao subjectDao;
 
-	/**
+    @Autowired
+    private CourseHomeworkDao courseHomeworkDao;
+
+    @Autowired
+    private SubjectService subjectService;
+
+    @Autowired
+    private ExtracurricularExercisesService extracurricularExercisesService;
+
+    /**
      * 查询详情
      * @param id 详情ID
      * @return StudentLessonTrainingDetail
      */
-	@Override
+    @Override
     public StudentLessonTrainingDetail detail(Long id) {
-        
+
         return baseMapper.selectById(id);
     }
-	
+
     /**
      * 添加
      * @param studentLessonTrainingDetail StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail
      * @return Boolean
      */
     @Override
-    public Boolean add(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail) {    	
-        
+    public Boolean add(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail) {
+
         return this.save(JSON.parseObject(studentLessonTrainingDetail.jsonString(), StudentLessonTrainingDetail.class));
     }
 
@@ -68,39 +79,42 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
     @Override
     public Boolean update(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail studentLessonTrainingDetail){
 
-        return this.updateById(JSON.parseObject(studentLessonTrainingDetail.jsonString(), StudentLessonTrainingDetail.class));       
+        return this.updateById(JSON.parseObject(studentLessonTrainingDetail.jsonString(), StudentLessonTrainingDetail.class));
     }
 
     /**
      * 将作业标准 转换为 需要的作业详情
      *
      * @param detailList 作业标准
-     * @param userIdList                   学生ID
+     * @param userIdList 学生ID
+     * @param group
      */
     @Override
-    public List<StudentLessonTrainingDetail> homeWorkDetail(List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> detailList, List<Integer> userIdList,Long homeworkId,ELessonTrainingType type) {
+    public List<StudentLessonTrainingDetail> homeWorkDetail(List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> detailList,
+                                                            List<Integer> userIdList, Long homeworkId, ELessonTrainingType type, Integer group) {
         log.info("将作业标准 转换为 需要的作业详情 {},{}", detailList, userIdList);
         // 保存作业标准
         if (CollectionUtils.isEmpty(detailList) || CollectionUtils.isEmpty(userIdList)) {
             return new ArrayList<>();
         }
+        if (group == null) {
+            group = 1;
+        }
 
         List<StudentLessonTrainingDetail> result = new ArrayList<>();
 
-        if (!CollectionUtils.isEmpty(detailList)) {
-            List<StudentLessonTrainingDetail> details = JSON.parseArray(
+        List<StudentLessonTrainingDetail> details = JSON.parseArray(
+            JSON.toJSONString(detailList), StudentLessonTrainingDetail.class);
+        result.addAll(details);
+        // 根据声部添加学生作业详情
+        userIdList.forEach(userId -> {
+            List<StudentLessonTrainingDetail> detailsUser = JSON.parseArray(
                 JSON.toJSONString(detailList), StudentLessonTrainingDetail.class);
-            result.addAll(details);
-            // 根据声部添加学生作业详情
-            userIdList.forEach(userId -> {
-                List<StudentLessonTrainingDetail> detailsUser = JSON.parseArray(
-                    JSON.toJSONString(detailList), StudentLessonTrainingDetail.class);
-                for (StudentLessonTrainingDetail studentLessonTrainingDetail : detailsUser) {
-                    studentLessonTrainingDetail.setUserId(userId.longValue());
-                }
-                result.addAll(detailsUser);
-            });
-        }
+            for (StudentLessonTrainingDetail studentLessonTrainingDetail : detailsUser) {
+                studentLessonTrainingDetail.setUserId(userId.longValue());
+            }
+            result.addAll(detailsUser);
+        });
         for (StudentLessonTrainingDetail studentLessonTrainingDetail : result) {
 
             studentLessonTrainingDetail.setCourseHomeworkId(homeworkId);
@@ -108,6 +122,7 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
             studentLessonTrainingDetail.setTrainingStatus(StandardEnum.NOT_START);
             studentLessonTrainingDetail.setCreateTime(new Date());
             studentLessonTrainingDetail.setUpdateTime(new Date());
+            studentLessonTrainingDetail.setGroup(group);
             studentLessonTrainingDetail.setType(type);
 
         }
@@ -135,8 +150,7 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
     @Override
     public List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> getBaseLessonTrainingDetail(Long courseHomeworkId, ELessonTrainingType type, Long userId) {
         List<StudentLessonTrainingDetail> list = this.lambdaQuery()
-                                                     .eq(StudentLessonTrainingDetail::getCourseHomeworkId,
-                                                         courseHomeworkId)
+                                                     .eq(StudentLessonTrainingDetail::getCourseHomeworkId,courseHomeworkId)
                                                      .isNull(userId == null,StudentLessonTrainingDetail::getUserId)
                                                      .eq(StudentLessonTrainingDetail::getType, type)
                                                      .eq(userId != null, StudentLessonTrainingDetail::getUserId, userId)
@@ -196,4 +210,150 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
 
         return studentLessonTrainingDetails;
     }
+
+
+    /**
+     * 查询作业详情练习组
+     *
+     * @param courseHomeworkId 作业ID
+     * @param trainingType 作业类型
+     */
+    @Override
+    public List<CourseHomeworkWrapper.StudentLessonTrainingStat> getLessonTrainingStat(Long courseHomeworkId, ELessonTrainingType trainingType) {
+        List<StudentLessonTrainingDetail> list = this.lambdaQuery()
+                                                     .eq(StudentLessonTrainingDetail::getCourseHomeworkId,courseHomeworkId)
+                                                     .eq(StudentLessonTrainingDetail::getType, trainingType)
+                                                    .isNotNull(StudentLessonTrainingDetail::getUserId)
+                                                     .list();
+        if (CollectionUtils.isEmpty(list)) {
+            return new ArrayList<>();
+        }
+
+        // 用户ID集合
+        List<Integer> userIdList = list.stream()
+                                    .map(StudentLessonTrainingDetail::getUserId)
+                                    .filter(Objects::nonNull)
+                                    .distinct()
+                                    .map(Long::intValue)
+                                    .collect(Collectors.toList());
+        String musicGroupId = null;
+        if (trainingType.equals(ELessonTrainingType.HOMEWORK)) {
+            CourseHomework courseHomework = courseHomeworkDao.get(courseHomeworkId);
+            if (courseHomework == null) {
+                return new ArrayList<>();
+            }
+            musicGroupId = courseHomework.getMusicGroupId();
+        } else {
+            ExtracurricularExercises exercises = extracurricularExercisesService.get(courseHomeworkId);
+            if (exercises == null) {
+                return new ArrayList<>();
+            }
+            musicGroupId = exercises.getMusicGroupId();
+        }
+
+        Map<Integer, StudentSubjectDto> studentSubjectDtoMap = getStudentMusicGroupSubject(userIdList, musicGroupId);
+
+        // 根据group 分组
+        Map<Integer, List<StudentLessonTrainingDetail>> groupMap = list.stream()
+                                                                           .collect(Collectors.groupingBy(StudentLessonTrainingDetail::getGroup));
+
+
+        Map<Integer, List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> groupDetailMap = getGroupMap(courseHomeworkId, trainingType);
+
+
+        List<CourseHomeworkWrapper.StudentLessonTrainingStat> studentLessonTrainingStats = new ArrayList<>();
+
+        // 根据分组数据统计声部, 完成人数
+        groupMap.forEach((k,v) -> {
+            CourseHomeworkWrapper.StudentLessonTrainingStat studentLessonTrainingStat = new CourseHomeworkWrapper.StudentLessonTrainingStat();
+            studentLessonTrainingStat.setGroup(k);
+            Set<Integer> userIds = v.stream().map(o -> o.getUserId().intValue()).collect(Collectors.toSet());
+            // 课后作业和课外作业查询学生在当前乐团声部
+            Set<String> subjectNameList = new HashSet<>();
+            if(!CollectionUtils.isEmpty(userIds)) {
+                for (Integer userId : userIds) {
+                    StudentSubjectDto studentSubjectDto = studentSubjectDtoMap.get(userId);
+                    if (studentSubjectDto != null) {
+                        subjectNameList.add(studentSubjectDto.getSubjectName());
+                    }
+                }
+            }
+            // 按人分组
+            Map<Long, List<StudentLessonTrainingDetail>> userMap = v.stream()
+                                                                    .collect(Collectors.groupingBy(StudentLessonTrainingDetail::getUserId));
+            int submitNum = 0;
+            int passNum = 0;
+            for (Map.Entry<Long, List<StudentLessonTrainingDetail>> entry : userMap.entrySet()) {
+                List<StudentLessonTrainingDetail> v1 = entry.getValue();
+                Set<StandardEnum> standardEnumSet = v1.stream().map(o -> o.getTrainingStatus()).filter(Objects::nonNull).collect(Collectors.toSet());
+                if (standardEnumSet.size() > 1 || standardEnumSet.contains(StandardEnum.NOT_STANDARD)) {
+                    submitNum++;
+                }  else {
+                    if (standardEnumSet.contains(StandardEnum.STANDARD)) {
+                        submitNum++;
+                        passNum++;
+                    }
+                }
+
+            }
+
+            studentLessonTrainingStat.setSubjectName(subjectNameList.stream().collect(Collectors.joining(",")));
+            studentLessonTrainingStat.setStudentNum(userIds.size());
+            studentLessonTrainingStat.setShouldSubmitNum(userIds.size());
+            studentLessonTrainingStat.setSubmitNum(submitNum);
+            studentLessonTrainingStat.setPassNum(passNum);
+
+            //设置基本作业内容
+            List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> studentLessonTrainingDetails = groupDetailMap.get(k);
+            if (!CollectionUtils.isEmpty(studentLessonTrainingDetails)) {
+                studentLessonTrainingStat.setTrainingDetailList(studentLessonTrainingDetails);
+            }
+            studentLessonTrainingStats.add(studentLessonTrainingStat);
+
+        });
+
+
+        return studentLessonTrainingStats;
+    }
+
+    @NotNull
+    @Override
+    public Map<Integer, StudentSubjectDto> getStudentMusicGroupSubject(List<Integer> userIdList, String musicGroupId) {
+        // 课后作业和课外作业查询学生在当前乐团声部
+        Map<Integer, StudentSubjectDto> studentSubjectDtoMap = new HashMap<>();
+        if (!StringUtils.isEmpty(musicGroupId)) {
+            List<StudentRegistration> registerSubject = subjectDao.getRegisterSubject(musicGroupId, userIdList);
+            if (!CollectionUtils.isEmpty(registerSubject)) {
+                registerSubject.forEach(o -> {
+                    StudentSubjectDto studentSubjectDto = new StudentSubjectDto();
+                    studentSubjectDto.setSubjectId(o.getActualSubjectId());
+                    studentSubjectDto.setSubjectName(o.getSubjectName());
+                    studentSubjectDto.setStudentId(o.getUserId());
+                    studentSubjectDtoMap.put(o.getUserId(), studentSubjectDto);
+                });
+            }
+        }
+
+        // 额外作业查询学生声部
+        Map<Integer, StudentSubjectDto> subjectDtoMap = subjectService.getSubjectByStudentId(new HashSet(userIdList));
+        subjectDtoMap.forEach((k,v) -> {
+            if (!studentSubjectDtoMap.containsKey(k)) {
+                studentSubjectDtoMap.put(k, v);
+            }
+        });
+        return studentSubjectDtoMap;
+    }
+
+    @NotNull
+    @Override
+    public Map<Integer, List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> getGroupMap(Long courseHomeworkId, ELessonTrainingType trainingType) {
+        // 作业内容
+        List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail> baseLessonTrainingDetail = getBaseLessonTrainingDetail(
+                courseHomeworkId, trainingType);
+
+        // 按组分组
+        Map<Integer, List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> groupDetailMap = baseLessonTrainingDetail.stream()
+                                .collect(Collectors.groupingBy(StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail::getGroup,LinkedHashMap::new,Collectors.toList()));
+        return groupDetailMap;
+    }
 }

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

@@ -898,7 +898,7 @@ public class StudentManageServiceImpl implements StudentManageService {
         Map<String, Integer> sum = new HashMap<>(7);
         Integer studentNum = scheduleStudentPaymentDao.countStudentNum(courseScheduleId);
         sum.put("studentNum", studentNum);
-        Integer signInNum = studentManageDao.countStudentSignInNum(courseScheduleId, "NORMAL");
+        Integer signInNum = studentManageDao.countStudentSignInNum(courseScheduleId, "NORMAL,LATE");
         sum.put("signInNum", signInNum);
         Integer leaveNum = studentManageDao.countStudentSignInNum(courseScheduleId, "LEAVE");
         sum.put("leaveNum", leaveNum);

+ 6 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -818,8 +818,6 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         if (Objects.nonNull(couponPayParam) && Objects.nonNull(couponPayParam.getCouponTypeInfo())) {
             //如果买乐器送课,那么就是0元买课,那么就先剔除送的课程再算优惠券,但是写入数据流水要加上
             List<StudentPaymentOrderDetail> collect = new ArrayList<>();
-            //按OrderDetailTypeEnum类型 进行聚合分组
-            Map<OrderDetailTypeEnum, List<StudentPaymentOrderDetail>> orderDetailGroupList;
             BigDecimal freeNewCourse = BigDecimal.ZERO;
             //如果送课 并且 课程不为空,那么就是0元买课
             if (goodsDto.isRemitCourseRFeeFlag() && CollectionUtils.isNotEmpty(newCourses)) {
@@ -833,17 +831,14 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                         .filter(a -> newCourseType.contains(a.getType().getCode()))
                         .map(StudentPaymentOrderDetail::getRemitFee)
                         .reduce(BigDecimal.ZERO, BigDecimal::add);
-                orderDetailGroupList =
-                        WrapperUtil.groupList(collect, StudentPaymentOrderDetail::getType);
             } else {
-                orderDetailGroupList =
-                        WrapperUtil.groupList(studentPaymentOrderDetailList, StudentPaymentOrderDetail::getType);
+                collect = studentPaymentOrderDetailList;
             }
 
             //获取本次交易中各优惠券的使用信息
             Map<String, CouponPayTypeInfo> couponParam = couponPayParam.getCouponTypeInfo();
             //计算使用优惠券后的对应的商品应该均摊的金额
-            calculateCoupon(couponParam, orderDetailGroupList);
+            calculateCoupon(couponParam, collect);
             //获取使用了优惠券之后的总金额
             BigDecimal useCouponAmount = WrapperUtil.sumList(studentPaymentOrderDetailList, StudentPaymentOrderDetail::getRemitFee);
             //赋值
@@ -991,14 +986,15 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
      * @param couponParam          优惠券的信息
      * @param orderDetailGroupList 订单信息
      */
-    private void calculateCoupon(Map<String, CouponPayTypeInfo> couponParam,
-                                 Map<OrderDetailTypeEnum, List<StudentPaymentOrderDetail>> orderDetailGroupList) {
+    private void calculateCoupon(Map<String, CouponPayTypeInfo> couponParam,List<StudentPaymentOrderDetail> paymentOrderDetails) {
         List<StudentPaymentOrderDetail> singleTypeList = new ArrayList<>();
         List<StudentPaymentOrderDetail> allTypeList = new ArrayList<>();
+        paymentOrderDetails.forEach(e->e.setCouponDetailTypeEnum(CouponDetailTypeEnum.valueOf(CouponDetailTypeEnum.of(e.getType().getCode()))));
+        Map<CouponDetailTypeEnum, List<StudentPaymentOrderDetail>> orderDetailGroupList = paymentOrderDetails.stream().collect(Collectors.groupingBy(e -> e.getCouponDetailTypeEnum()));
         //先处理”非全类型券“的数据
         orderDetailGroupList.forEach((e, list) -> {
             //根据OrderDetailTypeEnum类型找到对应的券类型,默认全类型
-            String couponDetailCode = CouponDetailTypeEnum.of(e.getCode());
+            String couponDetailCode = e.getCode();
             //获取本次支付中该类型优惠券的详情,如果该商品没有找到本次支付时选择的优惠券则当作全类型
             CouponPayTypeInfo couponPayTypeInfo = couponParam.get(couponDetailCode);
             //全类型券数据后面处理

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

@@ -1,15 +1,15 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.BasicUserDto;
-import com.ym.mec.biz.dal.dto.StudentPreVisitDto;
-import com.ym.mec.biz.dal.dto.StudentVisitDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.StudentPreVisitQueryInfo;
 import com.ym.mec.biz.dal.page.StudentVisitQueryInfo;
 import com.ym.mec.biz.service.StudentVisitService;
+import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -17,10 +17,17 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.excel.POIUtil;
+import com.ym.mec.util.ini.IniFileUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -45,6 +52,8 @@ public class StudentVisitServiceImpl extends BaseServiceImpl<Integer, StudentVis
     private StudentAttendanceDao studentAttendanceDao;
     @Autowired
     private StudentOperatingVisitDao studentOperatingVisitDao;
+    @Autowired
+    private SysUserService sysUserService;
 
 
     @Override
@@ -96,6 +105,52 @@ public class StudentVisitServiceImpl extends BaseServiceImpl<Integer, StudentVis
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchAddVisit(List<StudentVisit> studentVisit) {
+        Integer userId = sysUserService.getUserId();
+        StudentVisit.VisiterTypeEnum visitType = StudentVisit.VisiterTypeEnum.EDU_TEACHER;
+        Map<String, List<StudentVisit>> musicMap = studentVisit.stream().collect(Collectors.groupingBy(e -> e.getMusicGroupId()));
+        for (String musicGroupId : musicMap.keySet()) {
+            MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+            if(musicGroup.getStatus() != MusicGroupStatusEnum.PAY){
+                throw new BizException("当前乐团状态无需批量回访");
+            }
+            List<StudentVisit> studentVisits = musicMap.get(musicGroupId);
+            List<Integer> studentIds = studentVisits.stream().map(e -> e.getStudentId()).collect(Collectors.toList());
+            List<SimpleUserDto> userDtos = teacherDao.getUsersSimpleInfo(studentIds);
+            Date now = new Date();
+            Map<Integer, SimpleUserDto> userDtoMap = userDtos.stream().collect(Collectors.groupingBy(e -> e.getUserId(), Collectors.collectingAndThen(Collectors.toList(), v -> v.get(0))));
+            Map<String,List<Integer>> visitMap = new HashMap<>();
+            for (StudentVisit visit : studentVisits) {
+                visit.setType("其它");
+                visit.setPurpose("其它");
+                visit.setTeacherId(userId);
+                visit.setVisiterType(visitType);
+                SimpleUserDto userDto = userDtoMap.get(visit.getStudentId());
+                if (Objects.isNull(userDto)){
+                    throw new BizException("学员编号{}用户信息不存在",visit.getStudentId());
+                }
+                visit.setOrganId(Integer.parseInt(userDto.getOrganIds()));
+                visit.setCreateTime(now);
+                String month = DateUtil.format(visit.getVisitTime(), DateUtil.ISO_YEAR_MONTH_FORMAT);
+                List<Integer> userIds;
+                if(visitMap.containsKey(month)){
+                    userIds = visitMap.get(month);
+                }else {
+                    userIds = new ArrayList<>();
+                }
+                userIds.add(visit.getStudentId());
+                visitMap.put(month,userIds);
+            }
+            studentVisitDao.batchInsert(studentVisits);
+            //更新学员回访统计数据
+            for (String month : visitMap.keySet()) {
+                studentOperatingVisitDao.batchUpdateVisit(visitMap.get(month),month);
+            }
+        }
+    }
+
+    @Override
     public StudentVisitDto getInfo(Integer id) {
         return studentVisitDao.getInfo(id);
     }
@@ -185,4 +240,102 @@ public class StudentVisitServiceImpl extends BaseServiceImpl<Integer, StudentVis
         pageInfo.setRows(dataList);
         return pageInfo;
     }
+
+    @Override
+    public List<String> importMusicVisit(MultipartFile file) throws Exception{
+        Map<String, List<Map<String, Object>>> sheetsListMap = POIUtil.importExcel(new ByteArrayInputStream(file.getBytes()), 2, file.getOriginalFilename());
+        InputStream inputStream = new ClassPathResource("columnMapper.ini").getInputStream();
+        Map<String, String> columns = IniFileUtil.readIniFile(inputStream, TemplateTypeEnum.PAYMENT_MUSIC_VISIT_IMPORT.getMsg());
+        List<StudentVisit> importDtos = new ArrayList<>();
+        List<String> errMsg = new ArrayList();
+        StringBuffer sb = new StringBuffer();
+        for (String sheetName : sheetsListMap.keySet()) {
+            List<Map<String, Object>> sheet = sheetsListMap.get(sheetName);
+            for (int i = 0; i < sheet.size(); i++) {
+                int rowNum = i + 2;
+                Map<String, Object> row = sheet.get(i);
+                if (row.size() == 0) {
+                    continue;
+                }
+                JSONObject objectMap = new JSONObject();
+                valueIsNull: for (String s : row.keySet()) {
+                    String columnValue = columns.get(s);
+                    if (columnValue.equals("musicGroupId")) {
+                        if (StringUtils.isEmpty(row.get(s).toString())) {
+                            sb.append("第" + rowNum).append("行数据导入失败:乐团编号不可为空;");
+                            continue valueIsNull;
+                        } else {
+                            objectMap.put(columnValue, row.get(s));
+                        }
+                    } else if (columnValue.equals("phone")) {
+                        if (StringUtils.isEmpty(row.get(s).toString())) {
+                            sb.append("第" + rowNum).append("行数据导入失败:学员手机号不可为空;");
+                            continue valueIsNull;
+                        } else {
+                            objectMap.put(columnValue, row.get(s));
+                        }
+                    } else if (columnValue.equals("visitTime")) {
+                        if (StringUtils.isEmpty(row.get(s).toString())) {
+                            sb.append("第" + rowNum).append("行数据导入失败:回访日期不可为空;");
+                            continue valueIsNull;
+                        } else {
+                            objectMap.put(columnValue, row.get(s));
+                        }
+                    } else if (columnValue.equals("overview")) {
+                        if (StringUtils.isEmpty(row.get(s).toString())) {
+                            sb.append("第" + rowNum).append("行数据导入失败:学员情况不可为空;");
+                            continue valueIsNull;
+                        } else {
+                            objectMap.put(columnValue, row.get(s));
+                        }
+                    } else if (columnValue.equals("feedback")) {
+                        if (StringUtils.isEmpty(row.get(s).toString())) {
+                            sb.append("第" + rowNum).append("行数据导入失败:家长反馈不可为空;");
+                            continue valueIsNull;
+                        } else {
+                            objectMap.put(columnValue, row.get(s));
+                        }
+                    } else if (columnValue.equals("probStatus")) {
+                        if (StringUtils.isEmpty(row.get(s).toString())) {
+                            sb.append("第" + rowNum).append("行数据导入失败:问题状态不可为空;");
+                            continue valueIsNull;
+                        } else {
+                            if ("已解决".equals(row.get(s).toString())) {
+                                objectMap.put(columnValue, 1);
+                            }
+                        }
+                    }
+                }
+                try {
+                    StudentVisit cost = JSONObject.parseObject(objectMap.toJSONString(), StudentVisit.class);
+                    SysUser user = teacherDao.getUserWithPhone(cost.getPhone());
+                    if(Objects.isNull(user) || !user.getUserType().contains("STUDENT")){
+                        throw new BizException("手机号{}不存在",cost.getPhone());
+                    }
+                    cost.setStudentId(user.getId());
+                    StudentRegistration studentRegistration = studentRegistrationDao.getStudentRegister(cost.getMusicGroupId(),cost.getStudentId());
+                    if(Objects.isNull(studentRegistration)){
+                        throw new BizException("学员{}不在乐团{}中,无需回访",cost.getStudentId(),cost.getMusicGroupId());
+                    }
+                    if(studentRegistration.getMusicGroupStatus() != StudentMusicGroupStatusEnum.APPLY){
+                        throw new BizException("学员{}已缴费无需回访",studentRegistration.getUserId());
+                    }
+                    Integer visitStudent = studentVisitDao.getMusicVisitStudent(studentRegistration.getMusicGroupId(), studentRegistration.getUserId());
+                    if(Objects.nonNull(visitStudent)){
+                        throw new BizException("学员{}已回访",visitStudent);
+                    }
+                    importDtos.add(cost);
+                } catch (Exception ex) {
+                    throw new BizException("导入数据出错", ex);
+                }
+            }
+        }
+        if (!org.springframework.util.CollectionUtils.isEmpty(errMsg)) {
+            return errMsg;
+        }
+        if(!org.springframework.util.CollectionUtils.isEmpty(importDtos)){
+            this.batchAddVisit(importDtos);
+        }
+        return null;
+    }
 }

+ 22 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -1,6 +1,5 @@
 package com.ym.mec.biz.service.impl;
 
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -37,10 +36,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.math.BigDecimal;
-import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -429,7 +425,8 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
                                 studentLessonTrainingDetail.setSubjectId(scoreSubjectDto.getSubjectId());
                             }
                             studentLessonTrainingDetails.addAll(studentLessonTrainingDetailService
-                                                                    .homeWorkDetail(scoreSubjectDto.getStudentLessonTrainingDetails(), userIdList,courseHomework.getId(),ELessonTrainingType.HOMEWORK));
+                                                                    .homeWorkDetail(scoreSubjectDto.getStudentLessonTrainingDetails(), userIdList,
+                                                                            courseHomework.getId(),ELessonTrainingType.HOMEWORK, scoreSubjectDto.getGroup()));
 
 						}
 					}else {
@@ -443,7 +440,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
                                                                       .map(StudentCourseHomework::getUserId)
                                                                       .collect(Collectors.toList());
                         studentLessonTrainingDetails.addAll(studentLessonTrainingDetailService
-                                                                .homeWorkDetail(courseHomeworkInfo.getStudentLessonTrainingDetails(), userIdList,courseHomework.getId(),ELessonTrainingType.HOMEWORK));
+                                                                .homeWorkDetail(courseHomeworkInfo.getStudentLessonTrainingDetails(), userIdList,courseHomework.getId(),ELessonTrainingType.HOMEWORK,null));
 
 					}
 					if(CollectionUtils.isEmpty(studentCourseHomeworks)){
@@ -509,6 +506,25 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 						}
 					}
                     if (!CollectionUtils.isEmpty(studentLessonTrainingDetails)) {
+                        // 学生ID集合
+                        Set<Integer> userIdList = studentLessonTrainingDetails.stream()
+                                                                              .map(StudentLessonTrainingDetail::getUserId)
+                                                                                .filter(Objects::nonNull)
+                                                                                .map(Long::intValue)
+                                                                              .collect(Collectors.toSet());
+                        // 设置声部
+                        Map<Integer, StudentSubjectDto> subjectDtoMap = studentLessonTrainingDetailService
+                                .getStudentMusicGroupSubject(new ArrayList<>(userIdList), classGroup.getMusicGroupId());
+
+                        studentLessonTrainingDetails.forEach(studentLessonTrainingDetail -> {
+                            if (studentLessonTrainingDetail.getUserId() == null) {
+                                return;
+                            }
+                            StudentSubjectDto studentSubjectDto = subjectDtoMap.get(studentLessonTrainingDetail.getUserId().intValue());
+                            if (Objects.nonNull(studentSubjectDto)) {
+                                studentLessonTrainingDetail.setSubjectId(studentSubjectDto.getSubjectId().longValue());
+                            }
+                        });
                         studentLessonTrainingDetailService.saveBatch(studentLessonTrainingDetails);
                     }
 				}else{

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

@@ -373,8 +373,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         vipGroupApplyBaseInfoDto.setName(vipGroup.getLiveBroadcastRoom().getRoomTitle());
         vipGroupApplyBaseInfoDto.setSubjectId(Integer.parseInt(vipGroup.getLiveBroadcastRoom().getSubjectId()));
         if (CourseSchedule.CourseScheduleType.LIVE.getCode().equals(groupType)) {
-            vipGroupApplyBaseInfoDto.setTotalPrice(vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())));
-            vipGroupApplyBaseInfoDto.setOriginalTotalPrice(vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())));
+            vipGroupApplyBaseInfoDto.setTotalPrice(vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())).setScale(0, BigDecimal.ROUND_CEILING));
+            vipGroupApplyBaseInfoDto.setOriginalTotalPrice(vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())).setScale(0, BigDecimal.ROUND_CEILING));
         }
         vipGroupApplyBaseInfoDto.setPaymentExpireDate(DateUtil.getLastSecondWithDay(vipGroupApplyBaseInfoDto.getPaymentExpireDate()));
 
@@ -632,8 +632,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             // 计算老师课薪
             costInfo = countVipGroupPredictFee1(vipGroupApplyBaseInfoDto, vipGroupApplyBaseInfoDto.getUserId());
         }else if (CourseSchedule.CourseScheduleType.LIVE.getCode().equals(groupType)) {
-            costInfo.put("totalPrice",vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())));
-            costInfo.put("originalTotalPrice",vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())));
+            costInfo.put("totalPrice",vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())).setScale(0, BigDecimal.ROUND_CEILING));
+            costInfo.put("originalTotalPrice",vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum())).setScale(0, BigDecimal.ROUND_CEILING));
         }
 
         vipGroupApplyBaseInfoDto.setAuditStatus(AuditStatusEnum.PASS);

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

@@ -1581,7 +1581,7 @@
     <select id="countClassGroup" resultType="int">
         SELECT COUNT(cg.id_) FROM class_group cg
         <if test="groupType == 'MUSIC'">
-            LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_
+            LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_ AND mg.status_ NOT IN ('CANCELED','PAUSE','CLOSE')
         </if>
         <if test="groupType == 'VIP' or groupType == 'LIVE'">
             LEFT JOIN vip_group mg ON mg.id_ = cg.music_group_id_
@@ -1598,7 +1598,7 @@
         LEFT JOIN sys_user su ON su.id_ = cgtm.user_id_ AND cgtm.teacher_role_ = 'BISHOP'
         LEFT JOIN sys_user su1 ON su1.id_ = cgtm.user_id_ AND cgtm.teacher_role_ = 'TEACHING'
         <if test="groupType == 'MUSIC'">
-            LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_
+            LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_ AND mg.status_ NOT IN ('CANCELED','PAUSE','CLOSE')
         </if>
         <if test="groupType == 'VIP' or groupType == 'LIVE'">
             LEFT JOIN vip_group mg ON mg.id_ = cg.music_group_id_

+ 30 - 36
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -71,6 +71,7 @@
         <result column="isCallNames" property="isCallNames" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="is_complaints_" property="isComplaints"/>
         <result column="merged_course_ids_" property="mergedCourseIds"/>
+        <result column="teachingTeacherIds" property="teachingTeacherIds"/>
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.dto.CourseScheduleDto" id="courseScheduleDto" extends="CourseSchedule">
@@ -1912,7 +1913,7 @@
         )
         and cs.tenant_id_ = #{tenantId}
         AND (cs.del_flag_ IS NULL OR cs.del_flag_=0)
-        AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
+        AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_) AND cs.group_type_ != 'LIVE'
     </select>
 
     <select id="queryStudentCoursesTimesOfTomorrow" resultMap="Mapper">
@@ -2505,33 +2506,17 @@
 
     <select id="endFindCourseSchedules" resultMap="CourseScheduleEndDto">
         SELECT
-            cs.id_ id_,
-            cs.new_course_id_,
-            cs.group_type_,
-            cs.music_group_id_,
-            cs.class_group_id_,
-            cs.status_,
-            cs.name_,
-            cs.class_date_,
-            CONCAT(cs.class_date_,' ',cs.start_class_time_) course_start_time_,
+            cs.id_ id_,cs.new_course_id_,cs.group_type_,cs.music_group_id_,cs.class_group_id_,
+            cs.status_,cs.name_,cs.class_date_,CONCAT(cs.class_date_,' ',cs.start_class_time_) course_start_time_,
             CONCAT(cs.class_date_,' ',cs.end_class_time_) course_end_time_,
-            cs.actual_teacher_id_,
-            cs.teach_mode_,
-            cs.type_,
-            cs.schoole_id_,
-            cs.create_time_,
-            cs.is_lock_,
-            cs.organ_id_,
-            cs.member_flag_,
-            cs.new_course_id_,
-            s.name_ schoole_name_,
-            o.name_ organ_name_,
+            cs.actual_teacher_id_,cs.teach_mode_,cs.type_,cs.schoole_id_,cs.create_time_,cs.is_lock_,
+            cs.organ_id_,cs.member_flag_,cs.new_course_id_,s.name_ schoole_name_,o.name_ organ_name_,
             CASE WHEN COUNT(CASE WHEN sa.id_ IS NULL OR (sa.status_ = 'LEAVE' AND sa.remark_ IS NOT NULL) THEN NULL ELSE 1 END) > 0 THEN 1 ELSE 0 END isCallNames,
             CASE WHEN COUNT(CASE WHEN ta.is_complaints_ = 1 THEN 1 ELSE NULL END) > 0 THEN '1' ELSE '0' END is_complaints_,
             (
                 select group_concat(csd.id_) from course_schedule csd
                 where csd.del_flag_ = 0 and csd.id_ != csd.new_course_id_  and csd.new_course_id_ = cs.new_course_id_
-            ) as merged_course_ids_
+            ) as merged_course_ids_,GROUP_CONCAT(distinct CASE WHEN csts.teacher_role_ = 'TEACHING' THEN csts.user_id_ END) teachingTeacherIds
         FROM
             course_schedule cs
             LEFT JOIN school s ON cs.schoole_id_=s.id_
@@ -2546,22 +2531,22 @@
                 AND cssp.user_id_ = sa.user_id_
             </if>
             <include refid="endFindCourseSchedulesCondition"/>
-        GROUP BY
-            cs.class_date_,
-            cs.start_class_time_,
-            cs.id_
-        ORDER BY
-            cs.class_date_,
-            cs.start_class_time_,
-            cs.id_
+        GROUP BY cs.class_date_, cs.start_class_time_, cs.id_
+        <if test="hasTeaching != null">
+            <if test="hasTeaching == true">
+                HAVING teachingTeacherIds IS NOT NULL
+            </if>
+            <if test="hasTeaching == false">
+                HAVING teachingTeacherIds IS NULL
+            </if>
+        </if>
+        ORDER BY cs.class_date_, cs.start_class_time_, cs.id_
         <include refid="global.limit"/>
     </select>
 
     <select id="endCountCourseSchedules" resultType="int">
-        SELECT
-        COUNT(DISTINCT cs.id_)
-        FROM
-        course_schedule cs
+        SELECT COUNT(c.id_) FROM (
+        SELECT cs.id_,GROUP_CONCAT(distinct CASE WHEN csts.teacher_role_ = 'TEACHING' THEN csts.user_id_ END) teachingTeacherIds FROM course_schedule cs
         <if test="studentId != null or searchType == 'TEACHER_ERR_ATTENDANCE' or searchType == 'STUDENT_ERR_ATTENDANCE'">
             LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
         </if>
@@ -2572,6 +2557,15 @@
         LEFT JOIN teacher_attendance ta on ta.course_schedule_id_ = cs.id_
         LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_
         <include refid="endFindCourseSchedulesCondition"/>
+        GROUP BY cs.id_
+        <if test="hasTeaching != null">
+            <if test="hasTeaching == true">
+                HAVING teachingTeacherIds IS NOT NULL
+            </if>
+            <if test="hasTeaching == false">
+                HAVING teachingTeacherIds IS NULL
+            </if>
+        </if>) c
     </select>
     <select id="findClassGroupCourseSchedulesWithDate" resultMap="CourseSchedule">
         SELECT <include refid="resultSql"/>
@@ -2659,7 +2653,7 @@
             AND cs.teach_mode_ = #{teachMode,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         </if>
         <if test="teacherIdList != null">
-            AND csts.user_id_=#{teacherIdList}
+            AND csts.user_id_ = #{teacherIdList}
         </if>
         <if test="teachType != null">
             AND csts.teacher_role_ = #{teachType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
@@ -4281,7 +4275,7 @@
                 and cs.type_ = #{param.classType}
             </if>
 
-            <if test="param.musicGroupId != null ">
+            <if test="param.musicGroupId != null and  param.musicGroupId != ''">
                 and #{param.musicGroupId} = cs.music_group_id_
             </if>
             <if test="param.homeWorkStatus != null">

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

@@ -28,6 +28,7 @@
         <result column="music_score_id_" property="musicScoreId"/>
         <result column="music_score_content_" property="musicScoreContent"/>
         <result column="tenant_id_" property="tenantId"/>
+        <result column="subject_id_" property="subjectId"/>
         <result column="standard_flag_" property="standardFlag" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
 
@@ -710,15 +711,18 @@
         sch.*,
         su.username_,
         su.avatar_,
-        su.phone_
+        su.phone_,
+        sr.actual_subject_id_ as subject_id_
         FROM
         student_course_homework sch
+        left join course_homework ch on ch.id_ = sch.course_homework_id_
         LEFT JOIN sys_user su ON sch.user_id_=su.id_
-        left join student s on s.user_id_ = su.id_
+        left join student s2 on s2.user_id_ = su.id_
+        left join student_registration sr on sr.user_id_ = sch.user_id_ and sr.music_group_id_ = ch.music_group_id_
         <where>
             sch.course_schedule_id_=#{query.courseScheduleId}
             <if test="query.subjectId != null">
-                and s.subject_id_list_ = #{query.subjectId}
+                and (sr.actual_subject_id_ = #{query.subjectId} or (sr.actual_subject_id_ is null and s2.subject_id_list_ = #{query.subjectId}))
             </if>
         </where>
     </select>

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

@@ -805,7 +805,7 @@
         GROUP BY su.id_
     </select>
     <select id="countStudentSignInNum" resultType="java.lang.Integer">
-        SELECT COUNT(id_) FROM student_attendance WHERE course_schedule_id_ = #{courseScheduleId} AND status_ = #{status}
+        SELECT COUNT(id_) FROM student_attendance WHERE course_schedule_id_ = #{courseScheduleId} AND FIND_IN_SET(status_,#{status})
     </select>
     <select id="countHomeworkNum" resultType="java.lang.Integer">
         SELECT COUNT(id_) FROM student_course_homework WHERE course_schedule_id_ = #{courseScheduleId} AND status_ = 1

+ 12 - 6
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -774,12 +774,6 @@
             <if test="search!=null and search!=''">
                 AND (t.user_id_=#{search} OR su.username_ LIKE CONCAT('%', #{search}, '%'))
             </if>
-            <if test="cloudTeacherTrainStartDate != null">
-                AND date(smcr.create_time_) &gt;= #{cloudTeacherTrainStartDate}
-            </if>
-            <if test="cloudTeacherTrainEndDate != null">
-                AND date(smcr.create_time_) &lt;= #{cloudTeacherTrainEndDate}
-            </if>
         </where>
     </sql>
 
@@ -820,6 +814,12 @@
             LEFT JOIN sys_user su ON stu.user_id_=su.id_
             LEFT JOIN `subject` sub ON stu.subject_id_list_ = sub.id_
             LEFT JOIN sys_music_compare_record smcr ON stu.user_id_ = smcr.user_id_
+            <if test="cloudTeacherTrainStartDate != null">
+                AND date(smcr.create_time_) &gt;= #{cloudTeacherTrainStartDate}
+            </if>
+            <if test="cloudTeacherTrainEndDate != null">
+                AND date(smcr.create_time_) &lt;= #{cloudTeacherTrainEndDate}
+            </if>
         <include refid="queryCloudStudyStudentDataCondition" />
         GROUP BY stu.user_id_
         <trim prefix="ORDER BY " suffixOverrides=",">
@@ -861,6 +861,12 @@
         )) t
         LEFT JOIN sys_user su ON t.user_id_ = su.id_
         LEFT JOIN sys_music_compare_record smcr ON t.user_id_ = smcr.user_id_
+        <if test="cloudTeacherTrainStartDate != null">
+            AND date(smcr.create_time_) &gt;= #{cloudTeacherTrainStartDate}
+        </if>
+        <if test="cloudTeacherTrainEndDate != null">
+            AND date(smcr.create_time_) &lt;= #{cloudTeacherTrainEndDate}
+        </if>
         <include refid="queryCloudStudyStudentDataCondition" />
     </select>
 

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

@@ -61,6 +61,13 @@ month_ = #{month},
 		update student_operating_visit set visit_flag_ = 1
 		where user_id_ = #{studentId} and visit_flag_ = 0 and month_ = #{month}
 	</update>
+    <update id="batchUpdateVisit">
+		update student_operating_visit set visit_flag_ = 1
+		where visit_flag_ = 0 and month_ = #{month} AND user_id_ IN
+		<foreach collection="studentIds" separator="," item="studentId" open="(" close=")">
+			#{studentId}
+		</foreach>
+	</update>
 
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >

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

@@ -769,7 +769,7 @@
         FROM student_payment_order spo
         LEFT JOIN student_payment_order_detail spod on spo.id_ = spod.payment_order_id_
         LEFT JOIN sporadic_charge_info sci on spo.music_group_id_ = sci.id_
-        where DATE_FORMAT(spo.pay_time_,'%Y-%m') = #{month} AND spo.order_no_ NOT IN (select distinct order_no_ from sell_order where DATE_FORMAT(delivery_time_,'%Y-%m') = #{month})
+        where DATE_FORMAT(spo.pay_time_,'%Y-%m') = #{month} AND spo.order_no_ NOT IN (select distinct order_no_ from sell_order where DATE_FORMAT(sell_time_,'%Y-%m') = #{month})
         AND spo.tenant_id_ = 1 AND spo.status_ = 'SUCCESS'
     </select>
     <select id="ExportQueryPage2" resultMap="orderAndDetail" parameterType="map">

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

@@ -53,6 +53,21 @@
         #{type,jdbcType=VARCHAR}, #{purpose,jdbcType=VARCHAR}, #{overview,jdbcType=VARCHAR},
         #{feedback,jdbcType=VARCHAR}, #{visitTime}, #{createTime},#{objectId},#{tenantId},#{attachments},#{probStatus})
     </insert>
+    <insert id="batchInsert">
+        insert into student_visit (music_group_id_, organ_id_, student_id_, teacher_id_, visiter_type_, feedback_type_,feedback_type_desc_,
+        type_, purpose_, overview_,
+        feedback_, visit_time_, create_time_,object_id_,tenant_id_,attachments_,prob_status)
+        VALUES
+        <foreach collection="studentVisit" item="item" separator=",">
+            (#{item.musicGroupId,jdbcType=VARCHAR}, #{item.organId,jdbcType=INTEGER}, #{item.studentId,jdbcType=INTEGER},
+            #{item.teacherId,jdbcType=INTEGER},#{item.visiterType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            #{item.feedbackType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            #{item.feedbackTypeDesc,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            #{item.type,jdbcType=VARCHAR}, #{item.purpose,jdbcType=VARCHAR}, #{item.overview,jdbcType=VARCHAR},
+            #{item.feedback,jdbcType=VARCHAR}, #{item.visitTime}, #{item.createTime},#{item.objectId},#{item.tenantId},
+             #{item.attachments},#{item.probStatus})
+        </foreach>
+    </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentVisit">
         <!--@mbg.generated-->
         update student_visit
@@ -211,6 +226,9 @@
             #{studentId}
         </foreach>
     </select>
+    <select id="getMusicVisitStudent" resultType="java.lang.Integer">
+        SELECT student_id_ FROM student_visit WHERE music_group_id_ = #{musicGroupId} AND student_id_ = #{studentId}
+    </select>
     <select id="getTeacherVisitCount" resultType="com.ym.mec.biz.dal.dto.TeacherVisitDto">
         SELECT teacher_id_ teacherId,date_format(visit_time_, '%Y-%m') month, COUNT(*) num
         FROM student_visit
@@ -232,7 +250,8 @@
         select COUNT(sov.user_id_) from student_operating_visit sov
         LEFT JOIN sys_user su ON su.id_ = sov.user_id_
         LEFT JOIN (select sv.student_id_,MAX(sv.create_time_) create_time_ from student_visit sv
-        where sv.student_id_ IS NOT NULL group by sv.student_id_,DATE_FORMAT(sv.create_time_,'%Y-%m')) sv ON sv.student_id_ = sov.user_id_ AND sov.month_ = DATE_FORMAT(sv.create_time_,'%Y-%m')
+        where sv.student_id_ IS NOT NULL group by sv.student_id_,DATE_FORMAT(sv.create_time_,'%Y-%m')) sv ON sv.student_id_ = sov.user_id_
+        AND sov.month_ = DATE_FORMAT(sv.create_time_,'%Y-%m')
         <include refid="queryWaitVisitSql"/>
     </select>
     <sql id="queryWaitVisitSql">

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

@@ -260,9 +260,9 @@
     </select>
 
     <select id="getRegisterSubject" resultMap="com.ym.mec.biz.dal.dao.StudentRegistrationDao.StudentRegistration">
-        SELECT sr.user_id_, s.name_ subject_name_ FROM student_registration sr
+        SELECT sr.user_id_, s.name_ subject_name_,sr.actual_subject_id_ FROM student_registration sr
         LEFT JOIN subject s ON sr.actual_subject_id_=s.id_
-        WHERE sr.music_group_id_=#{musicGroupId} AND s.del_flag_ = 0 AND sr.music_group_status_ != 'QUIT'
+        WHERE sr.music_group_id_=#{musicGroupId} AND s.del_flag_ = 0
         AND sr.user_id_ IN
         <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
             #{userId}

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

@@ -672,7 +672,7 @@
 
     <select id="findHaveCourseBalanceStudents" resultMap="vipGroupStudentDto">
         SELECT
-            su.id_,
+            su.id_ user_id_,
             su.username_,
             su.phone_,
             suca.course_balance_,

+ 2 - 2
mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java

@@ -146,13 +146,13 @@ public class BaseController {
 
     public String dingTalkRobotsSecurityParam() throws Exception{
         Long timestamp = System.currentTimeMillis();
-        String secret = "SEC5e3b73acccb12fc2a2a7d36d416c1967c66adb99a75dce24ecc324b50e528a29";
+        String secret = "SEC405b2e5f38aaae6472b242ee53607fb4a6549cf05a72bdf6482ec3799d5576ec";
         String stringToSign = timestamp + "\n" + secret;
         Mac mac = Mac.getInstance("HmacSHA256");
         mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
         byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
         String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8");
-        StringBuffer sb = new StringBuffer("https://api.dingtalk.com/robot/send?access_token=22d7b3b54ea7f1633c640dfdf17083d0731c3757719a84bd333740a8b18eb035&timestamp=");
+        StringBuffer sb = new StringBuffer("https://oapi.dingtalk.com/robot/send?access_token=ffa98e1f0f5f4cff586a228699281a7955e305fd6f55145af8e8da5ea794d033&timestamp=");
         sb.append(timestamp).append("&sign=").append(sign);
         return sb.toString();
     }

+ 177 - 197
mec-common/common-core/src/main/java/com/ym/mec/common/service/impl/BaseServiceImpl.java

@@ -125,212 +125,192 @@ public abstract class BaseServiceImpl<PK extends Serializable, T> implements Bas
     }
 
 
-    @Override
-    public <K extends Collection, Y, Z> Map<Y,Z> getMap(String tableName, String columnKey, String columnValue, K ids,Integer tenantId, Class<Y> keyType, Class<Z> valueType){
-        if(CollectionUtils.isEmpty(ids)){
-            return Collections.emptyMap();
-        }
-        StringBuffer sql=new StringBuffer();
-        Map<Y,Z> result=new HashMap();
-        SqlSession sqlSession = null;
-        Connection connection = null;
-        PreparedStatement ps = null;
-        try {
-            sqlSession = sqlSessionFactory.openSession();
-            connection = sqlSession.getConnection();
-            sql.append("SELECT ").append(columnKey).append(",").append(columnValue).append(" FROM ").append(tableName).append(" WHERE ").append(columnKey).append(" IN (").append(StringUtils.join(ids, ",")).append(")");
-            if(tenantId != null){
-                sql.append(" AND tenant_id_ = ").append(tenantId);
-            }
-            ps = connection.prepareStatement(sql.toString());
-            ResultSet resultSet = ps.executeQuery();
-            while (resultSet.next()){
-                Y key;
-                Z value;
-                if(keyType.isAssignableFrom(BigDecimal.class)){
-                    key = (Y) BigDecimal.class.getDeclaredConstructor(String.class).newInstance(resultSet.getString(1));
-                }else if(keyType.isAssignableFrom(String.class)){
-                    key = (Y) resultSet.getString(1);
-                }else{
-                    key = (Y) keyType.getMethod("valueOf", String.class).invoke(null,resultSet.getString(1));
-                }
-                if(valueType.isAssignableFrom(BigDecimal.class)){
-                    value = (Z) BigDecimal.class.getDeclaredConstructor(String.class).newInstance(resultSet.getString(2));
-                }else if(valueType.isAssignableFrom(String.class)){
-                    value = (Z) resultSet.getString(2);
-                }else{
-                    value = (Z) valueType.getMethod("valueOf", String.class).invoke(null,resultSet.getString(2));
-                }
-                result.put(key, value);
-            }
-            if(resultSet!=null){
-                resultSet.close();
-            }
-            if(ps!=null){
-                ps.close();
-            }
-            if(sqlSession!=null){
-                sqlSession.close();
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            if(ps!=null){
-                try {
-                    ps.close();
-                } catch (SQLException e) {
-                }
-            }
-            if(sqlSession!=null){
-                sqlSession.close();
-            }
-            if(connection!=null){
-                try {
-                    connection.close();
-                } catch (SQLException e) {
-                }
-            }
-        }
+	@Override
+	public <K extends Collection, Y, Z> Map<Y,Z> getMap(String tableName, String columnKey, String columnValue, K ids,Integer tenantId, Class<Y> keyType, Class<Z> valueType){
+		if(CollectionUtils.isEmpty(ids)){
+			return Collections.emptyMap();
+		}
+		StringBuffer sql=new StringBuffer();
+		Map<Y,Z> result=new HashMap();
+		SqlSession sqlSession = null;
+		Connection connection = null;
+		PreparedStatement ps = null;
+		ResultSet resultSet = null;
+		try {
+			sqlSession = sqlSessionFactory.openSession();
+			connection = sqlSession.getConnection();
+			sql.append("SELECT ").append(columnKey).append(",").append(columnValue).append(" FROM ").append(tableName).append(" WHERE ").append(columnKey).append(" IN (").append(StringUtils.join(ids, ",")).append(")");
+			if(tenantId != null){
+				sql.append(" AND tenant_id_ = ").append(tenantId);
+			}
+			ps = connection.prepareStatement(sql.toString());
+			resultSet = ps.executeQuery();
+			while (resultSet.next()){
+				Y key;
+				Z value;
+				if(keyType.isAssignableFrom(BigDecimal.class)){
+					key = (Y) BigDecimal.class.getDeclaredConstructor(String.class).newInstance(resultSet.getString(1));
+				}else if(keyType.isAssignableFrom(String.class)){
+					key = (Y) resultSet.getString(1);
+				}else{
+					key = (Y) keyType.getMethod("valueOf", String.class).invoke(null,resultSet.getString(1));
+				}
+				if(valueType.isAssignableFrom(BigDecimal.class)){
+					value = (Z) BigDecimal.class.getDeclaredConstructor(String.class).newInstance(resultSet.getString(2));
+				}else if(valueType.isAssignableFrom(String.class)){
+					value = (Z) resultSet.getString(2);
+				}else{
+					value = (Z) valueType.getMethod("valueOf", String.class).invoke(null,resultSet.getString(2));
+				}
+				result.put(key, value);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}finally {
+			if(resultSet!=null){
+				try {
+					resultSet.close();
+				} catch (SQLException e) {
+					e.printStackTrace();
+				}
+			}
+			if(ps!=null){
+				try {
+					ps.close();
+				} catch (SQLException e) {
+					e.printStackTrace();
+				}
+			}
+			if(sqlSession!=null){
+				sqlSession.close();
+			}
+		}
 
             return result;
         }
 
-        @Override
-        public <K extends List, Y, Z> Map<Y,Z> getMap(String tableName, String columnKey, String columnValue, String ids, Class<Y> keyType, Class<Z> valueType){
-            if(StringUtils.isEmpty(ids)){
-                return Collections.emptyMap();
-            }
-            StringBuffer sql=new StringBuffer();
-            Map<Y,Z> result=new HashMap();
-
-            SqlSession sqlSession = null;
-            Connection connection = null;
-            PreparedStatement ps = null;
-            try {
-                sqlSession = sqlSessionFactory.openSession();
-                connection = sqlSession.getConnection();
-                sql.append("SELECT ").append(columnKey).append(",").append(columnValue).append(" FROM ").append(tableName).append(" WHERE ").append(columnKey).append(" IN (").append(ids).append(")");
-                ps = connection.prepareStatement(sql.toString());
-                ResultSet resultSet = ps.executeQuery();
-                while (resultSet.next()){
-                    Y key;
-                    Z value;
-                    if(keyType.isAssignableFrom(BigDecimal.class)){
-                        key = (Y) BigDecimal.class.getDeclaredConstructor(String.class).newInstance(resultSet.getString(1));
-                    }else if(keyType.isAssignableFrom(String.class)){
-                        key = (Y) resultSet.getString(1);
-                    }else{
-                        key = (Y) keyType.getMethod("valueOf", String.class).invoke(null,resultSet.getString(1));
-                    }
-                    if(valueType.isAssignableFrom(BigDecimal.class)){
-                        value = (Z) BigDecimal.class.getDeclaredConstructor(String.class).newInstance(resultSet.getString(2));
-                    }else if(valueType.isAssignableFrom(String.class)){
-                        value = (Z) resultSet.getString(2);
-                    }else{
-                        value = (Z) valueType.getMethod("valueOf", String.class).invoke(null,resultSet.getString(2));
-                    }
-                    result.put(key, value);
-                }
-                if(resultSet!=null){
-                    resultSet.close();
-                }
-                if(ps!=null){
-                    ps.close();
-                }
-                if(sqlSession!=null){
-                    sqlSession.close();
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
-            }finally {
-                if(ps!=null){
-                    try {
-                        ps.close();
-                    } catch (SQLException e) {
-                    }
-                }
-                if(sqlSession!=null){
-                    sqlSession.close();
-                }
-                if(connection!=null){
-                    try {
-                        connection.close();
-                    } catch (SQLException e) {
-                    }
-                }
-            }
+	@Override
+	public <K extends List, Y, Z> Map<Y,Z> getMap(String tableName, String columnKey, String columnValue, String ids, Class<Y> keyType, Class<Z> valueType){
+		if(StringUtils.isEmpty(ids)){
+			return Collections.emptyMap();
+		}
+		StringBuffer sql=new StringBuffer();
+		Map<Y,Z> result=new HashMap();
+		SqlSession sqlSession = null;
+		Connection connection = null;
+		PreparedStatement ps = null;
+		ResultSet resultSet = null;
+		try {
+			sqlSession = sqlSessionFactory.openSession();
+			connection = sqlSession.getConnection();
+			sql.append("SELECT ").append(columnKey).append(",").append(columnValue).append(" FROM ").append(tableName).append(" WHERE ").append(columnKey).append(" IN (").append(ids).append(")");
+			ps = connection.prepareStatement(sql.toString());
+			resultSet = ps.executeQuery();
+			while (resultSet.next()){
+				Y key;
+				Z value;
+				if(keyType.isAssignableFrom(BigDecimal.class)){
+					key = (Y) BigDecimal.class.getDeclaredConstructor(String.class).newInstance(resultSet.getString(1));
+				}else if(keyType.isAssignableFrom(String.class)){
+					key = (Y) resultSet.getString(1);
+				}else{
+					key = (Y) keyType.getMethod("valueOf", String.class).invoke(null,resultSet.getString(1));
+				}
+				if(valueType.isAssignableFrom(BigDecimal.class)){
+					value = (Z) BigDecimal.class.getDeclaredConstructor(String.class).newInstance(resultSet.getString(2));
+				}else if(valueType.isAssignableFrom(String.class)){
+					value = (Z) resultSet.getString(2);
+				}else{
+					value = (Z) valueType.getMethod("valueOf", String.class).invoke(null,resultSet.getString(2));
+				}
+				result.put(key, value);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}finally {
+			if(resultSet!=null){
+				try {
+					resultSet.close();
+				} catch (SQLException e) {
+					e.printStackTrace();
+				}
+			}
+			if(ps!=null){
+				try {
+					ps.close();
+				} catch (SQLException e) {
+					e.printStackTrace();
+				}
+			}
+			if(sqlSession!=null){
+				sqlSession.close();
+			}
+		}
 
             return result;
         }
 
 
-        @Override
-        public <K extends List, Y, Z> Map<Y,Z> getMap(String tableName, String columnKey, String columnValue,Boolean hasDelFlag,Integer tenantId, Class<Y> keyType, Class<Z> valueType){
-            StringBuffer sql=new StringBuffer();
-            Map<Y,Z> result=new HashMap();
-
-            SqlSession sqlSession = null;
-            Connection connection = null;
-            PreparedStatement ps = null;
-            try {
-                sqlSession = sqlSessionFactory.openSession();
-                connection = sqlSession.getConnection();
-                sql.append("SELECT ").append(columnKey).append(",").append(columnValue).append(" FROM ").append(tableName).append(" WHERE 1 = 1");
-                if(hasDelFlag){
-                    sql.append(" AND del_flag_ = 0");
-                }
-                if(tenantId != null){
-                    sql.append(" AND tenant_id_ = ").append(tenantId);
-                }
-                ps = connection.prepareStatement(sql.toString());
-                ResultSet resultSet = ps.executeQuery();
-                while (resultSet.next()){
-                    Y key;
-                    Z value;
-                    if(keyType.isAssignableFrom(BigDecimal.class)){
-                        key = (Y) BigDecimal.class.getDeclaredConstructor(String.class).newInstance(resultSet.getString(1));
-                    }else if(keyType.isAssignableFrom(String.class)){
-                        key = (Y) resultSet.getString(1);
-                    }else{
-                        key = (Y) keyType.getMethod("valueOf", String.class).invoke(null,resultSet.getString(1));
-                    }
-                    if(valueType.isAssignableFrom(BigDecimal.class)){
-                        value = (Z) BigDecimal.class.getDeclaredConstructor(String.class).newInstance(resultSet.getString(2));
-                    }else if(valueType.isAssignableFrom(String.class)){
-                        value = (Z) resultSet.getString(2);
-                    }else{
-                        value = (Z) valueType.getMethod("valueOf", String.class).invoke(null,resultSet.getString(2));
-                    }
-                    result.put(key, value);
-                }
-                if(resultSet!=null){
-                    resultSet.close();
-                }
-                if(ps!=null){
-                    ps.close();
-                }
-                if(sqlSession!=null){
-                    sqlSession.close();
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
-            }finally {
-                if(ps!=null){
-                    try {
-                        ps.close();
-                    } catch (SQLException e) {
-                    }
-                }
-                if(sqlSession!=null){
-                    sqlSession.close();
-                }
-                if(connection!=null){
-                    try {
-                        connection.close();
-                    } catch (SQLException e) {
-                    }
-                }
-            }
+	@Override
+	public <K extends List, Y, Z> Map<Y,Z> getMap(String tableName, String columnKey, String columnValue,Boolean hasDelFlag,Integer tenantId, Class<Y> keyType, Class<Z> valueType){
+		StringBuffer sql=new StringBuffer();
+		Map<Y,Z> result=new HashMap();
+		SqlSession sqlSession = null;
+		Connection connection = null;
+		PreparedStatement ps = null;
+		ResultSet resultSet = null;
+		try {
+			sqlSession = sqlSessionFactory.openSession();
+			connection = sqlSession.getConnection();
+			sql.append("SELECT ").append(columnKey).append(",").append(columnValue).append(" FROM ").append(tableName).append(" WHERE 1 = 1");
+			if(hasDelFlag){
+				sql.append(" AND del_flag_ = 0");
+			}
+			if(tenantId != null){
+				sql.append(" AND tenant_id_ = ").append(tenantId);
+			}
+			ps = connection.prepareStatement(sql.toString());
+			resultSet = ps.executeQuery();
+			while (resultSet.next()){
+				Y key;
+				Z value;
+				if(keyType.isAssignableFrom(BigDecimal.class)){
+					key = (Y) BigDecimal.class.getDeclaredConstructor(String.class).newInstance(resultSet.getString(1));
+				}else if(keyType.isAssignableFrom(String.class)){
+					key = (Y) resultSet.getString(1);
+				}else{
+					key = (Y) keyType.getMethod("valueOf", String.class).invoke(null,resultSet.getString(1));
+				}
+				if(valueType.isAssignableFrom(BigDecimal.class)){
+					value = (Z) BigDecimal.class.getDeclaredConstructor(String.class).newInstance(resultSet.getString(2));
+				}else if(valueType.isAssignableFrom(String.class)){
+					value = (Z) resultSet.getString(2);
+				}else{
+					value = (Z) valueType.getMethod("valueOf", String.class).invoke(null,resultSet.getString(2));
+				}
+				result.put(key, value);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}finally {
+			if(resultSet!=null){
+				try {
+					resultSet.close();
+				} catch (SQLException e) {
+					e.printStackTrace();
+				}
+			}
+			if(ps!=null){
+				try {
+					ps.close();
+				} catch (SQLException e) {
+					e.printStackTrace();
+				}
+			}
+			if(sqlSession!=null){
+				sqlSession.close();
+			}
+		}
 
             return result;
         }

+ 51 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/CourseHomeworkController.java

@@ -2,6 +2,7 @@ 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.CourseHomeworkDao;
 import com.ym.mec.biz.dal.dto.CourseHomeworkStudentDetailDto;
 import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
 import com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper;
@@ -14,6 +15,7 @@ import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.service.CourseHomeworkService;
 import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
 import com.ym.mec.biz.service.StudentCourseHomeworkService;
+import com.ym.mec.biz.service.StudentLessonTrainingDetailService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
@@ -30,7 +32,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 /**
@@ -51,6 +55,12 @@ public class CourseHomeworkController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
+
+    @Autowired
+    private CourseHomeworkDao courseHomeworkDao;
+
     @ApiOperation(value = "布置课堂作业")
     @GetMapping("/addCourseHomework")
     @AuditLogAnnotation(operateName = "布置课堂作业")
@@ -171,6 +181,47 @@ public class CourseHomeworkController extends BaseController {
 
 
 
+    @ApiOperation(value = "根据课程计划获取需要交作业的学生统计")
+    @PostMapping("/findCourseStudentsPublicSubject/v2")
+    public HttpResponseResult<CourseHomeworkWrapper.StudentHomeworkRecordStat> findCourseStudentsPublicSubjectV2(@Validated @RequestBody StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query){
+        List<StudentCourseHomework> list;
+        if(ELessonTrainingType.HOMEWORK.equals(query.getType())){
+            if (Objects.isNull(query.getCourseScheduleId())) {
+                throw new BizException("请指定课程");
+            }
+            list =  (studentCourseHomeworkService.findStudentCourseHomeworkByCourseV2(query));
+        }else{
+            list =  (studentCourseHomeworkService.findExtraExerciseStudentsV2(query));
+        }
+
+        CourseHomeworkWrapper.StudentHomeworkRecordStat stat = new CourseHomeworkWrapper.StudentHomeworkRecordStat();
+        stat.setAllNum(list.size());
+        stat.setFinishNum((int) list.stream().filter(StudentCourseHomework::getFinishFlag).count());
+        stat.setUnFinishNum(stat.getAllNum()-stat.getFinishNum());
+        stat.setStudentCourseHomeworkList(list);
+        return succeed(stat);
+
+    }
+
+
+    @ApiOperation(value = "老师练习详情的练习组内作业信息")
+    @PostMapping("/findHomeworkGroupInfo")
+    public HttpResponseResult<List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> findHomeworkGroupInfo(@Validated @RequestBody StudentLessonTrainingDetailWrapper.HomeworkGroupInfoQuery query){
+
+        if (ELessonTrainingType.HOMEWORK.equals(query.getType())) {
+            CourseHomework courseHomework = courseHomeworkDao.findByCourseSchedule(query.getCourseScheduleId().longValue());
+            if(Objects.isNull(courseHomework)){
+                throw new BizException("作业不存在");
+            }
+            query.setCourseScheduleId(courseHomework.getId().intValue());
+        }
+        Map<Integer, List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> groupMap = studentLessonTrainingDetailService.getGroupMap(query.getCourseScheduleId().longValue(), query.getType());
+
+
+        return succeed(groupMap.get(query.getGroup()));
+
+    }
+
     @ApiOperation(value = "查询单个学生的训练")
     @GetMapping("/findCourseHomeworkStudentDetailPublic/v2")
     public HttpResponseResult<StudentLessonTrainingDetailWrapper.StudentLessonTraining> findCourseHomeworkStudentDetailPublicV2(@RequestParam Long courseScheduleId, @RequestParam Long userId, @RequestParam ELessonTrainingType type){

+ 37 - 8
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherController.java

@@ -4,7 +4,10 @@ import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
 import com.ym.mec.biz.dal.dao.SubjectDao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;
+import com.ym.mec.biz.dal.entity.StudentCourseHomework;
+import com.ym.mec.biz.dal.entity.Subject;
 import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
@@ -15,14 +18,11 @@ import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.*;
 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;
-
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
 import java.util.stream.Collectors;
 
 @RequestMapping("teacher")
@@ -47,6 +47,9 @@ public class TeacherController extends BaseController {
 	@Autowired
     private StudentRegistrationService studentRegistrationService;
 
+    @Autowired
+    private StudentCourseHomeworkService studentCourseHomeworkService;
+
     @ApiOperation(value = "修改教师个人中心信息")
     @PostMapping("/update")
     public Object update(Teacher teacher) {
@@ -191,4 +194,30 @@ public class TeacherController extends BaseController {
         return succeed(teacherService.queryTeacherMusicStudentOverViewV2(queryInfo));
     }
 
+
+
+    @ApiOperation(value = "根据课程计划获取需要交作业的学生声部-公用")
+    @PostMapping("/findCourseStudentsSubjectPublic/v2")
+    public HttpResponseResult<List<Subject>> findCourseStudentsSubjectPublicV2(@Validated @RequestBody StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query){
+        List<StudentCourseHomework> studentCourseHomeworkByCourseV2;
+        if(ELessonTrainingType.HOMEWORK.equals(query.getType())){
+            if (Objects.isNull(query.getCourseScheduleId())) {
+                throw new BizException("请指定课程");
+            }
+            studentCourseHomeworkByCourseV2 = studentCourseHomeworkService.findStudentCourseHomeworkByCourseV2(
+                    query);
+        }else{
+            studentCourseHomeworkByCourseV2 = studentCourseHomeworkService.findExtraExerciseStudentsV2(query);
+        }
+
+        if (CollectionUtils.isEmpty(studentCourseHomeworkByCourseV2)) {
+            return succeed(new ArrayList<>());
+        }
+        // 获取声部
+        List<Integer> collect = studentCourseHomeworkByCourseV2.stream().map(StudentCourseHomework::getSubjectId).collect(
+                Collectors.toList());
+
+        return succeed(subjectService.findBySubjectByIdList(collect));
+
+    }
 }

+ 1 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/Payment.java

@@ -6,6 +6,7 @@ import java.util.*;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.huifu.adapay.core.exception.BaseAdaPayException;
+import com.huifu.adapay.core.util.StringUtil;
 import com.huifu.adapay.model.PaymentReverse;
 import com.huifu.adapay.model.Refund;
 import com.ym.mec.thirdparty.adapay.entity.BaseResult;

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java

@@ -329,7 +329,7 @@ public class ClassGroupController extends BaseController {
     @GetMapping("/queryClassGroupPage")
     @PreAuthorize("@pcs.hasPermissions('classGroup/queryClassGroupPage')")
     public HttpResponseResult queryClassGroupPage(ClassGroupQueryInfo queryInfo){
-        queryInfo = organizationService.onlyEducation(queryInfo);
+        queryInfo.setOrganIds(organizationService.getEmployeeOrgan(queryInfo.getOrganIds()));
         return succeed(classGroupService.queryClassGroupPage(queryInfo));
     }
 

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -1892,7 +1892,7 @@ public class ExportController extends BaseController {
         }
         queryInfo.setPage(1);
         queryInfo.setRows(49999);
-        queryInfo.setIsExport(true);
+        queryInfo.setExport(true);
         ManagerDownload managerDownload = exportService.saveManagerDownload(ExportTypeEnum.COURSE_SCHEDULE, sysUser.getId());
         TenantContextHolder.setTenantId(tenantId);
         HttpResponseResult succeed = exportService.asyncExport(() -> exportService.superFindCourseSchedules(queryInfo, managerDownload), managerDownload.getName());

+ 16 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ImportController.java

@@ -3,6 +3,7 @@ package com.ym.mec.web.controller;
 import com.ym.mec.biz.dal.entity.FinancialExpenditure;
 import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder;
+import com.ym.mec.biz.dal.entity.StudentVisit;
 import com.ym.mec.biz.dal.enums.TemplateTypeEnum;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
@@ -22,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.util.CollectionUtils;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -55,6 +57,8 @@ public class ImportController extends BaseController {
     private TempBuyFreeLiveTheoryCourseService liveTheoryCourseService;
     @Autowired
     private MusicGroupService musicGroupService;
+    @Autowired
+    private StudentVisitService studentVisitService;
 
 
     @ApiOperation(value = "导入商品")
@@ -204,4 +208,16 @@ public class ImportController extends BaseController {
             return failed(StringUtils.join(errMsg, ","));
         }
     }
+
+    @ApiOperation(value = "批量导入乐团回访")
+    @PostMapping(value = "/importMusicVisit")
+    @PreAuthorize("@pcs.hasPermissions('import/importMusicVisit')")
+    public HttpResponseResult<StudentVisit> importMusicVisit(@RequestParam("file") MultipartFile file) throws Exception {
+        List<String> errMsg = studentVisitService.importMusicVisit(file);
+        if (CollectionUtils.isEmpty(errMsg)) {
+            return succeed();
+        } else {
+            return failed(StringUtils.join(errMsg, ","));
+        }
+    }
 }

+ 14 - 5
mec-web/src/main/java/com/ym/mec/web/controller/TeacherController.java

@@ -3,6 +3,7 @@ package com.ym.mec.web.controller;
 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.dal.page.*;
 import com.ym.mec.biz.service.ClassGroupService;
 import com.ym.mec.biz.service.CourseHomeworkService;
@@ -76,8 +77,8 @@ public class TeacherController extends BaseController {
     public HttpResponseResult<PageInfo<Teacher>> queryPage(TeacherQueryInfo queryInfo) {
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(queryInfo.getOrganId()));
         if(queryInfo.getTenantId() == 28){
-        	queryInfo.setTenantId(1);
-        	queryInfo.setOrganId(null);
+            queryInfo.setTenantId(1);
+            queryInfo.setOrganId(null);
         }
         return succeed(teacherService.queryPageDetail(queryInfo));
     }
@@ -116,7 +117,7 @@ public class TeacherController extends BaseController {
         organId = organizationService.getEmployeeOrgan(organId);
         demissionFlag = false;
         if(isForzenWithQueryCondition == null){
-        	isForzenWithQueryCondition = false;
+            isForzenWithQueryCondition = false;
         }
         return succeed(teacherService.findTeachers(organId,demissionFlag,isForzenWithQueryCondition));
     }
@@ -236,14 +237,22 @@ public class TeacherController extends BaseController {
     @ApiOperation(value = "根据课程计划获取需要交作业的学生-公用")
     @PostMapping("/findCourseStudentsPublic/v2")
     public HttpResponseResult<List<StudentCourseHomework>> findCourseStudentsPublicV2(@Validated @RequestBody StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query){
+        List<StudentCourseHomework>  result = new ArrayList<>();
         if(ELessonTrainingType.HOMEWORK.equals(query.getType())){
             if (Objects.isNull(query.getCourseScheduleId())) {
                 throw new BizException("请指定课程");
             }
-            return succeed(studentCourseHomeworkService.findStudentCourseHomeworkByCourseV2(query));
+            result = studentCourseHomeworkService.findStudentCourseHomeworkByCourseV2(query);
         }else{
-            return succeed(studentCourseHomeworkService.findExtraExerciseStudentsV2(query));
+            result = studentCourseHomeworkService.findExtraExerciseStudentsV2(query);
         }
+        // 完成才返回提交时间
+        for (StudentCourseHomework studentCourseHomework : result) {
+            if (!StandardEnum.STANDARD.equals(studentCourseHomework.getStandardFlag())) {
+                studentCourseHomework.setSubmitTime(null);
+            }
+        }
+        return succeed(result);
     }
 
 

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/VisitController.java

@@ -54,6 +54,7 @@ public class VisitController extends BaseController {
         studentVisit.setVisiterType(StudentVisit.VisiterTypeEnum.EDU_TEACHER);
         return succeed(studentVisitService.addVisit(studentVisit));
     }
+
     @ApiOperation(value = "修改问题状态")
     @PostMapping(value = "/updateProbStatus")
     @PreAuthorize("@pcs.hasPermissions('visit/updateProbStatus')")
@@ -64,7 +65,6 @@ public class VisitController extends BaseController {
         }else{
             return failed(s);
         }
-
     }
 
 

+ 9 - 1
mec-web/src/main/resources/columnMapper.ini

@@ -121,4 +121,12 @@ ID = id
 手机号 = phone
 声部 = subjectName
 年级 = grade
-班级 = currentClass
+班级 = currentClass
+
+[缴费中乐团批量回访]
+乐团编号 = musicGroupId
+手机号 = phone
+回访日期 = visitTime
+学员情况 = overview
+家长反馈 = feedback
+问题状态 = probStatus