|
@@ -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
|