Răsfoiți Sursa

【第一版开发】
1.移除冗余代码
2.优化代码
3.修复异常问题

ChenYL 10 luni în urmă
părinte
comite
1c8ca48c5c

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

@@ -40,11 +40,11 @@ public class DataProductHuntPostMedia extends BaseEntity implements Serializable
      * 图片url
      */
     @Column(name = "url")
-    private Integer url;
+    private String url;
 
     /**
      * 视频url
      */
     @Column(name = "video_url")
-    private Long videoUrl;
+    private String videoUrl;
 }

+ 7 - 0
data-easy/src/main/java/com/dataeasy/server/atomic/service/ISubscriptionOrderService.java

@@ -45,4 +45,11 @@ public interface ISubscriptionOrderService {
      * @param subscriptionOrder
      */
     void batchUpdate(Collection ids, SubscriptionOrder subscriptionOrder);
+
+    /**
+     * 根据用户ID获取订单
+     * @param userId 用户ID
+     * @return
+     */
+    List<SubscriptionOrder> getByUserId(Long userId);
 }

+ 15 - 0
data-easy/src/main/java/com/dataeasy/server/atomic/service/impl/SubscriptionOrderServiceImpl.java

@@ -3,6 +3,7 @@ package com.dataeasy.server.atomic.service.impl;
 import java.sql.Timestamp;
 import java.util.Collection;
 import java.util.List;
+import java.util.Objects;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -71,4 +72,18 @@ public class SubscriptionOrderServiceImpl implements ISubscriptionOrderService {
         criteria.andIn(SubscriptionOrder::getId, ids);
         subscriptionOrderMapper.updateByExampleSelective(subscriptionOrder, weekend);
     }
+
+    @Override
+    public List<SubscriptionOrder> getByUserId(Long userId) {
+        if (Objects.isNull(userId)) {
+            return List.of();
+        }
+
+        // 倒叙查询
+        Weekend<SubscriptionOrder> weekend =  Weekend.of(SubscriptionOrder.class);
+        WeekendCriteria<SubscriptionOrder, Object> criteria = weekend.weekendCriteria();
+        criteria.andEqualTo(SubscriptionOrder::getUserId, userId);
+        weekend.orderBy(SubscriptionOrder::getCreationTime).desc();
+        return subscriptionOrderMapper.selectByExample(weekend);
+    }
 }

+ 3 - 0
data-easy/src/main/java/com/dataeasy/server/atomic/service/impl/SubscriptionSourceServiceImpl.java

@@ -38,6 +38,9 @@ public class SubscriptionSourceServiceImpl implements ISubscriptionSourceService
         if (!CollectionUtils.isEmpty(query.getSubscriptionSourceCodeList())) {
             weekendCriteria.andIn(SubscriptionSource::getCode, query.getSubscriptionSourceCodeList());
         }
+        if (!CollectionUtils.isEmpty(query.getIdList())) {
+            weekendCriteria.andIn(SubscriptionSource::getId, query.getIdList());
+        }
         return subscriptionSourceMapper.selectByExample(weekend);
     }
 

+ 4 - 3
data-easy/src/main/java/com/dataeasy/server/pojo/data/DaLeTouVO.java

@@ -2,6 +2,7 @@ package com.dataeasy.server.pojo.data;
 
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 import lombok.Data;
 
@@ -15,9 +16,9 @@ import lombok.Data;
 public class DaLeTouVO {
 
     /**
-     * 开奖号码,以竖杠隔开
+     * 开奖号码
      */
-    private String number;
+    private List<String> numberList;
 
     /**
      * 特别号码1,第一个尾号
@@ -37,7 +38,7 @@ public class DaLeTouVO {
     /**
      * 开奖日期
      */
-    private Date time;
+    private String time;
 
     /**
      * 一等奖注数

+ 0 - 5
data-easy/src/main/java/com/dataeasy/server/pojo/data/ProductHuntPostMediaVO.java

@@ -20,9 +20,4 @@ public class ProductHuntPostMediaVO {
      * 图片url
      */
     private String url;
-
-    /**
-     * 视频url
-     */
-    private String videoUr;
 }

