|
|
@@ -2,19 +2,13 @@ package modules.order;
|
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.jfinal.aop.Inject;
|
|
|
-import com.jfinal.kit.StrKit;
|
|
|
import com.jfinal.plugin.activerecord.Db;
|
|
|
import com.jfinal.plugin.activerecord.Record;
|
|
|
-import common.jfinal.AppConfig;
|
|
|
-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 modules.nftt.NfttService;
|
|
|
-import modules.user.UserService;
|
|
|
-import modules.user.UserTeamShareTask;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
|
@@ -23,8 +17,6 @@ import java.util.Map;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
public class OrderService {
|
|
|
- @Inject
|
|
|
- UserService userService;
|
|
|
@Inject
|
|
|
NfttService nfttService;
|
|
|
|
|
|
@@ -120,7 +112,16 @@ public class OrderService {
|
|
|
try {
|
|
|
Db.tx(() -> {
|
|
|
// 1. 获取order和nfttId
|
|
|
- Order order = Order.dao.findById(orderId);
|
|
|
+ String sql = "SELECT * FROM t_order WHERE id=? FOR UPDATE";
|
|
|
+ Order order = Order.dao.findFirst(sql, orderId);
|
|
|
+
|
|
|
+ // 订单状态判断
|
|
|
+ if (order.getOrderStatus() == OrderController.OrderStatus.COMPLETED.code
|
|
|
+ || order.getOrderStatus() == OrderController.OrderStatus.CANCELED.code
|
|
|
+ || order.getOrderStatus() == OrderController.OrderStatus.REFUNDED.code) {
|
|
|
+ throw new RuntimeException("无法取消已完成的订单,请刷新后尝试");
|
|
|
+ }
|
|
|
+
|
|
|
long nfttId = order.getNfttId();
|
|
|
|
|
|
// 2. 更新库存(在锁定的行上进行)
|
|
|
@@ -168,8 +169,8 @@ 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);
|
|
|
+// // 给用户转账NFT
|
|
|
+// doNftTransfer(userId, orderList);
|
|
|
|
|
|
// 给用户订单封装商品信息
|
|
|
for (Order order : orderList) {
|
|
|
@@ -189,9 +190,9 @@ public class OrderService {
|
|
|
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);
|
|
|
+//
|
|
|
+// // 给用户转账NFT
|
|
|
+// doNftTransfer(userId, allOrderList);
|
|
|
|
|
|
// 创建一个新的列表来存储过滤后的订单
|
|
|
List<Order> filteredOrders = new ArrayList<>();
|
|
|
@@ -236,8 +237,8 @@ public class OrderService {
|
|
|
return MyRet.ok("查询成功").setData(new ArrayList<Map<String, Object>>());
|
|
|
}
|
|
|
|
|
|
- // 给用户转账NFT
|
|
|
- doNftTransfer(userId, allOrderList);
|
|
|
+// // 给用户转账NFT
|
|
|
+// doNftTransfer(userId, allOrderList);
|
|
|
|
|
|
// 只需要指定状态的status
|
|
|
List<Order> filteredOrderList = new ArrayList<>();
|
|
|
@@ -338,128 +339,6 @@ public class OrderService {
|
|
|
|
|
|
return MyRet.ok("查询成功").setData(response);
|
|
|
}
|
|
|
-
|
|
|
- private void doNftTransfer(long userId, List<Order> orderList) {
|
|
|
- User user = User.dao.findById(userId);
|
|
|
-
|
|
|
- // 未给用户转账的进行转账
|
|
|
- for (Order order : orderList) {
|
|
|
- // 已经交付完成或交付失败就不用看状态了
|
|
|
- if (order.getOrderStatus() == OrderController.OrderStatus.COMPLETED.code
|
|
|
- || order.getOrderStatus() == OrderController.OrderStatus.CANCELED.code
|
|
|
- || order.getOrderStatus() == OrderController.OrderStatus.REFUNDED.code) {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- // 已经执行过转账的查看是否确权,查看状态
|
|
|
- if (StrKit.notBlank(order.getBsnTransferCode())) {
|
|
|
- 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.setDeliveryTime(System.currentTimeMillis());
|
|
|
- order.setRefundStatus(0);
|
|
|
- order.setClosedTime(System.currentTimeMillis());
|
|
|
- order.setUpdateTime(System.currentTimeMillis());
|
|
|
-
|
|
|
- order.update();
|
|
|
- AppConfig.LOGGER.info("该订单已确权:{}", order);
|
|
|
-
|
|
|
- // 该用户如果没有标记为有效账户进行标记
|
|
|
- if (user.getIsEffective() == 0) {
|
|
|
- user.setIsEffective(1);
|
|
|
- user.setEffectiveTime(System.currentTimeMillis());
|
|
|
- user.update();
|
|
|
- }
|
|
|
-
|
|
|
- // 异步执行分润过程
|
|
|
- AppConfig.TaskScheduler.submit(new UserTeamShareTask(order, userService));
|
|
|
- }
|
|
|
-
|
|
|
- // 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();
|
|
|
-
|
|
|
- AppConfig.LOGGER.error("该订单确权失败:{}", order);
|
|
|
- }
|
|
|
- } else {
|
|
|
- throw new RuntimeException(searchResponse.toJSONString());
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- AppConfig.LOGGER.error("查询转账信息执行失败:{}", e.getMessage());
|
|
|
- }
|
|
|
- }
|
|
|
- // 未转账的先进行转账
|
|
|
- else {
|
|
|
- Nftt nftt = Nftt.dao.findById(order.getNfttId());
|
|
|
- // 订单是预购订单并且:如果还未转为正式销售的nft先不转帐
|
|
|
- if (order.getOrderType() == 2 && System.currentTimeMillis() < nftt.getBuyingStartTime()) {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- // 转账参数整理
|
|
|
- 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) {
|
|
|
- AppConfig.LOGGER.error("转账执行失败:{}", e.getMessage());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
/**
|
|
|
* 【重用方法】封装订单列表及其状态流转日志
|