Explorar o código

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

yonge %!s(int64=2) %!d(string=hai) anos
pai
achega
3228d1d467
Modificáronse 55 ficheiros con 866 adicións e 314 borrados
  1. 10 0
      cms/src/main/java/com/ym/mec/cms/dal/entity/SysNewsInformation.java
  2. 18 1
      cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsInformationServiceImpl.java
  3. 3 0
      cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml
  4. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ManagerDownloadDao.java
  5. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentOperatingVisitDao.java
  6. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicCompareRecordDao.java
  7. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkStudentDetailDto.java
  8. 90 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportCompareRecordDto.java
  9. 2 12
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportDto.java
  10. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExtraExerciseStudentsDto.java
  11. 17 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java
  12. 70 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentOperatingVisit.java
  13. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentVisit.java
  14. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportEnum.java
  15. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java
  16. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ExportCompareQueryInfo.java
  17. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentVipGroupQueryInfo.java
  18. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherQueryInfo.java
  19. 13 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/VipGroupQueryInfo.java
  20. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeService.java
  21. 15 15
      mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java
  22. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ManagerDownloadService.java
  23. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java
  24. 8 22
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  25. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java
  26. 147 129
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  27. 4 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java
  28. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ManagerDownloadServiceImpl.java
  29. 17 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  30. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentVisitServiceImpl.java
  31. 20 20
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  32. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  33. 15 11
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  34. 3 1
      mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesReplyMapper.xml
  35. 1 0
      mec-biz/src/main/resources/config/mybatis/ImGroupMapper.xml
  36. 3 0
      mec-biz/src/main/resources/config/mybatis/ManagerDownloadMapper.xml
  37. 3 0
      mec-biz/src/main/resources/config/mybatis/PracticeGroupMapper.xml
  38. 2 0
      mec-biz/src/main/resources/config/mybatis/StudentCourseHomeworkMapper.xml
  39. 68 0
      mec-biz/src/main/resources/config/mybatis/StudentOperatingVisitMapper.xml
  40. 7 3
      mec-biz/src/main/resources/config/mybatis/StudentVisitMapper.xml
  41. 47 0
      mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  42. 7 1
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  43. 6 0
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  44. 9 0
      mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java
  45. 9 0
      mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java
  46. 6 27
      mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java
  47. 10 11
      mec-student/src/main/java/com/ym/mec/student/controller/StudentVipGroupController.java
  48. 1 2
      mec-util/src/main/java/com/ym/mec/util/excel/POIUtil.java
  49. 24 4
      mec-web/src/main/java/com/ym/mec/web/controller/APIController.java
  50. 17 8
      mec-web/src/main/java/com/ym/mec/web/controller/EmployeeController.java
  51. 1 4
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  52. 13 0
      mec-web/src/main/java/com/ym/mec/web/controller/ManagerDownloadController.java
  53. 5 10
      mec-web/src/main/java/com/ym/mec/web/controller/VisitController.java
  54. 15 11
      mec-web/src/main/java/com/ym/mec/web/controller/education/EducationCourseScheduleController.java
  55. 9 5
      mec-web/src/main/resources/exportColumnMapper.ini

+ 10 - 0
cms/src/main/java/com/ym/mec/cms/dal/entity/SysNewsInformation.java

@@ -81,6 +81,16 @@ public class SysNewsInformation extends BaseEntity {
 	
 	private String organNameList;
 
+	private Boolean redDot = false;
+
+	public Boolean getRedDot() {
+		return redDot;
+	}
+
+	public void setRedDot(Boolean redDot) {
+		this.redDot = redDot;
+	}
+
 	public String getLinkUrl() {
 		return linkUrl;
 	}

+ 18 - 1
cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsInformationServiceImpl.java

@@ -12,8 +12,10 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.web.WebFeignService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.util.*;
 
@@ -22,6 +24,8 @@ public class SysNewsInformationServiceImpl extends BaseServiceImpl<Long, SysNews
 
 	@Autowired
 	private SysNewsInformationDao sysNewsInformationDao;
+	@Autowired
+	private WebFeignService webFeignService;
 
 	@Override
 	public BaseDAO<Long, SysNewsInformation> getDAO() {
@@ -81,7 +85,20 @@ public class SysNewsInformationServiceImpl extends BaseServiceImpl<Long, SysNews
 		if(count == 0){
 			queryInfo.setMemo(null);
 		}
-		homeList.put("app",queryHomePage(queryInfo));
+		PageInfo<SysNewsInformation> app = queryHomePage(queryInfo);
+		if(!CollectionUtils.isEmpty(app.getRows()) && user != null && user.getId() != null){
+			for (SysNewsInformation row : app.getRows()) {
+				if(row.getTitle().equals("进阶课堂")){
+					try {
+						//当前学员是否有可购买vip课
+						row.setRedDot(webFeignService.queryVipPracticeGroups());
+					}catch (Exception e){
+						e.printStackTrace();
+					}
+				}
+			}
+		}
+		homeList.put("app",app);
 		return homeList;
 	}
 	

+ 3 - 0
cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml

@@ -307,6 +307,9 @@
 		<if test="subType != null">
 			AND sub_type_ = #{subType}
 		</if>
+		<if test="memo == null or memo == ''">
+			AND (memo_ IS NULL OR memo_ = '')
+		</if>
 		<if test="memo != null and memo !=''">
 			AND memo_ = #{memo}
 		</if>

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

@@ -2,7 +2,9 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.entity.ManagerDownload;
 import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
 
 public interface ManagerDownloadDao extends BaseDAO<Integer,ManagerDownload> {
 
+    void batchDel(@Param("ids") String ids);
 }

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

@@ -0,0 +1,18 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.biz.dal.entity.StudentOperatingVisit;
+import org.apache.ibatis.annotations.Param;
+
+public interface StudentOperatingVisitDao extends BaseDAO<Long, StudentOperatingVisit> {
+
+
+    /**
+    * @description: 更新本月回访标记
+     * @param studentId
+    * @return void
+    * @author zx
+    * @date 2022/8/12 16:26
+    */
+    void updateVisit(@Param("studentId") Integer studentId);
+}

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

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
 import com.ym.mec.biz.dal.entity.SysMusicCompareWeekData;
 import com.ym.mec.biz.dal.enums.HeardLevelEnum;
+import com.ym.mec.biz.dal.page.ExportCompareQueryInfo;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
@@ -101,4 +102,8 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
                                         @Param("heardLevel") HeardLevelEnum heardLevel);
     
     int queryCurrentDatePlayTimeByUserId(Integer userId);
+
+    List<ExportCompareRecordDto> exportCompareRecord(@Param("queryInfo") ExportCompareQueryInfo queryInfo);
+
+    int countExportCompareRecord(@Param("queryInfo") ExportCompareQueryInfo queryInfo);
 }

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkStudentDetailDto.java

