Quellcode durchsuchen

直播小程序订阅

yuhongqi vor 4 Wochen
Ursprung
Commit
dd9b3c6ed0

+ 67 - 0
fs-admin/src/main/java/com/fs/task/MiniProgramSubTask.java

@@ -18,6 +18,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.tomcat.jni.Local;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -106,4 +107,70 @@ public class MiniProgramSubTask {
         }
 
     }
+
+    /**
+     * 小程序订阅通知
+     */
+    @QuartzRunnable(name="小程序直播订阅通知")
+    public void notifyMiniLiveAppSub(){
+        log.info("小程序订阅通知定时任务");
+        // 先获取所有可用待处理任务
+        List<FsMiniprogramSubNotifyTask> pendingData = notifyTaskMapper.selectLivePendingData();
+        if(CollectionUtils.isEmpty(pendingData)){
+            log.info("小程序订阅通知定时任务, 无待处理数据");
+            return;
+        }
+        LocalDateTime now = LocalDateTime.now();
+        for (FsMiniprogramSubNotifyTask pendingDatum : pendingData) {
+
+            if(pendingDatum.getUpdateTime().isAfter(now)) continue;
+
+            pendingDatum.setUpdateTime(LocalDateTime.now());
+
+            ClientCredGrantReqDTO clientCredGrantReqDTO = new ClientCredGrantReqDTO();
+            clientCredGrantReqDTO.setAppid(config.getAppid());
+            clientCredGrantReqDTO.setSecret(config.getSecret());
+            clientCredGrantReqDTO.setGrant_type("client_credential");
+
+            try{
+                // 获取accessToken
+                WeXinAccessTokenDTO stableToken = wechatMiniProgrService
+                        .getStableToken(clientCredGrantReqDTO);
+
+                String accessToken = stableToken.getAccessToken();
+
+                // 调用微信小程序订阅通知
+                TemplateMessageSendRequestDTO sendRequestDTO = new TemplateMessageSendRequestDTO();
+                sendRequestDTO.setTemplate_id(pendingDatum.getTemplateId());
+                sendRequestDTO.setTouser(pendingDatum.getTouser());
+                sendRequestDTO.setPage(pendingDatum.getPage());
+                TypeReference<Map<String, TemplateMessageSendRequestDTO.TemplateDataValue>> typeReference = new TypeReference<Map<String, TemplateMessageSendRequestDTO.TemplateDataValue>>() {};
+                sendRequestDTO.setData(JSON.parseObject(pendingDatum.getData(),typeReference));
+                MiniGramSubsMsgResultDTO miniGramSubsMsgResultDTO = wechatMiniProgrService.sendSubscribeMsg(accessToken, sendRequestDTO);
+                pendingDatum.setRequestBody(JSON.toJSONString(sendRequestDTO));
+                pendingDatum.setResponseBody(JSON.toJSONString(miniGramSubsMsgResultDTO));
+
+                // 如果推送消息成功
+                if(miniGramSubsMsgResultDTO.getErrcode() == 0){
+                    pendingDatum.setStatus(MiniAppNotifyTaskStatusEnum.SUCCESS.getValue());
+                } else {
+                    // 更新任务状态为执行失败
+                    pendingDatum.setStatus(MiniAppNotifyTaskStatusEnum.FAILED.getValue());
+                    pendingDatum.setErrorMessage(JSON.toJSONString(miniGramSubsMsgResultDTO));
+                    pendingDatum.setRetryCount(pendingDatum.getRetryCount() +1);
+                }
+            }catch (Throwable e){
+                // 更新任务状态为执行失败
+                pendingDatum.setStatus(MiniAppNotifyTaskStatusEnum.FAILED.getValue());
+                pendingDatum.setErrorMessage(ExceptionUtils.getStackTrace(e));
+                pendingDatum.setRetryCount(pendingDatum.getRetryCount() +1);
+                log.error("小程序订阅通知定时任务异常: {}", ExceptionUtils.getStackTrace(e));
+            }
+        }
+
+        if(CollectionUtils.isNotEmpty(pendingData)){
+            notifyTaskMapper.updateBatchById(pendingData);
+        }
+
+    }
 }

+ 3 - 0
fs-service-system/src/main/java/com/fs/live/service/ILiveService.java

@@ -7,6 +7,7 @@ import com.fs.live.domain.Live;
 import com.fs.live.vo.LiveConfigVo;
 import com.fs.live.vo.LiveListVo;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -178,4 +179,6 @@ public interface ILiveService
     LiveConfigVo asyncToCacheLiveConfig(Long liveId);
 
     List<Live> liveCompanyList(Long companyId);
+
+    R subNotifyLive(HashMap<String, Object> param);
 }

+ 45 - 0
fs-service-system/src/main/java/com/fs/live/service/impl/LiveServiceImpl.java

@@ -20,6 +20,12 @@ import com.fs.live.param.LiveReplayParam;
 import com.fs.live.service.*;
 import com.fs.live.utils.ProcessManager;
 import com.fs.live.vo.*;
