Browse Source

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

 Conflicts:
	mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
	mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageQueryInfo.java
	mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
	mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
	mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
	mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
	mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java
	mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
zouxuan 4 năm trước cách đây
mục cha
commit
9c1077e40f
72 tập tin đã thay đổi với 2561 bổ sung251 xóa
  1. 16 0
      cms/src/main/resources/bootstrap-dev_server.properties
  2. 16 0
      mec-auth/mec-auth-server/src/main/resources/bootstrap-dev_server.properties
  3. 10 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CooperationOrganDao.java
  4. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java
  5. 13 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  6. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  7. 14 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPreRegistrationDao.java
  8. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  9. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupActivityDao.java
  10. 143 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupRegAndMoneyDto.java
  11. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java
  12. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupApplyBaseInfoDto.java
  13. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Student.java
  14. 40 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ActivityCourseType.java
  15. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  16. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/SporadicChargeTypeEnum.java
  17. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageQueryInfo.java
  18. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherNameQueryInfo.java
  19. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  20. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  21. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantPaymentOrderService.java
  22. 29 5
      mec-biz/src/main/java/com/ym/mec/biz/service/UploadFileService.java
  23. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java
  24. 35 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ChildrenDayDegreeInfoServiceImpl.java
  25. 0 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  26. 0 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  27. 26 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  28. 19 38
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  29. 50 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  30. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantPaymentOrderServiceImpl.java
  31. 598 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  32. 4 0
      mec-biz/src/main/resources/config/mybatis/CooperationOrganMapper.xml
  33. 4 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  34. 143 86
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  35. 1 1
      mec-biz/src/main/resources/config/mybatis/SchoolMapper.xml
  36. 6 0
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  37. 16 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  38. 8 0
      mec-biz/src/main/resources/config/mybatis/StudentPreRegistrationMapper.xml
  39. 22 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  40. 5 2
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  41. 4 0
      mec-biz/src/main/resources/config/mybatis/VipGroupActivityMapper.xml
  42. 9 0
      mec-client-api/src/main/java/com/ym/mec/im/ImFeignService.java
  43. 3 3
      mec-client-api/src/main/java/com/ym/mec/im/fallback/ImFeignServiceFallback.java
  44. 4 0
      mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
  45. 5 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  46. 16 0
      mec-common/audit-log/src/main/java/com/yonge/log/dal/dao/HistoryMessageDao.java
  47. 164 0
      mec-common/audit-log/src/main/java/com/yonge/log/dal/model/HistoryMessage.java
  48. 16 0
      mec-common/audit-log/src/main/java/com/yonge/log/service/HistoryMessageService.java
  49. 159 0
      mec-common/audit-log/src/main/java/com/yonge/log/service/impl/HistoryMessageServiceImpl.java
  50. 10 0
      mec-common/mongo-db/src/main/java/com/yonge/mongodb/dao/BaseDaoWithMongo.java
  51. 2 1
      mec-im/src/main/java/com/ym/config/ResourceServerConfig.java
  52. 2 6
      mec-im/src/main/java/com/ym/controller/HistoryController.java
  53. 4 1
      mec-im/src/main/java/com/ym/service/Impl/MessageServiceImpl.java
  54. 16 0
      mec-im/src/main/resources/bootstrap-dev_server.properties
  55. 23 45
      mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java
  56. 16 0
      mec-student/src/main/resources/bootstrap-dev_server.properties
  57. 19 0
      mec-task/src/main/java/com/ym/mec/task/jobs/SyncImHistoryMessageTask.java
  58. 16 0
      mec-teacher/src/main/resources/bootstrap-dev_server.properties
  59. 3 1
      mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java
  60. 34 0
      mec-web/src/main/java/com/ym/mec/web/controller/ImHistoryMessageController.java
  61. 10 3
      mec-web/src/main/java/com/ym/mec/web/controller/StudentRegistrationController.java
  62. 43 0
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  63. 10 10
      mec-web/src/main/java/com/ym/mec/web/controller/TeacherController.java
  64. 117 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduRegisterController.java
  65. 52 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduSchoolController.java
  66. 58 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentStudentController.java
  67. 9 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduSubjectController.java
  68. 93 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduVipGroupActivityController.java
  69. 58 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduVipGroupCategoryController.java
  70. 72 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduVipGroupManageController.java
  71. 143 0
      mec-web/src/main/resources/application.yml
  72. 16 0
      mec-web/src/main/resources/bootstrap-dev_server.properties

+ 16 - 0
cms/src/main/resources/bootstrap-dev_server.properties

@@ -0,0 +1,16 @@
+#\u6307\u5b9a\u5f00\u53d1\u73af\u5883
+#spring.profiles.active=dev
+#\u670d\u52a1\u5668\u5730\u5740
+spring.cloud.nacos.config.server-addr=47.114.1.200:8848
+#\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
+spring.cloud.nacos.config.namespace=fd352683-69df-439a-802f-c44f0c21329c
+#\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
+spring.cloud.nacos.config.group=DEFAULT_GROUP
+#\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}
+spring.cloud.nacos.config.prefix=cms
+#\u6307\u5b9a\u6587\u4ef6\u540e\u7f00
+spring.cloud.nacos.config.file-extension=yaml
+#\u662f\u5426\u52a8\u6001\u5237\u65b0
+spring.cloud.nacos.config.refresh.enabled=true
+#\u662f\u5426\u542f\u7528nacos\u914d\u7f6e\u4e2d\u5fc3
+spring.cloud.nacos.config.enabled=true

+ 16 - 0
mec-auth/mec-auth-server/src/main/resources/bootstrap-dev_server.properties

@@ -0,0 +1,16 @@
+#\u6307\u5b9a\u5f00\u53d1\u73af\u5883
+#spring.profiles.active=dev
+#\u670d\u52a1\u5668\u5730\u5740
+spring.cloud.nacos.config.server-addr=47.114.1.200:8848
+#\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
+spring.cloud.nacos.config.namespace=fd352683-69df-439a-802f-c44f0c21329c
+#\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
+spring.cloud.nacos.config.group=DEFAULT_GROUP
+#\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}
+spring.cloud.nacos.config.prefix=auth
+#\u6307\u5b9a\u6587\u4ef6\u540e\u7f00
+spring.cloud.nacos.config.file-extension=yaml
+#\u662f\u5426\u52a8\u6001\u5237\u65b0
+spring.cloud.nacos.config.refresh.enabled=true
+#\u662f\u5426\u542f\u7528nacos\u914d\u7f6e\u4e2d\u5fc3
+spring.cloud.nacos.config.enabled=true

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

@@ -50,6 +50,7 @@ public interface CooperationOrganDao extends BaseDAO<Integer, CooperationOrgan>
 
     /**
      * 根据合作单位ids获取合作单位
+     *
      * @param ids
      * @return
      */
@@ -57,9 +58,17 @@ public interface CooperationOrganDao extends BaseDAO<Integer, CooperationOrgan>
 
     /**
      * 修改合作单位乐团主管
+     *
      * @param transferUserId
      * @param levelUserId
      * @param organId
      */
     void batchUpdateEduId(@Param("transferUserId") Integer transferUserId, @Param("levelUserId") Integer levelUserId, @Param("organId") Integer organId);
-}
+
+    /**
+     * 获取乐团主管的合作单位
+     *
+     * @return
+     */
+    List<CooperationOrgan> getCooperationOrganByEduTeacherId(@Param("userId") Integer userId);
+}

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

@@ -27,6 +27,8 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	 */
 	int batchInsert(List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries);
 
+	int updateEnableChangeSalaryByClassGroup(@Param("classGroupId") Long classGroupId, @Param("enableChangeSalary") Boolean enableChangeSalary);
+
 	/**
 	 * @param courseScheduleIds: 课程编号列表
 	 * @return int

+ 13 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java

@@ -1,10 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.CalenderPushDto;
-import com.ym.mec.biz.dal.dto.MusicCardDto;
-import com.ym.mec.biz.dal.dto.MusicGroupRegisterDto;
-import com.ym.mec.biz.dal.dto.RegisterSubjectDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.School;
@@ -400,6 +397,7 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
 
     /**
      * 根据合作单位获取乐团列表
+     *
      * @param cooperationOrganId
      * @return
      */
@@ -407,6 +405,7 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
 
     /**
      * 根据合作单位获取乐团列表
+     *
      * @param cooperationOrganId
      * @return
      */
@@ -414,6 +413,7 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
 
     /**
      * 批量修改乐团主管
+     *
      * @param cooperationOrganId
      * @param educationUserId
      */
@@ -427,4 +427,13 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
      */
     MusicGroup getStudentLastMusicGroup(@Param("userId") Integer userId);
 
+
+    /**
+     * 获取回款统计的乐团
+     *
+     * @param organId
+     * @param cooperationOrganIds
+     * @return
+     */
+    List<MusicGroupRegAndMoneyDto> getMusicGroupByStatus(@Param("organId") String organId, @Param("cooperationOrganIds") List<Integer> cooperationOrganIds, @Param("musicGroupName") String musicGroupName);
 }

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

@@ -23,6 +23,8 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
 
     List<Student> findByStudentIds(@Param("studentIds") List<Integer> studentIds);
 
+    List<Student> lockStudents(@Param("studentIds") List<Integer> studentIds);
+
     SysUser lockUserReturnInfo(@Param("userId") Integer userId);
 
     SysUser getUser(@Param("userId") Integer userId);

+ 14 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPreRegistrationDao.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.dal.dao;
 import java.util.List;
 import java.util.Map;
 
+import com.ym.mec.biz.dal.dto.MusicGroupRegAndMoneyDto;
 import org.apache.ibatis.annotations.Param;
 
 import com.ym.mec.biz.dal.dto.StudentPreRegistrationDto;
@@ -15,13 +16,20 @@ public interface StudentPreRegistrationDao extends BaseDAO<Long, StudentPreRegis
 	StudentPreRegistration queryByMusicGroupIdAndUserId(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);
 
 	StudentPreRegistration queryByMusicGroupIdAndPhone(@Param("phone") String phone, @Param("musicGroupId") String musicGroupId);
-	
+
 	List<StudentPreRegistration> queryByMusicGroupId(String musicGroupId);
-	
-	List<StudentPreRegistrationDto> queryListForPage(Map<String,Object> params);
-	
+
+	List<StudentPreRegistrationDto> queryListForPage(Map<String, Object> params);
+
 	//统计第一专业
 	List<Mapper> queryFirstSubjectNum(String musicGroupId);
-	
+
 	List<Mapper> querySecondSubjectNum(String musicGroupId);
-}
+
+	/**
+	 * 获取乐团预报名人数
+	 * @param musicGroupIds
+	 * @return
+	 */
+	List<MusicGroupRegAndMoneyDto> getPreRegisterNum(@Param("musicGroupIds") List<String> musicGroupIds);
+}

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

@@ -616,4 +616,19 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
      * @return
      */
     boolean checkHasMemberGroup(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId);
+
+    /**
+     * 获取报名缴费的相关人数
+     *
+     * @param musicGroupIds
+     * @return
+     */
+    List<MusicGroupRegAndMoneyDto> getRegisters(@Param("musicGroupIds") List<String> musicGroupIds);
+
+    /**
+     * 获取已缴费审核中的人数
+     * @param musicGroupId
+     * @return
+     */
+    int countPayAndCheckNum(@Param("musicGroupId") String musicGroupId);
 }

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

@@ -28,6 +28,8 @@ public interface VipGroupActivityDao extends BaseDAO<Integer, VipGroupActivity>
 
 	List<VipGroupActivity> queryByIds(@Param("activityIds") String activityIds);
 
+	List<VipGroupActivity> findByName(@Param("name") String name);
+
 	/**
 	 * 导出vip活动
 	 * @param params

+ 143 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupRegAndMoneyDto.java

@@ -0,0 +1,143 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+/**
+ * 乐团预报名、报名、及回款统计
+ */
+public class MusicGroupRegAndMoneyDto {
+
+    @ApiModelProperty(value = "乐团id", required = false)
+    private String musicGroupId;
+
+    @ApiModelProperty(value = "乐团名称", required = false)
+    private String musicGroupName;
+
+    @ApiModelProperty(value = "分部名称", required = false)
+    private String organName;
+
+    @ApiModelProperty(value = "乐团状态", required = false)
+    private String musicGroupStatus;
+
+    @ApiModelProperty(value = "预报名人数", required = false)
+    private Integer preRegNum = 0;
+
+    @ApiModelProperty(value = "报名人数", required = false)
+    private Integer regNum = 0;
+
+    @ApiModelProperty(value = "缴费人数", required = false)
+    private Integer payNum = 0;
+
+    @ApiModelProperty(value = "缴费中人数", required = false)
+    private Integer payingNum = 0;
+
+    @ApiModelProperty(value = "审核中人数", required = false)
+    private Integer checkNum = 0;
+
+    @ApiModelProperty(value = "购买云教练人数", required = false)
+    private Integer buyCloudTeacherNum = 0;
+
+    @ApiModelProperty(value = "购买乐器人数", required = false)
+    private Integer buyInstrumentNum = 0;
+
+    @ApiModelProperty(value = "回款金额", required = false)
+    private BigDecimal money = BigDecimal.ZERO;
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public String getMusicGroupStatus() {
+        return musicGroupStatus;
+    }
+
+    public void setMusicGroupStatus(String musicGroupStatus) {
+        this.musicGroupStatus = musicGroupStatus;
+    }
+
+    public Integer getPreRegNum() {
+        return preRegNum;
+    }
+
+    public void setPreRegNum(Integer preRegNum) {
+        this.preRegNum = preRegNum;
+    }
+
+    public Integer getRegNum() {
+        return regNum;
+    }
+
+    public void setRegNum(Integer regNum) {
+        this.regNum = regNum;
+    }
+
+    public Integer getPayNum() {
+        return payNum;
+    }
+
+    public void setPayNum(Integer payNum) {
+        this.payNum = payNum;
+    }
+
+    public Integer getPayingNum() {
+        return payingNum;
+    }
+
+    public void setPayingNum(Integer payingNum) {
+        this.payingNum = payingNum;
+    }
+
+    public Integer getCheckNum() {
+        return checkNum;
+    }
+
+    public void setCheckNum(Integer checkNum) {
+        this.checkNum = checkNum;
+    }
+
+    public Integer getBuyCloudTeacherNum() {
+        return buyCloudTeacherNum;
+    }
+
+    public void setBuyCloudTeacherNum(Integer buyCloudTeacherNum) {
+        this.buyCloudTeacherNum = buyCloudTeacherNum;
+    }
+
+    public Integer getBuyInstrumentNum() {
+        return buyInstrumentNum;
+    }
+
+    public void setBuyInstrumentNum(Integer buyInstrumentNum) {
+        this.buyInstrumentNum = buyInstrumentNum;
+    }
+
+    public String getMusicGroupName() {
+        return musicGroupName;
+    }
+
+    public void setMusicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+    }
+
+    public BigDecimal getMoney() {
+        return money;
+    }
+
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+}

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

@@ -90,6 +90,8 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
 
     private String feeFlag;
 
+    private Integer payingStatus;
+
     public BigDecimal getSporadicAmount() {
         return sporadicAmount;
     }
@@ -369,4 +371,12 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
     public void setRechargeFee(BigDecimal rechargeFee) {
         this.rechargeFee = rechargeFee;
     }
+
+    public Integer getPayingStatus() {
+        return payingStatus;
+    }
+
+    public void setPayingStatus(Integer payingStatus) {
+        this.payingStatus = payingStatus;
+    }
 }

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

@@ -2,6 +2,7 @@ package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.biz.dal.entity.VipGroup;
 import com.ym.mec.biz.dal.entity.VipGroupStudentCoursePrice;
