记得上下班打卡 | git大法好,push需谨慎

Commit b1b8c24f authored by jiangxiulong's avatar jiangxiulong

增加异常处理 锁; 用户订单列表redis处理位置改变

parent 86f3f53c
......@@ -119,12 +119,14 @@ public class GoblinRedisConst {
public static final String REDIS_GOBLIN_TEMP_COUPON = PREFIX.concat("temp:coupon:");//详情 $key:$ucouponId
/* --------------------------------NFT--------------------------------- */
public static final String REDIS_GOBLIN_NFT_ORDER_INFO = PREFIX.concat("nftOrder:");// nft订单详情
public static final String REDIS_GOBLIN_NFT_ORDER_USER_ID_LIST = PREFIX.concat("nftOrder:idList:user:");// nft用户订单id列表
public static final String REDIS_GOBLIN_NFT_ORDER_REFUND_INFO = PREFIX.concat("nftOrder:refund:");// nft退款订单详情
public static final String REDIS_GOBLIN_NFT_ORDER_INFO = PREFIX.concat("nftOrder:");// nft订单详情 orderId
public static final String REDIS_GOBLIN_NFT_ORDER_USER_ID_LIST = PREFIX.concat("nftOrder:idList:user:");// nft用户订单id列表 userId
public static final String REDIS_GOBLIN_NFT_ORDER_REFUND_INFO = PREFIX.concat("nftOrder:refund:");// nft退款订单详情 orderId
public static final String REDIS_GOBLIN_NFT_ORDER_BUG_LOCK = PREFIX.concat("nftOrder:lock:userId:");// nft购买用户锁 userId
public static final String REDIS_GOBLIN_NFT_GOODS_LIST = PREFIX.concat("nftGoodsList");// nft商品列表
/* ----------------------------------------------------------------- */
/**
* SKU剩余库存
......
......@@ -189,11 +189,11 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin
sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_ORDER_CLOSE.getKey(),
SqlMapping.gets(sqls, sqlDataOrder));
}
return true;
} catch (Exception e) {
log.error("checkNftOrderTime异常 [valueData:{}, e:{}]", orderId, e);
return false;
}
return true;
}
private UpdateResult updateGoblinStoreOrderVo(String orderId, GoblinStoreOrderVo data) {
......
......@@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@Slf4j
@Api(tags = "用户NFT订单相关-App")
@Api(tags = "NFT订单相关-App")
@RestController
@RequestMapping("/nftOrder")
public class GoblinNftOrderAppController {
......
......@@ -10,12 +10,15 @@ import com.liquidnet.service.goblin.param.GoblinNftOrderRefundCallbackParam;
import com.liquidnet.service.goblin.service.IGoblinNftOrderService;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
@Api(tags = "NFT-支付相关")
@RestController
@Validated
@RequestMapping("/goblin/nft")
public class GoblinNftOrderController {
......@@ -25,14 +28,14 @@ public class GoblinNftOrderController {
@PostMapping("pre")
// @ApiOperation("下单(加密)")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<GoblinNftPayResultVo> checkOrder(@RequestBody EncryptedReq<GoblinNftOrderPayParam> payParam) {
public ResponseDto<GoblinNftPayResultVo> checkOrder(@RequestBody @Valid EncryptedReq<GoblinNftOrderPayParam> payParam) {
return iGoblinNftOrderService.checkOrder(payParam.getData());
}
@PostMapping("fc7bce6d6c2213b866f76493f92224b8")
@ApiOperation("下单(非加密)")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<GoblinNftPayResultVo> checkOrder(@RequestBody GoblinNftOrderPayParam payParam) {
public ResponseDto<GoblinNftPayResultVo> checkOrder(@RequestBody @Valid GoblinNftOrderPayParam payParam) {
return iGoblinNftOrderService.checkOrder(payParam);
}
......@@ -47,16 +50,16 @@ public class GoblinNftOrderController {
@ApiOperation("查询订单状态")
@ApiResponse(code = 200, message = "接口返回对象参数")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "orderId", value = "订单id", example = "1"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "orderId", value = "订单ID", example = "1"),
})
public ResponseDto<Integer> checkOrderResult(@RequestParam("orderId") @Valid String orderId) {
public ResponseDto<Integer> checkOrderResult(@RequestParam("orderId") @NotBlank(message = "订单ID不能为空") String orderId) {
return iGoblinNftOrderService.checkOrderResult(orderId);
}
@PostMapping("syncOrder")
@ApiOperation("支付回调")
@ApiResponse(code = 200, message = "接口返回对象参数")
public String syncOrder(@ModelAttribute @Valid GoblinNftOrderPayCallbackParam syncOrderParam) {
public String syncOrder(GoblinNftOrderPayCallbackParam syncOrderParam) {
return iGoblinNftOrderService.syncOrder(syncOrderParam);
}
......
......@@ -9,7 +9,10 @@ import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.entity.GoblinNftOrder;
import com.liquidnet.service.goblin.param.*;
import com.liquidnet.service.goblin.param.GoblinNftOrderPayAgainParam;
import com.liquidnet.service.goblin.param.GoblinNftOrderPayCallbackParam;
import com.liquidnet.service.goblin.param.GoblinNftOrderPayParam;
import com.liquidnet.service.goblin.param.GoblinNftOrderRefundCallbackParam;
import com.liquidnet.service.goblin.service.IGoblinNftOrderService;
import com.liquidnet.service.order.utils.*;
import lombok.extern.slf4j.Slf4j;
......@@ -22,7 +25,9 @@ import org.springframework.util.LinkedMultiValueMap;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.LinkedList;
import java.util.Map;
import java.util.Objects;
import static com.liquidnet.commons.lang.util.DateUtil.DTF_YMD_HMS;
......@@ -50,16 +55,31 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
@Override
public ResponseDto<GoblinNftPayResultVo> checkOrder(GoblinNftOrderPayParam payParam) {
String uid = CurrentUtil.getCurrentUid();
// 加锁
boolean isLock = nftOrderUtils.setNftOrderBuyLock(uid);
if (!isLock) {
return ResponseDto.failure("排队处理中,请勿重复操作~");
} else {
try {
// 基础参数
String skuId = payParam.getSkuId();
String uid = CurrentUtil.getCurrentUid();
int number = 1;
GoblinGoodsSkuInfoVo skuVo = goblinRedisUtils.getGoodsSkuInfoVo(skuId);
if (null == skuVo) {
return ResponseDto.failure("该商品不存在~");
}
String spuId = skuVo.getSpuId();
int number = 1;
// TODO: jxl 2022/3/30 认证验证
// 判断是否藏品
if (!Objects.equals(1, skuVo.getSkuType())) {
return ResponseDto.failure("该商品不属于藏品~");
}
// 3审核通过 3已上架 0未删除 才可购买
if (!skuVo.getStatus().equals("3") || !skuVo.getShelvesStatus().equals("3") || skuVo.getDelFlg().equals("1")) {
return ResponseDto.failure("该商品当前不可购买~");
return ResponseDto.failure("该商品当前状态不可购买~");
}
// 判断开售、停售时间
LocalDateTime saleStartTime = skuVo.getSaleStartTime();
......@@ -134,10 +154,26 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
// 下单数据
GoblinNftOrder nftOrder = order(payParam, skuVo.getStoreId(), uid, spuId, number, orderId, orderCode, totalPrice, voucherPrice, storeVoucherPrice);
if (null == nftOrder) {
nftOrderUtils.backSkuCountAndStock(uid, skuId, number);
return ResponseDto.failure("下单失败~");
}
// 下单唤起支付
GoblinNftPayResultVo nftPayResultVo = payOrder(nftOrder, uid, payParam);
if (null == nftPayResultVo) {
nftOrderUtils.backSkuCountAndStock(uid, skuId, number);
return ResponseDto.failure("下单失败啦~");
}
return ResponseDto.success(nftPayResultVo);
} catch (Exception e) {
log.error("NFT下单异常 e:{}", e);
return ResponseDto.failure("下单失败,请稍后重试!");
} finally {
// 执行完毕。释放锁
nftOrderUtils.delNftOrderBuyLock(uid);
}
}
}
private GoblinNftOrder order(
......@@ -145,6 +181,7 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
String orderId, String orderCode,
BigDecimal totalPrice, BigDecimal voucherPrice, BigDecimal storeVoucherPrice
) {
try {
LocalDateTime now = LocalDateTime.now();
Map token = CurrentUtil.getTokenClaims();
......@@ -188,9 +225,14 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
nftOrder.setCreatedAt(now);
return nftOrder;
} catch (Exception e) {
log.error("NFT下单-整合订单数据异常 e:{}", e);
return null;
}
}
private GoblinNftPayResultVo payOrder(GoblinNftOrder nftOrder, String uid, GoblinNftOrderPayParam payParam) {
try {
// 是否免费
boolean isFree = false;
GoblinNftPayResultVo NftPayResultVo = GoblinNftPayResultVo.getNew();
......@@ -201,7 +243,7 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
httpData.add("type", "PRODUCT");
httpData.add("price", nftOrder.getPriceActual().toString());
// 测试0.01
// httpData.add("price","0.01");
// httpData.add("price","0.01");
httpData.add("name", nftOrder.getStoreName());
GoblinGoodsSkuInfoVo skuVo = goblinRedisUtils.getGoodsSkuInfoVo(nftOrder.getSkuId());
httpData.add("detail", skuVo.getName());
......@@ -267,7 +309,7 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
// redis 订单详情
nftOrderUtils.setNftOrder(orderVo);
// redis 订单列表
nftOrderUtils.addNftOrderList(uid, orderVo.getOrderId());
// nftOrderUtils.addNftOrderList(uid, orderVo.getOrderId());
// mongo
goblinMongoUtils.setGoblinNftOrderVo(orderVo);
......@@ -290,6 +332,10 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
}
return NftPayResultVo;
} catch (Exception e) {
log.error("NFT下单-生成订单唤起支付异常 e:{}", e);
return null;
}
}
@Override
......@@ -419,13 +465,13 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
}
if (Objects.equals(1, syncOrderParam.getStatus())) {
String uid = orderVo.getUserId();
if (Objects.equals(orderVo.getStatus(), GoblinStatusConst.NftStatus.ORDER_STATUS_3.getValue())) {// 超时支付
log.error("Nft订单超时支付 param:[orderCode:{}]", orderCode);
// 退款
nftOrderUtils.refundOrderSku(orderId, syncOrderParam.getPaymentId(), syncOrderParam.getPaymentType());
} else {// 正常流程
LocalDateTime now = LocalDateTime.now();
String uid = orderVo.getUserId();
GoblinNftOrder nftOrder = GoblinNftOrder.getNew();
nftOrder.setPaymentType(syncOrderParam.getPaymentType());
......@@ -463,6 +509,8 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
// 加积分
goblinOrderUtils.doTask(uid, orderVo.getPriceActual());
}
// 写入用户订单列表 因取消的订单不展示 所以放在这里
nftOrderUtils.addNftOrderList(uid, orderVo.getOrderId());
}
return "success";
......
......@@ -114,6 +114,18 @@ public class GoblinNftOrderUtils {
redisUtil.set(redisKey, vo);
}
public boolean setNftOrderBuyLock(String userId) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_ORDER_BUG_LOCK
.concat(userId);
return redisUtil.lock(redisKey, 1, 60);
}
public void delNftOrderBuyLock(String userId) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_NFT_ORDER_BUG_LOCK
.concat(userId);
redisUtil.uLock(redisKey);
}
/**
* 使用平台优惠券 只支持代金券
*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment