Sfoglia il codice sorgente

新增计划发送机制

车车 9 mesi fa
parent
commit
2c76e52489

+ 1 - 3
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/notifyconfig/NotifyConfigController.java

@@ -2,11 +2,9 @@ package cn.iocoder.yudao.module.iscs.controller.admin.notifyconfig;
 
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.iscs.controller.admin.notifyconfig.vo.NotifyConfigPageReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.notifyconfig.vo.NotifyConfigRespVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.notifyconfig.vo.NotifyConfigSaveReqVO;
-import cn.iocoder.yudao.module.iscs.dal.dataobject.notifyconfig.NotifyConfigDO;
 import cn.iocoder.yudao.module.iscs.service.notifyconfig.NotifyConfigService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -60,7 +58,7 @@ public class NotifyConfigController {
     @PreAuthorize("@ss.hasPermission('iscs:notify-config:query')")
     public CommonResult<NotifyConfigRespVO> selectNotifyConfigById(@RequestParam("id") Long id) {
         NotifyConfigRespVO notifyConfig = notifyConfigService.getNotifyConfig(id);
-        return success(BeanUtils.toBean(notifyConfig, NotifyConfigRespVO.class));
+        return success(notifyConfig);
     }
 
     @GetMapping("/getNotifyConfigPage")

+ 5 - 5
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/notifyconfig/vo/NotifyMessagePlanPageReqVO.java

@@ -1,10 +1,10 @@
 package cn.iocoder.yudao.module.iscs.controller.admin.notifyconfig.vo;
 
-import lombok.*;
-import java.util.*;
-import io.swagger.v3.oas.annotations.media.Schema;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
+
 import java.time.LocalDateTime;
 
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@@ -41,8 +41,8 @@ public class NotifyMessagePlanPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] planSendTime;
 
-    @Schema(description = "发送状态", example = "1")
-    private String sendStatus;
+    @Schema(description = "发送状态(0-未发送 1-已发送)", example = "1")
+    private Integer sendStatus;
 
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)

+ 7 - 7
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/notifyconfig/vo/NotifyMessagePlanRespVO.java

@@ -1,11 +1,11 @@
 package cn.iocoder.yudao.module.iscs.controller.admin.notifyconfig.vo;
 
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import java.util.*;
-import org.springframework.format.annotation.DateTimeFormat;
+import lombok.Data;
+
 import java.time.LocalDateTime;
-import com.alibaba.excel.annotation.*;
 
 @Schema(description = "管理后台 - 计划发送的站内信消息 Response VO")
 @Data
