xiongzhu 4 роки тому
батько
коміт
6b3e089274

+ 87 - 28
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -22,6 +22,7 @@ import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.*;
 import com.izouma.nineth.dto.MarketSettlement;
 import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.dto.PayQuery;
 import com.izouma.nineth.dto.UserBankCard;
 import com.izouma.nineth.enums.*;
 import com.izouma.nineth.event.CreateAssetEvent;
@@ -45,6 +46,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.client.producer.SendResult;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
 import org.springframework.cache.annotation.Cacheable;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.context.event.EventListener;
 import org.springframework.core.env.Environment;
 import org.springframework.data.domain.Page;
@@ -71,38 +73,81 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 @Service
-@AllArgsConstructor
 @Slf4j
 public class OrderService {
 
-    private OrderRepo orderRepo;
-    private CollectionRepo collectionRepo;
-    private UserAddressRepo userAddressRepo;
-    private UserRepo userRepo;
-    private Environment env;
-    private AlipayClient alipayClient;
-    private AlipayProperties alipayProperties;
-    private WxPayService wxPayService;
-    private WxPayProperties wxPayProperties;
-    private AssetService assetService;
-    private SysConfigService sysConfigService;
-    private AssetRepo assetRepo;
-    private UserCouponRepo userCouponRepo;
-    private CollectionService collectionService;
-    private CommissionRecordRepo commissionRecordRepo;
-    private AdapayProperties adapayProperties;
-    private GeneralProperties generalProperties;
-    private RocketMQTemplate rocketMQTemplate;
+    private OrderRepo                     orderRepo;
+    private CollectionRepo                collectionRepo;
+    private UserAddressRepo               userAddressRepo;
+    private UserRepo                      userRepo;
+    private Environment                   env;
+    private AlipayClient                  alipayClient;
+    private AlipayProperties              alipayProperties;
+    private WxPayService                  wxPayService;
+    private WxPayProperties               wxPayProperties;
+    private AssetService                  assetService;
+    private SysConfigService              sysConfigService;
+    private AssetRepo                     assetRepo;
+    private UserCouponRepo                userCouponRepo;
+    private CollectionService             collectionService;
+    private CommissionRecordRepo          commissionRecordRepo;
+    private AdapayProperties              adapayProperties;
+    private GeneralProperties             generalProperties;
+    private RocketMQTemplate              rocketMQTemplate;
     private RedisTemplate<String, Object> redisTemplate;
-    private SnowflakeIdWorker snowflakeIdWorker;
-    private SmsService smsService;
-    private ErrorOrderRepo errorOrderRepo;
-    private ShowCollectionRepo showCollectionRepo;
-    private ShowroomService showroomService;
-    private CollectionPrivilegeRepo collectionPrivilegeRepo;
-    private UserBankCardRepo userBankCardRepo;
-    private CacheService cacheService;
-    private UserPropertyRepo userPropertyRepo;
+    private SnowflakeIdWorker             snowflakeIdWorker;
+    private SmsService                    smsService;
+    private ErrorOrderRepo                errorOrderRepo;
+    private ShowCollectionRepo            showCollectionRepo;
+    private ShowroomService               showroomService;
+    private CollectionPrivilegeRepo       collectionPrivilegeRepo;
+    private UserBankCardRepo              userBankCardRepo;
+    private CacheService                  cacheService;
+    private UserPropertyRepo              userPropertyRepo;
+    private OrderPayService               orderPayService;
+
+    public OrderService(OrderRepo orderRepo, CollectionRepo collectionRepo, UserAddressRepo userAddressRepo,
+                        UserRepo userRepo, Environment env, AlipayClient alipayClient,
+                        AlipayProperties alipayProperties, WxPayService wxPayService, WxPayProperties wxPayProperties,
+                        AssetService assetService, SysConfigService sysConfigService, AssetRepo assetRepo,
+                        UserCouponRepo userCouponRepo, CollectionService collectionService,
+                        CommissionRecordRepo commissionRecordRepo, AdapayProperties adapayProperties,
+                        GeneralProperties generalProperties, RocketMQTemplate rocketMQTemplate,
+                        RedisTemplate<String, Object> redisTemplate, SnowflakeIdWorker snowflakeIdWorker,
+                        SmsService smsService, ErrorOrderRepo errorOrderRepo, ShowCollectionRepo showCollectionRepo,
+                        ShowroomService showroomService, CollectionPrivilegeRepo collectionPrivilegeRepo,
+                        UserBankCardRepo userBankCardRepo, CacheService cacheService, UserPropertyRepo userPropertyRepo,
+                        @Lazy OrderPayService orderPayService) {
+        this.orderRepo = orderRepo;
+        this.collectionRepo = collectionRepo;
+        this.userAddressRepo = userAddressRepo;
+        this.userRepo = userRepo;
+        this.env = env;
+        this.alipayClient = alipayClient;
+        this.alipayProperties = alipayProperties;
+        this.wxPayService = wxPayService;
+        this.wxPayProperties = wxPayProperties;
+        this.assetService = assetService;
+        this.sysConfigService = sysConfigService;
+        this.assetRepo = assetRepo;
+        this.userCouponRepo = userCouponRepo;
+        this.collectionService = collectionService;
+        this.commissionRecordRepo = commissionRecordRepo;
+        this.adapayProperties = adapayProperties;
+        this.generalProperties = generalProperties;
+        this.rocketMQTemplate = rocketMQTemplate;
+        this.redisTemplate = redisTemplate;
+        this.snowflakeIdWorker = snowflakeIdWorker;
+        this.smsService = smsService;
+        this.errorOrderRepo = errorOrderRepo;
+        this.showCollectionRepo = showCollectionRepo;
+        this.showroomService = showroomService;
+        this.collectionPrivilegeRepo = collectionPrivilegeRepo;
+        this.userBankCardRepo = userBankCardRepo;
+        this.cacheService = cacheService;
+        this.userPropertyRepo = userPropertyRepo;
+        this.orderPayService = orderPayService;
+    }
 
     public Page<Order> all(PageQuery pageQuery) {
         return orderRepo.findAll(JpaUtils.toSpecification(pageQuery, Order.class), JpaUtils.toPageRequest(pageQuery));
@@ -757,6 +802,20 @@ public class OrderService {
         }
 
         try {
+            PayQuery payQuery;
+            try {
+                payQuery = orderPayService.query(order.getId().toString());
+            } catch (Exception e) {
+                payQuery = new PayQuery();
+                payQuery.setExist(false);
+            }
+            if (payQuery.isExist()) {
+                if (PayStatus.SUCCESS == payQuery.getStatus() || PayStatus.PENDING == payQuery.getStatus()) {
+                    log.info("订单 {} 已经支付无法取消, transactionId={}, channel={}", order.getId(), payQuery.getTransactionId(), payQuery.getChannel());
+                    throw new BusinessException("已支付订单无法取消");
+                }
+            }
+
             if (order.getStatus() != OrderStatus.NOT_PAID) {
                 throw new BusinessException("已支付订单无法取消");
             }

+ 3 - 1
src/main/java/com/izouma/nineth/service/PayEaseService.java

@@ -245,7 +245,9 @@ public class PayEaseService {
             query.setMsg(error);
         } else {
             query.setExist(true);
-            query.setPayTime(LocalDateTime.parse(res.getString("completeDateTime"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            if (res.containsKey("completeDateTime")) {
+                query.setPayTime(LocalDateTime.parse(res.getString("completeDateTime"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            }
             query.setAmount(new BigDecimal(res.getString("orderAmount")).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
             query.setTransactionId(res.getString("serialNumber"));
             switch (status) {

+ 3 - 0
src/main/java/com/izouma/nineth/service/UserBankCardService.java

@@ -9,6 +9,7 @@ import com.izouma.nineth.dto.UserBankCard;
 import com.izouma.nineth.enums.AuthStatus;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.IdentityAuthRepo;
+import com.izouma.nineth.repo.UserBalanceRepo;
 import com.izouma.nineth.repo.UserBankCardRepo;
 import com.izouma.nineth.repo.UserRepo;
 import com.izouma.nineth.utils.BankUtils;
@@ -30,6 +31,7 @@ public class UserBankCardService {
     private final UserBankCardRepo userBankCardRepo;
     private final IdentityAuthRepo identityAuthRepo;
     private final PayEaseService   payEaseService;
+    private final UserBalanceRepo  userBalanceRepo;
 
     public Map<String, String> bindCard(Long userId, String phone, String bankNo) {
         IdentityAuth identityAuth = identityAuthRepo.findFirstByUserIdAndStatusAndDelFalseOrderByCreatedAtDesc(userId, AuthStatus.SUCCESS)
@@ -68,6 +70,7 @@ public class UserBankCardService {
             user.setSettleAccountId(request.getBindCardId());
             userService.save(user);
         }
+        userBalanceRepo.unlock(Long.parseLong(request.getUserId()));
     }
 
     public void bindCardCaptcha(String bindCardId) {

+ 16 - 3
src/main/vue/src/views/PayMgmt.vue

@@ -65,7 +65,13 @@
                 <el-select v-model="testPay.channel" class="test-pay-form-item">
                     <el-option v-for="(item, key) in payChannel" :label="item" :value="key" :key="key"></el-option>
                 </el-select>
-                <el-input v-model="testPay.orderId" placeholder="订单ID" class="test-pay-form-item"></el-input>
+                <el-input v-model="testPay.orderId" placeholder="订单ID" class="test-pay-form-item">
+                    <el-button
+                        icon="el-icon-refresh"
+                        slot="append"
+                        @click="testPay.orderId = 'TEST' + new Date().getTime()"
+                    ></el-button>
+                </el-input>
                 <el-input
                     v-model="testPay.bindCardId"
                     class="test-pay-form-item"
@@ -92,7 +98,7 @@
 export default {
     data() {
         return {
-            orderId: '978601560772706304',
+            orderId: '',
             info: null,
             loading: false,
             payStatus: {
@@ -169,7 +175,14 @@ export default {
                 .post('/payChannelMgmt/pay', this.testPay)
                 .then(res => {
                     this.testPayLoading = false;
-                    this.payRes = JSON.stringify(payRes, null, 4);
+                    if (this.testPay.channel === 'sandQuick') {
+                        this.orderId = this.testPay.orderId;
+
+                        var newWindow = window.open('about:blank', '_blank', 'scrollbars=yes,width=1050,height=600');
+                        newWindow.document.write(res);
+                    } else {
+                        this.payRes = JSON.stringify(payRes, null, 4);
+                    }
                 })
                 .catch(e => {
                     this.testPayLoading = false;