|
|
@@ -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);
|