@@ -88,6 +88,28 @@ public class CourseHomeworkStudentDetailDto {
 
     private Date submitTime;
 
+    @ApiModelProperty(value = "是否可以提交作业",required = false)
+    private Boolean submitFlag = true;
+
+    @ApiModelProperty(value = "作业创建时间",required = false)
+    private Date createTime;
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Boolean getSubmitFlag() {
+        return submitFlag;
+    }
+
+    public void setSubmitFlag(Boolean submitFlag) {
+        this.submitFlag = submitFlag;
+    }
+
     public Date getSubmitTime() {
         return submitTime;
     }

+ 90 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportCompareRecordDto.java

@@ -0,0 +1,90 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class ExportCompareRecordDto{
+
+    private String organName;
+
+    private Integer userId;
+
+    private String username;
+
+    private String phone;
+
+    @ApiModelProperty(value = "训练时长")
+    private Integer playTime;
+
+    @ApiModelProperty(value = "训练次数")
+    private Integer playNum;
+
+    @ApiModelProperty(value = "训练天数")
+    private Integer playDays;
+
+    @ApiModelProperty(value = "评测次数")
+    private Integer heardNum;
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getPlayTime() {
+        return playTime;
+    }
+
+    public void setPlayTime(Integer playTime) {
+        this.playTime = playTime;
+    }
+
+    public Integer getPlayNum() {
+        return playNum;
+    }
+
+    public void setPlayNum(Integer playNum) {
+        this.playNum = playNum;
+    }
+
+    public Integer getPlayDays() {
+        return playDays;
+    }
+
+    public void setPlayDays(Integer playDays) {
+        this.playDays = playDays;
+    }
+
+    public Integer getHeardNum() {
+        return heardNum;
+    }
+
+    public void setHeardNum(Integer heardNum) {
+        this.heardNum = heardNum;
+    }
+}

+ 2 - 12
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportDto.java

@@ -7,18 +7,16 @@ import java.util.List;
 import java.util.Map;
 
 public class ExportDto {
+
     public ExportDto() {
     }
 
-    public ExportDto(ExportEnum exportEnum, List<String> headColumns) {
+    public ExportDto(ExportEnum exportEnum) {
         this.exportEnum = exportEnum;
-        this.headColumns = headColumns;
     }
 
     private ExportEnum exportEnum;
 
-    private List<String> headColumns;
-
     private Map<String,Object> queryInfo = new HashMap<>();
 
     public Map<String, Object> getQueryInfo() {
@@ -36,12 +34,4 @@ public class ExportDto {
     public void setExportEnum(ExportEnum exportEnum) {
         this.exportEnum = exportEnum;
     }
-
-    public List<String> getHeadColumns() {
-        return headColumns;
-    }
-
-    public void setHeadColumns(List<String> headColumns) {
-        this.headColumns = headColumns;
-    }
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExtraExerciseStudentsDto.java

@@ -41,6 +41,17 @@ public class ExtraExerciseStudentsDto extends ExtracurricularExercisesReply {
 
     private String existVipCourseStr;
 
+    @ApiModelProperty(value = "作业创建时间")
+    private Date homeworkCreateTime;
+
+    public Date getHomeworkCreateTime() {
+        return homeworkCreateTime;
+    }
+
+    public void setHomeworkCreateTime(Date homeworkCreateTime) {
+        this.homeworkCreateTime = homeworkCreateTime;
+    }
+
     public String getMusicScoreId() {
         return musicScoreId;
     }

+ 17 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java

@@ -173,6 +173,20 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
         COURSE_SCHOOL_BUY("COURSE_SCHOOL_BUY", "课程学校采买"),
         COURSE_STUDENT_BUY("COURSE_STUDENT_BUY", "课程家长采买"),
         LARGE_MUSICAL("LARGE_MUSICAL", "大件乐器"),
+        LEVEL("LEVEL","考级"),
+        SUBJECT_CHARGE("SUBJECT_CHARGE","声部更改"),
+        MUSIC_CHARGE("MUSIC_CHARGE","乐器更换"),
+        PARTS_SELL("PARTS_SELL","配件销售"),
+        SERVICE_FEE("SERVICE_FEE","维修费"),
+        LUCKY_BAG_ACTIVE("LUCKY_BAG_ACTIVE","福袋活动"),
+        VISITING_FEE("VISITING_FEE","上门费"),
+        VIP_BUY("VIP_BUY","VIP课购买"),
+        RECHARGE("RECHARGE","账户充值"),
+        MUSIC_UPKEEP("MUSIC_UPKEEP","乐保服务"),
+        DOUBLE_ELEVEN2020("DOUBLE_ELEVEN2020","2020双十一活动"),
+        HIGH_ONLINE_ACTIVITY("HIGH_ONLINE_ACTIVITY","网基课活动"),
+        PRACTICE_GROUP_BUY("PRACTICE_GROUP_BUY","加油包"),
+        CLOUD_TEACHER_BUY("CLOUD_TEACHER_BUY","系统购买"),
         OTHER("OTHER", "其他");
 
         private String code;
@@ -198,7 +212,7 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
     //学员没有历史VIP课程则导出为【VIP课新增】
     //学员有历史VIP课程到导出为【VIP课续费】……
     @ApiModelProperty(value = "课程形态描述",required = true)
-    private TypeDesc typeDesc;
+    private String typeDesc;
 
     //该笔订单为乐团订单则导出该乐团的【乐团名称】
     //该笔订单非乐团订单时,查询学员是否有在读乐团,无则导出为空,有则导出该学员【进行中】【暂停】乐团名称,进行中>暂停,多个进行中则导出加入乐团时间最近的乐团名称
@@ -259,11 +273,11 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
         this.feeMusicGroupId = feeMusicGroupId;
     }
 
-    public TypeDesc getTypeDesc() {
+    public String getTypeDesc() {
         return typeDesc;
     }
 
-    public void setTypeDesc(TypeDesc typeDesc) {
+    public void setTypeDesc(String typeDesc) {
         this.typeDesc = typeDesc;
     }
 

+ 70 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentOperatingVisit.java

@@ -0,0 +1,70 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(student_operating_visit):
+ */
+public class StudentOperatingVisit {
+
+	/**  */
+	private Long id;
+	
+	/** 学员编号 */
+	private Integer userId;
+	
+	/** 当前月 */
+	private java.util.Date month;
+	
+	/** 是否回访 */
+	private boolean visitFlag;
+	
+	/** 分部 */
+	private Integer organId;
+	
+	public void setId(Long id){
+		this.id = id;
+	}
+	
+	public Long getId(){
+		return this.id;
+	}
+			
+	public void setUserId(Integer userId){
+		this.userId = userId;
+	}
+	
+	public Integer getUserId(){
+		return this.userId;
+	}
+			
+	public void setMonth(java.util.Date month){
+		this.month = month;
+	}
+	
+	public java.util.Date getMonth(){
+		return this.month;
+	}
+			
+	public void setVisitFlag(boolean visitFlag){
+		this.visitFlag = visitFlag;
+	}
+	
+	public boolean isVisitFlag(){
+		return this.visitFlag;
+	}
+			
+	public void setOrganId(Integer organId){
+		this.organId = organId;
+	}
+	
+	public Integer getOrganId(){
+		return this.organId;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

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

@@ -190,6 +190,17 @@ public class StudentVisit extends BaseEntity {
 
     private Long objectId;
 
+    @ApiModelProperty(value = "回访图片", required = true)
+    private String attachments;
+
+    public String getAttachments() {
+        return attachments;
+    }
+
+    public void setAttachments(String attachments) {
+        this.attachments = attachments;
+    }
+
     public FeedbackTypeDescEnum getFeedbackTypeDesc() {
         return feedbackTypeDesc;
     }

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

@@ -76,6 +76,7 @@ public enum ExportEnum implements BaseEnum<String, ExportEnum> {
     EXERCISES_SITUATION("EXERCISES_SITUATION", "服务指标导出"),
     EXPORT_STUDENT_SUBCOURSE("EXPORT_STUDENT_SUBCOURSE", "活动资格导出"),
     EXPORT_STUDENT_SERVE_INFO("EXPORT_STUDENT_SERVE_INFO", "乐团学生服务指标导出"),
+    EXPORT_TRAINING_STATISTICS("EXPORT_TRAINING_STATISTICS", "训练统计导出"),
     ;
 
     private String code;

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

@@ -15,7 +15,8 @@ public enum ExportTypeEnum implements BaseEnum<Integer, ExportTypeEnum> {
 	MUSIC_GROUP_COURSE_LIST(9, "乐团课表详情导出"),
 	MUSIC_GROUP_DATA_EXPORT(10, "乐团数据导出"),
 	EXPORT_STUDENT_SUBCOURSE(11, "活动资格导出"),
-	EXPORT_STUDENT_SERVE_INFO(12, "乐团学生服务指标导出");
+	EXPORT_STUDENT_SERVE_INFO(12, "乐团学生服务指标导出"),
+	EXPORT_TRAINING_STATISTICS(13, "训练统计导出");
 	;
 
 	private Integer code;

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ExportCompareQueryInfo.java

@@ -0,0 +1,32 @@
+package com.ym.mec.biz.dal.page;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+* @author zx
+* @date 2021/9/26 15:52
+*/
+public class ExportCompareQueryInfo extends BaseOrganQueryInfo {
+
+    @ApiModelProperty(value = "开始时间(年月日)")
+    private String startDate;
+
+    @ApiModelProperty(value = "结束时间(年月日)")
+    private String endDate;
+
+    public String getStartDate() {
+        return startDate;
+    }
+
+    public void setStartDate(String startDate) {
+        this.startDate = startDate;
+    }
+
+    public String getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(String endDate) {
+        this.endDate = endDate;
+    }
+}

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentVipGroupQueryInfo.java

@@ -3,6 +3,8 @@ package com.ym.mec.biz.dal.page;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
 
+import java.util.Date;
+
 /**
  * @Author Joburgess
  * @Date 2019/9/25
@@ -24,6 +26,17 @@ public class StudentVipGroupQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "分部编号")
     private Integer organId;
 
+    @ApiModelProperty(value = "是否剔除已缴费截止数据")
+    private Boolean expireFlag = false;
+
+    public Boolean getExpireFlag() {
+        return expireFlag;
+    }
+
+    public void setExpireFlag(Boolean expireFlag) {
+        this.expireFlag = expireFlag;
+    }
+
     public Integer getOrganId() {
         return organId;
     }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherQueryInfo.java

@@ -27,6 +27,17 @@ public class TeacherQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "是否结算课酬")
     private Boolean isSettlementSalary;
 
+    @ApiModelProperty(value = "是否离职")
+    private Boolean demissionFlag;
+
+    public Boolean getDemissionFlag() {
+        return demissionFlag;
+    }
+
+    public void setDemissionFlag(Boolean demissionFlag) {
+        this.demissionFlag = demissionFlag;
+    }
+
     public Boolean getIsSettlementSalary() {
         return isSettlementSalary;
     }

+ 13 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/page/VipGroupQueryInfo.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.page;
 
 import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
 
 /**
  * @Author Joburgess
@@ -23,7 +24,18 @@ public class VipGroupQueryInfo extends QueryInfo {
     private Integer educationalTeacherId;
 
     private Boolean hasEducationalTeacherId;
-    
+
+    @ApiModelProperty(value = "上课时间,年月日",required = false)
+    private String classDate;
+
+    public String getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(String classDate) {
+        this.classDate = classDate;
+    }
+
     public Boolean getHasEducationalTeacherId() {
         return hasEducationalTeacherId;
     }

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

@@ -79,4 +79,6 @@ public interface EmployeeService extends BaseService<Integer, Employee> {
     void simpleUpdate(Employee employee);
 
     PageInfo<SysUserDto> queryEmployeeBasicInfo(UserBasicQueryInfo queryInfo);
+
+    void resetPassword(Integer userId);
 }

+ 15 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java

@@ -30,7 +30,7 @@ public interface ExportService {
 
     <T> void export(HttpServletResponse response, List<T> rows, ExportDto exportDto) throws IOException;
 
-    Map<ExportEnum, BiFunction<Map<String, Object>,List<String>, HttpResponseResult>> getExportManageFuncMap();
+    Map<ExportEnum, Function<Map<String, Object>, HttpResponseResult>> getExportManageFuncMap();
 
     Map<ExportEnum, Function<Map<String, Object>, List>> getExportFuncMap();
 
@@ -255,45 +255,45 @@ public interface ExportService {
     void musicGroupRegister(HttpServletResponse response, ExportDto exportDto) throws IOException;
 
     //财务管理导出
-    HttpResponseResult routeOrderList(Map<String, Object> info,List<String> headColumns);
+    HttpResponseResult routeOrderList(Map<String, Object> info);
 
     //学员小课记录导出
-    HttpResponseResult exportStudentVipPractice(Map<String, Object> info,List<String> headColumns);
+    HttpResponseResult exportStudentVipPractice(Map<String, Object> info);
 
     //学员小课记录导出
-    HttpResponseResult exportStudentVipCourseInfo(Map<String, Object> info, List<String> headColumns);
+    HttpResponseResult exportStudentVipCourseInfo(Map<String, Object> info);
 
     //vip学员课程管理
-    HttpResponseResult exportVipStudentCourseManage(Map<String, Object> info, List<String> headColumns) throws Exception;
+    HttpResponseResult exportVipStudentCourseManage(Map<String, Object> info) throws Exception;
 
     //导出活动资格
-    HttpResponseResult exportStudentSubCourse(Map<String, Object> info, List<String> headColumns);
+    HttpResponseResult exportStudentSubCourse(Map<String, Object> info);
 
     //学员小课记录导出
-    HttpResponseResult exportStudentMusicTheoryCourseInfo(Map<String, Object> info, List<String> headColumns);
+    HttpResponseResult exportStudentMusicTheoryCourseInfo(Map<String, Object> info);
 
     //订单列表导出
-    HttpResponseResult orderList(Map<String, Object> info,List<String> headColumns);
+    HttpResponseResult orderList(Map<String, Object> info);
 
     //订单列表汇总导出
-    HttpResponseResult orderListSum(Map<String, Object> info,List<String> headColumns);
+    HttpResponseResult orderListSum(Map<String, Object> info);
 
     //保存下载记录
     ManagerDownload saveManagerDownload(ExportTypeEnum exportTypeEnum, Integer userId);
 
-    void orderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns);
+    void orderList(Map<String, Object> params, ManagerDownload managerDownload);
 
-    void orderListSum(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns);
+    void orderListSum(Map<String, Object> params, ManagerDownload managerDownload);
 
-    void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns);
+    void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload);
 
     void superFindCourseSchedules(EndCourseScheduleQueryInfo queryInfo, ManagerDownload managerDownload);
 
-    void studentVipPractice(String organId, ManagerDownload managerDownload, Integer tenantId,List<String> headColumns);
+    void studentVipPractice(String organId, ManagerDownload managerDownload, Integer tenantId);
 
-    void queryStudentCourseInfo(String organId, Integer tenantId, String vip, ManagerDownload managerDownload, List<String> headColumns,ExportEnum exportEnum);
+    void queryStudentCourseInfo(String organId, Integer tenantId, String vip, ManagerDownload managerDownload,ExportEnum exportEnum);
 
-    void queryVipStudentCourseManage(String organId, Integer tenantId, ManagerDownload managerDownload, List<String> headColumns, ExportEnum exportEnum);
+    void queryVipStudentCourseManage(String organId, Integer tenantId, ManagerDownload managerDownload, ExportEnum exportEnum);
 
     void exportStudentSmallClassStatisticsSum(StudentStatisticsQueryInfo queryInfo, ManagerDownload managerDownload);
 

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

@@ -5,4 +5,5 @@ import com.ym.mec.common.service.BaseService;
 
 public interface ManagerDownloadService extends BaseService<Integer, ManagerDownload> {
 
+    void batchDel(String ids);
 }

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

@@ -432,5 +432,5 @@ public interface VipGroupService extends BaseService<Long, VipGroup> {
     * @author zx
     * @date 2021/10/12 14:51
     */
-    Object queryVipPracticeGroups(StudentVipGroupQueryInfo queryInfo);
+    List<StudentVipGroupShowListDto> queryVipPracticeGroups(StudentVipGroupQueryInfo queryInfo);
 }

+ 8 - 22
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -1151,28 +1151,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         MapUtil.populateMap(params, queryInfo);
 		params.put("organIds", organIds);
 
-//        params.put("musicGroupStatus", null);
-//        params.put("vipGroupStatus", null);
-//        List<Group> groups = groupDao.searchGroups(params);
-//        if(!CollectionUtils.isEmpty(groups)){
-//            Map<GroupType, List<Group>> groupTypeGroupsMap = groups.stream().collect(Collectors.groupingBy(Group::getGroupType));
-//            List<Integer> classGroupIds=new ArrayList<>();
-//            for (Map.Entry<GroupType, List<Group>> groupTypeListEntry : groupTypeGroupsMap.entrySet()) {
-//                List<String> groupIds = groupTypeListEntry.getValue().stream().map(Group::getId).collect(Collectors.toList());
-//                List<ClassGroup> classGroups = classGroupDao.findByMusicGroupsAndType(groupIds, groupTypeListEntry.getKey().getCode());
-//                if(!CollectionUtils.isEmpty(classGroups)){
-//                    List<Integer> tempClassGroupIds=classGroups.stream().map(ClassGroup::getId).collect(Collectors.toList());
-//                    classGroupIds.addAll(tempClassGroupIds);
-//                }
-//            }
-//            if(CollectionUtils.isEmpty(classGroupIds)){
-//                return pageInfo;
-//            }
-//            params.put("classGroupIds", classGroupIds);
-//        }else{
-//            return pageInfo;
-//        }
-
         List<CourseScheduleDto> dataList = null;
         int count = courseScheduleDao.countCourseSchedulesWithDate(params);
         if (count > 0) {
@@ -4413,6 +4391,14 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         } else {
             dataList = courseScheduleDao.findGroupCourseSchedules(vipGroup.getId().toString(),GroupType.VIP.getCode());
         }
+		if(!CollectionUtils.isEmpty(dataList)){
+			if(StringUtils.isNotEmpty(queryInfo.getSearch())){
+				dataList = dataList.stream().filter(e -> (e.getId() != null && e.getId().toString().equals(queryInfo.getSearch())) || e.getName().contains(queryInfo.getSearch())).collect(Collectors.toList());
+			}
+			if(StringUtils.isNotEmpty(queryInfo.getClassDate())){
+				dataList = dataList.stream().filter(e->DateUtil.dateToString(e.getClassDate(),DateUtil.ISO_EXPANDED_DATE_FORMAT).equals(queryInfo.getClassDate())).collect(Collectors.toList());
+			}
+		}
 
         int count = dataList.size();
         if (count > 0) {

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java

@@ -581,4 +581,13 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
         pageInfo.setRows(dataList);
         return pageInfo;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void resetPassword(Integer userId) {
+        SysUser user = Optional.ofNullable(teacherDao.getUser(userId)).orElseThrow(() -> new BizException("用户不存在"));
+        //默认密码是gym+手机号后四位
+        StringBuffer gym = new StringBuffer("gym").append(user.getPhone().substring(7));
+        employeeDao.updatePassword(userId, new BCryptPasswordEncoder().encode(gym.toString()));
+    }
 }

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

@@ -38,6 +38,7 @@ import org.springframework.util.CollectionUtils;
 import javax.annotation.PostConstruct;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
+import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
@@ -178,6 +179,8 @@ public class ExportServiceImpl implements ExportService {
     private StudentStatisticsService studentStatisticsService;
     @Autowired
     private ActivityUserMapperService activityUserMapperService;
+    @Autowired
+    private SysMusicCompareRecordDao sysMusicCompareRecordDao;
 
     private static final ExecutorService exportExecutorService = Executors.newFixedThreadPool(10);
     @Autowired
@@ -190,11 +193,7 @@ public class ExportServiceImpl implements ExportService {
 
 
     @Override
-    public Map<String, String> getExportMap(ExportDto exportDto) throws IOException {
-        List<String> paramColumns = exportDto.getHeadColumns();
-        if (paramColumns == null || paramColumns.size() == 0) {
-            throw new BizException("请选择导出字段");
-        }
+    public Map<String, String> getExportMap(ExportDto exportDto){
         if (exportDto.getExportEnum() == null) {
             throw new BizException("请选择导出类型");
         }
@@ -205,12 +204,12 @@ public class ExportServiceImpl implements ExportService {
         for (int i = 0; i < headColumns.size(); i++) {
             headMap.put(headColumns.get(i), fieldColumns.get(i));
         }
-        headMap.keySet().removeAll(org.apache.commons.collections.CollectionUtils.subtract(headColumns, paramColumns));
+//        headMap.keySet().removeAll(org.apache.commons.collections.CollectionUtils.subtract(headColumns, fieldColumns));
         return headMap;
     }
 
     @Override
-    public List<String> getExportFields(ExportEnum exportEnum) throws IOException {
+    public List<String> getExportFields(ExportEnum exportEnum){
         SysUser sysUser = sysUserService.getUser();
         if (exportEnum == ExportEnum.ORDER_LIST1 || exportEnum == ExportEnum.ORDER_LIST2) {
             if (sysUser.getTenantId() <= 1) {
@@ -228,9 +227,15 @@ public class ExportServiceImpl implements ExportService {
         return JSONObject.parseObject(loadColumnMapper(exportEnum).get("headColumns"), List.class);
     }
 
-    private Map<String, String> loadColumnMapper(ExportEnum exportEnum) throws IOException {
-        InputStream inputStream = new ClassPathResource("exportColumnMapper.ini").getInputStream();
-        return IniFileUtil.readIniFile(inputStream, exportEnum.getMsg());
+    private Map<String, String> loadColumnMapper(ExportEnum exportEnum){
+        Map<String, String> map = null;
+        try {
+            InputStream inputStream = new ClassPathResource("exportColumnMapper.ini").getInputStream();
+            map = IniFileUtil.readIniFile(inputStream, exportEnum.getMsg());
+        } catch (Exception e) {
+            throw new BizException(e);
+        }
+        return map;
     }
 
     @Override
@@ -265,12 +270,12 @@ public class ExportServiceImpl implements ExportService {
     }
 
     //导出到报表中心
-    private Map<ExportEnum, BiFunction<Map<String, Object>, List<String>, HttpResponseResult>> exportManageFuncMap = new HashMap<>(ExportEnum.values().length);
+    private Map<ExportEnum, Function<Map<String, Object>, HttpResponseResult>> exportManageFuncMap = new HashMap<>(ExportEnum.values().length);
     //直接导出
     private Map<ExportEnum, Function<Map<String, Object>, List>> exportFuncMap = new HashMap<>(ExportEnum.values().length);
 
     @Override
-    public Map<ExportEnum, BiFunction<Map<String, Object>, List<String>, HttpResponseResult>> getExportManageFuncMap() {
+    public Map<ExportEnum, Function<Map<String, Object>, HttpResponseResult>> getExportManageFuncMap() {
         return exportManageFuncMap;
     }
 
@@ -345,17 +350,18 @@ public class ExportServiceImpl implements ExportService {
         //导出到报表中心
 //        exportManageFuncMap.put(ExportEnum.SUPER_FIND_COURSE_SCHEDULES, (info,headColumns) -> this.superFindCourseSchedules(info,headColumns));
         //针对不同的用户有不同的模板
-        exportManageFuncMap.put(ExportEnum.ROUTE_ORDER_LIST1, (info, headColumns) -> routeOrderList(info, headColumns));
-        exportManageFuncMap.put(ExportEnum.ROUTE_ORDER_LIST2, (info, headColumns) -> routeOrderList(info, headColumns));
-        exportManageFuncMap.put(ExportEnum.ORDER_LIST1, (info, headColumns) -> orderList(info, headColumns));
-        exportManageFuncMap.put(ExportEnum.ORDER_LIST2, (info, headColumns) -> orderList(info, headColumns));
-        exportManageFuncMap.put(ExportEnum.ORDER_LIST_SUM, (info, headColumns) -> orderListSum(info, headColumns));
-        exportManageFuncMap.put(ExportEnum.STUDENT_VIP_PRACTICE, (info, headColumns) -> exportStudentVipPractice(info, headColumns));
-        exportManageFuncMap.put(ExportEnum.STUDENT_VIP_COURSE_INFO, (info, headColumns) -> exportStudentVipCourseInfo(info, headColumns));
-        exportManageFuncMap.put(ExportEnum.STUDENT_MUSIC_THEORY_COURSE_INFO, (info, headColumns) -> exportStudentMusicTheoryCourseInfo(info, headColumns));
-        exportManageFuncMap.put(ExportEnum.VIP_STUDENT_COURSE_MANAGE, (info, headColumns) -> exportVipStudentCourseManage(info, headColumns));
-        exportManageFuncMap.put(ExportEnum.EXPORT_STUDENT_SUBCOURSE, (info, headColumns) -> exportStudentSubCourse(info, headColumns));
-        exportManageFuncMap.put(ExportEnum.EXPORT_STUDENT_SERVE_INFO, (info, headColumns) -> exportStudentServeInfo(info, headColumns));
+        exportManageFuncMap.put(ExportEnum.ROUTE_ORDER_LIST1, (info) -> routeOrderList(info));
+        exportManageFuncMap.put(ExportEnum.ROUTE_ORDER_LIST2, (info) -> routeOrderList(info));
+        exportManageFuncMap.put(ExportEnum.ORDER_LIST1, (info) -> orderList(info));
+        exportManageFuncMap.put(ExportEnum.ORDER_LIST2, (info) -> orderList(info));
+        exportManageFuncMap.put(ExportEnum.ORDER_LIST_SUM, (info) -> orderListSum(info));
+        exportManageFuncMap.put(ExportEnum.STUDENT_VIP_PRACTICE, (info) -> exportStudentVipPractice(info));
+        exportManageFuncMap.put(ExportEnum.STUDENT_VIP_COURSE_INFO, (info) -> exportStudentVipCourseInfo(info));
+        exportManageFuncMap.put(ExportEnum.STUDENT_MUSIC_THEORY_COURSE_INFO, (info) -> exportStudentMusicTheoryCourseInfo(info));
+        exportManageFuncMap.put(ExportEnum.VIP_STUDENT_COURSE_MANAGE, (info) -> exportVipStudentCourseManage(info));
+        exportManageFuncMap.put(ExportEnum.EXPORT_STUDENT_SUBCOURSE, (info) -> exportStudentSubCourse(info));
+        exportManageFuncMap.put(ExportEnum.EXPORT_STUDENT_SERVE_INFO, (info) -> exportStudentServeInfo(info));
+        exportManageFuncMap.put(ExportEnum.EXPORT_TRAINING_STATISTICS, (info) -> exportCompareRecord(info));
 
 
     }
@@ -1377,7 +1383,7 @@ public class ExportServiceImpl implements ExportService {
 
     //财务管理导出
     @Override
-    public HttpResponseResult routeOrderList(Map<String, Object> info, List<String> headColumns) {
+    public HttpResponseResult routeOrderList(Map<String, Object> info) {
         StudentPaymentOrderQueryInfo queryInfo = JSONObject.parseObject(JSONObject.toJSONString(info), StudentPaymentOrderQueryInfo.class);
         SysUser sysUser = sysUserService.getUser();
         queryInfo.setRoutingOrganId(organizationService.getEmployeeOrgan(sysUser.getId(), queryInfo.getRoutingOrganId(), sysUser.getIsSuperAdmin()));
@@ -1400,13 +1406,13 @@ public class ExportServiceImpl implements ExportService {
             return BaseController.failed("数据集太大,不能导出.最大数据集不能超过50000");
         }
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.ROUTE_ORDER, sysUser.getId());
-        return this.asyncExport(() -> this.routeOrderList(params, managerDownload, headColumns),
+        return this.asyncExport(() -> this.routeOrderList(params, managerDownload),
                 managerDownload.getName());
     }
 
     //学员小课记录导出
     @Override
-    public HttpResponseResult exportStudentVipPractice(Map<String, Object> info, List<String> headColumns) {
+    public HttpResponseResult exportStudentVipPractice(Map<String, Object> info) {
         String organId = getParam(info, "organId", String.class);
         Boolean hasCourse = courseScheduleStudentPaymentDao.hasCourse(organId, TenantContextHolder.getTenantId());
         if (hasCourse == null || !hasCourse) {
@@ -1414,13 +1420,13 @@ public class ExportServiceImpl implements ExportService {
         }
         Integer tenantId = TenantContextHolder.getTenantId();
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.STUDENT_VIP_PRACTICE, sysUserService.getUserId());
-        return this.asyncExport(() -> this.studentVipPractice(organId, managerDownload, tenantId, headColumns),
+        return this.asyncExport(() -> this.studentVipPractice(organId, managerDownload, tenantId),
                 managerDownload.getName());
     }
 
     //学员小课记录导出
     @Override
-    public HttpResponseResult exportStudentVipCourseInfo(Map<String, Object> info, List<String> headColumns) {
+    public HttpResponseResult exportStudentVipCourseInfo(Map<String, Object> info) {
         String organId = getParam(info, "organId", String.class);
         Integer tenantId = TenantContextHolder.getTenantId();
         Boolean hasCourse = courseScheduleStudentPaymentDao.hasStudentMusicTheoryCourseInfo(organId, tenantId, "VIP");
@@ -1428,40 +1434,64 @@ public class ExportServiceImpl implements ExportService {
             return BaseController.failed("没有可导出的数据");
         }
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.STUDENT_VIP_COURSE_INFO, sysUserService.getUserId());
-        return this.asyncExport(() -> this.queryStudentCourseInfo(organId, tenantId, "VIP", managerDownload, headColumns, ExportEnum.STUDENT_VIP_COURSE_INFO),
+        return this.asyncExport(() -> this.queryStudentCourseInfo(organId, tenantId, "VIP", managerDownload, ExportEnum.STUDENT_VIP_COURSE_INFO),
                 managerDownload.getName());
     }
 
     //vip学员课程管理
     @Override
-    public HttpResponseResult exportVipStudentCourseManage(Map<String, Object> info, List<String> headColumns) {
+    public HttpResponseResult exportVipStudentCourseManage(Map<String, Object> info) {
         SysUser sysUser = sysUserService.getUser();
         String organId = organizationService.getEmployeeOrgan(sysUser.getId(), getParam(info, "organId", String.class), sysUser.getIsSuperAdmin());
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.VIP_STUDENT_COURSE_MANAGE, sysUser.getId());
         Integer tenantId = TenantContextHolder.getTenantId();
-        return this.asyncExport(() -> this.queryVipStudentCourseManage(organId, tenantId, managerDownload, headColumns, ExportEnum.VIP_STUDENT_COURSE_MANAGE),
+        return this.asyncExport(() -> this.queryVipStudentCourseManage(organId, tenantId, managerDownload, ExportEnum.VIP_STUDENT_COURSE_MANAGE),
                 managerDownload.getName());
     }
 
     @Override
-    public HttpResponseResult exportStudentSubCourse(Map<String, Object> info, List<String> headColumns) {
+    public HttpResponseResult exportStudentSubCourse(Map<String, Object> info) {
         SysUser sysUser = sysUserService.getUser();
         String organId = organizationService.getEmployeeOrgan(sysUser.getId(), getParam(info, "organId", String.class), sysUser.getIsSuperAdmin());
         Integer tenantId = TenantContextHolder.getTenantId();
-
         List<ExportStudentSubCourse> rows = activityUserMapperService.exportStudentSubCourse(organId, tenantId);
+        this.checkRows(rows);
+        ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.EXPORT_STUDENT_SUBCOURSE, sysUser.getId());
+        return this.asyncExport(() -> this.initExportInfo(rows, managerDownload, ExportEnum.EXPORT_STUDENT_SUBCOURSE),
+                managerDownload.getName());
+    }
+
+    private <T> void checkRows(List<T> rows){
         if (CollectionUtils.isEmpty(rows)) {
-            return BaseController.failed("没有可导出的数据");
+            throw new BizException("没有可导出的数据");
         }
-        if (rows.size() > 50000) {
-            return BaseController.failed("数据集太大,不能导出.最大数据集不能超过50000");
+        if (rows.size() > 65535) {
+            throw new BizException("数据集太大,不能导出.最大数据集不能超过");
         }
-        ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.EXPORT_STUDENT_SUBCOURSE, sysUser.getId());
-        return this.asyncExport(() -> this.queryStudentSubCourse(rows, managerDownload, headColumns, ExportEnum.EXPORT_STUDENT_SUBCOURSE),
+    }
+    private void checkRows(Integer count){
+        if(count == null || count <= 0){
+            throw new BizException("没有可导出的数据");
+        }
+        if(count > 65535){
+            throw new BizException("数据集太大,不能导出.最大数据集不能超过65535");
+        }
+    }
+
+    //导出训练统计
+    private HttpResponseResult exportCompareRecord(Map<String, Object> info){
+        ExportCompareQueryInfo queryInfo = JSONObject.parseObject(JSONObject.toJSONString(info), ExportCompareQueryInfo.class);
+        SysUser user = sysUserService.getUser();
+        queryInfo.setOrganId(organizationService.getEmployeeOrgan(user.getId(), queryInfo.getOrganId(), user.getIsSuperAdmin()));
+        Integer count = sysMusicCompareRecordDao.countExportCompareRecord(queryInfo);
+        checkRows(count);
+        ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.EXPORT_TRAINING_STATISTICS,user.getId());
+        return this.asyncExport(() -> this.initExportInfo(sysMusicCompareRecordDao.exportCompareRecord(queryInfo), managerDownload,ExportEnum.EXPORT_TRAINING_STATISTICS),
                 managerDownload.getName());
     }
 
-    private HttpResponseResult exportStudentServeInfo(Map<String, Object> info, List<String> headColumns) {
+
+    private HttpResponseResult exportStudentServeInfo(Map<String, Object> info) {
         SysUser sysUser = sysUserService.getUser();
 
         String organId = organizationService.getEmployeeOrgan(sysUser.getId(), getParam(info, "organId", String.class), sysUser.getIsSuperAdmin());
@@ -1478,27 +1508,21 @@ public class ExportServiceImpl implements ExportService {
             return BaseController.failed("数据集太大,不能导出.最大数据集不能超过50000");
         }
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.EXPORT_STUDENT_SERVE_INFO, sysUser.getId());
-        return this.asyncExport(() -> this.queryStudentServeInfo(rows, managerDownload, headColumns, ExportEnum.EXPORT_STUDENT_SERVE_INFO),
+        return this.asyncExport(() -> this.initExportInfo(rows, managerDownload, ExportEnum.EXPORT_STUDENT_SERVE_INFO),
                 managerDownload.getName());
     }
 
     @Autowired
     private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
 
-    private HttpResponseResult queryStudentServeInfo(List<StudentServeDto> rows, ManagerDownload managerDownload, List<String> headColumns, ExportEnum exportEnum) {
-        exportManagerDownload(getHSSFWorkbook(rows, headColumns, exportEnum), managerDownload);
-        return BaseController.succeed();
-    }
-
-    private HttpResponseResult queryStudentSubCourse(List<ExportStudentSubCourse> rows, ManagerDownload managerDownload, List<String> headColumns, ExportEnum exportEnum) {
-        exportManagerDownload(getHSSFWorkbook(rows, headColumns, exportEnum), managerDownload);
-        return BaseController.succeed();
+    private <T> void initExportInfo(List<T> rows, ManagerDownload managerDownload, ExportEnum exportEnum) {
+        exportManagerDownload(getHSSFWorkbook(rows,exportEnum), managerDownload);
     }
 
 
     //学员小课记录导出
     @Override
-    public HttpResponseResult exportStudentMusicTheoryCourseInfo(Map<String, Object> info, List<String> headColumns) {
+    public HttpResponseResult exportStudentMusicTheoryCourseInfo(Map<String, Object> info) {
         String organId = getParam(info, "organId", String.class);
         Integer tenantId = TenantContextHolder.getTenantId();
         Boolean hasCourse = courseScheduleStudentPaymentDao.hasStudentMusicTheoryCourseInfo(organId, tenantId, "THEORY");
@@ -1506,13 +1530,13 @@ public class ExportServiceImpl implements ExportService {
             return BaseController.failed("没有可导出的数据");
         }
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.STUDENT_MUSIC_THEORY_COURSE_INFO, sysUserService.getUserId());
-        return this.asyncExport(() -> this.queryStudentCourseInfo(organId, tenantId, "THEORY", managerDownload, headColumns, ExportEnum.STUDENT_MUSIC_THEORY_COURSE_INFO),
+        return this.asyncExport(() -> this.queryStudentCourseInfo(organId, tenantId, "THEORY", managerDownload, ExportEnum.STUDENT_MUSIC_THEORY_COURSE_INFO),
                 managerDownload.getName());
     }
 
     //订单列表导出
     @Override
-    public HttpResponseResult orderList(Map<String, Object> info, List<String> headColumns) {
+    public HttpResponseResult orderList(Map<String, Object> info) {
         StudentPaymentOrderQueryInfo queryInfo = JSONObject.parseObject(JSONObject.toJSONString(info), StudentPaymentOrderQueryInfo.class);
         SysUser sysUser = sysUserService.getUser();
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(sysUser.getId(), queryInfo.getOrganId(), sysUser.getIsSuperAdmin()));
@@ -1534,13 +1558,13 @@ public class ExportServiceImpl implements ExportService {
             return BaseController.failed("数据集太大,不能导出.最大数据集不能超过50000");
         }
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.ORDER, sysUser.getId());
-        return this.asyncExport(() -> this.orderList(params, managerDownload, headColumns),
+        return this.asyncExport(() -> this.orderList(params, managerDownload),
                 managerDownload.getName());
     }
 
     //订单列表导出
     @Override
-    public HttpResponseResult orderListSum(Map<String, Object> info, List<String> headColumns) {
+    public HttpResponseResult orderListSum(Map<String, Object> info) {
         StudentPaymentOrderQueryInfo queryInfo = JSONObject.parseObject(JSONObject.toJSONString(info), StudentPaymentOrderQueryInfo.class);
         SysUser sysUser = sysUserService.getUser();
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(sysUser.getId(), queryInfo.getOrganId(), sysUser.getIsSuperAdmin()));
@@ -1562,7 +1586,7 @@ public class ExportServiceImpl implements ExportService {
             return BaseController.failed("数据集太大,不能导出.最大数据集不能超过50000");
         }
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.ORDER_LIST_SUM, sysUser.getId());
-        return this.asyncExport(() -> this.orderListSum(params, managerDownload, headColumns),
+        return this.asyncExport(() -> this.orderListSum(params, managerDownload),
                 managerDownload.getName());
     }
 
@@ -1596,7 +1620,7 @@ public class ExportServiceImpl implements ExportService {
 
 
     @Override
-    public void orderList(Map<String, Object> params, ManagerDownload managerDownload, List<String> headColumns) {
+    public void orderList(Map<String, Object> params, ManagerDownload managerDownload) {
         List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentOrderService.ExportQueryPage(params);
         long i = 1;
         Map<Integer, String> cooperationOrganMap = new HashMap<>();
@@ -1638,11 +1662,11 @@ public class ExportServiceImpl implements ExportService {
             musicGroupNameMap = MapUtil.convertIntegerMap(musicGroupDao.queryMusicGroupNameMap(musicGroupIds));
         }
         //获取外部订单的商品销售金额
-        List<Long> outOrderList = studentPaymentOrderExportDtos.stream().filter(e -> e.getType() == OUTORDER).map(e -> e.getId()).collect(Collectors.toList());
-        Map<Long, BigDecimal> outOrderAmountMap = new HashMap<>();
-        if (org.apache.commons.collections.CollectionUtils.isNotEmpty(outOrderList)) {
-            outOrderAmountMap = MapUtil.convertIntegerMap(sellOrderDao.sumOutOrderAmount(outOrderList));
-        }
+//        List<Long> outOrderList = studentPaymentOrderExportDtos.stream().filter(e -> e.getType() == OUTORDER).map(e -> e.getId()).collect(Collectors.toList());
+//        Map<Long, BigDecimal> outOrderAmountMap = new HashMap<>();
+//        if (org.apache.commons.collections.CollectionUtils.isNotEmpty(outOrderList)) {
+//            outOrderAmountMap = MapUtil.convertIntegerMap(sellOrderDao.sumOutOrderAmount(outOrderList));
+//        }
         List<Long> otherOrderIds = studentPaymentOrderExportDtos.stream().filter(e -> e.getGroupType() != GroupType.GOODS_SELL
                 && e.getGroupType() != GroupType.REPLACEMENT
                 && e.getGroupType() != GroupType.PRACTICE
@@ -1685,17 +1709,17 @@ public class ExportServiceImpl implements ExportService {
                     if (cooperationId != null) {
                         String firstMusicId = firstMusicMap.get(cooperationId);
                         if (StringUtils.isEmpty(firstMusicId)) {
-                            row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_MUSIC);
+                            row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_MUSIC.getMsg());
                         } else {
                             if (Objects.equals(firstMusicId, row.getMusicGroupId())) {
-                                row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_MUSIC);
+                                row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_MUSIC.getMsg());
                             } else {
-                                row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.ADD_MUSIC);
+                                row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.ADD_MUSIC.getMsg());
                             }
                         }
                     }
                 } else {
-                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_MUSIC);
+                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_MUSIC.getMsg());
                 }
             } else {
                 row.setFeeMusicGroupId(userLastMusicIdMap.get(row.getUserId()));
@@ -1752,9 +1776,9 @@ public class ExportServiceImpl implements ExportService {
                                 //学员没有历史VIP课程则导出为【VIP课新增】
                                 //学员有历史VIP课程到导出为【VIP课续费]
                                 if (Objects.equals(userFirstVipMap.get(row.getUserId()), row.getMusicGroupId())) {
-                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_VIP);
+                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_VIP.getMsg());
                                 } else {
-                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_VIP);
+                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_VIP.getMsg());
                                 }
                             }
                             break;
@@ -1790,9 +1814,9 @@ public class ExportServiceImpl implements ExportService {
                     //学员没有历史VIP课程则导出为【VIP课新增】
                     //学员有历史VIP课程到导出为【VIP课续费]
                     if (Objects.equals(userFirstVipMap.get(row.getUserId()), row.getMusicGroupId())) {
-                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_VIP);
+                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_VIP.getMsg());
                     } else {
-                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_VIP);
+                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_VIP.getMsg());
                     }
                 }
             } else if (row.getGroupType() == GroupType.ACTIVITY) {
@@ -1800,7 +1824,7 @@ public class ExportServiceImpl implements ExportService {
             } else if (row.getGroupType() == GroupType.MEMBER) {
                 row.setCloudTeacherFee(row.getActualAmount());
                 if (row.getTypeDesc() == null) {
-                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.OTHER);
+                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.OTHER.getMsg());
                 }
             } else if (row.getGroupType().equals(GroupType.SPORADIC)) {
                 //考级报名
@@ -1850,7 +1874,7 @@ public class ExportServiceImpl implements ExportService {
                     }
                 }
                 if (row.getTypeDesc() == null) {
-                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.OTHER);
+                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.OTHER.getMsg());
                 }
             } else if (row.getGroupType().equals(GroupType.PRACTICE)) {
                 row.setPracticeCourseFee(row.getActualAmount());
@@ -1861,9 +1885,9 @@ public class ExportServiceImpl implements ExportService {
                 }
                 if (row.getTypeDesc() == null) {
                     if (Objects.equals(userFirstPracticeMap.get(row.getUserId()), row.getMusicGroupId())) {
-                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_PRACTICE);
+                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_PRACTICE.getMsg());
                     } else {
-                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_PRACTICE);
+                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_PRACTICE.getMsg());
                     }
                 }
             } else if (row.getGroupType().equals(GroupType.REPLACEMENT)) {
@@ -1880,7 +1904,7 @@ public class ExportServiceImpl implements ExportService {
                 }
             } else if (row.getGroupType().equals(GroupType.GOODS_SELL)) {
                 row.setRetailGoodsFee(row.getActualAmount());
-                row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RETAIL_GOODS);
+                row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RETAIL_GOODS.getMsg());
             } else {
                 List<StudentPaymentOrderExportDto> exportDtoList = feeByTypeMap.get(row.getId());
                 if (!CollectionUtils.isEmpty(exportDtoList)) {
@@ -1897,7 +1921,7 @@ public class ExportServiceImpl implements ExportService {
                             //判断之前是否有付费订单,如果没有,那么是乐团转化
                             int orderNum = studentPaymentOrderDao.getStudentMusicOrderNum(row.getMusicGroupId(), row.getUserId(), row.getId());
                             if (orderNum == 0) {
-                                row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.MUSIC_CONVERT);
+                                row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.MUSIC_CONVERT.getMsg());
                             }
                         }
                         StudentRegistration studentRegistration = studentRegistrationDao.findStudentByMusicGroupIdAndUserId(row.getMusicGroupId(), row.getUserId());
@@ -1926,7 +1950,7 @@ public class ExportServiceImpl implements ExportService {
                             row.setMaintenanceProductFee(BigDecimal.ZERO);
                             row.setOtherFee(subtract);
                             row.setRetailGoodsFee(add);
-                            row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RETAIL_GOODS);
+                            row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RETAIL_GOODS.getMsg());
                         } else {
                             //拆分导入订单
                             if (row.getType() == OrderTypeEnum.OUTORDER || row.getType() == OrderTypeEnum.SCHOOL) {
@@ -1939,9 +1963,9 @@ public class ExportServiceImpl implements ExportService {
                                 }
                                 //如果有服务收入那么是课程学校采买
                                 if (subtract.compareTo(BigDecimal.ZERO) == 0) {
-                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.LARGE_MUSICAL);
+                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.LARGE_MUSICAL.getMsg());
                                 } else {
-                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.COURSE_SCHOOL_BUY);
+                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.COURSE_SCHOOL_BUY.getMsg());
                                 }
                                 row.setCourseSchoolBuyAmount(subtract);
                             } else if (row.getType() == OrderTypeEnum.OTHER) {
@@ -1955,9 +1979,9 @@ public class ExportServiceImpl implements ExportService {
                                 row.setMusicGroupCourseFee(subtract);
                                 //如果有服务收入那么是课程学校采买
                                 if (subtract.compareTo(BigDecimal.ZERO) == 0) {
-                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RETAIL_GOODS);
+                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RETAIL_GOODS.getMsg());
                                 } else {
-                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.COURSE_STUDENT_BUY);
+                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.COURSE_STUDENT_BUY.getMsg());
                                 }
                             }
                         }
