Browse Source

Merge branch 'mec_update_2021-11-02' of http://git.dayaedu.com/yonge/mec into im_update

zouxuan 4 years ago
parent
commit
fcaee5d5be
73 changed files with 1875 additions and 425 deletions
  1. 10 10
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperDao.java
  2. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  3. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeInfoDao.java
  4. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java
  5. 2 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java
  6. 29 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  7. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserCashAccountLogDao.java
  8. 12 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/GoodsSellDto.java
  9. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/IndexErrorDataExportDto.java
  10. 54 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicStudentInstrumentDto.java
  11. 163 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentVipPracticeExportDto.java
  12. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/EmployeeInfo.java
  13. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroup.java
  14. 10 10
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupReturnFeeDto.java
  15. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicMemberDto.java
  16. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserCashAccountDetail.java
  17. 179 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserCashAccountLog.java
  18. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserCoursesAccountDetail.java
  19. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java
  20. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/JobNatureEnum.java
  21. 39 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ReturnFeeEnum.java
  22. 83 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/AccountLogQueryInfo.java
  23. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/EmployeeInfoQueryInfo.java
  24. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupQueryInfo.java
  25. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicMemberQueryInfo.java
  26. 9 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentInstrumentQueryInfo.java
  27. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperService.java
  28. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeInfoService.java
  29. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java
  30. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/PracticeGroupService.java
  31. 11 12
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  32. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserCashAccountLogService.java
  33. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserCashAccountService.java
  34. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperServiceImpl.java
  35. 11 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  36. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  37. 7 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeInfoServiceImpl.java
  38. 71 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  39. 18 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/GroupClassServiceImpl.java
  40. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  41. 82 137
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  42. 85 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  43. 33 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  44. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java
  45. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserCashAccountLogServiceImpl.java
  46. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserCashAccountServiceImpl.java
  47. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherDefaultVipGroupSalaryServiceImpl.java
  48. 45 38
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  49. 3 0
      mec-biz/src/main/resources/config/mybatis/ActivityUserMapperMapper.xml
  50. 3 1
      mec-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml
  51. 51 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  52. 9 0
      mec-biz/src/main/resources/config/mybatis/EmployeeInfoMapper.xml
  53. 7 1
      mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesReplyMapper.xml
  54. 21 0
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  55. 30 20
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  56. 2 4
      mec-biz/src/main/resources/config/mybatis/MusicGroupQuitMapper.xml
  57. 3 0
      mec-biz/src/main/resources/config/mybatis/StudentCourseHomeworkMapper.xml
  58. 10 1
      mec-biz/src/main/resources/config/mybatis/StudentInstrumentMapper.xml
  59. 13 5
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  60. 67 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  61. 5 2
      mec-biz/src/main/resources/config/mybatis/SysUserCashAccountDetailMapper.xml
  62. 111 0
      mec-biz/src/main/resources/config/mybatis/SysUserCashAccountLogMapper.xml
  63. 10 3
      mec-biz/src/main/resources/config/mybatis/SysUserCoursesAccountDetailMapper.xml
  64. 21 2
      mec-web/src/main/java/com/ym/mec/web/controller/EmployeeInfoController.java
  65. 143 57
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  66. 24 1
      mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupQuitController.java
  67. 16 10
      mec-web/src/main/java/com/ym/mec/web/controller/PracticeGroupManageController.java
  68. 10 10
      mec-web/src/main/java/com/ym/mec/web/controller/StudentPaymentRouteOrderController.java
  69. 74 0
      mec-web/src/main/java/com/ym/mec/web/controller/SysUserCashAccountLogController.java
  70. 10 10
      mec-web/src/main/java/com/ym/mec/web/controller/WebCourseHomeworkController.java
  71. 2 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/CourseHomeworkController.java
  72. 2 2
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduOnlineMusicGroupController.java
  73. 29 27
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentRegistrationController.java

+ 10 - 10
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperDao.java

@@ -67,22 +67,22 @@ public interface ActivityUserMapperDao extends BaseDAO<Integer, ActivityUserMapp
     void batchInsert(@Param("activityUserMappers") List<ActivityUserMapper> activityUserMappers);
 
     /**
-    * @description:
+     * @description:
      * @param groupId
  * @param groupType
     * @return com.ym.mec.biz.dal.entity.ActivityUserMapper
-    * @author zx
-    * @date 2021/10/22 17:36
-    */
-    ActivityUserMapper findVipUserMapper(@Param("groupId") Long groupId, @Param("groupType") String groupType);
+     */
+    ActivityUserMapper findVipUserMapper(@Param("groupId") Long groupId,
+                                         @Param("groupType") String groupType,
+                                         @Param("studentId") Integer studentId);
 
     /**
-    * @description: 修改指导老师
+     * @description: 修改指导老师
      * @param userId
      * @param teacherId
-    * @return void
-    * @author zx
-    * @date 2021/11/1 16:21
-    */
+     * @return void
+     * @author zx
+     * @date 2021/11/1 16:21
+     */
     void updateTeacherId(@Param("userId") Integer userId, @Param("teacherId") Integer teacherId);
 }

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

@@ -560,4 +560,22 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @return
      */
     List<BasicUserDto> getCourseStudents(@Param("courseScheduleId") Long courseScheduleId);
+
+    /**
+    * @description: 当前分部是否有vip,网管课
+     * @param organId
+    * @return boolean
+    * @author zx
+    * @date 2021/11/5 11:30
+    */
+    boolean hasCourse(@Param("organId") Integer organId);
+
+    /**
+    * @description:  报表中心学员小课记录导出
+     * @param organId
+    * @return java.util.List<com.ym.mec.biz.dal.dto.StudentVipPracticeExportDto>
+    * @author zx
+    * @date 2021/11/5 11:54 
+    */
+    List<StudentVipPracticeExportDto> exportStudentVipPractice(@Param("organId") Integer organId);
 }

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

@@ -7,4 +7,6 @@ import com.ym.mec.common.dal.BaseDAO;
 public interface EmployeeInfoDao extends BaseDAO<Long, EmployeeInfo> {
 
 	EmployeeInfoDto queryDetail(Long id);
+
+    EmployeeInfo findByPhone(String mobileNo);
 }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java

@@ -187,6 +187,8 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
                                  @Param("educationUserId") Integer educationUserId,
                                  @Param("noPaymentType") Integer noPaymentType);
 
+
+
     List<Map<Integer, Integer>> countOrganNoPaymentStudentNum(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId);
 
     List<String> getNoPaymentMusicGroup(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId);
@@ -316,6 +318,7 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
                                                                  @Param("organIds") List<Integer> organIds);
 
     int countStudentErrorLeave(@Param("organIdList") Set<Integer> organIdList, @Param("format") String format, @Param("classGroupIds") List<Long> classGroupIds);
+    List<Map<Integer, Integer>> countOrganStudentErrorLeave(@Param("organIds") Set<Integer> organIds, @Param("classGroupIds") List<Long> classGroupIds);
 
     int countStudentErrorLeave1(Map<String, Object> params);
 

+ 2 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java

@@ -164,15 +164,13 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
     int countSurplusCourseByMusicGroupAndUser(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId);
 
     /**
-     * @param musicGroupId: 乐团或小课金额
-     * @param groupType:
+     * @param vipGroupId: 乐团或小课金额
      * @return java.math.BigDecimal
      * @describe 统计乐团或vip课的收入金额
      * @author Joburgess
      * @date 2019/12/4
      */
-    BigDecimal sumGroupIncomeFee(@Param("musicGroupId") String musicGroupId,
-                                 @Param("groupType") String groupType);
+    BigDecimal sumGroupIncomeFee(@Param("vipGroupId") Long vipGroupId);
 
     List<StudentPaymentOrder> findStudentPaymentOrder(@Param("groupType") String groupType, @Param("musicGroupId") String musicGroupId);
 

+ 29 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java

@@ -4,15 +4,12 @@ import java.math.BigDecimal;
 import java.util.*;
 
 import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.Subject;
+import com.ym.mec.biz.dal.entity.*;
 
 import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
 import org.apache.ibatis.annotations.Param;
 
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
-import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
 import com.ym.mec.common.dal.BaseDAO;
 
@@ -632,6 +629,15 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     List<StudentRegistration> queryMemberEndAutoQuitMusic(@Param("memberEndAutoQuitMusic") String memberEndAutoQuitMusic,
                                                           @Param("educationUserId") Integer educationUserId,
                                                           @Param("organIds") String organIds);
+
+    /**
+     * 获取所有在会员团,但是没有会员,并且没有待生效的学员
+     * @param memberEndAutoQuitMusic
+     * @return
+     */
+    List<Map<Integer, Integer>> queryOrganMemberEndAutoQuitMusic(@Param("memberEndAutoQuitMusic") String memberEndAutoQuitMusic,
+                                                          @Param("educationUserId") Integer educationUserId,
+                                                          @Param("organIds") Set<Integer> organIds);
     
     /**
      * 统计指定乐团在读的声部人数
@@ -698,4 +704,23 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
      */
     List<CloudTeacherActiveTargetJsonDto> queryOrganTarget();
 
+    /**
+    * @description: 获取乐团在读学员乐保信息
+     * @param params
+    * @return java.util.List<com.ym.mec.biz.dal.entity.StudentInstrument>
+    * @author zx
+    * @date 2021/11/9 10:40
+    */
+    List<StudentInstrument> queryMusicStudentInstrument(Map<String, Object> params);
+
+    int countMusicStudentInstrument(Map<String, Object> params);
+
+    /**
+    * @description: 获取乐团在读和有乐保的人数
+     * @param musicGroupIds
+    * @return java.util.List<com.ym.mec.biz.dal.entity.MusicGroup>
+    * @author zx
+    * @date 2021/11/10 17:55
+    */
+    List<MusicGroup> countInstrument(@Param("musicGroupIds") List<String> musicGroupIds);
 }

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

@@ -0,0 +1,8 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.entity.SysUserCashAccountLog;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface SysUserCashAccountLogDao extends BaseDAO<Long, SysUserCashAccountLog> {
+
+}

+ 12 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/GoodsSellDto.java