+ 3 - 2
data-easy/src/main/java/com/dataeasy/server/pojo/data/ShuangSeQiuVO.java

@@ -1,6 +1,7 @@
 package com.dataeasy.server.pojo.data;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 import lombok.Data;
 
@@ -14,9 +15,9 @@ import lombok.Data;
 public class ShuangSeQiuVO {
 
     /**
-     * 开奖号码,以竖杠隔开
+     * 开奖号码列表
      */
-    private String number;
+    private List<String> numberList;
 
     /**
      * 特别号码,尾号

+ 50 - 0
data-easy/src/main/java/com/dataeasy/server/pojo/order/SubscriptionOrderVO.java

@@ -0,0 +1,50 @@
+package com.dataeasy.server.pojo.order;
+
+import java.math.BigDecimal;
+
+import lombok.Data;
+
+/**
+ * @author myou
+ * @version 1.0.0
+ * @date 2025/3/29 14:27
+ * @description 订阅订单 VO
+ */
+@Data
+public class SubscriptionOrderVO {
+
+    /**
+     * 订单号
+     */
+    private String orderNo;
+
+    /**
+     * 订阅产品
+     */
+    private String product;
+
+    /**
+     * 订阅价格(单位:元)
+     */
+    private BigDecimal subscriptionPrice;
+
+    /**
+     * 订阅时长(单位:天)
+     */
+    private Integer subscriptionDuration;
+
+    /**
+     * 订单关闭时间
+     */
+    private String closeTime;
+
+    /**
+     * 支付状态
+     */
+    private String paymentStatus;
+
+    /**
+     * 创建时间
+     */
+    private String creationTime;
+}

+ 5 - 0
data-easy/src/main/java/com/dataeasy/server/pojo/subscription/SubscriptionSourceQuery.java

@@ -17,4 +17,9 @@ public class SubscriptionSourceQuery {
      * 订阅源编码列表
      */
     private Collection<String> subscriptionSourceCodeList;
+
+    /**
+     * 订阅源id列表
+     */
+    private Collection<Long> idList;
 }

+ 13 - 0
data-easy/src/main/java/com/dataeasy/server/service/controller/OrderController.java

@@ -1,7 +1,9 @@
 package com.dataeasy.server.service.controller;
 
+import com.dataeasy.server.pojo.order.SubscriptionOrderVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -12,6 +14,8 @@ import com.dataeasy.server.service.manager.IOrderManager;
 import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
 import com.github.binarywang.wxpay.exception.WxPayException;
 
+import java.util.List;
+
 /**
  * @author tyuio
  * @version 1.0.0
@@ -35,4 +39,13 @@ public class OrderController {
     public WxPayUnifiedOrderV3Result.JsapiResult createOrder(@RequestBody @Validated SubscriptionOrderRequest request) throws WxPayException {
         return orderManager.createOrder(request);
     }
+
+    /**
+     * 查询订单
+     * @return
+     */
+    @GetMapping("queryOrder")
+    public List<SubscriptionOrderVO> queryOrder() {
+        return orderManager.queryOrder();
+    }
 }

+ 8 - 0
data-easy/src/main/java/com/dataeasy/server/service/manager/IOrderManager.java

@@ -1,9 +1,12 @@
 package com.dataeasy.server.service.manager;
 
 import com.dataeasy.server.pojo.order.SubscriptionOrderRequest;
+import com.dataeasy.server.pojo.order.SubscriptionOrderVO;
 import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
 import com.github.binarywang.wxpay.exception.WxPayException;
 
+import java.util.List;
+
 /**
  * @author tyuio
  * @version 1.0.0
@@ -25,4 +28,9 @@ public interface IOrderManager {
      * @param transactionId 微信支付订单号
      */
     void successHandler(String orderNo, String transactionId);
+
+    /**
+     * 查询订单
+     */
+    List<SubscriptionOrderVO> queryOrder();
 }

+ 15 - 1
data-easy/src/main/java/com/dataeasy/server/service/manager/impl/DataManagerImpl.java

