Эх сурвалжийг харах

【第一版开发】
1.完善技术文档中的表设计
2.移除无效代码
3.完善schema.sql表语句
4.完善发送消息模板的代码逻辑
5.校对数据字段

ChenYL 10 сар өмнө
parent
commit
439e9b4bc1
18 өөрчлөгдсөн 294 нэмэгдсэн , 186 устгасан
  1. 2 2
      data-easy/src/main/java/com/dataeasy/server/atomic/entity/DataDaLeTou.java
  2. 2 2
      data-easy/src/main/java/com/dataeasy/server/atomic/entity/DataIpoStock.java
  3. 12 0
      data-easy/src/main/java/com/dataeasy/server/atomic/entity/SubscriptionTaskConfig.java
  4. 3 2
      data-easy/src/main/java/com/dataeasy/server/core/aop/ScheduleTaskLogAspect.java
  5. 0 23
      data-easy/src/main/java/com/dataeasy/server/core/config/WxMessageProperties.java
  6. 27 16
      data-easy/src/main/java/com/dataeasy/server/feign/dto/finance/BondResponse.java
  7. 24 17
      data-easy/src/main/java/com/dataeasy/server/feign/dto/finance/StockResponse.java
  8. 8 0
      data-easy/src/main/java/com/dataeasy/server/pojo/task/ScheduleTaskContext.java
  9. 23 42
      data-easy/src/main/java/com/dataeasy/server/task/AbstractDataTask.java
  10. 28 10
      data-easy/src/main/java/com/dataeasy/server/task/DaLeTouTask.java
  11. 28 15
      data-easy/src/main/java/com/dataeasy/server/task/IpoBondTask.java
  12. 38 20
      data-easy/src/main/java/com/dataeasy/server/task/IpoStockTask.java
  13. 30 15
      data-easy/src/main/java/com/dataeasy/server/task/ProductHuntTask.java
  14. 28 15
      data-easy/src/main/java/com/dataeasy/server/task/ShuangSeQiuTask.java
  15. 6 1
      data-easy/src/main/java/com/dataeasy/server/utiis/DateUtils.java
  16. 0 4
      data-easy/src/main/resources/application-dev.yaml
  17. 31 0
      doc/sql/schema.sql
  18. 4 2
      doc/技术文档.md

+ 2 - 2
data-easy/src/main/java/com/dataeasy/server/atomic/entity/DataDaLeTou.java

@@ -53,7 +53,7 @@ public class DataDaLeTou extends BaseEntity implements Serializable {
      * 开奖日期
      */
     @Column(name = "time")
-    private Date time;
+    private String time;
 
     /**
      * 一等奖注数
@@ -185,7 +185,7 @@ public class DataDaLeTou extends BaseEntity implements Serializable {
      * 截止兑奖时间
      */
     @Column(name = "endtime")
-    private Date endtime;
+    private String endtime;
 
     /**
      * 一等奖追加注数

+ 2 - 2
data-easy/src/main/java/com/dataeasy/server/atomic/entity/DataIpoStock.java

@@ -154,6 +154,6 @@ public class DataIpoStock extends BaseEntity implements Serializable {
     /**
      * 每中一签获利
      */
-    @Column(name = "profit_rer_winning_lot")
-    private BigDecimal profitRerWinningLot;
+    @Column(name = "profit_per_winning_lot")
+    private BigDecimal profitPerWinningLot;
 }

+ 12 - 0
data-easy/src/main/java/com/dataeasy/server/atomic/entity/SubscriptionTaskConfig.java

@@ -52,4 +52,16 @@ public class SubscriptionTaskConfig extends BaseEntity implements Serializable {
      */
     @Column(name = "execute_option")
     private String executeOption;
+
+    /**
+     * 页面路径
+     */
+    @Column(name = "page_path")
+    private String pagePath;
+
+    /**
+     * 消息模板ID
+     */
+    @Column(name = "template_id")
+    private String templateId;
 }

+ 3 - 2
data-easy/src/main/java/com/dataeasy/server/core/aop/ScheduleTaskLogAspect.java

@@ -1,6 +1,7 @@
 package com.dataeasy.server.core.aop;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Objects;
 
 import org.aspectj.lang.ProceedingJoinPoint;
