Procházet zdrojové kódy

增加多数据源配置,将各app数据库分离

marxjaw před 3 měsíci
rodič
revize
daffdb44bc
99 změnil soubory, kde provedl 7207 přidání a 47 odebrání
  1. 1 1
      yt-agent/agent-service/src/main/resources/mapper/AppUserMapper.xml
  2. 2 3
      yt-app/app-service/src/main/java/com/ytpm/AppApplication.java
  3. 46 0
      yt-app/app-service/src/main/java/com/ytpm/config/datasource/DataSourceConfig.java
  4. 41 0
      yt-app/app-service/src/main/java/com/ytpm/config/datasource/dyz/DyzConfig.java
  5. 41 0
      yt-app/app-service/src/main/java/com/ytpm/config/datasource/nofeeds/NoFeedsConfig.java
  6. 40 0
      yt-app/app-service/src/main/java/com/ytpm/config/datasource/qnjz/QnjzConfig.java
  7. 40 0
      yt-app/app-service/src/main/java/com/ytpm/config/datasource/qnmjz/QnmjzConfig.java
  8. 40 0
      yt-app/app-service/src/main/java/com/ytpm/config/datasource/xjlrl/XjlrlConfig.java
  9. 2 2
      yt-app/app-service/src/main/java/com/ytpm/controller/dyz/AdController.java
  10. 2 2
      yt-app/app-service/src/main/java/com/ytpm/controller/dyz/QuestionController.java
  11. 5 7
      yt-app/app-service/src/main/java/com/ytpm/controller/dyz/UserController.java
  12. 3 3
      yt-app/app-service/src/main/java/com/ytpm/controller/dyz/WxController.java
  13. 71 0
      yt-app/app-service/src/main/java/com/ytpm/controller/nofeeds/NfAdController.java
  14. 45 0
      yt-app/app-service/src/main/java/com/ytpm/controller/nofeeds/NfQuestionController.java
  15. 256 0
      yt-app/app-service/src/main/java/com/ytpm/controller/nofeeds/NfUserController.java
  16. 13 0
      yt-app/app-service/src/main/java/com/ytpm/controller/nofeeds/NfWxController.java
  17. 71 0
      yt-app/app-service/src/main/java/com/ytpm/controller/qnjz/QnAdController.java
  18. 42 0
      yt-app/app-service/src/main/java/com/ytpm/controller/qnjz/QnQuestionController.java
  19. 259 0
      yt-app/app-service/src/main/java/com/ytpm/controller/qnjz/QnUserController.java
  20. 158 0
      yt-app/app-service/src/main/java/com/ytpm/controller/qnjz/QnWxController.java
  21. 72 0
      yt-app/app-service/src/main/java/com/ytpm/controller/qnmjz/QnmAdController.java
  22. 43 0
      yt-app/app-service/src/main/java/com/ytpm/controller/qnmjz/QnmQuestionController.java
  23. 263 0
      yt-app/app-service/src/main/java/com/ytpm/controller/qnmjz/QnmUserController.java
  24. 160 0
      yt-app/app-service/src/main/java/com/ytpm/controller/qnmjz/QnmWxController.java
  25. 72 0
      yt-app/app-service/src/main/java/com/ytpm/controller/xjlrl/XjlrlAdController.java
  26. 42 0
      yt-app/app-service/src/main/java/com/ytpm/controller/xjlrl/XjlrlQuestionController.java
  27. 263 0
      yt-app/app-service/src/main/java/com/ytpm/controller/xjlrl/XjlrlUserController.java
  28. 160 0
      yt-app/app-service/src/main/java/com/ytpm/controller/xjlrl/XjlrlWxController.java
  29. 1 1
      yt-app/app-service/src/main/java/com/ytpm/dao/dyz/AdRecordMapper.java
  30. 1 1
      yt-app/app-service/src/main/java/com/ytpm/dao/dyz/AppUserMapper.java
  31. 1 1
      yt-app/app-service/src/main/java/com/ytpm/dao/dyz/LoginRecordMapper.java
  32. 1 2
      yt-app/app-service/src/main/java/com/ytpm/dao/dyz/QuestionMapper.java
  33. 24 0
      yt-app/app-service/src/main/java/com/ytpm/dao/nofeeds/NFAdRecordMapper.java
  34. 23 0
      yt-app/app-service/src/main/java/com/ytpm/dao/nofeeds/NFLoginRecordMapper.java
  35. 38 0
      yt-app/app-service/src/main/java/com/ytpm/dao/nofeeds/NFQuestionMapper.java
  36. 133 0
      yt-app/app-service/src/main/java/com/ytpm/dao/nofeeds/NFUserMapper.java
  37. 24 0
      yt-app/app-service/src/main/java/com/ytpm/dao/qnjz/QNAdRecordMapper.java
  38. 23 0
      yt-app/app-service/src/main/java/com/ytpm/dao/qnjz/QNLoginRecordMapper.java
  39. 38 0
      yt-app/app-service/src/main/java/com/ytpm/dao/qnjz/QNQuestionMapper.java
  40. 133 0
      yt-app/app-service/src/main/java/com/ytpm/dao/qnjz/QNUserMapper.java
  41. 24 0
      yt-app/app-service/src/main/java/com/ytpm/dao/qnmjz/QnmAdRecordMapper.java
  42. 23 0
      yt-app/app-service/src/main/java/com/ytpm/dao/qnmjz/QnmLoginRecordMapper.java
  43. 38 0
      yt-app/app-service/src/main/java/com/ytpm/dao/qnmjz/QnmQuestionMapper.java
  44. 133 0
      yt-app/app-service/src/main/java/com/ytpm/dao/qnmjz/QnmUserMapper.java
  45. 24 0
      yt-app/app-service/src/main/java/com/ytpm/dao/xjlrl/XjlrlAdRecordMapper.java
  46. 23 0
      yt-app/app-service/src/main/java/com/ytpm/dao/xjlrl/XjlrlLoginRecordMapper.java
  47. 38 0
      yt-app/app-service/src/main/java/com/ytpm/dao/xjlrl/XjlrlQuestionMapper.java
  48. 133 0
      yt-app/app-service/src/main/java/com/ytpm/dao/xjlrl/XjlrlUserMapper.java
  49. 1 1
      yt-app/app-service/src/main/java/com/ytpm/service/dyz/AdService.java
  50. 1 1
      yt-app/app-service/src/main/java/com/ytpm/service/dyz/AppUserService.java
  51. 1 1
      yt-app/app-service/src/main/java/com/ytpm/service/dyz/QuestionService.java
  52. 4 5
      yt-app/app-service/src/main/java/com/ytpm/service/dyz/impl/AdServiceImpl.java
  53. 5 5
      yt-app/app-service/src/main/java/com/ytpm/service/dyz/impl/AppUserServiceImpl.java
  54. 4 4
      yt-app/app-service/src/main/java/com/ytpm/service/dyz/impl/QuestionServiceImpl.java
  55. 30 0
      yt-app/app-service/src/main/java/com/ytpm/service/nofeeds/NfAdService.java
  56. 17 0
      yt-app/app-service/src/main/java/com/ytpm/service/nofeeds/NfQuestionService.java
  57. 18 0
      yt-app/app-service/src/main/java/com/ytpm/service/nofeeds/NfUserService.java
  58. 128 0
      yt-app/app-service/src/main/java/com/ytpm/service/nofeeds/impl/NfAdServiceImpl.java
  59. 69 0
      yt-app/app-service/src/main/java/com/ytpm/service/nofeeds/impl/NfQuestionServiceImpl.java
  60. 145 0
      yt-app/app-service/src/main/java/com/ytpm/service/nofeeds/impl/NfUserServiceImpl.java
  61. 30 0
      yt-app/app-service/src/main/java/com/ytpm/service/qnjz/QnAdService.java
  62. 17 0
      yt-app/app-service/src/main/java/com/ytpm/service/qnjz/QnQuestionService.java
  63. 18 0
      yt-app/app-service/src/main/java/com/ytpm/service/qnjz/QnUserService.java
  64. 128 0
      yt-app/app-service/src/main/java/com/ytpm/service/qnjz/impl/QnAdServiceImpl.java
  65. 70 0
      yt-app/app-service/src/main/java/com/ytpm/service/qnjz/impl/QnQuestionServiceImpl.java
  66. 145 0
      yt-app/app-service/src/main/java/com/ytpm/service/qnjz/impl/QnUserServiceImpl.java
  67. 30 0
      yt-app/app-service/src/main/java/com/ytpm/service/qnmjz/QnmAdService.java
  68. 17 0
      yt-app/app-service/src/main/java/com/ytpm/service/qnmjz/QnmQuestionService.java
  69. 18 0
      yt-app/app-service/src/main/java/com/ytpm/service/qnmjz/QnmUserService.java
  70. 128 0
      yt-app/app-service/src/main/java/com/ytpm/service/qnmjz/impl/QnmAdServiceImpl.java
  71. 73 0
      yt-app/app-service/src/main/java/com/ytpm/service/qnmjz/impl/QnmQuestionServiceImpl.java
  72. 149 0
      yt-app/app-service/src/main/java/com/ytpm/service/qnmjz/impl/QnmUserServiceImpl.java
  73. 30 0
      yt-app/app-service/src/main/java/com/ytpm/service/xjlrl/XjlrlAdService.java
  74. 17 0
      yt-app/app-service/src/main/java/com/ytpm/service/xjlrl/XjlrlQuestionService.java
  75. 18 0
      yt-app/app-service/src/main/java/com/ytpm/service/xjlrl/XjlrlUserService.java
  76. 128 0
      yt-app/app-service/src/main/java/com/ytpm/service/xjlrl/impl/XjlrlAdServiceImpl.java
  77. 70 0
      yt-app/app-service/src/main/java/com/ytpm/service/xjlrl/impl/XjlrlQuestionServiceImpl.java
  78. 145 0
      yt-app/app-service/src/main/java/com/ytpm/service/xjlrl/impl/XjlrlUserServiceImpl.java
  79. 1 1
      yt-app/app-service/src/main/resources/mapper/dyz/AdRecordMapper.xml
  80. 4 4
      yt-app/app-service/src/main/resources/mapper/dyz/AppUserMapper.xml
  81. 1 1
      yt-app/app-service/src/main/resources/mapper/dyz/LoginRecordMapper.xml
  82. 1 1
      yt-app/app-service/src/main/resources/mapper/dyz/QuestionMapper.xml
  83. 64 0
      yt-app/app-service/src/main/resources/mapper/nofeeds/NFAdRecordMapper.xml
  84. 64 0
      yt-app/app-service/src/main/resources/mapper/nofeeds/NFLoginRecordMapper.xml
  85. 59 0
      yt-app/app-service/src/main/resources/mapper/nofeeds/NFQuestionMapper.xml
  86. 416 0
      yt-app/app-service/src/main/resources/mapper/nofeeds/NFUserMapper.xml
  87. 64 0
      yt-app/app-service/src/main/resources/mapper/qnjz/QNAdRecordMapper.xml
  88. 64 0
      yt-app/app-service/src/main/resources/mapper/qnjz/QNLoginRecordMapper.xml
  89. 59 0
      yt-app/app-service/src/main/resources/mapper/qnjz/QNQuestionMapper.xml
  90. 416 0
      yt-app/app-service/src/main/resources/mapper/qnjz/QNUserMapper.xml
  91. 64 0
      yt-app/app-service/src/main/resources/mapper/qnmjz/QnmAdRecordMapper.xml
  92. 64 0
      yt-app/app-service/src/main/resources/mapper/qnmjz/QnmLoginRecordMapper.xml
  93. 59 0
      yt-app/app-service/src/main/resources/mapper/qnmjz/QnmQuestionMapper.xml
  94. 416 0
      yt-app/app-service/src/main/resources/mapper/qnmjz/QnmUserMapper.xml
  95. 64 0
      yt-app/app-service/src/main/resources/mapper/xjlrl/XjlrlAdRecordMapper.xml
  96. 64 0
      yt-app/app-service/src/main/resources/mapper/xjlrl/XjlrlLoginRecordMapper.xml
  97. 59 0
      yt-app/app-service/src/main/resources/mapper/xjlrl/XjlrlQuestionMapper.xml
  98. 416 0
      yt-app/app-service/src/main/resources/mapper/xjlrl/XjlrlUserMapper.xml
  99. 5 0
      yt-common/src/main/java/com/ytpm/app/view/WxDefaultConfig.java

+ 1 - 1
yt-agent/agent-service/src/main/resources/mapper/AppUserMapper.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.ytpm.dao.AppUserMapper">
+<mapper namespace="com.ytpm.dao.dyz.AppUserMapper">
     <select id="selectAppUserList" resultType="com.ytpm.app.view.YtAppUserListView">
         select
             au.user_id,

+ 2 - 3
yt-app/app-service/src/main/java/com/ytpm/AppApplication.java

@@ -1,16 +1,15 @@
 package com.ytpm;
 
-import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.web.bind.annotation.RestController;
 
 @RestController
-@SpringBootApplication
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
 @EnableDiscoveryClient
