From 3033ccf3878fae2c204df53be2a283f29f5853ed Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期五, 10 十月 2025 18:17:02 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/haizhentong

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysEducationalInfoController.java                                           |   30 +
 ruoyi-admin/src/main/resources/application-test.yml                                                                                 |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxOfficeTemplateAppLiveResultRequestData.java |   18 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysProductIntroductionController.java                                      |   10 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TSysProductIntroductionService.java                                             |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TSysActivityService.java                                                        |    3 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysLiveController.java                                                      |   32 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysLiveVO.java                                                                      |    2 
 ruoyi-system/src/main/resources/mapper/system/TSysProductIntroductionMapper.xml                                                     |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysProductIntroductionMapper.java                                               |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/model/TSysLive.java                                                                     |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/query/TSysEducationalInfoQuery.java                                                     |    3 
 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java                                                         |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java                                                               |    2 
 ruoyi-system/src/main/resources/mapper/system/TSysActivityMapper.xml                                                                |    2 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java                                                      |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysActivityMapper.java                                                          |    3 
 ruoyi-applet/src/main/resources/application-test.yml                                                                                |    2 
 ruoyi-admin/src/main/resources/application-prod.yml                                                                                 |    2 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysEducationalInfoController.java                                          |   10 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysLiveController.java                                                     |   29 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAppUserController.java                                                   |    4 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysActivityController.java                                                  |   30 +
 ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxOfficeTemplateAppLiveResultRequest.java     |   26 +
 ruoyi-system/src/main/java/com/ruoyi/system/model/TSysAppUser.java                                                                  |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysProductIntroductionServiceImpl.java                                    |   27 +
 ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml                                                                     |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/LivePushJob.java                                                              |   27 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysProductIntroductionVO.java                                                       |   15 
 ruoyi-system/src/main/java/com/ruoyi/system/query/TSysProductIntroductionQuery.java                                                 |    3 
 ruoyi-system/src/main/resources/mapper/system/TSysEducationalInfoMapper.xml                                                         |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/query/TSysActivityQuery.java                                                            |    3 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysConfigController.java                                                    |    5 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysActivityController.java                                                 |   10 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysActivityServiceImpl.java                                               |   28 +
 ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/model/WeixinProperties.java                                                    |   28 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysEducationalInfoVO.java                                                           |   15 
 ruoyi-applet/src/main/resources/application-prod.yml                                                                                |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java                                                            |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxTemplateAppLiveResultRequest.java           |   20 +
 ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java                                                                 |   29 +
 ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java                                                              |   10 
 ruoyi-system/src/main/resources/mapper/system/TSysAppUserMapper.xml                                                                 |    7 
 ruoyi-system/src/main/resources/mapper/system/TSysLiveMapper.xml                                                                    |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/listener/PublishTopicLiveInfoEventListener.java                                         |   97 +++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysProductIntroductionController.java                                       |   30 +
 ruoyi-system/src/main/java/com/ruoyi/system/utils/util/TemplateMessageSendUtil.java                                                 |  124 ++++++
 ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/tools/WxAppletTools.java                                                       |   47 ++
 ruoyi-system/src/main/java/com/ruoyi/system/model/TSysOtherConfig.java                                                              |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysEducationalInfoMapper.java                                                   |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/config/JacksonConfig.java                                                      |   35 +
 ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/Template.java                                                         |   19 +
 ruoyi-system/src/main/java/com/ruoyi/system/listener/event/PublishTopicLiveInfoEvent.java                                           |   17 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysEducationalInfoServiceImpl.java                                        |   28 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/TSysEducationalInfoService.java                                                 |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxTemplateAppLiveResultRequestData.java       |   18 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysActivityVO.java                                                                  |   15 
 ruoyi-system/src/main/java/com/ruoyi/system/utils/util/JsonUtils.java                                                               |  110 +++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java                                                    |    5 
 ruoyi-system/src/main/resources/mapper/system/TSysOtherConfigMapper.xml                                                             |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/query/TSysLiveQuery.java                                                                |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysLiveServiceImpl.java                                                   |   40 +-
 62 files changed, 1,010 insertions(+), 73 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysActivityController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysActivityController.java
index d19c332..5089e07 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysActivityController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysActivityController.java
@@ -4,19 +4,24 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.model.TSysActivity;
 import com.ruoyi.system.query.TSysActivityQuery;
 import com.ruoyi.system.service.TSysActivityService;
+import com.ruoyi.system.vo.TSysActivityVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -33,10 +38,12 @@
 
     private final TSysActivityService sysActivityService;
     private final TokenService tokenService;
+    private final RedisCache redisCache;
     @Autowired
