|
|
@@ -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 原始订单列表
|