浏览代码

Merge branch 'adapay_new' of http://git.dayaedu.com/yonge/mec into online-2020-11-23

zouxuan 4 年之前
父节点
当前提交
c1a7c3fe22
共有 95 个文件被更改,包括 2644 次插入759 次删除
  1. 2 1
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/client/SysUserFeignService.java
  2. 3 2
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/client/fallback/SysUserFeignServiceFallback.java
  3. 22 17
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java
  4. 1 1
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  5. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java
  6. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseHomeworkDao.java
  7. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  8. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java
  9. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupQuitDao.java
  10. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SellOrderDao.java
  11. 15 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java
  12. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentCourseHomeworkDao.java
  13. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  14. 21 62
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentManageDao.java
  15. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SubjectDao.java
  16. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserContractsDao.java
  17. 9 9
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  18. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseGroupExportDto.java
  19. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkDto.java
  20. 101 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleStudentListDto.java
  21. 220 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportStudentAttendanceDto.java
  22. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupStudentsDto.java
  23. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SimpleUserDto.java
  24. 61 10
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentCourseHomeworkDto.java
  25. 35 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentListCourseDto.java
  26. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentManageListDto.java
  27. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java
  28. 41 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendancesDto.java
  29. 200 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/WebCourseHomeworkListDto.java
  30. 10 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Student.java
  31. 0 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentCourseHomework.java
  32. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  33. 40 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseHomeWorkTemplateQueryInfo.java
  34. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseHomeworkQueryInfo.java
  35. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseScheduleStudentPaymentQueryInfo.java
  36. 45 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ExportStudentAttendanceQueryInfo.java
  37. 0 20
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageQueryInfo.java
  38. 0 11
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherQueryInfo.java
  39. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseHomeworkService.java
  40. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java
  41. 9 3
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java
  42. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  43. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/NotifyCallback.java
  44. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentAttendanceService.java
  45. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentCourseHomeworkService.java
  46. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  47. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMessageService.java
  48. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserContractsService.java
  49. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherService.java
  50. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  51. 33 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseHomeworkServiceImpl.java
  52. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  53. 86 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  54. 41 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  55. 115 26
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  56. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  57. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  58. 111 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  59. 157 114
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  60. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java
  61. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserContractsServiceImpl.java
  62. 1 26
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  63. 0 2
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml
  64. 1 1
      mec-biz/src/main/resources/config/mybatis/CooperationOrganMapper.xml
  65. 76 1
      mec-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml
  66. 2 2
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  67. 35 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  68. 3 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  69. 104 85
      mec-biz/src/main/resources/config/mybatis/MusicGroupQuitMapper.xml
  70. 11 1
      mec-biz/src/main/resources/config/mybatis/SellOrderMapper.xml
  71. 76 1
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  72. 29 29
      mec-biz/src/main/resources/config/mybatis/StudentCompetitionMapper.xml
  73. 38 3
      mec-biz/src/main/resources/config/mybatis/StudentCourseHomeworkMapper.xml
  74. 61 175
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  75. 7 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  76. 12 0
      mec-biz/src/main/resources/config/mybatis/SubjectMapper.xml
  77. 4 0
      mec-biz/src/main/resources/config/mybatis/SysUserContractsMapper.xml
  78. 13 13
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  79. 52 40
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  80. 6 5
      mec-client-api/src/main/java/com/ym/mec/im/ImFeignService.java
  81. 7 0
      mec-client-api/src/main/java/com/ym/mec/im/fallback/ImFeignServiceFallback.java
  82. 5 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImGroupMessage.java
  83. 3 1
      mec-im/src/main/java/com/ym/config/ResourceServerConfig.java
  84. 13 1
      mec-im/src/main/java/com/ym/controller/GroupController.java
  85. 3 4
      mec-student/src/main/java/com/ym/mec/student/controller/StudentCompetitionController.java
  86. 1 2
      mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java
  87. 2 2
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java
  88. 43 0
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleStudentPaymentController.java
  89. 11 0
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleTeacherSalaryController.java
  90. 120 46
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  91. 47 0
      mec-web/src/main/java/com/ym/mec/web/controller/StudentCourseHomeworkController.java
  92. 36 19
      mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java
  93. 39 0
      mec-web/src/main/java/com/ym/mec/web/controller/SysUserContractsController.java
  94. 18 0
      mec-web/src/main/java/com/ym/mec/web/controller/VipGroupManageController.java
  95. 60 0
      mec-web/src/main/java/com/ym/mec/web/controller/WebCourseHomeworkController.java

+ 2 - 1
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/client/SysUserFeignService.java