@@ -88,8 +89,8 @@ public class ScheduleTaskLogAspect {
         updateTaskLog.setId(addTaskLog.getId());
 
         // 设置任务上下文
-        ScheduleTaskContext scheduleTaskContext =
-                ScheduleTaskContext.builder().subscriptionTaskConfig(taskConfig).task(task).build();
+        ScheduleTaskContext scheduleTaskContext = ScheduleTaskContext.builder().subscriptionTaskConfig(taskConfig)
+            .task(task).context(new HashMap<>()).build();
         scheduleTaskContextThreadLocal.set(scheduleTaskContext);
 
         // 创建事务定义

+ 0 - 23
data-easy/src/main/java/com/dataeasy/server/core/config/WxMessageProperties.java

@@ -1,23 +0,0 @@
-package com.dataeasy.server.core.config;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.stereotype.Component;
-
-import lombok.Data;
-
-/**
- * @author myou
- * @version 1.0.0
- * @date 2025/3/1 21:35
- * @description 微信模板信息配置
- */
-@Data
-@Component
-@ConfigurationProperties(prefix = "wechat")
-public class WxMessageProperties {
-
-    /**
-     * 设置要取用的公众号模板
-     */
-    private String templateId;
-}

+ 27 - 16
data-easy/src/main/java/com/dataeasy/server/feign/dto/finance/BondResponse.java

@@ -3,8 +3,10 @@ package com.dataeasy.server.feign.dto.finance;
 import java.io.Serial;
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.Date;
 
 import com.fasterxml.jackson.annotation.JsonAlias;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 /**
@@ -34,44 +36,47 @@ public class BondResponse implements Serializable {
     /**
      * 公告日期
      */
+    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
     @JsonAlias("公告日期")
-    private String announcementDate;
+    private Date announcementDate;
 
     /**
      * 发行起始日
      */
     @JsonAlias("发行起始日")
-    private String issueStartDate;
+    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
+    private Date issueStartDate;
 
     /**
      * 发行终止日
      */
     @JsonAlias("发行终止日")
-    private String issueEndDate;
+    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
+    private Date issueEndDate;
 
     /**
      * 计划发行总量
      */
     @JsonAlias("计划发行总量")
-    private int plannedIssueAmount;
+    private BigDecimal plannedIssueAmount;
 
     /**
      * 实际发行总量
      */
     @JsonAlias("实际发行总量")
-    private int actualIssueAmount;
+    private BigDecimal actualIssueAmount;
 
     /**
      * 发行面值
      */
     @JsonAlias("发行面值")
-    private int issueParValue;
+    private BigDecimal issueParValue;
 
     /**
      * 发行价格
      */
     @JsonAlias("发行价格")
-    private int issuePrice;
+    private BigDecimal issuePrice;
 
     /**
      * 发行方式
@@ -113,19 +118,22 @@ public class BondResponse implements Serializable {
      * 转股开始日期
      */
     @JsonAlias("转股开始日期")
-    private String conversionStartDate;
+    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
+    private Date conversionStartDate;
 
     /**
      * 转股终止日期
      */
     @JsonAlias("转股终止日期")
-    private String conversionEndDate;
+    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
+    private Date conversionEndDate;
 
     /**
      * 网上申购日期
      */
     @JsonAlias("网上申购日期")
-    private String onlineSubscriptionDate;
+    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
+    private Date onlineSubscriptionDate;
 
     /**
      * 网上申购代码
@@ -143,7 +151,7 @@ public class BondResponse implements Serializable {
      * 网上申购数量上限
      */
     @JsonAlias("网上申购数量上限")
-    private int onlineSubscriptionMax;
+    private BigDecimal onlineSubscriptionMax;
 
     /**
      * 网上申购数量下限
@@ -161,31 +169,34 @@ public class BondResponse implements Serializable {
      * 网上申购中签结果公告日及退款日
      */
     @JsonAlias("网上申购中签结果公告日及退款日")
-    private String onlineSubscriptionResultDate;
+    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
+    private Date onlineSubscriptionResultDate;
 
     /**
      * 优先申购日
      */
     @JsonAlias("优先申购日")
-    private String prioritySubscriptionDate;
+    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
+    private Date prioritySubscriptionDate;
 
     /**
      * 配售价格
      */
     @JsonAlias("配售价格")
-    private int allotmentPrice;
+    private BigDecimal allotmentPrice;
 
     /**
      * 债权登记日
      */
     @JsonAlias("债权登记日")
-    private String creditorRegistrationDate;
+    private Date creditorRegistrationDate;
 
     /**
      * 优先申购缴款日
      */
     @JsonAlias("优先申购缴款日")
-    private String prioritySubscriptionPaymentDate;
+    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
+    private Date prioritySubscriptionPaymentDate;
 
     /**
      * 转股代码

+ 24 - 17
data-easy/src/main/java/com/dataeasy/server/feign/dto/finance/StockResponse.java

@@ -2,9 +2,12 @@ package com.dataeasy.server.feign.dto.finance;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
 
 import com.fasterxml.jackson.annotation.JsonAlias;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 /**
@@ -41,91 +44,95 @@ public class StockResponse implements Serializable {
      * 发行总数
      */
     @JsonAlias("发行总数")
-    private int totalIssued;
+    private BigDecimal totalIssued;
 
     /**
      * 网上发行数量
      */
     @JsonAlias("网上发行")
-    private int onlineIssued;
+    private BigDecimal onlineIssued;
 
     /**
      * 顶格申购需配市值
      */
     @JsonAlias("顶格申购需配市值")
-    private double maxMarketValueForSubscription;
+    private BigDecimal maxMarketValueForSubscription;
 
     /**
      * 申购上限
      */
     @JsonAlias("申购上限")
-    private int subscriptionLimit;
+    private Integer subscriptionLimit;
 
     /**
      * 发行价格
      */
     @JsonAlias("发行价格")
-    private Double issuePrice;
+    private BigDecimal issuePrice;
 
     /**
      * 最新价
      */
     @JsonAlias("最新价")
-    private Double latestPrice;
+    private BigDecimal latestPrice;
 
     /**
      * 首日收盘价
      */
     @JsonAlias("首日收盘价")
-    private Double firstDayClosingPrice;
+    private BigDecimal firstDayClosingPrice;
 
     /**
      * 申购日期
      */
     @JsonAlias("申购日期")
-    private String subscriptionDate;
+    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
+    private Date subscriptionDate;
 
     /**
      * 中签号公布日
      */
     @JsonAlias("中签号公布日")
-    private String winningNumberAnnouncementDate;
+    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
+    private Date winningNumberAnnouncementDate;
 
     /**
      * 中签缴款日期
      */
     @JsonAlias("中签缴款日期")
-    private String paymentDateForWinning;
+    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
+    private Date paymentDateForWinning;
 
     /**
      * 上市日期
      */
     @JsonAlias("上市日期")
-    private String listingDate;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date listingDate;
 
     /**
      * 发行市盈率
      */
     @JsonAlias("发行市盈率")
-    private Double issuePERatio;
+    private BigDecimal issuePeRatio;
 
     /**
      * 行业市盈率
      */
     @JsonAlias("行业市盈率")
-    private double industryPERatio;
+    private BigDecimal industryPeRatio;
 
     /**
      * 中签率
      */
     @JsonAlias("中签率")
-    private Double winningRate;
+    private BigDecimal winningRate;
 
     /**
      * 询价累计报价倍数
      */
     @JsonAlias("询价累计报价倍数")
-    private Double cumulativeBidMultiple;
+    private BigDecimal cumulativeBidMultiple;
 
     /**
      * 配售对象报价家数
@@ -143,11 +150,11 @@ public class StockResponse implements Serializable {
      * 涨幅
      */
     @JsonAlias("涨幅")
-    private Double increaseRate;
+    private BigDecimal increaseRate;
 
     /**
      * 每中一签获利
      */
     @JsonAlias("每中一签获利")
-    private Double profitPerWinningLot;
+    private BigDecimal profitPerWinningLot;
 }