-    public TSysActivityController(TSysActivityService sysActivityService, TokenService tokenService) {
+    public TSysActivityController(TSysActivityService sysActivityService, TokenService tokenService, RedisCache redisCache) {
         this.sysActivityService = sysActivityService;
         this.tokenService = tokenService;
+        this.redisCache = redisCache;
     }
 
     /**
@@ -44,10 +51,12 @@
      */
     @ApiOperation(value = "获取热门活动分页列表")
     @PostMapping(value = "/pageList")
-    public R<PageInfo<TSysActivity>> pageList(@RequestBody TSysActivityQuery query) {
+    public R<PageInfo<TSysActivityVO>> pageList(@RequestBody TSysActivityQuery query) {
         Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
+        Long userId = tokenService.getLoginUser().getUserId();
         if(roleType == 5){
             query.setRoleType(roleType);
+            query.setUserId(userId);
         }
         return R.ok(sysActivityService.pageList(query));
     }
@@ -87,7 +96,22 @@
     @ApiOperation(value = "查看热门活动详情")
     @GetMapping(value = "/getDetailById")
     public R<TSysActivity> getDetailById(@RequestParam String id) {
-        return R.ok(sysActivityService.getById(id));
+        TSysActivity sysActivity = sysActivityService.getById(id);
+        // 查询次数自增 使用数据库原子更新操作
+        sysActivityService.update(
+                Wrappers.<TSysActivity>lambdaUpdate()
+                        .setSql("click_count = click_count + 1")
+                        .eq(TSysActivity::getId, id)
+        );
+        // 如果是诊所
+        Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
+        if(roleType == 5){
+            Long userId = tokenService.getLoginUser().getUserId();
+            Set<Long> clickCount = new HashSet<>();
+            clickCount.add(userId);
+            redisCache.setCacheSet(Constants.SYS_ACTIVITY_CLICK_COUNT+id,clickCount);
+        }
+        return R.ok(sysActivity);
     }
 
     /**
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAppUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAppUserController.java
index 0c373bf..7dcd5a9 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAppUserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAppUserController.java
@@ -182,8 +182,8 @@
     /**
      * 分公司管理解冻冻结
      */
-    @Log(title = "用户管理信息-分公司管理解冻冻结", businessType = BusinessType.UPDATE)
-    @ApiOperation(value = "分公司管理解冻冻结",notes = "状态 1=使用中 2=冻结")
+    @Log(title = "用户管理信息-用户管理解冻冻结", businessType = BusinessType.UPDATE)
+    @ApiOperation(value = "用户管理解冻冻结",notes = "状态 1=使用中 2=冻结")
     @PutMapping(value = "/thawOrFreeze")
     public R<Boolean> thawOrFreeze(@RequestParam(value = "id")String id,
                                    @RequestParam(value = "status")Integer status) {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysConfigController.java
index 339ccb9..84325a5 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysConfigController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysConfigController.java
@@ -39,7 +39,10 @@
     @ApiOperation(value = "修改系统配置-协议管理管理")
     @PostMapping(value = "/update")
     public R<Boolean> update(@Validated @RequestBody TSysConfig dto) {
-        return R.ok(sysConfigService.updateById(dto));
+        TSysConfig sysConfig = sysConfigService.getOne(Wrappers.<TSysConfig>lambdaQuery().eq(TSysConfig::getConfigType, dto.getConfigType())
+                .last("LIMIT 1"));
+        sysConfig.setContent(dto.getContent());
+        return R.ok(sysConfigService.updateById(sysConfig));
     }
 
     /**
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysEducationalInfoController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysEducationalInfoController.java
index aa2dff6..d0455ca 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysEducationalInfoController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysEducationalInfoController.java
@@ -4,19 +4,24 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.model.TSysEducationalInfo;
 import com.ruoyi.system.query.TSysEducationalInfoQuery;
 import com.ruoyi.system.service.TSysEducationalInfoService;
+import com.ruoyi.system.vo.TSysEducationalInfoVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -33,10 +38,12 @@
 
     private final TSysEducationalInfoService sysEducationalInfoService;
     private final TokenService tokenService;
+    private final RedisCache redisCache;
     @Autowired
-    public TSysEducationalInfoController(TSysEducationalInfoService sysEducationalInfoService, TokenService tokenService) {
+    public TSysEducationalInfoController(TSysEducationalInfoService sysEducationalInfoService, TokenService tokenService, RedisCache redisCache) {
         this.sysEducationalInfoService = sysEducationalInfoService;
         this.tokenService = tokenService;
+        this.redisCache = redisCache;
     }
 
     /**
@@ -44,10 +51,12 @@
      */
     @ApiOperation(value = "获取教育资讯分页列表")
     @PostMapping(value = "/pageList")
-    public R<PageInfo<TSysEducationalInfo>> pageList(@RequestBody TSysEducationalInfoQuery query) {
+    public R<PageInfo<TSysEducationalInfoVO>> pageList(@RequestBody TSysEducationalInfoQuery query) {
         Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
+        Long userId = tokenService.getLoginUser().getUserId();
         if(roleType == 5){
             query.setRoleType(roleType);
+            query.setUserId(userId);
         }
         return R.ok(sysEducationalInfoService.pageList(query));
     }
@@ -87,7 +96,22 @@
     @ApiOperation(value = "查看教育资讯详情")
     @GetMapping(value = "/getDetailById")
     public R<TSysEducationalInfo> getDetailById(@RequestParam String id) {
-        return R.ok(sysEducationalInfoService.getById(id));
+        TSysEducationalInfo sysEducationalInfo = sysEducationalInfoService.getById(id);
+        // 查询次数自增 使用数据库原子更新操作
+        sysEducationalInfoService.update(
+                Wrappers.<TSysEducationalInfo>lambdaUpdate()
+                        .setSql("click_count = click_count + 1")
+                        .eq(TSysEducationalInfo::getId, id)
+        );
+        // 如果是诊所
+        Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
+        if(roleType == 5){
+            Long userId = tokenService.getLoginUser().getUserId();
+            Set<Long> clickCount = new HashSet<>();
+            clickCount.add(userId);
+            redisCache.setCacheSet(Constants.SYS_EDUCATION_CLICK_COUNT+id,clickCount);
+        }
+        return R.ok(sysEducationalInfo);
     }
 
     /**
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysLiveController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysLiveController.java
index 54d7251..ac6147e 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysLiveController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysLiveController.java
@@ -4,11 +4,14 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.model.TSysLive;
+import com.ruoyi.system.model.TSysProductIntroduction;
 import com.ruoyi.system.query.TSysLiveQuery;
 import com.ruoyi.system.service.TSysLiveService;
 import com.ruoyi.system.vo.TSysLiveVO;
@@ -19,7 +22,9 @@
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -36,10 +41,12 @@
 
     private final TSysLiveService sysLiveService;
     private final TokenService tokenService;
+    private final RedisCache redisCache;
     @Autowired
-    public TSysLiveController(TSysLiveService sysLiveService, TokenService tokenService) {
+    public TSysLiveController(TSysLiveService sysLiveService, TokenService tokenService, RedisCache redisCache) {
         this.sysLiveService = sysLiveService;
         this.tokenService = tokenService;
+        this.redisCache = redisCache;
     }
 
     /**
@@ -48,6 +55,12 @@
     @ApiOperation(value = "获取直播管理分页列表")
     @PostMapping(value = "/pageList")
     public R<PageInfo<TSysLiveVO>> pageList(@RequestBody TSysLiveQuery query) {
+        Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
+        Long userId = tokenService.getLoginUser().getUserId();
+        if(roleType == 5){
+            query.setRoleType(roleType);
+            query.setUserId(userId);
+        }
         return R.ok(sysLiveService.pageList(query));
     }
 
@@ -98,7 +111,22 @@
     @ApiOperation(value = "查看直播管理详情")
     @GetMapping(value = "/getDetailById")
     public R<TSysLive> getDetailById(@RequestParam String id) {
-        return R.ok(sysLiveService.getById(id));
+        TSysLive sysLive = sysLiveService.getById(id);
+        // 查询次数自增 使用数据库原子更新操作
+        sysLiveService.update(
+                Wrappers.<TSysLive>lambdaUpdate()
+                        .setSql("click_count = click_count + 1")
+                        .eq(TSysLive::getId, id)
+        );
+        // 如果是诊所
+        Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
+        if(roleType == 5){
+            Long userId = tokenService.getLoginUser().getUserId();
+            Set<Long> clickCount = new HashSet<>();
+            clickCount.add(userId);
+            redisCache.setCacheSet(Constants.SYS_LIVE_COUNT+id,clickCount);
+        }
+        return R.ok(sysLive);
     }
 
     /**
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysProductIntroductionController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysProductIntroductionController.java
index ddc021a..cb12276 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysProductIntroductionController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysProductIntroductionController.java
@@ -4,19 +4,24 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.model.TSysProductIntroduction;
 import com.ruoyi.system.query.TSysProductIntroductionQuery;
 import com.ruoyi.system.service.TSysProductIntroductionService;
+import com.ruoyi.system.vo.TSysProductIntroductionVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -33,10 +38,12 @@
 
     private final TSysProductIntroductionService sysProductIntroductionService;
     private final TokenService tokenService;
+    private final RedisCache redisCache;
     @Autowired
-    public TSysProductIntroductionController(TSysProductIntroductionService sysProductIntroductionService, TokenService tokenService) {
+    public TSysProductIntroductionController(TSysProductIntroductionService sysProductIntroductionService, TokenService tokenService, RedisCache redisCache) {
         this.sysProductIntroductionService = sysProductIntroductionService;
         this.tokenService = tokenService;
+        this.redisCache = redisCache;
     }
 
     /**
@@ -44,10 +51,12 @@
      */
     @ApiOperation(value = "获取产品介绍分页列表")
     @PostMapping(value = "/pageList")
-    public R<PageInfo<TSysProductIntroduction>> pageList(@RequestBody TSysProductIntroductionQuery query) {
+    public R<PageInfo<TSysProductIntroductionVO>> pageList(@RequestBody TSysProductIntroductionQuery query) {
         Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
+        Long userId = tokenService.getLoginUser().getUserId();
         if(roleType == 5){
             query.setRoleType(roleType);
+            query.setUserId(userId);
         }
         return R.ok(sysProductIntroductionService.pageList(query));
     }
@@ -87,7 +96,22 @@
     @ApiOperation(value = "查看产品介绍详情")
     @GetMapping(value = "/getDetailById")
     public R<TSysProductIntroduction> getDetailById(@RequestParam String id) {
-        return R.ok(sysProductIntroductionService.getById(id));
+        TSysProductIntroduction sysProductIntroduction = sysProductIntroductionService.getById(id);
+        // 查询次数自增 使用数据库原子更新操作
+        sysProductIntroductionService.update(
+                Wrappers.<TSysProductIntroduction>lambdaUpdate()
+                        .setSql("click_count = click_count + 1")
+                        .eq(TSysProductIntroduction::getId, id)
+        );
+        // 如果是诊所
+        Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
+        if(roleType == 5){
+            Long userId = tokenService.getLoginUser().getUserId();
+            Set<Long> clickCount = new HashSet<>();
+            clickCount.add(userId);
+            redisCache.setCacheSet(Constants.SYS_PRODUCT_CLICK_COUNT+id,clickCount);
+        }
+        return R.ok(sysProductIntroduction);
     }
 
     /**
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index e909611..a2aa9e9 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -207,6 +207,8 @@
   conf:
     appId: wx75922efb57320f77
     secretId: 7a2aa1f837b7aeb3bc24a6b569c65110
+    appLiveResultTemplateId: 1wheNdyQ88Cz9Z7L1EXxR2L0u4X4LaeXoZVtZwHCagk
+    officeAppLiveResultTemplateId: 7w1JVe3S4ClFnff7g8us7x-hqFuV3f2SKjKclP_X2FI
 #OSS及短信配置
 code:
   config:
diff --git a/ruoyi-admin/src/main/resources/application-test.yml b/ruoyi-admin/src/main/resources/application-test.yml
index e6e0738..64023cd 100644
--- a/ruoyi-admin/src/main/resources/application-test.yml
+++ b/ruoyi-admin/src/main/resources/application-test.yml
@@ -198,6 +198,8 @@
   conf:
     appId: wxa17e8d1331e50934
     secretId: 79c234527fd3b6553679d52be5e29b19
+    appLiveResultTemplateId: 1wheNdyQ88Cz9Z7L1EXxR2L0u4X4LaeXoZVtZwHCagk
+    officeAppLiveResultTemplateId: 7w1JVe3S4ClFnff7g8us7x-hqFuV3f2SKjKclP_X2FI
 lakala:
   MerchantNo: 822290059430BFA
   TermNo: D9261078
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysActivityController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysActivityController.java
index 8a47196..b5d00c3 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysActivityController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysActivityController.java
@@ -17,6 +17,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * <p>
@@ -63,7 +64,14 @@
     @ApiOperation(value = "查看热门活动详情")
     @GetMapping(value = "/getDetailById")
     public R<TSysActivity> getDetailById(@RequestParam String id) {
-        return R.ok(sysActivityService.getById(id));
+        TSysActivity sysActivity = sysActivityService.getById(id);
+        // 查询次数自增 使用数据库原子更新操作
+        sysActivityService.update(
+                Wrappers.<TSysActivity>lambdaUpdate()
+                        .setSql("click_count = click_count + 1")
+                        .eq(TSysActivity::getId, id)
+        );
+        return R.ok(sysActivity);
     }
 }
 
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysEducationalInfoController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysEducationalInfoController.java
index f4ca8ff..aa364e4 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysEducationalInfoController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysEducationalInfoController.java
@@ -7,6 +7,7 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.system.model.TSysActivity;
 import com.ruoyi.system.model.TSysEducationalInfo;
 import com.ruoyi.system.query.TSysEducationalInfoQuery;
 import com.ruoyi.system.service.TSysEducationalInfoService;
@@ -63,7 +64,14 @@
     @ApiOperation(value = "查看教育资讯详情")
     @GetMapping(value = "/getDetailById")
     public R<TSysEducationalInfo> getDetailById(@RequestParam String id) {
-        return R.ok(sysEducationalInfoService.getById(id));
+        TSysEducationalInfo sysEducationalInfo = sysEducationalInfoService.getById(id);
+        // 查询次数自增 使用数据库原子更新操作
+        sysEducationalInfoService.update(
+                Wrappers.<TSysEducationalInfo>lambdaUpdate()
+                        .setSql("click_count = click_count + 1")
+                        .eq(TSysEducationalInfo::getId, id)
+        );
+        return R.ok(sysEducationalInfo);
     }
 
 }
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysLiveController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysLiveController.java
index da74297..ee1a30e 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysLiveController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysLiveController.java
@@ -2,6 +2,7 @@
 
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.common.collect.ImmutableMap;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.constant.Constants;
@@ -9,11 +10,15 @@
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.redis.service.RedisService;
+import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.model.TSysLive;
 import com.ruoyi.system.query.TSysLiveQuery;
 import com.ruoyi.system.service.TSysLiveService;
+import com.ruoyi.system.task.base.QuartzManager;
+import com.ruoyi.system.task.base.TimeJobType;
+import com.ruoyi.system.task.jobs.LivePushJob;
 import com.ruoyi.system.vo.TSysLiveVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -24,6 +29,7 @@
 import java.time.LocalDateTime;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -64,7 +70,14 @@
     @ApiOperation(value = "查看直播管理详情")
     @GetMapping(value = "/getDetailById")
     public R<TSysLive> getDetailById(@RequestParam String id) {
-        return R.ok(sysLiveService.getById(id));
+        TSysLive sysLive = sysLiveService.getById(id);
+        // 查询次数自增 使用数据库原子更新操作
+        sysLiveService.update(
+                Wrappers.<TSysLive>lambdaUpdate()
+                        .setSql("click_count = click_count + 1")
+                        .eq(TSysLive::getId, id)
+        );
+        return R.ok(sysLive);
     }
 
     /**
@@ -82,6 +95,20 @@
         Set<String> appointmentPush = new HashSet<>();
         appointmentPush.add(userId);
         redisCache.setCacheSet(Constants.LIVE_APPOINTMENT_PUSH + id, appointmentPush);
+
+        TSysLive sysLive = sysLiveService.getById(id);
+        Map<String, ? extends Object> maps =
+                new ImmutableMap.Builder<String, String>().
+                        put("id", sysLive.getId())
+                        .build();
+        QuartzManager.addJob(
+                LivePushJob.class,
+                (LivePushJob.name+sysLive.getId()).toUpperCase(),
+                TimeJobType.LIVE_PUSH,
+                DateUtils.localDateTimeToDate(sysLive.getStartTime().minusHours(1)),
+                maps
+        );
+
         return R.ok();
     }
 
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysProductIntroductionController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysProductIntroductionController.java
index a2d1793..affec12 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysProductIntroductionController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysProductIntroductionController.java
@@ -7,6 +7,7 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.system.model.TSysEducationalInfo;
 import com.ruoyi.system.model.TSysProductIntroduction;
 import com.ruoyi.system.query.TSysProductIntroductionQuery;
 import com.ruoyi.system.service.TSysProductIntroductionService;
@@ -63,7 +64,14 @@
     @ApiOperation(value = "查看产品介绍详情")
     @GetMapping(value = "/getDetailById")
     public R<TSysProductIntroduction> getDetailById(@RequestParam String id) {
-        return R.ok(sysProductIntroductionService.getById(id));
+        TSysProductIntroduction sysProductIntroduction = sysProductIntroductionService.getById(id);
+        // 查询次数自增 使用数据库原子更新操作
+        sysProductIntroductionService.update(
+                Wrappers.<TSysProductIntroduction>lambdaUpdate()
+                        .setSql("click_count = click_count + 1")
+                        .eq(TSysProductIntroduction::getId, id)
+        );
+        return R.ok(sysProductIntroduction);
     }
 
 }
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java
index a7c591a..cd12cba 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java
@@ -177,7 +177,7 @@
     @PostMapping("/getWXToken")
     public R<String> getWXToken(){
         WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig, redisService);
-        String accessToken = appletTools.getAccessToken("");
+        String accessToken = appletTools.getAccessToken();
         return R.ok(accessToken);
     }
     
diff --git a/ruoyi-applet/src/main/resources/application-prod.yml b/ruoyi-applet/src/main/resources/application-prod.yml
index 2e0d44b..4533348 100644
--- a/ruoyi-applet/src/main/resources/application-prod.yml
+++ b/ruoyi-applet/src/main/resources/application-prod.yml
@@ -208,6 +208,8 @@
   conf:
     appId: wx75922efb57320f77
     secretId: 7a2aa1f837b7aeb3bc24a6b569c65110
+    appLiveResultTemplateId: 1wheNdyQ88Cz9Z7L1EXxR2L0u4X4LaeXoZVtZwHCagk
+    officeAppLiveResultTemplateId: 7w1JVe3S4ClFnff7g8us7x-hqFuV3f2SKjKclP_X2FI
 #OSS及短信配置
 code:
   config:
diff --git a/ruoyi-applet/src/main/resources/application-test.yml b/ruoyi-applet/src/main/resources/application-test.yml
index 66506dc..7395a35 100644
--- a/ruoyi-applet/src/main/resources/application-test.yml
+++ b/ruoyi-applet/src/main/resources/application-test.yml
@@ -199,6 +199,8 @@
   conf:
     appId: wxa17e8d1331e50934
     secretId: 79c234527fd3b6553679d52be5e29b19
+    appLiveResultTemplateId: 1wheNdyQ88Cz9Z7L1EXxR2L0u4X4LaeXoZVtZwHCagk
+    officeAppLiveResultTemplateId: 7w1JVe3S4ClFnff7g8us7x-hqFuV3f2SKjKclP_X2FI
 payment:
   wx:
     # 微信appid
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
index 354adaa..168cac4 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
@@ -178,4 +178,33 @@
      * 用户检测缓存
      */
     public static final String AI_USER_INSPECTION = "ai_user_inspection:";
+    /**
+     * 热门活动点击缓存
+     */
+    public static final String SYS_ACTIVITY_CLICK_COUNT = "sys_activity_click_count:";
+    /**
+     * 产品介绍点击缓存
+     */
+    public static final String SYS_EDUCATION_CLICK_COUNT = "sys_education_click_count:";
+    /**
+     * 教育咨询点击缓存
+     */
+    public static final String SYS_PRODUCT_CLICK_COUNT = "sys_product_click_count:";
+    /**
+     * 直播点击缓存
+     */
+    public static final String SYS_LIVE_COUNT = "sys_live_count:";
+
+
+
+
+
+    /**
+     * 小程序订阅消息发送地址
+     */
+    public static final String TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN";
+    /**
+     * 模板消息发送地址
+     */
+    public static final String OFFICIAL_ACCOUNT_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/subscribe?access_token=ACCESS_TOKEN";
 }
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
index d4a3725..9c79238 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
@@ -135,7 +135,9 @@
     @ApiModelProperty(value = "角色类型 1=平台 2=分公司 3=业务员 4=供应商 5=诊所端 6=仓库员")
     @TableField(value = "role_type")
     private Integer roleType;
-
+    @ApiModelProperty(value = "微信openid")
+    @TableField("open_id")
+    private String openId;
     public String getRoleName() {
         return roleName;
     }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/listener/PublishTopicLiveInfoEventListener.java b/ruoyi-system/src/main/java/com/ruoyi/system/listener/PublishTopicLiveInfoEventListener.java
new file mode 100644
index 0000000..1b8cdd9
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/listener/PublishTopicLiveInfoEventListener.java
@@ -0,0 +1,97 @@
+package com.ruoyi.system.listener;
+
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.system.listener.event.PublishTopicLiveInfoEvent;
+import com.ruoyi.system.model.TCrmClinic;
+import com.ruoyi.system.model.TCrmSalesperson;
+import com.ruoyi.system.model.TSysAppUser;
+import com.ruoyi.system.model.TSysLive;
+import com.ruoyi.system.service.*;
+import com.ruoyi.system.utils.util.TemplateMessageSendUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.event.EventListener;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @author xiaochen
+ * @ClassName PublishTopicUpdateCollectEventListener
+ * @Description
+ * @date 2021-08-11 18:44
+ */
+@Slf4j
+@Component
+public class PublishTopicLiveInfoEventListener {
+
+    @Autowired
+    private TemplateMessageSendUtil templateMessageSendUtil;
+    @Autowired
+    private TCrmClinicService crmClinicService;
+    @Autowired
+    private TSysAppUserService sysAppUserService;
+    @Autowired
+    private TCrmSalespersonService crmSalespersonService;
+    @Autowired
+    private TSysLiveService sysLiveService;
+    @Autowired
+    private ISysUserService sysUserService;
+
+    @Async
+    @EventListener(PublishTopicLiveInfoEvent.class)
+    public void PublishTopicLiveInfoEventListener(PublishTopicLiveInfoEvent event) {
+        String pushTypeAndId = (String) event.getSource();
+        String[] split = pushTypeAndId.split("_");
+        String pushType = split[0];
+        String liveId = split[1];
+        try {
+            // 查询直播信息
+            TSysLive sysLive = sysLiveService.getById(liveId);
+            if(Objects.isNull(sysLive)){
+                log.error("模板消息发送--未查询到直播信息");
+                return;
+            }
+            String liveTitle = sysLive.getLiveTitle();
+            String liveStartTime = DateUtils.localDateTimeToString(sysLive.getStartTime());
+            log.info("开始发送直播信息");
+            if(pushType.contains("1")){
+                // 诊所
+                List<TCrmClinic> clinicList = crmClinicService.list();
+                if(!CollectionUtils.isEmpty(clinicList)){
+                    List<Long> userIds = clinicList.stream().map(TCrmClinic::getUserId).collect(Collectors.toList());
+                    List<SysUser> sysUserList = sysUserService.selectUserListByIds(userIds);
+                    for (SysUser user : sysUserList) {
+                        templateMessageSendUtil.wxOfficeTemplateAppLiveRequest(user.getOpenId(),liveTitle,liveStartTime);
+                    }
+                }
+            }
+            if(pushType.contains("2")){
+                // 用户
+                List<TSysAppUser> sysAppUsers = sysAppUserService.list();
+                for (TSysAppUser sysAppUser : sysAppUsers) {
+                    templateMessageSendUtil.wxOfficeTemplateAppLiveRequest(sysAppUser.getOfficeOpenId(),liveTitle,liveStartTime);
+                }
+            }
+            if(pushType.contains("3")){
+                // 业务员
+                List<TCrmSalesperson> crmSalespeopleList = crmSalespersonService.list();
+                if(!CollectionUtils.isEmpty(crmSalespeopleList)){
+                    List<Long> userIds = crmSalespeopleList.stream().map(TCrmSalesperson::getUserId).collect(Collectors.toList());
+                    List<SysUser> sysUserList = sysUserService.selectUserListByIds(userIds);
+                    for (SysUser user : sysUserList) {
+                        templateMessageSendUtil.wxOfficeTemplateAppLiveRequest(user.getOpenId(),liveTitle,liveStartTime);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("发送直播信息失败:{}", e.getMessage());
+        }
+    }
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/listener/event/PublishTopicLiveInfoEvent.java b/ruoyi-system/src/main/java/com/ruoyi/system/listener/event/PublishTopicLiveInfoEvent.java
new file mode 100644
index 0000000..f80ed05
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/listener/event/PublishTopicLiveInfoEvent.java
@@ -0,0 +1,17 @@
+package com.ruoyi.system.listener.event;
+
+import org.springframework.context.ApplicationEvent;
+
+/**
+ * @author xiaochen
+ * @ClassName member微信用户信息的注册修改的发布事件
+ * @Description 微信用户信息的注册修改的发布事件
+ * @date 2021-06-24 15:04
+ */
+public class PublishTopicLiveInfoEvent extends ApplicationEvent {
+
+    public PublishTopicLiveInfoEvent(String source) {
+        super(source);
+    }
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
index e13fbc8..405cff1 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
@@ -180,4 +180,6 @@
     List<SysUser> selectBatchIds(@Param("personIds") List<Integer> personIds);
 
     void updateUserStatusByUserIds(@Param("userIds")List<Long> userIds, @Param("status")String status);
+
+    List<SysUser> selectUserListByIds(@Param("userIds")List<Long> userIds);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysActivityMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysActivityMapper.java
index 3ca60cb..dfc4d77 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysActivityMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysActivityMapper.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TSysActivity;
 import com.ruoyi.system.query.TSysActivityQuery;
+import com.ruoyi.system.vo.TSysActivityVO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -25,7 +26,7 @@
      * @param pageInfo
      * @return
      */
-    List<TSysActivity> pageList(@Param("query") TSysActivityQuery query, @Param("pageInfo")PageInfo<TSysActivity> pageInfo);
+    List<TSysActivityVO> pageList(@Param("query") TSysActivityQuery query, @Param("pageInfo")PageInfo<TSysActivityVO> pageInfo);
     /**
      * 分页查询
      *
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysEducationalInfoMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysEducationalInfoMapper.java
index 5e06362..8a80deb 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysEducationalInfoMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysEducationalInfoMapper.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TSysEducationalInfo;
 import com.ruoyi.system.query.TSysEducationalInfoQuery;
+import com.ruoyi.system.vo.TSysEducationalInfoVO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -24,7 +25,7 @@
      * @param pageInfo
      * @return
      */
-    List<TSysEducationalInfo> pageList(@Param("query") TSysEducationalInfoQuery query, @Param("pageInfo")PageInfo<TSysEducationalInfo> pageInfo);
+    List<TSysEducationalInfoVO> pageList(@Param("query") TSysEducationalInfoQuery query, @Param("pageInfo")PageInfo<TSysEducationalInfoVO> pageInfo);
     /**
      * 获取教育资讯分页列表
      * @param query
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysProductIntroductionMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysProductIntroductionMapper.java
index 637bf5d..1e386ab 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysProductIntroductionMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysProductIntroductionMapper.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TSysProductIntroduction;
 import com.ruoyi.system.query.TSysProductIntroductionQuery;
+import com.ruoyi.system.vo.TSysProductIntroductionVO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -25,7 +26,7 @@
      * @param pageInfo
      * @return
      */
-    List<TSysProductIntroduction> pageList(@Param("query") TSysProductIntroductionQuery query, @Param("pageInfo")PageInfo<TSysProductIntroduction> pageInfo);
+    List<TSysProductIntroductionVO> pageList(@Param("query") TSysProductIntroductionQuery query, @Param("pageInfo")PageInfo<TSysProductIntroductionVO> pageInfo);
     /**
      * 分页查询
      *
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysAppUser.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysAppUser.java
index 27942c1..9c5b2cf 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysAppUser.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysAppUser.java
@@ -51,6 +51,10 @@
     @TableField("open_id")
     private String openId;
 
+    @ApiModelProperty(value = "公众号openId")
+    @TableField("office_open_id")
+    private String officeOpenId;
+
     @ApiModelProperty(value = "慢性病id,逗号分割")
     @TableField("chronic_disease_id")
     private String chronicDiseaseId;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysLive.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysLive.java
index 7dca2d8..3e6fd15 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysLive.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysLive.java
@@ -84,4 +84,7 @@
     @TableField("push_type")
     private String pushType;
 
+    @ApiModelProperty(value = "点击次数")
+    @TableField("click_count")
+    private Integer clickCount;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysOtherConfig.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysOtherConfig.java
index 324006d..53b23d9 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysOtherConfig.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysOtherConfig.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BaseModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -23,7 +24,7 @@
 @EqualsAndHashCode(callSuper = false)
 @TableName("t_sys_other_config")
 @ApiModel(value="TSysOtherConfig对象", description="其他设置")
-public class TSysOtherConfig implements Serializable {
+public class TSysOtherConfig extends BaseModel {
 
     private static final long serialVersionUID = 1L;
 
@@ -51,9 +52,8 @@
     private BigDecimal aiPrice;
 
     @ApiModelProperty(value = "自动收货时间")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @TableField("delivery_time")
-    private LocalDateTime deliveryTime;
+    private Integer deliveryTime;
 
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysActivityQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysActivityQuery.java
index 6c37033..daf7473 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysActivityQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysActivityQuery.java
@@ -21,4 +21,7 @@
 
     @ApiModelProperty(value = "角色类型")
     private Integer roleType;
+
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysEducationalInfoQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysEducationalInfoQuery.java
index 0605524..071df4d 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysEducationalInfoQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysEducationalInfoQuery.java
@@ -20,4 +20,7 @@
 
     @ApiModelProperty(value = "角色类型")
     private Integer roleType;
+
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysLiveQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysLiveQuery.java
index 867ad6e..ce927ca 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysLiveQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysLiveQuery.java
@@ -17,4 +17,10 @@
 
     @ApiModelProperty(value = "前端忽略")
     private String appUserId;
+
+    @ApiModelProperty(value = "角色类型")
+    private Integer roleType;
+
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysProductIntroductionQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysProductIntroductionQuery.java
index 12b4b5e..f4a439e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysProductIntroductionQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysProductIntroductionQuery.java
@@ -21,4 +21,7 @@
 
     @ApiModelProperty(value = "角色类型")
     private Integer roleType;
+
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
index 9551d0a..d5eecd4 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
@@ -1,6 +1,7 @@
 package com.ruoyi.system.service;
 
 import java.util.List;
+import java.util.Set;
 
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.entity.SysUser;
@@ -263,4 +264,6 @@
     long selectIdByPhone(String phonenumber);
 
     void updateUserStatusByUserIds(List<Long> userIds, String status);
+
+    List<SysUser> selectUserListByIds(List<Long> userIds);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysActivityService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysActivityService.java
index b0a6a77..5b9e32c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysActivityService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysActivityService.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TSysActivity;
 import com.ruoyi.system.query.TSysActivityQuery;
+import com.ruoyi.system.vo.TSysActivityVO;
 
 /**
  * <p>
@@ -20,7 +21,7 @@
      * @param query
      * @return
      */
-    PageInfo<TSysActivity> pageList(TSysActivityQuery query);
+    PageInfo<TSysActivityVO> pageList(TSysActivityQuery query);
     /**
      * 获取热门活动分页列表
      * @param query
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysEducationalInfoService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysEducationalInfoService.java
index 7421efa..5227307 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysEducationalInfoService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysEducationalInfoService.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TSysEducationalInfo;
 import com.ruoyi.system.query.TSysEducationalInfoQuery;
+import com.ruoyi.system.vo.TSysEducationalInfoVO;
 
 /**
  * <p>
@@ -20,7 +21,7 @@
      * @param query
      * @return
      */
-    PageInfo<TSysEducationalInfo> pageList(TSysEducationalInfoQuery query);
+    PageInfo<TSysEducationalInfoVO> pageList(TSysEducationalInfoQuery query);
     /**
      * 获取教育资讯分页列表
      * @param query
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysProductIntroductionService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysProductIntroductionService.java
index 1e978e6..d19d6fc 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysProductIntroductionService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysProductIntroductionService.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TSysProductIntroduction;
 import com.ruoyi.system.query.TSysProductIntroductionQuery;
+import com.ruoyi.system.vo.TSysProductIntroductionVO;
 
 /**
  * <p>
@@ -20,7 +21,7 @@
      * @param query
      * @return
      */
-    PageInfo<TSysProductIntroduction> pageList(TSysProductIntroductionQuery query);
+    PageInfo<TSysProductIntroductionVO> pageList(TSysProductIntroductionQuery query);
     /**
      * 获取产品介绍分页列表
      * @param query
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
index 6e244da..547decd 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -669,6 +669,11 @@
         userMapper.updateUserStatusByUserIds(userIds, status);
     }
 
+    @Override
+    public List<SysUser> selectUserListByIds(List<Long> userIds) {
+        return userMapper.selectUserListByIds(userIds);
+    }
+
 //    @Override
 //    public UserInfoVo userInfo(Long userId) {
 //        return userMapper.userInfo(userId);
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysActivityServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysActivityServiceImpl.java
index 113ab49..17b0a55 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysActivityServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysActivityServiceImpl.java
@@ -2,14 +2,21 @@
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.system.mapper.TSysActivityMapper;
 import com.ruoyi.system.model.TSysActivity;
 import com.ruoyi.system.model.TSysEducationalInfo;
 import com.ruoyi.system.query.TSysActivityQuery;
 import com.ruoyi.system.service.TSysActivityService;
+import com.ruoyi.system.vo.TSysActivityVO;
+import com.ruoyi.system.vo.TSysProductIntroductionVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -21,11 +28,24 @@
  */
 @Service
 public class TSysActivityServiceImpl extends ServiceImpl<TSysActivityMapper, TSysActivity> implements TSysActivityService {
-
+    @Autowired
+    private RedisCache redisCache;
     @Override
-    public PageInfo<TSysActivity> pageList(TSysActivityQuery query) {
-        PageInfo<TSysActivity> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
-        List<TSysActivity> list = this.baseMapper.pageList(query,pageInfo);
+    public PageInfo<TSysActivityVO> pageList(TSysActivityQuery query) {
+        PageInfo<TSysActivityVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        List<TSysActivityVO> list = this.baseMapper.pageList(query,pageInfo);
+        if (CollectionUtils.isEmpty(list)){
+            return pageInfo;
+        }
+        if(query.getRoleType() == 5){
+            Long userId = query.getUserId();
+            for (TSysActivityVO sysActivityVO : list) {
+                Set<Long> cacheSet = redisCache.getCacheSet(Constants.SYS_ACTIVITY_CLICK_COUNT + sysActivityVO.getId());
+                if(cacheSet.contains(userId)){
+                    sysActivityVO.setIsView(true);
+                }
+            }
+        }
         pageInfo.setRecords(list);
         return pageInfo;
     }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysEducationalInfoServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysEducationalInfoServiceImpl.java
index 14bd192..daade89 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysEducationalInfoServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysEducationalInfoServiceImpl.java
@@ -1,15 +1,22 @@
 package com.ruoyi.system.service.impl;
 
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.system.model.TErpGoodsType;
 import com.ruoyi.system.model.TSysEducationalInfo;
 import com.ruoyi.system.mapper.TSysEducationalInfoMapper;
 import com.ruoyi.system.query.TSysEducationalInfoQuery;
 import com.ruoyi.system.service.TSysEducationalInfoService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.vo.TSysEducationalInfoVO;
+import com.ruoyi.system.vo.TSysProductIntroductionVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -21,11 +28,24 @@
  */
 @Service
 public class TSysEducationalInfoServiceImpl extends ServiceImpl<TSysEducationalInfoMapper, TSysEducationalInfo> implements TSysEducationalInfoService {
-
+    @Autowired
+    private RedisCache redisCache;
     @Override
-    public PageInfo<TSysEducationalInfo> pageList(TSysEducationalInfoQuery query) {
-        PageInfo<TSysEducationalInfo> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
-        List<TSysEducationalInfo> list = this.baseMapper.pageList(query,pageInfo);
+    public PageInfo<TSysEducationalInfoVO> pageList(TSysEducationalInfoQuery query) {
+        PageInfo<TSysEducationalInfoVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        List<TSysEducationalInfoVO> list = this.baseMapper.pageList(query,pageInfo);
+        if (CollectionUtils.isEmpty(list)){
+            return pageInfo;
+        }
+        if(query.getRoleType() == 5){
+            Long userId = query.getUserId();
+            for (TSysEducationalInfoVO sysEducationalInfoVO : list) {
+                Set<Long> cacheSet = redisCache.getCacheSet(Constants.SYS_EDUCATION_CLICK_COUNT + sysEducationalInfoVO.getId());
+                if(cacheSet.contains(userId)){
+                    sysEducationalInfoVO.setIsView(true);
+                }
+            }
+        }
         pageInfo.setRecords(list);
         return pageInfo;
     }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysLiveServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysLiveServiceImpl.java
index 1e8bbd3..3b15301 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysLiveServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysLiveServiceImpl.java
@@ -7,6 +7,8 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.system.listener.PublishTopicLiveInfoEventListener;
+import com.ruoyi.system.listener.event.PublishTopicLiveInfoEvent;
 import com.ruoyi.system.mapper.TSysLiveMapper;
 import com.ruoyi.system.model.TSysEducationalInfo;
 import com.ruoyi.system.model.TSysLive;
@@ -15,16 +17,16 @@
 import com.ruoyi.system.task.base.QuartzManager;
 import com.ruoyi.system.task.base.TimeJobType;
 import com.ruoyi.system.task.jobs.LivePushJob;
+import com.ruoyi.system.utils.util.TemplateMessageSendUtil;
+import com.ruoyi.system.vo.TSysActivityVO;
 import com.ruoyi.system.vo.TSysLiveVO;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
 import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * <p>
@@ -39,7 +41,8 @@
 
     @Autowired
     private RedisCache redisCache;
-
+    @Autowired
+    private ApplicationContext applicationContext;
     @Override
     public R pushUser(String id, String pushType) {
         TSysLive sysLive = this.getById(id);
@@ -50,18 +53,8 @@
             }
             sysLive.setPushType(pushType);
             this.updateById(sysLive);
-            // 添加定时任务 直播开始推送
-            Map<String, ? extends Object> maps =
-                    new ImmutableMap.Builder<String, String>().
-                            put("id", sysLive.getId())
-                            .build();
-            QuartzManager.addJob(
-                    LivePushJob.class,
-                    (LivePushJob.name+sysLive.getId()).toUpperCase(),
-                    TimeJobType.LIVE_PUSH,
-                    DateUtils.localDateTimeToDate(sysLive.getStartTime()),
-                    maps
-            );
+            // 直播开始推送公众号消息
+            applicationContext.publishEvent(new PublishTopicLiveInfoEvent(pushType+"_"+id));
         }
         return R.ok();
     }
@@ -85,8 +78,17 @@
                 sysLive.setLiveStatus(3);
             }
             // 查看是否包含该值
-            boolean memberInSet = redisCache.isMemberInSet(Constants.LIVE_APPOINTMENT_PUSH + sysLive.getId(), query.getAppUserId());
-            sysLive.setAppointmentStatus(memberInSet ? 2 : 1);
+//            boolean memberInSet = redisCache.isMemberInSet(Constants.LIVE_APPOINTMENT_PUSH + sysLive.getId(), query.getAppUserId());
+//            sysLive.setAppointmentStatus(memberInSet ? 2 : 1);
+
+            if(query.getRoleType() == 5){
+                Long userId = query.getUserId();
+                Set<Long> cacheSet = redisCache.getCacheSet(Constants.SYS_ACTIVITY_CLICK_COUNT + sysLive.getId());
+                if(cacheSet.contains(userId)){
+                    sysLive.setIsView(true);
+                }
+            }
+
         }
         pageInfo.setRecords(list);
         return pageInfo;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysProductIntroductionServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysProductIntroductionServiceImpl.java
index 7915b86..7c69cb3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysProductIntroductionServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysProductIntroductionServiceImpl.java
@@ -2,14 +2,20 @@
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.system.mapper.TSysProductIntroductionMapper;
 import com.ruoyi.system.model.TSysEducationalInfo;
 import com.ruoyi.system.model.TSysProductIntroduction;
 import com.ruoyi.system.query.TSysProductIntroductionQuery;
 import com.ruoyi.system.service.TSysProductIntroductionService;
+import com.ruoyi.system.vo.TSysProductIntroductionVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -22,10 +28,25 @@
 @Service
 public class TSysProductIntroductionServiceImpl extends ServiceImpl<TSysProductIntroductionMapper, TSysProductIntroduction> implements TSysProductIntroductionService {
 
+    @Autowired
+    private RedisCache redisCache;
+
     @Override
-    public PageInfo<TSysProductIntroduction> pageList(TSysProductIntroductionQuery query) {
-        PageInfo<TSysProductIntroduction> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
-        List<TSysProductIntroduction> list = this.baseMapper.pageList(query,pageInfo);
+    public PageInfo<TSysProductIntroductionVO> pageList(TSysProductIntroductionQuery query) {
+        PageInfo<TSysProductIntroductionVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        List<TSysProductIntroductionVO> list = this.baseMapper.pageList(query,pageInfo);
+        if (CollectionUtils.isEmpty(list)){
+            return pageInfo;
+        }
+        if(query.getRoleType() == 5){
+            Long userId = query.getUserId();
+            for (TSysProductIntroductionVO tSysProductIntroduction : list) {
+                Set<Long> cacheSet = redisCache.getCacheSet(Constants.SYS_PRODUCT_CLICK_COUNT + tSysProductIntroduction.getId());
+                if(cacheSet.contains(userId)){
+                    tSysProductIntroduction.setIsView(true);
+                }
+            }
+        }
         pageInfo.setRecords(list);
         return pageInfo;
     }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java
index e738867..c572fce 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java
@@ -2,9 +2,13 @@
 
 import com.aizuda.bpm.mybatisplus.mapper.FlwTaskActorMapper;
 import com.aizuda.bpm.mybatisplus.mapper.FlwTaskMapper;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.service.TSysAppUserService;
 import com.ruoyi.system.service.TSysLiveService;
 import com.ruoyi.system.task.utils.SpringContextsUtil;
+import com.ruoyi.system.utils.util.TemplateMessageSendUtil;
 import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
@@ -19,10 +23,16 @@
 
 	protected ISysUserService sysUserService;
 	protected TSysLiveService sysLiveService;
+	protected RedisCache redisCache;
+	protected TSysAppUserService sysAppUserService;
+	protected TemplateMessageSendUtil templateMessageSendUtil;
 
 	public AbstractJob(){
 		this.sysUserService = SpringContextsUtil.getBean(ISysUserService.class);
 		this.sysLiveService = SpringContextsUtil.getBean(TSysLiveService.class);
+		this.redisCache = SpringContextsUtil.getBean(RedisCache.class);
+		this.sysAppUserService = SpringContextsUtil.getBean(TSysAppUserService.class);
+		this.templateMessageSendUtil = SpringContextsUtil.getBean(TemplateMessageSendUtil.class);
 	}
 
 	 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/LivePushJob.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/LivePushJob.java
index defd05a..de9f809 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/LivePushJob.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/LivePushJob.java
@@ -1,9 +1,20 @@
 package com.ruoyi.system.task.jobs;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.system.model.TSysAppUser;
+import com.ruoyi.system.model.TSysLive;
 import com.ruoyi.system.task.base.AbstractJob;
 import org.quartz.JobDataMap;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
 
 /**
  * 直播推送定时任务
@@ -18,9 +29,23 @@
 	public void execute(JobExecutionContext context)
 			throws JobExecutionException {
 		JobDataMap maps = context.getMergedJobDataMap();
-		Long liveId = maps.getLong("id");
+		String liveId = maps.getString("id");
+		Set<String> userIds = redisCache.getCacheSet(Constants.LIVE_APPOINTMENT_PUSH + liveId);
+		if(CollectionUtils.isEmpty(userIds)){
+			return;
+		}
 		try {
 			System.out.println("开始执行直播推送任务");
+			TSysLive sysLive = sysLiveService.getById(liveId);
+			if(Objects.nonNull(sysLive)){
+				String liveTitle = sysLive.getLiveTitle();
+				String startTime = DateUtils.localDateTimeToString(sysLive.getStartTime());
+				List<TSysAppUser> sysAppUsers = sysAppUserService.list(Wrappers.lambdaQuery(TSysAppUser.class)
+						.in(TSysAppUser::getId, userIds));
+				for(TSysAppUser sysAppUser : sysAppUsers){
+					templateMessageSendUtil.wxTemplateAppLiveResultRequest(sysAppUser.getOpenId(), liveTitle, startTime);
+				}
+			}
 		}catch(Exception e){
 			e.printStackTrace();
 		}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/util/JsonUtils.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/util/JsonUtils.java
new file mode 100644
index 0000000..5d4b0ea
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/util/JsonUtils.java
@@ -0,0 +1,110 @@
+package com.ruoyi.system.utils.util;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.system.utils.wx.config.JacksonConfig;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * Json转换工具类
+ * 参考:https://blog.csdn.net/weixin_38413579/article/details/82562634
+ * @author madman
+ */
+@Slf4j
+public final class JsonUtils {
+
+    private static final ObjectMapper OM = new ObjectMapper();
+    private static final JavaTimeModule timeModule = new JavaTimeModule();
+
+    /**
+     * 转换LocalDateTime
+     */
+    static class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
+        @Override
+        public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+            jsonGenerator.writeString(localDateTime.format(DateTimeFormatter.ofPattern(JacksonConfig.dateTimeFormat)));
+        }
+    }
+
+    /**
+     * 转换LocalDate
+     */
+    static class LocalDateSerializer extends JsonSerializer<LocalDate> {
+        @Override
+        public void serialize(LocalDate localDate, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+            jsonGenerator.writeString(localDate.format(DateTimeFormatter.ofPattern(JacksonConfig.dateFormat)));
+        }
+    }
+
+    /**
+     * 设置 ObjectMapper
+     *
+     * @return
+     */
+    private static ObjectMapper getObjectMapper() {
+        // 序列化
+        timeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
+        timeModule.addSerializer(LocalDate.class, new LocalDateSerializer());
+        // 反序列化
+        timeModule.addDeserializer(LocalDateTime.class,
+                new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(JacksonConfig.dateTimeFormat)));
+        timeModule.addDeserializer(LocalDate.class,
+                new LocalDateDeserializer(DateTimeFormatter.ofPattern(JacksonConfig.dateFormat)));
+        // 允许对象忽略json中不存在的属性
+        OM.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        OM.registerModule(timeModule);
+        return OM;
+    }
+
+    /**
+     * 将对象序列化
+     */
+    public static <T> String toJsonString(T obj) {
+        try {
+            ObjectMapper om = getObjectMapper();
+            return om.writeValueAsString(obj);
+        } catch (JsonProcessingException e) {
+            log.error("转json字符串失败:{}", obj);
+            return null;
+        }
+    }
+
+    /**
+     * 反序列化对象字符串
+     */
+    public static <T> T parseObject(String json, Class<T> clazz) {
+        try {
+            ObjectMapper om = getObjectMapper();
+            return om.readValue(json, clazz);
+        } catch (JsonProcessingException e) {
+            throw new ServiceException("反序列化对象字符串失败");
+        }
+    }
+
+    /**
+     * 反序列化字符串成为对象
+     */
+    public static <T> T parseObject(String json, TypeReference<T> valueTypeRef) {
+        try {
+            ObjectMapper om = getObjectMapper();
+            return om.readValue(json, valueTypeRef);
+        } catch (JsonProcessingException e) {
+            throw new ServiceException("反序列化字符串成为对象失败");
+        }
+    }
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/util/TemplateMessageSendUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/util/TemplateMessageSendUtil.java
new file mode 100644
index 0000000..3bb4d12
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/util/TemplateMessageSendUtil.java
@@ -0,0 +1,124 @@
+package com.ruoyi.system.utils.util;
+
+
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.core.utils.HttpUtils;
+import com.ruoyi.common.redis.service.RedisService;
+import com.ruoyi.system.utils.wx.model.WeixinProperties;
+import com.ruoyi.system.utils.wx.template.Template;
+import com.ruoyi.system.utils.wx.template.wxTemplateAppLiveResult.WxOfficeTemplateAppLiveResultRequest;
+import com.ruoyi.system.utils.wx.template.wxTemplateAppLiveResult.WxOfficeTemplateAppLiveResultRequestData;
+import com.ruoyi.system.utils.wx.template.wxTemplateAppLiveResult.WxTemplateAppLiveResultRequest;
+import com.ruoyi.system.utils.wx.template.wxTemplateAppLiveResult.WxTemplateAppLiveResultRequestData;
+import com.ruoyi.system.utils.wx.tools.WxAppletTools;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+import java.io.Serializable;
+
+/**
+ * 消息模板发送
+ */
+@Slf4j
+@Component
+public class TemplateMessageSendUtil implements Serializable {
+    private final static String ACCESS_TOKEN_CACHE_KEY = "accessToken:";
+    @Autowired
+    private RedisCache redisCache;
+    @Autowired
+    private RestTemplate wxRestTemplate;
+    @Autowired
+    private WeixinProperties weixinProperties;
+    @Resource
+    private RedisService redisService;
+
+    /**
+     * 直播开始小程序订阅通知
+     * @param openId 用户openId
+     * @param liveTitle 标题
+     * @param startTime 开始时间
+     */
+    public String wxTemplateAppLiveResultRequest(String openId,String liveTitle,String startTime) {
+        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, weixinProperties, redisService);
+        // 1,获取access_token
+        String accessToken = redisCache.getCacheObject(ACCESS_TOKEN_CACHE_KEY);
+        if (!StringUtils.hasLength(accessToken)) {
+            accessToken = appletTools.getAccessToken();
+        }
+        try {
+            log.info("直播开始提醒通知:------------------------");
+            // 创建请求实体
+            WxTemplateAppLiveResultRequest wxTemplateAppLiveResultRequest = new WxTemplateAppLiveResultRequest();
+            wxTemplateAppLiveResultRequest.setTouser(openId);
+            wxTemplateAppLiveResultRequest.setTemplate_id(weixinProperties.getAppLiveResultTemplateId());
+            // 标题
+            Template thing1 = new Template();
+            thing1.setValue(liveTitle);
+            // 开始时间
+            Template time2 = new Template();
+            time2.setValue(startTime);
+            // 发送模板消息参数实体封装
+            WxTemplateAppLiveResultRequestData wxTemplateAppLiveResultRequestData = new WxTemplateAppLiveResultRequestData();
+            wxTemplateAppLiveResultRequestData.setThing1(thing1);
+            wxTemplateAppLiveResultRequestData.setTime2(time2);
+            wxTemplateAppLiveResultRequest.setData(wxTemplateAppLiveResultRequestData);
+            // 4,发送消息给用户
+            String url = Constants.TEMPLATE_URL.replace("ACCESS_TOKEN", accessToken);
+            String result = HttpUtils.sendPost(url, JsonUtils.toJsonString(wxTemplateAppLiveResultRequest));
+            log.info("直播开始通知模板消息返回数据:{}", result);
+            return result;
+        } catch (Exception e) {
+            log.error("直播开始通知失败;");
+        }
+        return null;
+    }
+
+
+    /**
+     * 微信公众号模板消息发送
+     * @param openId 用户openId
+     * @param liveTitle 标题
+     * @param startTime 开始时间
+     */
+    public String wxOfficeTemplateAppLiveRequest(String openId,String liveTitle,String startTime) {
+        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, weixinProperties, redisService);
+        // 1,获取access_token
+        String accessToken = redisCache.getCacheObject(ACCESS_TOKEN_CACHE_KEY);
+        if (!StringUtils.hasLength(accessToken)) {
+            accessToken = appletTools.getAccessToken();
+        }
+        try {
+            log.info("模板消息发送提醒通知:------------------------");
+            // 创建请求实体
+            WxOfficeTemplateAppLiveResultRequest wxOfficeTemplateAppLiveResultRequest = new WxOfficeTemplateAppLiveResultRequest();
+            wxOfficeTemplateAppLiveResultRequest.setTouser(openId);
+            wxOfficeTemplateAppLiveResultRequest.setTemplate_id(weixinProperties.getOfficeAppLiveResultTemplateId());
+            // 标题
+            Template thing1 = new Template();
+            thing1.setValue(liveTitle);
+            // 开始时间
+            Template time18 = new Template();
+            time18.setValue(startTime);
+            // 发送模板消息参数实体封装
+            WxOfficeTemplateAppLiveResultRequestData wxOfficeTemplateAppLiveResultRequestData = new WxOfficeTemplateAppLiveResultRequestData();
+            wxOfficeTemplateAppLiveResultRequestData.setThing1(thing1);
+            wxOfficeTemplateAppLiveResultRequestData.setTime18(time18);
+            wxOfficeTemplateAppLiveResultRequest.setData(wxOfficeTemplateAppLiveResultRequestData);
+            // 4,发送消息给用户
+            String url = Constants.OFFICIAL_ACCOUNT_TEMPLATE_URL.replace("ACCESS_TOKEN", accessToken);
+            String result = HttpUtils.sendPost(url, JsonUtils.toJsonString(wxOfficeTemplateAppLiveResultRequest));
+            log.info("模板消息发送通知模板消息返回数据:{}", result);
+            return result;
+        } catch (Exception e) {
+            log.error("模板消息发送通知失败;");
+        }
+        return null;
+    }
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/config/JacksonConfig.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/config/JacksonConfig.java
new file mode 100644
index 0000000..f96bb5a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/config/JacksonConfig.java
@@ -0,0 +1,35 @@
+package com.ruoyi.system.utils.wx.config;
+
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.time.format.DateTimeFormatter;
+
+/**
+ * @author liheng
+ * @ClassName LocalDateTimeSerializerConfig
+ * @Description
+ * @date 2020-09-22 11:22
+ */
+@Configuration
+public class JacksonConfig {
+    public static final String dateFormat = "yyyy-MM-dd";
+    public static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
+
+    @Bean
+    public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
+        return builder -> {
+            // Long型精度丢失问题
+            // builder.serializerByType(Long.TYPE, ToStringSerializer.instance);
+            builder.serializerByType(Long.class, ToStringSerializer.instance);
+            // 时间格式化
+            builder.simpleDateFormat(dateTimeFormat);
+            builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
+            builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
+        };
+    }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/model/WeixinProperties.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/model/WeixinProperties.java
index fdeb5ab..a3e8ccf 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/model/WeixinProperties.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/model/WeixinProperties.java
@@ -37,6 +37,34 @@
      * @return secret ID
      */
     private String secretId;
+    /**
+     * 获取 appLiveResultTemplateId  小程序订阅消息
+     *
+     * @return appLiveResultTemplateId
+     */
+    private String appLiveResultTemplateId;
+    /**
+     * 获取 officeAppLiveResultTemplateId  公众号模板消息
+     *
+     * @return officeAppLiveResultTemplateId
+     */
+    private String officeAppLiveResultTemplateId;
+
+    public String getOfficeAppLiveResultTemplateId() {
+        return officeAppLiveResultTemplateId;
+    }
+
+    public void setOfficeAppLiveResultTemplateId(String officeAppLiveResultTemplateId) {
+        this.officeAppLiveResultTemplateId = officeAppLiveResultTemplateId;
+    }
+
+    public String getAppLiveResultTemplateId() {
+        return appLiveResultTemplateId;
+    }
+
+    public void setAppLiveResultTemplateId(String appLiveResultTemplateId) {
+        this.appLiveResultTemplateId = appLiveResultTemplateId;
+    }
 
     public String getSecretId() {
         return secretId;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/Template.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/Template.java
new file mode 100644
index 0000000..b2c9659
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/Template.java
@@ -0,0 +1,19 @@
+package com.ruoyi.system.utils.wx.template;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @Description 微信消息模板参数实体
+ * @Author xiaochen
+ * @Date 2021/11/8 10:30
+ */
+@Data
+public class Template implements Serializable{
+
+    @ApiModelProperty(value = "消息内容")
+    private String value;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxOfficeTemplateAppLiveResultRequest.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxOfficeTemplateAppLiveResultRequest.java
new file mode 100644
index 0000000..d890571
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxOfficeTemplateAppLiveResultRequest.java
@@ -0,0 +1,26 @@
+package com.ruoyi.system.utils.wx.template.wxTemplateAppLiveResult;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WxOfficeTemplateAppLiveResultRequest implements Serializable {
+
+    @ApiModelProperty(value = "用户openid")
+    private String touser;
+
+    @ApiModelProperty(value = "消息模板id")
+    private String template_id;
+
+    @ApiModelProperty(value = "订阅场景值")
+    private String scene = "1000";
+
+    @ApiModelProperty(value = "订阅通知")
+    private String title = "课程预约结果通知";
+
+    @ApiModelProperty(value = "消息模板data数据")
+    private WxOfficeTemplateAppLiveResultRequestData data;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxOfficeTemplateAppLiveResultRequestData.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxOfficeTemplateAppLiveResultRequestData.java
new file mode 100644
index 0000000..3422252
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxOfficeTemplateAppLiveResultRequestData.java
@@ -0,0 +1,18 @@
+package com.ruoyi.system.utils.wx.template.wxTemplateAppLiveResult;
+
+import com.ruoyi.system.utils.wx.template.Template;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WxOfficeTemplateAppLiveResultRequestData implements Serializable {
+
+    @ApiModelProperty(value = "标题")
+    private Template thing1;
+
+    @ApiModelProperty(value = "开始时间")
+    private Template time18;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxTemplateAppLiveResultRequest.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxTemplateAppLiveResultRequest.java
new file mode 100644
index 0000000..1a5fec5
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxTemplateAppLiveResultRequest.java
@@ -0,0 +1,20 @@
+package com.ruoyi.system.utils.wx.template.wxTemplateAppLiveResult;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WxTemplateAppLiveResultRequest implements Serializable {
+
+    @ApiModelProperty(value = "用户openid")
+    private String touser;
+
+    @ApiModelProperty(value = "消息模板id")
+    private String template_id;
+
+    @ApiModelProperty(value = "消息模板data数据")
+    private WxTemplateAppLiveResultRequestData data;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxTemplateAppLiveResultRequestData.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxTemplateAppLiveResultRequestData.java
new file mode 100644
index 0000000..8173b5f
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/template/wxTemplateAppLiveResult/WxTemplateAppLiveResultRequestData.java
@@ -0,0 +1,18 @@
+package com.ruoyi.system.utils.wx.template.wxTemplateAppLiveResult;
+
+import com.ruoyi.system.utils.wx.template.Template;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class WxTemplateAppLiveResultRequestData implements Serializable {
+
+    @ApiModelProperty(value = "标题")
+    private Template thing1;
+
+    @ApiModelProperty(value = "开始时间")
+    private Template time2;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/tools/WxAppletTools.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/tools/WxAppletTools.java
index 2298a44..8877ce5 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/tools/WxAppletTools.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/wx/tools/WxAppletTools.java
@@ -43,6 +43,24 @@
     /**
      * 请求参数
      * 属性	类型	默认值	必填	说明
+     * appid	string		是	公众号 appId
+     * secret	string		是	公众号 appSecret
+     * code	string		是	登录时获取的 code
+     * grant_type	string		是	授权类型,此处只需填写 authorization_cod
+     * <p>
+     * 返回值:
+     * <p>
+     * 属性	类型	说明
+     * openid	string	用户唯一标识
+     * session_key	string	会话密钥
+     * unionid	string	用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回,详见 UnionID 机制说明。
+     * errcode	number	错误码
+     * errmsg	string	错误信息
+     */
+    private static final String CODE_2_SESSION_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code";
+    /**
+     * 请求参数
+     * 属性	类型	默认值	必填	说明
      * grant_type	string		是	填写 client_credential
      * appid	string		是	小程序唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态)
      * secret	string		是	小程序唯一凭证密钥,即 AppSecret,获取方式同 appid
@@ -101,10 +119,33 @@
     }
 
     /**
+     * 微信公众号获取openId
+     * @param resqBody
      * @return
      */
-    public String getAccessToken(String version) {
-        String accessToken = redisService.getCacheObject(ACCESSTOKEN_CACHE_KEY + version);
+    public Code2SessionRespBody getOpenIdByCode2session(Code2SessionResqBody resqBody) {
+        long start = System.currentTimeMillis();
+        String requestUrl = MessageFormat.format(CODE_2_SESSION_URL, wxConfig.getAppId(), wxConfig.getSecretId(), resqBody.getJsCode());
+        long end = System.currentTimeMillis();
+        log.info("code换取sessionKey时间:{}", (end - start));
+        String respBody = wxRestTemplate.getForEntity(requestUrl, String.class).getBody();
+        end = System.currentTimeMillis();
+        log.info("code换取sessionKey时间:{}", (end - start));
+        log.info("Jscode2session:{}", respBody);
+        Code2SessionRespBody code2SessionRespBody = WxJsonUtils.parseObject(respBody, Code2SessionRespBody.class);
+        // 判断有误异常
+        if (StringUtils.hasLength(code2SessionRespBody.getErrorMsg())) {
+            // 抛出错误
+            throw new WxException(code2SessionRespBody.getErrorCode() + ":" + code2SessionRespBody.getErrorMsg());
+        }
+        return code2SessionRespBody;
+    }
+
+    /**
+     * @return
+     */
+    public String getAccessToken() {
+        String accessToken = redisService.getCacheObject(ACCESSTOKEN_CACHE_KEY);
         if (StringUtils.hasLength(accessToken)) {
             return accessToken;
         }
@@ -116,7 +157,7 @@
             // 抛出错误
             throw new WxException(accessTokenRespBody.getErrorCode() + ":" + accessTokenRespBody.getErrorMsg());
         }
-        redisService.setCacheObject(ACCESSTOKEN_CACHE_KEY + version, accessTokenRespBody.getAccessToken(), 7200L, TimeUnit.SECONDS);
+        redisService.setCacheObject(ACCESSTOKEN_CACHE_KEY, accessTokenRespBody.getAccessToken(), 7200L, TimeUnit.SECONDS);
         return accessTokenRespBody.getAccessToken();
     }
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysActivityVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysActivityVO.java
new file mode 100644
index 0000000..b09e2d8
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysActivityVO.java
@@ -0,0 +1,15 @@
+package com.ruoyi.system.vo;
+
+import com.ruoyi.system.model.TSysActivity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "热门活动信息TSysActivityVO")
+public class TSysActivityVO extends TSysActivity {
+
+    @ApiModelProperty(value = "当前用户是否查看 true=是")
+    private Boolean isView = false;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysEducationalInfoVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysEducationalInfoVO.java
new file mode 100644
index 0000000..b90a08d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysEducationalInfoVO.java
@@ -0,0 +1,15 @@
+package com.ruoyi.system.vo;
+
+import com.ruoyi.system.model.TSysEducationalInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "TSysEducationalInfoVO对象", description = "教育资讯")
+public class TSysEducationalInfoVO extends TSysEducationalInfo {
+
+    @ApiModelProperty(value = "当前用户是否查看 true=是")
+    private Boolean isView = false;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysLiveVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysLiveVO.java
index 3eeef7b..1f8547b 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysLiveVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysLiveVO.java
@@ -15,5 +15,7 @@
     @ApiModelProperty(value = "预约状态 1=未预约 2=已预约")
     private Integer appointmentStatus;
 
+    @ApiModelProperty(value = "当前用户是否查看 true=是")
+    private Boolean isView = false;
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysProductIntroductionVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysProductIntroductionVO.java
new file mode 100644
index 0000000..54bb33b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysProductIntroductionVO.java
@@ -0,0 +1,15 @@
+package com.ruoyi.system.vo;
+
+import com.ruoyi.system.model.TSysProductIntroduction;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "产品介绍视图对象TSysProductIntroductionVO")
+public class TSysProductIntroductionVO extends TSysProductIntroduction {
+
+    @ApiModelProperty(value = "当前用户是否查看 true=是")
+    private Boolean isView = false;
+
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
index be96a75..454dcb3 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -273,8 +273,14 @@
 	<select id="selectIdByPhone" resultType="java.lang.Long">
 		select user_id from sys_user where phonenumber = #{phonenumber} and status = 0 and del_flag = 0
 	</select>
+    <select id="selectUserListByIds" resultType="com.ruoyi.common.core.domain.entity.SysUser">
+		select * from sys_user where open_id IS NOT NULL AND user_id in
+		<foreach item="userId" collection="userIds" separator="," close=")" open="(">
+			#{userId}
+		</foreach>
+	</select>
 
-	<insert id="insertUser" parameterType="com.ruoyi.common.core.domain.entity.SysUser" useGeneratedKeys="true" keyProperty="userId">
+    <insert id="insertUser" parameterType="com.ruoyi.common.core.domain.entity.SysUser" useGeneratedKeys="true" keyProperty="userId">
  		insert into sys_user(
  			<if test="userId != null and userId != 0">user_id,</if>
  			<if test="deptId != null and deptId != 0">dept_id,</if>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TSysActivityMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TSysActivityMapper.xml
index 313f876..f8a0e57 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TSysActivityMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TSysActivityMapper.xml
@@ -24,7 +24,7 @@
     <sql id="Base_Column_List">
         id, activity_name, show_type, activity_introduction, activity_cover, activity_detail, status, sort_by, click_count, create_time, update_time, create_by, update_by, disabled
     </sql>
-    <select id="pageList" resultType="com.ruoyi.system.model.TSysActivity">
+    <select id="pageList" resultType="com.ruoyi.system.vo.TSysActivityVO">
         SELECT
         <include refid="Base_Column_List"/>
             FROM t_sys_activity
diff --git a/ruoyi-system/src/main/resources/mapper/system/TSysAppUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TSysAppUserMapper.xml
index 7d02f3c..5c3c9f3 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TSysAppUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TSysAppUserMapper.xml
@@ -10,6 +10,7 @@
         <result column="birth_time" property="birthTime" />
         <result column="sex" property="sex" />
         <result column="open_id" property="openId" />
+        <result column="office_open_id" property="officeOpenId" />
         <result column="chronic_disease_id" property="chronicDiseaseId" />
         <result column="status" property="status" />
         <result column="last_reminder_time" property="lastReminderTime" />
@@ -22,10 +23,10 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, nick_name, phone, birth_time, sex, open_id,chronic_disease_id,status,last_reminder_time, create_time, update_time, create_by, update_by, disabled
+        id, nick_name, phone, birth_time, sex, open_id,chronic_disease_id,status,last_reminder_time,office_open_id, create_time, update_time, create_by, update_by, disabled
     </sql>
     <select id="pageList" resultType="com.ruoyi.system.vo.TSysAppUserVO">
-        select tsau.id, tsau.nick_name, tsau.phone, tsau.birth_time, tsau.sex, tsau.open_id,
+        select tsau.id, tsau.nick_name, tsau.phone, tsau.birth_time, tsau.sex, tsau.open_id,tsau.office_open_id,
                tsau.chronic_disease_id,tsau.status,tsau.last_reminder_time, tsau.create_time, tsau.update_time, tsau.create_by,
                tsau.update_by, tsau.disabled, tsi.lastInspectionTime
         from t_sys_app_user tsau
@@ -54,7 +55,7 @@
         ORDER BY tsau.create_time DESC
     </select>
     <select id="pageChronicDiseaseUserList" resultType="com.ruoyi.system.vo.TSysAppUserVO">
-        select tsau.id, tsau.nick_name, tsau.phone, tsau.birth_time, tsau.sex, tsau.open_id,
+        select tsau.id, tsau.nick_name, tsau.phone, tsau.birth_time, tsau.sex, tsau.open_id,tsau.office_open_id,
                tsau.chronic_disease_id,tsau.status,tsau.last_reminder_time, tsau.create_time, tsau.update_time, tsau.create_by,
                tsau.update_by, tsau.disabled
         from t_sys_app_user tsau
diff --git a/ruoyi-system/src/main/resources/mapper/system/TSysEducationalInfoMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TSysEducationalInfoMapper.xml
index 0da46f1..1024367 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TSysEducationalInfoMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TSysEducationalInfoMapper.xml
@@ -23,7 +23,7 @@
     <sql id="Base_Column_List">
         id, info_title, show_type, info_cover, info_content, status, sort_by, click_count, create_time, update_time, create_by, update_by, disabled
     </sql>
-    <select id="pageList" resultType="com.ruoyi.system.model.TSysEducationalInfo">
+    <select id="pageList" resultType="com.ruoyi.system.vo.TSysEducationalInfoVO">
         select
         <include refid="Base_Column_List" />
             from t_sys_educational_info
diff --git a/ruoyi-system/src/main/resources/mapper/system/TSysLiveMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TSysLiveMapper.xml
index c127795..0fb1ec0 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TSysLiveMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TSysLiveMapper.xml
@@ -18,6 +18,7 @@
         <result column="live_url" property="liveUrl" />
         <result column="live_detail" property="liveDetail" />
         <result column="push_type" property="pushType" />
+        <result column="click_count" property="clickCount" />
         <result column="create_time" property="createTime" />
         <result column="update_time" property="updateTime" />
         <result column="create_by" property="createBy" />
@@ -28,7 +29,7 @@
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
         id, live_title, live_cover, live_introduction, start_time,end_time, expected_duration, live_way, live_mode,live_url,
-          live_lecturer, live_type, password, live_detail, push_type, create_time, update_time, create_by, update_by, disabled
+          live_lecturer, live_type, password, live_detail, push_type,click_count, create_time, update_time, create_by, update_by, disabled
     </sql>
     <select id="pageList" resultType="com.ruoyi.system.vo.TSysLiveVO">
         SELECT
diff --git a/ruoyi-system/src/main/resources/mapper/system/TSysOtherConfigMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TSysOtherConfigMapper.xml
index 7066009..85a2535 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TSysOtherConfigMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TSysOtherConfigMapper.xml
@@ -7,7 +7,7 @@
         <id column="id" property="id" />
         <result column="procurement_conditions" property="procurementConditions" />
         <result column="points_expiration" property="pointsExpiration" />
-        <result column="expira_unit" property="expiraUnit" />
+        <result column="expire_unit" property="expireUnit" />
         <result column="msg_count" property="msgCount" />
         <result column="ai_price" property="aiPrice" />
         <result column="delivery_time" property="deliveryTime" />
@@ -21,7 +21,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, procurement_conditions, points_expiration, expira_unit, msg_count, ai_price, delivery_time, create_time, update_time, create_by, update_by, disabled, create_id
+        id, procurement_conditions, points_expiration, expire_unit, msg_count, ai_price, delivery_time, create_time, update_time, create_by, update_by, disabled, create_id
     </sql>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TSysProductIntroductionMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TSysProductIntroductionMapper.xml
index 08d0756..ea39518 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TSysProductIntroductionMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TSysProductIntroductionMapper.xml
@@ -24,7 +24,7 @@
     <sql id="Base_Column_List">
         id, product_name, show_type, product_introduction, product_cover, product_detail, status, sort_by, click_count, create_time, update_time, create_by, update_by, disabled
     </sql>
-    <select id="pageList" resultType="com.ruoyi.system.model.TSysProductIntroduction">
+    <select id="pageList" resultType="com.ruoyi.system.vo.TSysProductIntroductionVO">
         SELECT
         <include refid="Base_Column_List"/>
             FROM t_sys_product_introduction

--
Gitblit v1.7.1