Переглянути джерело

批量删除接口修改
批量修改接口修改
http请求客户端替换

Zhangbw 2 місяців тому
батько
коміт
ae37f21e8f

+ 4 - 4
ruoyi-modules/yp-miniapp/src/main/java/com/yingpai/miniapp/controller/MiniappUserController.java

@@ -79,13 +79,13 @@ public class MiniappUserController extends BaseController {
     }
 
     /**
-     * 删除小程序用户
+     * 删除小程序用户(支持单个和批量删除)
      */
     @SaCheckPermission("miniapp:user:remove")
     @Log(title = "小程序用户", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{id}")
-    public R<Void> remove(@PathVariable Long id) {
-        return toAjax(miniappUserService.deleteUser(id));
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(miniappUserService.deleteUsers(List.of(ids)));
     }
 
     /**

+ 7 - 6
ruoyi-modules/yp-miniapp/src/main/java/com/yingpai/miniapp/controller/UserSubscriptionController.java

@@ -1,6 +1,7 @@
 package com.yingpai.miniapp.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.yingpai.miniapp.domain.bo.BatchUpdateSubscriptionBo;
 import com.yingpai.miniapp.domain.bo.UserSubscriptionBo;
 import com.yingpai.miniapp.domain.vo.UserSubscriptionVo;
 import com.yingpai.miniapp.service.IUserSubscriptionService;
@@ -17,7 +18,6 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
-import java.util.Map;
 
 /**
  * 订阅管理
@@ -60,15 +60,16 @@ public class UserSubscriptionController extends BaseController {
     }
 
     /**
-     * 修改订阅
+     * 修改订阅信息(支持单个和批量修改)
      */
     @SaCheckPermission("miniapp:subscription:edit")
     @Log(title = "订阅管理", businessType = BusinessType.UPDATE)
     @PutMapping
-    public R<Void> edit(@RequestBody Map<String, Object> params) {
-        Long id = Long.valueOf(params.get("id").toString());
-        Integer status = Integer.valueOf(params.get("status").toString());
-        return toAjax(subscriptionService.updateStatus(id, status));
+    public R<Void> edit(@RequestBody BatchUpdateSubscriptionBo batchBo) {
+        UserSubscriptionBo bo = new UserSubscriptionBo();
+        bo.setExpireTime(batchBo.getExpireTime());
+        bo.setStatus(batchBo.getStatus());
+        return toAjax(subscriptionService.batchUpdate(batchBo.getIds(), bo));
     }
 
     /**

+ 24 - 0
ruoyi-modules/yp-miniapp/src/main/java/com/yingpai/miniapp/domain/bo/BatchUpdateSubscriptionBo.java

@@ -0,0 +1,24 @@
+package com.yingpai.miniapp.domain.bo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 批量修改订阅信息BO
+ */
+@Data
+public class BatchUpdateSubscriptionBo {
+
+    /** 订阅ID列表 */
+    private List<Long> ids;
+
+    /** 订阅到期时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime expireTime;
+
+    /** 状态:1-有效,0-已过期 */
+    private Integer status;
+}

+ 10 - 5
ruoyi-modules/yp-miniapp/src/main/java/com/yingpai/miniapp/domain/bo/UserSubscriptionBo.java

@@ -2,24 +2,29 @@ package com.yingpai.miniapp.domain.bo;
 
 import lombok.Data;
 
+import java.time.LocalDateTime;
+
 /**
  * 用户订阅查询BO
  */
 @Data
 public class UserSubscriptionBo {
-    
+
     /** 用户ID */
     private Long userId;
-    
+
     /** 用户昵称 */
     private String nickname;
-    
+
     /** 用户手机号 */
     private String phone;
-    
+
     /** 池类型:1-超短池,2-强势池 */
     private Integer poolType;
-    
+
     /** 状态:1-有效,0-已过期 */
     private Integer status;
+
+    /** 订阅到期时间 */
+    private LocalDateTime expireTime;
 }

+ 5 - 0
ruoyi-modules/yp-miniapp/src/main/java/com/yingpai/miniapp/service/IMiniappUserService.java

@@ -42,6 +42,11 @@ public interface IMiniappUserService {
      */
     int deleteUser(Long id);
 
+    /**
+     * 批量删除用户
+     */
+    int deleteUsers(List<Long> ids);
+
     /**
      * 修改用户状态
      */

+ 5 - 0
ruoyi-modules/yp-miniapp/src/main/java/com/yingpai/miniapp/service/IUserSubscriptionService.java

@@ -41,4 +41,9 @@ public interface IUserSubscriptionService {
      * 修改订阅状态
      */
     Boolean updateStatus(Long id, Integer status);
+
+    /**
+     * 批量修改订阅信息
+     */
+    Boolean batchUpdate(List<Long> ids, UserSubscriptionBo bo);
 }

+ 5 - 0
ruoyi-modules/yp-miniapp/src/main/java/com/yingpai/miniapp/service/impl/MiniappUserServiceImpl.java

@@ -73,6 +73,11 @@ public class MiniappUserServiceImpl implements IMiniappUserService {
         return baseMapper.deleteById(id);
     }
 
+    @Override
+    public int deleteUsers(List<Long> ids) {
+        return baseMapper.deleteBatchIds(ids);
+    }
+
     @Override
     public int updateStatus(Long id, Integer status) {
         LambdaUpdateWrapper<MiniappUser> updateWrapper = Wrappers.lambdaUpdate();

+ 20 - 0
ruoyi-modules/yp-miniapp/src/main/java/com/yingpai/miniapp/service/impl/UserSubscriptionServiceImpl.java

@@ -72,6 +72,26 @@ public class UserSubscriptionServiceImpl implements IUserSubscriptionService {
         subscription.setStatus(status);
         return subscriptionMapper.updateById(subscription) > 0;
     }
+
+    @Override
+    public Boolean batchUpdate(List<Long> ids, UserSubscriptionBo bo) {
+        if (ids == null || ids.isEmpty()) {
+            return false;
+        }
+
+        for (Long id : ids) {
+            UserSubscription subscription = new UserSubscription();
+            subscription.setId(id);
+            if (bo.getExpireTime() != null) {
+                subscription.setExpireTime(bo.getExpireTime());
+            }
+            if (bo.getStatus() != null) {
+                subscription.setStatus(bo.getStatus());
+            }
+            subscriptionMapper.updateById(subscription);
+        }
+        return true;
+    }
     
     private LambdaQueryWrapper<UserSubscription> buildQueryWrapper(UserSubscriptionBo bo) {
         LambdaQueryWrapper<UserSubscription> wrapper = new LambdaQueryWrapper<>();

+ 6 - 20
ruoyi-modules/yp-stock/src/main/java/com/yingpai/stock/service/impl/StockQuoteServiceImpl.java

@@ -1,7 +1,6 @@
 package com.yingpai.stock.service.impl;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import cn.hutool.http.HttpUtil;
 import com.yingpai.stock.domain.StockQuoteData;
 import com.yingpai.stock.service.IStockQuoteService;
 import lombok.extern.slf4j.Slf4j;
@@ -11,11 +10,6 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.net.URI;
-import java.net.http.HttpClient;
-import java.net.http.HttpRequest;
-import java.net.http.HttpResponse;
-import java.time.Duration;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ConcurrentHashMap;
@@ -29,11 +23,6 @@ import java.util.stream.Collectors;
 public class StockQuoteServiceImpl implements IStockQuoteService {
 
     private final ThreadPoolTaskExecutor executor;
-    private final ObjectMapper objectMapper = new ObjectMapper();
-
-    private final HttpClient httpClient = HttpClient.newBuilder()
-        .connectTimeout(Duration.ofSeconds(10))
-        .build();
 
     private static final int BATCH_SIZE = 50;
     // 腾讯股票行情接口
@@ -103,15 +92,12 @@ public class StockQuoteServiceImpl implements IStockQuoteService {
 
             if (codes.isEmpty()) return result;
 
-            HttpRequest request = HttpRequest.newBuilder()
-                .uri(URI.create(String.format(BATCH_QUOTE_URL, codes)))
-                .GET()
-                .build();
-
-            HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+            String body = HttpUtil.createGet(String.format(BATCH_QUOTE_URL, codes))
+                .timeout(10000)
+                .execute()
+                .body();
 
-            if (response.statusCode() == 200) {
-                String body = response.body();
+            if (body != null && !body.isEmpty()) {
                 String[] lines = body.split(";");
 
                 for (String line : lines) {

+ 8 - 18
ruoyi-modules/yp-stock/src/main/java/com/yingpai/stock/task/StockSyncTask.java

@@ -9,11 +9,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
-import java.net.URI;
-import java.net.http.HttpClient;
-import java.net.http.HttpRequest;
-import java.net.http.HttpResponse;
-import java.time.Duration;
+import cn.hutool.http.HttpUtil;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
@@ -30,10 +26,6 @@ public class StockSyncTask {
     private final StockInfoMapper stockInfoMapper;
     private final ObjectMapper objectMapper = new ObjectMapper();
 
-    private final HttpClient httpClient = HttpClient.newBuilder()
-        .connectTimeout(Duration.ofSeconds(30))
-        .build();
-
     // 东方财富全部A股列表接口
     // 沪市:m:1+t:2 主板, m:1+t:23 科创板
     // 深市:m:0+t:6 主板, m:0+t:80 创业板
@@ -88,16 +80,14 @@ public class StockSyncTask {
         while (true) {
             try {
                 String url = String.format(urlTemplate, page);
-                HttpRequest request = HttpRequest.newBuilder()
-                    .uri(URI.create(url))
+                String responseBody = HttpUtil.createGet(url)
                     .header("User-Agent", "Mozilla/5.0")
-                    .GET()
-                    .build();
-
-                HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+                    .timeout(30000)
+                    .execute()
+                    .body();
 
-                if (response.statusCode() == 200) {
-                    JsonNode root = objectMapper.readTree(response.body());
+                if (responseBody != null && !responseBody.isEmpty()) {
+                    JsonNode root = objectMapper.readTree(responseBody);
                     JsonNode data = root.path("data").path("diff");
 
                     if (data == null || data.isNull() || !data.isArray() || data.isEmpty()) {
@@ -127,7 +117,7 @@ public class StockSyncTask {
                     // 防止请求过快
                     Thread.sleep(200);
                 } else {
-                    log.warn("[股票同步] 请求失败,状态码: {}", response.statusCode());
+                    log.warn("[股票同步] 请求失败,响应为空");
                     break;
                 }