@@ -1967,9 +1991,9 @@ public class ExportServiceImpl implements ExportService {
                 }
                 if (row.getTypeDesc() == null) {
                     if (row.getGroupType().equals(GroupType.SUBJECT_CHANGE)) {
-                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_MUSIC);
+                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_MUSIC.getMsg());
                     } else if (row.getGroupType().equals(GroupType.REPAIR)) {
-                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.REPAIR);
+                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.REPAIR.getMsg());
                     }
                 }
             }
@@ -2002,18 +2026,21 @@ public class ExportServiceImpl implements ExportService {
             } else if (row.getPaymentChannel().equals("BALANCE")) {
                 paymentChannel = "余额";
             }
+            if(StringUtils.isNotEmpty(row.getSporadicType())){
+                row.setTypeDesc(row.getSporadicType());
+            }
             row.setPaymentChannel(paymentChannel);
             row.setId(i);
             row.setRepairFee(row.getRepairFee().add(row.getMaintenanceProductFee()));
             row.setOrderAmount(row.getExpectAmount().add(row.getCouponRemitFee()));
             i++;
         }
-        HSSFWorkbook workbook = getHSSFWorkbook(studentPaymentOrderExportDtos, headColumns, ExportEnum.ORDER_LIST1);
+        HSSFWorkbook workbook = getHSSFWorkbook(studentPaymentOrderExportDtos, ExportEnum.ORDER_LIST1);
         exportManagerDownload(workbook, managerDownload);
     }
 
     @Override
