Przeglądaj źródła

订单剩余内容完成

skyfffire 1 miesiąc temu
rodzic
commit
0638214905

+ 32 - 6
src/main/java/common/model/base/BaseOrder.java

@@ -102,28 +102,28 @@ public abstract class BaseOrder<M extends BaseOrder<M>> extends Model<M> impleme
 	/**
 	 * 购买时的商品单价
 	 */
-	public void setUnitPrice(java.math.BigDecimal unitPrice) {
+	public void setUnitPrice(java.lang.Integer unitPrice) {
 		set("unit_price", unitPrice);
 	}
 	
 	/**
 	 * 购买时的商品单价
 	 */
-	public java.math.BigDecimal getUnitPrice() {
-		return getBigDecimal("unit_price");
+	public java.lang.Integer getUnitPrice() {
+		return getInt("unit_price");
 	}
 	/**
 	 * 订单总价 (quantity * unit_price)
 	 */
-	public void setTotalPrice(java.math.BigDecimal totalPrice) {
+	public void setTotalPrice(java.lang.Integer totalPrice) {
 		set("total_price", totalPrice);
 	}
 	
 	/**
 	 * 订单总价 (quantity * unit_price)
 	 */
-	public java.math.BigDecimal getTotalPrice() {
-		return getBigDecimal("total_price");
+	public java.lang.Integer getTotalPrice() {
+		return getInt("total_price");
 	}
 	/**
 	 * 支付方式:1=支付宝, 2=微信支付, 3=数字货币等
@@ -203,6 +203,32 @@ public abstract class BaseOrder<M extends BaseOrder<M>> extends Model<M> impleme
 	public java.lang.Integer getNftMintStatus() {
 		return getInt("nft_mint_status");
 	}
+	/**
+	 * BSN交易代码
+	 */
+	public void setBsnTransferCode(java.lang.String bsnTransferCode) {
+		set("bsn_transfer_code", bsnTransferCode);
+	}
+	
+	/**
+	 * BSN交易代码
+	 */
+	public java.lang.String getBsnTransferCode() {
+		return getStr("bsn_transfer_code");
+	}
+	/**
+	 * BSN转账状态
+	 */
+	public void setBsnTransferStatus(java.lang.String bsnTransferStatus) {
+		set("bsn_transfer_status", bsnTransferStatus);
+	}
+	
+	/**
+	 * BSN转账状态
+	 */
+	public java.lang.String getBsnTransferStatus() {
+		return getStr("bsn_transfer_status");
+	}
 	/**
 	 * 退款状态:0=无退款, 1=退款中, 2=退款成功, 3=退款失败
 	 */

+ 54 - 54
src/main/java/modules/order/OrderController.java

@@ -78,52 +78,52 @@ public class OrderController extends MyController {
         renderJson(service.create(nfttId.longValue(), user.getId(), orderType));
     }
 
-    /**
-     * 用户点击支付时调用的接口
-     */
-    @Before(LoginInterceptor.class)
-    @EmptyInterface({"order_id"})
-    public void paid() {
-        // --- 从 JSON 请求体中获取参数 ---
-        JSONObject requestBodyJson = MyController.getJsonModelByRequestAndType(getRequest(), JSONObject.class);
-        Integer orderId;
-        // orderId
-        try {
-            orderId = requestBodyJson.getInteger("order_id");
-        } catch (Exception e) {
-            renderJson(MyRet.fail("你传入的 order_id 有些问题:" + e.getMessage()).setData(requestBodyJson));
-
-            return;
-        }
-        if (orderId == null) {
-            renderJson(MyRet.fail("id(order_id) 有问题"));
-            return;
-        }
-        User user = userService.findUserByMobileNumber(this.<String>getSessionAttr("mobile_number"));
-
-        // 判断订单归属权
-        if (service.isOrderBelongToUser(user.getId(), orderId)) {
-            renderJson(MyRet.fail("订单信息错误,再违规请求将封禁ip"));
-            return;
-        }
-
-        // 判断订单状态
-        Order order = Order.dao.findById(orderId);
-        if (order.getOrderStatus() != OrderStatus.PENDING_PAY.code) {
-            renderJson(MyRet.fail("该订单不需要支付,状态:" + order.getOrderStatus()));
-            return;
-        }
-        
-        // 调用支付接口
-        renderJson(MyRet.ok("模拟支付完成"));
-    }
-
-    /**
-     * 慧用工支付回调接口
-     */
-    public void hygPaid() {
-        // 慧用工支付完回调接口,无论成败都要调用该接口
-    }
+//    /**
+//     * 用户点击支付时调用的接口
+//     */
+//    @Before(LoginInterceptor.class)
+//    @EmptyInterface({"order_id"})
+//    public void paid() {
+//        // --- 从 JSON 请求体中获取参数 ---
+//        JSONObject requestBodyJson = MyController.getJsonModelByRequestAndType(getRequest(), JSONObject.class);
+//        Integer orderId;
+//        // orderId
+//        try {
+//            orderId = requestBodyJson.getInteger("order_id");
+//        } catch (Exception e) {
+//            renderJson(MyRet.fail("你传入的 order_id 有些问题:" + e.getMessage()).setData(requestBodyJson));
+//
+//            return;
+//        }
+//        if (orderId == null) {
+//            renderJson(MyRet.fail("id(order_id) 有问题"));
+//            return;
+//        }
+//        User user = userService.findUserByMobileNumber(this.<String>getSessionAttr("mobile_number"));
+//
+//        // 判断订单归属权
+//        if (service.isOrderBelongToUser(user.getId(), orderId)) {
+//            renderJson(MyRet.fail("订单信息错误,再违规请求将封禁ip"));
+//            return;
+//        }
+//
+//        // 判断订单状态
+//        Order order = Order.dao.findById(orderId);
+//        if (order.getOrderStatus() != OrderStatus.PENDING_PAY.code) {
+//            renderJson(MyRet.fail("该订单不需要支付,状态:" + order.getOrderStatus()));
+//            return;
+//        }
+//        
+//        // 调用支付接口
+//        renderJson(MyRet.ok("模拟支付完成"));
+//    }
+//
+//    /**
+//     * 慧用工支付回调接口
+//     */
+//    public void hygPaid() {
+//        // 慧用工支付完回调接口,无论成败都要调用该接口
+//    }
 
     /**
      * 用户点击取消时调用的接口
@@ -160,9 +160,9 @@ public class OrderController extends MyController {
         
         // 判断订单状态
         Order order = Order.dao.findById(orderId);
-        if (order.getOrderStatus() == OrderStatus.COMPLETED.code 
-                || order.getOrderStatus() == OrderStatus.PAID.code // 如果取消的已支付订单就要进入退款流程,等客服审批,这里先不做这个
-                || order.getOrderStatus() == OrderStatus.CANCELED.code) {
+        if (order.getOrderStatus() == OrderStatus.COMPLETED.code
+                || order.getOrderStatus() == OrderStatus.CANCELED.code
+                || order.getOrderStatus() == OrderStatus.REFUNDED.code) {
             renderJson(MyRet.fail("无法取消已完成的订单,请刷新后尝试"));
             return;
         }
@@ -261,15 +261,15 @@ public class OrderController extends MyController {
     // 订单状态枚举 (建议定义在单独的类或枚举中)
     public enum OrderStatus {
         INIT(0, "已取消"),
-        PENDING_PAY(10, "待支付"),
-        PREORDER_PENDING_CONFIRM(20, "预购待确认"), // 预购已支付,等待转换为正式销售
+        // PENDING_PAY(10, "待支付"),
+        // PREORDER_PENDING_CONFIRM(20, "预购待确认"), // 预购已支付,等待转换为正式销售
         PREORDER_SUCCESS(30, "预购成功"), // 预购已成功,等待正式销售
         PAID(40, "已支付"), // 正式购买已支付,等待发货
-        DELIVERED(50, "已发货/已确权"),
+        // DELIVERED(50, "已发货/已确权"),
         COMPLETED(60, "已完成"),
-        REFUNDING(70, "退款中"),
+        // REFUNDING(70, "退款中"),
         REFUNDED(80, "退款成功"),
-        REFUND_FAILED(90, "退款失败"),
+        // REFUND_FAILED(90, "退款失败"),
         CANCELED(100, "已取消");
 
         public final int code;

+ 118 - 5
src/main/java/modules/order/OrderService.java

@@ -1,10 +1,14 @@
 package modules.order;
 
+import com.alibaba.fastjson.JSONObject;
+import com.jfinal.kit.StrKit;
 import com.jfinal.plugin.activerecord.Db;
 import com.jfinal.plugin.activerecord.Record;
+import common.model.Nftt;
 import common.model.Order;
 import common.model.OrderLog;
 import common.model.User;
+import common.utils.bsn.BsnSDK;
 import common.utils.http.MyRet;
 
 import java.math.BigDecimal;
@@ -57,7 +61,7 @@ public class OrderService {
                 order.set("order_sn", orderSn);
                 order.set("user_id", userId);
                 order.set("nftt_id", nfttId);
-                order.set("order_status", OrderController.OrderStatus.PENDING_PAY.code);    // 初始状态:待支付
+                order.set("order_status", OrderController.OrderStatus.PAID.code);    // 初始状态:待支付
                 order.set("order_type", orderType);                                         // 订单类型:1=正式购买, 2=预购
                 order.set("quantity", quantity);
                 // ... 获取单价、计算总价 ...
@@ -65,7 +69,7 @@ public class OrderService {
                 order.set("total_price", quantity.multiply(unit_price));
                 // ... 支付方式 ...
                 order.set("payment_method", 1);
-                // ... 交付方式 ...
+                // ... 交付状态 ...
                 order.set("delivery_status", 0);
                 // ... nft铸造状态 ...
                 order.set("nft_mint_status", 0);
@@ -84,7 +88,7 @@ public class OrderService {
                 OrderLog log = new OrderLog();
                 log.set("order_id", order.getId());
                 log.set("from_status", OrderController.OrderStatus.INIT.code);
-                log.set("to_status", OrderController.OrderStatus.PENDING_PAY.code);
+                log.set("to_status", OrderController.OrderStatus.PAID.code);
                 log.set("operator_id", userId); // 由用户创建
                 log.set("operator_type", 1);
                 log.set("change_reason", "订单创建");
@@ -125,7 +129,7 @@ public class OrderService {
                 // 4. 记录订单创建日志
                 OrderLog log = new OrderLog();
                 log.set("order_id", order.getId());
-                log.set("from_status", OrderController.OrderStatus.PENDING_PAY.code);
+                log.set("from_status", order.getOrderStatus());
                 log.set("to_status", OrderController.OrderStatus.CANCELED.code);
                 log.set("operator_id", userId); // 由用户取消
                 log.set("operator_type", 1);
@@ -135,6 +139,13 @@ public class OrderService {
                     throw new RuntimeException("订单日志创建失败"); // 抛出异常触发回滚
                 }
                 
+                // 5. 火花还给人家
+                User user = User.dao.findById(userId);
+                user.setBalance(user.getBalance() + order.getTotalPrice());
+                if (!user.update()) {
+                    throw new RuntimeException("火花归还失败"); // 抛出异常触发回滚
+                }
+                
                 return true;
             });
 
@@ -150,13 +161,115 @@ 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>>());
         }
         
-        // TODO 这里对未划转NFT的订单进行NFT划转
+        // 未给用户转账的进行转账
+        for (Order order : orderList) {
+            // 已经执行过转账的查看是否确权,查看状态
+            if (StrKit.notBlank(order.getBsnTransferCode())) {
+                // 已经交付完成或交付失败就不用看状态了
+                if (order.getOrderStatus() == OrderController.OrderStatus.COMPLETED.code
+                        || order.getOrderStatus() == OrderController.OrderStatus.CANCELED.code
+                        || 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();
+                            log.set("order_id", order.getId());
+                            log.set("from_status", order.getOrderStatus());
+                            log.set("to_status", OrderController.OrderStatus.COMPLETED.code);
+                            log.set("operator_id", userId);
+                            log.set("operator_type", 3);
+                            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.setRefundStatus(0);
+                            order.setClosedTime(System.currentTimeMillis());
+                            order.setUpdateTime(System.currentTimeMillis());
+                            
+                            order.update();
+                            System.out.println("该订单已确权:" + order);
+                        }
+                        
+                        // status为2时是交付失败,自动执行退款
+                        if (data.getInteger("status") == 2) {
+                            // 记录日志
+                            OrderLog log = new OrderLog();
+                            log.set("order_id", order.getId());
+                            log.set("from_status", order.getOrderStatus());
+                            log.set("to_status", OrderController.OrderStatus.REFUNDED.code);
+                            log.set("operator_id", userId);
+                            log.set("operator_type", 3);
+                            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());
+                            order.setNftMintStatus(2);// nft是铸造成功了的,但是确权失败
+                            order.setDeliveryStatus(2);// 交付失败
+                            order.setRefundStatus(2);// 退款成功
+                            order.setClosedTime(System.currentTimeMillis());
+                            order.setUpdateTime(System.currentTimeMillis());
+                            order.update();
+                            
+                            System.err.println("该订单确权失败:" + order);
+                        }
+                    } else {
+                        throw new RuntimeException(searchResponse.toJSONString());
+                    }
+                } catch (Exception e) {
+                    System.err.println("查询转账信息执行失败:" + e.getMessage());
+                }
+            } 
+            // 未转账的先进行转账
+            else {                
+                Nftt nftt = Nftt.dao.findById(order.getNfttId());
+
+                String address = user.getBsnAccountAddress();
+                int quantity = order.getQuantity();
+                String tokenId = nftt.getBsnTokenId();
+                String bsnTransferCode = "DLTBH_ORDER_" + order.getId();
+
+                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());
+                    }
+                } catch (Exception e) {
+                    System.err.println("转账执行失败:" + e.getMessage());
+                }
+            }
+        }
 
         // 调用重用方法封装日志
         List<Map<String, Object>> resultList = encapsulateOrdersWithLogs(orderList);