@@ -52,9 +52,9 @@ public class NotifyMessagePlanRespVO {
     @ExcelProperty("计划发送时间")
     private LocalDateTime planSendTime;
 
-    @Schema(description = "发送状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @ExcelProperty("发送状态")
-    private String sendStatus;
+    @Schema(description = "发送状态(0-未发送 1-已发送)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("发送状态(0-未发送 1-已发送)")
+    private Integer sendStatus;
 
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")

+ 6 - 6
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/notifyconfig/vo/NotifyMessagePlanSaveReqVO.java

@@ -1,10 +1,10 @@
 package cn.iocoder.yudao.module.iscs.controller.admin.notifyconfig.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import java.util.*;
-import jakarta.validation.constraints.*;
-import org.springframework.format.annotation.DateTimeFormat;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
 import java.time.LocalDateTime;
 
 @Schema(description = "管理后台 - 计划发送的站内信消息新增/修改 Request VO")
@@ -50,8 +50,8 @@ public class NotifyMessagePlanSaveReqVO {
     @NotNull(message = "计划发送时间不能为空")
     private LocalDateTime planSendTime;
 
-    @Schema(description = "发送状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @Schema(description = "发送状态(0-未发送 1-已发送)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     @NotEmpty(message = "发送状态不能为空")
-    private String sendStatus;
+    private Integer sendStatus;
 
 }

+ 2 - 2
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/notifyconfig/NotifyMessagePlanDO.java

@@ -65,9 +65,9 @@ public class NotifyMessagePlanDO extends BaseDO {
      */
     private LocalDateTime planSendTime;
     /**
-     * 发送状态
+     * 发送状态(0-未发送 1-已发送)
      */
-    private String sendStatus;
+    private Integer sendStatus;
 
 
 }

+ 2 - 3
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/notifyconfig/NotifyConfigServiceImpl.java

@@ -76,9 +76,8 @@ public class NotifyConfigServiceImpl extends ServiceImpl<NotifyConfigMapper, Not
         NotifyConfigDO notifyConfigDO = notifyConfigMapper.selectById(id);
         NotifyConfigRespVO bean = BeanUtils.toBean(notifyConfigDO, NotifyConfigRespVO.class);
         // 查询detail
-        List<NotifyConfigDetailDO> list = notifyConfigDetailService.list(Wrappers.<NotifyConfigDetailDO>lambdaQuery()
-                .eq(NotifyConfigDetailDO::getConfigId, id));
-        bean.setNotifyConfigDetailRespVOList(BeanUtils.toBean(list, NotifyConfigDetailRespVO.class));
+        List<NotifyConfigDetailRespVO> list = notifyConfigDetailService.selectNotifyConfigDetailByConfigId(id);
+        bean.setNotifyConfigDetailRespVOList(list);
         return bean;
     }
 

+ 6 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/notifyconfig/NotifyMessagePlanService.java

@@ -54,4 +54,10 @@ public interface NotifyMessagePlanService extends IService<NotifyMessagePlanDO>
      */
     PageResult<NotifyMessagePlanDO> getNotifyMessagePlanPage(NotifyMessagePlanPageReqVO pageReqVO);
 
+    /**
+     * 检测未发送的消息立即发送
+     * @return
+     */
+    Boolean checkPlanSend();
+
 }

+ 40 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/notifyconfig/NotifyMessagePlanServiceImpl.java

@@ -6,12 +6,20 @@ import cn.iocoder.yudao.module.iscs.controller.admin.notifyconfig.vo.NotifyMessa
 import cn.iocoder.yudao.module.iscs.controller.admin.notifyconfig.vo.NotifyMessagePlanSaveReqVO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.notifyconfig.NotifyMessagePlanDO;
 import cn.iocoder.yudao.module.iscs.dal.mysql.notifyconfig.NotifyMessagePlanMapper;
+import cn.iocoder.yudao.module.system.controller.admin.notify.vo.template.NotifyTemplateSendReqVO;
+import cn.iocoder.yudao.module.system.service.notify.NotifySendService;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.reflect.TypeToken;
+import com.google.gson.Gson;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
+import java.lang.reflect.Type;
+import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 计划发送的站内信消息 Service 实现类
@@ -24,6 +32,8 @@ public class NotifyMessagePlanServiceImpl extends ServiceImpl<NotifyMessagePlanM
 
     @Resource
     private NotifyMessagePlanMapper notifyMessagePlanMapper;
+    @Resource
+    private NotifySendService notifySendService;
 
     @Override
     public Long createNotifyMessagePlan(NotifyMessagePlanSaveReqVO createReqVO) {
@@ -59,4 +69,34 @@ public class NotifyMessagePlanServiceImpl extends ServiceImpl<NotifyMessagePlanM
         return notifyMessagePlanMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public Boolean checkPlanSend() {
+        LocalDateTime now = LocalDateTime.now();
+        List<NotifyMessagePlanDO> list = list(Wrappers.<NotifyMessagePlanDO>lambdaQuery()
+                .le(NotifyMessagePlanDO::getPlanSendTime, now)
+                .eq(NotifyMessagePlanDO::getSendStatus, 0));
+        Gson gson = new Gson();
+        Type type = new TypeToken<Map<String, Object>>(){}.getType();
+        for (NotifyMessagePlanDO notifyMessagePlanDO : list) {
+            try {
+                // 执行发送
+                NotifyTemplateSendReqVO notifyTemplateSendReqVO = new NotifyTemplateSendReqVO();
+                notifyTemplateSendReqVO.setUserId(notifyMessagePlanDO.getUserId());
+                notifyTemplateSendReqVO.setUserType(notifyMessagePlanDO.getUserType());
+                notifyTemplateSendReqVO.setTemplateCode(notifyMessagePlanDO.getTemplateCode());
+                Map<String, Object> map = gson.fromJson(notifyMessagePlanDO.getTemplateParams(), type);
+                notifyTemplateSendReqVO.setTemplateParams(map);
+                notifySendService.sendSingleNotifyFromPlan(notifyTemplateSendReqVO);
+            } catch (Exception e) {
+                log.error("发送消息出现异常:{}", e);
+            } finally {
+                // 修改掉状态
+                update(Wrappers.<NotifyMessagePlanDO>lambdaUpdate()
+                        .eq(NotifyMessagePlanDO::getId, notifyMessagePlanDO.getId())
+                        .set(NotifyMessagePlanDO::getSendStatus, 1));
+            }
+        }
+        return true;
+    }
+
 }