@@ -28,9 +28,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -120,6 +122,11 @@ public class DataManagerImpl implements IDataManager {
 
         DaLeTouVO daLeTouVO = new DaLeTouVO();
         BeanUtils.copyProperties(daLeTou, daLeTouVO);
+        // 分割开奖号码方便前端显示
+        if (StringUtils.hasText(daLeTou.getNumber())) {
+            List<String> numberList  = Arrays.stream(daLeTou.getNumber().split("\\|")).toList();
+            daLeTouVO.setNumberList(numberList);
+        }
         return daLeTouVO;
     }
 
@@ -135,6 +142,12 @@ public class DataManagerImpl implements IDataManager {
 
         ShuangSeQiuVO shuangSeQiuVO = new ShuangSeQiuVO();
         BeanUtils.copyProperties(shuangSeQiu, shuangSeQiuVO);
+        // 分割开奖号码方便前端显示
+        if (StringUtils.hasText(shuangSeQiu.getNumber())) {
+            List<String> numberList  = Arrays.stream(shuangSeQiu.getNumber().split("\\|")).toList();
+            shuangSeQiuVO.setNumberList(numberList);
+        }
+        
         return shuangSeQiuVO;
     }
 
@@ -159,7 +172,8 @@ public class DataManagerImpl implements IDataManager {
 
             List<DataProductHuntPostMedia> tempPostMedias = postMediaMap.get(post.getPostId());
             if (!CollectionUtils.isEmpty(tempPostMedias)) {
-                List<ProductHuntPostMediaVO> postMediaVOList = tempPostMedias.stream().map(postMedia -> {
+                // 目前只显示图片
+                List<ProductHuntPostMediaVO> postMediaVOList = tempPostMedias.stream().filter(v -> "iamge".equals(v.getType())).map(postMedia -> {
                     ProductHuntPostMediaVO postMediaVO = new ProductHuntPostMediaVO();
                     BeanUtils.copyProperties(postMedia, postMediaVO);
                     return postMediaVO;

+ 51 - 0
data-easy/src/main/java/com/dataeasy/server/service/manager/impl/OrderManagerImpl.java

@@ -1,13 +1,18 @@
 package com.dataeasy.server.service.manager.impl;
 
 import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 import com.dataeasy.server.atomic.entity.SubscriptionUserConfig;
 import com.dataeasy.server.atomic.entity.SubscriptionUserLog;
@@ -16,7 +21,10 @@ import com.dataeasy.server.common.utils.Assert;
 import com.dataeasy.server.constant.CacheNameConstant;
 import com.dataeasy.server.constant.PaidOptionEnum;
 import com.dataeasy.server.constant.PushOptionEnum;
+import com.dataeasy.server.pojo.order.SubscriptionOrderVO;
+import com.dataeasy.server.pojo.subscription.SubscriptionSourceQuery;
 import com.dataeasy.server.pojo.subscription.SubscriptionUserConfigQuery;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.cache.CacheManager;
@@ -253,4 +261,47 @@ public class OrderManagerImpl implements IOrderManager {
         cacheManager.getCache(CacheNameConstant.SUBSCRIPTION_USER_CONFIG_LIST).evict(subscriptionOrder.getUserId());
 
     }
+
+    @Override
+    public List<SubscriptionOrderVO> queryOrder() {
+        List<SubscriptionOrder> subscriptionOrders = subscriptionOrderService.getByUserId(UserUtils.getCurrentUserId());
+        if (CollectionUtils.isEmpty(subscriptionOrders)) {
+            return List.of();
+        }
+
+        Set<Long> subscriptionSourceIds = subscriptionOrders.stream().map(SubscriptionOrder::getSubscriptionSourceId).collect(Collectors.toSet());
+        SubscriptionSourceQuery subscriptionSourceQuery = new SubscriptionSourceQuery();
+        subscriptionSourceQuery.setIdList(subscriptionSourceIds);
+        List<SubscriptionSource> subscriptionSourceList = subscriptionSourceService.getByCondition(subscriptionSourceQuery);
+        Map<Long, SubscriptionSource> subscriptionSourceMap = subscriptionSourceList.stream().collect(Collectors.toMap(SubscriptionSource::getId, Function.identity(), (key1, key2) -> key1));
+
+        SimpleDateFormat sdf = new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS_PATTERN);
+        return subscriptionOrders.stream().map(subscriptionOrder ->  {
+            SubscriptionOrderVO subscriptionOrderVO = new SubscriptionOrderVO();
+            BeanUtils.copyProperties(subscriptionOrder, subscriptionOrderVO);
+
+            // 构造产品名称
+            SubscriptionSource subscriptionSource = subscriptionSourceMap.get(subscriptionOrder.getSubscriptionSourceId());
+            if (Objects.nonNull(subscriptionSource)) {
+                String product = String.format("%s-%s天", subscriptionSource.getTitle(), subscriptionOrder.getSubscriptionDuration());
+                subscriptionOrderVO.setProduct(product);
+            }
+
+            if (Objects.nonNull(subscriptionOrder.getCloseTime())) {
+                String closeTime = DateUtils.YYYY_MM_DD_HH_MM_SS_FORMATTER.format(subscriptionOrder.getCloseTime());
+                subscriptionOrderVO.setCloseTime(closeTime);
+            }
+
+            if (Objects.nonNull(subscriptionOrder.getCreationTime())) {
+                String creationTime = sdf.format(subscriptionOrder.getCreationTime());
+                subscriptionOrderVO.setCreationTime(creationTime);
+            }
+
+            if (Objects.nonNull(subscriptionOrder.getPaymentStatus())) {
+                subscriptionOrderVO.setPaymentStatus(subscriptionOrder.getPaymentStatus().getName());
+            }
+
+            return subscriptionOrderVO;
+        }).collect(Collectors.toList());
+    }
 }

+ 3 - 0
data-easy/src/main/java/com/dataeasy/server/task/ProductHuntTask.java

@@ -179,6 +179,9 @@ public class ProductHuntTask extends AbstractDataTask {
                     // 使用大模型批量翻译
                     ChatClient chatClient = chatClientBuilder.defaultSystem(promptSystemMessage).build();
                     String translateText = chatClient.prompt().user(originalText).call().content();
+                    if (translateText.startsWith("```json") && translateText.endsWith("```")) {
+                        translateText = translateText.substring(7, translateText.length()-3);
+                    }
                     log.debug("翻译结果:{}", translateText);
 
                     // 回写翻译数据

+ 10 - 0
data-easy/src/main/java/com/dataeasy/server/utiis/DateUtils.java

@@ -17,6 +17,11 @@ public class DateUtils {
      */
     public static final String YYYY_MM_DD_PATTERN = "yyyy-MM-dd";
 
+    /**
+     * 格式字符串,格式:yyyy-MM-dd HH:mm:ss
+     */
+    public static final String YYYY_MM_DD_HH_MM_SS_PATTERN = "yyyy-MM-dd HH:mm:ss";
+
     /**
      * 日期格式化器,格式:yyyy-MM-dd
      */
@@ -32,6 +37,11 @@ public class DateUtils {
      */
     public static final DateTimeFormatter YYMMDDHHMMSS_FORMATTER = DateTimeFormatter.ofPattern("yyMMddHHmmss");
 
+    /**
+     * 日期格式化器,格式:yyyy-MM-dd HH:mm:ss
+     */
+    public static final DateTimeFormatter YYYY_MM_DD_HH_MM_SS_FORMATTER = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS_PATTERN);
+
     /**
      * 日期格式化器,格式:yyyy-MM-ddTHH:mm:ss+08:00
      */

+ 2 - 0
doc/sql/schema.sql

@@ -472,3 +472,5 @@ CREATE TABLE `data_product_hunt_post_media` (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Product Hunt榜单的帖子媒体数据';
 
 ALTER TABLE data_easy.data_product_hunt_post_media CHANGE data_product_hunt_post_id post_id bigint NOT NULL COMMENT '帖子ID';
+ALTER TABLE data_easy.data_product_hunt_post_media MODIFY COLUMN url varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '图片url';
+ALTER TABLE data_easy.data_product_hunt_post_media MODIFY COLUMN video_url varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '视频url';