Browse Source

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

zouxuan 3 years ago
parent
commit
7ef2476a2c
80 changed files with 3401 additions and 579 deletions
  1. 3 3
      codegen/src/main/resources/generateConfigration.xml
  2. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  3. 26 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStatisticsDao.java
  4. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  5. 24 9
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  6. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java
  7. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  8. 40 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantProxyDividendDao.java
  9. 69 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantProxyInfoDao.java
  10. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantProxyUserRelationDao.java
  11. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CloudStudyStudentDataDto.java
  12. 74 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/IndexCloudStudyListDto.java
  13. 28 12
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupCourseScheduleDto.java
  14. 150 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupExportDto.java
  15. 11 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TenantInfoDto.java
  16. 75 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TenantProxyDto.java
  17. 179 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleStatistics.java
  18. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentAttendance.java
  19. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRegistration.java
  20. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantInfo.java
  21. 96 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantProxyDividend.java
  22. 94 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantProxyInfo.java
  23. 84 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantProxyRelation.java
  24. 94 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantProxyUserRelation.java
  25. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java
  26. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/queryMusicGroupCourseScheduleQueryInfo.java
  27. 89 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ProxyDividendInfoVo.java
  28. 41 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ProxyDividendVo.java
  29. 98 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ProxyUserVo.java
  30. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  31. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStatisticsService.java
  32. 16 8
      mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java
  33. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ExtracurricularExercisesReplyService.java
  34. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentExtracurricularExercisesSituationService.java
  35. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  36. 2 7
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantContractTemplateService.java
  37. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantInfoService.java
  38. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantOrderRecordService.java
  39. 42 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantProxyDividendService.java
  40. 80 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantProxyInfoService.java
  41. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantProxyUserRelationService.java
  42. 9 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  43. 7 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  44. 49 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStatisticsServiceImpl.java
  45. 76 242
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  46. 5 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java
  47. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  48. 3 20
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrganizationServiceImpl.java
  49. 43 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java
  50. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  51. 8 13
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java
  52. 73 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  53. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  54. 108 127
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantContractTemplateServiceImpl.java
  55. 8 16
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java
  56. 60 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantOrderRecordServiceImpl.java
  57. 146 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantProxyDividendServiceImpl.java
  58. 221 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantProxyInfoServiceImpl.java
  59. 29 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantProxyUserRelationServiceImpl.java
  60. 47 8
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  61. 7 4
      mec-biz/src/main/resources/config/mybatis/CloudTeacherMapper.xml
  62. 179 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStatisticsMapper.xml
  63. 74 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  64. 1 1
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  65. 2 2
      mec-biz/src/main/resources/config/mybatis/StudentBasicInfoMapper.xml
  66. 22 0
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  67. 70 34
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  68. 6 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  69. 2 1
      mec-biz/src/main/resources/config/mybatis/TenantInfoMapper.xml
  70. 68 0
      mec-biz/src/main/resources/config/mybatis/TenantProxyDividendMapper.xml
  71. 107 0
      mec-biz/src/main/resources/config/mybatis/TenantProxyInfoMapper.xml
  72. 27 0
      mec-biz/src/main/resources/config/mybatis/TenantProxyUserRelationMapper.xml
  73. 15 8
      mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java
  74. 50 0
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  75. 64 15
      mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java
  76. 4 0
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  77. 5 4
      mec-web/src/main/java/com/ym/mec/web/controller/TenantPreJoinController.java
  78. 59 0
      mec-web/src/main/java/com/ym/mec/web/controller/TenantProxyDividendController.java
  79. 106 0
      mec-web/src/main/java/com/ym/mec/web/controller/TenantProxyInfoController.java
  80. 29 0
      mec-web/src/main/java/com/ym/mec/web/controller/TenantProxyUserRelationController.java

+ 3 - 3
codegen/src/main/resources/generateConfigration.xml

@@ -2,11 +2,11 @@
 <GenerateConfiguration>
 	<dbConfiguration>
 		<driverClass>com.mysql.jdbc.Driver</driverClass>
-		<url>jdbc:mysql://47.114.1.200:3306/mec_dev</url>
+		<url>jdbc:mysql://47.114.176.40:3306/mec_test</url>
 		<username>mec_dev</username>
 		<password>dayaDataOnline@2019</password>
-		<catalog>mec_dev</catalog>
-		<schema>mec_dev</schema>
+		<catalog>mec_test</catalog>
+		<schema>mec_test</schema>
 	</dbConfiguration>
 	<srcBase>/Users/chenxiaoyu/Documents/javabean</srcBase>
 	<pojoPackageName>com.ym.mec.biz.dal.entity</pojoPackageName>

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java

@@ -4,6 +4,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import com.ym.mec.biz.dal.entity.CourseScheduleStatistics;
 import org.apache.ibatis.annotations.Param;
 
 import com.ym.mec.biz.dal.dto.ClassGroupTeachersDto;
@@ -432,6 +433,14 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
     List<MusicGroupCourseScheduleDto> queryMusicGroupCourseScheduleDetail(Map<String, Object> params);
 
     /**
+     * 获取乐团详情---课表详情列表
+     *
+     * @param params
+     * @return
+     */
+    CourseScheduleStatistics getMusicGroupCourseScheduleStatistics(Map<String, Object> params);
+
+    /**
      * COUNT乐团详情---课表详情列表
      *
      * @param params

+ 26 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStatisticsDao.java

@@ -0,0 +1,26 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.biz.dal.entity.CourseScheduleStatistics;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface CourseScheduleStatisticsDao extends BaseDAO<Long, CourseScheduleStatistics> {
+
+
+    //获取需要更新的课程统计信息
+    List<CourseScheduleStatistics> queryUpdateCourseScheduleStatistics();
+
+    //获取需要新增的课程统计信息
+    List<CourseScheduleStatistics> queryInsertCourseScheduleStatistics();
+
+    void batchUpdate(@Param("scheduleStatisticsList") List<CourseScheduleStatistics> scheduleStatisticsList);
+
+    void batchInsert(@Param("scheduleStatisticsList") List<CourseScheduleStatistics> scheduleStatisticsList);
+
+    void delWaitByCourseId(@Param("courseIdList") List<Long> courseIdList);
+
+    //更新服务指标
+    void updateCourseService(@Param("courseIds") String courseIds, @Param("serviceFlag") int serviceFlag);
+}

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java

@@ -9,6 +9,7 @@ import com.ym.mec.biz.dal.entity.School;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
 import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
+import com.ym.mec.biz.dal.page.ExportUserAccountQueryInfo;
 import com.ym.mec.biz.dal.page.IndexDataQueryInfo;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImGroupModel;
@@ -505,4 +506,10 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
     * @date 2022/3/17 16:20
     */
     Integer countQuitNum(@Param("queryInfo") IndexDataQueryInfo queryInfo);
+
+    //乐团统计数据导出
+    Integer countMusicGroupCourseList(@Param("queryInfo") ExportUserAccountQueryInfo queryInfo);
+
+    //乐团统计数据导出
+    List<MusicGroupExportDto> exportMusicGroupCourseList(@Param("queryInfo") ExportUserAccountQueryInfo queryInfo);
 }

+ 24 - 9
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -1,17 +1,24 @@
 package com.ym.mec.biz.dal.dao;
 
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.ibatis.annotations.Param;
+
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.dto.EduOrganStudentListDto;
+import com.ym.mec.biz.dal.dto.IndexCloudStudyListDto;
+import com.ym.mec.biz.dal.dto.Mapper;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.dto.Student4operating;
+import com.ym.mec.biz.dal.dto.StudentServeCourseDto;
+import com.ym.mec.biz.dal.dto.StudentServeDto;
 import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.entity.Subject;
 import com.ym.mec.biz.dal.enums.GroupType;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
 public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Student> {
 	
@@ -255,7 +262,9 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
      * @return com.ym.mec.biz.dal.dto.EduOrganStudentDataDto
      */
     int getOrganStudentNum(@Param("organId") Integer organId);
-    int getOrgansTotalStudentNum(@Param("organIds") List<Integer> organIds);
+    
+    IndexCloudStudyListDto getOrgansCloudTeacherStudent(@Param("organIds") List<Integer> organIds);
+    
     List<Map<Integer, Integer>> getOrgansStudentNum(@Param("organIds") List<Integer> organIds);
 
     List<Map<Integer, Integer>> getOrganTeacherStudentNum(@Param("teacherIds") List<Integer> teacherIds,
@@ -288,8 +297,14 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
 
 
     int getCloudStudyLivelyStudentNum(@Param("organId") Integer organId);
-    int getOrganTotalCloudStudyLivelyStudentNum(@Param("organIds") List<Integer> organIds);
+    int getOrganTotalCloudStudyLivelyStudentNum(@Param("organIds") List<Integer> organIds, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
     List<Map<Integer, Integer>> getOrganCloudStudyLivelyStudentNum(@Param("organIds") List<Integer> organIds);
+    
+    List<IndexCloudStudyListDto> getCloudStudyStudentOverViewList(@Param("organIds") List<Integer> organIds);
+    
+    List<Mapper> getOrganActiveCloudStudyStudentNum(@Param("organIds") List<Integer> organIds, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
+    
+    List<Mapper> getOrganCloudTeacherStudentNum(@Param("organIds") List<Integer> organIds);
 
     /**
      * @describe 查询云教练学员列表数据

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java

@@ -38,6 +38,16 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
                        @Param("studentIds") List<Integer> studentIds);
 
     /**
+     * @describe 根据周一日期删除统计信息
+     * @author Joburgess
+     * @date 2020/4/10
+     * @param monday:
+     * @return int
+     */
+    List<StudentExtracurricularExercisesSituation> selectByMonday(@Param("monday") String monday,
+                       @Param("studentIds") List<Integer> studentIds);
+
+    /**
      * @describe 删除指定学员的服务指标
      * @author Joburgess
      * @date 2020.05.28
@@ -47,6 +57,16 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
     int deleteByStudent(@Param("studentId") Integer studentId,
                         @Param("monday") String monday);
 
+    /**
+     * @describe 删除指定学员的服务指标
+     * @author Joburgess
+     * @date 2020.05.28
+     * @param studentId: 学员编号
+     * @return int
+     */
+    List<StudentExtracurricularExercisesSituation> selectByStudent(@Param("studentId") Integer studentId,
+                        @Param("monday") String monday);
+
     List<StudentExercisesSituationDto> findExercisesSituations(Map<String, Object> params);
     int countExercisesSituations(Map<String, Object> params);
 
@@ -162,4 +182,6 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
     int countWaitCreateHomeworkNum1(Integer teacherId);
     
     List<TeacherServeDto> queryTeacherPerformanceIndicator(Map<String, Object> params);
+
+    void batchDelete(@Param("situationIds") List<Long> situationIds);
 }

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java

@@ -225,6 +225,14 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     List<StudentRegistration> queryStudentByMusicGroupId(String musicGroupId);
 
     /**
+     * 更新成团学员标记
+     *
+     * @param musicGroupId
+     * @return
+     */
+    void updateOriginalFlag(String musicGroupId);
+
+    /**
      * 统计乐团不同声部报名人数
      *
      * @param musicGroupId

+ 40 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantProxyDividendDao.java

@@ -0,0 +1,40 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ym.mec.biz.dal.entity.TenantProxyDividend;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 代理商分润表(TenantProxyDividend)表数据库访问层
+ *
+ * @author hgw
+ * @since 2022-04-22 14:08:19
+ */
+public interface TenantProxyDividendDao extends BaseMapper<TenantProxyDividend> {
+
+    int insertBatch(@Param("entities") List<TenantProxyDividend> entities);
+
+    /**
+     * 代理商分润查询
+     *
+     * @param param 传入参数
+     *              <p> -  proxyId 代理商id
+     *              <p> -  recommenderId 推荐人id
+     *              <p> -  startData 开始日期 年月日
+     *              <p> -  endData 结束日期 年月日
+     */
+    <T> IPage<T> queryProxyDividendInfo(Page<T> page, @Param("param") Map<String, Object> param);
+
+    /**
+     * @param param 传入参数
+     *              <p> -  proxyId 代理商id
+     */
+   int queryProxyDividendCount(@Param("param") Map<String, Object> param);
+
+}
+

+ 69 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantProxyInfoDao.java

@@ -0,0 +1,69 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.TenantProxyInfo;
+import com.ym.mec.biz.dal.vo.ProxyUserVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 机构代理商信息表(TenantProxyInfo)表数据库访问层
+ *
+ * @author hgw
+ * @since 2022-04-22 14:08:20
+ */
+public interface TenantProxyInfoDao extends BaseMapper<TenantProxyInfo> {
+
+    int insertBatch(@Param("entities") List<TenantProxyInfo> entities);
+
+    /**
+     * 在sysuser表添加代理商人员信息
+     */
+    int insertProxySysUser(SysUser sysUser);
+
+    /**
+     * 冻结字段
+     * 修改sysuser表 lock字段
+     * 9 冻结 0解冻
+     */
+    int updateProxySysUserLock(@Param("id") Integer id, @Param("lock") Integer lock);
+
+    /**
+     * 修改sysUser表
+     *
+     * @param id    人员id
+     * @param phone 手机号
+     */
+    int updateSysUserPhone(@Param("id") Integer id, @Param("phone") String phone, @Param("name") String name);
+
+    /**
+     * 查询代理商下级人员数据
+     *
+     * @param id 代理商负责人id
+     */
+    List<ProxyUserVo> queryProxyUserStaff(@Param("id") Integer id);
+
+    /**
+     * 分页查询代理商负责人数据
+     *
+     * @param param 传入参数
+     *              <p> - state  状态 0正常 1冻结
+     *              <p> - search 模糊搜索关键字
+     */
+    <T> IPage<T> queryProxyUser(Page<T> page, @Param("param") Map<String, Object> param);
+
+    /**
+     * 根据手机号/姓名模糊查询所有平台账号信息
+     *
+     * @param param 传入参数
+     *              <p> - search 模糊搜索关键字
+     */
+    List<SysUser> queryUserList(@Param("param") Map<String, Object> param);
+
+}
+

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantProxyUserRelationDao.java

@@ -0,0 +1,20 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.TenantProxyUserRelation;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 机构代理商人员关系表(TenantProxyUserRelation)表数据库访问层
+ *
+ * @author hgw
+ * @since 2022-04-22 14:08:21
+ */
+public interface TenantProxyUserRelationDao extends BaseMapper<TenantProxyUserRelation> {
+
+    int insertBatch(@Param("entities") List<TenantProxyUserRelation> entities);
+
+}
+

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CloudStudyStudentDataDto.java

@@ -18,6 +18,10 @@ public class CloudStudyStudentDataDto {
 
     @ApiModelProperty("付费会员数")
     private int vipStudentNum;
+    
+	private Integer effectiveVipStudentNum;
+	
+	private Integer waitActivateVipStudentNum;
 
     @ApiModelProperty("试用会员数")
     private int eVipStudentNum;
@@ -127,4 +131,20 @@ public class CloudStudyStudentDataDto {
     public void setNewCloudStudyStudentNum(int newCloudStudyStudentNum) {
         this.newCloudStudyStudentNum = newCloudStudyStudentNum;
     }
+
+	public Integer getEffectiveVipStudentNum() {
+		return effectiveVipStudentNum;
+	}
+
+	public void setEffectiveVipStudentNum(Integer effectiveVipStudentNum) {
+		this.effectiveVipStudentNum = effectiveVipStudentNum;
+	}
+
+	public Integer getWaitActivateVipStudentNum() {
+		return waitActivateVipStudentNum;
+	}
+
+	public void setWaitActivateVipStudentNum(Integer waitActivateVipStudentNum) {
+		this.waitActivateVipStudentNum = waitActivateVipStudentNum;
+	}
 }

+ 74 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/IndexCloudStudyListDto.java

@@ -0,0 +1,74 @@
+package com.ym.mec.biz.dal.dto;
+
+public class IndexCloudStudyListDto {
+
+	private Integer organId;
+	
+	private String organName;
+	
+	private Integer totalStudentNum;
+	
+	private Integer vipStudentNum;
+	
+	private Integer effectiveVipStudentNum;
+	
+	private Integer waitActivateVipStudentNum;
+	
+	private Integer activeStudentNum;
+
+	public Integer getOrganId() {
+		return organId;
+	}
+
+	public void setOrganId(Integer organId) {
+		this.organId = organId;
+	}
+
+	public String getOrganName() {
+		return organName;
+	}
+
+	public void setOrganName(String organName) {
+		this.organName = organName;
+	}
+
+	public Integer getTotalStudentNum() {
+		return totalStudentNum;
+	}
+
+	public void setTotalStudentNum(Integer totalStudentNum) {
+		this.totalStudentNum = totalStudentNum;
+	}
+
+	public Integer getVipStudentNum() {
+		return vipStudentNum;
+	}
+
+	public void setVipStudentNum(Integer vipStudentNum) {
+		this.vipStudentNum = vipStudentNum;
+	}
+
+	public Integer getEffectiveVipStudentNum() {
+		return effectiveVipStudentNum;
+	}
+
+	public void setEffectiveVipStudentNum(Integer effectiveVipStudentNum) {
+		this.effectiveVipStudentNum = effectiveVipStudentNum;
+	}
+
+	public Integer getWaitActivateVipStudentNum() {
+		return waitActivateVipStudentNum;
+	}
+
+	public void setWaitActivateVipStudentNum(Integer waitActivateVipStudentNum) {
+		this.waitActivateVipStudentNum = waitActivateVipStudentNum;
+	}
+
+	public Integer getActiveStudentNum() {
+		return activeStudentNum;
+	}
+
+	public void setActiveStudentNum(Integer activeStudentNum) {
+		this.activeStudentNum = activeStudentNum;
+	}
+}

+ 28 - 12
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupCourseScheduleDto.java

@@ -1,6 +1,11 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.CourseScheduleStatistics;
 import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import com.ym.mec.biz.dal.enums.SignInStatusEnum;
+import com.ym.mec.biz.dal.enums.SignOutStatusEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -44,22 +49,22 @@ public class MusicGroupCourseScheduleDto {
     private String classGroupName;
 
     @ApiModelProperty(value = "课程类型",required = false)
-    private String courseScheduleType;
+    private CourseSchedule.CourseScheduleType courseScheduleType;
 
     @ApiModelProperty(value = "课程状态",required = false)
-    private String courseScheduleStatus;
+    private CourseStatusEnum courseScheduleStatus;
 
     @ApiModelProperty(value = "签到时间")
     private Date signInTime;
 
     @ApiModelProperty(value = "签到状态",required = false)
-    private String signInStatus;
+    private SignInStatusEnum signInStatus;
 
     @ApiModelProperty(value = "签退时间")
     private Date signOutTime;
 
     @ApiModelProperty(value = "签退状态",required = false)
-    private String signOutStatus;
+    private SignOutStatusEnum signOutStatus;
 
     @ApiModelProperty(value = "结算时间",required = false)
     private Date settlementTime;
@@ -83,6 +88,17 @@ public class MusicGroupCourseScheduleDto {
     
     private Integer schoolId;
 
+    @ApiModelProperty(value = "课程相关统计数据")
+    private CourseScheduleStatistics courseScheduleStatistics;
+
+    public CourseScheduleStatistics getCourseScheduleStatistics() {
+        return courseScheduleStatistics;
+    }
+
+    public void setCourseScheduleStatistics(CourseScheduleStatistics courseScheduleStatistics) {
+        this.courseScheduleStatistics = courseScheduleStatistics;
+    }
+
     public YesOrNoEnum getIsCallNames() {
         return isCallNames;
     }
@@ -227,35 +243,35 @@ public class MusicGroupCourseScheduleDto {
         this.classGroupName = classGroupName;
     }
 
-    public String getCourseScheduleType() {
+    public CourseSchedule.CourseScheduleType getCourseScheduleType() {
         return courseScheduleType;
     }
 
-    public void setCourseScheduleType(String courseScheduleType) {
+    public void setCourseScheduleType(CourseSchedule.CourseScheduleType courseScheduleType) {
         this.courseScheduleType = courseScheduleType;
     }
 
-    public String getCourseScheduleStatus() {
+    public CourseStatusEnum getCourseScheduleStatus() {
         return courseScheduleStatus;
     }
 
-    public void setCourseScheduleStatus(String courseScheduleStatus) {
+    public void setCourseScheduleStatus(CourseStatusEnum courseScheduleStatus) {
         this.courseScheduleStatus = courseScheduleStatus;
     }
 
-    public String getSignInStatus() {
+    public SignInStatusEnum getSignInStatus() {
         return signInStatus;
     }
 
-    public void setSignInStatus(String signInStatus) {
+    public void setSignInStatus(SignInStatusEnum signInStatus) {
         this.signInStatus = signInStatus;
     }
 
-    public String getSignOutStatus() {
+    public SignOutStatusEnum getSignOutStatus() {
         return signOutStatus;
     }
 
-    public void setSignOutStatus(String signOutStatus) {
+    public void setSignOutStatus(SignOutStatusEnum signOutStatus) {
         this.signOutStatus = signOutStatus;
     }
 

+ 150 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupExportDto.java

@@ -0,0 +1,150 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+
+public class MusicGroupExportDto extends BaseEntity {
+
+    @ApiModelProperty(value = "分部")
+    private String organName;
+
+    @ApiModelProperty(value = "乐团")
+    private String musicGroupId;
+
+    @ApiModelProperty(value = "乐团")
+    private String musicGroupName;
+
+    @ApiModelProperty(value = "乐团主管")
+    private String eduName;
+
+    @ApiModelProperty(value = "出勤率")
+    private String attendanceRate = "0.00%";
+
+    @ApiModelProperty(value = "达标率")
+    private String standardRate = "0.00%";
+
+    @ApiModelProperty(value = "作业提交率")
+    private String homeworkCommitRate = "0.00%";
+
+    @ApiModelProperty(value = "成团人数")
+    private int groupMemberNum;
+
+    @ApiModelProperty(value = "新增人数")
+    private int addStuNum;
+
+    @ApiModelProperty(value = "退团人数")
+    private int quitStuNum;
+
+    @ApiModelProperty(value = "在读人数")
+    private int normalNum;
+
+    @ApiModelProperty(value = "乐团总人数")
+    private int totalNum;
+
+    @ApiModelProperty(value = "流失率")
+    private String lostRate = "0.00%";
+
+    public String getLostRate() {
+        return lostRate;
+    }
+
+    public void setLostRate(String lostRate) {
+        this.lostRate = lostRate;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public String getMusicGroupName() {
+        return musicGroupName;
+    }
+
+    public void setMusicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+    }
+
+    public String getEduName() {
+        return eduName;
+    }
+
+    public void setEduName(String eduName) {
+        this.eduName = eduName;
+    }
+
+    public String getAttendanceRate() {
+        return attendanceRate;
+    }
+
+    public void setAttendanceRate(String attendanceRate) {
+        this.attendanceRate = attendanceRate;
+    }
+
+    public String getStandardRate() {
+        return standardRate;
+    }
+
+    public void setStandardRate(String standardRate) {
+        this.standardRate = standardRate;
+    }
+
+    public String getHomeworkCommitRate() {
+        return homeworkCommitRate;
+    }
+
+    public void setHomeworkCommitRate(String homeworkCommitRate) {
+        this.homeworkCommitRate = homeworkCommitRate;
+    }
+
+    public int getGroupMemberNum() {
+        return groupMemberNum;
+    }
+
+    public void setGroupMemberNum(int groupMemberNum) {
+        this.groupMemberNum = groupMemberNum;
+    }
+
+    public int getAddStuNum() {
+        return addStuNum;
+    }
+
+    public void setAddStuNum(int addStuNum) {
+        this.addStuNum = addStuNum;
+    }
+
+    public int getQuitStuNum() {
+        return quitStuNum;
+    }
+
+    public void setQuitStuNum(int quitStuNum) {
+        this.quitStuNum = quitStuNum;
+    }
+
+    public int getNormalNum() {
+        return normalNum;
+    }
+
+    public void setNormalNum(int normalNum) {
+        this.normalNum = normalNum;
+    }
+
+    public int getTotalNum() {
+        return totalNum;
+    }
+
+    public void setTotalNum(int totalNum) {
+        this.totalNum = totalNum;
+    }
+}

+ 11 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TenantInfoDto.java

@@ -13,8 +13,6 @@ import java.io.Serializable;
 @ApiModel(value = "机构参数")
 public class TenantInfoDto implements Serializable {
 
-    private static final long serialVersionUID = 1L;
-
     /**
      * 机构id
      */
@@ -115,6 +113,9 @@ public class TenantInfoDto implements Serializable {
     @ApiModelProperty(value = "人数上线")
     private Integer studentUpLimit;
 
+    @ApiModelProperty(value = "推荐人")
+    private Integer recommender;
+
     public Integer getId() {
         return id;
     }
@@ -258,4 +259,12 @@ public class TenantInfoDto implements Serializable {
     public void setStudentUpLimit(Integer studentUpLimit) {
         this.studentUpLimit = studentUpLimit;
     }
+
+    public Integer getRecommender() {
+        return recommender;
+    }
+
+    public void setRecommender(Integer recommender) {
+        this.recommender = recommender;
+    }
 }

+ 75 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TenantProxyDto.java

@@ -0,0 +1,75 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * @author hgw
+ */
+@ApiModel(value = "代理商信息参数")
+public class TenantProxyDto implements Serializable {
+
+    @ApiModelProperty(value = "人员id")
+    private Integer userId;
+
+    @ApiModelProperty(value = "父级人员id")
+    private Integer parentId;
+
+    @ApiModelProperty(value = "代理商名称")
+    private String proxyName;
+
+    @NotBlank(message = "人员名称不能为空")
+    @ApiModelProperty(value = "人员名称")
+    private String name;
+
+    @NotBlank(message = "手机号不能为空")
+    @Size(max = 11, message = "手机号最高11位,请核实后在填写!")
+    @Pattern(regexp = "^[0-9]*$", message = "手机只能填写数字,请核实后在填写!")
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getProxyName() {
+        return proxyName;
+    }
+
+    public void setProxyName(String proxyName) {
+        this.proxyName = proxyName;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Integer parentId) {
+        this.parentId = parentId;
+    }
+}

+ 179 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleStatistics.java

@@ -0,0 +1,179 @@
+package com.ym.mec.biz.dal.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(course_schedule_statistics):
+ */
+public class CourseScheduleStatistics {
+
+	/** 课程编号 */
+	@ApiModelProperty(value = "课程编号")
+	private Long courseScheduleId;
+	
+	/** 乐团编号 */
+	@ApiModelProperty(value = "乐团编号")
+	private String musicGroupId;
+	
+	/** 学员总数 */
+	@ApiModelProperty(value = "学员总数")
+	private Integer courseStudentTotalNum;
+	
+	/** 考勤正常人数 */
+	@ApiModelProperty(value = "考勤正常人数")
+	private Integer attendanceNum;
+	
+	/** 迟到人数 */
+	@ApiModelProperty(value = "迟到人数")
+	private Integer lateNum;
+	
+	/** 达标人数 */
+	@ApiModelProperty(value = "达标人数")
+	private Integer standardNum;
+	
+	/** 是否布置作业 */
+	@ApiModelProperty(value = "是否布置作业")
+	private boolean homeworkFlag;
+	
+	/** 提交作业人数 */
+	@ApiModelProperty(value = "提交作业人数")
+	private Integer homeworkCommitNum;
+	
+	/** 是否服务 */
+	@ApiModelProperty(value = "是否服务")
+	private boolean serviceFlag;
+
+	@ApiModelProperty(value = "出勤率")
+	private String attendanceRate;
+
+	@ApiModelProperty(value = "达标率")
+	private String standardRate;
+
+	@ApiModelProperty(value = "作业提交率")
+	private String homeworkCommitRate;
+
+	@ApiModelProperty(value = "课程时间")
+	private String classDate;
+
+	@ApiModelProperty(value = "课程状态")
+	private String courseStatus;
+
+	public String getCourseStatus() {
+		return courseStatus;
+	}
+
+	public void setCourseStatus(String courseStatus) {
+		this.courseStatus = courseStatus;
+	}
+
+	public String getClassDate() {
+		return classDate;
+	}
+
+	public void setClassDate(String classDate) {
+		this.classDate = classDate;
+	}
+
+	public String getAttendanceRate() {
+		return attendanceRate;
+	}
+
+	public void setAttendanceRate(String attendanceRate) {
+		this.attendanceRate = attendanceRate;
+	}
+
+	public String getStandardRate() {
+		return standardRate;
+	}
+
+	public void setStandardRate(String standardRate) {
+		this.standardRate = standardRate;
+	}
+
+	public String getHomeworkCommitRate() {
+		return homeworkCommitRate;
+	}
+
+	public void setHomeworkCommitRate(String homeworkCommitRate) {
+		this.homeworkCommitRate = homeworkCommitRate;
+	}
+
+	public void setCourseScheduleId(Long courseScheduleId){
+		this.courseScheduleId = courseScheduleId;
+	}
+	
+	public Long getCourseScheduleId(){
+		return this.courseScheduleId;
+	}
+			
+	public void setMusicGroupId(String musicGroupId){
+		this.musicGroupId = musicGroupId;
+	}
+	
+	public String getMusicGroupId(){
+		return this.musicGroupId;
+	}
+			
+	public void setCourseStudentTotalNum(Integer courseStudentTotalNum){
+		this.courseStudentTotalNum = courseStudentTotalNum;
+	}
+	
+	public Integer getCourseStudentTotalNum(){
+		return this.courseStudentTotalNum;
+	}
+			
+	public void setAttendanceNum(Integer attendanceNum){
+		this.attendanceNum = attendanceNum;
+	}
+	
+	public Integer getAttendanceNum(){
+		return this.attendanceNum;
+	}
+			
+	public void setLateNum(Integer lateNum){
+		this.lateNum = lateNum;
+	}
+	
+	public Integer getLateNum(){
+		return this.lateNum;
+	}
+			
+	public void setStandardNum(Integer standardNum){
+		this.standardNum = standardNum;
+	}
+	
+	public Integer getStandardNum(){
+		return this.standardNum;
+	}
+			
+	public void setHomeworkFlag(boolean homeworkFlag){
+		this.homeworkFlag = homeworkFlag;
+	}
+	
+	public boolean isHomeworkFlag(){
+		return this.homeworkFlag;
+	}
+			
+	public void setHomeworkCommitNum(Integer homeworkCommitNum){
+		this.homeworkCommitNum = homeworkCommitNum;
+	}
+	
+	public Integer getHomeworkCommitNum(){
+		return this.homeworkCommitNum;
+	}
+			
+	public void setServiceFlag(boolean serviceFlag){
+		this.serviceFlag = serviceFlag;
+	}
+	
+	public boolean isServiceFlag(){
+		return this.serviceFlag;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

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

@@ -98,7 +98,7 @@ public class StudentAttendance extends BaseEntity {
 	private int normalRemind;
 
 	@ApiModelProperty(value = "是否达标1是0否")
-	private Integer qualifiedFlag = 1;
+	private Integer qualifiedFlag = 0;
 
 	public Integer getQualifiedFlag() {
 		return qualifiedFlag;

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

@@ -144,6 +144,17 @@ public class StudentRegistration extends BaseEntity {
     
     private Long musicGroupPaymentCalenderId;
 
+    @ApiModelProperty(value = "是否成团学员",required = true)
+    private boolean originalFlag;
+
+    public boolean isOriginalFlag() {
+        return originalFlag;
+    }
+
+    public void setOriginalFlag(boolean originalFlag) {
+        this.originalFlag = originalFlag;
+    }
+
     public Date getMembershipEndTime() {
         return membershipEndTime;
     }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantInfo.java

@@ -101,6 +101,10 @@ public class TenantInfo implements Serializable {
     @ApiModelProperty(value = "更新时间")
     private Date updatedTime;
 
+    @TableField("recommender_")
+    @ApiModelProperty(value = "推荐人")
+    private Integer recommender;
+
     private static final long serialVersionUID = 1L;
 
     public Integer getId() {
@@ -271,6 +275,14 @@ public class TenantInfo implements Serializable {
         this.updatedTime = updatedTime;
     }
 
+    public Integer getRecommender() {
+        return recommender;
+    }
+
+    public void setRecommender(Integer recommender) {
+        this.recommender = recommender;
+    }
+
     @Override
     public String toString() {
         return ToStringBuilder.reflectionToString(this);

+ 96 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantProxyDividend.java

@@ -0,0 +1,96 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+
+/**
+ * 代理商分润表(TenantProxyDividend)表实体类
+ *
+ * @author hgw
+ * @since 2022-04-22 14:08:19
+ */
+@ApiModel(value = "tenant_proxy_dividend-代理商分润表")
+public class TenantProxyDividend implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @TableField("proxy_id_")
+    @ApiModelProperty(value = "代理商id")
+    private Integer proxyId;
+
+    @TableField("tenant_id_")
+    @ApiModelProperty(value = "机构id")
+    private Integer tenantId;
+
+    @TableField("total_month_")
+    @ApiModelProperty(value = "本次激活总月份")
+    private Integer totalMonth;
+
+    @TableField("active_time_")
+    @ApiModelProperty(value = "激活时间")
+    private Date activeTime;
+
+    @TableField("order_id_")
+    @ApiModelProperty(value = "激活团练宝的订单id")
+    private Integer orderId;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getProxyId() {
+        return proxyId;
+    }
+
+    public void setProxyId(Integer proxyId) {
+        this.proxyId = proxyId;
+    }
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public Integer getTotalMonth() {
+        return totalMonth;
+    }
+
+    public void setTotalMonth(Integer totalMonth) {
+        this.totalMonth = totalMonth;
+    }
+
+    public Date getActiveTime() {
+        return activeTime;
+    }
+
+    public void setActiveTime(Date activeTime) {
+        this.activeTime = activeTime;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+}
+

+ 94 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantProxyInfo.java

@@ -0,0 +1,94 @@
+package com.ym.mec.biz.dal.entity;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+
+/**
+ * 机构代理商信息表(TenantProxyInfo)表实体类
+ *
+ * @author hgw
+ * @since 2022-04-22 14:08:20
+ */
+@ApiModel(value = "tenant_proxy_info-机构代理商信息表")
+public class TenantProxyInfo implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @TableField("proxy_name_")
+    @ApiModelProperty(value = "代理商名称")
+    private String proxyName;
+
+    @TableField("proxy_user_id_")
+    @ApiModelProperty(value = "代理商负责人id")
+    private Integer proxyUserId;
+
+    @TableField("state_")
+    @ApiModelProperty(value = "状态 0正常 1冻结 2删除")
+    private Integer state;
+
+    @TableField("create_by_")
+    @ApiModelProperty(value = "创建人")
+    private Integer createBy;
+
+    @TableField("create_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getProxyName() {
+        return proxyName;
+    }
+
+    public void setProxyName(String proxyName) {
+        this.proxyName = proxyName;
+    }
+
+    public Integer getProxyUserId() {
+        return proxyUserId;
+    }
+
+    public void setProxyUserId(Integer proxyUserId) {
+        this.proxyUserId = proxyUserId;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(Integer createBy) {
+        this.createBy = createBy;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+}
+

+ 84 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantProxyRelation.java

@@ -0,0 +1,84 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+
+/**
+ * 机构与代理商人员关系表(TenantProxyRelation)表实体类
+ *
+ * @author hgw
+ * @since 2022-04-22 14:08:21
+ */
+@ApiModel(value = "tenant_proxy_relation-机构与代理商人员关系表")
+public class TenantProxyRelation implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @TableField("proxy_id_")
+    @ApiModelProperty(value = "代理商id")
+    private String proxyId;
+
+    @TableField("user_id_")
+    @ApiModelProperty(value = "人员id")
+    private Integer userId;
+
+    @TableField("tenant_id_")
+    @ApiModelProperty(value = "机构id")
+    private Integer tenantId;
+
+    @TableField("create_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getProxyId() {
+        return proxyId;
+    }
+
+    public void setProxyId(String proxyId) {
+        this.proxyId = proxyId;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+}
+

+ 94 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantProxyUserRelation.java

@@ -0,0 +1,94 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+
+/**
+ * 机构代理商人员关系表(TenantProxyUserRelation)表实体类
+ *
+ * @author hgw
+ * @since 2022-04-22 14:08:21
+ */
+@ApiModel(value = "tenant_proxy_user_relation-机构代理商人员关系表")
+public class TenantProxyUserRelation implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @TableField("proxy_id_")
+    @ApiModelProperty(value = "代理商id")
+    private Integer proxyId;
+
+    @TableField("user_id_")
+    @ApiModelProperty(value = "人员id")
+    private Integer userId;
+
+    @TableField("parent_id_")
+    @ApiModelProperty(value = "父级人员id")
+    private Integer parentId;
+
+    @TableField("rank_")
+    @ApiModelProperty(value = "等级,负责人是顶级默认0")
+    private Integer rank;
+
+    @TableField("create_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Integer parentId) {
+        this.parentId = parentId;
+    }
+
+    public Integer getRank() {
+        return rank;
+    }
+
+    public void setRank(Integer rank) {
+        this.rank = rank;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Integer getProxyId() {
+        return proxyId;
+    }
+
+    public void setProxyId(Integer proxyId) {
+        this.proxyId = proxyId;
+    }
+}
+

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

@@ -11,7 +11,9 @@ public enum ExportTypeEnum implements BaseEnum<Integer, ExportTypeEnum> {
 	STUDENT_VIP_COURSE_INFO(5, "VIP课学员课程信息导出"),
 	VIP_STUDENT_COURSE_MANAGE(6, "vip学员课程管理"),
 	STUDENT_SMALL_CLASS_STATISTICS(7, "学员小课数据统计"),
-	ORDER_LIST_SUM(8, "订单汇总");
+	ORDER_LIST_SUM(8, "订单汇总"),
+	MUSIC_GROUP_COURSE_LIST(9, "乐团课表详情导出"),
+	MUSIC_GROUP_DATA_EXPORT(10, "乐团数据导出");
 
 	private Integer code;
 

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/queryMusicGroupCourseScheduleQueryInfo.java

@@ -26,6 +26,28 @@ public class queryMusicGroupCourseScheduleQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "是否结算",required = false)
     private Integer isSettlement;
 
+    @ApiModelProperty(value = "是否服务",required = false)
+    private Boolean serviceFlag;
+
+    @ApiModelProperty(value = "是否布置作业",required = false)
+    private Boolean homeworkFlag;
+
+    public Boolean getServiceFlag() {
+        return serviceFlag;
+    }
+
+    public void setServiceFlag(Boolean serviceFlag) {
+        this.serviceFlag = serviceFlag;
+    }
+
+    public Boolean getHomeworkFlag() {
+        return homeworkFlag;
+    }
+
+    public void setHomeworkFlag(Boolean homeworkFlag) {
+        this.homeworkFlag = homeworkFlag;
+    }
+
     public Integer getIsSettlement() {
         return isSettlement;
     }

+ 89 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ProxyDividendInfoVo.java

@@ -0,0 +1,89 @@
+package com.ym.mec.biz.dal.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@ApiModel(value = "代理商人分润信息")
+public class ProxyDividendInfoVo implements Serializable {
+    @ApiModelProperty(value = "代理商id")
+    private Integer proxyId;
+
+    @ApiModelProperty(value = "代理商名称")
+    private String proxyName;
+
+    @ApiModelProperty(value = "机构id")
+    private Integer tenantId;
+
+    @ApiModelProperty(value = "机构名称")
+    private String tenantName;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "激活时间")
+    private Date activeDate;
+
+    @ApiModelProperty(value = "激活数量")
+    private Integer activeCount;
+
+    @ApiModelProperty(value = "推荐人")
+    private String recommenderName;
+
+    public Integer getProxyId() {
+        return proxyId;
+    }
+
+    public void setProxyId(Integer proxyId) {
+        this.proxyId = proxyId;
+    }
+
+    public String getProxyName() {
+        return proxyName;
+    }
+
+    public void setProxyName(String proxyName) {
+        this.proxyName = proxyName;
+    }
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getTenantName() {
+        return tenantName;
+    }
+
+    public void setTenantName(String tenantName) {
+        this.tenantName = tenantName;
+    }
+
+    public Date getActiveDate() {
+        return activeDate;
+    }
+
+    public void setActiveDate(Date activeDate) {
+        this.activeDate = activeDate;
+    }
+
+    public Integer getActiveCount() {
+        return activeCount;
+    }
+
+    public void setActiveCount(Integer activeCount) {
+        this.activeCount = activeCount;
+    }
+
+    public String getRecommenderName() {
+        return recommenderName;
+    }
+
+    public void setRecommenderName(String recommenderName) {
+        this.recommenderName = recommenderName;
+    }
+}

+ 41 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ProxyDividendVo.java

@@ -0,0 +1,41 @@
+package com.ym.mec.biz.dal.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+@ApiModel(value = "代理商人分润")
+public class ProxyDividendVo implements Serializable {
+    @ApiModelProperty(value = "意向机构")
+    private Integer tenantAgency;
+    @ApiModelProperty(value = "入驻机构")
+    private Integer preTenant;
+    @ApiModelProperty(value = "团练宝销售数")
+    private Integer memberCount;
+
+    public Integer getTenantAgency() {
+        return tenantAgency;
+    }
+
+    public void setTenantAgency(Integer tenantAgency) {
+        this.tenantAgency = tenantAgency;
+    }
+
+    public Integer getPreTenant() {
+        return preTenant;
+    }
+
+    public void setPreTenant(Integer preTenant) {
+        this.preTenant = preTenant;
+    }
+
+    public Integer getMemberCount() {
+        return memberCount;
+    }
+
+    public void setMemberCount(Integer memberCount) {
+        this.memberCount = memberCount;
+    }
+
+}

+ 98 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ProxyUserVo.java

@@ -0,0 +1,98 @@
+package com.ym.mec.biz.dal.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+@ApiModel(value = "代理商人员信息")
+public class ProxyUserVo implements Serializable {
+
+    @ApiModelProperty(value = "当前人员id")
+    private Integer userId;
+
+    @ApiModelProperty(value = "当前人员父级id")
+    private Integer parentId;
+
+    @ApiModelProperty(value = "代理商id")
+    private Integer proxyId;
+
+    @ApiModelProperty(value = "代理商名称")
+    private String proxyName;
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "职位")
+    private String role;
+
+    @ApiModelProperty(value = "状态 0正常 1冻结 ")
+    private Integer state;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Integer parentId) {
+        this.parentId = parentId;
+    }
+
+    public Integer getProxyId() {
+        return proxyId;
+    }
+
+    public void setProxyId(Integer proxyId) {
+        this.proxyId = proxyId;
+    }
+
+    public String getProxyName() {
+        return proxyName;
+    }
+
+    public void setProxyName(String proxyName) {
+        this.proxyName = proxyName;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getRole() {
+        return role;
+    }
+
+    public void setRole(String role) {
+        this.role = role;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+}

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

@@ -586,4 +586,6 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
     void cancelPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId, Integer classGroupId);
 
     List<ClassGroup> queryStudentClassGroupsAndTeacher(String musicGroupId);
+
+    CourseScheduleStatistics getMusicGroupCourseScheduleStatistics(queryMusicGroupCourseScheduleQueryInfo queryInfo);
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStatisticsService.java

@@ -0,0 +1,12 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.CourseScheduleStatistics;
+import com.ym.mec.common.service.BaseService;
+
+import java.util.List;
+
+public interface CourseScheduleStatisticsService extends BaseService<Long, CourseScheduleStatistics> {
+
+    //更新乐团课统计信息
+    void courseScheduleStatistics();
+}

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

@@ -1,17 +1,21 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.ExportDto;
+import com.ym.mec.biz.dal.dto.MusicGroupExportDto;
 import com.ym.mec.biz.dal.entity.ManagerDownload;
 import com.ym.mec.biz.dal.enums.ExportEnum;
 import com.ym.mec.biz.dal.enums.ExportTypeEnum;
 import com.ym.mec.biz.dal.page.EndCourseScheduleQueryInfo;
+import com.ym.mec.biz.dal.page.ExportUserAccountQueryInfo;
 import com.ym.mec.biz.dal.page.StudentStatisticsQueryInfo;
+import com.ym.mec.biz.dal.page.queryMusicGroupCourseScheduleQueryInfo;
 import com.ym.mec.common.entity.HttpResponseResult;
 import org.springframework.scheduling.annotation.Async;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 import java.util.Map;
 import java.util.function.BiFunction;
@@ -274,19 +278,23 @@ public interface ExportService {
     //保存下载记录
     ManagerDownload saveManagerDownload(ExportTypeEnum exportTypeEnum, Integer userId);
 
-    void orderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException;
+    void orderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException;
 
-    void orderListSum(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException;
+    void orderListSum(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException;
 
-    void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException;
+    void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException;
 
-    void superFindCourseSchedules(EndCourseScheduleQueryInfo queryInfo, ManagerDownload managerDownload) throws FileNotFoundException;
+    void superFindCourseSchedules(EndCourseScheduleQueryInfo queryInfo, ManagerDownload managerDownload) throws IOException, InvocationTargetException, NoSuchMethodException, IllegalAccessException;
 
-    void studentVipPractice(String organId, ManagerDownload managerDownload, Integer tenantId,List<String> headColumns) throws FileNotFoundException;
+    void studentVipPractice(String organId, ManagerDownload managerDownload, Integer tenantId,List<String> headColumns) throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException;
 
-    void queryStudentCourseInfo(String organId, Integer tenantId, String vip, ManagerDownload managerDownload, List<String> headColumns,ExportEnum exportEnum) throws FileNotFoundException;
+    void queryStudentCourseInfo(String organId, Integer tenantId, String vip, ManagerDownload managerDownload, List<String> headColumns,ExportEnum exportEnum) throws IOException, InvocationTargetException, NoSuchMethodException, IllegalAccessException;
 
-    void queryVipStudentCourseManage(String organId, Integer tenantId, ManagerDownload managerDownload, List<String> headColumns, ExportEnum exportEnum) throws FileNotFoundException;
+    void queryVipStudentCourseManage(String organId, Integer tenantId, ManagerDownload managerDownload, List<String> headColumns, ExportEnum exportEnum) throws IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException;
 
-    void exportStudentSmallClassStatisticsSum(StudentStatisticsQueryInfo queryInfo, ManagerDownload managerDownload) throws FileNotFoundException;
+    void exportStudentSmallClassStatisticsSum(StudentStatisticsQueryInfo queryInfo, ManagerDownload managerDownload) throws IOException, InvocationTargetException, NoSuchMethodException, IllegalAccessException;
+
+    void exportMusicGroupCourseScheduleDetail(queryMusicGroupCourseScheduleQueryInfo queryInfo, ManagerDownload managerDownload) throws IOException, InvocationTargetException, NoSuchMethodException, IllegalAccessException;
+
+    void exportMusicGroupCourseList(ManagerDownload managerDownload, ExportUserAccountQueryInfo queryInfo) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, IOException;
 }

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

@@ -5,11 +5,13 @@ import com.ym.mec.biz.dal.dto.EduHomeworkCardDto;
 import com.ym.mec.biz.dal.dto.ExtraExerciseStudentsDto;
 import com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply;
 import com.ym.mec.biz.dal.entity.StudentCourseHomework;
+import com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation;
 import com.ym.mec.biz.dal.page.ExtraExercilseQueryInfo;
 import com.ym.mec.biz.dal.page.ExtraExercilseReplyQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseHomeWorkQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 

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

@@ -71,4 +71,13 @@ public interface StudentExtracurricularExercisesSituationService extends BaseSer
      * @return
      */
     List<TeacherServeDto> queryTeacherPerformanceIndicator(TeacherServeQueryInfo queryInfo);
+
+    //批量新增
+    void batchInsert(List<StudentExtracurricularExercisesSituation> situations);
+
+    //删除指定学员服务指标
+    void deleteByMonday(String monday,List<Integer> studentIds);
+
+    //删除指定学员服务指标
+    void deleteByStudent(Integer studentId,String monday);
 }

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

@@ -9,8 +9,13 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.CloudStudyStudentDataDto;
 import com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDetailDto;
 import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
+import com.ym.mec.biz.dal.dto.IndexCloudStudyListDto;
 import com.ym.mec.biz.dal.dto.StatDto;
-import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.entity.BaseStudentDto;
+import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
+import com.ym.mec.biz.dal.entity.CooperationOrgan;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.StudentPreRegistration;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
 import com.ym.mec.biz.dal.page.CloudTeacherActiveQueryInfo;
@@ -131,6 +136,8 @@ public interface StudentService extends BaseService<Integer, Student> {
     PageInfo<EduOrganStudentDataDto> queryOrganStudentOverView(List<Integer> organIds, OrganCloudStudyStudentDataQueryInfo queryInfo);
 
     CloudStudyStudentDataDto getCloudStudyStudentOverView(List<Integer> organIds);
+    
+    List<IndexCloudStudyListDto> getCloudStudyStudentOverViewList(List<Integer> organIds);
 
     /**
      * @describe 清理学员云教练连续使用天数

+ 2 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/TenantContractTemplateService.java

@@ -24,12 +24,6 @@ public interface TenantContractTemplateService extends BaseService<Integer, Tena
 	boolean enableContract(Integer id, Integer userId);
 
 	/**
-	 * 更新协议版本
-	 * @return
-	 */
-	boolean updateContractVersion();
-	
-	/**
 	 * 查询最新协议模板
 	 * @param tenantId
 	 * @param owner
@@ -41,5 +35,6 @@ public interface TenantContractTemplateService extends BaseService<Integer, Tena
 	boolean createContractTemplate(TenantContractTemplate tenantContractTemplate);
 	
 	boolean updateContractTempalte(TenantContractTemplate tenantContractTemplate);
-	
+
+    void upgradeContractVersion(Integer tenantId);
 }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TenantInfoService.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dao.TenantInfoDao;
 import com.ym.mec.biz.dal.dto.TenantInfoDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.TenantOrderRecordEnum;
@@ -14,6 +15,8 @@ import java.util.Map;
 
 public interface TenantInfoService extends IService<TenantInfo> {
 
+    TenantInfoDao getDao();
+
     void addTenantInfo(TenantInfoDto dto);
 
     void updateTenantInfo(TenantInfoDto dto);

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

@@ -23,6 +23,11 @@ public interface TenantOrderRecordService extends IService<TenantOrderRecord> {
 
     void checkTenantOrder();
 
+    /**
+     * 激活团练宝成功
+     *
+     * @param record     机构订单记录
+     */
     void activeCloudTeacher(TenantOrderRecord record);
 
     void rechargeSuccess(TenantOrderRecord record);

+ 42 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TenantProxyDividendService.java

@@ -0,0 +1,42 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dao.TenantProxyDividendDao;
+import com.ym.mec.biz.dal.entity.TenantProxyDividend;
+import com.ym.mec.biz.dal.vo.ProxyDividendInfoVo;
+import com.ym.mec.biz.dal.vo.ProxyDividendVo;
+import com.ym.mec.common.page.PageInfo;
+
+import java.util.Map;
+
+/**
+ * 代理商分润表(TenantProxyDividend)表服务接口
+ *
+ * @author hgw
+ * @since 2022-04-22 14:08:19
+ */
+public interface TenantProxyDividendService extends IService<TenantProxyDividend> {
+
+    TenantProxyDividendDao getDao();
+
+    /**
+     * 代理商分润汇总查询
+     */
+    ProxyDividendVo queryProxyDividend();
+
+    /**
+     * 代理商分润查询
+     *
+     * @param param 传入参数
+     *
+     *              <p> -  proxyId 代理商id
+     *              <p> -  recommenderId 推荐人id
+     *              <p> -  startData 开始日期 年月日
+     *              <p> -  endData 结束日期 年月日
+     *              <p> - row 条数
+     *              <p> - page 页数
+     */
+    PageInfo<ProxyDividendInfoVo> queryProxyDividendInfo(Map<String, Object> param);
+
+}
+

+ 80 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TenantProxyInfoService.java

@@ -0,0 +1,80 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.TenantProxyInfoDao;
+import com.ym.mec.biz.dal.dto.TenantProxyDto;
+import com.ym.mec.biz.dal.entity.TenantProxyInfo;
+import com.ym.mec.biz.dal.vo.ProxyUserVo;
+import com.ym.mec.common.page.PageInfo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 机构代理商信息表(TenantProxyInfo)表服务接口
+ *
+ * @author hgw
+ * @since 2022-04-22 14:08:20
+ */
+public interface TenantProxyInfoService extends IService<TenantProxyInfo> {
+
+    TenantProxyInfoDao getDao();
+
+    /**
+     * 后台-添加代理商信息
+     */
+    void addProxyInfo(TenantProxyDto dto);
+
+    /**
+     * 添加代理商下面的员工
+     */
+    void addProxyStaff(TenantProxyDto dto);
+
+    /**
+     * 查询代理商下级人员数据
+     *
+     * @param userId 代理人id
+     */
+    List<ProxyUserVo> queryProxyUserStaff(Integer userId);
+
+    /**
+     * 分页查询代理商负责人数据
+     *
+     * @param param 传入参数
+     *              <p> - state  状态 0正常 1冻结
+     *              <p> - row 条数
+     *              <p> - page 页数
+     *              <p> - search 模糊搜索关键字
+     */
+    PageInfo<ProxyUserVo> queryProxyUser(Map<String, Object> param);
+
+    /**
+     * 冻结/解冻代理商
+     *
+     * @param userId 代理负责人id
+     * @param state  状态 0正常 1冻结
+     */
+    void freezeProxy(Integer userId, Integer state);
+
+    /**
+     * 修改人员信息
+     */
+    void updateProxyUserInfo(TenantProxyDto dto);
+
+    /**
+     * 根据手机号/姓名模糊查询所有平台账号信息
+     *
+     * @param param 传入参数
+     *              <p> - search 模糊搜索关键字
+     */
+    List<SysUser> queryUserList(Map<String, Object> param);
+
+    /**
+     * 根据token查询用户信息-代理商专用
+     *
+     * @return
+     */
+    SysUser queryUserList();
+}
+

+ 17 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TenantProxyUserRelationService.java

@@ -0,0 +1,17 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dao.TenantProxyUserRelationDao;
+import com.ym.mec.biz.dal.entity.TenantProxyUserRelation;
+
+/**
+ * 机构代理商人员关系表(TenantProxyUserRelation)表服务接口
+ *
+ * @author hgw
+ * @since 2022-04-22 14:08:21
+ */
+public interface TenantProxyUserRelationService extends IService<TenantProxyUserRelation> {
+
+    TenantProxyUserRelationDao getDao();
+}
+

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

@@ -160,7 +160,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Autowired
     private MusicGroupSchoolTermCourseDetailDao musicGroupSchoolTermCourseDetailDao;
     @Autowired
-    private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
+    private CourseScheduleStatisticsService courseScheduleStatisticsService;
 
     @Override
     public BaseDAO<Integer, ClassGroup> getDAO() {
@@ -603,7 +603,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             classGroupTeacherMapperService.classGroupTeachersInsert(classGroupTeacherMapperList);
             // 检测新排课冲突
             courseScheduleService.checkNewCourseSchedules(courseScheduleList, false, false);
-            courseScheduleDao.batchAddCourseSchedules(courseScheduleList);
+            courseScheduleService.batchAddCourseSchedule(courseScheduleList);
         } finally {
             redisCache.releaseLocked(key, value);
         }
@@ -3405,6 +3405,13 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
+    public CourseScheduleStatistics getMusicGroupCourseScheduleStatistics(queryMusicGroupCourseScheduleQueryInfo queryInfo) {
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        return classGroupDao.getMusicGroupCourseScheduleStatistics(params);
+    }
+
+    @Override
     public PageInfo<MusicGroupCourseScheduleDto> queryMusicGroupCourseScheduleDetail(queryMusicGroupCourseScheduleQueryInfo queryInfo) {
         PageInfo<MusicGroupCourseScheduleDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<>();

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

@@ -181,13 +181,13 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
         organList.put("91420106333619290A", "2,武汉长乐长风乐器销售有限公司");
         organList.put("91440300326364429H", "1,深圳大雅乐盟网络教育股份有限公司");
 
-        organList.forEach((code, name) -> {
-            SysUserTsign sysUserTsign = sysUserTsignService.queryByCardNo(code);
-            if (Objects.isNull(sysUserTsign)) {
-                String[] nameSplit = name.split(",");
-                addTsign(Integer.parseInt(nameSplit[0]), code, nameSplit[1], 1);
-            }
-        });
+//        organList.forEach((code, name) -> {
+//            SysUserTsign sysUserTsign = sysUserTsignService.queryByCardNo(code);
+//            if (Objects.isNull(sysUserTsign)) {
+//                String[] nameSplit = name.split(",");
+//                addTsign(Integer.parseInt(nameSplit[0]), code, nameSplit[1], 1);
+//            }
+//        });
     }
 
     /**

+ 49 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStatisticsServiceImpl.java

@@ -0,0 +1,49 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.CourseScheduleStatisticsDao;
+import com.ym.mec.biz.dal.entity.CourseScheduleStatistics;
+import com.ym.mec.biz.service.CourseScheduleStatisticsService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class CourseScheduleStatisticsServiceImpl extends BaseServiceImpl<Long, CourseScheduleStatistics>  implements CourseScheduleStatisticsService {
+	
+	@Autowired
+	private CourseScheduleStatisticsDao courseScheduleStatisticsDao;
+
+	@Override
+	public BaseDAO<Long, CourseScheduleStatistics> getDAO() {
+		return courseScheduleStatisticsDao;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void courseScheduleStatistics() {
+		List<Long> delCourseId = new ArrayList<>();
+		List<CourseScheduleStatistics> updateCourseScheduleStatisticsList = courseScheduleStatisticsDao.queryUpdateCourseScheduleStatistics();
+		if(CollectionUtils.isNotEmpty(updateCourseScheduleStatisticsList)){
+			courseScheduleStatisticsDao.batchUpdate(updateCourseScheduleStatisticsList);
+			delCourseId.addAll(updateCourseScheduleStatisticsList.stream().map(e -> e.getCourseScheduleId()).collect(Collectors.toList()));
+		}
+//		List<CourseScheduleStatistics> insertCourseScheduleStatisticsList = courseScheduleStatisticsDao.queryInsertCourseScheduleStatistics();
+//		if(CollectionUtils.isNotEmpty(insertCourseScheduleStatisticsList)){
+//			courseScheduleStatisticsDao.batchInsert(insertCourseScheduleStatisticsList);
+//			delCourseId.addAll(insertCourseScheduleStatisticsList.stream().map(e -> e.getCourseScheduleId()).collect(Collectors.toList()));
+//		}
+		delCourseId.removeAll(Collections.singleton(null));
+		if(CollectionUtils.isNotEmpty(delCourseId)){
+			courseScheduleStatisticsDao.delWaitByCourseId(delCourseId);
+		}
+	}
+}

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

@@ -28,6 +28,7 @@ import com.ym.mec.util.ini.IniFileUtil;
 import com.ym.mec.util.upload.UploadUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.system.ApplicationHome;
@@ -39,6 +40,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;
@@ -347,7 +349,6 @@ public class ExportServiceImpl implements ExportService {
         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));
-
     }
 
     //导出对账单
@@ -1600,7 +1601,7 @@ public class ExportServiceImpl implements ExportService {
 
 
     @Override
-    public void orderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException {
+    public void orderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
         List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentOrderService.ExportQueryPage(params);
         long i = 1;
         Map<Integer, String> cooperationOrganMap = new HashMap<>();
@@ -2022,42 +2023,12 @@ public class ExportServiceImpl implements ExportService {
             row.setOrderAmount(row.getExpectAmount().add(row.getCouponRemitFee()));
             i++;
         }
-
-        String basePath = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath();
-        File file = new File(basePath + "/" + managerDownload.getName());
-        FileOutputStream fileOutputStream = new FileOutputStream(file);
-
-        HSSFWorkbook workbook = null;
-        try {
-            Map<String, String> headMap = getExportMap(new ExportDto(ExportEnum.ORDER_LIST1, headColumns));
-            String[] header = headMap.keySet().toArray(new String[headMap.keySet().size()]);
-            String[] body = headMap.values().toArray(new String[headMap.keySet().size()]);
-            workbook = POIUtil.exportExcel(header, body, studentPaymentOrderExportDtos);
-            workbook.write(fileOutputStream);
-            fileOutputStream.getFD().sync();
-            fileOutputStream.close();
-
-            String folder = "download/" + UploadUtil.getFileFloder();
-            String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, folder, file);
-            //把记录插入下载表
-            managerDownload.setFileUrl(url);
-            managerDownload.setStatus(1);
-            managerDownloadDao.update(managerDownload);
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                fileOutputStream.close();
-                workbook.close();
-                file.delete();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
+        HSSFWorkbook workbook = getHSSFWorkbook(studentPaymentOrderExportDtos,headColumns,ExportEnum.ORDER_LIST1);
+        exportManagerDownload(workbook,managerDownload);
     }
 
     @Override
-    public void orderListSum(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException {
+    public void orderListSum(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
         List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentOrderService.ExportQueryPage(params);
         //获取机构费率
         Integer tenantId = (Integer) params.get("tenantId");
@@ -2315,41 +2286,12 @@ public class ExportServiceImpl implements ExportService {
             exportDtoList.add(exportDto);
         }
 
-        String basePath = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath();
-        File file = new File(basePath + "/" + managerDownload.getName());
-        FileOutputStream fileOutputStream = new FileOutputStream(file);
-
-        HSSFWorkbook workbook = null;
-        try {
-            Map<String, String> headMap = getExportMap(new ExportDto(ExportEnum.ORDER_LIST_SUM, headColumns));
-            String[] header = headMap.keySet().toArray(new String[headMap.keySet().size()]);
-            String[] body = headMap.values().toArray(new String[headMap.keySet().size()]);
-            workbook = POIUtil.exportExcel(header, body, exportDtoList);
-            workbook.write(fileOutputStream);
-            fileOutputStream.getFD().sync();
-            fileOutputStream.close();
-
-            String folder = "download/" + UploadUtil.getFileFloder();
-            String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, folder, file);
-            //把记录插入下载表
-            managerDownload.setFileUrl(url);
-            managerDownload.setStatus(1);
-            managerDownloadDao.update(managerDownload);
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                fileOutputStream.close();
-                workbook.close();
-                file.delete();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
+        HSSFWorkbook workbook = getHSSFWorkbook(exportDtoList,headColumns,ExportEnum.ORDER_LIST_SUM);
+        exportManagerDownload(workbook,managerDownload);
     }
 
     @Override
-    public void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException {
+    public void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
         List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentRouteOrderDao.ExportQueryPage(params);
 
         Map<Integer, String> cooperationOrganMap = new HashMap<>();
@@ -2870,82 +2812,26 @@ public class ExportServiceImpl implements ExportService {
             List<String> organIds = Arrays.asList(organIdArr);
             studentPaymentOrderExportDtos.removeIf(order -> !organIds.contains(order.getOrganId().toString()));
         }
-
-        String basePath = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath();
-        File file = new File(basePath + "/" + managerDownload.getName());
-        FileOutputStream fileOutputStream = new FileOutputStream(file);
-
-        HSSFWorkbook workbook = null;
-        try {
-            Map<String, String> headMap = getExportMap(new ExportDto(ExportEnum.ROUTE_ORDER_LIST1, headColumns));
-            String[] header = headMap.keySet().toArray(new String[headMap.keySet().size()]);
-            String[] body = headMap.values().toArray(new String[headMap.keySet().size()]);
-            workbook = POIUtil.exportExcel(header, body, studentPaymentOrderExportDtos);
-            workbook.write(fileOutputStream);
-            fileOutputStream.getFD().sync();
-            fileOutputStream.close();
-
-            String folder = "download/" + UploadUtil.getFileFloder();
-            String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, folder, file);
-            //把记录插入下载表
-            managerDownload.setFileUrl(url);
-            managerDownload.setStatus(1);
-            managerDownloadDao.update(managerDownload);
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                fileOutputStream.close();
-                workbook.close();
-                file.delete();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
+        HSSFWorkbook workbook = getHSSFWorkbook(studentPaymentOrderExportDtos,headColumns,ExportEnum.ROUTE_ORDER_LIST1);
+        exportManagerDownload(workbook,managerDownload);
     }
 
     @Override
-    public void superFindCourseSchedules(EndCourseScheduleQueryInfo queryInfo, ManagerDownload managerDownload) throws FileNotFoundException {
+    public void superFindCourseSchedules(EndCourseScheduleQueryInfo queryInfo, ManagerDownload managerDownload) throws IOException, InvocationTargetException, NoSuchMethodException, IllegalAccessException {
         List<CourseScheduleEndDto> rows = courseScheduleService.endFindCourseSchedules(queryInfo).getRows();
         for (CourseScheduleEndDto row : rows) {
             row.setIsComplaints(StringUtils.equals(row.getIsComplaints(), "1") ? "有" : "无");
         }
-        String basePath = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath();
-        File file = new File(basePath + "/" + managerDownload.getName());
-        FileOutputStream fileOutputStream = new FileOutputStream(file);
-        OutputStream ouputStream = null;
-        try {
-            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部名称", "乐团主管", "课程编号", "开始时间", "结束时间",
-                    "班级名称", "班级声部", "课程名称", "课程类型", "教学模式",
-                    "教学点", "课程状态", "指导老师", "学员编号", "是否点名", "是否有考勤申诉", "预计上课人数"}, new String[]{
-                    "organName", "educationTeacherName", "id", "startClassTime", "endClassTime", "classGroupName", "subjectName", "name",
-                    "groupType.desc", "teachMode.msg", "schoolName", "status.msg", "teacherName", "studentId", "isCallNames.msg", "isComplaints", "studentNum"}, rows);
-
-            workbook.write(fileOutputStream);
-            fileOutputStream.getFD().sync();
-            fileOutputStream.close();
-
-            String folder = "download/" + UploadUtil.getFileFloder();
-            String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, folder, file);
-            //把记录插入下载表
-            managerDownload.setFileUrl(url);
-            managerDownload.setStatus(1);
-            managerDownloadDao.update(managerDownload);
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            if (ouputStream != null) {
-                try {
-                    ouputStream.close();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
+        HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部名称", "乐团主管", "课程编号", "开始时间", "结束时间",
+                "班级名称", "班级声部", "课程名称", "课程类型", "教学模式",
+                "教学点", "课程状态", "指导老师", "学员编号", "是否点名", "是否有考勤申诉", "预计上课人数"}, new String[]{
+                "organName", "educationTeacherName", "id", "startClassTime", "endClassTime", "classGroupName", "subjectName", "name",
+                "groupType.desc", "teachMode.msg", "schoolName", "status.msg", "teacherName", "studentId", "isCallNames.msg", "isComplaints", "studentNum"}, rows);
+        exportManagerDownload(workbook,managerDownload);
     }
 
     @Override
-    public void studentVipPractice(String organId, ManagerDownload managerDownload, Integer tenantId,List<String> headColumns) throws FileNotFoundException {
+    public void studentVipPractice(String organId, ManagerDownload managerDownload, Integer tenantId,List<String> headColumns) throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
         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());
@@ -3012,131 +2898,68 @@ public class ExportServiceImpl implements ExportService {
                 }
             }
         }
-        String basePath = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath();
-        File file = new File(basePath + "/" + managerDownload.getName());
-        FileOutputStream fileOutputStream = new FileOutputStream(file);
-
-        HSSFWorkbook workbook = null;
-        try {
-            Map<String, String> headMap = getExportMap(new ExportDto(ExportEnum.STUDENT_VIP_PRACTICE, headColumns));
-            String[] header = headMap.keySet().toArray(new String[headMap.keySet().size()]);
-            String[] body = headMap.values().toArray(new String[headMap.keySet().size()]);
-            workbook = POIUtil.exportExcel(header, body, studentVipPracticeExportDtos);
-            workbook.write(fileOutputStream);
-            fileOutputStream.getFD().sync();
-            fileOutputStream.close();
-
-            String folder = "download/" + UploadUtil.getFileFloder();
-            String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, folder, file);
-            //把记录插入下载表
-            managerDownload.setFileUrl(url);
-            managerDownload.setStatus(1);
-            managerDownloadDao.update(managerDownload);
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                fileOutputStream.close();
-                workbook.close();
-                file.delete();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
+        HSSFWorkbook workbook = getHSSFWorkbook(studentVipPracticeExportDtos,headColumns,ExportEnum.STUDENT_VIP_PRACTICE);
+        exportManagerDownload(workbook,managerDownload);
     }
 
     @Override
-    public void queryStudentCourseInfo(String organId, Integer tenantId, String groupType, ManagerDownload managerDownload, List<String> headColumns,ExportEnum exportEnum) throws FileNotFoundException {
-        List<ExportStudentCourseInfoDto> studentCourseInfoDtos = courseScheduleStudentPaymentDao.queryStudentCourseInfo(organId,tenantId,groupType);
-        String basePath = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath();
-        File file = new File(basePath + "/" + managerDownload.getName());
-        FileOutputStream fileOutputStream = new FileOutputStream(file);
-
-        HSSFWorkbook workbook = null;
-        try {
-            Map<String, String> headMap = getExportMap(new ExportDto(exportEnum, headColumns));
-            String[] header = headMap.keySet().toArray(new String[headMap.keySet().size()]);
-            String[] body = headMap.values().toArray(new String[headMap.keySet().size()]);
-            workbook = POIUtil.exportExcel(header, body, studentCourseInfoDtos);
-            workbook.write(fileOutputStream);
-            fileOutputStream.getFD().sync();
-            fileOutputStream.close();
+    public void queryStudentCourseInfo(String organId, Integer tenantId, String groupType, ManagerDownload managerDownload, List<String> headColumns,ExportEnum exportEnum) throws IOException, InvocationTargetException, NoSuchMethodException, IllegalAccessException {
+        List<ExportStudentCourseInfoDto> rows = courseScheduleStudentPaymentDao.queryStudentCourseInfo(organId,tenantId,groupType);
+        HSSFWorkbook workbook = getHSSFWorkbook(rows,headColumns,exportEnum);
+        exportManagerDownload(workbook,managerDownload);
+    }
 
-            String folder = "download/" + UploadUtil.getFileFloder();
-            String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, folder, file);
-            //把记录插入下载表
-            managerDownload.setFileUrl(url);
-            managerDownload.setStatus(1);
-            managerDownloadDao.update(managerDownload);
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                fileOutputStream.close();
-                workbook.close();
-                file.delete();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
+    @Override
+    public void queryVipStudentCourseManage(String organId, Integer tenantId, ManagerDownload managerDownload, List<String> headColumns, ExportEnum exportEnum) throws IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
+        List<ExportVipStudentCourseManageDto> rows = courseScheduleStudentPaymentDao.queryVipStudentCourseManage(organId,tenantId);
+        HSSFWorkbook workbook = getHSSFWorkbook(rows,headColumns,exportEnum);
+        exportManagerDownload(workbook,managerDownload);
     }
 
     @Override
-    public void queryVipStudentCourseManage(String organId, Integer tenantId, ManagerDownload managerDownload, List<String> headColumns, ExportEnum exportEnum) throws FileNotFoundException {
-        List<ExportVipStudentCourseManageDto> studentCourseInfoDtos = courseScheduleStudentPaymentDao.queryVipStudentCourseManage(organId,tenantId);
-        String basePath = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath();
-        File file = new File(basePath + "/" + managerDownload.getName());
-        FileOutputStream fileOutputStream = new FileOutputStream(file);
+    public void exportStudentSmallClassStatisticsSum(StudentStatisticsQueryInfo queryInfo, ManagerDownload managerDownload) throws IOException, InvocationTargetException, NoSuchMethodException, IllegalAccessException {
+        List<StudentStatisticsDto> rows = studentStatisticsService.queryStatisticsPage(queryInfo).getRows();
+        HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "学生姓名", "学员编号","联系电话", "声部", "学校", "年级", "学员状态", "未排课时", "总课时", "已完成课时",
+                        "剩余课时","预收金额","第一次课时间","最近上课时间","指导老师编号","指导老师","乐团主管编号","乐团主管","声部课老师编号","声部课老师","近30天课耗","回访次数",
+                        "回访状态","原因","回访日期"},
+                new String[]{"studentBasicInfo.organName", "studentBasicInfo.userName", "studentBasicInfo.userId",
+                        "studentBasicInfo.phone","studentBasicInfo.subjectName", "studentBasicInfo.cooperationOrganName", "studentBasicInfo.grade",
+                        "studentBasicInfo.studentStatus",
+                        "noScheduleNum","totalCourseNum", "overCourseNum", "subCourseNum","preCourseFee","firstCourseTime","lastCourseTime","teacherId","teacherName","musicDirectorId","musicDirectorName",
+                        "studentBasicInfo.subjectTeacherId","studentBasicInfo.subjectTeacherName","latelyCourseConsumer","visitNum",
+                        "lastVisitStatus == null?'':lastVisitStatus == 'LOST' ? '流失':lastVisitStatus == 'THINKING' ? '考虑中':" +
+                                "lastVisitStatus == 'PENDING_PAYMENT' ? '确认缴费待缴费':lastVisitStatus == 'PAUSE' ? '暂停':lastVisitStatus == 'OTHER' ? '其他':''"
+                        ,"visitReason","lastVisitTime"}, rows);
+        exportManagerDownload(workbook,managerDownload);
+    }
 
-        HSSFWorkbook workbook = null;
-        try {
-            Map<String, String> headMap = getExportMap(new ExportDto(exportEnum, headColumns));
-            String[] header = headMap.keySet().toArray(new String[headMap.keySet().size()]);
-            String[] body = headMap.values().toArray(new String[headMap.keySet().size()]);
-            workbook = POIUtil.exportExcel(header, body, studentCourseInfoDtos);
-            workbook.write(fileOutputStream);
-            fileOutputStream.getFD().sync();
-            fileOutputStream.close();
+    @Override
+    public void exportMusicGroupCourseScheduleDetail(queryMusicGroupCourseScheduleQueryInfo queryInfo, ManagerDownload managerDownload) throws IOException, InvocationTargetException, NoSuchMethodException, IllegalAccessException {
+        List<MusicGroupCourseScheduleDto> rows = classGroupService.queryMusicGroupCourseScheduleDetail(queryInfo).getRows();
+        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);
+    }
 
-            String folder = "download/" + UploadUtil.getFileFloder();
-            String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, folder, file);
-            //把记录插入下载表
-            managerDownload.setFileUrl(url);
-            managerDownload.setStatus(1);
-            managerDownloadDao.update(managerDownload);
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                fileOutputStream.close();
-                workbook.close();
-                file.delete();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
+    public HSSFWorkbook getHSSFWorkbook(List rows, List<String> headColumns, ExportEnum exportEnum) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, IOException {
+        Map<String, String> headMap = getExportMap(new ExportDto(exportEnum, headColumns));
+        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);
     }
 
-    @Override
-    public void exportStudentSmallClassStatisticsSum(StudentStatisticsQueryInfo queryInfo, ManagerDownload managerDownload) throws FileNotFoundException {
-        List<StudentStatisticsDto> rows = studentStatisticsService.queryStatisticsPage(queryInfo).getRows();
+    public void exportManagerDownload(HSSFWorkbook workbook, ManagerDownload managerDownload) throws FileNotFoundException {
         String basePath = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath();
         File file = new File(basePath + "/" + managerDownload.getName());
         FileOutputStream fileOutputStream = new FileOutputStream(file);
         OutputStream ouputStream = null;
         try {
-            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "学生姓名", "学员编号","联系电话", "声部", "学校", "年级", "学员状态", "未排课时", "总课时", "已完成课时",
-                    "剩余课时","预收金额","第一次课时间","最近上课时间","指导老师编号","指导老师","乐团主管编号","乐团主管","声部课老师编号","声部课老师","近30天课耗","回访次数",
-                    "回访状态","原因","回访日期"},
-            new String[]{"studentBasicInfo.organName", "studentBasicInfo.userName", "studentBasicInfo.userId",
-                    "studentBasicInfo.phone","studentBasicInfo.subjectName", "studentBasicInfo.cooperationOrganName", "studentBasicInfo.grade",
-                    "studentBasicInfo.studentStatus",
-                    "noScheduleNum","totalCourseNum", "overCourseNum", "subCourseNum","preCourseFee","firstCourseTime","lastCourseTime","teacherId","teacherName","musicDirectorId","musicDirectorName",
-                    "studentBasicInfo.subjectTeacherId","studentBasicInfo.subjectTeacherName","latelyCourseConsumer","visitNum",
-                    "lastVisitStatus == null?'':lastVisitStatus == 'LOST' ? '流失':lastVisitStatus == 'THINKING' ? '考虑中':" +
-                    "lastVisitStatus == 'PENDING_PAYMENT' ? '确认缴费待缴费':lastVisitStatus == 'PAUSE' ? '暂停':lastVisitStatus == 'OTHER' ? '其他':''"
-                    ,"visitReason","lastVisitTime"}, rows);
-
             workbook.write(fileOutputStream);
             fileOutputStream.getFD().sync();
             fileOutputStream.close();
@@ -3159,4 +2982,15 @@ public class ExportServiceImpl implements ExportService {
             }
         }
     }
+
+    @Override
+    public void exportMusicGroupCourseList(ManagerDownload managerDownload, ExportUserAccountQueryInfo queryInfo) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, IOException {
+        List<MusicGroupExportDto> rows = musicGroupDao.exportMusicGroupCourseList(queryInfo);
+        HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "乐团编号", "乐团名称", "乐团主管","出勤率", "达标率", "作业提交率", "成团人数", "新增人数",
+                        "退团人数", "在读人数","流失率"},
+                new String[]{"organName", "musicGroupId", "musicGroupName",
+                        "eduName","attendanceRate", "standardRate", "homeworkCommitRate",
+                        "groupMemberNum","addStuNum","quitStuNum","normalNum","lostRate"}, rows);
+        exportManagerDownload(workbook,managerDownload);
+    }
 }

+ 5 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java

@@ -9,10 +9,7 @@ import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.ExtraExercilseQueryInfo;
 import com.ym.mec.biz.dal.page.ExtraExercilseReplyQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseHomeWorkQueryInfo;
-import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
-import com.ym.mec.biz.service.StudentServeService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -21,7 +18,6 @@ import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
-
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -43,10 +39,10 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 	@Autowired
 	private ExtracurricularExercisesDao extracurricularExercisesDao;
 	@Autowired
-	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
-	@Autowired
 	private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
 	@Autowired
+	private StudentExtracurricularExercisesSituationService studentExtracurricularExercisesSituationService;
+	@Autowired
 	private SysMessageService sysMessageService;
 	@Autowired
 	private TeacherDao teacherDao;
@@ -316,7 +312,7 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 			results.add(studentExtracurricularExercisesSituation);
 		}
 
-		studentExtracurricularExercisesSituationDao.deleteByMonday(monDayDate.toString(),null);
+		studentExtracurricularExercisesSituationService.deleteByMonday(monDayDate.toString(),null);
 
 		BigDecimal currentPage=BigDecimal.ONE,
                 pageSize=new BigDecimal(10000),
@@ -324,7 +320,7 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
                 totalPage=total.divide(pageSize, BigDecimal.ROUND_UP);
         while (currentPage.compareTo(totalPage)<=0){
             List<StudentExtracurricularExercisesSituation> rows=results.stream().skip(pageSize.multiply(currentPage.subtract(BigDecimal.ONE)).longValue()).limit(pageSize.longValue()).collect(Collectors.toList());
-            studentExtracurricularExercisesSituationDao.batchInsert(rows);
+			studentExtracurricularExercisesSituationService.batchInsert(rows);
             currentPage=currentPage.add(BigDecimal.ONE);
         }
 	}

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

@@ -1782,6 +1782,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroup.setStatus(MusicGroupStatusEnum.PROGRESS);
         //获取所有已缴费学员人数
         List<StudentRegistration> studentRegistrations = studentRegistrationDao.queryStudentByMusicGroupId(musicGroupId);
+        studentRegistrationDao.updateOriginalFlag(musicGroupId);
         musicGroup.setGroupMemberNum(studentRegistrations == null ? 0 : studentRegistrations.size());
         musicGroup.setBillStartDate(new Date());
         musicGroupDao.update(musicGroup);

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

@@ -2,13 +2,13 @@ package com.ym.mec.biz.service.impl;
 
 import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.EDUCATION;
 
-import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.service.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
@@ -25,16 +25,11 @@ import com.ym.mec.biz.dal.dao.TenantInfoDao;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.Teacher;
-import com.ym.mec.biz.dal.entity.TenantContractTemplate;
 import com.ym.mec.biz.dal.entity.TenantInfo;
 import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.SixPlusGradeEnum;
 import com.ym.mec.biz.dal.page.EducationBaseQueryInfo;
-import com.ym.mec.biz.service.ContractService;
-import com.ym.mec.biz.service.OrganizationService;
-import com.ym.mec.biz.service.SysEmployeePositionService;
-import com.ym.mec.biz.service.TenantInfoService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
@@ -62,7 +57,7 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 	private TenantInfoDao tenantInfoDao;
 	
 	@Autowired
-	private TenantContractTemplateDao tenantContractTemplateDao;
+	private TenantContractTemplateService tenantContractTemplateService;
 
 	@Override
 	public BaseDAO<Integer, Organization> getDAO() {
@@ -212,19 +207,7 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
         	
         	Integer tenantId = organization.getTenantId();
             //升级机构协议版本号
-            TenantContractTemplate tenantContractTemplate = tenantContractTemplateDao.queryLatestContractTemplate(null, null, tenantId);
-            if (tenantContractTemplate != null) {
-            	tenantInfoDao.getLocked(tenantId);
-
-                Integer maxVersion = tenantContractTemplateDao.queryMaxVersion();
-                int version = maxVersion == null ? 1 : maxVersion + 1;
-
-                tenantContractTemplate.setVersion(version);
-                Date date = new Date();
-                tenantContractTemplate.setUpdateTime(date);
-
-                tenantContractTemplateDao.update(tenantContractTemplate);
-            }
+            tenantContractTemplateService.upgradeContractVersion(tenantId);
             
 			if (StringUtils.isNotBlank(organization.getCorporateName()) && StringUtils.isNotBlank(organization.getCorporateCode())) {
 				// 添加签章信息

+ 43 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java

@@ -70,6 +70,8 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
+	@Autowired
+	private CourseScheduleStatisticsDao courseScheduleStatisticsDao;
 
 	@Override
 	public BaseDAO<Long, StudentExtracurricularExercisesSituation> getDAO() {
@@ -585,4 +587,45 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 		}
 		return dataList;
 	}
+
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void batchInsert(List<StudentExtracurricularExercisesSituation> situations) {
+		if (CollectionUtils.isEmpty(situations)){
+			return;
+		}
+		studentExtracurricularExercisesSituationDao.batchInsert(situations);
+		String collect = situations.stream().map(e -> e.getCourseIds()).filter(e -> StringUtils.isNotEmpty(e)).collect(Collectors.joining(","));
+		if(StringUtils.isNotEmpty(collect)){
+			//更新课程服务指标
+			courseScheduleStatisticsDao.updateCourseService(collect,1);
+		}
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void deleteByMonday(String monday,List<Integer> studentIds) {
+		this.delSituations(studentExtracurricularExercisesSituationDao.selectByMonday(monday, studentIds));
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void deleteByStudent(Integer studentId, String monday) {
+		this.delSituations(studentExtracurricularExercisesSituationDao.selectByStudent(studentId, monday));
+	}
+
+	@Transactional(rollbackFor = Exception.class)
+	public void delSituations(List<StudentExtracurricularExercisesSituation> situations){
+		if (CollectionUtils.isEmpty(situations)){
+			return;
+		}
+		List<Long> collect1 = situations.stream().map(e -> e.getId()).collect(Collectors.toList());
+		studentExtracurricularExercisesSituationDao.batchDelete(collect1);
+		String collect = situations.stream().map(e -> e.getCourseIds()).filter(e -> StringUtils.isNotEmpty(e)).collect(Collectors.joining(","));
+		if(StringUtils.isNotEmpty(collect)){
+			//更新课程服务指标
+			courseScheduleStatisticsDao.updateCourseService(collect,0);
+		}
+	}
 }

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

@@ -70,7 +70,7 @@ public class StudentManageServiceImpl implements StudentManageService {
     @Autowired
     private StudentDao studentDao;
     @Autowired
-    private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
+    private StudentExtracurricularExercisesSituationService studentExtracurricularExercisesSituationService;
     @Autowired
     private MusicGroupQuitDao musicGroupQuitDao;
     @Autowired
@@ -752,7 +752,7 @@ public class StudentManageServiceImpl implements StudentManageService {
         if (new Integer(2).equals(student.getServiceTag())) {
             LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
             LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
-            studentExtracurricularExercisesSituationDao.deleteByStudent(student.getId(), monDayDate.toString());
+            studentExtracurricularExercisesSituationService.deleteByStudent(student.getId(), monDayDate.toString());
         }
         webFeignService.updateNickName(userId,student.getUsername());
         imFeignService.update(new ImUserModel(userId.toString(),student.getUsername(),sysUser1 == null ? null:sysUser1.getAvatar()));

+ 8 - 13
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java

@@ -20,6 +20,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.service.StudentExtracurricularExercisesSituationService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -85,6 +86,8 @@ public class StudentServeServiceImpl implements StudentServeService {
     @Autowired
     private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
     @Autowired
+    private StudentExtracurricularExercisesSituationService studentExtracurricularExercisesSituationService;
+    @Autowired
     private StudentServeService studentServeService;
     @Autowired
     private SysTenantConfigService sysTenantConfigService;
@@ -322,7 +325,7 @@ public class StudentServeServiceImpl implements StudentServeService {
             currentPage=currentPage.add(BigDecimal.ONE);
         }
 
-        studentExtracurricularExercisesSituationDao.deleteByMonday(monDayDate.toString(), null);
+        studentExtracurricularExercisesSituationService.deleteByMonday(monDayDate.toString(), null);
 
         BigDecimal currentPage1=BigDecimal.ONE,
                 pageSize1=new BigDecimal(10000),
@@ -331,7 +334,7 @@ public class StudentServeServiceImpl implements StudentServeService {
 
         while (currentPage1.compareTo(totalPage1)<=0){
             List<StudentExtracurricularExercisesSituation> rows=results.stream().skip(pageSize1.multiply(currentPage1.subtract(BigDecimal.ONE)).longValue()).limit(pageSize1.longValue()).collect(Collectors.toList());
-            studentExtracurricularExercisesSituationDao.batchInsert(rows);
+            studentExtracurricularExercisesSituationService.batchInsert(rows);
             currentPage1=currentPage1.add(BigDecimal.ONE);
         }
     }
@@ -389,7 +392,7 @@ public class StudentServeServiceImpl implements StudentServeService {
 
         //节假日不产生服务指标
         if(weekInHoliday){
-            studentExtracurricularExercisesSituationDao.deleteByMonday(monDayDate.toString(), studentIds);
+            studentExtracurricularExercisesSituationService.deleteByMonday(monDayDate.toString(), studentIds);
             return;
         }
         
@@ -660,7 +663,7 @@ public class StudentServeServiceImpl implements StudentServeService {
                 }
             }
 
-            studentExtracurricularExercisesSituationDao.deleteByMonday(monDayDate.toString(), null);
+            studentExtracurricularExercisesSituationService.deleteByMonday(monDayDate.toString(), null);
 
             BigDecimal currentPage1=BigDecimal.ONE,
                     pageSize1=new BigDecimal(10000),
@@ -670,7 +673,7 @@ public class StudentServeServiceImpl implements StudentServeService {
             while (currentPage1.compareTo(totalPage1)<=0){
                 List<StudentExtracurricularExercisesSituation> rows=results.stream().skip(pageSize1.multiply(currentPage1.subtract(BigDecimal.ONE)).longValue()).limit(pageSize1.longValue()).collect(Collectors.toList());
 
-                studentExtracurricularExercisesSituationDao.batchInsert(rows);
+                studentExtracurricularExercisesSituationService.batchInsert(rows);
 
                 currentPage1=currentPage1.add(BigDecimal.ONE);
             }
@@ -1090,12 +1093,4 @@ public class StudentServeServiceImpl implements StudentServeService {
         }
         return result;
     }
-    
-
-    
-	private Date LocalDateToUdate(LocalDate localDate) {
-		ZoneId zone = ZoneId.systemDefault();
-		Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
-		return Date.from(instant);
-	}
 }

+ 73 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -6,6 +6,7 @@ import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Calendar;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Date;
@@ -20,20 +21,14 @@ import java.util.stream.Collectors;
 
 import javax.annotation.PostConstruct;
 
-import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.common.entity.ImResult;
-import com.ym.mec.common.entity.ImUserModel;
-import com.ym.mec.im.ImFeignService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import com.alibaba.fastjson.JSONArray;
-import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.CloudTeacherDao;
 import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
@@ -56,10 +51,22 @@ import com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDto;
 import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
 import com.ym.mec.biz.dal.dto.EduOrganStudentListDto;
 import com.ym.mec.biz.dal.dto.EduOrganStudentListExportDto;
+import com.ym.mec.biz.dal.dto.IndexCloudStudyListDto;
+import com.ym.mec.biz.dal.dto.Mapper;
 import com.ym.mec.biz.dal.dto.StatDto;
 import com.ym.mec.biz.dal.dto.StudentClassInfoDto;
 import com.ym.mec.biz.dal.dto.StudentCourseTimesDto;
 import com.ym.mec.biz.dal.dto.StudentTeacherCourseDto;
+import com.ym.mec.biz.dal.entity.BaseStudentDto;
+import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
+import com.ym.mec.biz.dal.entity.CooperationOrgan;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
+import com.ym.mec.biz.dal.entity.MemberRankSetting;
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.StudentPreRegistration;
+import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
@@ -75,11 +82,13 @@ import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.biz.service.SysTenantConfigService;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
-import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.entity.ImResult;
+import com.ym.mec.common.entity.ImUserModel;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
+import com.ym.mec.im.ImFeignService;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
@@ -1026,13 +1035,29 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     @Override
     public CloudStudyStudentDataDto getCloudStudyStudentOverView(List<Integer> organIds) {
         CloudStudyStudentDataDto result = new CloudStudyStudentDataDto();
-//        result.setTotalStudentNum(studentDao.getOrgansTotalStudentNum(organIds));
+        
+        IndexCloudStudyListDto dto = studentDao.getOrgansCloudTeacherStudent(organIds);
+        result.setTotalStudentNum(dto.getTotalStudentNum());
+        result.setEffectiveVipStudentNum(dto.getEffectiveVipStudentNum());
+        result.setWaitActivateVipStudentNum(dto.getWaitActivateVipStudentNum());
         result.setVipStudentNum(cloudTeacherDao.getOrgansTotalVipStudentNum(organIds));
 //        result.seteVipStudentNum(studentDao.getOrgansTotalEVipStudentNum(organIds));
         result.setCloudStudyUseStudentNum(studentDao.getOrgansTotalCloudStudyStudentNum(organIds));
-        result.setCloudStudyTodayUseStudentNum(studentDao.getOrgansTodayTotalCloudStudyStudentNum(organIds));
-        result.setCloudStudyLivelyStudentNum(studentDao.getOrganTotalCloudStudyLivelyStudentNum(organIds));
-        result.setNewCloudStudyStudentNum(sysMusicCompareRecordDao.getOrgansTotalNewCloudStudyNum(organIds));
+        //result.setCloudStudyTodayUseStudentNum(studentDao.getOrgansTodayTotalCloudStudyStudentNum(organIds));
+        
+        Calendar cal = Calendar.getInstance();    
+        cal.setTime(new Date());    
+        //cal.add(Calendar.WEEK_OF_YEAR, -1);// 一周    
+        cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
+        Date endTime = cal.getTime();
+        
+        cal.setTime(new Date());    
+        cal.add(Calendar.WEEK_OF_YEAR, -4);// 一周    
+        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
+        Date startTime = cal.getTime();
+        
+        result.setCloudStudyLivelyStudentNum(studentDao.getOrganTotalCloudStudyLivelyStudentNum(organIds, startTime, endTime));
+        //result.setNewCloudStudyStudentNum(sysMusicCompareRecordDao.getOrgansTotalNewCloudStudyNum(organIds));
 //        if(result.getVipStudentNum()>0&&result.getTotalStudentNum()>0){
 //            result.setVipStudentDuty(new BigDecimal(result.getVipStudentNum()).divide(new BigDecimal(result.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
 //        }
@@ -1040,6 +1065,43 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     }
 
     @Override
+	public List<IndexCloudStudyListDto> getCloudStudyStudentOverViewList(List<Integer> organIds) {
+    	
+    	List<IndexCloudStudyListDto> list = studentDao.getCloudStudyStudentOverViewList(organIds);
+    	
+    	Calendar cal = Calendar.getInstance();    
+        cal.setTime(new Date());    
+        //cal.add(Calendar.WEEK_OF_YEAR, -1);// 一周    
+        cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
+        Date endTime = cal.getTime();
+        
+        cal.setTime(new Date());    
+        cal.add(Calendar.WEEK_OF_YEAR, -4);// 一周    
+        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
+        Date startTime = cal.getTime();
+        
+        List<Mapper> mapperList = studentDao.getOrganActiveCloudStudyStudentNum(organIds, startTime, endTime);
+        
+        Map<Integer, Integer> organActiveNum = new HashMap<Integer, Integer>();
+        for(Mapper mapper : mapperList){
+        	organActiveNum.put(Integer.parseInt(mapper.getKey().toString()), Integer.parseInt(mapper.getValue().toString()));
+        }
+        
+        List<Mapper> organCloudTeacherStudentNum = studentDao.getOrganCloudTeacherStudentNum(organIds);
+        Map<Integer, Integer> organCloudTeacherStudentNumMap = new HashMap<Integer, Integer>();
+        for(Mapper mapper : organCloudTeacherStudentNum){
+        	organCloudTeacherStudentNumMap.put(Integer.parseInt(mapper.getKey().toString()), Integer.parseInt(mapper.getValue().toString()));
+        }
+        
+        for(IndexCloudStudyListDto ics : list){
+        	ics.setActiveStudentNum(organActiveNum.get(ics.getOrganId()));
+        	ics.setVipStudentNum(organCloudTeacherStudentNumMap.get(ics.getOrganId()));
+        }
+        
+		return list;
+	}
+
+	@Override
     public void cleanStudentCloudStudySequenceDays() {
         studentDao.cleanStudentCloudStudySequenceDays();
     }

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

@@ -92,12 +92,12 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		String courseDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.ISO_EXPANDED_DATE_FORMAT);
 		if(noQualified.size() > 0){
 			List<Integer> studentIds = noQualified.stream().map(e -> e.getUserId()).collect(Collectors.toList());
-			studentAttendanceDao.updateQualified(courseScheduleId,studentIds);
 			this.sendMessage(studentIds,type,courseDate,MessageTypeEnum.SMS_STANDARD_NO_QUALIFIED);
 		}
 		List<StudentStandardDto> qualified = studentStandardDtos.stream().filter(e -> e.getQualifiedFlag() == 1).collect(Collectors.toList());
 		if(qualified.size() > 0){
 			List<Integer> studentIds = qualified.stream().map(e -> e.getUserId()).collect(Collectors.toList());
+			studentAttendanceDao.updateQualified(courseScheduleId,studentIds);
 			this.sendMessage(studentIds,type,courseDate,MessageTypeEnum.SMS_STANDARD_QUALIFIED);
 		}
 		//标记当前课程为已评价

+ 108 - 127
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantContractTemplateServiceImpl.java

@@ -1,142 +1,123 @@
 package com.ym.mec.biz.service.impl;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import com.ym.mec.biz.dal.dao.TenantContractTemplateDao;
-import com.ym.mec.biz.dal.dao.TenantInfoDao;
 import com.ym.mec.biz.dal.dto.TenantContractTemplateDto;
 import com.ym.mec.biz.dal.entity.TenantContractTemplate;
 import com.ym.mec.biz.service.TenantContractTemplateService;
+import com.ym.mec.biz.service.TenantInfoService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
 
 @Service
-public class TenantContractTemplateServiceImpl extends BaseServiceImpl<Integer, TenantContractTemplate>  implements TenantContractTemplateService {
-	
-	@Autowired
-	private TenantContractTemplateDao tenantContractTemplateDao;
-	
-	@Autowired
-	private TenantInfoDao tenantInfoDao;
-
-	@Override
-	public BaseDAO<Integer, TenantContractTemplate> getDAO() {
-		return tenantContractTemplateDao;
-	}
-
-	@Override
-	public PageInfo<TenantContractTemplateDto> queryPageList(QueryInfo queryInfo) {
-		PageInfo<TenantContractTemplateDto> pageInfo = new PageInfo<TenantContractTemplateDto>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<String, Object>();
-		MapUtil.populateMap(params, queryInfo);
-		
-		List<TenantContractTemplateDto> dataList = null;
-		int count = this.findCount(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			dataList = tenantContractTemplateDao.queryPageList(params);
-		}
-		if (count == 0) {
-			dataList = new ArrayList<TenantContractTemplateDto>();
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
-	}
-
-	@Override
-	@Transactional
-	public boolean enableContract(Integer id, Integer userId) {
-		TenantContractTemplate tenantContractTemplate = tenantContractTemplateDao.get(id);
-		
-		if(tenantContractTemplate == null){
-			throw new BizException("未查询到协议模板");
-		}
-		
-		if(tenantContractTemplate.getStatus()){
-			return true;
-		}
-		
-		tenantInfoDao.getLocked(tenantContractTemplate.getTenantId());
-		
-		Integer maxVersion = tenantContractTemplateDao.queryMaxVersion();
-		int version = maxVersion == null ? 1 : maxVersion + 1;
-		
-		tenantContractTemplate.setVersion(version);
-		
-		tenantContractTemplateDao.disableContract(tenantContractTemplate.getOwner(), tenantContractTemplate.getType(), tenantContractTemplate.getTenantId());
-		
-		Date date = new Date();
-		
-		tenantContractTemplate.setStatus(true);
-		tenantContractTemplate.setUpdateTime(date);
-		tenantContractTemplate.setModifyBy(userId);
-		
-		tenantContractTemplateDao.update(tenantContractTemplate);
-		
-		return true;
-	}
-
-	@Override
-	public boolean updateContractVersion() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public TenantContractTemplate queryLatestContractTemplate(Integer tenantId, String owner, String type) {
-		TenantContractTemplate tenantContractTemplate = tenantContractTemplateDao.queryLatestContractTemplate(owner, type, tenantId);
-		
-		return tenantContractTemplate;
-	}
-
-	@Override
-	@Transactional
-	public boolean createContractTemplate(TenantContractTemplate tenantContractTemplate) {
-		
-		Integer tenantId = tenantContractTemplate.getTenantId();
-		tenantInfoDao.getLocked(tenantId);
-		
-		Integer maxVersion = tenantContractTemplateDao.queryMaxVersion();
-		int version = maxVersion == null ? 1 : maxVersion + 1;
-		
-		tenantContractTemplate.setVersion(version);
-		Date date = new Date();
-		tenantContractTemplate.setCreateTime(date);
-		tenantContractTemplate.setUpdateTime(date);
-		insert(tenantContractTemplate);
-		
-		return true;
-	}
-
-	@Override
-	@Transactional
-	public boolean updateContractTempalte(TenantContractTemplate tenantContractTemplate) {
-		
-		Integer tenantId = tenantContractTemplate.getTenantId();
-		tenantInfoDao.getLocked(tenantId);
-		
-		Integer maxVersion = tenantContractTemplateDao.queryMaxVersion();
-		int version = maxVersion == null ? 1 : maxVersion + 1;
-		
-		tenantContractTemplate.setVersion(version);
-		Date date = new Date();
-		tenantContractTemplate.setUpdateTime(date);
-		
-		update(tenantContractTemplate);
-		return true;
-	}
-	
+public class TenantContractTemplateServiceImpl extends BaseServiceImpl<Integer, TenantContractTemplate> implements TenantContractTemplateService {
+
+    @Autowired
+    private TenantContractTemplateDao tenantContractTemplateDao;
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @Override
+    public BaseDAO<Integer, TenantContractTemplate> getDAO() {
+        return tenantContractTemplateDao;
+    }
+
+    @Override
+    public PageInfo<TenantContractTemplateDto> queryPageList(QueryInfo queryInfo) {
+        PageInfo<TenantContractTemplateDto> pageInfo = new PageInfo<TenantContractTemplateDto>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<TenantContractTemplateDto> dataList = null;
+        int count = this.findCount(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = tenantContractTemplateDao.queryPageList(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<TenantContractTemplateDto>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    @Transactional
+    public boolean enableContract(Integer id, Integer userId) {
+        TenantContractTemplate tenantContractTemplate = tenantContractTemplateDao.get(id);
+
+        if (tenantContractTemplate == null) {
+            throw new BizException("未查询到协议模板");
+        }
+
+        if (tenantContractTemplate.getStatus()) {
+            return true;
+        }
+
+        updateVersion(tenantContractTemplate);
+
+        tenantContractTemplateDao.disableContract(tenantContractTemplate.getOwner(), tenantContractTemplate.getType(), tenantContractTemplate.getTenantId());
+
+        tenantContractTemplate.setStatus(true);
+        tenantContractTemplate.setUpdateTime(new Date());
+        tenantContractTemplate.setModifyBy(userId);
+
+        tenantContractTemplateDao.update(tenantContractTemplate);
+
+        return true;
+    }
+
+    @Override
+    public TenantContractTemplate queryLatestContractTemplate(Integer tenantId, String owner, String type) {
+        return tenantContractTemplateDao.queryLatestContractTemplate(owner, type, tenantId);
+    }
+
+    @Override
+    @Transactional
+    public boolean createContractTemplate(TenantContractTemplate tenantContractTemplate) {
+        updateVersion(tenantContractTemplate);
+        Date date = new Date();
+        tenantContractTemplate.setCreateTime(date);
+        tenantContractTemplate.setUpdateTime(date);
+        insert(tenantContractTemplate);
+        return true;
+    }
+
+    @Override
+    @Transactional
+    public boolean updateContractTempalte(TenantContractTemplate tenantContractTemplate) {
+        updateVersion(tenantContractTemplate);
+        tenantContractTemplate.setUpdateTime(new Date());
+        this.update(tenantContractTemplate);
+        return true;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void upgradeContractVersion(Integer tenantId) {
+        TenantContractTemplate tenantContractTemplate = tenantContractTemplateDao.queryLatestContractTemplate(null, null, tenantId);
+        if (Objects.nonNull(tenantContractTemplate)) {
+            updateVersion(tenantContractTemplate);
+            tenantContractTemplate.setUpdateTime(new Date());
+            this.update(tenantContractTemplate);
+        }
+    }
+
+    private void updateVersion(TenantContractTemplate tenantContractTemplate) {
+        Integer tenantId = tenantContractTemplate.getTenantId();
+        tenantInfoService.getDao().getLocked(tenantId);
+        Integer maxVersion = tenantContractTemplateDao.queryMaxVersion();
+        int version = maxVersion == null ? 1 : maxVersion + 1;
+        tenantContractTemplate.setVersion(version);
+    }
 }

+ 8 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java

@@ -119,9 +119,9 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
     @Autowired
     private TenantContractRecordService tenantContractRecordService;
     @Autowired
-    private TenantContractTemplateDao tenantContractTemplateDao;
-    @Autowired
     private SysUserTenantService sysUserTenantService;
+    @Autowired
+    private TenantContractTemplateService tenantContractTemplateService;
 
     @Value("${contract.baseDir:/var/pdf}")
     private String contractBaseDir;
@@ -136,6 +136,11 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
     //超过1人的则需要这样的样式
     public static final String rowspan = "<tr>" + defSpan + "</tr>";
 
+    @Override
+    public TenantInfoDao getDao() {
+        return this.baseMapper;
+    }
+
     /**
      * 新增机构
      */
@@ -212,19 +217,7 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         //是否修改了机构名称或机构编码
         if (!StringUtils.equals(dto.getTsignName(), tenantInfo.getTsignName()) || !StringUtils.equals(dto.getTsignCode(), tenantInfo.getTsignCode())) {
             //升级机构协议版本号
-            TenantContractTemplate tenantContractTemplate = tenantContractTemplateDao.queryLatestContractTemplate(null, null, tenantId);
-            if (tenantContractTemplate != null) {
-                baseMapper.getLocked(tenantId);
-
-                Integer maxVersion = tenantContractTemplateDao.queryMaxVersion();
-                int version = maxVersion == null ? 1 : maxVersion + 1;
-
-                tenantContractTemplate.setVersion(version);
-                Date date = new Date();
-                tenantContractTemplate.setUpdateTime(date);
-
-                tenantContractTemplateDao.update(tenantContractTemplate);
-            }
+            tenantContractTemplateService.upgradeContractVersion(tenantId);
             //添加签章信息
             contractService.addTsign(tenantInfo.getUserId(), dto.getTsignCode(), dto.getTsignName(), tenantId);
         }
@@ -626,7 +619,6 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
      * 获取协议变量参数
      */
     private Map<String, Object> getContractParam(TenantInfoPageVo tenantInfo) {
-        Date now = new Date();
         //将数据转换为Map
         Map<String, Object> param = WrapperUtil.toMap(tenantInfo);
         //购买服务的时长单位

+ 60 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantOrderRecordServiceImpl.java

@@ -2,16 +2,14 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
 import com.ym.mec.biz.dal.dao.TenantOrderRecordDao;
 import com.ym.mec.biz.dal.dto.TenantOrderRecordDto;
 import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.DealStatusEnum;
-import com.ym.mec.biz.dal.enums.MessageTypeEnum;
-import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
-import com.ym.mec.biz.dal.enums.TenantOrderRecordEnum;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -20,7 +18,6 @@ import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.adapay.Payment;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
-import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.joda.time.LocalDateTime;
@@ -32,6 +29,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
@@ -67,7 +65,10 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
     @Autowired
     private CloudTeacherOrderService cloudTeacherOrderService;
     @Autowired
-    private StudentService studentService;
+    private TenantProxyDividendService tenantProxyDividendService;
+    @Autowired
+    private TenantProxyUserRelationService tenantProxyUserRelationService;
+
     //订单不存在
     private static final String PAYMENT_ID_NOT_EXISTS = "payment_id_not_exists";
 
@@ -197,10 +198,15 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
         tenantInfoService.renewSuccess(val, productInfo, record.getActualAmount());
     }
 
-    //激活团练宝成功
+    /**
+     * 激活团练宝成功
+     *
+     * @param record 机构订单记录
+     */
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void activeCloudTeacher(TenantOrderRecord record) {
+        log.info("activeCloudTeacher>>> record : {}", JSON.toJSONString(record));
         if (record.getId() == null) {
             throw new BizException("订单未找到");
         }
@@ -211,10 +217,56 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
         List<CloudTeacherOrder> cloudTeacherOrders = cloudTeacherOrderDao.findByPlatformOrderId(record.getId());
         for (CloudTeacherOrder cto : cloudTeacherOrders) {
             //激活团练宝
-            cloudTeacherOrderService.activationMember(now,cto);
+            cloudTeacherOrderService.activationMember(now, cto);
         }
         //发信息
         cloudTeacherOrderService.sendSms(record);
+        log.info("activeCloudTeacher>>> cloudTeacherOrders : {}", JSON.toJSONString(cloudTeacherOrders));
+        //消费大于0元则且有代理商的机构则写入分润表
+        if (record.getActualAmount().compareTo(BigDecimal.ZERO) > 0) {
+            log.info("activeCloudTeacher>>> proxy {}", record.getActualAmount());
+            //根据机构id查询对应的推荐人
+            TenantInfo tenantInfo = tenantInfoService.getById(record.getTenantId());
+            log.info("activeCloudTeacher>>> proxy tenantInfo {}", JSON.toJSONString(tenantInfo));
+            if (Objects.isNull(tenantInfo) || Objects.isNull(tenantInfo.getRecommender())) {
+                return;
+            }
+            //根据推荐人查询代理商
+            TenantProxyUserRelation proxyUserRelation = tenantProxyUserRelationService.getOne(Wrappers.<TenantProxyUserRelation>lambdaQuery()
+                    .eq(TenantProxyUserRelation::getUserId, tenantInfo.getRecommender()));
+            log.info("activeCloudTeacher>>> proxy proxyUserRelation {}", JSON.toJSONString(proxyUserRelation));
+            if (Objects.isNull(proxyUserRelation)) {
+                return;
+            }
+            //获取总激活月份
+            Integer totalMonth = cloudTeacherOrders.stream()
+                    .map(this::getTotalMonth)
+                    .reduce(0, Integer::sum);
+            //写入分润表
+            TenantProxyDividend dividend = new TenantProxyDividend();
+            dividend.setProxyId(proxyUserRelation.getProxyId());
+            dividend.setTenantId(record.getTenantId());
+            dividend.setTotalMonth(totalMonth);
+            dividend.setActiveTime(now);
+            dividend.setOrderId(record.getId());
+            tenantProxyDividendService.save(dividend);
+            log.info("activeCloudTeacher>>> proxy proxyUserRelation {}", JSON.toJSONString(dividend));
+        }
+    }
+
+    private Integer getTotalMonth(CloudTeacherOrder order) {
+        PeriodEnum type = order.getType();
+        if (type.equals(PeriodEnum.MONTH)) {
+            return order.getTime();
+        } else if (type.equals(PeriodEnum.QUARTERLY)) {
+            return order.getTime() * 3;
+        } else if (type.equals(PeriodEnum.YEAR_HALF)) {
+            return order.getTime() * 6;
+        } else if (type.equals(PeriodEnum.YEAR)) {
+            return order.getTime() * 12;
+        } else {
+            return 1;
+        }
     }
 
     //充值成功

+ 146 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantProxyDividendServiceImpl.java

@@ -0,0 +1,146 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.TenantProxyDividendDao;
+import com.ym.mec.biz.dal.entity.TenantPreJoin;
+import com.ym.mec.biz.dal.entity.TenantProxyDividend;
+import com.ym.mec.biz.dal.entity.TenantProxyUserRelation;
+import com.ym.mec.biz.dal.vo.ProxyDividendInfoVo;
+import com.ym.mec.biz.dal.vo.ProxyDividendVo;
+import com.ym.mec.biz.service.TenantPreJoinService;
+import com.ym.mec.biz.service.TenantProxyDividendService;
+import com.ym.mec.biz.service.TenantProxyUserRelationService;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.PageUtil;
+import org.apache.commons.collections.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.function.BiConsumer;
+import java.util.stream.Collectors;
+
+/**
+ * 代理商分润表(TenantProxyDividend)表服务实现类
+ *
+ * @author hgw
+ * @since 2022-04-22 14:08:19
+ */
+@Service("tenantProxyDividendService")
+public class TenantProxyDividendServiceImpl extends ServiceImpl<TenantProxyDividendDao, TenantProxyDividend> implements TenantProxyDividendService {
+
+    private final static Logger log = LoggerFactory.getLogger(TenantProxyDividendServiceImpl.class);
+
+    @Autowired
+    private TenantPreJoinService tenantPreJoinService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private TenantProxyUserRelationService tenantProxyUserRelationService;
+
+    @Override
+    public TenantProxyDividendDao getDao() {
+        return this.baseMapper;
+    }
+
+    /**
+     * 代理商分润汇总查询
+     */
+    @Override
+    public ProxyDividendVo queryProxyDividend() {
+        ProxyDividendVo result = new ProxyDividendVo();
+        result.setPreTenant(0);
+        result.setTenantAgency(0);
+
+        List<TenantPreJoin> preJoinsList = new ArrayList<>();
+        Map<String, Object> param = new HashMap<>();
+
+        SysUser user = getUser();
+        //当前登录人是代理商账号类型,需要做数据隔离
+        if (user.getUserType().equalsIgnoreCase("PROXY")) {
+            //查询代理商
+            TenantProxyUserRelation proxyUserRelation = tenantProxyUserRelationService.getOne(Wrappers.<TenantProxyUserRelation>lambdaQuery()
+                    .eq(TenantProxyUserRelation::getUserId, user.getId()));
+            if (Objects.nonNull(proxyUserRelation)) {
+                param.put("proxyId", proxyUserRelation.getProxyId());
+                //查询该代理商下所有代理人
+                List<TenantProxyUserRelation> relationList = tenantProxyUserRelationService.list(Wrappers.<TenantProxyUserRelation>lambdaQuery()
+                        .eq(TenantProxyUserRelation::getProxyId, proxyUserRelation.getProxyId()));
+                List<Integer> userList = relationList.stream().map(TenantProxyUserRelation::getUserId).collect(Collectors.toList());
+                //查询当前代理商入驻信息
+                preJoinsList = tenantPreJoinService.list(Wrappers.<TenantPreJoin>lambdaQuery()
+                        .in(TenantPreJoin::getRecommender, userList));
+            }
+        } else {
+            //查询入驻信息
+            preJoinsList = tenantPreJoinService.list();
+        }
+
+        if (CollectionUtils.isNotEmpty(preJoinsList)) {
+            result.setTenantAgency(preJoinsList.size());
+            long count = preJoinsList.stream()
+                    .filter(a -> Objects.nonNull(a.getState()) && a.getState() == 1)
+                    .count();
+            result.setPreTenant((int) count);
+        }
+
+        //团练宝销售数
+        int count = baseMapper.queryProxyDividendCount(param);
+        result.setMemberCount(count);
+        return result;
+    }
+
+    /**
+     * 代理商分润查询
+     *
+     * @param param 传入参数
+     *              <p> -  proxyId 代理商id
+     *              <p> -  recommenderId 推荐人id
+     *              <p> -  startData 开始日期 年月日
+     *              <p> -  endData 结束日期 年月日
+     *              <p> - row 条数
+     *              <p> - page 页数
+     * @return
+     */
+    @Override
+    public PageInfo<ProxyDividendInfoVo> queryProxyDividendInfo(Map<String, Object> param) {
+        Optional.ofNullable(param.get("startData")).orElseThrow(() -> new BizException("查询的开始日期不能为空!"));
+        Optional.ofNullable(param.get("endData")).orElseThrow(() -> new BizException("查询的结束日期不能为空!"));
+        //拼接时分秒
+        BiConsumer<String, String> addTimeCons = (key, time) -> Optional.ofNullable(param.get(key)).map(String::valueOf)
+                .ifPresent(date -> param.put(key, date + " " + time));
+        addTimeCons.accept("startData", "00:00:00");
+        addTimeCons.accept("endData", "23:59:59");
+
+        SysUser user = getUser();
+        //当前登录人是代理商账号类型,需要做数据隔离
+        if (user.getUserType().equalsIgnoreCase("PROXY")) {
+            //查询代理商
+            TenantProxyUserRelation proxyUserRelation = tenantProxyUserRelationService.getOne(Wrappers.<TenantProxyUserRelation>lambdaQuery()
+                    .eq(TenantProxyUserRelation::getUserId, user.getId()));
+            if (Objects.nonNull(proxyUserRelation)) {
+                param.put("proxyId", proxyUserRelation.getProxyId());
+            }
+        }
+        //分页查询分润记录
+        Page<ProxyDividendInfoVo> pageInfo = PageUtil.getPageInfo(param);
+        pageInfo.setAsc("a.active_time_");
+        IPage<ProxyDividendInfoVo> tiPage = baseMapper.queryProxyDividendInfo(pageInfo, param);
+        return PageUtil.pageInfo(tiPage);
+    }
+
+    private SysUser getUser() {
+        //修改机构基础信息
+        return Optional.ofNullable(sysUserFeignService.queryUserInfo())
+                .orElseThrow(() -> new BizException("用户信息获取失败,请刷新页面或者重新登录!"));
+    }
+}
+

+ 221 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantProxyInfoServiceImpl.java

@@ -0,0 +1,221 @@
+package com.ym.mec.biz.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.TenantProxyInfoDao;
+import com.ym.mec.biz.dal.dto.TenantProxyDto;
+import com.ym.mec.biz.dal.entity.TenantProxyInfo;
+import com.ym.mec.biz.dal.entity.TenantProxyUserRelation;
+import com.ym.mec.biz.dal.vo.ProxyUserVo;
+import com.ym.mec.biz.service.TenantProxyInfoService;
+import com.ym.mec.biz.service.TenantProxyUserRelationService;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.PageUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+/**
+ * 机构代理商信息表(TenantProxyInfo)表服务实现类
+ *
+ * @author hgw
+ * @since 2022-04-22 14:08:20
+ */
+@Service("tenantProxyInfoService")
+public class TenantProxyInfoServiceImpl extends ServiceImpl<TenantProxyInfoDao, TenantProxyInfo> implements TenantProxyInfoService {
+
+    private final static Logger log = LoggerFactory.getLogger(TenantProxyInfoServiceImpl.class);
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private TenantProxyUserRelationService proxyUserRelationService;
+
+    @Override
+    public TenantProxyInfoDao getDao() {
+        return this.baseMapper;
+    }
+
+    /**
+     * 后台-添加代理商信息
+     *
+     * @param dto
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void addProxyInfo(TenantProxyDto dto) {
+        Optional.ofNullable(dto.getProxyName())
+                .orElseThrow(() -> new RuntimeException("代理商名称不能为空"));
+        //当前操作人id
+        Integer opsUserId = getUser().getId();
+        Date now = new Date();
+        //添加sysUser人员信息
+        Integer userId = addSysUser(dto, "PROXY");
+        //添加代理商信息表
+        TenantProxyInfo proxyInfo = new TenantProxyInfo();
+        proxyInfo.setProxyName(dto.getProxyName());
+        proxyInfo.setProxyUserId(userId);
+        proxyInfo.setState(0);
+        proxyInfo.setCreateBy(opsUserId);
+        proxyInfo.setCreateTime(now);
+        this.save(proxyInfo);
+        //添加代理商人员关系表
+        TenantProxyUserRelation userRelation = new TenantProxyUserRelation();
+        userRelation.setProxyId(proxyInfo.getId());
+        userRelation.setUserId(userId);
+        userRelation.setRank(0);
+        userRelation.setCreateTime(now);
+        proxyUserRelationService.save(userRelation);
+    }
+
+    /**
+     * 添加代理商下面的员工
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void addProxyStaff(TenantProxyDto dto) {
+        //获取父级Id
+        Integer parentId = Optional.ofNullable(dto.getParentId()).orElseGet(() -> getUser().getId());
+        //员工id
+        Integer userId = addSysUser(dto, null);
+        //查询父级信息
+        TenantProxyUserRelation parentProxyUser = proxyUserRelationService.getOne(Wrappers.<TenantProxyUserRelation>lambdaQuery()
+                .eq(TenantProxyUserRelation::getUserId, parentId)
+                .isNull(TenantProxyUserRelation::getParentId)
+        );
+        //添加代理商人员关系表
+        TenantProxyUserRelation userRelation = new TenantProxyUserRelation();
+        userRelation.setProxyId(parentProxyUser.getProxyId());
+        userRelation.setParentId(parentId);
+        userRelation.setUserId(userId);
+        userRelation.setRank(parentProxyUser.getRank() + 1);
+        userRelation.setCreateTime(new Date());
+        proxyUserRelationService.save(userRelation);
+    }
+
+    /**
+     * 添加sysUser人员信息
+     *
+     * @return id
+     */
+    private Integer addSysUser(TenantProxyDto dto, String userType) {
+        SysUser sysUser = sysUserFeignService.queryUserByMobile(dto.getPhone());
+        if (Objects.nonNull(sysUser)) {
+            throw new BizException("该手机号在系统已存在!");
+        }
+        sysUser = new SysUser();
+        sysUser.setTenantId(-1);
+        sysUser.setUsername(dto.getName());
+        sysUser.setPhone(dto.getPhone());
+        sysUser.setUserType(userType);
+        sysUser.setRealName(dto.getName());
+        baseMapper.insertProxySysUser(sysUser);
+        return sysUser.getId();
+    }
+
+    /**
+     * 查询代理商下级人员数据
+     *
+     * @param userId 代理人id
+     */
+    public List<ProxyUserVo> queryProxyUserStaff(Integer userId) {
+        return baseMapper.queryProxyUserStaff(userId);
+    }
+
+    /**
+     * 分页查询代理商负责人数据
+     *
+     * @param param 传入参数
+     *              <p> - state  状态 0正常 1冻结
+     *              <p> - row 条数
+     *              <p> - page 页数
+     *              <p> - search 模糊搜索关键字
+     */
+    public PageInfo<ProxyUserVo> queryProxyUser(Map<String, Object> param) {
+        Page<ProxyUserVo> pageInfo = PageUtil.getPageInfo(param);
+        pageInfo.setAsc("c.create_time_");
+        return PageUtil.pageInfo(baseMapper.queryProxyUser(pageInfo, param));
+    }
+
+    /**
+     * 冻结/解冻代理商
+     *
+     * @param userId 代理负责人id
+     * @param state  状态 0正常 1冻结
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void freezeProxy(Integer userId, Integer state) {
+        //sysUser表 lock字段 9冻结 0解冻
+        Integer lockFlag = state == 0 ? state : 9;
+        //先冻结sysUser表
+        baseMapper.updateProxySysUserLock(userId, lockFlag);
+        //在修改代理商表
+        TenantProxyInfo tenantProxyInfo = this.getOne(Wrappers.<TenantProxyInfo>lambdaUpdate()
+                .eq(TenantProxyInfo::getProxyUserId, userId));
+        tenantProxyInfo.setState(state);
+        this.updateById(tenantProxyInfo);
+    }
+
+    /**
+     * 修改人员信息
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void updateProxyUserInfo(TenantProxyDto dto) {
+        Optional.ofNullable(dto.getUserId()).orElseThrow(() -> new BizException("人员id不能为空"));
+        //查询父级信息
+        TenantProxyUserRelation parentProxyUser = proxyUserRelationService.getOne(Wrappers.<TenantProxyUserRelation>lambdaQuery()
+                .eq(TenantProxyUserRelation::getUserId, dto.getUserId()));
+        //判断本次修改的是不是代理商负责人,如果是负责人可能要修改代理商名称
+        if (Objects.isNull(parentProxyUser.getParentId())) {
+            TenantProxyInfo tenantProxyInfo = this.getOne(Wrappers.<TenantProxyInfo>lambdaUpdate()
+                    .eq(TenantProxyInfo::getProxyUserId, dto.getUserId()));
+            tenantProxyInfo.setProxyName(dto.getProxyName());
+            this.updateById(tenantProxyInfo);
+        }
+        baseMapper.updateSysUserPhone(dto.getUserId(), dto.getPhone(), dto.getName());
+    }
+
+    /**
+     * 根据手机号/姓名模糊查询所有平台账号信息
+     *
+     * @param param 传入参数
+     *              <p> - search 模糊搜索关键字
+     */
+    public List<SysUser> queryUserList(Map<String, Object> param) {
+        log.info("queryUserList>>>>>> {}", JSON.toJSONString(param));
+        return baseMapper.queryUserList(param);
+    }
+
+    /**
+     * 根据token查询用户信息-代理商专用
+     *
+     * @return
+     */
+    public SysUser queryUserList() {
+        SysUser user = getUser();
+        SysUser result = new SysUser();
+        result.setRealName(user.getRealName());
+        result.setId(user.getId());
+        result.setPhone(user.getPhone());
+        return result;
+    }
+
+    private SysUser getUser() {
+        //修改机构基础信息
+        return Optional.ofNullable(sysUserFeignService.queryUserInfo())
+                .orElseThrow(() -> new BizException("用户信息获取失败,请刷新页面或者重新登录!"));
+    }
+
+}
+

+ 29 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantProxyUserRelationServiceImpl.java

@@ -0,0 +1,29 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.TenantProxyUserRelationDao;
+import com.ym.mec.biz.dal.entity.TenantProxyUserRelation;
+import com.ym.mec.biz.service.TenantProxyUserRelationService;
+import org.springframework.stereotype.Service;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 机构代理商人员关系表(TenantProxyUserRelation)表服务实现类
+ *
+ * @author hgw
+ * @since 2022-04-22 14:08:22
+ */
+@Service("tenantProxyUserRelationService")
+public class TenantProxyUserRelationServiceImpl extends ServiceImpl<TenantProxyUserRelationDao, TenantProxyUserRelation> implements TenantProxyUserRelationService {
+
+    private final static Logger log = LoggerFactory.getLogger(TenantProxyUserRelationServiceImpl.class);
+
+    @Override
+    public TenantProxyUserRelationDao getDao() {
+        return this.baseMapper;
+    }
+
+}
+

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

@@ -883,10 +883,10 @@
                 AND cs.class_date_ &lt;= #{endTime}
             </if>
             <if test="musicGroupId != null">
-                AND cg.music_group_id_ = #{musicGroupId}
+                AND cs.music_group_id_ = #{musicGroupId}
             </if>
             <if test="classGroupId != null">
-                AND cg.id_ = #{classGroupId}
+                AND cs.class_group_id_ = #{classGroupId}
             </if>
             <if test="isSettlement == 0">
                 AND csts.settlement_time_ IS NULL
@@ -895,7 +895,13 @@
                 AND csts.settlement_time_ IS NOT NULL
             </if>
             <if test="tenantId != null">
-                AND cg.tenant_id_ = #{tenantId}
+                AND cs.tenant_id_ = #{tenantId}
+            </if>
+            <if test="serviceFlag != null">
+                AND css.service_flag_ = #{serviceFlag}
+            </if>
+            <if test="homeworkFlag != null">
+                AND css.homework_flag_ = #{homeworkFlag}
             </if>
         </where>
     </sql>
@@ -909,16 +915,30 @@
         <result property="endClassTimeStr" column="end_class_time_"/>
         <result property="classGroupId" column="class_group_id_"/>
         <result property="mixClassGroupId" column="mix_class_group_id_"/>
-        <result property="courseScheduleType" column="course_schedule_type_"/>
-        <result property="courseScheduleStatus" column="course_schedule_status_"/>
+        <result property="courseScheduleType" column="course_schedule_type_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="courseScheduleStatus" column="course_schedule_status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result property="signInTime" column="sign_in_time_"/>
-        <result property="signInStatus" column="sign_in_status_"/>
+        <result property="signInStatus" column="sign_in_status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result property="signOutTime" column="sign_out_time_"/>
-        <result property="signOutStatus" column="sign_out_status_"/>
+        <result property="signOutStatus" column="sign_out_status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result property="settlementTime" column="settlement_time_"/>
         <result property="remark" column="remark_"/>
         <result property="courseScheduleName" column="course_schedule_name_"/>
         <result property="schoolId" column="school_id_"/>
+        <association property="courseScheduleStatistics" javaType="com.ym.mec.biz.dal.entity.CourseScheduleStatistics">
+            <result column="course_schedule_id_" property="courseScheduleId" />
+            <result column="music_group_id_" property="musicGroupId" />
+            <result column="course_student_total_num_" property="courseStudentTotalNum" />
+            <result column="attendance_num_" property="attendanceNum" />
+            <result column="late_num_" property="lateNum" />
+            <result column="standard_num_" property="standardNum" />
+            <result column="homework_flag_" property="homeworkFlag" />
+            <result column="homework_commit_num_" property="homeworkCommitNum" />
+            <result column="service_flag_" property="serviceFlag" />
+            <result column="attendance_rate_" property="attendanceRate" />
+            <result column="standard_rate_" property="standardRate" />
+            <result column="homework_commit_rate_" property="homeworkCommitRate" />
+        </association>
     </resultMap>
     <select id="queryMusicGroupCourseSchedule" resultMap="MusicGroupCourseScheduleDto">
         SELECT cs.id_ course_schedule_id_,cs.class_date_,cs.start_class_time_,cs.end_class_time_,cs.class_group_id_,
@@ -952,10 +972,14 @@
         ta.sign_in_time_,
         ta.sign_out_time_,
         ta.remark_,
-        cs.schoole_id_ school_id_
+        cs.schoole_id_ school_id_,
+        css.*,CONCAT(TRUNCATE((css.attendance_num_ + css.late_num_) / css.course_student_total_num_ * 100,2),'%') attendance_rate_,
+        CONCAT(TRUNCATE(css.standard_num_ / css.course_student_total_num_ * 100,2),'%') standard_rate_,
+        CONCAT(TRUNCATE(css.homework_commit_num_ / css.course_student_total_num_ * 100,2),'%') homework_commit_rate_
         FROM course_schedule cs
         LEFT JOIN class_group cg ON cg.id_ = cs.class_group_id_
         LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
+        LEFT JOIN course_schedule_statistics css ON css.course_schedule_id_ = cs.id_
         LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_ AND csts.teacher_role_ = 'BISHOP'
         <include refid="queryMusicGroupCourseScheduleDetailSql"/>
         ORDER BY cs.class_date_ ,cs.start_class_time_ ,cg.name_
@@ -967,8 +991,23 @@
         FROM course_schedule cs
         LEFT JOIN class_group cg ON cg.id_ = cs.class_group_id_
         LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
+        LEFT JOIN course_schedule_statistics css ON css.course_schedule_id_ = cs.id_
+        LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_ AND csts.teacher_role_ = 'BISHOP'
+        <include refid="queryMusicGroupCourseScheduleDetailSql"/>
+    </select>
+
+    <select id="getMusicGroupCourseScheduleStatistics" resultMap="com.ym.mec.biz.dal.dao.CourseScheduleStatisticsDao.CourseScheduleStatistics">
+        SELECT CONCAT(TRUNCATE((SUM(css.attendance_num_) + SUM(css.late_num_)) / SUM(css.course_student_total_num_) * 100,2),'%') attendance_rate_,
+        CONCAT(TRUNCATE(SUM(css.standard_num_) / SUM(css.course_student_total_num_) * 100,2),'%') standard_rate_,
+        CONCAT(TRUNCATE(SUM(css.homework_commit_num_) / SUM(CASE WHEN css.homework_flag_ = 1 THEN css.course_student_total_num_ ELSE 0 END) * 100,2),'%') homework_commit_rate_
+        FROM course_schedule cs
+        LEFT JOIN class_group cg ON cg.id_ = cs.class_group_id_
+        LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
+        LEFT JOIN course_schedule_statistics css ON css.course_schedule_id_ = cs.id_
         LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_ AND csts.teacher_role_ = 'BISHOP'
         <include refid="queryMusicGroupCourseScheduleDetailSql"/>
+        AND css.course_status_ = 'OVER'
+        GROUP BY cs.music_group_id_
     </select>
 
     <select id="findNameById" resultType="java.util.Map">

+ 7 - 4
mec-biz/src/main/resources/config/mybatis/CloudTeacherMapper.xml

@@ -89,10 +89,13 @@
     </select>
 
     <select id="getOrgansTotalVipStudentNum" resultType="int">
-        SELECT COUNT(DISTINCT cto.student_id_)
-        FROM cloud_teacher_order cto
-                 LEFT JOIN sys_user su ON cto.student_id_=su.id_
-        WHERE su.del_flag_=0 AND cto.status_ IN (1,2)
+        SELECT count(distinct a.user_id_) FROM 
+		(
+		SELECT s.`user_id_`  FROM `student` s WHERE s.`membership_end_time_` &gt; now()
+		union
+		SELECT cto.`student_id_`  FROM `cloud_teacher_order` cto WHERE cto.`status_` = 1
+		) a LEFT JOIN sys_user su ON a.user_id_=su.id_
+        WHERE su.del_flag_=0 
         <if test="organIds!=null and organIds.size()>0">
             AND su.organ_id_ IN
             <foreach collection="organIds" item="organId" open="(" close=")" separator=",">

+ 179 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleStatisticsMapper.xml

@@ -0,0 +1,179 @@
+<?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.CourseScheduleStatisticsDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.CourseScheduleStatistics" id="CourseScheduleStatistics">
+		<result column="course_schedule_id_" property="courseScheduleId" />
+		<result column="music_group_id_" property="musicGroupId" />
+		<result column="course_student_total_num_" property="courseStudentTotalNum" />
+		<result column="attendance_num_" property="attendanceNum" />
+		<result column="late_num_" property="lateNum" />
+		<result column="standard_num_" property="standardNum" />
+		<result column="homework_flag_" property="homeworkFlag" />
+		<result column="homework_commit_num_" property="homeworkCommitNum" />
+		<result column="service_flag_" property="serviceFlag" />
+		<result column="attendance_rate_" property="attendanceRate" />
+		<result column="standard_rate_" property="standardRate" />
+		<result column="homework_commit_rate_" property="homeworkCommitRate" />
+		<result column="class_date_" property="classDate" />
+		<result column="course_status_" property="courseStatus" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="CourseScheduleStatistics" >
+		SELECT * FROM course_schedule_statistics WHERE course_schedule_id_ = #{courseScheduleId}
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="CourseScheduleStatistics">
+		SELECT * FROM course_schedule_statistics
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.CourseScheduleStatistics" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO course_schedule_statistics (course_schedule_id_,music_group_id_,course_student_total_num_,
+		                                        attendance_num_,late_num_,standard_num_,homework_flag_,homework_commit_num_,service_flag_,class_date_,course_status_)
+		                                        VALUES(#{courseScheduleId},#{musicGroupId},#{courseStudentTotalNum},#{attendanceNum},
+		                                               #{lateNum},#{standardNum},#{homeworkFlag},#{homeworkCommitNum},#{serviceFlag},#{classDate},#{courseStatus})
+	</insert>
+	<insert id="batchInsert">
+		INSERT INTO course_schedule_statistics (course_schedule_id_,music_group_id_,course_student_total_num_,
+												attendance_num_,late_num_,standard_num_,homework_flag_,homework_commit_num_,service_flag_,class_date_,course_status_) VALUES
+		<foreach collection="scheduleStatisticsList" separator="," item="item">
+			(#{item.courseScheduleId},#{item.musicGroupId},#{item.courseStudentTotalNum},#{item.attendanceNum},
+			#{item.lateNum},#{item.standardNum},#{item.homeworkFlag},#{item.homeworkCommitNum},#{item.serviceFlag},#{classDate},#{courseStatus})
+		</foreach>
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.CourseScheduleStatistics">
+		UPDATE course_schedule_statistics <set>
+		<if test="classDate != null and classDate != ''">
+			class_date_ = #{classDate},
+		</if>
+		<if test="courseStatus != null and courseStatus != ''">
+			course_status_ = #{courseStatus},
+		</if>
+		<if test="homeworkFlag != null">
+		homework_flag_ = #{homeworkFlag},
+		</if>
+		<if test="attendanceNum != null">
+		attendance_num_ = #{attendanceNum},
+		</if>
+		<if test="serviceFlag != null">
+		service_flag_ = #{serviceFlag},
+		</if>
+		<if test="standardNum != null">
+		standard_num_ = #{standardNum},
+		</if>
+		<if test="homeworkCommitNum != null">
+		homework_commit_num_ = #{homeworkCommitNum},
+		</if>
+		<if test="courseStudentTotalNum != null">
+		course_student_total_num_ = #{courseStudentTotalNum},
+		</if>
+		<if test="lateNum != null">
+		late_num_ = #{lateNum},
+		</if>
+		<if test="musicGroupId != null">
+		music_group_id_ = #{musicGroupId},
+		</if>
+		</set> WHERE course_schedule_id_ = #{courseScheduleId}
+	</update>
+	<update id="batchUpdate">
+		<foreach collection="scheduleStatisticsList" item="item" index="index" open="" close="" separator=";">
+			UPDATE course_schedule_statistics
+			<set>
+			<if test="item.courseStatus != null and item.courseStatus != ''">
+				course_status_ = #{item.courseStatus},
+			</if>
+			<if test="item.classDate != null and item.classDate != ''">
+				class_date_ = #{item.classDate},
+			</if>
+			<if test="item.homeworkFlag != null">
+				homework_flag_ = #{item.homeworkFlag},
+			</if>
+			<if test="item.attendanceNum != null">
+				attendance_num_ = #{item.attendanceNum},
+			</if>
+			<if test="item.serviceFlag != null">
+				service_flag_ = #{item.serviceFlag},
+			</if>
+			<if test="item.standardNum != null">
+				standard_num_ = #{item.standardNum},
+			</if>
+			<if test="item.homeworkCommitNum != null">
+				homework_commit_num_ = #{item.homeworkCommitNum},
+			</if>
+			<if test="item.courseStudentTotalNum != null">
+				course_student_total_num_ = #{item.courseStudentTotalNum},
+			</if>
+			<if test="item.lateNum != null">
+				late_num_ = #{item.lateNum},
+			</if>
+		</set> WHERE course_schedule_id_ = #{item.courseScheduleId}
+		</foreach>
+	</update>
+	<update id="updateCourseService">
+		UPDATE course_schedule_statistics SET service_flag_ = #{serviceFlag} WHERE FIND_IN_SET(course_schedule_id_,#{courseIds})
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM course_schedule_statistics WHERE course_schedule_id_ = #{courseScheduleId}
+	</delete>
+	<delete id="delWaitByCourseId">
+		SELECT * FROM course_schedule_statistics_wait WHERE course_schedule_id_ IN
+		<foreach collection="courseIdList" item="courseId" separator="," open="(" close=")">
+			#{courseId}
+		</foreach>
+	</delete>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="CourseScheduleStatistics" parameterType="map">
+		SELECT * FROM course_schedule_statistics <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM course_schedule_statistics
+	</select>
+    <select id="queryUpdateCourseScheduleStatistics" resultMap="CourseScheduleStatistics">
+		SELECT cssw.course_schedule_id_,cs.music_group_id_,
+			   COUNT(DISTINCT cssp.id_) course_student_total_num_,
+			   COUNT(DISTINCT CASE WHEN sa.status_ = 'NORMAL' THEN sa.id_ ELSE NULL END) attendance_num_,
+			   COUNT(DISTINCT CASE WHEN sa.status_ = 'LATE' THEN sa.id_ ELSE NULL END) late_num_,
+			   COUNT(DISTINCT CASE WHEN sa.qualified_flag_ = 1 THEN sa.id_ ELSE NULL END) standard_num_,
+			   CASE WHEN sch.id_ IS NOT NULL THEN 1 ELSE 0 END homework_flag_,
+			   COUNT(DISTINCT CASE WHEN sch.status_ = 1 THEN sch.id_ ELSE NULL END) homework_commit_num_,cs.class_date_,cs.status_ course_status_
+		FROM course_schedule_statistics_wait cssw
+				 LEFT JOIN course_schedule_statistics css ON css.course_schedule_id_ = cssw.course_schedule_id_
+				 LEFT JOIN course_schedule cs ON cs.id_ = cssw.course_schedule_id_
+				 LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cssw.course_schedule_id_
+				 LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cssw.course_schedule_id_
+				 LEFT JOIN student_course_homework sch ON sch.course_schedule_id_ = cssw.course_schedule_id_
+		WHERE cs.group_type_ = 'MUSIC' AND css.course_schedule_id_ IS NOT NULL
+		GROUP BY cssw.course_schedule_id_;
+	</select>
+    <select id="queryInsertCourseScheduleStatistics" resultMap="CourseScheduleStatistics">
+		SELECT cssw.course_schedule_id_,cs.music_group_id_,COUNT(cssp.id_) course_student_total_num_,
+			   COUNT(CASE WHEN sa.status_ = 'NORMAL' THEN 1 ELSE NULL END) attendance_num_,
+			   COUNT(CASE WHEN sa.status_ = 'LATE' THEN 1 ELSE NULL END) late_num_,COUNT(CASE WHEN sa.qualified_flag_ = 1 THEN 1 ELSE NULL END) standard_num_,
+			   CASE WHEN sch.id_ IS NOT NULL THEN 1 ELSE 0 END homework_flag_,
+			   COUNT(DISTINCT CASE WHEN sch.status_ = 1 THEN sch.id_ ELSE NULL END) homework_commit_num_,
+			   CASE WHEN sees.course_ids_ IS NOT NULL THEN 1 ELSE 0 END service_flag_,cs.class_date_,cs.status_ course_status_
+		FROM course_schedule_statistics_wait cssw
+				 LEFT JOIN course_schedule_statistics css ON css.course_schedule_id_ = cssw.course_schedule_id_
+				 LEFT JOIN course_schedule cs ON cs.id_ = cssw.course_schedule_id_
+				 LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cssw.course_schedule_id_
+				 LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cssw.course_schedule_id_
+				 LEFT JOIN student_course_homework sch ON sch.course_schedule_id_ = cssw.course_schedule_id_
+				 LEFT JOIN (SELECT DISTINCT course_ids_ FROM student_extracurricular_exercises_situation_ WHERE course_ids_ IS NOT NULL) sees ON FIND_IN_SET(cssw.course_schedule_id_,sees.course_ids_)
+		WHERE cs.group_type_ = 'MUSIC' AND css.course_schedule_id_ IS NULL
+		GROUP BY cssw.course_schedule_id_;
+	</select>
+</mapper>

+ 74 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml

@@ -1079,4 +1079,78 @@
             AND DATE_FORMAT(mgq.create_time_,'%Y-%m-%d') &lt;= DATE_FORMAT(#{queryInfo.endDate}, '%Y-%m-%d' )
         </if>
     </select>
+    <resultMap id="MusicGroupExportDto" type="com.ym.mec.biz.dal.dto.MusicGroupExportDto">
+        <result property="organName" column="organ_name_"/>
+        <result property="musicGroupId" column="music_group_id_"/>
+        <result property="musicGroupName" column="music_group_name_"/>
+        <result property="eduName" column="educational_teacher_name_"/>
+        <result property="attendanceRate" column="attendance_rate_"/>
+        <result property="standardRate" column="standard_rate_"/>
+        <result property="homeworkCommitRate" column="homework_commit_rate_"/>
+        <result property="groupMemberNum" column="group_member_num_"/>
+        <result property="addStuNum" column="add_stu_num_"/>
+        <result property="quitStuNum" column="quit_stu_num_"/>
+        <result property="normalNum" column="normal_num_"/>
+        <result property="totalNum" column="total_num_"/>
+        <result property="lostRate" column="lost_rate_"/>
+    </resultMap>
+    <select id="exportMusicGroupCourseList" resultMap="MusicGroupExportDto">
+        SELECT o.name_ organ_name_,mg.id_ music_group_id_,mg.name_ music_group_name_,su.real_name_ educational_teacher_name_,
+        CONCAT(TRUNCATE((css.attendance_num_ + css.late_num_) / css.course_student_total_num_ * 100,2),'%') attendance_rate_,
+        CONCAT(TRUNCATE(css.standard_num_ / css.course_student_total_num_ * 100,2),'%') standard_rate_,
+        CONCAT(TRUNCATE(css.homework_commit_num_ / css.homework_num_ * 100,2),'%') homework_commit_rate_,
+        mg.group_member_num_,sr3.add_stu_num_,sr1.quit_stu_num_,sr2.normal_num_,sr2.total_num_,
+        CONCAT(TRUNCATE(sr1.quit_stu_num_ /sr2.total_num_ * 100,2),'%') lost_rate_
+        FROM music_group mg
+        LEFT JOIN (SELECT music_group_id_,SUM(attendance_num_) attendance_num_,SUM(late_num_) late_num_,
+        SUM(course_student_total_num_) course_student_total_num_,SUM(standard_num_) standard_num_,SUM(homework_commit_num_) homework_commit_num_,
+        SUM(CASE WHEN homework_flag_ = 1 THEN course_student_total_num_ ELSE 0 END) homework_num_
+        FROM course_schedule_statistics
+        WHERE course_status_ = 'OVER'
+        <if test="queryInfo.startTime != null and queryInfo.startTime != ''">
+            AND class_date_ BETWEEN #{queryInfo.startTime} AND #{queryInfo.endTime}
+        </if>
+        GROUP BY music_group_id_) css ON css.music_group_id_ = mg.id_
+        LEFT JOIN organization o ON o.id_ = mg.organ_id_
+        LEFT JOIN sys_user su ON su.id_ = mg.educational_teacher_id_
+        LEFT JOIN (SELECT sr.music_group_id_,COUNT(DISTINCT mgq.apply_user_id_) quit_stu_num_
+        FROM student_registration sr
+        LEFT JOIN music_group_quit mgq ON mgq.music_group_id_ = sr.music_group_id_
+        WHERE sr.music_group_status_ = 'QUIT' AND mgq.status_ = 'APPROVED'
+        <if test="queryInfo.startTime != null and queryInfo.startTime != ''">
+            AND DATE_FORMAT(mgq.create_time_,"%Y-%m-%d") BETWEEN #{queryInfo.startTime} AND #{queryInfo.endTime}
+        </if>
+        GROUP BY sr.music_group_id_) sr1 ON sr1.music_group_id_ = mg.id_
+        LEFT JOIN (SELECT sr.music_group_id_,
+        COUNT(DISTINCT CASE WHEN sr.music_group_status_ = 'NORMAL' THEN sr.id_ ELSE NULL END) normal_num_,
+        COUNT(DISTINCT sr.id_) total_num_
+        FROM student_registration sr
+        WHERE sr.music_group_status_ != 'APPLY'
+        GROUP BY sr.music_group_id_)sr2 ON sr2.music_group_id_ = mg.id_
+        LEFT JOIN (SELECT music_group_id_,COUNT(DISTINCT CASE WHEN original_flag_ = 0 THEN id_ ELSE NULL END) add_stu_num_
+        FROM student_registration
+        WHERE music_group_status_ = 'NORMAL'
+        <if test="queryInfo.startTime != null and queryInfo.startTime != ''">
+            AND DATE_FORMAT(create_time_,"%Y-%m-%d") BETWEEN #{queryInfo.startTime} AND #{queryInfo.endTime}
+        </if>
+        GROUP BY music_group_id_) sr3 ON sr3.music_group_id_ = mg.id_
+        <where>
+            mg.status_ = 'PROGRESS'
+            <if test="queryInfo.organId != null and queryInfo.organId != ''">
+                AND FIND_IN_SET(mg.organ_id_,#{queryInfo.organId})
+            </if>
+        </where>
+        GROUP BY mg.id_
+        ORDER BY o.id_
+    </select>
+    <select id="countMusicGroupCourseList" resultType="Integer">
+        SELECT COUNT(DISTINCT mg.id_)
+        FROM music_group mg
+        <where>
+            mg.status_ = 'PROGRESS'
+            <if test="queryInfo.organId != null and queryInfo.organId != ''">
+                AND FIND_IN_SET(mg.organ_id_,#{queryInfo.organId})
+            </if>
+        </where>
+    </select>
 </mapper>

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

@@ -144,7 +144,7 @@
         UPDATE student_attendance SET leave_visit_flag_ = 1 WHERE user_id_ = #{userId} AND status_ = 'LEAVE'
     </update>
     <update id="updateQualified">
-        UPDATE student_attendance SET qualified_flag_ = 0 WHERE course_schedule_id_ = #{courseScheduleId} AND user_id_ IN
+        UPDATE student_attendance SET qualified_flag_ = 1 WHERE course_schedule_id_ = #{courseScheduleId} AND user_id_ IN
         <foreach collection="studentIds" separator="," item="userId" open="(" close=")">
             #{userId}
         </foreach>

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

@@ -85,9 +85,9 @@
 
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >
-		DELETE FROM student_basic_info WHERE user_id_ = #{userId} 
+		DELETE FROM student_basic_info WHERE user_id_ = #{userId}
 	</delete>
-	
+
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="StudentBasicInfo" parameterType="map">
 		SELECT * FROM student_basic_info ORDER BY user_id_ <include refid="global.limit"/>

+ 22 - 0
mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml

@@ -199,12 +199,34 @@
 			</foreach>
 		</if>
 	</delete>
+	<select id="selectByMonday" resultMap="StudentExtracurricularExercisesSituation">
+		SELECT id_,course_ids_ FROM student_extracurricular_exercises_situation_ WHERE monday_ = #{monday}
+		<if test="studentIds!=null and studentIds.size()>0">
+			AND student_id_ IN
+			<foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+				#{studentId}
+			</foreach>
+		</if>
+	</select>
 	<delete id="deleteByStudent">
 		DELETE FROM student_extracurricular_exercises_situation_ WHERE student_id_ = #{studentId}
 		<if test="monday!=null and monday!=''">
 			AND monday_=#{monday}
 		</if>
 	</delete>
+	<delete id="batchDelete">
+		DELETE FROM student_extracurricular_exercises_situation_ WHERE id_ IN
+		<foreach collection="situationIds" item="id" open="(" close=")" separator=",">
+			#{id}
+		</foreach>
+	</delete>
+
+	<select id="selectByStudent" resultMap="StudentExtracurricularExercisesSituation">
+		SELECT id_,course_ids_ FROM student_extracurricular_exercises_situation_ WHERE student_id_ = #{studentId}
+		<if test="monday!=null and monday!=''">
+			AND monday_=#{monday}
+		</if>
+	</select>
 
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="StudentExtracurricularExercisesSituation" parameterType="map">

+ 70 - 34
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -812,29 +812,36 @@
         WHERE t.user_id_ NOT IN (SELECT user_id_ FROM student WHERE subject_id_list_ REGEXP '21|25|26|27|28|29')
     </select>
 
-    <select id="getOrgansTotalStudentNum" resultType="int">
-        SELECT COUNT(DISTINCT user_id_)
-        FROM ((SELECT sr.user_id_
-               FROM student_registration sr
-                    LEFT JOIN music_group mg ON sr.music_group_id_=mg.id_
-               WHERE mg.status_='PROGRESS'
-                AND sr.music_group_status_='NORMAL')
-              UNION ALL
-              (SELECT
-                   cssp.user_id_
-               FROM
-                   course_schedule_student_payment cssp
-                       LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
-                       LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
-               WHERE
-                   cssp.group_type_ IN ('VIP', 'PRACTICE')
-                 AND cs.status_='NOT_START')) t
-        LEFT JOIN sys_user su ON t.user_id_=su.id_
-        WHERE su.del_flag_=0
-            AND su.organ_id_ IN
+    <select id="getOrgansCloudTeacherStudent" resultType="com.ym.mec.biz.dal.dto.IndexCloudStudyListDto">
+        SELECT count(s.`user_id_`) totalStudentNum,
+        sum(case when cto.student_id_ IS NULL then 0 else 1 end) waitActivateVipStudentNum,
+        sum(case when s.`membership_end_time_` > now() then 1 else 0 end) effectiveVipStudentNum 
+        FROM student s LEFT JOIN (
+		SELECT distinct cto.`student_id_`  FROM `cloud_teacher_order` cto WHERE cto.`status_` = 1
+		) cto on s.user_id_ = cto.student_id_
+		LEFT JOIN `sys_user` u on s.`user_id_` = u.`id_`
+		WHERE u.`del_flag_` = 0 
+        <if test="organIds!=null and organIds.size()>0">
+            AND u.organ_id_ IN
             <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
                 #{organId}
             </foreach>
+        </if>
+    </select>
+    
+    <select id="getOrganCloudTeacherStudentNum" resultType="com.ym.mec.biz.dal.dto.Mapper">
+        SELECT u.organ_id_ `key`,sum(case when a.user_id_ IS NULL then 0 else 1 end) `value`  FROM student s 
+		LEFT JOIN (
+		SELECT s.`user_id_`  FROM `student` s WHERE s.`membership_end_time_` > now()
+		union
+		SELECT cto.`student_id_`  FROM `cloud_teacher_order` cto WHERE cto.`status_` = 1
+		) a on a.user_id_ = s.`user_id_` 
+		LEFT JOIN `sys_user` u on s.`user_id_` = u.`id_`
+		WHERE u.`del_flag_` = 0 AND u.`organ_id_` IN
+        <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+            #{organId}
+        </foreach>
+		GROUP BY u.`organ_id_` 
     </select>
 
     <select id="getOrgansStudentNum" resultType="map">
@@ -928,7 +935,7 @@
         LEFT JOIN sys_user su ON smcr.user_id_=su.id_
         LEFT JOIN student stu ON smcr.user_id_=stu.user_id_
         WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL
-        AND DATE(smcr.create_time_) = CURDATE()
+        AND smcr.create_time_ > date_sub(curdate(),INTERVAL 0 day)
             AND su.organ_id_ IN
             <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
                 #{organId}
@@ -982,19 +989,48 @@
     </select>
 
     <select id="getOrganTotalCloudStudyLivelyStudentNum" resultType="int">
-        SELECT COUNT(user_id_)
-        FROM (SELECT
-                  smcr.user_id_,
-                  COUNT(DISTINCT(CASE WHEN DATEDIFF(NOW(), smcr.create_time_)&lt;=15 THEN DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') ELSE NULL END)) days
-              FROM sys_music_compare_record smcr
-                       LEFT JOIN sys_user su ON smcr.user_id_=su.id_
-                       LEFT JOIN student stu ON smcr.user_id_=stu.user_id_
-              WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL
-                    AND su.organ_id_ IN
-                    <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
-                        #{organId}
-                    </foreach>
-              GROUP BY smcr.user_id_) t WHERE t.days>=5
+        SELECT count(a.user_id_) FROM 
+		(
+		SELECT wd.`user_id_` FROM `sys_music_compare_week_data` wd  
+		WHERE wd.`train_time_` >= 3600 AND wd.`monday_` BETWEEN date(#{startTime}) and date(#{endTime})  GROUP BY `user_id_` HAVING count(*) >= 3
+		    ) a 
+		LEFT JOIN `student` s on a.`user_id_` = s.`user_id_`
+		LEFT JOIN `sys_user` u on u.`id_` = s.`user_id_` 
+		WHERE u.`del_flag_` = 0 AND u.`organ_id_` IN
+        <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+            #{organId}
+        </foreach>
+    </select>
+
+    <select id="getOrganActiveCloudStudyStudentNum" resultType="com.ym.mec.biz.dal.dto.Mapper">
+        SELECT u.`organ_id_` `key`,count(a.user_id_) `value` FROM 
+		(
+		SELECT wd.`user_id_` FROM `sys_music_compare_week_data` wd  
+		WHERE wd.`train_time_` >= 3600 AND wd.`monday_` BETWEEN date(#{startTime}) and date(#{endTime})  GROUP BY `user_id_` HAVING count(*) >= 3
+		    ) a 
+		LEFT JOIN `student` s on a.`user_id_` = s.`user_id_`
+		LEFT JOIN `sys_user` u on u.`id_` = s.`user_id_` 
+		WHERE u.`del_flag_` = 0 AND u.`organ_id_` IN
+        <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+            #{organId}
+        </foreach>
+		GROUP BY u.`organ_id_` 
+    </select>
+
+    <select id="getCloudStudyStudentOverViewList" resultType="com.ym.mec.biz.dal.dto.IndexCloudStudyListDto">
+        SELECT o.`name_` organName,o.`id_` organId,count(s.`user_id_`) totalStudentNum,
+        sum(case when cto.student_id_ IS NULL then 0 else 1 end) waitActivateVipStudentNum,
+        sum(case when s.`membership_end_time_` > now() then 1 else 0 end) effectiveVipStudentNum 
+        FROM student s LEFT JOIN (
+		SELECT distinct cto.`student_id_`  FROM `cloud_teacher_order` cto WHERE cto.`status_` = 1
+		) cto on s.user_id_ = cto.student_id_
+		LEFT JOIN `sys_user` u on s.`user_id_` = u.`id_`
+		LEFT JOIN `organization` o on o.`id_` = u.`organ_id_` 
+		WHERE u.`del_flag_` = 0 AND u.`organ_id_` IN
+        <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+            #{organId}
+        </foreach>
+		GROUP BY u.`organ_id_` 
     </select>
 
     <select id="getOrganCloudStudyLivelyStudentNum" resultType="map">

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

@@ -792,6 +792,12 @@
         AND sr.payment_status_ = 2
         AND sr.music_group_status_ != 'QUIT'
     </select>
+    <select id="updateOriginalFlag">
+        UPDATE student_registration sr SET original_flag_ = 1
+        WHERE sr.music_group_id_ = #{musicGroupId}
+        AND sr.payment_status_ = 2
+        AND sr.music_group_status_ != 'QUIT'
+    </select>
 
     <!-- 批量开启缴费 -->
     <update id="batchOpenPay">

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

@@ -20,6 +20,7 @@
         <result column="pay_state_" jdbcType="INTEGER" property="payState"/>
         <result column="state_" jdbcType="INTEGER" property="state"/>
         <result column="user_id_" jdbcType="INTEGER" property="userId"/>
+        <result column="recommender_" jdbcType="INTEGER" property="recommender"/>
         <result column="created_by_" jdbcType="INTEGER" property="createdBy"/>
         <result column="created_time_" jdbcType="TIMESTAMP" property="createdTime"/>
         <result column="updated_by_" jdbcType="INTEGER" property="updatedBy"/>
@@ -30,7 +31,7 @@
         id_
         , name_, contacts_, phone_, address_, email_, logo_, customer_service_phone_, remark_, domain_name_,
         data_source_, pay_state_, state_, created_by_, created_time_, updated_by_, updated_time_, tsign_code_, tsign_name_,
-        area_id_,user_id_
+        area_id_,user_id_,recommender_
     </sql>
     <update id="updatePhone">
         update tenant_info set phone_ = #{newPhone} where phone_ = #{oldPhone}

+ 68 - 0
mec-biz/src/main/resources/config/mybatis/TenantProxyDividendMapper.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.TenantProxyDividendDao">
+    <resultMap id="BaseResultMap" type="com.ym.mec.biz.dal.entity.TenantProxyDividend">
+        <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="proxy_id_" jdbcType="INTEGER" property="proxyId"/>
+        <result column="tenant_id_" jdbcType="INTEGER" property="tenantId"/>
+        <result column="total_month_" jdbcType="INTEGER" property="totalMonth"/>
+        <result column="active_time_" jdbcType="TIMESTAMP" property="activeTime"/>
+        <result column="order_id_" jdbcType="INTEGER" property="orderId"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id_
+        , proxy_id_, tenant_id_, total_month_, active_time_, order_id_
+    </sql>
+
+    <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.ym.mec.biz.dal.entity.TenantProxyDividend">
+        insert into tenant_proxy_dividend(proxy_id_, tenant_id_, total_month_, active_time_, order_id_)
+        values
+        <foreach collection="entities" item="entity" separator=",">
+            (#{entity.proxyId}, #{entity.tenantId}, #{entity.totalMonth}, #{entity.activeTime}, #{entity.orderId})
+        </foreach>
+    </insert>
+
+    <select id="queryProxyDividendInfo"  parameterType="map" resultType="com.ym.mec.biz.dal.vo.ProxyDividendInfoVo">
+        select a.proxy_id_ as proxyId,
+        b.proxy_name_ as proxyName,
+        c.id_ as tenantId,
+        c.name_ as tenantName,
+        a.active_time_ as activeDate,
+        a.total_month_ as activeCount,
+        d.real_name_ as recommenderName
+        from tenant_proxy_dividend as a
+        left join tenant_proxy_info as b on a.proxy_id_ = b.id_
+        left join tenant_info as c on a.tenant_id_ = c.id_
+        left join sys_user as d on c.recommender_ = d.id_
+        <where>
+            <if test="param.proxyId != null">
+               AND a.proxy_id_ = #{param.proxyId}
+            </if>
+            <if test="param.recommenderId != null">
+                AND c.recommender_ = #{param.recommenderId}
+            </if>
+            <if test="param.startData != null and param.startData != ''">
+                AND a.active_time_ <![CDATA[ >= ]]> #{param.startData}
+            </if>
+            <if test="param.endData != null and param.endData != ''">
+                AND a.active_time_ <![CDATA[ <= ]]> #{param.endData}
+            </if>
+        </where>
+    </select>
+
+    <select id="queryProxyDividendCount" parameterType="map" resultType="int">
+        select IFNULL(SUM(a.total_month_), 0)  as activeCount
+        from tenant_proxy_dividend as a
+        left join tenant_proxy_info as b on a.proxy_id_ = b.id_
+        left join tenant_info as c on a.tenant_id_ = c.id_
+        left join sys_user as d on c.recommender_ = d.id_
+        <where>
+            <if test="param.proxyId != null">
+                AND a.proxy_id_ = #{param.proxyId}
+            </if>
+        </where>
+    </select>
+
+</mapper>

+ 107 - 0
mec-biz/src/main/resources/config/mybatis/TenantProxyInfoMapper.xml

@@ -0,0 +1,107 @@
+<?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.TenantProxyInfoDao">
+    <resultMap id="BaseResultMap" type="com.ym.mec.biz.dal.entity.TenantProxyInfo">
+        <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="proxy_name_" jdbcType="VARCHAR" property="proxyName"/>
+        <result column="proxy_user_id_" jdbcType="INTEGER" property="proxyUserId"/>
+        <result column="state_" jdbcType="INTEGER" property="state"/>
+        <result column="create_by_" jdbcType="INTEGER" property="createBy"/>
+        <result column="create_time_" jdbcType="TIMESTAMP" property="createTime"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id_
+        , proxy_name_, proxy_user_id_, state_, create_by_, create_time_
+    </sql>
+
+    <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.ym.mec.biz.dal.entity.TenantProxyInfo">
+        insert into tenant_proxy_info(proxy_name_, proxy_user_id_, state_, create_by_, create_time_)
+        values
+        <foreach collection="entities" item="entity" separator=",">
+            (#{entity.proxyName}, #{entity.proxyUserId}, #{entity.state}, #{entity.createBy}, #{entity.createTime})
+        </foreach>
+    </insert>
+
+    <!-- 向数据库增加一条记录 -->
+    <insert id="insertProxySysUser" parameterType="com.ym.mec.auth.api.entity.SysUser" useGeneratedKeys="true" keyColumn="id"
+            keyProperty="id">
+        INSERT INTO sys_user
+        (tenant_id_,username_,phone_,password_,create_time_,user_type_,real_name_)
+        VALUES(#{tenantId},#{username},#{phone},#{password},now(),#{userType},#{realName})
+    </insert>
+
+    <update id="updateProxySysUserLock" parameterType="object">
+        update sys_user set lock_flag_ = #{lock} where id_ = #{id}
+    </update>
+
+    <update id="updateSysUserPhone" parameterType="object">
+        update sys_user
+        set phone_     = #{phone},
+            username_  = #{name},
+            real_name_ = #{name}
+        where id_ = #{id}
+    </update>
+
+    <select id="queryProxyUserStaff" resultType="com.ym.mec.biz.dal.vo.ProxyUserVo">
+        select
+            b.id_ as userId,
+            a.parent_id_ as parentId,
+            c.id_ as proxyId,
+            c.proxy_name_ as proxyName,
+            b.real_name_ as `name`,
+            b.phone_ as `phone`,
+            '员工' as `role`,
+            c.state_ as state
+        from tenant_proxy_user_relation as a
+                 left join tenant_proxy_info as c on a.parent_id_ = c.proxy_user_id_
+                 left join sys_user as b  on a.user_id_ = b.id_
+        where a.parent_id_ = #{id}
+    </select>
+
+    <select id="queryProxyUser" parameterType="map" resultType="com.ym.mec.biz.dal.vo.ProxyUserVo">
+        select
+            b.id_ as userId,
+            c.id_ as proxyId,
+            c.proxy_name_ as proxyName,
+            b.real_name_ as `name`,
+            b.phone_ as `phone`,
+            '负责人' as `role`,
+            c.state_ as state
+        from tenant_proxy_user_relation as a
+                 left join tenant_proxy_info as c on a.user_id_ = c.proxy_user_id_
+                 left join sys_user as b  on a.user_id_ = b.id_
+        <where>
+            a.parent_id_ is null
+            <if test="param.state != null ">
+               AND c.state_ = #{param.state}
+            </if>
+            <if test="param.search != null ">
+                AND (
+                c.proxy_name_ LIKE CONCAT('%', #{param.search},'%')
+                OR b.`real_name_` LIKE CONCAT('%', #{param.search},'%')
+                OR b.`phone_` LIKE CONCAT('%', #{param.search},'%')
+                )
+            </if>
+        </where>
+    </select>
+
+    <select id="queryUserList" parameterType="map" resultType="com.ym.mec.auth.api.entity.SysUser">
+        select id_ as id,
+               real_name_ as realName,
+               phone_ as phone
+        from sys_user
+        where tenant_id_ = -1
+        <if test="param.id != null ">
+            AND id_ = #{param.id}
+        </if>
+        <if test="param.search != null and param.search != ''">
+          AND (
+               `real_name_` LIKE CONCAT('%', #{param.search},'%')
+                OR `phone_` LIKE CONCAT('%', #{param.search},'%')
+            )
+        </if>
+    </select>
+
+</mapper>

+ 27 - 0
mec-biz/src/main/resources/config/mybatis/TenantProxyUserRelationMapper.xml

@@ -0,0 +1,27 @@
+<?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.TenantProxyUserRelationDao">
+    <resultMap id="BaseResultMap" type="com.ym.mec.biz.dal.entity.TenantProxyUserRelation">
+        <id column="id_" jdbcType="INTEGER" property="id"/>
+        <id column="proxy_id_" jdbcType="INTEGER" property="proxyId"/>
+        <result column="user_id_" jdbcType="INTEGER" property="userId"/>
+        <result column="parent_id_" jdbcType="INTEGER" property="parentId"/>
+        <result column="rank_" jdbcType="INTEGER" property="rank"/>
+        <result column="create_time_" jdbcType="TIMESTAMP" property="createTime"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id_,proxy_id_
+        , user_id_, parent_id_, rank_, create_time_
+    </sql>
+
+    <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.ym.mec.biz.dal.entity.TenantProxyUserRelation">
+        insert into tenant_proxy_user_relation(user_id_, proxy_id_,parent_id_, rank_, create_time_)
+        values
+        <foreach collection="entities" item="entity" separator=",">
+            (#{entity.userId},#{proxyId}, #{entity.parentId}, #{entity.rank}, #{entity.createTime})
+        </foreach>
+    </insert>
+
+</mapper>

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

@@ -3,14 +3,10 @@ package com.ym.mec.web.controller;
 import com.alibaba.fastjson.JSON;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.ClassGroup4MixDto;
-import com.ym.mec.biz.dal.dto.HighClassGroupDto;
-import com.ym.mec.biz.dal.dto.MergeClassSplitClassAffirmDto;
-import com.ym.mec.biz.dal.dto.TestDto;
-import com.ym.mec.biz.dal.entity.ClassGroup;
-import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
+import com.ym.mec.biz.dal.enums.ExportTypeEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
 import com.ym.mec.biz.dal.page.ClassGroupQueryInfo;
@@ -21,6 +17,7 @@ import com.ym.mec.biz.service.ClassGroupTeacherMapperService;
 import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.*;
@@ -33,6 +30,9 @@ import org.springframework.web.bind.annotation.*;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 
 @RequestMapping("classGroup")
@@ -169,10 +169,17 @@ public class ClassGroupController extends BaseController {
     @ApiOperation(value = "乐团详情--课表详情列表(课表详情)")
     @GetMapping("/queryMusicGroupCourseScheduleDetail")
     @PreAuthorize("@pcs.hasPermissions('classGroup/queryMusicGroupCourseScheduleDetail')")
-    public HttpResponseResult queryMusicGroupCourseScheduleDetail(queryMusicGroupCourseScheduleQueryInfo queryInfo) {
+    public HttpResponseResult<PageInfo<MusicGroupCourseScheduleDto>> queryMusicGroupCourseScheduleDetail(queryMusicGroupCourseScheduleQueryInfo queryInfo) {
         return succeed(classGroupService.queryMusicGroupCourseScheduleDetail(queryInfo));
     }
 
+    @ApiOperation(value = "乐团详情--课表详情列表(达标率统计数据)")
+    @GetMapping("/getMusicGroupCourseScheduleStatistics")
+    @PreAuthorize("@pcs.hasPermissions('classGroup/getMusicGroupCourseScheduleStatistics')")
+    public HttpResponseResult<CourseScheduleStatistics> getMusicGroupCourseScheduleStatistics(queryMusicGroupCourseScheduleQueryInfo queryInfo) {
+        return succeed(classGroupService.getMusicGroupCourseScheduleStatistics(queryInfo));
+    }
+
     @ApiOperation(value = "乐团班级老师设置")
     @PostMapping("/addClassGroupTeacher")
     @ApiParam(value = "乐团班级老师json", required = true)

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

@@ -182,6 +182,56 @@ public class ExportController extends BaseController {
         return exportService.getExportManageFuncMap().get(exportDto.getExportEnum()).apply(queryInfo,exportDto.getHeadColumns());
     }
 
+
+    @ApiOperation(value = "导出乐团课列表详情")
+    @PostMapping("export/exportMusicGroupCourseList")
+    @PreAuthorize("@pcs.hasPermissions('export/exportMusicGroupCourseList')")
+    public HttpResponseResult exportMusicGroupCourseList(ExportUserAccountQueryInfo queryInfo) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        queryInfo.setOrganId(organizationService.getEmployeeOrgan(sysUser.getId(),queryInfo.getOrganId(),sysUser.getIsSuperAdmin()));
+        Integer i = musicGroupDao.countMusicGroupCourseList(queryInfo);
+        if (Objects.isNull(i) || i <= 0) {
+            throw new BizException("没有可导出的记录");
+        }
+        ManagerDownload managerDownload = exportService.saveManagerDownload(ExportTypeEnum.MUSIC_GROUP_DATA_EXPORT,sysUser.getId());
+        ExecutorService executor = Executors.newCachedThreadPool();
+        CompletableFuture.runAsync(()->{
+            try {
+                exportService.exportMusicGroupCourseList(managerDownload,queryInfo);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        },executor);
+        HttpResponseResult<Object> succeed = succeed();
+        succeed.setMsg(managerDownload.getName() + "导出申请已提交,请到【报表中心-下载列表查看】");
+        return succeed;
+    }
+
+    @ApiOperation(value = "乐团详情--课表详情列表(课表详情)导出")
+    @GetMapping("export/exportMusicGroupCourseScheduleDetail")
+    @PreAuthorize("@pcs.hasPermissions('export/exportMusicGroupCourseScheduleDetail')")
+    public HttpResponseResult exportMusicGroupCourseScheduleDetail(queryMusicGroupCourseScheduleQueryInfo queryInfo) {
+        PageInfo<MusicGroupCourseScheduleDto> pageList = classGroupService.queryMusicGroupCourseScheduleDetail(queryInfo);
+        if (pageList.getTotal() <= 0) {
+            throw new BizException("没有可导出的记录");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        ManagerDownload managerDownload = exportService.saveManagerDownload(ExportTypeEnum.MUSIC_GROUP_COURSE_LIST,sysUser.getId());
+        ExecutorService executor = Executors.newCachedThreadPool();
+        CompletableFuture.runAsync(()->{
+            try {
+                queryInfo.setPage(1);
+                queryInfo.setRows(65535);
+                exportService.exportMusicGroupCourseScheduleDetail(queryInfo, managerDownload);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        },executor);
+        HttpResponseResult<Object> succeed = succeed();
+        succeed.setMsg(managerDownload.getName() + "导出申请已提交,请到【报表中心-下载列表查看】");
+        return succeed;
+    }
+
     @ApiOperation(value = "乐团列表导出")
     @PostMapping("export/musicGroup")
     @PreAuthorize("@pcs.hasPermissions('export/musicGroup')")

+ 64 - 15
mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java

@@ -1,18 +1,18 @@
 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.*;
-import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.entity.Student;
-import com.ym.mec.biz.dal.page.*;
-import com.ym.mec.biz.service.*;
-import com.ym.mec.common.controller.BaseController;
-import com.ym.mec.common.entity.HttpResponseResult;
-import com.ym.mec.common.exception.BizException;
-import com.ym.mec.common.page.PageInfo;
-import com.ym.mec.common.page.QueryInfo;
-import io.swagger.annotations.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -24,8 +24,40 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.*;
-import java.util.stream.Collectors;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.ActivityCourseDetailDto;
+import com.ym.mec.biz.dal.dto.CloudStudyStudentDataDto;
+import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
+import com.ym.mec.biz.dal.dto.IndexCloudStudyListDto;
+import com.ym.mec.biz.dal.dto.StatDto;
+import com.ym.mec.biz.dal.dto.UpdateStudentFeeDto;
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.page.CloudTeacherActiveQueryInfo;
+import com.ym.mec.biz.dal.page.MusicGroupStudentQueryInfo;
+import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
+import com.ym.mec.biz.dal.page.StudentActivityQueryInfo;
+import com.ym.mec.biz.dal.page.StudentErrorLeaveQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageAttendanceQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageCourseQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageVipClassQueryInfo;
+import com.ym.mec.biz.dal.page.StudentOperatingQueryInfo;
+import com.ym.mec.biz.dal.page.StudentQueryInfo;
+import com.ym.mec.biz.dal.page.StudentSignQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherPaymentRecordInfo;
+import com.ym.mec.biz.service.MusicGroupStudentFeeService;
+import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.biz.service.StudentCourseHomeworkService;
+import com.ym.mec.biz.service.StudentManageService;
+import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.biz.service.StudentService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 
 @Api(tags = "学生管理")
 @RestController
@@ -386,6 +418,23 @@ public class StudentManageController extends BaseController {
         return succeed(studentService.getCloudStudyStudentOverView(organIdsList));
     }
 
+    @ApiOperation(value = "云教练学员数据预览列表")
+    @GetMapping("/getCloudStudyStudentOverViewList")
+    @PreAuthorize("@pcs.hasPermissions('studentManage/getCloudStudyStudentOverViewList')")
+    public HttpResponseResult<List<IndexCloudStudyListDto>> getCloudStudyStudentOverViewList(String organIds) throws Exception {
+        List<Integer> organIdsList;
+        if(StringUtils.isNotBlank(organIds)){
+            organIdsList = Arrays.stream(organIds.split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }else{
+            List<Organization> organizations = organizationService.queryEmployeeOrgan();
+            if(CollectionUtils.isEmpty(organizations)){
+                return succeed();
+            }
+            organIdsList = organizations.stream().map(Organization::getId).collect(Collectors.toList());
+        }
+        return succeed(studentService.getCloudStudyStudentOverViewList(organIdsList));
+    }
+
     @ApiOperation(value = "分部云教练学员数据预览")
     @GetMapping("/organStudentOverView")
     @PreAuthorize("@pcs.hasPermissions('studentManage/organStudentOverView')")

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

@@ -87,6 +87,8 @@ public class TaskController extends BaseController {
 	@Autowired
 	private CourseEventSource courseEventSource;
 	@Autowired
+	private CourseScheduleStatisticsService courseScheduleStatisticsService;
+	@Autowired
 	private RedisCache<String, Object> redisCache;
 	@Autowired
 	private IndexBaseMonthDataService indexBaseMonthDataService;
@@ -236,6 +238,8 @@ public class TaskController extends BaseController {
 		courseEventSource.courseStatusChange(courseIds);
 		courseIds = courseScheduleService.updateCourseScheduleToUnderway();
 		courseEventSource.courseStatusChange(courseIds);
+		//更新乐团课统计信息
+		courseScheduleStatisticsService.courseScheduleStatistics();
 	}
 
 	@GetMapping("/updateVipGroupToFinishedStatus")

+ 5 - 4
mec-web/src/main/java/com/ym/mec/web/controller/TenantPreJoinController.java

@@ -45,10 +45,11 @@ public class TenantPreJoinController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('tenantPreJoin/queryPage')")
     public HttpResponseResult<PageInfo<TenantPreJoinVo>> queryPage(@RequestBody Map<String, Object> param) {
         //如果不是超管,那么只能看到推荐人自己的机构
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if(!sysUser.getIsSuperAdmin()){
-            param.put("recommender",sysUser.getId());
-        }
+        //2022年4月26日 需求要求变更为平台账号就看所有数据
+//        SysUser sysUser = sysUserFeignService.queryUserInfo();
+//        if(!sysUser.getIsSuperAdmin()){
+//            param.put("recommender",sysUser.getId());
+//        }
         return succeed(tenantPreJoinService.queryPage(param));
     }
 

+ 59 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TenantProxyDividendController.java

@@ -0,0 +1,59 @@
+package com.ym.mec.web.controller;
+
+
+import com.ym.mec.biz.dal.vo.ProxyDividendInfoVo;
+import com.ym.mec.biz.dal.vo.ProxyDividendVo;
+import com.ym.mec.biz.service.TenantProxyDividendService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+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.RestController;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 代理商分润表(TenantProxyDividend)表控制层
+ *
+ * @author hgw
+ * @since 2022-04-22 14:08:18
+ */
+@Api(tags = "代理商分润表")
+@RestController
+@RequestMapping("/tenantProxyDividend")
+public class TenantProxyDividendController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private TenantProxyDividendService tenantProxyDividendService;
+
+    @ApiOperation("代理商分润汇总查询")
+    @PostMapping(value = "/queryProxyDividend")
+    public HttpResponseResult<ProxyDividendVo> queryProxyDividend() {
+        return succeed(tenantProxyDividendService.queryProxyDividend());
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "proxyId", dataType = "Integer", value = "代理商id"),
+            @ApiImplicitParam(name = "recommenderId", dataType = "Integer", value = "推荐人id"),
+            @ApiImplicitParam(name = "startData", dataType = "String", value = "开始日期 年月日"),
+            @ApiImplicitParam(name = "endData", dataType = "String", value = "结束日期 年月日"),
+            @ApiImplicitParam(name = "page", dataType = "Integer", value = "页数"),
+            @ApiImplicitParam(name = "rows", dataType = "Integer", value = "每页数量"),
+    })
+    @ApiOperation("代理商分润明细查询")
+    @PostMapping(value = "/queryProxyDividendInfo")
+    public HttpResponseResult<PageInfo<ProxyDividendInfoVo>> queryProxyDividendInfo(@RequestBody Map<String, Object> param) {
+        return succeed(tenantProxyDividendService.queryProxyDividendInfo(param));
+    }
+
+}
+

+ 106 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TenantProxyInfoController.java

@@ -0,0 +1,106 @@
+package com.ym.mec.web.controller;
+
+
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.TenantProxyDto;
+import com.ym.mec.biz.dal.vo.ProxyUserVo;
+import com.ym.mec.biz.service.TenantProxyInfoService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 机构代理商信息表(TenantProxyInfo)表控制层
+ *
+ * @author hgw
+ * @since 2022-04-22 14:08:20
+ */
+@Api(tags = "机构代理商信息表")
+@RestController
+@RequestMapping("/tenantProxyInfo")
+public class TenantProxyInfoController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private TenantProxyInfoService tenantProxyInfoService;
+
+    @ApiOperation("添加代理商信息")
+    @PostMapping(value = "/addProxyInfo")
+    public HttpResponseResult<Object> addProxyInfo(@Valid @RequestBody TenantProxyDto dto) {
+        tenantProxyInfoService.addProxyInfo(dto);
+        return succeed();
+    }
+
+    @ApiOperation("添加代理商下面的员工")
+    @PostMapping(value = "/addProxyStaff")
+    public HttpResponseResult<Object> addProxyStaff(@RequestBody TenantProxyDto dto) {
+        tenantProxyInfoService.addProxyStaff(dto);
+        return succeed();
+    }
+
+    @ApiOperation("查询代理商下级人员数据")
+    @ApiImplicitParam(name = "id", value = "代理商负责人id", required = true, dataType = "Integer")
+    @GetMapping("/queryProxyUserStaff")
+    public HttpResponseResult<List<ProxyUserVo>> queryProxyUserStaff(Integer id) {
+        return succeed(tenantProxyInfoService.queryProxyUserStaff(id));
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "search", dataType = "String", value = "关键字"),
+            @ApiImplicitParam(name = "state", dataType = "Integer", value = "状态 0正常 1冻结"),
+            @ApiImplicitParam(name = "page", dataType = "Integer", value = "页数"),
+            @ApiImplicitParam(name = "rows", dataType = "Integer", value = "每页数量"),
+    })
+    @ApiOperation("分页查询代理商负责人数据")
+    @PostMapping(value = "/queryProxyUser")
+    public HttpResponseResult<PageInfo<ProxyUserVo>> queryPage(@RequestBody Map<String, Object> param) {
+        return succeed(tenantProxyInfoService.queryProxyUser(param));
+    }
+
+    @ApiOperation("冻结/解冻代理商")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", dataType = "Integer", value = "代理商负责人id"),
+            @ApiImplicitParam(name = "state", dataType = "Integer", value = "状态 0正常 1冻结"),
+    })
+    @GetMapping("/freezeProxy")
+    public HttpResponseResult<Object> freezeProxy(Integer id, Integer state) {
+        tenantProxyInfoService.freezeProxy(id, state);
+        return succeed();
+    }
+
+    @ApiOperation("修改人员信息")
+    @PostMapping(value = "/updateProxyUserInfo")
+    public HttpResponseResult<Object> updateProxyUserInfo(@RequestBody TenantProxyDto dto) {
+        tenantProxyInfoService.updateProxyUserInfo(dto);
+        return succeed();
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "search", dataType = "String", value = "手机号/姓名模糊查询条件"),
+    })
+    @ApiOperation("手机号/姓名模糊查询所有平台账号信息手机号/姓名模糊查询所有平台账号信息")
+    @PostMapping(value = "/queryUserList")
+    public HttpResponseResult<List<SysUser>> queryUserList(@RequestBody Map<String, Object> param) {
+        return succeed(tenantProxyInfoService.queryUserList(param));
+    }
+
+    @ApiOperation("根据token查询用户信息-代理商专用")
+    @GetMapping("/queryUserListByToken")
+    public HttpResponseResult<SysUser> queryUserList() {
+        return succeed(tenantProxyInfoService.queryUserList());
+    }
+
+}
+

+ 29 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TenantProxyUserRelationController.java

@@ -0,0 +1,29 @@
+package com.ym.mec.web.controller;
+
+
+import com.ym.mec.biz.dal.entity.TenantProxyUserRelation;
+import com.ym.mec.biz.service.TenantProxyUserRelationService;
+import org.springframework.web.bind.annotation.*;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+
+import javax.annotation.Resource;
+
+/**
+ * 机构代理商人员关系表(TenantProxyUserRelation)表控制层
+ *
+ * @author hgw
+ * @since 2022-04-22 14:08:21
+ */
+@Api(tags = "机构代理商人员关系表")
+@RestController
+@RequestMapping("/tenantProxyUserRelation")
+public class TenantProxyUserRelationController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private TenantProxyUserRelationService tenantProxyUserRelationService;
+
+}
+