+ 8 - 0
data-easy/src/main/java/com/dataeasy/server/pojo/task/ScheduleTaskContext.java

@@ -1,7 +1,10 @@
 package com.dataeasy.server.pojo.task;
 
+import java.util.Map;
+
 import com.dataeasy.server.atomic.entity.SubscriptionTaskConfig;
 import com.dataeasy.server.constant.ScheduleTaskEnum;
+
 import lombok.Builder;
 import lombok.Data;
 
@@ -24,4 +27,9 @@ public class ScheduleTaskContext {
      * 任务配置
      */
     private SubscriptionTaskConfig subscriptionTaskConfig;
+
+    /**
+     * 自定义上下文
+     */
+    private Map<String, Object> context;
 }

+ 23 - 42
data-easy/src/main/java/com/dataeasy/server/task/AbstractDataTask.java

@@ -7,6 +7,8 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.binarywang.spring.starter.wxjava.miniapp.properties.WxMaProperties;
+import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.CacheManager;
 import org.springframework.util.CollectionUtils;
@@ -22,13 +24,10 @@ import com.dataeasy.server.atomic.service.IUserService;
 import com.dataeasy.server.constant.PushOptionEnum;
 import com.dataeasy.server.constant.ScheduleTaskEnum;
 import com.dataeasy.server.core.aop.ScheduleTaskLogAspect;
-import com.dataeasy.server.core.config.WxMessageProperties;
 import com.dataeasy.server.pojo.subscription.SubscriptionUserConfigQuery;
 import com.dataeasy.server.pojo.task.ScheduleTaskContext;
 import com.dataeasy.server.service.manager.IWxManager;
 
-import lombok.Builder;
-import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
 
@@ -57,10 +56,10 @@ public abstract class AbstractDataTask {
     protected IWxManager wxMpManager;
 
     @Autowired
-    protected WxMessageProperties wxMessageProperties;
+    protected CacheManager cacheManager;
 
     @Autowired
-    protected CacheManager cacheManager;
+    private WxMaProperties wxMaProperties;
 
     /**
      * 定时任务执行逻辑
@@ -109,19 +108,24 @@ public abstract class AbstractDataTask {
         }
 
         // 获取消息模板所需数据
-//        TemplateMessage templateMessage = getTemplateMessage();
-//
-//        // 推送
-//        for (String mpOpenId : mpOpenIds) {
-//            // 生成模板信息
-//            WxMpTemplateMessage mpTemplateMessage = WxMpTemplateMessage.builder()
-//                    .toUser(mpOpenId)
-//                    .templateId(templateMessage.getTemplateId())
-//                    .url(templateMessage.getUrl())
-//                    .data(templateMessage.getTemplateDataList())
-//                    .build();
-//            wxMpManager.sendTemplateMessage(mpTemplateMessage);
-//        }
+        List<WxMpTemplateData> templateDataList = getTemplateMessage();
+
+        // 设置小程序
+        WxMpTemplateMessage.MiniProgram miniProgram = new WxMpTemplateMessage.MiniProgram();
+        miniProgram.setAppid(wxMaProperties.getAppid());
+        miniProgram.setPagePath(subscriptionTaskConfig.getPagePath());
+
+        // 推送
+        for (String mpOpenId : mpOpenIds) {
+            // 生成模板信息
+            WxMpTemplateMessage mpTemplateMessage = WxMpTemplateMessage.builder()
+                    .toUser(mpOpenId)
+                    .templateId(subscriptionTaskConfig.getTemplateId())
+                    .miniProgram(miniProgram)
+                    .data(templateDataList)
+                    .build();
+            wxMpManager.sendTemplateMessage(mpTemplateMessage);
+        }
     }
 
     /**
@@ -134,28 +138,5 @@ public abstract class AbstractDataTask {
      * 获取消息模板所需数据
      * @return
      */
-    public abstract TemplateMessage getTemplateMessage();
-
-    /**
-     * 定时任务中消息模板所需的数据
-     */
-    @Data
-    @Builder
-    public static class TemplateMessage {
-
-        /**
-         * 模板跳转链接
-         */
-        private String url;
-
-        /**
-         * 消息模板ID
-         */
-        private String templateId;
-
-        /**
-         * 模板所需数据
-         */
-        private List<WxMpTemplateData> templateDataList;
-    }
+    public abstract List<WxMpTemplateData> getTemplateMessage();
 }

