Sfoglia il codice sorgente

用户个人藏品列表

skyfffire 1 mese fa
parent
commit
6ab03def56

+ 141 - 95
src/main/java/modules/order/OrderService.java

@@ -168,6 +168,9 @@ public class OrderService {
     public MyRet findOrderById(long orderId, long userId) {
         List<Order> orderList = Order.dao.find("SELECT * FROM t_order WHERE id=? and user_id=?", orderId, userId);
 
+        // 给用户转账NFT
+        doNftTransfer(userId, orderList);
+        
         // 给用户订单封装商品信息
         for (Order order : orderList) {
             order.put("nftt", nfttService.findNfttById(order.getNfttId() + ""));
@@ -181,6 +184,44 @@ public class OrderService {
             return MyRet.fail("未找到订单号对应的订单");
         }
     }
+    
+    public MyRet findNftListByUser(long userId) {
+        String columns = "id, nftt_id, order_status, order_type, delivery_status, delivery_time, nft_mint_status, bsn_transfer_code, bsn_transfer_status";
+        String sql = "SELECT " + columns + " FROM t_order WHERE user_id = ? ORDER BY create_time DESC";
+        List<Order> allOrderList = Order.dao.find(sql, userId);
+        
+        // 给用户转账NFT
+        doNftTransfer(userId, allOrderList);
+
+        // 创建一个新的列表来存储过滤后的订单
+        List<Order> filteredOrders = new ArrayList<>();
+
+        // 控制给用户的返回值
+        for (Order order : allOrderList) {
+            if (order.getDeliveryStatus() == 1 
+                    && order.getOrderStatus() == OrderController.OrderStatus.COMPLETED.code 
+                    && order.getNftMintStatus() == 4) {
+                filteredOrders.add(order);
+            }
+        }
+        
+        // 给放入txHash,移除bsh_transfer_status
+        for (Order order : filteredOrders) {
+            JSONObject bsn = JSONObject.parseObject(order.getBsnTransferStatus());
+            
+            String hash = bsn.getJSONObject("data").getString("txHash");
+            order.remove("bsn_transfer_status");
+            order.put("tx_hash", hash);
+            order.put("tx_query_url", String.format("https://taianexplorer.bsnbase.com/transaction-detail?data=%s&type=some", hash));
+        }
+
+        // 给用户订单封装商品信息
+        for (Order order : filteredOrders) {
+            order.put("nftt", nfttService.findNfttById(order.getNfttId() + ""));
+        }
+
+        return MyRet.ok("查询成功").setData(filteredOrders);
+    }
 
     /**
      * 根据用户ID查询订单列表,并封装订单流转状态
@@ -188,13 +229,98 @@ public class OrderService {
      * @return 包含订单列表及状态流转信息的 MyRet 对象
      */
     public MyRet findOrderByUser(long userId) {
-        User user = User.dao.findById(userId);
         List<Order> orderList = Order.dao.find("SELECT * FROM t_order WHERE user_id = ? ORDER BY create_time DESC", userId);
 
         if (orderList.isEmpty()) {
             return MyRet.ok("查询成功").setData(new ArrayList<Map<String, Object>>());
         }
         
+        // 给用户订单封装商品信息
+        for (Order order : orderList) {
+            order.put("nftt", nfttService.findNfttById(order.getNfttId() + ""));
+        }
+
+        // 调用重用方法封装日志
+        List<Map<String, Object>> resultList = encapsulateOrdersWithLogs(orderList);
+
+        return MyRet.ok("查询成功").setData(resultList);
+    }
+
+    /**
+     * 管理员查询订单列表(分页,按更新时间倒序,根据订单状态筛选)
+     * 按照用户提供的分页逻辑计算 total_row 和 total_page
+     * @param pageNumber 页码
+     * @param pageSize 页面大小
+     * @param orderStatus 订单状态码 (用于筛选,可选,如果为null或小于0则不筛选)
+     * @return 包含分页订单列表及状态流转信息的 MyRet 对象
+     */
+    public MyRet findForAdmin(int pageNumber, int pageSize, Integer orderStatus) { 
+        // 接收 Integer 类型的 orderStatus
+        // 构建用于查询当前页订单列表的 SQL
+        String columns = "id, order_sn, user_id, nftt_id, order_status, order_type, quantity, unit_price, total_price, payment_method, payment_sn, pay_time, delivery_status, delivery_time, cancel_time, closed_time, refund_status, refund_amount, refund_reason, create_time, update_time, is_deleted, memo";
+        String select = "SELECT " + columns;
+        String fromWhere = "FROM t_order"; // 基础 from 子句
+        String orderBy = "ORDER BY update_time DESC";
+
+        List<Object> paramsForList = new ArrayList<>(); // 用于 SELECT 列表查询的参数
+
+        // ✅ 根据 orderStatus 筛选
+        if (orderStatus != null && orderStatus >= 0) { // 确保 orderStatus 有效,0 通常表示“已取消”,也作为有效状态
+            fromWhere += " WHERE order_status = ?";
+            paramsForList.add(orderStatus);
+        }
+
+        // 计算 LIMIT 的 offset (偏移量)
+        int offset = (pageNumber - 1) * pageSize;
+
+        // 构建查询当前页订单列表的最终 SQL (手动添加 LIMIT)
+        String listSql = select + " " + fromWhere + " " + orderBy + " LIMIT ?, ?";
+        paramsForList.add(offset);
+        paramsForList.add(pageSize);
+
+        // 获取当前页的订单列表
+        List<Order> orderList = Order.dao.find(listSql, paramsForList.toArray());
+
+        // 如果列表为空,直接返回
+        if (orderList.isEmpty()) {
+            Map<String, Object> response = new HashMap<>(); // 准备返回结构
+            response.put("list", new ArrayList<>());
+            response.put("total_row", 0);
+            response.put("total_page", 0);
+            response.put("page_size", pageSize);
+            response.put("page_number", pageNumber);
+            response.put("total_order_count", 0); // 与你的 total_user_count 对应
+            return MyRet.ok("查询成功").setData(response);
+        }
+
+        // 重用封装日志的逻辑
+        List<Map<String, Object>> encapsulatedOrderList = encapsulateOrdersWithLogs(orderList);
+
+        // 获取符合搜索条件的总行数 (total_row)
+        // 调用新的 countOrders 方法,传入 orderStatus 进行筛选计数
+        long totalRowLong = countOrders(orderStatus);
+
+        // 手动计算 total_page
+        int totalPage = (int) Math.ceil((double) totalRowLong / pageSize);
+        if (totalPage == 0 && totalRowLong > 0) { // 解决总行数大于0但总页数为0(pageSize大于totalRow)的问题
+            totalPage = 1;
+        }
+
+        // 封装最终响应
+        Map<String, Object> response = new HashMap<>();
+        response.put("list", encapsulatedOrderList);
+        response.put("total_row", totalRowLong); // 符合条件的订单总数
+        response.put("total_page", totalPage); // 手动计算的总页数
+        response.put("page_size", pageSize);
+        response.put("page_number", pageNumber);
+        response.put("total_order_count", totalRowLong); // 对应 total_user_count,这里是符合订单状态筛选的总数
+
+        return MyRet.ok("查询成功").setData(response);
+    }
+
+    private void doNftTransfer(long userId, List<Order> orderList) {
+        User user = User.dao.findById(userId);
+        
         // 未给用户转账的进行转账
         for (Order order : orderList) {
             // 已经执行过转账的查看是否确权,查看状态
@@ -205,14 +331,14 @@ public class OrderService {
                         || order.getOrderStatus() == OrderController.OrderStatus.REFUNDED.code) {
                     continue;
                 }
-                
+
                 // 其它的再考虑看状态
                 try {
                     JSONObject searchResponse = BsnSDK.search(order.getBsnTransferCode());
 
                     if (searchResponse.getInteger("code") == 0) {
                         JSONObject data = searchResponse.getJSONObject("data");
-                        
+
                         // status为1时才是交付成功,其它要么是pending要么是交付失败
                         if (data.getInteger("status") == 1) {
                             OrderLog log = new OrderLog();
@@ -224,22 +350,23 @@ public class OrderService {
                             log.set("change_reason", "系统确权成功");
                             log.set("create_time", System.currentTimeMillis());
                             log.save();
-                            
+
                             order.setOrderStatus(OrderController.OrderStatus.COMPLETED.code);// 该笔订单已完成
                             order.setBsnTransferStatus(searchResponse.toJSONString());
                             order.setNftMintStatus(4);// nft已确权转移
                             order.setDeliveryStatus(1);// 交付成功
+                            order.setDeliveryTime(System.currentTimeMillis());
                             order.setRefundStatus(0);
                             order.setClosedTime(System.currentTimeMillis());
                             order.setUpdateTime(System.currentTimeMillis());
-                            
+
                             order.update();
                             AppConfig.LOGGER.info("该订单已确权:{}", order);
-                            
+
                             // 异步执行分润过程
                             AppConfig.TaskScheduler.submit(new UserTeamShareTask(order, userService));
                         }
-                        
+
                         // status为2时是交付失败,自动执行退款
                         if (data.getInteger("status") == 2) {
                             // 记录日志
@@ -252,11 +379,11 @@ public class OrderService {
                             log.set("change_reason", "系统确权失败");
                             log.set("create_time", System.currentTimeMillis());
                             log.save();
-                            
+
                             // 更新用户余额
                             user.setBalance(user.getBalance() + order.getTotalPrice());
                             user.update();
-                            
+
                             // 更新订单状态
                             order.setOrderStatus(OrderController.OrderStatus.REFUNDED.code);// 该笔订单已退款
                             order.setBsnTransferStatus(searchResponse.toJSONString());
@@ -275,9 +402,9 @@ public class OrderService {
                 } catch (Exception e) {
                     AppConfig.LOGGER.error("查询转账信息执行失败:{}", e.getMessage());
                 }
-            } 
+            }
             // 未转账的先进行转账
-            else {                
+            else {
                 Nftt nftt = Nftt.dao.findById(order.getNfttId());
                 // 订单是预购订单并且:如果还未转为正式销售的nft先不转帐
                 if (order.getOrderType() == 2 && System.currentTimeMillis() < nftt.getBuyingStartTime()) {
@@ -292,10 +419,10 @@ public class OrderService {
 
                 try {
                     JSONObject transferResponse = BsnSDK.sendNft(address, quantity, tokenId, bsnTransferCode);
-                    
+
                     if (transferResponse.getInteger("code") == 0) {
                         order.setBsnTransferCode(bsnTransferCode);
-                        
+
                         order.update();
                     } else {
                         throw new RuntimeException(transferResponse.toJSONString());
@@ -305,89 +432,8 @@ public class OrderService {
                 }
             }
         }
-        
-        // 给用户订单封装商品信息
-        for (Order order : orderList) {
-            order.put("nftt", nfttService.findNfttById(order.getNfttId() + ""));
-        }
-
-        // 调用重用方法封装日志
-        List<Map<String, Object>> resultList = encapsulateOrdersWithLogs(orderList);
-
-        return MyRet.ok("查询成功").setData(resultList);
     }
-
-    /**
-     * 管理员查询订单列表(分页,按更新时间倒序,根据订单状态筛选)
-     * 按照用户提供的分页逻辑计算 total_row 和 total_page
-     * @param pageNumber 页码
-     * @param pageSize 页面大小
-     * @param orderStatus 订单状态码 (用于筛选,可选,如果为null或小于0则不筛选)
-     * @return 包含分页订单列表及状态流转信息的 MyRet 对象
-     */
-    public MyRet findForAdmin(int pageNumber, int pageSize, Integer orderStatus) { // 接收 Integer 类型的 orderStatus
-        // 构建用于查询当前页订单列表的 SQL
-        String columns = "id, order_sn, user_id, nftt_id, order_status, order_type, quantity, unit_price, total_price, payment_method, payment_sn, pay_time, delivery_status, delivery_time, cancel_time, closed_time, refund_status, refund_amount, refund_reason, create_time, update_time, is_deleted, memo";
-        String select = "SELECT " + columns;
-        String fromWhere = "FROM t_order"; // 基础 from 子句
-        String orderBy = "ORDER BY update_time DESC";
-
-        List<Object> paramsForList = new ArrayList<>(); // 用于 SELECT 列表查询的参数
-
-        // ✅ 根据 orderStatus 筛选
-        if (orderStatus != null && orderStatus >= 0) { // 确保 orderStatus 有效,0 通常表示“已取消”,也作为有效状态
-            fromWhere += " WHERE order_status = ?";
-            paramsForList.add(orderStatus);
-        }
-
-        // 计算 LIMIT 的 offset (偏移量)
-        int offset = (pageNumber - 1) * pageSize;
-
-        // 构建查询当前页订单列表的最终 SQL (手动添加 LIMIT)
-        String listSql = select + " " + fromWhere + " " + orderBy + " LIMIT ?, ?";
-        paramsForList.add(offset);
-        paramsForList.add(pageSize);
-
-        // 获取当前页的订单列表
-        List<Order> orderList = Order.dao.find(listSql, paramsForList.toArray());
-
-        // 如果列表为空,直接返回
-        if (orderList.isEmpty()) {
-            Map<String, Object> response = new HashMap<>(); // 准备返回结构
-            response.put("list", new ArrayList<>());
-            response.put("total_row", 0);
-            response.put("total_page", 0);
-            response.put("page_size", pageSize);
-            response.put("page_number", pageNumber);
-            response.put("total_order_count", 0); // 与你的 total_user_count 对应
-            return MyRet.ok("查询成功").setData(response);
-        }
-
-        // 重用封装日志的逻辑
-        List<Map<String, Object>> encapsulatedOrderList = encapsulateOrdersWithLogs(orderList);
-
-        // 获取符合搜索条件的总行数 (total_row)
-        // 调用新的 countOrders 方法,传入 orderStatus 进行筛选计数
-        long totalRowLong = countOrders(orderStatus);
-
-        // 手动计算 total_page
-        int totalPage = (int) Math.ceil((double) totalRowLong / pageSize);
-        if (totalPage == 0 && totalRowLong > 0) { // 解决总行数大于0但总页数为0(pageSize大于totalRow)的问题
-            totalPage = 1;
-        }
-
-        // 封装最终响应
-        Map<String, Object> response = new HashMap<>();
-        response.put("list", encapsulatedOrderList);
-        response.put("total_row", totalRowLong); // 符合条件的订单总数
-        response.put("total_page", totalPage); // 手动计算的总页数
-        response.put("page_size", pageSize);
-        response.put("page_number", pageNumber);
-        response.put("total_order_count", totalRowLong); // 对应 total_user_count,这里是符合订单状态筛选的总数
-
-        return MyRet.ok("查询成功").setData(response);
-    }
-
+    
     /**
      * 【重用方法】封装订单列表及其状态流转日志
      * @param orderList 原始订单列表

+ 11 - 0
src/main/java/modules/user/UserController.java

@@ -20,6 +20,7 @@ import common.utils.hyg.AESUtils;
 import common.utils.hyg.HygSDK;
 import common.utils.jdcloud.SMS;
 import modules.deposit.DepositLogService;
+import modules.order.OrderService;
 
 import java.util.HashMap;
 import java.util.List;
@@ -41,6 +42,9 @@ public class UserController extends MyController {
     @Inject
     private DepositLogService depositLogService;
 
+    @Inject
+    private OrderService orderService;
+
     public void hello() {
         renderJson(MyRet.ok(service.hello()));
     }
@@ -414,6 +418,13 @@ public class UserController extends MyController {
         }
     }
     
+    @Before(LoginInterceptor.class)
+    public void nftList() {
+        User user = service.findUserByMobileNumber(this.<String>getSessionAttr("mobile_number"));
+        
+        renderJson(orderService.findNftListByUser(user.getId()));
+    }
+    
     @Before(LoginInterceptor.class)
     public void getDepositInfo() {
         // 先判断实名认证过没过

+ 5 - 0
src/test/rest/UserControllerTest.http

@@ -65,6 +65,11 @@ POST {{ baseUrl }}/user/getDepositInfo
 Content-Type: application/json
 dl-token: {{dl_token_var}}
 
+### 获取个人藏品
+POST {{ baseUrl }}/user/nftList
+Content-Type: application/json
+dl-token: {{dl_token_var}}
+
 ### 登出
 POST {{ baseUrl }}/user/logout
 Content-Type: application/json