-    public void orderListSum(Map<String, Object> params, ManagerDownload managerDownload, List<String> headColumns) {
+    public void orderListSum(Map<String, Object> params, ManagerDownload managerDownload) {
         List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentOrderService.ExportQueryPage(params);
         //获取机构费率
         Integer tenantId = (Integer) params.get("tenantId");
@@ -2214,7 +2241,7 @@ public class ExportServiceImpl implements ExportService {
                             row.setMaintenanceProductFee(BigDecimal.ZERO);
                             row.setOtherFee(subtract);
                             row.setRetailGoodsFee(add);
-                            row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RETAIL_GOODS);
+                            row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RETAIL_GOODS.getMsg());
                         } else {
                             //拆分导入订单
                             if (row.getType() == OrderTypeEnum.OUTORDER || row.getType() == OrderTypeEnum.SCHOOL) {
@@ -2274,7 +2301,7 @@ public class ExportServiceImpl implements ExportService {
             exportDtoList.add(exportDto);
         }
 
-        HSSFWorkbook workbook = getHSSFWorkbook(exportDtoList, headColumns, ExportEnum.ORDER_LIST_SUM);
+        HSSFWorkbook workbook = getHSSFWorkbook(exportDtoList, ExportEnum.ORDER_LIST_SUM);
         exportManagerDownload(workbook, managerDownload);
     }
 
@@ -2286,7 +2313,7 @@ public class ExportServiceImpl implements ExportService {
         return subtract;
     }
 
-    public void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload, List<String> headColumns) {
+    public void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload) {
         //获取分润订单(不包含订单详情)(纯余额支付不处理)
         List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentRouteOrderDao.ExportQueryPage1(params);
         if (CollectionUtils.isEmpty(studentPaymentOrderExportDtos)) {
@@ -2403,6 +2430,9 @@ public class ExportServiceImpl implements ExportService {
                 paymentChannel = "余额";
             }
             basicOrder.setPaymentChannel(paymentChannel);
+            if(StringUtils.isNotEmpty(basicOrder.getSporadicType()) && !basicOrder.getSporadicType().equals("其他")){
+                basicOrder.setTypeDesc(basicOrder.getSporadicType());
+            }
             if (basicOrder.getRouteAmount().compareTo(BigDecimal.ZERO) == 0) {
                 continue;
             }
@@ -2414,14 +2444,6 @@ public class ExportServiceImpl implements ExportService {
                 basicOrder.setOtherFee(basicOrder.getRouteAmount());
                 continue;
             }
-            //如果是零星收费的账户充值,不管销售还是服务,统一放在其他收费项目中
-            if(basicOrder.getType() == OrderTypeEnum.SPORADIC
-                    && basicOrder.getGroupType() == GroupType.SPORADIC
-                    && basicOrder.getServiceAmount().compareTo(BigDecimal.ZERO) == 0
-                    && basicOrder.getSaleAmount().compareTo(BigDecimal.ZERO) == 0){
-                basicOrder.setOtherFee(basicOrder.getRouteAmount());
-                continue;
-            }
             //如果有订单详情
             List<StudentPaymentOrderDetail> detailList = orderDetailMap.get(basicOrder.getId());
             if (!CollectionUtils.isEmpty(detailList)) {
@@ -2443,7 +2465,7 @@ public class ExportServiceImpl implements ExportService {
                 this.setSaleFee(basicOrder);
             }
         }
-        HSSFWorkbook workbook = getHSSFWorkbook(studentPaymentOrderExportDtos, headColumns, ExportEnum.ROUTE_ORDER_LIST1);
+        HSSFWorkbook workbook = getHSSFWorkbook(studentPaymentOrderExportDtos, ExportEnum.ROUTE_ORDER_LIST1);
         exportManagerDownload(workbook, managerDownload);
     }
 
@@ -2466,7 +2488,7 @@ public class ExportServiceImpl implements ExportService {
     }
 
     @Override
-    public void studentVipPractice(String organId, ManagerDownload managerDownload, Integer tenantId, List<String> headColumns) {
+    public void studentVipPractice(String organId, ManagerDownload managerDownload, Integer tenantId) {
         List<StudentVipPracticeExportDto> studentVipPracticeExportDtos = courseScheduleStudentPaymentDao.exportStudentVipPractice(organId, tenantId);
         if (studentVipPracticeExportDtos != null && studentVipPracticeExportDtos.size() > 0) {
             List<Integer> studentIds = studentVipPracticeExportDtos.stream().map(e -> e.getUserId()).distinct().collect(Collectors.toList());
@@ -2533,21 +2555,21 @@ public class ExportServiceImpl implements ExportService {
                 }
             }
         }
-        HSSFWorkbook workbook = getHSSFWorkbook(studentVipPracticeExportDtos, headColumns, ExportEnum.STUDENT_VIP_PRACTICE);
+        HSSFWorkbook workbook = getHSSFWorkbook(studentVipPracticeExportDtos, ExportEnum.STUDENT_VIP_PRACTICE);
         exportManagerDownload(workbook, managerDownload);
     }
 
     @Override
-    public void queryStudentCourseInfo(String organId, Integer tenantId, String groupType, ManagerDownload managerDownload, List<String> headColumns, ExportEnum exportEnum) {
+    public void queryStudentCourseInfo(String organId, Integer tenantId, String groupType, ManagerDownload managerDownload, ExportEnum exportEnum) {
         List<ExportStudentCourseInfoDto> rows = courseScheduleStudentPaymentDao.queryStudentCourseInfo(organId, tenantId, groupType);
-        HSSFWorkbook workbook = getHSSFWorkbook(rows, headColumns, exportEnum);
+        HSSFWorkbook workbook = getHSSFWorkbook(rows, exportEnum);
         exportManagerDownload(workbook, managerDownload);
     }
 
     @Override
-    public void queryVipStudentCourseManage(String organId, Integer tenantId, ManagerDownload managerDownload, List<String> headColumns, ExportEnum exportEnum) {
+    public void queryVipStudentCourseManage(String organId, Integer tenantId, ManagerDownload managerDownload, ExportEnum exportEnum) {
         List<ExportVipStudentCourseManageDto> rows = courseScheduleStudentPaymentDao.queryVipStudentCourseManage(organId, tenantId);
-        exportManagerDownload(getHSSFWorkbook(rows, headColumns, exportEnum), managerDownload);
+        exportManagerDownload(getHSSFWorkbook(rows, exportEnum), managerDownload);
     }
 
     @Override
@@ -2574,24 +2596,20 @@ public class ExportServiceImpl implements ExportService {
     @Override
     public void exportMusicGroupCourseScheduleDetail(queryMusicGroupCourseScheduleQueryInfo queryInfo, ManagerDownload managerDownload) {
         List<MusicGroupCourseScheduleDto> rows = classGroupService.queryMusicGroupCourseScheduleDetail(queryInfo).getRows();
-        try {
-            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"课程编号", "课程开始时间", "课程结束时间", "课程名称", "课程类型", "课程状态", "老师签到", "老师签退", "指导老师",
-                            "出勤率", "达标率", "是否服务", "是否布置课后作业", "作业提交率", "结算状态", "是否点名", "备注"},
-                    new String[]{"courseScheduleId", "classDate + ' ' + startClassTime", "classDate + ' ' + endClassTime",
-                            "courseScheduleName", "courseScheduleType.msg", "courseScheduleStatus.msg", "signInStatus.msg",
-                            "signOutStatus.msg", "masterTeacherName",
-                            "courseScheduleStatistics.attendanceRate", "courseScheduleStatistics.standardRate",
-                            "courseScheduleStatistics.serviceFlag == false ? '否':'是'", "courseScheduleStatistics.homeworkFlag == false ? '否':'是'", "courseScheduleStatistics.homeworkCommitRate",
-                            "settlementTime == null?'未结算':'已结算'", "isCallNames.msg", "remark"}, rows);
-            exportManagerDownload(workbook, managerDownload);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
+        HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"课程编号", "课程开始时间", "课程结束时间", "课程名称", "课程类型", "课程状态", "老师签到", "老师签退", "指导老师",
+                        "出勤率", "达标率", "是否服务", "是否布置课后作业", "作业提交率", "结算状态", "是否点名", "备注"},
+                new String[]{"courseScheduleId", "classDate + ' ' + startClassTime", "classDate + ' ' + endClassTime",
+                        "courseScheduleName", "courseScheduleType.msg", "courseScheduleStatus.msg", "signInStatus.msg",
+                        "signOutStatus.msg", "masterTeacherName",
+                        "courseScheduleStatistics.attendanceRate", "courseScheduleStatistics.standardRate",
+                        "courseScheduleStatistics.serviceFlag == false ? '否':'是'", "courseScheduleStatistics.homeworkFlag == false ? '否':'是'", "courseScheduleStatistics.homeworkCommitRate",
+                        "settlementTime == null?'未结算':'已结算'", "isCallNames.msg", "remark"}, rows);
+        exportManagerDownload(workbook, managerDownload);
     }
 
-    public HSSFWorkbook getHSSFWorkbook(List rows, List<String> headColumns, ExportEnum exportEnum) {
+    public HSSFWorkbook getHSSFWorkbook(List rows,ExportEnum exportEnum) {
         try {
-            Map<String, String> headMap = getExportMap(new ExportDto(exportEnum, headColumns));
+            Map<String, String> headMap = getExportMap(new ExportDto(exportEnum));
             String[] header = headMap.keySet().toArray(new String[headMap.keySet().size()]);
             String[] body = headMap.values().toArray(new String[headMap.keySet().size()]);
             return POIUtil.exportExcel(header, body, rows);
@@ -2658,22 +2676,22 @@ public class ExportServiceImpl implements ExportService {
                 //学员没有历史VIP课程则导出为【VIP课新增】
                 //学员有历史VIP课程到导出为【VIP课续费]
                 if (Objects.equals(userFirstVipMap.get(basicOrder.getUserId()), basicOrder.getMusicGroupId())) {
-                    basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_VIP);
+                    basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_VIP.getMsg());
                 } else {
-                    basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_VIP);
+                    basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_VIP.getMsg());
                 }
             } else if (basicOrder.getGroupType() == GroupType.PRACTICE) {
                 if (Objects.equals(userFirstPracticeMap.get(basicOrder.getUserId()), basicOrder.getMusicGroupId())) {
-                    basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_PRACTICE);
+                    basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_PRACTICE.getMsg());
                 } else {
-                    basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_PRACTICE);
+                    basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_PRACTICE.getMsg());
                 }
             } else if (basicOrder.getGroupType().equals(GroupType.SUBJECT_CHANGE)) {
-                basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_MUSIC);
+                basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_MUSIC.getMsg());
             } else if (basicOrder.getGroupType().equals(GroupType.REPAIR)) {
-                basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.REPAIR);
+                basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.REPAIR.getMsg());
             } else {
-                basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.OTHER);
+                basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.OTHER.getMsg());
             }
         }
     }
