Browse Source

代码合并

zouxuan 1 year ago
parent
commit
c9ddbcf0eb
100 changed files with 9408 additions and 0 deletions
  1. 95 0
      mec-application/pom.xml
  2. 24 0
      mec-application/src/main/java/com/ym/mec/AppServerApplication.java
  3. 93 0
      mec-application/src/main/java/com/ym/mec/config/AppBeanNameGenerator.java
  4. 11 0
      mec-application/src/main/java/com/ym/mec/config/BeanNameConfig.java
  5. 18 0
      mec-application/src/main/java/com/ym/mec/config/BeanTypeFilter.java
  6. 51 0
      mec-application/src/main/java/com/ym/mec/config/PermissionCheckService.java
  7. 81 0
      mec-application/src/main/java/com/ym/mec/config/ResourceServerConfig.java
  8. 131 0
      mec-application/src/main/java/com/ym/mec/config/WebMvcConfig.java
  9. 46 0
      mec-application/src/main/java/com/ym/mec/config/WebSocketConfig.java
  10. 56 0
      mec-application/src/main/java/com/ym/mec/interceptor/MDCInterceptor.java
  11. 30 0
      mec-application/src/main/java/com/ym/mec/interceptor/OperationLogInterceptor.java
  12. 31 0
      mec-application/src/main/java/com/ym/mec/interceptor/TenantInterceptor.java
  13. 28 0
      mec-application/src/main/java/com/ym/mec/interceptor/WebSocketHandshakeInterceptor.java
  14. 211 0
      mec-application/src/main/java/com/ym/mec/student/controller/ActivityController.java
  15. 27 0
      mec-application/src/main/java/com/ym/mec/student/controller/ActivityUserMapperController.java
  16. 31 0
      mec-application/src/main/java/com/ym/mec/student/controller/ChargeTypeController.java
  17. 113 0
      mec-application/src/main/java/com/ym/mec/student/controller/ChildrenDayController.java
  18. 55 0
      mec-application/src/main/java/com/ym/mec/student/controller/ChildrenDayDegreeDetailController.java
  19. 110 0
      mec-application/src/main/java/com/ym/mec/student/controller/ClassGroupController.java
  20. 50 0
      mec-application/src/main/java/com/ym/mec/student/controller/CloudCoachPaymentProgramController.java
  21. 46 0
      mec-application/src/main/java/com/ym/mec/student/controller/CloudStudyController.java
  22. 125 0
      mec-application/src/main/java/com/ym/mec/student/controller/ContractsController.java
  23. 100 0
      mec-application/src/main/java/com/ym/mec/student/controller/CourseController.java
  24. 49 0
      mec-application/src/main/java/com/ym/mec/student/controller/CourseGroupController.java
  25. 44 0
      mec-application/src/main/java/com/ym/mec/student/controller/CourseReviewController.java
  26. 183 0
      mec-application/src/main/java/com/ym/mec/student/controller/DegreeController.java
  27. 44 0
      mec-application/src/main/java/com/ym/mec/student/controller/ExtracurricularExercisesMessageController.java
  28. 68 0
      mec-application/src/main/java/com/ym/mec/student/controller/ExtracurricularExercisesReplyController.java
  29. 68 0
      mec-application/src/main/java/com/ym/mec/student/controller/GoodsController.java
  30. 188 0
      mec-application/src/main/java/com/ym/mec/student/controller/ImGroupController.java
  31. 76 0
      mec-application/src/main/java/com/ym/mec/student/controller/ImLiveBroadcastRoomController.java
  32. 72 0
      mec-application/src/main/java/com/ym/mec/student/controller/ImLiveRoomReservationController.java
  33. 77 0
      mec-application/src/main/java/com/ym/mec/student/controller/LessonExaminationController.java
  34. 48 0
      mec-application/src/main/java/com/ym/mec/student/controller/LiveGoodsMapperController.java
  35. 160 0
      mec-application/src/main/java/com/ym/mec/student/controller/LuckDrawController.java
  36. 130 0
      mec-application/src/main/java/com/ym/mec/student/controller/MemberRankController.java
  37. 37 0
      mec-application/src/main/java/com/ym/mec/student/controller/MusicEnlightenmentQuestionnaireController.java
  38. 321 0
      mec-application/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  39. 79 0
      mec-application/src/main/java/com/ym/mec/student/controller/MusicGroupDetailController.java
  40. 87 0
      mec-application/src/main/java/com/ym/mec/student/controller/MusicGroupPaymentCalenderController.java
  41. 84 0
      mec-application/src/main/java/com/ym/mec/student/controller/MusicGroupRecordController.java
  42. 102 0
      mec-application/src/main/java/com/ym/mec/student/controller/MusicGroupRegisterController.java
  43. 32 0
      mec-application/src/main/java/com/ym/mec/student/controller/OrganizationController.java
  44. 28 0
      mec-application/src/main/java/com/ym/mec/student/controller/PageMonitorController.java
  45. 360 0
      mec-application/src/main/java/com/ym/mec/student/controller/PracticeGroupController.java
  46. 42 0
      mec-application/src/main/java/com/ym/mec/student/controller/PracticeLessonApplyController.java
  47. 27 0
      mec-application/src/main/java/com/ym/mec/student/controller/QuestionnaireTopicController.java
  48. 68 0
      mec-application/src/main/java/com/ym/mec/student/controller/QuestionnaireUserResultController.java
  49. 40 0
      mec-application/src/main/java/com/ym/mec/student/controller/RechargeController.java
  50. 180 0
      mec-application/src/main/java/com/ym/mec/student/controller/RepairController.java
  51. 186 0
      mec-application/src/main/java/com/ym/mec/student/controller/ReplacementInstrumentActivityController.java
  52. 39 0
      mec-application/src/main/java/com/ym/mec/student/controller/ReplacementInstrumentController.java
  53. 32 0
      mec-application/src/main/java/com/ym/mec/student/controller/ResourceRepositoryController.java
  54. 87 0
      mec-application/src/main/java/com/ym/mec/student/controller/SmsCodeController.java
  55. 133 0
      mec-application/src/main/java/com/ym/mec/student/controller/SporadicChargeInfoController.java
  56. 37 0
      mec-application/src/main/java/com/ym/mec/student/controller/StudentAttendanceController.java
  57. 75 0
      mec-application/src/main/java/com/ym/mec/student/controller/StudentCompetitionController.java
  58. 60 0
      mec-application/src/main/java/com/ym/mec/student/controller/StudentController.java
  59. 184 0
      mec-application/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java
  60. 123 0
      mec-application/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkReplyController.java
  61. 106 0
      mec-application/src/main/java/com/ym/mec/student/controller/StudentCourseScheduleController.java
  62. 54 0
      mec-application/src/main/java/com/ym/mec/student/controller/StudentDemoGroupController.java
  63. 32 0
      mec-application/src/main/java/com/ym/mec/student/controller/StudentImLiveRoomVideoController.java
  64. 54 0
      mec-application/src/main/java/com/ym/mec/student/controller/StudentInstrumentController.java
  65. 406 0
      mec-application/src/main/java/com/ym/mec/student/controller/StudentManageController.java
  66. 941 0
      mec-application/src/main/java/com/ym/mec/student/controller/StudentOrderController.java
  67. 108 0
      mec-application/src/main/java/com/ym/mec/student/controller/StudentVipGroupController.java
  68. 38 0
      mec-application/src/main/java/com/ym/mec/student/controller/StudyReportController.java
  69. 70 0
      mec-application/src/main/java/com/ym/mec/student/controller/SubjectChangeController.java
  70. 25 0
      mec-application/src/main/java/com/ym/mec/student/controller/SubjectController.java
  71. 46 0
      mec-application/src/main/java/com/ym/mec/student/controller/SysConfigController.java
  72. 94 0
      mec-application/src/main/java/com/ym/mec/student/controller/SysCouponCodeController.java
  73. 28 0
      mec-application/src/main/java/com/ym/mec/student/controller/SysExamSongController.java
  74. 34 0
      mec-application/src/main/java/com/ym/mec/student/controller/SysImComplaintController.java
  75. 130 0
      mec-application/src/main/java/com/ym/mec/student/controller/SysMessageController.java
  76. 63 0
      mec-application/src/main/java/com/ym/mec/student/controller/SysMusicCompareRecordController.java
  77. 56 0
      mec-application/src/main/java/com/ym/mec/student/controller/SysMusicScoreAccompanimentController.java
  78. 58 0
      mec-application/src/main/java/com/ym/mec/student/controller/SysMusicScoreCategoriesController.java
  79. 40 0
      mec-application/src/main/java/com/ym/mec/student/controller/SysMusicScoreController.java
  80. 47 0
      mec-application/src/main/java/com/ym/mec/student/controller/SysTenantConfigController.java
  81. 25 0
      mec-application/src/main/java/com/ym/mec/student/controller/SystemDateController.java
  82. 124 0
      mec-application/src/main/java/com/ym/mec/student/controller/TempLittleArtistTrainingCampController.java
  83. 86 0
      mec-application/src/main/java/com/ym/mec/student/controller/TempLiveActivityController.java
  84. 43 0
      mec-application/src/main/java/com/ym/mec/student/controller/TenantApplyController.java
  85. 61 0
      mec-application/src/main/java/com/ym/mec/student/controller/TenantInfoController.java
  86. 118 0
      mec-application/src/main/java/com/ym/mec/student/controller/WechatController.java
  87. 30 0
      mec-application/src/main/java/com/ym/mec/student/controller/WithdrawController.java
  88. 117 0
      mec-application/src/main/java/com/ym/mec/student/controller/degree/DegreeInfoController.java
  89. 64 0
      mec-application/src/main/java/com/ym/mec/student/controller/degree/DegreeLevelFeeController.java
  90. 47 0
      mec-application/src/main/java/com/ym/mec/student/controller/degree/DegreeNewsController.java
  91. 99 0
      mec-application/src/main/java/com/ym/mec/student/controller/open/OpenLiveBroadcastRoomController.java
  92. 32 0
      mec-application/src/main/java/com/ym/mec/student/controller/open/OpenSysConfigController.java
  93. 116 0
      mec-application/src/main/java/com/ym/mec/teacher/controller/ActivityUserMapperController.java
  94. 132 0
      mec-application/src/main/java/com/ym/mec/teacher/controller/ClassGroupController.java
  95. 63 0
      mec-application/src/main/java/com/ym/mec/teacher/controller/CloudStudyController.java
  96. 94 0
      mec-application/src/main/java/com/ym/mec/teacher/controller/CourseGroupController.java
  97. 231 0
      mec-application/src/main/java/com/ym/mec/teacher/controller/CourseHomeworkController.java
  98. 32 0
      mec-application/src/main/java/com/ym/mec/teacher/controller/CourseHomeworkTemplateController.java
  99. 122 0
      mec-application/src/main/java/com/ym/mec/teacher/controller/CourseReviewController.java
  100. 129 0
      mec-application/src/main/java/com/ym/mec/teacher/controller/CourseScheduleTeacherSalaryController.java

+ 95 - 0
mec-application/pom.xml

@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.ym</groupId>
+        <artifactId>mec</artifactId>
+        <version>1.0</version>
+    </parent>
+    <packaging>jar</packaging>
+
+    <artifactId>mec-application</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-security</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-sleuth-zipkin</artifactId>
+        </dependency>
+
+        <!-- swagger-spring-boot -->
+        <dependency>
+            <groupId>com.spring4all</groupId>
+            <artifactId>swagger-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.ym</groupId>
+            <artifactId>mec-biz</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.yonge.log</groupId>
+            <artifactId>audit-log</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.whvcse</groupId>
+            <artifactId>easy-captcha</artifactId>
+            <version>1.6.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.yonge.datasource</groupId>
+            <artifactId>dynamic-datasource</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>docker-maven-plugin</artifactId>
+                <version>1.2.2</version>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 24 - 0
mec-application/src/main/java/com/ym/mec/AppServerApplication.java

@@ -0,0 +1,24 @@
+package com.ym.mec;
+
+import com.ym.mec.config.AppBeanNameGenerator;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+@SpringBootApplication
+@EnableDiscoveryClient
+@EnableFeignClients("com.ym.mec")
+@ComponentScan(basePackages = {"com.ym.mec", "org.snaker.engine", "com.yonge.log", "com.mec.redisson"})
+@MapperScan(basePackages = {"com.ym.mec.biz.**.dao", "com.yonge.datasource.dao", "com.ym.mec.biz.dal.mapper"})
+@Configuration
+public class AppServerApplication {
+    public static void main(String[] args) {
+        new SpringApplicationBuilder(AppServerApplication.class)
+                .beanNameGenerator(new AppBeanNameGenerator())
+                .run(args);
+    }
+}

+ 93 - 0
mec-application/src/main/java/com/ym/mec/config/AppBeanNameGenerator.java

@@ -0,0 +1,93 @@
+package com.ym.mec.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.support.BeanDefinitionRegistry;
+import org.springframework.beans.factory.support.BeanNameGenerator;
+import org.springframework.core.annotation.AnnotationAttributes;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+import org.springframework.core.type.AnnotationMetadata;
+import org.springframework.lang.Nullable;
+import org.springframework.util.Assert;
+import org.springframework.util.ClassUtils;
+import org.springframework.util.StringUtils;
+
+import java.beans.Introspector;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
+/**
+ * 自定义 组件命名规则 返回全限定名称
+ *
+ */
+@Slf4j
+public class AppBeanNameGenerator implements BeanNameGenerator {
+
+    /**
+     * 自定义 组件命名规则 返回全限定名称
+     * @param definition BeanDefinition
+     * @param registry BeanDefinitionRegistry
+     * @return String
+     */
+    @Override
+    public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
+
+        //获取全限定名称
+        String beanClassName = buildDefaultBeanName(definition, registry);
+        // 默认使用注解自定义名称
+        return Optional.ofNullable(determineBeanNameFromAnnotation((AnnotatedBeanDefinition) definition)).orElse(beanClassName);
+    }
+
+    protected String determineBeanNameFromAnnotation(AnnotatedBeanDefinition annotatedDef) {
+        AnnotationMetadata amd = annotatedDef.getMetadata();
+        Set<String> types = amd.getAnnotationTypes();
+        String beanName = null;
+
+        for (String type : types) {
+            AnnotationAttributes attributes = attributesFor(amd, type);
+            if (attributes != null && this.isStereotypeWithNameValue(type, amd.getMetaAnnotationTypes(type), attributes)) {
+                Object value = attributes.get("value");
+                if (value instanceof String) {
+                    String strVal = (String) value;
+                    if (StringUtils.hasLength(strVal)) {
+                        if (beanName != null && !strVal.equals(beanName)) {
+                            throw new IllegalStateException("Stereotype annotations suggest inconsistent component names: '" + beanName + "' versus '" + strVal + "'");
+                        }
+
+                        beanName = strVal;
+                    }
+                }
+            }
+        }
+
+        return beanName;
+    }
+
+    static AnnotationAttributes attributesFor(AnnotatedTypeMetadata metadata, String annotationClassName) {
+        return AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(annotationClassName, false));
+    }
+
+    protected boolean isStereotypeWithNameValue(String annotationType, Set<String> metaAnnotationTypes, @Nullable Map<String, Object> attributes) {
+        boolean isStereotype = annotationType.equals("org.springframework.stereotype.Component") || metaAnnotationTypes.contains("org.springframework.stereotype.Component") || annotationType.equals("javax.annotation.ManagedBean") || annotationType.equals("javax.inject.Named");
+        return isStereotype && attributes != null && attributes.containsKey("value");
+    }
+
+    protected String buildDefaultBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
+        return this.buildDefaultBeanName(definition);
+    }
+
+    protected String buildDefaultBeanName(BeanDefinition definition) {
+        //获取全限定名称
+        String beanClassName = definition.getBeanClassName();
+        Assert.state(beanClassName != null, "No bean class name set");
+        //获取类名
+        String shortClassName = ClassUtils.getShortName(beanClassName);
+        //小写首字母
+        String decapitalizetalize = Introspector.decapitalize(shortClassName);
+        log.info("beanClassName:{}, shortClassName={}, decapitalizetalize={}", beanClassName, shortClassName, decapitalizetalize);
+
+        return beanClassName;
+    }
+}

+ 11 - 0
mec-application/src/main/java/com/ym/mec/config/BeanNameConfig.java

@@ -0,0 +1,11 @@
+package com.ym.mec.config;
+
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.support.BeanDefinitionRegistry;
+
+public class BeanNameConfig implements org.springframework.beans.factory.support.BeanNameGenerator {
+    @Override
+    public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry beanDefinitionRegistry) {
+        return beanDefinition.getBeanClassName();
+    }
+}

+ 18 - 0
mec-application/src/main/java/com/ym/mec/config/BeanTypeFilter.java

@@ -0,0 +1,18 @@
+package com.ym.mec.config;
+
+import org.springframework.core.type.classreading.MetadataReader;
+import org.springframework.core.type.classreading.MetadataReaderFactory;
+import org.springframework.core.type.filter.TypeFilter;
+
+import java.io.IOException;
+
+public class BeanTypeFilter implements TypeFilter {
+    @Override
+    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
+        String className = metadataReader.getClassMetadata().getClassName();
+        if (className.contains(".")) {
+            return true;
+        }
+        return false;
+    }
+}

+ 51 - 0
mec-application/src/main/java/com/ym/mec/config/PermissionCheckService.java

@@ -0,0 +1,51 @@
+package com.ym.mec.config;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.common.security.SecurityUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.stereotype.Component;
+
+import java.util.Collection;
+
+@Component("pcs")
+public class PermissionCheckService {
+	
+	@Autowired
+	@Lazy
+	private SysUserFeignService sysUserFeignService;
+
+	public boolean hasPermissions(String... permissions) {
+		Authentication authentication = SecurityUtils.getAuthentication();
+		if (authentication == null) {
+			return false;
+		}
+
+		SysUser user = sysUserFeignService.queryUserInfo();
+		if(user.getIsSuperAdmin()){
+			return true;
+		}
+
+		Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
+
+		for (String perm : permissions) {
+			for (GrantedAuthority authority : authorities) {
+				if (StringUtils.equalsIgnoreCase(perm, authority.getAuthority())) {
+					return true;
+				}
+			}
+		}
+
+		return false;
+	}
+
+	public boolean hasRoles(String... roles) {
+
+		return hasPermissions(roles);
+	}
+
+}

+ 81 - 0
mec-application/src/main/java/com/ym/mec/config/ResourceServerConfig.java

@@ -0,0 +1,81 @@
+package com.ym.mec.config;
+
+import com.ym.mec.common.security.BaseAccessDeniedHandler;
+import com.ym.mec.common.security.BaseAuthenticationEntryPoint;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
+import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
+import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
+
+@Configuration
+@EnableResourceServer
+@EnableGlobalMethodSecurity(prePostEnabled = true)
+public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
+
+    @Autowired
+    private BaseAccessDeniedHandler baseAccessDeniedHandler;
+
+    @Autowired
+    private BaseAuthenticationEntryPoint baseAuthenticationEntryPoint;
+
+    @Override
+    public void configure(HttpSecurity http) throws Exception {
+        http.csrf()
+                .disable()
+                .exceptionHandling()
+                .accessDeniedHandler(baseAccessDeniedHandler)
+                .authenticationEntryPoint(baseAuthenticationEntryPoint)
+                .and()
+                .authorizeRequests()
+                .antMatchers("/api-web/task/**")
+                .hasIpAddress("0.0.0.0/0")
+                .antMatchers(
+                //common
+                        "/*/v2/api-docs", "/*/code/*",
+
+                //student
+                        "/api-student/wechat/*", "/api-student/student/registering", "/api-student/register/*", "/api-student/studentOrder/**", "/api-student/musicGroup/getSubjectGoodsAndInfo",
+                        "/api-student/musicGroup/getMusicGroupStatus", "/api-student/musicGroup/getOrderStatus","/api-student/sysCouponCode/queryPage",
+                        "/api-student/musicGroup/pay", "/api-student/musicGroup/rePay", "/api-student/studentManage/queryStudentPer",
+                        "/api-student/sporadicChargeInfo/get", "/api-student/sporadicChargeInfo/sporadicPay", "/api-student/repair/getRepairInfo", "/api-student/repair/payRepair",
+                        "/api-student/degree/*", "/api-student/getUploadSign", "/api-student/practiceGroup/queryOrderInfo", "/api-student/systemDate/query", "/api-student/organization/getOrgans",
+                        "/api-student/repair/addGoodsSellOrder", "/api-student/repair/getStudentGoodsOrder", "/api-student/subjectChange/getChangeInfo", "/api-student/subjectChange/payChange", "/api-student/contracts/queryProduceContract",
+                        "/api-student/repair/studentPaymentGoodsOrder", "/api-student/studentCompetition/getWinnerList", "/api-student/musicGroup/getGradeList",
+                        "/api-student/studentCompetition/get","/api-student/musicGroup/preRegister", "/api-student/tenantInfo/queryTenantInfoByOrgan/**",
+                        "/api-student/subject/list","/api-student/tenantApply/add","/api-student/questionnaireUserResult/add","/api-student/questionnaireTopic/getDetail",
+                        "/api-student/open/**", "/api-student/liveGoodsMapper/page", "/api-student/liveGoodsMapper/getGoodsDetail",
+                        "/api-student/musicEnlightenmentQuestionnaire/addEnlightenmentQuestionnaire", "/api-student/musicEnlightenmentQuestionnaire/getUserMusicEnlightenmentQuestionnaire",
+
+
+                //teacher
+                        "/api-teacher/teacher/queryStudentApply", "/api-teacher/teacher/querySubByMusicGroupId", "/api-teacher/studentRegistration/updateSubject",
+                        "/api-teacher/studyReport/createEvaluate", "/api-teacher/teacherOrder/*", "/api-teacher/teacher/getRegisterOrPreList", "/api-teacher/teacherContract/callback", "/api-teacher/eduPracticeGroup/queryOrderInfo",
+
+                //web
+                        "/api-web/classGroup/highClassGroups", "/api-web/api/*", "/api-web/appVersionInfo/queryByPlatform", "/api-web/eduDegree/*",
+                        "/api-web/uploadFile", "/api-web/eduContracts/queryProduceContract", "/api-web/activity/doubleEleven2020Statis", "/api-web/replacementInstrument/queryPage",
+                        "/api-web/replacementInstrumentActivity/queryReplacementsStat", "/api-web/eduStudentRegistration/queryPreApplyList",
+                        "/api-web/eduSubject/findSubSubjects", "/api-web/eduFinancialExpenditure/batchAdd", "/api-web/eduSendNotice/*",
+                        "/api-web/oaContracts/*", "/api-web/eduStudent/organStudentOverView", "/api-web/activity/countCloudTeacherActive",
+                        "/api-web/activity/organDoubleEleven2021Statis", "/api-web/activity/doubleEleven2021Statis",
+                        "/api-web/activity/organDoubleEleven2022Statis", "/api-web/activity/doubleEleven2022Statis","/api-web/activity/organDoubleEleven2022Statis1", "/api-web/activity/doubleEleven2022Statis1",
+                        "/api-web/questionnaireTopic/getDetail", "/api-web/questionnaireUserResult/add",
+                        "/api-web/tenantInfo/info/*", "/api-web/tenantInfo/checkInfo/*", "/api-web/tenantInfo/pay/*","/api-web/tenantInfo/testCheck", "/api-web/tenantInfo/getContract/*",
+                        "/api-web/tenantPreJoin/add","/api-web/imLiveBroadcastRoom/queryRoomInfo","/api-web/imLiveBroadcastRoom/test",
+                        "/api-web/eduOrganization/queryAllOrgan","/api-web/eduOrganization/queryAll","/api-web/eduOrganization/getOrganCooperation","/api-web/import/oaUploadFile",
+                        "/api-web/tenantInfo/callback/**","/api-web/adapay/callback","/api-web/temp/*", "/api-web/open/**","/api-web/schoolActivity/detail/*","/api-web/yeepay/callback/**"
+
+                )
+                .permitAll().anyRequest().authenticated().and().httpBasic();
+    }
+
+
+    @Override
+    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
+        resources.authenticationEntryPoint(baseAuthenticationEntryPoint).accessDeniedHandler(baseAccessDeniedHandler);
+    }
+
+}

+ 131 - 0
mec-application/src/main/java/com/ym/mec/config/WebMvcConfig.java

@@ -0,0 +1,131 @@
+package com.ym.mec.config;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
+import com.ym.mec.common.config.EnumConverterFactory;
+import com.ym.mec.common.config.LocalFastJsonHttpMessageConverter;
+import com.ym.mec.common.enums.BaseEnum;
+import com.ym.mec.interceptor.OperationLogInterceptor;
+import com.ym.mec.interceptor.TenantInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.format.FormatterRegistry;
+import org.springframework.http.MediaType;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+	@Autowired
+	private OperationLogInterceptor operationLogInterceptor;
+	@Autowired
+	private TenantInterceptor tenantInterceptor;
+
+
+	/**
+	 * 枚举类的转换器 addConverterFactory
+	 */
+	@Override
+	public void addFormatters(FormatterRegistry registry) {
+		registry.addConverterFactory(new EnumConverterFactory());
+	}
+
+	@Override
+	public void addInterceptors(InterceptorRegistry registry) {
+		registry.addInterceptor(tenantInterceptor).addPathPatterns("/**");
+		registry.addInterceptor(operationLogInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
+	}
+
+	@SuppressWarnings("rawtypes")
+	@Bean
+	@Primary
+	public ObjectMapper ObjectMapper() {
+		ObjectMapper objectMapper = new ObjectMapper();
+		// 对于空的对象转json的时候不抛出错误
+		objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
+		// 禁用遇到未知属性抛出异常
+		objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+		// 序列化BigDecimal时不使用科学计数法输出
+		objectMapper.configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true);
+		// 日期和时间格式化
+		JavaTimeModule javaTimeModule = new JavaTimeModule();
+		javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+		javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+		javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
+		javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+		javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+		javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
+
+		// BaseEnum序列化
+		javaTimeModule.addSerializer(BaseEnum.class, new JsonSerializer<BaseEnum>() {
+
+			@Override
+			public void serialize(BaseEnum enumObj, JsonGenerator jsonGenerator, SerializerProvider serializers) throws IOException {
+				jsonGenerator.writeString(enumObj.getCode().toString());
+			}
+
+		});
+
+		// Date序列化和反序列化
+		javaTimeModule.addSerializer(Date.class, new JsonSerializer<Date>() {
+			@Override
+			public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+				SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+				String formattedDate = formatter.format(date);
+				jsonGenerator.writeString(formattedDate);
+			}
+		});
+
+		javaTimeModule.addDeserializer(Date.class, new JsonDeserializer<Date>() {
+			@Override
+			public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+				SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+				String date = jsonParser.getText();
+				try {
+					return format.parse(date);
+				} catch (ParseException e) {
+					throw new RuntimeException(e);
+				}
+			}
+		});
+
+		objectMapper.registerModule(javaTimeModule);
+		return objectMapper;
+	}
+
+
+	//student
+	@Bean
+	public HttpMessageConverters fastJsonHttpMessageConverters() {
+		LocalFastJsonHttpMessageConverter converter = new LocalFastJsonHttpMessageConverter();
+		List<MediaType> fastMediaTypes = new ArrayList<MediaType>();
+		fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
+		converter.setSupportedMediaTypes(fastMediaTypes);
+		return new HttpMessageConverters(converter);
+	}
+
+}

+ 46 - 0
mec-application/src/main/java/com/ym/mec/config/WebSocketConfig.java

@@ -0,0 +1,46 @@
+package com.ym.mec.config;
+
+import com.ym.mec.interceptor.WebSocketHandshakeInterceptor;
+import com.ym.mec.biz.handler.WebSocketHandler;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
+import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
+import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/8 0008
+ */
+@Configuration
+@EnableWebSocket
+public class WebSocketConfig implements WebSocketConfigurer {
+
+    @Autowired
+    private WebSocketHandler webSocketHandler;
+    @Autowired
+    private WebSocketHandshakeInterceptor webSocketHandshakeInterceptor;
+
+    @Override
+    public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
+        webSocketHandlerRegistry.addHandler(webSocketHandler,
+                        //student
+                        "/api-student/audioEvaluate",
+                //teacher
+                        "/api-teacher/ws"
+                )
+                .addInterceptors(webSocketHandshakeInterceptor)
+                .setAllowedOrigins("*");
+    }
+
+    @Bean
+    public ServletServerContainerFactoryBean createWebSocketContainer() {
+        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
+        container.setMaxTextMessageBufferSize(8192*4);
+        container.setMaxBinaryMessageBufferSize(8192*4);
+        return container;
+    }
+
+}

+ 56 - 0
mec-application/src/main/java/com/ym/mec/interceptor/MDCInterceptor.java

@@ -0,0 +1,56 @@
+package com.ym.mec.interceptor;
+
+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.entity.Teacher;
+import com.ym.mec.common.filters.TenantIdThreadLocal;
+import com.ym.mec.util.web.WebUtil;
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.UUID;
+
+@Component
+public class MDCInterceptor extends HandlerInterceptorAdapter {
+	private static final String IP = "ip";
+	private static final String USERNAME = "username";
+	private static final String REQ_ID = "reqId";
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+	@Autowired
+	private TeacherDao teacherDao;
+	@Value("${auth.sysconfig.tenantId:}")
+	private Integer tenantClientId;
+
+	@Override
+	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if(sysUser != null){
+			Teacher teacher = teacherDao.get(sysUser.getId());
+			if(teacher != null){
+				if (teacher.getTeacherOrganId() == tenantClientId) {
+					TenantIdThreadLocal.set(2);
+				}else {
+					TenantIdThreadLocal.set(1);
+				}
+			}
+			// 存储userId以及IP
+			MDC.put(USERNAME, sysUser.getRealName() + "@" + sysUser.getId());
+		}
+		MDC.put(IP, WebUtil.getRemoteIp(request));
+		MDC.put(REQ_ID, UUID.randomUUID().toString());
+		return true;
+	}
+
+	@Override
+	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+		TenantIdThreadLocal.remove();
+	}
+}

+ 30 - 0
mec-application/src/main/java/com/ym/mec/interceptor/OperationLogInterceptor.java

@@ -0,0 +1,30 @@
+package com.ym.mec.interceptor;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.yonge.log.interceptor.AuditLogInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Component
+public class OperationLogInterceptor extends AuditLogInterceptor {
+
+	@Autowired
+	@Lazy
+	private SysUserFeignService sysUserFeignService;
+
+	@Override
+	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser != null && sysUser.getId() != null) {
+			request.setAttribute("userId",sysUser.getId());
+			request.setAttribute("username",sysUser.getRealName());
+		}
+		super.afterCompletion(request, response, handler, ex);
+	}
+
+}

+ 31 - 0
mec-application/src/main/java/com/ym/mec/interceptor/TenantInterceptor.java

@@ -0,0 +1,31 @@
+package com.ym.mec.interceptor;
+
+import com.ym.mec.biz.service.TenantInfoService;
+import com.ym.mec.common.tenant.TenantContextHolder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Component
+public class TenantInterceptor extends HandlerInterceptorAdapter {
+
+	@Autowired
+	@Lazy
+	private TenantInfoService tenantInfoService;
+
+	@Override
+	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
+		tenantInfoService.saveTenantContextHolder(request);
+		return true;
+	}
+
+	@Override
+	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+		TenantContextHolder.clearTenantId();
+	}
+
+}

+ 28 - 0
mec-application/src/main/java/com/ym/mec/interceptor/WebSocketHandshakeInterceptor.java

@@ -0,0 +1,28 @@
+package com.ym.mec.interceptor;
+
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.WebSocketHandler;
+import org.springframework.web.socket.server.HandshakeInterceptor;
+
+import java.util.Map;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/9 0009
+ */
+@Component
+public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {
+
+    @Override
+    public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
+        return true;
+    }
+
+    @Override
+    public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {
+
+    }
+
+}

+ 211 - 0
mec-application/src/main/java/com/ym/mec/student/controller/ActivityController.java

@@ -0,0 +1,211 @@
+package com.ym.mec.student.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.VipGroupCategoryDao;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.ActivityDetailDto;
+import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.VipGroupActivity;
+import com.ym.mec.biz.service.MarketActivityService;
+import com.ym.mec.biz.service.SporadicChargeInfoService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.biz.service.VipGroupActivityService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.yonge.log.model.AuditLogAnnotation;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static java.math.BigDecimal.ROUND_UP;
+
+@RequestMapping("${app-config.url.student:}/activity")
+@Api(tags = "活动")
+@RestController
+public class ActivityController extends BaseController {
+    @Autowired
+    private SysUserService sysUserService;
+    @Autowired
+    private SysConfigDao sysConfigDao;
+    @Autowired
+    private SporadicChargeInfoService sporadicChargeInfoService;
+    @Autowired
+    private MarketActivityService marketActivityService;
+    @Autowired
+    private StudentPaymentOrderDao studentPaymentOrderDao;
+    @Autowired
+    private VipGroupActivityService vipGroupActivityService;
+    @Autowired
+    private StudentDao studentDao;
+    @Autowired
+    private VipGroupCategoryDao vipGroupCategoryDao;
+
+    @ApiOperation("活动购买")
+    @PostMapping(value = "/buy")
+    @AuditLogAnnotation(operateName = "学生端活动购买")
+    public HttpResponseResult buy(@RequestBody ActivityPayParamDto activityPayParamDto) throws Exception {
+        SysUser user = sysUserService.getUser();
+        activityPayParamDto.setUserId(user.getId());
+        activityPayParamDto.setOrganId(user.getOrganId());
+        return vipGroupActivityService.buy(activityPayParamDto);
+    }
+
+    @ApiOperation("2022双十一活动购买")
+    @PostMapping(value = "/buyDoubleEleven")
+    @AuditLogAnnotation(operateName = "2022双十一活动购买")
+    public HttpResponseResult buyDoubleEleven(@RequestBody BuyDoubleEleven2022Dto buyDoubleEleven2022Dto) throws Exception {
+        if(StringUtils.isEmpty(buyDoubleEleven2022Dto.getActivityIdList())){
+            throw new BizException("请选择活动");
+        }
+        SysUser sysUser = sysUserService.getUser();
+        buyDoubleEleven2022Dto.setOrganId(sysUser.getOrganId());
+        buyDoubleEleven2022Dto.setUserId(sysUser.getId());
+        return vipGroupActivityService.buyDoubleEleven(buyDoubleEleven2022Dto);
+    }
+
+    @ApiOperation(value = "分部双11活动信息")
+    @GetMapping("/doubleEleven2020")
+    public HttpResponseResult<List<SporadicChargeInfo>> doubleEleven2020(){
+        SysUser user = sysUserService.getUser();
+        Integer organId = user.getOrganId();
+
+        List<SporadicChargeInfo> activeInfos = sporadicChargeInfoService.getOrganActiveInfo(organId, 12);
+        activeInfos.sort(Comparator.comparing(SporadicChargeInfo::getAmount).reversed());
+        if (activeInfos.size() <= 0) {
+            return failed("分部活动不存在");
+        }
+        return succeed(activeInfos);
+    }
+
+    @ApiOperation(value = "分部双11活动信息")
+    @RequestMapping("/doubleEleven2022")
+    public HttpResponseResult doubleEleven2022(){
+        SysUser sysUser = sysUserService.getUser();
+        Map<String,Object> resultMap = new HashMap<>(6);
+        List<ActivityDetailDto> activityDetailDtos = marketActivityService.queryActivity(4, sysUser.getOrganId());
+        resultMap.put("activityDetailList",activityDetailDtos);
+        resultMap.put("startTime",null);
+        resultMap.put("endTime",null);
+        //是否是杭州分部
+        resultMap.put("HZFlag",sysUser.getOrganId().equals(4));
+        if(activityDetailDtos != null && activityDetailDtos.size() > 0){
+            ActivityDetailDto activityDetailDto = activityDetailDtos.get(0);
+            resultMap.put("startTime",activityDetailDto.getStartTime());
+            resultMap.put("endTime",activityDetailDto.getEndTime());
+        }
+        return succeed(resultMap);
+    }
+
+    @ApiOperation("获取2022云教练活动列表")
+    @PostMapping(value = "/queryActivity")
+    @AuditLogAnnotation(operateName = "获取2022云教练活动列表")
+    public HttpResponseResult<List<VipGroupActivity>> queryActivity(){
+        String configValue = sysConfigDao.findConfigValue("2022_cloud_activity_config");
+        List<Cloud2022ActivityDto> cloud2022ActivityDtos = JSONArray.parseArray(configValue, Cloud2022ActivityDto.class);
+        String collect = cloud2022ActivityDtos.stream().map(e -> e.getActivityId()).collect(Collectors.joining(","));
+        return succeed(vipGroupActivityService.getDao().queryByIds(collect));
+    }
+
+    @ApiOperation(value = "学员已购买的双十一活动信息")
+    @GetMapping("/queryStudentDoubleEleven2022Order")
+    public Object queryStudentDoubleEleven2022Order() {
+        SysUser user = sysUserService.getUser();
+        List<ActivityDetailDto> activityDetailDtos = marketActivityService.queryActivity(4, user.getOrganId());
+        String activitys = studentPaymentOrderDao.queryStudentDoubleElevenOrder(user.getId());
+        List<Integer> activityList = new ArrayList<>();
+        if(StringUtils.isNotEmpty(activitys)){
+            for (ActivityDetailDto activityDetailDto : activityDetailDtos) {
+                if(activitys.contains(activityDetailDto.getActivityId().toString())){
+                    if(activityDetailDto.getCategoryName().equals("1v1")){
+                        if(activityDetailDto.getCourseNum().intValue() == 20){
+                            activityList.add(1);
+                        }else {
+                            activityList.add(2);
+                        }
+                    }
+                    if(activityDetailDto.getCategoryName().equals("1v2")){
+                        if(activityDetailDto.getCourseNum().intValue() == 20){
+                            activityList.add(3);
+                        }else {
+                            activityList.add(4);
+                        }
+                    }
+                }
+            }
+            return succeed(StringUtils.join(activityList,","));
+        }
+        return succeed("");
+    }
+
+    @ApiOperation(value = "获取活动方案")
+    @GetMapping("/get")
+    public HttpResponseResult<VipGroupActivity> get(Integer id){
+        VipGroupActivity vipGroupActivity = vipGroupActivityService.get(id);
+        SysUser user = sysUserService.getUser();
+        vipGroupActivity.setSinglePrice(vipGroupActivityService.getActivityPrice(vipGroupActivity,user.getOrganId(),new BigDecimal(1)));
+        Map<String, String> categoryMap = vipGroupCategoryDao.findConditionCategorys().stream().collect(Collectors.toMap(e-> e.getId().toString(), ConditionDto::getName));
+        vipGroupActivity.setVipGroupCategoryNames(categoryMap.get(vipGroupActivity.getVipGroupCategoryIdList()));
+        vipGroupActivity.setGiveCategoryName(categoryMap.get(vipGroupActivity.getGiveCategoryId()));
+        //如果是固定金额
+        if(vipGroupActivity.getFixedCourseNumFlag()){
+            vipGroupActivity.setDisplayPrice(vipGroupActivity.getMarketPrice());
+        }else {
+            vipGroupActivity.setDisplayPrice(vipGroupActivity.getSinglePrice().multiply(vipGroupActivity.getDiscount()).divide(new BigDecimal(100), 0, ROUND_UP));
+        }
+        vipGroupActivityService.setActivityType(vipGroupActivity);
+        return succeed(vipGroupActivity);
+    }
+
+    @ApiOperation(value = "根据课程类型获取对应课程活动方案")
+    @GetMapping("/findByVipGroupCategory")
+    public HttpResponseResult<List<VipGroupActivity>> findByVipGroupCategory(){
+        SysUser user = sysUserService.getUser();
+        ActivityQueryDto activityQueryDto = new ActivityQueryDto();
+        activityQueryDto.setStudentIds(user.getId().toString());
+        activityQueryDto.setCourseType(null);
+        activityQueryDto.setActivityChannel(3);
+        Student student = studentDao.get(user.getId());
+        Boolean isNewUser = student.getIsNewUser();
+        if(isNewUser){
+            activityQueryDto.setNewStudentNum(0);
+        }else {
+            activityQueryDto.setNewStudentNum(1);
+        }
+        if(student.getMemberRankSettingId() == null){
+            activityQueryDto.setMemberNum(1);
+        }else {
+            activityQueryDto.setMemberNum(0);
+        }
+        activityQueryDto.setOrganId(user.getOrganId().toString());
+        activityQueryDto.setEnable(true);
+        List<VipGroupActivity> vipGroupActivities = vipGroupActivityService.findByVipGroupCategory(activityQueryDto);
+        if(!CollectionUtils.isEmpty(vipGroupActivities)){
+            Map<String, String> categoryMap = vipGroupCategoryDao.findConditionCategorys().stream().collect(Collectors.toMap(e-> e.getId().toString(), ConditionDto::getName));
+            for (VipGroupActivity activity : vipGroupActivities) {
+                activity.setVipGroupCategoryNames(categoryMap.get(activity.getVipGroupCategoryIdList()));
+                activity.setGiveCategoryName(categoryMap.get(activity.getGiveCategoryId()));
+                //如果是固定金额
+                if(activity.getFixedCourseNumFlag()){
+                    activity.setDisplayPrice(activity.getMarketPrice());
+                }else {
+                    activity.setDisplayPrice(activity.getSinglePrice().multiply(activity.getDiscount()).divide(new BigDecimal(100), 0, ROUND_UP));
+                }
+                vipGroupActivityService.setActivityType(activity);
+            }
+        }
+        return succeed(vipGroupActivities);
+    }
+}

+ 27 - 0
mec-application/src/main/java/com/ym/mec/student/controller/ActivityUserMapperController.java

@@ -0,0 +1,27 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.service.ActivityUserMapperService;
+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.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;
+
+@RequestMapping("${app-config.url.student:}/activityUserMapper")
+@Api(tags = "活动排课服务")
+@RestController
+public class ActivityUserMapperController extends BaseController {
+
+    @Autowired
+    private ActivityUserMapperService activityUserMapperService;
+
+    @ApiOperation(value = "获取学员未排课信息")
+    @GetMapping("getStudentNoCourseInfo")
+    public HttpResponseResult getStudentNoCourseInfo() {
+        return succeed(activityUserMapperService.getStudentNoMapperInfo());
+    }
+
+}

+ 31 - 0
mec-application/src/main/java/com/ym/mec/student/controller/ChargeTypeController.java

@@ -0,0 +1,31 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.entity.ChargeType;
+import com.ym.mec.biz.service.ChargeTypeService;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.List;
+
+@RequestMapping("${app-config.url.student:}/chargeType")
+@Api(tags = "收费类型服务")
+@RestController
+public class ChargeTypeController extends BaseController {
+
+    @Autowired
+    private ChargeTypeService chargeTypeService;
+
+    @ApiOperation(value = "获取乐团收费类型")
+    @GetMapping("/findAll")
+    public HttpResponseResult<List<ChargeType>> findAll() {
+        return succeed(chargeTypeService.findAll(new HashMap<>()));
+    }
+
+}

+ 113 - 0
mec-application/src/main/java/com/ym/mec/student/controller/ChildrenDayController.java

@@ -0,0 +1,113 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dto.DegreeFeeDto;
+import com.ym.mec.biz.dal.dto.DegreePayDto;
+import com.ym.mec.biz.dal.entity.ChildrenDayDegreeDetail;
+import com.ym.mec.biz.dal.entity.ChildrenDayReserve;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.service.ChildrenDayDegreeDetailService;
+import com.ym.mec.biz.service.ChildrenDayReserveService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.util.date.DateUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+@RequestMapping("${app-config.url.student:}/childrenDay")
+@Api(tags = "6.1儿童节活动")
+@RestController
+public class ChildrenDayController extends BaseController {
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private ChildrenDayReserveService childrenDayReserveService;
+    @Autowired
+    private StudentDao studentDao;
+    @Autowired
+    private ChildrenDayDegreeDetailService childrenDayDegreeDetailService;
+    @Autowired
+    private SysConfigDao sysConfigDao;
+
+    @ApiOperation(value = "占位")
+    @PostMapping("/reserve")
+    public HttpResponseResult<ChildrenDayReserve> reserve() {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(user)) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        if (user.getOrganId().equals(43)) {
+            return failed("您不可参与该活动,请联系乐团主管");
+        }
+        return succeed(childrenDayReserveService.addReserve(user, YesOrNoEnum.YES));
+    }
+
+    @ApiOperation(value = "获取占位信息")
+    @GetMapping("/getReserve")
+    public HttpResponseResult<ChildrenDayReserve> getReserve() {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(user)) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(childrenDayReserveService.getUserReserve(user.getId()));
+    }
+
+
+    @ApiOperation(value = "获取考级相关的价格")
+    @GetMapping("/getFeeInfo")
+    public HttpResponseResult<DegreeFeeDto> getFeeInfo() {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(user)) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(childrenDayReserveService.getFeeInfo(user.getOrganId()));
+    }
+
+    @ApiOperation(value = "6.1考级支付")
+    @PostMapping("/pay")
+    public HttpResponseResult pay(@RequestBody DegreePayDto degreePayDto) throws Exception {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败,请重新登陆");
+        }
+        if (sysUser.getOrganId().equals(43) &&
+                (degreePayDto.getVip1v1() || degreePayDto.getVip1v2() || degreePayDto.getTheoryCourse())
+        ) {
+            return failed("您不可参与该活动,请联系乐团主管");
+        }
+        Date nowTime = new Date();
+        String endTimeStr = sysConfigDao.findConfigValue("children_day_end_time");
+        Date endTime = DateUtil.stringToDate(endTimeStr);
+        if (endTime.compareTo(nowTime) <= 0) {
+            throw new BizException("活动已结束,谢谢关注");
+        }
+        studentDao.lockUser(sysUser.getId());
+
+        degreePayDto.setUserId(sysUser.getId());
+        degreePayDto.setOrganId(sysUser.getOrganId());
+        degreePayDto.setUser(sysUser);
+        List<ChildrenDayDegreeDetail> ingDetails = childrenDayDegreeDetailService.getByUserIdAndStatus(sysUser.getId(), 1);
+        if (!degreePayDto.getRePay() && ingDetails.size() > 0) {
+            return failed(HttpStatus.CONTINUE, "您有待支付的订单");
+        }
+
+        Map payMap = childrenDayReserveService.pay(degreePayDto);
+        if (payMap.containsKey("tradeState")) {
+            return failed(HttpStatus.CREATED, payMap, "恭喜您,支付成功!");
+        }
+        return succeed(payMap);
+    }
+
+}

+ 55 - 0
mec-application/src/main/java/com/ym/mec/student/controller/ChildrenDayDegreeDetailController.java

@@ -0,0 +1,55 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dto.ChildrenDayDetailDto;
+import com.ym.mec.biz.dal.entity.ChildrenDayDegreeDetail;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.service.ChildrenDayDegreeDetailService;
+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.http.HttpStatus;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+
+@RequestMapping("${app-config.url.student:}/childrenDayDegreeDetail")
+@Api(tags = "6.1儿童节活动报名详情")
+@RestController
+public class ChildrenDayDegreeDetailController extends BaseController {
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private ChildrenDayDegreeDetailService childrenDayDegreeDetailService;
+    @Autowired
+    private StudentDao studentDao;
+
+    @ApiOperation(value = "获取用户已报名的详情,类型 1-专业考级 2-乐理考级 3-vip1v1,4-vip1v2 5-乐理课")
+    @GetMapping("/getUserDegreeInfo")
+    public HttpResponseResult<ChildrenDayDetailDto> getFeeInfo() {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(user)) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        List<ChildrenDayDegreeDetail> userDegreeInfo = childrenDayDegreeDetailService.getUserDegreeInfo(user.getId());
+        ChildrenDayDetailDto childrenDayDetailDto = new ChildrenDayDetailDto();
+        childrenDayDetailDto.setUser(user);
+        childrenDayDetailDto.setChildrenDayDegreeDetails(userDegreeInfo);
+        Student student = studentDao.get(user.getId());
+        if (student != null && StringUtils.isNotBlank(student.getSubjectIdList())) {
+            List<String> subjectIds = Arrays.asList(student.getSubjectIdList().split(","));
+            childrenDayDetailDto.setSubjectId(Integer.parseInt(subjectIds.get(0)));
+        }
+        return succeed(childrenDayDetailDto);
+    }
+
+}

+ 110 - 0
mec-application/src/main/java/com/ym/mec/student/controller/ClassGroupController.java

@@ -0,0 +1,110 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.ClassGroupDao;
+import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dto.HighClassGroupDto;
+import com.ym.mec.biz.dal.entity.ClassGroup;
+import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.service.ClassGroupService;
+import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+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 javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RequestMapping("${app-config.url.student:}/classGroup")
+@Api(tags = "班级服务")
+@RestController
+public class ClassGroupController extends BaseController {
+
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private ClassGroupService classGroupService;
+    @Autowired
+    private ClassGroupStudentMapperDao classGroupStudentMapperDao;
+    @Autowired
+    private StudentRegistrationService studentRegistrationService;
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+    @Autowired
+    private ClassGroupDao classGroupDao;
+
+    @ApiOperation(value = "基础提高班报名")
+    @PostMapping("/highReg")
+    @ApiImplicitParams({@ApiImplicitParam(name = "classGroupId", value = "班级id", required = true, dataType = "int")})
+    public HttpResponseResult highReg(Integer classGroupId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        ClassGroup classGroup = classGroupDao.lockClassGroup(classGroupId);
+        if (classGroup == null || (!classGroup.getType().equals(ClassGroupTypeEnum.HIGH) && !classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE)) || classGroup.getDelFlag().equals(1)) {
+            return failed("报名的班级不存在");
+        }
+        if (classGroup.getStudentNum().compareTo(classGroup.getExpectStudentNum()) >= 0) {
+            return failed("班级人数已满");
+        }
+        ClassGroupStudentMapper classGroupStudentMapper = classGroupStudentMapperDao.query(classGroupId, sysUser.getId());
+        if (classGroupStudentMapper != null) {
+            return succeed(classGroup);
+        }
+        classGroupService.addStudent(classGroup, sysUser.getId(), GroupType.MUSIC);
+        return succeed("报名成功");
+    }
+
+    @ApiOperation(value = "用户声部小班课列表")
+    @GetMapping("/highClassGroups")
+    @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团id", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "classGroupIds", value = "班级ids", required = true, dataType = "String")}
+    )
+    public HttpResponseResult getHighClassGroup(String musicGroupId,String classGroupIds) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        Integer userId = sysUser.getId();
+        StudentRegistration studentRegistration = studentRegistrationService.queryByUserIdAndMusicGroupId(userId, musicGroupId);
+        if (studentRegistration == null || studentRegistration.getActualSubjectId() == null) {
+            return failed("学生不在该乐团");
+        }
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        Map<String, Object> classGroupAndStatusMap = new HashMap<>();
+        List<HighClassGroupDto> highClassGroups = new ArrayList<>();
+        if (classGroupIds != null && !classGroupIds.isEmpty()) {
+            highClassGroups = classGroupDao.findHighClassGroupByTypeAndSubjectId(musicGroupId, studentRegistration.getActualSubjectId(), "HIGH",classGroupIds);
+            List<HighClassGroupDto> highOnlineClassGroup = classGroupDao.findHighClassGroupByTypeAndSubjectId(musicGroupId, studentRegistration.getActualSubjectId(), "HIGH_ONLINE",classGroupIds);
+            highClassGroups.addAll(highOnlineClassGroup);
+        } else {
+            highClassGroups = classGroupService.findClassGroupByMusicGroupIdAndSubjectId(musicGroupId, studentRegistration.getActualSubjectId());
+        }
+
+        List<ClassGroupStudentMapper> ClassGroupStudentMapper = classGroupStudentMapperDao.findHighClassGroupHasUser(musicGroupId, userId, ClassGroupTypeEnum.HIGH);
+        List<ClassGroupStudentMapper> highOnlineClassGroupStudentMapper = classGroupStudentMapperDao.findHighClassGroupHasUser(musicGroupId, userId, ClassGroupTypeEnum.HIGH_ONLINE);
+        classGroupAndStatusMap.put("highClassGroups", highClassGroups);
+        classGroupAndStatusMap.put("hasReg", false);
+        classGroupAndStatusMap.put("onlineHasReg", false);
+        if (ClassGroupStudentMapper.size() > 0) {
+            classGroupAndStatusMap.put("hasReg", true);
+        }
+        if (highOnlineClassGroupStudentMapper.size() > 0) {
+            classGroupAndStatusMap.put("onlineHasReg", true);
+        }
+        return succeed(classGroupAndStatusMap);
+    }
+}

+ 50 - 0
mec-application/src/main/java/com/ym/mec/student/controller/CloudCoachPaymentProgramController.java

@@ -0,0 +1,50 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.CloudCoachPaymentProgram;
+import com.ym.mec.biz.dal.entity.MemberRankSetting;
+import com.ym.mec.biz.dal.entity.StudentCloudCoachPaymentDetails;
+import com.ym.mec.biz.service.CloudCoachPaymentProgramService;
+import com.ym.mec.biz.service.MemberRankSettingService;
+import com.ym.mec.biz.service.StudentCloudCoachPaymentDetailsService;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Api(tags = "团练宝缴费项目")
+@RequestMapping("${app-config.url.student:}/cloudCoachPaymentProgram")
+@RestController
+public class CloudCoachPaymentProgramController extends BaseController {
+
+    @Autowired
+    private CloudCoachPaymentProgramService cloudCoachPaymentProgramService;
+    @Autowired
+    private MemberRankSettingService memberRankSettingService;
+    @Autowired
+    private StudentCloudCoachPaymentDetailsService studentCloudCoachPaymentDetailsService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "获取明细")
+    @PostMapping("/get")
+    public Object get(Long id){
+        CloudCoachPaymentProgram cloudCoachPaymentProgram = cloudCoachPaymentProgramService.get(id);
+        if(cloudCoachPaymentProgram == null){
+            throw new BizException("云教练缴费项目不存在,请联系指导老师");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        StudentCloudCoachPaymentDetails studentCloudCoachPaymentDetails = studentCloudCoachPaymentDetailsService.findByUserId(id, sysUser.getId());
+        if(studentCloudCoachPaymentDetails == null){
+            throw new BizException("您不在当前云教练缴费项目中,请联系指导老师");
+        }
+        MemberRankSetting memberRankSetting = memberRankSettingService.get(cloudCoachPaymentProgram.getMemberRankSettingId());
+        cloudCoachPaymentProgram.setMemberIntro(memberRankSetting.getIntro());
+        return succeed(cloudCoachPaymentProgram);
+    }
+}

+ 46 - 0
mec-application/src/main/java/com/ym/mec/student/controller/CloudStudyController.java

@@ -0,0 +1,46 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.page.SysMusicCompareRecordQueryInfo;
+import com.ym.mec.biz.service.SysMusicCompareRecordService;
+import com.ym.mec.biz.service.SysUserService;
+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.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;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/11 0011
+ */
+@Api("云教练")
+@RestController
+@RequestMapping("${app-config.url.student:}/cloudStudy")
+public class CloudStudyController extends BaseController {
+
+    @Autowired
+    private SysUserService sysUserService;
+    @Autowired
+    private SysMusicCompareRecordService sysMusicCompareRecordService;
+
+    @ApiOperation("云教练排行榜")
+    @GetMapping("rankingList")
+    public HttpResponseResult rankingList(SysMusicCompareRecordQueryInfo queryInfo){
+        SysUser sysUser = sysUserService.getUser();
+        queryInfo.setUserId(sysUser.getId());
+        queryInfo.setOrganId(sysUser.getOrganId());
+        return succeed(sysMusicCompareRecordService.rankingList(queryInfo));
+    }
+
+    @ApiOperation("学员训练数据统计")
+    @GetMapping("studentTrainData")
+    public HttpResponseResult studentTrainData(SysMusicCompareRecordQueryInfo queryInfo){
+        queryInfo.setUserId(sysUserService.getUserId());
+        return succeed(sysMusicCompareRecordService.studentTrainData(queryInfo));
+    }
+
+}

+ 125 - 0
mec-application/src/main/java/com/ym/mec/student/controller/ContractsController.java

@@ -0,0 +1,125 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.SysUserContracts;
+import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
+import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+import com.ym.mec.biz.service.ContractService;
+import com.ym.mec.biz.service.SysUserContractsService;
+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.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.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@RequestMapping("${app-config.url.student:}/contracts")
+@Api(tags = "协议服务")
+@RestController
+public class ContractsController extends BaseController {
+
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+	@Autowired
+	private ContractService contractService;
+
+	@Autowired
+	private SysUserContractsService sysUserContractsService;
+
+	@ApiOperation("查询注册协议")
+	@GetMapping(value = "queryRegisterContract")
+	public Object queryRegisterContract() {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("获取用户信息失败");
+		}
+		return succeed(contractService.queryRegisterContract(sysUser.getId()));
+	}
+
+	@ApiOperation("查询商品协议")
+	@GetMapping(value = "queryGoodsContract")
+	public Object queryGoodsContract(String musicGroupId, String goodsIds, KitGroupPurchaseTypeEnum kitGroupPurchaseTypeEnum) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("获取用户信息失败");
+		}
+		return succeed(contractService.queryGoodsContract(sysUser.getId(), musicGroupId, goodsIds, kitGroupPurchaseTypeEnum));
+	}
+
+	@ApiOperation("查询乐团课程协议")
+	@GetMapping(value = "queryMusicGroupCoursesContract")
+	public Object queryMusicGroupCoursesContract(String musicGroupId) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("获取用户信息失败");
+		}
+		return succeed(contractService.queryMusicGroupCoursesContract(sysUser.getId(), musicGroupId));
+	}
+
+	@ApiOperation("查询VIP课程协议")
+	@GetMapping(value = "queryVipGroupCoursesContract")
+	public Object queryVipGroupCoursesContract(Long vipGroupId) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("获取用户信息失败");
+		}
+		return succeed(contractService.queryVipGroupCoursesContract(sysUser.getId(), vipGroupId));
+	}
+
+	@ApiOperation("查询陪练课课程协议")
+	@GetMapping(value = "queryPracticeCoursesContract")
+	public Object queryPracticeCoursesContract(int courseSectionNum, Date startDate, Date endDate, BigDecimal fee) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("获取用户信息失败");
+		}
+		return succeed(contractService.queryPracticeCoursesContract(sysUser.getId(), courseSectionNum, startDate, endDate, fee));
+	}
+
+	@ApiOperation("查询产品协议")
+	@GetMapping(value = "queryProduceContract")
+	public Object queryProduceContract(Integer userId, String musicGroupId, String orderType) {
+		if(Objects.isNull(userId)){
+			SysUser sysUser = sysUserFeignService.queryUserInfo();
+			if (sysUser == null) {
+				return failed("获取用户信息失败");
+			}
+			userId = sysUser.getId();
+		}
+		OrderTypeEnum type = OrderTypeEnum.get(orderType);
+		return succeed(contractService.queryProductContract(userId,musicGroupId, type));
+	}
+
+	@ApiOperation(value = "查询学生最新协议")
+	@GetMapping("/getLatest")
+	public HttpResponseResult<SysUserContracts> getLatest(Integer userId) {
+		if(Objects.isNull(userId)){
+			SysUser sysUser = sysUserFeignService.queryUserInfo();
+			if (sysUser == null) {
+				return failed("获取用户信息失败");
+			}
+			userId = sysUser.getId();
+		}
+		List<SysUserContracts> sysUserContracts = sysUserContractsService.getUserAllContracts(userId);
+
+		if(sysUserContracts == null || sysUserContracts.size() == 0){
+			return succeed();
+		}
+		
+		sysUserContracts = sysUserContracts.stream().sorted(Comparator.comparing(SysUserContracts::getCreateTime).reversed()).collect(Collectors.toList());
+
+
+		return succeed(sysUserContracts.get(0));
+	}
+}

+ 100 - 0
mec-application/src/main/java/com/ym/mec/student/controller/CourseController.java

@@ -0,0 +1,100 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.page.CourseDetailQueryInfo;
+import com.ym.mec.biz.dal.page.ImGroupNoticeQueryInfo;
+import com.ym.mec.biz.dal.page.StudentPayLogQueryInfo;
+import com.ym.mec.biz.service.ClassGroupService;
+import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.biz.service.ImGroupNoticeService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.entity.ImGroupModel;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import jodd.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RequestMapping("${app-config.url.student:}/course")
+@Api(tags = "课程服务")
+@RestController
+public class CourseController extends BaseController {
+
+    @Autowired
+    private ClassGroupService classGroupService;
+    @Autowired
+    private SysUserService sysUserService;
+    @Autowired
+    private ImGroupNoticeService imGroupNoticeService;
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
+
+    @Autowired
+    private CourseScheduleService courseScheduleService;
+
+    @ApiOperation("获取学生所购买课程列表")
+    @GetMapping(value = "/queryUserMusicGroups")
+    public HttpResponseResult<PageInfo<CourseListDto>> queryCoursePage(UserMusicGroupQueryInfo queryInfo){
+        return succeed(classGroupService.queryCoursePage(queryInfo,sysUserService.getUserId()));
+    }
+
+    @ApiOperation("获取学生所购买课程列表")
+    @GetMapping(value = "/queryRemainCourseNum")
+    public HttpResponseResult<Integer> queryRemainCourseNum(){
+        List<StudentCourseInfoDto> list = courseScheduleDao.findUserSurplusCourseInfoByGroup(null, null, sysUserService.getUserId());
+        if(list == null){
+        	return succeed(0);
+        }
+        return succeed(list.size());
+    }
+
+    @ApiOperation("获取学员所有聊天群组")
+    @GetMapping(value = "/queryUserGroups")
+    public HttpResponseResult<List<ImGroupModel>> queryUserGroups(String search){
+        return succeed(classGroupService.queryUserGroups(sysUserService.getUserId(),search));
+    }
+
+    @ApiOperation(value = "获取最新一条群公告")
+    @RequestMapping("/getNewNotice")
+    public HttpResponseResult<ImGroupNoticeDto> getNewNotice(String groupId) {
+        return succeed(imGroupNoticeService.queryLatestNotice(groupId));
+    }
+
+    @ApiOperation(value = "获取群公告列表")
+    @RequestMapping("/queryNoticePage")
+    public HttpResponseResult<PageInfo<ImGroupNoticeDto>> queryPage(ImGroupNoticeQueryInfo queryInfo) {
+        return succeed(imGroupNoticeService.queryPage(queryInfo));
+    }
+
+    @ApiOperation(value = "根据群编号,获取群组基本信息")
+    @GetMapping("/findGroupById")
+    public HttpResponseResult<? extends Object> findGroupById(String groupId){
+        if(StringUtil.isEmpty(groupId)){
+            return failed("参数校验错误");
+        }
+        if (groupId.contains("S") || groupId.contains("I")){
+            groupId = groupId.substring(1);
+        }
+        return succeed(classGroupService.findGroupById(Integer.parseInt(groupId)));
+    }
+
+    @ApiOperation(value = "分页获取学员购买记录")
+    @PostMapping("/queryStudentPayLog")
+    public HttpResponseResult<PageInfo<StudentPayInfoDto>> queryStudentPayLog(StudentPayLogQueryInfo studentPayLogQueryInfo){
+        studentPayLogQueryInfo.setUserId(sysUserService.getUserId());
+        return succeed(classGroupService.queryStudentPayLog(studentPayLogQueryInfo));
+    }
+
+    @ApiOperation(value = "根据课程组编号,获取课程列表")
+    @PostMapping("/queryDetailList")
+    public HttpResponseResult<List<CourseScheduleStudentDto>> queryDetailList(@RequestBody CourseDetailQueryInfo courseDetailQueryInfo){
+        courseDetailQueryInfo.setUserId(sysUserService.getUserId());
+        return succeed(courseScheduleService.queryDetailList(courseDetailQueryInfo));
+    }
+}

+ 49 - 0
mec-application/src/main/java/com/ym/mec/student/controller/CourseGroupController.java

@@ -0,0 +1,49 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.service.CoursesGroupService;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+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.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/3/8
+ */
+@Api(tags = "对外课程组服务")
+@RequestMapping("${app-config.url.student:}/courseGroup")
+@RestController
+public class CourseGroupController extends BaseController {
+
+    @Autowired
+    private CoursesGroupService coursesGroupService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "获取课程组详情")
+    @GetMapping("/getGroupDetail")
+    public HttpResponseResult getGroupDetail(Long groupId){
+        return succeed(coursesGroupService.getGroupDetail(groupId));
+    }
+
+    @ApiOperation(value = "购买课程组")
+    @PostMapping("/buyCourseGroup")
+    public HttpResponseResult buyCourseGroup(Long courseGroupId, boolean isUseBalancePayment) throws Exception {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(sysUser)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        return coursesGroupService.buyCourseGroup(sysUser.getId(), courseGroupId, isUseBalancePayment);
+    }
+
+}

+ 44 - 0
mec-application/src/main/java/com/ym/mec/student/controller/CourseReviewController.java

@@ -0,0 +1,44 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.service.CourseReviewService;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequestMapping("${app-config.url.student:}/courseReview")
+@Api(tags = "课程评价")
+@RestController
+public class CourseReviewController extends BaseController {
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private CourseReviewService courseReviewService;
+
+
+    @ApiOperation(value = "评论详情")
+    @GetMapping("getReviewInfo")
+    public HttpResponseResult getReviewInfo(int id) {
+        return succeed(courseReviewService.getReviewInfo(id));
+    }
+
+    @ApiOperation(value = "获取老师评价和学生评价")
+    @GetMapping("getStuAndTeaReviewInfo")
+    public HttpResponseResult getStuAndTeaReviewInfo(Long courseScheduleId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(courseReviewService.getStuAndTeaReviewInfo(courseScheduleId,sysUser.getId()));
+    }
+
+}

+ 183 - 0
mec-application/src/main/java/com/ym/mec/student/controller/DegreeController.java

@@ -0,0 +1,183 @@
+package com.ym.mec.student.controller;
+
+
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dao.SysAreaDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dto.DegreeRegistrationActivityDto;
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.biz.dal.entity.SysArea;
+import com.ym.mec.biz.dal.enums.SporadicChargeTypeEnum;
+import com.ym.mec.biz.dal.page.SporadicChargeInfoQueryInfo;
+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.tenant.TenantContextHolder;
+import com.ym.mec.util.idcard.IdcardValidator;
+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.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@RequestMapping("${app-config.url.student:}/degree")
+@Api(tags = "考级报名服务")
+@RestController
+public class DegreeController extends BaseController {
+
+    @Autowired
+    private DegreeRegistrationService degreeRegistrationService;
+
+    @Autowired
+    private SporadicChargeInfoService sporadicChargeInfoService;
+
+    @Autowired
+    private SysUserService sysUserService;
+
+    @Autowired
+    private TeacherDao teacherDao;
+
+    @Autowired
+    private SysTenantConfigService sysTenantConfigService;
+
+    @Autowired
+    private SysConfigDao sysConfigDao;
+
+    @Autowired
+    private OrganizationDao organizationDao;
+
+    @Autowired
+    private SysAreaDao sysAreaDao;
+
+	@Value("${message.debugMode: false}")
+	private boolean debugMode;
+
+    @ApiOperation(value = "考级报名支付")
+    @PostMapping("/pay")
+    public HttpResponseResult pay(@RequestBody DegreeRegistrationActivityDto degreeRegistration) throws Exception {
+        if(degreeRegistration.getOrganId() == null){
+            return failed(HttpStatus.CHECKPOINT,"暂未开放此活动");
+        }
+        SysUser user = sysUserService.getUser();
+        TenantContextHolder.setTenantId(user.getTenantId());
+        HttpResponseResult result = degreeRegistrationService.check(degreeRegistration,user);
+        if(result.getCode() != 200){
+            return result;
+        }
+        degreeRegistration.setUserId(user.getId());
+        if("IDENTITY".equals(degreeRegistration.getCertificateType())){
+	        IdcardValidator idcardValidator = new IdcardValidator();
+	        if (!debugMode && !idcardValidator.isValidatedAllIdcard(degreeRegistration.getIdcard())) {
+                return BaseController.failed(HttpStatus.CHECKPOINT,"身份证号不正确,请核对");
+	        }
+        }
+        if(user.getOrganId() == null || user.getOrganId() == 43){
+            user.setUsername(degreeRegistration.getName());
+            user.setIdCardNo(degreeRegistration.getIdcard());
+            user.setOrganId(degreeRegistration.getOrganId());
+            teacherDao.updateUser(user);
+        }
+        HttpResponseResult pay = degreeRegistrationService.pay(degreeRegistration);
+        TenantContextHolder.clearTenantId();
+        return pay;
+    }
+
+    @ApiOperation(value = "考级报名检查")
+    @PostMapping("/check")
+    public HttpResponseResult check(@RequestBody DegreeRegistrationActivityDto degreeRegistration) {
+        return degreeRegistrationService.check(degreeRegistration,sysUserService.getUser());
+    }
+
+    @ApiOperation(value = "查询收费列表")
+    @GetMapping("/queryList")
+    public HttpResponseResult queryPage(SporadicChargeInfoQueryInfo queryInfo) {
+        queryInfo.setOrganId("42");
+        queryInfo.setChargeType(SporadicChargeTypeEnum.LEVEL);
+        queryInfo.setRows(99);
+        queryInfo.setOpenFlag(0);
+        queryInfo.setSort("amount_");
+        queryInfo.setOrder("ASC");
+        return succeed(sporadicChargeInfoService.queryDetailPage(queryInfo));
+    }
+
+    @ApiOperation(value = "获取活动参数")
+    @GetMapping("/getParams")
+    public HttpResponseResult getParams(){
+        SysUser user = sysUserService.getUser();
+        SporadicChargeInfoQueryInfo queryInfo = new SporadicChargeInfoQueryInfo();
+        queryInfo.setOrganId("42");
+        queryInfo.setChargeType(SporadicChargeTypeEnum.LEVEL);
+        queryInfo.setRows(99);
+        queryInfo.setOpenFlag(0);
+        queryInfo.setSort("amount_");
+        queryInfo.setOrder("ASC");
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("userInfo", user);
+        Organization organization = organizationDao.get(user.getOrganId());
+        if(!Objects.isNull(organization)){
+            SysArea area = sysAreaDao.get(organization.getAreaId());
+            if(Objects.nonNull(area)){
+                result.put("city", area.getName());
+                SysArea parentArea = sysAreaDao.get(area.getParentOrganId());
+                if(Objects.nonNull(parentArea)){
+                    result.put("province", parentArea.getName());
+                }
+            }
+        }
+        result.put("degreeTheoryAmountConfig", sysConfigDao.findConfigValue("degree_theory_amount_config"));
+
+//        Student student = studentDao.get(user.getId());
+        //result.put("isNewUser", student.getIsNewUser());
+
+        String configValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.DEGREE_SUPPORT_ORGAN_LIST, user.getTenantId());
+        if(StringUtils.isNotEmpty(configValue)){
+            List<Integer> userIds = Arrays.stream(configValue.split(",")).mapToInt(Integer::valueOf).boxed().collect(Collectors.toList());
+            result.put("organs", organizationDao.findOrgans(userIds));
+        }
+        result.put("sporadicChargeInfo", sporadicChargeInfoService.queryDetailPage(queryInfo));
+
+//        List<DegreeRegistration> userLevelDegrees = degreeRegistrationDao.getUserLevelDegrees(user.getId(), DegreeRegistrationService.ACTIVITY_TAG,2);
+//        long levelNum = userLevelDegrees.stream().filter(d -> Objects.nonNull(d.getSporadicId())&&d.getStatus().equals(2)).count();
+//        long theoryLevelNum = userLevelDegrees.stream().filter(d -> StringUtils.isNotBlank(d.getTheoryLevel())&&d.getStatus().equals(2)).count();
+
+//        result.put("levelApplied", levelNum>0?1:0);
+//        result.put("theoryLevelApplied", theoryLevelNum>0?1:0);
+
+//        List<StudentPaymentOrderDetail> historyOrderDetails = studentPaymentOrderDetailDao.getWithUserAndOrderType(user.getId(), OrderTypeEnum.DEGREE_REGISTRATION);
+//        int historyVipNum = 0, historyPracticeNum = 0, historyHighNum = 0;
+//        for (StudentPaymentOrderDetail historyOrderDetail : historyOrderDetails) {
+//            if(StringUtils.isBlank(historyOrderDetail.getGoodsIdList())){
+//                continue;
+//            }
+//            Map<String, Integer> courseNumMap = JSON.parseObject(historyOrderDetail.getGoodsIdList(), Map.class);
+//            for (Map.Entry<String, Integer> stringIntegerEntry : courseNumMap.entrySet()) {
+//                switch (stringIntegerEntry.getKey()){
+//                    case "VIP":
+//                        historyVipNum = historyVipNum + stringIntegerEntry.getValue();
+//                        break;
+//                    case "PRACTICE":
+//                        historyPracticeNum = historyPracticeNum + stringIntegerEntry.getValue();
+//                        break;
+//                    case "HIGH":
+//                        historyHighNum = historyHighNum + stringIntegerEntry.getValue();
+//                        break;
+//                }
+//            }
+//        }
+//        Map<String, Integer> historyCourseInfo = new HashMap<>();
+//        historyCourseInfo.put(CourseSchedule.CourseScheduleType.VIP.getCode(), historyVipNum);
+//        historyCourseInfo.put(CourseSchedule.CourseScheduleType.PRACTICE.getCode(), historyPracticeNum);
+//        historyCourseInfo.put(CourseSchedule.CourseScheduleType.HIGH.getCode(), historyHighNum);
+//        result.put("historyCourseInfo", historyCourseInfo);
+
+        return succeed(result);
+    }
+}

+ 44 - 0
mec-application/src/main/java/com/ym/mec/student/controller/ExtracurricularExercisesMessageController.java

@@ -0,0 +1,44 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.ExtracurricularExercisesMessage;
+import com.ym.mec.biz.service.ExtracurricularExercisesMessageService;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/3/26
+ */
+@Api(tags = "课外训练评论服务")
+@RequestMapping("${app-config.url.student:}/extracurricularExercisesMessage")
+@RestController
+public class ExtracurricularExercisesMessageController extends BaseController {
+
+    @Autowired
+    private ExtracurricularExercisesMessageService extracurricularExercisesMessageService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "添加学生作业评论")
+    @GetMapping("/addStudentExtraExerciseComment")
+    public HttpResponseResult addStudentExtraExerciseComment(ExtracurricularExercisesMessage extracurricularExercisesMessage){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        extracurricularExercisesMessage.setUserId(sysUser.getId());
+        extracurricularExercisesMessage.setRole("STUDENT");
+        extracurricularExercisesMessageService.addStudentExtraExerciseComment(extracurricularExercisesMessage);
+        return succeed();
+    }
+
+}

+ 68 - 0
mec-application/src/main/java/com/ym/mec/student/controller/ExtracurricularExercisesReplyController.java

@@ -0,0 +1,68 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.dto.StudentHomeworkRecordDto;
+import com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply;
+import com.ym.mec.biz.dal.page.ExtraExercilseQueryInfo;
+import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import com.yonge.log.model.AuditLogAnnotation;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/3/26
+ */
+@Api(tags = "课外训练服务")
+@RequestMapping("${app-config.url.student:}/extracurricularExercisesReply")
+@RestController
+public class ExtracurricularExercisesReplyController extends BaseController {
+
+    @Autowired
+    private SysUserService sysUserService;
+    @Autowired
+    private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
+
+    @ApiOperation(value = "获取学生的课外训练列表")
+    @GetMapping("/findStudentExtraExercises")
+    public HttpResponseResult findStudentExtraExercises(ExtraExercilseQueryInfo queryInfo){
+        queryInfo.setStudentId(sysUserService.getUserId());
+        return succeed(extracurricularExercisesReplyService.findStudentExtraExercises(queryInfo));
+    }
+
+    @ApiOperation(value = "获取学生的课外训练列表")
+    @GetMapping("/findStudentExtraExercises/v2")
+    public HttpResponseResult<PageInfo<StudentHomeworkRecordDto>> findStudentExtraExercisesV2(ExtraExercilseQueryInfo queryInfo){
+        queryInfo.setStudentId(sysUserService.getUserId());
+        return succeed(extracurricularExercisesReplyService.findStudentExtraExercisesV2(queryInfo));
+    }
+
+
+    @ApiOperation(value = "获取课外训练学生")
+    @GetMapping("/findExtraExerciseStudents")
+    public HttpResponseResult findExtraExerciseStudents(Long extraExerciseId,String studentName){
+        return succeed(extracurricularExercisesReplyService.findExtraExerciseStudents(extraExerciseId,studentName));
+    }
+
+    @ApiOperation(value = "获取课外训练详情")
+    @GetMapping("/findStudentExtraExerciseDetail")
+    public HttpResponseResult findStudentExtraExerciseDetail(Long studentExerciseId){
+        return succeed(extracurricularExercisesReplyService.findStudentExtraExerciseDetail(studentExerciseId));
+    }
+
+    @ApiOperation(value = "提交课外训练作业")
+    @GetMapping("/submitExtraExercise")
+    @AuditLogAnnotation(operateName = "提交课外训练作业")
+    public HttpResponseResult submitExtraExercise(ExtracurricularExercisesReply extracurricularExercisesReply){
+        extracurricularExercisesReplyService.submitExtraExercise(extracurricularExercisesReply);
+        return succeed();
+    }
+
+}

+ 68 - 0
mec-application/src/main/java/com/ym/mec/student/controller/GoodsController.java

@@ -0,0 +1,68 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.Goods;
+import com.ym.mec.biz.dal.entity.GoodsCategory;
+import com.ym.mec.biz.dal.page.GoodsQuery;
+import com.ym.mec.biz.dal.page.GoodsQueryInfo;
+import com.ym.mec.biz.service.GoodsCategoryService;
+import com.ym.mec.biz.service.GoodsService;
+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 io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+
+import java.util.Objects;
+
+@RequestMapping("${app-config.url.student:}/goods")
+@Api(tags = "商品(教材、辅件)服务")
+@RestController
+public class GoodsController extends BaseController {
+
+    @Autowired
+    private GoodsService goodsService;
+    @Autowired
+    private GoodsCategoryService goodsCategoryService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "根据商品(教材、辅件)编号查询商品(教材、辅件)")
+    @GetMapping("/get/{id}")
+    public Object get(@ApiParam(value = "商品(教材、辅件)编号", required = true) @PathVariable("id") Integer id){
+        Goods goods = goodsService.get(id);
+        GoodsCategory goodsCategory = goodsCategoryService.get(goods.getGoodsCategoryId());
+        if(Objects.nonNull(goodsCategory)){
+            goods.setGoodsCategoryName(goodsCategory.getName());
+        }
+        return succeed(goods);
+    }
+
+    @ApiOperation(value = "分页查询商品(教材、辅件)列表")
+    @GetMapping("/queryPage")
+    public Object queryPage(GoodsQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            throw new BizException("请先登录");
+        }
+        queryInfo.setStudentShowOrganId(sysUser.getOrganId().toString());
+        return succeed(goodsService.queryPage(queryInfo));
+    }
+
+    @ApiOperation(value = "通过科目编号、商品分类 查询商品(教材、辅件)列表")
+    @GetMapping("/queryGoodsBySubId")
+    public Object findGoodsBySubId(GoodsQuery goodsQuery){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            throw new BizException("请先登录");
+        }
+        goodsQuery.setStudentShowOrganId(sysUser.getOrganId());
+        return succeed(goodsService.findGoodsBySubId(goodsQuery));
+    }
+}

+ 188 - 0
mec-application/src/main/java/com/ym/mec/student/controller/ImGroupController.java

@@ -0,0 +1,188 @@
+package com.ym.mec.student.controller;
+
+import com.google.common.collect.Lists;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.ImUserFriendDto;
+import com.ym.mec.biz.dal.entity.ImGroup;
+import com.ym.mec.biz.dal.page.ImGroupNoticeQueryInfo;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.vo.ImUserWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+
+import java.util.List;
+
+@RequestMapping("${app-config.url.student:}/imGroup")
+@Api(tags = "IM群服务")
+@RestController
+public class ImGroupController extends BaseController {
+
+	@Autowired
+	private ImGroupService imGroupService;
+
+	@Autowired
+	private ImUserFriendService imUserFriendService;
+
+	@Autowired
+	private ImGroupNoticeService imGroupNoticeService;
+
+	@Autowired
+	private ImGroupMemberService imGroupMemberService;
+
+	@Autowired
+	private SysUserService sysUserService;
+
+	@ApiOperation("查询群列表")
+	@GetMapping(value = "/queryGroupList")
+	public Object queryGroupList(String search,String groupType) {
+		return succeed(imGroupService.queryByUserId(sysUserService.getUserId(), search,groupType));
+	}
+
+	@ApiOperation("查询群详情")
+	@GetMapping(value = "/queryGroupDetail")
+	public Object queryGroupDetail(String imGroupId) {
+		if (imGroupId.contains("S") || imGroupId.contains("I")){
+			imGroupId = imGroupId.substring(1);
+		}
+		return succeed(imGroupService.get(imGroupId));
+	}
+
+	@ApiOperation("查询群详情(重构版)")
+	@ApiImplicitParams({
+		@ApiImplicitParam(name = "groupId", value = "群编号", required = true, dataType = "String")
+	})
+	@GetMapping(value = "/getDetail/{groupId}")
+	public HttpResponseResult<ImGroup> groupDetail(@PathVariable("groupId") String imGroupId) {
+		if (imGroupId.contains("S") || imGroupId.contains("I")){
+			imGroupId = imGroupId.substring(1);
+		}
+		return succeed(imGroupService.get(imGroupId));
+	}
+
+	@ApiOperation("查询群成员列表")
+	@GetMapping(value = "/queryGroupMemberList")
+	public Object queryGroupMemberList(String imGroupId) {
+
+		return succeed(imGroupService.queryMemberById(imGroupId));
+	}
+
+	@ApiOperation("查询群成员详情")
+	@GetMapping(value = "/queryGroupMemberDetail")
+	public Object queryGroupMemberDetail(String imGroupId, Integer userId) {
+
+		return succeed(imGroupService.queryMember(imGroupId, userId));
+	}
+
+	@ApiOperation("查询好友详情")
+	@GetMapping(value = "/queryFriendDetail")
+	public Object queryFriendDetail(Integer userId) {
+		ImUserFriendDto dto = imUserFriendService.queryFriendDetail(sysUserService.getUserId(), userId);
+		if (dto == null) {
+			dto = new ImUserFriendDto();
+			SysUser user = sysUserService.queryUserById(userId);
+			dto.setFriend(user);
+			if (user.getUserType().contains("STUDENT") || user.getUserType().contains("SCHOOL")) {
+				dto.setFriendNickname(user.getUsername());
+			} else {
+				dto.setFriendNickname(user.getRealName());
+			}
+			dto.setFriendId(userId);
+		}
+		return succeed(dto);
+	}
+
+	@ApiOperation("查询好友详情(重构版)")
+	@ApiImplicitParams({
+		@ApiImplicitParam(name = "userId", value = "用户编号", required = true, dataType = "Integer")
+	})
+	@GetMapping(value = "/imUserFriend/getDetail/{userId}")
+	public HttpResponseResult<ImUserWrapper.ImUserFriend> getImUserFriendDetail(@PathVariable("userId") Integer userId) {
+		ImUserFriendDto dto = imUserFriendService.queryFriendDetail(sysUserService.getUserId(), userId);
+		if (dto == null) {
+			dto = new ImUserFriendDto();
+			SysUser user = sysUserService.queryUserById(userId);
+			dto.setFriend(user);
+			if (user.getUserType().contains("STUDENT") || user.getUserType().contains("SCHOOL")) {
+				dto.setFriendNickname(user.getUsername());
+			} else {
+				dto.setFriendNickname(user.getRealName());
+			}
+			dto.setFriendId(userId);
+		}
+
+		// 返回数据结构封装
+		ImUserWrapper.ImUserFriend userFriend = ImUserWrapper.ImUserFriend.builder()
+			.id(dto.getId())
+			.userId(dto.getUserId().longValue())
+			.friendId(dto.getFriendId().longValue())
+			.friendAvatar(dto.getFriend().getAvatar())
+			.friendNickname(dto.getFriendNickname())
+			.memo(dto.getMemo())
+			.updateTime(dto.getUpdateTime())
+			.createTime(dto.getCreateTime())
+			.roleType(dto.getRoleType())
+			.friendType(dto.getRoleType())
+			.build();
+		return succeed(userFriend);
+	}
+
+	@ApiOperation("查询好友列表")
+	@GetMapping(value = "/queryFriendList")
+	public Object queryFriendList(String search) {
+		return succeed(imUserFriendService.queryFriendListByUserId(sysUserService.getUserId(), search));
+	}
+
+	@ApiOperation("查询好友列表(重构版)")
+	@GetMapping(value = "/imUserFriend/queryAll")
+	public HttpResponseResult<List<ImUserWrapper.ImUserFriend>> queryImUserFriendList(String search) {
+
+		// 好友关系列表
+		List<ImUserFriendDto> friendDtos = imUserFriendService.queryFriendListByUserId(sysUserService.getUserId(), search);
+
+		List<ImUserWrapper.ImUserFriend> wrappers = Lists.newArrayList();
+		if (CollectionUtils.isNotEmpty(friendDtos)) {
+
+			// 封装返回数据结构
+			for (ImUserFriendDto item : friendDtos) {
+
+				wrappers.add(ImUserWrapper.ImUserFriend.builder()
+					.id(item.getId())
+					.userId(item.getUserId().longValue())
+					.friendId(item.getFriendId().longValue())
+					.friendAvatar(item.getFriend().getAvatar())
+					.friendNickname(item.getFriendNickname())
+					.memo(item.getMemo())
+					.roleType(item.getRoleType())
+					.friendType(item.getRoleType())
+					.updateTime(item.getUpdateTime())
+					.createTime(item.getCreateTime())
+					.build());
+			}
+		}
+
+		return succeed(wrappers);
+	}
+
+	@ApiOperation("查询群公告列表")
+	@GetMapping(value = "/queryNoticeList")
+	public Object queryNoticeList(ImGroupNoticeQueryInfo queryInfo) {
+		return succeed(imGroupNoticeService.queryPage(queryInfo));
+	}
+
+	@ApiOperation("入群")
+	@GetMapping(value = "/addGroupMember")
+	@ApiImplicitParam(name = "imGroupId", value = "群编号", required = true, dataType = "String")
+	public Object addGroupMember(String imGroupId) {
+		return succeed(imGroupMemberService.join(imGroupId,sysUserService.getUserId(),"",false));
+	}
+}

+ 76 - 0
mec-application/src/main/java/com/ym/mec/student/controller/ImLiveBroadcastRoomController.java

@@ -0,0 +1,76 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
+import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.entity.ImUserState;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 直播房间管理表(ImLiveBroadcastRoom)表控制层
+ *
+ * @author hgw
+ * @since 2022-02-17 20:52:04
+ */
+@Api(tags = "直播房间管理表")
+@RestController
+@RequestMapping("${app-config.url.student:}/imLiveBroadcastRoom")
+public class ImLiveBroadcastRoomController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
+
+    @ApiOperation("学生端-查询房间信息")
+    @GetMapping("/queryRoomInfo")
+    public HttpResponseResult<ImLiveBroadcastRoomVo> queryRoomInfo(@ApiParam(value = "房间uid", required = true) String roomUid) {
+        return succeed(imLiveBroadcastRoomService.queryRoomInfo(roomUid));
+    }
+
+    @ApiOperation("查询该机构目前推广的直播间")
+    @GetMapping(value = "/queryPopularizeRoom")
+    public HttpResponseResult<ImLiveBroadcastRoomVo> queryPopularizeRoom() {
+        return succeed(imLiveBroadcastRoomService.queryPopularizeRoom());
+    }
+
+    @ApiOperation("查询房间信息并校验房间是否合规")
+    @GetMapping("/queryRoom")
+    public HttpResponseResult<ImLiveBroadcastRoomVo> queryRoomAndCheck(@ApiParam(value = "房间uid", required = true) String roomUid,
+                                                                       @ApiParam(value = "用户id", required = true) Integer userId) {
+        return succeed(imLiveBroadcastRoomService.queryRoomAndCheck(roomUid, userId, 1));
+    }
+
+    @PostMapping("/quitRoom")
+    public HttpResponseResult<Object> quitRoom(@RequestBody List<ImUserState> userState) {
+        imLiveBroadcastRoomService.opsRoom(userState);
+        return succeed();
+    }
+
+    @ApiOperation("学生-进入房间")
+    @GetMapping("/joinRoom")
+    public HttpResponseResult<Object> joinRoom(String roomUid, Integer userId,Boolean microphoneFlag) {
+        if (microphoneFlag == null) {
+            microphoneFlag = true;
+        }
+        imLiveBroadcastRoomService.joinRoom(roomUid, userId,microphoneFlag);
+        return succeed();
+    }
+
+    @ApiOperation("设置连麦状态")
+    @PutMapping("/userWhetherMic")
+    public HttpResponseResult<Object> userWhetherMic(@ApiParam(value = "房间uid", required = true) String roomUid,
+                                                     @ApiParam(value = "用户id", required = true) Long userId,
+                                                     @ApiParam(value = "连麦状态 0:未申请1:申请连麦中2:连麦中", required = true) Integer whetherMicStatus) {
+        imLiveBroadcastRoomService.userWhetherMic(roomUid,userId,whetherMicStatus);
+        return succeed();
+    }
+}
+

+ 72 - 0
mec-application/src/main/java/com/ym/mec/student/controller/ImLiveRoomReservationController.java

@@ -0,0 +1,72 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.entity.ImLiveRoomReservation;
+import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
+import com.ym.mec.biz.service.ImLiveRoomReservationService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.WrapperUtil;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 直播预约记录(ImLiveRoomReservation)表控制层
+ *
+ * @author hgw
+ * @since 2022-05-24 14:54:04
+ */
+@RestController
+@RequestMapping("${app-config.url.student:}/imLiveRoomReservation")
+public class ImLiveRoomReservationController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private ImLiveRoomReservationService imLiveRoomReservationService;
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", dataType = "Integer", value = "用户id"),
+            @ApiImplicitParam(name = "roomUid", dataType = "String", value = "房间uid"),
+            @ApiImplicitParam(name = "ops", dataType = "Integer", value = "1 预约  2取消预约")
+    })
+    @ApiOperation("预约/取消预约")
+    @PostMapping("/opsReserve")
+    public HttpResponseResult<Object> opsReserve(@RequestBody Map<String, Object> param) {
+        Integer ops = WrapperUtil.toInt(param, "ops", "请传入操作类型");
+        ImLiveRoomReservation entity = new ImLiveRoomReservation();
+        entity.setRoomUid(WrapperUtil.toStr(param, "roomUid", "请传入房间uid"));
+        entity.setUserId(WrapperUtil.toInt(param, "userId", "用户id不能为空"));
+        //1 预约  2取消预约
+        if (ops == 1) {
+            imLiveRoomReservationService.add(entity);
+        } else if (ops == 2) {
+            imLiveRoomReservationService.cancel(entity);
+        } else {
+            return failed("请传入正确的操作类型");
+        }
+        return succeed();
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "liveState", dataType = "Integer", value = "直播状态 0未开始 1开始 2结束"),
+            @ApiImplicitParam(name = "page", dataType = "Integer", value = "页数"),
+            @ApiImplicitParam(name = "rows", dataType = "Integer", value = "每页数量"),
+    })
+    @ApiOperation("学生端-分页查询直播间")
+    @PostMapping("/queryPageStudent")
+    public HttpResponseResult<PageInfo<ImLiveBroadcastRoomVo>> queryPageStudent(@RequestBody Map<String, Object> param) {
+        param.put("groupType","NORMAL");
+        return succeed(imLiveRoomReservationService.queryPageStudent(param));
+    }
+
+}
+

+ 77 - 0
mec-application/src/main/java/com/ym/mec/student/controller/LessonExaminationController.java

@@ -0,0 +1,77 @@
+package com.ym.mec.student.controller;
+
+
+import com.ym.mec.biz.dal.dto.LessonExaminationResultDto1;
+import com.ym.mec.biz.dal.dto.LessonExaminationSubmitDto;
+import com.ym.mec.biz.dal.dto.StudentLessonExaminationDetailDto;
+import com.ym.mec.biz.dal.entity.StudentLessonExaminationDetail;
+import com.ym.mec.biz.dal.page.LessonExaminationQueryInfo1;
+import com.ym.mec.biz.dal.page.StudentLessonExaminationQueryDto;
+import com.ym.mec.biz.service.LessonExaminationService;
+import com.ym.mec.biz.service.StudentLessonExaminationDetailService;
+import com.ym.mec.biz.service.StudentLessonExaminationService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 进度评测表(LessonExamination)表控制层
+ *
+ * @author zx
+ * @since 2023-04-03 18:20:19
+ */
+@Api(tags = "进度评测表")
+@RestController
+@RequestMapping("${app-config.url.student:}/lessonExamination")
+public class LessonExaminationController extends BaseController {
+
+    @Resource
+    private LessonExaminationService lessonExaminationService;
+    @Resource
+    private StudentLessonExaminationService studentLessonExaminationService;
+    @Resource
+    private StudentLessonExaminationDetailService studentLessonExaminationDetailService;
+    @Resource
+    private SysUserService sysUserService;
+
+    @ApiOperation(value = "获取作业列表")
+    @PostMapping("queryPage")
+    public HttpResponseResult<PageInfo<LessonExaminationResultDto1>> queryPage(@RequestBody LessonExaminationQueryInfo1 queryInfo) {
+        queryInfo.setStudentId(sysUserService.getUserId());
+        return succeed(lessonExaminationService.queryPageByStudent(queryInfo));
+    }
+
+    @ApiOperation(value = "获取学员单个作业")
+    @GetMapping("getOne")
+    public HttpResponseResult<LessonExaminationResultDto1> getOne(Long lessonExaminationId) {
+        return succeed(lessonExaminationService.getOne(sysUserService.getUserId(),lessonExaminationId));
+    }
+
+    @ApiOperation(value = "提交作业")
+    @PostMapping("submit")
+    public HttpResponseResult submit(@RequestBody LessonExaminationSubmitDto submitDto) {
+        studentLessonExaminationService.submit(submitDto);
+        return succeed();
+    }
+
+    @ApiOperation(value = "获取学员单个作业详情列表")
+    @PostMapping("queryDetailAll")
+    public HttpResponseResult<List<StudentLessonExaminationDetailDto>> queryAll(@RequestBody StudentLessonExaminationQueryDto query) {
+        query.setUserId(sysUserService.getUserId());
+        return succeed(studentLessonExaminationDetailService.queryAll(query));
+    }
+
+    @ApiOperation(value = "获取学员单个作业详情")
+    @GetMapping("getDetail")
+    public HttpResponseResult<StudentLessonExaminationDetail> getDetail(Long studentLessonExaminationDetailId) {
+        return succeed(studentLessonExaminationDetailService.getById(studentLessonExaminationDetailId));
+    }
+}
+

+ 48 - 0
mec-application/src/main/java/com/ym/mec/student/controller/LiveGoodsMapperController.java

@@ -0,0 +1,48 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.dto.LiveGoodsMapperDto;
+import com.ym.mec.biz.dal.page.LiveGoodsMapperQueryInfo;
+import com.ym.mec.biz.service.LiveGoodsMapperService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+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.List;
+
+@Api(tags = "直播商品关联管理")
+@RequestMapping("${app-config.url.student:}/liveGoodsMapper")
+@RestController
+public class LiveGoodsMapperController extends BaseController {
+
+    @Autowired
+    private LiveGoodsMapperService liveGoodsMapperService;
+
+    @ApiOperation("分页查询直播间商品")
+    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<LiveGoodsMapperDto>> page(LiveGoodsMapperQueryInfo queryInfo) {
+        return succeed(liveGoodsMapperService.queryGoodsPage(queryInfo));
+    }
+
+    @ApiOperation("获取直播间商品详情")
+    @GetMapping(value = "/getGoodsDetail")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "liveGoodsId", value = "商品编号", required = true, dataType = "long"),
+            @ApiImplicitParam(name = "liveId", value = "房间号", required = true,dataType = "String")
+    })
+    public HttpResponseResult<LiveGoodsMapperDto> getGoodsDetail(Integer liveGoodsId, String liveId) {
+        List<LiveGoodsMapperDto> liveGoodsList = liveGoodsMapperService.getLiveGoodsList(liveId, liveGoodsId, null);
+        if (liveGoodsList.size() > 0) {
+            return succeed(liveGoodsList.get(0));
+        }
+        return failed("商品不存在");
+    }
+}

+ 160 - 0
mec-application/src/main/java/com/ym/mec/student/controller/LuckDrawController.java

@@ -0,0 +1,160 @@
+package com.ym.mec.student.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.entity.LuckDrawCount;
+import com.ym.mec.biz.dal.entity.LuckDrawLog;
+import com.ym.mec.biz.dal.page.LuckDrawQueryInfo;
+import com.ym.mec.biz.service.LuckDrawCountService;
+import com.ym.mec.biz.service.LuckDrawLogService;
+import com.ym.mec.biz.service.LuckDrawPrizeService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.string.ValueUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+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.Date;
+import java.util.List;
+import java.util.Objects;
+
+@Api(tags = "抽奖")
+@RestController
+@RequestMapping(value = "${app-config.url.student:}/luckDraw")
+public class LuckDrawController extends BaseController {
+
+	@Autowired
+	private LuckDrawPrizeService luckDrawPrizeService;
+
+	@Autowired
+	private LuckDrawLogService luckDrawLogService;
+
+	@Autowired
+	private LuckDrawCountService luckDrawCountService;
+
+	@Autowired
+	private SysUserService sysUserService;
+
+	@Autowired
+	private SysConfigDao sysConfigDao;
+
+	@ApiOperation(value = "查询抽奖记录")
+	@GetMapping(value = "/list")
+	public Object list(LuckDrawQueryInfo queryInfo) {
+		SysUser user = sysUserService.getUser();
+		if(!queryInfo.getAllFlag()){
+			queryInfo.setUserId(user.getId());
+		}
+		if(queryInfo.getGroupId().equals(3) && user.getOrganId().equals(4)){
+			queryInfo.setGroupId(4);
+		}
+		PageInfo<LuckDrawLog> pageInfo = luckDrawLogService.queryPage(queryInfo);
+		for (LuckDrawLog log : pageInfo.getRows()) {
+			log.getUser().setPhone(ValueUtil.fuzzyMobile(log.getUser().getPhone()));
+		}
+		if(queryInfo.getAllFlag() && pageInfo.getTotal() < 30){
+			String startTime = sysConfigDao.findConfigValue("start_time_of_1111");
+			String endTime = sysConfigDao.findConfigValue("end_time_of_1111");
+			if(DateUtil.contents(startTime,endTime,new Date())){
+				List<LuckDrawLog> log;
+				if(user.getOrganId().equals(4)){
+					log = JSONObject.parseArray(str, LuckDrawLog.class);
+				}else {
+					log = JSONObject.parseArray(str2, LuckDrawLog.class);
+				}
+				pageInfo.getRows().addAll(log);
+				pageInfo.setTotal(pageInfo.getTotal() + log.size());
+			}
+		}
+		return succeed(pageInfo);
+	}
+
+	@ApiOperation(value = "查询我的抽奖记录")
+	@GetMapping(value = "/myList")
+	public Object myList(LuckDrawQueryInfo queryInfo) {
+		SysUser user = sysUserService.getUser();
+		if(queryInfo.getGroupId().equals(3) && user.getOrganId().equals(4)){
+			queryInfo.setGroupId(4);
+		}
+		queryInfo.setUserId(user.getId());
+		return succeed(luckDrawLogService.queryPage(queryInfo));
+	}
+
+	@ApiOperation(value = "抽奖")
+	@PostMapping(value = "/draw")
+	public Object draw(Integer groupId) {
+		SysUser user = sysUserService.getUser();
+		if(groupId.equals(3) && user.getOrganId().equals(4)){
+			groupId = 4;
+		}
+		return succeed(luckDrawPrizeService.draw((long) user.getId(), groupId));
+	}
+
+	@ApiOperation(value = "查询个人抽奖机会")
+	@GetMapping(value = "/queryCount")
+	public Object queryCount(Integer groupId) {
+		SysUser user = sysUserService.getUser();
+		if(groupId.equals(3) && user.getOrganId().equals(4)){
+			groupId = 4;
+		}
+		LuckDrawCount luckDrawCount = luckDrawCountService.findByIdAndGroupId(user.getId(), groupId);
+		if(Objects.isNull(luckDrawCount)){
+			luckDrawCount = new LuckDrawCount();
+			luckDrawCount.setUserId(user.getId().longValue());
+			luckDrawCount.setAvailableCount(0);
+		}
+		luckDrawCount.setHZFlag(user.getOrganId().equals(4));
+		return succeed(luckDrawCount);
+	}
+
+	private static String str = "[\n" +
+			"    {\"user\": {\"username\": \"吴文瑞\"},\"luckDrawPrize\":{\"name\": \"三等奖\"}},\n" +
+			"    {\"user\": {\"username\": \"高勇\"},\"luckDrawPrize\":{\"name\": \"三等奖\"}},\n" +
+			"    {\"user\": {\"username\": \"李艺彤\"},\"luckDrawPrize\":{\"name\": \"二等奖\"}},\n" +
+			"    {\"user\": {\"username\": \"邹辰悦\"},\"luckDrawPrize\":{\"name\": \"三等奖\"}},\n" +
+			"    {\"user\": {\"username\": \"王笑笑\"},\"luckDrawPrize\":{\"name\": \"三等奖\"}},\n" +
+			"]";
+	private static String str2 = "[\n" +
+			"    {\"user\": {\"username\": \"陈昊然\"},\"luckDrawPrize\":{\"name\": \"SoonyAngle盲盒\"}},\n" +
+			"    {\"user\": {\"username\": \"王木槿\"},\"luckDrawPrize\":{\"name\": \"宇航员蓝牙音箱\"}},\n" +
+			"    {\"user\": {\"username\": \"刘天钧\"},\"luckDrawPrize\":{\"name\": \"喜马拉雅会员\"}},\n" +
+			"    {\"user\": {\"username\": \"刘天宇\"},\"luckDrawPrize\":{\"name\": \"喜马拉雅会员\"}},\n" +
+			"    {\"user\": {\"username\": \"刘润玉\"},\"luckDrawPrize\":{\"name\": \"有道词典笔\"}},\n" +
+			"    {\"user\": {\"username\": \"李暮词\"},\"luckDrawPrize\":{\"name\": \"SoonyAngle盲盒\"}},\n" +
+			"    {\"user\": {\"username\": \"陈叶开\"},\"luckDrawPrize\":{\"name\": \"百科全书\"}},\n" +
+			"    {\"user\": {\"username\": \"赵崇光\"},\"luckDrawPrize\":{\"name\": \"百科全书\"}},\n" +
+			"    {\"user\": {\"username\": \"赵绮年\"},\"luckDrawPrize\":{\"name\": \"小度G1\"}},\n" +
+			"    {\"user\": {\"username\": \"吴玉堂\"},\"luckDrawPrize\":{\"name\": \"SoonyAngle盲盒\"}},\n" +
+			"    {\"user\": {\"username\": \"吴勇师\"},\"luckDrawPrize\":{\"name\": \"SoonyAngle盲盒\"}},\n" +
+			"    {\"user\": {\"username\": \"陈康文\"},\"luckDrawPrize\":{\"name\": \"喜马拉雅会员\"}},\n" +
+			"    {\"user\": {\"username\": \"赵康健\"},\"luckDrawPrize\":{\"name\": \"百科全书\"}},\n" +
+			"    {\"user\": {\"username\": \"赵高轩\"},\"luckDrawPrize\":{\"name\": \"小度G1\"}},\n" +
+			"    {\"user\": {\"username\": \"赵玉书\"},\"luckDrawPrize\":{\"name\": \"SoonyAngle盲盒\"}},\n" +
+			"    {\"user\": {\"username\": \"赵叶欢\"},\"luckDrawPrize\":{\"name\": \"弯得林优选笛头\"}},\n" +
+			"    {\"user\": {\"username\": \"李高兴\"},\"luckDrawPrize\":{\"name\": \"喜马拉雅会员\"}},\n" +
+			"    {\"user\": {\"username\": \"吴文瑞\"},\"luckDrawPrize\":{\"name\": \"喜马拉雅会员\"}},\n" +
+			"    {\"user\": {\"username\": \"高勇\"},\"luckDrawPrize\":{\"name\": \"SoonyAngle盲盒\"}},\n" +
+			"    {\"user\": {\"username\": \"李艺彤\"},\"luckDrawPrize\":{\"name\": \"宇航员蓝牙音箱\"}},\n" +
+			"    {\"user\": {\"username\": \"邹辰悦\"},\"luckDrawPrize\":{\"name\": \"SoonyAngle盲盒\"}},\n" +
+			"    {\"user\": {\"username\": \"王笑笑\"},\"luckDrawPrize\":{\"name\": \"20节vip小课\"}},\n" +
+			"    {\"user\": {\"username\": \"肖国庆\"},\"luckDrawPrize\":{\"name\": \"有道词典笔\"}},\n" +
+			"    {\"user\": {\"username\": \"李红旗\"},\"luckDrawPrize\":{\"name\": \"SoonyAngle盲盒\"}},\n" +
+			"    {\"user\": {\"username\": \"王乐乐\"},\"luckDrawPrize\":{\"name\": \"乐器清洁套装\"}},\n" +
+			"    {\"user\": {\"username\": \"孙朵朵\"},\"luckDrawPrize\":{\"name\": \"SoonyAngle盲盒\"}},\n" +
+			"    {\"user\": {\"username\": \"孙雨轩\"},\"luckDrawPrize\":{\"name\": \"百科全书\"}},\n" +
+			"    {\"user\": {\"username\": \"孙文睿\"},\"luckDrawPrize\":{\"name\": \"宇航员蓝牙音箱\"}},\n" +
+			"    {\"user\": {\"username\": \"高可心\"},\"luckDrawPrize\":{\"name\": \"SoonyAngle盲盒\"}},\n" +
+			"    {\"user\": {\"username\": \"高可云\"},\"luckDrawPrize\":{\"name\": \"宇航员蓝牙音箱\"}},\n" +
+			"    {\"user\": {\"username\": \"王胜利\"},\"luckDrawPrize\":{\"name\": \"有道词典笔\"}},\n" +
+			"    {\"user\": {\"username\": \"李木子\"},\"luckDrawPrize\":{\"name\": \"百科全书\"}}\n" +
+			"]";
+
+}

+ 130 - 0
mec-application/src/main/java/com/ym/mec/student/controller/MemberRankController.java

@@ -0,0 +1,130 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.MemberPayParamDto;
+import com.ym.mec.biz.dal.entity.MemberRankSetting;
+import com.ym.mec.biz.dal.page.CloudTeacherOrderQueryInfo;
+import com.ym.mec.biz.service.*;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RequestMapping("${app-config.url.student:}/memberRank")
+@Api(tags = "会员收费设置服务")
+@RestController
+public class MemberRankController extends BaseController {
+
+    @Autowired
+    private MemberFeeSettingService memberFeeSettingService;
+
+    @Autowired
+    private MemberRankSettingService memberRankSettingService;
+
+    @Autowired
+    private MemberRankPrivilegesService memberRankPrivilegesService;
+
+    @Autowired
+    private CloudTeacherOrderService cloudTeacherOrderService;
+
+    @Autowired
+    private SysUserService sysUserService;
+
+    @ApiOperation(value = "获取所有的收费标准")
+    @GetMapping("/queryList")
+    public Object getMemberDefaultFee() {
+        SysUser sysUser = sysUserService.getUser();
+        List<MemberRankSetting> result = memberRankSettingService.queryListByIsDefault(false);
+
+        for (MemberRankSetting mrs : result) {
+            mrs.setMemberFeeSetting(memberFeeSettingService.findByRankIdAndOrganId(sysUser.getOrganId(), mrs.getId()));
+            mrs.setMemberPrivilegesItemList(memberRankPrivilegesService.queryByMemberRankId(mrs.getId()));
+        }
+        return succeed(result);
+    }
+
+    @ApiOperation(value = "购买会员(用于后台创建的团练宝订单支付)")
+    @PostMapping("/buy")
+    public Object buy(@RequestBody MemberPayParamDto memberPayParamDto) throws Exception {
+        return memberRankSettingService.buy(memberPayParamDto);
+    }
+
+    @ApiOperation(value = "购买会员(学生端自主购买团练宝会员)")
+    @PostMapping("/buy1")
+    public Object buy1(@RequestBody MemberPayParamDto memberPayParamDto) throws Exception {
+        return memberRankSettingService.buy1(memberPayParamDto);
+    }
+
+    /**
+     * 齐齐哈尔购买团练宝-默认激活
+     * <p> 购买规则
+     * <p>活动分部:
+     * 齐齐哈尔二组,编号59
+     * <p>
+     * 活动内容:
+     * <p>1. 团练宝按月购买,学员可自行选择购买多少个月,单次购买达到一定数量进行赠送,无需激活,支付后立即生效
+     * <p>2. 单月价格:150元/月
+     * <p>3. 单次购买2个月赠送1个月
+     * <p>4. 单次购买4个月赠送3个月
+     * <p>5. 单次购买6个月赠送6个月
+     * <p>6. 每笔订单仅按能够满足赠送条件的最高档赠送,不可叠加,
+     * <p>例:学员单次购买12个月,则赠送6个月,共18个月;学员单次购买5个月,则赠送3个月,共8个月
+     * <p>7. 每笔订单独立计算,多比订单不可叠加,
+     * <p>例:学员三笔订单,每笔1个月,不赠送
+     * <p>8. 每笔订单达到赠送条件都可赠送,
+     * <p>例:学员两笔订单都买的6个月,则两笔订单都送6个月
+     * <p>活动时间:
+     * <p>1. 2022年2月8日上线预热
+     * <p>2. 2022年2月15日开始销售
+     * <p>3. 暂无结束时间,长期有效
+     *
+     * @return
+     */
+    @ApiOperation(value = "购买会员")
+    @PostMapping("/buy2Qqhe")
+    public Object buy2Qqhe(@RequestBody MemberPayParamDto memberPayParamDto) throws Exception {
+        return memberRankSettingService.buy2Qqhe(memberPayParamDto);
+    }
+
+    @ApiOperation(value = "查询是否有待支付的活动订单")
+    @GetMapping("/queryBuy2Qqhe")
+    public Object queryBuy2Qqhe() {
+        return memberRankSettingService.queryBuy2Qqhe();
+    }
+
+    @ApiOperation(value = "关闭活动订单")
+    @GetMapping("/closeBuy2Qqhe")
+    public Object closeBuy2Qqhe(String orderNo) throws Exception {
+        return memberRankSettingService.closeBuy2Qqhe(orderNo);
+    }
+
+    @ApiOperation(value = "2022小小训练营活动购买会员")
+    @PostMapping("/activeBuy")
+    public HttpResponseResult ActiveBuy(@RequestBody MemberPayParamDto memberPayParamDto) throws Exception {
+		return memberRankSettingService.activeBuy(memberPayParamDto);
+    }
+
+    @ApiOperation(value = "2022小小训练营活动购买会员")
+    @PostMapping("/checkActiveBuy")
+    public HttpResponseResult<Integer> checkActiveBuy(@RequestBody MemberPayParamDto memberPayParamDto) throws Exception {
+		return memberRankSettingService.checkActiveBuy(memberPayParamDto);
+    }
+
+    @ApiOperation(value = "查询订单列表")
+    @GetMapping("/queryOrderPage")
+    public Object queryOrderPage(CloudTeacherOrderQueryInfo queryInfo) {
+        queryInfo.setStudentId(sysUserService.getUserId());
+        return succeed(cloudTeacherOrderService.queryPage(queryInfo));
+    }
+
+    @ApiOperation(value = "获取学员购买的云教练活动订单")
+    @GetMapping("/queryActiveOrderPage")
+    public Object queryActiveOrderPage() {
+        return succeed(cloudTeacherOrderService.queryActiveOrderPage(sysUserService.getUserId(), 202203, null));
+    }
+
+}

+ 37 - 0
mec-application/src/main/java/com/ym/mec/student/controller/MusicEnlightenmentQuestionnaireController.java

@@ -0,0 +1,37 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.entity.MusicEnlightenmentQuestionnaire;
+import com.ym.mec.biz.service.MusicEnlightenmentQuestionnaireService;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/10/13 0013
+ */
+@Api(tags = "启蒙课问卷")
+@RestController
+@RequestMapping("${app-config.url.student:}/musicEnlightenmentQuestionnaire")
+public class MusicEnlightenmentQuestionnaireController extends BaseController {
+
+    @Autowired
+    private MusicEnlightenmentQuestionnaireService musicEnlightenmentQuestionnaireService;
+
+    @ApiOperation(value = "添加启蒙课问卷")
+    @PostMapping("addEnlightenmentQuestionnaire")
+    public HttpResponseResult addEnlightenmentQuestionnaire(@RequestBody MusicEnlightenmentQuestionnaire enlightenmentQuestionnaire){
+        musicEnlightenmentQuestionnaireService.addEnlightenmentQuestionnaire(enlightenmentQuestionnaire);
+        return succeed();
+    }
+
+    @ApiOperation(value = "获取指定用户的乐团启蒙问卷记录")
+    @GetMapping("getUserMusicEnlightenmentQuestionnaire")
+    public HttpResponseResult<MusicEnlightenmentQuestionnaire> getUserMusicEnlightenmentQuestionnaire(String musicGroupId, String phone) {
+        return succeed(musicEnlightenmentQuestionnaireService.getUserMusicEnlightenmentQuestionnaire(musicGroupId, phone));
+    }
+
+}

+ 321 - 0
mec-application/src/main/java/com/ym/mec/student/controller/MusicGroupController.java

@@ -0,0 +1,321 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
+import com.ym.mec.biz.dal.dao.StudentPreRegistrationDao;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum;
+import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
+import com.ym.mec.biz.dal.enums.school.EQuitGroupAuditStatusEnum;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@RequestMapping("${app-config.url.student:}/musicGroup")
+@Api(tags = "乐团服务")
+@RestController
+public class MusicGroupController extends BaseController {
+
+    @Resource
+    private SysUserService sysUserService;
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private MusicGroupService musicGroupService;
+    @Autowired
+    private MusicGroupSubjectPlanService musicGroupSubjectPlanService;
+    @Autowired
+    private StudentRegistrationService studentRegistrationService;
+    @Autowired
+    private StudentPaymentOrderService studentPaymentOrderService;
+    @Autowired
+    private StudentPaymentOrderDetailService studentPaymentOrderDetailService;
+    @Autowired
+    private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
+    @Autowired
+    private MusicGroupPaymentCalenderService musicGroupPaymentCalenderService;
+    @Autowired
+    private StudentPreRegistrationDao studentPreRegistrationDao;
+    @Autowired
+    private OrganizationService organizationService;
+
+    @ApiOperation("预报名")
+    @PostMapping(value = "/preRegister")
+    public HttpResponseResult preRegister(@RequestBody StudentPreRegistration studentPreRegistration) {
+        return musicGroupService.preRegister(studentPreRegistration) ? succeed() : failed();
+    }
+
+    @ApiOperation("预报名信息查询")
+    @GetMapping(value = "/queryPreRegister")
+    public HttpResponseResult<StudentPreRegistration> queryPreRegister(String musicGroupId) {
+        return succeed(studentPreRegistrationDao.queryByMusicGroupIdAndUserId(sysUserService.getUserId(), musicGroupId));
+    }
+
+    @ApiOperation("获取学生所在乐团列表")
+    @GetMapping(value = "/queryUserMusicGroups")
+    public HttpResponseResult<List<MusicCardDto>> queryUserMusicGroups() {
+        return succeed(musicGroupService.queryUserMusicGroups(sysUserService.getUserId()));
+    }
+
+    @ApiOperation("获取学生所在乐团列表")
+    @GetMapping(value = "/queryStudentMusicGroupInfo")
+    public HttpResponseResult<List<StudentMusicGroupDto>> queryStudentMusicGroupInfo(String musicGroupId) {
+        return succeed(studentRegistrationService.queryStudentMusicGroupInfo(sysUserService.getUserId(),musicGroupId));
+    }
+
+    @ApiOperation("获取学生个人中心乐团信息")
+    @GetMapping(value = "/queryPersonalMusicGroups")
+    public HttpResponseResult<MusicCardDto> queryPersonalMusicGroups() {
+        return succeed(musicGroupService.queryPersonalMusicGroups(sysUserService.getUserId()));
+    }
+
+    @ApiOperation(value = "根据学员编号,获取有关联的老师列表,获取学员通讯录列表")
+    @GetMapping("/findTeachersByStuId")
+    public HttpResponseResult<List<BasicUserDto>> findTeachersByStuId(String search) {
+        return succeed(musicGroupService.findTeachersByStuId(sysUserService.getUserId(), search));
+    }
+
+
+    @ApiOperation(value = "获取乐团声部费用信息及乐器和辅件")
+    @GetMapping("/getSubjectGoodsAndInfo")
+    @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团编号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "subjectId", value = "声部编号", required = true, dataType = "Integer")})
+    public HttpResponseResult<MusicGroupSubjectGoodsAndInfoDto> getSubjectGoodsAndInfo(String musicGroupId, Integer subjectId) {
+        return succeed(musicGroupSubjectPlanService.getSubjectGoodsAndInfo(musicGroupId, subjectId));
+    }
+
+    @ApiOperation(value = "乐团报名缴费状态查询")
+    @GetMapping("/getMusicGroupStatus")
+    @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团id", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "userId", value = "用户id", required = true, dataType = "int")
+    })
+    public HttpResponseResult getMusicGroupStatus(String musicGroupId, Integer userId) throws Exception {
+        MusicGroup musicGroup = musicGroupService.get(musicGroupId);
+        if (musicGroup == null) {
+            return failed("乐团不存在");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+
+        if (sysUser != null && Objects.nonNull(sysUser.getId())) {
+            userId = sysUser.getId();
+        }
+        StudentRegistration studentRegistration = studentRegistrationService.queryByUserIdAndMusicGroupId(userId, musicGroupId);
+        if (studentRegistration == null) {
+            return failed(HttpStatus.CONTINUE, "乐团报名信息不存在");
+        }
+
+        // 判断是否可以继续购买
+        List<StudentPaymentOrderDetail> studentPaymentOrderDetailList = studentPaymentOrderDetailService.findUserApplyOrder(userId, musicGroupId, DealStatusEnum.SUCCESS);
+
+        if(studentPaymentOrderDetailList != null && studentPaymentOrderDetailList.size() > 0){
+            List<OrderDetailTypeEnum> typeList = studentPaymentOrderDetailList.stream().map(t -> t.getType()).collect(Collectors.toList());
+            //如果乐器和辅件都买过/那么看是否购买过其他的缴费项
+            if (typeList.contains(OrderDetailTypeEnum.MUSICAL) && typeList.contains(OrderDetailTypeEnum.ACCESSORIES)) {
+                MusicGroupPaymentCalender paymentCalender = musicGroupPaymentCalenderService.getApplyCalenderByMusicId(musicGroupId);
+                HashMap<String, Object> calenderDetail = new HashMap<>(5);
+                musicGroupPaymentCalenderService.getCalenderDetail(calenderDetail,paymentCalender.getId());
+                boolean flag = true;
+                //是否购买乐团课
+                if(Objects.nonNull(calenderDetail.get("course"))){
+                    if(typeList.contains(OrderDetailTypeEnum.COURSE)
+                            || typeList.contains(OrderDetailTypeEnum.HIGH_ONLINE_COURSE) || typeList.contains(OrderDetailTypeEnum.SINGLE)
+                            || typeList.contains(OrderDetailTypeEnum.MIX) || typeList.contains(OrderDetailTypeEnum.HIGH)
+                            || typeList.contains(OrderDetailTypeEnum.DEMO) || typeList.contains(OrderDetailTypeEnum.CLASSROOM)
+                            || typeList.contains(OrderDetailTypeEnum.COMPREHENSIVE) || typeList.contains(OrderDetailTypeEnum.ENLIGHTENMENT)
+                            || typeList.contains(OrderDetailTypeEnum.TRAINING_SINGLE) || typeList.contains(OrderDetailTypeEnum.TRAINING_MIX)
+                            || typeList.contains(OrderDetailTypeEnum.HIGH_ONLINE) || typeList.contains(OrderDetailTypeEnum.MUSIC_NETWORK)){
+                        flag = true;
+                    }else {
+                        flag = false;
+                    }
+                }
+
+                if(flag){
+                    //是否购买会员
+                    if(Objects.nonNull(calenderDetail.get("member"))){
+                        if(typeList.contains(OrderDetailTypeEnum.CLOUD_TEACHER) || typeList.contains(OrderDetailTypeEnum.CLOUD_TEACHER_PLUS)){
+                            flag = true;
+                        }else {
+                            flag = false;
+                        }
+                    }
+                }
+                if(flag){
+                    //是否购买活动包
+                    if(Objects.nonNull(calenderDetail.get("activity"))){
+                        if(typeList.contains(OrderDetailTypeEnum.VIP) || typeList.contains(OrderDetailTypeEnum.PRACTICE)){
+                            flag = true;
+                        }else {
+                            flag = false;
+                        }
+                    }
+                }
+                if(flag){
+                    return failed(HttpStatus.PROCESSING, "您已缴费,请等待乐团开启");
+                }
+            }
+        }
+
+        if (studentRegistration.getPaymentStatus() == PaymentStatusEnum.NO) {
+            return failed("乐团还未开启缴费,请等待通知");
+        }
+        if (musicGroup.getStatus() != MusicGroupStatusEnum.APPLY &&
+                musicGroup.getStatus() != MusicGroupStatusEnum.PAY &&
+                musicGroup.getStatus() != MusicGroupStatusEnum.PREPARE &&
+                musicGroup.getStatus() != MusicGroupStatusEnum.PROGRESS
+        ) {
+            return failed("乐团在" + musicGroup.getStatus().getMsg() + ",不能缴费");
+        }
+        String err = studentRegistrationService.checkRegOrPayStatus(musicGroupId);
+        if (err != null) {
+            return failed(err + "不能缴费");
+        }
+        studentRegistration.setOwnershipType(musicGroup.getOwnershipType());
+        if (sysUser != null) {
+            studentRegistration.setGender(sysUser.getGender());
+        }
+
+        return succeed(studentRegistration);
+    }
+
+    @ApiOperation(value = "申请退团")
+    @PostMapping("/quitMusicGroup")
+    @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团id", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "reason", value = "原因", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "reasonEnum", value = "原因", required = true, dataType = "String")})
+    public HttpResponseResult<Boolean> quitMusicGroup(String musicGroupId, String reason, MusicGroupQuit.ReasonEnum reasonEnum) throws Exception {
+        Integer userId = sysUserService.getUserId();
+		MusicGroupQuit musicGroupQuit = new MusicGroupQuit();
+		musicGroupQuit.setUserId(userId);
+		musicGroupQuit.setMusicGroupId(musicGroupId);
+		musicGroupQuit.setUserComment(reason);
+        musicGroupQuit.setReasonEnum(reasonEnum);
+		musicGroupQuit.setStatus(ApprovalStatus.PROCESSING);
+        musicGroupQuit.setOperatorId(userId);
+        MusicGroup musicGroup = musicGroupService.get(musicGroupId);
+        if(musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS){
+            musicGroupQuit.setSchoolStaffAuditStatus(EQuitGroupAuditStatusEnum.ING);
+        }
+        return succeed(musicGroupService.applyQuitMusicGroup(null, musicGroupQuit,"STUDENT"));
+    }
+
+    @ApiOperation(value = "取消退团申请")
+    @PostMapping("/cancelQuitMusicGroup")
+    @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团id", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "reason", value = "取消原因", required = true, dataType = "String")})
+    public HttpResponseResult<Boolean> cancelQuitMusicGroup(String musicGroupId, String reason) throws Exception {
+        return succeed(musicGroupService.cancelQuitMusicGroup(sysUserService.getUserId(), musicGroupId, reason));
+    }
+
+    @ApiOperation(value = "查询是否有待支付的报名订单")
+    @GetMapping("/checkWaitPayApplyOrder")
+    @ApiImplicitParams({@ApiImplicitParam(name = "registerId", value = "注册id", required = true, dataType = "int")})
+    public HttpResponseResult<StudentPaymentOrder> checkWaitPayApplyOrder(Long registerId) throws Exception {
+        StudentRegistration studentRegistration = studentRegistrationService.get(registerId);
+        if (studentRegistration == null) {
+            return failed("报名信息有误,请核查");
+        }
+        Integer userId = studentRegistration.getUserId();
+
+        //判断用户是否已存在订单
+        List<StudentPaymentOrder> applyOrderList = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.ING);
+        
+        if(applyOrderList != null && applyOrderList.size() > 0){
+        	return succeed(applyOrderList.get(0));
+        }
+        return succeed(null);
+    }
+
+    @ApiOperation(value = "续费")
+    @PostMapping("/renew")
+    public HttpResponseResult renew(@RequestBody RegisterPayDto renewParamDto) throws Exception {
+        Integer userId = sysUserService.getUserId();
+        Long calenderId = renewParamDto.getCalenderId();
+        if(calenderId == null){
+            throw new BizException("参数校验失败");
+        }
+        MusicGroupPaymentCalender calender = musicGroupPaymentCalenderService.get(calenderId);
+        MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.findByCalenderIdAndUserId(calenderId, userId);
+        if (calenderDetail == null) {
+            throw new BizException("缴费项不存在该学员,请联系教务老师");
+        }
+        if (calenderDetail.getPaymentStatus() == PaymentStatus.PAID_COMPLETED) {
+            throw new BizException("您已缴费,请勿重复提交");
+        }
+        //缴费项目已开启或者单独开启
+        if (calender.getStatus() == PaymentCalenderStatusEnum.OPEN || calenderDetail.getOpen() == 1) {
+            renewParamDto.setUserId(userId);
+            renewParamDto.setBatchNo(calender.getBatchNo());
+            return musicGroupService.renew(renewParamDto);
+        } else if (calender.getStatus() == PaymentCalenderStatusEnum.OVER) {
+            throw new BizException("缴费已截止,如有问题请联系指导老师");
+        } else {
+            throw new BizException("缴费暂未开始,如有问题请联系指导老师");
+        }
+    }
+
+    @ApiOperation(value = "乐团报名支付")
+    @PostMapping("/pay")
+    public HttpResponseResult pay(@RequestBody RegisterPayDto registerPayDto) throws Exception {
+        StudentRegistration studentRegistration = studentRegistrationService.get(registerPayDto.getRegisterId().longValue());
+        if (studentRegistration == null) {
+            return failed("报名信息有误,请核查");
+        }
+        String err = studentRegistrationService.checkRegOrPayStatus(studentRegistration.getMusicGroupId());
+        if (err != null) {
+            return failed(err + "不可缴费,请联系教务老师");
+        }
+        registerPayDto.setUserId(studentRegistration.getUserId());
+        registerPayDto.setMusicGroupId(studentRegistration.getMusicGroupId());
+        return musicGroupService.pay(registerPayDto);
+    }
+
+
+    @ApiOperation(value = "订单状态查询")
+    @GetMapping("/getOrderStatus")
+    @ApiImplicitParams({@ApiImplicitParam(name = "orderNo", value = "订单号", required = true, dataType = "String")})
+    public HttpResponseResult getOrderStatus(String orderNo) {
+        if (StringUtils.isBlank(orderNo)) {
+            return failed("请指定订单");
+        }
+        StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+        if (Objects.isNull(orderByOrderNo)) {
+            return failed("未找到指定订单");
+        }
+        MusicGroup musicGroup = musicGroupService.get(orderByOrderNo.getMusicGroupId());
+        List<Goods> goodsList = studentPaymentOrderDetailService.findApplyOrderGoods(orderByOrderNo.getId());
+        HashMap<String, Object> orderDetail = new HashMap<>();
+        orderDetail.put("order", orderByOrderNo);
+        orderDetail.put("goods", goodsList);
+        orderDetail.put("course", musicGroup.getCourseForm());
+
+        return succeed(orderDetail);
+    }
+
+    @ApiOperation(value = "获取乐团的年级列表")
+    @GetMapping("/getGradeList")
+    @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团编号", required = true, dataType = "String")})
+    public HttpResponseResult<Map<Integer, String>> getGradeList(String musicGroupId) {
+        MusicGroup musicGroup = Optional.ofNullable(musicGroupService.get(musicGroupId)).orElseThrow(()->new BizException("乐团信息不存在"));
+        return succeed(organizationService.getGradeList(musicGroup.getOrganId(),musicGroup.getGradeType()));
+    }
+}

+ 79 - 0
mec-application/src/main/java/com/ym/mec/student/controller/MusicGroupDetailController.java

@@ -0,0 +1,79 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.entity.MusicGroupTrainPlanSaveDto;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.page.MusicGroupPerformanceQueryInfo;
+import com.ym.mec.biz.dal.page.MusicGroupTeachersQueryInfo;
+import com.ym.mec.biz.dal.page.PhotoQueryInfo;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("${app-config.url.student:}/musicGroupDetail")
+@Api(tags = "乐团档案服务")
+@RestController
+public class MusicGroupDetailController extends BaseController {
+
+    @Autowired
+    private MusicGroupNewsService musicGroupNewsService;
+    @Autowired
+    private MusicGroupPerformanceService musicGroupPerformanceService;
+    @Autowired
+    private PhotoAlbumService photoAlbumService;
+    @Autowired
+    private PhotoService photoService;
+    @Autowired
+    private MusicGroupTrainPlanService musicGroupTrainPlanService;
+    @Autowired
+    private MusicGroupService musicGroupService;
+    @Autowired
+    private ClassGroupService classGroupService;
+
+    @ApiOperation("获取学员退团页面数据")
+    @RequestMapping(value = "getQuitGroupDetail")
+    public Object getQuitGroupDetail(String musicGroupId) {
+        return succeed(musicGroupService.getQuitGroupDetail(musicGroupId));
+    }
+
+    @ApiOperation("获取乐团训练规划课时")
+    @PostMapping(value = "queryPlanCourseNum")
+    public Object queryPlanCourseNum(@RequestBody MusicGroupTrainPlanSaveDto musicGroupTrainPlanSaveDto) {
+        musicGroupTrainPlanSaveDto.setStudentFlag(true);
+        return succeed(musicGroupTrainPlanService.queryPlanCourseNum(musicGroupTrainPlanSaveDto));
+    }
+
+    @ApiOperation(value = "分页查询乐团资讯")
+    @GetMapping("/queryNewsPage")
+    public Object queryNewsPage(MusicGroupTeachersQueryInfo queryInfo) {
+        return succeed(musicGroupNewsService.queryPage(queryInfo));
+    }
+
+    @ApiOperation("分页查询展演信息")
+    @PostMapping(value = "queryPerformancePage")
+    public Object queryPerformancePage(MusicGroupPerformanceQueryInfo queryInfo) {
+        return succeed(musicGroupPerformanceService.queryPage(queryInfo));
+    }
+
+    @ApiOperation("分页查询相册")
+    @PostMapping(value = "queryAlbumPage")
+    public Object queryAlbumPage(PhotoQueryInfo queryInfo) {
+        queryInfo.setClientShow(YesOrNoEnum.YES);
+        return succeed(photoAlbumService.queryAlbumPage(queryInfo));
+    }
+
+    @ApiOperation("分页查询照片")
+    @PostMapping(value = "queryPhotoPage")
+    public Object queryPhotoPage(PhotoQueryInfo queryInfo) {
+        queryInfo.setClientShow(YesOrNoEnum.YES);
+        return succeed(photoService.queryPhotoPage(queryInfo));
+    }
+
+    @ApiOperation(value = "查询学员班级列表")
+    @GetMapping("queryStudentAndTeacher")
+    public Object queryStudentClassGroupsAndTeacher(String musicGroupId) {
+        return succeed(classGroupService.queryStudentClassGroupsAndTeacher(musicGroupId));
+    }
+}

+ 87 - 0
mec-application/src/main/java/com/ym/mec/student/controller/MusicGroupPaymentCalenderController.java

@@ -0,0 +1,87 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderStudentDetailDao;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
+import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderService;
+import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+@RequestMapping("${app-config.url.student:}/musicGroupPaymentCalender")
+@Api(tags = "乐团缴费项目服务")
+@RestController
+public class MusicGroupPaymentCalenderController extends BaseController {
+
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private MusicGroupPaymentCalenderService musicGroupPaymentCalenderService;
+    @Autowired
+    private StudentRegistrationService studentRegistrationService;
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+    @Autowired
+    private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
+    @Autowired
+    private MusicGroupPaymentCalenderStudentDetailDao musicGroupPaymentCalenderStudentDetailDao;
+
+
+    @ApiOperation(value = "查询学员缴费详情")
+    @GetMapping("/getCalenderInfo")
+    @ApiImplicitParams({@ApiImplicitParam(name = "calenderId", value = "缴费项目编号", required = true, dataType = "Long")})
+    public HttpResponseResult getCalenderInfo(Long calenderId){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        Integer userId = sysUser.getId();
+        MusicGroupPaymentCalender calender = musicGroupPaymentCalenderService.get(calenderId);
+        if (calender == null) {
+            return failed("缴费项目不存在");
+        }
+        String musicGroupId = calender.getMusicGroupId();
+        MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.findByCalenderIdAndUserId(calenderId, userId);
+        if (calenderDetail == null) {
+            throw new BizException("缴费项不存在该学员,请联系教务老师");
+        }
+        if(calenderDetail.getPaymentStatus() == PaymentStatus.PAID_COMPLETED){
+            throw new BizException("您已缴费,请勿重复提交");
+        }
+        if(calender.getStatus() == PaymentCalenderStatusEnum.OPEN || calenderDetail.getOpen() == 1){
+            StudentRegistration studentRegistration = studentRegistrationService.queryByUserIdAndMusicGroupId(userId,musicGroupId);
+            if (studentRegistration == null) {
+                return failed("乐团报名信息不存在");
+            }
+            //课程相关信息
+            Map model = new HashMap<>(10);
+            model.put("musicGroupPaymentCalenderStudentDetails",musicGroupPaymentCalenderStudentDetailDao.findByBatchNoAndUserId(calender.getBatchNo(),userId));
+            model.put("musicGroup",musicGroupDao.get(musicGroupId));
+            model.put("balance",studentRegistration.getBalance());
+            model.put("calender",calender);
+            musicGroupPaymentCalenderService.getCalenderDetail(model,calenderId);
+            return succeed(model);
+        }else if(calender.getStatus() == PaymentCalenderStatusEnum.OVER){
+            throw new BizException("缴费已截止,如有问题请联系指导老师");
+        }else {
+            throw new BizException("缴费暂未开始,如有问题请联系指导老师");
+        }
+    }
+}

+ 84 - 0
mec-application/src/main/java/com/ym/mec/student/controller/MusicGroupRecordController.java

@@ -0,0 +1,84 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.dao.ClassGroupDao;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dto.MusicGroupBasicDto;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.page.MusicGroupRecordStudentQueryInfo;
+import com.ym.mec.biz.service.CooperationOrganLinkmanService;
+import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequestMapping("${app-config.url.student:}/musicGroupRecord")
+@Api(tags = "乐团档案")
+@RestController
+public class MusicGroupRecordController extends BaseController {
+
+	@Autowired
+	private CooperationOrganLinkmanService cooperationOrganLinkmanService;
+	
+	@Autowired
+	private MusicGroupService musicGroupService;
+	
+	@Autowired
+	private OrganizationService organizationService;
+	
+	@Autowired
+	private StudentRegistrationDao studentRegistrationDao;
+	
+	@Autowired
+	private StudentRegistrationService studentRegistrationService;
+	
+	@Autowired
+	private ClassGroupDao classGroupDao;
+
+	@ApiOperation(value = "查询基本信息")
+	@GetMapping("/queryBasicInfo")
+	public Object queryBasicInfo(String musicGroupId) {
+		
+		MusicGroupBasicDto musicGroupBasicDto = musicGroupService.queryBasicInfo(musicGroupId);
+		
+		if(musicGroupBasicDto != null){
+			Integer cooperationOrganId = musicGroupBasicDto.getCooperationOrganId();
+			musicGroupBasicDto.setCooperationOrganLinkmanList(cooperationOrganLinkmanService.queryByCooperationOrganId(cooperationOrganId));
+		}
+		
+		return succeed(musicGroupBasicDto);
+	}
+
+	@ApiOperation(value = "查询学员、师资")
+	@GetMapping("/queryStudentAndTeacher")
+	public Object queryStudentAndTeacher(String musicGroupId) {
+		
+		MusicGroup musicGroup = musicGroupService.get(musicGroupId);
+		if(musicGroup == null){
+			return failed("乐团信息查询失败");
+		}
+		
+		ModelMap model = new ModelMap();
+
+		model.put("subject", studentRegistrationDao.countStudentWithSubjectByMusicGroupId(musicGroupId));
+		
+		model.put("gradeMap", organizationService.getGradeList(musicGroup.getOrganId()));
+		model.put("grade", studentRegistrationDao.countStudentWithGradeByMusicGroupId(musicGroupId));
+		model.put("teacher", classGroupDao.countTeacherByMusicGroupId(musicGroupId));
+		
+		return succeed(model);
+	}
+
+	@ApiOperation(value = "学员列表")
+	@GetMapping("/queryStudentInfo")
+	public Object queryStudentInfo(MusicGroupRecordStudentQueryInfo queryInfo) {
+		return succeed(studentRegistrationService.queryStudentRegisterInstrumentsDetailList(queryInfo));
+	}
+
+}

+ 102 - 0
mec-application/src/main/java/com/ym/mec/student/controller/MusicGroupRegisterController.java

@@ -0,0 +1,102 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
+import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
+import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
+import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.util.date.DateUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+
+@RequestMapping("${app-config.url.student:}/register")
+@Api(tags = "乐团注册")
+@RestController
+public class MusicGroupRegisterController extends BaseController {
+
+    @Autowired
+    private StudentRegistrationService studentRegistrationService;
+    @Autowired
+    private MusicGroupSubjectPlanService musicGroupSubjectPlanService;
+    @Autowired
+    private MusicGroupService musicGroupService;
+    @Autowired
+    private SysUserService sysUserService;
+    @Autowired
+    private StudentRegistrationDao studentRegistrationDao;
+
+
+    @ApiOperation(value = "新增学生报名信息")
+    @PostMapping("/add")
+    public HttpResponseResult add(@RequestBody StudentRegistration studentRegistration) throws Exception {
+        Integer userId = sysUserService.getUserId();
+        Date date = new Date();
+        MusicGroup musicGroup = musicGroupService.get(studentRegistration.getMusicGroupId());
+        if (musicGroup == null) {
+            return failed("乐团信息不存在");
+        }
+        /*if(musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE){
+            boolean hasMemberGroup = studentRegistrationDao.checkHasMemberGroup(musicGroup.getId(), userId);
+            if(hasMemberGroup){
+                throw new BizException("您已在其他会员团中,不可报名该乐团,请联系乐团主管");
+            }
+        }*/
+
+        if (date.compareTo(DateUtil.getLastTimeWithDay(musicGroup.getApplyExpireDate())) > 0 && studentRegistration.getId() == null) {
+            return failed("乐团已截止报名");
+        }
+
+        studentRegistration.setOrganId(musicGroup.getOrganId());
+        if (studentRegistration.getId() != null) {
+            return succeed(studentRegistrationService.updateStudent(studentRegistration));
+        }
+
+        StudentRegistration hasReg = studentRegistrationDao.getByUserIdAndMusicGroupId(studentRegistration.getMusicGroupId(),userId);
+        if (hasReg != null && hasReg.getMusicGroupStatus() != StudentMusicGroupStatusEnum.QUIT) {
+            return succeed(hasReg);
+        }
+        if (hasReg != null && hasReg.getMusicGroupStatus() == StudentMusicGroupStatusEnum.QUIT) {
+            return failed( "无法重复报名,请联系教务老师");
+        }
+        String err = studentRegistrationService.checkRegOrPayStatus(musicGroup.getId());
+        if (err != null) {
+            return failed(err + "不可报名,请联系教务老师");
+        }
+
+        if (musicGroup.getStatus().equals(MusicGroupStatusEnum.PAY) ||
+                musicGroup.getStatus().equals(MusicGroupStatusEnum.PREPARE) ||
+                musicGroup.getStatus().equals(MusicGroupStatusEnum.PROGRESS)
+        ) {
+            studentRegistration.setPaymentStatus(PaymentStatusEnum.OPEN);
+        } else {
+            studentRegistration.setPaymentStatus(PaymentStatusEnum.NO);
+        }
+
+        if (studentRegistration.getUserId() == null) {
+            studentRegistration.setUserId(userId);
+        }
+
+        return succeed(studentRegistrationService.addStudent(studentRegistration));
+    }
+
+    @ApiOperation(value = "获取乐团报名所需信息")
+    @GetMapping("/getMusicGroupRegInfo")
+    @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团编号", required = true, dataType = "String")})
+    public HttpResponseResult getMusicGroupRegInfo(String musicGroupId) {
+        return succeed(musicGroupSubjectPlanService.getMusicGroupRegInfo(musicGroupId));
+    }
+
+}

+ 32 - 0
mec-application/src/main/java/com/ym/mec/student/controller/OrganizationController.java

@@ -0,0 +1,32 @@
+package com.ym.mec.student.controller;
+
+
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.tenant.TenantContextHolder;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+
+@RequestMapping("${app-config.url.student:}/organization")
+@Api(tags = "分部服务")
+@RestController
+public class OrganizationController extends BaseController {
+
+    @Autowired
+    private OrganizationDao organizationDao;
+
+    @ApiOperation(value = "获取分部列表")
+    @GetMapping("/getOrgans")
+    public HttpResponseResult<List<Organization>> getOrgans() {
+        return succeed(organizationDao.findAllOrgans(TenantContextHolder.getTenantId()));
+    }
+}

+ 28 - 0
mec-application/src/main/java/com/ym/mec/student/controller/PageMonitorController.java

@@ -0,0 +1,28 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.entity.PageMonitor;
+import com.ym.mec.biz.service.PageMonitorService;
+import com.ym.mec.common.controller.BaseController;
+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.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequestMapping("${app-config.url.student:}/pageMonitor")
+@Api(tags = "页面监控")
+@RestController
+public class PageMonitorController extends BaseController {
+
+    @Autowired
+    private PageMonitorService pageMonitorService;
+
+    @ApiOperation(value = "新增页面监控")
+    @PostMapping("/add")
+    private Object add(PageMonitor pageMonitor){
+        pageMonitorService.add(pageMonitor);
+        return succeed();
+    }
+
+}

+ 360 - 0
mec-application/src/main/java/com/ym/mec/student/controller/PracticeGroupController.java

@@ -0,0 +1,360 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.PracticeGroupBuyDto;
+import com.ym.mec.biz.dal.dto.PracticeGroupBuyParamsDto;
+import com.ym.mec.biz.dal.entity.ClassGroup;
+import com.ym.mec.biz.dal.entity.CourseScheduleEvaluate;
+import com.ym.mec.biz.dal.entity.PracticeGroup;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.enums.GroupStatusEnum;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.PracticeGroupType;
+import com.ym.mec.biz.service.PracticeGroupService;
+import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
+import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.http.HttpUtil;
+import com.yonge.log.model.AuditLogAnnotation;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/1/31
+ */
+@RequestMapping("${app-config.url.student:}/practiceGroup")
+@Api(tags = "陪练课服务")
+@RestController
+public class PracticeGroupController extends BaseController {
+
+    @Autowired
+    private PracticeGroupService practiceGroupService;
+    @Autowired
+    private SysUserService sysUserService;
+    List<Integer> excludeOrganIds=new ArrayList<>(Arrays.asList(new Integer[]{36}));
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Autowired
+    private PracticeGroupDao practiceGroupDao;
+    @Autowired
+    private ClassGroupDao classGroupDao;
+    @Autowired
+    private SysConfigDao sysConfigDao;
+    @Autowired
+    private CourseScheduleEvaluateDao courseScheduleEvaluateDao;
+    @Autowired
+    private StudentDao studentDao;
+
+    @ApiOperation("获取学生的陪练课")
+    @GetMapping(value = "/findUserPracticeCourses")
+    public Object findUserPracticeCourses(){
+        return succeed(practiceGroupService.findUserPracticeCourses(sysUserService.getUserId()));
+    }
+
+    @ApiOperation("检测用户是否能够申请免费陪练课")
+    @GetMapping(value = "/checkCanApplyFreePracticeGroup")
+    private HttpResponseResult checkCanApplyFreePracticeGroup(){
+        SysUser sysUser = sysUserService.getUser();
+        Map<String,Object> result=practiceGroupService.checkCanApplyFreePracticeGroup(sysUser.getId());
+        Integer applyTimes = practiceGroupDao.countUserPracticeApplyRecord(sysUser.getId());
+        result.put("canApply", applyTimes < 1 ? 1 : 0);
+        result.put("organId", sysUser.getOrganId());
+        return succeed(result);
+    }
+
+    @ApiOperation("获取陪练课预约参数")
+    @GetMapping(value = "/getPracticeApplyParams")
+    public Object getPracticeApplyParams(){
+        SysUser sysUser = sysUserService.getUser();
+        if (sysUser.getTenantId() == null) {
+            return failed( "用户机构信息异常");
+        }
+        Map<String,Object> result=practiceGroupService.getPracticeApplyParams(sysUser.getId(),sysUser.getTenantId());
+        Integer applyTimes = practiceGroupDao.countUserPracticeApplyRecord(sysUser.getId());
+        result.put("enableApply", applyTimes < 1 ? 1 : 0);
+        return succeed(result);
+    }
+
+    @ApiOperation("获取可以预约的教师")
+    @GetMapping(value = "/getEnableApplyTeachers")
+    public Object getEnableApplyTeachers(Integer subjectId){
+        return succeed(practiceGroupService.getEnableApplyTeachers(sysUserService.getUserId(), subjectId));
+    }
+
+    @ApiOperation("获取可以预约的教师--付费")
+    @GetMapping(value = "/getEnableApplyTeachersWithPay")
+    public Object getEnableApplyTeachersWithPay(Integer subjectId){
+        return succeed(practiceGroupService.getEnableApplyTeachersWithPay(sysUserService.getUserId(), subjectId));
+    }
+
+    @ApiOperation("获取指定学员所在分部下的教师空闲时间")
+    @GetMapping(value = "/getTeacherFreeTimes")
+    public Object getTeacherFreeTimes(Integer teacherId, Date firstClassTime){
+        return succeed(practiceGroupService.getTeacherFreeTimes(sysUserService.getUserId(),teacherId,firstClassTime));
+    }
+
+    @ApiOperation("获取指定学员所在分部下的教师空闲时间")
+    @GetMapping(value = "/getTeachersFreeTimes")
+    public Object getTeachersFreeTimes(Integer subjectId, Date firstClassTime){
+        return succeed(practiceGroupService.getTeachersFreeTimes(sysUserService.getUserId(),subjectId,firstClassTime));
+    }
+
+    @ApiOperation("陪练课预约")
+    @PostMapping(value = "/practiceApply")
+    @AuditLogAnnotation(operateName = "陪练课预约")
+    public Object practiceApply(PracticeGroup practiceGroup){
+        SysUser sysUser = sysUserService.getUser();
+        if(excludeOrganIds.contains(sysUser.getOrganId())){
+            throw new BizException("请联系老师确认您的所属分部");
+        }
+        if(sysUser.getTenantId() == null){
+            throw new BizException("请联系老师确认您的所属机构");
+        }
+        practiceGroup.setStudentId(sysUser.getId());
+        practiceGroup.setTenantId(sysUser.getTenantId());
+        return succeed(practiceGroupService.practiceApply(practiceGroup));
+    }
+
+    @ApiOperation("获取陪练课预约参数——付费")
+    @GetMapping(value = "/getPayPracticeApplyParams")
+    public Object getPayPracticeApplyParams(Integer organId){
+        SysUser sysUser = sysUserService.getUser();
+        if(sysUser.getTenantId() == null){
+            throw new BizException("请联系老师确认您的所属机构");
+        }
+        return succeed(practiceGroupService.getPayPracticeApplyParams(sysUser.getId(), Objects.nonNull(organId)?organId:sysUser.getOrganId(),sysUser.getTenantId()));
+    }
+
+    @ApiOperation("获取指定教师的空闲时间——付费")
+    @GetMapping(value = "/getPayPracticeTeacherFreeTimes")
+    public Object getPayPracticeTeacherFreeTimes(Integer teacherId,Integer buyMonths, boolean renew, Long groupId, PracticeGroupType type){
+        SysUser sysUser = sysUserService.getUser();
+        Map payPracticeTeacherFreeTimes = practiceGroupService.getPayPracticeTeacherFreeTimes(sysUser.getId(),teacherId, buyMonths,renew,groupId);
+        if(Objects.nonNull(type)&&PracticeGroupType.COME_ON_PACKAGE.equals(type)){
+            Map<Integer, List<String>> weekNumApplyTimesMap = (Map<Integer, List<String>>) payPracticeTeacherFreeTimes.get("teacherFreeDays");
+            for (Map.Entry<Integer, List<String>> weekNumApplyTimesMapEntry : weekNumApplyTimesMap.entrySet()) {
+                DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
+                Iterator<String> iterator = weekNumApplyTimesMapEntry.getValue().iterator();
+                while (iterator.hasNext()){
+                    String timeStr = iterator.next();
+                    if("23:30:00".equals(timeStr)){
+                        iterator.remove();
+                        continue;
+                    }
+                    LocalTime time = LocalTime.parse(timeStr, dtf);
+                    LocalTime nextTime = time.plusMinutes(30);
+                    if(weekNumApplyTimesMapEntry.getValue().contains(nextTime.format(DateUtil.timeFormatter))){
+                        continue;
+                    }
+                    iterator.remove();
+                }
+            }
+            Iterator<Map.Entry<Integer, List<String>>> iterator = weekNumApplyTimesMap.entrySet().iterator();
+            while (iterator.hasNext()) {
+                Map.Entry<Integer, List<String>> next = iterator.next();
+                if (CollectionUtils.isEmpty(next.getValue())) {
+                    iterator.remove();
+                }
+            }
+        }
+        return succeed(payPracticeTeacherFreeTimes);
+    }
+
+    @ApiOperation("获取学生上一次的购买信息--付费")
+    @GetMapping(value = "/findUserLatestPracticeGroup")
+    public HttpResponseResult findUserLatestPracticeGroup(Long groupId){
+        return succeed(practiceGroupService.findUserLatestPracticeGroup(sysUserService.getUserId(),groupId));
+    }
+
+    @ApiOperation("检测学生是否是新用户")
+    @GetMapping(value = "/isNewStudent")
+    public HttpResponseResult isNewStudent(){
+        SysUser sysUser = sysUserService.getUser();
+        int studentExitChargePractices = practiceGroupDao.checkStudentExitChargePractice(sysUser.getId(),"2021-03-09 00:00:00");
+        Student student = studentDao.get(sysUser.getId());
+        if(student == null){
+            throw new BizException("学员信息不存在");
+        }
+        Map<String, Integer> result=new HashMap<>();
+        result.put("organId", sysUser.getOrganId());
+        result.put("isNewStudent", studentExitChargePractices<=0?0:1);
+
+        List<PracticeGroup> userStatusPracticeGroups = practiceGroupDao.findUserStatusPracticeGroups(sysUser.getId(), null, PracticeGroupType.COME_ON_PACKAGE);
+        long normalGroupNum = userStatusPracticeGroups.stream().filter(p -> GroupStatusEnum.NORMAL.equals(p.getGroupStatus())).count();
+        int comeOnPackage = student.getComeOnPackage()==null?0:student.getComeOnPackage();
+        result.put("comeOnPackage", 1==comeOnPackage&&normalGroupNum<=0?1:0);
+        return succeed(result);
+    }
+
+    @ApiOperation("陪练课购买")
+    @PostMapping(value = "/buyPracticeGroup")
+    @AuditLogAnnotation(operateName = "陪练课购买")
+    public HttpResponseResult buyPracticeGroup(@RequestBody PracticeGroupBuyDto practiceGroupBuyParams){
+        SysUser sysUser = sysUserService.getUser();
+        if(excludeOrganIds.contains(sysUser.getOrganId())){
+            throw new BizException("请联系老师确认您的所属分部");
+        }
+        practiceGroupBuyParams.setStudentId(sysUser.getId());
+        if(Objects.isNull(practiceGroupBuyParams.getType())||PracticeGroupType.CHARGE.equals(practiceGroupBuyParams.getType())){
+            return practiceGroupService.buyPracticeGroup(practiceGroupBuyParams, null);
+        }else{
+            return practiceGroupService.createPackagePracticeGroup(practiceGroupBuyParams, null);
+        }
+    }
+
+    @ApiOperation("学生主动排课(目前只适用于小小训练营活动)")
+    @PostMapping(value = "/createActivityPracticeGroup")
+    @AuditLogAnnotation(operateName = "学生主动排课(目前只适用于小小训练营活动)")
+    public HttpResponseResult createActivityPracticeGroup(@RequestBody PracticeGroupBuyDto practiceGroupBuyParams){
+        return practiceGroupService.studentCreateActivityPracticeGroup(practiceGroupBuyParams);
+    }
+
+    @ApiOperation(value = "获取网管课购买信息")
+    @PostMapping("/getPracticeGroupPayInfo")
+    public Object getPracticeGroupPayInfo(Long vipGroupId){
+        return succeed(practiceGroupService.getPracticeGroupPayInfo(vipGroupId,sysUserService.getUserId()));
+    }
+
+    @ApiOperation("营销活动购买")
+    @PostMapping(value = "/buyActivity")
+    @AuditLogAnnotation(operateName = "营销活动购买")
+    public HttpResponseResult buyActivity(@RequestBody PracticeGroupBuyParamsDto practiceGroupBuyParams) throws Exception {
+        SysUser sysUser = sysUserService.getUser();
+        practiceGroupBuyParams.setUserId(sysUser.getId());
+        practiceGroupBuyParams.setOrganId(sysUser.getOrganId());
+        return succeed(practiceGroupService.buyActivityPracticeGroup(practiceGroupBuyParams));
+    }
+
+    @ApiOperation("是否可以购买活动")
+    @GetMapping(value = "/checkActivity")
+    public HttpResponseResult checkActivity(){
+        practiceGroupService.checkActivity("2022_cloud_activity_config");
+        return succeed();
+    }
+
+    @ApiOperation(value = "购买指导老师创建的网管课")
+    @PostMapping("/buyTeacherPracticeGroup")
+    @AuditLogAnnotation(operateName = "购买指导老师创建的网管课")
+    public Object buyTeacherPracticeGroup(@RequestBody PracticeGroupBuyParamsDto practiceGroupBuyParams) throws Exception {
+        return practiceGroupService.buyTeacherPracticeGroup(practiceGroupBuyParams);
+    }
+
+    @ApiOperation("获取用户历史购买的陪练课")
+    @GetMapping(value = "/findUserHistoryBuyPracticeGroups")
+    public HttpResponseResult findUserHistoryBuyPracticeGroups(Long groupId, PracticeGroupType type){
+        return succeed(practiceGroupService.findUserHistoryBuyPracticeGroups(sysUserService.getUserId(), groupId, type));
+    }
+
+    @ApiOperation("查询订单信息")
+    @GetMapping(value = "/queryOrderInfo")
+    public HttpResponseResult queryOrderInfo(String orderNo){
+        return succeed(practiceGroupService.queryOrderInfo(orderNo));
+    }
+
+    @ApiOperation("重新支付")
+    @PostMapping(value = "/repay")
+    @AuditLogAnnotation(operateName = "重新支付")
+    public HttpResponseResult repay(Integer groupId, boolean useBalancePayment) throws Exception {
+        return practiceGroupService.repay(sysUserService.getUserId(),groupId,useBalancePayment);
+    }
+
+    @ApiOperation("免费陪练课定点推送")
+    @GetMapping(value = "/freePush")
+    public HttpResponseResult freePush(Integer userId, String pushType){
+        sysUserService.getUser();
+        String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+
+        String pushUrl = baseApiUrl + "/#/auditionbanner/id";
+
+//        String smsUrl = baseApiUrl + "/#/transfer?url=" + baseApiUrl + "/#/auditionbanner/id";
+//
+//        SysUser student = sysUserFeignService.queryUserById(userId);
+
+        if(pushType.equals("ALL")||pushType.equals("JIGUANG")){
+            Map<Integer, String> userMap = new HashMap<>();
+            userMap.put(userId, userId.toString());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_FREE_PRACTICE_APPLY_PUSH,
+                    userMap, null, 0, "5?" + pushUrl, "STUDENT");
+        }
+
+//        if(pushType.equals("ALL")||pushType.equals("SMS")){
+//            Map<Integer, String> userPhoneMap = new HashMap<>();
+//            userPhoneMap.put(userId, student.getPhone());
+//            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.FREE_PRACTICE_APPLY_PUSH,
+//                    userPhoneMap, null, 0, null, "STUDENT", HttpUtil.getSortUrl(smsUrl));
+//        }
+
+        return succeed();
+    }
+
+    @ApiOperation("陪练课完成报告推送")
+    @GetMapping(value = "/reportPush")
+    public HttpResponseResult reportPush(Integer userId, String pushType){
+        sysUserService.getUser();
+        String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+        PracticeGroup userFreePracticeGroup = practiceGroupDao.getUserFreePracticeGroup(userId);
+        ClassGroup classGroup = classGroupDao.findByMusicGroupAndType(userFreePracticeGroup.getId().toString(), GroupType.PRACTICE.getCode());
+
+        CourseScheduleEvaluate courseScheduleEvaluate = courseScheduleEvaluateDao.findByClassGroupId(classGroup.getId());
+        if(Objects.isNull(courseScheduleEvaluate)){
+            return failed("未生成课程报告");
+        }
+
+        String pushUrl = baseApiUrl + "/#/reportDetail?classGroupId=" + classGroup.getId();
+
+        String smsUrl = baseApiUrl + "/#/transfer?url=" + baseApiUrl + "&hash=reportDetail&classGroupId=" + classGroup.getId();
+
+        SysUser student = sysUserService.queryUserById(userId);
+
+        if(pushType.equals("ALL")||pushType.equals("JIGUANG")){
+            Map<Integer, String> userMap = new HashMap<>();
+            userMap.put(userId, userId.toString());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_PRACTICE_COMPLETED_STUDY_REPORT,
+                    userMap, null, 0, "5?" + pushUrl, "STUDENT", pushUrl);
+        }
+
+        if(pushType.equals("ALL")||pushType.equals("SMS")){
+            Map<Integer, String> userPhoneMap = new HashMap<>();
+            userPhoneMap.put(userId, student.getPhone());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_PUSH_PRACTICE_COMPLETED_STUDY_REPORT,
+                    userPhoneMap, null, 0, null, "STUDENT", HttpUtil.getSortUrl(smsUrl));
+        }
+
+        return succeed();
+    }
+
+    @ApiOperation("陪练课完成报告推送")
+    @GetMapping(value = "/pushStudyReport")
+    public HttpResponseResult pushStudyReport(Date expiredDate, String pushType){
+        sysUserService.getUser();
+        practiceGroupService.pushStudyReport(expiredDate,pushType);
+        return succeed();
+    }
+
+    @ApiOperation("检测用户是否存在待支付的课程组订单")
+    @GetMapping(value = "/checkExistWaitPayOrder")
+    public HttpResponseResult checkExistWaitPayOrder(Long groupId){
+        return succeed(practiceGroupService.checkExistWaitPayOrder(sysUserService.getUserId(),groupId));
+    }
+
+    @ApiOperation("取消待支付的订单")
+    @PostMapping(value = "/cancelWaitPayOrder")
+    @AuditLogAnnotation(operateName = "取消待支付的订单")
+    public HttpResponseResult cancelWaitPayOrder(Integer groupId) throws Exception{
+        return practiceGroupService.cancelWaitPayOrder(sysUserService.getUserId(), groupId);
+    }
+}

+ 42 - 0
mec-application/src/main/java/com/ym/mec/student/controller/PracticeLessonApplyController.java

@@ -0,0 +1,42 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.service.PracticeLessonApplyService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+
+@RequestMapping("${app-config.url.student:}/practiceLessonApply")
+@Api(tags = "陪练课服务")
+@RestController
+public class PracticeLessonApplyController extends BaseController {
+
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+	@Autowired
+	private PracticeLessonApplyService practiceLessonApplyService;
+
+	@ApiOperation("新增陪练课申请")
+	@PostMapping(value = "add")
+	public Object add(String memo) {
+		practiceLessonApplyService.add(memo);
+		return succeed();
+	}
+
+	@ApiOperation("根据用户编号查询是否申请过")
+	@GetMapping(value = "findPracticeByUser")
+	public Object findPracticeByUser() {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("获取用户信息失败");
+		}
+		return succeed(practiceLessonApplyService.findByUserId(sysUser.getId()));
+	}
+}

+ 27 - 0
mec-application/src/main/java/com/ym/mec/student/controller/QuestionnaireTopicController.java

@@ -0,0 +1,27 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.service.QuestionnaireTopicService;
+import com.ym.mec.common.controller.BaseController;
+import com.yonge.log.model.AuditLogAnnotation;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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;
+
+@RequestMapping("${app-config.url.student:}/questionnaireTopic")
+@Api(tags = "问题分类")
+@RestController
+public class QuestionnaireTopicController extends BaseController {
+
+    @Autowired
+    private QuestionnaireTopicService questionnaireTopicService;
+
+    @ApiOperation(value = "获取题目详情详情")
+    @GetMapping("/getDetail")
+    @AuditLogAnnotation(operateName = "获取题目详情详情")
+    public Object getDetail(Integer id) {
+        return succeed(questionnaireTopicService.getDetail(id));
+    }
+}

+ 68 - 0
mec-application/src/main/java/com/ym/mec/student/controller/QuestionnaireUserResultController.java

@@ -0,0 +1,68 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.QuestionnaireTopicDao;
+import com.ym.mec.biz.dal.dto.ReplacementInstrumentActivityDto;
+import com.ym.mec.biz.dal.entity.QuestionnaireTopic;
+import com.ym.mec.biz.dal.entity.QuestionnaireUserResult;
+import com.ym.mec.biz.dal.enums.QuestionnaireActiveTypeEnum;
+import com.ym.mec.biz.service.QuestionnaireUserResultService;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+
+@RequestMapping("${app-config.url.student:}/questionnaireUserResult")
+@Api(tags = "问题答案")
+@RestController
+public class QuestionnaireUserResultController extends BaseController {
+
+    @Autowired
+    private QuestionnaireUserResultService questionnaireUserResultService;
+    @Autowired
+    private QuestionnaireTopicDao questionnaireTopicDao;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "提交调查问卷")
+    @PostMapping("/add")
+    public Object add(@RequestBody ReplacementInstrumentActivityDto replacementInstrumentActivityDto) {
+        questionnaireUserResultService.add(replacementInstrumentActivityDto);
+        return succeed();
+    }
+
+    @ApiOperation(value = "获取用户答题详情")
+    @RequestMapping("/queryUserResult")
+    public Object queryUserResult(Integer topicId) {
+        return succeed(questionnaireUserResultService.queryUserResult(topicId));
+    }
+
+    @ApiOperation(value = "是否可以提交问卷")
+    @GetMapping("/commitFlag")
+    public Object commitFlag(Integer cooperationId, QuestionnaireActiveTypeEnum activeType) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            throw new BizException("请登录");
+        }
+        HashMap<String, Object> paramMap = new HashMap<>(3);
+        paramMap.put("activeId",cooperationId);
+        paramMap.put("activeType",activeType.getCode());
+        paramMap.put("userId",sysUser.getId());
+        List<QuestionnaireUserResult> userResults = questionnaireUserResultService.findAll(paramMap);
+        if(userResults == null || userResults.size() == 0){
+            return succeed(true);
+        }
+        QuestionnaireUserResult result = userResults.get(0);
+        QuestionnaireTopic topic = questionnaireTopicDao.get(result.getQuestionnaireTopicId());
+        if(topic.getAgainCommitFlag() == 1){
+            return succeed(true);
+        }
+        return succeed(false);
+    }
+}

+ 40 - 0
mec-application/src/main/java/com/ym/mec/student/controller/RechargeController.java

@@ -0,0 +1,40 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.service.StudentRechargeService;
+import com.ym.mec.biz.service.SysUserCashAccountService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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 javax.annotation.Resource;
+import java.math.BigDecimal;
+
+@RequestMapping("${app-config.url.student:}/recharge")
+@Api(tags = "账户充值")
+@RestController
+public class RechargeController extends BaseController {
+	@Resource
+	private SysUserFeignService sysUserFeignService;
+	@Autowired
+	private StudentRechargeService rechargeService;
+
+	@Autowired
+	private SysUserCashAccountService sysUserCashAccountService;
+
+	@ApiOperation("充值")
+	@GetMapping(value = "/recharge")
+	public Object recharge(String bankCardNo, BigDecimal amount) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("获取用户信息失败");
+		}
+
+		return succeed(rechargeService.recharge(sysUser.getId(), bankCardNo, amount));
+	}
+}

+ 180 - 0
mec-application/src/main/java/com/ym/mec/student/controller/RepairController.java

@@ -0,0 +1,180 @@
+package com.ym.mec.student.controller;
+
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.StudentGoodsSell;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.StudentRepair;
+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.enums.PayStatus;
+import com.ym.mec.biz.dal.page.GoodsCategoryQueryInfo;
+import com.ym.mec.biz.dal.page.GoodsQueryInfo;
+import com.ym.mec.biz.dal.page.GoodsSellQueryInfo;
+import com.ym.mec.biz.dal.page.RepairStudentQueryInfo;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+@RequestMapping("${app-config.url.student:}/repair")
+@Api(tags = "学生维修服务")
+@RestController
+public class RepairController extends BaseController {
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private StudentRepairService studentRepairService;
+    @Autowired
+    private StudentPaymentOrderService studentPaymentOrderService;
+    @Autowired
+    private GoodsService goodsService;
+    @Autowired
+    private GoodsCategoryService goodsCategoryService;
+    @Autowired
+    private StudentGoodsSellService studentGoodsSellService;
+
+    @ApiOperation("添加商品销售订单")
+    @PostMapping(value = "/addGoodsSellOrder")
+    public HttpResponseResult addGoodsSellOrder(@RequestBody StudentGoodsSell studentGoodsSell) throws Exception {
+        if(studentGoodsSell.getUserId() == null){
+            SysUser sysUser = sysUserFeignService.queryUserInfo();
+            if (sysUser == null) {
+                throw new BizException("请登录");
+            }
+            studentGoodsSell.setUserId(sysUser.getId());
+        }
+        if (studentGoodsSell.getIsRepeatPay() == false) {
+            List<StudentPaymentOrder> list = studentPaymentOrderService.queryByCondition(GroupType.GOODS_SELL, null, studentGoodsSell.getUserId(), DealStatusEnum.ING,
+                    OrderTypeEnum.GOODS_SELL);
+            if (list.size() > 0) {
+            	StudentPaymentOrder applyOrder = list.get(list.size() - 1);
+            	// 查询订单状态
+                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder);
+                if(payStatus == PayStatus.SUCCESSED){
+            		throw new BizException("订单已支付成功,请勿重复支付");
+            	}/*else if(payStatus == PayStatus.PAYING){
+            		throw new BizException("订单还在交易中,请稍后重试");
+            	}*/
+                return failed(HttpStatus.CONTINUE, "您有待支付的订单");
+            }
+        }
+        studentGoodsSell.setAuthorUser(studentGoodsSell.getUserId());
+        Map map = studentRepairService.addGoodsSellOrder(studentGoodsSell);
+        if(map.containsKey("tradeState")){
+            return failed(HttpStatus.CREATED, map,"恭喜您,购买成功!");
+        }
+        return succeed(map);
+    }
+
+    @ApiOperation("学员扫码支付")
+    @PostMapping(value = "/studentPaymentGoodsOrder")
+    public HttpResponseResult studentPaymentGoodsOrder(Integer goodsSellId) throws Exception {
+        Map map = studentRepairService.studentPaymentGoodsOrder(goodsSellId);
+        if(map.containsKey("tradeState")){
+            return failed(HttpStatus.CREATED, map,"恭喜您,购买成功!");
+        }
+        return succeed(map);
+    }
+
+
+
+    @ApiOperation("获取维修记录")
+    @GetMapping(value = "/getStudentRepairList")
+    public HttpResponseResult getStudentRepairList(RepairStudentQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        queryInfo.setStudentId(sysUser.getId());
+        queryInfo.setPayStatus(2);
+        return succeed(studentRepairService.queryPage(queryInfo));
+    }
+
+    @ApiOperation("获取维修记录详情")
+    @GetMapping(value = "/getRepairInfo")
+    public HttpResponseResult getRepairInfo(Integer id,Integer studentId) {
+        Optional.ofNullable(studentId)
+                .map(sysUserFeignService::queryUserById)
+                .orElseThrow(() -> new BizException("用户信息获取失败"));
+
+        StudentRepair repairInfo = studentRepairService.getRepairInfo(id);
+        if (!repairInfo.getStudentId().equals(studentId)) {
+            return failed("您的维修记录不存在");
+        }
+        return succeed(repairInfo);
+    }
+
+    @ApiOperation("支付维修单")
+    @PostMapping(value = "/payRepair")
+    public HttpResponseResult payRepair(@RequestBody StudentRepair repairInfo) throws Exception {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(studentRepairService.payRepair(repairInfo));
+    }
+
+    @ApiOperation("获取维修技师信息")
+    @PostMapping(value = "/getRepairer")
+    public HttpResponseResult getRepairer() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(studentRepairService.getStudentRepairer(sysUser.getId(),sysUser.getOrganId()));
+    }
+
+    @ApiOperation(value = "分页查询商品(教材、辅件)列表")
+    @GetMapping("/queryGoodsPage")
+    public Object queryPage(GoodsQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            throw new BizException("请先登录");
+        }
+        queryInfo.setStudentShowOrganId(sysUser.getOrganId().toString());
+        return succeed(goodsService.queryPage(queryInfo));
+    }
+
+    @ApiOperation(value = "分页查询商品分类列表")
+    @GetMapping("/queryGoodsCategoryPage")
+    public Object queryGoodsCategoryPage(GoodsCategoryQueryInfo queryInfo) {
+        return succeed(goodsCategoryService.queryPage(queryInfo));
+    }
+
+    @ApiOperation(value = "分页查询学员商品订单")
+    @GetMapping("/queryStudentGoodsOrders")
+    public Object queryStudentGoodsOrders(GoodsSellQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        queryInfo.setStudentId(sysUser.getId());
+        return succeed(studentGoodsSellService.queryStudentGoodsOrders(queryInfo));
+    }
+
+    @ApiOperation(value = "获取学员商品订单")
+    @GetMapping("/getStudentGoodsOrder")
+    public Object getStudentGoodsOrder(Integer goodsSellId) {
+        return succeed(studentGoodsSellService.getStudentGoodsOrder(goodsSellId));
+    }
+
+    @ApiOperation(value = "确认收货")
+    @PostMapping("/affirmReceive")
+    public Object affirmReceive(String orderNo) {
+        studentGoodsSellService.affirmReceive(orderNo);
+        return succeed();
+    }
+}

+ 186 - 0
mec-application/src/main/java/com/ym/mec/student/controller/ReplacementInstrumentActivityController.java

@@ -0,0 +1,186 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.ReplacementInstrumentActivityDto;
+import com.ym.mec.biz.dal.dto.ReplacementInstrumentActivityStatDto;
+import com.ym.mec.biz.dal.dto.ReplacementPayDto;
+import com.ym.mec.biz.dal.entity.ReplacementInstrumentActivity;
+import com.ym.mec.biz.dal.entity.ReplacementInstrumentCooperation;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.enums.PayStatus;
+import com.ym.mec.biz.service.ReplacementInstrumentActivityService;
+import com.ym.mec.biz.service.ReplacementInstrumentCooperationService;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@RequestMapping("${app-config.url.student:}/replacementInstrumentActivity")
+@Api(tags = "乐器置换调查问卷")
+@RestController
+public class ReplacementInstrumentActivityController extends BaseController {
+
+    @Autowired
+    private ReplacementInstrumentActivityService replacementInstrumentActivityService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private ReplacementInstrumentCooperationService replacementInstrumentCooperationService;
+    @Autowired
+    private StudentPaymentOrderService studentPaymentOrderService;
+
+    @ApiOperation(value = "新增调查问卷")
+    @PostMapping("/insert")
+    public Object add(ReplacementInstrumentActivity replacementInstrumentActivity) {
+        return succeed(replacementInstrumentActivityService.add(replacementInstrumentActivity));
+    }
+
+    @ApiOperation(value = "新版新增调查问卷")
+    @PostMapping("/apply")
+    public Object apply(@RequestBody ReplacementInstrumentActivityDto replacementInstrumentActivityDto) {
+        return succeed(replacementInstrumentActivityService.apply(replacementInstrumentActivityDto));
+    }
+
+    @ApiOperation(value = "新版获取学员基本信息")
+    @GetMapping("queryUserInfoByCooperationId")
+    public Object queryUserInfoByCooperationId(Integer cooperationId) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        ReplacementInstrumentCooperation replacementInstrumentCooperation = replacementInstrumentCooperationService.get(cooperationId);
+        Integer cooperationOrganId = replacementInstrumentCooperation.getCooperationOrganId();
+        return succeed(replacementInstrumentActivityService.queryUserInfo(cooperationOrganId,user,cooperationId));
+    }
+
+    @ApiOperation(value = "获取学员基本信息")
+    @GetMapping("queryUserInfo")
+    public Object queryUserInfo(Integer cooperationOrganId) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        ReplacementInstrumentCooperation cooperation = replacementInstrumentCooperationService.findByCooperationOrganIdAndTopicId(cooperationOrganId,null);
+        return succeed(replacementInstrumentActivityService.queryUserInfo(cooperationOrganId,user,cooperation.getId()));
+    }
+
+    @ApiOperation(value = "修改调查问卷")
+    @PostMapping("/update")
+    public Object update(ReplacementInstrumentActivity replacementInstrumentActivity) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败,请重新登陆");
+        }
+        replacementInstrumentActivityService.update(replacementInstrumentActivity);
+        return succeed();
+    }
+
+    @ApiOperation(value = "获取调查问卷")
+    @GetMapping("/get")
+    public Object get(Integer id) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败,请重新登陆");
+        }
+        return succeed(replacementInstrumentActivityService.get(id));
+    }
+
+    @ApiOperation(value = "获取置换的详情")
+    @GetMapping("/getInfo")
+    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "置换id", required = true, dataType = "int")})
+    public HttpResponseResult<ReplacementInstrumentActivityStatDto> getInfo(Integer id) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败,请重新登陆");
+        }
+        return succeed(replacementInstrumentActivityService.getInfo(id));
+    }
+
+    @ApiOperation(value = "获取置换的详情")
+    @GetMapping("/getInfoByCooperationOrganId")
+    @ApiImplicitParams({@ApiImplicitParam(name = "cooperationOrganId", value = "合作单位id", required = true, dataType = "int")})
+    public HttpResponseResult<ReplacementInstrumentActivityStatDto> getInfoByCooperationOrganId(Integer cooperationOrganId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请重新登陆");
+        }
+        ReplacementInstrumentActivity replacementInstrumentActivity = replacementInstrumentActivityService.findByUserId(cooperationOrganId, sysUser.getId(),null);
+        if(replacementInstrumentActivity == null){
+        	return failed("未查询到您参与调查的记录");
+        }
+        Integer activityId = replacementInstrumentActivity.getId();
+        return succeed(replacementInstrumentActivityService.getInfo(activityId));
+    }
+
+    @ApiOperation(value = "新版获取置换的详情")
+    @GetMapping("/getInfoByCooperationId")
+    @ApiImplicitParams({@ApiImplicitParam(name = "cooperationId", value = "置换活动编号", required = true, dataType = "int")})
+    public HttpResponseResult<ReplacementInstrumentActivityStatDto> getInfoByCooperationId(Integer cooperationId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请重新登陆");
+        }
+        ReplacementInstrumentCooperation replacementInstrumentCooperation = replacementInstrumentCooperationService.get(cooperationId);
+        ReplacementInstrumentActivity replacementInstrumentActivity = replacementInstrumentActivityService.findByUserId(replacementInstrumentCooperation.getCooperationOrganId(),
+                sysUser.getId(),
+                replacementInstrumentCooperation.getId());
+        if(replacementInstrumentActivity == null){
+        	return failed("未查询到您参与调查的记录");
+        }
+        Integer activityId = replacementInstrumentActivity.getId();
+        return succeed(replacementInstrumentActivityService.getInfo(activityId));
+    }
+
+    @ApiOperation(value = "置换支付")
+    @PostMapping("/pay")
+    public HttpResponseResult pay(@RequestBody ReplacementPayDto replacementPayDto) throws Exception {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败,请重新登陆");
+        }
+        ReplacementInstrumentActivity replacementInstrumentActivity = replacementInstrumentActivityService.get(replacementPayDto.getId());
+        if (replacementInstrumentActivity == null) {
+            throw new BizException("乐器置换不存在,请核查");
+        }
+        if (!sysUser.getId().equals(replacementInstrumentActivity.getUserId())) {
+            throw new BizException("该乐器置换不属于您,请核查");
+        }
+
+        if (replacementInstrumentActivity.getInstrumentsId() == null || replacementInstrumentActivity.getInstrumentsId() == 0) {
+            throw new BizException("没有置换的乐器,请核查");
+        }
+
+        //是否已支付
+        if (replacementInstrumentActivity.getPayStatus().equals(2)) {
+            return failed("您已支付成功,请勿重复支付");
+        }
+        //判断用户是否已存在订单
+        if (replacementInstrumentActivity.getPayStatus().equals(1) && !replacementPayDto.getRePay()) {
+        	
+        	StudentPaymentOrder applyOrder = studentPaymentOrderService.getUserReplacementIngOrder(replacementInstrumentActivity.getUserId(), replacementInstrumentActivity.getId());
+        	// 查询订单状态
+            PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder);
+            if(payStatus == PayStatus.SUCCESSED){
+        		throw new BizException("订单已支付成功,请勿重复支付");
+        	}/*else if(payStatus == PayStatus.PAYING){
+        		throw new BizException("订单还在交易中,请稍后重试");
+        	}*/
+            return failed(HttpStatus.CONTINUE, "您有待支付的订单");
+        }
+        Map payMap = replacementInstrumentActivityService.pay(replacementPayDto);
+        if (payMap.containsKey("tradeState")) {
+            return failed(HttpStatus.CREATED, payMap, "恭喜您,支付成功!");
+        }
+        return succeed(payMap);
+    }
+}

+ 39 - 0
mec-application/src/main/java/com/ym/mec/student/controller/ReplacementInstrumentController.java

@@ -0,0 +1,39 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.ReplacementInstrument;
+import com.ym.mec.biz.dal.page.ReplacementInstrumentQueryInfo;
+import com.ym.mec.biz.service.ReplacementInstrumentService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequestMapping("${app-config.url.student:}/replacementInstrument")
+@Api(tags = "乐器置换商品服务")
+@RestController
+public class ReplacementInstrumentController extends BaseController {
+
+    @Autowired
+    private ReplacementInstrumentService replacementInstrumentService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "分页查询列表")
+    @GetMapping("/queryPage")
+    public HttpResponseResult<PageInfo<ReplacementInstrument>> queryPage(ReplacementInstrumentQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        queryInfo.setOrganId(sysUser.getOrganId());
+        return succeed(replacementInstrumentService.getPageList(queryInfo));
+    }
+
+}

+ 32 - 0
mec-application/src/main/java/com/ym/mec/student/controller/ResourceRepositoryController.java

@@ -0,0 +1,32 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.dto.MenuQueryInfo;
+import com.ym.mec.biz.service.ResourceRespositoryService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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;
+
+@RequestMapping("${app-config.url.student:}/resourceRepository")
+@Api(tags = "资源服务")
+@RestController
+public class ResourceRepositoryController extends BaseController {
+
+    @Autowired
+    private ResourceRespositoryService resourceRepositoryService;
+
+    @ApiOperation(value = "获取资源")
+    @GetMapping("/get")
+    public Object get(Integer id){
+        return succeed(resourceRepositoryService.get(id));
+    }
+
+    @ApiOperation(value = "获取资源列表")
+    @GetMapping("/queryTree")
+    public Object queryTree(MenuQueryInfo menuQueryInfo){
+        return succeed(resourceRepositoryService.queryTree(menuQueryInfo));
+    }
+}

+ 87 - 0
mec-application/src/main/java/com/ym/mec/student/controller/SmsCodeController.java

@@ -0,0 +1,87 @@
+package com.ym.mec.student.controller;
+
+import com.wf.captcha.SpecCaptcha;
+import com.wf.captcha.utils.CaptchaUtil;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.service.SmsCodeService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.security.SecurityConstants;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.concurrent.TimeUnit;
+
+@RestController
+@RequestMapping("${app-config.url.student:}/code")
+@Api(tags = "验证码服务")
+public class SmsCodeController extends BaseController {
+
+    @Autowired
+    private SmsCodeService smsCodeService;
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @ApiOperation(value = "发送登录短信验证码")
+    @ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String")
+    @PostMapping(value = "/sendSms")
+    public Object sendLoginVerifyCode(String mobile) throws Exception {
+        smsCodeService.sendValidCode(mobile);
+        return succeed();
+    }
+
+    @ApiOperation(value = "校验短信验证码")
+    @ApiImplicitParams({ @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "code", value = "短信验证码", required = true, dataType = "String") })
+    @PostMapping(value = "/verifySmsCode")
+    public Object verifySmsCode(String phone,String code) {
+        if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)){
+            return failed(SecurityConstants.PARAM_VERIFY_EXCEPTION);
+        }
+        if(smsCodeService.verifyValidCode(phone,code)){
+            return succeed();
+        }
+        return failed("验证码校验失败");
+    }
+
+    @PostMapping(value = "/verifyLoginImage")
+    @ApiOperation("校验登录图形验证码")
+    @ApiImplicitParams({ @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "code", value = "验证码", required = true, dataType = "String") })
+    public Object verifyImageCode(String phone,String code){
+        if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)){
+            return failed(SecurityConstants.PARAM_VERIFY_EXCEPTION);
+        }
+        String redisKey = MessageTypeEnum.KAPTCHA_SESSION_KEY + phone;
+        RBucket<String> bucket = redissonClient.getBucket(redisKey);
+        if(bucket.isExists()){
+            if(StringUtils.equalsIgnoreCase(bucket.get(),code)){
+                return succeed();
+            }
+        }
+        return failed(SecurityConstants.VERIFY_FAILURE);
+    }
+
+    @RequestMapping("/getLoginImage")
+    @ApiOperation("获取登录图片验证码")
+    @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String")
+    public void getLoginImage(HttpServletRequest request, HttpServletResponse response,String phone) throws Exception {
+        if(StringUtils.isEmpty(phone)){
+            throw new BizException("请输入手机号");
+        }
+        SpecCaptcha specCaptcha = new SpecCaptcha(125, 45, 4);
+        redissonClient.getBucket(MessageTypeEnum.KAPTCHA_SESSION_KEY + phone).set(specCaptcha.text(),3,TimeUnit.MINUTES);
+        CaptchaUtil.out(specCaptcha, request, response);
+    }
+}

+ 133 - 0
mec-application/src/main/java/com/ym/mec/student/controller/SporadicChargeInfoController.java

@@ -0,0 +1,133 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
+import com.ym.mec.biz.dal.dto.SporadicPayDto;
+import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.dal.enums.PayStatus;
+import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.biz.service.SporadicChargeInfoService;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@RequestMapping("${app-config.url.student:}/sporadicChargeInfo")
+@Api(tags = "零星收费")
+@RestController
+public class SporadicChargeInfoController extends BaseController {
+
+    @Autowired
+    private SporadicChargeInfoService sporadicChargeInfoService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private StudentPaymentOrderService studentPaymentOrderService;
+    @Autowired
+    private StudentPaymentOrderDao studentPaymentOrderDao;
+    @Autowired
+    private MusicGroupService musicGroupService;
+
+    @ApiOperation(value = "单查询")
+    @GetMapping("/get")
+    public Object get(Integer id, Integer userId) {
+        return succeed(sporadicChargeInfoService.findDetail(id, userId));
+    }
+
+
+    @ApiOperation(value = "零星支付")
+    @PostMapping("/sporadicPay")
+    public HttpResponseResult sporadicPay(@RequestBody SporadicPayDto sporadicPayDto) throws Exception {
+        if (sporadicPayDto == null ||
+                sporadicPayDto.getSporadicId() == null ||
+                sporadicPayDto.getAmount() == null) {
+            throw new BizException("参数校验失败");
+        }
+        if (sporadicPayDto.getUserId() == null) {
+            SysUser sysUser = sysUserFeignService.queryUserInfo();
+            if (sysUser == null || sysUser.getId() == null) {
+                return failed("用户不存在");
+            }
+            sporadicPayDto.setUserId(sysUser.getId());
+        }
+        if (sporadicPayDto.getRepeatPay() == false) {
+        	List<StudentPaymentOrder> studentPaymentOrderList = studentPaymentOrderDao.findPaymentOrderByGroupType(sporadicPayDto.getUserId(), sporadicPayDto.getSporadicId(), "SPORADIC", DealStatusEnum.ING);
+            if (studentPaymentOrderList != null && studentPaymentOrderList.size() > 0) {
+            	StudentPaymentOrder applyOrder = studentPaymentOrderList.get(studentPaymentOrderList.size() - 1);
+            	// 查询订单状态
+                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder);
+                if(payStatus == PayStatus.SUCCESSED){
+            		throw new BizException("订单已支付成功,请勿重复支付");
+            	}
+                return failed(HttpStatus.CONTINUE, "您有待支付的订单");
+            }
+        }
+        SporadicChargeInfo info = sporadicChargeInfoService.get(sporadicPayDto.getSporadicId());
+
+        if (info.getMaxAmount() != null) {
+            String msg = "";
+            for (int i = 1; i <= 100; i++) {
+                try {
+                    Map payMap = musicGroupService.sporadicPay(sporadicPayDto);
+                    if (payMap.containsKey("tradeState")) {
+                        return failed(HttpStatus.CREATED, payMap,"恭喜您,支付成功!");
+                    }
+                    return succeed(payMap);
+                } catch (Exception e) {
+                    msg = e.getMessage();
+                    if (e instanceof BizException) {
+                        int max = 100, min = 1;
+                        int times = (int) (Math.random() * (max - min) + min);
+                        Thread.sleep(times);
+                        continue;
+                    }
+                    break;
+                }
+            }
+            return failed(msg);
+        }
+
+        Map payMap = musicGroupService.sporadicPay(sporadicPayDto);
+        if (payMap.containsKey("tradeState")) {
+            return failed(HttpStatus.CREATED, payMap,"恭喜您,支付成功!");
+        }
+        return succeed(payMap);
+    }
+
+
+    @ApiOperation(value = "福袋活动信息")
+    @GetMapping("/activityInfo")
+    @ApiImplicitParams({@ApiImplicitParam(name = "type", value = "类型(福袋活动6)", required = true, dataType = "String")})
+    public HttpResponseResult activityInfo(Integer type) throws Exception {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || sysUser.getId() == null) {
+            return failed("请先登录");
+        }
+        if (sysUser.getOrganId() == null) {
+            return failed("用户信息有误,没有分部信息");
+        }
+        Integer organId = sysUser.getOrganId();
+
+        if (type == null || type <= 0) {
+            return failed("参数不合法");
+        }
+        SporadicChargeInfo chargeInfo = sporadicChargeInfoService.findByOrganIdAndType(organId, type);
+        if (chargeInfo == null) {
+            return failed("分部活动不存在");
+        }
+        return succeed(chargeInfo);
+    }
+}

+ 37 - 0
mec-application/src/main/java/com/ym/mec/student/controller/StudentAttendanceController.java

@@ -0,0 +1,37 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.page.StudentAttendanceQueryInfo;
+import com.ym.mec.biz.service.StudentAttendanceService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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;
+
+@RequestMapping("${app-config.url.student:}/studentAttendance")
+@Api(tags = "学生考勤服务")
+@RestController
+public class StudentAttendanceController extends BaseController {
+
+    @Autowired
+    private StudentAttendanceService studentAttendanceService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+
+    @ApiOperation(value = "获取某节课学生签到列表")
+    @GetMapping("/findStudentAttendance")
+    public Object findStudentAttendance(StudentAttendanceQueryInfo queryInfo){
+    	SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        queryInfo.setStudentID(sysUser.getId());
+        return succeed(studentAttendanceService.findStudentAttendance(queryInfo));
+    }
+
+}

+ 75 - 0
mec-application/src/main/java/com/ym/mec/student/controller/StudentCompetitionController.java

@@ -0,0 +1,75 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.StudentCompetitionRankingDto;
+import com.ym.mec.biz.dal.entity.StudentCompetition;
+import com.ym.mec.biz.service.StudentCompetitionService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.tenant.TenantContextHolder;
+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.*;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2020.11.10
+ */
+@RestController
+@RequestMapping("${app-config.url.student:}/studentCompetition")
+@Api(tags = "长三角比赛服务")
+public class StudentCompetitionController extends BaseController {
+
+    @Autowired
+    private StudentCompetitionService studentCompetitionService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "新增参赛作品")
+    @PostMapping("/add")
+    public HttpResponseResult add(@RequestBody StudentCompetition studentCompetition){
+        if(StringUtils.isBlank(studentCompetition.getUsername())||StringUtils.isBlank(studentCompetition.getIdCardNo())){
+            return failed("参赛选手身份信息不完整");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("请登录");
+        }
+        studentCompetition.setUserId(sysUser.getId());
+        studentCompetitionService.addStudentCompetition(studentCompetition);
+        return succeed();
+    }
+
+    @ApiOperation(value = "检测学生是否已有上传作品")
+    @GetMapping("/checkIsUpload")
+    public HttpResponseResult<StudentCompetition> checkIsUpload(){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("请登录");
+        }
+        return succeed(studentCompetitionService.checkIsUpload(sysUser.getId()));
+    }
+
+    @ApiOperation(value = "获取获奖名单")
+    @GetMapping("/getWinnerList")
+    public HttpResponseResult<List<StudentCompetitionRankingDto>> getWinnerList(){
+        return succeed(studentCompetitionService.getWinnerList(TenantContextHolder.getTenantId()));
+    }
+
+    @ApiOperation(value = "获取指定参赛作品详情")
+    @GetMapping("/get")
+    public HttpResponseResult<StudentCompetition> get(Long competitionId){
+        StudentCompetition studentCompetition = studentCompetitionService.get(competitionId);
+        if(Objects.isNull(studentCompetition)||!studentCompetition.isShow()){
+            return succeed();
+        }
+        return succeed(studentCompetition);
+    }
+
+}

+ 60 - 0
mec-application/src/main/java/com/ym/mec/student/controller/StudentController.java

@@ -0,0 +1,60 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.StudentPreRegistration;
+import com.ym.mec.biz.service.StudentService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+@RequestMapping("${app-config.url.student:}/student")
+@Api(tags = "学生服务")
+@RestController
+public class StudentController extends BaseController {
+
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private StudentService studentService;
+
+    @ApiOperation("注册")
+    @PostMapping(value = "/registering")
+    public Object registering(@RequestBody StudentPreRegistration studentPreRegistration) {
+    	// 判断用户是否存在
+        SysUser user = sysUserFeignService.queryUserByMobile(studentPreRegistration.getPhone());
+        if(user != null && user.getId() != null){
+        	if(user.getUserType().contains("STUDENT")){
+        		return succeed("您已注册,请直接下载APP!");
+        	}
+        }
+        return studentService.register(studentPreRegistration) ? succeed() : failed();
+    }
+
+	@ApiOperation("更换声部")
+	@PostMapping(value = "/updateSubject")
+	public Object updateSubject(Integer subjectId) {
+		SysUser user = sysUserFeignService.queryUserInfo();
+		if (user == null || user.getId() == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		Student student = studentService.get(user.getId());
+
+		if (student != null) {
+			student.setSubjectIdList(subjectId + "");
+			student.setUpdateTime(new Date());
+			studentService.update(student);
+		}
+		return succeed();
+	}
+}

+ 184 - 0
mec-application/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java

@@ -0,0 +1,184 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
+import com.ym.mec.biz.dal.dto.HomeworkStat;
+import com.ym.mec.biz.dal.dto.StudentHomeworkRecordDto;
+import com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply;
+import com.ym.mec.biz.dal.entity.StudentCourseHomework;
+import com.ym.mec.biz.dal.entity.StudentLessonTrainingDetail;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.yonge.log.model.AuditLogAnnotation;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/9/18
+ */
+@RequestMapping("${app-config.url.student:}/studentCourseHomework")
+@Api(tags = "学生作业")
+@RestController
+public class StudentCourseHomeworkController extends BaseController {
+
+    @Autowired
+    private StudentCourseHomeworkService studentCourseHomeworkService;
+    @Autowired
+    private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
+    @Autowired
+    private SysUserService sysUserService;
+    @Autowired
+    private StudentServeService studentServeService;
+
+    @Autowired
+    private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
+
+    @ApiOperation(value = "提交作业")
+    @PostMapping(value = "/add",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    @AuditLogAnnotation(operateName = "提交作业")
+    public Object add(@RequestBody StudentCourseHomework studentCourseHomework){
+        studentCourseHomeworkService.add(studentCourseHomework);
+        return succeed();
+    }
+
+    @ApiOperation(value = "重新提交")
+    @PostMapping(value = "/update",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    @AuditLogAnnotation(operateName = "重新提交")
+    public Object update(@RequestBody StudentCourseHomework studentCourseHomework){
+        studentCourseHomework.setStatus(YesOrNoEnum.YES);
+        studentCourseHomework.setId(studentCourseHomework.getCourseHomeworkId());
+        studentCourseHomework.setCourseHomeworkId(null);
+        studentCourseHomeworkService.submitHomework(studentCourseHomework);
+        return succeed();
+    }
+
+    @ApiOperation(value = "重新提交-公用")
+    @PostMapping(value = "/updatePublic",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    @AuditLogAnnotation(operateName = "重新提交-公用")
+    public Object updatePublic(@RequestBody StudentCourseHomework studentCourseHomework){
+        if(!studentCourseHomework.isExtra()){
+            studentCourseHomework.setStatus(YesOrNoEnum.YES);
+            studentCourseHomework.setId(studentCourseHomework.getCourseHomeworkId());
+            studentCourseHomework.setCourseHomeworkId(null);
+            studentCourseHomeworkService.submitHomework(studentCourseHomework);
+        }else{
+            ExtracurricularExercisesReply extracurricularExercisesReply = new ExtracurricularExercisesReply();
+            extracurricularExercisesReply.setId(studentCourseHomework.getCourseHomeworkId());
+            extracurricularExercisesReply.setAttachments(studentCourseHomework.getAttachments());
+            extracurricularExercisesReplyService.submitExtraExercise(extracurricularExercisesReply);
+        }
+        return succeed();
+    }
+
+    @ApiOperation(value = "获取学生作业界面详细信息")
+    @GetMapping(value = "/findCourseHomeworkStudentDetail")
+    public Object findCourseHomeworkStudentDetail(Long courseScheduleID) {
+        return succeed(studentCourseHomeworkService.findCourseHomeworkStudentDetail(courseScheduleID,sysUserService.getUserId().longValue()));
+    }
+
+    @ApiOperation(value = "获取学生作业界面详细信息-公用")
+    @GetMapping(value = "/findCourseHomeworkStudentDetailPublic")
+    public Object findCourseHomeworkStudentDetailPublic(Long courseScheduleID, boolean extra) {
+        if(!extra){
+            return succeed(studentCourseHomeworkService.findCourseHomeworkStudentDetail(courseScheduleID,sysUserService.getUserId().longValue()));
+        }else{
+            return succeed(extracurricularExercisesReplyService.findStudentExtraExerciseDetail(courseScheduleID));
+        }
+    }
+
+    @ApiOperation(value = "获取学生作业记录")
+    @GetMapping(value = "/findStudentHomeworkRecord")
+    public HttpResponseResult<PageInfo<StudentHomeworkRecordDto>> findStudentHomeworkRecord(CourseHomeworkQueryInfo queryInfo){
+        queryInfo.setUserId(sysUserService.getUserId().longValue());
+        return succeed(studentCourseHomeworkService.findStudentHomeworkRecord(queryInfo));
+    }
+
+
+    @ApiOperation(value = "获取学生作业记录")
+    @GetMapping(value = "/findStudentHomeworkRecord/v2")
+    public HttpResponseResult<PageInfo<StudentHomeworkRecordDto>> findStudentHomeworkRecordV2( CourseHomeworkQueryInfo queryInfo){
+        queryInfo.setUserId(sysUserService.getUserId().longValue());
+        queryInfo.setVersionTag("v2");
+        return succeed(studentCourseHomeworkService.findStudentHomeworkRecord(queryInfo));
+    }
+
+    @ApiOperation(value = "获取学生作业详情")
+    @GetMapping(value = "/findStudentHomeworkRecordDetail/v2")
+    public HttpResponseResult<CourseHomeworkWrapper.CourseHomeworkList>
+            findStudentHomeworkRecordDetail(CourseHomeworkWrapper.StudentCourseHomeworkQuery query){
+        query.setUserId(sysUserService.getUserId().longValue());
+        return succeed(studentCourseHomeworkService.findStudentHomeworkRecordDetail(query));
+    }
+
+
+
+    @ApiOperation(value = "添加作业练习记录")
+    @GetMapping(value = "/addStudentHomeworkRecord")
+    public HttpResponseResult<Boolean>
+        addStudentHomeworkRecord(CourseHomeworkWrapper.AddStudentHomeworkRecord query){
+        query.setUserId(sysUserService.getUserId().longValue());
+        return succeed(studentCourseHomeworkService.addStudentHomeworkRecord(query));
+    }
+
+    @ApiOperation(value = "分页查询作业列表")
+    @PostMapping(value = "/queryPage")
+    public Object queryPage(@RequestBody(required = false) CourseHomeworkQueryInfo queryInfo){
+        if(queryInfo == null){
+            queryInfo = new CourseHomeworkQueryInfo();
+        }
+        PageInfo<StudentCourseHomework> studentCourseHomeworkPageInfo = studentCourseHomeworkService.queryPage(queryInfo);
+        return succeed(studentCourseHomeworkPageInfo);
+    }
+
+    @ApiOperation(value = "乐团作业情况")
+    @GetMapping("/musicGroupHomeworkStat")
+    public HttpResponseResult musicGroupHomeworkStat(String musicGroupId, String year, Integer term) {
+        if(StringUtils.isEmpty(year)){
+            throw new BizException("请录入年份");
+        }
+        if(term == null){
+            throw new BizException("请录入学期");
+        }
+        String startDay = "";
+        String endDay = "";
+        if(term == 0){
+            startDay = year + "-03-01";
+            endDay = year + "-08-31";
+        }else {
+            startDay = year + "-09-01";
+            endDay = (Integer.valueOf(year) + 1) + "-02-01";
+        }
+
+        return succeed(studentServeService.musicGroupHomeworkStatWithStu(musicGroupId, sysUserService.getUserId(), startDay, endDay));
+    }
+
+
+
+    @ApiOperation(value = "学生端-乐团作业情况")
+    @GetMapping("/homeworkStat")
+    public HttpResponseResult<List<HomeworkStat>> homeworkStat() {
+
+        Integer userId = sysUserService.getUserId();
+
+        return succeed(studentServeService.homeworkStat(userId));
+    }
+
+    @ApiOperation(value = "课后训练的作业详情")
+    @GetMapping("/homeworkDetail")
+    public HttpResponseResult<StudentLessonTrainingDetail> homeworkStat(Integer id) {
+
+        return succeed(studentLessonTrainingDetailService.getById(id));
+    }
+
+}

+ 123 - 0
mec-application/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkReplyController.java

@@ -0,0 +1,123 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.StudentCourseHomeworkDao;
+import com.ym.mec.biz.dal.dto.StudentCourseHomeworkCommentDto;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.ExtracurricularExercisesMessage;
+import com.ym.mec.biz.dal.entity.StudentCourseHomework;
+import com.ym.mec.biz.dal.entity.StudentCourseHomeworkReply;
+import com.ym.mec.biz.dal.page.StudentCourseHomeworkReplyQueryInfo;
+import com.ym.mec.biz.service.ExtracurricularExercisesMessageService;
+import com.ym.mec.biz.service.StudentCourseHomeworkReplyService;
+import com.ym.mec.biz.service.StudentServeService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.yonge.log.model.AuditLogAnnotation;
+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.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/9/19
+ */
+
+@RequestMapping("${app-config.url.student:}/studentCourseHomeworkReply")
+@Api(tags = "作业评论-学生端")
+@RestController
+public class StudentCourseHomeworkReplyController extends BaseController {
+
+    @Autowired
+    private StudentCourseHomeworkReplyService studentCourseHomeworkReplyService;
+    @Autowired
+    private StudentCourseHomeworkDao studentCourseHomeworkDao;
+    @Autowired
+    private ExtracurricularExercisesMessageService extracurricularExercisesMessageService;
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private StudentServeService studentServeService;
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
+
+    @ApiOperation(value = "新增回复")
+    @PostMapping("/add")
+    public Object add(@RequestBody StudentCourseHomeworkReply studentCourseHomeworkReply) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        studentCourseHomeworkReply.setUserId(sysUser.getId());
+        studentCourseHomeworkReplyService.insert(studentCourseHomeworkReply);
+        return succeed();
+    }
+
+    @ApiOperation(value = "新增回复-公用")
+    @PostMapping("/addPublic")
+    @AuditLogAnnotation(operateName = "新增回复-公用")
+    public Object addPublic(@RequestBody StudentCourseHomeworkReply studentCourseHomeworkReply) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        if(!studentCourseHomeworkReply.isExtra()){
+            studentCourseHomeworkReply.setUserId(sysUser.getId());
+            studentCourseHomeworkReplyService.insert(studentCourseHomeworkReply);
+            StudentCourseHomework studentCourseHomework = studentCourseHomeworkDao.get(studentCourseHomeworkReply.getStudentCourseHomeworkId());
+            CourseSchedule courseSchedule = courseScheduleDao.get(studentCourseHomework.getCourseScheduleId());
+            studentServeService.updateExercisesSituation(courseSchedule.getMusicGroupId(), courseSchedule.getClassDate(), new ArrayList<>(Arrays.asList(sysUser.getId())), courseSchedule.getActualTeacherId());
+        }else{
+            ExtracurricularExercisesMessage extracurricularExercisesMessage=new ExtracurricularExercisesMessage();
+            extracurricularExercisesMessage.setExtracurricularExercisesReplyId(studentCourseHomeworkReply.getStudentCourseHomeworkId());
+            extracurricularExercisesMessage.setContent(studentCourseHomeworkReply.getContent());
+            extracurricularExercisesMessage.setUserId(sysUser.getId());
+            extracurricularExercisesMessage.setMsgType(studentCourseHomeworkReply.getMsgType());
+            extracurricularExercisesMessage.setRole("STUDENT");
+            extracurricularExercisesMessageService.addStudentExtraExerciseComment(extracurricularExercisesMessage);
+        }
+        return succeed();
+    }
+
+    @ApiOperation(value = "回复查询")
+    @PostMapping("/queryPage")
+    public HttpResponseResult<PageInfo<StudentCourseHomeworkCommentDto>> queryPage(@RequestBody StudentCourseHomeworkReplyQueryInfo queryInfo){
+        //前端表示这个参数必填,所以加上了参数校验
+        if(queryInfo.getStudentCourseHomeworkId() == null){
+            throw new BizException("参数校验异常");
+        }
+        return succeed(studentCourseHomeworkReplyService.queryReplyPage(queryInfo));
+    }
+
+    @ApiOperation(value = "回复查询-公用")
+    @PostMapping("/queryPagePublic")
+    public Object queryPagePublic(@RequestBody StudentCourseHomeworkReplyQueryInfo queryInfo){
+        if(queryInfo.getStudentCourseHomeworkId() == null){
+            throw new BizException("参数校验异常");
+        }
+        if(!queryInfo.isExtra()){
+            return succeed(studentCourseHomeworkReplyService.queryPage(queryInfo));
+        }else{
+            return succeed(extracurricularExercisesMessageService.findStudentExtraExerciseComments(queryInfo));
+        }
+    }
+
+    @ApiOperation(value = "删除回复")
+    @DeleteMapping("/del/{id}")
+    public Object del(@ApiParam(value = "回复ID", required = true) @PathVariable("id") Long id){
+        studentCourseHomeworkReplyService.delete(id);
+        return succeed();
+    }
+
+}

+ 106 - 0
mec-application/src/main/java/com/ym/mec/student/controller/StudentCourseScheduleController.java

@@ -0,0 +1,106 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.CourseScheduleComplaints;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.page.StudentCourseScheduleRecordQueryInfo;
+import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.biz.service.StudentAttendanceService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.util.date.DateUtil;
+import com.yonge.log.model.AuditLogAnnotation;
+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.web.bind.annotation.*;
+
+import java.util.Date;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/9/24
+ */
+@RequestMapping("${app-config.url.student:}/studentCourseSchedule")
+@Api(tags = "课程计划服务")
+@RestController
+public class StudentCourseScheduleController extends BaseController {
+
+	@Autowired
+	private CourseScheduleService scheduleService;
+	@Autowired
+	private StudentAttendanceService studentAttendanceService;
+	@Autowired
+	private SysUserService sysUserService;
+
+	@ApiOperation(value = "根据月份获取乐团在该月有课的日期")
+	@GetMapping("/getCourseScheduleDateByMonth")
+	public Object getCourseScheduleDateByMonth(@ApiParam(value = "月份", required = true) @RequestParam Date month,
+			@ApiParam(value = "未上课", required = true) Integer isAttend) {
+		return succeed(scheduleService.getCourseScheduleDateByStudent(month, isAttend));
+	}
+
+	@ApiOperation(value = "根据日期获取当日排课")
+	@GetMapping("/getCourseSchedulesWithDate")
+	public Object getCourseSchedulesWithDate(@ApiParam(value = "日期", required = true) Date date) {
+		return succeed(scheduleService.getStudentCourseSchedulesWithDate(date));
+	}
+
+	@ApiOperation(value = "上课记录")
+	@GetMapping(value = "/findStudentCourseScheduleRecords")
+	public Object findStudentCourseScheduleRecords(StudentCourseScheduleRecordQueryInfo queryInfo) {
+		return succeed(scheduleService.findStudentCourseScheduleRecords(queryInfo));
+	}
+
+	@ApiOperation(value = "课程投诉")
+	@PostMapping("/courseScheduleCommplaint")
+	public Object courseScheduleCommplaint(CourseScheduleComplaints courseScheduleComplaints) {
+		scheduleService.courseScheduleCommplaint(courseScheduleComplaints);
+		return succeed();
+	}
+
+	@ApiOperation(value = "请假")
+	@PostMapping("/leave")
+	@AuditLogAnnotation(operateName = "请假")
+	public Object leave(Long courseScheduleId, String reason) {
+		SysUser user = sysUserService.getUser();
+		if (user.getTenantId() == null) {
+			return failed("机构信息异常,请联系老师确认机构信息");
+		}
+		studentAttendanceService.leave(user.getId(), courseScheduleId, reason,user.getTenantId());
+		return succeed();
+	}
+
+	@ApiOperation(value = "根据课程组获取课程组老师信息")
+	@GetMapping("/teacherCourseHeadInfo")
+	public Object teacherCourseHeadInfo(GroupType groupType,String groupId,Long courseScheduleId){
+		return succeed(scheduleService.getTeacherCourseHeadInfo(groupType,groupId,courseScheduleId));
+	}
+
+	@ApiOperation(value = "根据课程组获取课表信息")
+	@GetMapping("/queryCourseInfoByGroupId")
+	public Object queryCourseInfoByGroupId(GroupType groupType,String groupId){
+		return succeed(scheduleService.queryCourseInfoByGroupId(groupType,groupId));
+	}
+
+	@ApiOperation(value = "获取本周课程规划")
+	@GetMapping("/queryCoursePlan")
+	public Object queryCoursePlan(){
+		Date now = new Date();
+		
+		Date startDate = DateUtil.getWeekMondayWithDate(now);
+		startDate = DateUtil.formatHMSToZero(startDate);
+		
+		Date endDate = DateUtil.addDays(startDate, 7);
+		endDate = DateUtil.getLastSecondWithDay(endDate);
+		
+		return succeed(scheduleService.queryMusicCoursePlan(sysUserService.getUserId(), startDate, endDate));
+	}
+
+    @ApiOperation(value = "获取课程信息")
+    @GetMapping("/queryCourseId")
+    public Object queryCourseId(Long courseId){
+        return succeed(scheduleService.detailLiveCourse(courseId));
+    }
+}

+ 54 - 0
mec-application/src/main/java/com/ym/mec/student/controller/StudentDemoGroupController.java

@@ -0,0 +1,54 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.dto.QueryConditionDto;
+import com.ym.mec.biz.dal.page.StudentDemoGroupQueryInfo;
+import com.ym.mec.biz.service.DemoGroupService;
+import com.ym.mec.biz.service.SubjectService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/9/25
+ */
+@Api(tags = "试听课-学生端")
+@RequestMapping("${app-config.url.student:}/studentDemoGroup")
+@RestController
+public class StudentDemoGroupController extends BaseController {
+
+    @Autowired
+    private DemoGroupService demoGroupService;
+    @Autowired
+    private SubjectService subjectService;
+
+    @ApiOperation("获取试听课筛选条件")
+    @GetMapping(value = "/findQueryCondition")
+    public Object findQueryCondition(){
+        List<QueryConditionDto> conditions=new ArrayList<>();
+        conditions.add(new QueryConditionDto("乐器选择","subjectId",subjectService.findSubjectConditions()));
+        return succeed(conditions);
+    }
+
+    @ApiOperation(value = "试听课列表获取")
+    @PostMapping("/queryStudentDemoGroups")
+    public Object queryStudentDemoGroups(@RequestBody StudentDemoGroupQueryInfo queryInfo){
+        if(Objects.isNull(queryInfo.getSubjectIds())||Objects.isNull(queryInfo.getStartTime())){
+            return failed("参数错误!");
+        }
+        return succeed(demoGroupService.queryStudentDemoGroups(queryInfo));
+    }
+
+    @ApiOperation(value = "试听课订阅")
+    @PostMapping("/demoGroupSubscribe")
+    public Object demoGroupSubscribe(Long demoGroupId,Long coursePlanId){
+        demoGroupService.demoGroupSubscribe(demoGroupId,coursePlanId);
+        return succeed();
+    }
+}

+ 32 - 0
mec-application/src/main/java/com/ym/mec/student/controller/StudentImLiveRoomVideoController.java

@@ -0,0 +1,32 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.vo.ImLiveRoomVideoVo;
+import com.ym.mec.biz.service.ImLiveRoomVideoService;
+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.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Api(tags = "直播回放录像记录表")
+@RestController
+@RequestMapping("${app-config.url.student:}/imLiveRoomVideo")
+public class StudentImLiveRoomVideoController extends BaseController {
+
+    /**
+     * 服务对象
+     */
+    @Resource
+    private ImLiveRoomVideoService imLiveRoomVideoService;
+
+    @ApiOperation("查询该机构目前推广的直播间")
+    @GetMapping(value = "/queryList")
+    public HttpResponseResult<List<ImLiveRoomVideoVo>> queryList(String roomUid) {
+        return succeed(imLiveRoomVideoService.queryList(roomUid));
+    }
+}

+ 54 - 0
mec-application/src/main/java/com/ym/mec/student/controller/StudentInstrumentController.java

@@ -0,0 +1,54 @@
+package com.ym.mec.student.controller;
+
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.StudentInstrumentDao;
+import com.ym.mec.biz.dal.dto.MaintenancePayDto;
+import com.ym.mec.biz.dal.entity.StudentInstrument;
+import com.ym.mec.biz.dal.page.StudentInstrumentQueryInfo;
+import com.ym.mec.biz.service.StudentInstrumentService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@RequestMapping("${app-config.url.student:}/studentInstrument")
+@Api(tags = "乐器与乐保服务")
+@RestController
+public class StudentInstrumentController extends BaseController {
+    @Autowired
+    private StudentInstrumentService studentInstrumentService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private StudentInstrumentDao studentInstrumentDao;
+
+    @ApiOperation(value = "获取乐器与乐保列表")
+    @GetMapping("/getList")
+    public HttpResponseResult<PageInfo<StudentInstrument>> getList(StudentInstrumentQueryInfo queryInfo) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || user.getId() == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        queryInfo.setStudentId(user.getId());
+        studentInstrumentDao.batchUpdate();
+        return succeed(studentInstrumentService.queryPage(queryInfo));
+    }
+
+    @ApiOperation(value = "乐保支付")
+    @PostMapping("/pay")
+    public HttpResponseResult pay(@RequestBody MaintenancePayDto maintenancePayDto) throws Exception {
+        Map payMap = studentInstrumentService.pay(maintenancePayDto);
+        if (payMap.containsKey("tradeState")) {
+            return failed(HttpStatus.CREATED, payMap, "恭喜您,支付成功!");
+        }
+        return succeed(payMap);
+    }
+}

+ 406 - 0
mec-application/src/main/java/com/ym/mec/student/controller/StudentManageController.java

@@ -0,0 +1,406 @@
+package com.ym.mec.student.controller;
+
+import com.microsvc.toolkit.middleware.oss.wrapper.OssWrapper;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
+import com.ym.mec.biz.dal.dto.CashAccountDetail;
+import com.ym.mec.biz.dal.entity.AppVersionInfo;
+import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
+import com.ym.mec.biz.dal.entity.MemberRankSetting;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.Subject;
+import com.ym.mec.biz.dal.entity.SysConfig;
+import com.ym.mec.biz.dal.entity.SysSuggestion;
+import com.ym.mec.biz.dal.entity.SysUserBankCard;
+import com.ym.mec.biz.dal.enums.ClientEnum;
+import com.ym.mec.biz.dal.wrapper.ImGroupWrapper;
+import com.ym.mec.biz.service.AppVersionInfoService;
+import com.ym.mec.biz.service.ClassGroupService;
+import com.ym.mec.biz.service.ImGroupNoticeService;
+import com.ym.mec.biz.service.MemberRankPrivilegesService;
+import com.ym.mec.biz.service.MemberRankSettingService;
+import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.biz.service.StudentManageService;
+import com.ym.mec.biz.service.StudentService;
+import com.ym.mec.biz.service.SubjectService;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.SysSuggestionService;
+import com.ym.mec.biz.service.SysUserBankCardService;
+import com.ym.mec.biz.service.SysUserCashAccountDetailService;
+import com.ym.mec.biz.service.SysUserCashAccountService;
+import com.ym.mec.biz.service.UploadFileService;
+import com.ym.mec.biz.service.ImGroupCoreService;
+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.page.QueryInfo;
+import com.ym.mec.thirdparty.entity.UploadSign;
+import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.http.HttpUtil;
+import com.ym.mec.util.upload.UploadUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Api(tags = "学生管理")
+@RestController
+@RequestMapping("${app-config.url.student:}/")
+public class StudentManageController extends BaseController {
+
+    @Autowired
+    private SysSuggestionService suggestionService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private SysUserCashAccountService sysUserCashAccountService;
+    @Autowired
+    private SysUserCashAccountDetailService sysUserCashAccountDetailService;
+    @Autowired
+    private ClassGroupService classGroupService;
+    @Autowired
+    private ImGroupNoticeService imGroupNoticeService;
+    @Autowired
+    private SysUserBankCardService sysUserBankCardService;
+    @Autowired
+    private StudentManageService studentManageService;
+    @Autowired
+    private SubjectService subjectService;
+    @Autowired
+    private OrganizationService organizationService;
+    @Autowired
+    private StudentService studentService;
+
+	@Autowired
+	private AppVersionInfoService appVersionInfoService;
+    
+    @Autowired
+    private MemberRankSettingService memberRankSettingService;
+    
+    @Autowired
+    private MemberRankPrivilegesService memberRankPrivilegesService;
+    
+    @Autowired
+    private SysConfigService sysConfigService;
+    
+    @Autowired
+    private CloudTeacherOrderDao cloudTeacherOrderDao;
+    @Autowired
+    private ImGroupCoreService imGroupCoreService;
+
+    private final static Logger LOGGER = LoggerFactory.getLogger(StudentManageController.class);
+
+    @Autowired
+    private UploadFileService uploadFileService;
+
+    @PostMapping(value = "uploadFile")
+    public Object uploadFile(@ApiParam(value = "上传的文件", required = true) @RequestParam("file") MultipartFile file) {
+        try {
+            if (file != null && StringUtils.isNotBlank(file.getOriginalFilename())) {
+                UploadReturnBean bean = uploadFileService.uploadFile(file.getInputStream(), UploadUtil.getExtension(file.getOriginalFilename()));
+                if (bean.isStatus()) {
+                    return succeed(bean);
+                }
+                return failed(bean.getMessage());
+            }
+        } catch (Exception e) {
+            LOGGER.error("上传失败", e);
+        }
+        return failed("上传失败");
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "bucketName", dataType = "String", value = "为空时默认使用daya"),
+            @ApiImplicitParam(name = "fileName", dataType = "String", value = "要上传的文件名称,不包含路径信息"),
+            @ApiImplicitParam(name = "postData", dataType = "Map", value = "1.如果使用js sdk上传的时候设置了ACL请设置,例\"acl\":\"public-read\"值要与SDK中一致,没有则删除该项</br>" +
+                    "2.提供js sdk中的key值,例\"key\":\"20150115/中文/${filename}\""),
+            @ApiImplicitParam(name = "unknowValueField", dataType = "List", value = "对于用户无法确定表单值的放在unknownValueField中(比如有的上传控件会添加一些表单项,但表单项的值可能是随机的)"),
+            @ApiImplicitParam(name = "pluginName", dataType = "String", value = "插件名称,默认ks3,可选值:ks3,aliyun,tencent"),
+    })
+    @ApiOperation(value = "获取上传文件签名", notes = "{\n" +
+            "    \"bucketName\":\"\",\n" +
+            "    \"filename\":\"test.png\",\n" +
+            "    \"postData\":{\n" +
+            "        \"acl\":\"public-read\",\n" +
+            "        \"key\":\"20150115/中文/${filename}\"\n" +
+            "    },\n" +
+            "    \"unknowValueField\":[\"test\"]\n" +
+            "}")
+    @PostMapping("/getUploadSign")
+    public HttpResponseResult<OssWrapper.ResponseSign> getUploadSign(@RequestParam(defaultValue = "ks3") String pluginName,
+                                                                     @RequestBody UploadSign uploadSign) {
+        // 设置默认文件存储服务方
+        uploadSign.setPluginName(pluginName);
+
+        return succeed(uploadFileService.getUploadSign(uploadSign));
+    }
+
+    @ApiOperation(value = "新增建议")
+    @PostMapping("suggestion/add")
+    public Object add(SysSuggestion sysSuggestion) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            return failed("请重新登录");
+        }
+    	sysSuggestion.setClientType("STUDENT");
+        sysSuggestion.setUserId(sysUser.getId().longValue());
+        if(StringUtils.isEmpty(sysSuggestion.getMobileNo())){
+            sysSuggestion.setMobileNo(sysUser.getPhone());
+        }
+        suggestionService.insert(sysSuggestion);
+        return succeed();
+    }
+
+
+    @ApiOperation(value = "获取学员基本信息")
+    @GetMapping("student/queryUserInfo")
+	public Object queryUserInfo(String platform) {
+		SysUser user = sysUserFeignService.queryUserInfo();
+		if (user == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		Student student = studentService.get(user.getId());
+		student.setId(user.getId());
+		student.setUsername(user.getUsername());
+		student.setAvatar(user.getAvatar());
+		student.setPhone(user.getPhone());
+		student.setCurrentClass(user.getCurrentClass());
+		student.setCurrentGrade(user.getCurrentGrade());
+		student.setBirthdate(user.getBirthdate());
+		student.setGender(user.getGender());
+		student.setRealName(user.getRealName());
+		student.setIdCardNo(user.getIdCardNo());
+		student.setImToken(user.getImToken());
+		student.setOrganId(user.getOrganId());
+
+        // 注册IM用户Token
+        try {
+            ImGroupWrapper.ImUserInfo register = imGroupCoreService.getUserSig(String.valueOf(student.getId()),
+                ClientEnum.STUDENT.getCode());
+
+            // 设置用户Token
+            student.setImToken(register.getImToken());
+            // 设置用户IM用户ID
+//            student.setImUserId(register.getImUserId());
+        } catch (Exception e) {
+            LOGGER.error("注册IM用户Token失败", e);
+        }
+		
+		if(StringUtils.isNotBlank(student.getSubjectIdList())){
+			List<Subject> subjectList = subjectService.findBySubjectByIdList(student.getSubjectIdList());
+			student.setSubjectNames(subjectList.stream().map(t -> t.getName()).collect(Collectors.joining(",")));
+		}
+		
+		if(StringUtils.isNotBlank(student.getExtSubjectIds())){
+			List<Subject> subjectList = subjectService.findBySubjectByIdList(student.getExtSubjectIds());
+			
+			student.setExtSjectNamesMap(subjectList.stream().collect(Collectors.toMap(Subject :: getId, Subject :: getName)));
+		}
+
+		Map<String, Object> datas = new HashMap<String, Object>();
+		datas.put("student", student);
+		
+        List<CloudTeacherOrder> dataList = cloudTeacherOrderDao.queryByUserIdAndStatus(user.getId(),1);
+        if(dataList != null && dataList.size() > 0){
+        	datas.put("isExistPendingMember", true);
+        }else{
+        	datas.put("isExistPendingMember", false);
+        }
+
+		if (StringUtils.isNotBlank(platform)) {
+			AppVersionInfo appVersionInfo = null;
+			List<AppVersionInfo> list = appVersionInfoService.queryNewestByPlatform(platform);
+			if (list.size() > 0) {
+				appVersionInfo = list.get(0);
+			}
+			datas.put("appVersionInfo", appVersionInfo);
+		}
+
+		// 查询权限
+		if (student.getMemberRankSettingId() == null || student.getMemberRankSettingId() == 0) {
+			List<MemberRankSetting> memberRankSettingList = memberRankSettingService.queryListByIsDefault(true);
+			if (memberRankSettingList != null && memberRankSettingList.size() > 0) {
+				datas.put("userPrivileges", memberRankPrivilegesService.queryByMemberRankId(memberRankSettingList.get(0).getId()));
+			}
+		} else {
+			datas.put("userPrivileges", memberRankPrivilegesService.queryByMemberRankId(student.getMemberRankSettingId()));
+		}
+		SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.HOMEWORK_OPEN_FLAG);
+		if (sysConfig == null) {
+			datas.put("homeworkOpenFlag", 0);
+		} else {
+			datas.put("homeworkOpenFlag", Integer.parseInt(sysConfig.getParanValue()));
+		}
+        // 获取会员等级图标
+        MemberRankSetting memberRankSetting = memberRankSettingService.get(student.getMemberRankSettingId());
+        if (memberRankSetting != null) {
+            student.setMemberRankImg(memberRankSetting.getIcon());
+        }
+        //是否是试用会员
+		if(student.getExperienceMemberRankSettingId() == null){
+            datas.put("isExperience", 0);
+        }else {
+            int i = DateUtil.daysBetween(student.getExperienceMembershipEndTime(),student.getMembershipEndTime());
+            if(i > 0){
+                datas.put("isExperience", 0);
+            }else {
+                datas.put("isExperience", 1);
+                if (memberRankSetting != null) {
+                    student.setMemberRankImg(memberRankSetting.getExperienceIcon());
+                }
+            }
+        }
+		return succeed(datas);
+	}
+
+    @ApiOperation(value = "根据群编号,获取群组所有成员基本信息")
+    @GetMapping("classGroup/findGroupUsers")
+    public Object findGroupUsers(Integer groupId,String search) {
+        if (groupId == null) {
+            return failed("参数校验错误");
+        }
+        return succeed(classGroupService.findGroupUsers(groupId,search));
+    }
+
+    @ApiOperation(value = "分页查询群公告列表")
+    @GetMapping(value = "/queryNoticePage")
+    public Object queryNoticePage(QueryInfo queryInfo){
+        return succeed(imGroupNoticeService.queryPage(queryInfo));
+    }
+
+    @ApiOperation(value = "根据群编号,获取用户群名片")
+    @GetMapping("classGroup/getUserInfoWithUserId")
+    public Object getUserInfoWithUserId(Integer groupId,Integer userId) {
+        if (groupId == null || userId == null) {
+            return failed("参数校验错误");
+        }
+        return succeed(classGroupService.getUserInfoWithUserId(groupId,userId));
+    }
+
+    @ApiOperation(value = "获取用户账户信息")
+    @GetMapping("userCashAccount/get")
+    public Object add() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            return failed("请重新登录");
+        }
+        return succeed(sysUserCashAccountService.get(sysUser.getId()));
+    }
+
+    @ApiOperation(value = "分页查询用户交易明细")
+    @GetMapping("userCashAccountDetail/queryPage")
+    public Object queryPage(CashAccountDetail queryInfo) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if(user == null || user.getId() != null){
+            return failed("请重新登录");
+        }
+        queryInfo.setUserId(user.getId());
+        return succeed(sysUserCashAccountDetailService.queryPage(queryInfo));
+    }
+
+    @ApiOperation(value = "新增银行卡信息")
+    @PostMapping("userBankCard/add")
+    public Object add(SysUserBankCard sysUserBankCard) {
+        if(sysUserBankCard == null){
+            return failed("参数校验异常");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null || sysUser.getId() == null){
+            return failed("获取用户失败");
+        }
+        sysUserBankCard.setUserId(sysUser.getId());
+        return succeed(sysUserBankCardService.add(sysUserBankCard));
+    }
+
+    @ApiOperation(value = "删除银行卡信息")
+    @PostMapping("userBankCard/del")
+    public Object del(Long id) {
+        if(id == null){
+            return failed("参数校验失败");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null || sysUser.getId() == null){
+            return failed("获取用户信息失败");
+        }
+        sysUserBankCardService.del(id,sysUser.getId());
+        return succeed();
+    }
+
+    @ApiOperation(value = "分页查询银行卡信息列表")
+    @GetMapping("userBankCard/queryPage")
+    public Object queryPage() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null || sysUser.getId() == null){
+            return failed("获取用户失败");
+        }
+        return succeed(sysUserBankCardService.findByUser(sysUser.getId()));
+    }
+
+    @ApiOperation(value = "修改用户")
+    @PostMapping(value = "user/update", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+    public Object update(SysUser sysUser) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user != null) {
+            Date date = new Date();
+            sysUser.setId(user.getId());
+            sysUser.setUpdateTime(date);
+            studentManageService.updateUser(sysUser);
+            return succeed();
+        }
+        return failed("获取用户失败");
+    }
+
+    /**
+     * 学员注册激活比例列表
+     * @return
+     */
+    @GetMapping(value = "studentManage/queryStudentPer/{tenantId}")
+    public Object queryStudentPer(@ApiParam(value = "机构Id", required = true) @PathVariable("tenantId") Integer tenantId) {
+        return succeed(studentManageService.queryStudentPer(tenantId));
+    }
+
+
+    @ApiOperation(value = "获取子集科目列表")
+    @GetMapping("subject/findSubSubjects")
+    public Object findSubSubjects(){
+        return succeed(subjectService.findSubSubjects(null));
+    }
+
+    @ApiOperation(value = "获取用户所在分部的年级列表)")
+    @GetMapping("studentManage/getGradeList")
+    public HttpResponseResult<Map<Integer,String>> getGradeList() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            return failed("请重新登录");
+        }
+        return succeed(organizationService.getGradeList(sysUser.getOrganId()));
+    }
+
+    @ApiOperation(value = "url短链接")
+    @PostMapping("shortURL")
+    public HttpResponseResult<String> shortURL(String orginURL) {
+        return succeed(HttpUtil.getSortUrl(orginURL));
+    }
+}

+ 941 - 0
mec-application/src/main/java/com/ym/mec/student/controller/StudentOrderController.java

@@ -0,0 +1,941 @@
+package com.ym.mec.student.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.huifu.adapay.core.AdapayCore;
+import com.huifu.adapay.core.util.AdapaySign;
+import com.yeepay.g3.sdk.yop.encrypt.DigitalEnvelopeDTO;
+import com.yeepay.g3.sdk.yop.utils.DigitalEnvelopeUtils;
+import com.yeepay.g3.sdk.yop.utils.RSAKeyUtils;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.tenant.TenantContextHolder;
+import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
+import com.ym.mec.thirdparty.yqpay.Msg;
+import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.http.HttpUtil;
+import com.ym.mec.util.web.WebUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@RequestMapping("${app-config.url.student:}/studentOrder")
+@Api(tags = "订单回调")
+@RestController
+@EnableScheduling
+public class StudentOrderController extends BaseController {
+    private static final Logger logger = LoggerFactory.getLogger(StudentOrderController.class);
+    @Autowired
+    private StudentPaymentOrderService studentPaymentOrderService;
+    @Autowired
+    private VipGroupService vipGroupService;
+    @Autowired
+    private MusicGroupService musicGroupService;
+    @Autowired
+    private StudentPaymentOrderDetailService studentPaymentOrderDetailService;
+    @Autowired
+    private StudentPaymentOrderDao studentPaymentOrderDao;
+    @Autowired
+    private SysConfigDao sysConfigDao;
+    @Autowired
+    private SporadicChargeInfoService sporadicChargeInfoService;
+    @Autowired
+    private OrganizationDao organizationDao;
+    @Autowired
+    private CourseScheduleEvaluateDao courseScheduleEvaluateDao;
+    @Autowired
+    private StudentGoodsSellDao studentGoodsSellDao;
+    @Autowired
+    private LuckDrawCountService luckDrawCountService;
+    @Autowired
+    private DegreeRegistrationDao degreeRegistrationDao;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
+    @Autowired
+    private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
+    @Autowired
+    private ReplacementInstrumentActivityDao replacementInstrumentActivityDao;
+    @Autowired
+    private CloudTeacherOrderService cloudTeacherOrderService;
+    @Autowired
+    private SysCouponCodeDao sysCouponCodeDao;
+    @Autowired
+    private StudentRegistrationDao studentRegistrationDao;
+    @Autowired
+    private VipGroupActivityService vipGroupActivityService;
+    @Autowired
+    private SellOrderService sellOrderService;
+    @Autowired
+    private TenantOrderRecordService tenantOrderRecordService;
+    @Autowired
+    private OrderPayOpsService orderPayOpsService;
+    @Autowired
+    private MusicGroupPaymentCalenderActivityService musicGroupPaymentCalenderActivityService;
+    @Autowired
+    private TenantConfigService tenantConfigService;
+    @Autowired
+    private OrganizationService organizationService;
+    @Autowired
+    private VipGroupCategoryDao vipGroupCategoryDao;
+    @Autowired
+    private TempBuyDoubleElevenUserLogDao tempBuyDoubleElevenUserLogDao;
+    @Autowired
+    private HfMerchantConfigService hfMerchantConfigService;
+
+    @Value("${spring.profiles.active:dev}")
+    private String profiles;
+
+    @ApiOperation(value = "查询订单列表")
+    @GetMapping("/queryPage")
+    public Object findGroupUsers(StudentPaymentOrderQueryInfo queryInfo) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        queryInfo.setStudentId(user.getId());
+        PageInfo<StudentPaymentOrderDto> studentPaymentOrderPageInfo = studentPaymentOrderService.OrderQueryPage(queryInfo);
+        return succeed(studentPaymentOrderPageInfo);
+    }
+
+    @PostMapping("/callback/{orderNo}")
+	public String callback(@PathVariable("orderNo") String orderNo, HttpServletRequest request) {
+		
+		StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+		
+		if(studentPaymentOrder == null) {
+			return "订单号错误";
+		}
+		
+		PaymentChannelEnum paymentChannel = PaymentChannelEnum.codeOf(studentPaymentOrder.getPaymentChannel());
+		
+		try {
+			
+			switch (paymentChannel) {
+			case ADAPAY:
+				// 验签请参data
+				String data = request.getParameter("data");
+				// 验签请参sign
+				String sign = request.getParameter("sign");
+				
+				String transType = request.getParameter("type");
+				
+				logger.info("callback response param:[data]{} [sign]{} [type]{}", data, sign, transType);
+				// 验签
+				if (AdapaySign.verifySign(data, sign, AdapayCore.PUBLIC_KEY)) {
+					
+					JSONObject dataObj = JSON.parseObject(data);
+					
+					Map<String, String> notifyMap = new HashMap<>();
+
+					switch (transType) {
+					case "payment.succeeded":// 支付成功
+
+						notifyMap.put("channelType", dataObj.getString("pay_channel"));
+						notifyMap.put("tradeState", "1");
+						notifyMap.put("totalMoney", dataObj.getString("pay_amt"));
+						notifyMap.put("merOrderNo", dataObj.getString("order_no"));
+						studentPaymentOrderService.updateOrder(notifyMap);
+						break;
+
+					case "payment.failed":// 支付失败
+
+						notifyMap.put("channelType", dataObj.getString("pay_channel"));
+						notifyMap.put("tradeState", "0");
+						notifyMap.put("totalMoney", dataObj.getString("pay_amt"));
+						notifyMap.put("merOrderNo", dataObj.getString("order_no"));
+						studentPaymentOrderService.updateOrder(notifyMap);
+
+						break;
+
+					default:
+						break;
+					}
+				} else {
+					return "验签失败";
+				}
+				break;
+			case YEEPAY:
+				
+				String content = request.getParameter("response");
+				
+				HfMerchantConfig hfMerchantConfig = hfMerchantConfigService.queryByTenantId(studentPaymentOrder.getTenantId(), studentPaymentOrder.getPaymentChannel());
+		        if(hfMerchantConfig == null){
+		        	throw new BizException("机构[{}][{}]商户信息找不到", studentPaymentOrder.getTenantId(), studentPaymentOrder.getPaymentChannel());
+		        }
+				
+				// 构造结果通知请求对象
+				DigitalEnvelopeDTO dto = new DigitalEnvelopeDTO();
+				dto.setCipherText(content);
+				PrivateKey privateKey =RSAKeyUtils.string2PrivateKey(hfMerchantConfig.getRsaPrivateKey());
+				PublicKey publicKey = RSAKeyUtils.string2PublicKey(hfMerchantConfig.getRsaPublicKey());
+				
+				dto = DigitalEnvelopeUtils.decrypt(dto, privateKey, publicKey);
+				
+				logger.info("易宝支付回调信息:response:{} plaintText:{}", content, dto.getPlainText());
+				
+				JSONObject dataObj = JSON.parseObject(dto.getPlainText());
+				
+				Map<String, String> notifyMap = new HashMap<>();
+				notifyMap.put("channelType", dataObj.getString("channel"));
+				
+				if("SUCCESS".equals(dataObj.getString("status"))) {
+					notifyMap.put("tradeState", "1");
+				}else {
+					notifyMap.put("tradeState", "0");
+				}
+				notifyMap.put("totalMoney", dataObj.getString("orderAmount"));
+				notifyMap.put("merOrderNo", dataObj.getString("orderId"));
+				studentPaymentOrderService.updateOrder(notifyMap);
+				
+				return "SUCCESS";
+
+			default:
+				break;
+			}
+
+			
+		} catch (Exception e) {
+			return e.getMessage();
+		}
+		
+		return "succeeded";
+	}
+
+    @PostMapping("/notify")
+    public Msg notify(@ModelAttribute Msg msg) throws Exception {
+        logger.info(msg.toString());
+        Map<String, Object> rqMap = new LinkedHashMap<String, Object>();
+        rqMap.put("code", msg.getCode());
+        rqMap.put("msg", msg.getMsg());
+        rqMap.put("responseType", msg.getResponseType());
+        rqMap.put("responseParameters", msg.getResponseParameters());
+        rqMap.put("sign", msg.getSign());
+        //boolean rs = YqPayUtil.verify(rqMap);
+        msg.setMsg("fail");
+        Map<String, String> notifyMap = new HashMap<>();
+        //if (rs) {
+        notifyMap = JSON.parseObject(msg.getResponseParameters(), Map.class);
+        //}
+        //支付中订单存在,更新状态
+        if (msg.getResponseType().equals("1") && notifyMap.size() > 0) {
+            String tradeState = msg.getCode().equals("88") ? "1" : "0";
+            String channelType = notifyMap.get("channelType").equals("1") ? "WXPay" : (notifyMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
+            notifyMap.put("tradeState", tradeState);
+            notifyMap.put("totalMoney", notifyMap.get("payAmount"));
+            notifyMap.put("merOrderNo", notifyMap.get("merMerOrderNo"));
+            notifyMap.put("channelType", channelType);
+            studentPaymentOrderService.updateOrder(notifyMap);
+            msg.setCode("000000");
+            msg.setMsg("success");
+        }
+        return msg;
+    }
+
+
+    @ApiOperation(value = "查询订单状态")
+    @PostMapping("/checkOrderStatus")
+    public Object checkOrderStatus(String orderNo) {
+        if (StringUtils.isBlank(orderNo)) {
+            return failed("请指定订单");
+        }
+        StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+        if (Objects.isNull(orderByOrderNo)) {
+            logger.info("checkOrderStatus >>>> tenantOrder {}", orderNo);
+            Map<String, Object> tenantOrder = tenantOrderRecordService.checkTenantOrder(orderNo);
+            if (Objects.nonNull(tenantOrder)) {
+                return succeed(tenantOrder);
+            }
+            return failed("未找到指定订单");
+        }
+        HashMap<String, Object> orderDetail = new HashMap<>();
+        orderDetail.put("order", orderByOrderNo);
+        orderDetail.put("groupType", orderByOrderNo.getGroupType());
+        
+        //查询财务章
+        //如果分部有企业信息,就用分部上的企业信息,否则用机构上的企业信息
+        String financeChops = null;
+        Organization organizationDto = organizationService.get(orderByOrderNo.getOrganId());
+		if (organizationDto == null || StringUtils.isBlank(organizationDto.getCorporateName()) || StringUtils.isBlank(organizationDto.getCorporateCode())) {
+
+			TenantConfig tenantConfig = tenantConfigService.queryByTenantId(orderByOrderNo.getTenantId());
+			if(tenantConfig == null){
+				throw new BizException("机构配置信息查询失败");
+			}
+			
+			financeChops = tenantConfig.getCorporateFinanceChops();
+		} else {
+			financeChops = organizationDto.getCorporateFinancialSeal();
+		}
+		if(StringUtils.isNotBlank(financeChops)){
+			orderDetail.put("financeChops", financeChops);
+		}
+		
+        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());
+//            List<String> orderDetailType = studentPaymentOrderDetailService.getOrderDetailType(orderByOrderNo.getId());
+            List<StudentPaymentOrderDetail> orderDetail1 = studentPaymentOrderDetailService.getOrderDetail(orderByOrderNo.getId());
+            List<String> orderDetailType = orderDetail1.stream().map(e -> e.getType().getCode()).collect(Collectors.toList());
+            String kitGroupPurchaseType = orderDetail1.stream().filter(e -> e.getGoodsList() != null).
+                    filter(e -> e.getKitGroupPurchaseType() != null).map(e -> e.getKitGroupPurchaseType().getCode()).collect(Collectors.joining(","));
+            orderDetail.put("goods", goodsList);
+            orderDetail.put("kitGroupPurchaseType", kitGroupPurchaseType);
+            orderDetail.put("course", musicGroup.getCourseForm());
+            orderDetail.put("ownershipType", musicGroup.getOwnershipType());
+            orderDetail.put("detailType", orderDetailType);
+            orderDetail.put("courseViewType", musicGroup.getCourseViewType());
+
+            //新的课程形态10.27
+            MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.getMusicGroupRegCalender(musicGroup.getId());
+            if (musicGroupRegCalender != null) {
+                List<MusicGroupPaymentCalenderCourseSettings> courseSettings = musicGroupPaymentCalenderCourseSettingsDao.getMusicGroupRegCalenderCourseSettings(musicGroup.getId());
+                musicGroupRegCalender.setMusicGroupPaymentCalenderCourseSettingsList(courseSettings);
+                //如果包含vip和网管,代表购买了活动包
+                List<Long> activityList = orderDetail1.stream().filter(e -> e.getType() == OrderDetailTypeEnum.VIP
+                        || e.getType() == OrderDetailTypeEnum.PRACTICE).map(e -> e.getStudentInstrumentId())
+                        .collect(Collectors.toList());
+                if(activityList != null && activityList.size() > 0){
+                    orderDetail.put("activity", musicGroupPaymentCalenderActivityService.findByActivityIds(activityList,musicGroupRegCalender.getId()));
+                }
+            }
+            orderDetail.put("calender", musicGroupRegCalender);
+
+            //判断是否是系统收费
+            if (musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE) {
+                orderDetail.put("member", cloudTeacherOrderService.queryOrderInfoByOrderId(orderByOrderNo.getId()));
+            }
+        } else if (orderByOrderNo.getGroupType().equals(GroupType.VIP) || orderByOrderNo.getGroupType().equals(GroupType.LIVE)) {
+            if(orderByOrderNo.getType() == OrderTypeEnum.ACTIVITY){
+                orderDetail.put("activity", vipGroupActivityService.getDao().queryByIds(orderByOrderNo.getActivityId()));
+            }else if (StringUtils.isNotEmpty(orderByOrderNo.getMusicGroupId())) {
+                VipBuyResultDto vipBuyResultInfo = vipGroupService.findVipBuyResultInfo(Integer.valueOf(orderByOrderNo.getMusicGroupId()));
+                orderDetail.put("detail", vipBuyResultInfo);
+            }
+        } else if (orderByOrderNo.getGroupType().equals(GroupType.SPORADIC)) {
+            if (Objects.nonNull(orderByOrderNo.getMusicGroupId())) {
+                List<SporadicChargeInfo> info = sporadicChargeInfoService.findByIds(orderByOrderNo.getMusicGroupId());
+                orderDetail.put("detail", info);
+            }
+            if (orderByOrderNo.getType().equals(OrderTypeEnum.DOUBLE_ELEVEN2020)) {
+                LuckDrawCount luckDrawCount = luckDrawCountService.get(orderByOrderNo.getUserId().longValue());
+                orderDetail.put("drawTimes", luckDrawCount == null ? 0 : luckDrawCount.getAvailableCount());
+            } else if (OrderTypeEnum.DEGREE_REGISTRATION.equals(orderByOrderNo.getType())) {
+                List<DegreeRegistration> degreeRegistration = degreeRegistrationDao.findByByOrderId(orderByOrderNo.getOrderNo());
+//                DegreeRegistration degreeRegistration = degreeRegistrationDao.get(orderByOrderNo.getClassGroupId());
+                orderDetail.put("degree", degreeRegistration);
+                List<StudentPaymentOrderDetail> studentPaymentOrderDetails = studentPaymentOrderDetailService.getOrderDetail(orderByOrderNo.getId());
+                if (!CollectionUtils.isEmpty(studentPaymentOrderDetails)) {
+                    orderDetail.put("additionCourseInfo", studentPaymentOrderDetails.get(0).getGoodsIdList());
+                }
+            }
+        } else if (orderByOrderNo.getGroupType().equals(GroupType.GOODS_SELL)|| orderByOrderNo.getGroupType().equals(GroupType.MALL_SELL)) {
+            orderDetail.put("detail", studentGoodsSellDao.getStudentGoodsSellDto(orderNo));
+        } else if (orderByOrderNo.getGroupType().equals(GroupType.REPLACEMENT)) {
+            orderDetail.put("detail", replacementInstrumentActivityDao.getInfo(Integer.parseInt(orderByOrderNo.getMusicGroupId())));
+        } else if (orderByOrderNo.getGroupType().equals(GroupType.DEGREE)) {
+//            orderDetail.put("detail", childrenDayDegreeDetailDao.getByOrderId(orderByOrderNo.getId()));
+            orderDetail.put("detail", degreeRegistrationDao.findByByOrderId(orderByOrderNo.getOrderNo()));
+        } else if (orderByOrderNo.getGroupType().equals(GroupType.ACTIVITY)) {
+            List<VipGroupActivity> vipGroupActivities = vipGroupActivityService.getDao().queryByIds(orderByOrderNo.getActivityId());
+            if(CollectionUtils.isNotEmpty(vipGroupActivities)){
+                String activeConfig = sysConfigDao.findConfigValue("2022_double_eleven_give_config");
+                String giveStartTime = sysConfigDao.findConfigValue("2021_double_eleven_give_member_start_time");
+                String giveEndTime = sysConfigDao.findConfigValue("2021_double_eleven_give_member_end_time");
+                Map<String, String> categoryMap = vipGroupCategoryDao.findConditionCategorys().stream().collect(Collectors.toMap(e-> e.getId().toString(), ConditionDto::getName));
+                Integer drawTimes = 0;
+                for (VipGroupActivity vipGroupActivity : vipGroupActivities) {
+                    vipGroupActivity.setVipGroupCategoryNames(categoryMap.get(vipGroupActivity.getVipGroupCategoryIdList()));
+                    vipGroupActivity.setGiveCategoryName(categoryMap.get(vipGroupActivity.getGiveCategoryId()));
+                    vipGroupActivityService.setActivityType(vipGroupActivity);
+//                    if(orderByOrderNo.getOrganId().equals(4)){
+                        if(!DateUtil.contents(giveStartTime,giveEndTime,orderByOrderNo.getPayTime() == null?orderByOrderNo.getCreateTime():orderByOrderNo.getPayTime())){
+                            continue;
+                        }
+//                    }
+                    List<SysConfigJsonDto> cloud2022ActivityDtos = JSONArray.parseArray(activeConfig, SysConfigJsonDto.class);
+                    List<SysConfigJsonDto> activityDtos = cloud2022ActivityDtos.stream().
+                            filter(e -> Arrays.stream(e.getKey().split(",")).collect(Collectors.toList()).
+                                    contains(vipGroupActivity.getId().toString())).collect(Collectors.toList());
+                    if(CollectionUtils.isNotEmpty(activityDtos)){
+                        SysConfigJsonDto jsonDto = activityDtos.get(0);
+                        drawTimes += Integer.parseInt(jsonDto.getValue());
+                    }
+                }
+                TempBuyDoubleElevenUserLog doubleElevenUserLog = tempBuyDoubleElevenUserLogDao.findByOrderId(orderByOrderNo.getId());
+                if(Objects.nonNull(doubleElevenUserLog) && doubleElevenUserLog.isGiveFlag()){
+                    VipGroupActivity vipGroupActivity = new VipGroupActivity();
+                    vipGroupActivity.setName("乐器清洁保养服务1次");
+                    vipGroupActivities.add(vipGroupActivity);
+                }
+                orderDetail.put("drawTimes",drawTimes);
+            }
+            orderDetail.put("detail", vipGroupActivities);
+        } else if (orderByOrderNo.getGroupType().equals(GroupType.MEMBER)) {
+            CloudTeacherOrderDto orderDto = cloudTeacherOrderService.queryOrderInfoByOrderId(orderByOrderNo.getId());
+            orderDetail.put("detail", orderDto);
+            if (orderDto != null) {
+                Map<String, Object> map = new HashMap<>(1);
+                map.put("paymentOrderId", orderDto.getCloudTeacherOrder().getOrderId());
+                orderDetail.put("couponList", sysCouponCodeDao.querySysCouponUseList(map));
+            }
+        } else if (orderByOrderNo.getGroupType().equals(GroupType.LIVE_BUY)) {
+            orderDetail.put("detail", vipGroupActivityService.getDao().queryByIds(orderByOrderNo.getActivityId()));
+            orderDetail.put("goodsId",orderByOrderNo.getClassGroupId());
+        }
+        return succeed(orderDetail);
+    }
+
+    @ApiOperation(value = "台牌支付")
+    @PostMapping("/executePayment")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "amount", value = "支付金额", required = true, dataType = "BigDecimal"),
+            @ApiImplicitParam(name = "orderNo", value = "订单号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "payChannel", value = "支付方式(alipay-支付宝app支付)", required = true, dataType = "String"),
+    })
+    public Object executePayment(@RequestBody PaymentParam paymentParam, HttpServletRequest request) {
+        try {
+        	paymentParam.setIp(WebUtil.getRemoteIp(request));
+            Map<String, Object> payment = orderPayOpsService.executePayment(paymentParam);
+            return succeed(payment);
+        } catch (Exception e) {
+            return failed(e.getMessage());
+        }
+    }
+
+    @GetMapping("/authorize")
+    public String authorize(@RequestParam("returnUrl") String returnUrl) {
+        String appId = "wxcf8e8b33a9477845";
+        String url = URLEncoder.encode("http://wxwechat.utools.club/studentOrder/userInfo");
+
+        String redirectURL = String.format("https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=1&connect_redirect=1#wechat_redirect",
+                appId, url);
+
+        return "redirect:" + redirectURL;
+    }
+
+    @GetMapping("/userInfo")
+    public Object userInfo(@RequestParam("code") String code,
+                           @RequestParam("state") String returnUrl) throws Exception {
+        String appId = "wxcf8e8b33a9477845";
+        String appSecret = "1286452b9c68b13325dece7cdf892645";
+
+        String wxMpOAuth2AccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
+
+        wxMpOAuth2AccessTokenUrl = String.format(wxMpOAuth2AccessTokenUrl, appId, appSecret, code);
+
+        Map<String, String> map = JSON.parseObject(HttpUtil.get(wxMpOAuth2AccessTokenUrl, new HashMap<>()), Map.class);
+
+        if (!map.containsKey("openid")) {
+            return failed("授权失败,请重新授权");
+        }
+
+        return map.get("openid");
+
+    }
+
+    //    @Scheduled(cron = "0/30 * * * * ?")
+    @GetMapping("/setSuccessStatus")
+    public HttpResponseResult setSuccessStatus(String orderNo) throws Exception {
+        if (!profiles.equals("dev") && !profiles.equals("test")) {
+            return failed("非法操作");
+        }
+        List<StudentPaymentOrder> payingOrders = studentPaymentOrderService.findOrdersByStatus(DealStatusEnum.ING);
+
+        String[] statusArr = {"0", "1", "7"};
+        for (StudentPaymentOrder payingOrder : payingOrders) {
+            if (StringUtils.isNotBlank(orderNo) && !orderNo.equals(payingOrder.getOrderNo())) {
+                continue;
+            }
+            if (StringUtils.isNotBlank(payingOrder.getMusicGroupId()) && Objects.nonNull(payingOrder.getUserId())) {
+                StudentRegistration studentRegister = studentRegistrationDao.getStudentRegister(payingOrder.getMusicGroupId(), payingOrder.getUserId());
+                if (Objects.nonNull(studentRegister) && studentRegister.getPayingStatus() == 2) {
+                    //跳过审核中的
+                    continue;
+                }
+            }
+
+            Map<String, String> rpMap = new HashMap<>();
+            rpMap.put("tradeState", "1");
+            rpMap.put("remarks", "模拟支付成功");
+            rpMap.put("merOrderNo", payingOrder.getOrderNo());
+            rpMap.put("orderNo", payingOrder.getOrderNo());
+            rpMap.put("channelType", "1");
+            rpMap.put("simulation", "1");
+
+            String channelType = rpMap.get("channelType").equals("1") ? "WXPay" : (rpMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
+            rpMap.put("channelType", channelType);
+            if (Arrays.asList(statusArr).contains(rpMap.get("tradeState"))) {
+                try {
+                    studentPaymentOrderService.updateOrder(rpMap); //更新订单
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    continue;
+                }
+            }
+        }
+        return succeed();
+    }
+
+    @RequestMapping("${app-config.url.student:}/paymentResult")
+    public void paymentResult(HttpServletResponse response, String orderNo, String type) {
+        try {
+            String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
+            if (type != null && type.equals("edu")) {
+                baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.EDU_TEACHER_BASE_URL);
+            }
+            response.sendRedirect(baseApiUrl + "/#/paymentresult?orderNo=" + orderNo);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @GetMapping("/getLuckStatis")
+    public HttpResponseResult getLuckStatis() {
+        List<Organization> organs = organizationDao.findAllOrgans(TenantContextHolder.getTenantId());
+        List<OrderStatisDto> orders = studentPaymentOrderDao.getLuckStatis(TenantContextHolder.getTenantId());
+
+
+        for (Organization organ : organs) {
+            boolean flag = false;
+            for (OrderStatisDto order : orders) {
+                if (organ.getName().equals(order.getOrganName())) {
+                    flag = true;
+                    break;
+                }
+            }
+            if (!flag) {
+                OrderStatisDto orderStatisDto = new OrderStatisDto();
+                orderStatisDto.setOrganName(organ.getName());
+                orderStatisDto.setMoney(BigDecimal.ZERO);
+                orderStatisDto.setNums(0);
+                orders.add(orderStatisDto);
+            }
+        }
+
+        BigDecimal totalMoney = BigDecimal.ZERO;
+        Integer totalNum = 0;
+        Iterator<OrderStatisDto> iterator = orders.iterator();
+        while (iterator.hasNext()) {
+            OrderStatisDto order = iterator.next();
+            if (order.getOrganName().equals("总部国际") || order.getOrganName().equals("阳光总部国际") || order.getOrganName().equals("武汉小学")) {
+                iterator.remove();
+                continue;
+            }
+            totalMoney = totalMoney.add(order.getMoney());
+            totalNum += order.getNums();
+        }
+        orders = orders.stream().sorted(Comparator.comparing(OrderStatisDto::getNums).reversed()).collect(Collectors.toList());
+
+        LuckStatisDto luckStatisDto = new LuckStatisDto();
+        luckStatisDto.setOrderStatisDtoList(orders);
+        luckStatisDto.setTotalNum(totalNum);
+        luckStatisDto.setTotalMoney(totalMoney);
+        return succeed(luckStatisDto);
+    }
+
+    @GetMapping("/getPracticeGroupStatis")
+    public HttpResponseResult getPracticeGroupStatis() {
+        Integer tenantId = TenantContextHolder.getTenantId();
+        List<Organization> organs = organizationDao.findAllOrgans(tenantId);
+        List<PracticeGroupsDto> hasReportNums = courseScheduleEvaluateDao.getHasReportNums(tenantId);
+        List<PracticeGroupsDto> organMoneys = courseScheduleEvaluateDao.getOrganMoney(tenantId);
+        List<PracticeGroupsDto> organPracticeGroups = courseScheduleEvaluateDao.getOrganPracticeGroups(tenantId);
+        List<PracticeGroupsDto> practiceGroupsFrees = courseScheduleEvaluateDao.getPracticeGroupsFree(tenantId);
+        List<PracticeGroupsDto> practiceGroupsBuys = courseScheduleEvaluateDao.getPracticeGroupsBuy(tenantId);
+        List<PracticeGroupsDto> practiceGroupsRenews = courseScheduleEvaluateDao.getPracticeGroupsRenew(tenantId);
+
+        Date startTime = DateUtil.getFirstDayOfMonth(new Date());
+
+        List<PracticeGroupsDto> monthOrganBuyMoneys = courseScheduleEvaluateDao.getMonthOrganMoney(OrderTypeEnum.PRACTICE_GROUP_BUY, startTime, tenantId);
+        List<PracticeGroupsDto> monthOrganRenewMoneys = courseScheduleEvaluateDao.getMonthOrganMoney(OrderTypeEnum.PRACTICE_GROUP_RENEW, startTime, tenantId);
+
+        //List<PracticeGroupsDto> monthOrganBuyMoneys = courseScheduleEvaluateDao.getOrganNewPracticeGroupsOfMonth(OrderTypeEnum.PRACTICE_GROUP_BUY,startTime);
+        //List<PracticeGroupsDto> monthOrganRenewMoneys = courseScheduleEvaluateDao.getOrganNewPracticeGroupsOfMonth(OrderTypeEnum.PRACTICE_GROUP_RENEW,startTime);
+
+        List<PracticeGroupsDto> practiceGroups = new ArrayList<>();
+        for (Organization organ : organs) {
+            PracticeGroupsDto practiceGroupsDto = new PracticeGroupsDto();
+            practiceGroupsDto.setOrganName(organ.getName());
+            practiceGroupsDto.setOrganId(organ.getId());
+            //体验人数
+            for (PracticeGroupsDto practiceGroupsFree : practiceGroupsFrees) {
+                if (organ.getId().equals(practiceGroupsFree.getOrganId())) {
+                    practiceGroupsDto.setTotalNums(practiceGroupsFree.getTotalNums());
+                    break;
+                }
+            }
+            //购买人数
+            for (PracticeGroupsDto practiceGroupsBuy : practiceGroupsBuys) {
+                if (organ.getId().equals(practiceGroupsBuy.getOrganId())) {
+                    practiceGroupsDto.setBuyNums(practiceGroupsBuy.getBuyNums());
+                    break;
+                }
+            }
+            //续费人数
+            for (PracticeGroupsDto practiceGroupsRenew : practiceGroupsRenews) {
+                if (organ.getId().equals(practiceGroupsRenew.getOrganId())) {
+                    practiceGroupsDto.setRenewNums(practiceGroupsRenew.getRenewNums());
+                    break;
+                }
+            }
+            //已完成人数
+            for (PracticeGroupsDto organPracticeGroup : organPracticeGroups) {
+                if (organ.getId().equals(organPracticeGroup.getOrganId()) && organPracticeGroup.getBuyNums() >= organPracticeGroup.getTotalNums()) {
+                    practiceGroupsDto.setOverNums(practiceGroupsDto.getOverNums() + 1);
+                }
+            }
+
+            //已提交报告人数
+            for (PracticeGroupsDto hasReportNum : hasReportNums) {
+                if (organ.getId().equals(hasReportNum.getOrganId())) {
+                    practiceGroupsDto.setReportNums(hasReportNum.getReportNums());
+                    break;
+                }
+            }
+            //成交金额
+            for (PracticeGroupsDto organMoney : organMoneys) {
+                if (organ.getId().equals(organMoney.getOrganId())) {
+                    practiceGroupsDto.setTotalMoney(organMoney.getTotalMoney());
+                    break;
+                }
+            }
+            //当月新增金额和人数
+            for (PracticeGroupsDto monthOrganBuyMoney : monthOrganBuyMoneys) {
+                if (organ.getId().equals(monthOrganBuyMoney.getOrganId())) {
+                    practiceGroupsDto.setMonthBuyMoney(monthOrganBuyMoney.getTotalMoney());
+                    practiceGroupsDto.setMonthBuyNums(monthOrganBuyMoney.getBuyNums());
+                    break;
+                }
+            }
+
+            //当月续费金额和人数
+            for (PracticeGroupsDto monthOrganRenewMoney : monthOrganRenewMoneys) {
+                if (organ.getId().equals(monthOrganRenewMoney.getOrganId())) {
+                    practiceGroupsDto.setMonthRenewNums(monthOrganRenewMoney.getBuyNums());
+                    practiceGroupsDto.setMonthRenewMoney(monthOrganRenewMoney.getTotalMoney());
+                    break;
+                }
+            }
+
+            if (practiceGroupsDto.getTotalNums() > 0) {
+                double scale = new BigDecimal(practiceGroupsDto.getBuyNums()).multiply(new BigDecimal(100)).divide(new BigDecimal(practiceGroupsDto.getTotalNums()), 2, BigDecimal.ROUND_HALF_UP).doubleValue();
+                practiceGroupsDto.setBuyScale(scale);
+            }
+
+            practiceGroups.add(practiceGroupsDto);
+        }
+
+        BigDecimal totalMoney = BigDecimal.ZERO;
+        Integer totalNum = 0;
+        Integer buyNum = 0;
+        Integer renewNum = 0;
+        Integer overNum = 0;
+        Integer reportNum = 0;
+        Integer monthBuyNums = 0;
+        Integer monthRenewNums = 0;
+        BigDecimal monthBuyMoney = BigDecimal.ZERO;
+        BigDecimal monthRenewMoney = BigDecimal.ZERO;
+
+        Iterator<PracticeGroupsDto> iterator = practiceGroups.iterator();
+        while (iterator.hasNext()) {
+            PracticeGroupsDto next = iterator.next();
+            if (next.getOrganName().equals("总部国际") || next.getOrganName().equals("阳光总部国际") || next.getOrganName().equals("武汉小学")) {
+                iterator.remove();
+                continue;
+            }
+            totalMoney = totalMoney.add(next.getTotalMoney());
+            totalNum += next.getTotalNums();
+            overNum += next.getOverNums();
+            buyNum += next.getBuyNums();
+            reportNum += next.getReportNums();
+            renewNum += next.getRenewNums();
+            monthBuyNums += next.getMonthBuyNums();
+            monthRenewNums += next.getMonthRenewNums();
+            monthBuyMoney = monthBuyMoney.add(next.getMonthBuyMoney());
+            monthRenewMoney = monthRenewMoney.add(next.getMonthRenewMoney());
+        }
+        practiceGroups = practiceGroups.stream().sorted(Comparator.comparingDouble(PracticeGroupsDto::getBuyScale).reversed()).collect(Collectors.toList());
+
+        PracticeGroupStatisDto practiceGroupStatisDto = new PracticeGroupStatisDto();
+        practiceGroupStatisDto.setPracticeGroupsDtoList(practiceGroups);
+        practiceGroupStatisDto.setTotalMoney(totalMoney);
+        practiceGroupStatisDto.setTotalNum(totalNum);
+        practiceGroupStatisDto.setBuyNum(buyNum);
+        practiceGroupStatisDto.setRenewNum(renewNum);
+        practiceGroupStatisDto.setOverNum(overNum);
+        practiceGroupStatisDto.setReportNum(reportNum);
+        practiceGroupStatisDto.setMonthBuyNums(monthBuyNums);
+        practiceGroupStatisDto.setMonthBuyMoney(monthBuyMoney);
+        practiceGroupStatisDto.setMonthRenewNums(monthRenewNums);
+        practiceGroupStatisDto.setMonthRenewMoney(monthRenewMoney);
+
+        if (totalNum > 0) {
+            BigDecimal scale = new BigDecimal(buyNum).multiply(new BigDecimal(100)).divide(new BigDecimal(totalNum), 2, BigDecimal.ROUND_HALF_UP);
+            practiceGroupStatisDto.setBuyScale(scale);
+        }
+
+        return succeed(practiceGroupStatisDto);
+    }
+
+    @GetMapping("/getPracticeStatis")
+    public HttpResponseResult getPracticeStatis() {
+        Date nowDate = new Date();
+        Integer tenantId = TenantContextHolder.getTenantId();
+        List<Organization> organs = organizationDao.findAllOrgans(tenantId);
+        List<Practice4OrganDto> allTryNums = courseScheduleEvaluateDao.getAllTryNums(tenantId);
+
+        List<Practice4OrganDto> practiceBuyNums = courseScheduleEvaluateDao.getPracticeBuyNums(nowDate, null, tenantId);
+        List<Practice4OrganDto> vipBuyNums = courseScheduleEvaluateDao.getVipBuyNums(nowDate, null, tenantId);
+
+        List<Practice4OrganDto> practiceAndVipBuyNums = courseScheduleEvaluateDao.getPracticeAndVipNums(nowDate, null, tenantId);
+        Date startTime = DateUtil.getFirstDayOfMonth(nowDate);
+        Date endTime = DateUtil.addMonths(startTime, 1);
+
+
+        //当月新增网管课人数
+        List<PracticeGroupsDto> monthOrganPracticeBuyMoneys = courseScheduleEvaluateDao.getMonthOrganMoney(OrderTypeEnum.PRACTICE_GROUP_BUY, startTime, tenantId);
+        //当月新增VIP人数
+        List<PracticeGroupsDto> monthOrganVipBuyMoneys = courseScheduleEvaluateDao.getMonthOrganMoney(OrderTypeEnum.SMALL_CLASS_TO_BUY, startTime, tenantId);
+        //当月续费人数
+        List<PracticeGroupsDto> monthOrganRenewMoneys = courseScheduleEvaluateDao.getMonthOrganMoney(OrderTypeEnum.PRACTICE_GROUP_RENEW, startTime, tenantId);
+
+        //本月总人数
+        List<Practice4OrganDto> nowMonthPracticeBuyNums = courseScheduleEvaluateDao.getPracticeBuyNums(startTime, endTime, tenantId);
+        List<Practice4OrganDto> nowMonthVipBuyNums = courseScheduleEvaluateDao.getVipBuyNums(startTime, endTime, tenantId);
+        List<Practice4OrganDto> nowMonthPracticeAndVipBuyNums = courseScheduleEvaluateDao.getPracticeAndVipNums(startTime, endTime, tenantId);
+
+        //上月总人数
+        Date lastMonthStartTime = DateUtil.addMonths(startTime, -1);
+        List<Practice4OrganDto> lastMonthPracticeBuyNums = courseScheduleEvaluateDao.getPracticeBuyNums(lastMonthStartTime, startTime, tenantId);
+        List<Practice4OrganDto> lastMonthVipBuyNums = courseScheduleEvaluateDao.getVipBuyNums(lastMonthStartTime, startTime, tenantId);
+        List<Practice4OrganDto> lastMonthPracticeAndVipBuyNums = courseScheduleEvaluateDao.getPracticeAndVipNums(lastMonthStartTime, startTime, tenantId);
+
+        List<Practice4OrganDto> practice4Organs = new ArrayList<>();
+        for (Organization organ : organs) {
+            Practice4OrganDto practice4OrganDto = new Practice4OrganDto();
+            practice4OrganDto.setOrganName(organ.getName());
+            practice4OrganDto.setOrganId(organ.getId());
+
+            for (Practice4OrganDto allTryNum : allTryNums) {
+                if (organ.getId().equals(allTryNum.getOrganId())) {
+                    practice4OrganDto.setTryNum(allTryNum.getTryNum());
+                }
+            }
+            //网管课转化人数
+            for (Practice4OrganDto practiceBuyNum : practiceBuyNums) {
+                if (organ.getId().equals(practiceBuyNum.getOrganId())) {
+                    practice4OrganDto.setPracticeNum(practiceBuyNum.getPracticeNum());
+                    break;
+                }
+            }
+            //VIP课转化人数
+            for (Practice4OrganDto vipBuyNum : vipBuyNums) {
+                if (organ.getId().equals(vipBuyNum.getOrganId())) {
+                    practice4OrganDto.setVipNum(vipBuyNum.getVipNum());
+                    break;
+                }
+            }
+            for (Practice4OrganDto practiceAndVipBuyNum : practiceAndVipBuyNums) {
+                if (organ.getId().equals(practiceAndVipBuyNum.getOrganId())) {
+                    practice4OrganDto.setVipNum(practice4OrganDto.getVipNum() - practiceAndVipBuyNum.getPracticeNum());
+                    break;
+                }
+            }
+            practice4OrganDto.setTotalNum(practice4OrganDto.getPracticeNum() + practice4OrganDto.getVipNum());
+
+            //当月新增网管课人数
+            for (PracticeGroupsDto monthOrganPracticeBuyMoney : monthOrganPracticeBuyMoneys) {
+                if (organ.getId().equals(monthOrganPracticeBuyMoney.getOrganId())) {
+                    practice4OrganDto.setPractice4MonthNum(monthOrganPracticeBuyMoney.getBuyNums());
+                    practice4OrganDto.setTotalMoney(practice4OrganDto.getTotalMoney().add(monthOrganPracticeBuyMoney.getTotalMoney()));
+                    break;
+                }
+            }
+            //当月新增VIP课人数
+            for (PracticeGroupsDto monthOrganVipBuyMoney : monthOrganVipBuyMoneys) {
+                if (organ.getId().equals(monthOrganVipBuyMoney.getOrganId())) {
+                    practice4OrganDto.setVip4MonthNum(monthOrganVipBuyMoney.getBuyNums());
+                    practice4OrganDto.setTotalMoney(practice4OrganDto.getTotalMoney().add(monthOrganVipBuyMoney.getTotalMoney()));
+                    break;
+                }
+            }
+            //当月续费人数
+            for (PracticeGroupsDto monthOrganRenewMoney : monthOrganRenewMoneys) {
+                if (organ.getId().equals(monthOrganRenewMoney.getOrganId())) {
+                    practice4OrganDto.setRenew4MonthNum(monthOrganRenewMoney.getBuyNums());
+                    practice4OrganDto.setTotalMoney(practice4OrganDto.getTotalMoney().add(monthOrganRenewMoney.getTotalMoney()));
+                    break;
+                }
+            }
+            //同比上月增减人数
+            for (Practice4OrganDto nowMonthPracticeBuyNum : nowMonthPracticeBuyNums) {
+                if (organ.getId().equals(nowMonthPracticeBuyNum.getOrganId())) {
+                    practice4OrganDto.setChange4MonthNum(nowMonthPracticeBuyNum.getPracticeNum());
+                    break;
+                }
+            }
+            for (Practice4OrganDto nowMonthVipBuyNum : nowMonthVipBuyNums) {
+                if (organ.getId().equals(nowMonthVipBuyNum.getOrganId())) {
+                    practice4OrganDto.setChange4MonthNum(practice4OrganDto.getChange4MonthNum() + nowMonthVipBuyNum.getVipNum());
+                    break;
+                }
+            }
+            for (Practice4OrganDto nowMonthPracticeAndVipBuyNum : nowMonthPracticeAndVipBuyNums) {
+                if (organ.getId().equals(nowMonthPracticeAndVipBuyNum.getOrganId())) {
+                    practice4OrganDto.setChange4MonthNum(practice4OrganDto.getChange4MonthNum() - nowMonthPracticeAndVipBuyNum.getPracticeNum());
+                    break;
+                }
+            }
+
+            //上月人数
+            for (Practice4OrganDto lastMonthPracticeBuyNum : lastMonthPracticeBuyNums) {
+                if (organ.getId().equals(lastMonthPracticeBuyNum.getOrganId())) {
+                    practice4OrganDto.setChange4MonthNum(practice4OrganDto.getChange4MonthNum() - lastMonthPracticeBuyNum.getPracticeNum());
+                    break;
+                }
+            }
+            for (Practice4OrganDto lastMonthVipBuyNum : lastMonthVipBuyNums) {
+                if (organ.getId().equals(lastMonthVipBuyNum.getOrganId())) {
+                    practice4OrganDto.setChange4MonthNum(practice4OrganDto.getChange4MonthNum() - lastMonthVipBuyNum.getVipNum());
+                    break;
+                }
+            }
+            for (Practice4OrganDto lastMonthPracticeAndVipBuyNum : lastMonthPracticeAndVipBuyNums) {
+                if (organ.getId().equals(lastMonthPracticeAndVipBuyNum.getOrganId())) {
+                    practice4OrganDto.setChange4MonthNum(practice4OrganDto.getChange4MonthNum() + lastMonthPracticeAndVipBuyNum.getPracticeNum());
+                    break;
+                }
+            }
+
+            if (practice4OrganDto.getTryNum() > 0) {
+                double scale = new BigDecimal(practice4OrganDto.getTotalNum()).multiply(new BigDecimal(100)).divide(new BigDecimal(practice4OrganDto.getTryNum()), 2, BigDecimal.ROUND_HALF_UP).doubleValue();
+                practice4OrganDto.setScale(scale);
+            }
+
+            practice4Organs.add(practice4OrganDto);
+        }
+
+        practice4Organs = practice4Organs.stream().sorted(Comparator.comparingDouble(Practice4OrganDto::getScale).reversed()).collect(Collectors.toList());
+        return succeed(practice4Organs);
+    }
+
+    @GetMapping("/getUserApplyOrders")
+    public HttpResponseResult<List<StudentPaymentOrderExportDto>> getUserApplyOrders(String musicGroupId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(studentPaymentOrderService.getUserApplyOrders(sysUser.getId(), musicGroupId));
+    }
+
+    @GetMapping("/reConfirmOrder")
+    public HttpResponseResult<List<StudentPaymentOrder>> reConfirmOrder(Date startTime, Date endTime) {
+        if (!profiles.equals("prod")) {
+            return failed("测试环境不支持");
+        }
+        return succeed(studentPaymentOrderService.reConfirmOrder(startTime, endTime));
+    }
+
+    @GetMapping("/getMusicGroupApplyCalender")
+    public HttpResponseResult<MusicGroupPaymentCalender> getMusicGroupApplyCalender(String musicGroupId) {
+        MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.getMusicGroupRegCalender(musicGroupId);
+        if (musicGroupRegCalender != null) {
+            MusicGroup musicGroup = musicGroupService.get(musicGroupId);
+            List<MusicGroupPaymentCalenderCourseSettings> courseSettings = musicGroupPaymentCalenderCourseSettingsDao.getMusicGroupRegCalenderCourseSettings(musicGroupId);
+            musicGroupRegCalender.setMusicGroupPaymentCalenderCourseSettingsList(courseSettings);
+            musicGroupRegCalender.setCourseViewType(musicGroup.getCourseViewType());
+        }
+        return succeed(musicGroupRegCalender);
+    }
+
+    @GetMapping("fixSellOrder")
+    public HttpResponseResult<List<SellOrder>> fixSellOrder(String orderNo) {
+        StudentPaymentOrder order = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+        List<SellOrder> sellOrders = new ArrayList<>();
+        if (order == null || !order.getStatus().equals(DealStatusEnum.SUCCESS) || !order.getType().equals(OrderTypeEnum.APPLY)) {
+            return succeed(sellOrders);
+        }
+
+        List<StudentPaymentOrderDetail> orderDetails = studentPaymentOrderDetailService.getOrderGoodsDetail(order.getId());
+        //销售订单详情
+        if (orderDetails.size() > 0) {
+            MusicGroup musicGroup = musicGroupService.get(order.getMusicGroupId());
+            BigDecimal couponRemitFee = order.getCouponRemitFee();
+            if (couponRemitFee.compareTo(BigDecimal.ZERO) > 0) {
+                BigDecimal musicFee = orderDetails.stream().filter(o -> o.getType().getCode().equals("MUSICAL")
+                                || o.getType().getCode().equals("ACCESSORIES") || o.getType().getCode().equals("TEACHING"))
+                        .map(o -> o.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                BigDecimal expectAmount = order.getExpectAmount();
+                //获取比例
+                BigDecimal ratioAmount = musicFee.divide(expectAmount, 6, BigDecimal.ROUND_HALF_UP);
+                //获取分配的减免金额
+                couponRemitFee = couponRemitFee.multiply(ratioAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
+            }
+            sellOrders = sellOrderService.addOrderDetail2SellOrder(orderDetails, order, musicGroup, couponRemitFee);
+        }
+        return succeed(sellOrders);
+
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "queryDate", dataType = "String", value = "年月"),
+            @ApiImplicitParam(name = "page", dataType = "Integer", value = "页数"),
+            @ApiImplicitParam(name = "rows", dataType = "Integer", value = "每页数量"),
+    })
+    @ApiOperation("分页查询")
+    /**
+     * 学生端查询订单
+     */
+    @PostMapping("/queryOrder")
+    public Object queryOrder(@RequestBody Map<String, Object> param) throws Exception {
+        return succeed(studentPaymentOrderService.queryOrder(param));
+    }
+
+    /**
+     * 学生端查询订单详情
+     */
+    @GetMapping("/queryOrderDetail")
+    public Object queryOrderDetail(String orderNo) {
+        return succeed(studentPaymentOrderService.queryOrderDetail(orderNo));
+    }
+}

+ 108 - 0
mec-application/src/main/java/com/ym/mec/student/controller/StudentVipGroupController.java

@@ -0,0 +1,108 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.page.StudentVipGroupQueryInfo;
+import com.ym.mec.biz.dal.wrapper.LiveGroupWrapper;
+import com.ym.mec.biz.service.SubjectService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.biz.service.VipGroupCategoryService;
+import com.ym.mec.biz.service.VipGroupService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.yonge.log.model.AuditLogAnnotation;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/9/23
+ */
+
+@Api(tags = "vip课-学生端")
+@RequestMapping("${app-config.url.student:}/studentVipGroup")
+@RestController
+public class StudentVipGroupController extends BaseController {
+
+    @Autowired
+    private VipGroupService vipGroupService;
+    @Autowired
+    private SubjectService subjectService;
+    @Autowired
+    private SysUserService sysUserService;
+    @Autowired
+    private VipGroupCategoryService vipGroupCategoryService;
+
+    @ApiOperation(value = "获取vip课列表筛选条件")
+    @GetMapping(value = "/findQueryCondition")
+    public HttpResponseResult<List<QueryConditionDto>> findQueryCondition(){
+        List<QueryConditionDto> conditions=new ArrayList<>();
+        conditions.add(new QueryConditionDto("乐器选择","subjectId",subjectService.findSubjectConditions()));
+        conditions.add(new QueryConditionDto("课程类型","categoryId",vipGroupCategoryService.findConditionCategorys()));
+        List<ConditionDto> conditionDtos=new ArrayList<>();
+        conditionDtos.add(new ConditionDto(0L,"线下"));
+        conditionDtos.add(new ConditionDto(1L,"线上"));
+        conditions.add(new QueryConditionDto("类别选择","classType",conditionDtos));
+        return succeed(conditions);
+    }
+
+    @ApiOperation(value = "获取vip课列表")
+    @PostMapping(value = "/queryVipGroups")
+    public HttpResponseResult<Map<String, Object>> queryVipGroups(@RequestBody StudentVipGroupQueryInfo queryInfo){
+        SysUser sysUser = sysUserService.getUser();
+        queryInfo.setOrganId(sysUser.getOrganId());
+        queryInfo.setUserId(sysUser.getId());
+        Map<String,Object> result=new HashMap<>();
+        result.put("recommendVipGroups",new ArrayList<>());
+        result.put("pageInfo",vipGroupService.findStudentVipGroupList(queryInfo));
+        return succeed(result);
+    }
+
+    @ApiOperation(value = "获取可购买vip、网管课、直播课列表")
+    @RequestMapping(value = "/queryVipPracticeGroups")
+    public HttpResponseResult<List<StudentVipGroupShowListDto>> queryVipPracticeGroups(@RequestBody StudentVipGroupQueryInfo queryInfo){
+        SysUser sysUser = sysUserService.getUser();
+        queryInfo.setOrganId(sysUser.getOrganId());
+        queryInfo.setUserId(sysUser.getId());
+        return succeed(vipGroupService.queryVipPracticeGroups(queryInfo));
+    }
+
+    @ApiOperation(value = "获取学生端vip、网管课显示详情")
+    @RequestMapping(value = "/getVipGroupShowDetail")
+    public HttpResponseResult<StudentVipGroupDetailDto> getVipGroupShowDetail(Long vipGroupId, String groupType){
+        return succeed(vipGroupService.getVipGroupShowDetail(vipGroupId,groupType));
+    }
+
+    @ApiOperation(value = "检测vip课成能否购买")
+    @GetMapping(value = "/enableBuyGroup")
+    public HttpResponseResult enableBuyGroup(Long vipGroupId, String groupType){
+        vipGroupService.enableBuyVipGroup(vipGroupId,sysUserService.getUserId(),groupType);
+        return succeed();
+    }
+
+    @ApiOperation(value = "vip课购买")
+    @PostMapping("/buyVipGroup")
+    @AuditLogAnnotation(operateName = "vip课购买")
+    public HttpResponseResult buyVipGroup(VipGroupBuyParamsDto vipGroupBuyParams) throws Exception {
+        return vipGroupService.buyVipGroup(vipGroupBuyParams);
+    }
+
+    @ApiOperation(value = "获取vip购买信息")
+    @PostMapping("/getVipGroupPayInfo")
+	public HttpResponseResult<VipGroupPayInfoDto> getVipGroupPayInfo(Integer vipGroupId){
+        return succeed(vipGroupService.getVipGroupPayInfo(vipGroupId,sysUserService.getUserId()));
+    }
+
+    @ApiOperation(value = "判断学生是否能通过分享页进入直播间")
+    @GetMapping("/joinLiveRoomByShare")
+    public HttpResponseResult<LiveGroupWrapper.LiveCourseInfo> joinLiveRoomByShare(Integer courseScheduleId){
+        return succeed(vipGroupService.joinLiveRoomByShare(courseScheduleId,sysUserService.getUserId()));
+    }
+}

+ 38 - 0
mec-application/src/main/java/com/ym/mec/student/controller/StudyReportController.java

@@ -0,0 +1,38 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.service.CourseScheduleEvaluateService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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;
+
+@RequestMapping("${app-config.url.student:}/studyReport")
+@Api(tags = "陪练报告")
+@RestController
+public class StudyReportController extends BaseController {
+
+	@Autowired
+	private CourseScheduleEvaluateService courseScheduleEvaluateService;
+
+
+	@ApiOperation("获取学生陪练报告信息")
+	@GetMapping(value = "info")
+	public Object info(Integer classGroupId) {
+		return succeed(courseScheduleEvaluateService.getStudyReport(classGroupId));
+	}
+
+	@ApiOperation(value = "课程组评论列表")
+	@GetMapping("getGroupReviews")
+	public Object getGroupReviews(Integer groupId) {
+		return succeed(courseScheduleEvaluateService.findByGroupId(groupId,1));
+	}
+
+	@ApiOperation(value = "评论详情")
+	@GetMapping("getReviewsInfo")
+	public Object getReviewsInfo(Integer id) {
+		return succeed(courseScheduleEvaluateService.findById(id));
+	}
+}

+ 70 - 0
mec-application/src/main/java/com/ym/mec/student/controller/SubjectChangeController.java

@@ -0,0 +1,70 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.dao.SubjectChangeDao;
+import com.ym.mec.biz.dal.dto.SubjectChangeParamDto;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.SubjectChange;
+import com.ym.mec.biz.dal.enums.PayStatus;
+import com.ym.mec.biz.dal.enums.SubjectChangeStatusEnum;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
+import com.ym.mec.biz.service.SubjectChangeService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@RequestMapping("${app-config.url.student:}/subjectChange")
+@Api(tags = "声部更换服务")
+@RestController
+public class SubjectChangeController extends BaseController {
+
+    @Autowired
+    private SubjectChangeService subjectChangeService;
+    @Autowired
+    private SubjectChangeDao subjectChangeDao;
+    @Autowired
+    private StudentPaymentOrderService studentPaymentOrderService;
+
+
+    @ApiOperation(value = "获取更换详情")
+    @GetMapping("/getChangeInfo")
+    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Integer")})
+    public HttpResponseResult<SubjectChange> getChangeInfo(Integer id) {
+        if (id == null) {
+            return failed("参数校验异常");
+        }
+        return succeed(subjectChangeService.getChangeInfo(id));
+    }
+
+    @ApiOperation(value = "支付更换声部费用")
+    @PostMapping("/payChange")
+    public HttpResponseResult<Map> payChange(@RequestBody SubjectChangeParamDto subjectChangeParamDto) throws Exception {
+        SubjectChange subjectChange = subjectChangeDao.get(subjectChangeParamDto.getId());
+        if (!subjectChangeParamDto.getRepay() && subjectChange.getStatus().equals(SubjectChangeStatusEnum.ING)) {
+        	
+            StudentPaymentOrder applyOrder = studentPaymentOrderService.get(subjectChange.getOrderId().longValue());
+        	// 查询订单状态
+            PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder);
+            if(payStatus == PayStatus.SUCCESSED){
+        		throw new BizException("订单已支付成功,请勿重复支付");
+        	}
+            return failed(HttpStatus.CONTINUE, "您有待支付的订单");
+        }
+        subjectChangeParamDto.setTenantId(subjectChange.getTenantId());
+        Map payMap = subjectChangeService.payChange(subjectChangeParamDto);
+        if (payMap.containsKey("tradeState")) {
+            return failed(HttpStatus.CREATED, payMap, "恭喜您,支付成功!");
+        }
+        return succeed(payMap);
+    }
+
+
+}

+ 25 - 0
mec-application/src/main/java/com/ym/mec/student/controller/SubjectController.java

@@ -0,0 +1,25 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.service.SubjectService;
+import com.ym.mec.common.controller.BaseController;
+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.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequestMapping("${app-config.url.student:}/subject")
+@Api(tags = "科目服务")
+@RestController
+public class SubjectController extends BaseController {
+
+    @Autowired
+    private SubjectService subjectService;
+
+    @ApiOperation(value = "列出所有分部")
+    @PostMapping("/list")
+    public Object list(){
+        return succeed(subjectService.list());
+    }
+}

+ 46 - 0
mec-application/src/main/java/com/ym/mec/student/controller/SysConfigController.java

@@ -0,0 +1,46 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.entity.SysConfig;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/** 
+ * 系统配置控制层
+ */
+@RestController
+@Api(tags = "系统参数设置")
+@RequestMapping(value = "${app-config.url.student:}/sysConfig")
+public class SysConfigController extends BaseController {
+
+	@Autowired
+	private SysConfigService sysConfigService;
+
+	@ApiOperation(value = "参数列表")
+	@GetMapping(value = "list")
+	public Object configList(String group) {
+		Map<String,Object> params = new HashMap<String, Object>();
+		params.put("group", group);
+		List<SysConfig> configs = sysConfigService.findAll(params);
+		return succeed(configs);
+	}
+
+	@ApiOperation(value = "查询参数")
+	@GetMapping(value = "queryByParamName")
+	public Object queryByParamName(String paramName) {
+		if(StringUtils.isBlank(paramName)){
+			return failed("参数不能为空");
+		}
+		return succeed(sysConfigService.findByParamName(paramName));
+	}
+}

+ 94 - 0
mec-application/src/main/java/com/ym/mec/student/controller/SysCouponCodeController.java

@@ -0,0 +1,94 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.page.SysCouponCodeQueryInfo;
+import com.ym.mec.biz.service.SysCouponCodeService;
+import com.ym.mec.biz.service.SysCouponIssueRecordService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.common.page.WrapperUtil;
+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.*;
+
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+@RequestMapping("${app-config.url.student:}/sysCouponCode")
+@Api(tags = "优惠券明细")
+@RestController
+public class SysCouponCodeController extends BaseController {
+
+    @Autowired
+    private SysCouponCodeService sysCouponCodeService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private SysCouponIssueRecordService couponIssueRecordService;
+
+    @ApiOperation("分页查询")
+    @RequestMapping(value = "queryPage")
+    public HttpResponseResult queryPage(SysCouponCodeQueryInfo queryInfo) {
+        if (Objects.isNull(queryInfo.getUserId())) {
+            SysUser sysUser = sysUserFeignService.queryUserInfo();
+            if (Objects.isNull(sysUser.getId())) {
+                return failed("请登录");
+            }
+            queryInfo.setUserId(sysUser.getId());
+        }
+        return succeed(sysCouponCodeService.querySysCouponUseList(queryInfo));
+    }
+
+    @ApiOperation("获取云教练活动跑马灯")
+    @RequestMapping(value = "queryPageAll")
+    public HttpResponseResult queryPageAll(QueryInfo queryInfo) {
+        return succeed(sysCouponCodeService.queryHorseRaceLampDtoList(queryInfo));
+    }
+
+    @ApiOperation("兑换优惠券")
+    @PostMapping(value = "exchangeCoupon")
+    public HttpResponseResult exchangeCoupon(Integer couponId, Long paymentOrderId, Integer exchangeNum) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        return succeed(sysCouponCodeService.exchangeCouponTest(sysUser.getId(), couponId, paymentOrderId, exchangeNum));
+    }
+
+    /**
+     * 手动领取优惠券
+     *
+     * @param param userId 领取者id
+     * @param param couponId 优惠券id
+     */
+    @ApiOperation("手动领取优惠券")
+    @PostMapping(value = "/manualIssueCoupon")
+    public HttpResponseResult manualIssueCoupon(@RequestBody Map<String, Object> param) {
+        Integer couponId = WrapperUtil.toInt(param, "couponId", "传入参数错误!");
+        couponIssueRecordService.manualIssueCoupon(getUserId(), couponId);
+        return succeed();
+    }
+
+    @ApiOperation("查询优惠券发放记录")
+    @GetMapping(value = "/queryCanBeGet")
+    public HttpResponseResult queryCanBeGetCoupon(String useSystem) {
+        if (StringUtils.isEmpty(useSystem)) {
+            useSystem = "MEC";
+        }
+        return succeed(couponIssueRecordService.queryCanBeGetCoupon(getUserId(),useSystem));
+    }
+
+    private Integer getUserId() {
+        //修改机构基础信息
+        return Optional.ofNullable(sysUserFeignService.queryUserInfo())
+                .map(SysUser::getId)
+                .orElseThrow(() -> new BizException("用户信息获取失败,重新登录!"));
+    }
+
+}

+ 28 - 0
mec-application/src/main/java/com/ym/mec/student/controller/SysExamSongController.java

@@ -0,0 +1,28 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.page.SysExamSongQueryInfo;
+import com.ym.mec.biz.service.SysExamSongService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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;
+
+@RequestMapping("${app-config.url.student:}/sysExamSong")
+@Api(tags = "曲库服务")
+@RestController
+public class SysExamSongController extends BaseController {
+
+    @Autowired
+    private SysExamSongService sysExamSongService;
+
+    @ApiOperation(value = "分页查询")
+    @GetMapping("/queryPage")
+    public Object queryPage(SysExamSongQueryInfo queryInfo) {
+        queryInfo.setType("COMMON");
+        return succeed(sysExamSongService.queryPage(queryInfo));
+    }
+
+}

+ 34 - 0
mec-application/src/main/java/com/ym/mec/student/controller/SysImComplaintController.java

@@ -0,0 +1,34 @@
+package com.ym.mec.student.controller;
+
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.SysImComplaint;
+import com.ym.mec.biz.service.SysImComplaintService;
+import com.ym.mec.common.controller.BaseController;
+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.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RequestMapping("${app-config.url.student:}/sysImComplaint")
+@Api(tags = "im投诉服务")
+@RestController
+public class SysImComplaintController extends BaseController {
+
+    @Autowired
+    private SysImComplaintService sysImComplaintService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "新增")
+    @PostMapping("/add")
+    public Object getOrgans(SysImComplaint sysImComplaint) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        sysImComplaint.setUserId(sysUser.getId());
+        return succeed(sysImComplaintService.insert(sysImComplaint));
+    }
+}

+ 130 - 0
mec-application/src/main/java/com/ym/mec/student/controller/SysMessageController.java

@@ -0,0 +1,130 @@
+package com.ym.mec.student.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.AppVersionInfoDao;
+import com.ym.mec.biz.dal.entity.AppVersionInfo;
+import com.ym.mec.biz.dal.enums.MessageSendMode;
+import com.ym.mec.biz.dal.page.SysMessageQueryInfo;
+import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
+import com.ym.mec.util.validator.CommonValidator;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.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.Map;
+
+@RestController
+@Api(tags = "消息服务")
+@RequestMapping("${app-config.url.student:}/sysMessage")
+public class SysMessageController extends BaseController {
+
+	@Autowired
+	private SysMessageService sysMessageService;
+
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+	@Autowired
+	private AppVersionInfoDao appVersionInfoDao;
+
+	@ApiOperation("获取所有消息列表")
+	@GetMapping(value = "list")
+	public Object list(SysMessageQueryInfo queryInfo){
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		queryInfo.setUserId(sysUser.getId());
+		queryInfo.setType(MessageSendMode.PUSH.getCode());
+		queryInfo.setJpushType("STUDENT");
+		return succeed(sysMessageService.queryPage(queryInfo));
+	}
+
+	@ApiOperation("获取消息分类类型")
+	@GetMapping(value = "typeList")
+	public Object typeList(String memo){
+		//如果用户使用的版本比当前版本号大,那么屏蔽缴费信息
+		if(StringUtils.isNotEmpty(memo)){
+			//获取当前使用的版本
+			AppVersionInfo appVersionInfo = appVersionInfoDao.queryNewestByPlatform("ios-student").get(0);
+			int defaultVersion = Integer.parseInt(appVersionInfo.getVersion().replaceAll("\\.",""));
+			int currentVersion = Integer.parseInt(memo.replaceAll("\\.",""));
+			if(currentVersion > defaultVersion){
+				return succeed(JSON.parseArray("[{\"value\":\"全部\",\"key\":\"ALL\"}," +
+						"{\"value\":\"课程信息\",\"key\":\"COURSE\"}," +
+						"{\"value\":\"训练信息\",\"key\":\"WORK\"}," +
+						"{\"value\":\"其他\",\"key\":\"DEFAULT\"}]"));
+			}
+		}
+		return succeed(JSON.parseArray("[{\"value\":\"全部\",\"key\":\"ALL\"}," +
+				"{\"value\":\"缴费信息\",\"key\":\"PAY\"}," +
+				"{\"value\":\"课程信息\",\"key\":\"COURSE\"}," +
+				"{\"value\":\"训练信息\",\"key\":\"WORK\"}," +
+				"{\"value\":\"其他\",\"key\":\"DEFAULT\"}]"));
+	}
+
+	@ApiOperation("一键已读")
+	@PostMapping("batchSetRead")
+	public Object batchSetRead() {
+		int status = 1;
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		return sysMessageService.updateStatus(sysUser.getId(), status,"STUDENT") > 0 ? succeed() : failed();
+	}
+
+	@ApiOperation("设置已读")
+	@PostMapping("setRead")
+	public Object setRead(Long id) {
+		int status = 1;
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		return sysMessageService.updateOneStatus(id, status) > 0 ? succeed() : failed();
+	}
+
+	@ApiOperation(value = "查询用户未读消息条数")
+	@GetMapping("/queryCountOfUnread")
+	public Object queryCountOfUnread() {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		Map<String, Integer> map = sysMessageService.queryCountOfUnread(MessageSendMode.PUSH, sysUser.getId(),"STUDENT", sysUser.getTenantId());
+
+		if (map == null || map.size() == 0) {
+			return succeed();
+		}
+		return succeed(map);
+	}
+
+	@ApiOperation(value = "发送消息")
+	@PostMapping("/sendMessage")
+	public Object sendMessage(MessageSender messageSender, String content, String receiver, int readStatus, String url, String group) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		Integer userId = sysUser.getId();
+
+		String mobileNo = sysUser.getPhone();
+		if (StringUtils.isBlank(mobileNo) || !CommonValidator.isMobileNo(mobileNo)) {
+			throw new BizException("请输入正确的手机号");
+		}
+		sysMessageService.sendMessage(messageSender, userId, "", content, receiver, null, readStatus, url, group, "STUDENT");
+		return succeed();
+	}
+}

+ 63 - 0
mec-application/src/main/java/com/ym/mec/student/controller/SysMusicCompareRecordController.java

@@ -0,0 +1,63 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
+import com.ym.mec.biz.service.SysMusicCompareRecordService;
+import com.ym.mec.biz.service.SysUserService;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/13 0013
+ */
+@Api(tags = "云教练记录")
+@RequestMapping("${app-config.url.student:}/sysMusicRecord")
+@RestController
+public class SysMusicCompareRecordController extends BaseController {
+
+    private static final Logger log = LoggerFactory.getLogger(SysMusicCompareRecordController.class);
+
+    @Autowired
+    private SysUserService sysUserService;
+    @Autowired
+    private SysMusicCompareRecordService sysMusicCompareRecordService;
+
+    @ApiOperation(value = "添加记录")
+    @PostMapping("add")
+    public HttpResponseResult add(SysMusicCompareRecord record,Integer campId){
+        if(Objects.isNull(record.getFeature())){
+            return failed("请设置功能点");
+        }
+        Integer userId = sysUserService.getUserId();
+        record.setUserId(userId);
+        record.setClientId("student");
+
+        log.warn(" add record info; record:{},campId :{}",record,campId);
+        
+        sysMusicCompareRecordService.insert(record,campId);
+        
+        ModelMap model = new ModelMap();
+        model.put("totalPlayTimeOfCurrentDate", sysMusicCompareRecordService.queryCurrentDatePlayTimeByUserId(userId));
+        
+        return succeed(model);
+    }
+
+    @ApiOperation(value = "用户最后一次评测数据")
+    @GetMapping("getLastEvaluationMusicalNotesPlayStats")
+    public HttpResponseResult getLastEvaluationMusicalNotesPlayStats(Long recordId){
+        return succeed(sysMusicCompareRecordService.getLastEvaluationMusicalNotesPlayStats(sysUserService.getUserId(), recordId));
+    }
+
+}

+ 56 - 0
mec-application/src/main/java/com/ym/mec/student/controller/SysMusicScoreAccompanimentController.java

@@ -0,0 +1,56 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.enums.ClientTypeEnum;
+import com.ym.mec.biz.dal.page.SysExamSongQueryInfo;
+import com.ym.mec.biz.service.SysMusicScoreAccompanimentService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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;
+
+@RequestMapping("${app-config.url.student:}/sysMusicScoreAccompaniment")
+@Api(tags = "曲库服务")
+@RestController
+public class SysMusicScoreAccompanimentController extends BaseController {
+
+    @Autowired
+    private SysMusicScoreAccompanimentService sysMusicScoreAccompanimentService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "分页查询")
+    @GetMapping("/queryPage")
+    public Object queryPage(SysExamSongQueryInfo queryInfo) {
+        queryInfo.setType("COMMON");
+        if(queryInfo.getClientType() == null){
+            queryInfo.setClientType(ClientTypeEnum.SMART_PRACTICE);
+        }
+        queryInfo.setShowFlag(1);
+        return succeed(sysMusicScoreAccompanimentService.queryAccPage(queryInfo));
+    }
+
+    @ApiOperation(value = "分页查询")
+    @GetMapping("/queryPageLimit")
+    public Object queryPageLimit(SysExamSongQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        queryInfo.setType("COMMON");
+        if(queryInfo.getClientType() == null){
+            queryInfo.setClientType(ClientTypeEnum.SMART_PRACTICE);
+        }
+        queryInfo.setShowFlag(1);
+        queryInfo.setOrganId(sysUser.getOrganId().toString());
+        queryInfo.setEnable(true);
+        return succeed(sysMusicScoreAccompanimentService.queryScorePage(queryInfo));
+    }
+
+    @ApiOperation(value = "获取伴奏声部列表")
+    @GetMapping("/querySubjectIds")
+    public Object querySubjectIds(Integer categoriesId) {
+        return succeed(sysMusicScoreAccompanimentService.querySubjectIds(categoriesId));
+    }
+}

+ 58 - 0
mec-application/src/main/java/com/ym/mec/student/controller/SysMusicScoreCategoriesController.java

@@ -0,0 +1,58 @@
+package com.ym.mec.student.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.dto.MusicScoreQueryInfo;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.TenantConfig;
+import com.ym.mec.biz.dal.page.SysExamSongQueryInfo;
+import com.ym.mec.biz.service.SysMusicScoreCategoriesService;
+import com.ym.mec.biz.service.TenantConfigService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequestMapping("${app-config.url.student:}/sysMusicScoreCategories")
+@Api(tags = "曲库分类服务")
+@RestController
+public class SysMusicScoreCategoriesController extends BaseController {
+
+    @Autowired
+    private SysMusicScoreCategoriesService sysMusicScoreCategoriesService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    
+    @Autowired
+    private TenantConfigService tenantConfigService;
+
+
+    @ApiOperation(value = "分页查询")
+    @GetMapping("/queryPage")
+    public Object queryPage(SysExamSongQueryInfo queryInfo) {
+        return succeed(sysMusicScoreCategoriesService.queryPage(queryInfo));
+    }
+
+    @ApiOperation(value = "树状列表")
+    @GetMapping("/queryTree")
+    public Object queryTree(MusicScoreQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null || sysUser.getId() == null){
+        	return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        
+        TenantConfig tenantConfig = tenantConfigService.getOne(new QueryWrapper<TenantConfig>().eq("tenant_id_", sysUser.getTenantId()));
+        
+        return succeed(sysMusicScoreCategoriesService.queryCategoriesTreeList(tenantConfig.getTeachingMaterialId(), queryInfo.getEnable()));
+    }
+
+    @ApiOperation(value = "获取分类详情")
+    @GetMapping("/get")
+    public Object get(Integer id) {
+        return succeed(sysMusicScoreCategoriesService.get(id));
+    }
+}

+ 40 - 0
mec-application/src/main/java/com/ym/mec/student/controller/SysMusicScoreController.java

@@ -0,0 +1,40 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.enums.ClientTypeEnum;
+import com.ym.mec.biz.dal.page.SysExamSongQueryInfo;
+import com.ym.mec.biz.service.SysMusicScoreService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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;
+
+@RequestMapping("${app-config.url.student:}/sysMusicScore")
+@Api(tags = "曲库")
+@RestController
+public class SysMusicScoreController extends BaseController {
+
+    @Autowired
+    private SysMusicScoreService sysMusicScoreService;
+
+    @ApiOperation(value = "分页查询")
+    @GetMapping("/queryPage")
+    public Object queryPage(SysExamSongQueryInfo queryInfo) {
+        queryInfo.setType("COMMON");
+        if(queryInfo.getClientType() == null){
+            queryInfo.setClientType(ClientTypeEnum.NETWORK_ROOM);
+        }
+        return succeed(sysMusicScoreService.queryPage(queryInfo));
+    }
+
+    @ApiOperation(value = "分页查询")
+    @GetMapping("/queryPage2")
+    public Object queryPage2(SysExamSongQueryInfo queryInfo) {
+        queryInfo.setType("COMMON");
+        queryInfo.setShowFlag(1);
+        queryInfo.setClientType(ClientTypeEnum.SMART_PRACTICE);
+        return succeed(sysMusicScoreService.queryMusicScorePageInfo(queryInfo));
+    }
+}

+ 47 - 0
mec-application/src/main/java/com/ym/mec/student/controller/SysTenantConfigController.java

@@ -0,0 +1,47 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.service.SysTenantConfigService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.tenant.TenantContextHolder;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+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.HashMap;
+import java.util.Map;
+
+/** 
+ * 系统配置控制层
+ */
+@RestController
+@Api(tags = "系统参数设置")
+@RequestMapping(value = "${app-config.url.student:}/sysTenantConfig")
+public class SysTenantConfigController extends BaseController {
+
+	@Autowired
+	private SysTenantConfigService sysTenantConfigService;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+	@ApiOperation(value = "参数列表")
+	@GetMapping(value = "queryAll")
+	public Object queryAll(String group) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		Map<String,Object> params = new HashMap<String, Object>(2);
+		params.put("group", group);
+		params.put("tenantId", sysUser.getTenantId());
+		return succeed(sysTenantConfigService.queryAll(params));
+	}
+
+	@ApiOperation(value = "获取单个配置")
+	@PostMapping(value = "findByName")
+	public Object findByName(String configName) {
+		return succeed(sysTenantConfigService.getTenantConfigValue(configName,TenantContextHolder.getTenantId()));
+	}
+}

+ 25 - 0
mec-application/src/main/java/com/ym/mec/student/controller/SystemDateController.java

@@ -0,0 +1,25 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+
+/** 
+ * 系统时间
+ */
+@RestController
+@Api(tags = "获取系统时间")
+@RequestMapping(value = "${app-config.url.student:}/systemDate")
+public class SystemDateController extends BaseController {
+
+	@ApiOperation(value = "查询参数")
+	@GetMapping(value = "query")
+	public Object query() {
+		return succeed(new Date());
+	}
+}

+ 124 - 0
mec-application/src/main/java/com/ym/mec/student/controller/TempLittleArtistTrainingCampController.java

@@ -0,0 +1,124 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCamp;
+import com.ym.mec.biz.dal.vo.TempCampUserQualificationsVo;
+import com.ym.mec.biz.dal.vo.TempCampUserTrainingDetailVo;
+import com.ym.mec.biz.dal.vo.TempCampUserTrainingPlayTimeVo;
+import com.ym.mec.biz.dal.vo.TempUserTrainingTimeDetailVo;
+import com.ym.mec.biz.service.TempLittleArtistTrainingCampService;
+import com.ym.mec.biz.service.TempLittleArtistTrainingCampUserRelationService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 小小艺术家训练营活动(TempLittleArtistTrainingCamp)表控制层
+ *
+ * @author hgw
+ * @since 2022-05-17 20:56:22
+ */
+@Api(tags = "小小艺术家训练营活动")
+@RestController
+@RequestMapping("${app-config.url.student:}/tempLittleArtistTrainingCamp")
+public class TempLittleArtistTrainingCampController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private TempLittleArtistTrainingCampService tempLittleArtistTrainingCampService;
+    @Resource
+    private TempLittleArtistTrainingCampUserRelationService tempLittleArtistTrainingCampUserRelationService;
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "name", dataType = "String", value = "训练营标题-模糊搜索"),
+            @ApiImplicitParam(name = "state", dataType = "String", value = "筹备中 READY,报名中 APPLY,未开始 NOT_START,进行中 ING,已结束 END"),
+            @ApiImplicitParam(name = "applyStartDate", dataType = "String", value = "申请报名登记开始日期-年月日"),
+            @ApiImplicitParam(name = "applyEndDate", dataType = "String", value = "申请报名登记结束日期-年月日"),
+            @ApiImplicitParam(name = "trainStartDate", dataType = "String", value = "训练开始日期-年月日"),
+            @ApiImplicitParam(name = "trainEndDate", dataType = "String", value = "训练结束日期-年月日"),
+            @ApiImplicitParam(name = "page", dataType = "Integer", required = true, value = "页数"),
+            @ApiImplicitParam(name = "rows", dataType = "Integer", required = true, value = "每页数量"),
+    })
+    @ApiOperation("分页查询-训练营列表")
+    @PostMapping(value = "/queryPageTrainingCamp")
+    public HttpResponseResult<PageInfo<TempLittleArtistTrainingCamp>> queryPageTrainingCamp(@RequestBody Map<String, Object> param) {
+        return succeed(tempLittleArtistTrainingCampService.queryPageTrainingCamp(param));
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", dataType = "Integer", required = true, value = "用户id"),
+            @ApiImplicitParam(name = "campId", dataType = "Integer", value = "训练营id"),
+    })
+    @ApiOperation("查询指定学生-训练营每日训练时长")
+    @PostMapping(value = "/queryUserTrainingTime")
+    public HttpResponseResult<List<TempUserTrainingTimeDetailVo>> queryUserTrainingTime(@RequestBody Map<String, Object> param) {
+        return succeed(tempLittleArtistTrainingCampService.queryUserTrainingTime(param));
+    }
+
+    @ApiOperation("查询指定学生-训练营每日训练时长")
+    @PostMapping(value = "/getUserTrainingTime")
+    public HttpResponseResult<Integer> getUserTrainingTime() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        return succeed(tempLittleArtistTrainingCampService.getUserTrainingTime(sysUser.getId()));
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "search", dataType = "String", value = "学员姓名/手机号/编号-模糊搜索"),
+            @ApiImplicitParam(name = "imGroupId", dataType = "Integer", value = "所在群组Id"),
+            @ApiImplicitParam(name = "campId", dataType = "Integer", value = "训练营id"),
+            @ApiImplicitParam(name = "page", dataType = "Integer", required = true, value = "页数"),
+            @ApiImplicitParam(name = "rows", dataType = "Integer", required = true, value = "每页数量"),
+    })
+    @ApiOperation("分页查询-训练营详情")
+    @PostMapping(value = "/queryUserTrainingDetail")
+    public HttpResponseResult<PageInfo<TempCampUserTrainingDetailVo>> queryUserTrainingDetail(@RequestBody Map<String, Object> param){
+        return succeed(tempLittleArtistTrainingCampService.queryUserTrainingDetail(param));
+    }
+
+    /**
+     * 查询训练营周期表
+     *
+     * @return result:
+     * <p>user 学员信息
+     * <p>campList 训练营信息
+     */
+    @ApiOperation(value="查询训练营周期表", notes="user 学员信息,campList 训练营信息")
+    @GetMapping(value = "/queryCampCycle")
+    public HttpResponseResult<Map<String, Object>> queryCampCycle(){
+        return succeed(tempLittleArtistTrainingCampService.queryCampCycle());
+    }
+
+    @ApiOperation(value="云教练训练是否达标数据查询")
+    @GetMapping(value = "/queryUserTrainingPlayTime")
+    public HttpResponseResult<TempCampUserTrainingPlayTimeVo> queryUserTrainingPlayTime(){
+        return succeed(tempLittleArtistTrainingCampService.queryUserTrainingPlayTime());
+    }
+
+    @ApiOperation(value="查询当前登录学生有没有资格参加训练营")
+    @GetMapping(value = "/checkCampQualifications")
+    public HttpResponseResult<TempCampUserQualificationsVo> checkCampQualifications(){
+        return succeed(tempLittleArtistTrainingCampUserRelationService.checkCampQualifications());
+    }
+
+    @ApiOperation(value="参与训练营")
+    @GetMapping(value = "/addCamp")
+    public HttpResponseResult<Object> addCamp(Integer campId){
+        tempLittleArtistTrainingCampUserRelationService.add(campId);
+        return succeed();
+    }
+
+}
+

+ 86 - 0
mec-application/src/main/java/com/ym/mec/student/controller/TempLiveActivityController.java

@@ -0,0 +1,86 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.TempLiveTeacherCardDao;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.Subject;
+import com.ym.mec.biz.dal.entity.TempLiveTeacherCard;
+import com.ym.mec.biz.service.StudentService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+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 springfox.documentation.annotations.ApiIgnore;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 直播临时活动
+ */
+@RequestMapping("${app-config.url.student:}/tempLiveActivityController")
+@Api(tags = "直播临时活动")
+@RestController
+public class TempLiveActivityController extends BaseController {
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private StudentService studentService;
+    @Resource
+    private TempLiveTeacherCardDao tempLiveTeacherCardDao;
+
+    @ApiOperation("查询声部")
+    @PostMapping(value = "/querySubjectOption", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult<Map<String, Object>> querySubjectOption() {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || user.getId() == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        Map<String, Object> res = new HashMap<>();
+        List<Subject> options = tempLiveTeacherCardDao.querySubjectOption();
+        res.put("options", options);
+
+        Student student = studentService.get(user.getId());
+        res.put("subjectId", student.getSubjectIdList());
+
+        Integer goodsId = 4;
+        Integer ststus = tempLiveTeacherCardDao.getJoinStstus(user.getId(), goodsId);
+        res.put("ststus", ststus);
+
+        String joinSubjectId = tempLiveTeacherCardDao.getJoinSubject(user.getId(),goodsId);
+        res.put("joinSubjectId", joinSubjectId);
+
+        return succeed(res);
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(
+                    name = "subjectId",
+                    value = "声部id",
+                    paramType = "query", dataType = "String", required = true
+            )
+    })
+    @ApiOperation("查询声部上课老师名片信息列表")
+    @PostMapping(value = "/listTeacherCard", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult<List<TempLiveTeacherCard>> listTeacherCard(@ApiIgnore @RequestBody TempLiveTeacherCard param) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || user.getId() == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        param.setStudentId(user.getId());
+        List<TempLiveTeacherCard> list = tempLiveTeacherCardDao.list(param);
+        return succeed(list);
+    }
+}

+ 43 - 0
mec-application/src/main/java/com/ym/mec/student/controller/TenantApplyController.java

@@ -0,0 +1,43 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.entity.TenantApply;
+import com.ym.mec.biz.service.TenantApplyService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.service.IdGeneratorService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+
+@RequestMapping("${app-config.url.student:}/tenantApply")
+@Api(tags = "机构申请服务")
+@RestController
+public class TenantApplyController extends BaseController {
+
+	@Autowired
+	private TenantApplyService tenantApplyService;
+
+	@Autowired
+	private IdGeneratorService smsCodeService;
+
+
+	@ApiOperation("新增")
+	@PostMapping(value = "/add", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+	public Object add(TenantApply tenantApply) {
+		
+		boolean b = smsCodeService.verifyValidCode(tenantApply.getMobileNo(), tenantApply.getSmsCode());
+		if (!b) {
+			return failed("验证码不正确");
+		}
+		
+		tenantApply.setCreateTime(new Date());
+		tenantApplyService.insert(tenantApply);
+		return succeed();
+	}
+
+}

+ 61 - 0
mec-application/src/main/java/com/ym/mec/student/controller/TenantInfoController.java

@@ -0,0 +1,61 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.service.TenantInfoService;
+import com.ym.mec.common.controller.BaseController;
+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.http.HttpStatus;
+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;
+
+import javax.annotation.Resource;
+
+/**
+ * @author hgw
+ * Created by 2021-12-07
+ */
+@RequestMapping("${app-config.url.student:}/tenantInfo")
+@Api(tags = "机构管理")
+@RestController
+public class TenantInfoController extends BaseController {
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation("查询单个机构详情")
+    @GetMapping(value = "/info/{id}")
+    public Object queryTenantInfo(@ApiParam(value = "机构ID", required = true) @PathVariable("id") Integer id) {
+        return succeed(tenantInfoService.queryTenantInfo(id));
+    }
+
+    @ApiOperation("查询用户机构信息")
+    @GetMapping(value = "/queryUserTenantInfo")
+    public Object queryUserTenantInfo() {
+    	SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || user.getId() == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(tenantInfoService.queryTenantInfo(user.getTenantId()));
+    }
+
+    @ApiOperation("查询单个机构详情")
+    @GetMapping(value = "/checkInfo/{id}")
+    public Object queryTenantInfoCheck(@ApiParam(value = "机构ID", required = true) @PathVariable("id") Integer id) {
+        return succeed(tenantInfoService.queryTenantInfoCheck(id));
+    }
+
+    @ApiOperation("查询单个机构详情按分部Id")
+    @GetMapping(value = "/queryTenantInfoByOrgan/{organId}")
+    public Object queryTenantInfoByOrgan(@ApiParam(value = "分部ID", required = true) @PathVariable("organId") Integer organId) {
+        return succeed(tenantInfoService.queryTenantInfoByOrgan(organId));
+    }
+}

+ 118 - 0
mec-application/src/main/java/com/ym/mec/student/controller/WechatController.java

@@ -0,0 +1,118 @@
+
+package com.ym.mec.student.controller;
+
+import com.alibaba.fastjson.JSONPath;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.redis.service.RedisCache;
+import com.ym.mec.util.http.HttpUtil;
+import com.ym.mec.util.string.ValueUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.codec.digest.DigestUtils;
+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.IOException;
+import java.net.URLDecoder;
+import java.util.*;
+
+@RequestMapping("${app-config.url.student:}/wechat")
+@Api(tags = "微信")
+@RestController
+public class WechatController extends BaseController {
+
+//	private String appId = "wx80f175c0eb6836e9";
+//
+//	private String secret = "a9d779747dba9f4e82f19882debe3e93";
+	
+	private final static String WX_ACCESS_TOKEN = "WX_ACCESS_TOKEN";
+
+    @Autowired
+    private RedisCache<String, Object> redisCache;
+
+	private static final Map<String,Map<String,String>> appidMap = createAppidMap();
+
+	@ApiOperation("获取签名")
+	@GetMapping(value = "/getSignature")
+	public Object getSignature(String url,String platform) throws Exception {
+		if(StringUtils.isEmpty(platform)){
+			platform = "gym";
+		}
+		Map<String, String> appIdMap = appidMap.get(platform);
+
+		url = URLDecoder.decode(url);
+		String appId = appIdMap.get("appId");
+		String accessToken = getAccessToken(appId, appIdMap.get("secret"));
+
+		String ticket = getTicket(accessToken);
+
+		String noncestr = UUID.randomUUID().toString();
+		String timestamp = System.currentTimeMillis() + "";
+
+		SortedMap<String, Object> parameterMap = new TreeMap<String, Object>();
+		parameterMap.put("noncestr", noncestr);
+		parameterMap.put("jsapi_ticket", ticket);
+		parameterMap.put("timestamp", timestamp);
+		parameterMap.put("url", url);
+
+		String str = ValueUtil.joinKeyValue(parameterMap, "", "", "&", false, "");
+
+		String signature = DigestUtils.sha1Hex(str);
+
+		Map<String, Object> result = new HashMap<String, Object>();
+		result.put("appId", appId);
+		result.put("timestamp", timestamp);
+		result.put("nonceStr", noncestr);
+		result.put("signature", signature);
+
+		return succeed(result);
+	}
+
+	private static Map<String,Map<String,String>> createAppidMap(){
+		Map<String,Map<String,String>> resultMap = new HashMap<>();
+		Map<String,String> map = new HashMap<>();
+		map.put("appId", "wx80f175c0eb6836e9");
+		map.put("secret", "a9d779747dba9f4e82f19882debe3e93");
+		Map<String,String> map1 = new HashMap<>();
+		map1.put("appId", "wx751141096e75a4ee");
+		map1.put("secret", "e882d76c95d1613607a85338b1bed3ff");
+		resultMap.put("gym",map);
+		resultMap.put("daya",map1);
+		return resultMap;
+	}
+
+	private String getAccessToken(String appid, String secret) throws IOException {
+
+		if (redisCache.exists(WX_ACCESS_TOKEN)) {
+			if (redisCache.get(WX_ACCESS_TOKEN) != null) {
+				if (StringUtils.isNotEmpty(redisCache.get(WX_ACCESS_TOKEN).toString())) {
+					return redisCache.get(WX_ACCESS_TOKEN).toString();
+				}
+			}
+		}
+		Map<String, Object> parameterMap = new HashMap<String, Object>();
+		parameterMap.put("grant_type", "client_credential");
+		parameterMap.put("appid", appid);
+		parameterMap.put("secret", secret);
+
+		String result = HttpUtil.get("https://api.weixin.qq.com/cgi-bin/token", parameterMap);
+		String accessToken = (String) JSONPath.extract(result, "$.access_token");
+		
+		redisCache.put(WX_ACCESS_TOKEN, accessToken, 7100);
+
+		return accessToken;
+	}
+
+	private String getTicket(String accessToken) throws IOException {
+		Map<String, Object> parameterMap = new HashMap<String, Object>();
+		parameterMap.put("access_token", accessToken);
+		parameterMap.put("type", "jsapi");
+		String result = HttpUtil.get("https://api.weixin.qq.com/cgi-bin/ticket/getticket", parameterMap);
+
+		return (String) JSONPath.extract(result, "$.ticket");
+	}
+	
+}

+ 30 - 0
mec-application/src/main/java/com/ym/mec/student/controller/WithdrawController.java

@@ -0,0 +1,30 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.service.StudentWithdrawService;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+
+@RestController
+@RequestMapping("${app-config.url.student:}/studentWithdraw")
+@Api(tags = "提现服务")
+public class WithdrawController extends BaseController {
+
+	@Autowired
+	private StudentWithdrawService studentWithdrawService;
+
+	@ApiOperation(value = "新增提现申请")
+	@PostMapping("/add")
+	public Object add(String bankCardNo, BigDecimal amount) throws Exception {
+		throw new BizException("此功能暂未开放");
+//		studentWithdrawService.apply(bankCardNo, amount);
+//		return succeed();
+	}
+}

+ 117 - 0
mec-application/src/main/java/com/ym/mec/student/controller/degree/DegreeInfoController.java

@@ -0,0 +1,117 @@
+package com.ym.mec.student.controller.degree;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.google.common.collect.Lists;
+import com.microsvc.toolkit.common.response.paging.PageInfo;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.enums.EDegreeStatus;
+import com.ym.mec.biz.dal.wrapper.DegreeWrapper;
+import com.ym.mec.biz.service.DegreeService;
+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 lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("${app-config.url.student:}/degree")
+@Api(tags = "考级信息")
+public class DegreeInfoController extends BaseController {
+
+    @Autowired
+    private DegreeService degreeService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "详情", notes = "考级信息-根据详情ID查询单条, 传入id")
+    @GetMapping("/detail/{id}")
+    public HttpResponseResult<DegreeWrapper.StudentDegreeInfo> detail(@PathVariable("id") Long id) {
+
+        // 登录用户信息
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(user) || Objects.isNull(user.getId())){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+
+        // 考级信息
+        DegreeWrapper.StudentDegreeInfo wrapper = degreeService.studentDegreeInfoById(id);
+
+        // 考级机构-暂未开放此活动
+        /*if (!user.getTenantId().equals(wrapper.getTenantId())) {
+            throw new BizException("暂未开放此活动");
+        }*/
+
+        // 考级城市-暂未开放此活动
+        /*boolean noneMatch = Arrays.stream(wrapper.getOrganIds().split(","))
+                .mapToInt(Integer::parseInt).noneMatch(x -> x == user.getOrganId());
+        if (Objects.nonNull(user.getOrganId()) && noneMatch) {
+            throw new BizException("暂未开放此活动");
+        }*/
+
+        // 查询机构信息
+        return succeed(wrapper);
+    }
+    
+    @ApiOperation(value = "查询分页", notes = "考级信息- 传入 DegreeWrapper.DegreeQuery") 
+    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<DegreeWrapper.Degree>> page(@RequestBody DegreeWrapper.DegreeQuery query) {
+
+        // 登录用户信息
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(user) || Objects.isNull(user.getId())) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        // 设置用户机构ID和城市分部ID
+        query.tenantId(user.getTenantId()).organId(user.getOrganId()).setDegreeStatuses(Lists.newArrayList(EDegreeStatus.END));
+
+        IPage<DegreeWrapper.Degree> pages = degreeService.selectPage(QueryInfo.getPage(query), query);
+
+        // 首页查询时,默认查询进行中,未开始插入首页
+        if (query.getPage() == 1) {
+
+            // 设置分页查询参数
+            query.rows(1000).degreeStatuses(Lists.newArrayList(EDegreeStatus.NOT_START, EDegreeStatus.START));
+
+            // 考级信息
+            Map<EDegreeStatus, List<DegreeWrapper.Degree>> collect = degreeService.selectPage(QueryInfo.getPage(query), query).getRecords().stream()
+                    .collect(Collectors.groupingBy(DegreeWrapper.Degree::getStatus));
+
+            List<DegreeWrapper.Degree> degrees = Lists.newArrayList();
+            // 进行中
+            if (collect.containsKey(EDegreeStatus.START)) {
+                degrees.addAll(collect.get(EDegreeStatus.START).stream()
+                        .sorted(Comparator.comparing(DegreeWrapper.Degree::getStartTime))
+                        .collect(Collectors.toList()));
+            }
+
+            // 未开始
+            if (collect.containsKey(EDegreeStatus.NOT_START)) {
+                degrees.addAll(collect.get(EDegreeStatus.NOT_START).stream()
+                        .sorted(Comparator.comparing(DegreeWrapper.Degree::getStartTime))
+                        .collect(Collectors.toList()));
+            }
+
+            if (CollectionUtils.isNotEmpty(degrees)) {
+                pages.getRecords().addAll(0, degrees);
+            }
+        }
+        
+        return succeed(QueryInfo.pageInfo(pages));
+    }
+}

+ 64 - 0
mec-application/src/main/java/com/ym/mec/student/controller/degree/DegreeLevelFeeController.java

@@ -0,0 +1,64 @@
+package com.ym.mec.student.controller.degree;
+
+import com.microsvc.toolkit.common.response.paging.PageInfo;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.DegreeLevelFeeNew;
+import com.ym.mec.biz.dal.vo.DegreeLevelFeeNewVo;
+import com.ym.mec.biz.dal.wrapper.DegreeLevelFeeWrapper;
+import com.ym.mec.biz.service.DegreeLevelFeeService;
+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 lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Objects;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("${app-config.url.student:}/degreeLevelFee")
+@Api(tags = "考级等级费用配置")
+public class DegreeLevelFeeController extends BaseController {
+
+    @Autowired
+    private DegreeLevelFeeService degreeLevelFeeService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+	@ApiOperation(value = "详情", notes = "考级等级费用配置-根据详情ID查询单条, 传入id")
+    @GetMapping("/detail/{id}")
+    public HttpResponseResult<DegreeLevelFeeNew> detail(@PathVariable("id") Long id) {
+
+        DegreeLevelFeeNew wrapper = degreeLevelFeeService.detail(id);
+        
+        return succeed(wrapper);
+	}
+    
+    @ApiOperation(value = "查询分页", notes = "考级等级费用配置- 传入 DegreeLevelFeeWrapper.DegreeLevelFeeQuery") 
+    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<DegreeLevelFeeNewVo>> page(@RequestBody DegreeLevelFeeWrapper.DegreeLevelFeeQuery query) {
+        
+        return succeed(QueryInfo.pageInfo(degreeLevelFeeService.selectPage(QueryInfo.getPage(query), query)));
+	}
+    
+    @ApiOperation(value = "考级费用配置", notes = "考级费用配置查询")
+    @GetMapping("/degreeLevelFeeConfig")
+    public HttpResponseResult<DegreeLevelFeeWrapper.DegreeLevelFee> degreeLevelFeeConfig() {
+
+        // 登录用户信息
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(user)||Objects.isNull(user.getId())){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+
+        // 根据用户机构ID,查询对应考级配置
+        return succeed(degreeLevelFeeService.degreeLevelFeeConfig(user.getTenantId()));
+    }
+}

+ 47 - 0
mec-application/src/main/java/com/ym/mec/student/controller/degree/DegreeNewsController.java

@@ -0,0 +1,47 @@
+package com.ym.mec.student.controller.degree;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.microsvc.toolkit.common.response.paging.PageInfo;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.ym.mec.biz.dal.entity.DegreeNews;
+import com.ym.mec.biz.dal.vo.DegreeNewsVo;
+import com.ym.mec.biz.dal.wrapper.DegreeNewsWrapper;
+import com.ym.mec.biz.service.DegreeNewsService;
+import com.ym.mec.biz.service.SysUserService;
+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 lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("${app-config.url.student:}/degreeNews")
+@Api(tags = "考级资讯表")
+public class DegreeNewsController extends BaseController {
+
+    @Autowired
+    private DegreeNewsService degreeNewsService;
+    @Autowired
+    private SysUserService sysUserService;
+
+	@ApiOperation(value = "详情", notes = "考级资讯表-根据详情ID查询单条, 传入id")
+    @GetMapping("/detail/{id}")
+    public HttpResponseResult<DegreeNews> detail(@PathVariable("id") Long id) {
+    	DegreeNews wrapper = degreeNewsService.detail(id);
+        return succeed(wrapper);
+	}
+    
+    @ApiOperation(value = "查询分页", notes = "考级资讯表- 传入 DegreeNewsWrapper.DegreeNewsQuery") 
+    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<DegreeNewsVo>> page(@RequestBody DegreeNewsWrapper.DegreeNewsQuery query) {
+        query.setOrganId(sysUserService.getUser().getOrganId());
+        IPage<DegreeNewsVo> pages = degreeNewsService.selectPage(QueryInfo.getPage(query), query);
+        return succeed(QueryInfo.pageInfo(pages));
+	}
+    
+}

+ 99 - 0
mec-application/src/main/java/com/ym/mec/student/controller/open/OpenLiveBroadcastRoomController.java

@@ -0,0 +1,99 @@
+package com.ym.mec.student.controller.open;
+
+import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
+import com.ym.mec.biz.dal.vo.RoomUserInfoVo;
+import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.entity.ImUserState;
+import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 直播房间开放接口
+ *
+ */
+@Api(tags = "直播房间开放接口")
+@RestController
+@RequestMapping("${app-config.url.student:}/open/liveBroadcastRoom")
+public class OpenLiveBroadcastRoomController extends BaseController {
+
+    /**
+     * 服务对象
+     */
+    @Resource
+    private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
+
+    @ApiOperation("直播间游客微信身份")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "code", value = "微信身份code", required = true, dataType = "String"),
+    })
+    @GetMapping("/visitorFingerprint")
+    public HttpResponseResult<String> visitorFingerprint(@RequestParam String code) {
+
+        // 游客访问直播间凭据信息
+        return succeed(imLiveBroadcastRoomService.visitorFingerprint(code));
+    }
+
+    @ApiOperation("直播间游客访问凭据")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roomUid", value = "直播间编号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "fingerprint", value = "游客凭据", required = true, dataType = "String")
+    })
+    @GetMapping("/visitorCredentials")
+    public HttpResponseResult<RoomUserInfoVo> visitorCredentials(@RequestParam String roomUid,
+                                                                 @RequestParam String fingerprint) {
+
+        // 游客访问直播间凭据信息
+        return succeed(imLiveBroadcastRoomService.getVisitorCredentials(roomUid, fingerprint));
+    }
+
+
+    @ApiOperation("游客查询房间信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roomUid", value = "房间编号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "userId", value = "游客编号", required = true, dataType = "Integer"),
+    })
+    @GetMapping("/visitorRoomInfo")
+    public HttpResponseResult<ImLiveBroadcastRoomVo> visitorRoomInfo(@RequestParam String roomUid, @RequestParam Integer userId) {
+
+        return succeed(imLiveBroadcastRoomService.visitorRoomInfo(roomUid, userId));
+    }
+
+    @ApiOperation("游客-进入房间")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roomUid", value = "房间编号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "userId", value = "游客编号", required = true, dataType = "Integer"),
+    })
+    @GetMapping("/visitorJoinRoom")
+    public HttpResponseResult<Object> visitorJoinRoom(@RequestParam String roomUid, @RequestParam Integer userId) {
+
+        // 校验请求参数
+        if (StringUtils.isAnyBlank(roomUid) || Objects.isNull(userId)) {
+            throw new BizException("请求参数错误");
+        }
+
+        // 游客加入直播间
+        imLiveBroadcastRoomService.visitorJoinRoom(roomUid, userId);
+
+        return succeed();
+    }
+
+    @ApiOperation("游客退出直播间")
+    @PostMapping("/visitorQuitRoom")
+    public HttpResponseResult<Object> visitorQuitRoom(@RequestBody List<ImUserState> userState) {
+        imLiveBroadcastRoomService.opsRoom(userState);
+        return succeed();
+    }
+
+}
+

+ 32 - 0
mec-application/src/main/java/com/ym/mec/student/controller/open/OpenSysConfigController.java

@@ -0,0 +1,32 @@
+package com.ym.mec.student.controller.open;
+
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/** 
+ * 系统配置控制层
+ */
+@RestController
+@Api(tags = "系统参数设置")
+@RequestMapping(value = "${app-config.url.student:}/open/sysConfig")
+public class OpenSysConfigController extends BaseController {
+
+	@Autowired
+	private SysConfigService sysConfigService;
+
+	@ApiOperation(value = "查询参数")
+	@GetMapping(value = "queryByParamName")
+	public Object queryByParamName(String paramName) {
+		if(StringUtils.isBlank(paramName)){
+			return failed("参数不能为空");
+		}
+		return succeed(sysConfigService.findByParamName(paramName));
+	}
+}

+ 116 - 0
mec-application/src/main/java/com/ym/mec/teacher/controller/ActivityUserMapperController.java

@@ -0,0 +1,116 @@
+package com.ym.mec.teacher.controller;
+
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.VipGroupDefaultClassesUnitPriceDao;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.entity.VipGroupDefaultClassesUnitPrice;
+import com.ym.mec.biz.dal.page.ActivityUserQueryInfo;
+import com.ym.mec.biz.service.ActivityUserMapperService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.util.date.DateUtil;
+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.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.List;
+import java.util.Objects;
+
+@Api(tags = "活动排课")
+@RequestMapping("${app-config.url.teacher:}/activityUserMapper")
+@RestController
+public class ActivityUserMapperController extends BaseController {
+
+    @Autowired
+    private ActivityUserMapperService activityUserMapperService;
+    @Autowired
+    private SysUserService sysUserService;
+    @Autowired
+    private TeacherDao teacherDao;
+    @Autowired
+    private VipGroupDefaultClassesUnitPriceDao vipGroupDefaultClassesUnitPriceDao;
+
+    @ApiOperation(value = "获取老师待排课课程类型列表")
+    @RequestMapping("/queryWaitCourseCategory")
+    public HttpResponseResult<List<CourseFormDto>> queryWaitCourse(){
+        return succeed(activityUserMapperService.queryWaitCourseCategory(sysUserService.getUserId(),null));
+    }
+
+    @ApiOperation(value = "获取活动排课学员列表")
+    @PostMapping("/queryActivityStudentList")
+    public HttpResponseResult<List<ActivityUserDto>> queryActivityStudentList(@RequestBody ActivityUserQueryInfo activityUserQueryInfo){
+        if(activityUserQueryInfo.getCategoryId() == null){
+            throw new BizException("请选择课程类型");
+        }
+        if(activityUserQueryInfo.getCategoryId().equals(0)){
+            activityUserQueryInfo.setCategoryId(null);
+        }
+        activityUserQueryInfo.setTeacherId(sysUserService.getUserId());
+        return succeed(activityUserMapperService.queryActivityStudentList(activityUserQueryInfo));
+    }
+
+    @ApiOperation(value = "获取活动排课可排课时长列表")
+    @PostMapping("/queryActivityCourseTimeList")
+    public HttpResponseResult<List<Integer>> queryActivityCourseTimeList(@RequestBody ActivityUserQueryInfo activityUserQueryInfo){
+        if(activityUserQueryInfo.getCategoryId() == null){
+            throw new BizException("请选择课程类型");
+        }
+        if(activityUserQueryInfo.getCategoryId().equals(0)){
+            activityUserQueryInfo.setCategoryId(null);
+        }
+        activityUserQueryInfo.setTeacherId(sysUserService.getUserId());
+        return succeed(activityUserMapperService.queryActivityCourseTimeList(activityUserQueryInfo));
+    }
+
+
+    @ApiOperation(value = "教师端活动排课")
+    @PostMapping("/createVipGroup")
+    public HttpResponseResult createVipGroup(@RequestBody VipGroupApplyDto vipGroupApplyDto){
+        VipGroupApplyBaseInfoDto applyBaseInfo = vipGroupApplyDto.getVipGroupApplyBaseInfo();
+        if(Objects.isNull(applyBaseInfo.getEducationalTeacherId())){
+            throw new BizException("请选择乐团主管");
+        }
+        applyBaseInfo.setUserId(sysUserService.getUserId());
+        Teacher teacher = teacherDao.get(applyBaseInfo.getUserId());
+        applyBaseInfo.setOrganId(teacher.getTeacherOrganId());
+        vipGroupApplyDto.getCourseSchedules().stream().forEach(e->e.setEndClassTime(DateUtil.addMinutes(e.getStartClassTime(), applyBaseInfo.getSingleClassMinutes())));
+
+        // 默认VIP课
+        if (StringUtils.isBlank(applyBaseInfo.getGroupType())) {
+            applyBaseInfo.setGroupType("VIP");
+        }
+
+        VipGroupDefaultClassesUnitPrice vipGroupDefaultClassesUnitPrice = vipGroupDefaultClassesUnitPriceDao.getByVipGroupCategory(applyBaseInfo.getVipGroupCategoryId(),
+                applyBaseInfo.getOrganId(), applyBaseInfo.getGroupType(),null);
+        if(Objects.nonNull(vipGroupDefaultClassesUnitPrice)){
+            applyBaseInfo.setOnlineClassesUnitPrice(vipGroupDefaultClassesUnitPrice.getOnlineClassesUnitPrice());
+            applyBaseInfo.setOfflineClassesUnitPrice(vipGroupDefaultClassesUnitPrice.getOfflineClassesUnitPrice());
+        }
+        return activityUserMapperService.createActivityVipGroup(vipGroupApplyDto);
+    }
+
+    @ApiOperation(value = "教师端网管课活动排课")
+    @PostMapping("/createPracticeGroup")
+    public HttpResponseResult createPracticeGroup(@RequestBody PracticeGroupApplyDto practiceGroupApplyDto){
+        PracticeGroupApplyBaseInfoDto applyBaseInfo = practiceGroupApplyDto.getPracticeGroupApplyBaseInfoDto();
+        if(Objects.isNull(applyBaseInfo.getEducationalTeacherId())){
+            throw new BizException("请选择乐团主管");
+        }
+        applyBaseInfo.setUserId(sysUserService.getUserId());
+        Teacher teacher = teacherDao.get(applyBaseInfo.getUserId());
+        applyBaseInfo.setOrganId(teacher.getTeacherOrganId());
+        for (CourseSchedule courseSchedule : practiceGroupApplyDto.getCourseSchedules()) {
+            courseSchedule.setEndClassTime(DateUtil.addMinutes(courseSchedule.getStartClassTime(), applyBaseInfo.getSingleClassMinutes()));
+        }
+        return activityUserMapperService.createActivityPracticeGroup(practiceGroupApplyDto);
+    }
+}

+ 132 - 0
mec-application/src/main/java/com/ym/mec/teacher/controller/ClassGroupController.java

@@ -0,0 +1,132 @@
+package com.ym.mec.teacher.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.StudentSubjectDto;
+import com.ym.mec.biz.dal.entity.CourseScheduleEvaluate;
+import com.ym.mec.biz.dal.page.CourseScheduleQueryInfo;
+import com.ym.mec.biz.dal.page.ImGroupNoticeQueryInfo;
+import com.ym.mec.biz.service.ClassGroupService;
+import com.ym.mec.biz.service.CourseScheduleEvaluateService;
+import com.ym.mec.biz.service.ImGroupNoticeService;
+import com.ym.mec.biz.service.SubjectService;
+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 io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/10/17
+ */
+@Api(tags = "班级服务")
+@RequestMapping("${app-config.url.teacher:}/classGroup")
+@RestController
+public class ClassGroupController extends BaseController {
+    @Autowired
+    private ClassGroupService classGroupService;
+    @Autowired
+    private CourseScheduleEvaluateService courseScheduleEvaluateService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private ImGroupNoticeService imGroupNoticeService;
+    @Autowired
+    private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+    @Autowired
+    private SubjectService subjectService;
+
+    @ApiOperation(value = "教师关联班级获取")
+    @GetMapping("/findTeacherClassGroups")
+    public Object findTeacherClassGroups(String type,String status, String groupName){
+        return succeed(classGroupService.findTeacherClassGroups(type,status,groupName));
+    }
+
+    @ApiOperation(value = "获取教师班级详情界面头部信息")
+    @GetMapping("/findTeacherClassGroupInfo")
+    public Object findTeacherClassGroupInfo(@ApiParam(value = "班级编号", required = true)Integer classGroupId){
+        return succeed(classGroupService.findTeacherClassGroupInfo(classGroupId));
+    }
+
+    @ApiOperation(value = "获取班级对应学生列表")
+    @GetMapping("/findTeacherClassStudents")
+    public Object findTeacherClassStudents(CourseScheduleQueryInfo queryInfo){
+        return succeed(classGroupService.findTeacherClassStudents(queryInfo));
+    }
+
+    @ApiOperation(value = "获取课程学员列表")
+    @GetMapping("/getCourseStudents")
+    public HttpResponseResult<List<BasicUserDto>> getCourseStudents(Long courseScheduleId){
+        List<BasicUserDto> courseStudents = courseScheduleStudentPaymentDao.getCourseStudents(courseScheduleId);
+
+        // 乐团声部为空,取student的声部
+        if (!CollectionUtils.isEmpty(courseStudents)) {
+            Set<Long> collect = courseStudents.stream().map(o -> o.getUserId()).map(o -> o.longValue()).collect(Collectors.toSet());
+
+            Map<Integer, StudentSubjectDto> subjectDtoMap = subjectService.getSubjectByStudentId(collect);
+            courseStudents.forEach(studentAttendanceViewDto -> {
+                if (studentAttendanceViewDto.getSubjectIdList() == null) {
+                    StudentSubjectDto subjectDto = subjectDtoMap.getOrDefault(studentAttendanceViewDto.getUserId(), null);
+                    if (subjectDto.getSubjectId() != null) {
+                        studentAttendanceViewDto.setSubjectName(subjectDto.getSubjectName());
+                        studentAttendanceViewDto.setSubjectId(subjectDto.getSubjectId());
+                        studentAttendanceViewDto.setSubjectIdList(subjectDto.getSubjectId().toString());
+                    }
+                }
+            });
+        }
+        return succeed(courseStudents);
+    }
+
+    @ApiOperation(value = "提交陪练报告")
+    @PostMapping(value = "/addStudyReport")
+    public HttpResponseResult addStudyReport(@RequestBody CourseScheduleEvaluate courseScheduleEvaluate) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(sysUser)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        if(courseScheduleEvaluate.getClassGroupId()==null || courseScheduleEvaluate.getClassGroupId()<0){
+            return failed(HttpStatus.BAD_REQUEST,"班级id必须大于0");
+        }
+        if(courseScheduleEvaluate.getItem()==null || courseScheduleEvaluate.getItem().isEmpty()){
+            return failed(HttpStatus.BAD_REQUEST,"课程评价选项不能为空");
+        }
+        courseScheduleEvaluate.setTeacherId(sysUser.getId());
+        return succeed(courseScheduleEvaluateService.addStudyReport(courseScheduleEvaluate));
+    }
+
+    @ApiOperation(value = "根据群编号,获取用户群名片")
+    @GetMapping("/getUserInfoWithUserId")
+    public Object getUserInfoWithUserId(Integer groupId,Integer userId) {
+        if (groupId == null || userId == null) {
+            return failed("参数校验错误");
+        }
+        return succeed(classGroupService.getUserInfoWithUserId(groupId,userId));
+    }
+
+    @ApiOperation(value = "获取最新一条群公告")
+    @RequestMapping("/getNewNotice")
+    public Object getNewNotice(String groupId) {
+        return succeed(imGroupNoticeService.queryLatestNotice(groupId));
+    }
+
+    @ApiOperation(value = "获取群公告列表")
+    @RequestMapping("/queryNoticePage")
+    public Object queryPage(ImGroupNoticeQueryInfo queryInfo) {
+        return succeed(imGroupNoticeService.queryPage(queryInfo));
+    }
+
+}

+ 63 - 0
mec-application/src/main/java/com/ym/mec/teacher/controller/CloudStudyController.java

@@ -0,0 +1,63 @@
+package com.ym.mec.teacher.controller;
+
+import com.ym.mec.biz.dal.dto.CountStudentTrainDataDto;
+import com.ym.mec.biz.dal.dto.MusicCompareRankingDto;
+import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
+import com.ym.mec.biz.dal.page.SysMusicCompareRecordQueryInfo;
+import com.ym.mec.biz.service.SysMusicCompareRecordService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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 static com.ym.mec.biz.dal.enums.FeatureType.CLOUD_STUDY_EVALUATION;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/11 0011
+ */
+@Api("云教练")
+@RestController
+@RequestMapping("${app-config.url.teacher:}/cloudStudy")
+public class CloudStudyController extends BaseController {
+
+    @Autowired
+    private SysUserService sysUserService;
+    @Autowired
+    private SysMusicCompareRecordService sysMusicCompareRecordService;
+
+    @ApiOperation("查询乐团学员训练数据")
+    @GetMapping("queryMusicGroupStudentTrainData")
+    public HttpResponseResult<PageInfo<MusicCompareRankingDto>> queryMusicGroupStudentTrainData(SysMusicCompareRecordQueryInfo queryInfo){
+        return succeed(sysMusicCompareRecordService.queryMusicGroupStudentTrainData(queryInfo));
+    }
+
+    @ApiOperation("学员训练数据")
+    @GetMapping("queryStudentTrainData")
+    public HttpResponseResult<PageInfo<SysMusicCompareRecord>> queryStudentTrainData(SysMusicCompareRecordQueryInfo queryInfo){
+        return succeed(sysMusicCompareRecordService.queryStudentTrainData(queryInfo));
+    }
+
+    @ApiOperation("学员训练统计")
+    @GetMapping("countStudentTrain")
+    public HttpResponseResult<PageInfo<CountStudentTrainDataDto>> countStudentTrain(SysMusicCompareRecordQueryInfo queryInfo){
+        queryInfo.setTeacherId(sysUserService.getUserId());
+        return succeed(sysMusicCompareRecordService.countStudentTrain(queryInfo));
+    }
+
+    @ApiOperation("学员评测列表")
+    @GetMapping("queryMusicCompareRecord")
+    public HttpResponseResult<PageInfo<SysMusicCompareRecord>> queryMusicCompareRecord(SysMusicCompareRecordQueryInfo queryInfo){
+        if(queryInfo.getFeatureType() == null){
+            queryInfo.setFeatureType(CLOUD_STUDY_EVALUATION);
+        }
+        return succeed(sysMusicCompareRecordService.queryPage(queryInfo));
+    }
+
+}

+ 94 - 0
mec-application/src/main/java/com/ym/mec/teacher/controller/CourseGroupController.java

@@ -0,0 +1,94 @@
+package com.ym.mec.teacher.controller;
+
+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.CourseGroupCreateDto;
+import com.ym.mec.biz.dal.dto.ReturnFeeDto;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.page.GroupCourseScheduleQueryInfo;
+import com.ym.mec.biz.service.CoursesGroupService;
+import com.ym.mec.biz.service.GroupClassService;
+import com.ym.mec.biz.service.GroupCourseScheduleService;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/3/8
+ */
+@Api(tags = "对外课程组服务")
+@RequestMapping("${app-config.url.teacher:}/courseGroup")
+@RestController
+public class CourseGroupController extends BaseController {
+
+    @Autowired
+    private CoursesGroupService coursesGroupService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private GroupClassService groupClassService;
+    @Autowired
+    private TeacherDao teacherDao;
+    @Autowired
+    private GroupCourseScheduleService groupCourseScheduleService;
+
+    @ApiOperation(value = "创建课程组")
+    @PostMapping("/createCourseGroup")
+    public HttpResponseResult createCourseGroup(@RequestBody CourseGroupCreateDto courseGroupCreateInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(sysUser)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        Teacher teacher = teacherDao.get(sysUser.getId());
+        if(Objects.isNull(teacher)){
+            return failed("教师不存在");
+        }
+        courseGroupCreateInfo.getCoursesGroup().setOrganId(teacher.getOrganId());
+        courseGroupCreateInfo.getCoursesGroup().setTeacherId(sysUser.getId());
+        return coursesGroupService.createCourseGroup(courseGroupCreateInfo);
+    }
+
+    @ApiOperation(value = "获取课程组列表")
+    @GetMapping("/findTeacherCourseGroups")
+    public HttpResponseResult findTeacherCourseGroups(GroupCourseScheduleQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(sysUser)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        return succeed(coursesGroupService.findTeacherCourseGroups(sysUser.getId(),queryInfo));
+    }
+
+    @ApiOperation(value = "获取课程对应班级头部信息")
+    @GetMapping("/getGroupHeadInfo")
+    public HttpResponseResult getGroupHeadInfo(Long courseScheduleId){
+        return succeed(courseScheduleId);
+    }
+
+    @ApiOperation(value = "获取课程组下指定教师的课表")
+    @GetMapping("/findGroupCourses")
+    public HttpResponseResult findGroupCourses(GroupCourseScheduleQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(sysUser)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        queryInfo.setTeacherId(sysUser.getId());
+        return succeed(groupCourseScheduleService.findGroupCourses(queryInfo));
+    }
+
+    @ApiOperation(value = "关闭课程组")
+    @PostMapping("/cancelCourseGroup")
+    public HttpResponseResult cancelCourseGroup(ReturnFeeDto returnFeeDto){
+        returnFeeDto.setGroupType(GroupType.COMM);
+        return groupClassService.cancelGroup(returnFeeDto);
+    }
+
+}

+ 231 - 0
mec-application/src/main/java/com/ym/mec/teacher/controller/CourseHomeworkController.java

@@ -0,0 +1,231 @@
+package com.ym.mec.teacher.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.CourseHomeworkDao;
+import com.ym.mec.biz.dal.dto.CourseHomeworkStudentDetailDto;
+import com.ym.mec.biz.dal.dto.CourseHomeworkWrapper;
+import com.ym.mec.biz.dal.dto.StudentLessonTrainingDetailWrapper;
+import com.ym.mec.biz.dal.entity.CourseHomework;
+import com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply;
+import com.ym.mec.biz.dal.entity.StudentCourseHomework;
+import com.ym.mec.biz.dal.enums.ELessonTrainingType;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
+import com.ym.mec.biz.service.CourseHomeworkService;
+import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
+import com.ym.mec.biz.service.StudentCourseHomeworkService;
+import com.ym.mec.biz.service.StudentLessonTrainingDetailService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.yonge.log.model.AuditLogAnnotation;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/10/20
+ */
+@Api(tags = "作业服务")
+@RequestMapping("${app-config.url.teacher:}/courseHomework")
+@RestController
+public class CourseHomeworkController extends BaseController {
+
+    @Autowired
+    private CourseHomeworkService courseHomeworkService;
+    @Autowired
+    private StudentCourseHomeworkService studentCourseHomeworkService;
+    @Autowired
+    private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private StudentLessonTrainingDetailService studentLessonTrainingDetailService;
+
+    @Autowired
+    private CourseHomeworkDao courseHomeworkDao;
+
+    @ApiOperation(value = "布置课堂作业")
+    @GetMapping("/addCourseHomework")
+    @AuditLogAnnotation(operateName = "布置课堂作业")
+    public HttpResponseResult addCourseHomework(CourseHomework courseHomework){
+        courseHomeworkService.addCourseHomework(courseHomework);
+        return succeed();
+    }
+
+    @ApiOperation(value = "根据班级获取教师布置的作业")
+    @GetMapping("/findTeacherCourseHomeworkByClassGroup")
+    public Object findTeacherCourseHomeworkByClassGroup(CourseHomeworkQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(sysUser)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        queryInfo.setUserId(sysUser.getId().longValue());
+        return succeed(courseHomeworkService.findTeacherCourseHomeworkByClassGroup(queryInfo));
+    }
+
+    @ApiOperation(value = "根据课程计划获取需要交作业的学生")
+    @GetMapping("/findCourseStudents")
+    public Object findCourseStudents(Long courseScheduleId,String userName){
+        if (Objects.isNull(courseScheduleId)) {
+            throw new BizException("请指定课程");
+        }
+        return succeed(studentCourseHomeworkService.findStudentCourseHomeworkByCourse(courseScheduleId, null,userName));
+    }
+
+    @ApiOperation(value = "根据课程计划获取需要交作业的学生-公用")
+    @GetMapping("/findCourseStudentsPublic")
+    public Object findCourseStudentsPublic(Long courseScheduleId,String userName, boolean extra){
+        if(!extra){
+            if (Objects.isNull(courseScheduleId)) {
+                throw new BizException("请指定课程");
+            }
+            return succeed(studentCourseHomeworkService.findStudentCourseHomeworkByCourse(courseScheduleId, null,userName));
+        }else{
+            return succeed(extracurricularExercisesReplyService.findExtraExerciseStudents(courseScheduleId,userName));
+        }
+    }
+
+    @ApiOperation(value = "获取学生作业界面详细信息")
+    @GetMapping(value = "/findCourseHomeworkStudentDetail")
+    public Object findCourseHomeworkStudentDetail(Long courseScheduleID,Long userId){
+        StudentCourseHomework studentCourseHomework1 = studentCourseHomeworkService.get(courseScheduleID);
+        if(Objects.isNull(studentCourseHomework1)){
+            return failed("训练不存在");
+        }
+        CourseHomeworkStudentDetailDto courseHomeworkStudentDetail = studentCourseHomeworkService.findCourseHomeworkStudentDetail(studentCourseHomework1.getCourseScheduleId(), userId);
+        if(Objects.nonNull(courseHomeworkStudentDetail)){
+            StudentCourseHomework studentCourseHomework=new StudentCourseHomework();
+            studentCourseHomework.setId(studentCourseHomework1.getId());
+            studentCourseHomework.setIsView(YesOrNoEnum.YES);
+            studentCourseHomeworkService.update(studentCourseHomework);
+        }
+        return succeed(courseHomeworkStudentDetail);
+    }
+
+    @ApiOperation(value = "获取学生作业界面详细信息-公用")
+    @GetMapping(value = "/findCourseHomeworkStudentDetailPublic")
+    public Object findCourseHomeworkStudentDetailPublic(Long courseScheduleID,Long userId, boolean extra){
+        if(!extra){
+            StudentCourseHomework studentCourseHomework1 = studentCourseHomeworkService.get(courseScheduleID);
+            if(Objects.isNull(studentCourseHomework1)){
+                return failed("训练不存在");
+            }
+            CourseHomeworkStudentDetailDto courseHomeworkStudentDetail = studentCourseHomeworkService.findCourseHomeworkStudentDetail(studentCourseHomework1.getCourseScheduleId(), userId);
+            if(Objects.nonNull(courseHomeworkStudentDetail)&&Objects.nonNull(courseHomeworkStudentDetail.getAttachments())){
+                StudentCourseHomework studentCourseHomework=new StudentCourseHomework();
+                studentCourseHomework.setId(studentCourseHomework1.getId());
+                studentCourseHomework.setIsView(YesOrNoEnum.YES);
+                studentCourseHomeworkService.update(studentCourseHomework);
+            }
+            return succeed(courseHomeworkStudentDetail);
+        }else{
+            CourseHomeworkStudentDetailDto studentExtraExerciseDetail = extracurricularExercisesReplyService.findStudentExtraExerciseDetail(courseScheduleID);
+            if(Objects.isNull(studentExtraExerciseDetail)){
+                return failed("训练不存在");
+            }
+            if(Objects.nonNull(studentExtraExerciseDetail.getAttachments())&&studentExtraExerciseDetail.getStatus().equals(YesOrNoEnum.YES)){
+                ExtracurricularExercisesReply extracurricularExercisesReply=new ExtracurricularExercisesReply();
+                extracurricularExercisesReply.setId(studentExtraExerciseDetail.getCourseHomeworkId());
+                extracurricularExercisesReply.setIsView(1);
+                extracurricularExercisesReplyService.update(extracurricularExercisesReply);
+            }
+            return succeed(studentExtraExerciseDetail);
+        }
+    }
+
+
+
+    @ApiOperation(value = "获取作业详情")
+    @GetMapping(value = "/findCourseHomeworkDetail")
+    public HttpResponseResult<CourseHomeworkWrapper.CourseHomeworkList> findCourseHomeworkDetail(Integer courseScheduleId,ELessonTrainingType type){
+        if (ELessonTrainingType.HOMEWORK.equals(type)) {
+
+            return succeed(courseHomeworkService.findCourseHomeworkDetail(courseScheduleId));
+        } else {
+            return succeed(courseHomeworkService.findCourseExtraHomeworkDetail(courseScheduleId));
+        }
+    }
+
+
+
+
+    @ApiOperation(value = "根据课程计划获取需要交作业的学生-公用")
+    @PostMapping("/findCourseStudentsPublic/v2")
+    public HttpResponseResult<List<StudentCourseHomework>> findCourseStudentsPublicV2(@Validated @RequestBody StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query){
+        if(ELessonTrainingType.HOMEWORK.equals(query.getType())){
+            if (Objects.isNull(query.getCourseScheduleId())) {
+                throw new BizException("请指定课程");
+            }
+            return succeed(studentCourseHomeworkService.findStudentCourseHomeworkByCourseV2(query));
+        }else{
+            return succeed(studentCourseHomeworkService.findExtraExerciseStudentsV2(query));
+        }
+    }
+
+
+
+    @ApiOperation(value = "根据课程计划获取需要交作业的学生统计")
+    @PostMapping("/findCourseStudentsPublicSubject/v2")
+    public HttpResponseResult<CourseHomeworkWrapper.StudentHomeworkRecordStat> findCourseStudentsPublicSubjectV2(@Validated @RequestBody StudentLessonTrainingDetailWrapper.StudentLessonTrainingQuery query){
+        List<StudentCourseHomework> list;
+        if(ELessonTrainingType.HOMEWORK.equals(query.getType())){
+            if (Objects.isNull(query.getCourseScheduleId())) {
+                throw new BizException("请指定课程");
+            }
+            list =  (studentCourseHomeworkService.findStudentCourseHomeworkByCourseV2(query));
+        }else{
+            list =  (studentCourseHomeworkService.findExtraExerciseStudentsV2(query));
+        }
+
+        CourseHomeworkWrapper.StudentHomeworkRecordStat stat = new CourseHomeworkWrapper.StudentHomeworkRecordStat();
+        stat.setAllNum(list.size());
+        stat.setFinishNum((int) list.stream().filter(StudentCourseHomework::getFinishFlag).count());
+        stat.setUnFinishNum(stat.getAllNum()-stat.getFinishNum());
+        stat.setStudentCourseHomeworkList(list);
+        return succeed(stat);
+
+    }
+
+
+    @ApiOperation(value = "老师练习详情的练习组内作业信息")
+    @PostMapping("/findHomeworkGroupInfo")
+    public HttpResponseResult<List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> findHomeworkGroupInfo(@Validated @RequestBody StudentLessonTrainingDetailWrapper.HomeworkGroupInfoQuery query){
+
+        if (ELessonTrainingType.HOMEWORK.equals(query.getType())) {
+            CourseHomework courseHomework = courseHomeworkDao.findByCourseSchedule(query.getCourseScheduleId().longValue());
+            if(Objects.isNull(courseHomework)){
+                throw new BizException("作业不存在");
+            }
+            query.setCourseScheduleId(courseHomework.getId().intValue());
+        }
+        Map<Integer, List<StudentLessonTrainingDetailWrapper.StudentLessonTrainingDetail>> groupMap = studentLessonTrainingDetailService.getGroupMap(query.getCourseScheduleId().longValue(), query.getType());
+
+
+        return succeed(groupMap.get(query.getGroup()));
+
+    }
+
+    @ApiOperation(value = "查询单个学生的训练")
+    @GetMapping("/findCourseHomeworkStudentDetailPublic/v2")
+    public HttpResponseResult<StudentLessonTrainingDetailWrapper.StudentLessonTraining> findCourseHomeworkStudentDetailPublicV2(@RequestParam Long courseScheduleId, @RequestParam Long userId, @RequestParam ELessonTrainingType type){
+        if(ELessonTrainingType.HOMEWORK.equals(type)){
+
+            // 获取学生作业界面详细信息
+            return succeed(studentCourseHomeworkService.findCourseHomeworkStudentDetailPublicV2(courseScheduleId, userId,type));
+        }else{
+
+            return succeed(studentCourseHomeworkService.findExtracurricularExercisesDetailPublicV2(courseScheduleId, userId, type));
+        }
+    }
+}

+ 32 - 0
mec-application/src/main/java/com/ym/mec/teacher/controller/CourseHomeworkTemplateController.java

@@ -0,0 +1,32 @@
+package com.ym.mec.teacher.controller;
+
+import com.ym.mec.biz.dal.page.CourseHomeWorkTemplateQueryInfo;
+import com.ym.mec.biz.service.CourseHomeworkTemplateService;
+import com.ym.mec.common.controller.BaseController;
+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.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/9/18
+ */
+@RequestMapping("${app-config.url.teacher:}/courseHomeworkTemplate")
+@Api(tags = "作业模板")
+@RestController
+public class CourseHomeworkTemplateController extends BaseController {
+
+
+    @Autowired
+    private CourseHomeworkTemplateService courseHomeworkTemplateService;
+
+    @ApiOperation(value = "分页查询作业模板列表")
+    @PostMapping("/findByClassType")
+    public Object findByClassType(CourseHomeWorkTemplateQueryInfo queryInfo){
+        return succeed(courseHomeworkTemplateService.findByClassType(queryInfo));
+    }
+
+}

+ 122 - 0
mec-application/src/main/java/com/ym/mec/teacher/controller/CourseReviewController.java

@@ -0,0 +1,122 @@
+package com.ym.mec.teacher.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.CourseHomework;
+import com.ym.mec.biz.dal.entity.CourseScheduleReview;
+import com.ym.mec.biz.dal.page.CourseReviewQueryInfo;
+import com.ym.mec.biz.service.CourseReviewService;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Calendar;
+import java.util.List;
+import java.util.Objects;
+
+@RequestMapping("${app-config.url.teacher:}/courseReview")
+@Api(tags = "课程评价")
+@RestController
+public class CourseReviewController extends BaseController {
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private CourseReviewService courseReviewService;
+
+
+    @ApiOperation(value = "网管课评论列表")
+    @GetMapping("getPracticeGroup")
+    public HttpResponseResult getPracticeGroup(CourseReviewQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        queryInfo.setTeacherId(sysUser.getId());
+        return succeed(courseReviewService.findPracticeGroupReviews(queryInfo));
+    }
+
+
+    @ApiOperation(value = "提交评论")
+    @PostMapping(value = "/add")
+    public HttpResponseResult add(@RequestBody CourseScheduleReview courseScheduleReview) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(sysUser)) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        courseScheduleReview.setTeacherId(sysUser.getId());
+        return succeed(courseReviewService.addPracticeGroupReview(courseScheduleReview));
+    }
+
+    @ApiOperation(value = "网管课评论详情")
+    @GetMapping("getReviewInfo")
+    public HttpResponseResult getReviewInfo(int id) {
+        return succeed(courseReviewService.getReviewInfo(id));
+    }
+
+    @ApiOperation(value = "获取课程头部信息")
+    @GetMapping("getCourseInfoHead")
+    public HttpResponseResult getCourseInfoHead(int courseId) {
+        return succeed(courseReviewService.getCourseInfoHead(courseId));
+    }
+
+    @ApiOperation(value = "修改评论信息")
+    @PostMapping("updateReviewInfo")
+    public HttpResponseResult updateReviewInfo(CourseScheduleReview courseScheduleReview) {
+        return succeed(courseReviewService.updateReview(courseScheduleReview));
+    }
+
+    @ApiOperation(value = "获取班级结束课程评价情况")
+    @GetMapping("getClassOverCourse")
+    public HttpResponseResult getClassOverCourse(Long classGroupId) {
+        return succeed(courseReviewService.getClassOverCourse(classGroupId));
+    }
+
+    @ApiOperation(value = "获取老师评价和学生评价")
+    @GetMapping("getStuAndTeaReview")
+    public HttpResponseResult getStuAndTeaReview(Long courseId) {
+        return succeed(courseReviewService.getStuAndTeaReview(courseId));
+    }
+
+    @ApiOperation(value = "批量添加评价")
+    @PostMapping("batchAdd")
+    public HttpResponseResult batchAdd(@RequestBody List<CourseScheduleReview> courseScheduleReviews) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(sysUser)) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(courseReviewService.batchAdd(sysUser.getId(),courseScheduleReviews));
+    }
+
+    @ApiOperation(value = "线上课评论列表")
+    @GetMapping("getOnlineCourse")
+    public HttpResponseResult getOnlineCourse(CourseReviewQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        queryInfo.setTeacherId(sysUser.getId());
+        return succeed(courseReviewService.findOnlineCourseReviews(queryInfo));
+    }
+
+    @ApiOperation(value = "布置线上课作业")
+    @PostMapping(value = "/addHomeWork")
+    public HttpResponseResult addHomeWork(@RequestBody CourseHomework courseHomeworkInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(sysUser)) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        if(null == courseHomeworkInfo.getExpiryDate()){
+            Calendar instance = Calendar.getInstance();
+            instance.add(Calendar.WEEK_OF_MONTH,1);
+            courseHomeworkInfo.setExpiryDate(instance.getTime());
+        }
+        return succeed(courseReviewService.addHomeWork(courseHomeworkInfo));
+    }
+
+}

+ 129 - 0
mec-application/src/main/java/com/ym/mec/teacher/controller/CourseScheduleTeacherSalaryController.java

@@ -0,0 +1,129 @@
+package com.ym.mec.teacher.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import com.ym.mec.biz.dal.page.CourseSalaryQueryInfo4Web;
+import com.ym.mec.biz.dal.page.TeacherIncomeQueryInfo;
+import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
+import com.ym.mec.biz.service.TeacherCourseRewardService;
+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.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author Joburgess
+ * @Date 2020/4/15
+ */
+@RequestMapping("${app-config.url.teacher:}/courseScheduleTeacherSalary")
+@Api(tags = "课酬服务")
+@RestController
+public class CourseScheduleTeacherSalaryController extends BaseController {
+
+    @Autowired
+    private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private TeacherCourseRewardService teacherCourseRewardService;
+
+    @ApiOperation(value = "确定教师指定月份的课酬")
+    @PostMapping("confirmTeacherMonthSalary")
+    public HttpResponseResult confirmTeacherMonthSalary(String month){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        courseScheduleTeacherSalaryService.confirmTeacherMonthSalary(sysUser.getId(), month);
+        return succeed();
+    }
+
+    @ApiOperation(value = "获取老师指定月份课酬信息")
+    @GetMapping("findTeacherSettlementCourseSalarys")
+    public HttpResponseResult findTeacherSettlementCourseSalarys(CourseSalaryQueryInfo4Web queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        queryInfo.setTeacherId(sysUser.getId());
+        return succeed(courseScheduleTeacherSalaryService.findTeacherSettlementCourseSalarys(queryInfo));
+    }
+
+    @ApiOperation(value = "获取教师指定年份每月的课酬")
+    @GetMapping("findTeacherYearSalarys")
+    public HttpResponseResult findTeacherYearSalarys(String year){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        return succeed(courseScheduleTeacherSalaryService.findTeacherYearSalarys(sysUser.getId(), year));
+    }
+
+    @ApiOperation(value = "分页查询结转奖励")
+    @GetMapping("/findTeacherRewards")
+    public HttpResponseResult findTeacherRewards(CourseSalaryQueryInfo4Web queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        queryInfo.setTeacherId(sysUser.getId());
+        return succeed(teacherCourseRewardService.findTeacherRewards(queryInfo));
+    }
+
+    @ApiOperation(value = "获取教师收入总览")
+    @GetMapping("/getTeacherSalaryOverview")
+    public HttpResponseResult getTeacherSalaryOverview(TeacherIncomeQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        queryInfo.setTeacherId(sysUser.getId());
+        queryInfo.setCourseStatus(CourseStatusEnum.OVER);
+        return succeed(courseScheduleTeacherSalaryService.getTeacherSalaryOverview(queryInfo));
+    }
+
+    @ApiOperation(value = "查询教师课酬记录")
+    @GetMapping("/queryTeacherIncomeList")
+    public HttpResponseResult queryTeacherIncomeList(TeacherIncomeQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        queryInfo.setTeacherId(sysUser.getId());
+        queryInfo.setCourseStatus(CourseStatusEnum.OVER);
+        if(StringUtils.isBlank(queryInfo.getStartDay())){
+            queryInfo.setStartDay("2021-03-01");
+        }
+        return succeed(courseScheduleTeacherSalaryService.queryTeacherIncomeList(queryInfo));
+    }
+
+    @ApiOperation(value = "收入统计")
+    @GetMapping("/teacherIncomeStat")
+    public HttpResponseResult teacherIncomeStat(Integer year, Integer month){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        return succeed(courseScheduleTeacherSalaryService.teacherIncomeStat(sysUser.getId(), year, month));
+    }
+
+    @ApiOperation(value = "收入统计")
+    @GetMapping("/teacherIncomeStatNew")
+    public HttpResponseResult teacherIncomeStatNew(Integer year, Integer month){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        return succeed(courseScheduleTeacherSalaryService.teacherIncomeStatNew(sysUser.getId(), year, month));
+    }
+
+}

Some files were not shown because too many files changed in this diff