@@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import com.ym.mec.auth.api.client.fallback.SysUserFeignServiceFallback;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.common.config.FeignConfiguration;
+import com.ym.mec.common.entity.HttpResponseResult;
 
 @FeignClient(contextId = "sysUserFeignService", name = "auth-server", configuration = { FeignConfiguration.class }, fallback = SysUserFeignServiceFallback.class)
 public interface SysUserFeignService {
@@ -23,7 +24,7 @@ public interface SysUserFeignService {
 	public SysUser queryUserByMobile(@RequestParam("mobile") String mobile);
 
 	@PostMapping(value = "user/add", consumes = MediaType.APPLICATION_JSON_VALUE)
-	public Object addUser(SysUser user);
+	public HttpResponseResult<Integer> addUser(SysUser user);
 
 	@GetMapping(value = "queryUserInfo")
 	public SysUser queryUserInfo();

+ 3 - 2
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/client/fallback/SysUserFeignServiceFallback.java

@@ -6,6 +6,7 @@ import org.springframework.stereotype.Component;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.common.entity.HttpResponseResult;
 
 @Component
 public class SysUserFeignServiceFallback implements SysUserFeignService {
@@ -25,8 +26,8 @@ public class SysUserFeignServiceFallback implements SysUserFeignService {
 		return null;
 	}
 
-	public Object addUser(SysUser user){
-		return false;
+	public HttpResponseResult<Integer> addUser(SysUser user){
+		return null;
 	}
 
 	@Override

+ 22 - 17
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java

@@ -1,11 +1,32 @@
 package com.ym.mec.auth.web.controller;
 
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+
+import java.util.Date;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.MediaType;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.service.SysRoleService;
 import com.ym.mec.auth.service.SysUserRoleService;
 import com.ym.mec.auth.service.SysUserService;
 import com.ym.mec.auth.web.controller.queryInfo.SysUserQueryInfo;
 import com.ym.mec.common.controller.BaseController;
+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;
@@ -18,21 +39,6 @@ import com.ym.mec.thirdparty.eseal.ESealPlugin;
 import com.ym.mec.thirdparty.user.realname.RealnameAuthenticationPluginContext;
 import com.ym.mec.thirdparty.user.realname.provider.LinkfaceRealnameAuthenticationPlugin;
 import com.ym.mec.util.date.DateUtil;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import org.apache.commons.beanutils.BeanUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.MediaType;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Date;
-import java.util.Objects;
 
 @RestController()
 @RequestMapping("user")
@@ -113,9 +119,8 @@ public class UserController extends BaseController {
 	}
 
 	@ApiOperation(value = "新增用户")
-	@PreAuthorize("@pcs.hasPermissions('user/add')")
 	@PostMapping(value = "/add", consumes = MediaType.APPLICATION_JSON_VALUE)
-	public Object add(@RequestBody SysUser sysUser) {
+	public HttpResponseResult<Integer> add(@RequestBody SysUser sysUser) {
 		return succeed(sysUserService.add(sysUser));
 	}
 

+ 1 - 1
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -81,7 +81,7 @@
 		VALUES(#{userId},0,0,1,NOW(),NOW())
     </insert>
     <insert id="saveStudent">
-        INSERT INTO student (user_id_,create_time_,update_time_) VALUES(#{userId},NOW(),NOW())
+        INSERT INTO student (user_id_,create_time_,update_time_,service_tag_,operating_tag_) VALUES(#{userId},NOW(),NOW(),1,1)
     </insert>
 
     <!-- 根据主键查询一条记录 -->

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseHomeworkDao.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.Mapper;
 import com.ym.mec.biz.dal.dto.TeacherHomeworkListDto;
+import com.ym.mec.biz.dal.dto.WebCourseHomeworkListDto;
 import com.ym.mec.biz.dal.entity.CourseHomework;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
@@ -50,4 +51,18 @@ public interface CourseHomeworkDao extends BaseDAO<Long, CourseHomework> {
 	int delByCourseScheduleId(Long courseScheduleId);
 
 	int batchDelByCourseScheduleId(@Param("courseScheduleIdList") List<Long> courseScheduleIdList);
+
+	/**
+	 * 后台作业列表
+	 * @param params
+	 * @return
+	 */
+    List<WebCourseHomeworkListDto> queryHomePage(Map<String, Object> params);
+
+	/**
+	 * 后台作业列表
+	 * @param params
+	 * @return
+	 */
+	int findHomeCount(Map<String, Object> params);
 }

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -8,6 +8,7 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -325,4 +326,16 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @return
      */
     List<RongyunBasicUserDto> queryNoJoinStu(@Param("roomId") String roomId, @Param("courseScheduleId") String courseScheduleId);
+
+    /**
+     * @describe 获取指定学员的最后一节课时间
+     * @author Joburgess
+     * @date 2020/11/17 0017
+     * @param StudentIds:
+     * @return java.util.List<java.util.Map<java.lang.Integer,java.util.Date>>
+     */
+    List<Map<Integer, Date>> findStudentLastCourseSchedule(@Param("studentIds") List<Integer> StudentIds);
+
+    List<CourseScheduleStudentPayment> queryAll(Map<String, Object> params);
+    int countAll(Map<String, Object> params);
 }

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java

@@ -185,7 +185,8 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	 * @param courseScheduleId
 	 * @return
 	 */
-	List<CourseScheduleTeachersDto> queryTeacherSalary(Long courseScheduleId);
+	List<CourseScheduleTeachersDto> queryTeacherSalary(@Param("courseScheduleId") Long courseScheduleId,
+													   @Param("teacherId") Integer teacherId);
 
 	/**
 	 * @param courseScheduleIds: 课程编号列表

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

@@ -19,8 +19,17 @@ public interface MusicGroupQuitDao extends BaseDAO<Long, MusicGroupQuit> {
 
     /**
      * 获取用户退出的乐团
+     *
      * @param userId
      * @return
      */
     List<MusicGroupQuit> getUserMusicQuit(@Param("userId") Integer userId);
+
+    /**
+     * 获取学生乐团最后一次退团记录
+     * @param musicGroupId
+     * @param userIds
+     * @return
+     */
+    List<MusicGroupQuit> getQuits(@Param("musicGroupId") String musicGroupId, @Param("userIds") List<Integer> userIds);
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.dao;
 
+import com.ym.mec.biz.dal.dto.StudentPaymentOrderExportDto;
 import com.ym.mec.biz.dal.entity.OperatingReport;
 import com.ym.mec.biz.dal.entity.SellOrder;
 import com.ym.mec.common.dal.BaseDAO;
@@ -92,6 +93,7 @@ public interface SellOrderDao extends BaseDAO<Integer, SellOrder> {
 
     /**
      * 商品销售
+     *
      * @param startTime
      * @param endTime
      * @return
@@ -191,4 +193,11 @@ public interface SellOrderDao extends BaseDAO<Integer, SellOrder> {
      * @return
      */
     List<SellOrder> getRefundSellOrder(@Param("orderId") Long orderId);
+
+    /**
+     * 获取订单的各类型费用
+     * @param orderId
+     * @return
+     */
+    StudentPaymentOrderExportDto getFeeByType(@Param("orderId") Long orderId);
 }

+ 15 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java

@@ -1,9 +1,6 @@
 package com.ym.mec.biz.dal.dao;
 
-import com.ym.mec.biz.dal.dto.StudentAttendanceResponse;
-import com.ym.mec.biz.dal.dto.StudentAttendanceStatusCountDto;
-import com.ym.mec.biz.dal.dto.StudentPersonalAttendanceDto;
-import com.ym.mec.biz.dal.dto.StudentStatusCountUtilEntity;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.StudentAttendance;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
@@ -296,4 +293,18 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
      * @return java.lang.Long
      */
     Long findFirstSign(@Param("courseScheduleId") Long courseScheduleId, @Param("userId") Integer userId);
+
+    /**
+     * 学员考勤记录导出查询
+     * @param params
+     * @return
+     */
+    int countExportStudentAttendancesQueryPage(Map<String, Object> params);
+
+    /**
+     * 学员考勤记录导出查询
+     * @param params
+     * @return
+     */
+    List<ExportStudentAttendanceDto> exportStudentAttendancesQueryPage(Map<String, Object> params);
 }

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

@@ -134,4 +134,15 @@ public interface StudentCourseHomeworkDao extends BaseDAO<Long, StudentCourseHom
     Set<Integer> checkStudentHaveHomeworkInDateRange(@Param("startDate") String startDate,
                                                      @Param("endDate") String endDate,
                                                      @Param("studentIds") List<Integer> studentIds);
+
+    List<StudentCourseHomework> queryAll(Map<String, Object> params);
+
+    int countAll(Map<String, Object> params);
+
+    /**
+     * 获取作业的已回复数
+     * @param homeWorkIds
+     * @return
+     */
+    List<Map<Long, Long>> queryReplied(@Param("homeWorkIds") List<Long> homeWorkIds);
 }

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

@@ -17,6 +17,8 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
 
     int lockUser(@Param("userId") Integer userId);
 
+    List<Student> findByStudentIds(@Param("studentIds") List<Integer> studentIds);
+
     SysUser lockUserReturnInfo(@Param("userId") Integer userId);
 
     List<SysUser> findStudents(Map<String, Object> params);

+ 21 - 62
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentManageDao.java

@@ -1,17 +1,24 @@
 package com.ym.mec.biz.dal.dao;
 
-import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.*;
-
-import com.ym.mec.biz.dal.entity.StudentAttendance;
-import com.ym.mec.common.page.PageInfo;
-import com.ym.mec.common.page.QueryInfo;
-import org.apache.ibatis.annotations.Param;
-
 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.BasicUserDto;
+import com.ym.mec.biz.dal.dto.MusicGroupStudentSignDto;
+import com.ym.mec.biz.dal.dto.MusicGroupStudentsDto;
+import com.ym.mec.biz.dal.dto.StudentHasCourseDto;
+import com.ym.mec.biz.dal.dto.StudentListCourseDto;
+import com.ym.mec.biz.dal.dto.StudentManageAccountBaseInfoDto;
+import com.ym.mec.biz.dal.dto.StudentManageBaseInfoOfMusicGroupDto;
+import com.ym.mec.biz.dal.dto.StudentManageCourseListDto;
+import com.ym.mec.biz.dal.dto.StudentManageListDto;
+import com.ym.mec.biz.dal.dto.StudentManageVipGroupClassDto;
+import com.ym.mec.biz.dal.dto.StudentPaymentDto;
+
 /**
  * @Author Joburgess
  * @Date 2019/9/19
@@ -172,50 +179,12 @@ public interface StudentManageDao {
     int countStudentVipGroupClass(Map<String, Object> params);
 
     /**
-     * 查询有课的学员
-     * @return
-     */
-    Set<Integer> queryHasCourse(Map<String, Object> params);
-
-    /**
-     * 查询没课的学员
-     * @return
-     */
-    Set<Integer> queryNotCourse(Map<String, Object> params);
-
-    /**
-     * 查询有课的学员
-     * @return
-     */
-    Integer countHasCourse(Map<String, Object> params);
-
-    /**
-     * 查询没课的学员
-     * @return
-     */
-    Integer countNotCourse(Map<String, Object> params);
-
-    /**
-     * 获取用户是否有课
-     * @param userIds
-     * @return
-     */
-    List<Map<Integer, Boolean>> queryStudentHasCourse(@Param("userIds") List<Integer> userIds);
-
-    /**
      * 获取未激活,有课的列表
      * @return
      */
     List<StudentManageListDto> queryHasCourseStudent(Map<String, Object> params);
 
     /**
-     * 当前用户是否有课
-     * @param userId
-     * @return
-     */
-    Integer getHasCourse(Integer userId);
-
-    /**
      * 获取签到学员数
      * @param courseScheduleId
      * @param status
@@ -237,22 +206,6 @@ public interface StudentManageDao {
      */
     Integer countRepliedNum(Integer courseScheduleId);
 
-    List<StudentHasCourseDto> queryCourseStudent(@Param("userIds") Set<Integer> userIds);
-
-    /**
-     * 有陪练课的学员列表
-     * @param params
-     * @return
-     */
-    Set<Integer> queryHasPracticeCourse(Map<String, Object> params);
-
-    /**
-     * 没有陪练课的学员列表
-     * @param params
-     * @return
-     */
-    Set<Integer> queryNotPracticeCourse(Map<String, Object> params);
-
     /**
      * 是否有课map列表
      * @param userIds
@@ -295,4 +248,10 @@ public interface StudentManageDao {
      * @return
      */
     List<Map<Integer,Integer>> queryHasCourseMap(@Param("userIds") Set<Integer> userIds);
+    
+    /**
+     * 查询学生剩余课程
+     * @return
+     */
+    List<StudentListCourseDto> queryStudentRemianCourse(@Param("userIds") Set<Integer> userIds);
 }

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

@@ -138,6 +138,15 @@ public interface SubjectDao extends BaseDAO<Integer, Subject> {
     List<Map<Integer, String>> findStudentSubjectNameMaps(@Param("studentInfos") List<StudentAttendanceViewDto> studentInfos);
 
     /**
+     * @describe
+     * @author Joburgess
+     * @date 2019/12/19
+     * @param studentInfos:
+     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.String>>
+     */
+    List<Map<Integer, Integer>> findStudentSubjectIdMaps(@Param("studentInfos") List<StudentAttendanceViewDto> studentInfos);
+
+    /**
      * 获取声部名称
      * @param subjectIdList
      * @return

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

@@ -2,6 +2,7 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.entity.SysUserContracts;
 import com.ym.mec.common.dal.BaseDAO;
+
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -19,4 +20,10 @@ public interface SysUserContractsDao extends BaseDAO<Long, SysUserContracts> {
     List<SysUserContracts> getUserContractWithType(@Param("userId") Integer userId,
                                                    @Param("contractType") SysUserContracts.ContractType contractType);
 	
+    /**
+     * 获取最近一次的协议
+     * @param userId
+     * @return
+     */
+    SysUserContracts getLatestUserContract(Integer userId);
 }

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

@@ -75,13 +75,6 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
      */
     String queryNameById(@Param("userId") Integer userId);
 
-    /**
-     * 查询分部所有老师
-     *
-     * @param userIds
-     * @return
-     */
-    List<TeacherBasicDto> findTeachers(@Param("userIds") List<Integer> userIds);
 
     /**
      * @param userIds:
@@ -92,6 +85,8 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
      */
     List<SimpleUserDto> findSimpleTeachers(@Param("userIds") List<Integer> userIds);
 
+    List<SimpleUserDto> getUsersSimpleInfo(@Param("userIds") List<Integer> userIds);
+
     /**
      * @param organId:   分部编号
      * @param subjectId: 声部编号列表
@@ -265,8 +260,6 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
      */
     Map<String, Integer> queryOrganTeacherNum(@Param("organId") String organId);
 
-    List<Teacher> findByFlowOrganRange(Map<String, Object> params);
-
     /**
      * @param teacherIds: 教师编号里列表
      * @return java.util.List<com.ym.mec.biz.dal.entity.Teacher>
@@ -476,4 +469,11 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
     List<TeacherDefaultSalaryDto> queryTeacherDefaultSalary(@Param("organIdList") String organIdList);
 
     BasicUserDto findUserByPhone(String phone);
+
+    /**
+     * 获取流动分部老师
+     * @param organId
+     * @return
+     */
+    List<TeacherBasicDto> findByFlowOrganRangeTeachers(@Param("organId") String organId);
 }

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseGroupExportDto.java

@@ -17,6 +17,7 @@ public class CourseGroupExportDto {
     private Date expireDate;
     private Date classStartDate;
     private Date classEndDate;
+    private Date lastClassDate;
     private Integer totalClassTimes = 0;
     private Integer noStartClassTimes = 0;
     //是否购买
@@ -30,6 +31,14 @@ public class CourseGroupExportDto {
         this.buyPractice = buyPractice;
     }
 
+    public Date getLastClassDate() {
+        return lastClassDate;
+    }
+
+    public void setLastClassDate(Date lastClassDate) {
+        this.lastClassDate = lastClassDate;
+    }
+
     public String getOrganName() {
         return organName;
     }

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

@@ -0,0 +1,20 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.CourseHomework;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/11/17 0017
+ */
+public class CourseHomeworkDto extends CourseHomework {
+
+    private int repliedNum;
+
+    public int getRepliedNum() {
+        return repliedNum;
+    }
+
+    public void setRepliedNum(int repliedNum) {
+        this.repliedNum = repliedNum;
+    }
+}

+ 101 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleStudentListDto.java

@@ -0,0 +1,101 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/11/17 0017
+ */
+public class CourseScheduleStudentListDto {
+
+    @ApiModelProperty(value = "学员编号")
+    private Integer studentId;
+
+    @ApiModelProperty(value = "学员名称")
+    private String studentName;
+
+    @ApiModelProperty(value = "声部编号")
+    private String subjectIds;
+
+    @ApiModelProperty(value = "声部名称")
+    private String subjectNames;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "签到时间")
+    private Date signInTime;
+
+    @ApiModelProperty(value = "签退时间")
+    private Date signOutTime;
+
+    @ApiModelProperty(value = "状态(正常、旷课、请假、休学)",required = false)
+    private StudentAttendanceStatusEnum status;
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getSubjectIds() {
+        return subjectIds;
+    }
+
+    public void setSubjectIds(String subjectIds) {
+        this.subjectIds = subjectIds;
+    }
+
+    public String getSubjectNames() {
+        return subjectNames;
+    }
+
+    public void setSubjectNames(String subjectNames) {
+        this.subjectNames = subjectNames;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Date getSignInTime() {
+        return signInTime;
+    }
+
+    public void setSignInTime(Date signInTime) {
+        this.signInTime = signInTime;
+    }
+
+    public Date getSignOutTime() {
+        return signOutTime;
+    }
+
+    public void setSignOutTime(Date signOutTime) {
+        this.signOutTime = signOutTime;
+    }
+
+    public StudentAttendanceStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(StudentAttendanceStatusEnum status) {
+        this.status = status;
+    }
+}

+ 220 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportStudentAttendanceDto.java

@@ -0,0 +1,220 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.SignInStatusEnum;
+import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author zouxuan
+ */
+public class ExportStudentAttendanceDto {
+    @ApiModelProperty(value = "分部编号", required = true)
+    private String organId;
+
+    @ApiModelProperty(value = "分部名称", required = true)
+    private String organName;
+
+    @ApiModelProperty(value = "课程类型", required = true)
+    private GroupType groupType;
+
+    @ApiModelProperty(value = "学生姓名", required = true)
+    private String username;
+
+    @ApiModelProperty(value = "学生编号", required = true)
+    private String userId;
+
+    @ApiModelProperty(value = "课程组编号", required = true)
+    private String groupId;
+
+    @ApiModelProperty(value = "课程组名称", required = true)
+    private String groupName;
+
+    @ApiModelProperty(value = "课程编号", required = true)
+    private Long courseScheduleId;
+
+    @ApiModelProperty(value = "课程名称", required = true)
+    private String courseScheduleName;
+
+    @ApiModelProperty(value = "上课时间", required = true)
+    private String classDate;
+
+    @ApiModelProperty(value = "上课开始时间", required = true)
+    private String startClassTime;
+
+    @ApiModelProperty(value = "上课结束时间", required = true)
+    private String endClassTime;
+
+    @ApiModelProperty(value = "指导老师名称", required = true)
+    private String guideTeacherName;
+
+    @ApiModelProperty(value = "指导老师编号", required = true)
+    private Integer guideTeacherId;
+
+    @ApiModelProperty(value = "教务老师编号", required = true)
+    private Integer educationalTeacherId;
+
+    @ApiModelProperty(value = "教务老师名称", required = true)
+    private String educationalTeacherName;
+
+    @ApiModelProperty(value = "授课老师编号", required = true)
+    private Integer actualTeacherId;
+
+    @ApiModelProperty(value = "授课老师名称", required = true)
+    private String actualTeacherName;
+
+    @ApiModelProperty(value = "学员考勤状态", required = true)
+    private StudentAttendanceStatusEnum studentAttendanceStatus;
+
+    public Integer getActualTeacherId() {
+        return actualTeacherId;
+    }
+
+    public void setActualTeacherId(Integer actualTeacherId) {
+        this.actualTeacherId = actualTeacherId;
+    }
+
+    public String getActualTeacherName() {
+        return actualTeacherName;
+    }
+
+    public void setActualTeacherName(String actualTeacherName) {
+        this.actualTeacherName = actualTeacherName;
+    }
+
+    public String getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(String organId) {
+        this.organId = organId;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public GroupType getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(GroupType groupType) {
+        this.groupType = groupType;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public String getCourseScheduleName() {
+        return courseScheduleName;
+    }
+
+    public void setCourseScheduleName(String courseScheduleName) {
+        this.courseScheduleName = courseScheduleName;
+    }
+
+    public String getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(String classDate) {
+        this.classDate = classDate;
+    }
+
+    public String getStartClassTime() {
+        return startClassTime;
+    }
+
+    public void setStartClassTime(String startClassTime) {
+        this.startClassTime = startClassTime;
+    }
+
+    public String getEndClassTime() {
+        return endClassTime;
+    }
+
+    public void setEndClassTime(String endClassTime) {
+        this.endClassTime = endClassTime;
+    }
+
+    public String getGuideTeacherName() {
+        return guideTeacherName;
+    }
+
+    public void setGuideTeacherName(String guideTeacherName) {
+        this.guideTeacherName = guideTeacherName;
+    }
+
+    public Integer getGuideTeacherId() {
+        return guideTeacherId;
+    }
+
+    public void setGuideTeacherId(Integer guideTeacherId) {
+        this.guideTeacherId = guideTeacherId;
+    }
+
+    public Integer getEducationalTeacherId() {
+        return educationalTeacherId;
+    }
+
+    public void setEducationalTeacherId(Integer educationalTeacherId) {
+        this.educationalTeacherId = educationalTeacherId;
+    }
+
+    public String getEducationalTeacherName() {
+        return educationalTeacherName;
+    }
+
+    public void setEducationalTeacherName(String educationalTeacherName) {
+        this.educationalTeacherName = educationalTeacherName;
+    }
+
+    public StudentAttendanceStatusEnum getStudentAttendanceStatus() {
+        return studentAttendanceStatus;
+    }
+
+    public void setStudentAttendanceStatus(StudentAttendanceStatusEnum studentAttendanceStatus) {
+        this.studentAttendanceStatus = studentAttendanceStatus;
+    }
+}

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

@@ -41,6 +41,9 @@ public class MusicGroupStudentsDto{
     @ApiModelProperty(value = "学员状态 NORMAL(NORMAL, 在读), LEAVE(LEAVE, 请假), QUIT(QUIT, 退班)",required = false)
     private String studentStatus;
 
+    @ApiModelProperty(value = "退团原因",required = false)
+    private String quitReason;
+
     private PaymentFlagEnum paymentStatus;
 
     @ApiModelProperty(value = "是否新增学员(1是0否)",required = false)
@@ -209,4 +212,12 @@ public class MusicGroupStudentsDto{
     public void setNextPaymentDateStr(String nextPaymentDateStr) {
         this.nextPaymentDateStr = nextPaymentDateStr;
     }
+
+    public String getQuitReason() {
+        return quitReason;
+    }
+
+    public void setQuitReason(String quitReason) {
+        this.quitReason = quitReason;
+    }
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SimpleUserDto.java

@@ -8,6 +8,8 @@ public class SimpleUserDto {
 
     private Integer userId;
 
+    private String nickName;
+
     private String userName;
 
     private String avatar;
@@ -66,6 +68,14 @@ public class SimpleUserDto {
         this.userId = userId;
     }
 
+    public String getNickName() {
+        return nickName;
+    }
+
+    public void setNickName(String nickName) {
+        this.nickName = nickName;
+    }
+
     public String getUserName() {
         return userName;
     }

+ 61 - 10
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentCourseHomeworkDto.java

@@ -4,26 +4,37 @@ package com.ym.mec.biz.dal.dto;
 import java.util.Date;
 
 public class StudentCourseHomeworkDto {
+
+    private Integer studentId;
+
+    private String studentName;
+
     private String phone;
 
-    private String username;
+    private String subjectIds;
 
-    private String subjectName;
+    private String subjectNames;
 
     private String url;
 
+    private String attachments;
+
+    private Date submitTime;
+
     private Date createTime;
 
     private Integer isReplied;
 
     private Integer isView;
 
-    public String getSubjectName() {
-        return subjectName;
+    private Long studentCourseHomeworkId;
+
+    public Long getStudentCourseHomeworkId() {
+        return studentCourseHomeworkId;
     }
 
-    public void setSubjectName(String subjectName) {
-        this.subjectName = subjectName;
+    public void setStudentCourseHomeworkId(Long studentCourseHomeworkId) {
+        this.studentCourseHomeworkId = studentCourseHomeworkId;
     }
 
     public String getPhone() {
@@ -34,12 +45,36 @@ public class StudentCourseHomeworkDto {
         this.phone = phone;
     }
 
-    public String getUsername() {
-        return username;
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public String getAttachments() {
+        return attachments;
+    }
+
+    public void setAttachments(String attachments) {
+        this.attachments = attachments;
+    }
+
+    public Date getSubmitTime() {
+        return submitTime;
+    }
+
+    public void setSubmitTime(Date submitTime) {
+        this.submitTime = submitTime;
     }
 
-    public void setUsername(String username) {
-        this.username = username;
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
     }
 
     public String getUrl() {
@@ -66,6 +101,22 @@ public class StudentCourseHomeworkDto {
         this.isReplied = isReplied;
     }
 
+    public String getSubjectIds() {
+        return subjectIds;
+    }
+
+    public void setSubjectIds(String subjectIds) {
+        this.subjectIds = subjectIds;
+    }
+
+    public String getSubjectNames() {
+        return subjectNames;
+    }
+
+    public void setSubjectNames(String subjectNames) {
+        this.subjectNames = subjectNames;
+    }
+
     public Integer getIsView() {
         return isView;
     }

+ 35 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentListCourseDto.java

@@ -0,0 +1,35 @@
+package com.ym.mec.biz.dal.dto;
+
+public class StudentListCourseDto {
+
+	private Integer userId;
+	
+	private Integer remainCourseNum;
+	
+	private Integer remainPracticeNum;
+
+	public Integer getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Integer userId) {
+		this.userId = userId;
+	}
+
+	public Integer getRemainCourseNum() {
+		return remainCourseNum;
+	}
+
+	public void setRemainCourseNum(Integer remainCourseNum) {
+		this.remainCourseNum = remainCourseNum;
+	}
+
+	public Integer getRemainPracticeNum() {
+		return remainPracticeNum;
+	}
+
+	public void setRemainPracticeNum(Integer remainPracticeNum) {
+		this.remainPracticeNum = remainPracticeNum;
+	}
+	
+}

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentManageListDto.java

@@ -76,6 +76,8 @@ public class StudentManageListDto {
     private String teacherName;
     
     private Integer teacherId;
+    
+    private String subjectIdList;
 
     public BigDecimal getBalance() {
         return balance;
@@ -284,4 +286,12 @@ public class StudentManageListDto {
 	public void setTeacherId(Integer teacherId) {
 		this.teacherId = teacherId;
 	}
+
+	public String getSubjectIdList() {
+		return subjectIdList;
+	}
+
+	public void setSubjectIdList(String subjectIdList) {
+		this.subjectIdList = subjectIdList;
+	}
 }

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

@@ -27,6 +27,9 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
     //教辅费用
     private BigDecimal teachingFee;
 
+    //维修费用
+    private BigDecimal repairFee;
+
     //手续费
     private BigDecimal transferFee;
 
@@ -193,4 +196,12 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
     public void setHighOnlineCourseFee(BigDecimal highOnlineCourseFee) {
         this.highOnlineCourseFee = highOnlineCourseFee;
     }
+
+    public BigDecimal getRepairFee() {
+        return repairFee;
+    }
+
+    public void setRepairFee(BigDecimal repairFee) {
+        this.repairFee = repairFee;
+    }
 }

+ 41 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendancesDto.java

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.entity.CourseSchedule;
 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.TeachTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.util.Date;
@@ -13,6 +14,8 @@ public class TeacherAttendancesDto {
     @ApiModelProperty(value = "老师名",required = false)
 	private String teacherName;
 
+    private TeachTypeEnum teacherRole;
+
     @ApiModelProperty(value = "分部名",required = false)
 	private String organName;
 
@@ -47,6 +50,12 @@ public class TeacherAttendancesDto {
     @ApiModelProperty(value = "签退状态(1正常签到,0异常签到) ",required = false)
     private SignOutStatusEnum signOutStatus;
 
+    private String schoolLongitudeLatitude;
+
+    private String signInLongitudeLatitude;
+
+    private String signOutLongitudeLatitude;
+
     /** 备注 */
     @ApiModelProperty(value = "备注",required = false)
     private String remark;
@@ -105,6 +114,38 @@ public class TeacherAttendancesDto {
         this.courseScheduleName = courseScheduleName;
     }
 
+    public TeachTypeEnum getTeacherRole() {
+        return teacherRole;
+    }
+
+    public void setTeacherRole(TeachTypeEnum teacherRole) {
+        this.teacherRole = teacherRole;
+    }
+
+    public String getSchoolLongitudeLatitude() {
+        return schoolLongitudeLatitude;
+    }
+
+    public void setSchoolLongitudeLatitude(String schoolLongitudeLatitude) {
+        this.schoolLongitudeLatitude = schoolLongitudeLatitude;
+    }
+
+    public String getSignInLongitudeLatitude() {
+        return signInLongitudeLatitude;
+    }
+
+    public void setSignInLongitudeLatitude(String signInLongitudeLatitude) {
+        this.signInLongitudeLatitude = signInLongitudeLatitude;
+    }
+
+    public String getSignOutLongitudeLatitude() {
+        return signOutLongitudeLatitude;
+    }
+
+    public void setSignOutLongitudeLatitude(String signOutLongitudeLatitude) {
+        this.signOutLongitudeLatitude = signOutLongitudeLatitude;
+    }
+
     public CourseStatusEnum getCourseScheduleStatus() {
         return courseScheduleStatus;
     }

+ 200 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/WebCourseHomeworkListDto.java

@@ -0,0 +1,200 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.enums.GroupType;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/9/19
+ */
+public class WebCourseHomeworkListDto {
+
+    @ApiModelProperty(value = "作业编号",required = false)
+    private Long id;
+
+    @ApiModelProperty(value = "课程时间",required = false)
+    private String classDate;
+
+    @ApiModelProperty(value = "课程开始时间",required = false)
+    private String classStartDate;
+
+    @ApiModelProperty(value = "课程结束时间",required = false)
+    private String classEndDate;
+
+    @ApiModelProperty(value = "课程编号",required = false)
+    private Long courseScheduleId;
+
+    @ApiModelProperty(value = "课程名称",required = false)
+    private String courseScheduleName;
+
+    @ApiModelProperty(value = "分部编号",required = false)
+    private Integer organId;
+
+    @ApiModelProperty(value = "分部名称",required = false)
+    private String organName;
+
+    @ApiModelProperty(value = "课程组编号",required = false)
+    private String groupId;
+
+    @ApiModelProperty(value = "课程组名称",required = false)
+    private String groupName;
+
+    @ApiModelProperty(value = "课程组类型",required = false)
+    private GroupType groupType;
+
+    @ApiModelProperty(value = "布置时间",required = false)
+    private Date createTime;
+
+    @ApiModelProperty(value = "布置老师",required = false)
+    private Integer actualTeacherId;
+
+    @ApiModelProperty(value = "布置老师名称",required = false)
+    private String actualTeacherName;
+
+    @ApiModelProperty(value = "作业完成人数",required = false)
+    private Integer completedNum = 0;
+
+    @ApiModelProperty(value = "预计完成人数",required = false)
+    private Integer expectNum;
+
+    @ApiModelProperty(value = "已回复数",required = false)
+    private Integer repliedNum = 0;
+
+    public String getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(String classDate) {
+        this.classDate = classDate;
+    }
+
+    public String getClassStartDate() {
+        return classStartDate;
+    }
+
+    public void setClassStartDate(String classStartDate) {
+        this.classStartDate = classStartDate;
+    }
+
+    public String getClassEndDate() {
+        return classEndDate;
+    }
+
+    public void setClassEndDate(String classEndDate) {
+        this.classEndDate = classEndDate;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public String getCourseScheduleName() {
+        return courseScheduleName;
+    }
+
+    public void setCourseScheduleName(String courseScheduleName) {
+        this.courseScheduleName = courseScheduleName;
+    }
+
+    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 String getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public GroupType getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(GroupType groupType) {
+        this.groupType = groupType;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Integer getActualTeacherId() {
+        return actualTeacherId;
+    }
+
+    public void setActualTeacherId(Integer actualTeacherId) {
+        this.actualTeacherId = actualTeacherId;
+    }
+
+    public String getActualTeacherName() {
+        return actualTeacherName;
+    }
+
+    public void setActualTeacherName(String actualTeacherName) {
+        this.actualTeacherName = actualTeacherName;
+    }
+
+    public Integer getCompletedNum() {
+        return completedNum;
+    }
+
+    public void setCompletedNum(Integer completedNum) {
+        this.completedNum = completedNum;
+    }
+
+    public Integer getExpectNum() {
+        return expectNum;
+    }
+
+    public void setExpectNum(Integer expectNum) {
+        this.expectNum = expectNum;
+    }
+
+    public Integer getRepliedNum() {
+        return repliedNum;
+    }
+
+    public void setRepliedNum(Integer repliedNum) {
+        this.repliedNum = repliedNum;
+    }
+}

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

@@ -2,10 +2,17 @@ package com.ym.mec.biz.dal.entity;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
+import com.ym.mec.auth.api.entity.SysUser;
+
 /**
  * 对应数据库表(student):
  */
-public class Student {
+public class Student extends SysUser {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -5869690088559659057L;
 
 	/**  */
 	private Integer userId;
@@ -35,6 +42,8 @@ public class Student {
 	public Student(Integer userId, String subjectIdList) {
 		this.userId = userId;
 		this.subjectIdList = subjectIdList;
+		this.operatingTag = 1;
+		this.serviceTag = 1;
 	}
 
 	public String getSubjectNames() {

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

@@ -232,5 +232,4 @@ public class StudentCourseHomework {
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);
 	}
-
 }

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

@@ -52,6 +52,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     IM_HOMEWORK_REMIND("IM_HOMEWORK_REMIND", "作业提醒"),
     IM_HOMEWORK_REMIND_DETAIL("IM_HOMEWORK_REMIND_DETAIL", "作业提醒"),
     IM_HOMEWORK_SUBMIT_PUSH("IM_HOMEWORK_SUBMIT_PUSH", "作业提交提醒"),
+    IM_HOMEWORK_SUBMIT_PUSH_GROUP("IM_HOMEWORK_SUBMIT_PUSH_GROUP", "作业提交提醒"),
     IM_HOMEWORK_STUDENT_REPLY_PUSH("IM_HOMEWORK_STUDENT_REPLY_PUSH", "作业回复提醒"),
     IM_HOMEWORK_TEACHER_REPLY_PUSH("IM_HOMEWORK_TEACHER_REPLY_PUSH", "作业点评提醒"),
     STUDENT_PUSH_CLASS_MESSAGE("STUDENT_PUSH_CLASS_MESSAGE", "班级消息"),

+ 40 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseHomeWorkTemplateQueryInfo.java

@@ -8,6 +8,7 @@ import io.swagger.annotations.ApiModelProperty;
  * @Date 2019/9/18
  */
 public class CourseHomeWorkTemplateQueryInfo extends QueryInfo {
+    private String organId;
 
     @ApiModelProperty(value = "科目ID集合",required = false)
     private String[] subjectIDs;
@@ -15,9 +16,48 @@ public class CourseHomeWorkTemplateQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "课程计划ID",required = false)
     private Long courseScheduleID;
 
+    private String classStartDate;
+
+    private String classEndDate;
+
     @ApiModelProperty(value = "班级类型")
     private String classType;
 
+    @ApiModelProperty(value = "课程组类型")
+    private String groupType = "MUSIC";
+
+    public String getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(String organId) {
+        this.organId = organId;
+    }
+
+    public String getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(String groupType) {
+        this.groupType = groupType;
+    }
+
+    public String getClassStartDate() {
+        return classStartDate;
+    }
+
+    public void setClassStartDate(String classStartDate) {
+        this.classStartDate = classStartDate;
+    }
+
+    public String getClassEndDate() {
+        return classEndDate;
+    }
+
+    public void setClassEndDate(String classEndDate) {
+        this.classEndDate = classEndDate;
+    }
+
     public String getClassType() {
         return classType;
     }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseHomeworkQueryInfo.java

@@ -24,9 +24,14 @@ public class CourseHomeworkQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "班级ID",required = false)
     private Long classGroupId;
 
+    @ApiModelProperty(value = "课程编号")
+    private Long courseScheduleId;
+
     @ApiModelProperty(value = "用户ID",required = false)
     private Long userId;
 
+    private Integer isReplied;
+
     private Date classDate;
 
     public Date getClassDate() {
@@ -69,6 +74,22 @@ public class CourseHomeworkQueryInfo extends QueryInfo {
         this.classGroupId = classGroupId;
     }
 
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public Integer getIsReplied() {
+        return isReplied;
+    }
+
+    public void setIsReplied(Integer isReplied) {
+        this.isReplied = isReplied;
+    }
+
     public Long getUserId() {
         return userId;
     }

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

@@ -0,0 +1,22 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/11/17 0017
+ */
+public class CourseScheduleStudentPaymentQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "课程编号")
+    private Integer courseScheduleId;
+
+    public Integer getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Integer courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+}

+ 45 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ExportStudentAttendanceQueryInfo.java

@@ -0,0 +1,45 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+
+public class ExportStudentAttendanceQueryInfo extends QueryInfo {
+    private String organId;
+
+    private String groupType = "MUSIC";
+
+    private String classStartDate;
+
+    private String classEndDate;
+
+    public String getClassStartDate() {
+        return classStartDate;
+    }
+
+    public void setClassStartDate(String classStartDate) {
+        this.classStartDate = classStartDate;
+    }
+
+    public String getClassEndDate() {
+        return classEndDate;
+    }
+
+    public void setClassEndDate(String classEndDate) {
+        this.classEndDate = classEndDate;
+    }
+
+    public String getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(String organId) {
+        this.organId = organId;
+    }
+
+    public String getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(String groupType) {
+        this.groupType = groupType;
+    }
+}

+ 0 - 20
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageQueryInfo.java

@@ -32,10 +32,6 @@ public class StudentManageQueryInfo extends QueryInfo {
 
     private Boolean isExport = false;
 
-    private Boolean hasCourse;
-
-    private Boolean hasPracticeCourse;
-
     private Integer serviceTag;
 
     private Integer operatingTag;
@@ -66,14 +62,6 @@ public class StudentManageQueryInfo extends QueryInfo {
         isExport = export;
     }
 
-    public Boolean getHasPracticeCourse() {
-        return hasPracticeCourse;
-    }
-
-    public void setHasPracticeCourse(Boolean hasPracticeCourse) {
-        this.hasPracticeCourse = hasPracticeCourse;
-    }
-
     public List<Integer> getUserIds() {
         return userIds;
     }
@@ -82,14 +70,6 @@ public class StudentManageQueryInfo extends QueryInfo {
         this.userIds = userIds;
     }
 
-    public Boolean getHasCourse() {
-        return hasCourse;
-    }
-
-    public void setHasCourse(Boolean hasCourse) {
-        this.hasCourse = hasCourse;
-    }
-
     public String getStudentName() {
         return studentName;
     }

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

@@ -13,9 +13,6 @@ public class TeacherQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "机构编号")
     private String organId;
 
-    @ApiModelProperty(value = "教师编号")
-    private List<Integer> teacherId;
-
     @ApiModelProperty(value = "教师工作性质")
     private String jobNature;
 
@@ -39,14 +36,6 @@ public class TeacherQueryInfo extends QueryInfo {
         this.tenantId = tenantId;
     }
 
-    public List<Integer> getTeacherId() {
-        return teacherId;
-    }
-
-    public void setTeacherId(List<Integer> teacherId) {
-        this.teacherId = teacherId;
-    }
-
     public Integer getSubjectId() {
         return subjectId;
     }

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

@@ -1,7 +1,10 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.WebCourseHomeworkListDto;
 import com.ym.mec.biz.dal.entity.CourseHomework;
+import com.ym.mec.biz.dal.page.CourseHomeWorkTemplateQueryInfo;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
 import java.util.List;
@@ -36,4 +39,11 @@ public interface CourseHomeworkService extends BaseService<Long, CourseHomework>
 	 * @return
 	 */
 	boolean delHomwworkByCourseScheduleId(List<Long> courseScheduleIdList);
+
+	/**
+	 * 管理端作业列表
+	 * @param queryInfo
+	 * @return
+	 */
+	PageInfo<WebCourseHomeworkListDto> queryHomePage(CourseHomeWorkTemplateQueryInfo queryInfo);
 }

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java

@@ -1,10 +1,17 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.CourseScheduleStudentListDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
+import com.ym.mec.biz.dal.page.CourseScheduleQueryInfo;
+import com.ym.mec.biz.dal.page.CourseScheduleStudentPaymentQueryInfo;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
+import org.snaker.engine.access.Page;
 
 import java.util.List;
+import java.util.Map;
 
 public interface CourseScheduleStudentPaymentService extends BaseService<Long, CourseScheduleStudentPayment> {
 
@@ -54,4 +61,13 @@ public interface CourseScheduleStudentPaymentService extends BaseService<Long, C
 	 */
 	void updateVipGiveCourse(Long vipGroupId);
 
+	/**
+	 * @describe 查询课程上学员列表
+	 * @author Joburgess
+	 * @date 2020/11/17 0017
+	 * @param queryInfo:
+	 * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.dto.CourseScheduleStudentListDto>
+	 */
+	Map<String, Object> queryCourseStudentList(CourseScheduleStudentPaymentQueryInfo queryInfo);
+
 }

+ 9 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java

@@ -1,8 +1,6 @@
 package com.ym.mec.biz.service;
 
-import com.ym.mec.biz.dal.dto.ExportTeacherSalaryDto;
-import com.ym.mec.biz.dal.dto.TeacherCourseSalaryDetail4WebDto;
-import com.ym.mec.biz.dal.dto.TeacherSalaryDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
 import com.ym.mec.biz.dal.entity.VipGroup;
@@ -167,4 +165,12 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
      */
     List<CourseScheduleTeacherSalary> createTeacherCourseSalary(CourseSchedule courseSchedule, List<Integer> teacherIds);
 
+    /**
+     * @describe 获取指定课程上的教师信息
+     * @author Joburgess
+     * @date 2020/11/17 0017
+     * @param courseScheduleId:
+     * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherAttendanceDto>
+     */
+    List<TeacherAttendancesDto> getCourseTeachers(Long courseScheduleId);
 }

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

@@ -211,7 +211,7 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	 * @param courseScheduleId
 	 * @return
 	 */
-	List<CourseScheduleTeachersDto> queryTeacherSalary(Long courseScheduleId);
+	List<CourseScheduleTeachersDto> queryTeacherSalary(Long courseScheduleId,Integer teacherId);
 
 	/**
 	 * 开启缴费(报名中 -->  缴费中)
@@ -306,4 +306,4 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	 * @param musicGroupIds
 	 */
 //	void musicGroupStudentFeePatch(List<String> musicGroupIds);
-}
+}

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

@@ -214,7 +214,7 @@ public class NotifyCallback implements MQTTCallbackHandler {
         hfMember.setStatus("succeeded");
         hfMember.setMemo(corpMemberObj.getString("audit_desc"));
         if (corpMemberObj.containsKey("audit_state") && corpMemberObj.getString("audit_state").equals("E")) {
-            JSONObject accounts = JSON.parseObject(corpMemberObj.get("settle_accounts").toString());
+            JSONObject accounts = JSON.parseObject(corpMemberObj.getString("settle_accounts"));
             hfMember.setSettleAccountId(accounts.getString("id"));
         }
         notifyCallback.hfMemberDao.update(hfMember);

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

@@ -1,12 +1,14 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.CourseScheduleResponse;
+import com.ym.mec.biz.dal.dto.ExportStudentAttendanceDto;
 import com.ym.mec.biz.dal.dto.StudentAttendanceDto;
 import com.ym.mec.biz.dal.dto.StudentPersonalAttendanceDto;
 import com.ym.mec.biz.dal.entity.StudentAttendance;
 import com.ym.mec.biz.dal.enums.SignStatusEnum;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
+import com.ym.mec.biz.dal.page.ExportStudentAttendanceQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
@@ -119,4 +121,12 @@ public interface StudentAttendanceService extends BaseService<Long, StudentAtten
 	 * @param userId
 	 */
 	void cleanCourseStudentSignOut(Long courseId, Integer userId);
+
+	/**
+	 * 学员考勤导出列表
+	 * @author zouxuan
+	 * @param queryInfo
+	 * @return
+	 */
+	PageInfo<ExportStudentAttendanceDto> exportStudentAttendancesQueryPage(ExportStudentAttendanceQueryInfo queryInfo);
 }

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

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.CourseHomeworkStudentDetailDto;
 import com.ym.mec.biz.dal.dto.StudentCourseHomeworkDto;
+import com.ym.mec.biz.dal.entity.CourseHomework;
 import com.ym.mec.biz.dal.entity.StudentCourseHomework;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.common.page.PageInfo;
@@ -9,6 +10,7 @@ import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 
 import java.util.List;
+import java.util.Map;
 
 public interface StudentCourseHomeworkService extends BaseService<Long, StudentCourseHomework> {
 
@@ -70,4 +72,19 @@ public interface StudentCourseHomeworkService extends BaseService<Long, StudentC
      * @return com.ym.mec.common.page.PageInfo
      */
     PageInfo findStudentHomeworkRecord(CourseHomeworkQueryInfo queryInfo);
+
+    /**
+     * 提交作业
+     * @param studentCourseHomework
+     */
+    void add(StudentCourseHomework studentCourseHomework);
+
+    /**
+     * @describe 获取课程作业详情
+     * @author Joburgess
+     * @date 2020/11/17 0017
+     * @param queryInfo:
+     * @return java.util.Map<java.lang.String,java.lang.Object>
+     */
+    Map<String, Object> getCourseHomeworkDetail(CourseHomeworkQueryInfo queryInfo);
 }

+ 3 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java

@@ -5,6 +5,7 @@ import java.util.Map;
 
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.page.MusicGroupStudentQueryInfo;
 import com.ym.mec.biz.dal.page.StudentManageAttendanceQueryInfo;
 import com.ym.mec.biz.dal.page.StudentManageCourseQueryInfo;
@@ -133,14 +134,14 @@ public interface StudentManageService {
      * @param sysUser
      * @return
      */
-    int studentRegister(SysUser sysUser);
+    int studentRegister(Student student);
 
     /**
      * 修改学员信息
      * @param sysUser
      * @return
      */
-    int studentUpdate(SysUser sysUser);
+    int studentUpdate(Student student);
 
     /**
      * 获取激活比例

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysMessageService.java

@@ -37,6 +37,14 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	void batchSendImMessage(MessageTypeEnum messageType,String senderId,String extra, String[] targetIds,String url, Object... args);
 
 	/**
+	 * 推送im文本消息,包换调整链接
+	 * @param senderId
+	 * @param messageType
+	 * @return
+	 */
+	void batchSendImGroupMessage(MessageTypeEnum messageType,String senderId,String extra, String[] targetIds,String url, Object... args);
+
+	/**
 	 * 推送im自定义节拍器消息
 	 * @param senderId
 	 * @param roomId

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysUserContractsService.java

@@ -17,4 +17,10 @@ public interface SysUserContractsService extends BaseService<Long, SysUserContra
      */
     List<SysUserContracts> getUserContractWithType(Integer userId, SysUserContracts.ContractType contractType);
 
+    /**
+     * 获取最近一次的协议
+     * @param userId
+     * @return
+     */
+    SysUserContracts getLatestUserContract(Integer userId);
 }

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

@@ -85,7 +85,7 @@ public interface TeacherService extends BaseService<Integer, Teacher> {
      * @param organId
      * @return
      */
-    List<TeacherBasicDto> findTeachers(@Param("organId") String organId);
+    List<TeacherBasicDto> findTeachers(String organId);
 
     /**
      * @describe 根据科目获取部门下的教师
@@ -94,7 +94,7 @@ public interface TeacherService extends BaseService<Integer, Teacher> {
      * @param subjectId: 科目编号
      * @return java.util.List<com.ym.mec.biz.dal.entity.Teacher>
      */
-    List<Teacher> findOrganTeacherBySubject(@Param("subjectId") Integer subjectId);
+    List<Teacher> findOrganTeacherBySubject(Integer subjectId);
 
     /**
      * 获取教师上课结算列表

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

@@ -1389,8 +1389,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             if (!CollectionUtils.isEmpty(tempIds)) {
                 List<Map<Integer, String>> studentSubjectNameMaps = subjectDao.findStudentSubjectNameMaps(tempIds);
                 Map<Integer, String> studentSubjectNameMap = MapUtil.convertIntegerMap(studentSubjectNameMaps);
+                List<Map<Integer, Integer>> studentSubjectIdMaps = subjectDao.findStudentSubjectIdMaps(tempIds);
+                Map<Integer, Integer> studentSubjectIdMap = MapUtil.convertIntegerMap(studentSubjectIdMaps);
                 truantStudent.forEach(studentAttendanceViewDto -> {
                     studentAttendanceViewDto.setSubjectName(studentSubjectNameMap.get(studentAttendanceViewDto.getStudentId().intValue()));
+//                    studentAttendanceViewDto.setSubjectId(studentSubjectIdMap.get(studentAttendanceViewDto.getStudentId().intValue()).longValue());
                 });
             }
         }
@@ -1444,6 +1447,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<Integer> studentIdList = classGroup4MixDto.getStudents();
         List<StudentRegistration> studentList = studentRegistrationService.findStudentListByUserIdList(musicGroupId, studentIdList);
 
+
         List<Integer> subjectIdList = studentList.stream().map(student -> student.getActualSubjectId()).collect(Collectors.toList());
         TeachModeEnum teachMode = TeachModeEnum.OFFLINE;
         if (classGroup4MixDto.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE)) {

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

@@ -5,14 +5,17 @@ import com.ym.mec.biz.dal.dao.StudentCourseHomeworkDao;
 import com.ym.mec.biz.dal.dao.StudentCourseHomeworkReplyDao;
 import com.ym.mec.biz.dal.dto.Mapper;
 import com.ym.mec.biz.dal.dto.TeacherHomeworkListDto;
+import com.ym.mec.biz.dal.dto.WebCourseHomeworkListDto;
 import com.ym.mec.biz.dal.entity.CourseHomework;
 import com.ym.mec.biz.dal.entity.StudentCourseHomework;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.page.CourseHomeWorkTemplateQueryInfo;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.service.CourseHomeworkService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
 import com.ym.mec.util.collection.MapUtil;
@@ -63,7 +66,7 @@ public class CourseHomeworkServiceImpl extends BaseServiceImpl<Long, CourseHomew
 				if(CollectionUtils.isEmpty(studentCourseHomeworks)){
 					continue;
 				}
-				long noRepliedNum=studentCourseHomeworks.stream().filter(e -> e.getStatus().equals(YesOrNoEnum.YES)&&e.getIsReplied().equals(YesOrNoEnum.NO)).count();
+				long noRepliedNum=studentCourseHomeworks.stream().filter(e -> YesOrNoEnum.YES.equals(e.getStatus())&&YesOrNoEnum.NO.equals(e.getIsReplied())).count();
 				if(noRepliedNum<=0){
 					teacherHomeworkListDto.setIsReplied(YesOrNoEnum.YES.getCode());
 				}
@@ -134,4 +137,33 @@ public class CourseHomeworkServiceImpl extends BaseServiceImpl<Long, CourseHomew
 		studentCourseHomeworkReplyDao.delByCourseScheduleIds(courseScheduleIdList);
 		return true;
 	}
+
+	@Override
+	public PageInfo<WebCourseHomeworkListDto> queryHomePage(CourseHomeWorkTemplateQueryInfo queryInfo) {
+		PageInfo<WebCourseHomeworkListDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<WebCourseHomeworkListDto> dataList = null;
+		int count = courseHomeworkDao.findHomeCount(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = courseHomeworkDao.queryHomePage(params);
+			List<Long> homeWorkIds = dataList.stream().map(e -> e.getId()).collect(Collectors.toList());
+			List<Map<Long,Long>> repliedList = studentCourseHomeworkDao.queryReplied(homeWorkIds);
+			Map<Long,Long> map = MapUtil.convertIntegerMap(repliedList);
+			dataList.forEach(e->{
+				Long aLong = map.get(e.getId());
+				if(aLong != null){
+					e.setRepliedNum(aLong.intValue());
+				}
+			});
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
 }

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

@@ -2681,6 +2681,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         if(groupType == VIP){
 			VipGroup vipGroup = vipGroupDao.get(vipGroupCourseAdjustInfo.getVipGroupId().longValue());
 
+			CourseSchedule courseSchedule = courseSchedules.stream().max(Comparator.comparing(CourseSchedule::getEndClassTime)).get();
+			if(courseSchedule.getEndClassTime().compareTo(vipGroup.getCoursesExpireDate())>0&&!DateUtil.isSameDay(courseSchedule.getEndClassTime(),vipGroup.getCoursesExpireDate())){
+				throw new BizException("调整失败:课程时间超过课程有效期");
+			}
+
 			BigDecimal teacherSalary=BigDecimal.ZERO;
 
 			Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee(vipGroup, vipGroup.getUserId(), null, null);

+ 86 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -1,15 +1,24 @@
 package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.CourseScheduleStudentListDto;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.dto.VipGroupGiveCourseSortDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.page.CourseScheduleQueryInfo;
+import com.ym.mec.biz.dal.page.CourseScheduleStudentPaymentQueryInfo;
 import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
 import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.constant.CommonConstants;
 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.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
+import io.swagger.models.auth.In;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -34,6 +43,14 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 	private ClassGroupStudentMapperDao classGroupStudentMapperDao;
 	@Autowired
 	private SysUserCashAccountService sysUserCashAccountService;
+	@Autowired
+	private StudentAttendanceDao studentAttendanceDao;
+	@Autowired
+	private TeacherDao teacherDao;
+	@Autowired
+	private StudentDao studentDao;
+	@Autowired
+	private SubjectDao subjectDao;
 
 	@Override
 	public BaseDAO<Long, CourseScheduleStudentPayment> getDAO() {
@@ -264,4 +281,73 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 			courseScheduleStudentPaymentDao.batchUpdate(needUpdatePayments);
 		}
 	}
+
+	@Override
+	public Map<String, Object> queryCourseStudentList(CourseScheduleStudentPaymentQueryInfo queryInfo) {
+		PageInfo<CourseScheduleStudentListDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+		List<StudentAttendance> studentAttendances = studentAttendanceDao.findByCourseId(queryInfo.getCourseScheduleId().longValue());
+
+		List<CourseScheduleStudentListDto> dataList = new ArrayList<>();
+		int count = courseScheduleStudentPaymentDao.countAll(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.queryAll(params);
+			Set<Integer> studentIds = courseScheduleStudentPayments.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toSet());
+			List<SimpleUserDto> usersSimpleInfo = teacherDao.getUsersSimpleInfo(new ArrayList<>(studentIds));
+			List<Student> students = studentDao.findByStudentIds(new ArrayList<>(studentIds));
+			Set<Integer> subjectIds = new HashSet<>();
+			for (Student student : students) {
+				if(StringUtils.isBlank(student.getSubjectIdList())){
+					continue;
+				}
+				Set<Integer> studentSubjectIds = Arrays.stream(student.getSubjectIdList().split(",")).mapToInt(Integer::valueOf).boxed().collect(Collectors.toSet());
+				subjectIds.addAll(studentSubjectIds);
+			}
+			List<Subject> subjects = new ArrayList<>();
+			if(!CollectionUtils.isEmpty(subjectIds)){
+				subjects = subjectDao.findBySubjectIds(new ArrayList<>(subjectIds));
+			}
+			Map<Integer, StudentAttendance> studentAttendanceMap = studentAttendances.stream().collect(Collectors.toMap(StudentAttendance::getUserId, s -> s, (s1, s2) -> s1));
+			Map<Integer, SimpleUserDto> studentInfoMap = usersSimpleInfo.stream().collect(Collectors.toMap(SimpleUserDto::getUserId, s -> s, (s1, s2) -> s1));
+			Map<Integer, Student> studentMap = students.stream().collect(Collectors.toMap(Student::getUserId, s -> s, (s1, s2) -> s1));
+			for (CourseScheduleStudentPayment courseScheduleStudentPayment : courseScheduleStudentPayments) {
+				CourseScheduleStudentListDto cssld=new CourseScheduleStudentListDto();
+				cssld.setStudentId(courseScheduleStudentPayment.getUserId());
+				cssld.setStudentName(studentInfoMap.containsKey(cssld.getStudentId())?studentInfoMap.get(cssld.getStudentId()).getNickName():"");
+				cssld.setPhone(studentInfoMap.containsKey(cssld.getStudentId())?studentInfoMap.get(cssld.getStudentId()).getPhone():"");
+				cssld.setSubjectIds(studentMap.containsKey(cssld.getStudentId())?studentMap.get(cssld.getStudentId()).getSubjectIdList():"");
+				if(StringUtils.isNotBlank(cssld.getSubjectIds())){
+					Set<Integer> studentSubjectIds = Arrays.stream(cssld.getSubjectIds().split(",")).mapToInt(Integer::valueOf).boxed().collect(Collectors.toSet());
+					List<String> subjectNames = subjects.stream().filter(s -> studentSubjectIds.contains(s.getId())).map(Subject::getName).collect(Collectors.toList());
+					cssld.setSubjectNames(StringUtils.join(subjectNames, ","));
+				}
+				if(studentAttendanceMap.containsKey(cssld.getStudentId())){
+					StudentAttendance studentAttendance = studentAttendanceMap.get(cssld.getStudentId());
+					cssld.setSignInTime(studentAttendance.getSignInTime());
+					cssld.setSignOutTime(studentAttendance.getSignOutTime());
+					cssld.setStatus(studentAttendance.getStatus());
+				}
+				dataList.add(cssld);
+			}
+		}
+		pageInfo.setRows(dataList);
+
+		Map<String, Object> result = new HashMap<>();
+		result.put("pageInfo", pageInfo);
+
+		if(queryInfo.getPage()==1){
+			Map<String, Integer> countInfo = new HashMap<>();
+			countInfo.put("totalStudentNum", count);
+			countInfo.put("signInStudentNum", (int) studentAttendances.stream().filter(s -> Objects.nonNull(s.getSignInTime())).count());
+			countInfo.put("leaveStudentNum", (int) studentAttendances.stream().filter(s -> StudentAttendanceStatusEnum.LEAVE.equals(s.getStatus())).count());
+			countInfo.put("truantStudentNum", (int) studentAttendances.stream().filter(s -> Objects.isNull(s.getStatus())||StudentAttendanceStatusEnum.TRUANT.equals(s.getStatus())).count());
+
+			result.put("countInfo", countInfo);
+		}
+
+		return result;
+	}
 }

+ 41 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -1273,4 +1273,45 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             }
         }
     }
+
+    @Override
+    public List<TeacherAttendancesDto> getCourseTeachers(Long courseScheduleId) {
+        List<TeacherAttendancesDto> result = new ArrayList<>();
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedule(courseScheduleId);
+        if(CollectionUtils.isEmpty(courseScheduleTeacherSalaries)){
+            return result;
+        }
+        Set<Integer> teacherIds = courseScheduleTeacherSalaries.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toSet());
+        List<TeacherAttendance> teacherAttendances = teacherAttendanceDao.findByCourseSchedules(Arrays.asList(courseScheduleId));
+        Map<Integer, TeacherAttendance> idTeacherAttendanceMap = teacherAttendances.stream().collect(Collectors.toMap(TeacherAttendance::getTeacherId, t -> t, (t1, t2) -> t1));
+        List<SimpleUserDto> usersSimpleInfo = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(teacherIds)){
+            usersSimpleInfo = teacherDao.getUsersSimpleInfo(new ArrayList<>(teacherIds));
+        }
+        Map<Integer, SimpleUserDto> idUserMap = usersSimpleInfo.stream().collect(Collectors.toMap(SimpleUserDto::getUserId, s -> s));
+
+        CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);
+        School school = schoolService.get(courseSchedule.getSchoolId());
+
+        for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
+            TeacherAttendancesDto t = new TeacherAttendancesDto();
+            t.setTeacherId(courseScheduleTeacherSalary.getUserId());
+            t.setTeacherName(idUserMap.containsKey(t.getTeacherId())?idUserMap.get(t.getTeacherId()).getUserName():"");
+            t.setTeacherRole(courseScheduleTeacherSalary.getTeacherRole());
+            if(idTeacherAttendanceMap.containsKey(t.getTeacherId())){
+                TeacherAttendance teacherAttendance = idTeacherAttendanceMap.get(t.getTeacherId());
+                t.setSignInTime(teacherAttendance.getSignInTime());
+                t.setSignInStatus(Objects.nonNull(teacherAttendance.getSignInStatus())?(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())?SignInStatusEnum.UNUSUAL:SignInStatusEnum.NORMAL):SignInStatusEnum.NO);
+                t.setSignOutTime(teacherAttendance.getSignOutTime());
+                t.setSignOutStatus(Objects.nonNull(teacherAttendance.getSignOutStatus())?(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())?SignOutStatusEnum.UNUSUAL:SignOutStatusEnum.NORMAL):SignOutStatusEnum.NO);
+                t.setSignInLongitudeLatitude(teacherAttendance.getSignInLongitudeLatitude());
+                t.setSignOutLongitudeLatitude(teacherAttendance.getSignOutLongitudeLatitude());
+            }
+            if(Objects.nonNull(school)){
+                t.setSchoolLongitudeLatitude(school.getLongitudeLatitude());
+            }
+            result.add(t);
+        }
+        return result;
+    }
 }

+ 115 - 26
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -1,19 +1,127 @@
 package com.ym.mec.biz.service.impl;
 
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
-import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.dao.ChargeTypeDao;
+import com.ym.mec.biz.dal.dao.ClassGroupDao;
+import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
+import com.ym.mec.biz.dal.dao.CooperationOrganDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dao.MusicGroupBuildLogDao;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentEntitiesDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPurchaseListDao;
+import com.ym.mec.biz.dal.dao.MusicGroupQuitDao;
+import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
+import com.ym.mec.biz.dal.dao.MusicGroupSubjectGoodsGroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupSubjectPlanDao;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dao.SchoolDao;
+import com.ym.mec.biz.dal.dao.SporadicChargeInfoDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.CourseFormDto;
+import com.ym.mec.biz.dal.dto.CourseScheduleTeachersDto;
+import com.ym.mec.biz.dal.dto.HighClassGroupDto;
+import com.ym.mec.biz.dal.dto.MusicCardDto;
+import com.ym.mec.biz.dal.dto.RegisterPayDto;
+import com.ym.mec.biz.dal.dto.SporadicPayDto;
+import com.ym.mec.biz.dal.dto.SubFeeSettingDto;
+import com.ym.mec.biz.dal.dto.SubjectRegisterDto;
+import com.ym.mec.biz.dal.dto.UpdateExpectedNumDto;
+import com.ym.mec.biz.dal.entity.ApprovalStatus;
+import com.ym.mec.biz.dal.entity.ChargeType;
+import com.ym.mec.biz.dal.entity.ClassGroup;
+import com.ym.mec.biz.dal.entity.CooperationOrgan;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
+import com.ym.mec.biz.dal.entity.Goods;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupBuildLog;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.FeeType;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
+import com.ym.mec.biz.dal.entity.MusicGroupPurchaseList;
+import com.ym.mec.biz.dal.entity.MusicGroupQuit;
+import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
-import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.biz.dal.entity.School;
+import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.entity.SysUserCashAccount;
+import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
+import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.dal.enums.GoodsType;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
+import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.SporadicChargeTypeEnum;
+import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.MusicGroupQueryInfo;
-import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.service.ClassGroupService;
+import com.ym.mec.biz.service.ClassGroupStudentMapperService;
+import com.ym.mec.biz.service.GoodsService;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderService;
+import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.biz.service.MusicGroupSubjectGoodsGroupService;
+import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
+import com.ym.mec.biz.service.PayService;
+import com.ym.mec.biz.service.StudentPaymentOrderDetailService;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
+import com.ym.mec.biz.service.StudentPaymentRouteOrderService;
+import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.SysUserCashAccountDetailService;
+import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.entity.ImGroupModel;
@@ -27,18 +135,6 @@ import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
 
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.stream.Collectors;
-
 @Service
 public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> implements MusicGroupService {
 
@@ -1935,13 +2031,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             courseScheduleTeacherSalary.setUpdateTime(new Date());
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
         }
-        Teacher teacher = teacherDao.get(teacherId);
-        MusicGroup musicGroup = musicGroupDao.get(classGroupDao.findByCourseSchedule(courseScheduleId.intValue(), 0).getMusicGroupId());
-        Set<Integer> roleIds = new HashSet<>(1);
-        roleIds.add(SysUserRole.SECTION_MANAGER);
-
-        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()), MessageTypeEnum.BACKSTAGE_TEACHER_AMOUNT_CHANGE, "",
-                teacher.getRealName(), musicGroup.getName(), scope.equals("all") ? "所有" : "本次");
         return true;
     }
 
@@ -2186,8 +2275,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     }
 
     @Override
-    public List<CourseScheduleTeachersDto> queryTeacherSalary(Long courseScheduleId) {
-        return courseScheduleTeacherSalaryDao.queryTeacherSalary(courseScheduleId);
+    public List<CourseScheduleTeachersDto> queryTeacherSalary(Long courseScheduleId,Integer teacherId) {
+        return courseScheduleTeacherSalaryDao.queryTeacherSalary(courseScheduleId, teacherId);
     }
 
     @Override

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

@@ -2026,6 +2026,8 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             student = new Student();
             student.setUserId(practiceGroup.getStudentId());
             student.setSubjectIdList(practiceGroup.getSubjectId().toString());
+            student.setServiceTag(1);
+            student.setOperatingTag(1);
             studentDao.insert(student);
         } else {
             if (Objects.isNull(student.getSubjectIdList())) {

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java

@@ -7,6 +7,7 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
+import com.ym.mec.biz.dal.page.ExportStudentAttendanceQueryInfo;
 import com.ym.mec.biz.dal.page.StudentAttendanceQueryInfo;
 import com.ym.mec.biz.service.StudentAttendanceService;
 import com.ym.mec.biz.service.SysConfigService;
@@ -692,4 +693,24 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
     public void cleanCourseStudentSignOut(Long courseId, Integer userId) {
         studentAttendanceDao.cleanCourseStudentSignOut(courseId, userId);
     }
+
+    @Override
+    public PageInfo<ExportStudentAttendanceDto> exportStudentAttendancesQueryPage(ExportStudentAttendanceQueryInfo queryInfo) {
+        PageInfo<ExportStudentAttendanceDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<ExportStudentAttendanceDto> dataList = null;
+        int count = studentAttendanceDao.countExportStudentAttendancesQueryPage(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = studentAttendanceDao.exportStudentAttendancesQueryPage(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
 }

+ 111 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java

@@ -3,10 +3,7 @@ package com.ym.mec.biz.service.impl;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.CourseHomeworkStudentDetailDto;
-import com.ym.mec.biz.dal.dto.SimpleUserDto;
-import com.ym.mec.biz.dal.dto.StudentCourseHomeworkDto;
-import com.ym.mec.biz.dal.dto.StudentHomeworkRecordDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
@@ -24,6 +21,7 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -49,8 +47,9 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
     @Autowired
     private CourseScheduleDao courseScheduleDao;
     @Autowired
+    private ClassGroupDao classGroupDao;
+    @Autowired
     private SysUserFeignService sysUserFeignService;
-
     @Autowired
     private SysMessageService sysMessageService;
     @Autowired
@@ -58,9 +57,11 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
     @Autowired
     private TeacherDao teacherDao;
     @Autowired
-    private SysConfigDao sysConfigDao;
-    @Autowired
     private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
+    @Autowired
+    private StudentDao studentDao;
+    @Autowired
+    private SubjectDao subjectDao;
 
     @Override
     public BaseDAO<Long, StudentCourseHomework> getDAO() {
@@ -108,8 +109,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         bean = studentCourseHomeworkDao.get(bean.getId());
         CourseSchedule courseSchedule = courseScheduleDao.get(bean.getCourseScheduleId());
 
-        CourseHomework courseHomework = new CourseHomework();
-        courseHomework.setId(bean.getCourseHomeworkId());
+        CourseHomework courseHomework = courseHomeworkDao.get(bean.getCourseHomeworkId());
         courseHomework.setGroupType(courseSchedule.getGroupType());
         courseHomework.setCompletedNum(studentCourseHomeworkDao.countCompletedStudentNum(bean.getCourseHomeworkId()));
         courseHomeworkService.update(courseHomework);
@@ -172,6 +172,17 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
                     null,courseDate,courseSchedule.getName());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.HOMEWORK_SUBMIT_PUSH,
                     userMap, null, 0, notifyUrl, "TEACHER", courseSchedule.getName(), courseDate, user.getUsername());
+
+            Date date = new Date();
+            if(date.before(courseHomework.getExpiryDate())){
+                ClassGroup classGroup = classGroupDao.findByCourseSchedule(existHomework.getCourseScheduleId().intValue(), 0);
+                if(classGroup != null){
+                    SysUser sysUser = sysUserFeignService.queryUserById(existHomework.getUserId());
+                    sysMessageService.batchSendImGroupMessage(MessageTypeEnum.IM_HOMEWORK_SUBMIT_PUSH_GROUP,existHomework.getUserId().toString(),null,
+                            new String[]{classGroup.getId().toString()},
+                            null, sysUser.getUsername());
+                }
+            }
         }
     }
 
@@ -336,4 +347,95 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         pageInfo.setRows(dataList);
         return pageInfo;
     }
+
+    @Override
+    public void add(StudentCourseHomework studentCourseHomework) {
+        studentCourseHomework.setStatus(YesOrNoEnum.YES);
+        studentCourseHomeworkDao.insert(studentCourseHomework);
+        CourseHomework courseHomework = courseHomeworkDao.get(studentCourseHomework.getCourseHomeworkId());
+        Date date = new Date();
+        if(date.before(courseHomework.getExpiryDate())){
+            ClassGroup classGroup = classGroupDao.findByCourseSchedule(studentCourseHomework.getCourseScheduleId().intValue(), 0);
+            if(classGroup != null){
+                SysUser sysUser = sysUserFeignService.queryUserById(studentCourseHomework.getUserId());
+                sysMessageService.batchSendImGroupMessage(MessageTypeEnum.IM_HOMEWORK_SUBMIT_PUSH_GROUP,studentCourseHomework.getUserId().toString(),null,
+                        new String[]{classGroup.getId().toString()},
+                        null, sysUser.getUsername());
+            }
+        }
+    }
+
+    @Override
+    public Map<String, Object> getCourseHomeworkDetail(CourseHomeworkQueryInfo queryInfo) {
+        Map<String, Object> result = new HashMap<>();
+        CourseHomework courseHomework = courseHomeworkDao.findByCourseSchedule(queryInfo.getCourseScheduleId());
+
+        if(Objects.isNull(courseHomework)){
+            result.put("countInfo", null);
+            return result;
+        }
+
+        PageInfo<StudentCourseHomeworkDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<StudentCourseHomework> dataList = new ArrayList<>();
+        List<StudentCourseHomeworkDto> studentCourseHomeworkDtos = new ArrayList<>();
+        int count = studentCourseHomeworkDao.countAll(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = studentCourseHomeworkDao.queryAll(params);
+            Set<Integer> studentIds = dataList.stream().map(StudentCourseHomework::getUserId).collect(Collectors.toSet());
+            List<SimpleUserDto> usersSimpleInfo = teacherDao.getUsersSimpleInfo(new ArrayList<>(studentIds));
+            List<Student> students = studentDao.findByStudentIds(new ArrayList<>(studentIds));
+            Set<Integer> subjectIds = new HashSet<>();
+            for (Student student : students) {
+                if(StringUtils.isBlank(student.getSubjectIdList())){
+                    continue;
+                }
+                Set<Integer> studentSubjectIds = Arrays.stream(student.getSubjectIdList().split(",")).mapToInt(Integer::valueOf).boxed().collect(Collectors.toSet());
+                subjectIds.addAll(studentSubjectIds);
+            }
+            List<Subject> subjects = new ArrayList<>();
+            if(!CollectionUtils.isEmpty(subjectIds)){
+                subjects = subjectDao.findBySubjectIds(new ArrayList<>(subjectIds));
+            }
+            Map<Integer, SimpleUserDto> studentInfoMap = usersSimpleInfo.stream().collect(Collectors.toMap(SimpleUserDto::getUserId, s -> s, (s1, s2) -> s1));
+            Map<Integer, Student> studentMap = students.stream().collect(Collectors.toMap(Student::getUserId, s -> s, (s1, s2) -> s1));
+            for (StudentCourseHomework studentCourseHomework : dataList) {
+                StudentCourseHomeworkDto s = new StudentCourseHomeworkDto();
+                s.setStudentId(studentCourseHomework.getUserId());
+                s.setStudentName(studentInfoMap.containsKey(s.getStudentId())?studentInfoMap.get(s.getStudentId()).getNickName():"");
+                s.setPhone(studentInfoMap.containsKey(s.getStudentId())?studentInfoMap.get(s.getStudentId()).getPhone():"");
+                s.setSubjectIds(studentMap.containsKey(s.getStudentId())?studentMap.get(s.getStudentId()).getSubjectIdList():"");
+                if(StringUtils.isNotBlank(s.getSubjectIds())){
+                    Set<Integer> studentSubjectIds = Arrays.stream(s.getSubjectIds().split(",")).mapToInt(Integer::valueOf).boxed().collect(Collectors.toSet());
+                    List<String> subjectNames = subjects.stream().filter(sj -> studentSubjectIds.contains(sj.getId())).map(Subject::getName).collect(Collectors.toList());
+                    s.setSubjectNames(StringUtils.join(subjectNames, ","));
+                }
+                s.setSubmitTime(studentCourseHomework.getSubmitTime());
+                s.setIsView(studentCourseHomework.getIsView().getCode());
+                s.setIsReplied(studentCourseHomework.getIsReplied().getCode());
+                s.setAttachments(studentCourseHomework.getAttachments());
+                studentCourseHomeworkDtos.add(s);
+            }
+        }
+        pageInfo.setRows(studentCourseHomeworkDtos);
+
+        if(queryInfo.getPage()==1){
+            params.put("isReplied", 1);
+            int repliedNum = studentCourseHomeworkDao.countAll(params);
+            CourseHomeworkDto courseHomeworkDto = new CourseHomeworkDto();
+            courseHomeworkDto.setExpectNum(courseHomework.getExpectNum());
+            courseHomeworkDto.setCompletedNum(courseHomework.getCompletedNum());
+            courseHomeworkDto.setRepliedNum(repliedNum);
+            courseHomeworkDto.setRepliedNum(repliedNum);
+            result.put("countInfo", courseHomeworkDto);
+        }
+
+        result.put("pageInfo", pageInfo);
+
+        return result;
+    }
 }

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

@@ -1,29 +1,78 @@
 package com.ym.mec.biz.service.impl;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.dao.ClassGroupDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupQuitDao;
+import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.StudentExtracurricularExercisesSituationDao;
+import com.ym.mec.biz.dal.dao.StudentManageDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dao.SubjectChangeDao;
+import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.VipGroupDao;
+import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.ConditionDto;
+import com.ym.mec.biz.dal.dto.MusicCardDto;
+import com.ym.mec.biz.dal.dto.MusicGroupStudentSignDto;
+import com.ym.mec.biz.dal.dto.MusicGroupStudentsDto;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.dto.Student4operating;
+import com.ym.mec.biz.dal.dto.StudentListCourseDto;
+import com.ym.mec.biz.dal.dto.StudentManageAccountBaseInfoDto;
+import com.ym.mec.biz.dal.dto.StudentManageBaseInfoOfMusicGroupDto;
+import com.ym.mec.biz.dal.dto.StudentManageCourseListDto;
+import com.ym.mec.biz.dal.dto.StudentManageListDto;
+import com.ym.mec.biz.dal.dto.StudentManageVipGroupClassDto;
+import com.ym.mec.biz.dal.dto.StudentManageVipGroupDto;
+import com.ym.mec.biz.dal.dto.StudentRegisterPerDto;
+import com.ym.mec.biz.dal.dto.UserGoodsDto;
+import com.ym.mec.biz.dal.entity.MusicGroupQuit;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.entity.SubjectChange;
+import com.ym.mec.biz.dal.entity.SysUserCashAccount;
+import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
-import com.ym.mec.biz.dal.page.*;
+import com.ym.mec.biz.dal.page.MusicGroupStudentQueryInfo;
+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.StudentSignQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherPaymentRecordInfo;
 import com.ym.mec.biz.service.StudentManageService;
 import com.ym.mec.biz.service.StudentService;
+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.im.ImFeignService;
 import com.ym.mec.util.collection.MapUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.ss.formula.functions.T;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-
-import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * @Author Joburgess
@@ -71,57 +120,55 @@ public class StudentManageServiceImpl implements StudentManageService {
 
     @Override
     public PageInfo<StudentManageListDto> findStudentsByOrganId(StudentManageQueryInfo queryInfo) {
-        PageInfo<StudentManageListDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-        Boolean hasCourse = queryInfo.getHasCourse();
-        Boolean hasPracticeCourse = queryInfo.getHasPracticeCourse();
-        Map<String, Object> params = new HashMap<>();
+        PageInfo<StudentManageListDto> pageInfo = new PageInfo<StudentManageListDto>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
         MapUtil.populateMap(params, queryInfo);
-        params.put("offset", pageInfo.getOffset());
-        int count = 0;
-        Set<Integer> paramUserIds = null;
-        if (hasPracticeCourse != null) {
-            //是否有陪练课
-            if (hasPracticeCourse) {
-                paramUserIds = studentManageDao.queryHasPracticeCourse(params);
-            } else {
-                paramUserIds = studentManageDao.queryNotPracticeCourse(params);
-            }
-            if (paramUserIds.size() == 0) {
-                return pageInfo;
-            }
-            params.put("userIds", paramUserIds);
-        }
-        if (hasCourse != null) {
-            if (hasCourse) {
-                paramUserIds = studentManageDao.queryHasCourse(params);
-                count = studentManageDao.countHasCourse(params);
-            } else {
-                paramUserIds = studentManageDao.queryNotCourse(params);
-                count = studentManageDao.countNotCourse(params);
-            }
-            if (paramUserIds.size() == 0) {
-                return pageInfo;
-            }
-            params.remove("offset");
-            params.put("userIds", paramUserIds);
-        } else {
-            count = studentManageDao.countStudentByOrganId(params);
-        }
-        if (queryInfo.getIsExport() && count > 50000) {
-            throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
-        }
+
         List<StudentManageListDto> dataList = null;
+        int count = studentManageDao.countStudentByOrganId(params);
         if (count > 0) {
             pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
             dataList = studentManageDao.findStudentsByOrganId(params);
-            Set<Integer> userIds = dataList.stream().map(StudentManageListDto::getUserId).collect(Collectors.toSet());
-            Set<Integer> organIds = dataList.stream().map(StudentManageListDto::getOrganId).collect(Collectors.toSet());
-            List<SysUserCashAccount> byUserIds = sysUserCashAccountDao.findByUserIds(userIds);
-            Map<Integer, SysUserCashAccount> collect = byUserIds.stream()
-                    .collect(Collectors.toMap(SysUserCashAccount::getUserId, sysUserCashAccount -> sysUserCashAccount));
-            Map<Integer, Integer> hasPracticeCourseMap = MapUtil.convertIntegerMap(studentManageDao.getHasPracticeCourse(userIds));
-            //获取用户分部
-            Map<Integer, String> organNames = MapUtil.convertMybatisMap(organizationDao.findOrganNameMapList(organIds));
+        }
+        if (dataList == null) {
+            dataList = new ArrayList<StudentManageListDto>();
+        }
+        pageInfo.setRows(dataList);
+
+        if (dataList.size() == 0) {
+            return pageInfo;
+        }
+
+        Set<Integer> userIds = dataList.stream().map(StudentManageListDto::getUserId).collect(Collectors.toSet());
+
+        List<StudentListCourseDto> studentListCourseDtoList = studentManageDao.queryStudentRemianCourse(userIds);
+        Map<Integer, StudentListCourseDto> StudentListCourseDtoMap = studentListCourseDtoList.stream().collect(Collectors.toMap(StudentListCourseDto::getUserId, studentListCourseDto -> studentListCourseDto));
+
+        StudentListCourseDto studentListCourseDto = null;
+        for (StudentManageListDto dto : dataList) {
+            studentListCourseDto = StudentListCourseDtoMap.get(dto.getUserId());
+            if (studentListCourseDto != null) {
+                if (studentListCourseDto.getRemainCourseNum() > 0) {
+                    dto.setHasCourse(YesOrNoEnum.YES);
+                } else {
+                    dto.setHasCourse(YesOrNoEnum.NO);
+                }
+                if (studentListCourseDto.getRemainPracticeNum() > 0) {
+                    dto.setHasPracticeCourse(YesOrNoEnum.YES);
+                } else {
+                    dto.setHasPracticeCourse(YesOrNoEnum.NO);
+                }
+            } else {
+                dto.setHasCourse(YesOrNoEnum.NO);
+                dto.setHasPracticeCourse(YesOrNoEnum.NO);
+            }
+        }
+
+        if (queryInfo.getIsExport()) {
+            if (count > 50000) {
+                throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
+            }
             //获取所在乐团
             Map<Integer, String> musicGroupNames = MapUtil.convertMybatisMap(musicGroupDao.queryUserMusicNames(userIds));
             //获取所在vip
@@ -130,37 +177,14 @@ public class StudentManageServiceImpl implements StudentManageService {
             Map<Integer, String> musicGroupStatus = MapUtil.convertMybatisMap(musicGroupDao.queryUserMusicStatus(userIds));
             //获取所在vip状态
             Map<Integer, String> vipGroupStatus = MapUtil.convertMybatisMap(vipGroupDao.queryUserVipStatus(userIds));
-            //获取所在声部
-            Map<Integer, String> subjectNames = MapUtil.convertMybatisMap(studentManageDao.querySubjectNames(userIds));
-            //学员是否有课
-            Map<Integer, Integer> hasCourseMap = MapUtil.convertMybatisMap(studentManageDao.queryHasCourseMap(userIds));
+
             dataList.forEach(e -> {
-                e.setOrganName(organNames.get(e.getOrganId()));
                 e.setMusicGroupName(musicGroupNames.get(e.getUserId().longValue()));
                 e.setVipGroupName(vipGroupNames.get(e.getUserId()));
-                e.setSubjectName(subjectNames.get(e.getUserId().longValue()));
                 e.setMusicGroupStatus(musicGroupStatus.get(e.getUserId().longValue()));
                 e.setVipGroupStatus(vipGroupStatus.get(e.getUserId()));
-                e.setHasCourse(hasCourseMap.get(e.getUserId()) == null ? YesOrNoEnum.NO : YesOrNoEnum.YES);
-                /*if(hasCourse == null){
-                    Integer course = studentManageDao.getHasCourse(e.getUserId());
-                    e.setHasCourse(course==null?YesOrNoEnum.NO:course==0?YesOrNoEnum.NO:YesOrNoEnum.YES);
-                }else {
-                    if(hasCourse){
-                        e.setHasCourse(YesOrNoEnum.YES);
-                    }else {
-                        e.setHasCourse(YesOrNoEnum.NO);
-                    }
-                }*/
-                e.setHasPracticeCourse(hasPracticeCourseMap.get(e.getUserId()) == null ? YesOrNoEnum.NO : YesOrNoEnum.YES);
-                if (collect.get(e.getUserId()) != null) {
-                    e.setCourseBalance(collect.get(e.getUserId()).getCourseBalance());
-                }
             });
         }
-        if (count == 0) {
-            dataList = new ArrayList<>();
-        }
         pageInfo.setRows(dataList);
         return pageInfo;
     }
@@ -351,6 +375,18 @@ public class StudentManageServiceImpl implements StudentManageService {
             pageInfo.setTotal(count);
             params.put("offset", pageInfo.getOffset());
             dataList = studentManageDao.queryMusicGroupStudent(params);
+            //退团的学生
+            List<Integer> quitUserIds = dataList.stream().filter(e -> e.getStudentStatus().equals("QUIT")).map(MusicGroupStudentsDto::getUserId).collect(Collectors.toList());
+
+            if (quitUserIds.size() > 0) {
+                List<MusicGroupQuit> quits = musicGroupQuitDao.getQuits(queryInfo.getMusicGroupId(), quitUserIds);
+                for (MusicGroupStudentsDto musicGroupStudentsDto : dataList) {
+                    for (MusicGroupQuit quit : quits) {
+                        if (!quit.getUserId().equals(musicGroupStudentsDto.getUserId())) continue;
+                        musicGroupStudentsDto.setQuitReason(quit.getReason());
+                    }
+                }
+            }
 //            Map<Integer,String> maps = MapUtil.convertIntegerMap(musicGroupStudentFeeDao.findPaymentStatusMap(queryInfo.getMusicGroupId()));
 //            dataList.forEach(e->{
 //                e.setPaymentStatus(maps.get(e.getUserId()));
@@ -441,56 +477,63 @@ public class StudentManageServiceImpl implements StudentManageService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public int studentRegister(SysUser sysUser) {
-        if (sysUser == null || StringUtils.isEmpty(sysUser.getPhone())) {
+    public int studentRegister(Student student) {
+        if (student == null || StringUtils.isEmpty(student.getPhone())) {
             throw new BizException("参数校验失败");
         }
-        SysUser sysUser1 = sysUserFeignService.queryUserByMobile(sysUser.getPhone());
-        if (sysUser1 != null) {
-            if (sysUser1.getUserType().contains("STUDENT")) {
+        Date date = new Date();
+        SysUser sysUser = sysUserFeignService.queryUserByMobile(student.getPhone());
+        if (sysUser != null) {
+            if (sysUser.getUserType().contains("STUDENT")) {
                 throw new BizException("手机号已被占用");
             } else {
-                sysUser.setId(sysUser1.getId());
-                sysUser.setUserType(sysUser1.getUserType() + ",STUDENT");
-                teacherDao.updateUser(sysUser);
-                return sysUser1.getId();
+                student.setId(sysUser.getId());
+                student.setUserType(sysUser.getUserType() + ",STUDENT");
+                student.setUpdateTime(date);
+                sysUserFeignService.updateSysUser(student);
             }
+        } else {
+            student.setUpdateTime(date);
+            student.setCreateTime(date);
+            student.setUserType("STUDENT");
+            student.setServiceTag(1);
+            student.setOperatingTag(1);
+            HttpResponseResult<Integer> result = sysUserFeignService.addUser(student);
+            student.setId(result.getData());
+
+            ImResult register = imFeignService.register(new ImUserModel(student.getId().toString(), student.getPhone(), null));
+            student.setImToken(register.getToken());
+            sysUserFeignService.updateSysUser(student);
+
+            sysUserCashAccountDao.insert(new SysUserCashAccount(student.getId(), "CNY"));
         }
-        sysUser.setUserType("STUDENT");
-        teacherDao.addSysUser(sysUser);
-        Integer userId = sysUser.getId();
-        ImResult register = imFeignService.register(new ImUserModel(userId.toString(), sysUser.getPhone(), null));
-        sysUser.setImToken(register.getToken());
-        teacherDao.updateUser(sysUser);
-        sysUserCashAccountDao.insert(new SysUserCashAccount(userId, "CNY"));
-        Student student = new Student(userId, studentRegistrationDao.getSubjectIds(userId));
-        student.setOperatingTag(sysUser.getOperatingTag());
-        student.setServiceTag(sysUser.getServiceTag());
-        student.setTeacherId(sysUser.getTeacherId());
+        student.setUserId(student.getId());
+
         studentService.upSet(student);
-        return userId;
+        return student.getId();
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public int studentUpdate(SysUser sysUser) {
-        Integer userId = sysUser.getId();
-        if (userId == null || StringUtils.isEmpty(sysUser.getPhone())) {
+    public int studentUpdate(Student student) {
+        Integer userId = student.getId();
+        if (userId == null || StringUtils.isEmpty(student.getPhone())) {
             throw new BizException("参数校验失败");
         }
-        SysUser sysUser1 = sysUserFeignService.queryUserByMobile(sysUser.getPhone());
+        SysUser sysUser1 = sysUserFeignService.queryUserByMobile(student.getPhone());
         if (sysUser1 != null && !userId.equals(sysUser1.getId())) {
             throw new BizException("手机号已被占用");
         }
-        teacherDao.updateUser(sysUser);
-        Student student = new Student(userId, studentRegistrationDao.getSubjectIds(userId));
-        student.setOperatingTag(sysUser.getOperatingTag());
+        sysUserFeignService.updateSysUser(student);
+
+        student.setUserId(student.getId());
+        student.setOperatingTag(student.getOperatingTag());
         student.setOperatingTempTag(0);
-        student.setServiceTag(sysUser.getServiceTag() == 0 ? 2 : 1);
-        student.setTeacherId(sysUser.getTeacherId());
+        student.setServiceTag(student.getServiceTag() == 0 ? 2 : 1);
+        student.setTeacherId(student.getTeacherId());
         studentService.upSet(student);
         if (new Integer(2).equals(student.getServiceTag())) {
-            studentExtracurricularExercisesSituationDao.deleteByStudent(sysUser.getId());
+            studentExtracurricularExercisesSituationDao.deleteByStudent(student.getId());
         }
         return userId;
     }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+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.dao.SysMessageDao;
@@ -192,6 +193,27 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		imFeignService.privateSend(privateMessage);
 	}
 
+	@Override
+	@Async
+	public void batchSendImGroupMessage(MessageTypeEnum type, String senderId,String extra, String[] targetIds, String url, Object... args) {
+		SysMessageConfig messageConfig = sysMessageConfigService.queryByType(type);
+		if (messageConfig == null) {
+			throw new BizException("消息类型错误");
+		}else if(messageConfig.getSendFlag() == null || messageConfig.getSendFlag() == 0){
+			return;
+		}
+		String content = MessageFormatter.arrayFormat(messageConfig.getContent(), args);
+		if(StringUtils.isNotEmpty(url)){
+			content += url;
+		}
+		ImGroupMessage groupMessage = new ImGroupMessage();
+		groupMessage.setObjectName("RC:TxtMsg");
+		groupMessage.setTargetId(targetIds);
+		groupMessage.setSenderId(senderId);
+		groupMessage.setContent(new ImTxtMessage(content,extra));
+		imFeignService.groupSend(groupMessage);
+	}
+
 	/*@Override
 	public void batchSendImPlayMidiMessage(String senderId,String roomId, String content) {
 		ImGroupMessage groupMessage = new ImGroupMessage();

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

@@ -26,5 +26,10 @@ public class SysUserContractsServiceImpl extends BaseServiceImpl<Long, SysUserCo
 	public List<SysUserContracts> getUserContractWithType(Integer userId, SysUserContracts.ContractType contractType) {
 		return sysUserContractsDao.getUserContractWithType(userId, contractType);
 	}
+
+	@Override
+	public SysUserContracts getLatestUserContract(Integer userId) {
+		return sysUserContractsDao.getLatestUserContract(userId);
+	}
 	
 }

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

@@ -236,17 +236,7 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 
     @Override
     public List<TeacherBasicDto> findTeachers(String organId) {
-		List<Teacher> teacherList = teacherDao.findByFlowOrganRange(null);
-		if(StringUtils.isNotEmpty(organId)){
-			Set<String> list = new HashSet<>(Arrays.asList(organId.split(",")));
-			teacherList = teacherList.stream().
-					filter(teacher -> !Collections.disjoint(new ArrayList<>(Arrays.asList(teacher.getFlowOrganRange().split(","))),list)).collect(Collectors.toList());
-		}
-		List<Integer> userIds = teacherList.stream().map(e -> e.getId()).collect(Collectors.toList());
-		if(userIds != null && userIds.size() > 0){
-			return teacherDao.findTeachers(userIds);
-		}
-		return new ArrayList<>();
+		return teacherDao.findByFlowOrganRangeTeachers(organId);
     }
 
 	@Override
@@ -422,21 +412,6 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 	public PageInfo<Teacher> queryPageDetail(TeacherQueryInfo queryInfo) {
 		Map<String, Object> params = new HashMap<>();
 		MapUtil.populateMap(params, queryInfo);
-		List<Teacher> teacherList = teacherDao.findByFlowOrganRange(params);
-		if(teacherList == null || teacherList.size() < 1){
-			return new PageInfo<>();
-		}
-		if(StringUtils.isNotEmpty(queryInfo.getOrganId())){
-			Set<String> list = new HashSet<>(Arrays.asList(queryInfo.getOrganId().split(",")));
-			teacherList = teacherList.stream().
-					filter(teacher -> !Collections.disjoint(new ArrayList<>(Arrays.asList(teacher.getFlowOrganRange().split(","))),list)).collect(Collectors.toList());
-		}
-		List<Integer> collect = teacherList.stream().map(e -> e.getId()).collect(Collectors.toList());
-		if(collect == null || collect.size() < 1){
-			return new PageInfo<>();
-		}
-		queryInfo.setTeacherId(collect);
-
 		PageInfo<Teacher> pageInfo = queryPage(queryInfo);
 		List<Teacher> rows = pageInfo.getRows();
 		if(rows != null && rows.size() > 0){

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

@@ -185,11 +185,9 @@
             course_schedule_student_payment cssp
             LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
             LEFT JOIN student_attendance sa ON cssp.course_schedule_id_ = sa.course_schedule_id_ AND cssp.user_id_ = sa.user_id_
-            LEFT JOIN class_group_student_mapper cgsm ON cssp.user_id_=cgsm.user_id_ AND cssp.class_group_id_=cgsm.class_group_id_
         WHERE
             cssp.course_schedule_id_ =#{courseScheduleId}
             AND su.id_ IS NOT NULL
-            AND cgsm.status_!='QUIT'
     </select>
 
     <select id="findStudentByCourseWithPage" resultMap="com.ym.mec.biz.dal.dao.StudentAttendanceDao.studentAttendanceViewUtilEntity">

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

@@ -117,7 +117,7 @@
         <where>
             del_flag_ != 1
             <if test="search != null">
-                AND organ_id_ = #{search}
+                AND (id_ LIKE CONCAT('%',#{search},'%') OR name_ LIKE CONCAT('%',#{search},'%'))
             </if>
 	        <if test="organId != null">
 	            AND FIND_IN_SET(organ_id_,#{organId})

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

@@ -238,7 +238,82 @@
 		where cs.del_flag_ = 0 AND cs.actual_teacher_id_ IS NOT NULL
 		AND sch.is_replied_ = 0 group by cs.actual_teacher_id_
 	</select>
-	
+
+	<resultMap id="WebCourseHomeworkListDtoMap" type="com.ym.mec.biz.dal.dto.WebCourseHomeworkListDto">
+		<result property="organName" column="organ_name_"/>
+		<result property="organId" column="organ_id_"/>
+		<result property="groupType" column="group_type_"/>
+		<result property="groupName" column="group_name_"/>
+		<result property="groupId" column="group_id_"/>
+		<result property="courseScheduleName" column="course_schedule_name_"/>
+		<result property="courseScheduleId" column="course_schedule_id_"/>
+		<result property="actualTeacherName" column="actual_teacher_name_"/>
+		<result property="actualTeacherId" column="actual_teacher_id_"/>
+		<result property="completedNum" column="completed_num_"/>
+		<result property="createTime" column="create_time_"/>
+		<result property="expectNum" column="expect_num_"/>
+		<result property="id" column="id_"/>
+		<result property="classDate" column="class_date_"/>
+		<result property="classStartDate" column="start_class_time_"/>
+		<result property="classEndDate" column="end_class_time_"/>
+	</resultMap>
+    <select id="queryHomePage" resultMap="WebCourseHomeworkListDtoMap">
+		SELECT ch.id_,cs.id_ course_schedule_id_,cs.name_ course_schedule_name_,
+		cs.class_date_,cs.start_class_time_,cs.end_class_time_,cs.organ_id_,o.name_ organ_name_,
+		mg.id_ group_id_,mg.name_ group_name_,ch.create_time_,cs.actual_teacher_id_,
+		su.real_name_ actual_teacher_name_,ch.completed_num_,ch.expect_num_,cs.group_type_
+		FROM course_homework ch
+		LEFT JOIN course_schedule cs ON cs.id_ = ch.course_schedule_id_
+		LEFT JOIN organization o ON o.id_ = cs.organ_id_
+		<if test="groupType == 'MUSIC'">
+			LEFT JOIN music_group mg ON mg.id_ = cs.music_group_id_
+		</if>
+		<if test="groupType == 'VIP'">
+			LEFT JOIN vip_group mg ON mg.id_ = cs.music_group_id_
+		</if>
+		<if test="groupType == 'PRACTICE'">
+			LEFT JOIN practice_group mg ON mg.id_ = cs.music_group_id_
+		</if>
+		LEFT JOIN sys_user su ON su.id_ = cs.actual_teacher_id_
+		<include refid="queryHomePageSql"/>
+		ORDER BY ch.create_time_ DESC,ch.id_ DESC
+		<include refid="global.limit"/>
+	</select>
+	<sql id="queryHomePageSql">
+		<where>
+			cs.group_type_ = #{groupType}
+			<if test="organId != null">
+				AND FIND_IN_SET(cs.organ_id_,#{organId})
+			</if>
+			<if test="classStartDate != null and classStartDate != ''">
+				AND cs.class_date_ >= #{classStartDate}
+			</if>
+			<if test="classEndDate != null and classEndDate != ''">
+				AND cs.class_date_ &lt;= #{classEndDate}
+			</if>
+			<if test="search != null and search != ''">
+				AND (cs.id_ = #{search} OR cs.name_ LIKE CONCAT('%',#{search},'%')
+				OR mg.name_ LIKE CONCAT('%',#{search},'%') OR mg.id_ = #{search})
+			</if>
+		</where>
+	</sql>
+	<select id="findHomeCount" resultType="java.lang.Integer">
+		SELECT COUNT(ch.id_)
+		FROM course_homework ch
+		LEFT JOIN course_schedule cs ON cs.id_ = ch.course_schedule_id_
+		LEFT JOIN organization o ON o.id_ = cs.organ_id_
+		<if test="groupType == 'MUSIC'">
+			LEFT JOIN music_group mg ON mg.id_ = cs.music_group_id_
+		</if>
+		<if test="groupType == 'VIP'">
+			LEFT JOIN vip_group mg ON mg.id_ = cs.music_group_id_
+		</if>
+		<if test="groupType == 'PRACTICE'">
+			LEFT JOIN practice_group mg ON mg.id_ = cs.music_group_id_
+		</if>
+		<include refid="queryHomePageSql"/>
+	</select>
+
 	<delete id="delByCourseScheduleId" >
 		DELETE FROM course_homework WHERE course_schedule_id_ = #{courseScheduleId} 
 	</delete>

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

@@ -2288,7 +2288,7 @@
         COUNT(DISTINCT cs.id_)
         FROM
         course_schedule cs
-        LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_
+        LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_ AND sa.remark_ IS NULL
         <include refid="endFindCourseSchedulesCondition"/>
     </select>
     <select id="findCourseIdsByStudent" resultType="int">
@@ -2849,7 +2849,7 @@
         FROM course_schedule
         WHERE group_type_ = #{groupType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
           AND music_group_id_ = #{groupId}
-          AND CONCAT(class_date_, ' ', end_class_time_) &gt; NOW()
+          AND CONCAT(class_date_, ' ', start_class_time_) &gt; NOW()
     </select>
     <select id="getSubjectNameById" resultType="java.lang.String">
         SELECT GROUP_CONCAT(DISTINCT s.name_)

+ 35 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -507,4 +507,39 @@
 			AND cssp.music_group_id_ = #{groupId}
 			AND CONCAT( cs.class_date_, ' ', cs.start_class_time_ ) > NOW( )
 	</select>
+
+	<select id="findStudentLastCourseSchedule" resultType="java.util.Map">
+		SELECT
+			cssp.user_id_ AS 'key',
+			MAX(CONCAT( cs.class_date_, ' ', cs.start_class_time_ )) AS 'value'
+		FROM
+			course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cssp.course_schedule_id_ = cs.id_
+		WHERE
+			cssp.user_id_ IN
+			<foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+				#{studentId}
+			</foreach>
+			AND CONCAT( cs.class_date_, ' ', cs.start_class_time_ ) &lt; NOW( )
+		GROUP BY user_id_;
+	</select>
+
+	<sql id="queryAllCondition">
+		<where>
+			<if test="courseScheduleId != null">
+				course_schedule_id_ = #{courseScheduleId}
+			</if>
+		</where>
+	</sql>
+
+	<select id="queryAll" resultMap="CourseScheduleStudentPayment">
+		SELECT * FROM course_schedule_student_payment
+		<include refid="queryAllCondition" />
+		ORDER BY id_
+		<include refid="global.limit"/>
+	</select>
+	<select id="countAll" resultType="int">
+		SELECT COUNT(*) FROM course_schedule_student_payment
+		<include refid="queryAllCondition" />
+	</select>
 </mapper>

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

@@ -380,6 +380,9 @@
 		FROM course_schedule_teacher_salary csts
 		LEFT JOIN sys_user su ON su.id_ = csts.user_id_
 		WHERE csts.course_schedule_id_ = #{courseScheduleId}
+			<if test="teacherId!=null">
+				AND csts.user_id_ = #{teacherId}
+			</if>
 	</select>
 	<select id="findByCourseSchedules" resultMap="CourseScheduleTeacherSalary">
 		SELECT * FROM  course_schedule_teacher_salary WHERE course_schedule_id_ IN

+ 104 - 85
mec-biz/src/main/resources/config/mybatis/MusicGroupQuitMapper.xml

@@ -3,97 +3,116 @@
 <!-- 这个文件是自动生成的。 不要修改此文件。所有改动将在下次重新自动生成时丢失。 -->
 <mapper namespace="com.ym.mec.biz.dal.dao.MusicGroupQuitDao">
 
-	<resultMap type="com.ym.mec.biz.dal.entity.MusicGroupQuit"
-		id="MusicGroupQuit">
-		<result column="id_" property="id" />
-		<result column="user_id_" property="userId" />
-		<result column="music_group_id_" property="musicGroupId" />
-		<result column="join_date_" property="joinDate" />
-		<result column="quit_date_" property="quitDate" />
-		<result column="create_time_" property="createTime" />
-		<result column="reason_" property="reason" />
-		<result column="status_" property="status"
-			typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
-	</resultMap>
+    <resultMap type="com.ym.mec.biz.dal.entity.MusicGroupQuit"
+               id="MusicGroupQuit">
+        <result column="id_" property="id"/>
+        <result column="user_id_" property="userId"/>
+        <result column="music_group_id_" property="musicGroupId"/>
+        <result column="join_date_" property="joinDate"/>
+        <result column="quit_date_" property="quitDate"/>
+        <result column="create_time_" property="createTime"/>
+        <result column="reason_" property="reason"/>
+        <result column="status_" property="status"
+                typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+    </resultMap>
 
-	<!-- 根据主键查询一条记录 -->
-	<select id="get" resultMap="MusicGroupQuit">
-		SELECT * FROM
-		music_group_quit WHERE id_ = #{id}
-	</select>
+    <!-- 根据主键查询一条记录 -->
+    <select id="get" resultMap="MusicGroupQuit">
+        SELECT *
+        FROM music_group_quit
+        WHERE id_ = #{id}
+    </select>
 
-	<!-- 全查询 -->
-	<select id="findAll" resultMap="MusicGroupQuit">
-		SELECT * FROM music_group_quit
-		ORDER BY id_
-	</select>
+    <!-- 全查询 -->
+    <select id="findAll" resultMap="MusicGroupQuit">
+        SELECT *
+        FROM music_group_quit
+        ORDER BY id_
+    </select>
 
-	<!-- 向数据库增加一条记录 -->
-	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.MusicGroupQuit"
-		useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		<!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval 
-			AS ID FROM DUAL </selectKey> -->
-		INSERT INTO music_group_quit
-		(id_,user_id_,music_group_id_,join_date_,quit_date_,create_time_,reason_,status_)
-		VALUES(#{id},#{userId},#{musicGroupId},#{joinDate},#{quitDate},#{createTime},#{reason},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
-	</insert>
+    <!-- 向数据库增加一条记录 -->
+    <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.MusicGroupQuit"
+            useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+        <!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval
+            AS ID FROM DUAL </selectKey> -->
+        INSERT INTO music_group_quit
+        (id_,user_id_,music_group_id_,join_date_,quit_date_,create_time_,reason_,status_)
+        VALUES(#{id},#{userId},#{musicGroupId},#{joinDate},#{quitDate},#{createTime},#{reason},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
+    </insert>
 
-	<!-- 根据主键查询一条记录 -->
-	<update id="update" parameterType="com.ym.mec.biz.dal.entity.MusicGroupQuit">
-		UPDATE music_group_quit
-		<set>
-			<if test="userId != null">
-				user_id_ = #{userId},
-			</if>
-			<if test="id != null">
-				id_ = #{id},
-			</if>
-			<if test="joinDate != null">
-				join_date_ = #{joinDate},
-			</if>
-			<if test="reason != null">
-				reason_ = #{reason},
-			</if>
-			<if test="quitDate != null">
-				quit_date_ = #{quitDate},
-			</if>
-			<if test="musicGroupId != null">
-				music_group_id_ = #{musicGroupId},
-			</if>
-			<if test="createTime != null">
-				create_time_ = #{createTime},
-			</if>
-			<if test="status != null">
-				status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-			</if>
-		</set>
-		WHERE id_ = #{id}
-	</update>
+    <!-- 根据主键查询一条记录 -->
+    <update id="update" parameterType="com.ym.mec.biz.dal.entity.MusicGroupQuit">
+        UPDATE music_group_quit
+        <set>
+            <if test="userId != null">
+                user_id_ = #{userId},
+            </if>
+            <if test="id != null">
+                id_ = #{id},
+            </if>
+            <if test="joinDate != null">
+                join_date_ = #{joinDate},
+            </if>
+            <if test="reason != null">
+                reason_ = #{reason},
+            </if>
+            <if test="quitDate != null">
+                quit_date_ = #{quitDate},
+            </if>
+            <if test="musicGroupId != null">
+                music_group_id_ = #{musicGroupId},
+            </if>
+            <if test="createTime != null">
+                create_time_ = #{createTime},
+            </if>
+            <if test="status != null">
+                status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            </if>
+        </set>
+        WHERE id_ = #{id}
+    </update>
 
-	<!-- 根据主键删除一条记录 -->
-	<delete id="delete">
-		DELETE FROM music_group_quit WHERE id_ =
-		#{id}
-	</delete>
+    <!-- 根据主键删除一条记录 -->
+    <delete id="delete">
+        DELETE
+        FROM music_group_quit
+        WHERE id_ =
+              #{id}
+    </delete>
 
-	<!-- 分页查询 -->
-	<select id="queryPage" resultMap="MusicGroupQuit" parameterType="map">
-		SELECT * FROM music_group_quit ORDER BY id_
-		<include refid="global.limit" />
-	</select>
+    <!-- 分页查询 -->
+    <select id="queryPage" resultMap="MusicGroupQuit" parameterType="map">
+        SELECT * FROM music_group_quit ORDER BY id_
+        <include refid="global.limit"/>
+    </select>
 
-	<!-- 查询当前表的总记录数 -->
-	<select id="queryCount" resultType="int">
-		SELECT COUNT(*) FROM
-		music_group_quit
-	</select>
-	<select id="countMusicGroupQuitNum" resultType="int">
-		SELECT COUNT( * )
-		FROM music_group_quit
-		WHERE music_group_id_=#{musicGroupId} AND status_='APPROVED'
-	</select>
+    <!-- 查询当前表的总记录数 -->
+    <select id="queryCount" resultType="int">
+        SELECT COUNT(*)
+        FROM music_group_quit
+    </select>
+    <select id="countMusicGroupQuitNum" resultType="int">
+        SELECT COUNT(*)
+        FROM music_group_quit
+        WHERE music_group_id_ = #{musicGroupId}
+          AND status_ = 'APPROVED'
+    </select>
 
-	<select id="getUserMusicQuit" resultMap="MusicGroupQuit">
-		SELECT * FROM music_group_quit WHERE user_id_=#{userId} AND status_='APPROVED' ORDER BY id_ ASC
-	</select>
+    <select id="getUserMusicQuit" resultMap="MusicGroupQuit">
+        SELECT *
+        FROM music_group_quit
+        WHERE user_id_ = #{userId}
+          AND status_ = 'APPROVED'
+        ORDER BY id_ ASC
+    </select>
+
+    <select id="getQuits" resultMap="MusicGroupQuit">
+        SELECT * FROM music_group_quit WHERE id_ IN (
+        SELECT MAX(id_) FROM music_group_quit WHERE music_group_id_=#{musicGroupId} AND user_id_ IN
+        <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
+            #{userId}
+        </foreach>
+        GROUP BY user_id_
+        )
+    </select>
 </mapper>

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

@@ -481,7 +481,7 @@
         FROM student_payment_order spo
                  LEFT JOIN sell_order so on so.order_id_ = spo.id_
         WHERE spo.status_ = 'SUCCESS'
-          AND spo.group_type_ ='GOODS_SELL'
+          AND spo.group_type_ = 'GOODS_SELL'
           AND spo.create_time_ >= #{startTime}
           AND spo.create_time_ <= #{endTime}
         GROUP BY spo.organ_id_, so.cooperation_organ_id_
@@ -586,4 +586,14 @@
             #{sellOrderId}
         </foreach>
     </select>
+
+    <select id="getFeeByType" resultType="com.ym.mec.biz.dal.dto.StudentPaymentOrderExportDto">
+        SELECT MAX(spo.expect_amount_)                                expectAmount,
+               SUM(IF(g.type_ = 'INSTRUMENT', so.expect_amount_, 0))  musicalFee,
+               SUM(IF(g.type_ != 'INSTRUMENT', so.expect_amount_, 0)) teachingFee
+        FROM student_payment_order spo
+                 LEFT JOIN sell_order so ON spo.id_ = so.order_id_
+                 LEFT JOIN goods g ON g.id_ = so.goods_id_
+        WHERE spo.id_ = #{orderId}
+    </select>
 </mapper>

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

@@ -473,7 +473,7 @@
             GROUP BY sa.course_schedule_id_
     </select>
     <select id="findStudentAttendance" resultMap="StudentAttendance">
-        SELECT sa.*,su.username_,su.phone_,IF(s.name_ IS NULL,s1.name_,s.name_) subject_name_,su.avatar_
+        SELECT cssp.user_id_,sa.*,su.username_,su.phone_,IF(s.name_ IS NULL,s1.name_,s.name_) subject_name_,su.avatar_
         FROM course_schedule_student_payment cssp
         LEFT JOIN student_attendance sa ON cssp.course_schedule_id_ = sa.course_schedule_id_ AND cssp.user_id_ = sa.user_id_
         LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
@@ -515,4 +515,79 @@
         WHERE sa.current_schedule_id_ = #{courseScheduleId} AND sa.user_id_ = #{userId}
         AND sa.sign_in_time_ IS NOT NULL ORDER BY sa.sign_in_time_ ASC LIMIT 1
     </select>
+    <resultMap id="ExportStudentAttendanceDtoMap" type="com.ym.mec.biz.dal.dto.ExportStudentAttendanceDto">
+        <result property="classDate" column="class_date_"/>
+        <result property="courseScheduleId" column="course_schedule_id_"/>
+        <result property="courseScheduleName" column="course_schedule_name_"/>
+        <result property="educationalTeacherId" column="educational_teacher_id_"/>
+        <result property="educationalTeacherName" column="educational_teacher_name_"/>
+        <result property="actualTeacherId" column="actual_teacher_id_"/>
+        <result property="actualTeacherName" column="actual_teacher_name_"/>
+        <result property="endClassTime" column="end_class_time_"/>
+        <result property="groupId" column="music_group_id_"/>
+        <result property="groupName" column="music_group_name_"/>
+        <result property="groupType" column="group_type_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="guideTeacherId" column="guide_teacher_id_"/>
+        <result property="guideTeacherName" column="guide_teacher_name_"/>
+        <result property="organId" column="organ_id_"/>
+        <result property="organName" column="organ_name_"/>
+        <result property="startClassTime" column="start_class_time_"/>
+        <result property="studentAttendanceStatus" column="attendance_status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="userId" column="user_id_"/>
+        <result property="username" column="username_"/>
+    </resultMap>
+    <select id="countExportStudentAttendancesQueryPage" resultType="java.lang.Integer">
+        SELECT COUNT(cssp.id_)
+        FROM course_schedule_student_payment cssp
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+        <include refid="exportStudentAttendancesQueryPageSql"/>
+    </select>
+    <sql id="exportStudentAttendancesQueryPageSql">
+        <where>
+            <if test="organId != null and organId != ''">
+                AND FIND_IN_SET(cs.organ_id_,#{organId})
+            </if>
+            <if test="groupType != null">
+                AND cssp.group_type_ = #{groupType}
+            </if>
+            <if test="classStartDate != null and classStartDate != ''">
+                AND cs.class_date_ >= #{classStartDate}
+            </if>
+            <if test="classEndDate != null and classEndDate != ''">
+                AND cs.class_date_ &lt;= #{classEndDate}
+            </if>
+        </where>
+    </sql>
+    <select id="exportStudentAttendancesQueryPage"
+            resultMap="ExportStudentAttendanceDtoMap">
+        SELECT MAX(o.name_) organ_name_,MAX(o.id_) organ_id_,MAX(cs.music_group_id_) music_group_id_,MAX(mg.name_) music_group_name_,MAX(su.username_) username_,MAX(cssp.user_id_) user_id_,
+        MAX(cs.name_) course_schedule_name_,MAX(cs.id_) course_schedule_id_,
+        MAX(cs.class_date_) class_date_,MAX(cs.start_class_time_) start_class_time_,MAX(cs.end_class_time_) end_class_time_,
+        MAX(su2.real_name_) guide_teacher_name_,MAX(st.teacher_id_) guide_teacher_id_
+        ,MAX(su1.real_name_) educational_teacher_name_,MAX(mg.educational_teacher_id_) educational_teacher_id_,MAX(cs.group_type_) group_type_,
+        MAX(cs.actual_teacher_id_) actual_teacher_id_,MAX(su3.real_name_) actual_teacher_name_,
+        CASE WHEN MAX(sa.id_) IS NULL THEN 'TRUANT' ELSE MAX(sa.status_) END attendance_status_
+        FROM course_schedule_student_payment cssp
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+        LEFT JOIN student_attendance sa ON cssp.course_schedule_id_ = sa.course_schedule_id_ AND sa.user_id_ = cssp.user_id_
+        <if test="groupType == 'MUSIC'">
+            LEFT JOIN music_group mg ON mg.id_ = cssp.music_group_id_
+        </if>
+        <if test="groupType == 'VIP'">
+            LEFT JOIN vip_group mg ON mg.id_ = cssp.music_group_id_
+        </if>
+        <if test="groupType == 'PRACTICE'">
+            LEFT JOIN practice_group mg ON mg.id_ = cssp.music_group_id_
+        </if>
+        LEFT JOIN sys_user su1 ON su1.id_ = mg.educational_teacher_id_
+        LEFT JOIN organization o ON o.id_ = cs.organ_id_
+        LEFT JOIN student st ON st.user_id_ = cssp.user_id_
+        LEFT JOIN sys_user su ON su.id_ = cssp.user_id_
+        LEFT JOIN sys_user su2 ON su2.id_ = st.teacher_id_
+        LEFT JOIN sys_user su3 ON su3.id_ = cs.actual_teacher_id_
+        <include refid="exportStudentAttendancesQueryPageSql"/>
+        GROUP BY cssp.id_
+        ORDER BY cssp.music_group_id_ DESC,cssp.id_ DESC
+        <include refid="global.limit"/>
+    </select>
 </mapper>

+ 29 - 29
mec-biz/src/main/resources/config/mybatis/StudentCompetitionMapper.xml

@@ -1,7 +1,7 @@
 <?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.StudentCompetitionDao">
-	
+
 	<resultMap type="com.ym.mec.biz.dal.entity.StudentCompetition" id="StudentCompetition">
 		<result column="id_" property="id" />
 		<result column="user_id_" property="userId" />
@@ -21,28 +21,28 @@
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
 	</resultMap>
-	
+
 	<!-- 根据主键查询一条记录 -->
 	<select id="get" resultMap="StudentCompetition" >
 		SELECT * FROM student_competition WHERE id_ = #{id}
 	</select>
-	
+
 	<!-- 全查询 -->
 	<select id="findAll" resultMap="StudentCompetition">
 		SELECT * FROM student_competition ORDER BY id_
 	</select>
-	
+
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentCompetition" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		<!--
-		<selectKey resultClass="int" keyProperty="id" > 
-		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
+		<selectKey resultClass="int" keyProperty="id" >
+		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL
 		</selectKey>
 		-->
 		INSERT INTO student_competition (id_,user_id_,username_,id_card_no_,age_,gender_,grade_,subject_,chapter_,picture_url_,video_url_,score_,prize_level_,is_show_,comment_,create_time_,update_time_)
 		VALUES(#{id},#{userId},#{username},#{idCardNo},#{age},#{gender},#{grade},#{subject},#{chapter},#{pictureUrl},#{videoUrl},#{score},#{prizeLevel},#{isShow},#{comment},NOW(),NOW())
 	</insert>
-	
+
 	<!-- 根据主键查询一条记录 -->
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentCompetition">
 		UPDATE student_competition <set>
@@ -91,20 +91,20 @@
 		<if test="grade != null">
 			grade_ = #{grade},
 		</if>
-			update_time_ = NOW()
+		update_time_ = NOW()
 	</set> WHERE id_ = #{id}
 	</update>
-	
+
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >
-		DELETE FROM student_competition WHERE id_ = #{id} 
+		DELETE FROM student_competition WHERE id_ = #{id}
 	</delete>
-	
+
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="StudentCompetition" parameterType="map">
 		SELECT * FROM student_competition ORDER BY id_ <include refid="global.limit"/>
 	</select>
-	
+
 	<!-- 查询当前表的总记录数 -->
 	<select id="queryCount" resultType="int">
 		SELECT COUNT(*) FROM student_competition
@@ -141,23 +141,23 @@
 
 	<select id="queryStudentCompetitions" resultMap="StudentCompetition">
 		SELECT
-			id_,
-			user_id_,
-			username_,
-			id_card_no_,
-			age_,
-			gender_,
-			grade_,
-			subject_,
-			chapter_,
-			picture_url_,
-			video_url_,
-			CASE WHEN score_ IS NULL THEN -1 ELSE score_ END score_,
-			CASE WHEN prize_level_ IS NULL THEN -1 ELSE prize_level_ END prize_level_,
-			is_show_,
-			comment_,
-			create_time_,
-			update_time_
+		id_,
+		user_id_,
+		username_,
+		id_card_no_,
+		age_,
+		gender_,
+		grade_,
+		subject_,
+		chapter_,
+		picture_url_,
+		video_url_,
+		CASE WHEN score_ IS NULL THEN -1 ELSE score_ END score_,
+		CASE WHEN prize_level_ IS NULL THEN -1 ELSE prize_level_ END prize_level_,
+		is_show_,
+		comment_,
+		create_time_,
+		update_time_
 		FROM student_competition
 		<include refid="queryStudentCondition"/>
 		ORDER BY id_ DESC

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

@@ -285,16 +285,19 @@
         SELECT COUNT(id_) FROM course_schedule_student_payment WHERE course_schedule_id_ = #{search}
     </select>
     <resultMap id="StudentCourseHomeworkDtoMap" type="com.ym.mec.biz.dal.dto.StudentCourseHomeworkDto">
-        <result column="username_" property="username"/>
+        <result column="student_course_homework_id_" property="studentCourseHomeworkId"/>
+        <result column="user_id_" property="studentId"/>
+        <result column="username_" property="studentName"/>
         <result column="phone_" property="phone"/>
-        <result column="subject_name_" property="subjectName"/>
+        <result column="subject_name_" property="subjectNames"/>
         <result column="attachments_" property="url"/>
         <result column="is_replied_" property="isReplied"/>
         <result column="is_view_" property="isView"/>
         <result column="update_time_" property="createTime"/>
     </resultMap>
     <select id="findStudentCourseHomeworks" resultMap="StudentCourseHomeworkDtoMap">
-        SELECT sch.attachments_,sch.is_replied_,sch.is_view_,sch.update_time_,su.username_,su.phone_,s.name_ subject_name_
+        SELECT sch.id_ student_course_homework_id_,sch.attachments_,sch.is_replied_,sch.is_view_,
+        sch.update_time_,cssp.user_id_,su.username_,su.phone_,s.name_ subject_name_
         FROM course_schedule_student_payment cssp
         LEFT JOIN student_course_homework sch ON sch.course_schedule_id_ = cssp.course_schedule_id_ AND cssp.user_id_ = sch.user_id_ AND sch.status_ = 1
         LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
@@ -378,6 +381,38 @@
                 #{studentId}
             </foreach>
     </select>
+    <select id="queryReplied" resultType="java.util.Map">
+        SELECT sch.course_homework_id_ AS 'key',COUNT(0) AS 'value'
+        FROM student_course_homework sch
+        WHERE sch.course_homework_id_ IN
+        <foreach collection="homeWorkIds" open="(" close=")" separator="," item="item">
+            #{item}
+        </foreach>
+        AND sch.is_replied_ = 1
+        GROUP BY sch.course_homework_id_
+    </select>
+
+    <sql id="queryAllCondition">
+        <where>
+            <if test="courseScheduleId!=null">
+                course_schedule_id_=#{courseScheduleId}
+            </if>
+            <if test="isReplied!=null">
+                is_replied_=#{isReplied}
+            </if>
+        </where>
+    </sql>
+
+    <select id="queryAll" resultMap="StudentCourseHomework">
+         SELECT * FROM student_course_homework
+         <include refid="queryAllCondition" />
+         ORDER BY id_
+         <include refid="global.limit"></include>
+    </select>
+    <select id="countAll" resultType="int">
+        SELECT COUNT(*) FROM student_course_homework
+        <include refid="queryAllCondition" />
+    </select>
 
     <delete id="delByCourseScheduleId">
 		DELETE FROM student_course_homework WHERE course_schedule_id_ = #{courseScheduleId} 

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

@@ -28,6 +28,42 @@
         <result property="courseBalance" column="course_balance_"/>
     </resultMap>
 
+    <resultMap id="StudentListCourseDto" type="com.ym.mec.biz.dal.dto.StudentListCourseDto">
+        <result property="userId" column="userId"/>
+        <result property="remainCourseNum" column="remainCourseNum"/>
+        <result property="remainPracticeNum" column="remainPracticeNum"/>
+    </resultMap>
+    
+    <resultMap id="studentManageListDto" type="com.ym.mec.biz.dal.dto.StudentManageListDto">
+        <result property="userId" column="user_id_"/>
+        <result property="realName" column="real_name_"/>
+        <result property="nation" column="nation_"/>
+        <result property="parentsPhone" column="parents_phone_"/>
+        <result property="parentsName" column="real_name_"/>
+        <result property="gender" column="gender_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="username" column="username_"/>
+        <result property="birthdate" column="birthdate_"/>
+        <result property="currentGrade" column="current_grade_"/>
+        <result property="currentClass" column="current_class_"/>
+        <result property="isActive" column="isActive_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="hasCourse" column="hasCourse_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="hasPracticeCourse" column="hasPracticeCourse_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="musicGroupName" column="music_group_name_"/>
+        <result property="musicGroupStatus" column="music_group_status_"/>
+        <result property="vipGroupName" column="vip_group_name_"/>
+        <result property="vipGroupStatus" column="vip_group_status_"/>
+        <result property="organName" column="organ_name_"/>
+        <result property="organId" column="organ_id_"/>
+        <result property="subjectName" column="music_group_subject_"/>
+        <result property="courseBalance" column="course_balance_"/>
+        <result property="balance" column="balance_"/>
+        <result property="serviceTag" column="service_tag_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="operatingTag" column="operating_tag_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="teacherName" column="teacher_name_"/>
+        <result property="teacherId" column="teacher_id_"/>
+        <result property="subjectIdList" column="subject_id_list_"/>
+    </resultMap>
+
     <sql id="queryCondition">
         <where>
             cgsm.user_id_ IS NOT NULL
@@ -112,21 +148,21 @@
     </update>
 
     <select id="findStudentsByOrganId" resultMap="studentManageListDto">
-        SELECT su.id_ user_id_,su.username_,su.gender_,su.phone_ parents_phone_,su.real_name_,
-        su.birthdate_,su.nation_,su.organ_id_,
-        CASE WHEN su.password_ IS NULL THEN 0 ELSE 1 END isActive_,
-        IF(st.service_tag_=2,0,st.service_tag_) service_tag_,st.operating_tag_,tu.real_name_ teacher_name_,st.teacher_id_,suca.balance_
-        FROM sys_user su
-        LEFT JOIN student st ON st.user_id_ = su.id_
-        LEFT JOIN sys_user tu ON tu.id_ = st.teacher_id_
-        LEFT JOIN sys_user_cash_account suca ON su.id_ = suca.user_id_
+        SELECT o.`name_` organ_name_,s.`user_id_` ,su.`username_` ,su.`phone_` parents_phone_,su.`real_name_` ,su.`gender_` , su.organ_id_,
+		tu.`real_name_` teacher_name_,IF(s.service_tag_=2,0,s.service_tag_) service_tag_ ,s.`operating_tag_` , suca.`course_balance_` ,sub.`name_` music_group_subject_ ,su.birthdate_,s.subject_id_list_,s.teacher_id_,
+		case when su.password_ is null then false else true end isActive_
+		FROM `student` s LEFT JOIN `sys_user` su on s.`user_id_` = su.`id_`
+		LEFT JOIN `organization` o on o.`id_` = su.`organ_id_`
+		LEFT JOIN `sys_user` tu on tu.`id_` = s.`teacher_id_` 
+		LEFT JOIN `sys_user_cash_account` suca on suca.`user_id_` = s.`user_id_`
+		LEFT JOIN `subject` sub on sub.id_ = s.`subject_id_list_`
         <include refid="findStudentsByOrganIdSql"/>
         ORDER BY su.create_time_ DESC
         <include refid="global.limit"/>
     </select>
     <sql id="findStudentsByOrganIdSql">
         <where>
-                su.user_type_ LIKE '%STUDENT%' AND su.del_flag_ = 0
+                su.del_flag_ = 0
             <if test="organId != null and organId != ''">
                 AND FIND_IN_SET(su.organ_id_,#{organId})
             </if>
@@ -140,31 +176,21 @@
                 AND su.password_ is null
             </if>
             <if test="operatingTag != null">
-                AND st.operating_tag_ = #{operatingTag}
+                AND s.operating_tag_ = #{operatingTag}
             </if>
             <if test="serviceTag != null">
-                AND st.service_tag_ = #{serviceTag}
+                AND s.service_tag_ = #{serviceTag}
             </if>
             <if test="teacherId != null">
-                AND st.teacher_id_ = #{teacherId}
-            </if>
-            <if test="userIds != null">
-                AND su.id_ IN
-                <foreach collection="userIds" open="(" close=")" separator="," item="item">
-                    #{item}
-                </foreach>
+                AND s.teacher_id_ = #{teacherId}
             </if>
         </where>
     </sql>
 
     <select id="countStudentByOrganId" resultType="java.lang.Integer">
         SELECT COUNT(DISTINCT su.id_)
-        FROM sys_user su
-        LEFT JOIN student_registration sr ON su.id_ = sr.user_id_
-        LEFT JOIN practice_lesson_apply pla ON su.id_ = pla.user_id_
-        LEFT JOIN student st ON st.user_id_ = su.id_
-        WHERE su.user_type_ LIKE '%STUDENT%' AND su.del_flag_ = 0
-        <include refid="queryHasCourseSql"/>
+        FROM `student` s LEFT JOIN `sys_user` su on s.`user_id_` = su.`id_`
+       <include refid="findStudentsByOrganIdSql"/>
     </select>
     <select id="findStudentBaseInfoByUserID" resultMap="studentManageListDto">
         SELECT su.username_,su.gender_,su.birthdate_,su.real_name_,su.id_ user_id_,
@@ -610,98 +636,6 @@
             AND st.teacher_id_ = #{teacherId}
         </if>
     </sql>
-    <select id="queryHasCourse" resultType="java.lang.Integer">
-        SELECT su.id_ FROM sys_user su
-        LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = su.id_
-        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
-        LEFT JOIN practice_lesson_apply pla ON su.id_ = pla.user_id_
-        LEFT JOIN student st ON st.user_id_ = su.id_
-        WHERE su.user_type_ LIKE '%STUDENT%' AND cs.status_ != 'OVER' AND su.del_flag_ = 0
-        <include refid="queryHasCourseSql"/>
-        GROUP BY su.id_
-        ORDER BY su.create_time_ DESC
-        <include refid="global.limit"/>
-    </select>
-    <select id="countHasCourse" resultType="java.lang.Integer">
-        SELECT COUNT(DISTINCT su.id_) FROM sys_user su
-        LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = su.id_
-        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
-        LEFT JOIN practice_lesson_apply pla ON su.id_ = pla.user_id_
-        LEFT JOIN student st ON st.user_id_ = su.id_
-        WHERE su.user_type_ LIKE '%STUDENT%' AND cs.status_ != 'OVER' AND su.del_flag_ = 0
-        <include refid="queryHasCourseSql"/>
-    </select>
-    <select id="queryNotCourse" resultType="java.lang.Integer">
-        SELECT su.id_ FROM sys_user su
-        LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = su.id_
-        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_ AND cs.status_ != 'OVER'
-        LEFT JOIN practice_lesson_apply pla ON su.id_ = pla.user_id_
-        LEFT JOIN student st ON st.user_id_ = su.id_
-        <include refid="queryNotCourseSql"/>
-        GROUP BY su.id_
-        HAVING COUNT(cs.id_) = 0
-        ORDER BY su.create_time_ DESC
-        <include refid="global.limit"/>
-    </select>
-    <select id="countNotCourse" resultType="java.lang.Integer">
-        SELECT COUNT(e.id_) FROM (SELECT su.id_ FROM sys_user su
-        LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = su.id_
-        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_ AND cs.status_ != 'OVER'
-        LEFT JOIN practice_lesson_apply pla ON su.id_ = pla.user_id_
-        LEFT JOIN student st ON st.user_id_ = su.id_
-        <include refid="queryNotCourseSql"/>
-        GROUP BY su.id_
-        HAVING COUNT(cs.id_) = 0)e
-    </select>
-    <sql id="queryNotCourseSql">
-        <where>
-                su.user_type_ LIKE '%STUDENT%' AND su.del_flag_ = 0
-            <if test="userIds != null">
-                AND su.id_ IN
-                <foreach collection="userIds" open="(" close=")" separator="," item="item">
-                    #{item}
-                </foreach>
-            </if>
-            <if test="organId != null">
-                AND FIND_IN_SET(su.organ_id_,#{organId})
-            </if>
-            <if test="search != null and search != ''">
-                AND (su.phone_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.id_ LIKE CONCAT('%',#{search},'%'))
-            </if>
-            <if test="isActive != null and isActive == true">
-                and su.password_ is not null
-            </if>
-            <if test="isActive != null and isActive == false">
-                and su.password_ is null
-            </if>
-            <if test="isMake != null and isMake == true">
-                and pla.id_ IS NOT NULL
-            </if>
-            <if test="isMake != null and isMake == false">
-                and pla.id_ IS NULL
-            </if>
-            <if test="operatingTag != null">
-                AND st.operating_tag_ = #{operatingTag}
-            </if>
-            <if test="serviceTag != null">
-                AND st.service_tag_ = #{serviceTag}
-            </if>
-        </where>
-    </sql>
-    <select id="queryStudentHasCourse" resultType="java.util.Map">
-        SELECT cssp.user_id_ 'key',CASE WHEN COUNT(cssp.id_ AND cs.status_ != 'OVER') = 0 THEN 0 ELSE 1 END 'value'
-        FROM course_schedule_student_payment cssp
-        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
-        <where>
-            <if test="userIds != null">
-                cssp.user_id_ IN
-                <foreach collection="userIds" open="(" close=")" separator="," item="item">
-                    #{item}
-                </foreach>
-            </if>
-        </where>
-        GROUP BY cssp.user_id_
-    </select>
     <resultMap id="StudentHasCourseDtoMap" type="com.ym.mec.biz.dal.dto.StudentHasCourseDto">
         <result property="userName" column="username_"/>
         <result property="musicGroupName" column="music_group_name_"/>
@@ -712,46 +646,7 @@
         <result property="isActive" column="is_active_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result property="isMake" column="is_make_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
-    <select id="queryCourseStudent" resultMap="StudentHasCourseDtoMap">
-        SELECT su.id_,su.username_,o.name_ organ_name_,
-        CASE WHEN su.password_ IS NULL THEN 0 ELSE 1 END is_active_,
-        CASE WHEN pla.id_ IS NULL THEN 0 ELSE 1 END is_make_
-        FROM sys_user su
-        LEFT JOIN organization o ON su.organ_id_ = o.id_
-        LEFT JOIN practice_lesson_apply pla ON pla.user_id_ = su.id_
-        WHERE su.id_ IN
-        <foreach collection="userIds" separator="," open="(" close=")" item="item">
-            #{item}
-        </foreach>
-    </select>
-    <resultMap id="studentManageListDto" type="com.ym.mec.biz.dal.dto.StudentManageListDto">
-        <result property="userId" column="user_id_"/>
-        <result property="realName" column="real_name_"/>
-        <result property="nation" column="nation_"/>
-        <result property="parentsPhone" column="parents_phone_"/>
-        <result property="parentsName" column="real_name_"/>
-        <result property="gender" column="gender_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
-        <result property="username" column="username_"/>
-        <result property="birthdate" column="birthdate_"/>
-        <result property="currentGrade" column="current_grade_"/>
-        <result property="currentClass" column="current_class_"/>
-        <result property="isActive" column="isActive_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
-        <result property="hasCourse" column="hasCourse_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
-        <result property="hasPracticeCourse" column="hasPracticeCourse_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
-        <result property="musicGroupName" column="music_group_name_"/>
-        <result property="musicGroupStatus" column="music_group_status_"/>
-        <result property="vipGroupName" column="vip_group_name_"/>
-        <result property="vipGroupStatus" column="vip_group_status_"/>
-        <result property="organName" column="organ_name_"/>
-        <result property="organId" column="organ_id_"/>
-        <result property="subjectName" column="music_group_subject_"/>
-        <result property="courseBalance" column="course_balance_"/>
-        <result property="balance" column="balance_"/>
-        <result property="serviceTag" column="service_tag_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
-        <result property="operatingTag" column="operating_tag_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
-        <result property="teacherName" column="teacher_name_"/>
-        <result property="teacherId" column="teacher_id_"/>
-    </resultMap>
+    
     <select id="queryHasCourseStudent" resultMap="studentManageListDto">
         SELECT su.id_ user_id_,su.username_,su.gender_,GROUP_CONCAT(DISTINCT sr.parents_name_)parents_name_,
         GROUP_CONCAT(DISTINCT sr.parents_phone_)parents_phone_,
@@ -817,12 +712,6 @@
         </if>
         GROUP BY su.id_
     </select>
-    <select id="getHasCourse" resultType="java.lang.Integer">
-        SELECT COUNT(DISTINCT su.id_) FROM sys_user su
-        LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = su.id_
-        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
-        WHERE cs.status_ != 'OVER' AND su.id_ = #{userId}
-    </select>
     <select id="countStudentSignInNum" resultType="java.lang.Integer">
         SELECT COUNT(id_) FROM student_attendance WHERE course_schedule_id_ = #{courseScheduleId} AND status_ = #{status}
     </select>
@@ -847,19 +736,6 @@
             AND su.password_ IS NULL
         </if>
     </sql>
-    <select id="queryHasPracticeCourse" resultType="java.lang.Integer">
-        SELECT DISTINCT su.id_ FROM sys_user su
-        LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = su.id_
-        WHERE su.user_type_ LIKE '%STUDENT%' AND su.del_flag_ = 0 AND cssp.group_type_ = 'PRACTICE'
-        <include refid="queryHasPracticeCourseSql"/>
-    </select>
-    <select id="queryNotPracticeCourse" resultType="java.lang.Integer">
-        SELECT DISTINCT su.id_ FROM sys_user su
-        WHERE su.id_ NOT IN
-        (SELECT DISTINCT cssp.user_id_ FROM course_schedule_student_payment cssp WHERE cssp.group_type_ = 'PRACTICE')
-        AND su.user_type_ LIKE '%STUDENT%' AND su.del_flag_ = 0
-        <include refid="queryHasPracticeCourseSql"/>
-    </select>
     <select id="getHasPracticeCourse" resultType="java.util.Map">
         SELECT cssp.user_id_ 'key',COUNT(DISTINCT cssp.user_id_) 'value' FROM course_schedule_student_payment cssp
         WHERE cssp.group_type_ = 'PRACTICE' AND cssp.user_id_ IN
@@ -913,5 +789,15 @@
         </foreach>
         GROUP BY su.id_
     </select>
+    
+    <select id="queryStudentRemianCourse" resultMap="StudentListCourseDto">
+    	SELECT cssp.`user_id_` userId,count(cssp.`id_`) remainCourseNum,sum(case when cs.`group_type_` = 'PRACTICE' then 1 else 0 end) remainPracticeNum  
+    	FROM `course_schedule_student_payment` cssp LEFT JOIN `course_schedule` cs on cssp.`course_schedule_id_` = cs.`id_`
+		WHERE cs.`status_` = 'NOT_START' AND cssp.`user_id_` IN
+        <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
+            #{userId}
+        </foreach>
+		GROUP BY cssp.`user_id_`
+    </select>
 
 </mapper>

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

@@ -517,4 +517,11 @@
             #{id}
         </foreach>
     </select>
+
+    <select id="findByStudentIds" resultMap="Student">
+        SELECT * FROM student WHERE user_id_ IN
+        <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+            #{studentId}
+        </foreach>
+    </select>
 </mapper>

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

@@ -223,6 +223,18 @@
             sr.user_id_=#{student.studentId} AND sr.music_group_id_=#{student.musicGroupId}
         </foreach>
     </select>
+    <select id="findStudentSubjectIdMaps" resultType="java.util.Map">
+        SELECT
+            sr.user_id_ as 'key',
+            sr.subject_id_ as 'value'
+        FROM
+            student_registration sr
+        WHERE 1=1
+        AND
+        <foreach collection="studentInfos" item="student" open="(" close=")" separator=" OR ">
+            sr.user_id_=#{student.studentId} AND sr.music_group_id_=#{student.musicGroupId}
+        </foreach>
+    </select>
     <select id="findBySubjectIds" resultMap="Subject">
       SELECT * FROM subject WHERE id_ IN
       <foreach collection="subjectIds" item="subjectId" separator="," open="(" close=")">

+ 4 - 0
mec-biz/src/main/resources/config/mybatis/SysUserContractsMapper.xml

@@ -87,4 +87,8 @@
 	<select id="getUserContractWithType" resultMap="SysUserContracts">
 		SELECT * FROM sys_user_contracts WHERE user_id_=#{userId} AND type_=#{contractType}
 	</select>
+
+	<select id="getLatestUserContract" resultMap="SysUserContracts">
+		SELECT * FROM sys_user_contracts WHERE user_id_=#{userId} order by id_ desc limit 0,1
+	</select>
 </mapper>

+ 13 - 13
mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml

@@ -252,7 +252,7 @@
     </sql>
     <sql id="queryTeacherAttendancesCondition">
         <where>
-            (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL) AND cs.actual_teacher_id_ = ta.teacher_id_
+            (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
             <if test="search != null and search != ''">
                 AND (su.id_ = #{search} OR su.real_name_ LIKE CONCAT('%',#{search},'%') OR cs.id_ = #{search} OR cs.name_ LIKE CONCAT('%',#{search},'%'))
             </if>
@@ -281,7 +281,7 @@
                 AND cs.status_ = #{courseScheduleStatus}
             </if>
             <if test="organId != null and organId != ''">
-                AND FIND_IN_SET(t.organ_id_,#{organId})
+                AND FIND_IN_SET(cs.organ_id_,#{organId})
             </if>
         </where>
     </sql>
@@ -301,17 +301,17 @@
     </select>
 
     <select id="queryTeacherAttendances" parameterType="map" resultMap="TeacherAttendancesDto">
-        SELECT su.real_name_ teacher_name_,su.id_ teacher_id_,ta.course_schedule_id_,cs.name_ course_schedule_name_,
+        SELECT su.real_name_ teacher_name_,su.id_ teacher_id_,csts.course_schedule_id_,cs.name_ course_schedule_name_,
         cs.status_ course_schedule_status_,
         cs.class_date_,cs.start_class_time_,cs.end_class_time_,cs.type_ course_schedule_type_,
         IF(ta.sign_in_status_ IS NULL,3,ta.sign_in_status_) sign_in_status_,
         IF(ta.sign_out_status_ IS NULL,3,ta.sign_out_status_) sign_out_status_,
         ta.sign_in_time_,ta.sign_out_time_,ta.remark_,o.name_ organ_name_
-        FROM course_schedule cs
-        LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
-        LEFT JOIN teacher t ON t.id_ = ta.teacher_id_
-        LEFT JOIN sys_user su ON su.id_ = t.id_
-        LEFT JOIN organization o ON o.id_ = t.organ_id_
+        FROM course_schedule_teacher_salary csts
+        LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
+        LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = csts.course_schedule_id_ AND ta.teacher_id_ = csts.user_id_
+        LEFT JOIN sys_user su ON su.id_ = csts.user_id_
+        LEFT JOIN organization o ON o.id_ = cs.organ_id_
         <include refid="queryTeacherAttendancesCondition"/>
         ORDER BY cs.class_date_ ASC,cs.start_class_time_ ASC
         <include refid="global.limit"/>
@@ -324,11 +324,11 @@
     </select>
 
     <select id="countTeacherAttendances" resultType="int">
-        SELECT COUNT(DISTINCT cs.id_)
-        FROM course_schedule cs
-        LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
-        LEFT JOIN teacher t ON t.id_ = ta.teacher_id_
-        LEFT JOIN sys_user su ON su.id_ = t.id_
+        SELECT COUNT(csts.id_)
+        FROM course_schedule_teacher_salary csts
+        LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
+        LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = csts.course_schedule_id_ AND ta.teacher_id_ = csts.user_id_
+        LEFT JOIN sys_user su ON su.id_ = csts.user_id_
         <include refid="queryTeacherAttendancesCondition"/>
     </select>
 

+ 52 - 40
mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -279,9 +279,9 @@
     <select id="queryPage" resultMap="Teacher" parameterType="map">
         SELECT t.id_,su.real_name_,su.lock_flag_,t.subject_id_,su.phone_,t.organ_id_ teacher_organ_id_,t.organ_id_,t.is_support_extra_practice_lesson_,
         t.job_nature_,t.is_probation_period_,t.memo_,GROUP_CONCAT(s.name_) subject_name_,su.del_flag_
-        FROM teacher t LEFT JOIN sys_user su ON t.id_ = su.id_
+        FROM teacher t
+        LEFT JOIN sys_user su ON t.id_ = su.id_
         LEFT JOIN `subject` s ON FIND_IN_SET(s.id_,t.subject_id_)
-        WHERE su.del_flag_ = 0
         <include refid="queryPageMap"/>
         GROUP BY t.id_
         ORDER BY t.id_ DESC
@@ -291,26 +291,40 @@
     <select id="queryCount" resultType="int">
         SELECT COUNT(DISTINCT t.id_)
         FROM teacher t LEFT JOIN sys_user su ON t.id_ = su.id_
-        WHERE su.del_flag_ = 0
         <include refid="queryPageMap"/>
     </select>
 
     <sql id="queryPageMap">
-        <if test="lockFlag != null">
-            AND su.lock_flag_ = #{lockFlag}
-        </if>
-        <if test="teacherId != null">
-            AND t.id_ IN
-            <foreach collection="teacherId" separator="," open="(" close=")" item="item">
-                #{item}
-            </foreach>
-        </if>
-        <if test="search != null">
-            AND (su.real_name_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%') OR t.id_ = #{search})
-        </if>
-        <if test="isSupportExtraPracticeLesson != null">
-            AND is_support_extra_practice_lesson_ = #{isSupportExtraPracticeLesson}
-        </if>
+        <where>
+            su.del_flag_ = 0
+            <if test="organId != null and organId != ''">
+                AND (INTE_ARRAY(#{organId},t.flow_organ_range_) OR FIND_IN_SET(t.organ_id_,#{organId}))
+            </if>
+            <if test="subjectId != null">
+                AND FIND_IN_SET(#{subjectId},t.subject_id_)
+            </if>
+            <if test="jobNature != null">
+                AND t.job_nature_ = #{jobNature}
+            </if>
+            <if test="isProbationPeriod != null">
+                AND t.is_probation_period_ = #{isProbationPeriod}
+            </if>
+            <if test="isSupportExtraPracticeLesson != null">
+                AND t.is_support_extra_practice_lesson_ = #{isSupportExtraPracticeLesson}
+            </if>
+            <if test="lockFlag != null">
+                AND su.lock_flag_ = #{lockFlag}
+            </if>
+            <if test="teacherId != null">
+                AND t.id_ IN
+                <foreach collection="teacherId" separator="," open="(" close=")" item="item">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="search != null">
+                AND (su.real_name_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%') OR t.id_ = #{search})
+            </if>
+        </where>
     </sql>
 
     <!-- 根据证件号查询老师 -->
@@ -361,8 +375,9 @@
         <result property="subjectNames" column="subject_names_"/>
         <result property="introduction" column="introduction_"/>
     </resultMap>
-    <select id="findTeachers" resultMap="TeacherBasicDto">
-        SELECT su.id_,su.username_,su.real_name_,t.organ_id_ FROM sys_user su
+
+    <select id="findSimpleTeachers" resultType="com.ym.mec.biz.dal.dto.SimpleUserDto">
+        SELECT su.id_ userId,su.real_name_ userName FROM sys_user su
         LEFT JOIN teacher t ON su.id_=t.id_
         <where>
             <if test="userIds != null">
@@ -373,9 +388,14 @@
             </if>
         </where>
     </select>
-    <select id="findSimpleTeachers" resultType="com.ym.mec.biz.dal.dto.SimpleUserDto">
-        SELECT su.id_ userId,su.real_name_ userName FROM sys_user su
-        LEFT JOIN teacher t ON su.id_=t.id_
+
+    <select id="getUsersSimpleInfo" resultType="com.ym.mec.biz.dal.dto.SimpleUserDto">
+        SELECT
+            su.id_ userId,
+            su.username_ nickName,
+            su.real_name_ userName,
+            su.phone_ phone
+        FROM sys_user su
         <where>
             <if test="userIds != null">
                 su.id_ IN
@@ -385,6 +405,7 @@
             </if>
         </where>
     </select>
+
     <select id="findTeaTeachersByOrganAndSubject" resultMap="TeacherBasicDto">
         SELECT
             su.id_,
@@ -740,23 +761,13 @@
                 and FIND_IN_SET(organ_id_,#{organId})
             </if>
     </select>
-    <select id="findByFlowOrganRange" resultMap="Teacher">
-        SELECT id_,CONCAT(IF(flow_organ_range_ IS NULL OR flow_organ_range_ = '',0,flow_organ_range_),",",
-        IF(organ_id_ IS NULL OR organ_id_ = '',0,organ_id_)) flow_organ_range_ FROM teacher t
-        <where>
-            <if test="subjectId != null">
-                AND FIND_IN_SET(#{subjectId},t.subject_id_)
-            </if>
-            <if test="jobNature != null">
-                AND t.job_nature_ = #{jobNature}
-            </if>
-            <if test="isProbationPeriod != null">
-                AND t.is_probation_period_ = #{isProbationPeriod}
-            </if>
-            <if test="isSupportExtraPracticeLesson != null">
-                AND t.is_support_extra_practice_lesson_ = #{isSupportExtraPracticeLesson}
-            </if>
-        </where>
+    <select id="findByFlowOrganRangeTeachers" resultMap="TeacherBasicDto">
+        SELECT su.id_,su.username_,su.real_name_,t.organ_id_ FROM teacher t
+        LEFT JOIN sys_user su ON t.id_ = su.id_
+        WHERE su.del_flag_ = 0
+        <if test="organId != null and organId != ''">
+            AND (INTE_ARRAY(#{organId},t.flow_organ_range_) OR FIND_IN_SET(t.organ_id_,#{organId}))
+        </if>
     </select>
 
     <select id="findByTeacherIds" resultMap="Teacher">
@@ -1193,4 +1204,5 @@
         gender_,user_type_
         FROM sys_user WHERE phone_ = #{phone}
     </select>
+
 </mapper>

+ 6 - 5
mec-client-api/src/main/java/com/ym/mec/im/ImFeignService.java

@@ -1,10 +1,11 @@
 package com.ym.mec.im;
 
 import com.ym.mec.common.entity.*;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.web.bind.annotation.*;
 
 import com.ym.mec.common.config.FeignConfiguration;
 import com.ym.mec.im.fallback.ImFeignServiceFallback;
@@ -92,11 +93,11 @@ public interface ImFeignService {
 	 * @return
 	 */
 	@PostMapping(value = "private/send")
-	//body模板
-	//{"senderId":"325","targetId":[1094986],"objectName":"RC:TxtMsg",
-	// "content":{"content":"www.baidu.com"}}
 	Object privateSend(@RequestBody ImPrivateMessage privateMessage);
 
+	@PostMapping(value = "group/send")
+	Object groupSend(@RequestBody ImGroupMessage imGroupMessage);
+
 	/**
 	 * 发送群组自定义消息
 	 * @param groupMessage

+ 7 - 0
mec-client-api/src/main/java/com/ym/mec/im/fallback/ImFeignServiceFallback.java

@@ -2,8 +2,10 @@ package com.ym.mec.im.fallback;
 
 import com.ym.mec.common.entity.*;
 import com.ym.mec.im.ImFeignService;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
+import javax.xml.ws.Action;
 import java.util.List;
 
 @Component
@@ -59,6 +61,11 @@ public class ImFeignServiceFallback implements ImFeignService {
     public Object privateSend(ImPrivateMessage privateMessage) {
         return null;
     }
+
+    @Override
+    public Object groupSend(ImGroupMessage imGroupMessage) {
+        return null;
+    }
 /*
     @Override
     public Object privateSendCustom(ImGroupMessage groupMessage) {

+ 5 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImGroupMessage.java

@@ -7,6 +7,11 @@ public class ImGroupMessage extends ImMessageModel {
     public String[] toUserId;
     private String type;
 
+    public ImGroupMessage setContent(ImTxtMessage content) {
+        super.setContent(content);
+        return this;
+    }
+
     public ImGroupMessage() {
     }
 

+ 3 - 1
mec-im/src/main/java/com/ym/config/ResourceServerConfig.java

@@ -10,6 +10,8 @@ import org.springframework.security.oauth2.config.annotation.web.configuration.R
 public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
     @Override
     public void configure(HttpSecurity http) throws Exception {
-        http.authorizeRequests().antMatchers("/v2/api-docs","/user/register","/group/join","/group/create","/room/leave","/room/statusSync","/room/statusImMsg","/group/batchDismiss","/private/send").permitAll().anyRequest().authenticated().and().csrf().disable();
+        http.authorizeRequests().antMatchers("/v2/api-docs","/user/register",
+                "/group/join","/group/create","/room/leave","/room/statusSync",
+                "/room/statusImMsg","/group/batchDismiss","/private/send","/group/send").permitAll().anyRequest().authenticated().and().csrf().disable();
     }
 }

+ 13 - 1
mec-im/src/main/java/com/ym/controller/GroupController.java

@@ -1,12 +1,16 @@
 package com.ym.controller;
 
+import com.ym.mec.common.entity.ImGroupMessage;
+import com.ym.mec.common.entity.ImTxtMessage;
 import com.ym.service.GroupService;
 import com.ym.service.MessageService;
+import io.rong.messages.TxtMessage;
 import io.rong.models.group.GroupMember;
 import io.rong.models.group.GroupModel;
 import io.rong.models.group.UserGroup;
 import io.rong.models.message.GroupMessage;
 import io.rong.models.message.MentionMessage;
+import io.rong.models.message.PrivateMessage;
 import io.rong.models.message.RecallMessage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -29,7 +33,15 @@ public class GroupController{
     GroupService groupService;
 
     @RequestMapping(value = "/send", method = RequestMethod.POST)
-    public Object send(@RequestBody GroupMessage groupMessage) throws Exception {
+    public Object send(@RequestBody ImGroupMessage imGroupMessage) throws Exception {
+        GroupMessage groupMessage = new GroupMessage();
+        ImTxtMessage content = (ImTxtMessage)imGroupMessage.getContent();
+        TxtMessage txtMessage = new TxtMessage(content.getContent(),content.getExtra());
+        groupMessage.setContent(txtMessage);
+        groupMessage.setTargetId(imGroupMessage.getTargetId());
+        groupMessage.setSenderId(imGroupMessage.getSenderId());
+        groupMessage.setObjectName(imGroupMessage.getObjectName());
+        groupMessage.setIsIncludeSender(1);
         return messageService.groupSend(groupMessage);
     }
 

+ 3 - 4
mec-student/src/main/java/com/ym/mec/student/controller/StudentCompetitionController.java

@@ -8,7 +8,6 @@ import com.ym.mec.biz.service.ContractService;
 import com.ym.mec.biz.service.StudentCompetitionService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
-import com.ym.mec.util.idcard.IdcardValidator;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
@@ -32,6 +31,8 @@ public class StudentCompetitionController extends BaseController {
     private StudentCompetitionService studentCompetitionService;
     @Autowired
     private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private ContractService contractService;
 
     @ApiOperation(value = "新增参赛作品")
     @PostMapping("/add")
@@ -39,13 +40,11 @@ public class StudentCompetitionController extends BaseController {
         if(StringUtils.isBlank(studentCompetition.getUsername())||StringUtils.isBlank(studentCompetition.getIdCardNo())){
             return failed("参赛选手身份信息不完整");
         }
-        if(!new IdcardValidator().isValidatedAllIdcard(studentCompetition.getIdCardNo())){
-            return failed("身份证号错误");
-        }
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed("请登录");
         }
+        contractService.register(sysUser.getId(), studentCompetition.getUsername(), studentCompetition.getIdCardNo(),sysUser.getPhone());
         studentCompetition.setUserId(sysUser.getId());
         studentCompetitionService.addStudentCompetition(studentCompetition);
         return succeed();

+ 1 - 2
mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java

@@ -39,8 +39,7 @@ public class StudentCourseHomeworkController extends BaseController {
     @ApiOperation(value = "提交作业")
     @PostMapping(value = "/add",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
     public Object add(@RequestBody StudentCourseHomework studentCourseHomework){
-        studentCourseHomework.setStatus(YesOrNoEnum.YES);
-        studentCourseHomeworkService.insert(studentCourseHomework);
+        studentCourseHomeworkService.add(studentCourseHomework);
         return succeed();
     }
 

+ 2 - 2
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java

@@ -275,8 +275,8 @@ public class CourseScheduleController extends BaseController {
 	@ApiOperation(value = "乐团详情--课酬调整--课程教师列表")
 	@GetMapping("/queryTeacherSalary")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/queryTeacherSalary')")
-	public Object queryTeacherSalary(Long courseScheduleId) {
-		return succeed(musicGroupService.queryTeacherSalary(courseScheduleId));
+	public Object queryTeacherSalary(Long courseScheduleId,Integer teacherId) {
+		return succeed(musicGroupService.queryTeacherSalary(courseScheduleId,teacherId));
 	}
 
     @ApiOperation(value = "根据班级获取课程计划")

+ 43 - 0
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleStudentPaymentController.java

@@ -0,0 +1,43 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.biz.dal.dto.CourseScheduleStudentListDto;
+import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
+import com.ym.mec.biz.dal.page.CourseScheduleStudentPaymentQueryInfo;
+import com.ym.mec.biz.dal.page.CourseScheduleTeacherSalaryQueryInfo;
+import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/11/17 0017
+ */
+@RestController
+@RequestMapping("courseScheduleStudentPayment")
+@Api(tags = "学生课程之缴费记录服务")
+public class CourseScheduleStudentPaymentController extends BaseController {
+
+    @Autowired
+    private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
+
+    @ApiOperation(value = "分页查询指定课程上的学员")
+    @GetMapping("/queryCourseStudentList")
+    @PreAuthorize("@pcs.hasPermissions('courseScheduleStudentPayment/queryCourseStudentList')")
+    public HttpResponseResult queryCourseStudentList(CourseScheduleStudentPaymentQueryInfo queryInfo) {
+        return succeed(courseScheduleStudentPaymentService.queryCourseStudentList(queryInfo));
+    }
+
+}

+ 11 - 0
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleTeacherSalaryController.java

@@ -4,6 +4,7 @@ import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dto.TeacherAttendancesDto;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.enums.TeacherSalaryConfirmStatus;
 import com.ym.mec.biz.dal.page.CourseSalaryQueryInfo4Web;
@@ -105,4 +106,14 @@ public class CourseScheduleTeacherSalaryController extends BaseController {
         courseScheduleTeacherSalaryService.closeSalaryConfirm(month);
         return succeed();
     }
+
+    @ApiOperation(value = "获取指定课程上的教师信息")
+    @GetMapping("/getCourseTeachers")
+    @PreAuthorize("@pcs.hasPermissions('courseScheduleTeacherSalary/getCourseTeachers')")
+    public HttpResponseResult<List<TeacherAttendancesDto>> getCourseTeachers(Long courseScheduleId){
+        if(Objects.isNull(courseScheduleId)){
+            throw new BizException("请指定课程");
+        }
+        return succeed(courseScheduleTeacherSalaryService.getCourseTeachers(courseScheduleId));
+    }
 }

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

@@ -12,6 +12,7 @@ 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 com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.excel.POIUtil;
@@ -85,6 +86,8 @@ public class ExportController extends BaseController {
     @Autowired
     private TeacherAttendanceService teacherAttendanceService;
     @Autowired
+    private StudentAttendanceService studentAttendanceService;
+    @Autowired
     private TeacherCourseRewardService teacherCourseRewardService;
     @Autowired
     private DegreeRegistrationService degreeRegistrationService;
@@ -102,11 +105,66 @@ public class ExportController extends BaseController {
     private TeacherService teacherService;
     @Autowired
     private MusicGroupBuildLogDao musicGroupBuildLogDao;
+    @Autowired
+    private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+    @Autowired
+    private SellOrderDao sellOrderDao;
+
+    @ApiOperation(value = "学员考勤记录导出")
+    @PostMapping("export/exportStudentAttendances")
+    @PreAuthorize("@pcs.hasPermissions('export/exportStudentAttendances')")
+    public void exportStudentAttendances(HttpServletResponse response, ExportStudentAttendanceQueryInfo queryInfo) throws IOException {
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        if (!sysUser.getIsSuperAdmin()) {
+            Employee employee = employeeDao.get(sysUser.getId());
+            if (StringUtils.isEmpty(queryInfo.getOrganId())) {
+                queryInfo.setOrganId(employee.getOrganIdList());
+            } else if (StringUtils.isEmpty(employee.getOrganIdList())) {
+                throw new BizException("用户所在分部异常");
+            } else {
+                List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+                if (!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))) {
+                    throw new BizException("非法请求");
+                }
+            }
+        }
+        List<ExportStudentAttendanceDto> rows = studentAttendanceService.exportStudentAttendancesQueryPage(queryInfo).getRows();
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部编号", "分部名称", "课程组类型", "课程组编号", "课程组名称", "学员姓名",
+                    "学员编号", "课程编号", "课程名称", "上课日期", "上课开始时间", "上课结束时间",
+                    "指导老师名称", "指导老师编号", "教务老师名称", "教务老师编号", "授课老师名称", "授课老师编号", "学员考勤状态"}, new String[]{
+                    "organId", "organName", "groupType.desc", "groupId", "groupName", "username",
+                    "userId", "courseScheduleId", "courseScheduleName", "classDate", "startClassTime", "endClassTime", "guideTeacherName", "guideTeacherId"
+                    , "educationalTeacherName", "educationalTeacherId", "actualTeacherName", "actualTeacherId", "studentAttendanceStatus.msg"}, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=studentAttendance-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
 
     @ApiOperation(value = "乐团管理--修改--缴费设置--缴费记录导出")
     @PostMapping("export/musicGroupPaymentCalenderDetail")
     @PreAuthorize("@pcs.hasPermissions('export/musicGroupPaymentCalenderDetail')")
-    public void exportTeacherAttendances(HttpServletResponse response, MusicCalenderDetailQueryInfo queryInfo) throws IOException {
+    public void exportMusicGroupPaymentCalenderDetail(HttpServletResponse response, MusicCalenderDetailQueryInfo queryInfo) throws IOException {
         queryInfo.setPage(1);
         queryInfo.setRows(49999);
         List<MusicGroupPaymentCalenderDetail> rows = musicGroupPaymentCalenderDetailService.queryPage(queryInfo).getRows();
@@ -882,14 +940,7 @@ public class ExportController extends BaseController {
             row.setMemo(goodsName);
             row.setHighOnlineCourseFee(highOnlineCourseFee);
             //专业
-            if (row.getGroupType().equals(GroupType.MUSIC)) {
-                StudentRegistration studentRegistration = studentRegistrationDao.findStudentByMusicGroupIdAndUserId(row.getMusicGroupId(), row.getUserId());
-                if (studentRegistration != null) {
-                    row.setSubjectName(studentRegistration.getSubjectName());
-                    row.setSchoolName(studentRegistration.getSchoolName());
-                    row.setCooperationOrganName(studentRegistration.getRemark());
-                }
-            } else if (row.getGroupType().equals(GroupType.VIP)) {
+            if (row.getGroupType().equals(GroupType.VIP)) {
                 row.setCourseFee(row.getActualAmount());
                 VipGroup vipGroupInfo = vipGroupDao.findVipGroupInfo(Integer.parseInt(row.getMusicGroupId()), row.getClassGroupId());
                 if (vipGroupInfo != null) {
@@ -921,6 +972,25 @@ public class ExportController extends BaseController {
                 if (practiceGroup != null) {
                     row.setSubjectName(practiceGroup.getSubjectName());
                 }
+            } else {
+                StudentPaymentOrderExportDto feeByType = sellOrderDao.getFeeByType(row.getId());
+                row.setMusicalFee(feeByType.getMusicalFee());
+                row.setTeachingFee(feeByType.getTeachingFee());
+                if (row.getGroupType().equals(GroupType.MUSIC)) {
+                    StudentRegistration studentRegistration = studentRegistrationDao.findStudentByMusicGroupIdAndUserId(row.getMusicGroupId(), row.getUserId());
+                    if (studentRegistration != null) {
+                        row.setSubjectName(studentRegistration.getSubjectName());
+                        row.setSchoolName(studentRegistration.getSchoolName());
+                        row.setCooperationOrganName(studentRegistration.getRemark());
+                    }
+                    if (row.getCourseFee().compareTo(BigDecimal.ZERO) == 0) {
+                        row.setCourseFee(feeByType.getExpectAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()));
+                    }
+                } else if (row.getType().equals(OrderTypeEnum.REPAIR)) {
+                    row.setRepairFee(feeByType.getExpectAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()));
+                } else if (row.getType().equals(OrderTypeEnum.OUTORDER)) {
+                    row.setCourseFee(feeByType.getExpectAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()));
+                }
             }
             String paymentChannel = "";
             if (row.getPaymentChannel() == null) {
@@ -937,10 +1007,10 @@ public class ExportController extends BaseController {
         }
 
         try {
-            String[] header = {"序号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "应付金额", "现金支付", "余额支付", "到账时间",
-                    "关联乐团ID/VIP课ID", "课程形态", "课程费用", "新生专享课程费用", "乐器减免费用", "课程减免费用", "押金", "乐器", "教辅费用", "零星收款费用", "零星收款类别", "手续费", "专业", "分部", "单位/学校", "合作机构", "备注"};
-            String[] body = {"id", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "expectAmount", "actualAmount", "balancePaymentAmount", "payTime", "musicGroupId",
-                    "groupType.desc", "courseFee", "highOnlineCourseFee", "remitFee", "courseRemitFee", "leaseFee", "musicalFee", "teachingFee", "sporadicAmount", "sporadicType", "transferFee", "subjectName", "organName", "schoolName", "cooperationOrganName", "memo"};
+            String[] header = {"序号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "应付金额", "现金支付", "余额支付", "到账时间",
+                    "关联乐团ID/VIP课ID", "课程形态", "课程费用", "新生专享课程费用", "乐器减免费用", "课程减免费用", "押金", "乐器", "教辅费用", "维修费用", "零星收款费用", "零星收款类别", "手续费", "专业", "分部", "单位/学校", "合作机构", "备注"};
+            String[] body = {"id", "user.username", "transNo", "orderNo", "paymentChannel", "expectAmount", "actualAmount", "balancePaymentAmount", "payTime", "musicGroupId",
+                    "groupType.desc", "courseFee", "highOnlineCourseFee", "remitFee", "courseRemitFee", "leaseFee", "musicalFee", "teachingFee", "repairFee", "sporadicAmount", "sporadicType", "transferFee", "subjectName", "organName", "schoolName", "cooperationOrganName", "memo"};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, studentPaymentOrderExportDtos);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
@@ -1213,11 +1283,21 @@ public class ExportController extends BaseController {
         }
         OutputStream outputStream = response.getOutputStream();
         Set<Integer> studentIds = vipGroupExports.stream().map(CourseGroupExportDto::getStudentId).collect(Collectors.toSet());
+        List<Map<Integer, Date>> studentLastCourseSchedule = courseScheduleStudentPaymentDao.findStudentLastCourseSchedule(new ArrayList<>(studentIds));
+        Map<Integer, String> studentLastCourseMap = new HashMap<>();
+        if (!CollectionUtils.isEmpty(studentLastCourseSchedule)) {
+            studentLastCourseMap = MapUtil.convertMybatisMap(studentLastCourseSchedule);
+        }
         List<CourseGroupExportDto> studentCourseInfos = courseScheduleDao.getStudentVipCourseInfo(studentIds);
         List<CourseGroupExportDto> totalClassTimes = courseScheduleDao.getStudentCourseScheduleNum(studentIds, GroupType.VIP, null);
         List<CourseGroupExportDto> noStartClassTimes = courseScheduleDao.getStudentCourseScheduleNum(studentIds, GroupType.VIP, CourseStatusEnum.NOT_START);
         for (CourseGroupExportDto vipGroupExport : vipGroupExports) {
 
+            String lastClassDateStr = studentLastCourseMap.get(vipGroupExport.getStudentId());
+            if (StringUtils.isNotBlank(lastClassDateStr)) {
+                vipGroupExport.setLastClassDate(DateUtil.stringToDate(lastClassDateStr));
+            }
+
             for (CourseGroupExportDto studentCourseInfo : studentCourseInfos) {
                 if (studentCourseInfo.getStudentId().equals(vipGroupExport.getStudentId())) {
                     vipGroupExport.setTeacherIds(studentCourseInfo.getTeacherIds());
@@ -1242,8 +1322,8 @@ public class ExportController extends BaseController {
         }
 
         try {
-            String[] header = {"分部", "学生编号", "学生姓名", "指导老师id", "指导老师", "教务老师id", "教务老师", "课程开始时间", "课程截止时间", "总课时", "剩余课时"};
-            String[] body = {"organName", "studentId", "studentName", "teacherIds", "teacherName", "eduTeacherIds", "eduTeacherName", "classStartDate", "classEndDate", "totalClassTimes", "noStartClassTimes"};
+            String[] header = {"分部", "学生编号", "学生姓名", "指导老师id", "指导老师", "教务老师id", "教务老师", "课程开始时间", "课程截止时间", "上次课时间", "总课时", "剩余课时"};
+            String[] body = {"organName", "studentId", "studentName", "teacherIds", "teacherName", "eduTeacherIds", "eduTeacherName", "classStartDate", "classEndDate", "lastClassDate", "totalClassTimes", "noStartClassTimes"};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, vipGroupExports);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
@@ -1940,14 +2020,7 @@ public class ExportController extends BaseController {
             row.setLeaseFee(leaseFee);
             row.setMemo(goodsName);
             //专业
-            if (row.getGroupType().equals(GroupType.MUSIC)) {
-                StudentRegistration studentRegistration = studentRegistrationDao.findStudentByMusicGroupIdAndUserId(row.getMusicGroupId(), row.getUserId());
-                if (studentRegistration != null) {
-                    row.setSubjectName(studentRegistration.getSubjectName());
-                    row.setSchoolName(studentRegistration.getSchoolName());
-                    row.setCooperationOrganName(studentRegistration.getRemark());
-                }
-            } else if (row.getGroupType().equals(GroupType.VIP)) {
+            if (row.getGroupType().equals(GroupType.VIP)) {
                 row.setCourseFee(row.getActualAmount());
                 VipGroup vipGroupInfo = vipGroupDao.findVipGroupInfo(Integer.parseInt(row.getMusicGroupId()), row.getClassGroupId());
                 if (vipGroupInfo != null) {
@@ -1960,27 +2033,9 @@ public class ExportController extends BaseController {
                 row.setMusicalFee(BigDecimal.ZERO);
                 row.setTeachingFee(BigDecimal.ZERO);
                 if (row.getChargeType() != null) {
-
-                    if (row.getChargeType().equals(1)) {
-                        row.setSporadicType("考级");
-                    } else if (row.getChargeType().equals(2)) {
-                        row.setSporadicType("声部更改");
-                    } else if (row.getChargeType().equals(3)) {
-                        row.setSporadicType("乐器更换");
-                    } else if (row.getChargeType().equals(4)) {
-                        row.setSporadicType("配件销售");
-                    } else if (row.getChargeType().equals(5)) {
-                        row.setSporadicType("维修费");
-                    } else if (row.getChargeType().equals(6)) {
-                        row.setSporadicType("福袋活动");
-                    } else if (row.getChargeType().equals(7)) {
-                        row.setSporadicType("上门费");
-                    } else if (row.getChargeType().equals(9)) {
-                        row.setSporadicType("账户充值");
-                    } else if (row.getChargeType().equals(10)) {
-                        row.setSporadicType("乐保服务");
-                    } else if (row.getChargeType().equals(11)) {
-                        row.setSporadicType("其他");
+                    for (SporadicChargeTypeEnum chargeType : SporadicChargeTypeEnum.values()) {
+                        if (!chargeType.getCode().equals(row.getChargeType())) continue;
+                        row.setSporadicType(chargeType.getMsg());
                     }
                 }
                 School userSchool = musicGroupDao.findUserSchool(row.getUserId());
@@ -1997,6 +2052,25 @@ public class ExportController extends BaseController {
                 if (practiceGroup != null) {
                     row.setSubjectName(practiceGroup.getSubjectName());
                 }
+            }else {
+                StudentPaymentOrderExportDto feeByType = sellOrderDao.getFeeByType(row.getId());
+                row.setMusicalFee(feeByType.getMusicalFee());
+                row.setTeachingFee(feeByType.getTeachingFee());
+                if (row.getGroupType().equals(GroupType.MUSIC)) {
+                    StudentRegistration studentRegistration = studentRegistrationDao.findStudentByMusicGroupIdAndUserId(row.getMusicGroupId(), row.getUserId());
+                    if (studentRegistration != null) {
+                        row.setSubjectName(studentRegistration.getSubjectName());
+                        row.setSchoolName(studentRegistration.getSchoolName());
+                        row.setCooperationOrganName(studentRegistration.getRemark());
+                    }
+                    if (row.getCourseFee().compareTo(BigDecimal.ZERO) == 0) {
+                        row.setCourseFee(feeByType.getExpectAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()));
+                    }
+                } else if (row.getType().equals(OrderTypeEnum.REPAIR)) {
+                    row.setRepairFee(feeByType.getExpectAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()));
+                } else if (row.getType().equals(OrderTypeEnum.OUTORDER)) {
+                    row.setCourseFee(feeByType.getExpectAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()));
+                }
             }
             String paymentChannel = "";
             if (row.getPaymentChannel() == null) {
@@ -2014,9 +2088,9 @@ public class ExportController extends BaseController {
 
         try {
             String[] header = {"序号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "应付金额", "现金支付", "余额支付", "分润账户", "分润金额", "分润余额", "到账时间",
-                    "关联乐团ID/VIP课ID", "课程形态", "课程费用", "减免费用", "押金", "乐器", "教辅费用", "零星收款费用", "零星收款类别", "手续费", "专业", "分部", "单位/学校", "合作机构", "备注"};
+                    "关联乐团ID/VIP课ID", "课程形态", "课程费用", "减免费用", "押金", "乐器", "教辅费用", "维修费用", "零星收款费用", "零星收款类别", "手续费", "专业", "分部", "单位/学校", "合作机构", "备注"};
             String[] body = {"id", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "expectAmount", "actualAmount", "balancePaymentAmount", "routeMerNo", "routeAmount", "routeBalance", "payTime", "musicGroupId",
-                    "groupType.desc", "courseFee", "remitFee", "leaseFee", "musicalFee", "teachingFee", "sporadicAmount", "sporadicType", "transferFee", "subjectName", "organName", "schoolName", "cooperationOrganName", "memo"};
+                    "groupType.desc", "courseFee", "remitFee", "leaseFee", "musicalFee", "teachingFee","repairFee", "sporadicAmount", "sporadicType", "transferFee", "subjectName", "organName", "schoolName", "cooperationOrganName", "memo"};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, studentPaymentOrderExportDtos);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls"); //    //收款账户

+ 47 - 0
mec-web/src/main/java/com/ym/mec/web/controller/StudentCourseHomeworkController.java

@@ -0,0 +1,47 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.biz.dal.dto.CourseScheduleStudentListDto;
+import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
+import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
+import com.ym.mec.biz.dal.page.CourseScheduleStudentPaymentQueryInfo;
+import com.ym.mec.biz.service.StudentCourseHomeworkService;
+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 io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/11/17 0017
+ */
+@RestController
+@RequestMapping("studentCourseHomework")
+@Api(tags = "学生课堂作业服务")
+public class StudentCourseHomeworkController extends BaseController {
+
+    @Autowired
+    private StudentCourseHomeworkService studentCourseHomeworkService;
+
+    @ApiOperation(value = "获取课程作业详情")
+    @GetMapping("/getCourseHomeworkDetail")
+    @PreAuthorize("@pcs.hasPermissions('studentCourseHomework/getCourseHomeworkDetail')")
+    public HttpResponseResult getCourseHomeworkDetail(CourseHomeworkQueryInfo queryInfo) {
+        if(Objects.isNull(queryInfo.getCourseScheduleId())){
+            throw new BizException("请指定课程");
+        }
+        return succeed(studentCourseHomeworkService.getCourseHomeworkDetail(queryInfo));
+    }
+
+}

+ 36 - 19
mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java

@@ -1,30 +1,47 @@
 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.dao.EmployeeDao;
-import com.ym.mec.biz.dal.dto.UpdateStudentFeeDto;
-import com.ym.mec.biz.dal.entity.Employee;
-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.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.Arrays;
+import java.util.List;
+
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.Arrays;
-import java.util.List;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dto.UpdateStudentFeeDto;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.page.MusicGroupStudentQueryInfo;
+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.StudentSignQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherPaymentRecordInfo;
+import com.ym.mec.biz.service.MusicGroupStudentFeeService;
+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.QueryInfo;
 
 @Api(tags = "学生管理")
 @RestController
@@ -86,15 +103,15 @@ public class StudentManageController extends BaseController {
     @ApiOperation(value = "学员注册")
     @PostMapping("/register")
     @PreAuthorize("@pcs.hasPermissions('studentManage/register')")
-    public Object studentRegister(SysUser sysUser){
-        return succeed(studentManageService.studentRegister(sysUser));
+    public Object studentRegister(Student student){
+        return succeed(studentManageService.studentRegister(student));
     }
 
     @ApiOperation(value = "修改学员信息")
     @PostMapping("/studentUpdate")
     @PreAuthorize("@pcs.hasPermissions('studentManage/studentUpdate')")
-    public Object studentUpdate(SysUser sysUser){
-        return succeed(studentManageService.studentUpdate(sysUser));
+    public Object studentUpdate(Student student){
+        return succeed(studentManageService.studentUpdate(student));
     }
 
     @ApiOperation(value = "乐团管理--乐团详情--获取学员列表")

+ 39 - 0
mec-web/src/main/java/com/ym/mec/web/controller/SysUserContractsController.java

@@ -0,0 +1,39 @@
+package com.ym.mec.web.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.ym.mec.biz.dal.entity.SysUserContracts;
+import com.ym.mec.biz.service.SysUserContractsService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+
+@RequestMapping("sysUserContracts")
+@Api(tags = "用户协议服务")
+@RestController
+public class SysUserContractsController extends BaseController {
+
+	@Autowired
+	private SysUserContractsService sysUserContractsService;
+	
+    @ApiOperation(value = "查询学生最新协议")
+    @GetMapping("/getLatest")
+    @PreAuthorize("@pcs.hasPermissions('sysUserContracts/getLatest')")
+	public HttpResponseResult<SysUserContracts> getLatest(Integer userId) {
+		
+		SysUserContracts sysUserContracts = sysUserContractsService.getLatestUserContract(userId);
+		
+		if(sysUserContracts == null){
+			return failed("该学员尚未签署协议");
+		}
+
+		return succeed(sysUserContracts);
+	}
+
+}

+ 18 - 0
mec-web/src/main/java/com/ym/mec/web/controller/VipGroupManageController.java

@@ -10,6 +10,7 @@ import com.ym.mec.biz.dal.dto.VipGroupApplyDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.entity.StudentApplyRefunds.StudentApplyRefundsStatus;
 import com.ym.mec.biz.dal.enums.AuditStatusEnum;
+import com.ym.mec.biz.dal.enums.VipGroupStatusEnum;
 import com.ym.mec.biz.dal.page.VipGroupAttendanceQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupSalaryQueryInfo;
@@ -63,6 +64,23 @@ public class VipGroupManageController extends BaseController {
         return succeed();
     }
 
+    @ApiOperation(value = "vip修改")
+    @PostMapping("/update")
+    @PreAuthorize("@pcs.hasPermissions('vipGroupManage/update')")
+    public HttpResponseResult update(VipGroup vipGroup){
+        if(Objects.nonNull(vipGroup.getCoursesExpireDate())){
+            VipGroup oldVipGroup = vipGroupService.get(vipGroup.getId());
+            if(Objects.isNull(oldVipGroup)){
+                throw new BizException("此课程组不存在");
+            }
+            if(!VipGroupStatusEnum.PROGRESS.equals(oldVipGroup.getStatus())){
+                throw new BizException("此课程组状态暂不支持修改");
+            }
+        }
+        vipGroupService.update(vipGroup);
+        return succeed();
+    }
+
     @ApiOperation(value = "vip课申请")
     @PostMapping("/vipGroupApply")
     @PreAuthorize("@pcs.hasPermissions('vipGroupManage/vipGroupApply')")

+ 60 - 0
mec-web/src/main/java/com/ym/mec/web/controller/WebCourseHomeworkController.java

@@ -0,0 +1,60 @@
+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.dao.EmployeeDao;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.page.CourseHomeWorkTemplateQueryInfo;
+import com.ym.mec.biz.service.CourseHomeworkService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @Author zouxuan
+ * @Date 2020/11/17
+ */
+@RequestMapping("webCurseHomework")
+@Api(tags = "课后作业")
+@RestController
+public class WebCourseHomeworkController extends BaseController {
+
+    @Autowired
+    private CourseHomeworkService courseHomeworkService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private EmployeeDao employeeDao;
+
+    @ApiOperation(value = "分页查询作业列表")
+    @GetMapping(value = "/queryHomePage")
+    public Object queryPage(CourseHomeWorkTemplateQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        if (!sysUser.getIsSuperAdmin()) {
+            Employee employee = employeeDao.get(sysUser.getId());
+            if (StringUtils.isEmpty(queryInfo.getOrganId())) {
+                queryInfo.setOrganId(employee.getOrganIdList());
+            } else if (StringUtils.isEmpty(employee.getOrganIdList())) {
+                return failed("用户所在分部异常");
+            } else {
+                List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+                if (!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))) {
+                    return failed("非法请求");
+                }
+            }
+        }
+        return succeed(courseHomeworkService.queryHomePage(queryInfo));
+    }
+
+}