@@ -2897,9 +2915,9 @@ public class ExportServiceImpl implements ExportService {
             //学员没有历史VIP课程则导出为【VIP课新增】
             //学员有历史VIP课程到导出为【VIP课续费】
             if (Objects.equals(userFirstVipMap.get(basicOrder.getUserId()), basicOrder.getMusicGroupId())) {
-                basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_VIP);
+                basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_VIP.getMsg());
             } else {
-                basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_VIP);
+                basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_VIP.getMsg());
             }
         }
     }
@@ -2992,17 +3010,17 @@ public class ExportServiceImpl implements ExportService {
                 if (cooperationId != null) {
                     String firstMusicId = firstMusicMap.get(cooperationId);
                     if (StringUtils.isEmpty(firstMusicId)) {
-                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_MUSIC);
+                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_MUSIC.getMsg());
                     } else {
                         if (Objects.equals(firstMusicId, row.getMusicGroupId())) {
-                            row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_MUSIC);
+                            row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_MUSIC.getMsg());
                         } else {
-                            row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.ADD_MUSIC);
+                            row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.ADD_MUSIC.getMsg());
                         }
                     }
                 }
             } else {
-                row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_MUSIC);
+                row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_MUSIC.getMsg());
             }
         } else {
             row.setFeeMusicGroupId(userLastMusicIdMap.get(row.getUserId()));

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

@@ -107,15 +107,16 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 		detail.setType("EXTRA");
 		detail.setExpire(DateUtil.isOverdue(extraExerciseReply.getCreateTime(),
 				sysConfigDao.findConfigValue("file_expiration_time")));
+		Date now=new Date();
+		if (DateUtil.daysBetween(extraExerciseReply.getHomeworkCreateTime(), now) > 7){
+			detail.setSubmitFlag(false);
+		}
 
 		String configValue = sysConfigDao.findConfigValue(SysConfigService.HOMEWORK_OPEN_FLAG);
 		if(StringUtils.isEmpty(configValue)){
 			configValue = "0";
 		}
 		detail.setHomeworkOpenFlag(Integer.parseInt(configValue));
-//		if(configValue.equals("0")){
-//			detail.setHasMember(0);
-//		}else {
 		if(StringUtils.isNotEmpty(extraExerciseReply.getMusicScoreId())){
 			List<SysMusicScore> sysMusicScores = sysMusicScoreDao.findByIds(extraExerciseReply.getMusicScoreId());
 			detail.setSysMusicScoreList(sysMusicScores);

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

@@ -19,4 +19,8 @@ public class ManagerDownloadServiceImpl extends BaseServiceImpl<Integer, Manager
         return managerDownloadDao;
     }
 
+    @Override
+    public void batchDel(String ids) {
+        managerDownloadDao.batchDel(ids);
+    }
 }

+ 17 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java

@@ -249,11 +249,6 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
             configValue = "0";
         }
         courseHomeworkStudentDetail.setHomeworkOpenFlag(Integer.parseInt(configValue));
-//        if(configValue.equals("0")){
-//            courseHomeworkStudentDetail.setMusicScoreId(null);
-//            courseHomeworkStudentDetail.setMusicScoreName(null);
-//            courseHomeworkStudentDetail.setHasMember(0);
-//        }else {
         if(StringUtils.isNotEmpty(courseHomeworkStudentDetail.getMusicScoreId())){
             List<SysMusicScore> sysMusicScoreList = sysMusicScoreDao.findByIds(courseHomeworkStudentDetail.getMusicScoreId());
             courseHomeworkStudentDetail.setSysMusicScoreList(sysMusicScoreList);
@@ -264,8 +259,23 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         }
         Student student = studentDao.get(userId.intValue());
         courseHomeworkStudentDetail.setHasMember(student.getMemberRankSettingId()==null?0:1);
-//        }
-		
+
+        Date now = new Date();
+
+        if (DateUtil.daysBetween(courseHomeworkStudentDetail.getCreateTime(), now) > 7) {
+            courseHomeworkStudentDetail.setSubmitFlag(false);
+        }
+        if(courseHomeworkStudentDetail.getSubmitFlag()){
+            //若本周有当前课程所在乐团的服务指标,那么在课程开始当天之后不能再提交作业
+            Date classDate = studentExtracurricularExercisesSituationDao.getHomeworkSituations(courseSchedule.getId(),courseSchedule.getMusicGroupId(),"HOMEWORK",
+                    DateUtil.getWeekMondayWithDate(now),userId.intValue());
+            if(Objects.nonNull(classDate)){
+                int i = classDate.compareTo(DateUtil.stringToDate(DateUtil.format(now, DateUtil.ISO_EXPANDED_DATE_FORMAT), DateUtil.ISO_EXPANDED_DATE_FORMAT));
+                if(i <= 0){
+                    courseHomeworkStudentDetail.setSubmitFlag(false);
+                }
+            }
+        }
         return courseHomeworkStudentDetail;
     }
 

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

@@ -41,6 +41,8 @@ public class StudentVisitServiceImpl extends BaseServiceImpl<Integer, StudentVis
     private CourseScheduleDao courseScheduleDao;
     @Autowired
     private StudentAttendanceDao studentAttendanceDao;
+    @Autowired
+    private StudentOperatingVisitDao studentOperatingVisitDao;
 
 
     @Override
@@ -86,6 +88,8 @@ public class StudentVisitServiceImpl extends BaseServiceImpl<Integer, StudentVis
             }
         }
         studentVisitDao.insert(studentVisit);
+        //更新学员回访数据
+//        studentOperatingVisitDao.updateVisit(studentVisit.getStudentId());
         return studentVisit;
     }
 

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

@@ -603,27 +603,27 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
         PageInfo<Teacher> pageInfo = queryPage(queryInfo);
         List<Teacher> rows = pageInfo.getRows();
         if (rows != null && rows.size() > 0) {
-            Set<Integer> teachers = rows.stream().map(e -> e.getId()).collect(Collectors.toSet());
-            String teacherIds = StringUtils.join(teachers, ",");
-            //获取小课数量
-            Map<Integer, Integer> vipNumMap = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(classGroupDao.countTeacherVipNum(teacherIds))), HashMap.class);
-            //获取试听课数量
-            Map<Integer, Integer> demoNumMap = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(demoGroupDao.countTeacherDemoGroupNum(teacherIds))), HashMap.class);
-
-            Set<Integer> organIds = rows.stream().map(e -> e.getTeacherOrganId()).collect(Collectors.toSet());
-            Map<Integer, String> organNames = MapUtil.convertMybatisMap(organizationDao.findOrganNameMapList(organIds));
-
-
-            for (Teacher e : rows) {
-                e.setSubjectName(subjectDao.findBySubIds(e.getSubjectId()));
-                e.setOrganName(organNames.get(e.getTeacherOrganId()));
-                if (StringUtils.isNotEmpty(e.getSplitSubjectName())) {
-                    e.setSubjectName(Arrays.asList(e.getSplitSubjectName().split(",")));
+            if(rows.size() < 30){
+                Set<Integer> teachers = rows.stream().map(e -> e.getId()).collect(Collectors.toSet());
+                String teacherIds = StringUtils.join(teachers, ",");
+                //获取小课数量
+                Map<Integer, Integer> vipNumMap = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(classGroupDao.countTeacherVipNum(teacherIds))), HashMap.class);
+                //获取试听课数量
+                Map<Integer, Integer> demoNumMap = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(demoGroupDao.countTeacherDemoGroupNum(teacherIds))), HashMap.class);
+
+                Set<Integer> organIds = rows.stream().map(e -> e.getTeacherOrganId()).collect(Collectors.toSet());
+                Map<Integer, String> organNames = MapUtil.convertMybatisMap(organizationDao.findOrganNameMapList(organIds));
+                for (Teacher e : rows) {
+                    e.setSubjectName(subjectDao.findBySubIds(e.getSubjectId()));
+                    e.setOrganName(organNames.get(e.getTeacherOrganId()));
+                    if (StringUtils.isNotEmpty(e.getSplitSubjectName())) {
+                        e.setSubjectName(Arrays.asList(e.getSplitSubjectName().split(",")));
+                    }
+                    Integer num = vipNumMap.get(e.getId());
+                    e.setVipNum(num == null ? 0 : num);
+                    Integer demoNum = demoNumMap.get(e.getId());
+                    e.setDemoNum(demoNum == null ? 0 : demoNum);
                 }