@@ -24,13 +24,24 @@ public class GoodsSellDto{
 	@ApiModelProperty(value = "商品销售价", required = false)
 	private BigDecimal goodsPrice = BigDecimal.ZERO;
 
+	@ApiModelProperty(value = "商品团购价", required = false)
+	private BigDecimal goodsGroupPrice = BigDecimal.ZERO;
+
 	@ApiModelProperty(value = "商品销售总价", required = false)
 	private BigDecimal totalGoodsPrice = BigDecimal.ZERO;
 
     @ApiModelProperty(value = "辅件商品列表", required = false)
     private String complementGoodsIdList;
 
-    public String getComplementGoodsIdList() {
+	public BigDecimal getGoodsGroupPrice() {
+		return goodsGroupPrice;
+	}
+
+	public void setGoodsGroupPrice(BigDecimal goodsGroupPrice) {
+		this.goodsGroupPrice = goodsGroupPrice;
+	}
+
+	public String getComplementGoodsIdList() {
         return complementGoodsIdList;
     }
 

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

@@ -28,12 +28,18 @@ public class IndexErrorDataExportDto {
     @ApiModelProperty(value = "未加入任何班级学员")
     private int noClassMusicGroupStudentInfo;
 
+    @ApiModelProperty(value = "学员请假异常数")
+    private int studentErrorLeave;
+
     @ApiModelProperty(value = "未缴费学员数")
     private int studentNotPayment;
 
     @ApiModelProperty(value = "申请退团学员数")
     private int studentApplyForQuitMusicGroup;
 
+    @ApiModelProperty(value = "会员已过期数量")
+    private int noMemberStudentNum;
+
     @ApiModelProperty(value = "预计课酬较低")
     private int teacherExpectSalaryBeLow;
 
@@ -73,6 +79,22 @@ public class IndexErrorDataExportDto {
     @ApiModelProperty(value = "总计")
     private int total;
 
+    public int getStudentErrorLeave() {
+        return studentErrorLeave;
+    }
+
+    public void setStudentErrorLeave(int studentErrorLeave) {
+        this.studentErrorLeave = studentErrorLeave;
+    }
+
+    public int getNoMemberStudentNum() {
+        return noMemberStudentNum;
+    }
+
+    public void setNoMemberStudentNum(int noMemberStudentNum) {
+        this.noMemberStudentNum = noMemberStudentNum;
+    }
+
     public Integer getOrganId() {
         return organId;
     }

+ 54 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicStudentInstrumentDto.java

@@ -0,0 +1,54 @@
+package com.ym.mec.biz.dal.dto;
+
+public class MusicStudentInstrumentDto{
+
+    private Integer userId;
+
+    private String username;
+
+    private String avatar;
+
+    private String phone;
+
+    private Boolean hasInstrument;
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public Boolean getHasInstrument() {
+        return hasInstrument;
+    }
+
+    public void setHasInstrument(Boolean hasInstrument) {
+        this.hasInstrument = hasInstrument;
+    }
+}

+ 163 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentVipPracticeExportDto.java

@@ -0,0 +1,163 @@
+package com.ym.mec.biz.dal.dto;
+
+public class StudentVipPracticeExportDto{
+    private Integer userId;
+
+    private String username;
+
+    private Integer vipOverNum;
+
+    private Integer vipNotStartNum;
+
+    private String vipOverTeacherIds;
+
+    private String vipOverTeacherNames;
+
+    private String vipNotStartTeacherIds;
+
+    private String vipNotStartTeacherNames;
+
+    private Integer practiceOverNum;
+
+    private Integer practiceNotStartNum;
+
+    private String practiceOverTeacherIds;
+
+    private String practiceOverTeacherNames;
+
+    private String practiceNotStartTeacherIds;
+
+    private String practiceNotStartTeacherNames;
+
+    private Integer teacherId;
+
+    private String teacherName;
+
+    public String getVipOverTeacherIds() {
+        return vipOverTeacherIds;
+    }
+
+    public void setVipOverTeacherIds(String vipOverTeacherIds) {
+        this.vipOverTeacherIds = vipOverTeacherIds;
+    }
+
+    public String getVipOverTeacherNames() {
+        return vipOverTeacherNames;
+    }
+
+    public void setVipOverTeacherNames(String vipOverTeacherNames) {
+        this.vipOverTeacherNames = vipOverTeacherNames;
+    }
+
+    public String getVipNotStartTeacherIds() {
+        return vipNotStartTeacherIds;
+    }
+
+    public void setVipNotStartTeacherIds(String vipNotStartTeacherIds) {
+        this.vipNotStartTeacherIds = vipNotStartTeacherIds;
+    }
+
+    public String getVipNotStartTeacherNames() {
+        return vipNotStartTeacherNames;
+    }
+
+    public void setVipNotStartTeacherNames(String vipNotStartTeacherNames) {
+        this.vipNotStartTeacherNames = vipNotStartTeacherNames;
+    }
+
+    public String getPracticeOverTeacherIds() {
+        return practiceOverTeacherIds;
+    }
+
+    public void setPracticeOverTeacherIds(String practiceOverTeacherIds) {
+        this.practiceOverTeacherIds = practiceOverTeacherIds;
+    }
+
+    public String getPracticeOverTeacherNames() {
+        return practiceOverTeacherNames;
+    }
+
+    public void setPracticeOverTeacherNames(String practiceOverTeacherNames) {
+        this.practiceOverTeacherNames = practiceOverTeacherNames;
+    }
+
+    public String getPracticeNotStartTeacherIds() {
+        return practiceNotStartTeacherIds;
+    }
+
+    public void setPracticeNotStartTeacherIds(String practiceNotStartTeacherIds) {
+        this.practiceNotStartTeacherIds = practiceNotStartTeacherIds;
+    }
+
+    public String getPracticeNotStartTeacherNames() {
+        return practiceNotStartTeacherNames;
+    }
+
+    public void setPracticeNotStartTeacherNames(String practiceNotStartTeacherNames) {
+        this.practiceNotStartTeacherNames = practiceNotStartTeacherNames;
+    }
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public Integer getVipOverNum() {
+        return vipOverNum;
+    }
+
+    public void setVipOverNum(Integer vipOverNum) {
+        this.vipOverNum = vipOverNum;
+    }
+
+    public Integer getVipNotStartNum() {
+        return vipNotStartNum;
+    }
+
+    public void setVipNotStartNum(Integer vipNotStartNum) {
+        this.vipNotStartNum = vipNotStartNum;
+    }
+
+    public Integer getPracticeOverNum() {
+        return practiceOverNum;
+    }
+
+    public void setPracticeOverNum(Integer practiceOverNum) {
+        this.practiceOverNum = practiceOverNum;
+    }
+
+    public Integer getPracticeNotStartNum() {
+        return practiceNotStartNum;
+    }
+
+    public void setPracticeNotStartNum(Integer practiceNotStartNum) {
+        this.practiceNotStartNum = practiceNotStartNum;
+    }
+}

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

@@ -134,6 +134,17 @@ public class EmployeeInfo {
 	/**  */
 	private java.util.Date updateTime;
 
+	@ApiModelProperty(value = "是否覆盖", required = false)
+	private Boolean isCover = false;
+
+	public Boolean getCover() {
+		return isCover;
+	}
+
+	public void setCover(Boolean cover) {
+		isCover = cover;
+	}
+
 	public String getHrbpName() {
 		return hrbpName;
 	}

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

@@ -192,6 +192,17 @@ public class MusicGroup {
 	@ApiModelProperty(value = "作业是否发送消息",required = true)
 	private Integer homeworkPushFlag = 1;
 
+	@ApiModelProperty(value = "有乐保的人数",required = true)
+	private Integer hasInstrumentNum;
+
+	public Integer getHasInstrumentNum() {
+		return hasInstrumentNum;
+	}
+
+	public void setHasInstrumentNum(Integer hasInstrumentNum) {
+		this.hasInstrumentNum = hasInstrumentNum;
+	}
+
 	public Integer getHomeworkPushFlag() {
 		return homeworkPushFlag;
 	}

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

@@ -4,25 +4,25 @@ import java.math.BigDecimal;
 
 public class MusicGroupReturnFeeDto {
 
-	private Boolean isReturnCourseFee;
+	private Boolean isReturnCourseFee = false;
 	
-	private BigDecimal courseFee;
+	private BigDecimal courseFee = BigDecimal.ZERO;
 	
-	private Boolean isReturnMemberFee;
+	private Boolean isReturnMemberFee = false;
 	
-	private BigDecimal memberFee;
+	private BigDecimal memberFee = BigDecimal.ZERO;
 	
-	private Boolean isReturnMusicalFee;
+	private Boolean isReturnMusicalFee = false;
 	
-	private BigDecimal musicalFee;
+	private BigDecimal musicalFee = BigDecimal.ZERO;
 	
-	private Boolean isReturnAccessoriesFee;
+	private Boolean isReturnAccessoriesFee = false;
 	
-	private BigDecimal accessoriesFee;
+	private BigDecimal accessoriesFee = BigDecimal.ZERO;
 	
-	private Boolean isReturnMaintenanceFee;
+	private Boolean isReturnMaintenanceFee = false;
 	
-	private BigDecimal maintenanceFee;
+	private BigDecimal maintenanceFee = BigDecimal.ZERO;
 
 	public Boolean getIsReturnCourseFee() {
 		return isReturnCourseFee;

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

@@ -1,5 +1,7 @@
 package com.ym.mec.biz.dal.entity;
 
+import io.swagger.annotations.ApiModelProperty;
+
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -29,6 +31,17 @@ public class MusicMemberDto {
 
 	private Boolean hasNoStartCloudTeacher;
 
+	@ApiModelProperty(value = "0已过期,1即将过期,2待生效", required = false)
+	private Integer hasMember;
+
+	public Integer getHasMember() {
+		return hasMember;
+	}
+
+	public void setHasMember(Integer hasMember) {
+		this.hasMember = hasMember;
+	}
+
 	public Boolean getHasNoStartCloudTeacher() {
 		return hasNoStartCloudTeacher;
 	}

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

@@ -90,6 +90,17 @@ public class SysUserCashAccountDetail {
 
 	private String organName;
 
+	/** vip课程后台添加学员时关联的id */
+	private Long groupId;
+
+	public Long getGroupId() {
+		return groupId;
+	}
+
+	public void setGroupId(Long groupId) {
+		this.groupId = groupId;
+	}
+
 	public String getOrganName() {
 		return organName;
 	}

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

@@ -0,0 +1,179 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.ReturnFeeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 对应数据库表(sys_user_cash_account_log):
+ */
+public class SysUserCashAccountLog {
+
+	@ApiModelProperty(value = "id")
+	private Integer id;
+
+	@ApiModelProperty(value = "用户编号")
+	private Integer userId;
+
+	@ApiModelProperty(value = "学员姓名")
+	private String username;
+
+	@ApiModelProperty(value = "分部")
+	private Integer organId;
+
+	@ApiModelProperty(value = "分部")
+	private String organName;
+
+	@ApiModelProperty(value = "课程组类型")
+	private GroupType groupType;
+
+	@ApiModelProperty(value = "课程组编号")
+	private String groupId;
+
+	@ApiModelProperty(value = "课程组名称")
+	private String groupName;
+
+	@ApiModelProperty(value = "退费金额")
+	private BigDecimal amount;
+
+	@ApiModelProperty(value = "退费类型")
+	private ReturnFeeEnum returnFeeType;
+
+	@ApiModelProperty(value = "打款时间")
+	private Date payTime;
+
+	@ApiModelProperty(value = "交易流水号")
+	private String transNo;
+
+	@ApiModelProperty(value = "创建时间")
+	private Date createTime;
+
+	@ApiModelProperty(value = "修改时间")
+	private Date updateTime;
+
+	@ApiModelProperty(value = "备注")
+	private String comment;
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public String getOrganName() {
+		return organName;
+	}
+
+	public void setOrganName(String organName) {
+		this.organName = organName;
+	}
+
+	public String getGroupName() {
+		return groupName;
+	}
+
+	public void setGroupName(String groupName) {
+		this.groupName = groupName;
+	}
+
+	public String getComment() {
+		return comment;
+	}
+
+	public void setComment(String comment) {
+		this.comment = comment;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Integer getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Integer userId) {
+		this.userId = userId;
+	}
+
+	public Integer getOrganId() {
+		return organId;
+	}
+
+	public void setOrganId(Integer organId) {
+		this.organId = organId;
+	}
+
+	public GroupType getGroupType() {
+		return groupType;
+	}
+
+	public void setGroupType(GroupType groupType) {
+		this.groupType = groupType;
+	}
+
+	public String getGroupId() {
+		return groupId;
+	}
+
+	public void setGroupId(String groupId) {
+		this.groupId = groupId;
+	}
+
+	public BigDecimal getAmount() {
+		return amount;
+	}
+
+	public void setAmount(BigDecimal amount) {
+		this.amount = amount;
+	}
+
+	public ReturnFeeEnum getReturnFeeType() {
+		return returnFeeType;
+	}
+
+	public void setReturnFeeType(ReturnFeeEnum returnFeeType) {
+		this.returnFeeType = returnFeeType;
+	}
+
+	public Date getPayTime() {
+		return payTime;
+	}
+
+	public void setPayTime(Date payTime) {
+		this.payTime = payTime;
+	}
+
+	public String getTransNo() {
+		return transNo;
+	}
+
+	public void setTransNo(String transNo) {
+		this.transNo = transNo;
+	}
+
+	public Date getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public Date getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+}

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

@@ -67,6 +67,17 @@ public class SysUserCoursesAccountDetail {
 
 	private String organName;
 
+	/** vip课程后台添加学员时关联的id */
+	private Long groupId;
+
+	public Long getGroupId() {
+		return groupId;
+	}
+
+	public void setGroupId(Long groupId) {
+		this.groupId = groupId;
+	}
+
 	public String getOrganName() {
 		return organName;
 	}

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

@@ -5,7 +5,8 @@ import com.ym.mec.common.enums.BaseEnum;
 public enum ExportTypeEnum implements BaseEnum<Integer, ExportTypeEnum> {
 	ORDER(1, "订单列表"),
 	COURSE_SCHEDULE(3, "课表列表"),
-	ROUTE_ORDER(2, "财务管理");
+	ROUTE_ORDER(2, "财务管理"),
+	STUDENT_VIP_PRACTICE(4, "学员小课记录");
 
 	private Integer code;
 

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

@@ -6,7 +6,8 @@ import com.ym.mec.common.enums.BaseEnum;
 public enum JobNatureEnum implements BaseEnum<String,JobNatureEnum> {
     PART_TIME("PART_TIME","兼职"),
     FULL_TIME("FULL_TIME","全职"),
-    TEMPORARY("TEMPORARY","零时工");
+    TEMPORARY("TEMPORARY","零时工"),
+    LABOUR("LABOUR","劳务");
 
     private String code;
 

+ 39 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ReturnFeeEnum.java

@@ -0,0 +1,39 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+/**
+ * 退费类型 (VIP vip退课,关闭,PRACTICE 网管课关闭,MUSIC 退团,GOODS 退商品)
+ */
+public enum ReturnFeeEnum implements BaseEnum<String, ReturnFeeEnum> {
+	VIP("VIP", "退学、关闭"),
+	PRACTICE("PRACTICE", "关闭网管课"),
+	MUSIC("MUSIC", "退团"),
+	GOODS("GOODS", "退货");
+
+	private String code;
+
+	private String msg;
+
+	ReturnFeeEnum(String code, String msg) {
+		this.code = code;
+		this.msg = msg;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+	@Override
+	public String getCode() {
+		return this.code;
+	}
+}

+ 83 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/AccountLogQueryInfo.java

@@ -0,0 +1,83 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+* @author zx
+* @date 2021/9/26 15:52
+*/
+public class AccountLogQueryInfo extends QueryInfo {
+
+    private String organId;
+
+    private String groupType;
+
+    private String returnFeeType;
+
+    private String payStartTime;
+
+    private String payEndTime;
+
+    private String createStartTime;
+
+    private String createEndTime;
+
+    public String getReturnFeeType() {
+        return returnFeeType;
+    }
+
+    public void setReturnFeeType(String returnFeeType) {
+        this.returnFeeType = returnFeeType;
+    }
+
+    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 getPayStartTime() {
+        return payStartTime;
+    }
+
+    public void setPayStartTime(String payStartTime) {
+        this.payStartTime = payStartTime;
+    }
+
+    public String getPayEndTime() {
+        return payEndTime;
+    }
+
+    public void setPayEndTime(String payEndTime) {
+        this.payEndTime = payEndTime;
+    }
+
+    public String getCreateStartTime() {
+        return createStartTime;
+    }
+
+    public void setCreateStartTime(String createStartTime) {
+        this.createStartTime = createStartTime;
+    }
+
+    public String getCreateEndTime() {
+        return createEndTime;
+    }
+
+    public void setCreateEndTime(String createEndTime) {
+        this.createEndTime = createEndTime;
+    }
+}

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

@@ -43,6 +43,17 @@ public class EmployeeInfoQueryInfo extends QueryInfo {
 	
 	private String hrbp;
 
+	@ApiModelProperty(value = "是否没有手机号和微信", required = false)
+	private Boolean notMobileAndWechat;
+
+	public Boolean getNotMobileAndWechat() {
+		return notMobileAndWechat;
+	}
+
+	public void setNotMobileAndWechat(Boolean notMobileAndWechat) {
+		this.notMobileAndWechat = notMobileAndWechat;
+	}
+
 	public String getUserNameOrIdOrMobile() {
 		return userNameOrIdOrMobile;
 	}

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

@@ -29,6 +29,9 @@ public class MusicGroupQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "教务老师编号")
     private Integer educationalTeacherId;
 
+    @ApiModelProperty(value = "合作单位编号")
+    private Integer cooperationOrganId;
+
     private MusicGroupStatusEnum status;
 
     private Boolean noClassStudentMusicGroup;
@@ -47,6 +50,25 @@ public class MusicGroupQueryInfo extends QueryInfo {
     
     private Date billEndDate;
 
+    @ApiModelProperty(value = "维修技师")
+    private Integer repairUserId;
+
+    public Integer getRepairUserId() {
+        return repairUserId;
+    }
+
+    public void setRepairUserId(Integer repairUserId) {
+        this.repairUserId = repairUserId;
+    }
+
+    public Integer getCooperationOrganId() {
+        return cooperationOrganId;
+    }
+
+    public void setCooperationOrganId(Integer cooperationOrganId) {
+        this.cooperationOrganId = cooperationOrganId;
+    }
+
     public CourseViewTypeEnum getCourseViewType() {
         return courseViewType;
     }

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicMemberQueryInfo.java

@@ -7,8 +7,8 @@ import java.util.Date;
 
 public class MusicMemberQueryInfo extends QueryInfo {
 
-	@ApiModelProperty(value = "0已过期,1即将过期", required = false)
-	private Integer hasMember;
+	@ApiModelProperty(value = "0已过期,1即将过期,2待生效", required = false)
+	private Integer hasMember = 0;
 
 	private String memberEndAutoQuitMusic;
 

+ 9 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentInstrumentQueryInfo.java

@@ -29,7 +29,6 @@ public class StudentInstrumentQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "商品分类id")
     private Integer goodsCategoryId;
 
-
     @ApiModelProperty(value = "乐器品牌")
     private String goodsBrand;
 
@@ -42,6 +41,15 @@ public class StudentInstrumentQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "是否乐保 0-不是 1-是")
     private Integer status;
 
+    private String musicGroupId;
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
 
     public Integer getStudentId() {
         return studentId;

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

@@ -67,5 +67,5 @@ public interface ActivityUserMapperService extends BaseService<Integer, Activity
     * @author zx
     * @date 2021/10/22 17:35
     */
-    ActivityUserMapper findVipUserMapper(Long groupId,String groupType);
+    ActivityUserMapper findVipUserMapper(Long groupId,String groupType,Integer studentId);
 }

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

@@ -7,4 +7,6 @@ import com.ym.mec.common.service.BaseService;
 public interface EmployeeInfoService extends BaseService<Long, EmployeeInfo> {
 
 	EmployeeInfoDto queryDetail(Long id);
+
+    EmployeeInfo findByPhone(String mobileNo);
 }

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

@@ -31,4 +31,14 @@ public interface ExportService {
      * @param managerDownload
      */
     void superFindCourseSchedules(EndCourseScheduleQueryInfo queryInfo, ManagerDownload managerDownload) throws FileNotFoundException;
+
+    /**
+    * @description:  报表中心学员小课记录导出
+     * @param organId
+     * @param managerDownload
+    * @return void
+    * @author zx
+    * @date 2021/11/5 11:38 
+    */
+    void studentVipPractice(Integer organId, ManagerDownload managerDownload) throws FileNotFoundException;
 }

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

@@ -420,4 +420,13 @@ public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {
 	* @date 2021/10/20 10:39
 	*/
 	HttpResponseResult buyDoubleEleven2021(BuyDoubleEleven2021Dto buyDoubleEleven2021Dto) throws Exception;
+
+	/**
+	* @description: 获取学生指定网管课的剩余课时费用
+	 * @param practiceGroupId
+	* @return java.lang.Object
+	* @author zx
+	* @date 2021/11/2 18:07
+	*/
+	Map<String,BigDecimal> getStudentSurplusCourseFee(Long practiceGroupId);
 }

+ 11 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java

@@ -14,19 +14,9 @@ import com.ym.mec.biz.dal.dto.StudentInfo;
 import com.ym.mec.biz.dal.dto.StudentMusicDetailDto;
 import com.ym.mec.biz.dal.dto.StudentMusicGroupDto;
 import com.ym.mec.biz.dal.dto.StudentRegisterInstrumentsDetailDto;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
-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.Subject;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
-import com.ym.mec.biz.dal.page.MusicGroupRecordStudentQueryInfo;
-import com.ym.mec.biz.dal.page.NoClassMusicStudentQueryInfo;
-import com.ym.mec.biz.dal.page.RegistrationOrPreQueryInfo;
-import com.ym.mec.biz.dal.page.StudentRegistrationQueryInfo;
+import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
@@ -458,4 +448,13 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      * @return
      */
     Boolean setCloudTeacherToFailed(StudentRegistration studentRegistration);
+
+    /**
+    * @description: 获取乐团在读学员乐保信息
+     * @param queryInfo
+    * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.entity.StudentRegistration>
+    * @author zx
+    * @date 2021/11/9 10:27
+    */
+    PageInfo<StudentInstrument> queryMusicStudentInstrument(StudentPreRegistrationQueryInfo queryInfo);
 }

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

@@ -0,0 +1,10 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.SysUserCashAccountLog;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.common.service.BaseService;
+
+public interface SysUserCashAccountLogService extends BaseService<Long, SysUserCashAccountLog> {
+
+}

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

@@ -64,7 +64,7 @@ public interface SysUserCashAccountService extends BaseService<Integer, SysUserC
 	 * @param description:
 	 * @return void
 	 */
-	void subtractFromCourseBalanceAndBalance(Integer userId, BigDecimal decimal, PlatformCashAccountDetailTypeEnum type, String description);
+	void subtractFromCourseBalanceAndBalance(Integer userId, BigDecimal decimal, PlatformCashAccountDetailTypeEnum type, String description,Long vipGroupId);
 
 	/**
 	 * 将课程余额转入到可用余额

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

@@ -47,7 +47,7 @@ public class ActivityUserMapperServiceImpl extends BaseServiceImpl<Integer, Acti
     }
 
 	@Override
-	public ActivityUserMapper findVipUserMapper(Long groupId, String groupType) {
-		return activityUserMapperDao.findVipUserMapper(groupId,groupType);
+	public ActivityUserMapper findVipUserMapper(Long groupId, String groupType,Integer studentId) {
+		return activityUserMapperDao.findVipUserMapper(groupId,groupType,studentId);
 	}
 }

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

@@ -668,7 +668,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 							}
 							Integer vipGroupActivityId = practiceGroup.getVipGroupActivityId();
 							if(vipGroupActivityId != null){
-								ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(practiceGroup.getId(),"PRACTICE");
+								ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(practiceGroup.getId(),"PRACTICE",null);
 								if(activityUserMapper != null){
 									Map<String, BigDecimal> map = practiceGroupService.countPracticeGroupPredictFee1(practiceGroup, cgtm.getUserId());
 									if(practiceGroup.getId().equals(activityUserMapper.getPracticeGroupId())){
@@ -2794,7 +2794,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					Integer allowOnlineToOffline = 0;
 					if(Objects.nonNull(vipGroupActivity)){
 						allowOnlineToOffline = vipGroupActivity.getAllowOnlineToOffline();
-						ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(), "VIP");
+						ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(), "VIP",null);
 						if(activityUserMapper != null){
 							if(vipGroup.getId().equals(activityUserMapper.getGiveVipGroupId())){
 								allowOnlineToOffline = vipGroupActivity.getGiveAllowOnlineToOffline();
@@ -3009,7 +3009,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				Integer allowOnlineToOffline = 0;
 				if(Objects.nonNull(vipGroupActivity)){
 					allowOnlineToOffline = vipGroupActivity.getAllowOnlineToOffline();
-					ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(), "VIP");
+					ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(), "VIP",null);
 					if(activityUserMapper != null){
 						if(vipGroup.getId().equals(activityUserMapper.getGiveVipGroupId())){
 							allowOnlineToOffline = vipGroupActivity.getGiveAllowOnlineToOffline();
@@ -3463,7 +3463,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				Integer allowOnlineToOffline = 0;
 				if(Objects.nonNull(vipGroupActivity)){
 					allowOnlineToOffline = vipGroupActivity.getAllowOnlineToOffline();
-					ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(), "VIP");
+					ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(), "VIP",null);
 					if(activityUserMapper != null){
 						if(vipGroup.getId().equals(activityUserMapper.getGiveVipGroupId())){
 							allowOnlineToOffline = vipGroupActivity.getGiveAllowOnlineToOffline();
@@ -3810,7 +3810,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 							Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee1(vipGroup, teacherId, ts.getCourseScheduleId());
 							BigDecimal teacherSalary = salaryMap.get("offlineTeacherSalary");
 							//是否是赠送课程
-							ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),"VIP");
+							ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),"VIP",null);
 							if(activityUserMapper != null){
 								if(vipGroup.getId().equals(activityUserMapper.getGiveVipGroupId())){
 									teacherSalary = salaryMap.get("giveOfflineTeacherSalary");
@@ -3839,7 +3839,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 							if(practiceGroup != null){
 								Integer vipGroupActivityId = practiceGroup.getVipGroupActivityId();
 								if(vipGroupActivityId != null){
-									ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(practiceGroup.getId(),"PRACTICE");
+									ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(practiceGroup.getId(),"PRACTICE",null);
 									if(activityUserMapper != null){
 										Map<String, BigDecimal> map = practiceGroupService.countPracticeGroupPredictFee1(practiceGroup, ts.getUserId());
 										if(practiceGroup.getId().equals(activityUserMapper.getPracticeGroupId())){
@@ -4044,7 +4044,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee1(byCourseSchedule, newCourseSchedule.getActualTeacherId(), newCourseSchedule.getId());
 					BigDecimal teacherSalary = salaryMap.get("offlineTeacherSalary");
 					//是否是赠送课程
-					ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(byCourseSchedule.getId(),"VIP");
+					ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(byCourseSchedule.getId(),"VIP",null);
 					if(activityUserMapper != null){
 						if(byCourseSchedule.getId().equals(activityUserMapper.getGiveVipGroupId())){
 							teacherSalary = salaryMap.get("giveOfflineTeacherSalary");
@@ -4906,7 +4906,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         Map<String, Object> params = new HashMap<>(16);
         MapUtil.populateMap(params, queryInfo);
 
-        List<CourseScheduleEndDto> results;
+//        List<CourseScheduleEndDto> results;
 //		SysUser sysUser = sysUserFeignService.queryUserInfo();
 //		List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
 		//如果当前用户只有教务老师角色,那么只能看到他所管理的课程组的信息
@@ -4923,7 +4923,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         }
 		pageInfo.setTotal(count);
 		params.put("offset", pageInfo.getOffset());
-		results = courseScheduleDao.endFindCourseSchedules(params);
+		List<CourseScheduleEndDto> results = courseScheduleDao.endFindCourseSchedules(params);
         if (!CollectionUtils.isEmpty(results)) {
             List<Long> courseScheduleIds = results.stream().map(CourseScheduleEndDto::getId).collect(Collectors.toList());
             List<Integer> teacherIds=results.stream().filter(t->Objects.nonNull(t.getActualTeacherId())).map(CourseSchedule::getActualTeacherId).collect(Collectors.toList());
@@ -5131,7 +5131,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		if(practiceGroup != null){
 			Integer vipGroupActivityId = practiceGroup.getVipGroupActivityId();
 			if(vipGroupActivityId != null){
-				ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(practiceGroup.getId(),"PRACTICE");
+				ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(practiceGroup.getId(),"PRACTICE",null);
 				if(activityUserMapper != null){
 					Map<String, BigDecimal> map = practiceGroupService.countPracticeGroupPredictFee1(practiceGroup, teacherId);
 					if(practiceGroup.getId().equals(activityUserMapper.getPracticeGroupId())){
@@ -5255,7 +5255,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					if(practiceGroup != null){
 						Integer vipGroupActivityId = practiceGroup.getVipGroupActivityId();
 						if(vipGroupActivityId != null){
-							ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(practiceGroup.getId(),"PRACTICE");
+							ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(practiceGroup.getId(),"PRACTICE",null);
 							if(activityUserMapper != null){
 								Map<String, BigDecimal> map = practiceGroupService.countPracticeGroupPredictFee1(practiceGroup, teacherId);
 								if(practiceGroup.getId().equals(activityUserMapper.getPracticeGroupId())){

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

@@ -931,7 +931,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByGroupWithNotStart(vipGroupId.toString(), GroupType.VIP.getCode());
         if(!CollectionUtils.isEmpty(courseScheduleTeacherSalaries)){
             //是否是赠送课程
-            ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),"VIP");
+            ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),"VIP",null);
             Map<String, BigDecimal> salary = vipGroupService.countVipGroupPredictFee1(vipGroup, vipGroup.getUserId(), null);
             for(int i=0;i<courseScheduleTeacherSalaries.size();i++){
                 if(!courseScheduleTeacherSalaries.get(i).getEnableChangeSalary()){
@@ -1413,7 +1413,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     private void createVipGroupCourseTeacherSalaries(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries){
         VipGroup vipGroup = vipGroupService.get(Long.valueOf(courseSchedule.getMusicGroupId()));
         //是否是赠送课程
-        ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),"VIP");
+        ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(vipGroup.getId(),"VIP",null);
         for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
             Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee1(vipGroup, courseSchedule.getActualTeacherId(), courseSchedule.getId());
             BigDecimal teacherSalary = salaryMap.get("offlineTeacherSalary");
@@ -1465,7 +1465,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 if(practiceGroup != null){
                     Integer vipGroupActivityId = practiceGroup.getVipGroupActivityId();
                     if(vipGroupActivityId != null){
-                        ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(practiceGroup.getId(),"PRACTICE");
+                        ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(practiceGroup.getId(),"PRACTICE",null);
                         if(activityUserMapper != null){
                             Map<String, BigDecimal> map = practiceGroupService.countPracticeGroupPredictFee1(practiceGroup, courseScheduleTeacherSalary.getUserId());
                             if(practiceGroup.getId().equals(activityUserMapper.getPracticeGroupId())){

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

@@ -12,7 +12,7 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 
 @Service
 public class EmployeeInfoServiceImpl extends BaseServiceImpl<Long, EmployeeInfo>  implements EmployeeInfoService {
-	
+
 	@Autowired
 	private EmployeeInfoDao employeeInfoDao;
 
@@ -25,5 +25,10 @@ public class EmployeeInfoServiceImpl extends BaseServiceImpl<Long, EmployeeInfo>
 	public EmployeeInfoDto queryDetail(Long id) {
 		return employeeInfoDao.queryDetail(id);
 	}
-	
+
+    @Override
+    public EmployeeInfo findByPhone(String mobileNo) {
+		return employeeInfoDao.findByPhone(mobileNo);
+    }
+
 }

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

@@ -62,6 +62,8 @@ public class ExportServiceImpl implements ExportService {
     private CourseScheduleService courseScheduleService;
     @Autowired
     private StudentService studentService;
+    @Autowired
+    private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
 
     @Override
     @Async
@@ -311,7 +313,7 @@ public class ExportServiceImpl implements ExportService {
             }
             row.setPaymentChannel(paymentChannel);
             row.setId(i);
-            row.setRepairFee(row.getRepairFee().add(row.getMaintenanceFee()).add(row.getMaintenanceProductFee()));
+            row.setRepairFee(row.getRepairFee().add(row.getMaintenanceProductFee()));
             row.setOrderAmount(row.getExpectAmount().add(row.getCouponRemitFee()));
             i++;
         }
@@ -323,11 +325,11 @@ public class ExportServiceImpl implements ExportService {
         HSSFWorkbook workbook = null;
         try {
             String[] header = {"序号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额",
-                    "乐团课", "VIP课", "网管课", "乐理课", "考级", "维修费用", "云教练", "押金", "乐器", "教辅费用", "上门费",
+                    "乐团课", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费",
                     "账户充值", "其它", "手续费", "到账时间",
                     "关联乐团ID/VIP课ID", "课程形态", "零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"};
             String[] body = {"id", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount",  "couponRemitFee",
-                    "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "cloudTeacherFee",
+                    "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee",
                     "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee", "otherFee", "transferFee", "payTime", "musicGroupId",
                     "groupType.desc", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"};
             workbook = POIUtil.exportExcel(header, body, studentPaymentOrderExportDtos);
@@ -666,6 +668,7 @@ public class ExportServiceImpl implements ExportService {
             BigDecimal routeTeachingFee = BigDecimal.ZERO;
             BigDecimal routeOtherFee = BigDecimal.ZERO;
             BigDecimal routeCloudTeacherFee = BigDecimal.ZERO;
+            BigDecimal routeRechargeFee = BigDecimal.ZERO;
             for (StudentPaymentOrderExportDto order : orders) {
                 Date endDate = DateUtil.stringToDate("2021-04-01", "yyyy-MM-dd");
                 if (order.getPayTime() == null || order.getPayTime().compareTo(endDate) < 0) {
@@ -681,7 +684,7 @@ public class ExportServiceImpl implements ExportService {
                     order.setRepairFee(order.getMaintenanceProductFee());
                     continue;
                 } else if (order.getSaleAmount().compareTo(BigDecimal.ZERO) == 0 && order.getServiceAmount().compareTo(BigDecimal.ZERO) > 0) {
-                    order.setRepairFee(order.getRepairFee().add(order.getMaintenanceFee()));
+                    order.setRepairFee(order.getRepairFee());
                     order.setCloudTeacherFee(order.getCloudTeacherFee());
                     order.setMusicalFee(BigDecimal.ZERO);
                     order.setTeachingFee(BigDecimal.ZERO);
@@ -702,6 +705,7 @@ public class ExportServiceImpl implements ExportService {
                 BigDecimal teachingFee = BigDecimal.ZERO;
                 BigDecimal otherFee = BigDecimal.ZERO;
                 BigDecimal cloudTeacherFee = BigDecimal.ZERO;
+                BigDecimal rechargeFee = BigDecimal.ZERO;
 
                 if (order.getActualAmount() != null && order.getActualAmount().compareTo(BigDecimal.ZERO) > 0) {
                     musicGroupCourseFee = order.getMusicGroupCourseFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
@@ -730,6 +734,8 @@ public class ExportServiceImpl implements ExportService {
                             degreeFee = order.getRouteAmount();
                         } else if (order.getChargeType() != null && SporadicChargeTypeEnum.PRACTICE_GROUP_BUY.getCode().equals(order.getChargeType())) {
                             practiceCourseFee = order.getRouteAmount();
+                        } else if (order.getChargeType() != null && SporadicChargeTypeEnum.RECHARGE.getCode().equals(order.getChargeType())) {
+                            rechargeFee = order.getRouteAmount();
                         } else {
                             otherFee = order.getRouteAmount();
                         }
@@ -759,6 +765,7 @@ public class ExportServiceImpl implements ExportService {
                     musicalFee = order.getMusicalFee().subtract(routeMusicalFee);
                     teachingFee = order.getTeachingFee().subtract(routeTeachingFee);
                     otherFee = order.getOtherFee().subtract(routeOtherFee);
+                    rechargeFee = order.getRechargeFee().subtract(routeRechargeFee);
                     cloudTeacherFee = order.getCloudTeacherFee().subtract(routeCloudTeacherFee);
                 }
                 j++;
@@ -775,6 +782,7 @@ public class ExportServiceImpl implements ExportService {
                 routeMusicalFee = routeMusicalFee.add(musicalFee);
                 routeTeachingFee = routeTeachingFee.add(teachingFee);
                 routeOtherFee = routeOtherFee.add(otherFee);
+                routeRechargeFee = routeRechargeFee.add(rechargeFee);
                 routeCloudTeacherFee = routeCloudTeacherFee.add(cloudTeacherFee);
 
                 order.setMusicGroupCourseFee(musicGroupCourseFee);
@@ -782,13 +790,14 @@ public class ExportServiceImpl implements ExportService {
                 order.setPracticeCourseFee(practiceCourseFee);
                 order.setTheoryCourseFee(theoryCourseFee);
                 order.setDegreeFee(degreeFee);
-                order.setRepairFee(repairFee.add(maintenanceFee).add(maintenanceProductFee).add(repairFee));
+                order.setRepairFee(repairFee.add(maintenanceProductFee));
                 order.setMaintenanceFee(maintenanceFee);
                 order.setMaintenanceProductFee(maintenanceProductFee);
                 order.setLeaseFee(leaseFee);
                 order.setMusicalFee(musicalFee);
                 order.setTeachingFee(teachingFee);
                 order.setOtherFee(otherFee);
+                order.setRechargeFee(rechargeFee);
                 order.setCloudTeacherFee(cloudTeacherFee);
             }
         });
@@ -802,11 +811,13 @@ public class ExportServiceImpl implements ExportService {
 
         HSSFWorkbook workbook = null;
         try {
-            String[] header = {"序号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "分润账户", "分润金额", "分配余额", "优惠金额", "乐团课", "VIP课", "网管课", "乐理课", "考级", "维修费用", "云教练", "押金", "乐器", "教辅费用", "上门费", "账户充值", "其它", "手续费", "到账时间",
+            String[] header = {"序号", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额",
+                    "现金支付", "余额支付", "分润账户", "分润金额", "分配余额", "优惠金额", "乐团课", "VIP课", "网管课", "乐理课",
+                    "考级", "维修费用", "乐保费用", "云教练", "押金", "乐器", "教辅费用", "上门费", "账户充值", "其它", "手续费", "到账时间",
                     "关联乐团ID/VIP课ID", "课程形态", "零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"};
-            String[] body = {"id", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount"
+            String[] body = {"id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount"
                     , "expectAmount", "actualAmount", "balancePaymentAmount", "routeMerNo", "routeAmount", "routeBalance",  "couponRemitFee",
-                    "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "cloudTeacherFee", "leaseFee", "musicalFee", "teachingFee", "visitFee",
+                    "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee", "leaseFee", "musicalFee", "teachingFee", "visitFee",
                     "rechargeFee", "otherFee", "transferFee", "payTime", "musicGroupId",
                     "groupType.desc", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"};
             workbook = POIUtil.exportExcel(header, body, studentPaymentOrderExportDtos);
@@ -872,4 +883,56 @@ public class ExportServiceImpl implements ExportService {
             }
         }
     }
+
+    @Override
+    public void studentVipPractice(Integer organId, ManagerDownload managerDownload) throws FileNotFoundException {
+        List<StudentVipPracticeExportDto> studentVipPracticeExportDtos = courseScheduleStudentPaymentDao.exportStudentVipPractice(organId);
+        for (StudentVipPracticeExportDto studentVipPracticeExportDto : studentVipPracticeExportDtos) {
+            String vipOverTeacherIds = studentVipPracticeExportDto.getVipOverTeacherIds();
+            String vipOverTeacherNames = studentVipPracticeExportDto.getVipOverTeacherNames();
+            if(StringUtils.isNotEmpty(vipOverTeacherIds) && vipOverTeacherIds.contains(",")){
+                studentVipPracticeExportDto.setVipOverTeacherIds(vipOverTeacherIds.split(",")[0]);
+                studentVipPracticeExportDto.setVipOverTeacherNames(vipOverTeacherNames.split(",")[0]);
+            }
+            String practiceOverTeacherIds = studentVipPracticeExportDto.getPracticeOverTeacherIds();
+            String practiceOverTeacherNames = studentVipPracticeExportDto.getPracticeOverTeacherNames();
+            if(StringUtils.isNotEmpty(practiceOverTeacherIds) && practiceOverTeacherIds.contains(",")){
+                studentVipPracticeExportDto.setPracticeOverTeacherIds(practiceOverTeacherIds.split(",")[0]);
+                studentVipPracticeExportDto.setPracticeOverTeacherNames(practiceOverTeacherNames.split(",")[0]);
+            }
+        }
+
+        String basePath = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath();
+        File file = new File(basePath + "/" + managerDownload.getName());
+        FileOutputStream fileOutputStream = new FileOutputStream(file);
+
+        HSSFWorkbook workbook = null;
+        try {
+            String[] header = {"学员编号", "学生姓名", "VIP已结束课时数", "VIP未开始课时数", "已结束VIP上课老师编号", "已结束VIP上课老师",
+                    "网管课已结束课时数", "网管课未开始课时数", "已结束网管课上课老师编号", "已结束网管课上课老师", "指导老师编号", "指导老师"};
+            String[] body = {"userId", "username", "vipOverNum", "vipNotStartNum", "vipOverTeacherIds", "vipOverTeacherNames"
+                    , "practiceOverNum", "practiceNotStartNum", "practiceOverTeacherIds", "practiceOverTeacherNames","teacherId","teacherName"};
+            workbook = POIUtil.exportExcel(header, body, studentVipPracticeExportDtos);
+            workbook.write(fileOutputStream);
+            fileOutputStream.getFD().sync();
+            fileOutputStream.close();
+
+            String folder = "download/" + UploadUtil.getFileFloder();
+            String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, folder, file);
+            //把记录插入下载表
+            managerDownload.setFileUrl(url);
+            managerDownload.setStatus(1);
+            managerDownloadDao.update(managerDownload);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                fileOutputStream.close();
+                workbook.close();
+                file.delete();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
 }

+ 18 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/GroupClassServiceImpl.java

@@ -57,7 +57,7 @@ public class GroupClassServiceImpl implements GroupClassService {
     @Autowired
     private SysUserCashAccountService sysUserCashAccountService;
     @Autowired
-    private StudentPaymentOrderDao studentPaymentOrderDao;
+    private SysUserCashAccountLogDao sysUserCashAccountLogDao;
     @Autowired
     private CoursesGroupDao coursesGroupDao;
     @Autowired
@@ -173,17 +173,27 @@ public class GroupClassServiceImpl implements GroupClassService {
             if (!practiceGroup.getGroupStatus().equals(GroupStatusEnum.NORMAL) || practiceGroup.getCoursesExpireDate().before(now)) {
                 throw new BizException("当前课程组不可关闭");
             }
-            ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(practiceGroup.getId(),"PRACTICE");
+            if (Objects.nonNull(returnFeeDto.getAmount()) && returnFeeDto.getAmount().compareTo(BigDecimal.ZERO) > 0) {
+                Map<String, BigDecimal> studentSurplusCourseFee = practiceGroupService.getStudentSurplusCourseFee(groupId);
+                BigDecimal suplusCourseFee = studentSurplusCourseFee.get("suplusCourseOriginalFee");
+                if(returnFeeDto.getAmount().compareTo(suplusCourseFee) > 0){
+                    throw new BizException("学员最大可退费金额为{}元", suplusCourseFee.toString());
+                }
+                SysUserCashAccountLog sysUserCashAccountLog = new SysUserCashAccountLog();
+                sysUserCashAccountLog.setGroupType(GroupType.PRACTICE);
+                sysUserCashAccountLog.setUserId(practiceGroup.getStudentId());
+                sysUserCashAccountLog.setOrganId(practiceGroup.getOrganId());
+                sysUserCashAccountLog.setGroupId(practiceGroup.getId().toString());
+                sysUserCashAccountLog.setAmount(returnFeeDto.getAmount());
+                sysUserCashAccountLog.setReturnFeeType(ReturnFeeEnum.PRACTICE);
+                sysUserCashAccountLog.setComment("后台关闭网管课");
+                sysUserCashAccountLogDao.insert(sysUserCashAccountLog);
+            }
+            ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(practiceGroup.getId(),"PRACTICE",null);
             HttpResponseResult result = quitActivityGive(activityUserMapper, returnFeeDto.getConfirmReturnActivityGive(), practiceGroup.getId(),GroupType.PRACTICE);
             if(result.getCode() != 200){
                 return result;
             }
-//            if (Objects.nonNull(refundAmount) && refundAmount.compareTo(BigDecimal.ZERO) > 0) {
-//                if (refundAmount.compareTo(orders.get(0).getExpectAmount()) > 0) {
-//                    throw new BizException("退款不可大于购买金额");
-//                }
-//                sysUserCashAccountService.updateBalance(practiceGroup.getStudentId(), refundAmount, PlatformCashAccountDetailTypeEnum.REFUNDS, "后台关闭网管课");
-//            }
             cleanGroupInfo(groupId.toString(), GroupType.PRACTICE);
             practiceGroup.setMemo("后台关闭网管课");
             practiceGroup.setGroupStatus(GroupStatusEnum.CANCEL);

+ 24 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java

@@ -811,6 +811,10 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		Map<Integer, Integer> teacherNotAClassMap = new HashMap<>();
 		//服务指标异常
 		Map<Integer, Integer> teacherServeErrorMap = new HashMap<>();
+		//学员请假异常
+		Map<Integer, Integer> studentErrorLeaveMap = new HashMap<>();
+		//会员过期学员数
+		Map<Integer, Integer> noMemberStudentMap = new HashMap<>();
 
 		if(IndexErrorType.MUSIC_PATROL.equals(errorType)||Objects.isNull(errorType)){
 			//基础技能班学员数量异常
@@ -827,6 +831,10 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		}
 
 		if(IndexErrorType.STUDENT_INFO.equals(errorType)||Objects.isNull(errorType)){
+			//学员异常请假数
+			List<Map<Integer, Integer>> studentErrorLeaveMapList = indexBaseMonthDataDao.countOrganStudentErrorLeave(organIds, classGroupIds);
+			studentErrorLeaveMap = MapUtil.mapListToMap(studentErrorLeaveMapList, Integer.class, Integer.class);
+
 			//未缴费学员数
 			List<Map<Integer, Integer>> studentNotPaymentMapList = indexBaseMonthDataDao.countOrganNoPaymentStudentNum(organIds, educationUserId);
 			studentNotPaymentMap = MapUtil.mapListToMap(studentNotPaymentMapList, Integer.class, Integer.class);
@@ -834,6 +842,10 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			//申请退团学员数
 			List<Map<Integer, Integer>> studentApplyForQuitMusicGroupMapList = indexBaseMonthDataDao.queryOrganApplyForQuitGroupNum(organIds, educationUserId);
 			studentApplyForQuitMusicGroupMap = MapUtil.mapListToMap(studentApplyForQuitMusicGroupMapList, Integer.class, Integer.class);
+
+			//会员过期学员数
+			List<Map<Integer, Integer>> memberEndAutoQuitMusicMapList = studentRegistrationDao.queryOrganMemberEndAutoQuitMusic(null, educationUserId,organIds);
+			noMemberStudentMap = MapUtil.mapListToMap(memberEndAutoQuitMusicMapList, Integer.class, Integer.class);
 		}
 
 		if(IndexErrorType.TEACHER_INFO.equals(errorType)||Objects.isNull(errorType)){
@@ -921,6 +933,12 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			}
 			total += indexErrorData.getNoClassMusicGroupStudentInfo();
 			totalData.setNoClassMusicGroupStudentInfo(totalData.getNoClassMusicGroupStudentInfo() + indexErrorData.getNoClassMusicGroupStudentInfo());
+			//学员请假异常数
+			if(studentErrorLeaveMap.containsKey(organ.getId())){
+				indexErrorData.setStudentErrorLeave(studentErrorLeaveMap.get(organ.getId()));
+			}
+			total += indexErrorData.getStudentErrorLeave();
+			totalData.setStudentErrorLeave(totalData.getStudentErrorLeave() + indexErrorData.getStudentErrorLeave());
 			//未缴费学员数
 			if(studentNotPaymentMap.containsKey(organ.getId())){
 				indexErrorData.setStudentNotPayment(studentNotPaymentMap.get(organ.getId()));
@@ -933,6 +951,12 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			}
 			total += indexErrorData.getStudentApplyForQuitMusicGroup();
 			totalData.setStudentApplyForQuitMusicGroup(totalData.getStudentApplyForQuitMusicGroup() + indexErrorData.getStudentApplyForQuitMusicGroup());
+			//会员已过期数量
+			if(noMemberStudentMap.containsKey(organ.getId())){
+				indexErrorData.setNoMemberStudentNum(noMemberStudentMap.get(organ.getId()));
+			}
+			total += indexErrorData.getNoMemberStudentNum();
+			totalData.setNoMemberStudentNum(totalData.getNoMemberStudentNum() + indexErrorData.getNoMemberStudentNum());
 			//预计课酬较低
 			if(teacherExpectSalaryBeLowMap.containsKey(organ.getId())){
 				indexErrorData.setTeacherExpectSalaryBeLow(teacherExpectSalaryBeLowMap.get(organ.getId()));

+ 82 - 137
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -29,6 +29,9 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.*;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,47 +45,6 @@ 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.ChargeTypeDao;
-import com.ym.mec.biz.dal.dao.ClassGroupDao;
-import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
-import com.ym.mec.biz.dal.dao.ClassGroupTeacherMapperDao;
-import com.ym.mec.biz.dal.dao.CooperationOrganDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
-import com.ym.mec.biz.dal.dao.EmployeeDao;
-import com.ym.mec.biz.dal.dao.GoodsDao;
-import com.ym.mec.biz.dal.dao.MusicGroupBuildLogDao;
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderCourseSettingsDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderStudentDetailDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentEntitiesDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentStudentCourseDetailDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPurchaseListDao;
-import com.ym.mec.biz.dal.dao.MusicGroupQuitDao;
-import com.ym.mec.biz.dal.dao.MusicGroupSchoolTermCourseDetailDao;
-import com.ym.mec.biz.dal.dao.MusicGroupSchoolTermStudentCourseDetailDao;
-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.OrganizationCloudTeacherFeeDao;
-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.StudentInstrumentDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
-import com.ym.mec.biz.dal.dao.StudentPreRegistrationDao;
-import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
-import com.ym.mec.biz.dal.dao.StudentVisitDao;
-import com.ym.mec.biz.dal.dao.SubjectChangeDao;
-import com.ym.mec.biz.dal.dao.SubjectDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
-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.CloseMusicGroupDto;
 import com.ym.mec.biz.dal.dto.CourseScheduleTeachersDto;
@@ -96,70 +58,10 @@ import com.ym.mec.biz.dal.dto.StudentApplyInstrumentDto;
 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.CloudTeacherOrder;
-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.ImGroup;
-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.PayUserType;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupPurchaseList;
-import com.ym.mec.biz.dal.entity.MusicGroupQuit;
-import com.ym.mec.biz.dal.entity.MusicGroupReturnFeeDto;
-import com.ym.mec.biz.dal.entity.MusicGroupSchoolTermCourseDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
-import com.ym.mec.biz.dal.entity.MusicMemberDto;
-import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.entity.OrganizationCloudTeacherFee;
-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.StudentInstrument;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
-import com.ym.mec.biz.dal.entity.StudentPreRegistration;
-import com.ym.mec.biz.dal.entity.StudentRegistration;
-import com.ym.mec.biz.dal.entity.Subject;
-import com.ym.mec.biz.dal.entity.SubjectChange;
-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.CourseStatusEnum;
-import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
-import com.ym.mec.biz.dal.enums.DealStatusEnum;
-import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
-import com.ym.mec.biz.dal.enums.GoodsType;
-import com.ym.mec.biz.dal.enums.GradeTypeEnum;
-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.PayStatus;
-import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
-import com.ym.mec.biz.dal.enums.PeriodEnum;
-import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
-import com.ym.mec.biz.dal.enums.SixPlusGradeEnum;
-import com.ym.mec.biz.dal.enums.SporadicChargeTypeEnum;
-import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
-import com.ym.mec.biz.dal.enums.TeachTypeEnum;
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.MusicGroupQueryInfo;
 import com.ym.mec.biz.dal.page.MusicMemberQueryInfo;
 import com.ym.mec.biz.event.source.GroupEventSource;
@@ -355,6 +257,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     private StudentInstrumentDao studentInstrumentDao;
 
     @Autowired
+    private SysUserCashAccountLogDao sysUserCashAccountLogDao;
+
+    @Autowired
     private CloudTeacherOrderService cloudTeacherOrderService;
 
     @Autowired
@@ -642,17 +547,21 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (musicGroup == null) {
             throw new BizException("乐团信息查询失败");
         }
-        if (musicGroup.getStatus() != MusicGroupStatusEnum.PRE_APPLY) {
-            throw new BizException("操作失败:只有乐团在[{}]状态才能操作", MusicGroupStatusEnum.PRE_APPLY.getMsg());
-        }
-
-        List<StudentPreRegistration> studentPreRegistrationList = studentPreRegistrationDao.queryByMusicGroupId(musicGroupId);
-        Map<Integer, String> receiverList = studentPreRegistrationList.stream().collect(Collectors.toMap(StudentPreRegistration::getUserId, StudentPreRegistration::getPhone));
+        if (musicGroup.getStatus() == MusicGroupStatusEnum.PRE_APPLY || musicGroup.getStatus() == MusicGroupStatusEnum.PAY) {
+            Map<Integer, String> receiverList = null;
+            if(musicGroup.getStatus() == MusicGroupStatusEnum.PRE_APPLY){
+                List<StudentPreRegistration> studentPreRegistrationList = studentPreRegistrationDao.queryByMusicGroupId(musicGroupId);
+                receiverList = studentPreRegistrationList.stream().collect(Collectors.toMap(StudentPreRegistration::getUserId, StudentPreRegistration::getPhone));
+            }else {
+                receiverList = MapUtil.convertMybatisMap(studentRegistrationDao.findMapByMusicGroupId(musicGroupId, 2));
+            }
 
-        String meetingDateStr = sdf_ymdhms.format(meetingDate);
-        sysMessageService.batchSendImGroupMessage(MessageTypeEnum.STUDENT_SMS_IM_MUSIC_GROUP_PARENT_MEETING_NOTICE, userId + "", null, new String[]{musicGroupId}, null, meetingDateStr, address);
-        sysMessageService.batchSendMessage(MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_IM_MUSIC_GROUP_PARENT_MEETING_NOTICE, receiverList, null, 1, null, null, meetingDateStr, address);
-        return true;
+            String meetingDateStr = sdf_ymdhms.format(meetingDate);
+            sysMessageService.batchSendImGroupMessage(MessageTypeEnum.STUDENT_SMS_IM_MUSIC_GROUP_PARENT_MEETING_NOTICE, userId + "", null, new String[]{musicGroupId}, null, meetingDateStr, address);
+            sysMessageService.batchSendMessage(MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_IM_MUSIC_GROUP_PARENT_MEETING_NOTICE, receiverList, null, 1, null, null, meetingDateStr, address);
+            return true;
+        }
+        return false;
     }
 
     @Override
@@ -2194,7 +2103,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroupQuit.setStatus(status);
         musicGroupQuit.setReason(reason);
         musicGroupQuit.setQuitDate(date);
-        musicGroupQuit.setFeeJson(JsonUtil.toJSONString(returnFeeDto));
+
 		if (visitDate != null) {
 			musicGroupQuit.setVisitTime(visitDate);
 			musicGroupQuit.setIsVisit(true);
@@ -2207,22 +2116,26 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 		}
     	
     	BigDecimal returnTotalFee = BigDecimal.ZERO;
-    	
-    	if(returnFeeDto.getIsReturnAccessoriesFee()){
-    		returnTotalFee = returnTotalFee.add(returnFeeDto.getAccessoriesFee());
-    	}
-    	if(returnFeeDto.getIsReturnCourseFee()){
-    		returnTotalFee = returnTotalFee.add(returnFeeDto.getCourseFee());
-    	}
-    	if(returnFeeDto.getIsReturnMaintenanceFee()){
-    		returnTotalFee = returnTotalFee.add(returnFeeDto.getMaintenanceFee());
-    	}
-    	if(returnFeeDto.getIsReturnMemberFee()){
-    		returnTotalFee = returnTotalFee.add(returnFeeDto.getMemberFee());
-    	}
-    	if(returnFeeDto.getIsReturnMusicalFee()){
-    		returnTotalFee = returnTotalFee.add(returnFeeDto.getMusicalFee());
-    	}
+
+		if(returnFeeDto == null){
+            returnFeeDto = new MusicGroupReturnFeeDto();
+        }
+        musicGroupQuit.setFeeJson(JsonUtil.toJSONString(returnFeeDto));
+        if(returnFeeDto.getIsReturnAccessoriesFee()){
+            returnTotalFee = returnTotalFee.add(returnFeeDto.getAccessoriesFee());
+        }
+        if(returnFeeDto.getIsReturnCourseFee()){
+            returnTotalFee = returnTotalFee.add(returnFeeDto.getCourseFee());
+        }
+        if(returnFeeDto.getIsReturnMaintenanceFee()){
+            returnTotalFee = returnTotalFee.add(returnFeeDto.getMaintenanceFee());
+        }
+        if(returnFeeDto.getIsReturnMemberFee()){
+//            returnTotalFee = returnTotalFee.add(returnFeeDto.getMemberFee());
+        }
+        if(returnFeeDto.getIsReturnMusicalFee()){
+            returnTotalFee = returnTotalFee.add(returnFeeDto.getMusicalFee());
+        }
     	
     	musicGroupQuit.setReturnTotalFee(returnTotalFee);
 
@@ -2490,7 +2403,16 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 				}
             }
 
-            if (amount.doubleValue() > 0) {
+            if (returnTotalFee.doubleValue() > 0) {
+                SysUserCashAccountLog sysUserCashAccountLog = new SysUserCashAccountLog();
+                sysUserCashAccountLog.setGroupType(GroupType.MUSIC);
+                sysUserCashAccountLog.setUserId(userId);
+                sysUserCashAccountLog.setOrganId(musicGroup.getOrganId());
+                sysUserCashAccountLog.setGroupId(musicGroupId);
+                sysUserCashAccountLog.setAmount(returnTotalFee);
+                sysUserCashAccountLog.setReturnFeeType(ReturnFeeEnum.MUSIC);
+                sysUserCashAccountLog.setComment("退出乐团");
+                sysUserCashAccountLogDao.insert(sysUserCashAccountLog);
                 // 增加交易流水
 //                sysUserCashAccountDetailService.addCashAccountDetail(userId, amount, SysUserCashAccountDetailService.MUSIC_GROUP + musicGroupId, "",
 //                        PlatformCashAccountDetailTypeEnum.REFUNDS, null, SUCCESS, "退出乐团", null);
@@ -2805,6 +2727,16 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
 
         if (amount.doubleValue() > 0) {
+            //这个接口没有退费的操作了
+//            SysUserCashAccountLog sysUserCashAccountLog = new SysUserCashAccountLog();
+//            sysUserCashAccountLog.setGroupType(GroupType.MUSIC);
+//            sysUserCashAccountLog.setUserId(userId);
+//            sysUserCashAccountLog.setOrganId(musicGroup.getOrganId());
+//            sysUserCashAccountLog.setGroupId(musicGroupId);
+//            sysUserCashAccountLog.setAmount(amount);
+//            sysUserCashAccountLog.setReturnFeeType(ReturnFeeEnum.MUSIC);
+//            sysUserCashAccountLog.setComment("退出乐团");
+//            sysUserCashAccountLogDao.insert(sysUserCashAccountLog);
             // 增加交易流水
 //            sysUserCashAccountDetailService.addCashAccountDetail(userId, amount, SysUserCashAccountDetailService.MUSIC_GROUP + musicGroupId, "",
 //                    PlatformCashAccountDetailTypeEnum.REFUNDS, null, SUCCESS, "退出乐团", null);
@@ -3367,6 +3299,19 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             pageInfo.setTotal(count);
             params.put("offset", pageInfo.getOffset());
             dataList = musicGroupDao.findMusicGroups(params);
+            List<String> musicGroupIds = dataList.stream().map(e -> e.getId()).collect(Collectors.toList());
+            List<MusicGroup> instrument = studentRegistrationDao.countInstrument(musicGroupIds);
+            if(instrument != null && instrument.size() > 0){
+                Map<String, List<MusicGroup>> collect = instrument.stream().collect(Collectors.groupingBy(MusicGroup::getId));
+                for (MusicGroup musicGroup : dataList) {
+                    List<MusicGroup> musicGroups = collect.get(musicGroup.getId());
+                    if(musicGroups != null && musicGroups.size() > 0){
+                        MusicGroup musicGroup1 = musicGroups.get(0);
+                        musicGroup.setPayNum(musicGroup1.getPayNum());
+                        musicGroup.setHasInstrumentNum(musicGroup1.getHasInstrumentNum());
+                    }
+                }
+            }
         }
         if (count == 0) {
             dataList = new ArrayList<>();
@@ -3944,14 +3889,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             pageInfo.setTotal(count);
             params.put("offset", pageInfo.getOffset());
             dataList = musicGroupDao.queryMusicMemberList(params);
-            List<Integer> collect = dataList.stream().map(e -> e.getUserId()).collect(Collectors.toList());
-            String musicGroupId = dataList.get(0).getMusicGroupId();
+//            List<Integer> collect = dataList.stream().map(e -> e.getUserId()).collect(Collectors.toList());
+//            String musicGroupId = dataList.get(0).getMusicGroupId();
             //查询云教练订单
-            List<CloudTeacherOrder> studentCloudTeacherOrders = cloudTeacherOrderService.getStudentCloudTeacherOrders(collect,musicGroupId);
-            Map<Integer, List<CloudTeacherOrder>> studentCloudTeacherMap = studentCloudTeacherOrders.stream().collect(Collectors.groupingBy(CloudTeacherOrder::getStudentId));
-            Date date = new Date();
-            Map<Long,String> cloudMap = MapUtil.convertMybatisMap(cloudTeacherOrderService.queryNoStartByUserIds(new HashSet<>(collect),true));
-            dataList.forEach(e->{
+//            List<CloudTeacherOrder> studentCloudTeacherOrders = cloudTeacherOrderService.getStudentCloudTeacherOrders(collect,musicGroupId);
+//            Map<Integer, List<CloudTeacherOrder>> studentCloudTeacherMap = studentCloudTeacherOrders.stream().collect(Collectors.groupingBy(CloudTeacherOrder::getStudentId));
+//            Date date = new Date();
+//            Map<Long,String> cloudMap = MapUtil.convertMybatisMap(cloudTeacherOrderService.queryNoStartByUserIds(new HashSet<>(collect),true));
+            /*dataList.forEach(e->{
                 //如果会员已过期、是否有未生效的会员
                 if(e.getMembershipEndTime() == null || date.after(e.getMembershipEndTime())){
                     String s = cloudMap.get(e.getUserId().longValue());
@@ -3972,7 +3917,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                         e.setCloudTeacherAmount(cloudAmount);
                     }
                 }
-            });
+            });*/
         }
         if (count == 0) {
             dataList = new ArrayList<>();

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

@@ -149,6 +149,10 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     private RedisCache<String, Object> redisCache;
     @Autowired
     private LuckDrawCountService luckDrawCountService;
+    @Autowired
+    private VipGroupDao vipGroupDao;
+    @Autowired
+    private VipGroupCategoryDao vipGroupCategoryDao;
 
     private static Map<Integer, Map<Integer, List<Integer>>> schoolSubjectTeachersMap;
 
@@ -5791,4 +5795,85 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         studentPaymentOrderService.update(studentPaymentOrder);
         return BaseController.succeed(payMap);
     }
+
+    @Override
+    public Map<String, BigDecimal> getStudentSurplusCourseFee(Long practiceGroupId) {
+        if(Objects.isNull(practiceGroupId)){
+            throw new BizException("请指定课程");
+        }
+        PracticeGroup practiceGroup = practiceGroupDao.get(practiceGroupId);
+        if(Objects.isNull(practiceGroup)){
+            throw new BizException("未找到指定网管课");
+        }
+        Integer studentId = practiceGroup.getStudentId();
+        if(!practiceGroup.getGroupStatus().equals(GroupStatusEnum.NORMAL)){
+            throw new BizException("只有进行中的网管课可以关闭");
+        }
+        Map<String,BigDecimal> result = new HashMap<>();
+        Date now = new Date();
+        BigDecimal bigDecimal;
+        List<StudentCourseInfoDto> userCourseInfos = new ArrayList<>();
+        VipGroupCategory vipGroupCategory = null;
+        //是否关联活动
+        if(practiceGroup.getVipGroupActivityId() != null){
+            ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(practiceGroupId,"PRACTICE", studentId);
+            if(activityUserMapper != null && !activityUserMapper.getReturnFee()){
+                if(Objects.nonNull(activityUserMapper.getVipGroupId())){
+                    VipGroup group = vipGroupDao.get(activityUserMapper.getVipGroupId());
+                    vipGroupCategory = vipGroupCategoryDao.get(group.getVipGroupCategoryId().intValue());
+                    userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.VIP, activityUserMapper.getVipGroupId().toString(), studentId, null));
+                }
+                if(Objects.nonNull(activityUserMapper.getGiveVipGroupId())){
+                    userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.VIP, activityUserMapper.getGiveVipGroupId().toString(), studentId, null));
+                }
+                if(Objects.nonNull(activityUserMapper.getPracticeGroupId())){
+                    userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.PRACTICE, activityUserMapper.getPracticeGroupId().toString(), studentId, null));
+                }
+                if(Objects.nonNull(activityUserMapper.getGivePracticeGroupId())){
+                    userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.PRACTICE, activityUserMapper.getGivePracticeGroupId().toString(), studentId, null));
+                }
+                userCourseInfos.removeAll(Collections.singleton(null));
+            }else {
+                userCourseInfos = courseScheduleDao.findUserCourseInfos(GroupType.PRACTICE, practiceGroupId.toString(), studentId, null);
+            }
+        }else {
+            userCourseInfos = courseScheduleDao.findUserCourseInfos(GroupType.PRACTICE, practiceGroupId.toString(), studentId, null);
+        }
+
+        if(!CollectionUtils.isEmpty(userCourseInfos)){
+            BigDecimal historyPrice = ZERO;
+            BigDecimal allPrice = ZERO;
+            int overNum = 0;
+            for (StudentCourseInfoDto userCourseInfo : userCourseInfos) {
+                allPrice = allPrice.add(userCourseInfo.getExpectPrice());
+                if(now.after(userCourseInfo.getStartClassTime())){
+                    overNum++;
+                    historyPrice = historyPrice.add(userCourseInfo.getOriginalPrice());
+                }
+            }
+            bigDecimal = allPrice.subtract(historyPrice);
+            if(bigDecimal.compareTo(ZERO) < 0){
+                bigDecimal = ZERO;
+            }
+            if(overNum == userCourseInfos.size()){
+                bigDecimal = ZERO;
+            }
+            result.put("suplusCourseOriginalFee", allPrice);
+        }else{
+            bigDecimal = new BigDecimal(0);
+            result.put("suplusCourseOriginalFee", bigDecimal);
+        }
+        ClassGroup classGroup = classGroupDao.findByGroupAndType(practiceGroupId.toString(), "PRACTICE");
+        if(Objects.isNull(classGroup)){
+            throw new BizException("未找到对应班级");
+        }
+
+        if(vipGroupCategory == null || vipGroupCategory.getStudentNum() <= 1){
+            bigDecimal = bigDecimal.multiply(new BigDecimal(0.8)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+        }else{
+            bigDecimal = bigDecimal.multiply(new BigDecimal(0.7)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+        }
+        result.put("suplusCourseFee", bigDecimal);
+        return result;
+    }
 }

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

@@ -21,6 +21,7 @@ import java.util.stream.Collectors;
 import javax.annotation.Resource;
 
 import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.constant.CommonConstants;
 import org.apache.commons.lang3.StringUtils;
@@ -105,10 +106,6 @@ 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.StudentMusicGroupStatusEnum;
-import com.ym.mec.biz.dal.page.MusicGroupRecordStudentQueryInfo;
-import com.ym.mec.biz.dal.page.NoClassMusicStudentQueryInfo;
-import com.ym.mec.biz.dal.page.RegistrationOrPreQueryInfo;
-import com.ym.mec.biz.dal.page.StudentRegistrationQueryInfo;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.ImResult;
@@ -814,12 +811,18 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         studentRegistration.setCreateTime(date);
         studentRegistration.setUpdateTime(date);
 
-        StudentRegistration phoneAndMusicGroupId = studentRegistrationDao.getByPhoneAndMusicGroupId(musicGroupId, studentRegistration.getParentsPhone());
+        SysUser sysUser = studentRegistrationDao.getSysUserByPhone(studentRegistration.getParentsPhone());
+        StudentRegistration phoneAndMusicGroupId = null;
+        if(sysUser != null){
+            phoneAndMusicGroupId = studentRegistrationDao.getByUserIdAndMusicGroupId(musicGroupId, sysUser.getId());
+        }else {
+            phoneAndMusicGroupId = studentRegistrationDao.getByPhoneAndMusicGroupId(musicGroupId, studentRegistration.getParentsPhone());
+        }
+
         if (phoneAndMusicGroupId != null && phoneAndMusicGroupId.getMusicGroupStatus() != StudentMusicGroupStatusEnum.QUIT && phoneAndMusicGroupId.getMusicGroupStatus() != StudentMusicGroupStatusEnum.APPLY) {
             throw new BizException("该学员已存在");
         }
 
-        SysUser sysUser = studentRegistrationDao.getSysUserByPhone(studentRegistration.getParentsPhone());
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         Integer userId;
         if (sysUser == null) {
@@ -2077,10 +2080,30 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 		return true;
 	}
 
-	@Override
+    @Override
+    public PageInfo<StudentInstrument> queryMusicStudentInstrument(StudentPreRegistrationQueryInfo queryInfo) {
+        PageInfo<StudentInstrument> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<StudentInstrument> dataList = null;
+        int count = studentRegistrationDao.countMusicStudentInstrument(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = studentRegistrationDao.queryMusicStudentInstrument(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
 	public PageInfo<StudentRegisterInstrumentsDetailDto> queryStudentRegisterInstrumentsDetailList(MusicGroupRecordStudentQueryInfo queryInfo) {
-		PageInfo<StudentRegisterInstrumentsDetailDto> pageInfo = new PageInfo<StudentRegisterInstrumentsDetailDto>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<String, Object>();
+		PageInfo<StudentRegisterInstrumentsDetailDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<>();
 		MapUtil.populateMap(params, queryInfo);
 
 		List<StudentRegisterInstrumentsDetailDto> dataList = null;
@@ -2091,7 +2114,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 			dataList = studentRegistrationDao.queryStudentRegisterInstrumentsDetailList(params);
 		}
 		if (count == 0) {
-			dataList = new ArrayList<StudentRegisterInstrumentsDetailDto>();
+			dataList = new ArrayList<>();
 		}
 		pageInfo.setRows(dataList);
 		return pageInfo;

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

@@ -189,21 +189,28 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         List<Integer> goodsIds = goodsSellDtos.stream().map(e -> e.getGoodsId()).collect(Collectors.toList());
         Map<Integer, String> integerStringMap = getMap("goods", "id_", "type_", goodsIds, Integer.class, String.class);
         Map<Integer, BigDecimal> map = getMap("goods", "id_", "discount_price_", goodsIds, Integer.class, BigDecimal.class);
+        Map<Integer, BigDecimal> groupPriceMap = getMap("goods", "id_", "group_purchase_price_", goodsIds, Integer.class, BigDecimal.class);
         for (GoodsSellDto goodsSellDto : goodsSellDtos) {
             goodsSellDto.setGoodsType(integerStringMap.get(goodsSellDto.getGoodsId()));
             if (StringUtils.isNotEmpty(goodsSellDto.getComplementGoodsIdList())) {
                 goodsSellDto.setGoodsSellDtos(goodsService.queryGoodsSellDtos(goodsSellDto.getComplementGoodsIdList()));
             }
             goodsSellDto.setGoodsPrice(map.get(goodsSellDto.getGoodsId()));
+            goodsSellDto.setGoodsGroupPrice(groupPriceMap.get(goodsSellDto.getGoodsId()));
             goodsSellDto.setTotalGoodsPrice(map.get(goodsSellDto.getGoodsId()).multiply(new BigDecimal(goodsSellDto.getGoodsNum())));
         }
         Map<Integer, List<GoodsSellDto>> goodsMap = goodsSellDtos.stream().collect(Collectors.groupingBy(GoodsSellDto::getGoodsId));
         BigDecimal amount = BigDecimal.ZERO;
+        BigDecimal groupAmount = BigDecimal.ZERO;
         for (Integer id : goodsIds) {
             GoodsSellDto goodsSellDto = goodsMap.get(id).get(0);
             amount = amount.add(goodsSellDto.getTotalGoodsPrice());
+            groupAmount = groupAmount.add(goodsSellDto.getGoodsGroupPrice());
         }
         amount = amount.subtract(studentGoodsSell.getMarketAmount());
+        if(amount.compareTo(groupAmount) < 0){
+            throw new BizException("操作失败:该金额减免后商品价格不可低于商品团购价");
+        }
         if (amount.signum() < 0) {
             throw new BizException("操作失败:订单金额异常");
         }

+ 24 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserCashAccountLogServiceImpl.java

@@ -0,0 +1,24 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.biz.dal.entity.SysUserCashAccountLog;
+import com.ym.mec.biz.service.SysUserCashAccountLogService;
+import com.ym.mec.biz.dal.dao.SysUserCashAccountLogDao;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SysUserCashAccountLogServiceImpl extends BaseServiceImpl<Long, SysUserCashAccountLog>  implements SysUserCashAccountLogService {
+	
+	@Autowired
+	private SysUserCashAccountLogDao sysUserCashAccountLogDao;
+
+	@Override
+	public BaseDAO<Long, SysUserCashAccountLog> getDAO() {
+		return sysUserCashAccountLogDao;
+	}
+
+}

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

@@ -256,7 +256,7 @@ public class SysUserCashAccountServiceImpl extends BaseServiceImpl<Integer, SysU
     }
 
     @Override
-    public void subtractFromCourseBalanceAndBalance(Integer userId, BigDecimal decimal, PlatformCashAccountDetailTypeEnum type, String description) {
+    public void subtractFromCourseBalanceAndBalance(Integer userId, BigDecimal decimal, PlatformCashAccountDetailTypeEnum type, String description,Long vipGroupId) {
         SysUserCashAccount cashAccount = sysUserCashAccountDao.getLocked(userId);
         if (cashAccount == null) {
             throw new BizException("用户[{}]现金账户不存在", userId);
@@ -298,6 +298,7 @@ public class SysUserCashAccountServiceImpl extends BaseServiceImpl<Integer, SysU
         sysUserCoursesAccountDetail.setType(type);
         sysUserCoursesAccountDetail.setUpdateTime(date);
         sysUserCoursesAccountDetail.setCreateTime(date);
+        sysUserCoursesAccountDetail.setGroupId(vipGroupId);
         sysUserCoursesAccountDetailDao.insert(sysUserCoursesAccountDetail);
 
         if(changeMoney.compareTo(BigDecimal.ZERO)==0){
@@ -317,6 +318,7 @@ public class SysUserCashAccountServiceImpl extends BaseServiceImpl<Integer, SysU
         detail.setType(type);
         detail.setUpdateTime(date);
         detail.setUserId(userId);
+        detail.setGroupId(vipGroupId);
         sysUserCashAccountDetailDao.insert(detail);
     }
 

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

@@ -140,7 +140,7 @@ public class TeacherDefaultVipGroupSalaryServiceImpl extends BaseServiceImpl<Lon
 					// 批量修改课程课酬
 					List<CourseScheduleTeacherSalary> list = new ArrayList<CourseScheduleTeacherSalary>();
 
-					ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(Long.parseLong(updateTeacherSalaryList.get(0).getMusicGroupId()),"VIP");
+					ActivityUserMapper activityUserMapper = activityUserMapperDao.findVipUserMapper(Long.parseLong(updateTeacherSalaryList.get(0).getMusicGroupId()),"VIP",null);
 					for (CourseScheduleTeacherSalary ts : updateTeacherSalaryList) {
 						//课酬调整后不能更新课酬
 						if(!ts.getEnableChangeSalary()){

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

@@ -85,6 +85,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
     @Autowired
 	private SysUserCashAccountDetailDao sysUserCashAccountDetailDao;
     @Autowired
+	private SysUserCashAccountLogDao sysUserCashAccountLogDao;
+    @Autowired
 	private ClassGroupTeacherSalaryDao classGroupTeacherSalaryDao;
     @Autowired
 	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
@@ -979,7 +981,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 					vipGroupApplyBaseInfoDto.getUserId(), null);
 			BigDecimal teacherSalary = costInfo.get("offlineTeacherSalary");
 			//是否是赠送课程
-			ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroupApplyBaseInfoDto.getId(),"VIP");
+			ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroupApplyBaseInfoDto.getId(),"VIP",null);
 			if(activityUserMapper != null){
 				if(vipGroupApplyBaseInfoDto.getId().equals(activityUserMapper.getGiveVipGroupId())){
 					teacherSalary = costInfo.get("giveOfflineTeacherSalary");
@@ -2263,7 +2265,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			giveVipOfflineSalarySettlement = vipGroupSalarySettlementDto.getGiveVipOfflineSalarySettlement();
 
 			//是否是赠送课程
-			ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(),"VIP");
+			ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(),"VIP",null);
 			if(activityUserMapper != null){
 				if(vipGroup.getId().equals(activityUserMapper.getGiveVipGroupId())){
 					giveVipOfflineSalarySettlement = vipGroupSalarySettlementDto.getGiveVipOfflineSalarySettlement();
@@ -3105,14 +3107,16 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 //		sysUserCashAccountService.updateBalance(studentId, amount);
 //		SysUserCashAccount sysUserCashAccount = sysUserCashAccountService.get(studentId);
-//		SysUserCashAccountDetail sysUserCashAccountDetail = new SysUserCashAccountDetail();
-//		sysUserCashAccountDetail.setUserId(studentId);
-//		sysUserCashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.REFUNDS);
-//		sysUserCashAccountDetail.setStatus(DealStatusEnum.SUCCESS);
-//		sysUserCashAccountDetail.setAmount(amount);
-//		sysUserCashAccountDetail.setBalance(sysUserCashAccount.getBalance());
-//		sysUserCashAccountDetail.setAttribute(studentId.toString());
-//		sysUserCashAccountDetailDao.insert(sysUserCashAccountDetail);
+		//记录日志
+		SysUserCashAccountLog sysUserCashAccountLog = new SysUserCashAccountLog();
+		sysUserCashAccountLog.setUserId(studentId);
+		sysUserCashAccountLog.setGroupType(VIP);
+		sysUserCashAccountLog.setOrganId(vipGroup.getOrganId());
+		sysUserCashAccountLog.setGroupId(vipGroupId.toString());
+		sysUserCashAccountLog.setAmount(amount);
+		sysUserCashAccountLog.setReturnFeeType(ReturnFeeEnum.VIP);
+		sysUserCashAccountLog.setComment("VIP退课");
+		sysUserCashAccountLogDao.insert(sysUserCashAccountLog);
 
 		classStudentMapperByUserIdAndClassGroupId.setStatus(ClassGroupStudentStatusEnum.QUIT);
 		classGroupStudentMapperDao.update(classStudentMapperByUserIdAndClassGroupId);
@@ -3347,7 +3351,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			Map<String, BigDecimal> salaryMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId(), null);
 			BigDecimal teacherSalary = salaryMap.get("offlineTeacherSalary");
 			//是否是赠送课程
-			ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(),"VIP");
+			ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(),"VIP",null);
 			if(activityUserMapper != null){
 				if(vipGroup.getId().equals(activityUserMapper.getGiveVipGroupId())){
 					teacherSalary = salaryMap.get("giveOfflineTeacherSalary");
@@ -3574,11 +3578,11 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		if(status ==StudentApplyRefundsStatus.ING){
 			throw new BizException("状态不正确");
 		}
-
+		VipGroup vipGroup = vipGroupDao.get(id);
 		studentApplyRefunds.setStatus(status);
 		if (studentApplyRefunds.getStatus() == StudentApplyRefundsStatus.DONE) {
 			//退还活动购买
-			VipGroup vipGroup = vipGroupDao.get(id);
+
 			ActivityUserMapper activityUserMapper = activityUserMapperService.findByStudentId(vipGroup.getId(), studentPaymentOrder.getUserId());
 			HttpResponseResult result = groupClassService.quitActivityGive(activityUserMapper,confirmReturnActivityGive,id, VIP);
 			if(result.getCode() != 200){
@@ -3593,16 +3597,18 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		studentApplyRefundsDao.update(studentApplyRefunds);
 		switch (studentApplyRefunds.getStatus()) {
 			case DONE:
-				sysUserCashAccountService.updateBalance(studentApplyRefunds.getUserId(), studentApplyRefunds.getActualAmount());
-				SysUserCashAccount sysUserCashAccount = sysUserCashAccountService.get(studentApplyRefunds.getUserId().intValue());
-				SysUserCashAccountDetail sysUserCashAccountDetail = new SysUserCashAccountDetail();
-				sysUserCashAccountDetail.setUserId(studentApplyRefunds.getUserId());
-				sysUserCashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.REFUNDS);
-				sysUserCashAccountDetail.setStatus(DealStatusEnum.SUCCESS);
-				sysUserCashAccountDetail.setAmount(amount);
-				sysUserCashAccountDetail.setBalance(sysUserCashAccount.getBalance());
-				sysUserCashAccountDetail.setAttribute(studentApplyRefunds.getId().toString());
-				sysUserCashAccountDetailDao.insert(sysUserCashAccountDetail);
+//				sysUserCashAccountService.updateBalance(studentApplyRefunds.getUserId(), studentApplyRefunds.getActualAmount());
+//				SysUserCashAccount sysUserCashAccount = sysUserCashAccountService.get(studentApplyRefunds.getUserId().intValue());
+				//记录日志
+				SysUserCashAccountLog sysUserCashAccountLog = new SysUserCashAccountLog();
+				sysUserCashAccountLog.setGroupId(vipGroup.getId().toString());
+				sysUserCashAccountLog.setUserId(studentApplyRefunds.getUserId());
+				sysUserCashAccountLog.setGroupType(VIP);
+				sysUserCashAccountLog.setOrganId(vipGroup.getOrganId());
+				sysUserCashAccountLog.setAmount(amount);
+				sysUserCashAccountLog.setReturnFeeType(ReturnFeeEnum.VIP);
+				sysUserCashAccountLog.setComment("VIP退课审核");
+				sysUserCashAccountLogDao.insert(sysUserCashAccountLog);
 
 				ClassGroupStudentMapper classStudentMapperByUserIdAndClassGroupId = classGroupStudentMapperDao.query(studentPaymentOrder.getClassGroupId(),
 						studentPaymentOrder.getUserId());
@@ -3717,9 +3723,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			vipGroupSalaryBaseInfo.setTotalFeeDeduction(new BigDecimal(0));
 		}
 
-		BigDecimal totalCoursePrice= studentPaymentOrderDao.sumGroupIncomeFee(vipGroup.getId().toString(),GroupType.VIP.getCode());
+		BigDecimal totalCoursePrice = studentPaymentOrderDao.sumGroupIncomeFee(vipGroup.getId());
 		if(Objects.isNull(totalCoursePrice)){
-			totalCoursePrice=new BigDecimal(0);
+			totalCoursePrice = new BigDecimal(0);
 		}
 
 		//课程总价
@@ -3802,16 +3808,17 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			if(null==studentPaymentOrder){
 				throw new BizException("无法停止课程,需要全部学员退学后,才能停止,请先操作学员退学。");
 			}
-			sysUserCashAccountService.updateBalance(userId.intValue(),studentSurplusClassFees.get(userId));
-			SysUserCashAccount sysUserCashAccount = sysUserCashAccountService.get(userId.intValue());
-			SysUserCashAccountDetail sysUserCashAccountDetail=new SysUserCashAccountDetail();
-			sysUserCashAccountDetail.setUserId(userId.intValue());
-			sysUserCashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.REFUNDS);
-			sysUserCashAccountDetail.setStatus(DealStatusEnum.SUCCESS);
-			sysUserCashAccountDetail.setAmount(studentSurplusClassFees.get(userId));
-			sysUserCashAccountDetail.setBalance(sysUserCashAccount.getBalance());
-			sysUserCashAccountDetail.setAttribute(studentPaymentOrder.getOrderNo());
-			sysUserCashAccountDetailDao.insert(sysUserCashAccountDetail);
+//			sysUserCashAccountService.updateBalance(userId.intValue(),studentSurplusClassFees.get(userId));
+//			SysUserCashAccount sysUserCashAccount = sysUserCashAccountService.get(userId.intValue());
+			SysUserCashAccountLog sysUserCashAccountLog = new SysUserCashAccountLog();
+			sysUserCashAccountLog.setGroupId(vipGroupId.toString());
+			sysUserCashAccountLog.setUserId(userId);
+			sysUserCashAccountLog.setGroupType(VIP);
+			sysUserCashAccountLog.setOrganId(vipGroup.getOrganId());
+			sysUserCashAccountLog.setAmount(studentSurplusClassFees.get(userId));
+			sysUserCashAccountLog.setReturnFeeType(ReturnFeeEnum.VIP);
+			sysUserCashAccountLog.setComment("VIP课关闭");
+			sysUserCashAccountLogDao.insert(sysUserCashAccountLog);
 		}
 
 		vipGroup.setStatus(VipGroupStatusEnum.CANCEL);
@@ -4037,7 +4044,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		Map<String, BigDecimal> map = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId(), null);
 		BigDecimal offlineTeacherSalary = map.get("offlineTeacherSalary");
 		//是否是赠送课程
-		ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(),"VIP");
+		ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(),"VIP",null);
 		if(activityUserMapper != null){
 			if(vipGroup.getId().equals(activityUserMapper.getGiveVipGroupId())){
 				offlineTeacherSalary = map.get("giveOfflineTeacherSalary");
@@ -4181,7 +4188,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 				Map<String, BigDecimal> salaryMap = countVipGroupPredictFee1(vipGroup, vipGroup.getUserId(), null);
 				BigDecimal offlineTeacherSalary = salaryMap.get("offlineTeacherSalary");
 				//是否是赠送课程
-				ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(),"VIP");
+				ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(vipGroup.getId(),"VIP",null);
 				if(activityUserMapper != null){
 					if(vipGroup.getId().equals(activityUserMapper.getGiveVipGroupId())){
 						offlineTeacherSalary = salaryMap.get("giveOfflineTeacherSalary");
@@ -4282,7 +4289,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 				surplusCoursesPrice = surplusCoursesPrice.multiply(discount).setScale(0,BigDecimal.ROUND_CEILING);
 			}
 
-			sysUserCashAccountService.subtractFromCourseBalanceAndBalance(studentId,surplusCoursesPrice.setScale(0,BigDecimal.ROUND_CEILING),PlatformCashAccountDetailTypeEnum.PAY_FEE, "后台添加学员金额扣减");
+			sysUserCashAccountService.subtractFromCourseBalanceAndBalance(studentId,surplusCoursesPrice.setScale(0,BigDecimal.ROUND_CEILING),PlatformCashAccountDetailTypeEnum.PAY_FEE, "后台添加学员金额扣减",vipGroupId);
 
 			List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
 

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

@@ -198,6 +198,9 @@
 		<if test="groupType == 'PRACTICE'">
 			AND (practice_group_id_ = #{groupId} OR give_practice_group_id_ = #{groupId})
 		</if>
+		<if test="studentId != null">
+			AND user_id_ = #{studentId}
+		</if>
 		LIMIT 1
 	</select>
 </mapper>

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

@@ -311,7 +311,8 @@
 			</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})
+				OR mg.name_ LIKE CONCAT('%',#{search},'%')
+				OR su.real_name_ LIKE CONCAT('%',#{search},'%') OR mg.id_ = #{search} OR cs.actual_teacher_id_ = #{search})
 			</if>
 		</where>
 	</sql>
@@ -319,6 +320,7 @@
 		SELECT COUNT(ch.id_)
 		FROM course_homework ch
 		LEFT JOIN course_schedule cs ON cs.id_ = ch.course_schedule_id_
+		LEFT JOIN sys_user su ON su.id_ = cs.actual_teacher_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_

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

@@ -833,4 +833,55 @@
 		LEFT JOIN `subject` s ON s.id_ = st.subject_id_list_
 		WHERE cssp.course_schedule_id_ = #{courseScheduleId}
 	</select>
+	<select id="hasCourse" resultType="java.lang.Boolean">
+		SELECT CASE WHEN s.user_id_ = NULL THEN 0 ELSE 1 END hasCourse FROM student s
+		LEFT JOIN sys_user su ON s.user_id_ = su.id_
+		LEFT JOIN course_schedule_student_payment cssp FORCE INDEX(group_type_) ON cssp.user_id_ = s.user_id_
+		WHERE cssp.group_type_ IN ('VIP','PRACTICE')
+		<if test="organId != null">
+			AND su.organ_id_ = #{organId}
+		</if>
+		LIMIT 1
+	</select>
+	<resultMap id="StudentVipPracticeExportDto" type="com.ym.mec.biz.dal.dto.StudentVipPracticeExportDto">
+		<result property="userId" column="user_id_"/>
+		<result property="username" column="username_"/>
+		<result property="vipOverNum" column="vip_over_num_"/>
+		<result property="vipNotStartNum" column="vip_not_start_num_"/>
+		<result property="vipOverTeacherIds" column="vip_over_teacher_ids_"/>
+		<result property="vipOverTeacherNames" column="vip_over_teacher_names_"/>
+		<result property="vipNotStartTeacherIds" column="vip_not_start_teacher_ids_"/>
+		<result property="vipNotStartTeacherNames" column="vip_not_start_teacher_names_"/>
+		<result property="practiceOverNum" column="practice_over_num_"/>
+		<result property="practiceNotStartNum" column="practice_not_start_num_"/>
+		<result property="practiceOverTeacherIds" column="practice_over_teacher_ids_"/>
+		<result property="practiceOverTeacherNames" column="practice_over_teacher_names_"/>
+		<result property="practiceNotStartTeacherIds" column="practice_not_start_teacher_ids_"/>
+		<result property="practiceNotStartTeacherNames" column="practice_not_start_teacher_names_"/>
+		<result property="teacherId" column="teacher_id_"/>
+		<result property="teacherName" column="real_name_"/>
+	</resultMap>
+	<select id="exportStudentVipPractice" resultMap="StudentVipPracticeExportDto">
+		SELECT s.user_id_,su.username_,
+		COUNT(CASE WHEN cssp.group_type_ = 'VIP' AND cs.status_ != 'NOT_START' THEN 1 ELSE NULL END) vip_over_num_,
+		COUNT(CASE WHEN cssp.group_type_ = 'VIP' AND cs.status_ = 'NOT_START' THEN 1 ELSE NULL END) vip_not_start_num_,
+		GROUP_CONCAT(DISTINCT (CASE WHEN cssp.group_type_ = 'VIP' AND cs.status_ != 'NOT_START' THEN sut.id_ ELSE NULL END) ORDER BY cs.class_date_,start_class_time_ DESC) vip_over_teacher_ids_,
+		GROUP_CONCAT(DISTINCT (CASE WHEN cssp.group_type_ = 'VIP' AND cs.status_ != 'NOT_START' THEN sut.real_name_ ELSE NULL END) ORDER BY cs.class_date_,start_class_time_ DESC) vip_over_teacher_names_,
+		COUNT(CASE WHEN cssp.group_type_ = 'PRACTICE' AND cs.status_ != 'NOT_START' THEN 1 ELSE NULL END) practice_over_num_,
+		COUNT(CASE WHEN cssp.group_type_ = 'PRACTICE' AND cs.status_ = 'NOT_START' THEN 1 ELSE NULL END) practice_not_start_num_,
+		GROUP_CONCAT(DISTINCT (CASE WHEN cssp.group_type_ = 'PRACTICE' AND cs.status_ != 'NOT_START' THEN sut.id_ ELSE NULL END) ORDER BY cs.class_date_,start_class_time_ DESC) practice_over_teacher_ids_,
+		GROUP_CONCAT(DISTINCT (CASE WHEN cssp.group_type_ = 'PRACTICE' AND cs.status_ != 'NOT_START' THEN sut.real_name_ ELSE NULL END) ORDER BY cs.class_date_,start_class_time_ DESC) practice_over_teacher_names_,
+		s.teacher_id_,ste.real_name_
+		FROM student s
+		LEFT JOIN course_schedule_student_payment cssp FORCE INDEX(group_type_) ON cssp.user_id_ = s.user_id_
+		LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+		LEFT JOIN sys_user su ON s.user_id_ = su.id_
+		LEFT JOIN sys_user ste ON s.teacher_id_ = ste.id_
+		LEFT JOIN sys_user sut ON cs.actual_teacher_id_ = sut.id_
+		WHERE cssp.group_type_ IN ('VIP','PRACTICE')
+		<if test="organId != null">
+			AND su.organ_id_ = #{organId}
+		</if>
+		GROUP BY s.user_id_
+	</select>
 </mapper>

+ 9 - 0
mec-biz/src/main/resources/config/mybatis/EmployeeInfoMapper.xml

@@ -159,6 +159,12 @@
 	
 	<sql id="queryPageMap">
 		<where>
+			<if test="notMobileAndWechat == 1">
+            	AND ei.mobile_no_ IS NULL AND ei.wechat_no_ IS NULL
+	        </if>
+			<if test="notMobileAndWechat == 0">
+				AND (ei.mobile_no_ IS NOT NULL OR ei.wechat_no_ IS NOT NULL)
+	        </if>
 			<if test="organId != null">
             	AND ei.organ_id_ = #{organId}
 	        </if>
@@ -220,4 +226,7 @@
 		left join sys_user u on u.id_ = ei.operator_id_
         <include refid="queryPageMap"/>
 	</select>
+    <select id="findByPhone" resultMap="EmployeeInfo">
+		SELECT * FROM employee_info WHERE mobile_no_ = #{mobileNo}
+	</select>
 </mapper>

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

@@ -518,7 +518,13 @@
 
 	<sql id="getEduHomeworkListCondition">
 		<where>
-			EXISTS (SELECT user_id_ FROM student_registration sr LEFT JOIN music_group mg ON mg.id_=sr.music_group_id_ WHERE sr.user_id_ = eer.user_id_ AND sr.music_group_status_='NORMAL' AND mg.status_ = 'PROGRESS' AND mg.transaction_teacher_id_=#{transactionTeacherId})
+			EXISTS (SELECT user_id_ FROM student_registration sr
+			LEFT JOIN music_group mg ON mg.id_=sr.music_group_id_
+			WHERE sr.user_id_ = eer.user_id_ AND sr.music_group_status_='NORMAL'
+			AND mg.status_ = 'PROGRESS' AND mg.transaction_teacher_id_=#{transactionTeacherId})
+			<if test="search != null and search != ''">
+				AND (su.real_name_ LIKE CONCAT('%',#{search},'%') OR su.id_ = #{search})
+			</if>
 			<if test="startTime!=null">
 				AND DATE_FORMAT(ee.create_time_, "%Y-%m-%d") &gt;= DATE_FORMAT(#{startTime}, "%Y-%m-%d")
 			</if>

+ 21 - 0
mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml

@@ -1548,6 +1548,27 @@
 		GROUP BY sa.user_id_,DATE_FORMAT(cs.class_date_,'%Y-%m')
 		HAVING COUNT(sa.id_) > 1 AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_)) c
 	</select>
+	<select id="countOrganStudentErrorLeave" resultType="map">
+		SELECT c.organ_id_ 'key',COUNT(c.user_id_) 'value' FROM (
+		SELECT sa.user_id_,cs.organ_id_ FROM student_attendance sa
+		LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
+		WHERE DATE_FORMAT(cs.class_date_,'%Y-%m') >= '2021-11' AND sa.status_ = 'LEAVE' AND cs.pre_course_flag_ = 0
+		<if test="classGroupIds != null and classGroupIds.size() > 0">
+			AND cs.class_group_id_ IN
+			<foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
+				#{classGroupId}
+			</foreach>
+		</if>
+		<if test="organIds != null and organIds.size > 0">
+			AND cs.organ_id_ IN
+			<foreach collection="organIds" open="(" close=")" item="item" separator=",">
+				#{item}
+			</foreach>
+		</if>
+		GROUP BY sa.user_id_
+		HAVING COUNT(sa.id_) > 1 AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_))c
+		GROUP BY c.organ_id_
+	</select>
 	<select id="countStudentErrorLeave1" resultType="java.lang.Integer">
 		SELECT COUNT(DISTINCT c.user_id_) FROM (
 		SELECT sa.user_id_ FROM student_attendance sa

+ 30 - 20
mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml

@@ -245,63 +245,69 @@
     </delete>
 
     <select id="queryPage" resultMap="MusicGroup" parameterType="map">
-        SELECT * FROM music_group
+        SELECT mg.* FROM music_group mg
+        LEFT JOIN cooperation_organ co ON mg.cooperation_organ_id_ = co.id_
         <include refid="musicGroupQueryPageSql"/>
-        ORDER BY create_time_ DESC,id_
+        ORDER BY mg.create_time_ DESC,mg.id_
         <include refid="global.limit"/>
     </select>
 
     <sql id="musicGroupQueryPageSql">
         <where>
-            del_flag_ = 0
+            mg.del_flag_ = 0
             <if test="organId != null">
-                AND FIND_IN_SET(organ_id_,#{organId})
+                AND FIND_IN_SET(mg.organ_id_,#{organId})
             </if>
-            <if test="musicGroupName != null and musicGroupName != ''">
-                AND (name_ LIKE CONCAT('%',#{musicGroupName},'%') OR id_ LIKE CONCAT('%',#{musicGroupName},'%'))
+            <if test="cooperationOrganId != null">
+                AND mg.cooperation_organ_id_ = #{cooperationOrganId}
+            </if>
+            <if test="search != null and search != ''">
+                AND (mg.name_ LIKE CONCAT('%',#{search},'%') OR mg.id_ LIKE CONCAT('%',#{search},'%')
+                 OR mg.cooperation_organ_id_ = #{search} OR co.name_ LIKE CONCAT('%',#{search},'%'))
             </if>
             <if test="chargeTypeId != null">
-                AND charge_type_id_ = #{chargeTypeId}
+                AND mg.charge_type_id_ = #{chargeTypeId}
             </if>
             <if test="musicGroupStatus != null">
-                AND FIND_IN_SET(status_,#{musicGroupStatus})
+                AND FIND_IN_SET(mg.status_,#{musicGroupStatus})
             </if>
             <if test="musicGroupId != null">
-                AND FIND_IN_SET(id_,#{musicGroupId})
+                AND FIND_IN_SET(mg.id_,#{musicGroupId})
             </if>
             <if test="transactionTeacherId!=null">
-                AND transaction_teacher_id_ = #{transactionTeacherId}
+                AND mg.transaction_teacher_id_ = #{transactionTeacherId}
             </if>
             <if test="educationalTeacherId!=null">
-                AND educational_teacher_id_ = #{educationalTeacherId}
+                AND mg.educational_teacher_id_ = #{educationalTeacherId}
             </if>
             <if test="courseViewType != null">
-                AND course_view_type_ = #{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+                AND mg.course_view_type_ = #{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
             </if>
             <if test="musicGroupIds!=null and musicGroupIds.size()>0">
-                AND id_ IN
+                AND mg.id_ IN
                 <foreach collection="musicGroupIds" item="musicGroupId" open="(" close=")" separator=",">
                     #{musicGroupId}
                 </foreach>
             </if>
             <if test="createStartDate!=null">
-                AND date(create_time_) &gt;= #{createStartDate}
+                AND date(mg.create_time_) &gt;= #{createStartDate}
             </if>
             <if test="createEndDate!=null">
-                AND date(create_time_) &lt;= #{createEndDate}
+                AND date(mg.create_time_) &lt;= #{createEndDate}
             </if>
             <if test="billStartDate!=null">
-                AND date(bill_start_date_) &gt;= #{billStartDate}
+                AND date(mg.bill_start_date_) &gt;= #{billStartDate}
             </if>
             <if test="billEndDate!=null">
-                AND date(bill_start_date_) &lt;= #{billEndDate}
+                AND date(mg.bill_start_date_) &lt;= #{billEndDate}
             </if>
         </where>
     </sql>
 
     <!-- 查询当前表的总记录数 -->
     <select id="queryCount" resultType="int">
-        SELECT COUNT(*) FROM music_group
+        SELECT COUNT(mg.id_) FROM music_group mg
+        LEFT JOIN cooperation_organ co ON mg.cooperation_organ_id_ = co.id_
         <include refid="musicGroupQueryPageSql"/>
     </select>
 
@@ -583,6 +589,9 @@
 
     <sql id="findMusicGroupsCondition">
         <where>
+            <if test="repairUserId != null">
+                AND repair_user_id_ = #{repairUserId}
+            </if>
             <if test="educationalTeacherId!=null">
                 AND educational_teacher_id_=#{educationalTeacherId}
             </if>
@@ -905,10 +914,11 @@
         <result property="phone" column="phone_"/>
         <result property="courseViewType" column="course_view_type_"/>
         <result property="membershipEndTime" column="membership_end_time_"/>
+        <result property="hasMember" column="has_member_"/>
     </resultMap>
     <select id="queryMusicMemberList" resultMap="MusicMemberDto">
         SELECT sr.user_id_,su.username_,su.phone_,o.name_ organ_name_,mg.name_ music_group_name_,mg.course_view_type_,
-        DATEDIFF(sr.membership_end_time_,NOW()) member_day_,sr.music_group_id_,MAX(sv.visit_time_) visit_time_,sr.membership_end_time_
+        DATEDIFF(sr.membership_end_time_,NOW()) member_day_,sr.music_group_id_,MAX(sv.visit_time_) visit_time_,sr.membership_end_time_,#{hasMember} has_member_
         FROM student_registration sr
         LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
         LEFT JOIN sys_user su ON su.id_ = sr.user_id_
@@ -938,7 +948,7 @@
             </if>
             <if test="hasMember != null">
                 <if test="hasMember == 0">
-                    AND cto.id_ IS NULL AND (sr.membership_end_time_ IS NULL OR sr.membership_end_time_ &lt; NOW())
+                    AND (sr.membership_end_time_ IS NULL OR sr.membership_end_time_ &lt; NOW()) AND cto.id_ IS NULL
                 </if>
                 <if test="hasMember == 1">
                     AND cto.id_ IS NULL AND DATEDIFF(sr.membership_end_time_,NOW()) &lt;= #{memberEndAutoQuitMusic} AND sr.membership_end_time_ > NOW()

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

@@ -125,7 +125,8 @@
                 AND FIND_IN_SET(mgq.id_,#{ids})
             </if>
             <if test="search != null and search != ''">
-                AND (su.id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR mg.id_ LIKE CONCAT('%',#{search},'%') OR mg.name_ LIKE CONCAT('%',#{search},'%'))
+                AND (su.id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%')
+                OR mg.id_ LIKE CONCAT('%',#{search},'%') OR mg.name_ LIKE CONCAT('%',#{search},'%'))
             </if>
             <if test="visitFlag != null">
                 <if test="visitFlag == 0">
@@ -144,9 +145,6 @@
             <if test="status != null">
                 AND mgq.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
             </if>
-            <if test="search != null and search != ''">
-                AND (mgq.user_id_ = #{search} OR mgq.music_group_id_ = #{search})
-            </if>
         </where>
     </sql>
 

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

@@ -500,6 +500,9 @@
             mg.transaction_teacher_id_ = #{transactionTeacherId}
             AND mg.status_ = "PROGRESS"
             AND sr.music_group_status_='NORMAL'
+            <if test="search != null and search != ''">
+                AND (su.real_name_ LIKE CONCAT('%',#{search},'%') OR su.id_ = #{search})
+            </if>
             <if test="startTime!=null">
                 AND cs.class_date_ &gt;= DATE_FORMAT(#{startTime}, "%Y-%m-%d")
             </if>

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

@@ -167,20 +167,29 @@
         SELECT si.*,su.username_ studentName,su.phone_ phone,o.name_ organName FROM student_instrument si
         LEFT JOIN sys_user su ON su.id_ = si.student_id_
         LEFT JOIN organization o ON o.id_ = si.organ_id_
+        <if test="musicGroupId != null and  musicGroupId != ''">
+            LEFT JOIN student_payment_order spo ON spo.id_ = si.order_id_ AND spo.music_group_id_ = #{musicGroupId} AND spo.status_ = 'SUCCESS'
+        </if>
         <include refid="queryPageSql"/>
         <include refid="global.limit"/>
     </select>
 
     <!-- 查询当前表的总记录数 -->
     <select id="queryCount" resultType="int">
-        SELECT COUNT(*)
+        SELECT COUNT(si.id_)
         FROM student_instrument si
         LEFT JOIN sys_user su ON su.id_ = si.student_id_
+        <if test="musicGroupId != null and  musicGroupId != ''">
+            LEFT JOIN student_payment_order spo ON spo.id_ = si.order_id_ AND spo.music_group_id_ = #{musicGroupId} AND spo.status_ = 'SUCCESS'
+        </if>
         <include refid="queryPageSql"/>
     </select>
 
     <sql id="queryPageSql">
         <where>
+            <if test="musicGroupId != null and  musicGroupId != ''">
+                AND (si.order_id_ IS NULL OR spo.id_ IS NOT NULL)
+            </if>
             <if test="studentId != null">
                 AND si.student_id_ = #{studentId}
             </if>

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

@@ -554,11 +554,19 @@
           AND CONCAT(cs.class_date_, ' ', cs.start_class_time_) &gt; NOW()
     </select>
     <select id="sumGroupIncomeFee" resultType="java.math.BigDecimal">
-        SELECT SUM(expect_amount_)
-        FROM student_payment_order
-        WHERE group_type_ = #{groupType}
-          AND music_group_id_ = #{musicGroupId}
-          AND status_ = 'SUCCESS'
+        SELECT
+        (CASE WHEN a.a IS NULL THEN 0 ELSE a.a END) +
+        (CASE WHEN c.c IS NULL THEN 0 ELSE c.c END) +
+        (CASE WHEN d.d IS NULL THEN 0 ELSE d.d END) +
+        (CASE WHEN e.e IS NULL THEN 0 ELSE e.e END) -
+        (CASE WHEN b.b IS NULL THEN 0 ELSE b.b END) amount_
+        FROM
+        (SELECT SUM(CASE WHEN expect_amount_ IS NULL THEN 0 ELSE expect_amount_ END) a FROM student_payment_order
+         WHERE group_type_ = 'VIP' AND type_ = 'SMALL_CLASS_TO_BUY' AND music_group_id_ = #{vipGroupId} AND status_ = 'SUCCESS') a,
+        (SELECT SUM(CASE WHEN amount_ IS NULL THEN 0 ELSE amount_ END) b FROM sys_user_cash_account_log WHERE group_id_ = #{vipGroupId}) b,
+        (SELECT SUM(CASE WHEN actual_price_ IS NULL THEN 0 ELSE actual_price_ END) c FROM activity_user_mapper WHERE vip_group_id_ = #{vipGroupId}) c,
+        (SELECT SUM(CASE WHEN amount_ IS NULL THEN 0 ELSE amount_ END) d FROM sys_user_cash_account_detail WHERE group_id_ = #{vipGroupId}) d,
+        (SELECT SUM(CASE WHEN amount_ IS NULL THEN 0 ELSE amount_ END) e FROM sys_user_courses_account_detail WHERE group_id_ = #{vipGroupId}) e
     </select>
     <select id="findStudentPaymentOrder" resultMap="StudentPaymentOrder">
         SELECT *

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

@@ -1587,6 +1587,29 @@
         </if>
         GROUP BY sr.user_id_
     </select>
+    <select id="queryOrganMemberEndAutoQuitMusic" resultType="Map">
+        SELECT mg.organ_id_ 'key',COUNT(DISTINCT sr.user_id_) 'value' FROM student_registration sr
+        LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
+        LEFT JOIN cloud_teacher_order cto ON cto.student_id_ = sr.user_id_ AND cto.status_ = 1 AND cto.music_group_id_ IS NOT NULL
+        WHERE sr.music_group_status_ = 'NORMAL' AND mg.course_view_type_ = 2 AND mg.status_ = 'PROGRESS'
+        AND cto.id_ IS NULL AND (sr.membership_end_time_ IS NULL OR sr.membership_end_time_ &lt; NOW())
+        <if test="educationUserId != null">
+            AND mg.educational_teacher_id_ = #{educationUserId}
+        </if>
+        <if test="organIds != null and organIds.size > 0">
+            AND mg.organ_id_ IN
+            <foreach collection="organIds" open="(" close=")" item="item" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="memberEndAutoQuitMusic != null">
+            AND cto.id_ IS NULL AND DATEDIFF(sr.membership_end_time_,NOW()) &lt;= #{memberEndAutoQuitMusic} AND sr.membership_end_time_ > NOW()
+        </if>
+        <if test="memberEndAutoQuitMusic == null">
+            AND cto.id_ IS NULL AND (sr.membership_end_time_ IS NULL OR sr.membership_end_time_ &lt; NOW())
+        </if>
+        GROUP BY mg.organ_id_
+    </select>
 
     <select id="countStudentWithSubjectByMusicGroupId" resultMap="Mapper">
         select sr.actual_subject_id_ subject_id_, s.name_ key_,count(sr.id_) value_ from student_registration sr LEFT JOIN subject s on sr.actual_subject_id_ = s.id_
@@ -1781,4 +1804,48 @@
         AND sr.music_group_status_ = 'NORMAL' AND mg.course_view_type_ != 2 AND mg.`status_` = 'PROGRESS'
         GROUP BY su.organ_id_
     </select>
+    <resultMap id="MusicStudentInstrumentDto" type="com.ym.mec.biz.dal.dto.MusicStudentInstrumentDto">
+        <result property="username" column="username_"/>
+        <result property="userId" column="user_id_"/>
+        <result property="avatar" column="avatar_"/>
+        <result property="phone" column="phone_"/>
+        <result property="hasInstrument" column="has_instrument_"/>
+    </resultMap>
+    <select id="queryMusicStudentInstrument" resultMap="MusicStudentInstrumentDto">
+        SELECT sr.user_id_,su.username_,su.phone_,su.avatar_,CASE WHEN spo.id_ IS NULL THEN 0 ELSE 1 END has_instrument_ FROM student_registration sr
+        LEFT JOIN student_instrument si ON sr.user_id_ = si.student_id_ AND si.del_flag_ = 0 AND si.end_time_ > NOW()
+        LEFT JOIN student_payment_order spo ON spo.id_ = si.order_id_ AND spo.music_group_id_ = sr.music_group_id_ AND spo.status_ = 'SUCCESS'
+        LEFT JOIN sys_user su ON su.id_ = sr.user_id_
+        WHERE sr.music_group_status_ = 'NORMAL' AND sr.music_group_id_ = #{musicGroupId} AND (si.order_id_ IS NULL OR spo.id_ IS NOT NULL)
+        <if test="search != null and search != ''">
+            AND (sr.user_id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+        </if>
+        GROUP BY sr.user_id_
+        <include refid="global.limit"/>
+    </select>
+    <select id="countMusicStudentInstrument" resultType="int">
+        SELECT COUNT(DISTINCT sr.user_id_) FROM student_registration sr
+        LEFT JOIN sys_user su ON su.id_ = sr.user_id_
+        LEFT JOIN student_instrument si ON sr.user_id_ = si.student_id_ AND si.del_flag_ = 0 AND si.end_time_ > NOW()
+        LEFT JOIN student_payment_order spo ON spo.id_ = si.order_id_ AND spo.music_group_id_ = sr.music_group_id_ AND spo.status_ = 'SUCCESS'
+        WHERE sr.music_group_status_ = 'NORMAL' AND sr.music_group_id_ = #{musicGroupId} AND (si.order_id_ IS NULL OR spo.id_ IS NOT NULL)
+        <if test="search != null and search != ''">
+            AND (sr.user_id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+        </if>
+    </select>
+    <resultMap id="MusicGroup" type="com.ym.mec.biz.dal.entity.MusicGroup">
+        <result property="payNum" column="pay_num_"/>
+        <result property="hasInstrumentNum" column="has_instrument_num_"/>
+        <result property="id" column="music_group_id_"/>
+    </resultMap>
+    <select id="countInstrument" resultMap="MusicGroup">
+        SELECT sr.music_group_id_,COUNT(DISTINCT sr.user_id_) pay_num_,SUM(CASE WHEN spo.id_ IS NULL THEN 0 ELSE 1 END) has_instrument_num_ FROM student_registration sr
+        LEFT JOIN student_instrument si ON sr.user_id_ = si.student_id_ AND si.del_flag_ = 0 AND si.end_time_ > NOW()
+        LEFT JOIN student_payment_order spo ON spo.id_ = si.order_id_ AND spo.music_group_id_ = sr.music_group_id_ AND spo.status_ = 'SUCCESS'
+        WHERE sr.music_group_status_ = 'NORMAL' AND (si.order_id_ IS NULL OR spo.id_ IS NOT NULL) AND sr.music_group_id_ IN
+        <foreach collection="musicGroupIds" separator="," item="id" open="(" close=")">
+            #{id}
+        </foreach>
+        GROUP BY sr.music_group_id_
+    </select>
 </mapper>

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

@@ -28,6 +28,7 @@
         <result column="channel_" property="channel"/>
         <result column="organ_name_" property="organName"/>
         <result column="platform_account_no_" property="platformAccountNo"/>
+        <result column="group_id_" property="groupId"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -48,6 +49,7 @@
         INSERT INTO sys_user_cash_account_detail
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="id!=null">id_,</if>
+            <if test="groupId!=null">group_id_,</if>
             <if test="userId!=null">user_id_,</if>
             <if test="transNo!=null">trans_no_,</if>
             <if test="type!=null">type_,</if>
@@ -68,6 +70,7 @@
         VALUES
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="id!=null">#{id},</if>
+            <if test="groupId!=null">#{groupId},</if>
             <if test="userId!=null">#{userId},</if>
             <if test="transNo!=null">#{transNo},</if>
             <if test="type!=null">#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},</if>
@@ -91,7 +94,7 @@
             keyColumn="id" keyProperty="id">
         INSERT INTO sys_user_cash_account_detail
         (user_id_,trans_no_,type_,trans_type_,status_,amount_,balance_,description_,comment_,
-        create_time_,update_time_,attribute1_,channel_,platform_account_no_)
+        create_time_,update_time_,attribute1_,channel_,platform_account_no_,group_id_)
         VALUE
         <foreach collection="sysUserCashAccountDetails" item="sysUserCashAccountDetail" separator=",">
             (#{sysUserCashAccountDetail.userId},#{sysUserCashAccountDetail.transNo},
@@ -100,7 +103,7 @@
             #{sysUserCashAccountDetail.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{sysUserCashAccountDetail.amount},#{sysUserCashAccountDetail.balance},#{sysUserCashAccountDetail.description},
             #{sysUserCashAccountDetail.comment},now(),now(),#{sysUserCashAccountDetail.attribute},#{sysUserCashAccountDetail.channel},
-            #{sysUserCashAccountDetail.platformAccountNo})
+            #{sysUserCashAccountDetail.platformAccountNo},#{sysUserCashAccountDetail.groupId})
         </foreach>
     </insert>
 

+ 111 - 0
mec-biz/src/main/resources/config/mybatis/SysUserCashAccountLogMapper.xml

@@ -0,0 +1,111 @@
+<?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.SysUserCashAccountLogDao">
+
+    <resultMap type="com.ym.mec.biz.dal.entity.SysUserCashAccountLog" id="SysUserCashAccountLog">
+        <result column="id_" property="id"/>
+        <result column="user_id_" property="userId"/>
+        <result column="username_" property="username"/>
+        <result column="trans_no_" property="transNo"/>
+        <result column="return_fee_type_" property="returnFeeType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="group_type_" property="groupType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="amount_" property="amount"/>
+        <result column="comment_" property="comment"/>
+        <result column="create_time_" property="createTime"/>
+        <result column="update_time_" property="updateTime"/>
+        <result column="organ_name_" property="organName"/>
+        <result column="group_id_" property="groupId"/>
+        <result column="group_name_" property="groupName"/>
+        <result column="pay_time_" property="payTime"/>
+    </resultMap>
+
+    <!-- 根据主键查询一条记录 -->
+    <select id="get" resultMap="SysUserCashAccountLog">
+        SELECT * FROM sys_user_cash_account_log WHERE id_ = #{id}
+    </select>
+
+    <!-- 全查询 -->
+    <select id="findAll" resultMap="SysUserCashAccountLog">
+        SELECT *
+        FROM sys_user_cash_account_log
+        ORDER BY id_
+    </select>
+
+    <!-- 向数据库增加一条记录 -->
+    <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysUserCashAccountLog" useGeneratedKeys="true"
+            keyColumn="id" keyProperty="id">
+        INSERT INTO sys_user_cash_account_log (user_id_,organ_id_,trans_no_,return_fee_type_,group_type_,
+                                               group_id_,amount_,comment_,pay_time_,create_time_,update_time_)
+        VALUES(#{userId},#{organId},#{transNo},#{returnFeeType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+               #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{groupId},#{amount},
+               #{comment},#{payTime},NOW(),NOW())
+    </insert>
+
+    <!-- 根据主键查询一条记录 -->
+    <update id="update" parameterType="com.ym.mec.biz.dal.entity.SysUserCashAccountLog">
+        UPDATE sys_user_cash_account_log
+        <set>
+            <if test="comment != null">comment_ = #{comment},</if>
+            <if test="transNo != null">trans_no_ = #{transNo},</if>
+            <if test="payTime != null">pay_time_ = #{payTime},</if>
+            update_time_ = NOW()
+        </set>
+        WHERE id_ = #{id}
+    </update>
+
+    <!-- 根据主键删除一条记录 -->
+    <delete id="delete">
+        DELETE FROM sys_user_cash_account_log WHERE id_ = #{id}
+    </delete>
+
+    <!-- 分页查询 -->
+    <select id="queryPage" resultMap="SysUserCashAccountLog" parameterType="map">
+        SELECT cal.*,su.username_,o.name_ organ_name_ FROM sys_user_cash_account_log cal
+        LEFT JOIN sys_user su ON su.id_ = cal.user_id_
+        LEFT JOIN organization o ON o.id_ = cal.organ_id_
+        <include refid="queryPageSql"/>
+        ORDER BY id_ DESC
+        <include refid="global.limit"/>
+    </select>
+
+    <!-- 查询当前表的总记录数 -->
+    <select id="queryCount" resultType="int">
+        SELECT COUNT(cal.id_) FROM sys_user_cash_account_log cal
+        LEFT JOIN sys_user su ON su.id_ = cal.user_id_
+        <include refid="queryPageSql"/>
+    </select>
+    <sql id="queryPageSql">
+        <where>
+            <if test="createStartTime != null">
+                AND DATE_FORMAT(cal.create_time_,'%Y%m%d') >= #{createStartTime}
+            </if>
+            <if test="createEndTime != null">
+                AND DATE_FORMAT(cal.create_time_,'%Y%m%d') &lt;= #{createEndTime}
+            </if>
+            <if test="payStartTime != null">
+                AND DATE_FORMAT(cal.pay_time_,'%Y%m%d') >= #{payStartTime}
+            </if>
+            <if test="payEndTime != null">
+                AND DATE_FORMAT(cal.pay_time_,'%Y%m%d') &lt;= #{payEndTime}
+            </if>
+            <if test="groupType != null and groupType != ''">
+                AND cal.group_type_ = #{groupType}
+            </if>
+            <if test="returnFeeType != null and returnFeeType != ''">
+                AND cal.return_fee_type_ = #{returnFeeType}
+            </if>
+            <if test="organId != null and organId != ''">
+                AND FIND_IN_SET(cal.organ_id_,#{organId})
+            </if>
+            <if test="search != null and search != ''">
+                AND (cal.id_ = #{search} OR cal.user_id_ = #{search} OR cal.group_id_ = #{search}
+                OR su.username_ LIKE CONCAT('%',#{search},'%') OR cal.trans_no_ LIKE CONCAT('%',#{search},'%'))
+            </if>
+        </where>
+    </sql>
+
+</mapper>

+ 10 - 3
mec-biz/src/main/resources/config/mybatis/SysUserCoursesAccountDetailMapper.xml

@@ -26,6 +26,7 @@
 		<result column="channel_" property="channel" />
 		<result column="organ_name_" property="organName" />
 		<result column="platform_account_no_" property="platformAccountNo" />
+		<result column="group_id_" property="groupId" />
 	</resultMap>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -40,9 +41,12 @@
 	
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysUserCoursesAccountDetail" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO sys_user_courses_account_detail (id_,user_id_,trans_no_,type_,trans_type_,status_,amount_,balance_,description_,comment_,attribute1_,channel_,platform_account_no_,create_time_,update_time_)
-		VALUES(#{id},#{userId},#{transNo},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{transType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-		       #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{amount},#{balance},#{description},#{comment},#{attribute1},#{channel},#{platformAccountNo},NOW(),NOW())
+		INSERT INTO sys_user_courses_account_detail (id_,user_id_,trans_no_,type_,trans_type_,status_,amount_,balance_,
+		                                             description_,comment_,attribute1_,channel_,platform_account_no_,create_time_,update_time_,group_id_)
+		VALUES(#{id},#{userId},#{transNo},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+		       #{transType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+		       #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{amount},#{balance},#{description},
+		       #{comment},#{attribute1},#{channel},#{platformAccountNo},NOW(),NOW(),#{groupId})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -52,6 +56,9 @@
 			<if test="status != null">
 				status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
 			</if>
+			<if test="groupId != null">
+				group_id_ = #{groupId},
+			</if>
 			<if test="balance != null">
 				balance_ = #{balance},
 			</if>

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

@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiOperation;
 import java.util.Date;
 
 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;
@@ -29,10 +30,10 @@ public class EmployeeInfoController extends BaseController {
 
     @Autowired
     private EmployeeInfoService employeeInfoService;
-    
+
     @Autowired
     private EmployeeVisitService employeeVisitService;
-    
+
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
 
@@ -45,6 +46,20 @@ public class EmployeeInfoController extends BaseController {
 		if (sysUser == null) {
 			return failed("用户信息获取失败");
 		}
+        EmployeeInfo info = employeeInfoService.findByPhone(employeeInfo.getMobileNo());
+		if(info != null){
+		    if(employeeInfo.getCover()){
+                employeeInfo.setOperatorId(sysUser.getId());
+                employeeInfo.setId(info.getId());
+                Date date = new Date();
+                employeeInfo.setUpdateTime(date);
+                employeeInfo.setCreateTime(date);
+                employeeInfoService.update(employeeInfo);
+                return succeed();
+            }else {
+                return failed(HttpStatus.PARTIAL_CONTENT,"该手机号已在系统中,是否更新原有数据");
+            }
+        }
 		employeeInfo.setOperatorId(sysUser.getId());
     	Date date = new Date();
     	employeeInfo.setUpdateTime(date);
@@ -61,6 +76,10 @@ public class EmployeeInfoController extends BaseController {
 		if (sysUser == null) {
 			return failed("用户信息获取失败");
 		}
+        EmployeeInfo info = employeeInfoService.findByPhone(employeeInfo.getMobileNo());
+		if(info != null && !info.getId().equals(employeeInfo.getId())){
+            return failed("该手机号已存在");
+        }
 		employeeInfo.setOperatorId(sysUser.getId());
     	Date date = new Date();
     	employeeInfo.setUpdateTime(date);

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

@@ -145,9 +145,62 @@ public class ExportController extends BaseController {
     private MusicEnlightenmentQuestionnaireService musicEnlightenmentQuestionnaireService;
     @Autowired
     private MusicGroupService musicGroupService;
+    @Autowired
+    private SysUserCashAccountLogService sysUserCashAccountLogService;
+
+    @ApiOperation(value = "退费记录导出")
+    @RequestMapping("export/userCashAccountLog")
+    @PreAuthorize("@pcs.hasPermissions('export/userCashAccountLog')")
+    public void exportUserCashAccountLog(HttpServletResponse response, AccountLogQueryInfo queryInfo) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        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("非法请求");
+            }
+        }
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        List<SysUserCashAccountLog> rows = sysUserCashAccountLogService.queryPage(queryInfo).getRows();
+        if(rows.size() < 1){
+            throw new BizException("没有可导出数据");
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"退费编号", "学员编号", "学员姓名","分部", "课程组编号", "课程组类型",
+                    "退费金额","退费类型","退费时间","交易流水号", "打款时间"}, new String[]{
+                    "id", "userId","username", "organName", "groupId","groupType.desc",
+                    "amount", "returnFeeType.msg", "createTime", "transNo","payTime"}, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attac:wq" +
+                    "hment;filename=classGroup-" + 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 = "乐团列表导出")
-    @RequestMapping("export/musicGroup")
+    @PostMapping("export/musicGroup")
     @PreAuthorize("@pcs.hasPermissions('export/musicGroup')")
     public void exportMusicGroup(HttpServletResponse response, MusicGroupQueryInfo queryInfo) throws IOException {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
@@ -174,7 +227,7 @@ public class ExportController extends BaseController {
         OutputStream outputStream = response.getOutputStream();
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "乐团编号", "乐团名称","合作单位", "乐团状态",
-                    "收费模式","收费类型","乐团主管","运营主管","成团人数", "在读人数", "申请时间", "成团时间", "清单状态"}, new String[]{
+                    "收费模式","收费类型","乐团主管","成团人数", "在读人数", "申请时间", "成团时间", "清单状态"}, new String[]{
                     "organName", "id", "name","cooperationOrganName", "status.msg", "courseViewType.msg","chargeTypeName",
                     "educationalTeacherName", "teamTeacherName", "groupMemberNum","payNum"
                     ,"createTime","updateTime","hasVerifyMusicalList?'已确认':'未确认'"}, rows);
@@ -198,22 +251,37 @@ public class ExportController extends BaseController {
         }
     }
 
-    @ApiOperation(value = "2021双十一学员购买详情")
-    @RequestMapping("export/doubleEleven2021OrderDetail")
-    @PreAuthorize("@pcs.hasPermissions('export/doubleEleven2021OrderDetail')")
-    public void doubleEleven2021OrderDetail(HttpServletResponse response,DoubleEleven2021QueryInfo queryInfo) throws IOException {
+    @ApiOperation(value = "21年暑期考级活动统计页面详情导出")
+    @PostMapping("export/statisticsDetail")
+    @PreAuthorize("@pcs.hasPermissions('export/statisticsDetail')")
+    public void statisticsDetail(HttpServletResponse response, ChildrenReserveQueryInfo queryInfo) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        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("非法请求");
+            }
+        }
         queryInfo.setPage(1);
         queryInfo.setRows(49999);
-        List<DoubleEleven2021OrderDetailDto> rows = vipGroupActivityService.doubleEleven2021OrderDetail(queryInfo).getRows();
+        List<ChildrenStatisticsDetailDto> rows = childrenDayReserveService.exportStatisticsDetail(queryInfo);
         if(rows.size() < 1){
-            throw new BizException("没有可导出数据");
-        }
+           throw new BizException("没有可导出数据");
+       }
         OutputStream outputStream = response.getOutputStream();
         try {
-            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"学员编号", "学员姓名","订单号", "交易金额",
-                    "交易时间", "订单创建时间", "购买课程", "赠送会员"}, new String[]{
-                    "userId", "username", "orderNo","amount", "payTime", "createTime","type",
-                    "giveMember==0?'否':'是'"}, rows);
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "合作单位", "乐团","学员编号", "学员姓名", "手机号","声部","所在班级","指导老师", "是否预约", "器乐等级", "乐理等级", "是否购买VIP","是否购买乐理课"}, new String[]{
+                    "organName", "cooperationOrganName", "musicGroupName","userId", "username", "phone","subjectName",
+                    "currentClass", "realName", "isReserve == true ?'是':'否'","gradeLeave"
+                    ,"theoryLevel","buyVipFlag == true ?'是':'否'","buyTheoryCourseFlag == true ?'是':'否'"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attac:wq" +
                     "hment;filename=classGroup-" + DateUtil.getDate(new Date()) + ".xls");
@@ -234,22 +302,22 @@ public class ExportController extends BaseController {
         }
     }
 
-    @ApiOperation(value = "分部2021双11活动统计导出")
-    @RequestMapping("export/organDoubleEleven2021Statis")
-    @PreAuthorize("@pcs.hasPermissions('export/organDoubleEleven2021Statis')")
-    public void organDoubleEleven2021Statis(HttpServletResponse response,Integer organId,String order, String sort) throws IOException {
-        List<DoubleEleven2021Dto> rows = vipGroupActivityService.organDoubleEleven2021Statis(order, sort,organId);
+    @ApiOperation(value = "2021双十一学员购买详情")
+    @RequestMapping("export/doubleEleven2021OrderDetail")
+    @PreAuthorize("@pcs.hasPermissions('export/doubleEleven2021OrderDetail')")
+    public void doubleEleven2021OrderDetail(HttpServletResponse response,DoubleEleven2021QueryInfo queryInfo) throws IOException {
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        List<DoubleEleven2021OrderDetailDto> rows = vipGroupActivityService.doubleEleven2021OrderDetail(queryInfo).getRows();
         if(rows.size() < 1){
             throw new BizException("没有可导出数据");
         }
         OutputStream outputStream = response.getOutputStream();
         try {
-            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "总成交金额","总购买人数", "人均购买金额",
-                    "20节1v1成交金额", "20节1v1成交人数", "40节1v1成交金额", "40节1v1成交人数", "20节1v2成交金额", "20节1v2成交人数",
-                    "40节1v2成交金额", "40节1v2成交人数", "乐理课成交金额", "乐理课成交人数", "赠送会员人数"}, new String[]{
-                    "organName", "totalBuyAmount", "totalBuyNum","avgBuyAmount", "vip1V120Amount", "vip1V120Num","vip1V140Amount",
-                    "vip1V140Num", "vip1V220Amount", "vip1V220Num","vip1V240Amount"
-                    ,"vip1V240Num","musicTheoryAmount","musicTheoryNum","giveMemberNum"}, rows);
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"学员编号", "学员姓名","订单号", "交易金额",
+                    "交易时间", "订单创建时间", "购买课程", "赠送会员"}, new String[]{
+                    "userId", "username", "orderNo","amount", "payTime", "createTime","type",
+                    "giveMember==0?'否':'是'"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attac:wq" +
                     "hment;filename=classGroup-" + DateUtil.getDate(new Date()) + ".xls");
@@ -270,37 +338,22 @@ public class ExportController extends BaseController {
         }
     }
 
-    @ApiOperation(value = "21年暑期考级活动统计页面详情导出")
-    @PostMapping("export/statisticsDetail")
-    @PreAuthorize("@pcs.hasPermissions('export/statisticsDetail')")
-    public void statisticsDetail(HttpServletResponse response, ChildrenReserveQueryInfo queryInfo) throws IOException {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("用户信息获取失败");
-        }
-        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("非法请求");
-            }
-        }
-        queryInfo.setPage(1);
-        queryInfo.setRows(49999);
-        List<ChildrenStatisticsDetailDto> rows = childrenDayReserveService.exportStatisticsDetail(queryInfo);
+    @ApiOperation(value = "分部2021双11活动统计导出")
+    @RequestMapping("export/organDoubleEleven2021Statis")
+    @PreAuthorize("@pcs.hasPermissions('export/organDoubleEleven2021Statis')")
+    public void organDoubleEleven2021Statis(HttpServletResponse response,Integer organId,String order, String sort) throws IOException {
+        List<DoubleEleven2021Dto> rows = vipGroupActivityService.organDoubleEleven2021Statis(order, sort,organId);
         if(rows.size() < 1){
-           throw new BizException("没有可导出数据");
-       }
+            throw new BizException("没有可导出数据");
+        }
         OutputStream outputStream = response.getOutputStream();
         try {
-            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "合作单位", "乐团","学员编号", "学员姓名", "手机号","声部","所在班级","指导老师", "是否预约", "器乐等级", "乐理等级", "是否购买VIP","是否购买乐理课"}, new String[]{
-                    "organName", "cooperationOrganName", "musicGroupName","userId", "username", "phone","subjectName",
-                    "currentClass", "realName", "isReserve == true ?'是':'否'","gradeLeave"
-                    ,"theoryLevel","buyVipFlag == true ?'是':'否'","buyTheoryCourseFlag == true ?'是':'否'"}, rows);
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "总成交金额","总购买人数", "人均购买金额",
+                    "20节1v1成交金额", "20节1v1成交人数", "40节1v1成交金额", "40节1v1成交人数", "20节1v2成交金额", "20节1v2成交人数",
+                    "40节1v2成交金额", "40节1v2成交人数", "乐理课成交金额", "乐理课成交人数", "赠送会员人数"}, new String[]{
+                    "organName", "totalBuyAmount", "totalBuyNum","avgBuyAmount", "vip1V120Amount", "vip1V120Num","vip1V140Amount",
+                    "vip1V140Num", "vip1V220Amount", "vip1V220Num","vip1V240Amount"
+                    ,"vip1V240Num","musicTheoryAmount","musicTheoryNum","giveMemberNum"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attac:wq" +
                     "hment;filename=classGroup-" + DateUtil.getDate(new Date()) + ".xls");
@@ -1185,7 +1238,9 @@ public class ExportController extends BaseController {
         managerDownload.setUpdateTime(nowDate);
         managerDownloadDao.insert(managerDownload);
         exportService.superFindCourseSchedules(queryInfo, managerDownload);
-        return succeed(fileName+"导出申请已提交,请到【报表中心-下载列表查看】");
+        HttpResponseResult<Object> succeed = succeed();
+        succeed.setMsg(fileName + "导出申请已提交,请到【报表中心-下载列表查看】");
+        return succeed;
     }
 
 
@@ -1439,7 +1494,36 @@ public class ExportController extends BaseController {
         managerDownload.setUpdateTime(nowDate);
         managerDownloadDao.insert(managerDownload);
         exportService.orderList(params, managerDownload);
-        return succeed(fileName+"导出申请已提交,请到【报表中心-下载列表查看】");
+        HttpResponseResult<Object> succeed = succeed();
+        succeed.setMsg(fileName + "导出申请已提交,请到【报表中心-下载列表查看】");
+        return succeed;
+    }
+
+
+    @ApiOperation(value = "学员小课记录导出")
+    @RequestMapping("export/studentVipPractice")
+    @PreAuthorize("@pcs.hasPermissions('export/studentVipPractice')")
+    public HttpResponseResult exportStudentVipPractice(Integer organId) throws IOException {
+        boolean hasCourse = courseScheduleStudentPaymentDao.hasCourse(organId);
+        if (!hasCourse) {
+            return failed("没有可导出的数据");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        Date nowDate = new Date();
+        String no = idGeneratorService.generatorId("download") + "";
+        String fileName = "studentVipPractice-" + no + "-" + DateUtil.getDate(nowDate) + ".xls";
+        ManagerDownload managerDownload = new ManagerDownload();
+        managerDownload.setType(ExportTypeEnum.STUDENT_VIP_PRACTICE);
+        managerDownload.setUserId(sysUser.getId());
+        managerDownload.setName(fileName);
+        managerDownload.setFileUrl("");
+        managerDownload.setCreateTime(nowDate);
+        managerDownload.setUpdateTime(nowDate);
+        managerDownloadDao.insert(managerDownload);
+        exportService.studentVipPractice(organId, managerDownload);
+        HttpResponseResult<Object> succeed = succeed();
+        succeed.setMsg(fileName + "导出申请已提交,请到【报表中心-下载列表查看】");
+        return succeed;
     }
 
 
@@ -2394,7 +2478,9 @@ public class ExportController extends BaseController {
         managerDownload.setUpdateTime(nowDate);
         managerDownloadDao.insert(managerDownload);
         exportService.routeOrderList(params, managerDownload);
-        return succeed(fileName+"导出申请已提交,请到【报表中心-下载列表查看】");
+        HttpResponseResult<Object> succeed = succeed();
+        succeed.setMsg(fileName + "导出申请已提交,请到【报表中心-下载列表查看】");
+        return succeed;
     }
 
 
@@ -2918,10 +3004,10 @@ public class ExportController extends BaseController {
         try {
             String[] header = {"分部", "基础技能班学员数量异常", "乐团巡查事项异常", "未在班级学员数", "欠费学员数",
                     "申请退团学员数", "预计课酬较低", "课程时间安排异常", "乐团巡查未计划", "乐团巡查任务未提交",
-                    "回访任务未完成", "课程考勤异常", "课程异常", "服务指标异常", "总计",};
+                    "回访任务未完成", "课程考勤异常", "课程异常", "服务指标异常", "异常请假", "会员过期学员数", "总计",};
             String[] body = {"organName", "highClassStudentLessThanThreeNum", "musicPatrolItem", "noClassMusicGroupStudentInfo", "studentNotPayment",
                     "studentApplyForQuitMusicGroup", "teacherExpectSalaryBeLow", "courseTimeError", "inspectionItem", "inspectionItemPlan",
-                    "studentVisit", "teacherExceptionAttendance", "teacherNotAClass", "teacherServeError", "total",};
+                    "studentVisit", "teacherExceptionAttendance", "teacherNotAClass", "teacherServeError", "studentErrorLeave", "noMemberStudentNum", "total",};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, result);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=teacherDefaultSalary-" + DateUtil.getDate(new Date()) + ".xls");

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

@@ -77,7 +77,6 @@ public class MusicGroupQuitController extends BaseController {
     private CloudTeacherOrderDao cloudTeacherOrderDao;
     @Autowired
     private TeacherDao teacherDao;
-    
     @Autowired
     private EmployeeDao employeeDao;
 
@@ -260,6 +259,30 @@ public class MusicGroupQuitController extends BaseController {
         return succeed(musicGroupService.approveQuitMusicGroup(roleIds, musicGroupQuit));
     }
 
+    @ApiOperation(value = "批量退团")
+    @PostMapping("/batchQuitMusicGroup")
+    @PreAuthorize("@pcs.hasPermissions('musicGroupQuit/batchQuitMusicGroup')")
+    public HttpResponseResult batchQuitMusicGroup(@RequestBody List<MusicGroupQuit> musicGroupQuits) throws Exception {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		List<Integer> roleIds = new ArrayList<Integer>();
+		if(sysUser.getIsSuperAdmin() == true) {
+			roleIds.add(SysUserRole.SECTION_MANAGER);
+			roleIds.add(SysUserRole.EDUCATIONAL_TEACHER);
+		} else {
+			roleIds = employeeDao.queryUserRole(sysUser.getId());
+		}
+		if (!(roleIds.contains(SysUserRole.SECTION_MANAGER) || roleIds.contains(SysUserRole.EDUCATIONAL_TEACHER))) {
+			throw new BizException("未经授权,不能操作");
+		}
+        for (MusicGroupQuit musicGroupQuit : musicGroupQuits) {
+            musicGroupService.approveQuitMusicGroup(roleIds, musicGroupQuit);
+        }
+        return succeed();
+    }
+
     @ApiOperation(value = "一键退团")
     @PostMapping("/directQuitMusicGroup")
     @PreAuthorize("@pcs.hasPermissions('musicGroupQuit/directQuitMusicGroup')")

+ 16 - 10
mec-web/src/main/java/com/ym/mec/web/controller/PracticeGroupManageController.java

@@ -115,17 +115,17 @@ public class PracticeGroupManageController extends BaseController {
         if (sysUser == null) {
             return failed("用户信息获取失败");
         }
-            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("非法请求");
-                }
+        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(practiceGroupService.findPracticeGroupReviews(queryInfo));
     }
 
@@ -205,4 +205,10 @@ public class PracticeGroupManageController extends BaseController {
         applyBaseInfoDto.setMemo("指导老师申请网管课");
         return practiceGroupService.createPracticeGroup(practiceGroupApplyDto);
     }
+
+    @ApiOperation(value = "获取学生指定网管课的剩余课时费用")
+    @GetMapping(value = "/getStudentSurplusCourseFee")
+    public Object getStudentSurplusCourseFee(Long practiceGroupId){
+        return succeed(practiceGroupService.getStudentSurplusCourseFee(practiceGroupId));
+    }
 }

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

@@ -65,17 +65,17 @@ public class StudentPaymentRouteOrderController extends BaseController {
         if (sysUser == null) {
             return failed("用户信息获取失败");
         }
-            Employee employee = employeeDao.get(sysUser.getId());
-            if (StringUtils.isEmpty(queryInfo.getRoutingOrganId())) {
-                queryInfo.setRoutingOrganId(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.getRoutingOrganId().split(",")))) {
-                    return failed("非法请求");
-                }
+        Employee employee = employeeDao.get(sysUser.getId());
+        if (StringUtils.isEmpty(queryInfo.getRoutingOrganId())) {
+            queryInfo.setRoutingOrganId(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.getRoutingOrganId().split(",")))) {
+                return failed("非法请求");
             }
+        }
         if (StringUtils.isNotBlank(queryInfo.getSearch())) {
             List<BasicUserDto> users = studentPaymentOrderDao.getUsers(queryInfo.getSearch());
             List<Integer> userIds = users.stream().map(BasicUserDto::getUserId).collect(Collectors.toList());

+ 74 - 0
mec-web/src/main/java/com/ym/mec/web/controller/SysUserCashAccountLogController.java

@@ -0,0 +1,74 @@
+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.entity.SysUserCashAccountLog;
+import com.ym.mec.biz.dal.page.AccountLogQueryInfo;
+import com.ym.mec.biz.service.SysUserCashAccountLogService;
+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.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.Arrays;
+import java.util.List;
+
+@RequestMapping("userCashAccountLog")
+@Api(tags = "用户账户退费记录")
+@RestController
+public class SysUserCashAccountLogController extends BaseController {
+
+	@Autowired
+	private SysUserCashAccountLogService sysUserCashAccountLogService;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+	@Autowired
+	private EmployeeDao employeeDao;
+
+	@ApiOperation(value = "获取退费详情")
+	@GetMapping("/get")
+	@PreAuthorize("@pcs.hasPermissions('userCashAccountLog/get')")
+	public Object get(Long id) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("请重新登录");
+		}
+		return succeed(sysUserCashAccountLogService.get(id));
+	}
+
+	@ApiOperation(value = "修改")
+	@GetMapping("/update")
+	@PreAuthorize("@pcs.hasPermissions('userCashAccountLog/update')")
+	public Object update(SysUserCashAccountLog sysUserCashAccountLog) {
+		return succeed(sysUserCashAccountLogService.update(sysUserCashAccountLog));
+	}
+
+	@ApiOperation(value = "分页查询收费类型列表")
+	@GetMapping("/queryPage")
+	@PreAuthorize("@pcs.hasPermissions('userCashAccountLog/queryPage')")
+	public Object queryPage(AccountLogQueryInfo queryInfo) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("用户信息获取失败");
+		}
+		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(sysUserCashAccountLogService.queryPage(queryInfo));
+	}
+}

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

@@ -51,17 +51,17 @@ public class WebCourseHomeworkController extends BaseController {
         if (sysUser == null) {
             return failed("用户信息获取失败");
         }
-            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("非法请求");
-                }
+        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));
     }
 

+ 2 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/CourseHomeworkController.java

@@ -80,12 +80,14 @@ public class CourseHomeworkController extends BaseController {
         if(!extra){
             CourseHomework courseHomework = courseHomeworkService.get(homeworkId);
             if(Objects.nonNull(courseHomework)){
+                result.put("title", courseHomework.getTitle());
                 result.put("content", courseHomework.getContent());
             }
             result.put("data", studentCourseHomeworkService.findStudentCourseHomeworkByCourse(null, homeworkId,userName));
         }else{
             ExtracurricularExercises extracurricularExercises = extracurricularExercisesService.get(homeworkId);
             if(Objects.nonNull(extracurricularExercises)){
+                result.put("title", extracurricularExercises.getTitle());
                 result.put("content", extracurricularExercises.getContent());
             }
             result.put("data", extracurricularExercisesReplyService.findExtraExerciseStudents(homeworkId,userName));

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

@@ -49,14 +49,14 @@ public class EduOnlineMusicGroupController extends BaseController {
     @Autowired
     private EmployeeDao employeeDao;
 
-    @ApiOperation(value = "分页查询乐团列表")
+    @ApiOperation(value = "分页查询维修技师所在乐团列表")
     @GetMapping("/findMusicGroups")
     public HttpResponseResult findMusicGroups(MusicGroupQueryInfo queryInfo){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed("用户信息获取失败");
         }
-        queryInfo.setEducationalTeacherId(sysUser.getId());
+        queryInfo.setRepairUserId(sysUser.getId());
         queryInfo.setStatus(MusicGroupStatusEnum.PROGRESS);
         return succeed(musicGroupService.findEduTeacherMusicGroups(queryInfo));
     }

+ 29 - 27
mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentRegistrationController.java

@@ -1,31 +1,28 @@
 package com.ym.mec.web.controller.education;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.ui.ModelMap;
-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.auth.api.client.SysUserFeignService;
 import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderCourseSettingsDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
 import com.ym.mec.biz.dal.dto.StudentPreRegistrationDto;
+import com.ym.mec.biz.dal.entity.StudentInstrument;
 import com.ym.mec.biz.dal.entity.StudentPreRegistration;
+import com.ym.mec.biz.dal.page.StudentInstrumentQueryInfo;
 import com.ym.mec.biz.dal.page.StudentPreRegistrationQueryInfo;
-import com.ym.mec.biz.service.EmployeeService;
-import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
+import com.ym.mec.biz.service.StudentInstrumentService;
 import com.ym.mec.biz.service.StudentPreRegistrationService;
 import com.ym.mec.biz.service.StudentRegistrationService;
 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.ui.ModelMap;
+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;
 
 @RequestMapping("eduStudentRegistration")
 @Api(tags = "学生报名信息服务")
@@ -35,19 +32,24 @@ public class EduStudentRegistrationController extends BaseController {
     @Autowired
     private StudentRegistrationService studentRegistrationService;
     @Autowired
-    private MusicGroupSubjectPlanService musicGroupSubjectPlanService;
-    @Autowired
-    private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
-    @Autowired
-    private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
-    @Autowired
     private StudentPreRegistrationService studentPreRegistrationService;
     @Autowired
     private MusicGroupDao musicGroupDao;
     @Autowired
-    private SysUserFeignService sysUserFeignService;
-    @Autowired
-    private EmployeeService employeeService;
+    private StudentInstrumentService studentInstrumentService;
+
+
+    @ApiOperation(value = "获取乐团学员列表(包含乐保信息)")
+    @GetMapping("/queryMusicStudentInstrument")
+    public Object queryMusicStudentInstrument(StudentPreRegistrationQueryInfo queryInfo) {
+        return succeed(studentRegistrationService.queryMusicStudentInstrument(queryInfo));
+    }
+
+    @ApiOperation(value = "获取乐器与乐保列表")
+    @GetMapping("/getList")
+    public HttpResponseResult<PageInfo<StudentInstrument>> getList(StudentInstrumentQueryInfo queryInfo) {
+        return succeed(studentInstrumentService.queryPage(queryInfo));
+    }
 
     @ApiOperation(value = "乐团预报名列表分页查询")
     @GetMapping("/queryPreApplyList")