Browse Source

fix(app):
1.bug修复

wzq 3 days ago
parent
commit
2c236782c9

+ 100 - 10
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/OrderServiceImpl.java

@@ -47,6 +47,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -373,6 +374,78 @@ public class OrderServiceImpl implements IOrderService {
         return previewOrderPlaceSchoolTimes;
     }
 
+    /**
+     * 提交订单
+     * @param productId 商品id
+     * @param count 购买数量
+     * @return
+     */
+//    @Override
+//    @Transactional(rollbackFor = Exception.class)
+//    public Result<String> submitOrder(String productId, long count) {
+//        String productKey = PRODUCT + productId; // PRODUCT_N001
+//        String stockKey = PRODUCT_STOCK + productId; // PRODUCT_STOCK_N001
+//        String stockLockKey = PRODUCT_STOCK_LOCK +productId; // PRODUCT_STOCK_LOCK_N001
+//
+//        // 获取库存锁,不会自动续期,最多等待3秒,超过则放弃获取锁,20秒后锁自动释放
+////        boolean res = RedisLockUtils.tryLock(stockLockKey, TimeUnit.SECONDS, 3, 20);
+//        // 获取库存锁,自动续期
+//        boolean res = RedisLockUtils.tryLock(stockLockKey);
+//        if (!res) {
+//            // 超过等待时间,放弃获取锁
+//            log.info("线程{} 获取锁失败", stockLockKey);
+//            return ResponseData.error("系统正忙,请稍后再试");
+//        }
+//        log.info("线程{} 获取锁成功", stockLockKey);
+//        try {
+//            // 查询库存
+//            Integer stock = (Integer) redisTemplate.opsForValue().get(stockKey);
+//            // 缓存没有商品库存,查询数据库
+//            if (stock == null) {
+//                Product product = productMapper.getById(productId);
+//                if (Objects.isNull(product)) {
+//                    return ResponseData.error("订单提交失败,商品已下架");
+//                }
+//                redisTemplate.opsForValue().set(productKey, JSON.toJSONString(product));
+//                // 数据库的库存信息要根据实际业务来获取,如果商品有规格信息,库存应该根据规格来获取
+//                stock = product.getStack();
+//                redisTemplate.opsForValue().set(stockKey, stock);
+//
+//                return ResponseData.error("订单提交失败,库存不足");
+//            }
+//
+//            // 检查库存是否足够
+//            if (stock < count) {
+//                return ResponseData.error("订单提交失败,库存不足");
+//            }
+//
+//            // 更新数据库中的库存数据
+//            int row = productMapper.updateStock(productId, stock - count);
+//            if (row > 0) {
+//                // 更新Redis中缓存的商品库存数据
+//                redisTemplate.opsForValue().decrement(stockKey, count);
+//            }
+//            // 库存扣减完,创建订单
+//            Order order = Order.builder()
+//                    .id(IdUtil.simpleUUID()).count(count).productId(productId).status(1)
+//                    .build();
+//            String orderId = orderService.createOrder(order);
+//
+//            return ResponseData.success(orderId, "订单创建成功");
+//
+//        } catch (OptimisticLockingFailureException e) {
+//            // 如果出现乐观锁异常,则释放 Redis 锁并返回错误信息
+//            log.error("更新库存失败,商品 {} 可能已被更新", productId);
+//        } catch (Exception e) {
+//            log.error("系统开小差了~");
+//        } finally {
+//            RedisLockUtils.unlock(stockLockKey);
+//            log.info("线程{} 释放锁", stockLockKey);
+//        }
+//        return ResponseData.error("系统正忙,请稍后再试");
+//    }
+
+
     /**
      * 创建订单
      *
@@ -418,6 +491,21 @@ public class OrderServiceImpl implements IOrderService {
                     AppSitePriceRules priceRule = appSitePriceRulesMapper.selectById(createOrderForm.getProductIds());
                     AppSitePlace appSitePlace = appSitePlaceMapper.selectById(priceRule.getSitePlaceId());
                     AppSite appSite = appSiteMapper.selectById(appSitePlace.getSiteId());
+
+//                    String productId = priceRule.getId();
+//
+//                    String productKey = "PRODUCT" +""+ productId; // PRODUCT_N001
+//                    String stockKey = "PRODUCT_STOCK" + productId; // PRODUCT_STOCK_N001
+//                    String stockLockKey = "PRODUCT_STOCK_LOCK" +productId; // PRODUCT_STOCK_LOCK_N001
+//
+//                    boolean res = RedisLockUtils.tryLock(stockLockKey);
+//                    if (!res) {
+//                        // 超过等待时间,放弃获取锁
+//                        log.info("线程{} 获取锁失败", stockLockKey);
+//                        throw new JeecgBootException("系统正忙,请稍后再试");
+//                    }
+//                    log.info("线程{} 获取锁成功", stockLockKey);
+
                     appOrder
                             .setPayType(3)
                             .setOrderStatus(1)
@@ -873,7 +961,7 @@ public class OrderServiceImpl implements IOrderService {
 
         //构建微信支付参数
         JSONObject params = new JSONObject();
-        params.put("appid", WechatConstants.WECHAT_MP_APPID); //小程序appid
+        params.put("sub_appid", WechatConstants.WECHAT_MP_APPID); //小程序appid
         params.put("mchid", WechatConstants.WECHAT_MCH_ID); //商户号
         params.put("description", "胶片订单业务"); //商品描述
         params.put("out_trade_no", appOrder.getOrderCode()); //商户订单号
@@ -881,6 +969,9 @@ public class OrderServiceImpl implements IOrderService {
         params.put("attach", appOrder.getOrderCode()); //附加数据 选填
         // 在查询API和支付通知中原样返回 可作为自定义参数使用
         params.put("notify_url", WechatUrlConstants.PAY_V3_NOTIFY); //支付结果异步通知接口
+        params.put("trade_type", "JSAPI"); //支付类型
+        //分账必传参数
+        params.put("profit_sharing", "Y");
 
         //订单金额信息
         JSONObject amount_json = new JSONObject();
@@ -898,16 +989,10 @@ public class OrderServiceImpl implements IOrderService {
         //拉起支付
 //        Map<String, String> result = weChatPayService.wechatPay(params);
 
-        String out_trade_no = appOrder.getOrderCode();
-        Integer total_amount = appOrder.getPrice().multiply(new BigDecimal(100)).intValue();
-        String request_ip = "127.0.0.1";
-        String subject = "订单标题";
-        String notify_url = "https://www.baidu.com";
+
         String sub_appid = "wx62ba790ae7983d34";
         String user_id = "oWL7G6MsNrimSKUgr2ezEXgEp4Po";
-        String goods_id = appOrder.getProductIds();
-        String goods_name = "商品名称";
-        Integer quantity = appOrder.getAmount();
+
 
         //预支付订单,返回构建小程序支付拉起参数
 
@@ -1360,7 +1445,7 @@ public class OrderServiceImpl implements IOrderService {
             //查询订单
             return "查询中!";
         }
-        return s;
+        return "支付失败";
     }
 
     @Override
@@ -1431,6 +1516,11 @@ public class OrderServiceImpl implements IOrderService {
         return "退款失败!";
     }
 
+    @Override
+    public Map<String, String> wechatPayNotify(HttpServletRequest request) {
+        return weChatPayService.wechatPayNotify(request);
+    }
+
     /**
      * @return String 订单号
      * @Author SheepHy