-                Integer num = vipNumMap.get(e.getId());
-                e.setVipNum(num == null ? 0 : num);
-                Integer demoNum = demoNumMap.get(e.getId());
-                e.setDemoNum(demoNum == null ? 0 : demoNum);
             }
         }
         return pageInfo;

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

@@ -4193,7 +4193,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
     }
 
     @Override
-    public Object queryVipPracticeGroups(StudentVipGroupQueryInfo queryInfo) {
+    public List<StudentVipGroupShowListDto> queryVipPracticeGroups(StudentVipGroupQueryInfo queryInfo) {
+        queryInfo.setExpireFlag(true);
         Map<String, Object> params = new HashMap<String, Object>();
         MapUtil.populateMap(params, queryInfo);
         List<StudentVipGroupShowListDto> vipGroups = vipGroupDao.findVipGroups(params);

+ 15 - 11
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -535,7 +535,7 @@
     <select id="getCourseSchedulesWithDate" resultMap="courseScheduleDto">
         SELECT
             cs.id_ seal_class_id_,
-            cg.name_,
+            cs.name_,
             cs.type_,
             cs.id_,
             cs.class_date_,
@@ -582,6 +582,9 @@
             <if test="type!=null">
                 AND cs.group_type_ = #{type}
             </if>
+            <if test="search != null and search != ''">
+                AND (cs.id_ = #{search} OR cs.name_ LIKE CONCAT('%',#{search},'%') OR su.real_name_ LIKE CONCAT('%',#{search},'%'))
+            </if>
             <if test="musicGroupId!=null">
                 AND cs.music_group_id_=#{musicGroupId} AND cs.group_type_='MUSIC'
             </if>
@@ -594,16 +597,14 @@
     </select>
 
     <select id="countCourseSchedulesWithDate" resultType="int">
-        SELECT
-        count(*)
-        FROM
-            course_schedule cs
-            <if test="classGroupIds != null and organIdList!=null">
-                LEFT JOIN class_group cg ON cs.class_group_id_ = cg.id_
-            </if>
-            <if test="transactionTeacherId!=null">
-                LEFT JOIN music_group mg ON cs.music_group_id_=mg.id_
-            </if>
+        SELECT count(*) FROM course_schedule cs
+        LEFT JOIN sys_user su ON cs.actual_teacher_id_ = su.id_
+        <if test="classGroupIds != null and organIdList!=null">
+            LEFT JOIN class_group cg ON cs.class_group_id_ = cg.id_
+        </if>
+        <if test="transactionTeacherId!=null">
+            LEFT JOIN music_group mg ON cs.music_group_id_=mg.id_
+        </if>
         WHERE
         (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL) AND cs.pre_course_flag_ = 0 and cs.tenant_id_ = #{tenantId}
         AND cs.id_ IS NOT NULL
@@ -622,6 +623,9 @@
                 #{classGroupId}
             </foreach>
         </if>
+        <if test="search != null and search != ''">
+            AND (cs.id_ = #{search} OR cs.name_ LIKE CONCAT('%',#{search},'%') OR su.real_name_ LIKE CONCAT('%',#{search},'%'))
+        </if>
         <if test="musicGroupId!=null">
             AND cs.music_group_id_=#{musicGroupId} AND cs.group_type_='MUSIC'
         </if>

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

@@ -40,6 +40,7 @@
 		<result column="expire_date_" property="expireDate"/>
 		<result column="music_score_id_" property="musicScoreId" />
 		<result column="music_score_content_" property="musicScoreContent" />
+		<result column="homework_create_time_" property="homeworkCreateTime" />
 	</resultMap>
 
 	<sql id="queryPageCondition">
@@ -218,7 +219,8 @@
 			eer.music_score_id_,
 			eer.music_score_content_,
 			eer.standard_flag_,
-			su.username_ student_name_
+			su.username_ student_name_,
+			ee.create_time_ homework_create_time_
 		FROM
 			extracurricular_exercises_reply eer
 			LEFT JOIN extracurricular_exercises ee ON ee.id_=eer.extracurricular_exercises_id_

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

@@ -180,6 +180,7 @@
 			LIMIT 1
 		</if>
 	</select>
+
 	<resultMap id="NameDto" type="com.ym.mec.biz.dal.dto.NameDto">
 		<result property="id" column="id_" />
 		<result property="name" column="name_" />

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

@@ -25,6 +25,9 @@
         delete from manager_download
         where id_ = #{id,jdbcType=INTEGER}
     </delete>
+    <delete id="batchDel">
+        delete from manager_download where FIND_IN_SET(id_, #{ids})
+    </delete>
     <insert id="insert" keyColumn="id_" keyProperty="id" parameterType="com.ym.mec.biz.dal.entity.ManagerDownload"
             useGeneratedKeys="true">
         <!--@mbg.generated-->

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

@@ -830,6 +830,9 @@
         <if test="search != null">
             AND pg.name_ LIKE concat('%',#{search},'%')
         </if>
+        <if test="expireFlag != null and expireFlag == true">
+            AND pg.payment_expire_date_ >= NOW()
+        </if>
     </select>
     <select id="getPracticeGroupDetail" resultMap="com.ym.mec.biz.dal.dao.VipGroupDao.studentVipGroupDetailDto">
         SELECT pg.name_,pg.total_price_,pg.user_id_,pg.single_class_minutes_,pg.course_num_ online_classes_num_,0 offline_classes_num_,pg.id_,

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

@@ -42,6 +42,7 @@
         <result column="completed_num_" property="completedNum"/>
         <result column="expect_num_" property="expectNum"/>
         <result column="attachments_" property="attachments"/>
+        <result column="create_time_" property="createTime"/>
         <result column="score_" property="score"/>
         <result column="music_score_id_" property="musicScoreId"/>
         <result column="music_score_content_" property="musicScoreContent"/>
@@ -239,6 +240,7 @@
                ch.completed_num_,
                ch.expect_num_,
                ch.expiry_date_,
+               ch.create_time_,
                sch.music_score_id_,
                sch.music_score_content_,
                sch.id_  studentCourseHomeworkId,

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

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.StudentOperatingVisitDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.StudentOperatingVisit" id="StudentOperatingVisit">
+		<result column="id_" property="id" />
+		<result column="user_id_" property="userId" />
+		<result column="month_" property="month" />
+		<result column="visit_flag_" property="visitFlag" />
+		<result column="organ_id_" property="organId" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="StudentOperatingVisit" >
+		SELECT * FROM student_operating_visit WHERE id_ = #{id} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="StudentOperatingVisit">
+		SELECT * FROM student_operating_visit ORDER BY id_
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentOperatingVisit" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO student_operating_visit (user_id_,month_,visit_flag_,organ_id_) VALUES(#{userId},#{month},#{visitFlag},#{organId})
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentOperatingVisit">
+		UPDATE student_operating_visit <set>
+<if test="userId != null">
+user_id_ = #{userId},
+</if>
+<if test="organId != null">
+organ_id_ = #{organId},
+</if>
+<if test="visitFlag != null">
+visit_flag_ = #{visitFlag},
+</if>
+<if test="month != null">
+month_ = #{month},
+</if>
+</set> WHERE id_ = #{id} 
+	</update>
+    <update id="updateVisit">
+		update student_operating_visit set visit_flag_ = 1
+		where user_id_ = #{studentId} and visit_flag_ = 0 and month_ = DATE_FORMAT(NOW(),'%Y-%m-%d');
+	</update>
+
+    <!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM student_operating_visit WHERE id_ = #{id} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="StudentOperatingVisit" parameterType="map">
+		SELECT * FROM student_operating_visit ORDER BY id_ <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM student_operating_visit
+	</select>
+</mapper>

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

@@ -20,13 +20,14 @@
         <result column="create_time_" property="createTime"/>
         <result column="object_id_" property="objectId"/>
         <result column="tenant_id_" property="tenantId"/>
+        <result column="attachments_" property="attachments"/>
         <result column="feedback_type_" property="feedbackType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="feedback_type_desc_" property="feedbackTypeDesc" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
     <sql id="Base_Column_List">
         <!--@mbg.generated-->
         id_, music_group_id_, organ_id_, student_id_, teacher_id_, visiter_type_, type_, purpose_, overview_, feedback_,
-        visit_time_, create_time_,tenant_id_,feedback_type_,feedback_type_desc_
+        visit_time_, create_time_,tenant_id_,feedback_type_,feedback_type_desc_,attachments_
     </sql>
     <select id="get" parameterType="java.lang.Integer" resultMap="StudentVisit">
         select
@@ -44,18 +45,21 @@
         <!--@mbg.generated-->
         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_)
+        feedback_, visit_time_, create_time_,object_id_,tenant_id_,attachments_)
         values (#{musicGroupId,jdbcType=VARCHAR}, #{organId,jdbcType=INTEGER}, #{studentId,jdbcType=INTEGER},
         #{teacherId,jdbcType=INTEGER},#{visiterType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 #{feedbackType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 #{feedbackTypeDesc,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
         #{type,jdbcType=VARCHAR}, #{purpose,jdbcType=VARCHAR}, #{overview,jdbcType=VARCHAR},
-        #{feedback,jdbcType=VARCHAR}, #{visitTime}, #{createTime},#{objectId},#{tenantId})
+        #{feedback,jdbcType=VARCHAR}, #{visitTime}, #{createTime},#{objectId},#{tenantId},#{attachments})
     </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentVisit">
         <!--@mbg.generated-->
         update student_visit
         <set>
+            <if test="attachments != null and attachments != ''">
+                attachments_ = #{attachments},
+            </if>
             <if test="musicGroupId != null">
                 music_group_id_ = #{musicGroupId,jdbcType=VARCHAR},
             </if>

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

@@ -433,4 +433,51 @@
 	<select id="queryCurrentDatePlayTimeByUserId" resultType="int">
 		SELECT sum(ifnull(cr.`play_time_`,0))  FROM `sys_music_compare_record` cr WHERE date(cr.`create_time_`) = CURDATE() AND cr.`user_id_` = #{userId}
 	</select>
+	<resultMap id="ExportCompareRecordDto" type="com.ym.mec.biz.dal.dto.ExportCompareRecordDto">
+		<result property="userId" column="user_id_" />
+		<result property="username" column="username_" />
+		<result property="phone" column="phone_" />
+		<result property="organName" column="organ_name_" />
+		<result property="heardNum" column="heard_num_" />
+		<result property="playDays" column="play_days_" />
+		<result property="playTime" column="play_time_" />
+		<result property="playNum" column="play_num_" />
+	</resultMap>
+    <select id="exportCompareRecord" resultMap="ExportCompareRecordDto">
+		select o.name_ organ_name_,smcr.user_id_,su.username_,su.phone_,ROUND(sum(smcr.play_time_) / 60) play_time_,
+			   COUNT(su.id_) play_num_,COUNT(DISTINCT DATE_FORMAT(smcr.create_time_,'%Y-%m-%d')) play_days_,
+			   COUNT(CASE WHEN smcr.score_ IS NULL THEN NULL ELSE 1 END) heard_num_
+		from sys_music_compare_record smcr
+		left join sys_user su ON su.id_ = smcr.user_id_
+		left join organization o ON o.id_ = su.organ_id_
+		<where>
+			<if test="queryInfo.organId != null and queryInfo.organId != ''">
+				AND FIND_IN_SET(su.organ_id_, #{queryInfo.organId})
+			</if>
+			<if test="queryInfo.startDate != null and queryInfo.startDate != ''">
+				AND DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') &gt;= #{queryInfo.startDate}
+			</if>
+			<if test="queryInfo.endDate != null and queryInfo.endDate != ''">
+				AND DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') &lt;= #{queryInfo.endDate}
+			</if>
+		</where>
+		group by smcr.user_id_
+		order by o.id_
+	</select>
+	<select id="countExportCompareRecord" resultType="java.lang.Integer">
+		select COUNT(DISTINCT smcr.user_id_)
+		from sys_music_compare_record smcr
+		left join sys_user su ON su.id_ = smcr.user_id_
+		<where>
+			<if test="queryInfo.organId != null and queryInfo.organId != ''">
+				AND FIND_IN_SET(su.organ_id_, #{queryInfo.organId})
+			</if>
+			<if test="queryInfo.startDate != null and queryInfo.startDate != ''">
+				AND DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') &gt;= #{queryInfo.startDate}
+			</if>
+			<if test="queryInfo.endDate != null and queryInfo.endDate != ''">
+				AND DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') &lt;= #{queryInfo.endDate}
+			</if>
+		</where>
+	</select>
 </mapper>

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

@@ -414,6 +414,12 @@
             <if test="lockFlag != null">
                 AND su.lock_flag_ = #{lockFlag}
             </if>
+            <if test="demissionFlag != null and demissionFlag == true">
+                AND t.demission_date_ is not null
+            </if>
+            <if test="demissionFlag != null and demissionFlag == false">
+                AND t.demission_date_ is null
+            </if>
             <if test="teacherId != null">
                 AND t.id_ IN
                 <foreach collection="teacherId" separator="," open="(" close=")" item="item">
@@ -909,7 +915,7 @@
     <select id="findByFlowOrganRangeTeachers" resultMap="TeacherBasicDto">
         SELECT su.id_,su.username_,su.real_name_,t.organ_id_ FROM teacher t
         LEFT JOIN sys_user su ON t.id_ = su.id_
-        WHERE su.del_flag_ = 0 AND su.lock_flag_=0
+        WHERE su.del_flag_ = 0 AND su.lock_flag_ = 0 AND t.demission_date_ is null
             AND (INTE_ARRAY(#{organId},t.flow_organ_range_) OR FIND_IN_SET(t.organ_id_,#{organId}))
     </select>
 

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

@@ -362,6 +362,12 @@
             AND status_='SUCCESS') = 0
             AND IF(vg.student_id_list_ IS NULL, vg.organ_id_ = #{organId}, FIND_IN_SET(#{userId},
             vg.student_id_list_))
+            <if test="expireFlag != null and expireFlag == true">
+                AND vg.payment_expire_date_ >= NOW()
+            </if>
+            <if test="subjectId!=null">
+                AND FIND_IN_SET(#{subjectId},cg.subject_id_list_)
+            </if>
             <if test="subjectId!=null">
                 AND FIND_IN_SET(#{subjectId},cg.subject_id_list_)
             </if>

+ 9 - 0
mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java

@@ -1,11 +1,17 @@
 package com.ym.mec.web;
 
 import com.ym.mec.common.config.FeignConfiguration;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.web.fallback.WebFeignServiceFallback;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
+
 @FeignClient(name = "web-server", contextId = "WebFeignService", configuration = FeignConfiguration.class, fallback = WebFeignServiceFallback.class)
 public interface WebFeignService {
 
@@ -26,4 +32,7 @@ public interface WebFeignService {
 
 	@RequestMapping(value = "api/getTenantConfigValue")
 	String getTenantConfigValue(@RequestParam("tenantId") Integer tenantId, @RequestParam("paramName") String paramName);
+
+	@PostMapping(value = "api/queryVipPracticeGroups")
+    Boolean queryVipPracticeGroups();
 }

+ 9 - 0
mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java

@@ -1,10 +1,14 @@
 package com.ym.mec.web.fallback;
 
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.QueryInfo;
 import org.springframework.stereotype.Component;
 
 import com.ym.mec.web.WebFeignService;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
+
 @Component
 public class WebFeignServiceFallback implements WebFeignService {
 
@@ -37,4 +41,9 @@ public class WebFeignServiceFallback implements WebFeignService {
 	public String getTenantConfigValue(Integer tenantId,String paramName){
 		return null;
 	}
+
+	@Override
+	public Boolean queryVipPracticeGroups() {
+		return null;
+	}
 }

+ 6 - 27
mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java

@@ -1,7 +1,5 @@
 package com.ym.mec.student.controller;
 
-import com.ym.mec.auth.api.client.SysUserFeignService;
-import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply;
 import com.ym.mec.biz.dal.entity.StudentCourseHomework;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
@@ -9,6 +7,7 @@ import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
 import com.ym.mec.biz.service.StudentCourseHomeworkService;
 import com.ym.mec.biz.service.StudentServeService;
+import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
@@ -18,12 +17,9 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.Objects;
-
 /**
  * @Author Joburgess
  * @Date 2019/9/18
@@ -38,7 +34,7 @@ public class StudentCourseHomeworkController extends BaseController {
     @Autowired
     private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
     @Autowired
-    private SysUserFeignService sysUserFeignService;
+    private SysUserService sysUserService;
     @Autowired
     private StudentServeService studentServeService;
 
@@ -82,22 +78,14 @@ public class StudentCourseHomeworkController extends BaseController {
     @ApiOperation(value = "获取学生作业界面详细信息")
     @GetMapping(value = "/findCourseHomeworkStudentDetail")
     public Object findCourseHomeworkStudentDetail(Long courseScheduleID) {
-        SysUser user = sysUserFeignService.queryUserInfo();
-        if(Objects.isNull(user)){
-            return failed(HttpStatus.FORBIDDEN,"请登录");
-        }
-        return succeed(studentCourseHomeworkService.findCourseHomeworkStudentDetail(courseScheduleID,user.getId().longValue()));
+        return succeed(studentCourseHomeworkService.findCourseHomeworkStudentDetail(courseScheduleID,sysUserService.getUserId().longValue()));
     }
 
     @ApiOperation(value = "获取学生作业界面详细信息-公用")
     @GetMapping(value = "/findCourseHomeworkStudentDetailPublic")
     public Object findCourseHomeworkStudentDetailPublic(Long courseScheduleID, boolean extra) {
-        SysUser user = sysUserFeignService.queryUserInfo();
-        if(Objects.isNull(user)){
-            return failed(HttpStatus.FORBIDDEN,"请登录");
-        }
         if(!extra){
-            return succeed(studentCourseHomeworkService.findCourseHomeworkStudentDetail(courseScheduleID,user.getId().longValue()));
+            return succeed(studentCourseHomeworkService.findCourseHomeworkStudentDetail(courseScheduleID,sysUserService.getUserId().longValue()));
         }else{
             return succeed(extracurricularExercisesReplyService.findStudentExtraExerciseDetail(courseScheduleID));
         }
@@ -106,11 +94,7 @@ public class StudentCourseHomeworkController extends BaseController {
     @ApiOperation(value = "获取学生作业记录")
     @GetMapping(value = "/findStudentHomeworkRecord")
     public HttpResponseResult findStudentHomeworkRecord(CourseHomeworkQueryInfo queryInfo){
-        SysUser user = sysUserFeignService.queryUserInfo();
-        if(Objects.isNull(user)){
-            return failed(HttpStatus.FORBIDDEN,"请登录");
-        }
-        queryInfo.setUserId(user.getId().longValue());
+        queryInfo.setUserId(sysUserService.getUserId().longValue());
         return succeed(studentCourseHomeworkService.findStudentHomeworkRecord(queryInfo));
     }
 
@@ -127,11 +111,6 @@ public class StudentCourseHomeworkController extends BaseController {
     @ApiOperation(value = "乐团作业情况")
     @GetMapping("/musicGroupHomeworkStat")
     public HttpResponseResult musicGroupHomeworkStat(String musicGroupId, String year, Integer term) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed("用户信息获取失败");
-        }
-
         if(StringUtils.isEmpty(year)){
             throw new BizException("请录入年份");
         }
@@ -148,7 +127,7 @@ public class StudentCourseHomeworkController extends BaseController {
             endDay = (Integer.valueOf(year) + 1) + "-02-01";
         }
 
-        return succeed(studentServeService.musicGroupHomeworkStatWithStu(musicGroupId, sysUser.getId(), startDay, endDay));
+        return succeed(studentServeService.musicGroupHomeworkStatWithStu(musicGroupId, sysUserService.getUserId(), startDay, endDay));
     }
 
 }

+ 10 - 11
mec-student/src/main/java/com/ym/mec/student/controller/StudentVipGroupController.java

@@ -1,15 +1,14 @@
 package com.ym.mec.student.controller;
 
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.ConditionDto;
-import com.ym.mec.biz.dal.dto.QueryConditionDto;
-import com.ym.mec.biz.dal.dto.VipGroupBuyParamsDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.page.StudentVipGroupQueryInfo;
 import com.ym.mec.biz.service.SubjectService;
 import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.biz.service.VipGroupCategoryService;
 import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.yonge.log.model.AuditLogAnnotation;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -42,7 +41,7 @@ public class StudentVipGroupController extends BaseController {
 
     @ApiOperation(value = "获取vip课列表筛选条件")
     @GetMapping(value = "/findQueryCondition")
-    public Object findQueryCondition(){
+    public HttpResponseResult<List<QueryConditionDto>> findQueryCondition(){
         List<QueryConditionDto> conditions=new ArrayList<>();
         conditions.add(new QueryConditionDto("乐器选择","subjectId",subjectService.findSubjectConditions()));
         conditions.add(new QueryConditionDto("课程类型","categoryId",vipGroupCategoryService.findConditionCategorys()));
@@ -55,7 +54,7 @@ public class StudentVipGroupController extends BaseController {
 
     @ApiOperation(value = "获取vip课列表")
     @PostMapping(value = "/queryVipGroups")
-    public Object queryVipGroups(@RequestBody StudentVipGroupQueryInfo queryInfo){
+    public HttpResponseResult<Map<String, Object>> queryVipGroups(@RequestBody StudentVipGroupQueryInfo queryInfo){
         SysUser sysUser = sysUserService.getUser();
         queryInfo.setOrganId(sysUser.getOrganId());
         queryInfo.setUserId(sysUser.getId());
@@ -67,7 +66,7 @@ public class StudentVipGroupController extends BaseController {
 
     @ApiOperation(value = "获取可购买vip、网管课列表")
     @RequestMapping(value = "/queryVipPracticeGroups")
-    public Object queryVipPracticeGroups(@RequestBody StudentVipGroupQueryInfo queryInfo){
+    public HttpResponseResult<List<StudentVipGroupShowListDto>> queryVipPracticeGroups(@RequestBody StudentVipGroupQueryInfo queryInfo){
         SysUser sysUser = sysUserService.getUser();
         queryInfo.setOrganId(sysUser.getOrganId());
         queryInfo.setUserId(sysUser.getId());
@@ -76,13 +75,13 @@ public class StudentVipGroupController extends BaseController {
 
     @ApiOperation(value = "获取学生端vip、网管课显示详情")
     @RequestMapping(value = "/getVipGroupShowDetail")
-    public Object getVipGroupShowDetail(Long vipGroupId,String groupType){
+    public HttpResponseResult<StudentVipGroupDetailDto> getVipGroupShowDetail(Long vipGroupId, String groupType){
         return succeed(vipGroupService.getVipGroupShowDetail(vipGroupId,groupType));
     }
 
     @ApiOperation(value = "检测vip课成能否购买")
     @GetMapping(value = "/enableBuyGroup")
-    public Object enableBuyGroup(Long vipGroupId,String groupType){
+    public HttpResponseResult enableBuyGroup(Long vipGroupId, String groupType){
         vipGroupService.enableBuyVipGroup(vipGroupId,sysUserService.getUserId(),groupType);
         return succeed();
     }
@@ -90,7 +89,7 @@ public class StudentVipGroupController extends BaseController {
     @ApiOperation(value = "vip课购买")
     @PostMapping("/buyVipGroup")
     @AuditLogAnnotation(operateName = "vip课购买")
-    public Object buyVipGroup(VipGroupBuyParamsDto vipGroupBuyParams) throws Exception {
+    public HttpResponseResult buyVipGroup(VipGroupBuyParamsDto vipGroupBuyParams) throws Exception {
         vipGroupBuyParams.setUserId(sysUserService.getUserId());
         return vipGroupService.buyVipGroup(vipGroupBuyParams);
     }
@@ -98,14 +97,14 @@ public class StudentVipGroupController extends BaseController {
     @ApiOperation(value = "vip课退课")
     @PostMapping("/applyRefund")
     @AuditLogAnnotation(operateName = "vip课退课")
-	public Object applyRefund(Long vipGroupId) {
+	public HttpResponseResult applyRefund(Long vipGroupId) {
 		vipGroupService.applyRefund(vipGroupId);
 		return succeed();
 	}
 
     @ApiOperation(value = "获取vip购买信息")
     @PostMapping("/getVipGroupPayInfo")
-	public Object getVipGroupPayInfo(Integer vipGroupId){
+	public HttpResponseResult<VipGroupPayInfoDto> getVipGroupPayInfo(Integer vipGroupId){
         return succeed(vipGroupService.getVipGroupPayInfo(vipGroupId,sysUserService.getUserId()));
     }
 

+ 1 - 2
mec-util/src/main/java/com/ym/mec/util/excel/POIUtil.java

@@ -195,8 +195,7 @@ public class POIUtil {
 	 * @throws InvocationTargetException
 	 * @throws IllegalAccessException
 	 */
-	public static <T> HSSFWorkbook exportExcel(String[] headColumns, String[] fieldColumns, List<T> dataset) throws IOException, IllegalAccessException,
-			InvocationTargetException, NoSuchMethodException {
+	public static <T> HSSFWorkbook exportExcel(String[] headColumns, String[] fieldColumns, List<T> dataset){
 		if (headColumns == null) {
 			throw new UtilException("excel列名不能为空");
 		}

+ 24 - 4
mec-web/src/main/java/com/ym/mec/web/controller/APIController.java

@@ -1,11 +1,17 @@
 package com.ym.mec.web.controller;
 
-import com.ym.mec.biz.service.SysTenantConfigService;
+import com.ym.mec.biz.dal.dto.StudentVipGroupShowListDto;
+import com.ym.mec.biz.dal.page.StudentVipGroupQueryInfo;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
 
+import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -17,11 +23,10 @@ import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.biz.dal.entity.Teacher;
-import com.ym.mec.biz.service.ImGroupService;
-import com.ym.mec.biz.service.PracticeGroupService;
-import com.ym.mec.biz.service.PracticeLessonApplyService;
 import com.ym.mec.common.controller.BaseController;
 
+import java.util.List;
+
 @RequestMapping("api")
 @Api(tags = "对外接口")
 @RestController
@@ -43,6 +48,10 @@ public class APIController extends BaseController {
 	private SysUserFeignService sysUserFeignService;
 	@Autowired
 	private SysTenantConfigService sysTenantConfigService;
+	@Autowired
+	private SysUserService sysUserService;
+	@Autowired
+	private VipGroupService vipGroupService;
 
 	@GetMapping("/createCashAccount")
 	public Boolean createCashAccount(Integer userId,Integer tenantId) {
@@ -103,4 +112,15 @@ public class APIController extends BaseController {
 		return null;
 	}
 
+	@ApiOperation(value = "获取可购买vip、网管课列表")
+	@RequestMapping(value = "/queryVipPracticeGroups")
+	public Boolean queryVipPracticeGroups(){
+		SysUser sysUser = sysUserService.getUser();
+		StudentVipGroupQueryInfo queryInfo = new StudentVipGroupQueryInfo();
+		queryInfo.setOrganId(sysUser.getOrganId());
+		queryInfo.setUserId(sysUser.getId());
+		List<StudentVipGroupShowListDto> listDtos = vipGroupService.queryVipPracticeGroups(queryInfo);
+		return CollectionUtils.isEmpty(listDtos)?false:true;
+	}
+
 }

+ 17 - 8
mec-web/src/main/java/com/ym/mec/web/controller/EmployeeController.java

@@ -24,6 +24,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -81,22 +82,30 @@ public class EmployeeController extends BaseController {
     @ApiOperation(value = "员工操作")
     @PostMapping("/employeeOperate")
     @PreAuthorize("@pcs.hasPermissions('employee/employeeOperate')")
-    public Object employeeOperate(Integer employeeId, EmployeeOperateEnum operate){
+    public HttpResponseResult employeeOperate(Integer employeeId, EmployeeOperateEnum operate){
         employeeService.employeeOperate(employeeId,operate);
         return succeed();
     }
 
+    @ApiOperation(value = "密码重置")
+    @PostMapping("/resetPassword")
+    @PreAuthorize("@pcs.hasPermissions('employee/resetPassword')")
+    public HttpResponseResult resetPassword(Integer userId){
+        employeeService.resetPassword(userId);
+        return succeed();
+    }
+
     @ApiOperation(value = "当前用户是否有课程组教务老师关联")
     @PostMapping("/hasCourseGroupRelation")
     @PreAuthorize("@pcs.hasPermissions('employee/hasCourseGroupRelation')")
-    public Object hasCourseGroupRelation(Integer employeeId){
+    public HttpResponseResult<HashMap<String, Integer>> hasCourseGroupRelation(Integer employeeId){
         return succeed(employeeService.hasCourseGroupRelation(employeeId));
     }
 
     @ApiOperation(value = "修改指定的教务老师关联")
     @PostMapping("/updateEducationTeacherId")
     @PreAuthorize("@pcs.hasPermissions('employee/updateEducationTeacherId')")
-    public Object updateEducationTeacherId(Integer currentUserId,Integer targetUserId){
+    public HttpResponseResult updateEducationTeacherId(Integer currentUserId,Integer targetUserId){
         employeeService.updateEducationTeacherId(currentUserId,targetUserId);
         return succeed();
     }
@@ -104,7 +113,7 @@ public class EmployeeController extends BaseController {
     @ApiOperation(value = "新增员工")
     @PostMapping("/add")
     @PreAuthorize("@pcs.hasPermissions('employee/add')")
-    public Object add(@RequestBody Employee employee) throws Exception {
+    public HttpResponseResult add(@RequestBody Employee employee) throws Exception {
         employeeService.add(employee);
         return succeed();
     }
@@ -122,14 +131,14 @@ public class EmployeeController extends BaseController {
     @ApiOperation(value = "修改员工")
     @PostMapping("/simpleUpdate")
     @PreAuthorize("@pcs.hasPermissions('employee/simpleUpdate')")
-    public Object simpleUpdate(@RequestBody Employee employee) {
+    public HttpResponseResult simpleUpdate(@RequestBody Employee employee) {
         employeeService.simpleUpdate(employee);
         return succeed();
     }
 
     @ApiOperation(value = "修改用户")
     @PostMapping("/updateUser")
-    public Object update(SysUser sysUser) {
+    public HttpResponseResult update(SysUser sysUser) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user != null) {
             Date date = new Date();
@@ -144,13 +153,13 @@ public class EmployeeController extends BaseController {
     @ApiOperation(value = "获取所有员工")
     @GetMapping("/findAll")
     @PreAuthorize("@pcs.hasPermissions('employee/findAll')")
-    public Object findAll() {
+    public HttpResponseResult<List<Employee>> findAll() {
         return succeed(employeeService.findAll(null));
     }
 
     @ApiOperation(value = "获取用户信息")
     @GetMapping("/queryUserInfo")
-    public Object apiQueryUserInfo() {
+    public HttpResponseResult apiQueryUserInfo() {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if(sysUser != null && sysUser.getId() != null){
             Employee employee = employeeService.get(sysUser.getId());

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

@@ -170,9 +170,6 @@ public class ExportController extends BaseController {
     @PostMapping("export/managerDownload")
     @PreAuthorize("@pcs.hasPermissions('export/managerDownload')")
     public HttpResponseResult managerDownload(@RequestBody ExportDto exportDto) {
-        if (exportDto.getHeadColumns() == null || exportDto.getHeadColumns().size() == 0) {
-            throw new BizException("请选择导出字段");
-        }
         Map<String, Object> queryInfo = exportDto.getQueryInfo();
         if (queryInfo == null) {
             queryInfo = new HashMap<>(10);
@@ -180,7 +177,7 @@ public class ExportController extends BaseController {
         queryInfo.put("page", 1);
         queryInfo.put("rows", 49999);
         queryInfo.put("isExport", true);
-        return exportService.getExportManageFuncMap().get(exportDto.getExportEnum()).apply(queryInfo, exportDto.getHeadColumns());
+        return exportService.getExportManageFuncMap().get(exportDto.getExportEnum()).apply(queryInfo);
     }
 
 

+ 13 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ManagerDownloadController.java

@@ -8,9 +8,11 @@ import com.ym.mec.biz.dal.page.OrganizationQueryInfo;
 import com.ym.mec.biz.service.ManagerDownloadService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -44,4 +46,15 @@ public class ManagerDownloadController extends BaseController {
         return succeed(managerDownloadService.delete(id));
     }
 
+    @ApiOperation(value = "删除")
+    @PostMapping("/batchDel")
+    @PreAuthorize("@pcs.hasPermissions('managerDownload/batchDel')")
+    public Object batchDel(String ids) {
+        if(StringUtils.isEmpty(ids)){
+            throw new BizException("参数校验失败");
+        }
+        managerDownloadService.batchDel(ids);
+        return succeed();
+    }
+
 }

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

@@ -1,12 +1,11 @@
 package com.ym.mec.web.controller;
 
-import com.ym.mec.auth.api.client.SysUserFeignService;
-import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.StudentVisitDto;
 import com.ym.mec.biz.dal.entity.StudentVisit;
 import com.ym.mec.biz.dal.page.StudentVisitQueryInfo;
 import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.biz.service.StudentVisitService;
+import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
@@ -15,10 +14,7 @@ import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 @Api(tags = "回访服务")
 @RequestMapping("visit")
@@ -28,7 +24,7 @@ public class VisitController extends BaseController {
     @Autowired
     private StudentVisitService studentVisitService;
     @Autowired
-    private SysUserFeignService sysUserFeignService;
+    private SysUserService sysUserService;
     @Autowired
     private OrganizationService organizationService;
 
@@ -43,9 +39,8 @@ public class VisitController extends BaseController {
     @ApiOperation(value = "添加回访")
     @PostMapping(value = "/add")
     @PreAuthorize("@pcs.hasPermissions('visit/add')")
-    public HttpResponseResult<StudentVisit> add(@Validated StudentVisit studentVisit) {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        studentVisit.setTeacherId(sysUser.getId());
+    public HttpResponseResult<StudentVisit> add(@RequestBody @Validated StudentVisit studentVisit) {
+        studentVisit.setTeacherId(sysUserService.getUserId());
         studentVisit.setVisiterType(StudentVisit.VisiterTypeEnum.EDU_TEACHER);
         return succeed(studentVisitService.addVisit(studentVisit));
     }

+ 15 - 11
mec-web/src/main/java/com/ym/mec/web/controller/education/EducationCourseScheduleController.java

@@ -1,13 +1,14 @@
 package com.ym.mec.web.controller.education;
 
-import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.auth.api.entity.SysUserRole;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dto.CourseMergeDto;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.page.CourseScheduleQueryInfo;
 import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -33,17 +34,23 @@ public class EducationCourseScheduleController extends BaseController {
     @Autowired
     private CourseScheduleService scheduleService;
     @Autowired
-    private SysUserFeignService sysUserFeignService;
+    private SysUserService sysUserService;
     @Autowired
     private EmployeeDao employeeDao;
+    @Autowired
+    private CourseScheduleService courseScheduleService;
+
+    @ApiOperation(value = "课程合并")
+    @PostMapping(value = "/courseMerge",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult courseMerge(CourseMergeDto courseMergeInfo){
+        courseMergeInfo.setOperatorId(sysUserService.getUserId());
+        return courseScheduleService.courseMerge(courseMergeInfo);
+    }
 
     @ApiOperation(value = "根据月份获取乐团在该月有课的日期")
     @GetMapping("/getCourseScheduleDateByMonth")
     public Object getCourseScheduleDateByMonth(@ApiParam(value = "月份", required = true) @RequestParam Date month,String type) {
-        SysUser user = sysUserFeignService.queryUserInfo();
-        if (null == user) {
-            throw new BizException("请登录");
-        }
+        SysUser user = sysUserService.getUser();
         Employee employee = employeeDao.get(user.getId());
         if(Objects.isNull(employee)){
             throw new BizException("员工信息不存在");
@@ -60,10 +67,7 @@ public class EducationCourseScheduleController extends BaseController {
     @ApiOperation(value = "根据日期获取当日排课")
     @GetMapping("/getCourseSchedulesWithDate")
     public Object getCourseSchedulesWithDate(CourseScheduleQueryInfo queryInfo) {
-        SysUser user = sysUserFeignService.queryUserInfo();
-        if (null == user) {
-            throw new BizException("请登录");
-        }
+        SysUser user = sysUserService.getUser();
         Employee employee = employeeDao.get(user.getId());
         if(Objects.nonNull(employee)){
             queryInfo.setOrganIdList(employee.getOrganIdList());

+ 9 - 5
mec-web/src/main/resources/exportColumnMapper.ini

@@ -112,11 +112,11 @@ fieldColumns = ["userId", "username", "phone", "type.msg", "name", "actualSalary
 
 [订单列表导出1]
 headColumns = ["序号", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额", "课程家长采买","课程学校采买", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费","账户充值", "零售乐器","大件乐器", "其它", "汇付手续费","平台手续费", "到账时间","关联乐团ID/VIP课ID","课程形态","类型","收费乐团编号","收费乐团","零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"]
-fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount","balancePaymentAmount","couponRemitFee","musicGroupCourseFee","courseSchoolBuyAmount", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee","leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee","retailGoodsFee","largeMusicalFee", "otherFee", "transferFee", "platformFee", "payTime", "musicGroupId","groupType.desc","typeDesc.msg","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
+fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount","balancePaymentAmount","couponRemitFee","musicGroupCourseFee","courseSchoolBuyAmount", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee","leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee","retailGoodsFee","largeMusicalFee", "otherFee", "transferFee", "platformFee", "payTime", "musicGroupId","groupType.desc","typeDesc","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
 
 [订单列表导出2]
 headColumns = ["序号", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额","课程家长采买","课程学校采买", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费","账户充值", "零售乐器","大件乐器", "其它","平台手续费", "到账时间",    "关联乐团ID/VIP课ID", "课程形态","类型","收费乐团编号","收费乐团", "零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"]
-fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount",  "couponRemitFee",     "musicGroupCourseFee","courseSchoolBuyAmount", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee",     "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee","retailGoodsFee","largeMusicalFee", "otherFee", "platformFee", "payTime", "musicGroupId", "groupType.desc","typeDesc.msg","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
+fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount",  "couponRemitFee",     "musicGroupCourseFee","courseSchoolBuyAmount", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee",     "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee","retailGoodsFee","largeMusicalFee", "otherFee", "platformFee", "payTime", "musicGroupId", "groupType.desc","typeDesc","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
 
 [订单列表汇总导出]
 headColumns = ["分部", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额","课程家长采买","课程学校采买", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费","账户充值", "零售乐器","大件乐器", "其它"]
@@ -172,11 +172,11 @@ fieldColumns = ["organization.name", "id", "name", "isEnable == true ? '是':'
 
 [财务管理导出1]
 headColumns = ["序号", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "分润账户", "分润金额", "分配余额", "优惠金额", "乐团课", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费", "账户充值", "其它", "汇付手续费", "平台手续费", "到账时间", "关联乐团ID/VIP课ID", "课程形态","类型","收费乐团编号","收费乐团", "零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"]
-fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount", "routeMerNo", "routeAmount", "routeBalance",  "couponRemitFee",     "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee", "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee", "otherFee", "transferFee", "platformFee", "payTime", "musicGroupId", "groupType.desc","typeDesc.msg","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
+fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount", "routeMerNo", "routeAmount", "routeBalance",  "couponRemitFee",     "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee", "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee", "otherFee", "transferFee", "platformFee", "payTime", "musicGroupId", "groupType.desc","typeDesc","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
 
 [财务管理导出2]
 headColumns = ["序号", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "分润账户", "分润金额", "分配余额", "优惠金额", "乐团课", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费", "账户充值", "其它", "平台手续费", "到账时间", "关联乐团ID/VIP课ID", "课程形态","类型","收费乐团编号","收费乐团", "零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"]
-fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount" , "expectAmount", "actualAmount", "balancePaymentAmount", "routeMerNo", "routeAmount", "routeBalance",  "couponRemitFee",     "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee", "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee", "otherFee", "platformFee", "payTime", "musicGroupId", "groupType.desc","typeDesc.msg","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
+fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount" , "expectAmount", "actualAmount", "balancePaymentAmount", "routeMerNo", "routeAmount", "routeBalance",  "couponRemitFee",     "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee", "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee", "otherFee", "platformFee", "payTime", "musicGroupId", "groupType.desc","typeDesc","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
 
 [老师默认课酬导出]
 headColumns = ["老师编号", "姓名", "分部", "工作类型", "在职状态", "老师状态", "1v1", "1v2", "1v3", "1v4", "1v5", "1v6", "1v7","网管课", "单技课2.0(主教)", "合奏课2.0(主教)", "综合课2.0(主教)", "集训单技课2.0(主教)", "集训合奏课2.0(主教)","基础技能课2.0(主教)", "课堂课(主教)", "单技课3.0(主教)", "合奏课3.0(主教)", "综合课3.0(主教)", "集训单技课3.0(主教)", "集训合奏课3.0(主教)","基础技能课3.0(主教)", "单技课2.0(助教)", "合奏课2.0(助教)", "综合课2.0(助教)", "集训单技课2.0(助教)", "集训合奏课2.0(助教)","基础技能课2.0(助教)", "课堂课(助教)", "单技课3.0(助教)", "合奏课3.0(助教)", "综合课3.0(助教)", "集训单技课3.0(助教)", "集训合奏课3.0(助教)","基础技能课3.0(助教)", "网络基础训练课1v3", "网络基础训练课1v4", "网络基础训练课1v5", "乐团网管课1v1"]
@@ -288,4 +288,8 @@ fieldColumns = ["organizationName","userId","username","activityId","activityNam
 
 [乐团学生服务指标导出]
 headColumns = ["编号","姓名","乐团名称","分部","服务周期","服务指标总数","已布置","已提交数","点评数","出勤率","达标率"]
-fieldColumns = ["userId","username","musicGroupName","organName","servePeriod", "serveNum","actualExercisesNum","exercisesReplyNum","exercisesMessageNum","signRate","passRate"]
+fieldColumns = ["userId","username","musicGroupName","organName","servePeriod", "serveNum","actualExercisesNum","exercisesReplyNum","exercisesMessageNum","signRate","passRate"]
+
+[训练统计导出]
+headColumns = ["分部", "学员编号", "学员姓名", "手机号", "训练时长(分)", "训练次数", "训练天数", "评测次数"]
+fieldColumns = ["organName", "userId", "username","phone", "playTime", "playNum", "playDays","heardNum"]