skyline 1 год назад
Родитель
Сommit
d5ce75280b

+ 5 - 2
car-wash-entity/src/main/java/com/kym/entity/miniapp/Account.java

@@ -7,7 +7,6 @@ import lombok.Setter;
 import lombok.experimental.Accessors;
 
 import java.io.Serializable;
-import java.time.LocalDateTime;
 
 /**
  * <p>
@@ -23,8 +22,12 @@ import java.time.LocalDateTime;
 @Accessors(chain = true)
 public class Account extends BaseEntity implements Serializable {
 
+    public static final int MIN_BALANCE = 200;
+    /**
+     * 石斑鱼主板请求启动配置优惠折扣率:100代表无折扣
+     */
+    public static final int NO_DISCOUNT = 100;
     private static final long serialVersionUID = 1L;
-
     /**
      * 用户id
      */

+ 2 - 0
car-wash-entity/src/main/java/com/kym/entity/miniapp/User.java

@@ -23,6 +23,8 @@ import lombok.Setter;
 @TableName(schema = "car_wash",value = "t_user")
 public class User extends BaseEntity implements Serializable {
 
+    public static final String ST_SESSION_KEY_MOBILE = "mobilePhone";
+
     private static final long serialVersionUID = 1L;
 
     /**

+ 3 - 0
car-wash-entity/src/main/java/com/kym/entity/miniapp/WashOrder.java

@@ -32,6 +32,9 @@ public class WashOrder extends BaseEntity {
     public static final int PAY_STATUS_未支付 = 0;
     public static final int PAY_STATUS_已支付 = 1;
 
+    public static final String START_CLOSE_TYPE_网络 = "network";
+    public static final String START_CLOSE_TYPE_按键 = "button";
+
     private static final long serialVersionUID = 1L;
 
     private Long userId;

+ 32 - 30
car-wash-service/src/main/java/com/kym/service/awoara/entity/event/handle/OrderCloseEventHandler.java

@@ -1,5 +1,6 @@
 package com.kym.service.awoara.entity.event.handle;
 
+import com.alibaba.fastjson2.JSONArray;
 import com.kym.entity.miniapp.Account;
 import com.kym.entity.miniapp.WalletDetail;
 import com.kym.entity.miniapp.WashOrder;
@@ -43,38 +44,39 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
         log.info("订单:{},结算信息:{}", orderInfo.getOrder_id(), orderInfo);
 
         // 订单状态、支付状态
-        var washOrder = washOrderService.lambdaQuery()
-                .eq(WashOrder::getOrderId, orderInfo.getOrder_id())
-//                .eq(WashOrder::getOrderIdLocal, orderInfo.getOrder_id_local())
-                .one();
-        washOrder.setAmount(orderInfo.getAmount())
-                .setAmountReceivable(orderInfo.getAmount_receivable())
-                .setAmountReceived(orderInfo.getAmount_received())
-                .setAmountReceived(orderInfo.getAmount_received())
-                .setDiscountMoney(orderInfo.getDiscount_money())
-                .setDetail(orderInfo.getDetail().toString())
-                .setEndTime(LocalDateTime.now())
-                .setOrderStatus(WashOrder.ORDER_STATUS_成功)
-                .setPayStatus(WashOrder.PAY_STATUS_已支付)
-                .setStopReason(orderInfo.getClose_type());
-        washOrderService.updateById(washOrder);
+        var washOrder = washOrderService.lambdaQuery().eq(WashOrder::getOrderId, orderInfo.getOrder_id()).one();
+        if (washOrder != null) {
+            washOrder
+                    .setCloseType(orderInfo.getClose_type())
+                    .setAmount(orderInfo.getAmount())
+                    .setAmountReceivable(orderInfo.getAmount_receivable())
+                    .setDiscountMoney(orderInfo.getDiscount_money())
+                    .setDetail(JSONArray.toJSONString(orderInfo.getDetail()))
+                    .setEndTime(LocalDateTime.now())
+                    .setOrderStatus(WashOrder.ORDER_STATUS_成功)
+                    .setPayStatus(WashOrder.PAY_STATUS_已支付);
+            washOrderService.updateById(washOrder);
 
-        // 扣款更新余额,新增资金流水 TODO 【存在优惠情况下校验优惠,更新优惠使用情况等】
-        var account = accountService.getAccountByUserId(washOrder.getUserId());
-        accountService.lambdaUpdate().setSql("balance=balance-{0}", orderInfo.getAmount())
-                .eq(Account::getUserId, washOrder.getUserId()).update();
+            // 扣款更新余额,新增资金流水 TODO 【存在优惠情况下校验优惠,更新优惠使用情况等】
+            var account = accountService.getAccountByUserId(washOrder.getUserId());
+            accountService.lambdaUpdate().setSql("balance = balance - {0}", orderInfo.getAmount())
+                    .eq(Account::getUserId, washOrder.getUserId()).update();
+
+            var walletDetail = new WalletDetail();
+            walletDetail.setUserId(washOrder.getUserId());
+            walletDetail.setType(WalletDetail.TYPE_消费);
+            walletDetail.setOrderNo(washOrder.getOrderId());
+            walletDetail.setAmount(orderInfo.getAmount());
+            walletDetail.setBeforeBalance(account.getBalance());
+            walletDetail.setAfterBalance(account.getBalance() - orderInfo.getAmount());
+            walletDetail.setTransactionId(washOrder.getId().toString());
+            walletDetail.setTransactionTime(LocalDateTime.now());
+            walletDetail.setStatus(WalletDetail.STATUS_已确认);
+            walletDetailService.save(walletDetail);
+        }else {
+            log.error("订单不存在,订单号:{}", orderInfo.getOrder_id());
+        }
 
-        var walletDetail = new WalletDetail();
-        walletDetail.setUserId(washOrder.getUserId());
-        walletDetail.setType(WalletDetail.TYPE_消费);
-        walletDetail.setOrderNo(washOrder.getOrderId());
-        walletDetail.setAmount(orderInfo.getAmount());
-        walletDetail.setBeforeBalance(account.getBalance());
-        walletDetail.setAfterBalance(account.getBalance() - orderInfo.getAmount());
-        walletDetail.setTransactionId(washOrder.getId().toString());
-        walletDetail.setTransactionTime(LocalDateTime.now());
-        walletDetail.setStatus(WalletDetail.STATUS_已确认);
-        walletDetailService.save(walletDetail);
 
     }
 }

+ 26 - 8
car-wash-service/src/main/java/com/kym/service/miniapp/impl/WashOrderServiceImpl.java

@@ -1,7 +1,10 @@
 package com.kym.service.miniapp.impl;
 
 import cn.dev33.satoken.stp.StpUtil;
+import com.kym.common.exception.BusinessException;
 import com.kym.common.utils.OrderUtils;
+import com.kym.entity.miniapp.Account;
+import com.kym.entity.miniapp.User;
 import com.kym.entity.miniapp.WashOrder;
 import com.kym.entity.miniapp.queryParams.DeviceQueryParams;
 import com.kym.entity.miniapp.queryParams.WashOrderQueryParams;
@@ -41,28 +44,43 @@ public class WashOrderServiceImpl extends MyBaseServiceImpl<WashOrderMapper, Was
      */
     @Override
     public String createOrder(DeviceQueryParams params) {
+        // 校验余额
         var account = accountService.getAccountByUserId(StpUtil.getLoginIdAsLong());
-        // todo 校验优化
-        if (account.getBalance() < 200) {
-            throw new RuntimeException("余额不足,请充值");
+        if (account.getBalance() < Account.MIN_BALANCE) {
+            throw new BusinessException("余额不足,请保持余额不低于2元!");
         }
-        var memberName = StpUtil.getSession().getString("mobilePhone");
+
+        // 校验用户是否有未完结的订单
+        var unfinishedOrder = lambdaQuery()
+                .eq(WashOrder::getUserId, StpUtil.getLoginIdAsLong())
+                .eq(WashOrder::getOrderStatus, WashOrder.ORDER_STATUS_开机)
+                .or()
+                .eq(WashOrder::getPayStatus, WashOrder.PAY_STATUS_未支付)
+                .list();
+        if (!unfinishedOrder.isEmpty()) {
+            throw new BusinessException("您有未完结的订单!");
+        }
+
+        var memberName = StpUtil.getSession().getString(User.ST_SESSION_KEY_MOBILE);
         var orderId = OrderUtils.getOrderNo();
+
+        // 请求阿里云lot
         var createOrder = awoaraService.createOrder(params.getProductKey(), params.getDeviceName(),
                 orderId,
                 memberName,
                 account.getBalance(),
-                100, // 优惠折扣 todo 后期会员折扣可用
-                account.getBalance() - 50); // 本次开机最大消费金额,减去0.5元,防止超消费
+                Account.NO_DISCOUNT,
+                // 本次开机最大消费金额,减去0.5元,防止延时导致超消费
+                account.getBalance() - 50);
         var washOrder = new WashOrder()
                 .setUserId(StpUtil.getLoginIdAsLong())
                 .setStationId(params.getStationId())
                 .setProductKey(params.getProductKey())
                 .setDeviceName(params.getDeviceName())
-                .setOpenType("network")
+                .setOpenType(WashOrder.START_CLOSE_TYPE_网络)
                 .setOrderId(orderId)
                 .setOrderIdLocal(createOrder.getOrder_id_local())
-                .setMemberDiscount(100)
+                .setMemberDiscount(Account.NO_DISCOUNT)
                 .setPrepayMoney(account.getBalance() - 50)
                 .setStartTime(LocalDateTime.now())
                 .setOrderStatus(WashOrder.ORDER_STATUS_开机)

+ 3 - 3
car-wash-service/src/main/java/com/kym/service/mq/MnsHandler.java

@@ -56,7 +56,7 @@ public class MnsHandler {
     CloudQueue queue = client.getQueueRef(queueName);
 
     /**
-     * 长轮批量获取消息
+     * 长轮批量获取消息
      *
      * @param queue
      */
@@ -64,7 +64,7 @@ public class MnsHandler {
     private static void longPollingBatchReceive(CloudQueue queue) {
         executorService.execute(() -> {
             while (true) {
-                log.info("=============开始 长轮批量获取消息=============");
+                log.info("=============开始 长轮批量获取消息=============");
 
                 // 一次性拉取最多xx条消息
                 int batchSize = 15;
@@ -77,7 +77,7 @@ public class MnsHandler {
                         printMsgAndDelete(queue, message);
                     }
                 }
-                log.info("=============结束 长轮批量获取消息=============");
+                log.info("=============结束 长轮批量获取消息=============");
             }
         });
     }