+import com.ym.mec.biz.dal.enums.ActivityCourseType;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.math.BigDecimal;
@@ -40,6 +41,17 @@ public class VipGroupApplyBaseInfoDto extends VipGroup {
     @ApiModelProperty(value = "第一个选择的学员")
     private Integer firstStudentId;
 
+    @ApiModelProperty(value = "活动课程类型")
+    private ActivityCourseType activityCourseType;
+
+    public ActivityCourseType getActivityCourseType() {
+        return activityCourseType;
+    }
+
+    public void setActivityCourseType(ActivityCourseType activityCourseType) {
+        this.activityCourseType = activityCourseType;
+    }
+
     public Integer getFirstStudentId() {
         return firstStudentId;
     }

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

@@ -67,11 +67,22 @@ public class Student extends SysUser {
 	
 	private String memberRankImg;
 
+	@ApiModelProperty(value = "活动排课信息")
+	private String activityCourseDetail;
+
 	public Student(Integer userId, String subjectIdList) {
 		this.userId = userId;
 		this.subjectIdList = subjectIdList;
 	}
 
+	public String getActivityCourseDetail() {
+		return activityCourseDetail;
+	}
+
+	public void setActivityCourseDetail(String activityCourseDetail) {
+		this.activityCourseDetail = activityCourseDetail;
+	}
+
 	public Boolean getIsNewUser() {
 		return isNewUser;
 	}

+ 40 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ActivityCourseType.java

@@ -0,0 +1,40 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/10 0010
+ **/
+public enum ActivityCourseType implements BaseEnum<String, ComplaintsStatusEnum> {
+    FREE_VIP("free_vip", "考级活动赠送课"),
+    VIP1("vip1", "考级活动1v1VIP课"),
+    VIP2("vip2", "考级活动1v2VIP课"),
+    MUSIC_THEORY("music_theory", "考级活动乐理课");
+
+    private String code;
+
+    private String msg;
+
+    ActivityCourseType(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

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

@@ -172,6 +172,9 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     BACKSTAGE_STUDENT_APPEAL("BACKSTAGE_STUDENT_APPEAL", "学员申述"),
     BACKSTAGE_STUDENT_APPLY_QUIT_GROUP("BACKSTAGE_STUDENT_APPLY_QUIT_GROUP", "学员申请退团"),
 
+    CHILDREN_DAY_VIP_COURSE_TEACHER_PUSH("CHILDREN_DAY_VIP_COURSE_TEACHER_PUSH", "六一活动课程安排"),
+    CHILDREN_DAY_VIP_COURSE_STUDENT_PUSH("CHILDREN_DAY_VIP_COURSE_STUDENT_PUSH", "六一活动课程安排"),
+
     BACKSTAGE_STUDENT_APPLY_QUIT_COURSE("BACKSTAGE_STUDENT_APPLY_QUIT_COURSE", "学员申请退课"),
     BACKSTAGE_STUDENT_APPLY_WITHDRAW("BACKSTAGE_STUDENT_APPLY_WITHDRAW", "学员申请提现"),
     CHILDREN_DAY_NOTICE_PUSH("CHILDREN_DAY_NOTICE_PUSH", "技能评测考级报名推送"),

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

@@ -16,7 +16,8 @@ public enum SporadicChargeTypeEnum implements BaseEnum<Integer, SporadicChargeTy
     OTHER(11,"其他"),
     DOUBLE_ELEVEN2020(12,"2020双十一活动"),
     HIGH_ONLINE_ACTIVITY(13,"网基课活动"),
-    PRACTICE_GROUP_BUY(14,"加油包");
+    PRACTICE_GROUP_BUY(14,"加油包"),
+    CLOUD_TEACHER_BUY(15,"系统购买");
 
     private Integer code;
 

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

@@ -38,6 +38,8 @@ public class StudentManageQueryInfo extends QueryInfo {
     
     private Integer teacherId;
 
+    private Integer teacherIdForOrgan;
+
     private Integer isNewUser;
 
     private Integer carePackage;
@@ -55,6 +57,34 @@ public class StudentManageQueryInfo extends QueryInfo {
         this.hasMember = hasMember;
     }
 
+    private Integer subjectId;
+
+    private String activityCourseType;
+
+    public Integer getTeacherIdForOrgan() {
+        return teacherIdForOrgan;
+    }
+
+    public void setTeacherIdForOrgan(Integer teacherIdForOrgan) {
+        this.teacherIdForOrgan = teacherIdForOrgan;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getActivityCourseType() {
+        return activityCourseType;
+    }
+
+    public void setActivityCourseType(String activityCourseType) {
+        this.activityCourseType = activityCourseType;
+    }
+
     public Integer getCarePackage() {
         return carePackage;
     }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherNameQueryInfo.java

@@ -14,6 +14,16 @@ public class TeacherNameQueryInfo extends QueryInfo {
 
     private String jobNature;
 
+    private Boolean includeFlowOrgan;
+
+    public Boolean getIncludeFlowOrgan() {
+        return includeFlowOrgan;
+    }
+
+    public void setIncludeFlowOrgan(Boolean includeFlowOrgan) {
+        this.includeFlowOrgan = includeFlowOrgan;
+    }
+
     public Integer getTeacherId() {
         return teacherId;
     }

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

@@ -8,6 +8,7 @@ import com.ym.mec.biz.dal.page.RegistrationOrPreQueryInfo;
 import com.ym.mec.biz.dal.page.StudentRegistrationQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+import org.apache.ibatis.annotations.Param;
 
 import java.io.IOException;
 import java.math.BigDecimal;
@@ -413,4 +414,21 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      */
     Boolean setNoneCloudTeacher(Long id);
 
+    /**
+     * 已付费解除审核增加缴费人数和0元缴费人数
+     * @param id
+     * @return
+     */
+    Boolean addPaidNum(Long id);
+
+
+    /**
+     * 获取学生乐团的注册信息
+     * @param musicGroupId
+     * @param studentId
+     * @return
+     */
+    StudentRegistration getStudentRegister(String musicGroupId, Integer studentId);
+
+
 }

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

@@ -222,6 +222,8 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     //会员结束前5天提醒学员续费(退团提醒)(默认提前15天)
     String PUSH_MEMBER_RENEW_QUIT = "push_member_renew_quit";
 
+    String CHILDREN_DAY_VIP_ACTIVITY_IDS = "children_day_vip_activity_ids";
+
     /**
      * @return com.ym.mec.biz.dal.entity.SysConfig
      * @params paramName

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

@@ -36,4 +36,7 @@ public interface TenantPaymentOrderService extends BaseService<Long, TenantPayme
 	public TenantPaymentOrder queryByOrderNo(String orderNo);
 
 	Object queryTenanPaymentPage(TenantPaymentOrderQueryInfo queryInfo);
-}
+
+
+	Boolean confirmOrder(TenantPaymentOrder order);
+}

+ 29 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/UploadFileService.java

@@ -1,15 +1,13 @@
 package com.ym.mec.biz.service;
 
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import com.ym.mec.common.entity.UploadReturnBean;
@@ -17,6 +15,7 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.thirdparty.storage.StoragePluginContext;
 import com.ym.mec.thirdparty.storage.provider.KS3StoragePlugin;
 import com.ym.mec.util.upload.UploadUtil;
+import org.springframework.web.multipart.MultipartFile;
 
 /** 
  * 上传工具服务层实现类
@@ -40,7 +39,6 @@ public class UploadFileService {
 	private String fileRoot;
 
 	public UploadReturnBean uploadFile(InputStream in, String ext) {
-
 		UploadReturnBean uploadReturn = new UploadReturnBean("", false, "");
 		String fileName = UploadUtil.getFileName(ext);
 
@@ -77,6 +75,32 @@ public class UploadFileService {
 		return uploadReturn;
 	}
 
+
+	@Async
+	public UploadReturnBean uploadImHistoryMsgFile(File msgFile) throws FileNotFoundException {
+		InputStream in = new FileInputStream(msgFile);
+		UploadReturnBean uploadReturn = new UploadReturnBean("", false, "");
+		String fileName = UploadUtil.getFileName(msgFile.getName());
+
+		String root = fileRoot + "im_history_msg/";
+		if (StringUtils.isBlank(root)) {
+			uploadReturn.setMessage("上传临时目录没有配置");
+			return uploadReturn;
+		}
+
+		String staticFloder = "";
+		String folder = UploadUtil.getFileFloder();
+		String filePath = UploadUtil.getFilePath(root, staticFloder, folder);
+		File file = uploadFile(in, filePath, fileName);
+		String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME,staticFloder + folder, file);
+
+		FileUtils.deleteQuietly(file);
+
+		uploadReturn.setStatus(true);
+		uploadReturn.setUrl(url);
+		return uploadReturn;
+	}
+
 	public void setMaxSize(int maxSize) {
 		this.maxSize = maxSize;
 	}

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

@@ -28,6 +28,7 @@ import com.ym.mec.biz.dal.page.VipGroupTeachingRecordQueryInfo;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+import org.springframework.web.multipart.MultipartFile;
 
 public interface VipGroupService extends BaseService<Long, VipGroup> {
 
@@ -41,6 +42,17 @@ public interface VipGroupService extends BaseService<Long, VipGroup> {
     HttpResponseResult createVipGroup(VipGroupApplyDto vipGroup);
 
     /**
+     * @describe 创建vip课
+     * @author Joburgess
+     * @date 2019/10/30
+     * @param vipGroup: VIP课申请信息
+     * @return void
+     */
+    HttpResponseResult createActivityVipGroup(VipGroupApplyDto vipGroup);
+
+    HttpResponseResult importActivityVipGroup(String data);
+
+    /**
      * @describe 获取教务与教师共有分部
      * @author Joburgess
      * @date 2020.07.08

+ 35 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ChildrenDayDegreeInfoServiceImpl.java

@@ -1,19 +1,27 @@
 package com.ym.mec.biz.service.impl;
 
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.dao.ChildrenDayDegreeDetailDao;
 import com.ym.mec.biz.dal.dao.ChildrenDayDegreeInfoDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
 import com.ym.mec.biz.dal.entity.ChildrenDayDegreeDetail;
 import com.ym.mec.biz.dal.entity.ChildrenDayDegreeInfo;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.enums.ActivityCourseType;
 import com.ym.mec.biz.service.ChildrenDayDegreeInfoService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Objects;
 
 @Service
 public class ChildrenDayDegreeInfoServiceImpl extends BaseServiceImpl<Integer, ChildrenDayDegreeInfo> implements ChildrenDayDegreeInfoService {
@@ -21,6 +29,8 @@ public class ChildrenDayDegreeInfoServiceImpl extends BaseServiceImpl<Integer, C
     private ChildrenDayDegreeInfoDao childrenDayDegreeInfoDao;
     @Autowired
     private ChildrenDayDegreeDetailDao childrenDayDegreeDetailDao;
+    @Autowired
+    private StudentDao studentDao;
 
     @Override
     public BaseDAO<Integer, ChildrenDayDegreeInfo> getDAO() {
@@ -32,6 +42,14 @@ public class ChildrenDayDegreeInfoServiceImpl extends BaseServiceImpl<Integer, C
     public ChildrenDayDegreeInfo addInfo(Long orderId) {
         List<ChildrenDayDegreeDetail> details = childrenDayDegreeDetailDao.getByOrderId(orderId);
         ChildrenDayDegreeInfo childrenDayDegreeInfo = new ChildrenDayDegreeInfo();
+        Student student = null;
+        JSONObject courseDetail = new JSONObject();
+        if(!CollectionUtils.isEmpty(details)){
+            student = studentDao.get(details.get(0).getUserId());
+        }
+        if(Objects.nonNull(student)&& StringUtils.isNotBlank(student.getActivityCourseDetail())){
+            courseDetail = JSON.parseObject(student.getActivityCourseDetail());
+        }
         BigDecimal totalAmount = BigDecimal.ZERO;
         for (ChildrenDayDegreeDetail detail : details) {
             switch (detail.getType()) {
@@ -39,6 +57,9 @@ public class ChildrenDayDegreeInfoServiceImpl extends BaseServiceImpl<Integer, C
                     childrenDayDegreeInfo.setSubjectId(detail.getSubjectId());
                     childrenDayDegreeInfo.setGradeLevel(detail.getLevel());
                     childrenDayDegreeInfo.setGradePrice(detail.getPrice());
+                    if(detail.getPrice().compareTo(BigDecimal.ZERO)>0&&!courseDetail.containsKey(ActivityCourseType.FREE_VIP.getCode())){
+                        courseDetail.put(ActivityCourseType.FREE_VIP.getCode(), 1);
+                    }
                     break;
                 case 2:
                     childrenDayDegreeInfo.setTheoryLevel(detail.getLevel());
@@ -46,12 +67,22 @@ public class ChildrenDayDegreeInfoServiceImpl extends BaseServiceImpl<Integer, C
                     break;
                 case 3:
                     childrenDayDegreeInfo.setVip1v1Price(detail.getPrice());
+                    if(detail.getPrice().compareTo(BigDecimal.ZERO)>0&&!courseDetail.containsKey(ActivityCourseType.VIP1.getCode())){
+                        courseDetail.put(ActivityCourseType.VIP1.getCode(), 1);
+                    }
                     break;
                 case 4:
                     childrenDayDegreeInfo.setVip1v2Price(detail.getPrice());
+                    if(detail.getPrice().compareTo(BigDecimal.ZERO)>0&&!courseDetail.containsKey(ActivityCourseType.VIP2.getCode())){
+                        courseDetail.put(ActivityCourseType.VIP2.getCode(), 1);
+                    }
                     break;
                 case 5:
                     childrenDayDegreeInfo.setTheoryCoursePrice(detail.getPrice());
+                    if(detail.getPrice().compareTo(BigDecimal.ZERO)>0&&!courseDetail.containsKey(ActivityCourseType.MUSIC_THEORY.getCode())){
+                        courseDetail.put(ActivityCourseType.MUSIC_THEORY.getCode(), 1);
+                        courseDetail.put("music_theory_price", detail.getPrice());
+                    }
                     break;
                 default:
                     break;
@@ -65,6 +96,10 @@ public class ChildrenDayDegreeInfoServiceImpl extends BaseServiceImpl<Integer, C
         if (childrenDayDegreeInfoDao.insert(childrenDayDegreeInfo) <= 0) {
             throw new BizException("汇总信息插入失败");
         }
+        if(Objects.nonNull(student)){
+            student.setActivityCourseDetail(courseDetail.toJSONString());
+            studentDao.update(student);
+        }
         return childrenDayDegreeInfo;
     }
 

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

@@ -109,13 +109,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                                                      List<CourseSchedule> vipCourseSchedules,
                                                      BigDecimal onlineTeacherSalary,
                                                      BigDecimal offlineTeacherSalary) {
-
-        School school = schoolService.get(vipGroup.getTeacherSchoolId());
-        BigDecimal subsidy = new BigDecimal(0);
-        if (Objects.nonNull(school)) {
-            subsidy=school.getSubsidy();
-        }
-
         //获取活动信息
         VipGroupActivity vipGroupActivity = null;
         if(vipGroup.getVipGroupActivityId() != null){

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

@@ -956,12 +956,6 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 
 		resultMap.put("studentInfo",flag2);
 		boolean flag3 = false;
-		if(!flag3){
-			int teacherLeave = indexBaseMonthDataDao.queryTeacherLeave(organIdsStr,startTime);
-			if(teacherLeave > 0){
-				flag3 = true;
-			}
-		}
 
 		Integer userId = null;
 		if (!userRole.contains(SysUserRole.SECTION_MANAGER) && !sysUser.getIsSuperAdmin()) {

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

@@ -722,6 +722,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         StudentPaymentOrder studentPaymentOrder = studentRegistrationService.addOrder(studentRegistration, amount, orderNo, channelType, courseFee, goodsGroups, remitFee, courseRemitFee, newCourses, registerPayDto.getBuyMaintenance(), registerPayDto.getBuyCloudTeacher(), registerPayDto.getBuyCloudTeacherPlus());
         studentPaymentOrder = studentPaymentOrderService.get(studentPaymentOrder.getId());
+        boolean canPay = studentPaymentOrder.getClassGroupId() != null && studentPaymentOrder.getClassGroupId().equals(206);
 
         Date date = new Date();
         BigDecimal balance = BigDecimal.ZERO;
@@ -747,7 +748,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         studentPaymentOrder.setUpdateTime(date);
 
         if ("205".equals(studentPaymentOrder.getPaymentAccountNo())) {
-            studentPaymentOrder.setPaymentChannel("ADAPAY");
+            if(!canPay) {
+                studentPaymentOrder.setPaymentChannel("ADAPAY");
+            }
             studentRegistration.setPayingStatus(2);
         }
         studentPaymentOrderService.update(studentPaymentOrder);
@@ -764,10 +767,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.NO_BUY_CLOUD_TEACHER_MSG,
                     userPhoneMap, null, 0, null, null, musicGroup.getName(), studentRegistration.getName());
 
-            Map<String, String> notifyMap = new HashMap<>();
-            notifyMap.put("hasPaidZero", "205");
-            notifyMap.put("orderNo", studentPaymentOrder.getOrderNo());
-            return notifyMap;
+            if(!canPay){
+                Map<String, String> notifyMap = new HashMap<>();
+                notifyMap.put("hasPaidZero", "205");
+                notifyMap.put("orderNo", studentPaymentOrder.getOrderNo());
+                return notifyMap;
+            }
         }
 
         if (amount.compareTo(BigDecimal.ZERO) == 0) {
@@ -918,6 +923,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         StudentPaymentOrder studentPaymentOrder = studentRegistrationService.addOrder(studentRegistration, amount, orderNo, channelType, courseFee, goodsGroups, remitFee, courseRemitFee, newCourses, registerPayDto.getBuyMaintenance(), registerPayDto.getBuyCloudTeacher(), registerPayDto.getBuyCloudTeacherPlus());
         studentPaymentOrder = studentPaymentOrderService.get(studentPaymentOrder.getId());
+        boolean canPay = studentPaymentOrder.getClassGroupId() != null && studentPaymentOrder.getClassGroupId().equals(206);
         Date date = new Date();
 
         BigDecimal balance = BigDecimal.ZERO;
@@ -943,7 +949,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         studentPaymentOrder.setUpdateTime(date);
 
         if ("205".equals(studentPaymentOrder.getPaymentAccountNo())) {
-            studentPaymentOrder.setPaymentChannel("ADAPAY");
+            if(!canPay) {
+                studentPaymentOrder.setPaymentChannel("ADAPAY");
+            }
             studentRegistration.setPayingStatus(2);
         }
         studentPaymentOrderService.update(studentPaymentOrder);
@@ -959,11 +967,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.NO_BUY_CLOUD_TEACHER_MSG,
                     userPhoneMap, null, 0, null, null, musicGroup.getName(), studentRegistration.getName());
 
-
-            Map<String, String> notifyMap = new HashMap<>();
-            notifyMap.put("hasPaidZero", "205");
-            notifyMap.put("orderNo", studentPaymentOrder.getOrderNo());
-            return notifyMap;
+            if(!canPay) {
+                Map<String, String> notifyMap = new HashMap<>();
+                notifyMap.put("hasPaidZero", "205");
+                notifyMap.put("orderNo", studentPaymentOrder.getOrderNo());
+                return notifyMap;
+            }
         }
 
         if (amount.compareTo(BigDecimal.ZERO) == 0) {
@@ -2928,6 +2937,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         } else {
             throw new BizException("当前乐团状态不支持此操作");
         }
+        //有已付费,在储备中的人,不容许到储备中
+        int payAndCheckNum = studentRegistrationDao.countPayAndCheckNum(musicGroupId);
+        if(payAndCheckNum > 0){
+            throw new BizException("有已付费,审核中的学生,请处理后再开团");
+        }
+
         //新建团:(乐团合作单位没有进行中 、暂停、关闭 的乐团)
         //若乐团新建团,则操作【确认开团】时,若【已缴费】学员达到98人,则无需对【未缴费】学员新增回访
         //若乐团不是新建团,则操作【确认开团】时,若【已缴费】学员达到58人,则无需对【未缴费】学员新增回访

+ 19 - 38
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -11,6 +11,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.service.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
@@ -19,19 +22,10 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.alibaba.fastjson.JSON;
-import com.ym.mec.biz.dal.dao.GoodsDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentRouteOrderDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dto.PageInfoOrder;
 import com.ym.mec.biz.dal.dto.SporadicChargeInfoDto;
 import com.ym.mec.biz.dal.dto.StudentPaymentOrderDto;
 import com.ym.mec.biz.dal.dto.StudentPaymentOrderExportDto;
-import com.ym.mec.biz.dal.entity.Goods;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
-import com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
@@ -40,24 +34,6 @@ import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
 import com.ym.mec.biz.dal.enums.SporadicChargeTypeEnum;
 import com.ym.mec.biz.dal.page.SporadicOrderQueryInfo;
 import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
-import com.ym.mec.biz.service.ChildrenDayReserveService;
-import com.ym.mec.biz.service.CloudTeacherOrderService;
-import com.ym.mec.biz.service.DegreeRegistrationService;
-import com.ym.mec.biz.service.MemberRankSettingService;
-import com.ym.mec.biz.service.MusicGroupService;
-import com.ym.mec.biz.service.PayService;
-import com.ym.mec.biz.service.PracticeGroupService;
-import com.ym.mec.biz.service.ReplacementInstrumentActivityService;
-import com.ym.mec.biz.service.SporadicChargeInfoService;
-import com.ym.mec.biz.service.StudentInstrumentService;
-import com.ym.mec.biz.service.StudentPaymentOrderDetailService;
-import com.ym.mec.biz.service.StudentPaymentOrderService;
-import com.ym.mec.biz.service.StudentPaymentRouteOrderService;
-import com.ym.mec.biz.service.StudentRegistrationService;
-import com.ym.mec.biz.service.StudentRepairService;
-import com.ym.mec.biz.service.SubjectChangeService;
-import com.ym.mec.biz.service.SysUserCashAccountService;
-import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -102,10 +78,10 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private DegreeRegistrationService degreeRegistrationService;
     @Autowired
     private StudentPaymentRouteOrderDao studentPaymentRouteOrderDao;
-    
+
     @Autowired
     private StudentPaymentOrderDetailService studentPaymentOrderDetailService;
-    
+
     @Autowired
     private IdGeneratorService idGeneratorService;
     @Autowired
@@ -118,14 +94,14 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private ReplacementInstrumentActivityService replacementInstrumentActivityService;
     @Autowired
     private ChildrenDayReserveService childrenDayReserveService;
-    
+
     @Autowired
     private MemberRankSettingService memberRankSettingService;
     @Autowired
     private PayService payService;
     @Autowired
     private StudentPaymentRouteOrderService studentPaymentRouteOrderService;
-    
+
     @Autowired
     private CloudTeacherOrderService cloudTeacherOrderService;
 
@@ -138,7 +114,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
 	public Map createOrder(StudentPaymentOrder studentPaymentOrder, List<StudentPaymentOrderDetail> details, String payReceiver)
 			throws Exception {
-    	
+
     	BigDecimal cashAmount = studentPaymentOrder.getActualAmount();
     	BigDecimal expectAmount = studentPaymentOrder.getExpectAmount();
     	BigDecimal balance = studentPaymentOrder.getBalancePaymentAmount();
@@ -149,7 +125,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
 
 		Date date = new Date();
 		studentPaymentOrder.setUpdateTime(date);
-		
+
 		StudentPaymentOrder orignStudentPaymentOrder = get(studentPaymentOrder.getId());
 		if(orignStudentPaymentOrder == null){
 
@@ -160,14 +136,14 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
 			studentPaymentOrder.setVersion(0);
 			insert(studentPaymentOrder);
 		}
-		
+
 		if(details != null && details.size() > 0){
 			for(StudentPaymentOrderDetail spod : details){
 				spod.setPaymentOrderId(studentPaymentOrder.getId());
 				spod.setCreateTime(date);
 				spod.setUpdateTime(date);
 			}
-			
+
 			studentPaymentOrderDetailService.batchAdd(details);
 		}
 
@@ -179,11 +155,11 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             studentPaymentOrder.setUpdateTime(date);
             studentPaymentOrder.setPayTime(date);
             update(studentPaymentOrder);
-            
+
 			studentPaymentRouteOrderService.addRouteOrder(studentPaymentOrder.getOrderNo(), studentPaymentOrder.getOrganId(), balance);
-			
+
 			callOrderCallBack(studentPaymentOrder);
-			
+
 			Map<String, String> notifyMap = new HashMap<>(4);
 			notifyMap.put("tradeState", "1");
 			notifyMap.put("merOrderNo", studentPaymentOrder.getOrderNo());
@@ -634,7 +610,12 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     @Override
     public List<StudentPaymentOrderExportDto> getUserApplyOrders(Integer studentId, String musicGroupId) {
         List<StudentPaymentOrderExportDto> orders = studentPaymentOrderDao.getUserApplyOrders(studentId, musicGroupId);
+        StudentRegistration studentRegister = studentRegistrationService.getStudentRegister(musicGroupId, studentId);
         for (StudentPaymentOrderExportDto order : orders) {
+            if((DealStatusEnum.ING.equals(order.getStatus())||DealStatusEnum.SUCCESS.equals(order.getStatus())) &&
+                studentRegister.getPayingStatus().equals(2)){
+                order.setPayingStatus(2);
+            }
             if (order.getOrderDetailList() == null) continue;
             for (StudentPaymentOrderDetail studentPaymentOrderDetail : order.getOrderDetailList()) {
                 if (studentPaymentOrderDetail.getGoodsList() == null) continue;

+ 50 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -536,6 +536,9 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             studentPaymentOrder.setVersion(0);
             String code = studentRegistration.getNoneNeedCloudTeacher().equals(1) ? "200" : "205";
             studentPaymentOrder.setPaymentAccountNo(code);
+            if (code.equals("205") && !"".equals(maintenanceGoodsId)) {
+                studentPaymentOrder.setClassGroupId(206);
+            }
             studentPaymentOrderService.update(studentPaymentOrder);
         }
         return studentPaymentOrder;
@@ -1100,7 +1103,10 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             }
             studentRegistration.setPaymentStatus(YES);
             studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
-            studentRegistration.setPayingStatus(0);
+
+            if (studentPaymentOrder.getClassGroupId() == null || !studentPaymentOrder.getClassGroupId().equals(206)) {
+                studentRegistration.setPayingStatus(0);
+            }
 
             List<StudentPaymentOrderDetail> orderDetails = studentPaymentOrderDetailService.getOrderDetail(studentPaymentOrder.getId());
 
@@ -1851,21 +1857,21 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         int registerNum = studentRegistrationDao.getRegisterNum(queryInfo.getMusicGroupId());
         pageInfo.setRegNum(registerNum);
         RegisterDto registerOrPreMinTime = studentRegistrationDao.getRegisterOrPreMinTime(queryInfo.getMusicGroupId());
-        if(registerOrPreMinTime.getMinPayTime() != null){
+        if (registerOrPreMinTime != null && registerOrPreMinTime.getMinPayTime() != null) {
             Date startTime = DateUtil.trunc(registerOrPreMinTime.getMinPayTime());
             Date endTime = DateUtil.getLastTimeWithDay(startTime);
             int firstPayNum = studentRegistrationDao.getFirstPayNum(queryInfo.getMusicGroupId(), startTime, endTime);
-            int totalPayNum = studentRegistrationDao.getFirstPayNum(queryInfo.getMusicGroupId(), startTime,null);
+            int totalPayNum = studentRegistrationDao.getFirstPayNum(queryInfo.getMusicGroupId(), startTime, null);
             pageInfo.setFirstDayPayNum(firstPayNum);
             pageInfo.setPayNum(totalPayNum);
-            pageInfo.setPayScale(new BigDecimal(firstPayNum).multiply(new BigDecimal(100)).divide(new BigDecimal(totalPayNum),2,BigDecimal.ROUND_HALF_UP));
+            pageInfo.setPayScale(new BigDecimal(firstPayNum).multiply(new BigDecimal(100)).divide(new BigDecimal(totalPayNum), 2, BigDecimal.ROUND_HALF_UP));
         }
 
         pageInfo.setTotal(count);
         params.put("offset", pageInfo.getOffset());
         if (queryInfo.getPage() <= pageInfo.getTotalPage()) {
-            Date firstPreTime = registerOrPreMinTime.getMinPerRegisterTime();
-            Date firstPayTime = registerOrPreMinTime.getMinPayTime();
+            Date firstPreTime = registerOrPreMinTime != null ? registerOrPreMinTime.getMinPerRegisterTime() : null;
+            Date firstPayTime = registerOrPreMinTime != null ? registerOrPreMinTime.getMinPayTime() : null;
             dataList = studentRegistrationDao.getRegisterOrPreList(params);
             for (RegisterDto registerDto : dataList) {
                 if (DateUtil.dateToString(registerDto.getPerRegisterTime()).equals("2099-12-31") ||
@@ -1879,13 +1885,13 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 ) {
                     registerDto.setPayTime(null);
                 }
-                if (registerDto.getPerRegisterTime() != null) {
+                if (firstPreTime != null && registerDto.getPerRegisterTime() != null) {
                     int perRegInterval = DateUtil.secondsBetween(firstPreTime, registerDto.getPerRegisterTime());
                     registerDto.setPerRegInterval(perRegInterval);
                     registerDto.setPerRegIntervalStr(DateUtil.secondsFormat(perRegInterval));
                 }
 
-                if (registerDto.getPayTime() != null) {
+                if (firstPayTime != null && registerDto.getPayTime() != null) {
                     int payTimeInterval = DateUtil.secondsBetween(firstPayTime, registerDto.getPayTime());
                     registerDto.setPayInterval(payTimeInterval);
                     registerDto.setPayIntervalStr(DateUtil.secondsFormat(payTimeInterval));
@@ -1900,7 +1906,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     public Boolean setNoneCloudTeacher(Long id) {
         StudentRegistration studentRegistration = studentRegistrationDao.get(id);
         if (!studentRegistration.getPayingStatus().equals(2)) {
-            throw new BizException("该学生不在预约中");
+            throw new BizException("该学生不在审核中");
         }
         if (studentRegistration.getNoneNeedCloudTeacher().equals(1)) {
             throw new BizException("该学生已设置");
@@ -1911,4 +1917,39 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         }
         return true;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean addPaidNum(Long id) {
+        StudentRegistration studentRegistration = studentRegistrationDao.get(id);
+        if (!studentRegistration.getPayingStatus().equals(2)) {
+            throw new BizException("该学生不在审核");
+        }
+        if (!studentRegistration.getPaymentStatus().equals(YES)) {
+            throw new BizException("该学生状态已更新,请刷新查看");
+        }
+        studentRegistration.setPayingStatus(0);
+        studentRegistrationDao.update(studentRegistration);
+        StudentPaymentOrder order = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(studentRegistration.getUserId(), studentRegistration.getMusicGroupId(), DealStatusEnum.SUCCESS);
+        order.setPaymentAccountNo("200");
+        if(studentPaymentOrderService.update(order)<=0){
+            throw new BizException("订单处理失败,请重试");
+        }
+
+        MusicGroupSubjectPlan musicOneSubjectClassPlan = musicGroupSubjectPlanService.getMusicOneSubjectClassPlan(studentRegistration.getMusicGroupId(), studentRegistration.getActualSubjectId());
+        int paidNum = musicOneSubjectClassPlan.getPaidStudentNum() == null ? 0 : musicOneSubjectClassPlan.getPaidStudentNum();
+        int paidZeroNum = musicOneSubjectClassPlan.getPaidZeroNum() == null ? 0 : musicOneSubjectClassPlan.getPaidZeroNum();
+        musicOneSubjectClassPlan.setPaidZeroNum(paidZeroNum + 1);
+        musicOneSubjectClassPlan.setPaidStudentNum(paidNum + 1);
+        int count = musicGroupSubjectPlanService.update(musicOneSubjectClassPlan);
+        if (count <= 0) {
+            throw new BizException("缴费人数更新失败,请重试");
+        }
+        return true;
+    }
+
+    @Override
+    public StudentRegistration getStudentRegister(String musicGroupId, Integer studentId) {
+        return studentRegistrationDao.getStudentRegister(musicGroupId,studentId);
+    }
 }

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

@@ -221,7 +221,7 @@ public class TenantPaymentOrderServiceImpl extends BaseServiceImpl<Long, TenantP
         return true;
     }
 
-    private Boolean confirmOrder(TenantPaymentOrder order) {
+    public Boolean confirmOrder(TenantPaymentOrder order) {
         List<StudentPaymentRouteOrder> routeOrders = studentPaymentRouteOrderDao.getRouteOrders(order.getOrderNo());
         for (StudentPaymentRouteOrder routeOrder : routeOrders) {
             Map<String, Object> divMember = new HashMap<>();
@@ -423,4 +423,4 @@ public class TenantPaymentOrderServiceImpl extends BaseServiceImpl<Long, TenantP
         pageInfo.setRows(dataList);
         return pageInfo;
     }
-}
+}

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

@@ -26,6 +26,7 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateConvertor;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.string.MessageFormatter;
 
@@ -43,18 +44,23 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.MessageFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static com.ym.mec.biz.dal.enums.GroupType.MUSIC;
+import static com.ym.mec.biz.dal.enums.GroupType.VIP;
+
 @Service
 public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> implements VipGroupService {
 
@@ -157,6 +163,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 	private StudentPaymentRouteOrderService studentPaymentRouteOrderService;
 	@Autowired
 	private VipGroupStudentCoursePriceDao vipGroupStudentCoursePriceDao;
+	@Autowired
+	private SysConfigService sysConfigService;
 
 	private static final Logger LOGGER = LoggerFactory
 			.getLogger(VipGroup.class);
@@ -471,6 +479,592 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+	public HttpResponseResult createActivityVipGroup(VipGroupApplyDto vipGroup) {
+		if (Objects.isNull(vipGroup.getVipGroupApplyBaseInfo().getUserId())){
+			throw new BizException("请选择指导老师");
+		}
+
+		if(vipGroup.getCourseSchedules().size()!=(vipGroup.getVipGroupApplyBaseInfo().getOfflineClassesNum()+vipGroup.getVipGroupApplyBaseInfo().getOnlineClassesNum())){
+			throw new BizException("建课失败,当前课程存在未排课课程,请调整相关设置");
+		}
+
+		Map<TeachModeEnum, List<CourseSchedule>> courseScheduleGroup;
+		try {
+			courseScheduleGroup = vipGroup.getCourseSchedules().stream().collect(Collectors.groupingBy(CourseSchedule::getTeachMode));
+		} catch (Exception e) {
+			throw new BizException("教学模式错误");
+		}
+
+		if(StringUtils.isBlank(vipGroup.getVipGroupApplyBaseInfo().getSubjectIdList())){
+			throw new BizException("请选择声部");
+		}
+
+		if(ActivityCourseType.FREE_VIP.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())){
+			List<VipGroupCategory> vipGroupCategories = vipGroupCategoryDao.findAllByOrgan(vipGroup.getVipGroupApplyBaseInfo().getOrganId().toString());
+			VipGroupCategory vipGroupCategory = vipGroupCategories.stream().filter(v -> v.getName().equals("1v2")).findFirst().get();
+			vipGroup.getVipGroupApplyBaseInfo().setVipGroupCategoryId(vipGroupCategory.getId());
+		}
+
+		if((Objects.isNull(courseScheduleGroup.get(TeachModeEnum.OFFLINE))&&vipGroup.getVipGroupApplyBaseInfo().getOfflineClassesNum()!=0)
+				||(!Objects.isNull(courseScheduleGroup.get(TeachModeEnum.OFFLINE))&&(courseScheduleGroup.get(TeachModeEnum.OFFLINE).size()<vipGroup.getVipGroupApplyBaseInfo().getOfflineClassesNum()))){
+			throw new BizException("线下课课时数量安排有误");
+		}
+
+		if((Objects.isNull(courseScheduleGroup.get(TeachModeEnum.ONLINE))&&vipGroup.getVipGroupApplyBaseInfo().getOnlineClassesNum()!=0)
+				||(!Objects.isNull(courseScheduleGroup.get(TeachModeEnum.ONLINE))&&(courseScheduleGroup.get(TeachModeEnum.ONLINE).size()<vipGroup.getVipGroupApplyBaseInfo().getOnlineClassesNum()))){
+			throw new BizException("线上课课时数量安排有误");
+		}
+
+		if(vipGroup.getVipGroupApplyBaseInfo().getOfflineClassesNum()>0
+				&&Objects.isNull(vipGroup.getVipGroupApplyBaseInfo().getTeacherSchoolId())){
+			throw new BizException("请设置教学点");
+		}
+
+		String studentIds=vipGroup.getVipGroupApplyBaseInfo().getStudentIdList();
+		if(StringUtils.isBlank(studentIds)){
+			throw new BizException("请选择学员");
+		}
+		List<Integer> studentIdList = Arrays.stream(studentIds.split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+
+		List<Student> studentDetail = studentDao.lockStudents(studentIdList);
+		List<SimpleUserDto> studentSimpleInfos = teacherDao.getUsersSimpleInfo(studentIdList);
+		if(studentDetail.size()!=studentSimpleInfos.size()){
+			throw new BizException("学员信息错误");
+		}
+		Map<Integer, SimpleUserDto> idUserInfoMap = studentSimpleInfos.stream().collect(Collectors.toMap(SimpleUserDto::getUserId, s -> s, (s1, s2) -> s1));
+		Map<Integer, BigDecimal> studentTheoryPriceMap = new HashMap<>();
+		for (Student student : studentDetail) {
+			if(StringUtils.isEmpty(student.getActivityCourseDetail())){
+				SimpleUserDto studentInfo = idUserInfoMap.get(student.getUserId());
+				throw new BizException("{}暂无排课资格", studentInfo.getNickName());
+			}
+			JSONObject courseDetail = JSON.parseObject(student.getActivityCourseDetail());
+			Integer surplusTimes = courseDetail.getInteger(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType().getCode());
+			if(surplusTimes<=0){
+				SimpleUserDto studentInfo = idUserInfoMap.get(student.getUserId());
+				throw new BizException("{}暂无排课资格", studentInfo.getNickName());
+			}
+			courseDetail.fluentPut(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType().getCode(), surplusTimes-1);
+			student.setActivityCourseDetail(courseDetail.toJSONString());
+			if(ActivityCourseType.MUSIC_THEORY.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())){
+				studentTheoryPriceMap.put(student.getUserId(), courseDetail.getBigDecimal("music_theory_price"));
+			}
+		}
+		studentDao.batchUpdate(studentDetail);
+
+		Date now=new Date();
+
+		VipGroupApplyBaseInfoDto vipGroupApplyBaseInfoDto=vipGroup.getVipGroupApplyBaseInfo();
+
+		if(Objects.isNull(vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice())
+				&&Objects.isNull(vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice())){
+			throw new BizException("请设置课程单价");
+		}
+
+		if(StringUtils.isBlank(vipGroupApplyBaseInfoDto.getStudentIdList())){
+			throw new BizException("请选择学员");
+		}
+
+		Integer totalClassTimes=vipGroupApplyBaseInfoDto.getOnlineClassesNum()+vipGroupApplyBaseInfoDto.getOfflineClassesNum();
+		//获取第一节课
+		CourseSchedule firstCourseSchedule = vipGroup.getCourseSchedules().stream().min(Comparator.comparing(CourseSchedule::getStartClassTime)).get();
+		//获取最后一节课
+		CourseSchedule latestCourseSchedule = vipGroup.getCourseSchedules().stream().max(Comparator.comparing(CourseSchedule::getEndClassTime)).get();
+
+		if(firstCourseSchedule.getStartClassTime().before(now)){
+			throw new BizException("开课时间不能小于当前时间");
+		}
+
+		vipGroupApplyBaseInfoDto.setRegistrationStartTime(now);
+		vipGroupApplyBaseInfoDto.setPaymentExpireDate(now);
+
+		if(vipGroupApplyBaseInfoDto.getRegistrationStartTime().after(vipGroupApplyBaseInfoDto.getPaymentExpireDate())){
+			throw new BizException("报名开始时间必须在报名截至时间之前");
+		}
+
+		List<Integer> canBuyStudentIds = Arrays.stream(vipGroupApplyBaseInfoDto.getStudentIdList().split(",")).map(e -> Integer.valueOf(e)).collect(Collectors.toList());
+		List<VipGroupStudentCoursePrice> vscps = vipGroup.getVipGroupApplyBaseInfo().getVipGroupStudentCoursePrices();
+
+		//获取活动信息
+		VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupApplyBaseInfo().getVipGroupActivityId());
+//		if(!vipGroup.getAllowOverstepActivityStudentNum()&&Objects.nonNull(vipGroupActivity)&&Objects.nonNull(vipGroupActivity.getStudentMaxUsedTimes())&&vipGroupActivity.getStudentMaxUsedTimes()!=-1&&StringUtils.isNotBlank(vipGroupApplyBaseInfoDto.getStudentIdList())){
+//			List<String> tempStudentIds = Arrays.asList(vipGroupApplyBaseInfoDto.getStudentIdList().split(","));
+//			List<Integer> errStudentIds = new ArrayList<>();
+//			for (String studentIdStr : tempStudentIds) {
+//				int useNum = vipGroupDao.countStudentUserActivityNum(vipGroup.getVipGroupApplyBaseInfo().getVipGroupActivityId(), Integer.valueOf(studentIdStr));
+//				if(useNum>=vipGroupActivity.getStudentMaxUsedTimes()){
+//					errStudentIds.add(Integer.valueOf(studentIdStr));
+//				}
+//			}
+//			if(errStudentIds.size()>0){
+//				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+//				String studentNames = StringUtils.join(studentSimpleInfos.stream().map(SimpleUserDto::getNickName).collect(Collectors.toList()), "、");
+//				return BaseController.failed(HttpStatus.PARTIAL_CONTENT,"该活动"+studentNames+"学员创建及成课之和已达上限,是否继续创建该课程?");
+//			}
+//		}
+		//判断课程安排是否超出范围
+		if(Objects.nonNull(vipGroupActivity)&&(Objects.nonNull(vipGroupActivity.getCoursesEndTime())||Objects.nonNull(vipGroupActivity.getCoursesStartTime()))){
+			if(latestCourseSchedule.getEndClassTime().after(vipGroupActivity.getCoursesEndTime())
+					||firstCourseSchedule.getStartClassTime().before(vipGroupActivity.getCoursesStartTime())){
+				throw new BizException("课时安排时间超出范围!");
+			}
+		}else{
+			VipGroupDefaultClassesCycle vipGroupDefaultClassesCycle = vipGroupDefaultClassesCycleDao.findByOrganAndClassTimes(totalClassTimes);
+
+			if (vipGroupDefaultClassesCycle != null) {
+				int month = DateUtil.monthsBetween(firstCourseSchedule.getStartClassTime(), latestCourseSchedule.getEndClassTime());
+				if (month > vipGroupDefaultClassesCycle.getMonth()) {
+					throw new BizException("课时安排时间超出范围!");
+				}
+			}
+		}
+
+		if(Objects.nonNull(vipGroupActivity)&&Objects.nonNull(vipGroupActivity.getMinCourseNum())&&vipGroupActivity.getMinCourseNum()!=-1&&Objects.nonNull(vipGroupActivity.getMaxCourseNum())&&vipGroupActivity.getMaxCourseNum()!=-1){
+			Integer requestCourseNum = vipGroupApplyBaseInfoDto.getOnlineClassesNum() + vipGroupApplyBaseInfoDto.getOfflineClassesNum();
+			if(requestCourseNum.compareTo(vipGroupActivity.getMinCourseNum())<0||requestCourseNum.compareTo(vipGroupActivity.getMaxCourseNum())>0){
+				throw new BizException("该活动课时数为{}节~{}节", vipGroupActivity.getMinCourseNum(), vipGroupActivity.getMaxCourseNum());
+			}
+		}
+
+		int repeatVipGroups = vipGroupDao.countUserRepeatVipGroupInCourseStartEndTime(vipGroupApplyBaseInfoDto.getUserId(), firstCourseSchedule.getStartClassTime(), latestCourseSchedule.getEndClassTime());
+		if(repeatVipGroups>0){
+			SysUser sysUser = sysUserFeignService.queryUserById(vipGroupApplyBaseInfoDto.getUserId());
+			throw new BizException("{}课程时间冲突({}-{})", sysUser.getRealName(), DateUtil.dateToString(firstCourseSchedule.getStartClassTime(), "yyyy-MM-dd HH:mm:ss"), DateUtil.dateToString(latestCourseSchedule.getEndClassTime(), "HH:mm:ss"));
+		}
+
+		VipGroupCategory vipGroupCategory = vipGroupCategoryDao.get(vipGroupApplyBaseInfoDto.getVipGroupCategoryId());
+		if(Objects.isNull(vipGroupCategory)){
+			throw new BizException("课程形式不存在");
+		}
+		List<String> studentNames = studentDao.getStudentNames(canBuyStudentIds);
+
+		//生成vip课信息
+		List<String> bySubIds = subjectDao.findBySubIds(vipGroupApplyBaseInfoDto.getSubjectIdList());
+		StringBuffer className=new StringBuffer();
+		if(ActivityCourseType.FREE_VIP.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())){
+			className.append("考前辅导课•");
+		}else if(Objects.isNull(vipGroupCategory.getMusicTheory())||!vipGroupCategory.getMusicTheory()){
+			className.append(StringUtils.join(bySubIds,","));
+			className.append(vipGroupCategory.getName());
+		}else{
+			className.append("乐理课•");
+		}
+		className.append(StringUtils.join(studentNames, ","));
+		vipGroupApplyBaseInfoDto.setName(className.toString());
+
+
+		if(!ActivityCourseType.FREE_VIP.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())){
+			//计算课程相关费用信息
+			Map<String, BigDecimal> costInfo = countVipGroupPredictFee(vipGroupApplyBaseInfoDto,
+					vipGroupApplyBaseInfoDto.getUserId(), null);
+			vipGroupApplyBaseInfoDto.setOnlineTeacherSalary(costInfo.get("onlineTeacherSalary"));
+			vipGroupApplyBaseInfoDto.setOfflineTeacherSalary(costInfo.get("offlineTeacherSalary"));
+			vipGroupApplyBaseInfoDto.setTotalPrice(costInfo.get("totalPrice"));
+		}else{
+			vipGroupApplyBaseInfoDto.setOnlineTeacherSalary(BigDecimal.ZERO);
+			vipGroupApplyBaseInfoDto.setOfflineTeacherSalary(BigDecimal.ZERO);
+			vipGroupApplyBaseInfoDto.setTotalPrice(BigDecimal.ZERO);
+		}
+
+		vipGroupApplyBaseInfoDto.setAuditStatus(AuditStatusEnum.PASS);
+		vipGroupApplyBaseInfoDto.setStatus(VipGroupStatusEnum.PROGRESS);
+
+		if(CollectionUtils.isEmpty(vscps)){
+			vscps = new ArrayList<>();
+			for (Integer canBuyStudentId : canBuyStudentIds) {
+				vscps.add(new VipGroupStudentCoursePrice(canBuyStudentId, vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice(), vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice(), vipGroupApplyBaseInfoDto.getTotalPrice()));
+			}
+		}
+		Teacher teacher = teacherService.get(vipGroupApplyBaseInfoDto.getUserId());
+		if(Objects.isNull(teacher)){
+			throw new BizException("教师不存在");
+		}
+
+		//开课时间为排课的第一节课的开始时间
+		vipGroupApplyBaseInfoDto.setCourseStartDate(firstCourseSchedule.getStartClassTime());
+		//课程结束时间为排课的最后一节课的结束时间
+		vipGroupApplyBaseInfoDto.setCoursesExpireDate(latestCourseSchedule.getEndClassTime());
+
+		vipGroupApplyBaseInfoDto.setPaymentExpireDate(DateUtil.getLastSecondWithDay(vipGroupApplyBaseInfoDto.getPaymentExpireDate()));
+
+		vipGroupDao.insert(vipGroupApplyBaseInfoDto);
+
+		vscps.forEach(e->e.setVipGroupId(vipGroupApplyBaseInfoDto.getId()));
+		vipGroupStudentCoursePriceDao.batchInsert(vscps);
+
+		vipGroup.getVipGroupApplyBaseInfo().setId(vipGroupApplyBaseInfoDto.getId());
+
+		//创建班级信息
+		ClassGroup classGroup=new ClassGroup();
+		classGroup.setSubjectIdList(vipGroupApplyBaseInfoDto.getSubjectIdList());
+		classGroup.setExpectStudentNum(vipGroupCategory.getStudentNum());
+		classGroup.setStudentNum(studentIdList.size());
+		classGroup.setName(vipGroupApplyBaseInfoDto.getName());
+		classGroup.setTotalClassTimes(totalClassTimes);
+		classGroup.setType(ClassGroupTypeEnum.VIP);
+		classGroup.setDelFlag(0);
+		classGroup.setGroupType(GroupType.VIP);
+		classGroup.setMusicGroupId(vipGroupApplyBaseInfoDto.getId().toString());
+		classGroup.setCreateTime(now);
+		classGroup.setUpdateTime(now);
+		classGroupDao.insert(classGroup);
+
+		//创建班级老师关联记录
+		ClassGroupTeacherMapper classGroupTeacherMapper=new ClassGroupTeacherMapper();
+		classGroupTeacherMapper.setMusicGroupId(vipGroupApplyBaseInfoDto.getId().toString());
+		classGroupTeacherMapper.setClassGroupId(classGroup.getId());
+		classGroupTeacherMapper.setTeacherRole(TeachTypeEnum.BISHOP);
+		classGroupTeacherMapper.setUserId(vipGroupApplyBaseInfoDto.getUserId());
+		classGroupTeacherMapper.setGroupType(GroupType.VIP);
+		classGroupTeacherMapper.setCreateTime(now);
+		classGroupTeacherMapper.setUpdateTime(now);
+		classGroupTeacherMapperDao.insert(classGroupTeacherMapper);
+
+		//创建班级与老师课酬记录
+		ClassGroupTeacherSalary classGroupTeacherSalary=new ClassGroupTeacherSalary();
+		classGroupTeacherSalary.setMusicGroupId(vipGroupApplyBaseInfoDto.getId().toString());
+		classGroupTeacherSalary.setClassGroupId(classGroup.getId());
+		classGroupTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
+		classGroupTeacherSalary.setUserId(vipGroupApplyBaseInfoDto.getUserId());
+		classGroupTeacherSalary.setSalary(vipGroupApplyBaseInfoDto.getOfflineTeacherSalary());
+		classGroupTeacherSalary.setOnlineClassesSalary(vipGroupApplyBaseInfoDto.getOnlineTeacherSalary());
+		classGroupTeacherSalary.setGroupType(GroupType.VIP);
+		classGroupTeacherSalary.setCreateTime(now);
+		classGroupTeacherSalary.setUpdateTime(now);
+		classGroupTeacherSalaryDao.insert(classGroupTeacherSalary);
+
+		//班级学员关联记录
+		List<ClassGroupStudentMapper> classGroupStudentMapperList = new ArrayList<>();
+		for (Integer studentId : studentIdList) {
+			ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
+			classGroupStudentMapper.setMusicGroupId(vipGroupApplyBaseInfoDto.getId().toString());
+			classGroupStudentMapper.setClassGroupId(classGroup.getId());
+			classGroupStudentMapper.setUserId(studentId);
+			classGroupStudentMapper.setCreateTime(now);
+			classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+			classGroupStudentMapper.setGroupType(GroupType.VIP);
+			classGroupStudentMapperList.add(classGroupStudentMapper);
+		}
+		classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentMapperList);
+
+		//课程信息调整
+		vipGroup.getCourseSchedules().forEach(courseSchedule -> {
+			courseSchedule.setGroupType(GroupType.VIP);
+			courseSchedule.setMusicGroupId(vipGroupApplyBaseInfoDto.getId().toString());
+			if(courseSchedule.getTeachMode().equals(TeachModeEnum.OFFLINE)){
+				courseSchedule.setSchoolId(vipGroup.getVipGroupApplyBaseInfo().getTeacherSchoolId());
+			}
+			courseSchedule.setTeacherId(vipGroupApplyBaseInfoDto.getUserId());
+			courseSchedule.setActualTeacherId(vipGroupApplyBaseInfoDto.getUserId());
+			courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+			courseSchedule.setType(CourseSchedule.CourseScheduleType.VIP);
+			courseSchedule.setClassGroupId(classGroup.getId());
+			courseSchedule.setName(vipGroupApplyBaseInfoDto.getName());
+			courseSchedule.setOrganId(vipGroupApplyBaseInfoDto.getOrganId());
+		});
+
+		vipGroupApplyBaseInfoDto.setCourseSchedulesJson(JSON.toJSONString(vipGroup.getCourseSchedules()));
+		vipGroupDao.update(vipGroupApplyBaseInfoDto);
+
+		//创建课程
+		List<CourseSchedule> courseSchedules = vipGroup.getCourseSchedules();
+		courseScheduleService.batchAddCourseSchedule(courseSchedules);
+		//创建老师单节课课酬信息
+		if(ActivityCourseType.FREE_VIP.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())){
+			List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
+			BigDecimal teacherDefaultSalary = new BigDecimal("16.67");
+			SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
+			if(Objects.nonNull(practiceCourseSalaryConfig)&&StringUtils.isNotBlank(practiceCourseSalaryConfig.getParanValue())){
+				teacherDefaultSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
+			}
+			for (CourseSchedule courseSchedule : courseSchedules) {
+				CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+				courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+				courseScheduleTeacherSalary.setGroupType(GroupType.VIP);
+				courseScheduleTeacherSalary.setMusicGroupId(classGroup.getMusicGroupId());
+				courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
+				courseScheduleTeacherSalary.setUserId(vipGroupApplyBaseInfoDto.getTeacherId().intValue());
+				courseScheduleTeacherSalary.setExpectSalary(teacherDefaultSalary);
+				courseScheduleTeacherSalary.setCreateTime(now);
+				courseScheduleTeacherSalary.setUpdateTime(now);
+				courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
+				courseScheduleTeacherSalary.setEnableChangeSalary(false);
+				courseScheduleTeacherSalaries.add(courseScheduleTeacherSalary);
+			}
+			List<TeacherAttendance> teacherAttendances = new ArrayList<>();
+			for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
+				TeacherAttendance teacherAttendance = new TeacherAttendance();
+				teacherAttendance.setGroupType(courseScheduleTeacherSalary.getGroupType());
+				teacherAttendance.setClassGroupId(courseScheduleTeacherSalary.getClassGroupId());
+				teacherAttendance.setMusicGroupId(courseScheduleTeacherSalary.getMusicGroupId());
+				teacherAttendance.setTeacherId(courseScheduleTeacherSalary.getUserId());
+				teacherAttendance.setCourseScheduleId(courseScheduleTeacherSalary.getCourseScheduleId());
+				teacherAttendances.add(teacherAttendance);
+			}
+			courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
+			if (!CollectionUtils.isEmpty(teacherAttendances)) {
+				teacherAttendanceDao.batchInsert(teacherAttendances);
+			}
+		}else{
+			courseScheduleTeacherSalaryService.createCourseScheduleTeacherVipSalary(vipGroupApplyBaseInfoDto,
+					courseSchedules,
+					classGroupTeacherSalary.getOnlineClassesSalary(),
+					classGroupTeacherSalary.getSalary());
+			courseScheduleTeacherSalaryDao.updateEnableChangeSalaryByClassGroup(classGroup.getId().longValue(), false);
+		}
+
+		SysUser sysUser = sysUserFeignService.queryUserById(vipGroupApplyBaseInfoDto.getUserId());
+
+		List<ClassGroupStudentMapper> classGroupStudents = classGroupStudentMapperDao.findByClassGroup(classGroup.getId());
+
+		Map<Integer,String> userRoleMap = new HashMap<>();
+		if(Objects.nonNull(vipGroupApplyBaseInfoDto.getEducationalTeacherId())){
+			userRoleMap.put(vipGroupApplyBaseInfoDto.getEducationalTeacherId(),"乐团主管");
+		}
+		userRoleMap.put(vipGroupApplyBaseInfoDto.getUserId(),"指导老师");
+		//生成学生单课缴费信息
+		for (ClassGroupStudentMapper classGroupStudent : classGroupStudents) {
+			if(ActivityCourseType.FREE_VIP.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())
+				||ActivityCourseType.MUSIC_THEORY.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())){
+				List<CourseScheduleStudentPayment> courseScheduleStudentPayments=new ArrayList<>();
+				BigDecimal price = studentTheoryPriceMap.get(classGroupStudent.getUserId());
+				BigDecimal coursePrice = BigDecimal.ZERO;
+				if(Objects.nonNull(price)){
+					coursePrice = price.divide(new BigDecimal(courseSchedules.size()), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+				}
+				for (CourseSchedule courseSchedule : courseSchedules) {
+					CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();
+					courseScheduleStudentPayment.setUserId(classGroupStudent.getUserId());
+					courseScheduleStudentPayment.setGroupType(courseSchedule.getGroupType());
+					courseScheduleStudentPayment.setMusicGroupId(courseSchedule.getMusicGroupId());
+					courseScheduleStudentPayment.setCourseScheduleId(courseSchedule.getId());
+					courseScheduleStudentPayment.setClassGroupId(courseSchedule.getClassGroupId());
+					if(ActivityCourseType.MUSIC_THEORY.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())){
+						courseScheduleStudentPayment.setExpectPrice(coursePrice);
+						courseScheduleStudentPayment.setOriginalPrice(coursePrice);
+					}else{
+						courseScheduleStudentPayment.setExpectPrice(BigDecimal.ZERO);
+						courseScheduleStudentPayment.setOriginalPrice(BigDecimal.ZERO);
+					}
+					courseScheduleStudentPayment.setActualPrice(courseScheduleStudentPayment.getExpectPrice());
+					courseScheduleStudentPayments.add(courseScheduleStudentPayment);
+				}
+				courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
+			}else{
+				courseScheduleStudentPaymentService.createCourseScheduleStudentPaymentForVipGroup(vipGroupApplyBaseInfoDto.getId(),classGroupStudent.getUserId());
+			}
+			userRoleMap.put(classGroupStudent.getUserId(),null);
+			studentDao.updateStudentServiceTag(classGroupStudent.getUserId(), null, YesOrNoEnum.YES.getCode());
+		}
+
+		courseScheduleService.checkNewCourseSchedules(courseSchedules, false,false);
+
+		try {
+			imGroupService.create(classGroup.getId().longValue(), null, classGroup.getName(), classGroup.getName(), vipGroupApplyBaseInfoDto.getName(), null, null, GroupType.VIP.getCode());
+			imGroupMemberService.join(classGroup.getId().longValue(), userRoleMap);
+			imUserFriendService.refreshGroupImUserFriend(classGroup.getMusicGroupId(),classGroup.getGroupType());
+			//发送推送
+			Map<Integer,String> map = new HashMap<>(1);
+			map.put(vipGroupApplyBaseInfoDto.getUserId(),sysUser.getPhone());
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,MessageTypeEnum.CHILDREN_DAY_VIP_COURSE_TEACHER_PUSH,
+					map,null,0,"","TEACHER", StringUtils.join(studentNames, ","),vipGroupApplyBaseInfoDto.getName());
+
+			Map<Integer,String> studentIdStrMap = new HashMap<>(1);
+			studentIdList.forEach(id->studentIdStrMap.put(id, id.toString()));
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.CHILDREN_DAY_VIP_COURSE_STUDENT_PUSH, studentIdStrMap, null, 0, "","STUDENT",
+					vipGroupApplyBaseInfoDto.getName());
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return BaseController.succeed(vipGroupApplyBaseInfoDto.getAuditStatus().getCode());
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public HttpResponseResult importActivityVipGroup(String data) {
+		if(StringUtils.isBlank(data)){
+			return BaseController.succeed();
+		}
+		List<JSONObject> datas = JSON.parseArray(data, JSONObject.class);
+		Date date = new Date();
+		for (JSONObject courseData : datas) {
+			boolean skipHoliday = "是".equals(courseData.getString("skip_holiday"))?true:false;
+			String vipGroupActivityName = courseData.getString("vip_group_activity");
+			String vipGroupCategoryStr = courseData.getString("vip_group_category");
+			boolean freeCourse = "考前辅导课".equals(vipGroupCategoryStr);
+			int courseMinute = freeCourse?25:45;
+			String vipGroupCategoryName = "1v1".equals(vipGroupCategoryStr)?"1v1":"1v2";
+			Integer schoolId = courseData.getInteger("school_id");
+			int onlineCourseNum = StringUtils.isBlank(courseData.getString("online_course_num"))?0:courseData.getIntValue("online_course_num");
+			int onlineWeekNum = 0;
+			if(onlineCourseNum>0){
+				onlineWeekNum = courseData.getIntValue("online_course_week_num");
+			}
+			String onlineCourseStartTime = courseData.getString("online_course_start_time");
+			int offlineCourseNum = StringUtils.isBlank(courseData.getString("offline_course_num"))?0:courseData.getIntValue("offline_course_num");
+			int offlineWeekNum = 0;
+			if(offlineCourseNum>0){
+				offlineWeekNum = courseData.getIntValue("offline_course_week_num");
+			}
+			String offlineCourseStartTime = courseData.getString("offline_course_start_time");
+			int totalCourseNum = onlineCourseNum + offlineCourseNum;
+			Integer teacherId = courseData.getInteger("teacher_id");
+			Integer eduTeacherId = StringUtils.isBlank(courseData.getString("edu_teacher_id"))?null:courseData.getInteger("edu_teacher_id");
+			String studentIdsStr= courseData.getString("student_ids");
+			if(StringUtils.isBlank(studentIdsStr)){
+				throw new BizException("请选择学员");
+			}
+			List<Integer> studentIds = Arrays.stream(studentIdsStr.split(",")).map(id -> Integer.valueOf(id)).collect(Collectors.toList());
+			SysUser student = studentDao.getUser(studentIds.get(0));
+			Student stu = studentDao.get(studentIds.get(0));
+			if(Objects.isNull(student)){
+				throw new BizException("学员信息异常");
+			}
+
+			List<VipGroupCategory> vipGroupCategories = vipGroupCategoryDao.findAllByOrgan(student.getOrganId().toString());
+			VipGroupCategory vipGroupCategory = vipGroupCategories.stream().filter(v -> v.getName().equals(vipGroupCategoryName)).findFirst().get();
+
+			List<VipGroupActivity> vipGroupActivities = vipGroupActivityDao.findByName(vipGroupActivityName);
+			VipGroupActivity vipGroupActivity = null;
+			if(!CollectionUtils.isEmpty(vipGroupActivities)){
+				vipGroupActivity = vipGroupActivities.get(0);
+			}
+
+			LocalDate courseStartDay = null;
+			LocalDate onlineCourseStartDay = null;
+			LocalDate offlineCourseStartDay = null;
+
+			if(onlineCourseNum>0){
+				onlineCourseStartDay = LocalDate.parse(courseData.getString("online_course_start_day").replace(" 00:00:00", ""), DateUtil.dateFormatter);
+				courseStartDay = onlineCourseStartDay;
+			}
+
+			if(offlineCourseNum>0){
+				offlineCourseStartDay = LocalDate.parse(courseData.getString("offline_course_start_day").replace(" 00:00:00", ""), DateUtil.dateFormatter);
+				if(Objects.isNull(courseStartDay)||onlineCourseStartDay.compareTo(offlineCourseStartDay)>0){
+					courseStartDay = offlineCourseStartDay;
+				}
+			}
+
+			Set<String> holidayDays = new HashSet<>();
+
+			if (skipHoliday) {
+				SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
+				if(Objects.nonNull(holidaySetting)&&StringUtils.isNotBlank(holidaySetting.getParanValue())){
+					holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
+				}
+			}
+
+			List<CourseSchedule> courseSchedules = new ArrayList<>();
+			int onlineCourseNumCreated = 0;
+			int offlineCourseNumCreated = 0;
+
+			while (true) {
+				if (skipHoliday && holidayDays.contains(courseStartDay.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))) {
+					courseStartDay = courseStartDay.plusDays(1);
+					continue;
+				}
+				int dayOfWeek = courseStartDay.getDayOfWeek().getValue();//当前星期
+
+				if (onlineCourseNumCreated<onlineCourseNum&&(onlineWeekNum < 1 || onlineWeekNum > 7)) {
+					throw new BizException("排课循环周期错误,请核查");
+				}
+				if(onlineCourseNumCreated<onlineCourseNum&&courseStartDay.compareTo(onlineCourseStartDay)>=0&&dayOfWeek==onlineWeekNum){
+					Date classDate = DateConvertor.toDate(courseStartDay);
+					String startClassTime = DateUtil.getDate(classDate) + " " + onlineCourseStartTime;
+					String endClassTime = DateUtil.dateToString(DateUtil.addMinutes(DateUtil.stringToDate(startClassTime, "yyyy-MM-dd HH:mm:ss"), courseMinute), "yyyy-MM-dd HH:mm:ss");
+
+					CourseSchedule courseSchedule = new CourseSchedule();
+					courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+					courseSchedule.setClassDate(classDate);
+					courseSchedule.setStartClassTime(DateUtil.stringToDate(startClassTime));
+					courseSchedule.setEndClassTime(DateUtil.stringToDate(endClassTime));
+					courseSchedule.setCreateTime(date);
+					courseSchedule.setUpdateTime(date);
+					courseSchedule.setTeachMode(TeachModeEnum.ONLINE);
+					courseSchedule.setType(CourseSchedule.CourseScheduleType.VIP);
+					courseSchedule.setGroupType(VIP);
+					courseSchedule.setOrganId(student.getOrganId());
+					courseSchedule.setTeacherId(teacherId);
+					courseSchedule.setActualTeacherId(teacherId);
+					courseSchedules.add(courseSchedule);
+
+					onlineCourseNumCreated++;
+				}
+
+				if (offlineCourseNumCreated<offlineCourseNum&&(offlineWeekNum < 1 || offlineWeekNum > 7)) {
+					throw new BizException("排课循环周期错误,请核查");
+				}
+				if(offlineCourseNumCreated<offlineCourseNum&&courseStartDay.compareTo(offlineCourseStartDay)>=0&&dayOfWeek==offlineWeekNum){
+					Date classDate = DateConvertor.toDate(courseStartDay);
+					String startClassTime = DateUtil.getDate(classDate) + " " + offlineCourseStartTime;
+					String endClassTime = DateUtil.dateToString(DateUtil.addMinutes(DateUtil.stringToDate(startClassTime, "yyyy-MM-dd HH:mm:ss"), courseMinute), "yyyy-MM-dd HH:mm:ss");
+
+					CourseSchedule courseSchedule = new CourseSchedule();
+					courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+					courseSchedule.setClassDate(classDate);
+					courseSchedule.setStartClassTime(DateUtil.stringToDate(startClassTime));
+					courseSchedule.setEndClassTime(DateUtil.stringToDate(endClassTime));
+					courseSchedule.setCreateTime(date);
+					courseSchedule.setUpdateTime(date);
+					courseSchedule.setSchoolId(schoolId);
+					courseSchedule.setTeachMode(TeachModeEnum.OFFLINE);
+					courseSchedule.setType(CourseSchedule.CourseScheduleType.VIP);
+					courseSchedule.setGroupType(VIP);
+					courseSchedule.setOrganId(student.getOrganId());
+					courseSchedule.setTeacherId(teacherId);
+					courseSchedule.setActualTeacherId(teacherId);
+					courseSchedules.add(courseSchedule);
+
+					offlineCourseNumCreated++;
+				}
+
+				if (courseSchedules.size()>=totalCourseNum) {
+					break;
+				}
+
+				courseStartDay = courseStartDay.plusDays(1);
+			}
+
+			VipGroupApplyDto vipGroupApplyDto = new VipGroupApplyDto();
+			VipGroupApplyBaseInfoDto vipGroupApplyBaseInfoDto = new VipGroupApplyBaseInfoDto();
+			vipGroupApplyBaseInfoDto.setStudentIdList(studentIdsStr);
+			
+			vipGroupApplyBaseInfoDto.setAllCourseNum(totalCourseNum);
+			vipGroupApplyBaseInfoDto.setTeacherId(teacherId.longValue());
+			vipGroupApplyBaseInfoDto.setEducationalTeacherId(eduTeacherId);
+			vipGroupApplyBaseInfoDto.setSubjectIdList(stu.getSubjectIdList());
+			vipGroupApplyBaseInfoDto.setFirstStudentId(studentIds.get(0));
+			vipGroupApplyBaseInfoDto.setUserId(teacherId);
+			vipGroupApplyBaseInfoDto.setSingleClassMinutes(courseMinute);
+			vipGroupApplyBaseInfoDto.setRegistrationStartTime(date);
+			vipGroupApplyBaseInfoDto.setPaymentExpireDate(date);
+			vipGroupApplyBaseInfoDto.setCourseStartDate(courseSchedules.get(0).getStartClassTime());
+			vipGroupApplyBaseInfoDto.setCoursesExpireDate(courseSchedules.get(courseSchedules.size()-1).getEndClassTime());
+			vipGroupApplyBaseInfoDto.setTeacherSchoolId(schoolId);
+			vipGroupApplyBaseInfoDto.setOnlineClassesNum(onlineCourseNum);
+			vipGroupApplyBaseInfoDto.setOfflineClassesNum(offlineCourseNum);
+			vipGroupApplyBaseInfoDto.setVipGroupCategoryId(vipGroupCategory.getId());
+			if(freeCourse){
+				vipGroupApplyBaseInfoDto.setActivityCourseType(ActivityCourseType.FREE_VIP);
+			}
+			if(Objects.nonNull(vipGroupActivity)){
+				vipGroupApplyBaseInfoDto.setVipGroupActivityId(vipGroupActivity.getId());
+			}
+			vipGroupApplyBaseInfoDto.setOrganId(student.getOrganId());
+			vipGroupApplyBaseInfoDto.setOnlineClassesUnitPrice(vipGroupCategory.getOnlineClassesUnitPrice());
+			vipGroupApplyBaseInfoDto.setOfflineClassesUnitPrice(vipGroupCategory.getOfflineClassesUnitPrice());
+			vipGroupApplyDto.setVipGroupApplyBaseInfo(vipGroupApplyBaseInfoDto);
+
+			vipGroupApplyDto.setCourseSchedules(courseSchedules);
+			createActivityVipGroup(vipGroupApplyDto);
+		}
+
+		return BaseController.succeed();
+	}
+
+	@Override
 	public List<Organization> getPublicOrgans(Integer eduTeacherId, Integer teacherId) {
 		if(Objects.isNull(eduTeacherId)){
 			throw new BizException("教务老师不存在");
@@ -1694,7 +2288,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			return;
 		}
 
-		if(studentPaymentOrder.getStatus().equals(DealStatusEnum.SUCCESS)){
+		if(!studentPaymentOrder.getStatus().equals(DealStatusEnum.ING)){
 			return;
 		}
 
@@ -1872,6 +2466,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		if(vipGroup.getStatus().equals(VipGroupStatusEnum.CANCEL)){
 			throw new BizException("不能对已停止的课程进行此操作");
 		}
+		if(vipGroup.getName().startsWith("考前辅导课")){
+			throw new BizException("当前课程类型不支持退学");
+		}
 
 		VipGroupCategory vipGroupCategory = vipGroupCategoryDao.get(vipGroup.getVipGroupCategoryId());
 

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

@@ -190,4 +190,8 @@
             #{id}
         </foreach>
     </select>
+
+    <select id="getCooperationOrganByEduTeacherId" resultMap="CooperationOrgan">
+        SELECT * FROM cooperation_organ WHERE education_user_id_ = #{userId} and is_enable_ =1 and del_flag_ =0
+    </select>
 </mapper>

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

@@ -532,6 +532,10 @@
 		</foreach>
 	</update>
 
+    <update id="updateEnableChangeSalaryByClassGroup">
+		UPDATE course_schedule_teacher_salary SET enable_change_salary_ = #{enableChangeSalary} WHERE class_group_id_=#{classGroupId}
+	</update>
+
     <select id="findCourseScheduleTeacherSalaryByMusicGroupId" resultMap="CourseScheduleTeacherSalary">
 		SELECT * FROM course_schedule_teacher_salary WHERE music_group_id_=#{musicGroupId} AND group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
 	</select>

+ 143 - 86
mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml

@@ -2,7 +2,6 @@
 <!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.MusicGroupDao">
-
     <resultMap type="com.ym.mec.biz.dal.entity.MusicGroup" id="MusicGroup">
         <result column="id_" property="id"/>
         <result column="name_" property="name"/>
@@ -41,7 +40,8 @@
         <result column="payment_valid_end_date_" property="paymentValidEndDate"/>
         <result column="payment_pattern_" property="paymentPattern"/>
         <result column="is_classroom_lessons_" property="isClassroomLessons"/>
-        <result column="course_view_type_" property="courseViewType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="course_view_type_" property="courseViewType"
+                typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -69,13 +69,16 @@
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.MusicGroup"
             useGeneratedKeys="true" keyColumn="id" keyProperty="id">
         INSERT INTO music_group
-        (id_, name_, organ_id_, school_id_, apply_expire_date_,pre_apply_expire_date_, team_teacher_id_, educational_teacher_id_,
-         charge_type_id_, course_form_, create_time_, update_time_, status_,
-         bill_start_date_, improvent_classes_num_, enroll_classes_, payment_expire_date_, is_extra_class_,
-         settlement_type_, cooperation_organ_id_, enlightenment_course_time_,
-         parent_meeting_time_, img_, director_user_id_, is_classroom_lessons_, memo_, expect_start_group_date_,
-         ownership_type_, repair_user_id_, del_flag_,payment_valid_start_date_,payment_valid_end_date_,payment_pattern_,course_view_type_,transaction_teacher_id_)
-        VALUES (#{id}, #{name}, #{organId}, #{schoolId}, #{applyExpireDate},#{preApplyExpireDate}, #{teamTeacherId}, #{educationalTeacherId},
+                (id_, name_, organ_id_, school_id_, apply_expire_date_, pre_apply_expire_date_, team_teacher_id_,
+                 educational_teacher_id_,
+                 charge_type_id_, course_form_, create_time_, update_time_, status_,
+                 bill_start_date_, improvent_classes_num_, enroll_classes_, payment_expire_date_, is_extra_class_,
+                 settlement_type_, cooperation_organ_id_, enlightenment_course_time_,
+                 parent_meeting_time_, img_, director_user_id_, is_classroom_lessons_, memo_, expect_start_group_date_,
+                 ownership_type_, repair_user_id_, del_flag_, payment_valid_start_date_, payment_valid_end_date_,
+                 payment_pattern_, course_view_type_, transaction_teacher_id_)
+        VALUES (#{id}, #{name}, #{organId}, #{schoolId}, #{applyExpireDate}, #{preApplyExpireDate}, #{teamTeacherId},
+                #{educationalTeacherId},
                 #{chargeTypeId}, #{courseForm}, now(), now(),
                 #{status, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{billStartDate},
                 #{improventClassesNum}, #{enrollClasses}, #{paymentExpireDate},
@@ -84,8 +87,8 @@
                 #{cooperationOrganId}, #{enlightenmentCourseTime}, #{parentMeetingTime}, #{img}, #{directorUserId},
                 #{isClassroomLessons}, #{memo}, #{expectStartGroupDate},
                 #{ownershipType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{repairUserId},
-                #{delFlag},#{paymentValidStartDate},#{paymentValidEndDate},#{paymentPattern},
-                #{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{transactionTeacherId})
+                #{delFlag}, #{paymentValidStartDate}, #{paymentValidEndDate}, #{paymentPattern},
+                #{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{transactionTeacherId})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -189,7 +192,9 @@
         WHERE id_ = #{id}
     </update>
     <update id="batchUpdateEdu">
-        UPDATE music_group SET educational_teacher_id_ = #{educationUserId} WHERE cooperation_organ_id_ = #{cooperationOrganId}
+        UPDATE music_group
+        SET educational_teacher_id_ = #{educationUserId}
+        WHERE cooperation_organ_id_ = #{cooperationOrganId}
     </update>
 
     <!-- 根据主键删除一条记录 -->
@@ -253,7 +258,8 @@
         <result column="music_group_id_" property="musicGroupId"/>
         <result column="vip_class_num_" property="vipClassNum"/>
         <result column="music_group_num_" property="musicGroupNum"/>
-        <result column="music_group_status_" property="musicGroupStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="music_group_status_" property="musicGroupStatus"
+                typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
 
     <select id="queryUserMusicGroups" resultMap="queryUserMusicGroupsMap">
@@ -264,12 +270,12 @@
              , mg.name_     music_group_name_
              , s.name_      subject_name_
              , s.id_        subject_id_
-             , mg.id_       music_group_id_,
-    		 mg.status_ music_group_status_
+             , mg.id_       music_group_id_
+             , mg.status_   music_group_status_
         FROM student_registration sr
-                 LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
-                 LEFT JOIN `subject` s ON sr.actual_subject_id_ = s.id_
-                 LEFT JOIN sys_user su ON su.id_ = sr.user_id_
+                     LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
+                     LEFT JOIN `subject` s ON sr.actual_subject_id_ = s.id_
+                     LEFT JOIN sys_user su ON su.id_ = sr.user_id_
         WHERE sr.user_id_ = #{userId}
           AND mg.status_ IN ('APPLY', 'PAY', 'PREPARE', 'PROGRESS')
           AND sr.music_group_status_ != 'QUIT'
@@ -279,8 +285,8 @@
     <select id="queryPersonalMusicGroups" resultMap="queryUserMusicGroupsMap">
         SELECT sr.name_ user_name_, mg.name_ music_group_name_, s.name_ subject_name_
         FROM student_registration sr
-                 LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
-                 LEFT JOIN `subject` s ON sr.actual_subject_id_ = s.id_
+                     LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
+                     LEFT JOIN `subject` s ON sr.actual_subject_id_ = s.id_
         WHERE sr.user_id_ = #{userId}
           AND sr.music_group_status_ != 'QUIT'
         ORDER BY mg.update_time_ DESC
@@ -290,14 +296,14 @@
     <select id="countUserMusicGroups" resultType="int">
         SELECT COUNT(mg.id_)
         FROM student_registration sr
-                 LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
+                     LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
         WHERE sr.user_id_ = #{userId}
           AND sr.music_group_status_ != 'QUIT'
     </select>
     <select id="countCourseByType" resultType="java.lang.Integer">
         SELECT SUM(cg.total_class_times_) - SUM(cg.current_class_times_)
         FROM class_group_student_mapper cgsm
-                 LEFT JOIN class_group cg ON cgsm.class_group_id_ = cg.id_
+                     LEFT JOIN class_group cg ON cgsm.class_group_id_ = cg.id_
         WHERE cgsm.user_id_ = #{userId}
           AND cg.type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
           AND cg.del_flag_ = 0
@@ -362,7 +368,7 @@
     <select id="countPayNum" resultType="java.util.Map" parameterType="list">
         SELECT cg.music_group_id_ `key`, COUNT(cgsm.id_) `value`
         FROM class_group cg
-                 LEFT JOIN class_group_student_mapper cgsm ON cg.id_ = cgsm.class_group_id_
+                     LEFT JOIN class_group_student_mapper cgsm ON cg.id_ = cgsm.class_group_id_
         WHERE FIND_IN_SET(cg.music_group_id_, #{musicGroupIds})
           AND cgsm.status_ != 'QUIT'
           AND cg.type_ != 'MIX'
@@ -412,7 +418,7 @@
     <select id="queryTeacherMap" resultType="java.util.Map">
         SELECT su.id_ 'key', su.phone_ 'value'
         FROM class_group_teacher_mapper cgtm
-                 LEFT JOIN sys_user su ON cgtm.user_id_ = su.id_
+                     LEFT JOIN sys_user su ON cgtm.user_id_ = su.id_
         WHERE cgtm.music_group_id_ = #{musicGroupId}
           AND su.phone_ IS NOT NULL
         GROUP BY su.id_
@@ -443,7 +449,7 @@
     <select id="findUserMusicGroup" resultMap="MusicGroup">
         SELECT mg.*
         FROM music_group mg
-                 LEFT JOIN student_registration sr on sr.music_group_id_ = mg.id_
+                     LEFT JOIN student_registration sr on sr.music_group_id_ = mg.id_
         WHERE sr.user_id_ = #{userId}
         ORDER BY sr.id_ ASC
         LIMIT 1
@@ -452,7 +458,7 @@
     <select id="findUserMusicGroups" resultMap="MusicGroup">
         SELECT mg.*
         FROM music_group mg
-                 LEFT JOIN student_registration sr on sr.music_group_id_ = mg.id_
+                     LEFT JOIN student_registration sr on sr.music_group_id_ = mg.id_
         WHERE sr.user_id_ = #{userId}
     </select>
 
@@ -476,8 +482,8 @@
     <select id="findUserSchool" resultMap="com.ym.mec.biz.dal.dao.SchoolDao.School">
         SELECT s.*
         FROM music_group mg
-                 LEFT JOIN student_registration sr on sr.music_group_id_ = mg.id_
-                 LEFT JOIN school s on mg.school_id_ = s.id_
+                     LEFT JOIN student_registration sr on sr.music_group_id_ = mg.id_
+                     LEFT JOIN school s on mg.school_id_ = s.id_
         WHERE sr.user_id_ = #{userId}
         ORDER BY sr.id_ DESC
         LIMIT 1
@@ -485,10 +491,10 @@
     <select id="findByClassId" resultMap="MusicGroup">
         SELECT mg.*
         FROM class_group cg
-                 LEFT JOIN music_group mg ON cg.music_group_id_ = mg.id_
+                     LEFT JOIN music_group mg ON cg.music_group_id_ = mg.id_
         WHERE cg.id_ = #{groupId}
           AND cg.group_type_ = 'MUSIC'
-          AND mg.status_ IN ('PROGRESS','PAUSE')
+          AND mg.status_ IN ('PROGRESS', 'PAUSE')
           AND cg.del_flag_ = 0
     </select>
     <select id="queryUserMusicNames" resultType="java.util.Map">
@@ -606,17 +612,20 @@
     </select>
 
     <select id="getTeacherMusicGroup" resultMap="MusicGroup">
-        SELECT mg.* FROM course_schedule cs
-        LEFT JOIN music_group mg ON mg.id_ = cs.music_group_id_
-        WHERE cs.actual_teacher_id_ = #{teacherId} AND cs.group_type_ = 'MUSIC' GROUP BY mg.id_
+        SELECT mg.*
+        FROM course_schedule cs
+                     LEFT JOIN music_group mg ON mg.id_ = cs.music_group_id_
+        WHERE cs.actual_teacher_id_ = #{teacherId}
+          AND cs.group_type_ = 'MUSIC'
+        GROUP BY mg.id_
     </select>
     <select id="queryUserMusicInfos" resultMap="queryUserMusicGroupsMap">
-        SELECT mg.name_ music_group_name_,mg.id_ music_group_id_
+        SELECT mg.name_ music_group_name_, mg.id_ music_group_id_
         FROM student_registration sr
-        LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
+                     LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
         WHERE sr.user_id_ = #{userId}
-        AND mg.status_ IN ('APPLY','PAY','PREPARE','PROGRESS')
-        AND sr.music_group_status_ != 'QUIT'
+          AND mg.status_ IN ('APPLY', 'PAY', 'PREPARE', 'PROGRESS')
+          AND sr.music_group_status_ != 'QUIT'
         GROUP BY mg.id_
         ORDER BY mg.create_time_ DESC
     </select>
@@ -632,25 +641,40 @@
         ORDER BY mg.create_time_ DESC
     </select>
     <select id="getFirstEduTeacherId" resultType="java.lang.Integer">
-        SELECT mg.educational_teacher_id_ FROM student_registration sr
-        LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
-        WHERE user_id_ = #{userId} AND mg.status_ != 'CANCELED' AND sr.music_group_status_ != 'QUIT' AND mg.educational_teacher_id_ IS NOT NULL LIMIT 1
+        SELECT mg.educational_teacher_id_
+        FROM student_registration sr
+                     LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
+        WHERE user_id_ = #{userId}
+          AND mg.status_ != 'CANCELED'
+          AND sr.music_group_status_ != 'QUIT'
+          AND mg.educational_teacher_id_ IS NOT NULL
+        LIMIT 1
     </select>
     <select id="getStuMusic" resultMap="MusicGroup">
-        SELECT mg.* FROM music_group mg
-        LEFT JOIN student_registration sr ON mg.id_ = sr.music_group_id_
-        WHERE mg.status_ != 'CANCELED' AND sr.music_group_status_ != 'QUIT' AND sr.user_id_ = #{studentId} LIMIT 1
+        SELECT mg.*
+        FROM music_group mg
+                     LEFT JOIN student_registration sr ON mg.id_ = sr.music_group_id_
+        WHERE mg.status_ != 'CANCELED'
+          AND sr.music_group_status_ != 'QUIT'
+          AND sr.user_id_ = #{studentId}
+        LIMIT 1
     </select>
     <select id="getStuEduMusic" resultMap="MusicGroup">
-        SELECT mg.* FROM music_group mg
-        LEFT JOIN student_registration sr ON mg.id_ = sr.music_group_id_
-        WHERE mg.status_ != 'CANCELED' AND sr.music_group_status_ != 'QUIT'
-        AND sr.user_id_ = #{studentId} AND mg.educational_teacher_id_ = #{educationalTeacherId} LIMIT 1
+        SELECT mg.*
+        FROM music_group mg
+                     LEFT JOIN student_registration sr ON mg.id_ = sr.music_group_id_
+        WHERE mg.status_ != 'CANCELED'
+          AND sr.music_group_status_ != 'QUIT'
+          AND sr.user_id_ = #{studentId}
+          AND mg.educational_teacher_id_ = #{educationalTeacherId}
+        LIMIT 1
     </select>
     <select id="findByClassGroupId" resultMap="MusicGroup">
-        SELECT mg.* FROM music_group mg
-		LEFT JOIN class_group cg ON cg.music_group_id_ = mg.id_
-		WHERE cg.id_ = #{classGroupId} LIMIT 1
+        SELECT mg.*
+        FROM music_group mg
+                     LEFT JOIN class_group cg ON cg.music_group_id_ = mg.id_
+        WHERE cg.id_ = #{classGroupId}
+        LIMIT 1
     </select>
     <select id="queryIdsByEduIdAndOrganIds" resultType="java.lang.String">
         SELECT DISTINCT id_ FROM music_group
@@ -665,8 +689,9 @@
         </where>
     </select>
     <select id="getMusicGroupSchool" resultMap="com.ym.mec.biz.dal.dao.SchoolDao.School">
-        SELECT s.* FROM music_group mg
-        LEFT JOIN school s ON s.id_=mg.school_id_
+        SELECT s.*
+        FROM music_group mg
+                     LEFT JOIN school s ON s.id_ = mg.school_id_
         WHERE mg.id_ = #{id}
     </select>
     <select id="getByEduTeacher" resultMap="MusicGroup">
@@ -678,21 +703,25 @@
     </select>
 
     <select id="getMusicGroupEduTeacher" resultMap="com.ym.mec.biz.dal.dao.TeacherDao.SysUser">
-        SELECT su.* FROM music_group mg
-        LEFT JOIN sys_user su ON su.id_ = mg.educational_teacher_id_
-        WHERE mg.organ_id_ = #{organId} AND status_ = 'PROGRESS' AND mg.educational_teacher_id_ >0
+        SELECT su.*
+        FROM music_group mg
+                     LEFT JOIN sys_user su ON su.id_ = mg.educational_teacher_id_
+        WHERE mg.organ_id_ = #{organId}
+          AND status_ = 'PROGRESS'
+          AND mg.educational_teacher_id_ > 0
         GROUP BY su.id_
     </select>
 
-    <select id="findUserMusicGroupCooperationOrgan" resultMap="com.ym.mec.biz.dal.dao.CooperationOrganDao.CooperationOrgan">
-        SELECT co.name_,su.real_name_ linkman_
+    <select id="findUserMusicGroupCooperationOrgan"
+            resultMap="com.ym.mec.biz.dal.dao.CooperationOrganDao.CooperationOrgan">
+        SELECT co.name_, su.real_name_ linkman_
         FROM music_group mg
-        LEFT JOIN student_registration sr ON sr.music_group_id_ = mg.id_
-        LEFT JOIN cooperation_organ co ON co.id_ = mg.cooperation_organ_id_
-        LEFT JOIN sys_user su ON su.id_ = mg.educational_teacher_id_
+                     LEFT JOIN student_registration sr ON sr.music_group_id_ = mg.id_
+                     LEFT JOIN cooperation_organ co ON co.id_ = mg.cooperation_organ_id_
+                     LEFT JOIN sys_user su ON su.id_ = mg.educational_teacher_id_
         WHERE sr.user_id_ = #{userId}
-        AND mg.status_ IN ('PREPARE','PROGRESS','PAUSE','CLOSE')
-        AND sr.payment_status_ = 2
+          AND mg.status_ IN ('PREPARE', 'PROGRESS', 'PAUSE', 'CLOSE')
+          AND sr.payment_status_ = 2
         ORDER BY sr.id_ DESC
         LIMIT 1
     </select>
@@ -706,36 +735,39 @@
 
     <select id="getNoClassStudentMusicGroupIds" resultType="java.lang.String">
         SELECT
-            DISTINCT sr.music_group_id_
+        DISTINCT sr.music_group_id_
         FROM
-            student_registration sr
-            LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
-            LEFT JOIN class_group_student_mapper cgsm ON cgsm.group_type_='MUSIC' AND cgsm.music_group_id_=sr.music_group_id_ AND cgsm.user_id_=sr.user_id_
+        student_registration sr
+        LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
+        LEFT JOIN class_group_student_mapper cgsm ON cgsm.group_type_='MUSIC' AND
+        cgsm.music_group_id_=sr.music_group_id_ AND cgsm.user_id_=sr.user_id_
         WHERE
-            sr.music_group_status_ = 'NORMAL'
-            AND mg.status_ = 'PROGRESS'
-            AND cgsm.id_ IS NULL
-            <if test="organIds!=null and organIds.size()>0">
-                AND mg.organ_id_ IN
-                <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
-                    #{organId}
-                </foreach>
-            </if>
+        sr.music_group_status_ = 'NORMAL'
+        AND mg.status_ = 'PROGRESS'
+        AND cgsm.id_ IS NULL
+        <if test="organIds!=null and organIds.size()>0">
+            AND mg.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
     </select>
 
     <select id="getCooperationMusicGroupNum" resultType="java.lang.Integer">
-        SELECT COUNT(*) FROM  music_group
-        WHERE cooperation_organ_id_ = #{cooperationOrganId} AND status_ IN ('PROGRESS','PAUSE','CLOSE')
-        AND id_ != #{musicGroupId}
+        SELECT COUNT(*)
+        FROM music_group
+        WHERE cooperation_organ_id_ = #{cooperationOrganId}
+          AND status_ IN ('PROGRESS', 'PAUSE', 'CLOSE')
+          AND id_ != #{musicGroupId}
     </select>
 
     <select id="findCooperationOrganEduTeacher" resultMap="com.ym.mec.biz.dal.dao.CooperationOrganDao.CooperationOrgan">
-        SELECT co.name_,su.real_name_ linkman_
+        SELECT co.name_, su.real_name_ linkman_
         FROM music_group mg
-        LEFT JOIN cooperation_organ co ON co.id_ = mg.cooperation_organ_id_
-        LEFT JOIN sys_user su ON su.id_ = mg.educational_teacher_id_
+                     LEFT JOIN cooperation_organ co ON co.id_ = mg.cooperation_organ_id_
+                     LEFT JOIN sys_user su ON su.id_ = mg.educational_teacher_id_
         WHERE co.id_ = #{id}
-        AND mg.status_ IN ('PREPARE','PROGRESS','PAUSE','CLOSE')
+          AND mg.status_ IN ('PREPARE', 'PROGRESS', 'PAUSE', 'CLOSE')
         ORDER BY mg.create_time_ DESC
         LIMIT 1
     </select>
@@ -750,19 +782,44 @@
         AND mg.educational_teacher_id_ IS NOT NULL
     </select>
     <select id="findByCooperationIdAndStatus" resultMap="MusicGroup">
-        SELECT * FROM music_group WHERE cooperation_organ_id_ = #{cooperationOrganId} AND status_ IN ('PROGRESS','PAUSE','PREPARE')
+        SELECT *
+        FROM music_group
+        WHERE cooperation_organ_id_ = #{cooperationOrganId}
+          AND status_ IN ('PROGRESS', 'PAUSE', 'PREPARE')
     </select>
     <select id="findByCooperationId" resultMap="MusicGroup">
-        SELECT * FROM music_group WHERE cooperation_organ_id_ = #{cooperationId} AND del_flag_ = 0
+        SELECT *
+        FROM music_group
+        WHERE cooperation_organ_id_ = #{cooperationId}
+          AND del_flag_ = 0
     </select>
 
     <select id="getStudentLastMusicGroup" resultMap="MusicGroup">
         SELECT mg.*
         FROM music_group mg
-        LEFT JOIN student_registration sr ON mg.id_ = sr.music_group_id_
+                     LEFT JOIN student_registration sr ON mg.id_ = sr.music_group_id_
         WHERE sr.user_id_ = #{userId}
-        AND mg.status_ IN ('PREPARE', 'PROGRESS', 'PAUSE', 'CLOSE')
+          AND mg.status_ IN ('PREPARE', 'PROGRESS', 'PAUSE', 'CLOSE')
         ORDER BY mg.create_time_ DESC
         LIMIT 1
     </select>
+
+    <select id="getMusicGroupByStatus" resultType="com.ym.mec.biz.dal.dto.MusicGroupRegAndMoneyDto">
+        SELECT mg.id_ musicGroupId,o.name_ organName,mg.name_ musicGroupName,mg.status_ musicGroupStatus FROM
+        music_group mg
+        LEFT JOIN organization o ON mg.organ_id_ = o.id_
+        WHERE status_ IN ('PRE_APPLY','PRE_BUILD_FEE','FEE_AUDIT','APPLY','PAY')
+        <if test="organId != null">
+            AND FIND_IN_SET(mg.organ_id_,#{organId})
+        </if>
+        <if test="cooperationOrganIds != null">
+            AND mg.cooperation_organ_id_ IN
+            <foreach collection="cooperationOrganIds" item="cooperationOrganId" open="(" close=")" separator=",">
+                #{cooperationOrganId}
+            </foreach>
+        </if>
+        <if test="musicGroupName != null">
+           AND mg.name_ LIKE CONCAT('%',#{musicGroupName},'%')
+        </if>
+    </select>
 </mapper>

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

@@ -143,7 +143,7 @@
         select * from school where del_flag_ != 1 and user_id_ = #{userId}
     </select>
     <select id="findVipSchoolByUserId" resultMap="School">
-        SELECT * FROM school WHERE del_flag_ != 1
+        SELECT * FROM school WHERE del_flag_ = 0
         <if test="organId != null">
         AND ((FIND_IN_SET(organ_id_,#{organId}) and user_id_ is NULL) or user_id_ = #{userId})
         </if>

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

@@ -225,6 +225,12 @@
             <if test="comeOnPackage != null">
                 AND s.come_on_package_ = #{comeOnPackage}
             </if>
+            <if test="subjectId!=null">
+                AND FIND_IN_SET( #{subjectId}, s.subject_id_list_ )
+            </if>
+            <if test="activityCourseType!=null and activityCourseType!=''">
+                AND JSON_EXTRACT(activity_course_detail_, CONCAT('$.', #{activityCourseType}))>0
+            </if>
         </where>
     </sql>
 

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

@@ -25,6 +25,7 @@
         <result column="member_rank_setting_id_" property="memberRankSettingId"/>
         <result column="membership_start_time_" property="membershipStartTime"/>
         <result column="membership_end_time_" property="membershipEndTime"/>
+        <result column="activity_course_detail_" property="activityCourseDetail"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -132,6 +133,9 @@
             <if test="membershipEndTime != null">
                 membership_end_time_=#{membershipEndTime},
             </if>
+            <if test="activityCourseDetail != null">
+                activity_course_detail_=#{activityCourseDetail},
+            </if>
                 cooperation_organ_id_=#{cooperationOrganId},
                 update_time_ = NOW()
         </set>
@@ -211,6 +215,9 @@
                 <if test="item.cooperationOrganId != null">
                     cooperation_organ_id_=#{item.cooperationOrganId},
                 </if>
+                <if test="item.activityCourseDetail != null">
+                    activity_course_detail_=#{item.activityCourseDetail},
+                </if>
 	            <if test="item.memberRankSettingId != null">
 	                member_rank_setting_id_=#{item.memberRankSettingId},
 	            </if>
@@ -663,6 +670,15 @@
             #{studentId}
         </foreach>
     </select>
+
+    <select id="lockStudents" resultMap="Student">
+        SELECT * FROM student WHERE user_id_ IN
+        <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+            #{studentId}
+        </foreach>
+        FOR UPDATE
+    </select>
+
     <select id="queryCloseServiceTagIds" resultType="java.lang.Integer">
         SELECT s.user_id_ FROM student s
         LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = s.user_id_

+ 8 - 0
mec-biz/src/main/resources/config/mybatis/StudentPreRegistrationMapper.xml

@@ -247,4 +247,12 @@
         FROM student_pre_registration
         WHERE music_group_id_ = #{musicGroupId}
     </select>
+
+    <select id="getPreRegisterNum" resultType="com.ym.mec.biz.dal.dto.MusicGroupRegAndMoneyDto">
+        SELECT music_group_id_ musicGroupId, COUNT(*) preRegNum FROM student_pre_registration WHERE music_group_id_ IN
+        <foreach collection="musicGroupIds" item="musicGroupId" open="(" close=")" separator=",">
+            #{musicGroupId}
+        </foreach>
+        GROUP BY music_group_id_
+    </select>
 </mapper>

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

@@ -1509,4 +1509,26 @@
         LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
         WHERE sr.music_group_id_ != #{musicGroupId} AND sr.music_group_status_ != 'QUIT' AND sr.user_id_ = #{userId} AND mg.course_view_type_ = 1
     </select>
+
+    <!-- 获取报名相关数据 -->
+    <select id="getRegisters" resultType="com.ym.mec.biz.dal.dto.MusicGroupRegAndMoneyDto">
+        SELECT music_group_id_ musicGroupId, COUNT(*) regNum,SUM(IF(payment_status_ = '2',1,0)) payNum,
+        SUM(IF(paying_status_='2',1,0)) checkNum,SUM(IF((music_group_status_= 'NORMAL' and has_cloud_teacher_=1),1,0)) buyCloudTeacherNum
+        FROM student_registration
+        WHERE music_group_id_ IN
+        <foreach collection="musicGroupIds" item="musicGroupId" open="(" close=")" separator=",">
+            #{musicGroupId}
+        </foreach>
+        AND music_group_status_ != 'QUIT'
+        GROUP BY music_group_id_
+    </select>
+
+    <select id="countPayAndCheckNum" resultType="int">
+        SELECT COUNT(*)
+        FROM student_registration
+        WHERE music_group_id_ = #{musicGroupId}
+          AND payment_status_ =2
+          AND paying_status_ = 2
+          AND music_group_status_ = 'NORMAL'
+    </select>
 </mapper>

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

@@ -939,9 +939,12 @@
         <include refid="queryPageNameSql"/>
     </select>
     <sql id="queryPageNameSql">
-        <if test="organId != null">
+        <if test="organId != null and includeFlowOrgan==null">
             AND FIND_IN_SET(t.organ_id_,#{organId})
         </if>
+        <if test="organId != null and includeFlowOrgan!=null and includeFlowOrgan">
+            AND (CONCAT(',',t.organ_id_,',',IFNULL(t.flow_organ_range_,''),',') REGEXP CONCAT(',(',replace(#{organId},',','|'),'),'))
+        </if>
         <if test="subjectIds != null">
             AND INTE_ARRAY(t.subject_id_,#{subjectIds})
         </if>
@@ -956,7 +959,7 @@
         </if>
     </sql>
     <select id="queryPageName" resultMap="Teacher">
-        SELECT su.id_,su.real_name_,su.avatar_,GROUP_CONCAT(s.name_) subject_name_ FROM teacher t
+        SELECT su.id_,su.real_name_,su.avatar_,t.subject_id_,t.organ_id_,GROUP_CONCAT(s.name_) subject_name_ FROM teacher t
         LEFT JOIN sys_user su ON t.id_ = su.id_
         LEFT JOIN subject s ON FIND_IN_SET(s.id_, t.subject_id_)
         WHERE su.del_flag_ != 1 AND su.lock_flag_!=1

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

@@ -269,4 +269,8 @@
 		</where>
 		GROUP BY vga.`id_`
 	</select>
+
+    <select id="findByName" resultMap="VipGroupActivity">
+		SELECT * FROM vip_group_activity vga WHERE vga.name_ = #{name}
+	</select>
 </mapper>

+ 9 - 0
mec-client-api/src/main/java/com/ym/mec/im/ImFeignService.java

@@ -15,6 +15,7 @@ import com.ym.mec.common.entity.ImResult;
 import com.ym.mec.common.entity.ImUserModel;
 import com.ym.mec.im.entity.GroupModel;
 import com.ym.mec.im.fallback.ImFeignServiceFallback;
+import org.springframework.web.bind.annotation.RequestParam;
 
 @FeignClient(name = "im-server", configuration = FeignConfiguration.class, fallback = ImFeignServiceFallback.class)
 public interface ImFeignService {
@@ -109,4 +110,12 @@ public interface ImFeignService {
 
 	@PostMapping(value = "group/send")
 	Object groupSend(@RequestBody ImGroupMessage imGroupMessage);
+
+	/**
+	 * 获取历史消息记录
+	 * @param date
+	 * @return
+	 */
+	@PostMapping(value = "history/get")
+	Object historyGet(@RequestParam("date") String date);
 }

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

@@ -75,9 +75,9 @@ public class ImFeignServiceFallback implements ImFeignService {
     public Object groupSend(ImGroupMessage imGroupMessage) {
         return null;
     }
-/*
+
     @Override
-    public Object privateSendCustom(ImGroupMessage groupMessage) {
+    public Object historyGet(String date) {
         return null;
-    }*/
+    }
 }

+ 4 - 0
mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java

@@ -192,6 +192,10 @@ public interface TaskRemoteService {
 	@GetMapping("task/checkCloudOrderStart")
 	void checkCloudOrderStart();
 
+	//同步即时通讯聊天记录
+	@GetMapping("task/syncImHistoryMessageTask")
+    void syncImHistoryMessageTask();
+
 	//历史异常数据记录
 	@GetMapping("task/indexErrDataRecordTask")
 	void indexErrDataRecord();

+ 5 - 0
mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java

@@ -238,6 +238,11 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 		logger.error("乐团云教练订单生效处理失败");
 	}
 
+    @Override
+    public void syncImHistoryMessageTask() {
+		logger.error("同步即时通讯聊天记录失败");
+    }
+
 	@Override
 	public void indexErrDataRecord() {
 		logger.error("历史异常数据记录失败");

+ 16 - 0
mec-common/audit-log/src/main/java/com/yonge/log/dal/dao/HistoryMessageDao.java

@@ -0,0 +1,16 @@
+package com.yonge.log.dal.dao;
+
+import com.yonge.log.dal.model.AuditLog;
+import com.yonge.log.dal.model.HistoryMessage;
+import com.yonge.mongodb.dao.BaseDaoWithMongo;
+import org.springframework.stereotype.Component;
+
+@Component
+public class HistoryMessageDao extends BaseDaoWithMongo<String, HistoryMessage> {
+
+	@Override
+	public Class<HistoryMessage> getClassEntity() {
+		return HistoryMessage.class;
+	}
+
+}

+ 164 - 0
mec-common/audit-log/src/main/java/com/yonge/log/dal/model/HistoryMessage.java

@@ -0,0 +1,164 @@
+package com.yonge.log.dal.model;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+@Document(collection = "im_history_message")
+public class HistoryMessage implements Serializable {
+    @Id
+    private String msgUID;
+
+    private String fromUserId;
+
+    private String targetId;
+
+    private Integer targetType;
+
+    private String GroupId;
+
+    private String classname;
+
+    private String dateTime;
+
+    private String source;
+
+    private String isDiscard;
+
+    private String isSensitiveWord;
+
+    private String isForbidden;
+
+    private String isNotForward;
+
+    private String groupUserIds;
+
+    private String content;
+
+    public String getFromUserId() {
+        return fromUserId;
+    }
+
+    public void setFromUserId(String fromUserId) {
+        this.fromUserId = fromUserId;
+    }
+
+    public String getTargetId() {
+        return targetId;
+    }
+
+    public void setTargetId(String targetId) {
+        this.targetId = targetId;
+    }
+
+    public Integer getTargetType() {
+        return targetType;
+    }
+
+    public void setTargetType(Integer targetType) {
+        this.targetType = targetType;
+    }
+
+    public String getGroupId() {
+        return GroupId;
+    }
+
+    public void setGroupId(String groupId) {
+        GroupId = groupId;
+    }
+
+    public String getClassname() {
+        return classname;
+    }
+
+    public void setClassname(String classname) {
+        this.classname = classname;
+    }
+
+    public String getDateTime() {
+        return dateTime;
+    }
+
+    public void setDateTime(String dateTime) {
+        this.dateTime = dateTime;
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source;
+    }
+
+    public String getIsDiscard() {
+        return isDiscard;
+    }
+
+    public void setIsDiscard(String isDiscard) {
+        this.isDiscard = isDiscard;
+    }
+
+    public String getIsSensitiveWord() {
+        return isSensitiveWord;
+    }
+
+    public void setIsSensitiveWord(String isSensitiveWord) {
+        this.isSensitiveWord = isSensitiveWord;
+    }
+
+    public String getIsForbidden() {
+        return isForbidden;
+    }
+
+    public void setIsForbidden(String isForbidden) {
+        this.isForbidden = isForbidden;
+    }
+
+    public String getIsNotForward() {
+        return isNotForward;
+    }
+
+    public void setIsNotForward(String isNotForward) {
+        this.isNotForward = isNotForward;
+    }
+
+    public String getMsgUID() {
+        return msgUID;
+    }
+
+    public void setMsgUID(String msgUID) {
+        this.msgUID = msgUID;
+    }
+
+    public String getGroupUserIds() {
+        return groupUserIds;
+    }
+
+    public void setGroupUserIds(String groupUserIds) {
+        this.groupUserIds = groupUserIds;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        HistoryMessage that = (HistoryMessage) o;
+        return msgUID.equals(that.msgUID);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(msgUID);
+    }
+}

+ 16 - 0
mec-common/audit-log/src/main/java/com/yonge/log/service/HistoryMessageService.java

@@ -0,0 +1,16 @@
+package com.yonge.log.service;
+
+import com.yonge.log.dal.model.HistoryMessage;
+import com.yonge.mongodb.service.BaseServiceWithMongo;
+
+import java.io.File;
+
+public interface HistoryMessageService extends BaseServiceWithMongo<String, HistoryMessage> {
+
+    /**
+     * 保存融云历史聊天记录
+     * @param file
+     * @throws Exception
+     */
+    void saveImHistoryMessage(File file) throws Exception;
+}

+ 159 - 0
mec-common/audit-log/src/main/java/com/yonge/log/service/impl/HistoryMessageServiceImpl.java

@@ -0,0 +1,159 @@
+package com.yonge.log.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.yonge.log.dal.dao.HistoryMessageDao;
+import com.yonge.log.dal.model.HistoryMessage;
+import com.yonge.log.service.HistoryMessageService;
+import com.yonge.mongodb.dao.BaseDaoWithMongo;
+import com.yonge.mongodb.service.impl.BaseServiceImplWithMongo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
+
+@Service
+public class HistoryMessageServiceImpl extends BaseServiceImplWithMongo<String, HistoryMessage> implements HistoryMessageService {
+
+	@Autowired
+	private HistoryMessageDao historyMessageDao;
+
+	@Override
+	public BaseDaoWithMongo<String, HistoryMessage> getDAO() {
+		return historyMessageDao;
+	}
+
+	@Override
+	public void saveImHistoryMessage(File file) throws Exception {
+//		long length = file.length();
+//		if(length > 1048576){
+			doNioReadFile(file);
+//		}else {
+//			doBufferReadFile(file);
+//		}
+	}
+
+//	public static void main(String[] args) throws Exception {
+//		doNioReadFile1(new File("/Users/chenxiaoyu/Documents/77fe9ce6-7d91-4568-afe3-9e8ac351e87f.zip"));
+//	}
+
+	public void doNioReadFile(File file) {
+		ZipInputStream zin = null;
+		try {
+			zin = new ZipInputStream(new FileInputStream(file), StandardCharsets.UTF_8);
+			ZipFile zf = new ZipFile(file);
+			ZipEntry ze;
+			Set<HistoryMessage> historyMessages = new HashSet<>();
+			while ((ze = zin.getNextEntry()) != null) {
+				BufferedReader br = new BufferedReader(new InputStreamReader(zf.getInputStream(ze)));
+				String line;
+				while ((line = br.readLine()) != null) {
+					try {
+						historyMessages.add(JSONObject.parseObject(line.substring(line.indexOf("{")), HistoryMessage.class));
+//						if(historyMessages.size() >= 2000){
+//							historyMessageDao.batchInsert(new ArrayList<>(historyMessages),HistoryMessage.class);
+//							historyMessages.clear();
+//						}
+					}catch (Exception e){
+						e.printStackTrace();
+					}
+				}
+				br.close();
+				break;
+			}
+			if(historyMessages.size() > 0){
+				historyMessageDao.batchInsert(historyMessages.stream().sorted(Comparator.comparing(HistoryMessage::getDateTime)).collect(Collectors.toList()),HistoryMessage.class);
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			if (zin != null) {
+				try {
+					zin.closeEntry();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+
+//	public void doBufferReadFile(File file) throws Exception
+//	{
+//		BufferedReader reader = null;
+//		try {
+//
+////			InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "GBK");
+//			reader = new BufferedReader(new FileReader(file));
+//			String line = null;
+//			int num = 0;
+//			List<HistoryMessage> historyMessages = new ArrayList<>();
+//			while ((line = reader.readLine()) != null){
+//				try {
+//					historyMessages.add(JSONObject.parseObject(line.substring(line.indexOf("{")), HistoryMessage.class));
+//					if(historyMessages.size() >= 2000){
+//						historyMessageDao.batchInsert(historyMessages,HistoryMessage.class);
+//						historyMessages.clear();
+//					}
+//				}catch (Exception e){
+//					e.printStackTrace();
+//				}
+//				num++;
+//			}
+//			if(historyMessages.size() > 0){
+//				historyMessageDao.batchInsert(historyMessages,HistoryMessage.class);
+//			}
+//		} finally {
+//			reader.close();
+//		}
+//	}
+
+
+//	public static void doNioReadFile(File file) throws Exception
+//	{
+//		String enterStr = "\n";
+//
+//		FileChannel inChannel = new FileInputStream(file).getChannel();
+//		ByteBuffer buffer = ByteBuffer.allocate(1048576);
+//
+//		StringBuilder newlinesBui = new StringBuilder();
+//		while (inChannel.read(buffer) != -1)
+//		{
+//			buffer.flip();
+//			//数据组合.
+//			String content = new String(buffer.array());
+//			newlinesBui.append(content).toString();
+//
+//			int fromIndex = 0;
+//			int endIndex = -1;
+//			//循环找到 \n
+//			List<HistoryMessage> historyMessages = new ArrayList<>();
+//			while ((endIndex = newlinesBui.indexOf(enterStr, fromIndex)) > -1)
+//			{
+//				//得到一行
+//				String line = newlinesBui.substring(fromIndex, endIndex);
+//				try {
+//					historyMessages.add(JSONObject.parseObject(line.substring(line.indexOf("{")), HistoryMessage.class));
+//					if(historyMessages.size() >= 2000){
+////						historyMessageDao.batchInsert(historyMessages,HistoryMessage.class);
+//						historyMessages.clear();
+//					}
+//				}catch (Exception e){
+//					e.printStackTrace();
+//				}
+//				fromIndex = endIndex + 1;
+//			}
+//			if(historyMessages.size() > 0){
+////				historyMessageDao.batchInsert(historyMessages,HistoryMessage.class);
+//			}
+//			newlinesBui.delete(0, fromIndex);
+//			buffer.clear();
+//		}
+//	}
+}

+ 10 - 0
mec-common/mongo-db/src/main/java/com/yonge/mongodb/dao/BaseDaoWithMongo.java

@@ -3,6 +3,7 @@ package com.yonge.mongodb.dao;
 import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -75,6 +76,15 @@ public abstract class BaseDaoWithMongo<PK, T extends Serializable> {
 	}
 
 	/**
+	 * 写入实体对象
+	 * @param batchBean
+	 * @param clazz
+	 */
+	public void batchInsert(List<T> batchBean, Class clazz) {
+		mongoTemplate.insert(batchBean,clazz);
+	}
+
+	/**
 	 * 通过参数查找所有结果集
 	 * @param params
 	 * @return

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

@@ -12,6 +12,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
     public void configure(HttpSecurity http) throws Exception {
         http.authorizeRequests().antMatchers("/v2/api-docs","/user/register",
                 "/group/join","/group/create","/group/quit","/room/leave","/room/statusSync",
-                "/room/statusImMsg","/group/batchDismiss","/private/send","/group/send","/group/dismiss","/room/statusImMsg").permitAll().anyRequest().authenticated().and().csrf().disable();
+                "/room/statusImMsg","/group/batchDismiss","/private/send","/group/send",
+                "/group/dismiss","/room/statusImMsg","/history/get").permitAll().anyRequest().authenticated().and().csrf().disable();
     }
 }

+ 2 - 6
mec-im/src/main/java/com/ym/controller/HistoryController.java

@@ -2,14 +2,10 @@ package com.ym.controller;
 
 import com.ym.service.MessageService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
-/**
- * Created by weiqinxiao on 2019/2/25.
- */
 @RestController
 @RequestMapping("/history")
 public class HistoryController{
@@ -18,12 +14,12 @@ public class HistoryController{
     MessageService messageService;
 
     @RequestMapping(value = "/get", method = RequestMethod.POST)
-    public Object get(@RequestBody String date) throws Exception {
+    public Object get(String date) throws Exception {
         return messageService.historyGet(date);
     }
 
     @RequestMapping(value = "/remove", method = RequestMethod.POST)
-    public Object remove(@RequestBody String date) throws Exception {
+    public Object remove(String date) throws Exception {
         return messageService.historyRemove(date);
     }
 }

+ 4 - 1
mec-im/src/main/java/com/ym/service/Impl/MessageServiceImpl.java

@@ -47,7 +47,10 @@ public class MessageServiceImpl implements MessageService {
         return msgSystem;
     }
     private History getHistory(){
-        return new History(appKey,appSecret);
+        RongCloud rongCloud = RongCloud.getInstance(appKey, appSecret);
+        History history = new History(appKey, appSecret);
+        history.setRongCloud(rongCloud);
+        return history;
     }
     private Push getPush(){
         return new Push(appKey,appSecret);

+ 16 - 0
mec-im/src/main/resources/bootstrap-dev_server.properties

@@ -0,0 +1,16 @@
+#\u6307\u5b9a\u5f00\u53d1\u73af\u5883
+#spring.profiles.active=dev
+#\u670d\u52a1\u5668\u5730\u5740
+spring.cloud.nacos.config.server-addr=47.114.1.200:8848
+#\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
+spring.cloud.nacos.config.namespace=fd352683-69df-439a-802f-c44f0c21329c
+#\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
+spring.cloud.nacos.config.group=DEFAULT_GROUP
+#\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}
+spring.cloud.nacos.config.prefix=im
+#\u6307\u5b9a\u6587\u4ef6\u540e\u7f00
+spring.cloud.nacos.config.file-extension=yaml
+#\u662f\u5426\u52a8\u6001\u5237\u65b0
+spring.cloud.nacos.config.refresh.enabled=true
+#\u662f\u5426\u542f\u7528nacos\u914d\u7f6e\u4e2d\u5fc3
+spring.cloud.nacos.config.enabled=true

+ 23 - 45
mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java

@@ -44,51 +44,13 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.ChildrenDayDegreeDetailDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleEvaluateDao;
-import com.ym.mec.biz.dal.dao.DegreeRegistrationDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderCourseSettingsDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
-import com.ym.mec.biz.dal.dao.OrganizationDao;
-import com.ym.mec.biz.dal.dao.ReplacementInstrumentActivityDao;
-import com.ym.mec.biz.dal.dao.StudentGoodsSellDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentRouteOrderDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.dto.LuckStatisDto;
-import com.ym.mec.biz.dal.dto.OrderStatisDto;
-import com.ym.mec.biz.dal.dto.Practice4OrganDto;
-import com.ym.mec.biz.dal.dto.PracticeGroupStatisDto;
-import com.ym.mec.biz.dal.dto.PracticeGroupsDto;
-import com.ym.mec.biz.dal.dto.StudentPaymentOrderDto;
-import com.ym.mec.biz.dal.dto.StudentPaymentOrderExportDto;
-import com.ym.mec.biz.dal.dto.VipBuyResultDto;
-import com.ym.mec.biz.dal.entity.DegreeRegistration;
-import com.ym.mec.biz.dal.entity.Goods;
-import com.ym.mec.biz.dal.entity.LuckDrawCount;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
-import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
-import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
-import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.OrderTypeEnum;
-import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
-import com.ym.mec.biz.service.CloudTeacherOrderService;
-import com.ym.mec.biz.service.LuckDrawCountService;
-import com.ym.mec.biz.service.MemberRankPrivilegesService;
-import com.ym.mec.biz.service.MusicGroupService;
-import com.ym.mec.biz.service.SporadicChargeInfoService;
-import com.ym.mec.biz.service.StudentPaymentOrderDetailService;
-import com.ym.mec.biz.service.StudentPaymentOrderService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.TenantPaymentOrderService;
-import com.ym.mec.biz.service.VipGroupService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
@@ -145,9 +107,11 @@ public class StudentOrderController extends BaseController {
     private ReplacementInstrumentActivityDao replacementInstrumentActivityDao;
     @Autowired
     private ChildrenDayDegreeDetailDao childrenDayDegreeDetailDao;
-    
+
     @Autowired
     private CloudTeacherOrderService cloudTeacherOrderService;
+    @Autowired
+    private StudentRegistrationDao studentRegistrationDao;
 
 	@Autowired
 	private MemberRankPrivilegesService memberRankPrivilegesService;
@@ -155,7 +119,7 @@ public class StudentOrderController extends BaseController {
 
     @Value("${spring.profiles.active:dev}")
     private String profiles;
-    
+
     @ApiOperation(value = "查询订单列表")
     @GetMapping("/queryPage")
     public Object findGroupUsers(StudentPaymentOrderQueryInfo queryInfo) {
@@ -212,6 +176,13 @@ public class StudentOrderController extends BaseController {
         HashMap<String, Object> orderDetail = new HashMap<>();
         orderDetail.put("order", orderByOrderNo);
         orderDetail.put("groupType", orderByOrderNo.getGroupType());
+        if(OrderTypeEnum.APPLY.equals(orderByOrderNo.getType())){
+            StudentRegistration studentRegistration = studentRegistrationDao.getStudentRegister(orderByOrderNo.getMusicGroupId(),orderByOrderNo.getUserId());
+            if(studentRegistration.getPayingStatus().equals(2)) {
+                orderDetail.put("payingStatus",studentRegistration.getPayingStatus());
+            }
+        }
+
         if (orderByOrderNo.getGroupType().equals(GroupType.MUSIC)) {
             MusicGroup musicGroup = musicGroupService.get(orderByOrderNo.getMusicGroupId());
             List<Goods> goodsList = studentPaymentOrderDetailService.findApplyOrderGoods(orderByOrderNo.getId());
@@ -233,7 +204,7 @@ public class StudentOrderController extends BaseController {
                 musicGroupRegCalender.setMusicGroupPaymentCalenderCourseSettingsList(courseSettings);
             }
             orderDetail.put("calender", musicGroupRegCalender);
-            
+
             //判断是否是系统收费
             if(musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE){
             	 orderDetail.put("member", cloudTeacherOrderService.queryOrderInfoByOrderId(orderByOrderNo.getId()));
@@ -878,5 +849,12 @@ public class StudentOrderController extends BaseController {
         return succeed(musicGroupRegCalender);
     }
 
+    @GetMapping("confirmTeacherOrder")
+    public Object confirmOrder(String orderNo){
+        TenantPaymentOrder tenantPaymentOrder = tenantPaymentOrderService.queryByOrderNo(orderNo);
+        tenantPaymentOrderService.confirmOrder(tenantPaymentOrder);
+        return succeed();
+    }
+
 
 }

+ 16 - 0
mec-student/src/main/resources/bootstrap-dev_server.properties

@@ -0,0 +1,16 @@
+#\u6307\u5b9a\u5f00\u53d1\u73af\u5883
+#spring.profiles.active=dev
+#\u670d\u52a1\u5668\u5730\u5740
+spring.cloud.nacos.config.server-addr=47.114.1.200:8848
+#\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
+spring.cloud.nacos.config.namespace=fd352683-69df-439a-802f-c44f0c21329c
+#\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
+spring.cloud.nacos.config.group=DEFAULT_GROUP
+#\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}
+spring.cloud.nacos.config.prefix=student
+#\u6307\u5b9a\u6587\u4ef6\u540e\u7f00
+spring.cloud.nacos.config.file-extension=yaml
+#\u662f\u5426\u52a8\u6001\u5237\u65b0
+spring.cloud.nacos.config.refresh.enabled=true
+#\u662f\u5426\u542f\u7528nacos\u914d\u7f6e\u4e2d\u5fc3
+spring.cloud.nacos.config.enabled=true

+ 19 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/SyncImHistoryMessageTask.java

@@ -0,0 +1,19 @@
+package com.ym.mec.task.jobs;
+
+import com.ym.mec.task.TaskRemoteService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SyncImHistoryMessageTask extends BaseTask {
+
+	@Autowired
+	private TaskRemoteService taskRemoteService;
+
+	@Override
+	public void execute() throws TaskException {
+		taskRemoteService.syncImHistoryMessageTask();
+	}
+}

+ 16 - 0
mec-teacher/src/main/resources/bootstrap-dev_server.properties

@@ -0,0 +1,16 @@
+#\u6307\u5b9a\u5f00\u53d1\u73af\u5883
+#spring.profiles.active=dev
+#\u670d\u52a1\u5668\u5730\u5740
+spring.cloud.nacos.config.server-addr=47.114.1.200:8848
+#\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
+spring.cloud.nacos.config.namespace=fd352683-69df-439a-802f-c44f0c21329c
+#\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
+spring.cloud.nacos.config.group=DEFAULT_GROUP
+#\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}
+spring.cloud.nacos.config.prefix=teacher
+#\u6307\u5b9a\u6587\u4ef6\u540e\u7f00
+spring.cloud.nacos.config.file-extension=yaml
+#\u662f\u5426\u52a8\u6001\u5237\u65b0
+spring.cloud.nacos.config.refresh.enabled=true
+#\u662f\u5426\u542f\u7528nacos\u914d\u7f6e\u4e2d\u5fc3
+spring.cloud.nacos.config.enabled=true

+ 3 - 1
mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java

@@ -19,7 +19,9 @@ import java.util.*;
  */
 public class DateUtil {
 
-	private static final String CHINESE_DATA_FORMAT = "yyyy年MM月dd日 HH:mm:ss";
+	public static final String CHINESE_DATA_FORMAT = "yyyy年MM月dd日 HH:mm:ss";
+
+	public static final String YEAR_MONTH_DAY_HOUR = "yyyyMMddHH";
 
 	public static final String DEFAULT_PATTERN = "yyyy-MM-dd";
 

+ 34 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ImHistoryMessageController.java

@@ -0,0 +1,34 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.biz.service.UploadFileService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.UploadReturnBean;
+import com.yonge.log.service.HistoryMessageService;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.File;
+
+@RequestMapping("imHistoryMessage")
+@Api(tags = "系统操作日志")
+@RestController
+public class ImHistoryMessageController extends BaseController {
+
+	@Autowired
+	private HistoryMessageService historyMessageService;
+	@Autowired
+	private UploadFileService uploadFileService;
+
+
+	@GetMapping("/save")
+	public Object saveImHistoryMessage(String fileDir) throws Exception {
+		File file = new File(fileDir);
+		UploadReturnBean uploadReturnBean = uploadFileService.uploadImHistoryMsgFile(file);
+		historyMessageService.saveImHistoryMessage(file);
+		return succeed();
+	}
+
+}

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

@@ -6,6 +6,7 @@ import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
+import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.EmployeeService;
 
@@ -396,8 +397,8 @@ public class StudentRegistrationController extends BaseController {
         OutputStream outputStream = response.getOutputStream();
         HSSFWorkbook workbook = null;
         try {
-            String[] header = {"学员编号", "学员姓名", "声部", "预报名时间", "预报名时间差","预报名排名", "缴费时间", "缴费时间差","缴费排名"};
-            String[] body = {"userId", "studentName", "actualSubjectName", "perRegisterTime", "perRegIntervalStr","perRegSort", "payTime", "payIntervalStr","paySort"};
+            String[] header = {"学员编号", "学员姓名", "声部", "预报名时间", "预报名时间差", "预报名排名", "缴费时间", "缴费时间差", "缴费排名"};
+            String[] body = {"userId", "studentName", "actualSubjectName", "perRegisterTime", "perRegIntervalStr", "perRegSort", "payTime", "payIntervalStr", "paySort"};
             workbook = POIUtil.exportExcel(header, body, registerOrPreList.getRows());
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=registerOrPer-" + DateUtil.getDate(new Date()) + ".xls");
@@ -425,6 +426,12 @@ public class StudentRegistrationController extends BaseController {
     @GetMapping("/setNoneCloudTeacher")
     @PreAuthorize("@pcs.hasPermissions('studentRegistration/setNoneCloudTeacher')")
     public HttpResponseResult<Boolean> setNoneCloudTeacher(Long id) {
-        return succeed(studentRegistrationService.setNoneCloudTeacher(id));
+        StudentRegistration studentRegistration = studentRegistrationService.get(id);
+        //已付费的增加,已缴费人数、和0元付费人数
+        if (studentRegistration.getPaymentStatus().equals(PaymentStatusEnum.YES)) {
+            return succeed(studentRegistrationService.addPaidNum(id));
+        } else {
+            return succeed(studentRegistrationService.setNoneCloudTeacher(id));
+        }
     }
 }

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

@@ -3,20 +3,30 @@ package com.ym.mec.web.controller;
 import com.ym.mec.biz.dal.dao.MusicGroupSchoolTermCourseDetailDao;
 import com.ym.mec.biz.dal.entity.MusicGroupSchoolTermCourseDetail;
 import com.ym.mec.biz.dal.entity.MusicGroupSchoolTermStudentCourseDetail;
+import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.enums.IndexDataType;
 import com.ym.mec.biz.event.source.CourseEventSource;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.entity.UploadReturnBean;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.redis.service.RedisCache;
 import io.swagger.annotations.ApiOperation;
+import com.ym.mec.im.ImFeignService;
+import com.ym.mec.util.date.DateUtil;
+import com.yonge.log.service.HistoryMessageService;
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.io.File;
+import java.net.URL;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 @RequestMapping("task")
@@ -105,6 +115,39 @@ public class TaskController extends BaseController {
 
 	@Autowired
 	private CloudTeacherOrderService cloudTeacherOrderService;
+	@Autowired
+	private HistoryMessageService historyMessageService;
+	@Autowired
+	private UploadFileService uploadFileService;
+	@Autowired
+	private ImFeignService imFeignService;
+
+	@GetMapping(value = "/syncImHistoryMessageTask")
+	// 同步即时通讯聊天记录
+	public void syncImHistoryMessageTask(String date) throws Exception {
+//		date = "2021060710";
+		if(date == null){
+			date = DateUtil.format(DateUtil.addHours(new Date(),-2), DateUtil.YEAR_MONTH_DAY_HOUR);
+		}
+		Object o = imFeignService.historyGet(date);
+		JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(o));
+		if(jsonObject.get("code").equals(200)){
+			Boolean success = redisCache.getRedisTemplate().opsForValue().setIfAbsent("syncImHistoryMessage" + date,date);
+			if(!success){
+				return;
+			}
+			String url = jsonObject.getString("url");
+			if(StringUtils.isEmpty(url)){
+				return;
+			}
+			File file = new File(FileUtils.getTempDirectoryPath() + url.substring(url.lastIndexOf("/")));
+//			File file = new File("/Users/chenxiaoyu/Documents/" + url.substring(url.lastIndexOf("/")));
+			URL url1 = new URL(url);
+			FileUtils.copyURLToFile(url1,file);
+			UploadReturnBean uploadReturnBean = uploadFileService.uploadImHistoryMsgFile(file);
+			historyMessageService.saveImHistoryMessage(new File(file.getAbsolutePath()));
+		}
+	}
 
 	@Autowired
 	private IndexErrDataRecordService indexErrDataRecordService;

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

@@ -155,17 +155,17 @@ public class TeacherController 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(teacherService.queryPageName(queryInfo));
     }
 

+ 117 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduRegisterController.java

@@ -0,0 +1,117 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.auth.api.entity.SysUserRole;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.MusicGroupRegAndMoneyDto;
+import com.ym.mec.biz.dal.dto.MusicalListDetailDto;
+import com.ym.mec.biz.dal.entity.CooperationOrgan;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
+import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.biz.service.StudentPaymentOrderDetailService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RequestMapping("eduRegister")
+@Api(tags = "乐团报名回款统计(教务端)")
+@RestController
+public class EduRegisterController extends BaseController {
+
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private StudentPreRegistrationDao studentPreRegistrationDao;
+    @Autowired
+    private StudentRegistrationDao studentRegistrationDao;
+    @Autowired
+    private StudentPaymentOrderDetailService studentPaymentOrderDetailService;
+    @Autowired
+    private EmployeeDao employeeDao;
+    @Autowired
+    private CooperationOrganDao cooperationOrganDao;
+
+    @ApiOperation(value = "获取分部报名、回款统计")
+    @GetMapping("/getRegAndMoney")
+    public HttpResponseResult<List<MusicGroupRegAndMoneyDto>> getRegAndMoney(String organId, String musicGroupName) {
+        String organIds = null;
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        if (StringUtils.isEmpty(organId)) {
+            organIds = employee.getOrganIdList();
+        } else if (StringUtils.isEmpty(employee.getOrganIdList())) {
+            return failed("用户所在分部异常");
+        } else {
+            List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+            if (!list.containsAll(Arrays.asList(organId.split(",")))) {
+                return failed("非法请求");
+            }
+            organIds = organId;
+        }
+        //是乐团主管,不是分部经理
+        List<Integer> cooperationOrganIds = null;
+        List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
+        if (!sysUser.getIsSuperAdmin() && !userRole.contains(SysUserRole.ADMINISTRATOR) && !userRole.contains(SysUserRole.SECTION_MANAGER)) {
+            List<CooperationOrgan> cooperationOrgans = cooperationOrganDao.getCooperationOrganByEduTeacherId(sysUser.getId());
+            if (cooperationOrgans.size() > 0) {
+                cooperationOrganIds = cooperationOrgans.stream().map(CooperationOrgan::getId).collect(Collectors.toList());
+            }else {
+                return succeed();
+            }
+        }
+
+        List<MusicGroupRegAndMoneyDto> musicGroups = musicGroupDao.getMusicGroupByStatus(organIds, cooperationOrganIds, musicGroupName);
+        if (musicGroups.size() <= 0) {
+            return succeed();
+        }
+        List<String> musicGroupIds = musicGroups.stream().map(MusicGroupRegAndMoneyDto::getMusicGroupId).collect(Collectors.toList());
+
+        //预报名人数
+        List<MusicGroupRegAndMoneyDto> preRegisters = studentPreRegistrationDao.getPreRegisterNum(musicGroupIds);
+        List<MusicGroupRegAndMoneyDto> registers = studentRegistrationDao.getRegisters(musicGroupIds);
+
+        for (MusicGroupRegAndMoneyDto musicGroup : musicGroups) {
+            List<MusicalListDetailDto> musicalList = studentPaymentOrderDetailService.getMusicalListDetail(musicGroup.getMusicGroupId(), null);
+            if (musicalList != null && musicalList.size() > 0) {
+                Long instrumentNum = musicalList.stream().filter(e -> KitGroupPurchaseTypeEnum.GROUP.equals(e.getKitGroupPurchaseTypeEnum())).count();
+                BigDecimal money = musicalList.stream().filter(e -> e.getOrderAmount() != null).map(MusicalListDetailDto::getOrderAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+                musicGroup.setBuyInstrumentNum(instrumentNum.intValue());
+                musicGroup.setMoney(money == null ? BigDecimal.ZERO : money);
+            }
+
+            for (MusicGroupRegAndMoneyDto preRegister : preRegisters) {
+                if (!musicGroup.getMusicGroupId().equals(preRegister.getMusicGroupId())) continue;
+                musicGroup.setPreRegNum(preRegister.getPreRegNum());
+            }
+            for (MusicGroupRegAndMoneyDto register : registers) {
+                if (!musicGroup.getMusicGroupId().equals(register.getMusicGroupId())) continue;
+                musicGroup.setRegNum(register.getRegNum());
+                musicGroup.setPayNum(register.getPayNum());
+                musicGroup.setCheckNum(register.getCheckNum());
+                musicGroup.setBuyCloudTeacherNum(register.getBuyCloudTeacherNum());
+            }
+        }
+        return succeed(musicGroups);
+    }
+}

+ 52 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduSchoolController.java

@@ -0,0 +1,52 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.School;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.page.SchoolQueryInfo;
+import com.ym.mec.biz.service.SchoolService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+@RequestMapping("eduSchool")
+@Api(tags = "学校(教学点)服务")
+@RestController
+public class EduSchoolController extends BaseController {
+
+    @Autowired
+    private SchoolService schoolService;
+    @Autowired
+    private TeacherDao teacherDao;
+
+    @ApiOperation(value = "获取教师vip课教学点")
+    @GetMapping("/findVipSchoolByTeacher")
+    public Object findVipSchoolByTeacher(@ApiParam(value = "教师编号", required = true) Integer userId){
+        Teacher teacher = teacherDao.get(userId);
+        if (teacher == null) {
+            return failed("用户信息获取失败");
+        }
+        String organId = new String();
+        if(Objects.nonNull(teacher.getTeacherOrganId())){
+            organId = teacher.getTeacherOrganId().toString();
+        }
+        if(StringUtils.isEmpty(teacher.getFlowOrganRange())){
+            organId += "," + teacher.getFlowOrganRange();
+        }
+        return succeed(schoolService.findVipSchoolByTeacher(userId,organId,null));
+    }
+}

+ 58 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentStudentController.java

@@ -1,11 +1,22 @@
 package com.ym.mec.web.controller.education;
 
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.page.StudentManageQueryInfo;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.biz.service.StudentManageService;
+import com.ym.mec.biz.service.TeacherService;
 import com.ym.mec.common.page.QueryInfo;
 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.util.CollectionUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -15,6 +26,12 @@ import com.ym.mec.biz.service.StudentAttendanceService;
 import com.ym.mec.biz.service.StudentRegistrationService;
 import com.ym.mec.common.controller.BaseController;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 /**
  * @Author Joburgess
  * @Date 2020.09.14
@@ -28,6 +45,12 @@ public class EduStudentStudentController extends BaseController {
     private StudentRegistrationService studentRegistrationService;
     @Autowired
     private StudentManageService studentManageService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private EmployeeDao employeeDao;
+    @Autowired
+    private TeacherService teacherService;
 
     @ApiOperation(value = "获取某节课学生签到列表")
     @GetMapping("eduStudentAttendance/findStudentAttendance")
@@ -53,4 +76,39 @@ public class EduStudentStudentController extends BaseController {
         return succeed(studentManageService.queryStudentNoStartCourse(queryInfo));
     }
 
+    @ApiOperation(value = "获取学生列表")
+    @GetMapping("eduStudentManage/queryStudentList")
+    public Object queryStudentList(StudentManageQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        if(Objects.nonNull(queryInfo.getTeacherIdForOrgan())){
+            Teacher teacher = teacherService.get(queryInfo.getTeacherIdForOrgan());
+            if(Objects.isNull(teacher)){
+                return failed("教师信息不存在");
+            }
+            if(Objects.nonNull(teacher.getTeacherOrganId())){
+                queryInfo.setOrganId(teacher.getTeacherOrganId().toString());
+            }
+            if(StringUtils.isNotBlank(teacher.getFlowOrganRange())){
+                queryInfo.setOrganId(queryInfo.getOrganId()+","+teacher.getFlowOrganRange());
+            }
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        if (StringUtils.isEmpty(queryInfo.getOrganId())||StringUtils.isBlank(employee.getOrganIdList())) {
+            return failed("用户所在分部异常");
+        }
+        Set<String> employeeOrganList = Arrays.stream(employee.getOrganIdList().split(",")).collect(Collectors.toSet());
+        Set<String> teacherOrganList = Arrays.stream(queryInfo.getOrganId().split(",")).collect(Collectors.toSet());
+        List<String> organIdList = teacherOrganList.stream().filter(id -> employeeOrganList.contains(id)).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(organIdList)){
+            return failed("用户所在分部异常");
+        }
+        queryInfo.setOrganId(StringUtils.join(organIdList, ","));
+
+        queryInfo.setIsExport(false);
+        return succeed(studentManageService.findStudentsByOrganId(queryInfo));
+    }
+
 }

+ 9 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduSubjectController.java

@@ -3,8 +3,11 @@ package com.ym.mec.web.controller.education;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
+import io.swagger.annotations.ApiParam;
 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.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -24,4 +27,10 @@ public class EduSubjectController extends BaseController {
     public Object findSubSubjects(Integer tenantId){
         return succeed(subjectService.findSubSubjects(tenantId));
     }
+
+    @ApiOperation(value = "根据科目编号查询科目")
+    @GetMapping("/findBySubjectByIdList")
+    public Object get(String subjectIdList){
+        return succeed(subjectService.findBySubjectByIdList(subjectIdList));
+    }
 }

+ 93 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduVipGroupActivityController.java

@@ -0,0 +1,93 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dto.VipGroupActivityAddDto;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.SysConfig;
+import com.ym.mec.biz.dal.entity.VipGroupActivity;
+import com.ym.mec.biz.dal.page.VipGroupActivityQueryInfo;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.VipGroupActivityService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.exception.BizException;
+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.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/10/1
+ */
+
+@Api(tags = "vip课活动")
+@RequestMapping("eduVipGroupActivity")
+@RestController
+public class EduVipGroupActivityController extends BaseController {
+
+    @Autowired
+    private VipGroupActivityService vipGroupActivityService;
+	@Autowired
+    private TeacherDao teacherDao;
+	@Autowired
+    private StudentDao studentDao;
+	@Autowired
+    private SysConfigService sysConfigService;
+
+    @ApiOperation(value = "根据课程类型获取对应课程活动方案")
+    @GetMapping("/findByVipGroupCategory")
+    @PreAuthorize("@pcs.hasPermissions('vipGroupActivity/findByVipGroupCategory')")
+    public Object findByVipGroupCategory(Long categoryId, String studentIds, Integer teacherId){
+        if(StringUtils.isBlank(studentIds)){
+            return failed("请选择学员");
+        }
+
+        SysConfig activityIdConfig = sysConfigService.findByParamName(SysConfigService.CHILDREN_DAY_VIP_ACTIVITY_IDS);
+        if(Objects.isNull(activityIdConfig)||StringUtils.isBlank(activityIdConfig.getParanValue())){
+            return succeed();
+        }
+
+        Set<Integer> activityIds = Arrays.stream(activityIdConfig.getParanValue().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toSet());
+
+        List<Integer> userIds = Arrays.stream(studentIds.split(",")).map(id -> Integer.valueOf(id)).collect(Collectors.toList());
+        List<Student> students = studentDao.findByStudentIds(userIds);
+        if(CollectionUtils.isEmpty(students)||students.size()!=userIds.size()){
+            return failed("学员信息不存在");
+        }
+        long newStudentNum = students.stream().filter(s -> s.getIsNewUser()).count();
+
+        Integer applyToStudentType = -1;
+        if(newStudentNum==0){
+            applyToStudentType = 0;
+        }else if(newStudentNum==userIds.size()){
+            applyToStudentType = 1;
+        }
+
+        SysUser student = teacherDao.getUser(userIds.get(0));
+        if(Objects.isNull(student)){
+            return failed("学员信息不存在");
+        }
+        String organIds = student.getOrganId().toString();
+        List<VipGroupActivity> vipGroupActivities = vipGroupActivityService.findByVipGroupCategory(categoryId, organIds, teacherId, applyToStudentType);
+        Iterator<VipGroupActivity> iterator = vipGroupActivities.iterator();
+        while (iterator.hasNext()){
+            VipGroupActivity vipGroupActivity = iterator.next();
+            if(!activityIds.contains(vipGroupActivity.getId())){
+                iterator.remove();
+            }
+        }
+        return succeed(vipGroupActivities);
+    }
+
+}

+ 58 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduVipGroupCategoryController.java

@@ -0,0 +1,58 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.entity.VipGroupCategory;
+import com.ym.mec.biz.service.VipGroupCategoryService;
+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.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+@Api(tags = "vip课类别")
+@RequestMapping("eduVipGroupCategory")
+@RestController
+public class EduVipGroupCategoryController extends BaseController {
+
+	@Autowired
+	private VipGroupCategoryService vipGroupCategoryService;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+	@Autowired
+	private EmployeeDao employeeDao;
+
+	@ApiOperation("全查询")
+	@GetMapping(value = "/queryAll")
+	public Object queryAll(String organId) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("用户信息获取失败");
+		}
+		Employee employee = employeeDao.get(sysUser.getId());
+		if (StringUtils.isEmpty(organId)) {
+			organId = employee.getOrganIdList();
+		}else if(StringUtils.isEmpty(employee.getOrganIdList())){
+			return failed("用户所在分部异常");
+		}else {
+			List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+			if(!list.containsAll(Arrays.asList(organId.split(",")))){
+				return failed("非法请求");
+			}
+		}
+		return succeed(vipGroupCategoryService.findAllByOrgan(organId));
+	}
+}

+ 72 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduVipGroupManageController.java

@@ -0,0 +1,72 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dto.VipGroupApplyDto;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.service.VipGroupService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.util.date.DateUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/9/21
+ */
+@Api(tags = "vip课")
+@RequestMapping("eduVipGroupManage")
+@RestController
+public class EduVipGroupManageController extends BaseController {
+
+    @Autowired
+    private VipGroupService vipGroupService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private TeacherDao teacherDao;
+
+    @ApiOperation(value = "创建六一活动vip课")
+    @PostMapping("/createActivityVipGroup")
+    public Object createActivityVipGroup(@RequestBody VipGroupApplyDto vipGroupApplyDto){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        Integer userId = vipGroupApplyDto.getVipGroupApplyBaseInfo().getUserId();
+        Teacher teacher = teacherDao.get(userId);
+        if(Objects.isNull(teacher)){
+            return failed("请指定指导老师!");
+        }
+        if(Objects.isNull(vipGroupApplyDto.getVipGroupApplyBaseInfo().getOrganId())){
+            Integer firstStudentId = vipGroupApplyDto.getVipGroupApplyBaseInfo().getFirstStudentId();
+            SysUser student = teacherDao.getUser(firstStudentId);
+            if(Objects.isNull(student)||Objects.isNull(student.getOrganId())){
+                return failed("学员信息异常");
+            }
+            vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganId(student.getOrganId());
+        }
+        for (CourseSchedule courseSchedule : vipGroupApplyDto.getCourseSchedules()) {
+            courseSchedule.setEndClassTime(DateUtil.addMinutes(courseSchedule.getStartClassTime(), vipGroupApplyDto.getVipGroupApplyBaseInfo().getSingleClassMinutes()));
+        }
+        vipGroupApplyDto.getVipGroupApplyBaseInfo().setEducationalTeacherId(sysUser.getId());
+        return vipGroupService.createActivityVipGroup(vipGroupApplyDto);
+    }
+
+    @PostMapping("/exportActivityVipGroup")
+    public HttpResponseResult importActivityVipGroup(String data){
+        vipGroupService.importActivityVipGroup(data);
+        return succeed();
+    }
+
+}

+ 143 - 0
mec-web/src/main/resources/application.yml

@@ -0,0 +1,143 @@
+server:
+  port: 8005
+  connection-timeout: 60000
+  tomcat:
+    min-spare-threads: 50
+    max-threads: 500
+    accesslog:
+      enabled: true
+      buffered: true
+      directory: /var/logs
+      file-date-format: -yyyy-MM-dd
+      pattern: common
+      prefix: tomcat-web
+      rename-on-rotate: false
+      request-attributes-enabled: false
+      rotate: true
+      suffix: .log
+
+eureka:
+  client:
+    serviceUrl:
+      defaultZone: http://admin:admin123@localhost:8761/eureka/eureka/
+    instance:
+      lease-renewal-interval-in-seconds: 5
+      prefer-ip-address: true
+
+spring:
+  servlet:
+    multipart:
+      max-file-size: 150MB
+      max-request-size: 150MB
+  application:
+    name: web-server
+
+  data:
+    mongodb:
+      uri: mongodb://root:dayayuemeng2019@47.114.1.200:27017/mec_dev
+
+  datasource:
+    name: test
+    url: jdbc:mysql://rm-bp13774a2o87ti8c7mo.mysql.rds.aliyuncs.com:3306/mec_pro?useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
+    username: mec_pro
+    password: mec@Pro9
+    # 使用druid数据源
+    type: com.alibaba.druid.pool.DruidDataSource
+    druid:
+      connection-init-sqls: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    filters: stat
+    maxActive: 50
+    initialSize: 10
+    maxWait: 60000
+    minIdle: 1
+    timeBetweenEvictionRunsMillis: 60000
+    minEvictableIdleTimeMillis: 300000
+    validationQuery: select 'x'
+    testWhileIdle: true
+    testOnBorrow: false
+    testOnReturn: false
+    poolPreparedStatements: true
+    maxOpenPreparedStatements: 20
+
+  redis:
+    host: 47.114.1.200
+    port: 6379
+    password: dyym
+    database: 1
+    #连接超时时间(毫秒)
+    timeout: 10000
+    jedis:
+      pool:
+        #连接池最大连接数(使用负值表示没有限制)
+        max-active: 20
+        #连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: 10000
+        #连接池中的最大空闲连接
+        max-idle: 10
+        #连接池中的最小空闲连接
+        min-idle: 5
+
+mybatis:
+  mapperLocations: classpath:config/mybatis/*.xml
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+
+swagger:
+  base-package: com.ym.mec.web.controller
+
+##认证
+security:
+  oauth2:
+    client:
+      client-id: app
+      client-secret: app
+    resource:
+      token-info-uri: http://localhost:8001/oauth/check_token
+
+#spring boot admin 相关配置
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"
+  endpoint:
+    health:
+      show-details: ALWAYS
+
+
+ribbon:
+  ReadTimeout: 600000
+  ConnectTimeout: 60000
+
+logging:
+  level:
+    com.ym.mec.auth.api.client.SysUserFeignService: INFO
+
+message:
+  debugMode: true
+
+##支付流水隐藏
+payment:
+  hiddenMode: false
+  #隐藏的支付方式
+  channel: YQPAY
+
+eseal:
+  tsign:
+    projectid: 4438776254
+    projectSecret: a94cf63d6361084d232f345d71321691
+    apisUrl: http://smlitsm.tsign.cn:8080/tgmonitor/rest/app!getAPIInfo2
+
+push:
+  jiguang:
+    reqURL: https://api.jpush.cn/v3/push
+    appKey:
+      student: 0e7422e1d6e73637e678716a
+      teacher: 7e0282ca92c12c8c45a93bb3
+      system: 496fc1007dea59b1b4252d2b
+    masterSecret:
+      student: c2361016604eab56ab2db2ac
+      teacher: d47430e2f4755ef5dc050ac5
+      system: a5e51e9cdb25417463afbf7a
+    apns_production: false

+ 16 - 0
mec-web/src/main/resources/bootstrap-dev_server.properties

@@ -0,0 +1,16 @@
+#\u6307\u5b9a\u5f00\u53d1\u73af\u5883
+#spring.profiles.active=dev
+#\u670d\u52a1\u5668\u5730\u5740
+spring.cloud.nacos.config.server-addr=47.114.1.200:8848
+#\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
+spring.cloud.nacos.config.namespace=fd352683-69df-439a-802f-c44f0c21329c
+#\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
+spring.cloud.nacos.config.group=DEFAULT_GROUP
+#\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}
+spring.cloud.nacos.config.prefix=web
+#\u6307\u5b9a\u6587\u4ef6\u540e\u7f00
+spring.cloud.nacos.config.file-extension=yaml
+#\u662f\u5426\u52a8\u6001\u5237\u65b0
+spring.cloud.nacos.config.refresh.enabled=true
+#\u662f\u5426\u542f\u7528nacos\u914d\u7f6e\u4e2d\u5fc3
+spring.cloud.nacos.config.enabled=true