+import com.fs.store.domain.FsMiniprogramSubNotifyTask;
+import com.fs.store.domain.FsUser;
+import com.fs.store.dto.TemplateMessageSendRequestDTO;
+import com.fs.store.enums.MiniAppNotifyTaskStatusEnum;
+import com.fs.store.mapper.FsMiniprogramSubNotifyTaskMapper;
+import com.fs.store.mapper.FsUserMapper;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.service.ISysConfigService;
 import com.hc.openapi.tool.codec.DigestUtils;
@@ -36,6 +42,7 @@ import com.fs.common.utils.sign.Md5Utils;
 
 import java.io.IOException;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
@@ -80,6 +87,10 @@ public class LiveServiceImpl implements ILiveService
     private RedisCache redisCache;
     @Autowired
     private LiveMapper baseMapper;
+    @Autowired
+    private FsMiniprogramSubNotifyTaskMapper fsMiniprogramSubNotifyTaskMapper;
+    @Autowired
+    private FsUserMapper fsUserMapper;
 
     @Autowired
     private RedisUtil redisUtil;
@@ -195,6 +206,40 @@ public class LiveServiceImpl implements ILiveService
         return baseMapper.liveCompanyList(companyId);
     }
 
+    @Override
+    public R subNotifyLive(HashMap<String, Object> param) {
+        FsMiniprogramSubNotifyTask notifyTask = new FsMiniprogramSubNotifyTask();
+        notifyTask.setPage("/pages_course/living?liveId=" + param.get("liveId"));
+        notifyTask.setTaskName("直播间预约提醒");
+        notifyTask.setTemplateId((String) param.get("templateId"));
+        FsUser fsUser = fsUserMapper.selectFsUserById(Long.valueOf((Integer) param.get("userId")));
+        String maOpenId = fsUser.getMaOpenId();
+        notifyTask.setTouser(maOpenId);
+        notifyTask.setPage(String.valueOf(1));
+
+        notifyTask.setCreateTime(LocalDateTime.now());
+        // 状态等待执行
+        notifyTask.setStatus(MiniAppNotifyTaskStatusEnum.WAITING.getValue());
+        notifyTask.setRetryCount(0);
+        notifyTask.setMaxRetries(3);
+        Map<String, TemplateMessageSendRequestDTO.TemplateDataValue> data = new HashMap<>();
+        HashMap<String,String> mapData = (HashMap<String, String>) param.get("data");
+        // 定义日期时间格式器,注意与字符串格式完全匹配
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        notifyTask.setUpdateTime(LocalDateTime.parse(mapData.get("date7"), formatter).minusSeconds(5));
+        mapData.forEach((k,v)->{
+            TemplateMessageSendRequestDTO.TemplateDataValue dataValue = new TemplateMessageSendRequestDTO.TemplateDataValue();
+            dataValue.setValue(mapData.get(k));
+            data.put(k, dataValue);
+        });
+        notifyTask.setData(JSON.toJSONString(data));
+        return R.ok("success");
+//        fsMiniprogramSubNotifyTaskMapper.insert(notifyTask);
+
+//        return R.ok("success");
+    }
+
     /**
      * 查询企业直播
      * @param liveId            直播ID

+ 10 - 1
fs-service-system/src/main/java/com/fs/store/mapper/FsMiniprogramSubNotifyTaskMapper.java

@@ -64,7 +64,8 @@ public interface FsMiniprogramSubNotifyTaskMapper {
      * 查询所有待处理数据
      * @return
      */
-    @Select("SELECT * FROM fs_miniprogram_sub_notify_task WHERE retry_count<3 and status in (0,3)")
+    @Select("SELECT * FROM fs_miniprogram_sub_notify_task WHERE retry_count<3 and status in (0,3) " +
+            "and task_name != '直播间预约提醒'" )
     List<FsMiniprogramSubNotifyTask> selectPendingData();
 
     /**
@@ -78,4 +79,12 @@ public interface FsMiniprogramSubNotifyTaskMapper {
      * @param subNotifyTasks 数据
      */
     void insertBatch(List<FsMiniprogramSubNotifyTask> subNotifyTasks);
+
+    /**
+     * 查询所有待处理数据
+     * @return
+     */
+    @Select("SELECT * FROM fs_miniprogram_sub_notify_task WHERE retry_count<3 and status in (0,3) " +
+            "and task_name = '直播间预约提醒'" )
+    List<FsMiniprogramSubNotifyTask> selectLivePendingData();
 }

+ 10 - 4
fs-user-app/src/main/java/com/fs/app/controller/LiveController.java

@@ -38,10 +38,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import static com.fs.live.service.impl.LiveServiceImpl.to16Hex;
 import static com.github.pagehelper.page.PageMethod.startPage;
@@ -251,6 +248,15 @@ public class LiveController extends AppBaseController {
 		return liveFacadeService.currentActivities(liveId,getUserId());
 	}
 
+	@PostMapping("/subNotifyLive")
+	@Transactional
+	@Login
+	public R subNotifyLive(@RequestBody HashMap<String,Object> param) {
+/*		String userId = getUserId();
+		return liveService.currentActivities(liveId,userId);*/
+		return liveService.subNotifyLive(param);
+	}
+
 	@GetMapping("/test")
 	@Transactional
 	public void test() {