-@MapperScan(basePackages = "com.ytpm.dao")
 @EnableFeignClients(basePackages = {"com.ytpm.feign"})
 public class AppApplication
 {

+ 46 - 0
yt-app/app-service/src/main/java/com/ytpm/config/datasource/DataSourceConfig.java

@@ -0,0 +1,46 @@
+package com.ytpm.config.datasource;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.sql.DataSource;
+
+/**
+ * 多数据源配置
+ * @Marx
+ */
+@Configuration
+public class DataSourceConfig {
+
+    @Bean(name = "yt_dyz")
+    @ConfigurationProperties(prefix = "spring.datasource.dyz")
+    public DataSource dyzDataSource() {
+        return DataSourceBuilder.create().build();
+    }
+
+    @Bean(name = "yt_qnjz")
+    @ConfigurationProperties(prefix = "spring.datasource.qnjz")
+    public DataSource qnjzDataSource() {
+        return DataSourceBuilder.create().build();
+    }
+
+    @Bean(name = "yt_nofeeds")
+    @ConfigurationProperties(prefix = "spring.datasource.nofeeds")
+    public DataSource nofeedsDataSource() {
+        return DataSourceBuilder.create().build();
+    }
+
+    @Bean(name = "yt_qnmjz")
+    @ConfigurationProperties(prefix = "spring.datasource.qnmjz")
+    public DataSource qnmjzDataSource() {
+        return DataSourceBuilder.create().build();
+    }
+
+    @Bean(name = "yt_xjlrl")
+    @ConfigurationProperties(prefix = "spring.datasource.xjlrl")
+    public DataSource xjlrlDataSource() {
+        return DataSourceBuilder.create().build();
+    }
+}

+ 41 - 0
yt-app/app-service/src/main/java/com/ytpm/config/datasource/dyz/DyzConfig.java

@@ -0,0 +1,41 @@
+package com.ytpm.config.datasource.dyz;
+
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+
+import javax.sql.DataSource;
+
+@Configuration
+@MapperScan(basePackages = {"com.ytpm.dao.dyz"}, sqlSessionFactoryRef = "sqlSessionFactoryDyz")
+public class DyzConfig {
+
+    @Autowired
+    @Qualifier("yt_dyz")
+    private DataSource dataSourceDyz;
+
+    /**
+     * 自定义Sql会话,启动类配置不生效,子类分别配置mapperLocation和驼峰映射
+     */
+    @Bean
+    public SqlSessionFactory sqlSessionFactoryDyz() throws Exception {
+        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
+        factoryBean.setDataSource(dataSourceDyz);
+        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/dyz/*.xml"));
+        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
+        configuration.setMapUnderscoreToCamelCase(true);
+        factoryBean.setConfiguration(configuration);
+        return factoryBean.getObject();
+    }
+
+    @Bean
+    public SqlSessionTemplate sqlSessionTemplateDyz() throws Exception {
+        return new SqlSessionTemplate(sqlSessionFactoryDyz());
+    }
+}

+ 41 - 0
yt-app/app-service/src/main/java/com/ytpm/config/datasource/nofeeds/NoFeedsConfig.java

@@ -0,0 +1,41 @@
+package com.ytpm.config.datasource.nofeeds;
+
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+
+import javax.sql.DataSource;
+
+@Configuration
+@MapperScan(basePackages = {"com.ytpm.dao.nofeeds"}, sqlSessionFactoryRef = "sqlSessionFactoryNoFeeds")
+public class NoFeedsConfig {
+
+    @Autowired
+    @Qualifier("yt_nofeeds")
+    private DataSource dataSourceNofeeds;
+
+    /**
+     * 自定义Sql会话,启动类配置不生效,子类分别配置mapperLocation和驼峰映射
+     */
+    @Bean
+    public SqlSessionFactory sqlSessionFactoryNoFeeds() throws Exception {
+        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
+        factoryBean.setDataSource(dataSourceNofeeds);
+        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/nofeeds/*.xml"));
+        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
+        configuration.setMapUnderscoreToCamelCase(true);
+        factoryBean.setConfiguration(configuration);
+        return factoryBean.getObject();
+    }
+
+    @Bean
+    public SqlSessionTemplate sqlSessionTemplateFeeds() throws Exception {
+        return new SqlSessionTemplate(sqlSessionFactoryNoFeeds());
+    }
+}

+ 40 - 0
yt-app/app-service/src/main/java/com/ytpm/config/datasource/qnjz/QnjzConfig.java

@@ -0,0 +1,40 @@
+package com.ytpm.config.datasource.qnjz;
+
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+
+import javax.sql.DataSource;
+
+@Configuration
+@MapperScan(basePackages = {"com.ytpm.dao.qnjz"}, sqlSessionFactoryRef = "sqlSessionFactoryQnjz")
+public class QnjzConfig {
+    @Autowired
+    @Qualifier("yt_qnjz")
+    private DataSource dataSourceQnjz;
+
+    /**
+     * 自定义Sql会话,启动类配置不生效,子类分别配置mapperLocation和驼峰映射
+     */
+    @Bean
+    public SqlSessionFactory sqlSessionFactoryQnjz() throws Exception {
+        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
+        factoryBean.setDataSource(dataSourceQnjz);
+        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/qnjz/*.xml"));
+        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
+        configuration.setMapUnderscoreToCamelCase(true);
+        factoryBean.setConfiguration(configuration);
+        return factoryBean.getObject();
+    }
+
+    @Bean
+    public SqlSessionTemplate sqlSessionTemplateQnjz() throws Exception {
+        return new SqlSessionTemplate(sqlSessionFactoryQnjz());
+    }
+}

+ 40 - 0
yt-app/app-service/src/main/java/com/ytpm/config/datasource/qnmjz/QnmjzConfig.java

@@ -0,0 +1,40 @@
+package com.ytpm.config.datasource.qnmjz;
+
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+
+import javax.sql.DataSource;
+
+@Configuration
+@MapperScan(basePackages = {"com.ytpm.dao.qnmjz"}, sqlSessionFactoryRef = "sqlSessionFactoryQnmjz")
+public class QnmjzConfig {
+    @Autowired
+    @Qualifier("yt_qnmjz")
+    private DataSource dataSourceQnmjz;
+
+    /**
+     * 自定义Sql会话,启动类配置不生效,子类分别配置mapperLocation和驼峰映射
+     */
+    @Bean
+    public SqlSessionFactory sqlSessionFactoryQnmjz() throws Exception {
+        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
+        factoryBean.setDataSource(dataSourceQnmjz);
+        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/qnmjz/*.xml"));
+        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
+        configuration.setMapUnderscoreToCamelCase(true);
+        factoryBean.setConfiguration(configuration);
+        return factoryBean.getObject();
+    }
+
+    @Bean
+    public SqlSessionTemplate sqlSessionTemplateQnmjz() throws Exception {
+        return new SqlSessionTemplate(sqlSessionFactoryQnmjz());
+    }
+}

+ 40 - 0
yt-app/app-service/src/main/java/com/ytpm/config/datasource/xjlrl/XjlrlConfig.java

@@ -0,0 +1,40 @@
+package com.ytpm.config.datasource.xjlrl;
+
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+
+import javax.sql.DataSource;
+
+@Configuration
+@MapperScan(basePackages = {"com.ytpm.dao.xjlrl"}, sqlSessionFactoryRef = "sqlSessionFactoryXjlrl")
+public class XjlrlConfig {
+    @Autowired
+    @Qualifier("yt_xjlrl")
+    private DataSource dataSourceXjlrl;
+
+    /**
+     * 自定义Sql会话,启动类配置不生效,子类分别配置mapperLocation和驼峰映射
+     */
+    @Bean
+    public SqlSessionFactory sqlSessionFactoryXjlrl() throws Exception {
+        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
+        factoryBean.setDataSource(dataSourceXjlrl);
+        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/xjlrl/*.xml"));
+        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
+        configuration.setMapUnderscoreToCamelCase(true);
+        factoryBean.setConfiguration(configuration);
+        return factoryBean.getObject();
+    }
+
+    @Bean
+    public SqlSessionTemplate sqlSessionTemplateXjlrl() throws Exception {
+        return new SqlSessionTemplate(sqlSessionFactoryXjlrl());
+    }
+}

+ 2 - 2
yt-app/app-service/src/main/java/com/ytpm/controller/AdController.java → yt-app/app-service/src/main/java/com/ytpm/controller/dyz/AdController.java

@@ -1,10 +1,10 @@
-package com.ytpm.controller;
+package com.ytpm.controller.dyz;
 
 import com.ytpm.app.param.DyzAdRecordParam;
 import com.ytpm.general.Result;
 import com.ytpm.middle.view.DashboardRankingListVO;
 import com.ytpm.middle.view.DashboardRevenueVO;
-import com.ytpm.service.AdService;
+import com.ytpm.service.dyz.AdService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;

+ 2 - 2
yt-app/app-service/src/main/java/com/ytpm/controller/QuestionController.java → yt-app/app-service/src/main/java/com/ytpm/controller/dyz/QuestionController.java

@@ -1,10 +1,10 @@
-package com.ytpm.controller;
+package com.ytpm.controller.dyz;
 
 import com.ytpm.app.param.AnswerRecordParam;
 import com.ytpm.app.view.QuestionListView;
 import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
-import com.ytpm.service.QuestionService;
+import com.ytpm.service.dyz.QuestionService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;

+ 5 - 7
yt-app/app-service/src/main/java/com/ytpm/controller/UserController.java → yt-app/app-service/src/main/java/com/ytpm/controller/dyz/UserController.java

@@ -1,4 +1,4 @@
-package com.ytpm.controller;
+package com.ytpm.controller.dyz;
 
 import cn.hutool.core.date.DateUtil;
 import com.github.pagehelper.PageHelper;
@@ -13,10 +13,10 @@ import com.ytpm.app.param.AppUserTodayBannedParam;
 import com.ytpm.app.param.YtAppUserListParam;
 import com.ytpm.app.view.HourCountView;
 import com.ytpm.app.view.YtAppUserListView;
-import com.ytpm.dao.AdRecordMapper;
-import com.ytpm.dao.AppUserMapper;
-import com.ytpm.dao.LoginRecordMapper;
-import com.ytpm.dao.QuestionMapper;
+import com.ytpm.dao.dyz.AdRecordMapper;
+import com.ytpm.dao.dyz.AppUserMapper;
+import com.ytpm.dao.dyz.LoginRecordMapper;
+import com.ytpm.dao.dyz.QuestionMapper;
 import com.ytpm.general.RepMessage;
 import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
@@ -29,12 +29,10 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.math.BigDecimal;
-import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
-import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;

+ 3 - 3
yt-app/app-service/src/main/java/com/ytpm/controller/WxController.java → yt-app/app-service/src/main/java/com/ytpm/controller/dyz/WxController.java

@@ -1,4 +1,4 @@
-package com.ytpm.controller;
+package com.ytpm.controller.dyz;
 
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
@@ -10,14 +10,14 @@ import com.ytpm.app.param.WxLoginParam;
 import com.ytpm.app.view.WxDefaultConfig;
 import com.ytpm.app.view.WxLoginResult;
 import com.ytpm.app.view.WxUserInfo;
-import com.ytpm.dao.AppUserMapper;
+import com.ytpm.dao.dyz.AppUserMapper;
 import com.ytpm.feign.RiskFeign;
 import com.ytpm.general.RepMessage;
 import com.ytpm.general.Result;
 import com.ytpm.handle.CustomerException;
 import com.ytpm.app.model.YtDyzPowerRecord;
 import com.ytpm.app.model.YtDyzUser;
-import com.ytpm.service.AppUserService;
+import com.ytpm.service.dyz.AppUserService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;

+ 71 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/nofeeds/NfAdController.java

@@ -0,0 +1,71 @@
+package com.ytpm.controller.nofeeds;
+
+import com.ytpm.app.param.DyzAdRecordParam;
+import com.ytpm.general.Result;
+import com.ytpm.middle.view.DashboardRankingListVO;
+import com.ytpm.middle.view.DashboardRevenueVO;
+import com.ytpm.service.nofeeds.NfAdService;
+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.GetMapping;
+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 javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Map;
+
+@Api(tags = "用户浏览广告记录")
+@RestController
+@RequestMapping("/nf/ad")
+public class NfAdController {
+
+    @Resource
+    private NfAdService adService;
+
+    /**
+     * 保存广告记录
+     */
+    @ApiOperation("保存")
+    @PostMapping("/saveRecord")
+    public Result<?> saveRecord(@RequestBody DyzAdRecordParam param){
+        return adService.saveRecord(param);
+    }
+
+    /**
+     * 根据应用ID查询广告数
+     */
+    @ApiOperation("根据应用ID查询广告数")
+    @GetMapping("/getAdCount")
+    public Map<String, BigDecimal> getAdCount(@RequestParam(name = "appIds")String appIds){
+        return adService.getAdCount(appIds);
+    }
+
+    /**
+     * 查询应用排行榜信息
+     */
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "sortBy", value = "排行榜排序规则",required = true),
+            @ApiImplicitParam(name = "limit", value = "排行榜显示数量",required = true),
+    })
+    @ApiOperation("查询应用排行榜信息")
+    @GetMapping("/getAppRankingList")
+    public DashboardRankingListVO queryRankingList(@RequestParam(name = "sortBy")Integer sortBy, @RequestParam(name = "limit")Integer limit){
+        return adService.queryRankingList(sortBy,limit);
+    }
+
+    /**
+     * 查询各渠道应用收益分时统计
+     */
+    @ApiImplicitParam(name = "apkIds", value = "渠道应用ID(,拼接)",required = true)
+    @ApiOperation("查询各渠道应用收益分时统计")
+    @GetMapping("/revenueStatics")
+    public DashboardRevenueVO revenueStatics(@RequestParam(name = "apkIds")String apkIds){
+        return adService.revenueStatics(apkIds);
+    }
+}

+ 45 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/nofeeds/NfQuestionController.java

@@ -0,0 +1,45 @@
+package com.ytpm.controller.nofeeds;
+
+
+import com.ytpm.app.param.AnswerRecordParam;
+import com.ytpm.app.view.QuestionListView;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import com.ytpm.service.nofeeds.NfQuestionService;
+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.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@Api(tags = "题目管理模块")
+@RestController
+@RequestMapping("/nf/question")
+public class NfQuestionController {
+
+    @Resource
+    private NfQuestionService questionService;
+
+    /**
+     * 获取题库
+     */
+    @ApiOperation("获取题库")
+    @GetMapping("/list")
+    public ResultTable<QuestionListView> questionList(){
+        return questionService.questionList();
+    }
+
+    /**
+     * 回答问题
+     */
+    @ApiOperation("回答问题")
+    @PostMapping("/answerQuestion")
+    public Result<String> answerQuestion(@RequestBody AnswerRecordParam param){
+        return questionService.answerQuestion(param);
+    }
+}

+ 256 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/nofeeds/NfUserController.java

@@ -0,0 +1,256 @@
+package com.ytpm.controller.nofeeds;
+
+import cn.hutool.core.date.DateUtil;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.ytpm.advertise.enums.AdSourceTypeEnum;
+import com.ytpm.app.model.YtDyzAdRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.AppQueryUserTodayTimeParam;
+import com.ytpm.app.param.AppUserParam;
+import com.ytpm.app.param.AppUserQueryParam;
+import com.ytpm.app.param.AppUserTodayBannedParam;
+import com.ytpm.app.param.YtAppUserListParam;
+import com.ytpm.app.view.HourCountView;
+import com.ytpm.app.view.YtAppUserListView;
+import com.ytpm.dao.nofeeds.NFAdRecordMapper;
+import com.ytpm.dao.nofeeds.NFLoginRecordMapper;
+import com.ytpm.dao.nofeeds.NFQuestionMapper;
+import com.ytpm.dao.nofeeds.NFUserMapper;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import org.springframework.web.bind.annotation.GetMapping;
+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 javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/nf/user")
+public class NfUserController {
+    @Resource
+    private NFUserMapper nfUserMapper;
+    @Resource
+    private NFLoginRecordMapper nfLoginRecordMapper;
+    @Resource
+    private NFAdRecordMapper nfadRecordMapper;
+    @Resource
+    private NFQuestionMapper nfQuestionMapper;
+
+    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    /**
+     * 查询app 所有玩家
+     */
+    @PostMapping("/queryAll")
+    public ResultTable<YtAppUserListView> queryAll(@RequestBody YtAppUserListParam param) {
+        PageHelper.startPage(param.getPage(), param.getLimit());
+        List<YtAppUserListView> dyzUsers = nfUserMapper.queryAll(param);
+        if (dyzUsers.isEmpty()) return ResultTable.resultTableOk(new PageInfo<YtAppUserListView>(dyzUsers));
+        List<YtDyzAdRecord> adRecords = nfadRecordMapper.getByUserIds(
+                dyzUsers.stream().map(YtAppUserListView::getUserId).collect(Collectors.joining(",")));
+        Map<String, List<YtDyzAdRecord>> userAdMap = adRecords.stream().collect(
+                Collectors.groupingBy(YtDyzAdRecord::getUserId));
+        setUserExtInfo(dyzUsers,userAdMap);
+        return ResultTable.resultTableOk(new PageInfo<YtAppUserListView>(dyzUsers));
+    }
+
+    /**
+     * 设置用户扩展信息
+     */
+    private void setUserExtInfo(List<YtAppUserListView> dyzUsers, Map<String, List<YtDyzAdRecord>> userAdMap) {
+        for (YtAppUserListView user : dyzUsers) {
+            user.setLoginRecordList(nfLoginRecordMapper.getLoginRecords(user.getUserId()));
+            //获取今日收益 | 今日视频播放数
+            if (userAdMap.containsKey(user.getUserId())) {
+                List<YtDyzAdRecord> ytDyzAdRecords = userAdMap.get(user.getUserId());
+                List<YtDyzAdRecord> collect = ytDyzAdRecords.stream().filter(
+                        s -> DateUtil.isSameDay(DateUtil.date(),DateUtil.parseDate(s.getFinishTime()))).collect(Collectors.toList());
+                BigDecimal todayIncome = collect.stream().map(YtDyzAdRecord::getRevenue).reduce(BigDecimal.ZERO, BigDecimal::add);
+                user.setTodayVideo((int) collect.stream().filter(
+                        s->s.getAdSourceType()== AdSourceTypeEnum.rewarded_video.getAdSourceType()).count());
+                user.setTodayIncome(todayIncome);
+            } else {
+                user.setTodayIncome(BigDecimal.ZERO);
+                user.setTodayVideo(0);
+            }
+        }
+    }
+    /**
+     * 计算广告记录列表中今日的收益
+     *
+     * @param records 广告记录列表
+     * @return 今日收益总额(BigDecimal)
+     */
+    public static BigDecimal calculateTodayIncome(List<YtDyzAdRecord> records) {
+        // 空列表快速返回
+        if (records == null || records.isEmpty()) {
+            return BigDecimal.ZERO;
+        }
+
+        // 获取今天的日期范围
+        LocalDate today = LocalDate.now();
+        LocalDateTime startOfDay = today.atStartOfDay();
+        LocalDateTime endOfDay = today.plusDays(1).atStartOfDay();
+
+        // 预计算今天的日期字符串前缀(优化性能)
+        String todayPrefix = today.format(DateTimeFormatter.ISO_DATE) + " ";
+
+        return calculateTodayIncome(records, startOfDay, endOfDay, todayPrefix);
+    }
+
+    /**
+     * 计算广告记录列表中今日的收益(带日期范围参数,适用于批量处理)
+     *
+     * @param records     广告记录列表
+     * @param startOfDay  今日开始时间
+     * @param endOfDay    今日结束时间
+     * @param todayPrefix 今日日期前缀(格式:"yyyy-MM-dd ")
+     * @return 今日收益总额(BigDecimal)
+     */
+    public static BigDecimal calculateTodayIncome(
+            List<YtDyzAdRecord> records,
+            LocalDateTime startOfDay,
+            LocalDateTime endOfDay,
+            String todayPrefix) {
+
+        // 空列表快速返回
+        if (records == null || records.isEmpty()) {
+            return BigDecimal.ZERO;
+        }
+
+        BigDecimal totalToday = BigDecimal.ZERO;
+
+        for (YtDyzAdRecord record : records) {
+            String dateStr = record.getFinishTime();
+
+            // 1. 日期字符串是否存在且以今日日期开头
+            if (dateStr == null || !dateStr.startsWith(todayPrefix)) {
+                continue;
+            }
+            try {
+                // 2. 解析日期时间
+                LocalDateTime recordTime = LocalDateTime.parse(dateStr, DATE_TIME_FORMATTER);
+
+                // 3. 检查是否在今日范围内
+                if (recordTime.isBefore(startOfDay) || recordTime.isAfter(endOfDay.minusNanos(1))) {
+                    continue;
+                }
+                // 4. 累加
+                BigDecimal revenue = record.getRevenue();
+                if (revenue != null) {
+                    totalToday = totalToday.add(revenue);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return totalToday;
+    }
+
+
+
+    /**
+     * 主键查询用户信息
+     */
+    @GetMapping("/getUserInfo")
+    public Result<YtDyzUser> getUserInfo(@RequestParam("userId") String userId) {
+        YtDyzUser user = nfUserMapper.selectPrimaryKey(userId);
+        user.setLoginRecordList(nfLoginRecordMapper.getLoginRecords(userId));
+        user.setTodayAnswerCount(nfQuestionMapper.getAnswerCount(userId,1));
+        user.setHistoryAnswerCount(nfQuestionMapper.getAnswerCount(userId,2));
+        user.setAnswerRecordList(nfQuestionMapper.getAnswerRecords(userId));
+        return Result.resultObjOk(user);
+    }
+
+    /**
+     * 查询用户信息
+     */
+    @PostMapping("/getUserList")
+    public ResultTable<YtDyzUser> getUserList(@RequestBody AppUserParam param) {
+        List<YtDyzUser> userList = nfUserMapper.getUserList(param.getUserIds());
+        for (YtDyzUser user : userList) {
+            user.setLoginRecordList(nfLoginRecordMapper.getLoginRecords(user.getUserId()));
+        }
+        return ResultTable.resultTableOk(new PageInfo<>(userList));
+    }
+
+    @PostMapping("/getUserAll")
+    public ResultTable<YtDyzUser> getUserAll(@RequestBody AppUserParam param) {
+        List<YtDyzUser> userList = nfUserMapper.getUserList(param.getUserIds());
+        return ResultTable.resultTableOk(new PageInfo<>(userList));
+    }
+
+    /**
+     * 修改用户信息
+     */
+    @PostMapping("/updateUserInfo")
+    public Result<?> updateUserInfo(@RequestBody YtDyzUser dyzUser) {
+        nfUserMapper.updateUser(dyzUser);
+        return Result.resultOk(RepMessage.MODIFY_SUCCESS);
+    }
+
+    /**
+     * 查询用户的广告记录
+     */
+    @GetMapping("/adRecords")
+    public ResultTable<YtDyzAdRecord> adRecords(@RequestParam(name = "userId",required = true) String userId,@RequestParam(name = "adsourceType",required = false)Integer adsourceType) {
+        return ResultTable.resultTableOk(new PageInfo<YtDyzAdRecord>(nfadRecordMapper.getByUserId(userId,adsourceType)));
+    }
+
+    @PostMapping("/queryUserByTime")
+    public List<YtDyzUser> queryUserByTime(@RequestBody AppUserQueryParam appUserQueryParam) {
+        List<YtDyzUser> ytDyzUsers = nfUserMapper.queryAllByTime(appUserQueryParam.getStartTime(), appUserQueryParam.getEndTime(),appUserQueryParam.getAppIdList());
+        return ytDyzUsers;
+    }
+
+    @PostMapping("/queryUserByTodayTime")
+    public int[] queryUserByTodayTime(@RequestBody AppQueryUserTodayTimeParam appQueryUserTodayTimeParam) {
+        // 获取当前日期
+        LocalDate localDate = LocalDate.now();
+
+        // 构建当天起始时间段
+        LocalDateTime startOfDay = localDate.atStartOfDay();
+        LocalDateTime endOfDay = startOfDay.plusDays(1).minusSeconds(1);
+
+        Date startTime = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
+        Date endTime = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
+        // 查询用户注册数据
+        List<HourCountView> hourCountViews = nfUserMapper.countUsersByHour(startTime, endTime,appQueryUserTodayTimeParam.getAppIdList());
+        // 初始化每小时用户数量数组
+        int[] hourlyCounts = new int[24];
+        for (HourCountView hc : hourCountViews) {
+            if (hc.getHour() >= 0 && hc.getHour() < 24) {
+                hourlyCounts[hc.getHour()] = hc.getCount();
+            }
+        }
+        return hourlyCounts;
+    }
+
+    @PostMapping("/queryLoginRecords")
+    public List<String> queryLoginRecords(@RequestBody AppUserQueryParam appUserQueryParam) {
+        return nfLoginRecordMapper.queryLoginCount(appUserQueryParam);
+    }
+
+    @GetMapping("/queryByOpenid")
+    public List<YtDyzUser> queryByOpenid(@RequestParam("openid") String openid){
+        return nfUserMapper.queryByOpenid(openid);
+    }
+    @PostMapping("/queryTodayBanned")
+    public List<YtDyzUser> queryTodayBanned(@RequestBody AppUserTodayBannedParam appUserTodayBannedParam){
+        return nfUserMapper.queryTodayBanned(appUserTodayBannedParam.getStartTime(), appUserTodayBannedParam.getEndTime(), appUserTodayBannedParam.getUserIdList());
+    }
+}

+ 13 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/nofeeds/NfWxController.java

@@ -0,0 +1,13 @@
+package com.ytpm.controller.nofeeds;
+
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Slf4j
+@Api(tags = "微信开放能力模块")
+@RestController
+@RequestMapping("/nf/wx")
+public class NfWxController {
+}

+ 71 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/qnjz/QnAdController.java

@@ -0,0 +1,71 @@
+package com.ytpm.controller.qnjz;
+
+import com.ytpm.app.param.DyzAdRecordParam;
+import com.ytpm.general.Result;
+import com.ytpm.middle.view.DashboardRankingListVO;
+import com.ytpm.middle.view.DashboardRevenueVO;
+import com.ytpm.service.qnjz.QnAdService;
+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.GetMapping;
+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 javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Map;
+
+@Api(tags = "用户浏览广告记录")
+@RestController
+@RequestMapping("/qn/ad")
+public class QnAdController {
+
+    @Resource
+    private QnAdService qnadService;
+
+    /**
+     * 保存广告记录
+     */
+    @ApiOperation("保存")
+    @PostMapping("/saveRecord")
+    public Result<?> saveRecord(@RequestBody DyzAdRecordParam param){
+        return qnadService.saveRecord(param);
+    }
+
+    /**
+     * 根据应用ID查询广告数
+     */
+    @ApiOperation("根据应用ID查询广告数")
+    @GetMapping("/getAdCount")
+    public Map<String, BigDecimal> getAdCount(@RequestParam(name = "appIds")String appIds){
+        return qnadService.getAdCount(appIds);
+    }
+
+    /**
+     * 查询应用排行榜信息
+     */
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "sortBy", value = "排行榜排序规则",required = true),
+            @ApiImplicitParam(name = "limit", value = "排行榜显示数量",required = true),
+    })
+    @ApiOperation("查询应用排行榜信息")
+    @GetMapping("/getAppRankingList")
+    public DashboardRankingListVO queryRankingList(@RequestParam(name = "sortBy")Integer sortBy, @RequestParam(name = "limit")Integer limit){
+        return qnadService.queryRankingList(sortBy,limit);
+    }
+
+    /**
+     * 查询各渠道应用收益分时统计
+     */
+    @ApiImplicitParam(name = "apkIds", value = "渠道应用ID(,拼接)",required = true)
+    @ApiOperation("查询各渠道应用收益分时统计")
+    @GetMapping("/revenueStatics")
+    public DashboardRevenueVO revenueStatics(@RequestParam(name = "apkIds")String apkIds){
+        return qnadService.revenueStatics(apkIds);
+    }
+}

+ 42 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/qnjz/QnQuestionController.java

@@ -0,0 +1,42 @@
+package com.ytpm.controller.qnjz;
+
+import com.ytpm.app.param.AnswerRecordParam;
+import com.ytpm.app.view.QuestionListView;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import com.ytpm.service.qnjz.QnQuestionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+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;
+
+@Api(tags = "题目管理模块")
+@RestController
+@RequestMapping("/qn/question")
+public class QnQuestionController {
+    @Resource
+    private QnQuestionService questionService;
+
+    /**
+     * 获取题库
+     */
+    @ApiOperation("获取题库")
+    @GetMapping("/list")
+    public ResultTable<QuestionListView> questionList(){
+        return questionService.questionList();
+    }
+
+    /**
+     * 回答问题
+     */
+    @ApiOperation("回答问题")
+    @PostMapping("/answerQuestion")
+    public Result<String> answerQuestion(@RequestBody AnswerRecordParam param){
+        return questionService.answerQuestion(param);
+    }
+}

+ 259 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/qnjz/QnUserController.java

@@ -0,0 +1,259 @@
+package com.ytpm.controller.qnjz;
+
+import cn.hutool.core.date.DateUtil;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.ytpm.advertise.enums.AdSourceTypeEnum;
+import com.ytpm.app.model.YtDyzAdRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.AppQueryUserTodayTimeParam;
+import com.ytpm.app.param.AppUserParam;
+import com.ytpm.app.param.AppUserQueryParam;
+import com.ytpm.app.param.AppUserTodayBannedParam;
+import com.ytpm.app.param.YtAppUserListParam;
+import com.ytpm.app.view.HourCountView;
+import com.ytpm.app.view.YtAppUserListView;
+import com.ytpm.dao.qnjz.QNAdRecordMapper;
+import com.ytpm.dao.qnjz.QNLoginRecordMapper;
+import com.ytpm.dao.qnjz.QNQuestionMapper;
+import com.ytpm.dao.qnjz.QNUserMapper;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+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 javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Slf4j
+@RestController
+@RequestMapping("/qn/user")
+public class QnUserController {
+    @Resource
+    private QNUserMapper qnUserMapper;
+    @Resource
+    private QNLoginRecordMapper qnloginRecordMapper;
+    @Resource
+    QNAdRecordMapper qnadRecordMapper;
+    @Resource
+    private QNQuestionMapper qnquestionMapper;
+
+    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    /**
+     * 查询app 所有玩家
+     */
+    @PostMapping("/queryAll")
+    public ResultTable<YtAppUserListView> queryAll(@RequestBody YtAppUserListParam param) {
+        PageHelper.startPage(param.getPage(), param.getLimit());
+        List<YtAppUserListView> dyzUsers = qnUserMapper.queryAll(param);
+        if (dyzUsers.isEmpty()) return ResultTable.resultTableOk(new PageInfo<YtAppUserListView>(dyzUsers));
+        List<YtDyzAdRecord> adRecords = qnadRecordMapper.getByUserIds(
+                dyzUsers.stream().map(YtAppUserListView::getUserId).collect(Collectors.joining(",")));
+        Map<String, List<YtDyzAdRecord>> userAdMap = adRecords.stream().collect(
+                Collectors.groupingBy(YtDyzAdRecord::getUserId));
+        setUserExtInfo(dyzUsers,userAdMap);
+        return ResultTable.resultTableOk(new PageInfo<YtAppUserListView>(dyzUsers));
+    }
+
+    /**
+     * 设置用户扩展信息
+     */
+    private void setUserExtInfo(List<YtAppUserListView> dyzUsers, Map<String, List<YtDyzAdRecord>> userAdMap) {
+        for (YtAppUserListView user : dyzUsers) {
+            user.setLoginRecordList(qnloginRecordMapper.getLoginRecords(user.getUserId()));
+            //获取今日收益 | 今日视频播放数
+            if (userAdMap.containsKey(user.getUserId())) {
+                List<YtDyzAdRecord> ytDyzAdRecords = userAdMap.get(user.getUserId());
+                List<YtDyzAdRecord> collect = ytDyzAdRecords.stream().filter(
+                        s -> DateUtil.isSameDay(DateUtil.date(),DateUtil.parseDate(s.getFinishTime()))).collect(Collectors.toList());
+                BigDecimal todayIncome = collect.stream().map(YtDyzAdRecord::getRevenue).reduce(BigDecimal.ZERO, BigDecimal::add);
+                user.setTodayVideo((int) collect.stream().filter(
+                        s->s.getAdSourceType()== AdSourceTypeEnum.rewarded_video.getAdSourceType()).count());
+                user.setTodayIncome(todayIncome);
+            } else {
+                user.setTodayIncome(BigDecimal.ZERO);
+                user.setTodayVideo(0);
+            }
+        }
+    }
+    /**
+     * 计算广告记录列表中今日的收益
+     *
+     * @param records 广告记录列表
+     * @return 今日收益总额(BigDecimal)
+     */
+    public static BigDecimal calculateTodayIncome(List<YtDyzAdRecord> records) {
+        // 空列表快速返回
+        if (records == null || records.isEmpty()) {
+            return BigDecimal.ZERO;
+        }
+
+        // 获取今天的日期范围
+        LocalDate today = LocalDate.now();
+        LocalDateTime startOfDay = today.atStartOfDay();
+        LocalDateTime endOfDay = today.plusDays(1).atStartOfDay();
+
+        // 预计算今天的日期字符串前缀(优化性能)
+        String todayPrefix = today.format(DateTimeFormatter.ISO_DATE) + " ";
+
+        return calculateTodayIncome(records, startOfDay, endOfDay, todayPrefix);
+    }
+
+    /**
+     * 计算广告记录列表中今日的收益(带日期范围参数,适用于批量处理)
+     *
+     * @param records     广告记录列表
+     * @param startOfDay  今日开始时间
+     * @param endOfDay    今日结束时间
+     * @param todayPrefix 今日日期前缀(格式:"yyyy-MM-dd ")
+     * @return 今日收益总额(BigDecimal)
+     */
+    public static BigDecimal calculateTodayIncome(
+            List<YtDyzAdRecord> records,
+            LocalDateTime startOfDay,
+            LocalDateTime endOfDay,
+            String todayPrefix) {
+
+        // 空列表快速返回
+        if (records == null || records.isEmpty()) {
+            return BigDecimal.ZERO;
+        }
+
+        BigDecimal totalToday = BigDecimal.ZERO;
+
+        for (YtDyzAdRecord record : records) {
+            String dateStr = record.getFinishTime();
+
+            // 1. 日期字符串是否存在且以今日日期开头
+            if (dateStr == null || !dateStr.startsWith(todayPrefix)) {
+                continue;
+            }
+            try {
+                // 2. 解析日期时间
+                LocalDateTime recordTime = LocalDateTime.parse(dateStr, DATE_TIME_FORMATTER);
+
+                // 3. 检查是否在今日范围内
+                if (recordTime.isBefore(startOfDay) || recordTime.isAfter(endOfDay.minusNanos(1))) {
+                    continue;
+                }
+                // 4. 累加
+                BigDecimal revenue = record.getRevenue();
+                if (revenue != null) {
+                    totalToday = totalToday.add(revenue);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return totalToday;
+    }
+
+
+
+    /**
+     * 主键查询用户信息
+     */
+    @GetMapping("/getUserInfo")
+    public Result<YtDyzUser> getUserInfo(@RequestParam("userId") String userId) {
+        YtDyzUser user = qnUserMapper.selectPrimaryKey(userId);
+        user.setLoginRecordList(qnloginRecordMapper.getLoginRecords(userId));
+        user.setTodayAnswerCount(qnquestionMapper.getAnswerCount(userId,1));
+        user.setHistoryAnswerCount(qnquestionMapper.getAnswerCount(userId,2));
+        user.setAnswerRecordList(qnquestionMapper.getAnswerRecords(userId));
+        return Result.resultObjOk(user);
+    }
+
+    /**
+     * 查询用户信息
+     */
+    @PostMapping("/getUserList")
+    public ResultTable<YtDyzUser> getUserList(@RequestBody AppUserParam param) {
+        List<YtDyzUser> userList = qnUserMapper.getUserList(param.getUserIds());
+        for (YtDyzUser user : userList) {
+            user.setLoginRecordList(qnloginRecordMapper.getLoginRecords(user.getUserId()));
+        }
+        return ResultTable.resultTableOk(new PageInfo<>(userList));
+    }
+
+    @PostMapping("/getUserAll")
+    public ResultTable<YtDyzUser> getUserAll(@RequestBody AppUserParam param) {
+        List<YtDyzUser> userList = qnUserMapper.getUserList(param.getUserIds());
+        return ResultTable.resultTableOk(new PageInfo<>(userList));
+    }
+
+    /**
+     * 修改用户信息
+     */
+    @PostMapping("/updateUserInfo")
+    public Result<?> updateUserInfo(@RequestBody YtDyzUser dyzUser) {
+        qnUserMapper.updateUser(dyzUser);
+        return Result.resultOk(RepMessage.MODIFY_SUCCESS);
+    }
+
+    /**
+     * 查询用户的广告记录
+     */
+    @GetMapping("/adRecords")
+    public ResultTable<YtDyzAdRecord> adRecords(@RequestParam(name = "userId",required = true) String userId,@RequestParam(name = "adsourceType",required = false)Integer adsourceType) {
+        return ResultTable.resultTableOk(new PageInfo<YtDyzAdRecord>(qnadRecordMapper.getByUserId(userId,adsourceType)));
+    }
+
+    @PostMapping("/queryUserByTime")
+    public List<YtDyzUser> queryUserByTime(@RequestBody AppUserQueryParam appUserQueryParam) {
+        List<YtDyzUser> ytDyzUsers = qnUserMapper.queryAllByTime(appUserQueryParam.getStartTime(), appUserQueryParam.getEndTime(),appUserQueryParam.getAppIdList());
+        return ytDyzUsers;
+    }
+
+    @PostMapping("/queryUserByTodayTime")
+    public int[] queryUserByTodayTime(@RequestBody AppQueryUserTodayTimeParam appQueryUserTodayTimeParam) {
+        // 获取当前日期
+        LocalDate localDate = LocalDate.now();
+
+        // 构建当天起始时间段
+        LocalDateTime startOfDay = localDate.atStartOfDay();
+        LocalDateTime endOfDay = startOfDay.plusDays(1).minusSeconds(1);
+
+        Date startTime = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
+        Date endTime = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
+        // 查询用户注册数据
+        List<HourCountView> hourCountViews = qnUserMapper.countUsersByHour(startTime, endTime,appQueryUserTodayTimeParam.getAppIdList());
+        // 初始化每小时用户数量数组
+        int[] hourlyCounts = new int[24];
+        for (HourCountView hc : hourCountViews) {
+            if (hc.getHour() >= 0 && hc.getHour() < 24) {
+                hourlyCounts[hc.getHour()] = hc.getCount();
+            }
+        }
+        return hourlyCounts;
+    }
+
+    @PostMapping("/queryLoginRecords")
+    public List<String> queryLoginRecords(@RequestBody AppUserQueryParam appUserQueryParam) {
+        return qnloginRecordMapper.queryLoginCount(appUserQueryParam);
+    }
+
+    @GetMapping("/queryByOpenid")
+    public List<YtDyzUser> queryByOpenid(@RequestParam("openid") String openid){
+        return qnUserMapper.queryByOpenid(openid);
+    }
+    @PostMapping("/queryTodayBanned")
+    public List<YtDyzUser> queryTodayBanned(@RequestBody AppUserTodayBannedParam appUserTodayBannedParam){
+        return qnUserMapper.queryTodayBanned(appUserTodayBannedParam.getStartTime(), appUserTodayBannedParam.getEndTime(), appUserTodayBannedParam.getUserIdList());
+    }
+
+}

+ 158 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/qnjz/QnWxController.java

@@ -0,0 +1,158 @@
+package com.ytpm.controller.qnjz;
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.ytpm.app.enums.AppTypeEnums;
+import com.ytpm.app.model.YtAppDefaultConfig;
+import com.ytpm.app.model.YtDyzPowerRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.WxLoginParam;
+import com.ytpm.app.view.WxDefaultConfig;
+import com.ytpm.app.view.WxLoginResult;
+import com.ytpm.app.view.WxUserInfo;
+import com.ytpm.dao.qnjz.QNUserMapper;
+import com.ytpm.feign.RiskFeign;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
+import com.ytpm.handle.CustomerException;
+import com.ytpm.service.qnjz.QnUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.GetMapping;
+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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+@Slf4j
+@Api(tags = "微信开放能力模块")
+@RestController
+@RequestMapping("/qn/wx")
+public class QnWxController {
+    private final static String GRANT_TYPE = "authorization_code";
+    @Resource
+    private QNUserMapper qnUserMapper;
+    @Resource
+    private RiskFeign riskFeign;
+    @Resource
+    private QnUserService qnUserService;
+
+
+    @PostMapping("/login")
+    @ApiOperation("微信登录")
+    @Transactional
+    public Result<YtDyzUser> wxLogin(@RequestBody WxLoginParam param, HttpServletRequest request) {
+        //根据应用获取配置调用微信接口登录
+        WxDefaultConfig defaultConfig = qnUserMapper.getDefaultConfig(param.getAppType());
+        if(Objects.isNull(defaultConfig)){
+            throw new CustomerException("微信登录失败,未找到相应配置!");
+        }
+        param.setAppId(defaultConfig.getPlatformAppId());
+        WxLoginResult loginResult = getWechatLoginInfo(param.getWxCode(),param.getAppType(),defaultConfig.getAppId(),defaultConfig.getSecret());
+        if(Objects.isNull(loginResult)|| StrUtil.isBlank(loginResult.getOpenid())){
+            throw new CustomerException("微信登录失败,请刷新授权码!");
+        }
+        WxUserInfo wxUserInfo = getWechatUserInfo(loginResult.getAccess_token(),loginResult.getOpenid());
+        if(Objects.isNull(wxUserInfo)) {
+            throw new CustomerException("微信用户登录失败");
+        }
+        param.setLoginIp(getClientIp(request));
+        YtDyzUser old = qnUserService.crudForNewTrans(param,wxUserInfo,loginResult);
+        //调用风控服务校验默认风控配置
+        old.setRiskCode("313");
+        Result<?> result = riskFeign.checkRisk(old);
+        if(result.getCode()!=200){
+            throw new CustomerException(result.getMessage());
+        }
+        return Result.resultOk(RepMessage.LOGIN_SUCCESS, old);
+    }
+
+    private String getClientIp(HttpServletRequest request) {
+        String xfHeader = request.getHeader("X-Forwarded-For");
+        if (xfHeader == null) {
+            return request.getRemoteAddr();
+        }
+        return xfHeader.split(",")[0]; // 可能会有多个IP,这里取第一个逗号前的IP
+    }
+
+    /**
+     * 获取微信用户信息
+     */
+    private WxUserInfo getWechatUserInfo(String accessToken, String openid) {
+        // 根据token和openid 获取用户信息
+        String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+accessToken+"&openid="+openid+"&lang=zh_CN";
+        String curUser = HttpUtil.get(userInfoUrl);
+        WxUserInfo wxUserInfo = JSON.parseObject(curUser, WxUserInfo.class);
+        log.error("获取的用户信息:{}",wxUserInfo);
+        return wxUserInfo;
+    }
+
+    /**
+     * 微信登录
+     */
+    private WxLoginResult getWechatLoginInfo(String wxCode,int appType,String appId,String secret) {
+
+        String wxLoginUrl;
+        if(AppTypeEnums.QNJZ.getCode() == appType){
+            wxLoginUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+                    +appId+"&secret="+secret+"&code="+wxCode+"&grant_type="+GRANT_TYPE;
+        }else{
+            wxLoginUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appId
+                    +"&secret="+secret+"&code="+wxCode+"&grant_type="+GRANT_TYPE;
+        }
+        //拿到授权码 请求微信登录返回access_token
+        String result = HttpUtil.get(wxLoginUrl);
+        WxLoginResult loginResult = JSON.parseObject(result, WxLoginResult.class);
+        log.error("授权码获取的登录结果:{}",loginResult);
+        return loginResult;
+    }
+
+    @ApiOperation("获取微信默认配置项")
+    @GetMapping("/defaultConfig")
+    public Result<String> getWxDefaultConfig(int appType) {
+        WxDefaultConfig config = qnUserMapper.getDefaultConfig(appType);
+        if(Objects.isNull(config)){
+            return Result.resultErr("应用类型有误!");
+        }
+        return Result.resultObjOk(config.getAppId());
+    }
+
+    @ApiOperation("体力增加")
+    @GetMapping("/addPower")
+    @Transactional(rollbackFor = Exception.class)
+    public Result<YtDyzUser> addPower(@RequestParam("userId")String userId) {
+        qnUserMapper.addOnePower(userId);
+        YtDyzPowerRecord record = new YtDyzPowerRecord();
+        record.setUserId(userId);
+        record.setRecordId(IdUtil.fastSimpleUUID());
+        record.setAddTime(new Date());
+        record.setType(1);
+        record.setRemark("增加体力");
+        qnUserMapper.addPowerRecord(record);
+        return Result.resultOk(RepMessage.ADD_SUCCESS);
+    }
+
+    @ApiOperation("保存应用默认配置")
+    @PostMapping("/saveAppConfig")
+    public Result<String> saveAppConfig(@RequestBody YtAppDefaultConfig defaultConfig){
+        qnUserMapper.saveAppConfig(defaultConfig);
+        return Result.resultOk(RepMessage.SAVE_SUCCESS);
+    }
+
+    @ApiOperation("根据APP_ID获取配置")
+    @GetMapping("/getConfigs")
+    public List<WxDefaultConfig> getConfigs(@RequestParam(name = "appIds")String appIds){
+        return qnUserMapper.getConfigByIds(appIds);
+    }
+}

+ 72 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/qnmjz/QnmAdController.java

@@ -0,0 +1,72 @@
+package com.ytpm.controller.qnmjz;
+
+import com.ytpm.app.param.DyzAdRecordParam;
+import com.ytpm.general.Result;
+import com.ytpm.middle.view.DashboardRankingListVO;
+import com.ytpm.middle.view.DashboardRevenueVO;
+import com.ytpm.service.qnjz.QnAdService;
+import com.ytpm.service.qnmjz.QnmAdService;
+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.GetMapping;
+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 javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Map;
+
+@Api(tags = "用户浏览广告记录")
+@RestController
+@RequestMapping("/qnm/ad")
+public class QnmAdController {
+
+    @Resource
+    private QnmAdService qnmadService;
+
+    /**
+     * 保存广告记录
+     */
+    @ApiOperation("保存")
+    @PostMapping("/saveRecord")
+    public Result<?> saveRecord(@RequestBody DyzAdRecordParam param){
+        return qnmadService.saveRecord(param);
+    }
+
+    /**
+     * 根据应用ID查询广告数
+     */
+    @ApiOperation("根据应用ID查询广告数")
+    @GetMapping("/getAdCount")
+    public Map<String, BigDecimal> getAdCount(@RequestParam(name = "appIds")String appIds){
+        return qnmadService.getAdCount(appIds);
+    }
+
+    /**
+     * 查询应用排行榜信息
+     */
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "sortBy", value = "排行榜排序规则",required = true),
+            @ApiImplicitParam(name = "limit", value = "排行榜显示数量",required = true),
+    })
+    @ApiOperation("查询应用排行榜信息")
+    @GetMapping("/getAppRankingList")
+    public DashboardRankingListVO queryRankingList(@RequestParam(name = "sortBy")Integer sortBy, @RequestParam(name = "limit")Integer limit){
+        return qnmadService.queryRankingList(sortBy,limit);
+    }
+
+    /**
+     * 查询各渠道应用收益分时统计
+     */
+    @ApiImplicitParam(name = "apkIds", value = "渠道应用ID(,拼接)",required = true)
+    @ApiOperation("查询各渠道应用收益分时统计")
+    @GetMapping("/revenueStatics")
+    public DashboardRevenueVO revenueStatics(@RequestParam(name = "apkIds")String apkIds){
+        return qnmadService.revenueStatics(apkIds);
+    }
+}

+ 43 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/qnmjz/QnmQuestionController.java

@@ -0,0 +1,43 @@
+package com.ytpm.controller.qnmjz;
+
+import com.ytpm.app.param.AnswerRecordParam;
+import com.ytpm.app.view.QuestionListView;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import com.ytpm.service.qnjz.QnQuestionService;
+import com.ytpm.service.qnmjz.QnmQuestionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+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;
+
+@Api(tags = "题目管理模块")
+@RestController
+@RequestMapping("/qnm/question")
+public class QnmQuestionController {
+    @Resource
+    private QnmQuestionService qnmquestionService;
+
+    /**
+     * 获取题库
+     */
+    @ApiOperation("获取题库")
+    @GetMapping("/list")
+    public ResultTable<QuestionListView> questionList(){
+        return qnmquestionService.questionList();
+    }
+
+    /**
+     * 回答问题
+     */
+    @ApiOperation("回答问题")
+    @PostMapping("/answerQuestion")
+    public Result<String> answerQuestion(@RequestBody AnswerRecordParam param){
+        return qnmquestionService.answerQuestion(param);
+    }
+}

+ 263 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/qnmjz/QnmUserController.java

@@ -0,0 +1,263 @@
+package com.ytpm.controller.qnmjz;
+
+import cn.hutool.core.date.DateUtil;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.ytpm.advertise.enums.AdSourceTypeEnum;
+import com.ytpm.app.model.YtDyzAdRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.AppQueryUserTodayTimeParam;
+import com.ytpm.app.param.AppUserParam;
+import com.ytpm.app.param.AppUserQueryParam;
+import com.ytpm.app.param.AppUserTodayBannedParam;
+import com.ytpm.app.param.YtAppUserListParam;
+import com.ytpm.app.view.HourCountView;
+import com.ytpm.app.view.YtAppUserListView;
+import com.ytpm.dao.qnjz.QNAdRecordMapper;
+import com.ytpm.dao.qnjz.QNLoginRecordMapper;
+import com.ytpm.dao.qnjz.QNQuestionMapper;
+import com.ytpm.dao.qnjz.QNUserMapper;
+import com.ytpm.dao.qnmjz.QnmAdRecordMapper;
+import com.ytpm.dao.qnmjz.QnmLoginRecordMapper;
+import com.ytpm.dao.qnmjz.QnmQuestionMapper;
+import com.ytpm.dao.qnmjz.QnmUserMapper;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+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 javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Slf4j
+@RestController
+@RequestMapping("/qnm/user")
+public class QnmUserController {
+    @Resource
+    private QnmUserMapper qnmUserMapper;
+    @Resource
+    private QnmLoginRecordMapper qnmloginRecordMapper;
+    @Resource
+    QnmAdRecordMapper qnmadRecordMapper;
+    @Resource
+    private QnmQuestionMapper qnmquestionMapper;
+
+    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    /**
+     * 查询app 所有玩家
+     */
+    @PostMapping("/queryAll")
+    public ResultTable<YtAppUserListView> queryAll(@RequestBody YtAppUserListParam param) {
+        PageHelper.startPage(param.getPage(), param.getLimit());
+        List<YtAppUserListView> dyzUsers = qnmUserMapper.queryAll(param);
+        if (dyzUsers.isEmpty()) return ResultTable.resultTableOk(new PageInfo<YtAppUserListView>(dyzUsers));
+        List<YtDyzAdRecord> adRecords = qnmadRecordMapper.getByUserIds(
+                dyzUsers.stream().map(YtAppUserListView::getUserId).collect(Collectors.joining(",")));
+        Map<String, List<YtDyzAdRecord>> userAdMap = adRecords.stream().collect(
+                Collectors.groupingBy(YtDyzAdRecord::getUserId));
+        setUserExtInfo(dyzUsers,userAdMap);
+        return ResultTable.resultTableOk(new PageInfo<YtAppUserListView>(dyzUsers));
+    }
+
+    /**
+     * 设置用户扩展信息
+     */
+    private void setUserExtInfo(List<YtAppUserListView> dyzUsers, Map<String, List<YtDyzAdRecord>> userAdMap) {
+        for (YtAppUserListView user : dyzUsers) {
+            user.setLoginRecordList(qnmloginRecordMapper.getLoginRecords(user.getUserId()));
+            //获取今日收益 | 今日视频播放数
+            if (userAdMap.containsKey(user.getUserId())) {
+                List<YtDyzAdRecord> ytDyzAdRecords = userAdMap.get(user.getUserId());
+                List<YtDyzAdRecord> collect = ytDyzAdRecords.stream().filter(
+                        s -> DateUtil.isSameDay(DateUtil.date(),DateUtil.parseDate(s.getFinishTime()))).collect(Collectors.toList());
+                BigDecimal todayIncome = collect.stream().map(YtDyzAdRecord::getRevenue).reduce(BigDecimal.ZERO, BigDecimal::add);
+                user.setTodayVideo((int) collect.stream().filter(
+                        s->s.getAdSourceType()== AdSourceTypeEnum.rewarded_video.getAdSourceType()).count());
+                user.setTodayIncome(todayIncome);
+            } else {
+                user.setTodayIncome(BigDecimal.ZERO);
+                user.setTodayVideo(0);
+            }
+        }
+    }
+    /**
+     * 计算广告记录列表中今日的收益
+     *
+     * @param records 广告记录列表
+     * @return 今日收益总额(BigDecimal)
+     */
+    public static BigDecimal calculateTodayIncome(List<YtDyzAdRecord> records) {
+        // 空列表快速返回
+        if (records == null || records.isEmpty()) {
+            return BigDecimal.ZERO;
+        }
+
+        // 获取今天的日期范围
+        LocalDate today = LocalDate.now();
+        LocalDateTime startOfDay = today.atStartOfDay();
+        LocalDateTime endOfDay = today.plusDays(1).atStartOfDay();
+
+        // 预计算今天的日期字符串前缀(优化性能)
+        String todayPrefix = today.format(DateTimeFormatter.ISO_DATE) + " ";
+
+        return calculateTodayIncome(records, startOfDay, endOfDay, todayPrefix);
+    }
+
+    /**
+     * 计算广告记录列表中今日的收益(带日期范围参数,适用于批量处理)
+     *
+     * @param records     广告记录列表
+     * @param startOfDay  今日开始时间
+     * @param endOfDay    今日结束时间
+     * @param todayPrefix 今日日期前缀(格式:"yyyy-MM-dd ")
+     * @return 今日收益总额(BigDecimal)
+     */
+    public static BigDecimal calculateTodayIncome(
+            List<YtDyzAdRecord> records,
+            LocalDateTime startOfDay,
+            LocalDateTime endOfDay,
+            String todayPrefix) {
+
+        // 空列表快速返回
+        if (records == null || records.isEmpty()) {
+            return BigDecimal.ZERO;
+        }
+
+        BigDecimal totalToday = BigDecimal.ZERO;
+
+        for (YtDyzAdRecord record : records) {
+            String dateStr = record.getFinishTime();
+
+            // 1. 日期字符串是否存在且以今日日期开头
+            if (dateStr == null || !dateStr.startsWith(todayPrefix)) {
+                continue;
+            }
+            try {
+                // 2. 解析日期时间
+                LocalDateTime recordTime = LocalDateTime.parse(dateStr, DATE_TIME_FORMATTER);
+
+                // 3. 检查是否在今日范围内
+                if (recordTime.isBefore(startOfDay) || recordTime.isAfter(endOfDay.minusNanos(1))) {
+                    continue;
+                }
+                // 4. 累加
+                BigDecimal revenue = record.getRevenue();
+                if (revenue != null) {
+                    totalToday = totalToday.add(revenue);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return totalToday;
+    }
+
+
+
+    /**
+     * 主键查询用户信息
+     */
+    @GetMapping("/getUserInfo")
+    public Result<YtDyzUser> getUserInfo(@RequestParam("userId") String userId) {
+        YtDyzUser user = qnmUserMapper.selectPrimaryKey(userId);
+        user.setLoginRecordList(qnmloginRecordMapper.getLoginRecords(userId));
+        user.setTodayAnswerCount(qnmquestionMapper.getAnswerCount(userId,1));
+        user.setHistoryAnswerCount(qnmquestionMapper.getAnswerCount(userId,2));
+        user.setAnswerRecordList(qnmquestionMapper.getAnswerRecords(userId));
+        return Result.resultObjOk(user);
+    }
+
+    /**
+     * 查询用户信息
+     */
+    @PostMapping("/getUserList")
+    public ResultTable<YtDyzUser> getUserList(@RequestBody AppUserParam param) {
+        List<YtDyzUser> userList = qnmUserMapper.getUserList(param.getUserIds());
+        for (YtDyzUser user : userList) {
+            user.setLoginRecordList(qnmloginRecordMapper.getLoginRecords(user.getUserId()));
+        }
+        return ResultTable.resultTableOk(new PageInfo<>(userList));
+    }
+
+    @PostMapping("/getUserAll")
+    public ResultTable<YtDyzUser> getUserAll(@RequestBody AppUserParam param) {
+        List<YtDyzUser> userList = qnmUserMapper.getUserList(param.getUserIds());
+        return ResultTable.resultTableOk(new PageInfo<>(userList));
+    }
+
+    /**
+     * 修改用户信息
+     */
+    @PostMapping("/updateUserInfo")
+    public Result<?> updateUserInfo(@RequestBody YtDyzUser dyzUser) {
+        qnmUserMapper.updateUser(dyzUser);
+        return Result.resultOk(RepMessage.MODIFY_SUCCESS);
+    }
+
+    /**
+     * 查询用户的广告记录
+     */
+    @GetMapping("/adRecords")
+    public ResultTable<YtDyzAdRecord> adRecords(@RequestParam(name = "userId",required = true) String userId,@RequestParam(name = "adsourceType",required = false)Integer adsourceType) {
+        return ResultTable.resultTableOk(new PageInfo<YtDyzAdRecord>(qnmadRecordMapper.getByUserId(userId,adsourceType)));
+    }
+
+    @PostMapping("/queryUserByTime")
+    public List<YtDyzUser> queryUserByTime(@RequestBody AppUserQueryParam appUserQueryParam) {
+        List<YtDyzUser> ytDyzUsers = qnmUserMapper.queryAllByTime(appUserQueryParam.getStartTime(), appUserQueryParam.getEndTime(),appUserQueryParam.getAppIdList());
+        return ytDyzUsers;
+    }
+
+    @PostMapping("/queryUserByTodayTime")
+    public int[] queryUserByTodayTime(@RequestBody AppQueryUserTodayTimeParam appQueryUserTodayTimeParam) {
+        // 获取当前日期
+        LocalDate localDate = LocalDate.now();
+
+        // 构建当天起始时间段
+        LocalDateTime startOfDay = localDate.atStartOfDay();
+        LocalDateTime endOfDay = startOfDay.plusDays(1).minusSeconds(1);
+
+        Date startTime = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
+        Date endTime = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
+        // 查询用户注册数据
+        List<HourCountView> hourCountViews = qnmUserMapper.countUsersByHour(startTime, endTime,appQueryUserTodayTimeParam.getAppIdList());
+        // 初始化每小时用户数量数组
+        int[] hourlyCounts = new int[24];
+        for (HourCountView hc : hourCountViews) {
+            if (hc.getHour() >= 0 && hc.getHour() < 24) {
+                hourlyCounts[hc.getHour()] = hc.getCount();
+            }
+        }
+        return hourlyCounts;
+    }
+
+    @PostMapping("/queryLoginRecords")
+    public List<String> queryLoginRecords(@RequestBody AppUserQueryParam appUserQueryParam) {
+        return qnmloginRecordMapper.queryLoginCount(appUserQueryParam);
+    }
+
+    @GetMapping("/queryByOpenid")
+    public List<YtDyzUser> queryByOpenid(@RequestParam("openid") String openid){
+        return qnmUserMapper.queryByOpenid(openid);
+    }
+    @PostMapping("/queryTodayBanned")
+    public List<YtDyzUser> queryTodayBanned(@RequestBody AppUserTodayBannedParam appUserTodayBannedParam){
+        return qnmUserMapper.queryTodayBanned(appUserTodayBannedParam.getStartTime(), appUserTodayBannedParam.getEndTime(), appUserTodayBannedParam.getUserIdList());
+    }
+
+}

+ 160 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/qnmjz/QnmWxController.java

@@ -0,0 +1,160 @@
+package com.ytpm.controller.qnmjz;
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.ytpm.app.enums.AppTypeEnums;
+import com.ytpm.app.model.YtAppDefaultConfig;
+import com.ytpm.app.model.YtDyzPowerRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.WxLoginParam;
+import com.ytpm.app.view.WxDefaultConfig;
+import com.ytpm.app.view.WxLoginResult;
+import com.ytpm.app.view.WxUserInfo;
+import com.ytpm.dao.qnjz.QNUserMapper;
+import com.ytpm.dao.qnmjz.QnmUserMapper;
+import com.ytpm.feign.RiskFeign;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
+import com.ytpm.handle.CustomerException;
+import com.ytpm.service.qnjz.QnUserService;
+import com.ytpm.service.qnmjz.QnmUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.GetMapping;
+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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+@Slf4j
+@Api(tags = "微信开放能力模块")
+@RestController
+@RequestMapping("/qnm/wx")
+public class QnmWxController {
+    private final static String GRANT_TYPE = "authorization_code";
+    @Resource
+    private QnmUserMapper qnmUserMapper;
+    @Resource
+    private RiskFeign riskFeign;
+    @Resource
+    private QnmUserService qnmUserService;
+
+
+    @PostMapping("/login")
+    @ApiOperation("微信登录")
+    @Transactional
+    public Result<YtDyzUser> wxLogin(@RequestBody WxLoginParam param, HttpServletRequest request) {
+        //根据应用获取配置调用微信接口登录
+        WxDefaultConfig defaultConfig = qnmUserMapper.getDefaultConfig(param.getAppType());
+        if(Objects.isNull(defaultConfig)){
+            throw new CustomerException("微信登录失败,未找到相应配置!");
+        }
+        param.setAppId(defaultConfig.getPlatformAppId());
+        WxLoginResult loginResult = getWechatLoginInfo(param.getWxCode(),param.getAppType(),defaultConfig.getAppId(),defaultConfig.getSecret());
+        if(Objects.isNull(loginResult)|| StrUtil.isBlank(loginResult.getOpenid())){
+            throw new CustomerException("微信登录失败,请刷新授权码!");
+        }
+        WxUserInfo wxUserInfo = getWechatUserInfo(loginResult.getAccess_token(),loginResult.getOpenid());
+        if(Objects.isNull(wxUserInfo)) {
+            throw new CustomerException("微信用户登录失败");
+        }
+        param.setLoginIp(getClientIp(request));
+        YtDyzUser old = qnmUserService.crudForNewTrans(param,wxUserInfo,loginResult);
+        //调用风控服务校验默认风控配置
+        old.setRiskCode("313");
+        Result<?> result = riskFeign.checkRisk(old);
+        if(result.getCode()!=200){
+            throw new CustomerException(result.getMessage());
+        }
+        return Result.resultOk(RepMessage.LOGIN_SUCCESS, old);
+    }
+
+    private String getClientIp(HttpServletRequest request) {
+        String xfHeader = request.getHeader("X-Forwarded-For");
+        if (xfHeader == null) {
+            return request.getRemoteAddr();
+        }
+        return xfHeader.split(",")[0]; // 可能会有多个IP,这里取第一个逗号前的IP
+    }
+
+    /**
+     * 获取微信用户信息
+     */
+    private WxUserInfo getWechatUserInfo(String accessToken, String openid) {
+        // 根据token和openid 获取用户信息
+        String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+accessToken+"&openid="+openid+"&lang=zh_CN";
+        String curUser = HttpUtil.get(userInfoUrl);
+        WxUserInfo wxUserInfo = JSON.parseObject(curUser, WxUserInfo.class);
+        log.error("获取的用户信息:{}",wxUserInfo);
+        return wxUserInfo;
+    }
+
+    /**
+     * 微信登录
+     */
+    private WxLoginResult getWechatLoginInfo(String wxCode,int appType,String appId,String secret) {
+
+        String wxLoginUrl;
+        if(AppTypeEnums.QNJZ.getCode() == appType){
+            wxLoginUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+                    +appId+"&secret="+secret+"&code="+wxCode+"&grant_type="+GRANT_TYPE;
+        }else{
+            wxLoginUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appId
+                    +"&secret="+secret+"&code="+wxCode+"&grant_type="+GRANT_TYPE;
+        }
+        //拿到授权码 请求微信登录返回access_token
+        String result = HttpUtil.get(wxLoginUrl);
+        WxLoginResult loginResult = JSON.parseObject(result, WxLoginResult.class);
+        log.error("授权码获取的登录结果:{}",loginResult);
+        return loginResult;
+    }
+
+    @ApiOperation("获取微信默认配置项")
+    @GetMapping("/defaultConfig")
+    public Result<String> getWxDefaultConfig(int appType) {
+        WxDefaultConfig config = qnmUserMapper.getDefaultConfig(appType);
+        if(Objects.isNull(config)){
+            return Result.resultErr("应用类型有误!");
+        }
+        return Result.resultObjOk(config.getAppId());
+    }
+
+    @ApiOperation("体力增加")
+    @GetMapping("/addPower")
+    @Transactional(rollbackFor = Exception.class)
+    public Result<YtDyzUser> addPower(@RequestParam("userId")String userId) {
+        qnmUserMapper.addOnePower(userId);
+        YtDyzPowerRecord record = new YtDyzPowerRecord();
+        record.setUserId(userId);
+        record.setRecordId(IdUtil.fastSimpleUUID());
+        record.setAddTime(new Date());
+        record.setType(1);
+        record.setRemark("增加体力");
+        qnmUserMapper.addPowerRecord(record);
+        return Result.resultOk(RepMessage.ADD_SUCCESS);
+    }
+
+    @ApiOperation("保存应用默认配置")
+    @PostMapping("/saveAppConfig")
+    public Result<String> saveAppConfig(@RequestBody YtAppDefaultConfig defaultConfig){
+        qnmUserMapper.saveAppConfig(defaultConfig);
+        return Result.resultOk(RepMessage.SAVE_SUCCESS);
+    }
+
+    @ApiOperation("根据APP_ID获取配置")
+    @GetMapping("/getConfigs")
+    public List<WxDefaultConfig> getConfigs(@RequestParam(name = "appIds")String appIds){
+        return qnmUserMapper.getConfigByIds(appIds);
+    }
+}

+ 72 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/xjlrl/XjlrlAdController.java

@@ -0,0 +1,72 @@
+package com.ytpm.controller.xjlrl;
+
+import com.ytpm.app.param.DyzAdRecordParam;
+import com.ytpm.general.Result;
+import com.ytpm.middle.view.DashboardRankingListVO;
+import com.ytpm.middle.view.DashboardRevenueVO;
+import com.ytpm.service.qnjz.QnAdService;
+import com.ytpm.service.xjlrl.XjlrlAdService;
+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.GetMapping;
+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 javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Map;
+
+@Api(tags = "用户浏览广告记录")
+@RestController
+@RequestMapping("/xjl/ad")
+public class XjlrlAdController {
+
+    @Resource
+    private XjlrlAdService xjladService;
+
+    /**
+     * 保存广告记录
+     */
+    @ApiOperation("保存")
+    @PostMapping("/saveRecord")
+    public Result<?> saveRecord(@RequestBody DyzAdRecordParam param){
+        return xjladService.saveRecord(param);
+    }
+
+    /**
+     * 根据应用ID查询广告数
+     */
+    @ApiOperation("根据应用ID查询广告数")
+    @GetMapping("/getAdCount")
+    public Map<String, BigDecimal> getAdCount(@RequestParam(name = "appIds")String appIds){
+        return xjladService.getAdCount(appIds);
+    }
+
+    /**
+     * 查询应用排行榜信息
+     */
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "sortBy", value = "排行榜排序规则",required = true),
+            @ApiImplicitParam(name = "limit", value = "排行榜显示数量",required = true),
+    })
+    @ApiOperation("查询应用排行榜信息")
+    @GetMapping("/getAppRankingList")
+    public DashboardRankingListVO queryRankingList(@RequestParam(name = "sortBy")Integer sortBy, @RequestParam(name = "limit")Integer limit){
+        return xjladService.queryRankingList(sortBy,limit);
+    }
+
+    /**
+     * 查询各渠道应用收益分时统计
+     */
+    @ApiImplicitParam(name = "apkIds", value = "渠道应用ID(,拼接)",required = true)
+    @ApiOperation("查询各渠道应用收益分时统计")
+    @GetMapping("/revenueStatics")
+    public DashboardRevenueVO revenueStatics(@RequestParam(name = "apkIds")String apkIds){
+        return xjladService.revenueStatics(apkIds);
+    }
+}

+ 42 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/xjlrl/XjlrlQuestionController.java

@@ -0,0 +1,42 @@
+package com.ytpm.controller.xjlrl;
+
+import com.ytpm.app.param.AnswerRecordParam;
+import com.ytpm.app.view.QuestionListView;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import com.ytpm.service.xjlrl.XjlrlQuestionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+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;
+
+@Api(tags = "题目管理模块")
+@RestController
+@RequestMapping("/xjl/question")
+public class XjlrlQuestionController {
+    @Resource
+    private XjlrlQuestionService xjlquestionService;
+
+    /**
+     * 获取题库
+     */
+    @ApiOperation("获取题库")
+    @GetMapping("/list")
+    public ResultTable<QuestionListView> questionList(){
+        return xjlquestionService.questionList();
+    }
+
+    /**
+     * 回答问题
+     */
+    @ApiOperation("回答问题")
+    @PostMapping("/answerQuestion")
+    public Result<String> answerQuestion(@RequestBody AnswerRecordParam param){
+        return xjlquestionService.answerQuestion(param);
+    }
+}

+ 263 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/xjlrl/XjlrlUserController.java

@@ -0,0 +1,263 @@
+package com.ytpm.controller.xjlrl;
+
+import cn.hutool.core.date.DateUtil;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.ytpm.advertise.enums.AdSourceTypeEnum;
+import com.ytpm.app.model.YtDyzAdRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.AppQueryUserTodayTimeParam;
+import com.ytpm.app.param.AppUserParam;
+import com.ytpm.app.param.AppUserQueryParam;
+import com.ytpm.app.param.AppUserTodayBannedParam;
+import com.ytpm.app.param.YtAppUserListParam;
+import com.ytpm.app.view.HourCountView;
+import com.ytpm.app.view.YtAppUserListView;
+import com.ytpm.dao.qnjz.QNAdRecordMapper;
+import com.ytpm.dao.qnjz.QNLoginRecordMapper;
+import com.ytpm.dao.qnjz.QNQuestionMapper;
+import com.ytpm.dao.qnjz.QNUserMapper;
+import com.ytpm.dao.xjlrl.XjlrlAdRecordMapper;
+import com.ytpm.dao.xjlrl.XjlrlLoginRecordMapper;
+import com.ytpm.dao.xjlrl.XjlrlQuestionMapper;
+import com.ytpm.dao.xjlrl.XjlrlUserMapper;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+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 javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Slf4j
+@RestController
+@RequestMapping("/xjl/user")
+public class XjlrlUserController {
+    @Resource
+    private XjlrlUserMapper xjlUserMapper;
+    @Resource
+    private XjlrlLoginRecordMapper xjlloginRecordMapper;
+    @Resource
+    XjlrlAdRecordMapper xjladRecordMapper;
+    @Resource
+    private XjlrlQuestionMapper xjlquestionMapper;
+
+    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    /**
+     * 查询app 所有玩家
+     */
+    @PostMapping("/queryAll")
+    public ResultTable<YtAppUserListView> queryAll(@RequestBody YtAppUserListParam param) {
+        PageHelper.startPage(param.getPage(), param.getLimit());
+        List<YtAppUserListView> dyzUsers = xjlUserMapper.queryAll(param);
+        if (dyzUsers.isEmpty()) return ResultTable.resultTableOk(new PageInfo<YtAppUserListView>(dyzUsers));
+        List<YtDyzAdRecord> adRecords = xjladRecordMapper.getByUserIds(
+                dyzUsers.stream().map(YtAppUserListView::getUserId).collect(Collectors.joining(",")));
+        Map<String, List<YtDyzAdRecord>> userAdMap = adRecords.stream().collect(
+                Collectors.groupingBy(YtDyzAdRecord::getUserId));
+        setUserExtInfo(dyzUsers,userAdMap);
+        return ResultTable.resultTableOk(new PageInfo<YtAppUserListView>(dyzUsers));
+    }
+
+    /**
+     * 设置用户扩展信息
+     */
+    private void setUserExtInfo(List<YtAppUserListView> dyzUsers, Map<String, List<YtDyzAdRecord>> userAdMap) {
+        for (YtAppUserListView user : dyzUsers) {
+            user.setLoginRecordList(xjlloginRecordMapper.getLoginRecords(user.getUserId()));
+            //获取今日收益 | 今日视频播放数
+            if (userAdMap.containsKey(user.getUserId())) {
+                List<YtDyzAdRecord> ytDyzAdRecords = userAdMap.get(user.getUserId());
+                List<YtDyzAdRecord> collect = ytDyzAdRecords.stream().filter(
+                        s -> DateUtil.isSameDay(DateUtil.date(),DateUtil.parseDate(s.getFinishTime()))).collect(Collectors.toList());
+                BigDecimal todayIncome = collect.stream().map(YtDyzAdRecord::getRevenue).reduce(BigDecimal.ZERO, BigDecimal::add);
+                user.setTodayVideo((int) collect.stream().filter(
+                        s->s.getAdSourceType()== AdSourceTypeEnum.rewarded_video.getAdSourceType()).count());
+                user.setTodayIncome(todayIncome);
+            } else {
+                user.setTodayIncome(BigDecimal.ZERO);
+                user.setTodayVideo(0);
+            }
+        }
+    }
+    /**
+     * 计算广告记录列表中今日的收益
+     *
+     * @param records 广告记录列表
+     * @return 今日收益总额(BigDecimal)
+     */
+    public static BigDecimal calculateTodayIncome(List<YtDyzAdRecord> records) {
+        // 空列表快速返回
+        if (records == null || records.isEmpty()) {
+            return BigDecimal.ZERO;
+        }
+
+        // 获取今天的日期范围
+        LocalDate today = LocalDate.now();
+        LocalDateTime startOfDay = today.atStartOfDay();
+        LocalDateTime endOfDay = today.plusDays(1).atStartOfDay();
+
+        // 预计算今天的日期字符串前缀(优化性能)
+        String todayPrefix = today.format(DateTimeFormatter.ISO_DATE) + " ";
+
+        return calculateTodayIncome(records, startOfDay, endOfDay, todayPrefix);
+    }
+
+    /**
+     * 计算广告记录列表中今日的收益(带日期范围参数,适用于批量处理)
+     *
+     * @param records     广告记录列表
+     * @param startOfDay  今日开始时间
+     * @param endOfDay    今日结束时间
+     * @param todayPrefix 今日日期前缀(格式:"yyyy-MM-dd ")
+     * @return 今日收益总额(BigDecimal)
+     */
+    public static BigDecimal calculateTodayIncome(
+            List<YtDyzAdRecord> records,
+            LocalDateTime startOfDay,
+            LocalDateTime endOfDay,
+            String todayPrefix) {
+
+        // 空列表快速返回
+        if (records == null || records.isEmpty()) {
+            return BigDecimal.ZERO;
+        }
+
+        BigDecimal totalToday = BigDecimal.ZERO;
+
+        for (YtDyzAdRecord record : records) {
+            String dateStr = record.getFinishTime();
+
+            // 1. 日期字符串是否存在且以今日日期开头
+            if (dateStr == null || !dateStr.startsWith(todayPrefix)) {
+                continue;
+            }
+            try {
+                // 2. 解析日期时间
+                LocalDateTime recordTime = LocalDateTime.parse(dateStr, DATE_TIME_FORMATTER);
+
+                // 3. 检查是否在今日范围内
+                if (recordTime.isBefore(startOfDay) || recordTime.isAfter(endOfDay.minusNanos(1))) {
+                    continue;
+                }
+                // 4. 累加
+                BigDecimal revenue = record.getRevenue();
+                if (revenue != null) {
+                    totalToday = totalToday.add(revenue);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return totalToday;
+    }
+
+
+
+    /**
+     * 主键查询用户信息
+     */
+    @GetMapping("/getUserInfo")
+    public Result<YtDyzUser> getUserInfo(@RequestParam("userId") String userId) {
+        YtDyzUser user = xjlUserMapper.selectPrimaryKey(userId);
+        user.setLoginRecordList(xjlloginRecordMapper.getLoginRecords(userId));
+        user.setTodayAnswerCount(xjlquestionMapper.getAnswerCount(userId,1));
+        user.setHistoryAnswerCount(xjlquestionMapper.getAnswerCount(userId,2));
+        user.setAnswerRecordList(xjlquestionMapper.getAnswerRecords(userId));
+        return Result.resultObjOk(user);
+    }
+
+    /**
+     * 查询用户信息
+     */
+    @PostMapping("/getUserList")
+    public ResultTable<YtDyzUser> getUserList(@RequestBody AppUserParam param) {
+        List<YtDyzUser> userList = xjlUserMapper.getUserList(param.getUserIds());
+        for (YtDyzUser user : userList) {
+            user.setLoginRecordList(xjlloginRecordMapper.getLoginRecords(user.getUserId()));
+        }
+        return ResultTable.resultTableOk(new PageInfo<>(userList));
+    }
+
+    @PostMapping("/getUserAll")
+    public ResultTable<YtDyzUser> getUserAll(@RequestBody AppUserParam param) {
+        List<YtDyzUser> userList = xjlUserMapper.getUserList(param.getUserIds());
+        return ResultTable.resultTableOk(new PageInfo<>(userList));
+    }
+
+    /**
+     * 修改用户信息
+     */
+    @PostMapping("/updateUserInfo")
+    public Result<?> updateUserInfo(@RequestBody YtDyzUser dyzUser) {
+        xjlUserMapper.updateUser(dyzUser);
+        return Result.resultOk(RepMessage.MODIFY_SUCCESS);
+    }
+
+    /**
+     * 查询用户的广告记录
+     */
+    @GetMapping("/adRecords")
+    public ResultTable<YtDyzAdRecord> adRecords(@RequestParam(name = "userId",required = true) String userId,@RequestParam(name = "adsourceType",required = false)Integer adsourceType) {
+        return ResultTable.resultTableOk(new PageInfo<YtDyzAdRecord>(xjladRecordMapper.getByUserId(userId,adsourceType)));
+    }
+
+    @PostMapping("/queryUserByTime")
+    public List<YtDyzUser> queryUserByTime(@RequestBody AppUserQueryParam appUserQueryParam) {
+        List<YtDyzUser> ytDyzUsers = xjlUserMapper.queryAllByTime(appUserQueryParam.getStartTime(), appUserQueryParam.getEndTime(),appUserQueryParam.getAppIdList());
+        return ytDyzUsers;
+    }
+
+    @PostMapping("/queryUserByTodayTime")
+    public int[] queryUserByTodayTime(@RequestBody AppQueryUserTodayTimeParam appQueryUserTodayTimeParam) {
+        // 获取当前日期
+        LocalDate localDate = LocalDate.now();
+
+        // 构建当天起始时间段
+        LocalDateTime startOfDay = localDate.atStartOfDay();
+        LocalDateTime endOfDay = startOfDay.plusDays(1).minusSeconds(1);
+
+        Date startTime = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
+        Date endTime = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
+        // 查询用户注册数据
+        List<HourCountView> hourCountViews = xjlUserMapper.countUsersByHour(startTime, endTime,appQueryUserTodayTimeParam.getAppIdList());
+        // 初始化每小时用户数量数组
+        int[] hourlyCounts = new int[24];
+        for (HourCountView hc : hourCountViews) {
+            if (hc.getHour() >= 0 && hc.getHour() < 24) {
+                hourlyCounts[hc.getHour()] = hc.getCount();
+            }
+        }
+        return hourlyCounts;
+    }
+
+    @PostMapping("/queryLoginRecords")
+    public List<String> queryLoginRecords(@RequestBody AppUserQueryParam appUserQueryParam) {
+        return xjlloginRecordMapper.queryLoginCount(appUserQueryParam);
+    }
+
+    @GetMapping("/queryByOpenid")
+    public List<YtDyzUser> queryByOpenid(@RequestParam("openid") String openid){
+        return xjlUserMapper.queryByOpenid(openid);
+    }
+    @PostMapping("/queryTodayBanned")
+    public List<YtDyzUser> queryTodayBanned(@RequestBody AppUserTodayBannedParam appUserTodayBannedParam){
+        return xjlUserMapper.queryTodayBanned(appUserTodayBannedParam.getStartTime(), appUserTodayBannedParam.getEndTime(), appUserTodayBannedParam.getUserIdList());
+    }
+
+}

+ 160 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/xjlrl/XjlrlWxController.java

@@ -0,0 +1,160 @@
+package com.ytpm.controller.xjlrl;
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.ytpm.app.enums.AppTypeEnums;
+import com.ytpm.app.model.YtAppDefaultConfig;
+import com.ytpm.app.model.YtDyzPowerRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.WxLoginParam;
+import com.ytpm.app.view.WxDefaultConfig;
+import com.ytpm.app.view.WxLoginResult;
+import com.ytpm.app.view.WxUserInfo;
+import com.ytpm.dao.qnjz.QNUserMapper;
+import com.ytpm.dao.xjlrl.XjlrlUserMapper;
+import com.ytpm.feign.RiskFeign;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
+import com.ytpm.handle.CustomerException;
+import com.ytpm.service.qnjz.QnUserService;
+import com.ytpm.service.xjlrl.XjlrlUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.GetMapping;
+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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+@Slf4j
+@Api(tags = "微信开放能力模块")
+@RestController
+@RequestMapping("/xjl/wx")
+public class XjlrlWxController {
+    private final static String GRANT_TYPE = "authorization_code";
+    @Resource
+    private XjlrlUserMapper xjlUserMapper;
+    @Resource
+    private RiskFeign riskFeign;
+    @Resource
+    private XjlrlUserService xjlUserService;
+
+
+    @PostMapping("/login")
+    @ApiOperation("微信登录")
+    @Transactional
+    public Result<YtDyzUser> wxLogin(@RequestBody WxLoginParam param, HttpServletRequest request) {
+        //根据应用获取配置调用微信接口登录
+        WxDefaultConfig defaultConfig = xjlUserMapper.getDefaultConfig(param.getAppType());
+        if(Objects.isNull(defaultConfig)){
+            throw new CustomerException("微信登录失败,未找到相应配置!");
+        }
+        param.setAppId(defaultConfig.getPlatformAppId());
+        WxLoginResult loginResult = getWechatLoginInfo(param.getWxCode(),param.getAppType(),defaultConfig.getAppId(),defaultConfig.getSecret());
+        if(Objects.isNull(loginResult)|| StrUtil.isBlank(loginResult.getOpenid())){
+            throw new CustomerException("微信登录失败,请刷新授权码!");
+        }
+        WxUserInfo wxUserInfo = getWechatUserInfo(loginResult.getAccess_token(),loginResult.getOpenid());
+        if(Objects.isNull(wxUserInfo)) {
+            throw new CustomerException("微信用户登录失败");
+        }
+        param.setLoginIp(getClientIp(request));
+        YtDyzUser old = xjlUserService.crudForNewTrans(param,wxUserInfo,loginResult);
+        //调用风控服务校验默认风控配置
+        old.setRiskCode("313");
+        Result<?> result = riskFeign.checkRisk(old);
+        if(result.getCode()!=200){
+            throw new CustomerException(result.getMessage());
+        }
+        return Result.resultOk(RepMessage.LOGIN_SUCCESS, old);
+    }
+
+    private String getClientIp(HttpServletRequest request) {
+        String xfHeader = request.getHeader("X-Forwarded-For");
+        if (xfHeader == null) {
+            return request.getRemoteAddr();
+        }
+        return xfHeader.split(",")[0]; // 可能会有多个IP,这里取第一个逗号前的IP
+    }
+
+    /**
+     * 获取微信用户信息
+     */
+    private WxUserInfo getWechatUserInfo(String accessToken, String openid) {
+        // 根据token和openid 获取用户信息
+        String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+accessToken+"&openid="+openid+"&lang=zh_CN";
+        String curUser = HttpUtil.get(userInfoUrl);
+        WxUserInfo wxUserInfo = JSON.parseObject(curUser, WxUserInfo.class);
+        log.error("获取的用户信息:{}",wxUserInfo);
+        return wxUserInfo;
+    }
+
+    /**
+     * 微信登录
+     */
+    private WxLoginResult getWechatLoginInfo(String wxCode,int appType,String appId,String secret) {
+
+        String wxLoginUrl;
+        if(AppTypeEnums.QNJZ.getCode() == appType){
+            wxLoginUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+                    +appId+"&secret="+secret+"&code="+wxCode+"&grant_type="+GRANT_TYPE;
+        }else{
+            wxLoginUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appId
+                    +"&secret="+secret+"&code="+wxCode+"&grant_type="+GRANT_TYPE;
+        }
+        //拿到授权码 请求微信登录返回access_token
+        String result = HttpUtil.get(wxLoginUrl);
+        WxLoginResult loginResult = JSON.parseObject(result, WxLoginResult.class);
+        log.error("授权码获取的登录结果:{}",loginResult);
+        return loginResult;
+    }
+
+    @ApiOperation("获取微信默认配置项")
+    @GetMapping("/defaultConfig")
+    public Result<String> getWxDefaultConfig(int appType) {
+        WxDefaultConfig config = xjlUserMapper.getDefaultConfig(appType);
+        if(Objects.isNull(config)){
+            return Result.resultErr("应用类型有误!");
+        }
+        return Result.resultObjOk(config.getAppId());
+    }
+
+    @ApiOperation("体力增加")
+    @GetMapping("/addPower")
+    @Transactional(rollbackFor = Exception.class)
+    public Result<YtDyzUser> addPower(@RequestParam("userId")String userId) {
+        xjlUserMapper.addOnePower(userId);
+        YtDyzPowerRecord record = new YtDyzPowerRecord();
+        record.setUserId(userId);
+        record.setRecordId(IdUtil.fastSimpleUUID());
+        record.setAddTime(new Date());
+        record.setType(1);
+        record.setRemark("增加体力");
+        xjlUserMapper.addPowerRecord(record);
+        return Result.resultOk(RepMessage.ADD_SUCCESS);
+    }
+
+    @ApiOperation("保存应用默认配置")
+    @PostMapping("/saveAppConfig")
+    public Result<String> saveAppConfig(@RequestBody YtAppDefaultConfig defaultConfig){
+        xjlUserMapper.saveAppConfig(defaultConfig);
+        return Result.resultOk(RepMessage.SAVE_SUCCESS);
+    }
+
+    @ApiOperation("根据APP_ID获取配置")
+    @GetMapping("/getConfigs")
+    public List<WxDefaultConfig> getConfigs(@RequestParam(name = "appIds")String appIds){
+        return xjlUserMapper.getConfigByIds(appIds);
+    }
+}

+ 1 - 1
yt-app/app-service/src/main/java/com/ytpm/dao/AdRecordMapper.java → yt-app/app-service/src/main/java/com/ytpm/dao/dyz/AdRecordMapper.java

@@ -1,4 +1,4 @@
-package com.ytpm.dao;
+package com.ytpm.dao.dyz;
 
 import com.ytpm.app.model.YtDyzAdRecord;
 import org.apache.ibatis.annotations.Param;

+ 1 - 1
yt-app/app-service/src/main/java/com/ytpm/dao/AppUserMapper.java → yt-app/app-service/src/main/java/com/ytpm/dao/dyz/AppUserMapper.java

@@ -1,4 +1,4 @@
-package com.ytpm.dao;
+package com.ytpm.dao.dyz;
 
 import com.ytpm.app.model.YtAppDefaultConfig;
 import com.ytpm.app.model.YtDyzPowerRecord;

+ 1 - 1
yt-app/app-service/src/main/java/com/ytpm/dao/LoginRecordMapper.java → yt-app/app-service/src/main/java/com/ytpm/dao/dyz/LoginRecordMapper.java

@@ -1,4 +1,4 @@
-package com.ytpm.dao;
+package com.ytpm.dao.dyz;
 
 import com.ytpm.app.model.YtDyzLoginRecord;
 import com.ytpm.app.param.AppUserQueryParam;

+ 1 - 2
yt-app/app-service/src/main/java/com/ytpm/dao/QuestionMapper.java → yt-app/app-service/src/main/java/com/ytpm/dao/dyz/QuestionMapper.java

@@ -1,8 +1,7 @@
-package com.ytpm.dao;
+package com.ytpm.dao.dyz;
 
 import com.ytpm.app.model.YtDyzAnswerRecord;
 import com.ytpm.app.view.QuestionListView;
-import com.ytpm.general.Result;
 import org.apache.ibatis.annotations.Param;
 import org.mapstruct.Mapper;
 

+ 24 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/nofeeds/NFAdRecordMapper.java

@@ -0,0 +1,24 @@
+package com.ytpm.dao.nofeeds;
+
+import com.ytpm.app.model.YtDyzAdRecord;
+import org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface NFAdRecordMapper {
+    /**
+     * 新增广告记录
+     */
+    void addOne(YtDyzAdRecord adRecord);
+    /**
+     * 查询用户的广告记录
+     */
+    List<YtDyzAdRecord> getByUserId(@Param("userId") String userId,@Param("adsourceType") Integer adsourceType);
+
+    /**
+     * 查询激励视频记录
+     */
+    List<YtDyzAdRecord> getByUserIds(@Param("userIds") String userIds);
+}

+ 23 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/nofeeds/NFLoginRecordMapper.java

@@ -0,0 +1,23 @@
+package com.ytpm.dao.nofeeds;
+
+import com.ytpm.app.model.YtDyzLoginRecord;
+import com.ytpm.app.param.AppUserQueryParam;
+import org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface NFLoginRecordMapper {
+    /**
+     * 增加用户登录记录
+     */
+    void insertOne(YtDyzLoginRecord loginRecord);
+
+    /**
+     * 查询用户登录记录
+     */
+    List<YtDyzLoginRecord> getLoginRecords(@Param("userId")String userId);
+
+    List<String> queryLoginCount(AppUserQueryParam appUserQueryParam);
+}

+ 38 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/nofeeds/NFQuestionMapper.java

@@ -0,0 +1,38 @@
+package com.ytpm.dao.nofeeds;
+
+import com.ytpm.app.model.YtDyzAnswerRecord;
+import com.ytpm.app.view.QuestionListView;
+import org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface NFQuestionMapper {
+
+    /**
+     * 获取题库
+     */
+    List<QuestionListView> questionList(@Param("appId")String appId);
+
+    /**
+     * 回答问题
+     */
+    void saveAnswerRecord(YtDyzAnswerRecord record);
+
+    /**
+     * 获取最后一次的问题ID
+     */
+    String getLastQuestionId(@Param("userId") String userId);
+
+    /**
+     * 获取答题数
+     * @param type 1-今日 2-历史
+     */
+    Integer getAnswerCount(@Param("userId")String userId, @Param("type") int type);
+
+    /**
+     * 查询答题历史记录
+     */
+    List<YtDyzAnswerRecord> getAnswerRecords(@Param("userId") String userId);
+}

+ 133 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/nofeeds/NFUserMapper.java

@@ -0,0 +1,133 @@
+package com.ytpm.dao.nofeeds;
+
+import com.ytpm.app.model.YtAppDefaultConfig;
+import com.ytpm.app.model.YtDyzPowerRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.YtAppUserListParam;
+import com.ytpm.app.view.HourCountView;
+import com.ytpm.app.view.WxDefaultConfig;
+import com.ytpm.app.view.YtAppUserListView;
+import com.ytpm.middle.view.AppRankingListVO;
+import com.ytpm.middle.view.UserRankingListVO;
+import org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Mapper
+public interface NFUserMapper {
+
+    /**
+     * openid查询用户信息
+     */
+    YtDyzUser getYtAppUser(@Param("openid")String openid,@Param("ditchId")long ditchId);
+
+    /**
+     * 主键查询
+     */
+    YtDyzUser selectPrimaryKey(@Param("userId")String userId);
+
+    /**
+     * 新增应用用户
+     */
+    void addOne(YtDyzUser user);
+
+    /**
+     * 增加体力
+     */
+    void addOnePower(@Param("userId")String userId);
+    /**
+     * 减少体力
+     */
+    void subOnePower(@Param("userId")String userId);
+
+    /**
+     * 体力增加记录
+     */
+    void addPowerRecord(YtDyzPowerRecord record);
+
+    /**
+     * 修改用户信息
+     */
+    void updateUser(YtDyzUser newUser);
+    /**
+     * 查询所有玩家
+     */
+    List<YtAppUserListView> queryAll(YtAppUserListParam param);
+
+    /**
+     * 查询所有玩家
+     * 按照注册时间范围查询
+     * @param startTime 开始时间(可选)
+     * @param endTime 结束时间(可选)
+     */
+    List<YtDyzUser> queryAllByTime(
+            @Param("startTime") Date startTime,
+            @Param("endTime") Date endTime,
+            @Param("appIdList") List<String> appIdList
+    );
+
+    List<HourCountView> countUsersByHour(@Param("startTime") Date startTime,
+                                         @Param("endTime") Date endTime,
+                                         @Param("appIdList") List<String> appIdList
+    );
+
+    List<YtDyzUser> queryTodayBanned(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("userIdList") List<String> userIdList);
+
+    /**
+     * 查询用户信息
+     */
+    List<YtDyzUser> getUserList(@Param("userIds") String userIds);
+
+    /**
+     * 根据应用类型查询应用默认配置
+     */
+    WxDefaultConfig getDefaultConfig(@Param("appType") int appType);
+
+    /**
+     * 根据应用ID获取应用secret
+     */
+    String getSecretByAppId(@Param("appId") String appId);
+
+    /**
+     * 根据微信openid查询用户
+     */
+    List<YtDyzUser> queryByOpenid(@Param("openid")String openid);
+
+    /**
+     * 根据设备ID查询平台ID
+     */
+    String getByDeviceId(@Param("deviceId")String deviceId,@Param("openid")String openid);
+
+    /**
+     * 保存应用配置
+     */
+    void saveAppConfig(YtAppDefaultConfig defaultConfig);
+
+    /**
+     * 根据APP_ID获取配置
+     */
+    List<WxDefaultConfig> getConfigByIds(@Param("appIds") String appIds);
+
+    /**
+     * 根据应用统计广告数
+     */
+    int getAdCount(@Param("appIds") String appIds);
+
+    /**
+     * 根据应用统计收益
+     */
+    BigDecimal getRevenueCount(@Param("appIds") String appIds);
+
+    /**
+     * 查询应用排行榜
+     */
+    List<AppRankingListVO> getAppRanking(@Param("sortBy") int sortBy,@Param("limit") int limit);
+
+    /**
+     * 查询用户排行榜数据
+     */
+    List<UserRankingListVO> getUserRanking(@Param("sortBy") int sortBy,@Param("limit") int limit);
+}

+ 24 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/qnjz/QNAdRecordMapper.java

@@ -0,0 +1,24 @@
+package com.ytpm.dao.qnjz;
+
+import com.ytpm.app.model.YtDyzAdRecord;
+import org.apache.ibatis.annotations.Param;
+import org.mybatis.spring.annotation.MapperScan;
+
+import java.util.List;
+
+@MapperScan
+public interface QNAdRecordMapper {
+    /**
+     * 新增广告记录
+     */
+    void addOne(YtDyzAdRecord adRecord);
+    /**
+     * 查询用户的广告记录
+     */
+    List<YtDyzAdRecord> getByUserId(@Param("userId") String userId, @Param("adsourceType") Integer adsourceType);
+
+    /**
+     * 查询激励视频记录
+     */
+    List<YtDyzAdRecord> getByUserIds(@Param("userIds") String userIds);
+}

+ 23 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/qnjz/QNLoginRecordMapper.java

@@ -0,0 +1,23 @@
+package com.ytpm.dao.qnjz;
+
+import com.ytpm.app.model.YtDyzLoginRecord;
+import com.ytpm.app.param.AppUserQueryParam;
+import org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface QNLoginRecordMapper {
+    /**
+     * 增加用户登录记录
+     */
+    void insertOne(YtDyzLoginRecord loginRecord);
+
+    /**
+     * 查询用户登录记录
+     */
+    List<YtDyzLoginRecord> getLoginRecords(@Param("userId")String userId);
+
+    List<String> queryLoginCount(AppUserQueryParam appUserQueryParam);
+}

+ 38 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/qnjz/QNQuestionMapper.java

@@ -0,0 +1,38 @@
+package com.ytpm.dao.qnjz;
+
+import com.ytpm.app.model.YtDyzAnswerRecord;
+import com.ytpm.app.view.QuestionListView;
+import org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface QNQuestionMapper {
+
+    /**
+     * 获取题库
+     */
+    List<QuestionListView> questionList(@Param("appId")String appId);
+
+    /**
+     * 回答问题
+     */
+    void saveAnswerRecord(YtDyzAnswerRecord record);
+
+    /**
+     * 获取最后一次的问题ID
+     */
+    String getLastQuestionId(@Param("userId") String userId);
+
+    /**
+     * 获取答题数
+     * @param type 1-今日 2-历史
+     */
+    Integer getAnswerCount(@Param("userId")String userId, @Param("type") int type);
+
+    /**
+     * 查询答题历史记录
+     */
+    List<YtDyzAnswerRecord> getAnswerRecords(@Param("userId") String userId);
+}

+ 133 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/qnjz/QNUserMapper.java

@@ -0,0 +1,133 @@
+package com.ytpm.dao.qnjz;
+
+import com.ytpm.app.model.YtAppDefaultConfig;
+import com.ytpm.app.model.YtDyzPowerRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.YtAppUserListParam;
+import com.ytpm.app.view.HourCountView;
+import com.ytpm.app.view.WxDefaultConfig;
+import com.ytpm.app.view.YtAppUserListView;
+import com.ytpm.middle.view.AppRankingListVO;
+import com.ytpm.middle.view.UserRankingListVO;
+import org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Mapper
+public interface QNUserMapper {
+
+    /**
+     * openid查询用户信息
+     */
+    YtDyzUser getYtAppUser(@Param("openid")String openid,@Param("ditchId")long ditchId);
+
+    /**
+     * 主键查询
+     */
+    YtDyzUser selectPrimaryKey(@Param("userId")String userId);
+
+    /**
+     * 新增应用用户
+     */
+    void addOne(YtDyzUser user);
+
+    /**
+     * 增加体力
+     */
+    void addOnePower(@Param("userId")String userId);
+    /**
+     * 减少体力
+     */
+    void subOnePower(@Param("userId")String userId);
+
+    /**
+     * 体力增加记录
+     */
+    void addPowerRecord(YtDyzPowerRecord record);
+
+    /**
+     * 修改用户信息
+     */
+    void updateUser(YtDyzUser newUser);
+    /**
+     * 查询所有玩家
+     */
+    List<YtAppUserListView> queryAll(YtAppUserListParam param);
+
+    /**
+     * 查询所有玩家
+     * 按照注册时间范围查询
+     * @param startTime 开始时间(可选)
+     * @param endTime 结束时间(可选)
+     */
+    List<YtDyzUser> queryAllByTime(
+            @Param("startTime") Date startTime,
+            @Param("endTime") Date endTime,
+            @Param("appIdList") List<String> appIdList
+    );
+
+    List<HourCountView> countUsersByHour(@Param("startTime") Date startTime,
+                                         @Param("endTime") Date endTime,
+                                         @Param("appIdList") List<String> appIdList
+    );
+
+    List<YtDyzUser> queryTodayBanned(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("userIdList") List<String> userIdList);
+
+    /**
+     * 查询用户信息
+     */
+    List<YtDyzUser> getUserList(@Param("userIds") String userIds);
+
+    /**
+     * 根据应用类型查询应用默认配置
+     */
+    WxDefaultConfig getDefaultConfig(@Param("appType") int appType);
+
+    /**
+     * 根据应用ID获取应用secret
+     */
+    String getSecretByAppId(@Param("appId") String appId);
+
+    /**
+     * 根据微信openid查询用户
+     */
+    List<YtDyzUser> queryByOpenid(@Param("openid")String openid);
+
+    /**
+     * 根据设备ID查询平台ID
+     */
+    String getByDeviceId(@Param("deviceId")String deviceId,@Param("openid")String openid);
+
+    /**
+     * 保存应用配置
+     */
+    void saveAppConfig(YtAppDefaultConfig defaultConfig);
+
+    /**
+     * 根据APP_ID获取配置
+     */
+    List<WxDefaultConfig> getConfigByIds(@Param("appIds") String appIds);
+
+    /**
+     * 根据应用统计广告数
+     */
+    int getAdCount(@Param("appIds") String appIds);
+
+    /**
+     * 根据应用统计收益
+     */
+    BigDecimal getRevenueCount(@Param("appIds") String appIds);
+
+    /**
+     * 查询应用排行榜
+     */
+    List<AppRankingListVO> getAppRanking(@Param("sortBy") int sortBy,@Param("limit") int limit);
+
+    /**
+     * 查询用户排行榜数据
+     */
+    List<UserRankingListVO> getUserRanking(@Param("sortBy") int sortBy,@Param("limit") int limit);
+}

+ 24 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/qnmjz/QnmAdRecordMapper.java

@@ -0,0 +1,24 @@
+package com.ytpm.dao.qnmjz;
+
+import com.ytpm.app.model.YtDyzAdRecord;
+import org.apache.ibatis.annotations.Param;
+import org.mybatis.spring.annotation.MapperScan;
+
+import java.util.List;
+
+@MapperScan
+public interface QnmAdRecordMapper {
+    /**
+     * 新增广告记录
+     */
+    void addOne(YtDyzAdRecord adRecord);
+    /**
+     * 查询用户的广告记录
+     */
+    List<YtDyzAdRecord> getByUserId(@Param("userId") String userId, @Param("adsourceType") Integer adsourceType);
+
+    /**
+     * 查询激励视频记录
+     */
+    List<YtDyzAdRecord> getByUserIds(@Param("userIds") String userIds);
+}

+ 23 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/qnmjz/QnmLoginRecordMapper.java

@@ -0,0 +1,23 @@
+package com.ytpm.dao.qnmjz;
+
+import com.ytpm.app.model.YtDyzLoginRecord;
+import com.ytpm.app.param.AppUserQueryParam;
+import org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface QnmLoginRecordMapper {
+    /**
+     * 增加用户登录记录
+     */
+    void insertOne(YtDyzLoginRecord loginRecord);
+
+    /**
+     * 查询用户登录记录
+     */
+    List<YtDyzLoginRecord> getLoginRecords(@Param("userId")String userId);
+
+    List<String> queryLoginCount(AppUserQueryParam appUserQueryParam);
+}

+ 38 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/qnmjz/QnmQuestionMapper.java

@@ -0,0 +1,38 @@
+package com.ytpm.dao.qnmjz;
+
+import com.ytpm.app.model.YtDyzAnswerRecord;
+import com.ytpm.app.view.QuestionListView;
+import org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface QnmQuestionMapper {
+
+    /**
+     * 获取题库
+     */
+    List<QuestionListView> questionList(@Param("appId")String appId);
+
+    /**
+     * 回答问题
+     */
+    void saveAnswerRecord(YtDyzAnswerRecord record);
+
+    /**
+     * 获取最后一次的问题ID
+     */
+    String getLastQuestionId(@Param("userId") String userId);
+
+    /**
+     * 获取答题数
+     * @param type 1-今日 2-历史
+     */
+    Integer getAnswerCount(@Param("userId")String userId, @Param("type") int type);
+
+    /**
+     * 查询答题历史记录
+     */
+    List<YtDyzAnswerRecord> getAnswerRecords(@Param("userId") String userId);
+}

+ 133 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/qnmjz/QnmUserMapper.java

@@ -0,0 +1,133 @@
+package com.ytpm.dao.qnmjz;
+
+import com.ytpm.app.model.YtAppDefaultConfig;
+import com.ytpm.app.model.YtDyzPowerRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.YtAppUserListParam;
+import com.ytpm.app.view.HourCountView;
+import com.ytpm.app.view.WxDefaultConfig;
+import com.ytpm.app.view.YtAppUserListView;
+import com.ytpm.middle.view.AppRankingListVO;
+import com.ytpm.middle.view.UserRankingListVO;
+import org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Mapper
+public interface QnmUserMapper {
+
+    /**
+     * openid查询用户信息
+     */
+    YtDyzUser getYtAppUser(@Param("openid")String openid,@Param("ditchId")long ditchId);
+
+    /**
+     * 主键查询
+     */
+    YtDyzUser selectPrimaryKey(@Param("userId")String userId);
+
+    /**
+     * 新增应用用户
+     */
+    void addOne(YtDyzUser user);
+
+    /**
+     * 增加体力
+     */
+    void addOnePower(@Param("userId")String userId);
+    /**
+     * 减少体力
+     */
+    void subOnePower(@Param("userId")String userId);
+
+    /**
+     * 体力增加记录
+     */
+    void addPowerRecord(YtDyzPowerRecord record);
+
+    /**
+     * 修改用户信息
+     */
+    void updateUser(YtDyzUser newUser);
+    /**
+     * 查询所有玩家
+     */
+    List<YtAppUserListView> queryAll(YtAppUserListParam param);
+
+    /**
+     * 查询所有玩家
+     * 按照注册时间范围查询
+     * @param startTime 开始时间(可选)
+     * @param endTime 结束时间(可选)
+     */
+    List<YtDyzUser> queryAllByTime(
+            @Param("startTime") Date startTime,
+            @Param("endTime") Date endTime,
+            @Param("appIdList") List<String> appIdList
+    );
+
+    List<HourCountView> countUsersByHour(@Param("startTime") Date startTime,
+                                         @Param("endTime") Date endTime,
+                                         @Param("appIdList") List<String> appIdList
+    );
+
+    List<YtDyzUser> queryTodayBanned(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("userIdList") List<String> userIdList);
+
+    /**
+     * 查询用户信息
+     */
+    List<YtDyzUser> getUserList(@Param("userIds") String userIds);
+
+    /**
+     * 根据应用类型查询应用默认配置
+     */
+    WxDefaultConfig getDefaultConfig(@Param("appType") int appType);
+
+    /**
+     * 根据应用ID获取应用secret
+     */
+    String getSecretByAppId(@Param("appId") String appId);
+
+    /**
+     * 根据微信openid查询用户
+     */
+    List<YtDyzUser> queryByOpenid(@Param("openid")String openid);
+
+    /**
+     * 根据设备ID查询平台ID
+     */
+    String getByDeviceId(@Param("deviceId")String deviceId,@Param("openid")String openid);
+
+    /**
+     * 保存应用配置
+     */
+    void saveAppConfig(YtAppDefaultConfig defaultConfig);
+
+    /**
+     * 根据APP_ID获取配置
+     */
+    List<WxDefaultConfig> getConfigByIds(@Param("appIds") String appIds);
+
+    /**
+     * 根据应用统计广告数
+     */
+    int getAdCount(@Param("appIds") String appIds);
+
+    /**
+     * 根据应用统计收益
+     */
+    BigDecimal getRevenueCount(@Param("appIds") String appIds);
+
+    /**
+     * 查询应用排行榜
+     */
+    List<AppRankingListVO> getAppRanking(@Param("sortBy") int sortBy,@Param("limit") int limit);
+
+    /**
+     * 查询用户排行榜数据
+     */
+    List<UserRankingListVO> getUserRanking(@Param("sortBy") int sortBy,@Param("limit") int limit);
+}

+ 24 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/xjlrl/XjlrlAdRecordMapper.java

@@ -0,0 +1,24 @@
+package com.ytpm.dao.xjlrl;
+
+import com.ytpm.app.model.YtDyzAdRecord;
+import org.apache.ibatis.annotations.Param;
+import org.mybatis.spring.annotation.MapperScan;
+
+import java.util.List;
+
+@MapperScan
+public interface XjlrlAdRecordMapper {
+    /**
+     * 新增广告记录
+     */
+    void addOne(YtDyzAdRecord adRecord);
+    /**
+     * 查询用户的广告记录
+     */
+    List<YtDyzAdRecord> getByUserId(@Param("userId") String userId, @Param("adsourceType") Integer adsourceType);
+
+    /**
+     * 查询激励视频记录
+     */
+    List<YtDyzAdRecord> getByUserIds(@Param("userIds") String userIds);
+}

+ 23 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/xjlrl/XjlrlLoginRecordMapper.java

@@ -0,0 +1,23 @@
+package com.ytpm.dao.xjlrl;
+
+import com.ytpm.app.model.YtDyzLoginRecord;
+import com.ytpm.app.param.AppUserQueryParam;
+import org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface XjlrlLoginRecordMapper {
+    /**
+     * 增加用户登录记录
+     */
+    void insertOne(YtDyzLoginRecord loginRecord);
+
+    /**
+     * 查询用户登录记录
+     */
+    List<YtDyzLoginRecord> getLoginRecords(@Param("userId")String userId);
+
+    List<String> queryLoginCount(AppUserQueryParam appUserQueryParam);
+}

+ 38 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/xjlrl/XjlrlQuestionMapper.java

@@ -0,0 +1,38 @@
+package com.ytpm.dao.xjlrl;
+
+import com.ytpm.app.model.YtDyzAnswerRecord;
+import com.ytpm.app.view.QuestionListView;
+import org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface XjlrlQuestionMapper {
+
+    /**
+     * 获取题库
+     */
+    List<QuestionListView> questionList(@Param("appId")String appId);
+
+    /**
+     * 回答问题
+     */
+    void saveAnswerRecord(YtDyzAnswerRecord record);
+
+    /**
+     * 获取最后一次的问题ID
+     */
+    String getLastQuestionId(@Param("userId") String userId);
+
+    /**
+     * 获取答题数
+     * @param type 1-今日 2-历史
+     */
+    Integer getAnswerCount(@Param("userId")String userId, @Param("type") int type);
+
+    /**
+     * 查询答题历史记录
+     */
+    List<YtDyzAnswerRecord> getAnswerRecords(@Param("userId") String userId);
+}

+ 133 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/xjlrl/XjlrlUserMapper.java

@@ -0,0 +1,133 @@
+package com.ytpm.dao.xjlrl;
+
+import com.ytpm.app.model.YtAppDefaultConfig;
+import com.ytpm.app.model.YtDyzPowerRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.YtAppUserListParam;
+import com.ytpm.app.view.HourCountView;
+import com.ytpm.app.view.WxDefaultConfig;
+import com.ytpm.app.view.YtAppUserListView;
+import com.ytpm.middle.view.AppRankingListVO;
+import com.ytpm.middle.view.UserRankingListVO;
+import org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Mapper
+public interface XjlrlUserMapper {
+
+    /**
+     * openid查询用户信息
+     */
+    YtDyzUser getYtAppUser(@Param("openid")String openid,@Param("ditchId")long ditchId);
+
+    /**
+     * 主键查询
+     */
+    YtDyzUser selectPrimaryKey(@Param("userId")String userId);
+
+    /**
+     * 新增应用用户
+     */
+    void addOne(YtDyzUser user);
+
+    /**
+     * 增加体力
+     */
+    void addOnePower(@Param("userId")String userId);
+    /**
+     * 减少体力
+     */
+    void subOnePower(@Param("userId")String userId);
+
+    /**
+     * 体力增加记录
+     */
+    void addPowerRecord(YtDyzPowerRecord record);
+
+    /**
+     * 修改用户信息
+     */
+    void updateUser(YtDyzUser newUser);
+    /**
+     * 查询所有玩家
+     */
+    List<YtAppUserListView> queryAll(YtAppUserListParam param);
+
+    /**
+     * 查询所有玩家
+     * 按照注册时间范围查询
+     * @param startTime 开始时间(可选)
+     * @param endTime 结束时间(可选)
+     */
+    List<YtDyzUser> queryAllByTime(
+            @Param("startTime") Date startTime,
+            @Param("endTime") Date endTime,
+            @Param("appIdList") List<String> appIdList
+    );
+
+    List<HourCountView> countUsersByHour(@Param("startTime") Date startTime,
+                                         @Param("endTime") Date endTime,
+                                         @Param("appIdList") List<String> appIdList
+    );
+
+    List<YtDyzUser> queryTodayBanned(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("userIdList") List<String> userIdList);
+
+    /**
+     * 查询用户信息
+     */
+    List<YtDyzUser> getUserList(@Param("userIds") String userIds);
+
+    /**
+     * 根据应用类型查询应用默认配置
+     */
+    WxDefaultConfig getDefaultConfig(@Param("appType") int appType);
+
+    /**
+     * 根据应用ID获取应用secret
+     */
+    String getSecretByAppId(@Param("appId") String appId);
+
+    /**
+     * 根据微信openid查询用户
+     */
+    List<YtDyzUser> queryByOpenid(@Param("openid")String openid);
+
+    /**
+     * 根据设备ID查询平台ID
+     */
+    String getByDeviceId(@Param("deviceId")String deviceId,@Param("openid")String openid);
+
+    /**
+     * 保存应用配置
+     */
+    void saveAppConfig(YtAppDefaultConfig defaultConfig);
+
+    /**
+     * 根据APP_ID获取配置
+     */
+    List<WxDefaultConfig> getConfigByIds(@Param("appIds") String appIds);
+
+    /**
+     * 根据应用统计广告数
+     */
+    int getAdCount(@Param("appIds") String appIds);
+
+    /**
+     * 根据应用统计收益
+     */
+    BigDecimal getRevenueCount(@Param("appIds") String appIds);
+
+    /**
+     * 查询应用排行榜
+     */
+    List<AppRankingListVO> getAppRanking(@Param("sortBy") int sortBy,@Param("limit") int limit);
+
+    /**
+     * 查询用户排行榜数据
+     */
+    List<UserRankingListVO> getUserRanking(@Param("sortBy") int sortBy,@Param("limit") int limit);
+}

+ 1 - 1
yt-app/app-service/src/main/java/com/ytpm/service/AdService.java → yt-app/app-service/src/main/java/com/ytpm/service/dyz/AdService.java

@@ -1,4 +1,4 @@
-package com.ytpm.service;
+package com.ytpm.service.dyz;
 
 import com.ytpm.app.param.DyzAdRecordParam;
 import com.ytpm.general.Result;

+ 1 - 1
yt-app/app-service/src/main/java/com/ytpm/service/AppUserService.java → yt-app/app-service/src/main/java/com/ytpm/service/dyz/AppUserService.java

@@ -1,4 +1,4 @@
-package com.ytpm.service;
+package com.ytpm.service.dyz;
 
 import com.ytpm.app.model.YtDyzUser;
 import com.ytpm.app.param.WxLoginParam;

+ 1 - 1
yt-app/app-service/src/main/java/com/ytpm/service/QuestionService.java → yt-app/app-service/src/main/java/com/ytpm/service/dyz/QuestionService.java

@@ -1,4 +1,4 @@
-package com.ytpm.service;
+package com.ytpm.service.dyz;
 
 import com.ytpm.app.param.AnswerRecordParam;
 import com.ytpm.app.view.QuestionListView;

+ 4 - 5
yt-app/app-service/src/main/java/com/ytpm/service/impl/AdServiceImpl.java → yt-app/app-service/src/main/java/com/ytpm/service/dyz/impl/AdServiceImpl.java

@@ -1,4 +1,4 @@
-package com.ytpm.service.impl;
+package com.ytpm.service.dyz.impl;
 
 import cn.hutool.core.util.IdUtil;
 import com.ytpm.advertise.enums.AdPlatformTypeEnum;
@@ -7,8 +7,8 @@ import com.ytpm.agent.enums.UserStatusEnum;
 import com.ytpm.app.model.YtDyzAdRecord;
 import com.ytpm.app.model.YtDyzUser;
 import com.ytpm.app.param.DyzAdRecordParam;
-import com.ytpm.dao.AdRecordMapper;
-import com.ytpm.dao.AppUserMapper;
+import com.ytpm.dao.dyz.AdRecordMapper;
+import com.ytpm.dao.dyz.AppUserMapper;
 import com.ytpm.feign.RiskFeign;
 import com.ytpm.general.RepMessage;
 import com.ytpm.general.Result;
@@ -18,7 +18,7 @@ import com.ytpm.middle.view.AppRankingListVO;
 import com.ytpm.middle.view.DashboardRankingListVO;
 import com.ytpm.middle.view.DashboardRevenueVO;
 import com.ytpm.middle.view.UserRankingListVO;
-import com.ytpm.service.AdService;
+import com.ytpm.service.dyz.AdService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -85,7 +85,6 @@ public class AdServiceImpl implements AdService {
 
     /**
      * 查询排行榜信息
-     * TODO 查询效率过低 需要分库分表处理
      */
     @Override
     public DashboardRankingListVO queryRankingList(Integer sortBy,Integer limit) {

+ 5 - 5
yt-app/app-service/src/main/java/com/ytpm/service/impl/AppUserServiceImpl.java → yt-app/app-service/src/main/java/com/ytpm/service/dyz/impl/AppUserServiceImpl.java

@@ -1,4 +1,4 @@
-package com.ytpm.service.impl;
+package com.ytpm.service.dyz.impl;
 
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
@@ -8,12 +8,12 @@ import com.ytpm.app.param.WxLoginParam;
 import com.ytpm.app.view.WxLoginResult;
 import com.ytpm.app.view.WxUserInfo;
 import com.ytpm.constant.StrConstant;
-import com.ytpm.dao.AppUserMapper;
 import com.ytpm.app.model.YtDyzUser;
-import com.ytpm.dao.LoginRecordMapper;
-import com.ytpm.dao.QuestionMapper;
+import com.ytpm.dao.dyz.AppUserMapper;
+import com.ytpm.dao.dyz.LoginRecordMapper;
+import com.ytpm.dao.dyz.QuestionMapper;
 import com.ytpm.handle.CustomerException;
-import com.ytpm.service.AppUserService;
+import com.ytpm.service.dyz.AppUserService;
 import com.ytpm.util.RedisService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;

+ 4 - 4
yt-app/app-service/src/main/java/com/ytpm/service/impl/QuestionServiceImpl.java → yt-app/app-service/src/main/java/com/ytpm/service/dyz/impl/QuestionServiceImpl.java

@@ -1,4 +1,4 @@
-package com.ytpm.service.impl;
+package com.ytpm.service.dyz.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.IdUtil;
@@ -8,14 +8,14 @@ import com.ytpm.app.model.YtDyzAnswerRecord;
 import com.ytpm.app.model.YtDyzUser;
 import com.ytpm.app.param.AnswerRecordParam;
 import com.ytpm.app.view.QuestionListView;
-import com.ytpm.dao.AppUserMapper;
-import com.ytpm.dao.QuestionMapper;
+import com.ytpm.dao.dyz.AppUserMapper;
+import com.ytpm.dao.dyz.QuestionMapper;
 import com.ytpm.general.RepMessage;
 import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
 import com.ytpm.app.model.YtDyzPowerRecord;
 import com.ytpm.general.StatusCode;
-import com.ytpm.service.QuestionService;
+import com.ytpm.service.dyz.QuestionService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 

+ 30 - 0
yt-app/app-service/src/main/java/com/ytpm/service/nofeeds/NfAdService.java

@@ -0,0 +1,30 @@
+package com.ytpm.service.nofeeds;
+
+import com.ytpm.app.param.DyzAdRecordParam;
+import com.ytpm.general.Result;
+import com.ytpm.middle.view.DashboardRankingListVO;
+import com.ytpm.middle.view.DashboardRevenueVO;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+public interface NfAdService {
+    /**
+     * 保存广告记录
+     */
+    Result<?> saveRecord(DyzAdRecordParam param);
+
+    /**
+     * 根据应用查询广告数量
+     */
+    Map<String, BigDecimal> getAdCount(String appIds);
+
+    /**
+     * 查询排行榜信息
+     */
+    DashboardRankingListVO queryRankingList(Integer sortBy, Integer limit);
+    /**
+     * 查询各渠道应用收益分时统计
+     */
+    DashboardRevenueVO revenueStatics(String apkIds);
+}

+ 17 - 0
yt-app/app-service/src/main/java/com/ytpm/service/nofeeds/NfQuestionService.java

@@ -0,0 +1,17 @@
+package com.ytpm.service.nofeeds;
+
+import com.ytpm.app.param.AnswerRecordParam;
+import com.ytpm.app.view.QuestionListView;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+
+public interface NfQuestionService {
+    /**
+     * 获取题库
+     */
+    ResultTable<QuestionListView> questionList();
+    /**
+     * 回答问题
+     */
+    Result<String> answerQuestion(AnswerRecordParam param);
+}

+ 18 - 0
yt-app/app-service/src/main/java/com/ytpm/service/nofeeds/NfUserService.java

@@ -0,0 +1,18 @@
+package com.ytpm.service.nofeeds;
+
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.WxLoginParam;
+import com.ytpm.app.view.WxLoginResult;
+import com.ytpm.app.view.WxUserInfo;
+
+public interface NfUserService {
+    /**
+     * openid查询用户信息
+     */
+    YtDyzUser selectByOpenid(String openid, Long ditchId);
+
+    /**
+     * 子事务处理用户crud
+     */
+    YtDyzUser crudForNewTrans(WxLoginParam param, WxUserInfo wxUserInfo, WxLoginResult loginResult);
+}

+ 128 - 0
yt-app/app-service/src/main/java/com/ytpm/service/nofeeds/impl/NfAdServiceImpl.java

@@ -0,0 +1,128 @@
+package com.ytpm.service.nofeeds.impl;
+
+import cn.hutool.core.util.IdUtil;
+import com.ytpm.advertise.enums.AdPlatformTypeEnum;
+import com.ytpm.advertise.enums.AdSourceTypeEnum;
+import com.ytpm.agent.enums.UserStatusEnum;
+import com.ytpm.app.model.YtDyzAdRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.DyzAdRecordParam;
+import com.ytpm.dao.nofeeds.NFAdRecordMapper;
+import com.ytpm.dao.nofeeds.NFUserMapper;
+import com.ytpm.feign.RiskFeign;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
+import com.ytpm.general.StatusCode;
+import com.ytpm.handle.CustomerException;
+import com.ytpm.middle.view.AppRankingListVO;
+import com.ytpm.middle.view.DashboardRankingListVO;
+import com.ytpm.middle.view.DashboardRevenueVO;
+import com.ytpm.middle.view.UserRankingListVO;
+import com.ytpm.service.nofeeds.NfAdService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.CountDownLatch;
+
+@Service
+public class NfAdServiceImpl implements NfAdService {
+    @Autowired
+    private NFAdRecordMapper adRecordMapper;
+    @Autowired
+    private NFUserMapper appUserMapper;
+    @Qualifier("com.ytpm.feign.RiskFeign")
+    @Autowired
+    private RiskFeign riskFeign;
+
+    /**
+     * 保存广告记录
+     */
+    @Override
+    @Transactional
+    public Result<?> saveRecord(DyzAdRecordParam param) {
+        YtDyzUser user = appUserMapper.selectPrimaryKey(param.getUserId());
+        if(Objects.isNull(user)){
+            return Result.resultOk(RepMessage.SAVE_SUCCESS);
+        }
+        if(!UserStatusEnum.NORMAL.getCode().equals(user.getUserStatus())){
+            return new Result<>(StatusCode.ACCESS_ERR,"当前用户处于风控中");
+        }
+        saveRecordAndChangeUser(param, user);
+        //调用风控广告校验
+        if(AdSourceTypeEnum.rewarded_video.getAdSourceType() == param.getAdSourceType()){
+            Result<?> result = riskFeign.checkAdRisk(user);
+            if(result.getCode()!=200){
+                throw new CustomerException(result.getMessage());
+            }
+        }
+        return Result.resultOk(RepMessage.SAVE_SUCCESS);
+    }
+
+    /**
+     * 根据应用查询广告数量
+     */
+    @Override
+    public Map<String, BigDecimal> getAdCount(String appIds) {
+        Map<String, BigDecimal> map = new HashMap<>();
+        //查询这些app的用户统计广告数量相加
+        int adCount = appUserMapper.getAdCount(appIds);
+        BigDecimal total = appUserMapper.getRevenueCount(appIds);
+        map.put("adCount", BigDecimal.valueOf(adCount));
+        map.put("expectRevenue", total);
+        return map;
+    }
+
+    /**
+     * 查询排行榜信息
+     */
+    @Override
+    public DashboardRankingListVO queryRankingList(Integer sortBy, Integer limit) {
+        //查询前五个应用名称 当日收益  用户数量
+        List<AppRankingListVO> appRankingList = appUserMapper.getAppRanking(sortBy,limit);
+        //查询前五个用户  所属应用  视频数 总收益 ecpm
+        List<UserRankingListVO> userRankingList = appUserMapper.getUserRanking(sortBy,limit);
+        return new DashboardRankingListVO(appRankingList,userRankingList);
+    }
+
+    /**
+     *  TODO 查询各渠道应用收益分时统计
+     */
+    @Override
+    public DashboardRevenueVO revenueStatics(String apkIds) {
+        //查询出各应用的用户及收益数据
+        List<String> appIdList = Arrays.asList(apkIds.split(","));
+        // 由于子表数据庞大导致range查询低于const
+        CountDownLatch countDownLatch = new CountDownLatch(appIdList.size());
+        return null;
+    }
+
+    /**
+     * 保存记录
+     *  始终创建新的事务以保障子方法的独立事务
+     */
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
+    public void saveRecordAndChangeUser(DyzAdRecordParam param,YtDyzUser user) {
+        //增加广告记录
+        YtDyzAdRecord adRecord = new YtDyzAdRecord();
+        BeanUtils.copyProperties(param, adRecord);
+        adRecord.setRecordId(IdUtil.fastSimpleUUID());
+        adRecord.setNetworkName(AdPlatformTypeEnum.getDesc(Integer.parseInt(param.getNetworkFormId())));
+        adRecordMapper.addOne(adRecord);
+        //修改用户信息, 广告次数+1  总收益 + revenue
+        YtDyzUser dyzUser = new YtDyzUser();
+        dyzUser.setUserId(user.getUserId());
+        dyzUser.setTotalVideo(Objects.isNull(user.getTotalVideo())?1:(user.getTotalVideo()+1));
+        dyzUser.setTotalIncome(user.getTotalIncome().add(param.getRevenue()));
+        appUserMapper.updateUser(dyzUser);
+    }
+}

+ 69 - 0
yt-app/app-service/src/main/java/com/ytpm/service/nofeeds/impl/NfQuestionServiceImpl.java

@@ -0,0 +1,69 @@
+package com.ytpm.service.nofeeds.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.IdUtil;
+import com.github.pagehelper.PageInfo;
+import com.ytpm.agent.enums.UserStatusEnum;
+import com.ytpm.app.model.YtDyzAnswerRecord;
+import com.ytpm.app.model.YtDyzPowerRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.AnswerRecordParam;
+import com.ytpm.app.view.QuestionListView;
+import com.ytpm.dao.nofeeds.NFQuestionMapper;
+import com.ytpm.dao.nofeeds.NFUserMapper;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import com.ytpm.general.StatusCode;
+import com.ytpm.service.nofeeds.NfQuestionService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.Objects;
+
+@Service
+public class NfQuestionServiceImpl implements NfQuestionService {
+
+    @Resource
+    private NFQuestionMapper nfquestionMapper;
+    @Resource
+    private NFUserMapper nfUserMapper;
+
+    /**
+     * 获取题库
+     */
+    @Override
+    public ResultTable<QuestionListView> questionList() {
+        return ResultTable.resultTableOk(new PageInfo<QuestionListView>(nfquestionMapper.questionList("AP_202505210009")));
+    }
+    /**
+     * 回答问题
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result<String> answerQuestion(AnswerRecordParam param) {
+        YtDyzUser user = nfUserMapper.selectPrimaryKey(param.getUserId());
+        if(Objects.isNull(user)){
+            return Result.resultOk(RepMessage.TOKEN_EXPIRE);
+        }
+        if(!UserStatusEnum.NORMAL.getCode().equals(user.getUserStatus())){
+            return new Result<>(StatusCode.ACCESS_ERR,"当前用户处于风控中");
+        }
+        YtDyzAnswerRecord record = new YtDyzAnswerRecord();
+        BeanUtil.copyProperties(param,record);
+        record.setRecordId(IdUtil.fastSimpleUUID());
+        record.setAnswerTime(new Date());
+        nfquestionMapper.saveAnswerRecord(record);
+        nfUserMapper.subOnePower(param.getUserId());
+        YtDyzPowerRecord powerRecord = new YtDyzPowerRecord();
+        powerRecord.setUserId(param.getUserId());
+        powerRecord.setRecordId(IdUtil.fastSimpleUUID());
+        powerRecord.setAddTime(new Date());
+        powerRecord.setType(1);
+        powerRecord.setRemark("减少体力");
+        nfUserMapper.addPowerRecord(powerRecord);
+        return Result.resultOk(RepMessage.SAVE_SUCCESS);
+    }
+}

+ 145 - 0
yt-app/app-service/src/main/java/com/ytpm/service/nofeeds/impl/NfUserServiceImpl.java

@@ -0,0 +1,145 @@
+package com.ytpm.service.nofeeds.impl;
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import com.ytpm.agent.enums.UserStatusEnum;
+import com.ytpm.app.model.YtDyzLoginRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.WxLoginParam;
+import com.ytpm.app.view.WxLoginResult;
+import com.ytpm.app.view.WxUserInfo;
+import com.ytpm.constant.StrConstant;
+import com.ytpm.dao.nofeeds.NFLoginRecordMapper;
+import com.ytpm.dao.nofeeds.NFQuestionMapper;
+import com.ytpm.dao.nofeeds.NFUserMapper;
+import com.ytpm.handle.CustomerException;
+import com.ytpm.service.nofeeds.NfUserService;
+import com.ytpm.util.RedisService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Objects;
+
+@Service
+public class NfUserServiceImpl implements NfUserService {
+    @Resource
+    private NFUserMapper nfUserMapper;
+    @Resource
+    private NFLoginRecordMapper nfloginRecordMapper;
+    @Resource
+    private NFQuestionMapper nfquestionMapper;
+    @Resource
+    private RedisService redisService;
+
+    /**
+     * openid查询用户信息
+     */
+    @Override
+    public YtDyzUser selectByOpenid(String openid, Long ditchId) {
+        return nfUserMapper.getYtAppUser(openid,ditchId);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
+    public YtDyzUser crudForNewTrans(WxLoginParam param, WxUserInfo wxUserInfo, WxLoginResult loginResult) {
+        //处理用户注册或登录更新信息
+        YtDyzUser old = nfUserMapper.getYtAppUser(loginResult.getOpenid(), param.getDitchId());
+        if(Objects.isNull(old)) {
+            old = new YtDyzUser();
+            registryUser(param,wxUserInfo,loginResult, old);
+        }else{
+            deadWithUserCrud(old,wxUserInfo,param);
+        }
+        //设置最后一次答题问题ID、今日答题数、历史答题数
+        setExtInfo(old,wxUserInfo.getHeadimgurl());
+        // 添加用户登录记录
+        addLoginRecord(param,old.getUserId());
+        return old;
+    }
+    /**
+     * 设置扩展信息
+     */
+    private void setExtInfo(YtDyzUser old, String headimgurl) {
+        old.setHeadImg(headimgurl);
+        old.setLastQuestionId(nfquestionMapper.getLastQuestionId(old.getUserId()));
+        old.setTodayAnswerCount(nfquestionMapper.getAnswerCount(old.getUserId(),1));
+        old.setHistoryAnswerCount(nfquestionMapper.getAnswerCount(old.getUserId(),2));
+        old.setAnswerRecordList(nfquestionMapper.getAnswerRecords(old.getUserId()));
+        old.setLoginRecordList(nfloginRecordMapper.getLoginRecords(old.getUserId()));
+    }
+
+    /**
+     * 增加用户登录记录
+     */
+    private void addLoginRecord(WxLoginParam param,String userId) {
+        YtDyzLoginRecord loginRecord = new YtDyzLoginRecord();
+        loginRecord.setRecordId(IdUtil.fastSimpleUUID());
+        loginRecord.setUserId(userId);
+        loginRecord.setLoginTime(new Date());
+        loginRecord.setDeviceBrand(param.getBrand());
+        loginRecord.setDeviceModel(param.getModel());
+        loginRecord.setLoginIp(param.getLoginIp());
+        loginRecord.setOperator(param.getIpOperator());
+        loginRecord.setIpAddr(param.getIpLocation());
+        nfloginRecordMapper.insertOne(loginRecord);
+    }
+
+    /**
+     * 处理用户数据
+     */
+    private void deadWithUserCrud(YtDyzUser old, WxUserInfo wxUserInfo, WxLoginParam param) {
+        //处于风控状态的用户不允许登录
+        if(!old.getUserStatus().equals(UserStatusEnum.NORMAL.getCode())){
+            throw new CustomerException("当前用户处于"+UserStatusEnum.getByCode(old.getUserStatus())+"中,无法登录");
+        }
+        YtDyzUser newUser = new YtDyzUser();
+        newUser.setUserId(old.getUserId());
+        newUser.setNickName(wxUserInfo.getNickname());
+        newUser.setHeadImg(wxUserInfo.getHeadimgurl());
+        newUser.setLastLoginTime(new Date());
+        newUser.setLastLoginIp(param.getLoginIp());
+        newUser.setPhone(param.getPhone());
+        newUser.setDeviceId(param.getDeviceId());
+        newUser.setLoginDays(old.getLoginDays()+1);
+        nfUserMapper.updateUser(newUser);
+    }
+
+
+
+    /**
+     * 注册用户
+     */
+    private void registryUser(WxLoginParam param,WxUserInfo wxUserInfo,WxLoginResult loginResult, YtDyzUser old) {
+        old.setUserId(redisService.getAppUserId());
+        old.setPhone(param.getPhone());
+        old.setDeviceId(param.getDeviceId());
+        old.setNickName(wxUserInfo.getNickname());
+        old.setLastLoginTime(new Date());
+        old.setRegistryTime(new Date());
+        old.setLastLoginIp(param.getLoginIp());
+        old.setLoginDays(1);
+        old.setPower(0);
+        old.setTotalVideo(0);
+        old.setTotalIncome(BigDecimal.ZERO);
+        old.setRedPacketAmount(BigDecimal.ZERO);
+        old.setRedPacketBalance(BigDecimal.ZERO);
+        old.setPointsBalance(BigDecimal.ZERO);
+        old.setPointsTotal(BigDecimal.ZERO);
+        old.setWithdrawTotal(BigDecimal.ZERO);
+        old.setDitchId(param.getDitchId());
+        old.setSignDays(0);
+        old.setAppId(param.getAppId());
+        old.setUserStatus(UserStatusEnum.NORMAL.getCode());
+        old.setWxOpenId(loginResult.getOpenid());
+        old.setHeadImg(wxUserInfo.getHeadimgurl());
+        //根据设备ID获取平台ID 获取不到再生成平台ID
+        String platformId = nfUserMapper.getByDeviceId(param.getDeviceId(),wxUserInfo.getOpenid());
+        old.setPlatformId(StrUtil.isBlank(platformId)?
+                (StrConstant.PLATFORM_ID_PREFIX + IdUtil.getSnowflakeNextIdStr()):platformId);
+        nfUserMapper.addOne(old);
+    }
+}

+ 30 - 0
yt-app/app-service/src/main/java/com/ytpm/service/qnjz/QnAdService.java

@@ -0,0 +1,30 @@
+package com.ytpm.service.qnjz;
+
+import com.ytpm.app.param.DyzAdRecordParam;
+import com.ytpm.general.Result;
+import com.ytpm.middle.view.DashboardRankingListVO;
+import com.ytpm.middle.view.DashboardRevenueVO;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+public interface QnAdService {
+    /**
+     * 保存广告记录
+     */
+    Result<?> saveRecord(DyzAdRecordParam param);
+
+    /**
+     * 根据应用查询广告数量
+     */
+    Map<String, BigDecimal> getAdCount(String appIds);
+
+    /**
+     * 查询排行榜信息
+     */
+    DashboardRankingListVO queryRankingList(Integer sortBy, Integer limit);
+    /**
+     * 查询各渠道应用收益分时统计
+     */
+    DashboardRevenueVO revenueStatics(String apkIds);
+}

+ 17 - 0
yt-app/app-service/src/main/java/com/ytpm/service/qnjz/QnQuestionService.java

@@ -0,0 +1,17 @@
+package com.ytpm.service.qnjz;
+
+import com.ytpm.app.param.AnswerRecordParam;
+import com.ytpm.app.view.QuestionListView;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+
+public interface QnQuestionService {
+    /**
+     * 获取题库
+     */
+    ResultTable<QuestionListView> questionList();
+    /**
+     * 回答问题
+     */
+    Result<String> answerQuestion(AnswerRecordParam param);
+}

+ 18 - 0
yt-app/app-service/src/main/java/com/ytpm/service/qnjz/QnUserService.java

@@ -0,0 +1,18 @@
+package com.ytpm.service.qnjz;
+
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.WxLoginParam;
+import com.ytpm.app.view.WxLoginResult;
+import com.ytpm.app.view.WxUserInfo;
+
+public interface QnUserService {
+    /**
+     * openid查询用户信息
+     */
+    YtDyzUser selectByOpenid(String openid, Long ditchId);
+
+    /**
+     * 子事务处理用户crud
+     */
+    YtDyzUser crudForNewTrans(WxLoginParam param, WxUserInfo wxUserInfo, WxLoginResult loginResult);
+}

+ 128 - 0
yt-app/app-service/src/main/java/com/ytpm/service/qnjz/impl/QnAdServiceImpl.java

@@ -0,0 +1,128 @@
+package com.ytpm.service.qnjz.impl;
+
+import cn.hutool.core.util.IdUtil;
+import com.ytpm.advertise.enums.AdPlatformTypeEnum;
+import com.ytpm.advertise.enums.AdSourceTypeEnum;
+import com.ytpm.agent.enums.UserStatusEnum;
+import com.ytpm.app.model.YtDyzAdRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.DyzAdRecordParam;
+import com.ytpm.dao.qnjz.QNAdRecordMapper;
+import com.ytpm.dao.qnjz.QNUserMapper;
+import com.ytpm.feign.RiskFeign;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
+import com.ytpm.general.StatusCode;
+import com.ytpm.handle.CustomerException;
+import com.ytpm.middle.view.AppRankingListVO;
+import com.ytpm.middle.view.DashboardRankingListVO;
+import com.ytpm.middle.view.DashboardRevenueVO;
+import com.ytpm.middle.view.UserRankingListVO;
+import com.ytpm.service.qnjz.QnAdService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.CountDownLatch;
+
+@Service
+public class QnAdServiceImpl implements QnAdService {
+    @Autowired
+    private QNAdRecordMapper adRecordMapper;
+    @Autowired
+    private QNUserMapper qnUserMapper;
+    @Qualifier("com.ytpm.feign.RiskFeign")
+    @Autowired
+    private RiskFeign riskFeign;
+
+    /**
+     * 保存广告记录
+     */
+    @Override
+    @Transactional
+    public Result<?> saveRecord(DyzAdRecordParam param) {
+        YtDyzUser user = qnUserMapper.selectPrimaryKey(param.getUserId());
+        if(Objects.isNull(user)){
+            return Result.resultOk(RepMessage.SAVE_SUCCESS);
+        }
+        if(!UserStatusEnum.NORMAL.getCode().equals(user.getUserStatus())){
+            return new Result<>(StatusCode.ACCESS_ERR,"当前用户处于风控中");
+        }
+        saveRecordAndChangeUser(param, user);
+        //调用风控广告校验
+        if(AdSourceTypeEnum.rewarded_video.getAdSourceType() == param.getAdSourceType()){
+            Result<?> result = riskFeign.checkAdRisk(user);
+            if(result.getCode()!=200){
+                throw new CustomerException(result.getMessage());
+            }
+        }
+        return Result.resultOk(RepMessage.SAVE_SUCCESS);
+    }
+
+    /**
+     * 根据应用查询广告数量
+     */
+    @Override
+    public Map<String, BigDecimal> getAdCount(String appIds) {
+        Map<String, BigDecimal> map = new HashMap<>();
+        //查询这些app的用户统计广告数量相加
+        int adCount = qnUserMapper.getAdCount(appIds);
+        BigDecimal total = qnUserMapper.getRevenueCount(appIds);
+        map.put("adCount", BigDecimal.valueOf(adCount));
+        map.put("expectRevenue", total);
+        return map;
+    }
+
+    /**
+     * 查询排行榜信息
+     */
+    @Override
+    public DashboardRankingListVO queryRankingList(Integer sortBy, Integer limit) {
+        //查询前五个应用名称 当日收益  用户数量
+        List<AppRankingListVO> appRankingList = qnUserMapper.getAppRanking(sortBy,limit);
+        //查询前五个用户  所属应用  视频数 总收益 ecpm
+        List<UserRankingListVO> userRankingList = qnUserMapper.getUserRanking(sortBy,limit);
+        return new DashboardRankingListVO(appRankingList,userRankingList);
+    }
+
+    /**
+     *  TODO 查询各渠道应用收益分时统计
+     */
+    @Override
+    public DashboardRevenueVO revenueStatics(String apkIds) {
+        //查询出各应用的用户及收益数据
+        List<String> appIdList = Arrays.asList(apkIds.split(","));
+        // 由于子表数据庞大导致range查询低于const
+        CountDownLatch countDownLatch = new CountDownLatch(appIdList.size());
+        return null;
+    }
+
+    /**
+     * 保存记录
+     *  始终创建新的事务以保障子方法的独立事务
+     */
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
+    public void saveRecordAndChangeUser(DyzAdRecordParam param,YtDyzUser user) {
+        //增加广告记录
+        YtDyzAdRecord adRecord = new YtDyzAdRecord();
+        BeanUtils.copyProperties(param, adRecord);
+        adRecord.setRecordId(IdUtil.fastSimpleUUID());
+        adRecord.setNetworkName(AdPlatformTypeEnum.getDesc(Integer.parseInt(param.getNetworkFormId())));
+        adRecordMapper.addOne(adRecord);
+        //修改用户信息, 广告次数+1  总收益 + revenue
+        YtDyzUser dyzUser = new YtDyzUser();
+        dyzUser.setUserId(user.getUserId());
+        dyzUser.setTotalVideo(Objects.isNull(user.getTotalVideo())?1:(user.getTotalVideo()+1));
+        dyzUser.setTotalIncome(user.getTotalIncome().add(param.getRevenue()));
+        qnUserMapper.updateUser(dyzUser);
+    }
+}

+ 70 - 0
yt-app/app-service/src/main/java/com/ytpm/service/qnjz/impl/QnQuestionServiceImpl.java

@@ -0,0 +1,70 @@
+package com.ytpm.service.qnjz.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.IdUtil;
+import com.github.pagehelper.PageInfo;
+import com.ytpm.agent.enums.UserStatusEnum;
+import com.ytpm.app.model.YtDyzAnswerRecord;
+import com.ytpm.app.model.YtDyzPowerRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.AnswerRecordParam;
+import com.ytpm.app.view.QuestionListView;
+import com.ytpm.dao.qnjz.QNQuestionMapper;
+import com.ytpm.dao.qnjz.QNUserMapper;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import com.ytpm.general.StatusCode;
+import com.ytpm.service.qnjz.QnQuestionService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.Objects;
+
+@Service
+public class QnQuestionServiceImpl implements QnQuestionService {
+
+
+    @Resource
+    private QNQuestionMapper qnquestionMapper;
+    @Resource
+    private QNUserMapper qnUserMapper;
+
+    /**
+     * 获取题库
+     */
+    @Override
+    public ResultTable<QuestionListView> questionList() {
+        return ResultTable.resultTableOk(new PageInfo<QuestionListView>(qnquestionMapper.questionList("AP_202505210009")));
+    }
+    /**
+     * 回答问题
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result<String> answerQuestion(AnswerRecordParam param) {
+        YtDyzUser user = qnUserMapper.selectPrimaryKey(param.getUserId());
+        if(Objects.isNull(user)){
+            return Result.resultOk(RepMessage.TOKEN_EXPIRE);
+        }
+        if(!UserStatusEnum.NORMAL.getCode().equals(user.getUserStatus())){
+            return new Result<>(StatusCode.ACCESS_ERR,"当前用户处于风控中");
+        }
+        YtDyzAnswerRecord record = new YtDyzAnswerRecord();
+        BeanUtil.copyProperties(param,record);
+        record.setRecordId(IdUtil.fastSimpleUUID());
+        record.setAnswerTime(new Date());
+        qnquestionMapper.saveAnswerRecord(record);
+        qnUserMapper.subOnePower(param.getUserId());
+        YtDyzPowerRecord powerRecord = new YtDyzPowerRecord();
+        powerRecord.setUserId(param.getUserId());
+        powerRecord.setRecordId(IdUtil.fastSimpleUUID());
+        powerRecord.setAddTime(new Date());
+        powerRecord.setType(1);
+        powerRecord.setRemark("减少体力");
+        qnUserMapper.addPowerRecord(powerRecord);
+        return Result.resultOk(RepMessage.SAVE_SUCCESS);
+    }
+}

+ 145 - 0
yt-app/app-service/src/main/java/com/ytpm/service/qnjz/impl/QnUserServiceImpl.java

@@ -0,0 +1,145 @@
+package com.ytpm.service.qnjz.impl;
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import com.ytpm.agent.enums.UserStatusEnum;
+import com.ytpm.app.model.YtDyzLoginRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.WxLoginParam;
+import com.ytpm.app.view.WxLoginResult;
+import com.ytpm.app.view.WxUserInfo;
+import com.ytpm.constant.StrConstant;
+import com.ytpm.dao.qnjz.QNLoginRecordMapper;
+import com.ytpm.dao.qnjz.QNQuestionMapper;
+import com.ytpm.dao.qnjz.QNUserMapper;
+import com.ytpm.handle.CustomerException;
+import com.ytpm.service.qnjz.QnUserService;
+import com.ytpm.util.RedisService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Objects;
+
+@Service
+public class QnUserServiceImpl implements QnUserService {
+    @Resource
+    private QNUserMapper qnUserMapper;
+    @Resource
+    private QNLoginRecordMapper qnLoginRecordMapper;
+    @Resource
+    private QNQuestionMapper qnQuestionMapper;
+    @Resource
+    private RedisService redisService;
+
+    /**
+     * openid查询用户信息
+     */
+    @Override
+    public YtDyzUser selectByOpenid(String openid, Long ditchId) {
+        return qnUserMapper.getYtAppUser(openid,ditchId);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
+    public YtDyzUser crudForNewTrans(WxLoginParam param, WxUserInfo wxUserInfo, WxLoginResult loginResult) {
+        //处理用户注册或登录更新信息
+        YtDyzUser old = qnUserMapper.getYtAppUser(loginResult.getOpenid(), param.getDitchId());
+        if(Objects.isNull(old)) {
+            old = new YtDyzUser();
+            registryUser(param,wxUserInfo,loginResult, old);
+        }else{
+            deadWithUserCrud(old,wxUserInfo,param);
+        }
+        //设置最后一次答题问题ID、今日答题数、历史答题数
+        setExtInfo(old,wxUserInfo.getHeadimgurl());
+        // 添加用户登录记录
+        addLoginRecord(param,old.getUserId());
+        return old;
+    }
+    /**
+     * 设置扩展信息
+     */
+    private void setExtInfo(YtDyzUser old, String headimgurl) {
+        old.setHeadImg(headimgurl);
+        old.setLastQuestionId(qnQuestionMapper.getLastQuestionId(old.getUserId()));
+        old.setTodayAnswerCount(qnQuestionMapper.getAnswerCount(old.getUserId(),1));
+        old.setHistoryAnswerCount(qnQuestionMapper.getAnswerCount(old.getUserId(),2));
+        old.setAnswerRecordList(qnQuestionMapper.getAnswerRecords(old.getUserId()));
+        old.setLoginRecordList(qnLoginRecordMapper.getLoginRecords(old.getUserId()));
+    }
+
+    /**
+     * 增加用户登录记录
+     */
+    private void addLoginRecord(WxLoginParam param,String userId) {
+        YtDyzLoginRecord loginRecord = new YtDyzLoginRecord();
+        loginRecord.setRecordId(IdUtil.fastSimpleUUID());
+        loginRecord.setUserId(userId);
+        loginRecord.setLoginTime(new Date());
+        loginRecord.setDeviceBrand(param.getBrand());
+        loginRecord.setDeviceModel(param.getModel());
+        loginRecord.setLoginIp(param.getLoginIp());
+        loginRecord.setOperator(param.getIpOperator());
+        loginRecord.setIpAddr(param.getIpLocation());
+        qnLoginRecordMapper.insertOne(loginRecord);
+    }
+
+    /**
+     * 处理用户数据
+     */
+    private void deadWithUserCrud(YtDyzUser old, WxUserInfo wxUserInfo, WxLoginParam param) {
+        //处于风控状态的用户不允许登录
+        if(!old.getUserStatus().equals(UserStatusEnum.NORMAL.getCode())){
+            throw new CustomerException("当前用户处于"+UserStatusEnum.getByCode(old.getUserStatus())+"中,无法登录");
+        }
+        YtDyzUser newUser = new YtDyzUser();
+        newUser.setUserId(old.getUserId());
+        newUser.setNickName(wxUserInfo.getNickname());
+        newUser.setHeadImg(wxUserInfo.getHeadimgurl());
+        newUser.setLastLoginTime(new Date());
+        newUser.setLastLoginIp(param.getLoginIp());
+        newUser.setPhone(param.getPhone());
+        newUser.setDeviceId(param.getDeviceId());
+        newUser.setLoginDays(old.getLoginDays()+1);
+        qnUserMapper.updateUser(newUser);
+    }
+
+
+
+    /**
+     * 注册用户
+     */
+    private void registryUser(WxLoginParam param,WxUserInfo wxUserInfo,WxLoginResult loginResult, YtDyzUser old) {
+        old.setUserId(redisService.getAppUserId());
+        old.setPhone(param.getPhone());
+        old.setDeviceId(param.getDeviceId());
+        old.setNickName(wxUserInfo.getNickname());
+        old.setLastLoginTime(new Date());
+        old.setRegistryTime(new Date());
+        old.setLastLoginIp(param.getLoginIp());
+        old.setLoginDays(1);
+        old.setPower(0);
+        old.setTotalVideo(0);
+        old.setTotalIncome(BigDecimal.ZERO);
+        old.setRedPacketAmount(BigDecimal.ZERO);
+        old.setRedPacketBalance(BigDecimal.ZERO);
+        old.setPointsBalance(BigDecimal.ZERO);
+        old.setPointsTotal(BigDecimal.ZERO);
+        old.setWithdrawTotal(BigDecimal.ZERO);
+        old.setDitchId(param.getDitchId());
+        old.setSignDays(0);
+        old.setAppId(param.getAppId());
+        old.setUserStatus(UserStatusEnum.NORMAL.getCode());
+        old.setWxOpenId(loginResult.getOpenid());
+        old.setHeadImg(wxUserInfo.getHeadimgurl());
+        //根据设备ID获取平台ID 获取不到再生成平台ID
+        String platformId = qnUserMapper.getByDeviceId(param.getDeviceId(),wxUserInfo.getOpenid());
+        old.setPlatformId(StrUtil.isBlank(platformId)?
+                (StrConstant.PLATFORM_ID_PREFIX + IdUtil.getSnowflakeNextIdStr()):platformId);
+        qnUserMapper.addOne(old);
+    }
+}

+ 30 - 0
yt-app/app-service/src/main/java/com/ytpm/service/qnmjz/QnmAdService.java

@@ -0,0 +1,30 @@
+package com.ytpm.service.qnmjz;
+
+import com.ytpm.app.param.DyzAdRecordParam;
+import com.ytpm.general.Result;
+import com.ytpm.middle.view.DashboardRankingListVO;
+import com.ytpm.middle.view.DashboardRevenueVO;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+public interface QnmAdService {
+    /**
+     * 保存广告记录
+     */
+    Result<?> saveRecord(DyzAdRecordParam param);
+
+    /**
+     * 根据应用查询广告数量
+     */
+    Map<String, BigDecimal> getAdCount(String appIds);
+
+    /**
+     * 查询排行榜信息
+     */
+    DashboardRankingListVO queryRankingList(Integer sortBy, Integer limit);
+    /**
+     * 查询各渠道应用收益分时统计
+     */
+    DashboardRevenueVO revenueStatics(String apkIds);
+}

+ 17 - 0
yt-app/app-service/src/main/java/com/ytpm/service/qnmjz/QnmQuestionService.java

@@ -0,0 +1,17 @@
+package com.ytpm.service.qnmjz;
+
+import com.ytpm.app.param.AnswerRecordParam;
+import com.ytpm.app.view.QuestionListView;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+
+public interface QnmQuestionService {
+    /**
+     * 获取题库
+     */
+    ResultTable<QuestionListView> questionList();
+    /**
+     * 回答问题
+     */
+    Result<String> answerQuestion(AnswerRecordParam param);
+}

+ 18 - 0
yt-app/app-service/src/main/java/com/ytpm/service/qnmjz/QnmUserService.java

@@ -0,0 +1,18 @@
+package com.ytpm.service.qnmjz;
+
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.WxLoginParam;
+import com.ytpm.app.view.WxLoginResult;
+import com.ytpm.app.view.WxUserInfo;
+
+public interface QnmUserService {
+    /**
+     * openid查询用户信息
+     */
+    YtDyzUser selectByOpenid(String openid, Long ditchId);
+
+    /**
+     * 子事务处理用户crud
+     */
+    YtDyzUser crudForNewTrans(WxLoginParam param, WxUserInfo wxUserInfo, WxLoginResult loginResult);
+}

+ 128 - 0
yt-app/app-service/src/main/java/com/ytpm/service/qnmjz/impl/QnmAdServiceImpl.java

@@ -0,0 +1,128 @@
+package com.ytpm.service.qnmjz.impl;
+
+import cn.hutool.core.util.IdUtil;
+import com.ytpm.advertise.enums.AdPlatformTypeEnum;
+import com.ytpm.advertise.enums.AdSourceTypeEnum;
+import com.ytpm.agent.enums.UserStatusEnum;
+import com.ytpm.app.model.YtDyzAdRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.DyzAdRecordParam;
+import com.ytpm.dao.qnmjz.QnmAdRecordMapper;
+import com.ytpm.dao.qnmjz.QnmUserMapper;
+import com.ytpm.feign.RiskFeign;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
+import com.ytpm.general.StatusCode;
+import com.ytpm.handle.CustomerException;
+import com.ytpm.middle.view.AppRankingListVO;
+import com.ytpm.middle.view.DashboardRankingListVO;
+import com.ytpm.middle.view.DashboardRevenueVO;
+import com.ytpm.middle.view.UserRankingListVO;
+import com.ytpm.service.qnmjz.QnmAdService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.CountDownLatch;
+
+@Service
+public class QnmAdServiceImpl implements QnmAdService {
+    @Autowired
+    private QnmAdRecordMapper qnmAdRecordMapper;
+    @Autowired
+    private QnmUserMapper qnmUserMapper;
+    @Qualifier("com.ytpm.feign.RiskFeign")
+    @Autowired
+    private RiskFeign riskFeign;
+
+    /**
+     * 保存广告记录
+     */
+    @Override
+    @Transactional
+    public Result<?> saveRecord(DyzAdRecordParam param) {
+        YtDyzUser user = qnmUserMapper.selectPrimaryKey(param.getUserId());
+        if(Objects.isNull(user)){
+            return Result.resultOk(RepMessage.SAVE_SUCCESS);
+        }
+        if(!UserStatusEnum.NORMAL.getCode().equals(user.getUserStatus())){
+            return new Result<>(StatusCode.ACCESS_ERR,"当前用户处于风控中");
+        }
+        saveRecordAndChangeUser(param, user);
+        //调用风控广告校验
+        if(AdSourceTypeEnum.rewarded_video.getAdSourceType() == param.getAdSourceType()){
+            Result<?> result = riskFeign.checkAdRisk(user);
+            if(result.getCode()!=200){
+                throw new CustomerException(result.getMessage());
+            }
+        }
+        return Result.resultOk(RepMessage.SAVE_SUCCESS);
+    }
+
+    /**
+     * 根据应用查询广告数量
+     */
+    @Override
+    public Map<String, BigDecimal> getAdCount(String appIds) {
+        Map<String, BigDecimal> map = new HashMap<>();
+        //查询这些app的用户统计广告数量相加
+        int adCount = qnmUserMapper.getAdCount(appIds);
+        BigDecimal total = qnmUserMapper.getRevenueCount(appIds);
+        map.put("adCount", BigDecimal.valueOf(adCount));
+        map.put("expectRevenue", total);
+        return map;
+    }
+
+    /**
+     * 查询排行榜信息
+     */
+    @Override
+    public DashboardRankingListVO queryRankingList(Integer sortBy, Integer limit) {
+        //查询前五个应用名称 当日收益  用户数量
+        List<AppRankingListVO> appRankingList = qnmUserMapper.getAppRanking(sortBy,limit);
+        //查询前五个用户  所属应用  视频数 总收益 ecpm
+        List<UserRankingListVO> userRankingList = qnmUserMapper.getUserRanking(sortBy,limit);
+        return new DashboardRankingListVO(appRankingList,userRankingList);
+    }
+
+    /**
+     *  TODO 查询各渠道应用收益分时统计
+     */
+    @Override
+    public DashboardRevenueVO revenueStatics(String apkIds) {
+        //查询出各应用的用户及收益数据
+        List<String> appIdList = Arrays.asList(apkIds.split(","));
+        // 由于子表数据庞大导致range查询低于const
+        CountDownLatch countDownLatch = new CountDownLatch(appIdList.size());
+        return null;
+    }
+
+    /**
+     * 保存记录
+     *  始终创建新的事务以保障子方法的独立事务
+     */
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
+    public void saveRecordAndChangeUser(DyzAdRecordParam param,YtDyzUser user) {
+        //增加广告记录
+        YtDyzAdRecord adRecord = new YtDyzAdRecord();
+        BeanUtils.copyProperties(param, adRecord);
+        adRecord.setRecordId(IdUtil.fastSimpleUUID());
+        adRecord.setNetworkName(AdPlatformTypeEnum.getDesc(Integer.parseInt(param.getNetworkFormId())));
+        qnmAdRecordMapper.addOne(adRecord);
+        //修改用户信息, 广告次数+1  总收益 + revenue
+        YtDyzUser dyzUser = new YtDyzUser();
+        dyzUser.setUserId(user.getUserId());
+        dyzUser.setTotalVideo(Objects.isNull(user.getTotalVideo())?1:(user.getTotalVideo()+1));
+        dyzUser.setTotalIncome(user.getTotalIncome().add(param.getRevenue()));
+        qnmUserMapper.updateUser(dyzUser);
+    }
+}

+ 73 - 0
yt-app/app-service/src/main/java/com/ytpm/service/qnmjz/impl/QnmQuestionServiceImpl.java

@@ -0,0 +1,73 @@
+package com.ytpm.service.qnmjz.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.IdUtil;
+import com.github.pagehelper.PageInfo;
+import com.ytpm.agent.enums.UserStatusEnum;
+import com.ytpm.app.model.YtDyzAnswerRecord;
+import com.ytpm.app.model.YtDyzPowerRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.AnswerRecordParam;
+import com.ytpm.app.view.QuestionListView;
+import com.ytpm.dao.qnjz.QNQuestionMapper;
+import com.ytpm.dao.qnjz.QNUserMapper;
+import com.ytpm.dao.qnmjz.QnmQuestionMapper;
+import com.ytpm.dao.qnmjz.QnmUserMapper;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import com.ytpm.general.StatusCode;
+import com.ytpm.service.qnjz.QnQuestionService;
+import com.ytpm.service.qnmjz.QnmQuestionService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.Objects;
+
+@Service
+public class QnmQuestionServiceImpl implements QnmQuestionService {
+
+
+    @Resource
+    private QnmQuestionMapper qnmquestionMapper;
+    @Resource
+    private QnmUserMapper qnmUserMapper;
+
+    /**
+     * 获取题库
+     */
+    @Override
+    public ResultTable<QuestionListView> questionList() {
+        return ResultTable.resultTableOk(new PageInfo<QuestionListView>(qnmquestionMapper.questionList("AP_202505210009")));
+    }
+    /**
+     * 回答问题
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result<String> answerQuestion(AnswerRecordParam param) {
+        YtDyzUser user = qnmUserMapper.selectPrimaryKey(param.getUserId());
+        if(Objects.isNull(user)){
+            return Result.resultOk(RepMessage.TOKEN_EXPIRE);
+        }
+        if(!UserStatusEnum.NORMAL.getCode().equals(user.getUserStatus())){
+            return new Result<>(StatusCode.ACCESS_ERR,"当前用户处于风控中");
+        }
+        YtDyzAnswerRecord record = new YtDyzAnswerRecord();
+        BeanUtil.copyProperties(param,record);
+        record.setRecordId(IdUtil.fastSimpleUUID());
+        record.setAnswerTime(new Date());
+        qnmquestionMapper.saveAnswerRecord(record);
+        qnmUserMapper.subOnePower(param.getUserId());
+        YtDyzPowerRecord powerRecord = new YtDyzPowerRecord();
+        powerRecord.setUserId(param.getUserId());
+        powerRecord.setRecordId(IdUtil.fastSimpleUUID());
+        powerRecord.setAddTime(new Date());
+        powerRecord.setType(1);
+        powerRecord.setRemark("减少体力");
+        qnmUserMapper.addPowerRecord(powerRecord);
+        return Result.resultOk(RepMessage.SAVE_SUCCESS);
+    }
+}

+ 149 - 0
yt-app/app-service/src/main/java/com/ytpm/service/qnmjz/impl/QnmUserServiceImpl.java

@@ -0,0 +1,149 @@
+package com.ytpm.service.qnmjz.impl;
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import com.ytpm.agent.enums.UserStatusEnum;
+import com.ytpm.app.model.YtDyzLoginRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.WxLoginParam;
+import com.ytpm.app.view.WxLoginResult;
+import com.ytpm.app.view.WxUserInfo;
+import com.ytpm.constant.StrConstant;
+import com.ytpm.dao.qnjz.QNLoginRecordMapper;
+import com.ytpm.dao.qnjz.QNQuestionMapper;
+import com.ytpm.dao.qnjz.QNUserMapper;
+import com.ytpm.dao.qnmjz.QnmLoginRecordMapper;
+import com.ytpm.dao.qnmjz.QnmQuestionMapper;
+import com.ytpm.dao.qnmjz.QnmUserMapper;
+import com.ytpm.handle.CustomerException;
+import com.ytpm.service.qnjz.QnUserService;
+import com.ytpm.service.qnmjz.QnmUserService;
+import com.ytpm.util.RedisService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Objects;
+
+@Service
+public class QnmUserServiceImpl implements QnmUserService {
+    @Resource
+    private QnmUserMapper qnmUserMapper;
+    @Resource
+    private QnmLoginRecordMapper qnmLoginRecordMapper;
+    @Resource
+    private QnmQuestionMapper qnmQuestionMapper;
+    @Resource
+    private RedisService redisService;
+
+    /**
+     * openid查询用户信息
+     */
+    @Override
+    public YtDyzUser selectByOpenid(String openid, Long ditchId) {
+        return qnmUserMapper.getYtAppUser(openid,ditchId);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
+    public YtDyzUser crudForNewTrans(WxLoginParam param, WxUserInfo wxUserInfo, WxLoginResult loginResult) {
+        //处理用户注册或登录更新信息
+        YtDyzUser old = qnmUserMapper.getYtAppUser(loginResult.getOpenid(), param.getDitchId());
+        if(Objects.isNull(old)) {
+            old = new YtDyzUser();
+            registryUser(param,wxUserInfo,loginResult, old);
+        }else{
+            deadWithUserCrud(old,wxUserInfo,param);
+        }
+        //设置最后一次答题问题ID、今日答题数、历史答题数
+        setExtInfo(old,wxUserInfo.getHeadimgurl());
+        // 添加用户登录记录
+        addLoginRecord(param,old.getUserId());
+        return old;
+    }
+    /**
+     * 设置扩展信息
+     */
+    private void setExtInfo(YtDyzUser old, String headimgurl) {
+        old.setHeadImg(headimgurl);
+        old.setLastQuestionId(qnmQuestionMapper.getLastQuestionId(old.getUserId()));
+        old.setTodayAnswerCount(qnmQuestionMapper.getAnswerCount(old.getUserId(),1));
+        old.setHistoryAnswerCount(qnmQuestionMapper.getAnswerCount(old.getUserId(),2));
+        old.setAnswerRecordList(qnmQuestionMapper.getAnswerRecords(old.getUserId()));
+        old.setLoginRecordList(qnmLoginRecordMapper.getLoginRecords(old.getUserId()));
+    }
+
+    /**
+     * 增加用户登录记录
+     */
+    private void addLoginRecord(WxLoginParam param,String userId) {
+        YtDyzLoginRecord loginRecord = new YtDyzLoginRecord();
+        loginRecord.setRecordId(IdUtil.fastSimpleUUID());
+        loginRecord.setUserId(userId);
+        loginRecord.setLoginTime(new Date());
+        loginRecord.setDeviceBrand(param.getBrand());
+        loginRecord.setDeviceModel(param.getModel());
+        loginRecord.setLoginIp(param.getLoginIp());
+        loginRecord.setOperator(param.getIpOperator());
+        loginRecord.setIpAddr(param.getIpLocation());
+        qnmLoginRecordMapper.insertOne(loginRecord);
+    }
+
+    /**
+     * 处理用户数据
+     */
+    private void deadWithUserCrud(YtDyzUser old, WxUserInfo wxUserInfo, WxLoginParam param) {
+        //处于风控状态的用户不允许登录
+        if(!old.getUserStatus().equals(UserStatusEnum.NORMAL.getCode())){
+            throw new CustomerException("当前用户处于"+UserStatusEnum.getByCode(old.getUserStatus())+"中,无法登录");
+        }
+        YtDyzUser newUser = new YtDyzUser();
+        newUser.setUserId(old.getUserId());
+        newUser.setNickName(wxUserInfo.getNickname());
+        newUser.setHeadImg(wxUserInfo.getHeadimgurl());
+        newUser.setLastLoginTime(new Date());
+        newUser.setLastLoginIp(param.getLoginIp());
+        newUser.setPhone(param.getPhone());
+        newUser.setDeviceId(param.getDeviceId());
+        newUser.setLoginDays(old.getLoginDays()+1);
+        qnmUserMapper.updateUser(newUser);
+    }
+
+
+
+    /**
+     * 注册用户
+     */
+    private void registryUser(WxLoginParam param,WxUserInfo wxUserInfo,WxLoginResult loginResult, YtDyzUser old) {
+        old.setUserId(redisService.getAppUserId());
+        old.setPhone(param.getPhone());
+        old.setDeviceId(param.getDeviceId());
+        old.setNickName(wxUserInfo.getNickname());
+        old.setLastLoginTime(new Date());
+        old.setRegistryTime(new Date());
+        old.setLastLoginIp(param.getLoginIp());
+        old.setLoginDays(1);
+        old.setPower(0);
+        old.setTotalVideo(0);
+        old.setTotalIncome(BigDecimal.ZERO);
+        old.setRedPacketAmount(BigDecimal.ZERO);
+        old.setRedPacketBalance(BigDecimal.ZERO);
+        old.setPointsBalance(BigDecimal.ZERO);
+        old.setPointsTotal(BigDecimal.ZERO);
+        old.setWithdrawTotal(BigDecimal.ZERO);
+        old.setDitchId(param.getDitchId());
+        old.setSignDays(0);
+        old.setAppId(param.getAppId());
+        old.setUserStatus(UserStatusEnum.NORMAL.getCode());
+        old.setWxOpenId(loginResult.getOpenid());
+        old.setHeadImg(wxUserInfo.getHeadimgurl());
+        //根据设备ID获取平台ID 获取不到再生成平台ID
+        String platformId = qnmUserMapper.getByDeviceId(param.getDeviceId(),wxUserInfo.getOpenid());
+        old.setPlatformId(StrUtil.isBlank(platformId)?
+                (StrConstant.PLATFORM_ID_PREFIX + IdUtil.getSnowflakeNextIdStr()):platformId);
+        qnmUserMapper.addOne(old);
+    }
+}

+ 30 - 0
yt-app/app-service/src/main/java/com/ytpm/service/xjlrl/XjlrlAdService.java

@@ -0,0 +1,30 @@
+package com.ytpm.service.xjlrl;
+
+import com.ytpm.app.param.DyzAdRecordParam;
+import com.ytpm.general.Result;
+import com.ytpm.middle.view.DashboardRankingListVO;
+import com.ytpm.middle.view.DashboardRevenueVO;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+public interface XjlrlAdService {
+    /**
+     * 保存广告记录
+     */
+    Result<?> saveRecord(DyzAdRecordParam param);
+
+    /**
+     * 根据应用查询广告数量
+     */
+    Map<String, BigDecimal> getAdCount(String appIds);
+
+    /**
+     * 查询排行榜信息
+     */
+    DashboardRankingListVO queryRankingList(Integer sortBy, Integer limit);
+    /**
+     * 查询各渠道应用收益分时统计
+     */
+    DashboardRevenueVO revenueStatics(String apkIds);
+}

+ 17 - 0
yt-app/app-service/src/main/java/com/ytpm/service/xjlrl/XjlrlQuestionService.java

@@ -0,0 +1,17 @@
+package com.ytpm.service.xjlrl;
+
+import com.ytpm.app.param.AnswerRecordParam;
+import com.ytpm.app.view.QuestionListView;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+
+public interface XjlrlQuestionService {
+    /**
+     * 获取题库
+     */
+    ResultTable<QuestionListView> questionList();
+    /**
+     * 回答问题
+     */
+    Result<String> answerQuestion(AnswerRecordParam param);
+}

+ 18 - 0
yt-app/app-service/src/main/java/com/ytpm/service/xjlrl/XjlrlUserService.java

@@ -0,0 +1,18 @@
+package com.ytpm.service.xjlrl;
+
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.WxLoginParam;
+import com.ytpm.app.view.WxLoginResult;
+import com.ytpm.app.view.WxUserInfo;
+
+public interface XjlrlUserService {
+    /**
+     * openid查询用户信息
+     */
+    YtDyzUser selectByOpenid(String openid, Long ditchId);
+
+    /**
+     * 子事务处理用户crud
+     */
+    YtDyzUser crudForNewTrans(WxLoginParam param, WxUserInfo wxUserInfo, WxLoginResult loginResult);
+}

+ 128 - 0
yt-app/app-service/src/main/java/com/ytpm/service/xjlrl/impl/XjlrlAdServiceImpl.java

@@ -0,0 +1,128 @@
+package com.ytpm.service.xjlrl.impl;
+
+import cn.hutool.core.util.IdUtil;
+import com.ytpm.advertise.enums.AdPlatformTypeEnum;
+import com.ytpm.advertise.enums.AdSourceTypeEnum;
+import com.ytpm.agent.enums.UserStatusEnum;
+import com.ytpm.app.model.YtDyzAdRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.DyzAdRecordParam;
+import com.ytpm.dao.xjlrl.XjlrlAdRecordMapper;
+import com.ytpm.dao.xjlrl.XjlrlUserMapper;
+import com.ytpm.feign.RiskFeign;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
+import com.ytpm.general.StatusCode;
+import com.ytpm.handle.CustomerException;
+import com.ytpm.middle.view.AppRankingListVO;
+import com.ytpm.middle.view.DashboardRankingListVO;
+import com.ytpm.middle.view.DashboardRevenueVO;
+import com.ytpm.middle.view.UserRankingListVO;
+import com.ytpm.service.xjlrl.XjlrlAdService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.CountDownLatch;
+
+@Service
+public class XjlrlAdServiceImpl implements XjlrlAdService {
+    @Autowired
+    private XjlrlAdRecordMapper xjlAdRecordMapper;
+    @Autowired
+    private XjlrlUserMapper xjlUserMapper;
+    @Qualifier("com.ytpm.feign.RiskFeign")
+    @Autowired
+    private RiskFeign riskFeign;
+
+    /**
+     * 保存广告记录
+     */
+    @Override
+    @Transactional
+    public Result<?> saveRecord(DyzAdRecordParam param) {
+        YtDyzUser user = xjlUserMapper.selectPrimaryKey(param.getUserId());
+        if(Objects.isNull(user)){
+            return Result.resultOk(RepMessage.SAVE_SUCCESS);
+        }
+        if(!UserStatusEnum.NORMAL.getCode().equals(user.getUserStatus())){
+            return new Result<>(StatusCode.ACCESS_ERR,"当前用户处于风控中");
+        }
+        saveRecordAndChangeUser(param, user);
+        //调用风控广告校验
+        if(AdSourceTypeEnum.rewarded_video.getAdSourceType() == param.getAdSourceType()){
+            Result<?> result = riskFeign.checkAdRisk(user);
+            if(result.getCode()!=200){
+                throw new CustomerException(result.getMessage());
+            }
+        }
+        return Result.resultOk(RepMessage.SAVE_SUCCESS);
+    }
+
+    /**
+     * 根据应用查询广告数量
+     */
+    @Override
+    public Map<String, BigDecimal> getAdCount(String appIds) {
+        Map<String, BigDecimal> map = new HashMap<>();
+        //查询这些app的用户统计广告数量相加
+        int adCount = xjlUserMapper.getAdCount(appIds);
+        BigDecimal total = xjlUserMapper.getRevenueCount(appIds);
+        map.put("adCount", BigDecimal.valueOf(adCount));
+        map.put("expectRevenue", total);
+        return map;
+    }
+
+    /**
+     * 查询排行榜信息
+     */
+    @Override
+    public DashboardRankingListVO queryRankingList(Integer sortBy, Integer limit) {
+        //查询前五个应用名称 当日收益  用户数量
+        List<AppRankingListVO> appRankingList = xjlUserMapper.getAppRanking(sortBy,limit);
+        //查询前五个用户  所属应用  视频数 总收益 ecpm
+        List<UserRankingListVO> userRankingList = xjlUserMapper.getUserRanking(sortBy,limit);
+        return new DashboardRankingListVO(appRankingList,userRankingList);
+    }
+
+    /**
+     *  TODO 查询各渠道应用收益分时统计
+     */
+    @Override
+    public DashboardRevenueVO revenueStatics(String apkIds) {
+        //查询出各应用的用户及收益数据
+        List<String> appIdList = Arrays.asList(apkIds.split(","));
+        // 由于子表数据庞大导致range查询低于const
+        CountDownLatch countDownLatch = new CountDownLatch(appIdList.size());
+        return null;
+    }
+
+    /**
+     * 保存记录
+     *  始终创建新的事务以保障子方法的独立事务
+     */
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
+    public void saveRecordAndChangeUser(DyzAdRecordParam param,YtDyzUser user) {
+        //增加广告记录
+        YtDyzAdRecord adRecord = new YtDyzAdRecord();
+        BeanUtils.copyProperties(param, adRecord);
+        adRecord.setRecordId(IdUtil.fastSimpleUUID());
+        adRecord.setNetworkName(AdPlatformTypeEnum.getDesc(Integer.parseInt(param.getNetworkFormId())));
+        xjlAdRecordMapper.addOne(adRecord);
+        //修改用户信息, 广告次数+1  总收益 + revenue
+        YtDyzUser dyzUser = new YtDyzUser();
+        dyzUser.setUserId(user.getUserId());
+        dyzUser.setTotalVideo(Objects.isNull(user.getTotalVideo())?1:(user.getTotalVideo()+1));
+        dyzUser.setTotalIncome(user.getTotalIncome().add(param.getRevenue()));
+        xjlUserMapper.updateUser(dyzUser);
+    }
+}

+ 70 - 0
yt-app/app-service/src/main/java/com/ytpm/service/xjlrl/impl/XjlrlQuestionServiceImpl.java

@@ -0,0 +1,70 @@
+package com.ytpm.service.xjlrl.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.IdUtil;
+import com.github.pagehelper.PageInfo;
+import com.ytpm.agent.enums.UserStatusEnum;
+import com.ytpm.app.model.YtDyzAnswerRecord;
+import com.ytpm.app.model.YtDyzPowerRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.AnswerRecordParam;
+import com.ytpm.app.view.QuestionListView;
+import com.ytpm.dao.xjlrl.XjlrlQuestionMapper;
+import com.ytpm.dao.xjlrl.XjlrlUserMapper;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import com.ytpm.general.StatusCode;
+import com.ytpm.service.xjlrl.XjlrlQuestionService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.Objects;
+
+@Service
+public class XjlrlQuestionServiceImpl implements XjlrlQuestionService {
+
+
+    @Resource
+    private XjlrlQuestionMapper xjlquestionMapper;
+    @Resource
+    private XjlrlUserMapper xjlUserMapper;
+
+    /**
+     * 获取题库
+     */
+    @Override
+    public ResultTable<QuestionListView> questionList() {
+        return ResultTable.resultTableOk(new PageInfo<QuestionListView>(xjlquestionMapper.questionList("AP_202505210009")));
+    }
+    /**
+     * 回答问题
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result<String> answerQuestion(AnswerRecordParam param) {
+        YtDyzUser user = xjlUserMapper.selectPrimaryKey(param.getUserId());
+        if(Objects.isNull(user)){
+            return Result.resultOk(RepMessage.TOKEN_EXPIRE);
+        }
+        if(!UserStatusEnum.NORMAL.getCode().equals(user.getUserStatus())){
+            return new Result<>(StatusCode.ACCESS_ERR,"当前用户处于风控中");
+        }
+        YtDyzAnswerRecord record = new YtDyzAnswerRecord();
+        BeanUtil.copyProperties(param,record);
+        record.setRecordId(IdUtil.fastSimpleUUID());
+        record.setAnswerTime(new Date());
+        xjlquestionMapper.saveAnswerRecord(record);
+        xjlUserMapper.subOnePower(param.getUserId());
+        YtDyzPowerRecord powerRecord = new YtDyzPowerRecord();
+        powerRecord.setUserId(param.getUserId());
+        powerRecord.setRecordId(IdUtil.fastSimpleUUID());
+        powerRecord.setAddTime(new Date());
+        powerRecord.setType(1);
+        powerRecord.setRemark("减少体力");
+        xjlUserMapper.addPowerRecord(powerRecord);
+        return Result.resultOk(RepMessage.SAVE_SUCCESS);
+    }
+}

+ 145 - 0
yt-app/app-service/src/main/java/com/ytpm/service/xjlrl/impl/XjlrlUserServiceImpl.java

@@ -0,0 +1,145 @@
+package com.ytpm.service.xjlrl.impl;
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import com.ytpm.agent.enums.UserStatusEnum;
+import com.ytpm.app.model.YtDyzLoginRecord;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.WxLoginParam;
+import com.ytpm.app.view.WxLoginResult;
+import com.ytpm.app.view.WxUserInfo;
+import com.ytpm.constant.StrConstant;
+import com.ytpm.dao.xjlrl.XjlrlLoginRecordMapper;
+import com.ytpm.dao.xjlrl.XjlrlQuestionMapper;
+import com.ytpm.dao.xjlrl.XjlrlUserMapper;
+import com.ytpm.handle.CustomerException;
+import com.ytpm.service.xjlrl.XjlrlUserService;
+import com.ytpm.util.RedisService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Objects;
+
+@Service
+public class XjlrlUserServiceImpl implements XjlrlUserService {
+    @Resource
+    private XjlrlUserMapper xjlUserMapper;
+    @Resource
+    private XjlrlLoginRecordMapper xjlLoginRecordMapper;
+    @Resource
+    private XjlrlQuestionMapper xjlQuestionMapper;
+    @Resource
+    private RedisService redisService;
+
+    /**
+     * openid查询用户信息
+     */
+    @Override
+    public YtDyzUser selectByOpenid(String openid, Long ditchId) {
+        return xjlUserMapper.getYtAppUser(openid,ditchId);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
+    public YtDyzUser crudForNewTrans(WxLoginParam param, WxUserInfo wxUserInfo, WxLoginResult loginResult) {
+        //处理用户注册或登录更新信息
+        YtDyzUser old = xjlUserMapper.getYtAppUser(loginResult.getOpenid(), param.getDitchId());
+        if(Objects.isNull(old)) {
+            old = new YtDyzUser();
+            registryUser(param,wxUserInfo,loginResult, old);
+        }else{
+            deadWithUserCrud(old,wxUserInfo,param);
+        }
+        //设置最后一次答题问题ID、今日答题数、历史答题数
+        setExtInfo(old,wxUserInfo.getHeadimgurl());
+        // 添加用户登录记录
+        addLoginRecord(param,old.getUserId());
+        return old;
+    }
+    /**
+     * 设置扩展信息
+     */
+    private void setExtInfo(YtDyzUser old, String headimgurl) {
+        old.setHeadImg(headimgurl);
+        old.setLastQuestionId(xjlQuestionMapper.getLastQuestionId(old.getUserId()));
+        old.setTodayAnswerCount(xjlQuestionMapper.getAnswerCount(old.getUserId(),1));
+        old.setHistoryAnswerCount(xjlQuestionMapper.getAnswerCount(old.getUserId(),2));
+        old.setAnswerRecordList(xjlQuestionMapper.getAnswerRecords(old.getUserId()));
+        old.setLoginRecordList(xjlLoginRecordMapper.getLoginRecords(old.getUserId()));
+    }
+
+    /**
+     * 增加用户登录记录
+     */
+    private void addLoginRecord(WxLoginParam param,String userId) {
+        YtDyzLoginRecord loginRecord = new YtDyzLoginRecord();
+        loginRecord.setRecordId(IdUtil.fastSimpleUUID());
+        loginRecord.setUserId(userId);
+        loginRecord.setLoginTime(new Date());
+        loginRecord.setDeviceBrand(param.getBrand());
+        loginRecord.setDeviceModel(param.getModel());
+        loginRecord.setLoginIp(param.getLoginIp());
+        loginRecord.setOperator(param.getIpOperator());
+        loginRecord.setIpAddr(param.getIpLocation());
+        xjlLoginRecordMapper.insertOne(loginRecord);
+    }
+
+    /**
+     * 处理用户数据
+     */
+    private void deadWithUserCrud(YtDyzUser old, WxUserInfo wxUserInfo, WxLoginParam param) {
+        //处于风控状态的用户不允许登录
+        if(!old.getUserStatus().equals(UserStatusEnum.NORMAL.getCode())){
+            throw new CustomerException("当前用户处于"+UserStatusEnum.getByCode(old.getUserStatus())+"中,无法登录");
+        }
+        YtDyzUser newUser = new YtDyzUser();
+        newUser.setUserId(old.getUserId());
+        newUser.setNickName(wxUserInfo.getNickname());
+        newUser.setHeadImg(wxUserInfo.getHeadimgurl());
+        newUser.setLastLoginTime(new Date());
+        newUser.setLastLoginIp(param.getLoginIp());
+        newUser.setPhone(param.getPhone());
+        newUser.setDeviceId(param.getDeviceId());
+        newUser.setLoginDays(old.getLoginDays()+1);
+        xjlUserMapper.updateUser(newUser);
+    }
+
+
+
+    /**
+     * 注册用户
+     */
+    private void registryUser(WxLoginParam param,WxUserInfo wxUserInfo,WxLoginResult loginResult, YtDyzUser old) {
+        old.setUserId(redisService.getAppUserId());
+        old.setPhone(param.getPhone());
+        old.setDeviceId(param.getDeviceId());
+        old.setNickName(wxUserInfo.getNickname());
+        old.setLastLoginTime(new Date());
+        old.setRegistryTime(new Date());
+        old.setLastLoginIp(param.getLoginIp());
+        old.setLoginDays(1);
+        old.setPower(0);
+        old.setTotalVideo(0);
+        old.setTotalIncome(BigDecimal.ZERO);
+        old.setRedPacketAmount(BigDecimal.ZERO);
+        old.setRedPacketBalance(BigDecimal.ZERO);
+        old.setPointsBalance(BigDecimal.ZERO);
+        old.setPointsTotal(BigDecimal.ZERO);
+        old.setWithdrawTotal(BigDecimal.ZERO);
+        old.setDitchId(param.getDitchId());
+        old.setSignDays(0);
+        old.setAppId(param.getAppId());
+        old.setUserStatus(UserStatusEnum.NORMAL.getCode());
+        old.setWxOpenId(loginResult.getOpenid());
+        old.setHeadImg(wxUserInfo.getHeadimgurl());
+        //根据设备ID获取平台ID 获取不到再生成平台ID
+        String platformId = xjlUserMapper.getByDeviceId(param.getDeviceId(),wxUserInfo.getOpenid());
+        old.setPlatformId(StrUtil.isBlank(platformId)?
+                (StrConstant.PLATFORM_ID_PREFIX + IdUtil.getSnowflakeNextIdStr()):platformId);
+        xjlUserMapper.addOne(old);
+    }
+}

+ 1 - 1
yt-app/app-service/src/main/resources/mapper/AdRecordMapper.xml → yt-app/app-service/src/main/resources/mapper/dyz/AdRecordMapper.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.ytpm.dao.AdRecordMapper">
+<mapper namespace="com.ytpm.dao.dyz.AdRecordMapper">
 
     <insert id="addOne">
         insert into yt_dyz_ad_record

+ 4 - 4
yt-app/app-service/src/main/resources/mapper/AppUserMapper.xml → yt-app/app-service/src/main/resources/mapper/dyz/AppUserMapper.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.ytpm.dao.AppUserMapper">
+<mapper namespace="com.ytpm.dao.dyz.AppUserMapper">
     <insert id="addOne" parameterType="com.ytpm.app.model.YtDyzUser">
         insert into yt_dyz_user
         (
@@ -169,7 +169,7 @@
     <select id="queryAll" resultType="com.ytpm.app.view.YtAppUserListView">
         select
             user_id,app_id,phone,device_id, ditch_id, nick_name,head_img, power, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, platform_id
-        from yt_dyz_user
+        from `yt_dyz`.yt_dyz_user
         where 1 = 1
         <if test="userId != null and userId !=''">
             and user_id = #{userId}
@@ -304,7 +304,7 @@
 
     <select id="getDefaultConfig" resultType="com.ytpm.app.view.WxDefaultConfig">
         select
-            config_id, config_name, open_id appId, secret, app_id platformAppId, app_key platformAppSecret, app_type
+            config_id, config_name, open_id appId, secret, app_id platformAppId, app_key platformAppSecret, app_type,user_path,login_path,ad_path,answer_path,power_path
         from yt_app_default_config
         where app_type = #{appType}
     </select>
@@ -330,7 +330,7 @@
     </select>
     <select id="getConfigByIds" resultType="com.ytpm.app.view.WxDefaultConfig">
         select
-            config_id, config_name, open_id, secret, app_id, app_key, app_type
+            config_id, config_name, open_id, secret, app_id, app_key, app_type,user_path,login_path,ad_path,answer_path,power_path
         from yt_app_default_config
         where app_id in
         <foreach collection="appIds.split(',')" item="item" separator="," open="(" close=")">

+ 1 - 1
yt-app/app-service/src/main/resources/mapper/LoginRecordMapper.xml → yt-app/app-service/src/main/resources/mapper/dyz/LoginRecordMapper.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.ytpm.dao.LoginRecordMapper">
+<mapper namespace="com.ytpm.dao.dyz.LoginRecordMapper">
 
     <insert id="insertOne" parameterType="com.ytpm.app.model.YtDyzLoginRecord">
         insert into yt_dyz_login_record

+ 1 - 1
yt-app/app-service/src/main/resources/mapper/QuestionMapper.xml → yt-app/app-service/src/main/resources/mapper/dyz/QuestionMapper.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.ytpm.dao.QuestionMapper">
+<mapper namespace="com.ytpm.dao.dyz.QuestionMapper">
 
     <resultMap id="questionListMap" type="com.ytpm.app.view.QuestionListView">
         <id column="question_id" property="questionId" />

+ 64 - 0
yt-app/app-service/src/main/resources/mapper/nofeeds/NFAdRecordMapper.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.nofeeds.NFAdRecordMapper">
+    <insert id="addOne">
+        insert into yt_dyz_ad_record
+        (
+            record_id,
+            user_id,
+            nick_name,
+            placement_id,
+            ad_source_id,
+            revenue,
+            network_form_id,
+            network_name,
+            network_placement_id,
+            begin_time,
+            finish_time,
+            result_json,
+            ad_source_index,
+            ad_source_type,
+            ecpm,
+            app_id
+        )
+        values
+            (
+                #{recordId},
+                #{userId},
+                #{nickName},
+                #{placementId},
+                #{adSourceId},
+                #{revenue},
+                #{networkFormId},
+                #{networkName},
+                #{networkPlacementId},
+                #{beginTime},
+                #{finishTime},
+                #{resultJson},
+                #{adSourceIndex},
+                #{adSourceType},
+                #{ecpm},
+                #{appId}
+            )
+    </insert>
+    <select id="getByUserId" resultType="com.ytpm.app.model.YtDyzAdRecord">
+        select
+        record_id, user_id,app_id, nick_name, placement_id, ad_source_id, revenue, network_form_id, network_name, network_placement_id, finish_time, begin_time,result_json,ad_source_type,ad_source_index,ecpm
+        from yt_dyz_ad_record
+        where user_id = #{userId}
+        <if test="adsourceType != null">
+            and ad_source_type = #{adsourceType}
+        </if>
+        order by finish_time desc
+    </select>
+    <select id="getByUserIds" resultType="com.ytpm.app.model.YtDyzAdRecord">
+        select
+        record_id, user_id,app_id, nick_name, placement_id, ad_source_id, revenue, network_form_id, network_name, network_placement_id, finish_time, begin_time,result_json,ad_source_type,ad_source_index,ecpm
+        from yt_dyz_ad_record
+        where user_id in
+        <foreach collection="userIds.split(',')" open="(" close=")" separator="," item="item">
+            #{item}
+        </foreach>
+        order by finish_time
+    </select>
+</mapper>

+ 64 - 0
yt-app/app-service/src/main/resources/mapper/nofeeds/NFLoginRecordMapper.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.nofeeds.NFLoginRecordMapper">
+
+    <insert id="insertOne" parameterType="com.ytpm.app.model.YtDyzLoginRecord">
+        insert into yt_dyz_login_record
+        (
+         record_id,
+         user_id,
+         login_time,
+         device_brand,
+         device_model,
+         login_ip,
+         operator,
+         ip_addr
+        )
+        values
+        (
+         #{recordId},
+         #{userId},
+         #{loginTime},
+         #{deviceBrand},
+         #{deviceModel},
+         #{loginIp},
+         #{operator},
+         #{ipAddr}
+         );
+    </insert>
+    <select id="getLoginRecords" resultType="com.ytpm.app.model.YtDyzLoginRecord">
+        select
+            record_id, user_id, login_time, device_brand, device_model, login_ip, operator, ip_addr
+        from yt_dyz_login_record
+        where user_id = #{userId}
+    </select>
+
+    <select id="queryLoginCount" resultType="String">
+        select ydlr.user_id
+        from yt_dyz_login_record ydlr
+        left join yt_dyz_user ydu on ydlr.user_id=ydu.user_id
+        <where>
+            <if test="startTime != null">
+                AND ydlr.login_time >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND ydlr.login_time &lt;= #{endTime}
+            </if>
+            <choose>
+                <when test="appIdList == null or appIdList.isEmpty()">
+                    AND 1 = 0
+                </when>
+                <otherwise>
+                    AND ydu.app_id IN
+                    <foreach collection="appIdList" item="item"
+                             open="(" close=")" separator=",">
+                        #{item}
+                    </foreach>
+                </otherwise>
+            </choose>
+        </where>
+        group by user_id
+    </select>
+
+
+</mapper>

+ 59 - 0
yt-app/app-service/src/main/resources/mapper/nofeeds/NFQuestionMapper.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.nofeeds.NFQuestionMapper">
+
+    <resultMap id="questionListMap" type="com.ytpm.app.view.QuestionListView">
+        <id column="question_id" property="questionId" />
+        <result column="question_content" property="questionContent" />
+        <result column="question_reward" property="questionReward" />
+        <result column="correct_item" property="correctItem" />
+        <collection property="itemList" ofType="com.ytpm.app.view.QuestionItemListView">
+            <id column="item_id" property="itemId" />
+            <result column="item_header" property="itemHeader" />
+            <result column="item_content" property="itemContent" />
+            <result column="question_id" property="questionId" />
+        </collection>
+    </resultMap>
+    <insert id="saveAnswerRecord">
+        insert into yt_dyz_answer_record (record_id, question_id, item_id, duration, answer_time, user_id)
+        values (#{recordId},#{questionId},#{itemId},#{duration},#{answerTime},#{userId});
+    </insert>
+    <select id="questionList" resultMap="questionListMap">
+        SELECT
+            ydq.question_id,
+            ydq.question_content,
+            ydq.question_reward,
+            ydq.correct_item,
+            ydqi.item_id,
+            ydqi.item_header,
+            ydqi.item_content,
+            ydqi.question_id
+        FROM yt_dyz_question ydq
+        LEFT JOIN yt_dyz_question_item ydqi
+        ON ydq.question_id = ydqi.question_id
+        where app_id = #{appId}
+    </select>
+    <select id="getLastQuestionId" resultType="java.lang.String">
+        select
+            question_id
+        from yt_dyz_answer_record
+        where user_id = #{userId}
+        order by answer_time desc limit 1
+    </select>
+    <select id="getAnswerCount" resultType="java.lang.Integer">
+        select
+            count(*)
+        from yt_dyz_answer_record
+        where user_id = #{userId}
+        <if test="type != null and type == 1">
+            and DATE_FORMAT(answer_time, '%Y-%m-%d') = current_date()
+        </if>
+    </select>
+    <select id="getAnswerRecords" resultType="com.ytpm.app.model.YtDyzAnswerRecord">
+        select
+            record_id, question_id, item_id, duration, answer_time, user_id
+        from yt_dyz_answer_record
+        where user_id = #{userId}
+        order by answer_time desc
+    </select>
+</mapper>

+ 416 - 0
yt-app/app-service/src/main/resources/mapper/nofeeds/NFUserMapper.xml

@@ -0,0 +1,416 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.nofeeds.NFUserMapper">
+    <insert id="addOne" parameterType="com.ytpm.app.model.YtDyzUser">
+        insert into yt_dyz_user
+        (
+            user_id,
+            nick_name,
+            head_img,
+            registry_time,
+            last_login_time,
+            last_login_ip,
+            login_days,
+            total_video,
+            total_income,
+            red_packet_balance,
+            red_packet_amount,
+            points_balance,
+            points_total,
+            withdraw_total,
+            sign_days,
+            user_status,
+            risk_reason,
+            wx_open_id,
+            ditch_id,
+            platform_id,
+            app_id,
+            power,
+            phone,
+            device_id
+        )
+        values
+            (
+                #{userId},
+                #{nickName},
+                #{headImg},
+                #{registryTime},
+                #{lastLoginTime},
+                #{lastLoginIp},
+                #{loginDays},
+                #{totalVideo},
+                #{totalIncome},
+                #{redPacketBalance},
+                #{redPacketAmount},
+                #{pointsBalance},
+                #{pointsTotal},
+                #{withdrawTotal},
+                #{signDays},
+                #{userStatus},
+                #{riskReason},
+                #{wxOpenId},
+                #{ditchId},
+                #{platformId},
+                #{appId},
+                #{power},
+                #{phone},
+                #{deviceId}
+            )
+    </insert>
+    <insert id="addPowerRecord">
+        insert into yt_dyz_power_record
+        (
+            record_id, user_id, type, remark, add_time
+        )
+        values
+            (
+                #{recordId},#{userId},#{type},#{remark},#{addTime}
+            )
+    </insert>
+    <insert id="saveAppConfig">
+        insert into yt_app_default_config
+        (
+            config_name,
+            open_id,
+            secret,
+            app_id,
+            app_key,
+            app_type
+        )
+        values
+            (
+                #{configName},
+                #{openId},
+                #{secret},
+                #{appId},
+                #{appKey},
+                #{appType}
+            )
+    </insert>
+    <update id="addOnePower">
+        update yt_dyz_user set power = power+1 where user_id = #{userId}
+    </update>
+    <update id="subOnePower">
+        update yt_dyz_user set power = power-1 where user_id = #{userId}
+    </update>
+    <update id="updateUser" parameterType="com.ytpm.app.model.YtDyzUser">
+        update yt_dyz_user
+        <set>
+            <if test="nickName != null">
+                nick_name = #{nickName},
+            </if>
+            <if test="phone != null">
+                phone = #{phone},
+            </if>
+            <if test="deviceId != null">
+                device_id = #{deviceId},
+            </if>
+            <if test="headImg != null">
+                head_img = #{headImg},
+            </if>
+            <if test="power != null">
+                power = #{power},
+            </if>
+            <if test="lastLoginTime != null">
+                last_login_time = #{lastLoginTime},
+            </if>
+            <if test="lastLoginIp != null">
+                last_login_ip = #{lastLoginIp},
+            </if>
+            <if test="loginDays != null">
+                login_days = #{loginDays},
+            </if>
+            <if test="totalVideo != null">
+                total_video = #{totalVideo},
+            </if>
+            <if test="totalIncome != null">
+                total_income = #{totalIncome},
+            </if>
+            <if test="redPacketBalance != null">
+                red_packet_balance = #{redPacketBalance},
+            </if>
+            <if test="redPacketAmount != null">
+                red_packet_amount = #{redPacketAmount},
+            </if>
+            <if test="pointsBalance != null">
+                points_balance = #{pointsBalance},
+            </if>
+            <if test="pointsTotal != null">
+                points_total = #{pointsTotal},
+            </if>
+            <if test="withdrawTotal != null">
+                withdraw_total = #{withdrawTotal},
+            </if>
+            <if test="signDays != null">
+                sign_days = #{signDays},
+            </if>
+            <if test="userStatus != null">
+                user_status = #{userStatus},
+            </if>
+            <if test="riskReason != null">
+                risk_reason = #{riskReason},
+            </if>
+            <if test="wxOpenId != null">
+                wx_open_id = #{wxOpenId},
+            </if>
+            <if test="platformId != null">
+                platform_id = #{platformId}
+            </if>
+        </set>
+        where user_id = #{userId}
+    </update>
+    <select id="getYtAppUser" resultType="com.ytpm.app.model.YtDyzUser">
+        select
+            user_id, app_id,phone,device_id, ditch_id, nick_name,head_img, power, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, platform_id
+        from yt_dyz_user
+        where wx_open_id = #{openid}
+          and ditch_id = #{ditchId}
+    </select>
+    <select id="queryAll" resultType="com.ytpm.app.view.YtAppUserListView">
+        select
+        user_id,app_id,phone,device_id, ditch_id, nick_name,head_img, power, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, platform_id
+        from yt_dyz_user
+        where 1 = 1
+        <if test="userId != null and userId !=''">
+            and user_id = #{userId}
+        </if>
+        <if test="nickName != null and nickName !=''">
+            and nick_name like concat('%',#{nickName},'%')
+        </if>
+        <if test="ditchId != null">
+            and ditch_id = #{ditchId}
+        </if>
+        <if test="userStatus != null">
+            and user_status = #{userStatus}
+        </if>
+        <if test="registryTimeBegin != null">
+            and DATE_FORMAT(registry_time, '%Y-%m-%d') <![CDATA[>=]]> DATE_FORMAT(#{registryTimeBegin}, '%Y-%m-%d')
+        </if>
+        <if test="registryTimeEnd != null">
+            and DATE_FORMAT(registry_time, '%Y-%m-%d') <![CDATA[<=]]> DATE_FORMAT(#{registryTimeEnd}, '%Y-%m-%d')
+        </if>
+        <if test="lastLoginTimeBegin != null">
+            and DATE_FORMAT(last_login_time, '%Y-%m-%d') <![CDATA[>=]]> DATE_FORMAT(#{lastLoginTimeBegin}, '%Y-%m-%d')
+        </if>
+        <if test="lastLoginTimeEnd != null">
+            and DATE_FORMAT(last_login_time, '%Y-%m-%d') <![CDATA[<=]]> DATE_FORMAT(#{lastLoginTimeEnd}, '%Y-%m-%d')
+        </if>
+        <if test="appIds != null and appIds != ''">
+            and app_id in
+            <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        order by user_id desc
+    </select>
+    <select id="selectPrimaryKey" resultType="com.ytpm.app.model.YtDyzUser">
+        select
+            user_id,app_id,phone,device_id, ditch_id, head_img, nick_name, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, platform_id, power
+        from yt_dyz_user
+        where user_id = #{userId}
+    </select>
+    <select id="getUserList" resultType="com.ytpm.app.model.YtDyzUser">
+        select
+        du.user_id,
+        du.head_img,
+        du.nick_name,
+        du.phone,
+        du.device_id,
+        du.registry_time,
+        du.last_login_time,
+        du.last_login_ip,
+        du.login_days,
+        du.total_video,
+        du.total_income,
+        du.red_packet_balance,
+        du.red_packet_amount,
+        du.points_balance,
+        du.points_total,
+        du.withdraw_total,
+        du.sign_days,
+        du.user_status,
+        du.risk_reason,
+        du.wx_open_id,
+        du.ditch_id,
+        du.app_id,
+        du.platform_id,
+        du.power
+        from yt_dyz_user du
+        where du.user_id in
+        <foreach collection="userIds.split(',')" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="queryAllByTime" resultType="com.ytpm.app.model.YtDyzUser">
+        SELECT
+        user_id,app_id,phone,device_id, nick_name, head_img, power, registry_time,
+        last_login_time, last_login_ip, login_days, total_video,
+        total_income, red_packet_balance, red_packet_amount,
+        points_balance, points_total, withdraw_total, sign_days,
+        user_status, risk_reason, wx_open_id, platform_id
+        FROM yt_dyz_user
+        <where>
+            <if test="startTime != null">
+                AND registry_time >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND registry_time &lt;= #{endTime}
+            </if>
+            <choose>
+                <when test="appIdList == null or appIdList.isEmpty()">
+                    AND 1 = 0
+                </when>
+                <otherwise>
+                    AND app_id IN
+                    <foreach collection="appIdList" item="item"
+                             open="(" close=")" separator=",">
+                        #{item}
+                    </foreach>
+                </otherwise>
+            </choose>
+        </where>
+        ORDER BY registry_time DESC
+    </select>
+    <select id="countUsersByHour" resultType="com.ytpm.app.view.HourCountView">
+        SELECT HOUR(registry_time) AS hour, COUNT(*) AS count
+        FROM yt_dyz_user
+        WHERE registry_time BETWEEN #{startTime} AND #{endTime}
+        <choose>
+            <when test="appIdList == null or appIdList.isEmpty()">
+                AND 1 = 0
+            </when>
+            <otherwise>
+                AND app_id IN
+                <foreach collection="appIdList" item="item"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </otherwise>
+        </choose>
+        GROUP BY HOUR(registry_time)
+    </select>
+
+    <select id="queryTodayBanned" resultType="com.ytpm.app.model.YtDyzUser">
+        select user_id from yt_dyz_user
+        where registry_time BETWEEN #{startTime} AND #{endTime}
+        and user_id in
+        <foreach collection="userIdList" item="item"
+                 open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+    </select>
+
+
+    <select id="getDefaultConfig" resultType="com.ytpm.app.view.WxDefaultConfig">
+        select
+            config_id, config_name, open_id appId, secret, app_id platformAppId, app_key platformAppSecret, app_type,user_path,login_path,ad_path,answer_path,power_path
+        from yt_app_default_config
+        where app_type = #{appType}
+    </select>
+    <select id="getSecretByAppId" resultType="java.lang.String">
+        select
+            secret
+        from yt_app_default_config
+        where app_id = #{appId}
+    </select>
+    <select id="queryByOpenid" resultType="com.ytpm.app.model.YtDyzUser">
+        select
+            user_id,phone,device_id, head_img, nick_name, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, ditch_id, app_id, platform_id, power
+        from yt_dyz_user
+        where wx_open_id = #{openid}
+    </select>
+    <select id="getByDeviceId" resultType="java.lang.String">
+        select
+            platform_id
+        from yt_dyz_user
+        where device_id = #{deviceId}
+          and wx_open_id = #{openid}
+        limit 1
+    </select>
+    <select id="getConfigByIds" resultType="com.ytpm.app.view.WxDefaultConfig">
+        select
+        config_id, config_name, open_id, secret, app_id, app_key, app_type,user_path,login_path,ad_path,answer_path,power_path
+        from yt_app_default_config
+        where app_id in
+        <foreach collection="appIds.split(',')" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+    <select id="getAdCount" resultType="java.lang.Integer">
+        select
+        sum(total_video)
+        from yt_dyz_user
+        where app_id in
+        <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+    <select id="getRevenueCount" resultType="java.math.BigDecimal">
+        select
+        sum(total_income)
+        from yt_dyz_user
+        where app_id in
+        <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+    <select id="getAppRanking" resultType="com.ytpm.middle.view.AppRankingListVO">
+        SELECT
+        u.app_id,
+        sum( ar.revenue ) totalRevenue
+        FROM
+        yt_dyz_ad_record ar
+        JOIN yt_dyz_user u ON ar.user_id = u.user_id
+        <where>
+            <if test="sortBy != null">
+                <choose>
+                    <when test="sortBy == 1">
+                        DATE_FORMAT( ar.finish_time, '%Y-%m-%d' ) = CURRENT_DATE()
+                    </when>
+                    <when test=" sortBy == 2">
+                        YEARWEEK( ar.finish_time, 1 ) = YEARWEEK(now(),1)
+                    </when>
+                    <otherwise>
+                        DATE_FORMAT( ar.finish_time, '%Y-%m' ) = DATE_FORMAT(NOW(), '%Y-%m')
+                    </otherwise>
+                </choose>
+            </if>
+        </where>
+        GROUP BY
+        u.app_id
+        ORDER BY
+        sum( ar.revenue ) DESC
+        LIMIT #{limit}
+    </select>
+    <select id="getUserRanking" resultType="com.ytpm.middle.view.UserRankingListVO">
+        SELECT
+        u.user_id,
+        u.nick_name,
+        u.head_img,
+        u.total_video,
+        sum( ar.revenue ) totalIncome
+        FROM
+        yt_dyz_ad_record ar
+        JOIN yt_dyz_user u ON ar.user_id = u.user_id
+        <where>
+            <if test="sortBy != null">
+                <choose>
+                    <when test="sortBy == 1">
+                        DATE_FORMAT( ar.finish_time, '%Y-%m-%d' ) = CURRENT_DATE()
+                    </when>
+                    <when test=" sortBy == 2">
+                        YEARWEEK( ar.finish_time, 1 ) = YEARWEEK(now(),1)
+                    </when>
+                    <otherwise>
+                        DATE_FORMAT( ar.finish_time, '%Y-%m' ) = DATE_FORMAT(NOW(), '%Y-%m')
+                    </otherwise>
+                </choose>
+            </if>
+        </where>
+        GROUP BY ar.user_id
+        ORDER BY
+        sum( ar.revenue ) DESC
+        limit #{limit}
+    </select>
+</mapper>

+ 64 - 0
yt-app/app-service/src/main/resources/mapper/qnjz/QNAdRecordMapper.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.qnjz.QNAdRecordMapper">
+    <insert id="addOne">
+        insert into yt_dyz_ad_record
+        (
+            record_id,
+            user_id,
+            nick_name,
+            placement_id,
+            ad_source_id,
+            revenue,
+            network_form_id,
+            network_name,
+            network_placement_id,
+            begin_time,
+            finish_time,
+            result_json,
+            ad_source_index,
+            ad_source_type,
+            ecpm,
+            app_id
+        )
+        values
+            (
+                #{recordId},
+                #{userId},
+                #{nickName},
+                #{placementId},
+                #{adSourceId},
+                #{revenue},
+                #{networkFormId},
+                #{networkName},
+                #{networkPlacementId},
+                #{beginTime},
+                #{finishTime},
+                #{resultJson},
+                #{adSourceIndex},
+                #{adSourceType},
+                #{ecpm},
+                #{appId}
+            )
+    </insert>
+    <select id="getByUserId" resultType="com.ytpm.app.model.YtDyzAdRecord">
+        select
+        record_id, user_id,app_id, nick_name, placement_id, ad_source_id, revenue, network_form_id, network_name, network_placement_id, finish_time, begin_time,result_json,ad_source_type,ad_source_index,ecpm
+        from yt_dyz_ad_record
+        where user_id = #{userId}
+        <if test="adsourceType != null">
+            and ad_source_type = #{adsourceType}
+        </if>
+        order by finish_time desc
+    </select>
+    <select id="getByUserIds" resultType="com.ytpm.app.model.YtDyzAdRecord">
+        select
+        record_id, user_id,app_id, nick_name, placement_id, ad_source_id, revenue, network_form_id, network_name, network_placement_id, finish_time, begin_time,result_json,ad_source_type,ad_source_index,ecpm
+        from yt_dyz_ad_record
+        where user_id in
+        <foreach collection="userIds.split(',')" open="(" close=")" separator="," item="item">
+            #{item}
+        </foreach>
+        order by finish_time
+    </select>
+</mapper>

+ 64 - 0
yt-app/app-service/src/main/resources/mapper/qnjz/QNLoginRecordMapper.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.qnjz.QNLoginRecordMapper">
+
+    <insert id="insertOne" parameterType="com.ytpm.app.model.YtDyzLoginRecord">
+        insert into yt_dyz_login_record
+        (
+         record_id,
+         user_id,
+         login_time,
+         device_brand,
+         device_model,
+         login_ip,
+         operator,
+         ip_addr
+        )
+        values
+        (
+         #{recordId},
+         #{userId},
+         #{loginTime},
+         #{deviceBrand},
+         #{deviceModel},
+         #{loginIp},
+         #{operator},
+         #{ipAddr}
+         );
+    </insert>
+    <select id="getLoginRecords" resultType="com.ytpm.app.model.YtDyzLoginRecord">
+        select
+            record_id, user_id, login_time, device_brand, device_model, login_ip, operator, ip_addr
+        from yt_dyz_login_record
+        where user_id = #{userId}
+    </select>
+
+    <select id="queryLoginCount" resultType="String">
+        select ydlr.user_id
+        from yt_dyz_login_record ydlr
+        left join yt_dyz_user ydu on ydlr.user_id=ydu.user_id
+        <where>
+            <if test="startTime != null">
+                AND ydlr.login_time >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND ydlr.login_time &lt;= #{endTime}
+            </if>
+            <choose>
+                <when test="appIdList == null or appIdList.isEmpty()">
+                    AND 1 = 0
+                </when>
+                <otherwise>
+                    AND ydu.app_id IN
+                    <foreach collection="appIdList" item="item"
+                             open="(" close=")" separator=",">
+                        #{item}
+                    </foreach>
+                </otherwise>
+            </choose>
+        </where>
+        group by user_id
+    </select>
+
+
+</mapper>

+ 59 - 0
yt-app/app-service/src/main/resources/mapper/qnjz/QNQuestionMapper.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.qnjz.QNQuestionMapper">
+
+    <resultMap id="questionListMap" type="com.ytpm.app.view.QuestionListView">
+        <id column="question_id" property="questionId" />
+        <result column="question_content" property="questionContent" />
+        <result column="question_reward" property="questionReward" />
+        <result column="correct_item" property="correctItem" />
+        <collection property="itemList" ofType="com.ytpm.app.view.QuestionItemListView">
+            <id column="item_id" property="itemId" />
+            <result column="item_header" property="itemHeader" />
+            <result column="item_content" property="itemContent" />
+            <result column="question_id" property="questionId" />
+        </collection>
+    </resultMap>
+    <insert id="saveAnswerRecord">
+        insert into yt_dyz_answer_record (record_id, question_id, item_id, duration, answer_time, user_id)
+        values (#{recordId},#{questionId},#{itemId},#{duration},#{answerTime},#{userId});
+    </insert>
+    <select id="questionList" resultMap="questionListMap">
+        SELECT
+            ydq.question_id,
+            ydq.question_content,
+            ydq.question_reward,
+            ydq.correct_item,
+            ydqi.item_id,
+            ydqi.item_header,
+            ydqi.item_content,
+            ydqi.question_id
+        FROM yt_dyz_question ydq
+        LEFT JOIN yt_dyz_question_item ydqi
+        ON ydq.question_id = ydqi.question_id
+        where app_id = #{appId}
+    </select>
+    <select id="getLastQuestionId" resultType="java.lang.String">
+        select
+            question_id
+        from yt_dyz_answer_record
+        where user_id = #{userId}
+        order by answer_time desc limit 1
+    </select>
+    <select id="getAnswerCount" resultType="java.lang.Integer">
+        select
+            count(*)
+        from yt_dyz_answer_record
+        where user_id = #{userId}
+        <if test="type != null and type == 1">
+            and DATE_FORMAT(answer_time, '%Y-%m-%d') = current_date()
+        </if>
+    </select>
+    <select id="getAnswerRecords" resultType="com.ytpm.app.model.YtDyzAnswerRecord">
+        select
+            record_id, question_id, item_id, duration, answer_time, user_id
+        from yt_dyz_answer_record
+        where user_id = #{userId}
+        order by answer_time desc
+    </select>
+</mapper>

+ 416 - 0
yt-app/app-service/src/main/resources/mapper/qnjz/QNUserMapper.xml

@@ -0,0 +1,416 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.qnjz.QNUserMapper">
+    <insert id="addOne" parameterType="com.ytpm.app.model.YtDyzUser">
+        insert into yt_dyz_user
+        (
+         user_id,
+         nick_name,
+         head_img,
+         registry_time,
+         last_login_time,
+         last_login_ip,
+         login_days,
+         total_video,
+         total_income,
+         red_packet_balance,
+         red_packet_amount,
+         points_balance,
+         points_total,
+         withdraw_total,
+         sign_days,
+         user_status,
+         risk_reason,
+         wx_open_id,
+         ditch_id,
+         platform_id,
+         app_id,
+         power,
+         phone,
+         device_id
+        )
+        values
+        (
+         #{userId},
+         #{nickName},
+         #{headImg},
+         #{registryTime},
+         #{lastLoginTime},
+         #{lastLoginIp},
+         #{loginDays},
+         #{totalVideo},
+         #{totalIncome},
+         #{redPacketBalance},
+         #{redPacketAmount},
+         #{pointsBalance},
+         #{pointsTotal},
+         #{withdrawTotal},
+         #{signDays},
+         #{userStatus},
+         #{riskReason},
+         #{wxOpenId},
+         #{ditchId},
+         #{platformId},
+         #{appId},
+         #{power},
+         #{phone},
+         #{deviceId}
+        )
+    </insert>
+    <insert id="addPowerRecord">
+        insert into yt_dyz_power_record
+        (
+         record_id, user_id, type, remark, add_time
+        )
+        values
+        (
+         #{recordId},#{userId},#{type},#{remark},#{addTime}
+        )
+    </insert>
+    <insert id="saveAppConfig">
+        insert into yt_app_default_config
+        (
+         config_name,
+         open_id,
+         secret,
+         app_id,
+         app_key,
+         app_type
+        )
+        values
+        (
+         #{configName},
+         #{openId},
+         #{secret},
+         #{appId},
+         #{appKey},
+         #{appType}
+        )
+    </insert>
+    <update id="addOnePower">
+        update yt_dyz_user set power = power+1 where user_id = #{userId}
+    </update>
+    <update id="subOnePower">
+        update yt_dyz_user set power = power-1 where user_id = #{userId}
+    </update>
+    <update id="updateUser" parameterType="com.ytpm.app.model.YtDyzUser">
+        update yt_dyz_user
+        <set>
+            <if test="nickName != null">
+                nick_name = #{nickName},
+            </if>
+            <if test="phone != null">
+                phone = #{phone},
+            </if>
+            <if test="deviceId != null">
+                device_id = #{deviceId},
+            </if>
+            <if test="headImg != null">
+                head_img = #{headImg},
+            </if>
+            <if test="power != null">
+                power = #{power},
+            </if>
+            <if test="lastLoginTime != null">
+                last_login_time = #{lastLoginTime},
+            </if>
+            <if test="lastLoginIp != null">
+                last_login_ip = #{lastLoginIp},
+            </if>
+            <if test="loginDays != null">
+                login_days = #{loginDays},
+            </if>
+            <if test="totalVideo != null">
+                total_video = #{totalVideo},
+            </if>
+            <if test="totalIncome != null">
+                total_income = #{totalIncome},
+            </if>
+            <if test="redPacketBalance != null">
+                red_packet_balance = #{redPacketBalance},
+            </if>
+            <if test="redPacketAmount != null">
+                red_packet_amount = #{redPacketAmount},
+            </if>
+            <if test="pointsBalance != null">
+                points_balance = #{pointsBalance},
+            </if>
+            <if test="pointsTotal != null">
+                points_total = #{pointsTotal},
+            </if>
+            <if test="withdrawTotal != null">
+                withdraw_total = #{withdrawTotal},
+            </if>
+            <if test="signDays != null">
+                sign_days = #{signDays},
+            </if>
+            <if test="userStatus != null">
+                user_status = #{userStatus},
+            </if>
+            <if test="riskReason != null">
+                risk_reason = #{riskReason},
+            </if>
+            <if test="wxOpenId != null">
+                wx_open_id = #{wxOpenId},
+            </if>
+            <if test="platformId != null">
+                platform_id = #{platformId}
+            </if>
+        </set>
+        where user_id = #{userId}
+    </update>
+    <select id="getYtAppUser" resultType="com.ytpm.app.model.YtDyzUser">
+        select
+           user_id, app_id,phone,device_id, ditch_id, nick_name,head_img, power, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, platform_id
+        from yt_dyz_user
+        where wx_open_id = #{openid}
+        and ditch_id = #{ditchId}
+    </select>
+    <select id="queryAll" resultType="com.ytpm.app.view.YtAppUserListView">
+        select
+            user_id,app_id,phone,device_id, ditch_id, nick_name,head_img, power, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, platform_id
+        from yt_dyz_user
+        where 1 = 1
+        <if test="userId != null and userId !=''">
+            and user_id = #{userId}
+        </if>
+        <if test="nickName != null and nickName !=''">
+            and nick_name like concat('%',#{nickName},'%')
+        </if>
+        <if test="ditchId != null">
+            and ditch_id = #{ditchId}
+        </if>
+        <if test="userStatus != null">
+            and user_status = #{userStatus}
+        </if>
+        <if test="registryTimeBegin != null">
+            and DATE_FORMAT(registry_time, '%Y-%m-%d') <![CDATA[>=]]> DATE_FORMAT(#{registryTimeBegin}, '%Y-%m-%d')
+        </if>
+        <if test="registryTimeEnd != null">
+            and DATE_FORMAT(registry_time, '%Y-%m-%d') <![CDATA[<=]]> DATE_FORMAT(#{registryTimeEnd}, '%Y-%m-%d')
+        </if>
+        <if test="lastLoginTimeBegin != null">
+            and DATE_FORMAT(last_login_time, '%Y-%m-%d') <![CDATA[>=]]> DATE_FORMAT(#{lastLoginTimeBegin}, '%Y-%m-%d')
+        </if>
+        <if test="lastLoginTimeEnd != null">
+            and DATE_FORMAT(last_login_time, '%Y-%m-%d') <![CDATA[<=]]> DATE_FORMAT(#{lastLoginTimeEnd}, '%Y-%m-%d')
+        </if>
+        <if test="appIds != null and appIds != ''">
+            and app_id in
+                <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+                    #{item}
+                </foreach>
+        </if>
+        order by user_id desc
+    </select>
+    <select id="selectPrimaryKey" resultType="com.ytpm.app.model.YtDyzUser">
+        select
+            user_id,app_id,phone,device_id, ditch_id, head_img, nick_name, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, platform_id, power
+        from yt_dyz_user
+        where user_id = #{userId}
+    </select>
+    <select id="getUserList" resultType="com.ytpm.app.model.YtDyzUser">
+        select
+            du.user_id,
+            du.head_img,
+            du.nick_name,
+            du.phone,
+            du.device_id,
+            du.registry_time,
+            du.last_login_time,
+            du.last_login_ip,
+            du.login_days,
+            du.total_video,
+            du.total_income,
+            du.red_packet_balance,
+            du.red_packet_amount,
+            du.points_balance,
+            du.points_total,
+            du.withdraw_total,
+            du.sign_days,
+            du.user_status,
+            du.risk_reason,
+            du.wx_open_id,
+            du.ditch_id,
+            du.app_id,
+            du.platform_id,
+            du.power
+        from yt_dyz_user du
+        where du.user_id in
+        <foreach collection="userIds.split(',')" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="queryAllByTime" resultType="com.ytpm.app.model.YtDyzUser">
+        SELECT
+        user_id,app_id,phone,device_id, nick_name, head_img, power, registry_time,
+        last_login_time, last_login_ip, login_days, total_video,
+        total_income, red_packet_balance, red_packet_amount,
+        points_balance, points_total, withdraw_total, sign_days,
+        user_status, risk_reason, wx_open_id, platform_id
+        FROM yt_dyz_user
+        <where>
+            <if test="startTime != null">
+                AND registry_time >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND registry_time &lt;= #{endTime}
+            </if>
+            <choose>
+                <when test="appIdList == null or appIdList.isEmpty()">
+                    AND 1 = 0
+                </when>
+                <otherwise>
+                    AND app_id IN
+                    <foreach collection="appIdList" item="item"
+                             open="(" close=")" separator=",">
+                        #{item}
+                    </foreach>
+                </otherwise>
+            </choose>
+        </where>
+        ORDER BY registry_time DESC
+    </select>
+    <select id="countUsersByHour" resultType="com.ytpm.app.view.HourCountView">
+        SELECT HOUR(registry_time) AS hour, COUNT(*) AS count
+        FROM yt_dyz_user
+        WHERE registry_time BETWEEN #{startTime} AND #{endTime}
+        <choose>
+            <when test="appIdList == null or appIdList.isEmpty()">
+                AND 1 = 0
+            </when>
+            <otherwise>
+                AND app_id IN
+                <foreach collection="appIdList" item="item"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </otherwise>
+        </choose>
+        GROUP BY HOUR(registry_time)
+    </select>
+
+    <select id="queryTodayBanned" resultType="com.ytpm.app.model.YtDyzUser">
+        select user_id from yt_dyz_user
+        where registry_time BETWEEN #{startTime} AND #{endTime}
+        and user_id in
+        <foreach collection="userIdList" item="item"
+                 open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+    </select>
+
+
+    <select id="getDefaultConfig" resultType="com.ytpm.app.view.WxDefaultConfig">
+        select
+            config_id, config_name, open_id appId, secret, app_id platformAppId, app_key platformAppSecret, app_type,user_path,login_path,ad_path,answer_path,power_path
+        from yt_app_default_config
+        where app_type = #{appType}
+    </select>
+    <select id="getSecretByAppId" resultType="java.lang.String">
+        select
+           secret
+        from yt_app_default_config
+        where app_id = #{appId}
+    </select>
+    <select id="queryByOpenid" resultType="com.ytpm.app.model.YtDyzUser">
+        select
+            user_id,phone,device_id, head_img, nick_name, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, ditch_id, app_id, platform_id, power
+        from yt_dyz_user
+        where wx_open_id = #{openid}
+    </select>
+    <select id="getByDeviceId" resultType="java.lang.String">
+        select
+            platform_id
+        from yt_dyz_user
+        where device_id = #{deviceId}
+        and wx_open_id = #{openid}
+        limit 1
+    </select>
+    <select id="getConfigByIds" resultType="com.ytpm.app.view.WxDefaultConfig">
+        select
+            config_id, config_name, open_id, secret, app_id, app_key, app_type,user_path,login_path,ad_path,answer_path,power_path
+        from yt_app_default_config
+        where app_id in
+        <foreach collection="appIds.split(',')" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+    <select id="getAdCount" resultType="java.lang.Integer">
+        select
+            sum(total_video)
+        from yt_dyz_user
+        where app_id in
+        <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+    <select id="getRevenueCount" resultType="java.math.BigDecimal">
+        select
+        sum(total_income)
+        from yt_dyz_user
+        where app_id in
+        <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+    <select id="getAppRanking" resultType="com.ytpm.middle.view.AppRankingListVO">
+        SELECT
+            u.app_id,
+            sum( ar.revenue ) totalRevenue
+        FROM
+            yt_dyz_ad_record ar
+            JOIN yt_dyz_user u ON ar.user_id = u.user_id
+        <where>
+            <if test="sortBy != null">
+                <choose>
+                    <when test="sortBy == 1">
+                        DATE_FORMAT( ar.finish_time, '%Y-%m-%d' ) = CURRENT_DATE()
+                    </when>
+                    <when test=" sortBy == 2">
+                        YEARWEEK( ar.finish_time, 1 ) = YEARWEEK(now(),1)
+                    </when>
+                    <otherwise>
+                        DATE_FORMAT( ar.finish_time, '%Y-%m' ) = DATE_FORMAT(NOW(), '%Y-%m')
+                    </otherwise>
+                </choose>
+            </if>
+        </where>
+        GROUP BY
+            u.app_id
+        ORDER BY
+            sum( ar.revenue ) DESC
+        LIMIT #{limit}
+    </select>
+    <select id="getUserRanking" resultType="com.ytpm.middle.view.UserRankingListVO">
+        SELECT
+            u.user_id,
+            u.nick_name,
+            u.head_img,
+            u.total_video,
+            sum( ar.revenue ) totalIncome
+        FROM
+            yt_dyz_ad_record ar
+                JOIN yt_dyz_user u ON ar.user_id = u.user_id
+        <where>
+            <if test="sortBy != null">
+                <choose>
+                    <when test="sortBy == 1">
+                        DATE_FORMAT( ar.finish_time, '%Y-%m-%d' ) = CURRENT_DATE()
+                    </when>
+                    <when test=" sortBy == 2">
+                        YEARWEEK( ar.finish_time, 1 ) = YEARWEEK(now(),1)
+                    </when>
+                    <otherwise>
+                        DATE_FORMAT( ar.finish_time, '%Y-%m' ) = DATE_FORMAT(NOW(), '%Y-%m')
+                    </otherwise>
+                </choose>
+            </if>
+        </where>
+        GROUP BY ar.user_id
+        ORDER BY
+            sum( ar.revenue ) DESC
+        limit #{limit}
+    </select>
+</mapper>

+ 64 - 0
yt-app/app-service/src/main/resources/mapper/qnmjz/QnmAdRecordMapper.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.qnmjz.QnmAdRecordMapper">
+    <insert id="addOne">
+        insert into yt_dyz_ad_record
+        (
+            record_id,
+            user_id,
+            nick_name,
+            placement_id,
+            ad_source_id,
+            revenue,
+            network_form_id,
+            network_name,
+            network_placement_id,
+            begin_time,
+            finish_time,
+            result_json,
+            ad_source_index,
+            ad_source_type,
+            ecpm,
+            app_id
+        )
+        values
+            (
+                #{recordId},
+                #{userId},
+                #{nickName},
+                #{placementId},
+                #{adSourceId},
+                #{revenue},
+                #{networkFormId},
+                #{networkName},
+                #{networkPlacementId},
+                #{beginTime},
+                #{finishTime},
+                #{resultJson},
+                #{adSourceIndex},
+                #{adSourceType},
+                #{ecpm},
+                #{appId}
+            )
+    </insert>
+    <select id="getByUserId" resultType="com.ytpm.app.model.YtDyzAdRecord">
+        select
+        record_id, user_id,app_id, nick_name, placement_id, ad_source_id, revenue, network_form_id, network_name, network_placement_id, finish_time, begin_time,result_json,ad_source_type,ad_source_index,ecpm
+        from yt_dyz_ad_record
+        where user_id = #{userId}
+        <if test="adsourceType != null">
+            and ad_source_type = #{adsourceType}
+        </if>
+        order by finish_time desc
+    </select>
+    <select id="getByUserIds" resultType="com.ytpm.app.model.YtDyzAdRecord">
+        select
+        record_id, user_id,app_id, nick_name, placement_id, ad_source_id, revenue, network_form_id, network_name, network_placement_id, finish_time, begin_time,result_json,ad_source_type,ad_source_index,ecpm
+        from yt_dyz_ad_record
+        where user_id in
+        <foreach collection="userIds.split(',')" open="(" close=")" separator="," item="item">
+            #{item}
+        </foreach>
+        order by finish_time
+    </select>
+</mapper>

+ 64 - 0
yt-app/app-service/src/main/resources/mapper/qnmjz/QnmLoginRecordMapper.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.qnmjz.QnmLoginRecordMapper">
+
+    <insert id="insertOne" parameterType="com.ytpm.app.model.YtDyzLoginRecord">
+        insert into yt_dyz_login_record
+        (
+         record_id,
+         user_id,
+         login_time,
+         device_brand,
+         device_model,
+         login_ip,
+         operator,
+         ip_addr
+        )
+        values
+        (
+         #{recordId},
+         #{userId},
+         #{loginTime},
+         #{deviceBrand},
+         #{deviceModel},
+         #{loginIp},
+         #{operator},
+         #{ipAddr}
+         );
+    </insert>
+    <select id="getLoginRecords" resultType="com.ytpm.app.model.YtDyzLoginRecord">
+        select
+            record_id, user_id, login_time, device_brand, device_model, login_ip, operator, ip_addr
+        from yt_dyz_login_record
+        where user_id = #{userId}
+    </select>
+
+    <select id="queryLoginCount" resultType="String">
+        select ydlr.user_id
+        from yt_dyz_login_record ydlr
+        left join yt_dyz_user ydu on ydlr.user_id=ydu.user_id
+        <where>
+            <if test="startTime != null">
+                AND ydlr.login_time >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND ydlr.login_time &lt;= #{endTime}
+            </if>
+            <choose>
+                <when test="appIdList == null or appIdList.isEmpty()">
+                    AND 1 = 0
+                </when>
+                <otherwise>
+                    AND ydu.app_id IN
+                    <foreach collection="appIdList" item="item"
+                             open="(" close=")" separator=",">
+                        #{item}
+                    </foreach>
+                </otherwise>
+            </choose>
+        </where>
+        group by user_id
+    </select>
+
+
+</mapper>

+ 59 - 0
yt-app/app-service/src/main/resources/mapper/qnmjz/QnmQuestionMapper.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.qnmjz.QnmQuestionMapper">
+
+    <resultMap id="questionListMap" type="com.ytpm.app.view.QuestionListView">
+        <id column="question_id" property="questionId" />
+        <result column="question_content" property="questionContent" />
+        <result column="question_reward" property="questionReward" />
+        <result column="correct_item" property="correctItem" />
+        <collection property="itemList" ofType="com.ytpm.app.view.QuestionItemListView">
+            <id column="item_id" property="itemId" />
+            <result column="item_header" property="itemHeader" />
+            <result column="item_content" property="itemContent" />
+            <result column="question_id" property="questionId" />
+        </collection>
+    </resultMap>
+    <insert id="saveAnswerRecord">
+        insert into yt_dyz_answer_record (record_id, question_id, item_id, duration, answer_time, user_id)
+        values (#{recordId},#{questionId},#{itemId},#{duration},#{answerTime},#{userId});
+    </insert>
+    <select id="questionList" resultMap="questionListMap">
+        SELECT
+            ydq.question_id,
+            ydq.question_content,
+            ydq.question_reward,
+            ydq.correct_item,
+            ydqi.item_id,
+            ydqi.item_header,
+            ydqi.item_content,
+            ydqi.question_id
+        FROM yt_dyz_question ydq
+        LEFT JOIN yt_dyz_question_item ydqi
+        ON ydq.question_id = ydqi.question_id
+        where app_id = #{appId}
+    </select>
+    <select id="getLastQuestionId" resultType="java.lang.String">
+        select
+            question_id
+        from yt_dyz_answer_record
+        where user_id = #{userId}
+        order by answer_time desc limit 1
+    </select>
+    <select id="getAnswerCount" resultType="java.lang.Integer">
+        select
+            count(*)
+        from yt_dyz_answer_record
+        where user_id = #{userId}
+        <if test="type != null and type == 1">
+            and DATE_FORMAT(answer_time, '%Y-%m-%d') = current_date()
+        </if>
+    </select>
+    <select id="getAnswerRecords" resultType="com.ytpm.app.model.YtDyzAnswerRecord">
+        select
+            record_id, question_id, item_id, duration, answer_time, user_id
+        from yt_dyz_answer_record
+        where user_id = #{userId}
+        order by answer_time desc
+    </select>
+</mapper>

+ 416 - 0
yt-app/app-service/src/main/resources/mapper/qnmjz/QnmUserMapper.xml

@@ -0,0 +1,416 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.qnmjz.QnmUserMapper">
+    <insert id="addOne" parameterType="com.ytpm.app.model.YtDyzUser">
+        insert into yt_dyz_user
+        (
+         user_id,
+         nick_name,
+         head_img,
+         registry_time,
+         last_login_time,
+         last_login_ip,
+         login_days,
+         total_video,
+         total_income,
+         red_packet_balance,
+         red_packet_amount,
+         points_balance,
+         points_total,
+         withdraw_total,
+         sign_days,
+         user_status,
+         risk_reason,
+         wx_open_id,
+         ditch_id,
+         platform_id,
+         app_id,
+         power,
+         phone,
+         device_id
+        )
+        values
+        (
+         #{userId},
+         #{nickName},
+         #{headImg},
+         #{registryTime},
+         #{lastLoginTime},
+         #{lastLoginIp},
+         #{loginDays},
+         #{totalVideo},
+         #{totalIncome},
+         #{redPacketBalance},
+         #{redPacketAmount},
+         #{pointsBalance},
+         #{pointsTotal},
+         #{withdrawTotal},
+         #{signDays},
+         #{userStatus},
+         #{riskReason},
+         #{wxOpenId},
+         #{ditchId},
+         #{platformId},
+         #{appId},
+         #{power},
+         #{phone},
+         #{deviceId}
+        )
+    </insert>
+    <insert id="addPowerRecord">
+        insert into yt_dyz_power_record
+        (
+         record_id, user_id, type, remark, add_time
+        )
+        values
+        (
+         #{recordId},#{userId},#{type},#{remark},#{addTime}
+        )
+    </insert>
+    <insert id="saveAppConfig">
+        insert into yt_app_default_config
+        (
+         config_name,
+         open_id,
+         secret,
+         app_id,
+         app_key,
+         app_type
+        )
+        values
+        (
+         #{configName},
+         #{openId},
+         #{secret},
+         #{appId},
+         #{appKey},
+         #{appType}
+        )
+    </insert>
+    <update id="addOnePower">
+        update yt_dyz_user set power = power+1 where user_id = #{userId}
+    </update>
+    <update id="subOnePower">
+        update yt_dyz_user set power = power-1 where user_id = #{userId}
+    </update>
+    <update id="updateUser" parameterType="com.ytpm.app.model.YtDyzUser">
+        update yt_dyz_user
+        <set>
+            <if test="nickName != null">
+                nick_name = #{nickName},
+            </if>
+            <if test="phone != null">
+                phone = #{phone},
+            </if>
+            <if test="deviceId != null">
+                device_id = #{deviceId},
+            </if>
+            <if test="headImg != null">
+                head_img = #{headImg},
+            </if>
+            <if test="power != null">
+                power = #{power},
+            </if>
+            <if test="lastLoginTime != null">
+                last_login_time = #{lastLoginTime},
+            </if>
+            <if test="lastLoginIp != null">
+                last_login_ip = #{lastLoginIp},
+            </if>
+            <if test="loginDays != null">
+                login_days = #{loginDays},
+            </if>
+            <if test="totalVideo != null">
+                total_video = #{totalVideo},
+            </if>
+            <if test="totalIncome != null">
+                total_income = #{totalIncome},
+            </if>
+            <if test="redPacketBalance != null">
+                red_packet_balance = #{redPacketBalance},
+            </if>
+            <if test="redPacketAmount != null">
+                red_packet_amount = #{redPacketAmount},
+            </if>
+            <if test="pointsBalance != null">
+                points_balance = #{pointsBalance},
+            </if>
+            <if test="pointsTotal != null">
+                points_total = #{pointsTotal},
+            </if>
+            <if test="withdrawTotal != null">
+                withdraw_total = #{withdrawTotal},
+            </if>
+            <if test="signDays != null">
+                sign_days = #{signDays},
+            </if>
+            <if test="userStatus != null">
+                user_status = #{userStatus},
+            </if>
+            <if test="riskReason != null">
+                risk_reason = #{riskReason},
+            </if>
+            <if test="wxOpenId != null">
+                wx_open_id = #{wxOpenId},
+            </if>
+            <if test="platformId != null">
+                platform_id = #{platformId}
+            </if>
+        </set>
+        where user_id = #{userId}
+    </update>
+    <select id="getYtAppUser" resultType="com.ytpm.app.model.YtDyzUser">
+        select
+           user_id, app_id,phone,device_id, ditch_id, nick_name,head_img, power, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, platform_id
+        from yt_dyz_user
+        where wx_open_id = #{openid}
+        and ditch_id = #{ditchId}
+    </select>
+    <select id="queryAll" resultType="com.ytpm.app.view.YtAppUserListView">
+        select
+            user_id,app_id,phone,device_id, ditch_id, nick_name,head_img, power, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, platform_id
+        from yt_dyz_user
+        where 1 = 1
+        <if test="userId != null and userId !=''">
+            and user_id = #{userId}
+        </if>
+        <if test="nickName != null and nickName !=''">
+            and nick_name like concat('%',#{nickName},'%')
+        </if>
+        <if test="ditchId != null">
+            and ditch_id = #{ditchId}
+        </if>
+        <if test="userStatus != null">
+            and user_status = #{userStatus}
+        </if>
+        <if test="registryTimeBegin != null">
+            and DATE_FORMAT(registry_time, '%Y-%m-%d') <![CDATA[>=]]> DATE_FORMAT(#{registryTimeBegin}, '%Y-%m-%d')
+        </if>
+        <if test="registryTimeEnd != null">
+            and DATE_FORMAT(registry_time, '%Y-%m-%d') <![CDATA[<=]]> DATE_FORMAT(#{registryTimeEnd}, '%Y-%m-%d')
+        </if>
+        <if test="lastLoginTimeBegin != null">
+            and DATE_FORMAT(last_login_time, '%Y-%m-%d') <![CDATA[>=]]> DATE_FORMAT(#{lastLoginTimeBegin}, '%Y-%m-%d')
+        </if>
+        <if test="lastLoginTimeEnd != null">
+            and DATE_FORMAT(last_login_time, '%Y-%m-%d') <![CDATA[<=]]> DATE_FORMAT(#{lastLoginTimeEnd}, '%Y-%m-%d')
+        </if>
+        <if test="appIds != null and appIds != ''">
+            and app_id in
+                <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+                    #{item}
+                </foreach>
+        </if>
+        order by user_id desc
+    </select>
+    <select id="selectPrimaryKey" resultType="com.ytpm.app.model.YtDyzUser">
+        select
+            user_id,app_id,phone,device_id, ditch_id, head_img, nick_name, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, platform_id, power
+        from yt_dyz_user
+        where user_id = #{userId}
+    </select>
+    <select id="getUserList" resultType="com.ytpm.app.model.YtDyzUser">
+        select
+            du.user_id,
+            du.head_img,
+            du.nick_name,
+            du.phone,
+            du.device_id,
+            du.registry_time,
+            du.last_login_time,
+            du.last_login_ip,
+            du.login_days,
+            du.total_video,
+            du.total_income,
+            du.red_packet_balance,
+            du.red_packet_amount,
+            du.points_balance,
+            du.points_total,
+            du.withdraw_total,
+            du.sign_days,
+            du.user_status,
+            du.risk_reason,
+            du.wx_open_id,
+            du.ditch_id,
+            du.app_id,
+            du.platform_id,
+            du.power
+        from yt_dyz_user du
+        where du.user_id in
+        <foreach collection="userIds.split(',')" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="queryAllByTime" resultType="com.ytpm.app.model.YtDyzUser">
+        SELECT
+        user_id,app_id,phone,device_id, nick_name, head_img, power, registry_time,
+        last_login_time, last_login_ip, login_days, total_video,
+        total_income, red_packet_balance, red_packet_amount,
+        points_balance, points_total, withdraw_total, sign_days,
+        user_status, risk_reason, wx_open_id, platform_id
+        FROM yt_dyz_user
+        <where>
+            <if test="startTime != null">
+                AND registry_time >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND registry_time &lt;= #{endTime}
+            </if>
+            <choose>
+                <when test="appIdList == null or appIdList.isEmpty()">
+                    AND 1 = 0
+                </when>
+                <otherwise>
+                    AND app_id IN
+                    <foreach collection="appIdList" item="item"
+                             open="(" close=")" separator=",">
+                        #{item}
+                    </foreach>
+                </otherwise>
+            </choose>
+        </where>
+        ORDER BY registry_time DESC
+    </select>
+    <select id="countUsersByHour" resultType="com.ytpm.app.view.HourCountView">
+        SELECT HOUR(registry_time) AS hour, COUNT(*) AS count
+        FROM yt_dyz_user
+        WHERE registry_time BETWEEN #{startTime} AND #{endTime}
+        <choose>
+            <when test="appIdList == null or appIdList.isEmpty()">
+                AND 1 = 0
+            </when>
+            <otherwise>
+                AND app_id IN
+                <foreach collection="appIdList" item="item"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </otherwise>
+        </choose>
+        GROUP BY HOUR(registry_time)
+    </select>
+
+    <select id="queryTodayBanned" resultType="com.ytpm.app.model.YtDyzUser">
+        select user_id from yt_dyz_user
+        where registry_time BETWEEN #{startTime} AND #{endTime}
+        and user_id in
+        <foreach collection="userIdList" item="item"
+                 open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+    </select>
+
+
+    <select id="getDefaultConfig" resultType="com.ytpm.app.view.WxDefaultConfig">
+        select
+            config_id, config_name, open_id appId, secret, app_id platformAppId, app_key platformAppSecret, app_type,user_path,login_path,ad_path,answer_path,power_path
+        from yt_app_default_config
+        where app_type = #{appType}
+    </select>
+    <select id="getSecretByAppId" resultType="java.lang.String">
+        select
+           secret
+        from yt_app_default_config
+        where app_id = #{appId}
+    </select>
+    <select id="queryByOpenid" resultType="com.ytpm.app.model.YtDyzUser">
+        select
+            user_id,phone,device_id, head_img, nick_name, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, ditch_id, app_id, platform_id, power
+        from yt_dyz_user
+        where wx_open_id = #{openid}
+    </select>
+    <select id="getByDeviceId" resultType="java.lang.String">
+        select
+            platform_id
+        from yt_dyz_user
+        where device_id = #{deviceId}
+        and wx_open_id = #{openid}
+        limit 1
+    </select>
+    <select id="getConfigByIds" resultType="com.ytpm.app.view.WxDefaultConfig">
+        select
+            config_id, config_name, open_id, secret, app_id, app_key, app_type,user_path,login_path,ad_path,answer_path,power_path
+        from yt_app_default_config
+        where app_id in
+        <foreach collection="appIds.split(',')" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+    <select id="getAdCount" resultType="java.lang.Integer">
+        select
+            sum(total_video)
+        from yt_dyz_user
+        where app_id in
+        <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+    <select id="getRevenueCount" resultType="java.math.BigDecimal">
+        select
+        sum(total_income)
+        from yt_dyz_user
+        where app_id in
+        <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+    <select id="getAppRanking" resultType="com.ytpm.middle.view.AppRankingListVO">
+        SELECT
+            u.app_id,
+            sum( ar.revenue ) totalRevenue
+        FROM
+            yt_dyz_ad_record ar
+            JOIN yt_dyz_user u ON ar.user_id = u.user_id
+        <where>
+            <if test="sortBy != null">
+                <choose>
+                    <when test="sortBy == 1">
+                        DATE_FORMAT( ar.finish_time, '%Y-%m-%d' ) = CURRENT_DATE()
+                    </when>
+                    <when test=" sortBy == 2">
+                        YEARWEEK( ar.finish_time, 1 ) = YEARWEEK(now(),1)
+                    </when>
+                    <otherwise>
+                        DATE_FORMAT( ar.finish_time, '%Y-%m' ) = DATE_FORMAT(NOW(), '%Y-%m')
+                    </otherwise>
+                </choose>
+            </if>
+        </where>
+        GROUP BY
+            u.app_id
+        ORDER BY
+            sum( ar.revenue ) DESC
+        LIMIT #{limit}
+    </select>
+    <select id="getUserRanking" resultType="com.ytpm.middle.view.UserRankingListVO">
+        SELECT
+            u.user_id,
+            u.nick_name,
+            u.head_img,
+            u.total_video,
+            sum( ar.revenue ) totalIncome
+        FROM
+            yt_dyz_ad_record ar
+                JOIN yt_dyz_user u ON ar.user_id = u.user_id
+        <where>
+            <if test="sortBy != null">
+                <choose>
+                    <when test="sortBy == 1">
+                        DATE_FORMAT( ar.finish_time, '%Y-%m-%d' ) = CURRENT_DATE()
+                    </when>
+                    <when test=" sortBy == 2">
+                        YEARWEEK( ar.finish_time, 1 ) = YEARWEEK(now(),1)
+                    </when>
+                    <otherwise>
+                        DATE_FORMAT( ar.finish_time, '%Y-%m' ) = DATE_FORMAT(NOW(), '%Y-%m')
+                    </otherwise>
+                </choose>
+            </if>
+        </where>
+        GROUP BY ar.user_id
+        ORDER BY
+            sum( ar.revenue ) DESC
+        limit #{limit}
+    </select>
+</mapper>

+ 64 - 0
yt-app/app-service/src/main/resources/mapper/xjlrl/XjlrlAdRecordMapper.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.xjlrl.XjlrlAdRecordMapper">
+    <insert id="addOne">
+        insert into yt_dyz_ad_record
+        (
+            record_id,
+            user_id,
+            nick_name,
+            placement_id,
+            ad_source_id,
+            revenue,
+            network_form_id,
+            network_name,
+            network_placement_id,
+            begin_time,
+            finish_time,
+            result_json,
+            ad_source_index,
+            ad_source_type,
+            ecpm,
+            app_id
+        )
+        values
+            (
+                #{recordId},
+                #{userId},
+                #{nickName},
+                #{placementId},
+                #{adSourceId},
+                #{revenue},
+                #{networkFormId},
+                #{networkName},
+                #{networkPlacementId},
+                #{beginTime},
+                #{finishTime},
+                #{resultJson},
+                #{adSourceIndex},
+                #{adSourceType},
+                #{ecpm},
+                #{appId}
+            )
+    </insert>
+    <select id="getByUserId" resultType="com.ytpm.app.model.YtDyzAdRecord">
+        select
+        record_id, user_id,app_id, nick_name, placement_id, ad_source_id, revenue, network_form_id, network_name, network_placement_id, finish_time, begin_time,result_json,ad_source_type,ad_source_index,ecpm
+        from yt_dyz_ad_record
+        where user_id = #{userId}
+        <if test="adsourceType != null">
+            and ad_source_type = #{adsourceType}
+        </if>
+        order by finish_time desc
+    </select>
+    <select id="getByUserIds" resultType="com.ytpm.app.model.YtDyzAdRecord">
+        select
+        record_id, user_id,app_id, nick_name, placement_id, ad_source_id, revenue, network_form_id, network_name, network_placement_id, finish_time, begin_time,result_json,ad_source_type,ad_source_index,ecpm
+        from yt_dyz_ad_record
+        where user_id in
+        <foreach collection="userIds.split(',')" open="(" close=")" separator="," item="item">
+            #{item}
+        </foreach>
+        order by finish_time
+    </select>
+</mapper>

+ 64 - 0
yt-app/app-service/src/main/resources/mapper/xjlrl/XjlrlLoginRecordMapper.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.xjlrl.XjlrlLoginRecordMapper">
+
+    <insert id="insertOne" parameterType="com.ytpm.app.model.YtDyzLoginRecord">
+        insert into yt_dyz_login_record
+        (
+         record_id,
+         user_id,
+         login_time,
+         device_brand,
+         device_model,
+         login_ip,
+         operator,
+         ip_addr
+        )
+        values
+        (
+         #{recordId},
+         #{userId},
+         #{loginTime},
+         #{deviceBrand},
+         #{deviceModel},
+         #{loginIp},
+         #{operator},
+         #{ipAddr}
+         );
+    </insert>
+    <select id="getLoginRecords" resultType="com.ytpm.app.model.YtDyzLoginRecord">
+        select
+            record_id, user_id, login_time, device_brand, device_model, login_ip, operator, ip_addr
+        from yt_dyz_login_record
+        where user_id = #{userId}
+    </select>
+
+    <select id="queryLoginCount" resultType="String">
+        select ydlr.user_id
+        from yt_dyz_login_record ydlr
+        left join yt_dyz_user ydu on ydlr.user_id=ydu.user_id
+        <where>
+            <if test="startTime != null">
+                AND ydlr.login_time >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND ydlr.login_time &lt;= #{endTime}
+            </if>
+            <choose>
+                <when test="appIdList == null or appIdList.isEmpty()">
+                    AND 1 = 0
+                </when>
+                <otherwise>
+                    AND ydu.app_id IN
+                    <foreach collection="appIdList" item="item"
+                             open="(" close=")" separator=",">
+                        #{item}
+                    </foreach>
+                </otherwise>
+            </choose>
+        </where>
+        group by user_id
+    </select>
+
+
+</mapper>

+ 59 - 0
yt-app/app-service/src/main/resources/mapper/xjlrl/XjlrlQuestionMapper.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.xjlrl.XjlrlQuestionMapper">
+
+    <resultMap id="questionListMap" type="com.ytpm.app.view.QuestionListView">
+        <id column="question_id" property="questionId" />
+        <result column="question_content" property="questionContent" />
+        <result column="question_reward" property="questionReward" />
+        <result column="correct_item" property="correctItem" />
+        <collection property="itemList" ofType="com.ytpm.app.view.QuestionItemListView">
+            <id column="item_id" property="itemId" />
+            <result column="item_header" property="itemHeader" />
+            <result column="item_content" property="itemContent" />
+            <result column="question_id" property="questionId" />
+        </collection>
+    </resultMap>
+    <insert id="saveAnswerRecord">
+        insert into yt_dyz_answer_record (record_id, question_id, item_id, duration, answer_time, user_id)
+        values (#{recordId},#{questionId},#{itemId},#{duration},#{answerTime},#{userId});
+    </insert>
+    <select id="questionList" resultMap="questionListMap">
+        SELECT
+            ydq.question_id,
+            ydq.question_content,
+            ydq.question_reward,
+            ydq.correct_item,
+            ydqi.item_id,
+            ydqi.item_header,
+            ydqi.item_content,
+            ydqi.question_id
+        FROM yt_dyz_question ydq
+        LEFT JOIN yt_dyz_question_item ydqi
+        ON ydq.question_id = ydqi.question_id
+        where app_id = #{appId}
+    </select>
+    <select id="getLastQuestionId" resultType="java.lang.String">
+        select
+            question_id
+        from yt_dyz_answer_record
+        where user_id = #{userId}
+        order by answer_time desc limit 1
+    </select>
+    <select id="getAnswerCount" resultType="java.lang.Integer">
+        select
+            count(*)
+        from yt_dyz_answer_record
+        where user_id = #{userId}
+        <if test="type != null and type == 1">
+            and DATE_FORMAT(answer_time, '%Y-%m-%d') = current_date()
+        </if>
+    </select>
+    <select id="getAnswerRecords" resultType="com.ytpm.app.model.YtDyzAnswerRecord">
+        select
+            record_id, question_id, item_id, duration, answer_time, user_id
+        from yt_dyz_answer_record
+        where user_id = #{userId}
+        order by answer_time desc
+    </select>
+</mapper>

+ 416 - 0
yt-app/app-service/src/main/resources/mapper/xjlrl/XjlrlUserMapper.xml

@@ -0,0 +1,416 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.xjlrl.XjlrlUserMapper">
+    <insert id="addOne" parameterType="com.ytpm.app.model.YtDyzUser">
+        insert into yt_dyz_user
+        (
+         user_id,
+         nick_name,
+         head_img,
+         registry_time,
+         last_login_time,
+         last_login_ip,
+         login_days,
+         total_video,
+         total_income,
+         red_packet_balance,
+         red_packet_amount,
+         points_balance,
+         points_total,
+         withdraw_total,
+         sign_days,
+         user_status,
+         risk_reason,
+         wx_open_id,
+         ditch_id,
+         platform_id,
+         app_id,
+         power,
+         phone,
+         device_id
+        )
+        values
+        (
+         #{userId},
+         #{nickName},
+         #{headImg},
+         #{registryTime},
+         #{lastLoginTime},
+         #{lastLoginIp},
+         #{loginDays},
+         #{totalVideo},
+         #{totalIncome},
+         #{redPacketBalance},
+         #{redPacketAmount},
+         #{pointsBalance},
+         #{pointsTotal},
+         #{withdrawTotal},
+         #{signDays},
+         #{userStatus},
+         #{riskReason},
+         #{wxOpenId},
+         #{ditchId},
+         #{platformId},
+         #{appId},
+         #{power},
+         #{phone},
+         #{deviceId}
+        )
+    </insert>
+    <insert id="addPowerRecord">
+        insert into yt_dyz_power_record
+        (
+         record_id, user_id, type, remark, add_time
+        )
+        values
+        (
+         #{recordId},#{userId},#{type},#{remark},#{addTime}
+        )
+    </insert>
+    <insert id="saveAppConfig">
+        insert into yt_app_default_config
+        (
+         config_name,
+         open_id,
+         secret,
+         app_id,
+         app_key,
+         app_type
+        )
+        values
+        (
+         #{configName},
+         #{openId},
+         #{secret},
+         #{appId},
+         #{appKey},
+         #{appType}
+        )
+    </insert>
+    <update id="addOnePower">
+        update yt_dyz_user set power = power+1 where user_id = #{userId}
+    </update>
+    <update id="subOnePower">
+        update yt_dyz_user set power = power-1 where user_id = #{userId}
+    </update>
+    <update id="updateUser" parameterType="com.ytpm.app.model.YtDyzUser">
+        update yt_dyz_user
+        <set>
+            <if test="nickName != null">
+                nick_name = #{nickName},
+            </if>
+            <if test="phone != null">
+                phone = #{phone},
+            </if>
+            <if test="deviceId != null">
+                device_id = #{deviceId},
+            </if>
+            <if test="headImg != null">
+                head_img = #{headImg},
+            </if>
+            <if test="power != null">
+                power = #{power},
+            </if>
+            <if test="lastLoginTime != null">
+                last_login_time = #{lastLoginTime},
+            </if>
+            <if test="lastLoginIp != null">
+                last_login_ip = #{lastLoginIp},
+            </if>
+            <if test="loginDays != null">
+                login_days = #{loginDays},
+            </if>
+            <if test="totalVideo != null">
+                total_video = #{totalVideo},
+            </if>
+            <if test="totalIncome != null">
+                total_income = #{totalIncome},
+            </if>
+            <if test="redPacketBalance != null">
+                red_packet_balance = #{redPacketBalance},
+            </if>
+            <if test="redPacketAmount != null">
+                red_packet_amount = #{redPacketAmount},
+            </if>
+            <if test="pointsBalance != null">
+                points_balance = #{pointsBalance},
+            </if>
+            <if test="pointsTotal != null">
+                points_total = #{pointsTotal},
+            </if>
+            <if test="withdrawTotal != null">
+                withdraw_total = #{withdrawTotal},
+            </if>
+            <if test="signDays != null">
+                sign_days = #{signDays},
+            </if>
+            <if test="userStatus != null">
+                user_status = #{userStatus},
+            </if>
+            <if test="riskReason != null">
+                risk_reason = #{riskReason},
+            </if>
+            <if test="wxOpenId != null">
+                wx_open_id = #{wxOpenId},
+            </if>
+            <if test="platformId != null">
+                platform_id = #{platformId}
+            </if>
+        </set>
+        where user_id = #{userId}
+    </update>
+    <select id="getYtAppUser" resultType="com.ytpm.app.model.YtDyzUser">
+        select
+           user_id, app_id,phone,device_id, ditch_id, nick_name,head_img, power, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, platform_id
+        from yt_dyz_user
+        where wx_open_id = #{openid}
+        and ditch_id = #{ditchId}
+    </select>
+    <select id="queryAll" resultType="com.ytpm.app.view.YtAppUserListView">
+        select
+            user_id,app_id,phone,device_id, ditch_id, nick_name,head_img, power, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, platform_id
+        from yt_dyz_user
+        where 1 = 1
+        <if test="userId != null and userId !=''">
+            and user_id = #{userId}
+        </if>
+        <if test="nickName != null and nickName !=''">
+            and nick_name like concat('%',#{nickName},'%')
+        </if>
+        <if test="ditchId != null">
+            and ditch_id = #{ditchId}
+        </if>
+        <if test="userStatus != null">
+            and user_status = #{userStatus}
+        </if>
+        <if test="registryTimeBegin != null">
+            and DATE_FORMAT(registry_time, '%Y-%m-%d') <![CDATA[>=]]> DATE_FORMAT(#{registryTimeBegin}, '%Y-%m-%d')
+        </if>
+        <if test="registryTimeEnd != null">
+            and DATE_FORMAT(registry_time, '%Y-%m-%d') <![CDATA[<=]]> DATE_FORMAT(#{registryTimeEnd}, '%Y-%m-%d')
+        </if>
+        <if test="lastLoginTimeBegin != null">
+            and DATE_FORMAT(last_login_time, '%Y-%m-%d') <![CDATA[>=]]> DATE_FORMAT(#{lastLoginTimeBegin}, '%Y-%m-%d')
+        </if>
+        <if test="lastLoginTimeEnd != null">
+            and DATE_FORMAT(last_login_time, '%Y-%m-%d') <![CDATA[<=]]> DATE_FORMAT(#{lastLoginTimeEnd}, '%Y-%m-%d')
+        </if>
+        <if test="appIds != null and appIds != ''">
+            and app_id in
+                <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+                    #{item}
+                </foreach>
+        </if>
+        order by user_id desc
+    </select>
+    <select id="selectPrimaryKey" resultType="com.ytpm.app.model.YtDyzUser">
+        select
+            user_id,app_id,phone,device_id, ditch_id, head_img, nick_name, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, platform_id, power
+        from yt_dyz_user
+        where user_id = #{userId}
+    </select>
+    <select id="getUserList" resultType="com.ytpm.app.model.YtDyzUser">
+        select
+            du.user_id,
+            du.head_img,
+            du.nick_name,
+            du.phone,
+            du.device_id,
+            du.registry_time,
+            du.last_login_time,
+            du.last_login_ip,
+            du.login_days,
+            du.total_video,
+            du.total_income,
+            du.red_packet_balance,
+            du.red_packet_amount,
+            du.points_balance,
+            du.points_total,
+            du.withdraw_total,
+            du.sign_days,
+            du.user_status,
+            du.risk_reason,
+            du.wx_open_id,
+            du.ditch_id,
+            du.app_id,
+            du.platform_id,
+            du.power
+        from yt_dyz_user du
+        where du.user_id in
+        <foreach collection="userIds.split(',')" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="queryAllByTime" resultType="com.ytpm.app.model.YtDyzUser">
+        SELECT
+        user_id,app_id,phone,device_id, nick_name, head_img, power, registry_time,
+        last_login_time, last_login_ip, login_days, total_video,
+        total_income, red_packet_balance, red_packet_amount,
+        points_balance, points_total, withdraw_total, sign_days,
+        user_status, risk_reason, wx_open_id, platform_id
+        FROM yt_dyz_user
+        <where>
+            <if test="startTime != null">
+                AND registry_time >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND registry_time &lt;= #{endTime}
+            </if>
+            <choose>
+                <when test="appIdList == null or appIdList.isEmpty()">
+                    AND 1 = 0
+                </when>
+                <otherwise>
+                    AND app_id IN
+                    <foreach collection="appIdList" item="item"
+                             open="(" close=")" separator=",">
+                        #{item}
+                    </foreach>
+                </otherwise>
+            </choose>
+        </where>
+        ORDER BY registry_time DESC
+    </select>
+    <select id="countUsersByHour" resultType="com.ytpm.app.view.HourCountView">
+        SELECT HOUR(registry_time) AS hour, COUNT(*) AS count
+        FROM yt_dyz_user
+        WHERE registry_time BETWEEN #{startTime} AND #{endTime}
+        <choose>
+            <when test="appIdList == null or appIdList.isEmpty()">
+                AND 1 = 0
+            </when>
+            <otherwise>
+                AND app_id IN
+                <foreach collection="appIdList" item="item"
+                         open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </otherwise>
+        </choose>
+        GROUP BY HOUR(registry_time)
+    </select>
+
+    <select id="queryTodayBanned" resultType="com.ytpm.app.model.YtDyzUser">
+        select user_id from yt_dyz_user
+        where registry_time BETWEEN #{startTime} AND #{endTime}
+        and user_id in
+        <foreach collection="userIdList" item="item"
+                 open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+    </select>
+
+
+    <select id="getDefaultConfig" resultType="com.ytpm.app.view.WxDefaultConfig">
+        select
+            config_id, config_name, open_id appId, secret, app_id platformAppId, app_key platformAppSecret, app_type,user_path,login_path,ad_path,answer_path,power_path
+        from yt_app_default_config
+        where app_type = #{appType}
+    </select>
+    <select id="getSecretByAppId" resultType="java.lang.String">
+        select
+           secret
+        from yt_app_default_config
+        where app_id = #{appId}
+    </select>
+    <select id="queryByOpenid" resultType="com.ytpm.app.model.YtDyzUser">
+        select
+            user_id,phone,device_id, head_img, nick_name, registry_time, last_login_time, last_login_ip, login_days, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, risk_reason, wx_open_id, ditch_id, app_id, platform_id, power
+        from yt_dyz_user
+        where wx_open_id = #{openid}
+    </select>
+    <select id="getByDeviceId" resultType="java.lang.String">
+        select
+            platform_id
+        from yt_dyz_user
+        where device_id = #{deviceId}
+        and wx_open_id = #{openid}
+        limit 1
+    </select>
+    <select id="getConfigByIds" resultType="com.ytpm.app.view.WxDefaultConfig">
+        select
+            config_id, config_name, open_id, secret, app_id, app_key, app_type,user_path,login_path,ad_path,answer_path,power_path
+        from yt_app_default_config
+        where app_id in
+        <foreach collection="appIds.split(',')" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+    <select id="getAdCount" resultType="java.lang.Integer">
+        select
+            sum(total_video)
+        from yt_dyz_user
+        where app_id in
+        <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+    <select id="getRevenueCount" resultType="java.math.BigDecimal">
+        select
+        sum(total_income)
+        from yt_dyz_user
+        where app_id in
+        <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+    <select id="getAppRanking" resultType="com.ytpm.middle.view.AppRankingListVO">
+        SELECT
+            u.app_id,
+            sum( ar.revenue ) totalRevenue
+        FROM
+            yt_dyz_ad_record ar
+            JOIN yt_dyz_user u ON ar.user_id = u.user_id
+        <where>
+            <if test="sortBy != null">
+                <choose>
+                    <when test="sortBy == 1">
+                        DATE_FORMAT( ar.finish_time, '%Y-%m-%d' ) = CURRENT_DATE()
+                    </when>
+                    <when test=" sortBy == 2">
+                        YEARWEEK( ar.finish_time, 1 ) = YEARWEEK(now(),1)
+                    </when>
+                    <otherwise>
+                        DATE_FORMAT( ar.finish_time, '%Y-%m' ) = DATE_FORMAT(NOW(), '%Y-%m')
+                    </otherwise>
+                </choose>
+            </if>
+        </where>
+        GROUP BY
+            u.app_id
+        ORDER BY
+            sum( ar.revenue ) DESC
+        LIMIT #{limit}
+    </select>
+    <select id="getUserRanking" resultType="com.ytpm.middle.view.UserRankingListVO">
+        SELECT
+            u.user_id,
+            u.nick_name,
+            u.head_img,
+            u.total_video,
+            sum( ar.revenue ) totalIncome
+        FROM
+            yt_dyz_ad_record ar
+                JOIN yt_dyz_user u ON ar.user_id = u.user_id
+        <where>
+            <if test="sortBy != null">
+                <choose>
+                    <when test="sortBy == 1">
+                        DATE_FORMAT( ar.finish_time, '%Y-%m-%d' ) = CURRENT_DATE()
+                    </when>
+                    <when test=" sortBy == 2">
+                        YEARWEEK( ar.finish_time, 1 ) = YEARWEEK(now(),1)
+                    </when>
+                    <otherwise>
+                        DATE_FORMAT( ar.finish_time, '%Y-%m' ) = DATE_FORMAT(NOW(), '%Y-%m')
+                    </otherwise>
+                </choose>
+            </if>
+        </where>
+        GROUP BY ar.user_id
+        ORDER BY
+            sum( ar.revenue ) DESC
+        limit #{limit}
+    </select>
+</mapper>

+ 5 - 0
yt-common/src/main/java/com/ytpm/app/view/WxDefaultConfig.java

@@ -15,4 +15,9 @@ public class WxDefaultConfig {
     private String platformAppId;
     private String platformAppSecret;
     private int appType;
+    private String userPath;
+    private String loginPath;
+    private String adPath;
+    private String answerPath;
+    private String powerPath;
 }