+ 28 - 10
data-easy/src/main/java/com/dataeasy/server/task/DaLeTouTask.java

@@ -2,9 +2,9 @@ package com.dataeasy.server.task;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
-import com.dataeasy.server.constant.CacheNameConstant;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -13,8 +13,10 @@ import org.springframework.stereotype.Component;
 import com.dataeasy.server.atomic.entity.DataDaLeTou;
 import com.dataeasy.server.atomic.service.IDataDaLeTouService;
 import com.dataeasy.server.common.annotation.ScheduleTask;
+import com.dataeasy.server.constant.CacheNameConstant;
 import com.dataeasy.server.constant.HzApiStatusEnum;
 import com.dataeasy.server.constant.ScheduleTaskEnum;
+import com.dataeasy.server.core.aop.ScheduleTaskLogAspect;
 import com.dataeasy.server.feign.dto.hzapi.DaLeTouResponse;
 import com.dataeasy.server.feign.dto.hzapi.HzApiRequest;
 
@@ -32,6 +34,16 @@ import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
 @ScheduleTask(ScheduleTaskEnum.DA_LE_TOU)
 public class DaLeTouTask extends AbstractHzApiTask {
 
+    /**
+     * 开奖期号
+     */
+    private static final String CONTEXT_QIHAO = "qihao";
+
+    /**
+     * 开奖时间
+     */
+    private static final String CONTEXT_TIME = "time";
+
     @Autowired
     private IDataDaLeTouService daLeTouService;
 
@@ -62,19 +74,25 @@ public class DaLeTouTask extends AbstractHzApiTask {
         // 清除缓存,以防缓存中数据过时
         cacheManager.getCache(CacheNameConstant.DATA_DA_LE_TOU_LIST).evict(addDaLeTou.getQihao());
 
+        // 设置上下文
+        Map<String, Object> context = ScheduleTaskLogAspect.scheduleTaskContextThreadLocal.get().getContext();
+        context.put(CONTEXT_QIHAO, addDaLeTou.getQihao());
+        context.put(CONTEXT_TIME, addDaLeTou.getTime());
+
         return true;
     }
 
     @Override
-    public TemplateMessage getTemplateMessage() {
-        // 这是模板所需数据
+    public List<WxMpTemplateData> getTemplateMessage() {
+        // 获取上下文
+        Map<String, Object> context = ScheduleTaskLogAspect.scheduleTaskContextThreadLocal.get().getContext();
+        String drwaDate = (String) context.get(CONTEXT_QIHAO);
+        String drawTime = (String) context.get(CONTEXT_TIME);
+
+        // 模板所需数据
         List<WxMpTemplateData> templateDataList = new ArrayList();
-        templateDataList.add(new WxMpTemplateData("thing76", "大乐透开奖结果-25031期"));
-        templateDataList.add(new WxMpTemplateData("time4", "2025-03-13"));
-        return TemplateMessage.builder()
-                .url("www.baidu.com")
-                .templateId(wxMessageProperties.getTemplateId())
-                .templateDataList(templateDataList)
-                .build();
+        templateDataList.add(new WxMpTemplateData("thing76", String.format("大乐透开奖结果-%s期", drwaDate)));
+        templateDataList.add(new WxMpTemplateData("time4", drawTime));
+        return templateDataList;
     }
 }

+ 28 - 15
data-easy/src/main/java/com/dataeasy/server/task/IpoBondTask.java

@@ -3,9 +3,9 @@ package com.dataeasy.server.task;
 import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
-import com.dataeasy.server.constant.CacheNameConstant;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -15,7 +15,9 @@ import org.springframework.util.CollectionUtils;
 import com.dataeasy.server.atomic.entity.DataIpoBond;
 import com.dataeasy.server.atomic.service.IDataIpoBondService;
 import com.dataeasy.server.common.annotation.ScheduleTask;
+import com.dataeasy.server.constant.CacheNameConstant;
 import com.dataeasy.server.constant.ScheduleTaskEnum;
+import com.dataeasy.server.core.aop.ScheduleTaskLogAspect;
 import com.dataeasy.server.feign.FinanceFeign;
 import com.dataeasy.server.feign.dto.finance.BondResponse;
 import com.dataeasy.server.feign.dto.finance.FinanceRequest;
@@ -35,6 +37,16 @@ import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
 @ScheduleTask(ScheduleTaskEnum.IPO_BOND)
 public class IpoBondTask extends AbstractDataTask {
 
+    /**
+     * 新债数量
+     */
+    private static final String CONTEXT_BOND_NUM = "bondNum";
+
+    /**
+     * 申购日期
+     */
+    private static final String CONTEXT_SUBSCRIPTION_DATE = "subscriptionDate";
+
     @Autowired
     private FinanceFeign financeFeign;
 
@@ -71,24 +83,25 @@ public class IpoBondTask extends AbstractDataTask {
         // 清除缓存,以防缓存中数据过时
         cacheManager.getCache(CacheNameConstant.DATA_IPO_BOND_LIST).evict(todayStr);
 
+        // 设置上下文
+        Map<String, Object> context = ScheduleTaskLogAspect.scheduleTaskContextThreadLocal.get().getContext();
+        context.put(CONTEXT_BOND_NUM, ipoBonds.size());
+        context.put(CONTEXT_SUBSCRIPTION_DATE, todayStr);
+
         return true;
     }
 
     @Override
-    public TemplateMessage getTemplateMessage() {
-        // 这是模板所需数据
+    public List<WxMpTemplateData> getTemplateMessage() {
+        // 获取上下文
+        Map<String, Object> context = ScheduleTaskLogAspect.scheduleTaskContextThreadLocal.get().getContext();
+        int bondNum = (int) context.get(CONTEXT_BOND_NUM);
+        String subscriptionDate = (String) context.get(CONTEXT_SUBSCRIPTION_DATE);
+
+        // 模板所需数据
         List<WxMpTemplateData> templateDataList = new ArrayList();
-        templateDataList.add(new WxMpTemplateData("first", "预约成功"));
-        templateDataList.add(new WxMpTemplateData("keyword1", "测试111"));
-        templateDataList.add(new WxMpTemplateData("keyword2","测试2222"));
-        templateDataList.add(new WxMpTemplateData("keyword3","测试333"));
-        templateDataList.add(new WxMpTemplateData("keyword4","测试4444"));
-        templateDataList.add(new WxMpTemplateData("remark","测试备注"));
-
-        return TemplateMessage.builder()
-                .url("www.baidu.com")
-                .templateId(wxMessageProperties.getTemplateId())
-                .templateDataList(templateDataList)
-                .build();
+        templateDataList.add(new WxMpTemplateData("thing76", String.format("新债申购,今天发行%s只新债", bondNum)));
+        templateDataList.add(new WxMpTemplateData("time4", subscriptionDate));
+        return templateDataList;
     }
 }

+ 38 - 20
data-easy/src/main/java/com/dataeasy/server/task/IpoStockTask.java

@@ -1,22 +1,25 @@
 package com.dataeasy.server.task;
 
 import java.time.LocalDate;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
-import com.dataeasy.server.constant.CacheNameConstant;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
-import org.springframework.util.StringUtils;
 
 import com.dataeasy.server.atomic.entity.DataIpoStock;
 import com.dataeasy.server.atomic.service.IDataIpoStockService;
 import com.dataeasy.server.common.annotation.ScheduleTask;
+import com.dataeasy.server.constant.CacheNameConstant;
 import com.dataeasy.server.constant.ScheduleTaskEnum;
+import com.dataeasy.server.core.aop.ScheduleTaskLogAspect;
 import com.dataeasy.server.feign.FinanceFeign;
 import com.dataeasy.server.feign.dto.finance.FinanceRequest;
 import com.dataeasy.server.feign.dto.finance.StockResponse;
@@ -36,6 +39,16 @@ import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
 @ScheduleTask(ScheduleTaskEnum.IPO_STOCK)
 public class IpoStockTask extends AbstractDataTask {
 
+    /**
+     * 新股数量
+     */
+    private static final String CONTEXT_STOCK_NUM = "stockNum";
+
+    /**
+     * 申购日期
+     */
+    private static final String CONTEXT_SUBSCRIPTION_DATE = "subscriptionDate";
+
     @Autowired
     private FinanceFeign financeFeign;
 
@@ -59,10 +72,13 @@ public class IpoStockTask extends AbstractDataTask {
         }
 
         // 过滤当天新股数据
-        String todayStr = DateUtils.YYYY_MM_DD_FORMATTER.format(LocalDate.now());
-        String subscriptionDateStr = String.format("%sT00:00:00.000", todayStr);
-        List<DataIpoStock> ipoStocks = stockXgsglbEmList.stream().filter(v -> StringUtils.hasText(v.getSubscriptionDate()))
-                .filter(v -> subscriptionDateStr.equals(v.getSubscriptionDate()))
+        LocalDate today = LocalDate.now();
+        List<DataIpoStock> ipoStocks = stockXgsglbEmList.stream()
+            .filter(v -> Objects.nonNull(v.getSubscriptionDate())).filter(v -> {
+                LocalDate subscriptionDate =
+                    v.getSubscriptionDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+                return subscriptionDate.equals(today);
+            })
                 .map(v -> {
             DataIpoStock ipoStock = new DataIpoStock();
             BeanUtils.copyProperties(v, ipoStock);
@@ -79,26 +95,28 @@ public class IpoStockTask extends AbstractDataTask {
         ipoStockService.insertList(ipoStocks);
 
         // 清除缓存,以防缓存中数据过时
+        String todayStr = DateUtils.YYYY_MM_DD_FORMATTER.format(today);
         cacheManager.getCache(CacheNameConstant.DATA_IPO_STOCK_LIST).evict(todayStr);
 
+        // 设置上下文
+        Map<String, Object> context = ScheduleTaskLogAspect.scheduleTaskContextThreadLocal.get().getContext();
+        context.put(CONTEXT_STOCK_NUM, ipoStocks.size());
+        context.put(CONTEXT_SUBSCRIPTION_DATE, todayStr);
+
         return true;
     }
 
     @Override
-    public TemplateMessage getTemplateMessage() {
-        // 这是模板所需数据
+    public List<WxMpTemplateData> getTemplateMessage() {
+        // 获取上下文
+        Map<String, Object> context = ScheduleTaskLogAspect.scheduleTaskContextThreadLocal.get().getContext();
+        int stockNum = (int) context.get(CONTEXT_STOCK_NUM);
+        String subscriptionDate = (String) context.get(CONTEXT_SUBSCRIPTION_DATE);
+
+        // 模板所需数据
         List<WxMpTemplateData> templateDataList = new ArrayList();
-        templateDataList.add(new WxMpTemplateData("first", "预约成功"));
-        templateDataList.add(new WxMpTemplateData("keyword1", "测试111"));
-        templateDataList.add(new WxMpTemplateData("keyword2","测试2222"));
-        templateDataList.add(new WxMpTemplateData("keyword3","测试333"));
-        templateDataList.add(new WxMpTemplateData("keyword4","测试4444"));
-        templateDataList.add(new WxMpTemplateData("remark","测试备注"));
-
-        return TemplateMessage.builder()
-                .url("www.baidu.com")
-                .templateId(wxMessageProperties.getTemplateId())
-                .templateDataList(templateDataList)
-                .build();
+        templateDataList.add(new WxMpTemplateData("thing76", String.format("新股申购,今天发行%s只新股", stockNum)));
+        templateDataList.add(new WxMpTemplateData("time4", subscriptionDate));
+        return templateDataList;
     }
 }

+ 30 - 15
data-easy/src/main/java/com/dataeasy/server/task/ProductHuntTask.java

@@ -1,5 +1,6 @@
 package com.dataeasy.server.task;
 
+import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.ArrayList;
@@ -17,6 +18,7 @@ import java.util.stream.Collectors;
 
 import com.dataeasy.server.common.exception.BusinessException;
 import com.dataeasy.server.constant.CacheNameConstant;
+import com.dataeasy.server.core.aop.ScheduleTaskLogAspect;
 import com.dataeasy.server.pojo.task.ProductHuntTranslateDto;
 import com.dataeasy.server.utiis.DateUtils;
 import com.fasterxml.jackson.core.type.TypeReference;
@@ -59,6 +61,16 @@ import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
 @ScheduleTask(ScheduleTaskEnum.PRODUCT_HUNT)
 public class ProductHuntTask extends AbstractDataTask {
 
+    /**
+     * 帖子数量
+     */
+    private static final String CONTEXT_POST_NUM = "postNum";
+
+    /**
+     * 榜单日期
+     */
+    private static final String CONTEXT_RANK_DATE = "rankDate";
+
     @Autowired
     private ProductHuntFeign productHuntFeign;
 
@@ -200,26 +212,29 @@ public class ProductHuntTask extends AbstractDataTask {
         productHuntPostService.insertList(posts);
 
         // 清除缓存,以防缓存中数据过时
-        cacheManager.getCache(CacheNameConstant.DATA_PRODUCT_HUNT_POST_LIST).evict(rankDate);
+        SimpleDateFormat sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD_PATTERN);
+        String randDateStr = sdf.format(rankDate);
+        cacheManager.getCache(CacheNameConstant.DATA_PRODUCT_HUNT_POST_LIST).evict(randDateStr);
+
+        // 设置上下文
+        Map<String, Object> context = ScheduleTaskLogAspect.scheduleTaskContextThreadLocal.get().getContext();
+        context.put(CONTEXT_POST_NUM, posts.size());
+        context.put(CONTEXT_RANK_DATE, randDateStr);
 
         return true;
     }
 
     @Override
-    public TemplateMessage getTemplateMessage() {
-        // 这是模板所需数据
+    public List<WxMpTemplateData> getTemplateMessage() {
+        // 获取上下文
+        Map<String, Object> context = ScheduleTaskLogAspect.scheduleTaskContextThreadLocal.get().getContext();
+        int postNum = (int) context.get(CONTEXT_POST_NUM);
+        String rankDate = (String) context.get(CONTEXT_RANK_DATE);
+
+        // 模板所需数据
         List<WxMpTemplateData> templateDataList = new ArrayList();
-        templateDataList.add(new WxMpTemplateData("first", "预约成功"));
-        templateDataList.add(new WxMpTemplateData("keyword1", "测试111"));
-        templateDataList.add(new WxMpTemplateData("keyword2","测试2222"));
-        templateDataList.add(new WxMpTemplateData("keyword3","测试333"));
-        templateDataList.add(new WxMpTemplateData("keyword4","测试4444"));
-        templateDataList.add(new WxMpTemplateData("remark","测试备注"));
-
-        return TemplateMessage.builder()
-                .url("www.baidu.com")
-                .templateId(wxMessageProperties.getTemplateId())
-                .templateDataList(templateDataList)
-                .build();
+        templateDataList.add(new WxMpTemplateData("thing76", String.format("ProductHunt热榜-TOP%s", postNum)));
+        templateDataList.add(new WxMpTemplateData("time4", rankDate));
+        return templateDataList;
     }
 }

+ 28 - 15
data-easy/src/main/java/com/dataeasy/server/task/ShuangSeQiuTask.java

@@ -2,9 +2,9 @@ package com.dataeasy.server.task;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
-import com.dataeasy.server.constant.CacheNameConstant;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -13,8 +13,10 @@ import org.springframework.stereotype.Component;
 import com.dataeasy.server.atomic.entity.DataShuangSeQiu;
 import com.dataeasy.server.atomic.service.IDataShuangSeQiuService;
 import com.dataeasy.server.common.annotation.ScheduleTask;
+import com.dataeasy.server.constant.CacheNameConstant;
 import com.dataeasy.server.constant.HzApiStatusEnum;
 import com.dataeasy.server.constant.ScheduleTaskEnum;
+import com.dataeasy.server.core.aop.ScheduleTaskLogAspect;
 import com.dataeasy.server.feign.dto.hzapi.HzApiRequest;
 import com.dataeasy.server.feign.dto.hzapi.ShuangSeQiuResponse;
 
@@ -32,6 +34,16 @@ import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
 @ScheduleTask(ScheduleTaskEnum.SHUANG_SE_QIU)
 public class ShuangSeQiuTask extends AbstractHzApiTask {
 
+    /**
+     * 开奖期号
+     */
+    private static final String CONTEXT_QIHAO = "qihao";
+
+    /**
+     * 开奖时间
+     */
+    private static final String CONTEXT_TIME = "time";
+
     @Autowired
     private IDataShuangSeQiuService shuangSeQiuService;
 
@@ -62,24 +74,25 @@ public class ShuangSeQiuTask extends AbstractHzApiTask {
         // 清除缓存,以防缓存中数据过时
         cacheManager.getCache(CacheNameConstant.DATA_SHUANG_SE_QIU_LIST).evict(addShuangSeQiu.getQihao());
 
+        // 设置上下文
+        Map<String, Object> context = ScheduleTaskLogAspect.scheduleTaskContextThreadLocal.get().getContext();
+        context.put(CONTEXT_QIHAO, addShuangSeQiu.getQihao());
+        context.put(CONTEXT_TIME, addShuangSeQiu.getTime());
+
         return true;
     }
 
     @Override
-    public TemplateMessage getTemplateMessage() {
-        // 这是模板所需数据
+    public List<WxMpTemplateData> getTemplateMessage() {
+        // 获取上下文
+        Map<String, Object> context = ScheduleTaskLogAspect.scheduleTaskContextThreadLocal.get().getContext();
+        String drwaDate = (String) context.get(CONTEXT_QIHAO);
+        String drawTime = (String) context.get(CONTEXT_TIME);
+
+        // 模板所需数据
         List<WxMpTemplateData> templateDataList = new ArrayList();
-        templateDataList.add(new WxMpTemplateData("first", "预约成功"));
-        templateDataList.add(new WxMpTemplateData("keyword1", "测试111"));
-        templateDataList.add(new WxMpTemplateData("keyword2","测试2222"));
-        templateDataList.add(new WxMpTemplateData("keyword3","测试333"));
-        templateDataList.add(new WxMpTemplateData("keyword4","测试4444"));
-        templateDataList.add(new WxMpTemplateData("remark","测试备注"));
-
-        return TemplateMessage.builder()
-                .url("www.baidu.com")
-                .templateId(wxMessageProperties.getTemplateId())
-                .templateDataList(templateDataList)
-                .build();
+        templateDataList.add(new WxMpTemplateData("thing76", String.format("双色球开奖结果-%s期", drwaDate)));
+        templateDataList.add(new WxMpTemplateData("time4", drawTime));
+        return templateDataList;
     }
 }

+ 6 - 1
data-easy/src/main/java/com/dataeasy/server/utiis/DateUtils.java

@@ -12,10 +12,15 @@ import java.time.format.DateTimeFormatter;
  */
 public class DateUtils {
 
+    /**
+     * 格式字符串,格式:yyyy-MM-dd
+     */
+    public static final String YYYY_MM_DD_PATTERN = "yyyy-MM-dd";
+
     /**
      * 日期格式化器,格式:yyyy-MM-dd
      */
-    public static final DateTimeFormatter YYYY_MM_DD_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    public static final DateTimeFormatter YYYY_MM_DD_FORMATTER = DateTimeFormatter.ofPattern(YYYY_MM_DD_PATTERN);
 
     /**
      * 日期格式化器,格式:yyyyMMdd

+ 0 - 4
data-easy/src/main/resources/application-dev.yaml

@@ -37,10 +37,6 @@ wx:
     appid: ENC(825U/6iYUhZJK7ojeBUya+WATlVilGB8py4AQPA0jwfY8oPwjZ53wA==)
     secret: ENC(tgBCIrfBOMfj68qP7X7zI9ZTBMBccyqlHCv5mQaTbKpobbtTZsAQp77rDfbW0kKrs9ta+NiWMkM=)
 
-# 微信消息模板配置
-wechat:
-  templateId: lJGGwwLWQM4Ba8rSoTkeni6_lnvE8h6UJ5_4jj132-4
-
 # 接口盒子平台配置
 hz-api:
   id: ENC(2myOnTLci1DlpQfDkcqN2fGoM24y/fairiO5hH7braM=)

+ 31 - 0
doc/sql/schema.sql

@@ -399,3 +399,34 @@ ALTER TABLE data_easy.data_product_hunt_post ADD `key` varchar(500) NULL COMMENT
 ALTER TABLE data_easy.data_product_hunt_post CHANGE `key` `key` varchar(500) NULL COMMENT '关键词' AFTER description;
 ALTER TABLE data_easy.data_product_hunt_post ADD description_key varchar(500) NULL COMMENT '信息中的关键词';
 ALTER TABLE data_easy.data_product_hunt_post CHANGE description_key description_key varchar(500) NULL COMMENT '信息中的关键词' AFTER description;
+ALTER TABLE data_easy.subscription_task_config ADD page_path varchar(100) NULL COMMENT '页面路径';
+ALTER TABLE data_easy.subscription_task_config CHANGE page_path page_path varchar(100) NULL COMMENT '页面路径' AFTER execute_option;
+ALTER TABLE data_easy.subscription_task_config ADD template_id varchar(100) NULL COMMENT '消息模板ID';
+ALTER TABLE data_easy.subscription_task_config CHANGE template_id template_id varchar(100) NULL COMMENT '消息模板ID' AFTER page_path;
+ALTER TABLE data_easy.data_da_le_tou MODIFY COLUMN `time` char(10) NULL COMMENT '开奖日期';
+ALTER TABLE data_easy.data_da_le_tou MODIFY COLUMN endtime char(19) NULL COMMENT '截止兑奖时间';
+ALTER TABLE data_easy.data_ipo_stock MODIFY COLUMN subscription_code varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '申购代码';
+ALTER TABLE data_easy.data_ipo_stock MODIFY COLUMN issue_p_e_ratio decimal(5,2) NULL COMMENT '发行市盈率';
+ALTER TABLE data_easy.data_ipo_stock MODIFY COLUMN industry_p_e_ratio decimal(5,2) NULL COMMENT '行业市盈率';
+ALTER TABLE data_easy.data_ipo_stock MODIFY COLUMN winning_rate decimal(11,10) NULL COMMENT '中签率';
+ALTER TABLE data_easy.data_ipo_stock MODIFY COLUMN cumulative_bid_multiple decimal(20,2) NULL COMMENT '询价累计报价倍数';
+ALTER TABLE data_easy.data_ipo_stock MODIFY COLUMN bidding_firms_count int NULL COMMENT '配售对象报价家数';
+ALTER TABLE data_easy.data_ipo_stock MODIFY COLUMN increase_rate decimal(20,2) NULL COMMENT '涨幅';
+ALTER TABLE data_easy.data_ipo_stock MODIFY COLUMN profit_rer_winning_lot decimal(20,2) NULL COMMENT '每中一签获利';
+ALTER TABLE data_easy.data_ipo_stock MODIFY COLUMN first_day_closing_price decimal(20,2) NULL COMMENT '首日收盘价';
+ALTER TABLE data_easy.data_ipo_stock MODIFY COLUMN latest_price decimal(20,2) NULL COMMENT '最新价';
+ALTER TABLE data_easy.data_ipo_stock MODIFY COLUMN issue_price decimal(20,2) NULL COMMENT '发行价格';
+ALTER TABLE data_easy.data_ipo_stock MODIFY COLUMN subscription_limit int NULL COMMENT '申购上限';
+ALTER TABLE data_easy.data_ipo_stock MODIFY COLUMN max_market_value_for_subscription decimal(22,4) NULL COMMENT '顶格申购需配市值';
+ALTER TABLE data_easy.data_ipo_stock MODIFY COLUMN online_issued decimal(22,4) NULL COMMENT '网上发行';
+ALTER TABLE data_easy.data_ipo_stock MODIFY COLUMN total_issued decimal(22,4) NULL COMMENT '发行总数';
+ALTER TABLE data_easy.data_ipo_bond MODIFY COLUMN allotment_price decimal(20,2) NULL COMMENT '配售价格';
+ALTER TABLE data_easy.data_ipo_bond MODIFY COLUMN online_subscription_unit decimal(20,2) NULL COMMENT '网上申购单位';
+ALTER TABLE data_easy.data_ipo_bond MODIFY COLUMN online_subscription_min decimal(20,2) NULL COMMENT '网上申购数量下限';
+ALTER TABLE data_easy.data_ipo_bond MODIFY COLUMN online_subscription_max decimal(20,2) NULL COMMENT '网上申购数量上限';
+ALTER TABLE data_easy.data_ipo_bond MODIFY COLUMN initial_conversion_price decimal(20,2) NULL COMMENT '初始转股价格';
+ALTER TABLE data_easy.data_ipo_bond MODIFY COLUMN issue_price decimal(20,2) NULL COMMENT '发行价格';
+ALTER TABLE data_easy.data_ipo_bond MODIFY COLUMN issue_par_value decimal(20,2) NULL COMMENT '发行面值';
+ALTER TABLE data_easy.data_ipo_bond MODIFY COLUMN actual_issue_amount decimal(22,4) NULL COMMENT '实际发行总量';
+ALTER TABLE data_easy.data_ipo_bond MODIFY COLUMN planned_issue_amount decimal(22,4) NULL COMMENT '计划发行总量';
+ALTER TABLE data_easy.data_ipo_stock CHANGE profit_rer_winning_lot profit_per_winning_lot decimal(20,2) NULL COMMENT '每中一签获利';

+ 4 - 2
doc/技术文档.md

@@ -159,7 +159,7 @@
 | number1          | varchar(2)    | 特别号码1,第一个尾号              |
 | number2          | varchar(2)    | 特别号码2,第二个尾号              |
 | qihao            | char(5)       | 期号                               |
-| time             | date          | 开奖日期                           |
+| time             | char(10)      | 开奖日期                           |
 | no1num           | int           | 一等奖注数                         |
 | no2num           | int           | 二等奖注数                         |
 | no3num           | int           | 三等奖注数                         |
@@ -181,7 +181,7 @@
 | name             | varchar(30)   | 彩票名称                           |
 | xiaoshou         | decimal(18,2) | 销售额                             |
 | jiangchi         | decimal(18,2) | 奖池金额                           |
-| endtime          | timestamp     | 截止兑奖时间                       |
+| endtime          | char(19)      | 截止兑奖时间                       |
 | no1numjia        | int           | 一等奖追加注数                     |
 | no1moneyjia      | decimal(18,2) | 一等奖追加奖金                     |
 | no2numjia        | int           | 二等奖追加注数                     |
@@ -389,6 +389,8 @@
 | task_name              | varchar(100) | 定时任务名称                          |
 | subscription_source_id | bigint       | 订阅源ID                              |
 | execute_option         | varchar(10)  | 执行选项(ENABLED-开启、DISABLED-关闭) |
+| page_path              | varchar(100) | 页面路径                              |
+| template_id            | varchar(100) | 消息模板ID                            |
 | created_by             | bigint       | 创建人                                |
 | creation_time          | timestamp    | 创建时间                              |
 | last_updated_by        | bigint       | 最后更新人                            |