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

Commit b1b8c24f authored by jiangxiulong's avatar jiangxiulong

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

parent 86f3f53c
...@@ -119,12 +119,14 @@ public class GoblinRedisConst { ...@@ -119,12 +119,14 @@ public class GoblinRedisConst {
public static final String REDIS_GOBLIN_TEMP_COUPON = PREFIX.concat("temp:coupon:");//详情 $key:$ucouponId public static final String REDIS_GOBLIN_TEMP_COUPON = PREFIX.concat("temp:coupon:");//详情 $key:$ucouponId
/* --------------------------------NFT--------------------------------- */ /* --------------------------------NFT--------------------------------- */
public static final String REDIS_GOBLIN_NFT_ORDER_INFO = PREFIX.concat("nftOrder:");// 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列表 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退款订单详情 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商品列表 public static final String REDIS_GOBLIN_NFT_GOODS_LIST = PREFIX.concat("nftGoodsList");// nft商品列表
/* ----------------------------------------------------------------- */ /* ----------------------------------------------------------------- */
/** /**
* SKU剩余库存 * SKU剩余库存
......
...@@ -189,11 +189,11 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin ...@@ -189,11 +189,11 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin
sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_ORDER_CLOSE.getKey(), sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_ORDER_CLOSE.getKey(),
SqlMapping.gets(sqls, sqlDataOrder)); SqlMapping.gets(sqls, sqlDataOrder));
} }
return true;
} catch (Exception e) { } catch (Exception e) {
log.error("checkNftOrderTime异常 [valueData:{}, e:{}]", orderId, e); log.error("checkNftOrderTime异常 [valueData:{}, e:{}]", orderId, e);
return false; return false;
} }
return true;
} }
private UpdateResult updateGoblinStoreOrderVo(String orderId, GoblinStoreOrderVo data) { private UpdateResult updateGoblinStoreOrderVo(String orderId, GoblinStoreOrderVo data) {
......
...@@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid; import javax.validation.Valid;
@Slf4j @Slf4j
@Api(tags = "用户NFT订单相关-App") @Api(tags = "NFT订单相关-App")
@RestController @RestController
@RequestMapping("/nftOrder") @RequestMapping("/nftOrder")
public class GoblinNftOrderAppController { public class GoblinNftOrderAppController {
......
...@@ -10,12 +10,15 @@ import com.liquidnet.service.goblin.param.GoblinNftOrderRefundCallbackParam; ...@@ -10,12 +10,15 @@ import com.liquidnet.service.goblin.param.GoblinNftOrderRefundCallbackParam;
import com.liquidnet.service.goblin.service.IGoblinNftOrderService; import com.liquidnet.service.goblin.service.IGoblinNftOrderService;
import io.swagger.annotations.*; import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid; import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
@Api(tags = "NFT-支付相关") @Api(tags = "NFT-支付相关")
@RestController @RestController
@Validated
@RequestMapping("/goblin/nft") @RequestMapping("/goblin/nft")
public class GoblinNftOrderController { public class GoblinNftOrderController {
...@@ -25,14 +28,14 @@ public class GoblinNftOrderController { ...@@ -25,14 +28,14 @@ public class GoblinNftOrderController {
@PostMapping("pre") @PostMapping("pre")
// @ApiOperation("下单(加密)") // @ApiOperation("下单(加密)")
@ApiResponse(code = 200, message = "接口返回对象参数") @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()); return iGoblinNftOrderService.checkOrder(payParam.getData());
} }
@PostMapping("fc7bce6d6c2213b866f76493f92224b8") @PostMapping("fc7bce6d6c2213b866f76493f92224b8")
@ApiOperation("下单(非加密)") @ApiOperation("下单(非加密)")
@ApiResponse(code = 200, message = "接口返回对象参数") @ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<GoblinNftPayResultVo> checkOrder(@RequestBody GoblinNftOrderPayParam payParam) { public ResponseDto<GoblinNftPayResultVo> checkOrder(@RequestBody @Valid GoblinNftOrderPayParam payParam) {
return iGoblinNftOrderService.checkOrder(payParam); return iGoblinNftOrderService.checkOrder(payParam);
} }
...@@ -47,16 +50,16 @@ public class GoblinNftOrderController { ...@@ -47,16 +50,16 @@ public class GoblinNftOrderController {
@ApiOperation("查询订单状态") @ApiOperation("查询订单状态")
@ApiResponse(code = 200, message = "接口返回对象参数") @ApiResponse(code = 200, message = "接口返回对象参数")
@ApiImplicitParams({ @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); return iGoblinNftOrderService.checkOrderResult(orderId);
} }
@PostMapping("syncOrder") @PostMapping("syncOrder")
@ApiOperation("支付回调") @ApiOperation("支付回调")
@ApiResponse(code = 200, message = "接口返回对象参数") @ApiResponse(code = 200, message = "接口返回对象参数")
public String syncOrder(@ModelAttribute @Valid GoblinNftOrderPayCallbackParam syncOrderParam) { public String syncOrder(GoblinNftOrderPayCallbackParam syncOrderParam) {
return iGoblinNftOrderService.syncOrder(syncOrderParam); return iGoblinNftOrderService.syncOrder(syncOrderParam);
} }
......
...@@ -9,7 +9,10 @@ import com.liquidnet.service.base.constant.MQConst; ...@@ -9,7 +9,10 @@ import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.goblin.constant.GoblinStatusConst; import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.vo.*; import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.entity.GoblinNftOrder; 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.goblin.service.IGoblinNftOrderService;
import com.liquidnet.service.order.utils.*; import com.liquidnet.service.order.utils.*;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -22,7 +25,9 @@ import org.springframework.util.LinkedMultiValueMap; ...@@ -22,7 +25,9 @@ import org.springframework.util.LinkedMultiValueMap;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; 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; import static com.liquidnet.commons.lang.util.DateUtil.DTF_YMD_HMS;
...@@ -50,94 +55,125 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService { ...@@ -50,94 +55,125 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
@Override @Override
public ResponseDto<GoblinNftPayResultVo> checkOrder(GoblinNftOrderPayParam payParam) { public ResponseDto<GoblinNftPayResultVo> checkOrder(GoblinNftOrderPayParam payParam) {
// 基础参数
String skuId = payParam.getSkuId();
String uid = CurrentUtil.getCurrentUid(); String uid = CurrentUtil.getCurrentUid();
GoblinGoodsSkuInfoVo skuVo = goblinRedisUtils.getGoodsSkuInfoVo(skuId); // 加锁
String spuId = skuVo.getSpuId(); boolean isLock = nftOrderUtils.setNftOrderBuyLock(uid);
int number = 1; if (!isLock) {
return ResponseDto.failure("排队处理中,请勿重复操作~");
// 3审核通过 3已上架 0未删除 才可购买 } else {
if (!skuVo.getStatus().equals("3") || !skuVo.getShelvesStatus().equals("3") || skuVo.getDelFlg().equals("1")) { try {
return ResponseDto.failure("该商品当前不可购买~"); // 基础参数
} String skuId = payParam.getSkuId();
// 判断开售、停售时间 int number = 1;
LocalDateTime saleStartTime = skuVo.getSaleStartTime(); GoblinGoodsSkuInfoVo skuVo = goblinRedisUtils.getGoodsSkuInfoVo(skuId);
LocalDateTime saleStopTime = skuVo.getSaleStopTime(); if (null == skuVo) {
LocalDateTime nowTime = LocalDateTime.now(); return ResponseDto.failure("该商品不存在~");
if (nowTime.isBefore(saleStartTime)) { }
return ResponseDto.failure("该商品还未开始售卖~"); String spuId = skuVo.getSpuId();
} else if (null != saleStopTime && nowTime.isAfter(saleStopTime)) {
return ResponseDto.failure("该商品已停售~"); // TODO: jxl 2022/3/30 认证验证
}
// 权限限购 // 判断是否藏品
/*String mobile = StringUtils.defaultString(((String) CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_MOBILE)), ""); if (!Objects.equals(1, skuVo.getSkuType())) {
boolean isVip = nftOrderUtils.isVipMember(uid); return ResponseDto.failure("该商品不属于藏品~");
Boolean isAuthBuy = goblinOrderUtils.judgeOrderRose(isVip, skuId, mobile, Integer.parseInt(skuVo.getBuyFactor())); }
if (!isAuthBuy) { // 3审核通过 3已上架 0未删除 才可购买
return ResponseDto.failure("该商品仅限特定用户购买~"); if (!skuVo.getStatus().equals("3") || !skuVo.getShelvesStatus().equals("3") || skuVo.getDelFlg().equals("1")) {
}*/ return ResponseDto.failure("该商品当前状态不可购买~");
// 判断优惠券不能一起使用 }
/*String platVoucherCode = payParam.getPlatVoucherCode(); // 判断开售、停售时间
String storeVoucherCode = payParam.getStoreVoucherCode(); LocalDateTime saleStartTime = skuVo.getSaleStartTime();
if (!StringUtils.isEmpty(platVoucherCode) && !StringUtils.isEmpty(storeVoucherCode)) { LocalDateTime saleStopTime = skuVo.getSaleStopTime();
return ResponseDto.failure("平台券与店铺券不可一起使用哦~"); LocalDateTime nowTime = LocalDateTime.now();
}*/ if (nowTime.isBefore(saleStartTime)) {
return ResponseDto.failure("该商品还未开始售卖~");
// 判断数量限购 } else if (null != saleStopTime && nowTime.isAfter(saleStopTime)) {
int limitCount = skuVo.getBuyLimit(); return ResponseDto.failure("该商品已停售~");
if (!Objects.equals(0, limitCount)) { }
String isOutLimit = goblinOrderUtils.judgeOrderLimit(uid, skuId, number, limitCount); // 权限限购
if (!StringUtils.isEmpty(isOutLimit)) { /*String mobile = StringUtils.defaultString(((String) CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_MOBILE)), "");
goblinRedisUtils.decrSkuCountByUid(uid, skuId, number); boolean isVip = nftOrderUtils.isVipMember(uid);
return ResponseDto.failure("您已超出限购数量~"); Boolean isAuthBuy = goblinOrderUtils.judgeOrderRose(isVip, skuId, mobile, Integer.parseInt(skuVo.getBuyFactor()));
} if (!isAuthBuy) {
} return ResponseDto.failure("该商品仅限特定用户购买~");
// 判断库存 }*/
int surplusGeneral = nftOrderUtils.decrSkuStock(skuId, number); // 判断优惠券不能一起使用
if (surplusGeneral < 0) { /*String platVoucherCode = payParam.getPlatVoucherCode();
nftOrderUtils.backSkuCountAndStock(uid, skuId, number); String storeVoucherCode = payParam.getStoreVoucherCode();
return ResponseDto.failure("库存不足啦~"); if (!StringUtils.isEmpty(platVoucherCode) && !StringUtils.isEmpty(storeVoucherCode)) {
} return ResponseDto.failure("平台券与店铺券不可一起使用哦~");
}*/
/**
* 判断优惠券 // 判断数量限购
* 因平台券和店铺券不能同时使用所以不需要相互考虑失败退另一种券的问题,各自处理就好 int limitCount = skuVo.getBuyLimit();
* 回滚好库存和用户已购买数量 if (!Objects.equals(0, limitCount)) {
* 无论平台券还是店铺券都只支持代金券1的类型 String isOutLimit = goblinOrderUtils.judgeOrderLimit(uid, skuId, number, limitCount);
*/ if (!StringUtils.isEmpty(isOutLimit)) {
BigDecimal voucherPrice = BigDecimal.ZERO; goblinRedisUtils.decrSkuCountByUid(uid, skuId, number);
BigDecimal storeVoucherPrice = BigDecimal.ZERO; return ResponseDto.failure("您已超出限购数量~");
String orderId = IDGenerator.nextSnowId(); }
String orderCode = IDGenerator.storeCode(orderId); }
BigDecimal totalPrice = skuVo.getPrice(); // 判断库存
/*if (!StringUtils.isEmpty(platVoucherCode)) {// 平台券 int surplusGeneral = nftOrderUtils.decrSkuStock(skuId, number);
GoblinUseResultVo useResultVo = nftOrderUtils.useCoupon(platVoucherCode, "购买NFT商品[" + orderCode + "]", totalPrice, spuId, uid); if (surplusGeneral < 0) {
String typeVoucher = useResultVo.getCouType(); nftOrderUtils.backSkuCountAndStock(uid, skuId, number);
if (typeVoucher.equals("-1")) { return ResponseDto.failure("库存不足啦~");
nftOrderUtils.backSkuCountAndStock(uid, skuId, number); }
return ResponseDto.failure("当前平台券不允许使用~");
} else { /**
voucherPrice = useResultVo.getValue(); * 判断优惠券
* 因平台券和店铺券不能同时使用所以不需要相互考虑失败退另一种券的问题,各自处理就好
* 回滚好库存和用户已购买数量
* 无论平台券还是店铺券都只支持代金券1的类型
*/
BigDecimal voucherPrice = BigDecimal.ZERO;
BigDecimal storeVoucherPrice = BigDecimal.ZERO;
String orderId = IDGenerator.nextSnowId();
String orderCode = IDGenerator.storeCode(orderId);
BigDecimal totalPrice = skuVo.getPrice();
/*if (!StringUtils.isEmpty(platVoucherCode)) {// 平台券
GoblinUseResultVo useResultVo = nftOrderUtils.useCoupon(platVoucherCode, "购买NFT商品[" + orderCode + "]", totalPrice, spuId, uid);
String typeVoucher = useResultVo.getCouType();
if (typeVoucher.equals("-1")) {
nftOrderUtils.backSkuCountAndStock(uid, skuId, number);
return ResponseDto.failure("当前平台券不允许使用~");
} else {
voucherPrice = useResultVo.getValue();
}
}
if (!StringUtils.isEmpty(storeVoucherCode)) {// 店铺券
GoblinUseResultVo storeCouponVo = nftOrderUtils.useStoreCoupon(storeVoucherCode, "购买NFT商品[" + orderCode + "]", totalPrice, spuId, uid);
String typeVoucher = storeCouponVo.getCouType();
if (typeVoucher.equals("-1")) {
nftOrderUtils.backSkuCountAndStock(uid, skuId, number);
return ResponseDto.failure("当前店铺券不允许使用~");
} else {
storeVoucherPrice = storeCouponVo.getValue();
}
}*/
// 下单数据
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);
} }
} }
if (!StringUtils.isEmpty(storeVoucherCode)) {// 店铺券
GoblinUseResultVo storeCouponVo = nftOrderUtils.useStoreCoupon(storeVoucherCode, "购买NFT商品[" + orderCode + "]", totalPrice, spuId, uid);
String typeVoucher = storeCouponVo.getCouType();
if (typeVoucher.equals("-1")) {
nftOrderUtils.backSkuCountAndStock(uid, skuId, number);
return ResponseDto.failure("当前店铺券不允许使用~");
} else {
storeVoucherPrice = storeCouponVo.getValue();
}
}*/
// 下单数据
GoblinNftOrder nftOrder = order(payParam, skuVo.getStoreId(), uid, spuId, number, orderId, orderCode, totalPrice, voucherPrice, storeVoucherPrice);
// 下单唤起支付
GoblinNftPayResultVo nftPayResultVo = payOrder(nftOrder, uid, payParam);
return ResponseDto.success(nftPayResultVo);
} }
private GoblinNftOrder order( private GoblinNftOrder order(
...@@ -145,151 +181,161 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService { ...@@ -145,151 +181,161 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
String orderId, String orderCode, String orderId, String orderCode,
BigDecimal totalPrice, BigDecimal voucherPrice, BigDecimal storeVoucherPrice BigDecimal totalPrice, BigDecimal voucherPrice, BigDecimal storeVoucherPrice
) { ) {
LocalDateTime now = LocalDateTime.now(); try {
LocalDateTime now = LocalDateTime.now();
Map token = CurrentUtil.getTokenClaims();
String headerCliSource = CurrentUtil.getHeaderCliSource(), headerCliVersion = CurrentUtil.getHeaderCliVersion(); Map token = CurrentUtil.getTokenClaims();
String source = headerCliSource == null ? "" : headerCliSource; String headerCliSource = CurrentUtil.getHeaderCliSource(), headerCliVersion = CurrentUtil.getHeaderCliVersion();
String version = headerCliVersion == null ? "" : headerCliVersion; String source = headerCliSource == null ? "" : headerCliSource;
String version = headerCliVersion == null ? "" : headerCliVersion;
GoblinStoreInfoVo storeInfoVo = goblinRedisUtils.getStoreInfoVo(storeId);
String storeName = storeInfoVo.getStoreName(); GoblinStoreInfoVo storeInfoVo = goblinRedisUtils.getStoreInfoVo(storeId);
String storeName = storeInfoVo.getStoreName();
// 生成订单
GoblinNftOrder nftOrder = GoblinNftOrder.getNew(); // 生成订单
nftOrder.setOrderId(orderId); GoblinNftOrder nftOrder = GoblinNftOrder.getNew();
nftOrder.setOrderCode(orderCode); nftOrder.setOrderId(orderId);
nftOrder.setStoreId(storeId); nftOrder.setOrderCode(orderCode);
nftOrder.setSkuId(payParam.getSkuId()); nftOrder.setStoreId(storeId);
nftOrder.setSpuId(spuId); nftOrder.setSkuId(payParam.getSkuId());
nftOrder.setNum(number); nftOrder.setSpuId(spuId);
nftOrder.setStoreName(storeName); nftOrder.setNum(number);
nftOrder.setUserId(uid); nftOrder.setStoreName(storeName);
nftOrder.setUserName(StringUtils.defaultString(((String) token.get(CurrentUtil.TOKEN_NICKNAME)), "")); nftOrder.setUserId(uid);
nftOrder.setUserMobile(StringUtils.defaultString(((String) token.get(CurrentUtil.TOKEN_MOBILE)), "")); nftOrder.setUserName(StringUtils.defaultString(((String) token.get(CurrentUtil.TOKEN_NICKNAME)), ""));
nftOrder.setPriceTotal(totalPrice); nftOrder.setUserMobile(StringUtils.defaultString(((String) token.get(CurrentUtil.TOKEN_MOBILE)), ""));
BigDecimal priceActual = totalPrice.subtract(voucherPrice).subtract(storeVoucherPrice); nftOrder.setPriceTotal(totalPrice);
nftOrder.setPriceActual(priceActual.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : priceActual); BigDecimal priceActual = totalPrice.subtract(voucherPrice).subtract(storeVoucherPrice);
nftOrder.setPriceCoupon(voucherPrice); nftOrder.setPriceActual(priceActual.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : priceActual);
nftOrder.setStorePriceCoupon(storeVoucherPrice); nftOrder.setPriceCoupon(voucherPrice);
nftOrder.setPriceVoucher(voucherPrice.add(storeVoucherPrice)); nftOrder.setStorePriceCoupon(storeVoucherPrice);
nftOrder.setStatus(GoblinStatusConst.NftStatus.ORDER_STATUS_1.getValue()); nftOrder.setPriceVoucher(voucherPrice.add(storeVoucherPrice));
/*nftOrder.setUcouponId(payParam.getPlatVoucherCode()); nftOrder.setStatus(GoblinStatusConst.NftStatus.ORDER_STATUS_1.getValue());
nftOrder.setStoreCouponId(payParam.getStoreVoucherCode());*/ /*nftOrder.setUcouponId(payParam.getPlatVoucherCode());
nftOrder.setUcouponId(""); nftOrder.setStoreCouponId(payParam.getStoreVoucherCode());*/
nftOrder.setStoreCouponId(""); nftOrder.setUcouponId("");
nftOrder.setPayType(payParam.getPayType()); nftOrder.setStoreCouponId("");
nftOrder.setDeviceFrom(payParam.getDeviceFrom()); nftOrder.setPayType(payParam.getPayType());
nftOrder.setSource(source); nftOrder.setDeviceFrom(payParam.getDeviceFrom());
nftOrder.setVersion(version); nftOrder.setSource(source);
nftOrder.setOrderType(GoblinStatusConst.NftStatus.ORDER_TYPE_1.getValue()); nftOrder.setVersion(version);
nftOrder.setPayCountdownMinute(5); nftOrder.setOrderType(GoblinStatusConst.NftStatus.ORDER_TYPE_1.getValue());
nftOrder.setIpAddress(CurrentUtil.getCliIpAddr()); nftOrder.setPayCountdownMinute(5);
nftOrder.setCreatedAt(now); nftOrder.setIpAddress(CurrentUtil.getCliIpAddr());
nftOrder.setCreatedAt(now);
return nftOrder;
return nftOrder;
} catch (Exception e) {
log.error("NFT下单-整合订单数据异常 e:{}", e);
return null;
}
} }
private GoblinNftPayResultVo payOrder(GoblinNftOrder nftOrder, String uid, GoblinNftOrderPayParam payParam) { private GoblinNftPayResultVo payOrder(GoblinNftOrder nftOrder, String uid, GoblinNftOrderPayParam payParam) {
// 是否免费 try {
boolean isFree = false; // 是否免费
GoblinNftPayResultVo NftPayResultVo = GoblinNftPayResultVo.getNew(); boolean isFree = false;
NftPayResultVo.setOrderId(nftOrder.getOrderId()); GoblinNftPayResultVo NftPayResultVo = GoblinNftPayResultVo.getNew();
String payCode; NftPayResultVo.setOrderId(nftOrder.getOrderId());
if (nftOrder.getPriceActual().compareTo(BigDecimal.valueOf(0)) > 0) {// 调用支付 String payCode;
LinkedMultiValueMap<String, String> httpData = CollectionUtil.linkedMultiValueMapStringString(); if (nftOrder.getPriceActual().compareTo(BigDecimal.valueOf(0)) > 0) {// 调用支付
httpData.add("type", "PRODUCT"); LinkedMultiValueMap<String, String> httpData = CollectionUtil.linkedMultiValueMapStringString();
httpData.add("price", nftOrder.getPriceActual().toString()); httpData.add("type", "PRODUCT");
// 测试0.01 httpData.add("price", nftOrder.getPriceActual().toString());
// httpData.add("price","0.01"); // 测试0.01
httpData.add("name", nftOrder.getStoreName()); // httpData.add("price","0.01");
GoblinGoodsSkuInfoVo skuVo = goblinRedisUtils.getGoodsSkuInfoVo(nftOrder.getSkuId()); httpData.add("name", nftOrder.getStoreName());
httpData.add("detail", skuVo.getName()); GoblinGoodsSkuInfoVo skuVo = goblinRedisUtils.getGoodsSkuInfoVo(nftOrder.getSkuId());
httpData.add("orderCode", nftOrder.getOrderCode()); httpData.add("detail", skuVo.getName());
httpData.add("orderId", nftOrder.getOrderId()); httpData.add("orderCode", nftOrder.getOrderCode());
httpData.add("clientIp", CurrentUtil.getCliIpAddr()); httpData.add("orderId", nftOrder.getOrderId());
httpData.add("notifyUrl", synUrl); httpData.add("clientIp", CurrentUtil.getCliIpAddr());
httpData.add("createDate", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); httpData.add("notifyUrl", synUrl);
httpData.add("expireTime", "5"); httpData.add("createDate", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
httpData.add("payType", nftOrder.getPayType()); httpData.add("expireTime", "5");
httpData.add("deviceFrom", nftOrder.getDeviceFrom()); httpData.add("payType", nftOrder.getPayType());
if (nftOrder.getDeviceFrom().equals("js") || nftOrder.getDeviceFrom().equals("applet")) { httpData.add("deviceFrom", nftOrder.getDeviceFrom());
httpData.add("openId", payParam.getOpenId()); if (nftOrder.getDeviceFrom().equals("js") || nftOrder.getDeviceFrom().equals("applet")) {
httpData.add("openId", payParam.getOpenId());
}
String showUrl = payParam.getShowUrl().concat(nftOrder.getOrderCode());
String returnUrl = payParam.getReturnUrl().concat(nftOrder.getOrderCode());
httpData.add("showUrl", showUrl);
httpData.add("returnUrl", returnUrl);
LinkedMultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Accept", "application/json;charset=UTF-8");
String returnData = HttpUtil.post(payUrl, httpData, header);
log.info("调用 DRAGON 结果 = " + returnData);
ResponseDto<GoblinPayInnerResultVo> dto = JsonUtils.fromJson(returnData, new TypeReference<ResponseDto<GoblinPayInnerResultVo>>() {
});
GoblinPayInnerResultVo dtoData = dto.getData();
payCode = dtoData.getCode();
NftPayResultVo.setCode(payCode);
NftPayResultVo.setOrderCode(dtoData.getOrderCode());
NftPayResultVo.setPayData(dtoData.getPayData());
NftPayResultVo.setPayType(nftOrder.getPayType());
NftPayResultVo.setPrice(nftOrder.getPriceActual());
NftPayResultVo.setShowUrl(showUrl);
NftPayResultVo.setReturnUrl(returnUrl);
} else {
isFree = true;
nftOrder.setPayType("FREE");
payCode = "FREE_PAY_CODE";
NftPayResultVo.setPrice(BigDecimal.valueOf(0));
NftPayResultVo.setPayType(nftOrder.getPayType());
} }
String showUrl = payParam.getShowUrl().concat(nftOrder.getOrderCode());
String returnUrl = payParam.getReturnUrl().concat(nftOrder.getOrderCode());
httpData.add("showUrl", showUrl);
httpData.add("returnUrl", returnUrl);
LinkedMultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Accept", "application/json;charset=UTF-8");
String returnData = HttpUtil.post(payUrl, httpData, header);
log.info("调用 DRAGON 结果 = " + returnData);
ResponseDto<GoblinPayInnerResultVo> dto = JsonUtils.fromJson(returnData, new TypeReference<ResponseDto<GoblinPayInnerResultVo>>() {
});
GoblinPayInnerResultVo dtoData = dto.getData();
payCode = dtoData.getCode();
NftPayResultVo.setCode(payCode);
NftPayResultVo.setOrderCode(dtoData.getOrderCode());
NftPayResultVo.setPayData(dtoData.getPayData());
NftPayResultVo.setPayType(nftOrder.getPayType());
NftPayResultVo.setPrice(nftOrder.getPriceActual());
NftPayResultVo.setShowUrl(showUrl);
NftPayResultVo.setReturnUrl(returnUrl);
} else {
isFree = true;
nftOrder.setPayType("FREE");
payCode = "FREE_PAY_CODE";
NftPayResultVo.setPrice(BigDecimal.valueOf(0));
NftPayResultVo.setPayType(nftOrder.getPayType());
}
LinkedList<String> sqls = CollectionUtil.linkedListString(); LinkedList<String> sqls = CollectionUtil.linkedListString();
sqls.add(SqlMapping.get("goblin_nft_order.insert")); sqls.add(SqlMapping.get("goblin_nft_order.insert"));
LinkedList<Object[]> sqlDataOrder = CollectionUtil.linkedListObjectArr(); LinkedList<Object[]> sqlDataOrder = CollectionUtil.linkedListObjectArr();
nftOrder.setPayCode(payCode);
sqlDataOrder.add(new Object[]{
nftOrder.getSpuId(), nftOrder.getSkuId(), nftOrder.getNum(),
nftOrder.getOrderId(), nftOrder.getStoreId(), nftOrder.getStoreName(), nftOrder.getOrderCode(), nftOrder.getUserId(), nftOrder.getUserName(), nftOrder.getUserMobile(), nftOrder.getPriceTotal(), nftOrder.getPayCode(),
nftOrder.getPriceActual(), nftOrder.getPriceCoupon(), nftOrder.getStorePriceCoupon(), nftOrder.getPriceVoucher(), nftOrder.getStatus(), nftOrder.getUcouponId(), nftOrder.getStoreCouponId(), nftOrder.getPayType(), nftOrder.getDeviceFrom(),
nftOrder.getSource(), nftOrder.getVersion(), nftOrder.getOrderType(), nftOrder.getPayCountdownMinute(), nftOrder.getIpAddress(), nftOrder.getCreatedAt()
});
nftOrder.setPayCode(payCode); // 订单vo
sqlDataOrder.add(new Object[]{ GoblinNftOrderVo orderVo = GoblinNftOrderVo.getNew().copy(nftOrder);
nftOrder.getSpuId(), nftOrder.getSkuId(), nftOrder.getNum(), orderVo.setCreatedAt(nftOrder.getCreatedAt());
nftOrder.getOrderId(), nftOrder.getStoreId(), nftOrder.getStoreName(), nftOrder.getOrderCode(), nftOrder.getUserId(), nftOrder.getUserName(), nftOrder.getUserMobile(), nftOrder.getPriceTotal(), nftOrder.getPayCode(),
nftOrder.getPriceActual(), nftOrder.getPriceCoupon(), nftOrder.getStorePriceCoupon(), nftOrder.getPriceVoucher(), nftOrder.getStatus(), nftOrder.getUcouponId(), nftOrder.getStoreCouponId(), nftOrder.getPayType(), nftOrder.getDeviceFrom(), // 待支付发送队列
nftOrder.getSource(), nftOrder.getVersion(), nftOrder.getOrderType(), nftOrder.getPayCountdownMinute(), nftOrder.getIpAddress(), nftOrder.getCreatedAt() queueUtils.sendMsgByRedisGoblinStock(orderVo.getOrderId(), nftOrder.getCreatedAt(), "NFT");
});
// redis 订单详情
nftOrderUtils.setNftOrder(orderVo);
// redis 订单列表
// nftOrderUtils.addNftOrderList(uid, orderVo.getOrderId());
// mongo
goblinMongoUtils.setGoblinNftOrderVo(orderVo);
// 执行sql
String sqlData = SqlMapping.gets(sqls, sqlDataOrder);
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_ORDER_CREATE_PAY.getKey(), sqlData);
log.info(UserPathDto.setData("NFT下单(唤起支付)", nftOrder, NftPayResultVo));
if (isFree) {// 免费直接回调
GoblinNftOrderPayCallbackParam NftOrderPayCallbackParam = GoblinNftOrderPayCallbackParam.getNew();
NftOrderPayCallbackParam.setCode(payCode);
NftOrderPayCallbackParam.setOrderCode(nftOrder.getOrderCode());
NftOrderPayCallbackParam.setPaymentAt(DateUtil.format(LocalDateTime.now(), DateUtil.Formatter.yyyyMMddHHmmss));
NftOrderPayCallbackParam.setPrice(nftOrder.getPriceActual());
NftOrderPayCallbackParam.setPaymentId("FREE_PAYMENT_ID");
NftOrderPayCallbackParam.setPaymentType(null);
NftOrderPayCallbackParam.setStatus(1);
syncOrder(NftOrderPayCallbackParam);
}
// 订单vo return NftPayResultVo;
GoblinNftOrderVo orderVo = GoblinNftOrderVo.getNew().copy(nftOrder); } catch (Exception e) {
orderVo.setCreatedAt(nftOrder.getCreatedAt()); log.error("NFT下单-生成订单唤起支付异常 e:{}", e);
return null;
// 待支付发送队列
queueUtils.sendMsgByRedisGoblinStock(orderVo.getOrderId(), nftOrder.getCreatedAt(), "NFT");
// redis 订单详情
nftOrderUtils.setNftOrder(orderVo);
// redis 订单列表
nftOrderUtils.addNftOrderList(uid, orderVo.getOrderId());
// mongo
goblinMongoUtils.setGoblinNftOrderVo(orderVo);
// 执行sql
String sqlData = SqlMapping.gets(sqls, sqlDataOrder);
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_ORDER_CREATE_PAY.getKey(), sqlData);
log.info(UserPathDto.setData("NFT下单(唤起支付)", nftOrder, NftPayResultVo));
if (isFree) {// 免费直接回调
GoblinNftOrderPayCallbackParam NftOrderPayCallbackParam = GoblinNftOrderPayCallbackParam.getNew();
NftOrderPayCallbackParam.setCode(payCode);
NftOrderPayCallbackParam.setOrderCode(nftOrder.getOrderCode());
NftOrderPayCallbackParam.setPaymentAt(DateUtil.format(LocalDateTime.now(), DateUtil.Formatter.yyyyMMddHHmmss));
NftOrderPayCallbackParam.setPrice(nftOrder.getPriceActual());
NftOrderPayCallbackParam.setPaymentId("FREE_PAYMENT_ID");
NftOrderPayCallbackParam.setPaymentType(null);
NftOrderPayCallbackParam.setStatus(1);
syncOrder(NftOrderPayCallbackParam);
} }
return NftPayResultVo;
} }
@Override @Override
...@@ -419,13 +465,13 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService { ...@@ -419,13 +465,13 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
} }
if (Objects.equals(1, syncOrderParam.getStatus())) { if (Objects.equals(1, syncOrderParam.getStatus())) {
String uid = orderVo.getUserId();
if (Objects.equals(orderVo.getStatus(), GoblinStatusConst.NftStatus.ORDER_STATUS_3.getValue())) {// 超时支付 if (Objects.equals(orderVo.getStatus(), GoblinStatusConst.NftStatus.ORDER_STATUS_3.getValue())) {// 超时支付
log.error("Nft订单超时支付 param:[orderCode:{}]", orderCode); log.error("Nft订单超时支付 param:[orderCode:{}]", orderCode);
// 退款 // 退款
nftOrderUtils.refundOrderSku(orderId, syncOrderParam.getPaymentId(), syncOrderParam.getPaymentType()); nftOrderUtils.refundOrderSku(orderId, syncOrderParam.getPaymentId(), syncOrderParam.getPaymentType());
} else {// 正常流程 } else {// 正常流程
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
String uid = orderVo.getUserId();
GoblinNftOrder nftOrder = GoblinNftOrder.getNew(); GoblinNftOrder nftOrder = GoblinNftOrder.getNew();
nftOrder.setPaymentType(syncOrderParam.getPaymentType()); nftOrder.setPaymentType(syncOrderParam.getPaymentType());
...@@ -463,6 +509,8 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService { ...@@ -463,6 +509,8 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
// 加积分 // 加积分
goblinOrderUtils.doTask(uid, orderVo.getPriceActual()); goblinOrderUtils.doTask(uid, orderVo.getPriceActual());
} }
// 写入用户订单列表 因取消的订单不展示 所以放在这里
nftOrderUtils.addNftOrderList(uid, orderVo.getOrderId());
} }
return "success"; return "success";
......
...@@ -114,6 +114,18 @@ public class GoblinNftOrderUtils { ...@@ -114,6 +114,18 @@ public class GoblinNftOrderUtils {
redisUtil.set(redisKey, vo); 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