xiongzhu 3 rokov pred
rodič
commit
82157c47f5

+ 4 - 0
src/main/java/com/izouma/nineth/TokenHistory.java

@@ -42,4 +42,8 @@ public class TokenHistory extends BaseEntity {
     private Long toUserId;
 
     private String toAvatar;
+
+    private String sFromUser;
+
+    private String sToUser;
 }

+ 3 - 0
src/main/java/com/izouma/nineth/domain/Order.java

@@ -213,4 +213,7 @@ public class Order extends BaseEntityNoID {
     private String     hcTxHash;
     private BigInteger hcBlockNumber;
     private BigInteger hcGasUsed;
+
+    @Column(columnDefinition = "bit(1) default 0")
+    private boolean safeTransfer;
 }

+ 1 - 0
src/main/java/com/izouma/nineth/event/CreateOrderEvent.java

@@ -26,4 +26,5 @@ public class CreateOrderEvent implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long    invitor;
     private boolean vip;
+    private boolean safeTransfer;
 }

+ 13 - 10
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -1,7 +1,6 @@
 package com.izouma.nineth.service;
 
 import cn.hutool.core.convert.Convert;
-import com.fasterxml.jackson.annotation.JsonView;
 import com.izouma.nineth.TokenHistory;
 import com.izouma.nineth.config.GeneralProperties;
 import com.izouma.nineth.domain.Collection;
@@ -10,7 +9,6 @@ import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.PageWrapper;
 import com.izouma.nineth.dto.UserHistory;
 import com.izouma.nineth.enums.*;
-import com.izouma.nineth.event.TransferAssetEvent;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.*;
 import com.izouma.nineth.utils.JpaUtils;
@@ -18,9 +16,8 @@ import com.izouma.nineth.utils.SecurityUtils;
 import com.izouma.nineth.utils.TokenUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
 import org.springframework.beans.BeanUtils;
 import org.springframework.cache.annotation.Cacheable;
@@ -29,15 +26,11 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.domain.Specification;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
 
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
@@ -339,6 +332,10 @@ public class AssetService {
     }
 
     public void transfer(Asset asset, BigDecimal price, User toUser, TransferReason reason, Long orderId) {
+        transfer(asset, price, toUser, reason, orderId, false);
+    }
+
+    public void transfer(Asset asset, BigDecimal price, User toUser, TransferReason reason, Long orderId, boolean safeTransfer) {
         Objects.requireNonNull(asset, "原藏品不能为空");
         Objects.requireNonNull(toUser, "转让人不能为空");
         Objects.requireNonNull(reason, "转让原因不能为空");
@@ -363,7 +360,7 @@ public class AssetService {
         newAsset.setTags(new HashSet<>(asset.getTags()));
         assetRepo.save(newAsset);
 
-        tokenHistoryRepo.save(TokenHistory.builder()
+        TokenHistory tokenHistory = TokenHistory.builder()
                 .tokenId(asset.getTokenId())
                 .fromUser(asset.getOwner())
                 .fromUserId(asset.getOwnerId())
@@ -373,7 +370,13 @@ public class AssetService {
                 .toAvatar(toUser.getAvatar())
                 .operation(reason.getDescription())
                 .price(TransferReason.GIFT == reason ? null : price)
-                .build());
+                .sFromUser(tokenHistoryRepo.findByTokenIdOrderByCreatedAtDesc(asset.getTokenId())
+                        .stream().findFirst().map(TokenHistory::getSToUser).orElse(null))
+                .build();
+        if (safeTransfer) {
+            tokenHistory.setSToUser("9th_" + RandomStringUtils.randomAlphabetic(8));
+        }
+        tokenHistoryRepo.save(tokenHistory);
 
         asset.setPublicShow(false);
         asset.setConsignment(false);

+ 3 - 2
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -155,7 +155,7 @@ public class OrderService {
     }
 
     public String mqCreate(Long userId, Long collectionId, int qty, Long addressId, Long userCouponId, Long invitor,
-                           String sign, boolean vip, int vipPurchase, int vipPoint) {
+                           String sign, boolean vip, int vipPurchase, int vipPoint, boolean safeTransfer) {
         String qs = null;
         try {
             qs = AESEncryptUtil.decrypt(sign);
@@ -189,7 +189,8 @@ public class OrderService {
 
         Long id = snowflakeIdWorker.nextId();
         SendResult result = rocketMQTemplate.syncSend(generalProperties.getCreateOrderTopic(),
-                new CreateOrderEvent(id, userId, collectionId, qty, addressId, userCouponId, invitor, vip), 100000);
+                new CreateOrderEvent(id, userId, collectionId, qty, addressId, userCouponId,
+                        invitor, vip, safeTransfer), 100000);
 
         log.info("发送订单到队列: {}, userId={}, result={}", id, userId, result);
         return String.valueOf(id);

+ 3 - 2
src/main/java/com/izouma/nineth/web/OrderController.java

@@ -114,11 +114,12 @@ public class OrderController extends BaseController {
                                             @RequestParam(required = false) Long couponId,
                                             @RequestParam(required = false) Long invitor,
                                             @RequestParam String sign,
-                                            @RequestParam(defaultValue = "false") boolean vip) {
+                                            @RequestParam(defaultValue = "false") boolean vip,
+                                            @RequestParam(defaultValue = "false") boolean safeTransfer) {
         final User user = SecurityUtils.getAuthenticatedUser();
         return new HashMap<>() {{
             put("id", orderService.mqCreate(user.getId(), collectionId, qty, addressId, couponId, invitor, sign,
-                    vip, user.getVipPurchase(), user.getVipPoint()));
+                    vip, user.getVipPurchase(), user.getVipPoint(), safeTransfer));
         }};
     }
 

+ 10 - 4
src/test/java/com/izouma/nineth/PayEaseTest.java

@@ -7,10 +7,7 @@ import com.izouma.nineth.utils.SnowflakeIdWorker;
 import com.upay.sdk.CipherWrapper;
 import com.upay.sdk.ConfigurationUtils;
 import com.upay.sdk.HttpClientUtils;
-import com.upay.sdk.cashier.bindcard.builder.BindCardBuilder;
-import com.upay.sdk.cashier.bindcard.builder.BindCardConfirmBuilder;
-import com.upay.sdk.cashier.bindcard.builder.BindCardKaptchaBuilder;
-import com.upay.sdk.cashier.bindcard.builder.UnBindCardBuilder;
+import com.upay.sdk.cashier.bindcard.builder.*;
 import com.upay.sdk.cashier.order.builder.ReceiptPaymentBuilder;
 import com.upay.sdk.entity.Payer;
 import com.upay.sdk.entity.ProductDetail;
@@ -105,6 +102,15 @@ public class PayEaseTest {
         JSONObject response = request(ConfigurationUtils.getCashierUnBindCardUrl(), builder.bothEncryptBuild());
     }
 
+    @Test
+    public void queryBind() {
+        String bindCardId = "20220520100053712312330427711488";
+        BindCardQueryBuilder builder = new BindCardQueryBuilder(merchantId);
+        builder.setBindCardId(bindCardId)
+                .setMerchantUserId("12234");
+        JSONObject response = request(ConfigurationUtils.getCashierBindCardQueryUrl(), builder.bothEncryptBuild());
+    }
+
     @Test
     public void pay() {
         String subject = "充值";