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

Commit 501ea9ec authored by jiangxiulong's avatar jiangxiulong

order、kylin消费相关 获取判断回滚库存增加listId

parent 706e6de9
......@@ -11,10 +11,7 @@ import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.consumer.kylin.utils.GoblinNftUtils;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.vo.GoblinNftOrderVo;
import com.liquidnet.service.goblin.dto.vo.GoblinOrderSkuVo;
import com.liquidnet.service.goblin.dto.vo.GoblinStoreOrderVo;
import com.liquidnet.service.goblin.dto.vo.GoblinUserCouponVo;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.param.BackCouponParam;
import com.mongodb.BasicDBObject;
import com.mongodb.client.result.UpdateResult;
......@@ -172,10 +169,15 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin
if (nftOrder.getStatus().equals(GoblinStatusConst.NftStatus.ORDER_STATUS_1.getValue())) {
// 库存购买数量回滚
goblinNftUtils.decrSkuCountByUid(nftOrder.getUserId(), nftOrder.getSkuId(), nftOrder.getNum());
LocalDateTime nowTime = LocalDateTime.now();
if (StringUtils.isEmpty(nftOrder.getBoxSkuId())) {// 购买藏品
goblinNftUtils.incrSkuStock(nftOrder.getSkuId(), nftOrder.getNum());
HashMap<String, Object> map = goblinNftUtils.getGoodsSkuInfoVo(nowTime, nftOrder.getSkuId());
String listId = (String) map.get("listId");
goblinNftUtils.incrSkuStock(listId, nftOrder.getSkuId(), nftOrder.getNum());
} else {// 购买盲盒
goblinNftUtils.incrSkuStock(nftOrder.getBoxSkuId(), nftOrder.getNum());
HashMap<String, Object> map = goblinNftUtils.getGoodsSkuInfoVo(nowTime, nftOrder.getBoxSkuId());
String listId = (String) map.get("listId");
goblinNftUtils.incrSkuStock(listId, nftOrder.getBoxSkuId(), nftOrder.getNum());
}
// 订单状态
......
package com.liquidnet.service.consumer.kylin.utils;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsSkuInfoVo;
import com.liquidnet.service.goblin.dto.vo.GoblinListCollectVo;
import com.liquidnet.service.goblin.dto.vo.GoblinNftOrderVo;
import com.mongodb.BasicDBObject;
import com.mongodb.client.result.UpdateResult;
......@@ -12,6 +16,11 @@ import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@Component
public class GoblinNftUtils {
......@@ -30,9 +39,13 @@ public class GoblinNftUtils {
return (int) redisUtil.decr(redisKey, stock);
}
public int incrSkuStock(String skuId, Integer stock) {
String redisKey = GoblinRedisConst.REAL_STOCK_SKU.concat(skuId);
return (int) redisUtil.incr(redisKey, stock);
public int incrSkuStock(String marketPre, String skuId, Integer stock) {
String rk = GoblinRedisConst.REAL_STOCK_SKU;
if (marketPre != null && !marketPre.equals("null")) {
rk = rk.concat(marketPre + ":");
}
rk = rk.concat(skuId);
return (int) redisUtil.incr(rk, stock);
}
// 减少 用户sku购买个数
......@@ -70,6 +83,107 @@ public class GoblinNftUtils {
object);
}
/**
* 获取 包含分段购的sku详情 HASHMAP
*
* @param now 当前时间
* @param skuId skuId
* @return
*/
public HashMap<String, Object> getGoodsSkuInfoVo(LocalDateTime now, String skuId) {
GoblinGoodsSkuInfoVo vo = getGoodsSkuInfoVo(skuId);
List<GoblinListCollectVo> collectVos = getGoblinListCollect(skuId);
GoblinListCollectVo collectVo = null;
for (GoblinListCollectVo collectVoItem : collectVos) {
if (now.isAfter(collectVoItem.getTimeStart()) && now.isBefore(collectVoItem.getTimeEnd())) {
collectVo = collectVoItem;
break;
}
}
HashMap<String, Object> map = CollectionUtil.mapStringObject();
Integer tagType = null;
String listId = null;
if (collectVo != null) {
vo.setPrice(collectVo.getPrice());
vo.setPriceV(collectVo.getPriceV());
vo.setProductId(collectVo.getProductId());
vo.setSaleStartTime(collectVo.getTimeStart());
vo.setSaleStopTime(collectVo.getTimeEnd());
tagType = collectVo.getTagType();
listId = collectVo.getListId();
}
map.put("vo", vo);
map.put("tagType", tagType);
map.put("listId", listId);
return map;
}
/**
* 单品信息
*
* @param skuId 单品ID
* @return GoblinGoodsSkuInfoVo
*/
public GoblinGoodsSkuInfoVo getGoodsSkuInfoVo(String skuId) {
String pre = GoblinStatusConst.MarketPreStatus.getPre(skuId);
if (pre != null && pre.equals(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue())) {
String rk = GoblinRedisConst.BASIC_GOODS_SKU.concat(skuId.split(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue())[0]);
GoblinGoodsSkuInfoVo vo = (GoblinGoodsSkuInfoVo) redisUtil.get(rk);
if (null == vo && null != (vo = getGoodsSkuInfoVoMdb(skuId))) {
redisUtil.set(rk, vo);
}
if (vo == null) {
return vo;
}
String marketrk = GoblinRedisConst.BASIC_GOODS_SKU.concat(skuId);
GoblinGoodsSkuInfoVo marketVo = (GoblinGoodsSkuInfoVo) redisUtil.get(marketrk);
if (null == marketVo && null != (marketVo = getGoodsSkuInfoVoMdb(skuId))) {
redisUtil.set(marketrk, marketVo);
}
if (marketVo == null) {
return marketVo;
}
vo.setSpuId(marketVo.getSpuId());
vo.setSkuId(marketVo.getSkuId());
vo.setPrice(marketVo.getPrice());
vo.setPriceMember(marketVo.getPriceMember());
vo.setSkuStock(marketVo.getSkuStock());
vo.setBuyLimit(marketVo.getBuyLimit());
vo.setBuyRoster(marketVo.getBuyRoster());
vo.setBuyFactor(marketVo.getBuyFactor());
// vo.setDelFlg("0");
vo.setDelFlg(marketVo.getDelFlg().equals("1") ? marketVo.getDelFlg() : vo.getDelFlg());
vo.setMarketId(marketVo.getMarketId());
vo.setCreatedAt(LocalDateTime.now());
return vo;
} else {
String rk = GoblinRedisConst.BASIC_GOODS_SKU.concat(skuId);
GoblinGoodsSkuInfoVo vo = (GoblinGoodsSkuInfoVo) redisUtil.get(rk);
if (null == vo && null != (vo = getGoodsSkuInfoVoMdb(skuId))) {
redisUtil.set(rk, vo);
}
return vo;
}
}
// SKU信息
public GoblinGoodsSkuInfoVo getGoodsSkuInfoVoMdb(String skuId) {
return mongoTemplate.findOne(Query.query(Criteria.where("skuId").is(skuId)),
GoblinGoodsSkuInfoVo.class, GoblinGoodsSkuInfoVo.class.getSimpleName());
}
/**
* 分段购获取
* @param skuId
* @return
*/
public List<GoblinListCollectVo> getGoblinListCollect(String skuId) {
Object obj = redisUtil.get(GoblinRedisConst.LIST_COLLECT.concat(skuId));
if (obj == null) {
return new ArrayList<>();
} else {
return (List<GoblinListCollectVo>) obj;
}
}
public static BasicDBObject cloneBasicDBObject() {
return (BasicDBObject) basicDBObject.clone();
}
......
......@@ -73,7 +73,10 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
// 是否存在此商品信息 是否隐藏
String skuId = payParam.getSkuId();
int number = 1;
GoblinGoodsSkuInfoVo skuVo = goblinRedisUtils.getGoodsSkuInfoVo(skuId);
LocalDateTime nowTime = LocalDateTime.now();
HashMap<String, Object> map = goblinRedisUtils.getGoodsSkuInfoVo(nowTime, skuId);
GoblinGoodsSkuInfoVo skuVo = (GoblinGoodsSkuInfoVo) map.get("vo");
String listId = (String) map.get("listId");
if (!nftOrderUtils.getSkuAllStatusShow(skuVo)) {
return ResponseDto.failure("该商品不存在~");
}
......@@ -89,7 +92,6 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
// 判断开售、停售时间
LocalDateTime saleStartTime = skuVo.getSaleStartTime();
LocalDateTime saleStopTime = skuVo.getSaleStopTime();
LocalDateTime nowTime = LocalDateTime.now();
if (nowTime.isBefore(saleStartTime)) {
return ResponseDto.failure("该商品还未开始售卖~");
} else if (null != saleStopTime && nowTime.isAfter(saleStopTime)) {
......@@ -132,19 +134,21 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
if (CollectionUtil.isEmpty(skuIdList)) {
return ResponseDto.failure("该商品SPU不存在~");
} else {
GoblinGoodsSkuInfoVo skuInfoVo = lotteryDraw(skuIdList, number);
HashMap<String, Object> lotteryDrawMap = lotteryDraw(skuIdList, number);
GoblinGoodsSkuInfoVo skuInfoVo = (GoblinGoodsSkuInfoVo) lotteryDrawMap.get("goodsSkuInfoVo");
if (null == skuInfoVo) {
goblinRedisUtils.decrSkuCountByUid(uid, skuId, number);
return ResponseDto.failure("盲盒库存不足啦~");
}
boxSkuId = skuInfoVo.getSkuId();
stockSkuId = boxSkuId;
listId = (String) lotteryDrawMap.get("listId");
}
} else {// 普通藏品逻辑
// 判断库存
int surplusGeneral = nftOrderUtils.decrSkuStock(skuId, number);
int surplusGeneral = goblinRedisUtils.decrSkuStock(listId, skuId, number);
if (surplusGeneral < 0) {
nftOrderUtils.backSkuCountAndStock(uid, stockSkuId, skuId, number);
nftOrderUtils.backSkuCountAndStock(listId, uid, stockSkuId, skuId, number);
return ResponseDto.failure("库存不足啦~");
}
}
......@@ -187,14 +191,14 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
// 下单数据
GoblinNftOrder nftOrder = order(payParam, skuVo.getStoreId(), uid, spuId, number, orderId, orderCode, totalPrice, voucherPrice, storeVoucherPrice, boxSkuId, skuVo.getName() + " " + skuVo.getSubtitle());
if (null == nftOrder) {
nftOrderUtils.backSkuCountAndStock(uid, stockSkuId, skuId, number);
nftOrderUtils.backSkuCountAndStock(listId, uid, stockSkuId, skuId, number);
return ResponseDto.failure("下单失败~");
}
// 下单唤起支付
GoblinNftPayResultVo nftPayResultVo = payOrder(nftOrder, uid, payParam, skuVo.getProductId());
if (null == nftPayResultVo) {
nftOrderUtils.backSkuCountAndStock(uid, stockSkuId, skuId, number);
nftOrderUtils.backSkuCountAndStock(listId, uid, stockSkuId, skuId, number);
return ResponseDto.failure("下单失败啦~");
}
return ResponseDto.success(nftPayResultVo);
......@@ -208,18 +212,23 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
}
}
private GoblinGoodsSkuInfoVo lotteryDraw(List<String> skuIdList, int number) {
private HashMap<String, Object> lotteryDraw(List<String> skuIdList, int number) {
LocalDateTime now = LocalDateTime.now();
try {
ArrayList<GoblinGoodsSkuInfoVo> skuInfoVos = ObjectUtil.cloneArrayGoblinGoodsSkuInfoListVo();
ArrayList<String> listIds = ObjectUtil.cloneArrayListString();
for (String kid : skuIdList) {
GoblinGoodsSkuInfoVo skuInfoVo = goblinRedisUtils.getGoodsSkuInfoVo(kid);
HashMap<String, Object> map = goblinRedisUtils.getGoodsSkuInfoVo(now, kid);
GoblinGoodsSkuInfoVo skuInfoVo = (GoblinGoodsSkuInfoVo) map.get("vo");
String listId = (String) map.get("listId");
// 是盲盒的扔掉
if (skuInfoVo.getUnbox().equals("1")) {
continue;
}
// 不能购买的 没库存的 概率是0的 过滤
if (nftOrderUtils.getSkuAllStatusShow(skuInfoVo) && nftOrderUtils.getSkuAllStatusStock(skuInfoVo) > 0) {
if (nftOrderUtils.getSkuAllStatusShow(skuInfoVo) && nftOrderUtils.getSkuAllStatusStock(listId, skuInfoVo) > 0) {
skuInfoVos.add(skuInfoVo);
listIds.add(listId);
}
}
if (CollectionUtil.isEmpty(skuInfoVos)) {
......@@ -246,6 +255,7 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
}
// 未设置概率的写入概率
ArrayList<GoblinGoodsSkuInfoVo> newSkuInfoVos = ObjectUtil.cloneArrayGoblinGoodsSkuInfoListVo();
ArrayList<String> newListIds = ObjectUtil.cloneArrayListString();
int skuListSize = skuInfoVos.size();
for (int i = 0; i < skuListSize; i++) {
GoblinGoodsSkuInfoVo infoVo = skuInfoVos.get(i);
......@@ -266,6 +276,7 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
infoVo.setHitRatio(skuInfoVos.get(i - 1).getHitRatio().add(infoVo.getHitRatio()));
}
newSkuInfoVos.add(infoVo);
newListIds.add(listIds.get(i));
}
if (CollectionUtil.isEmpty(newSkuInfoVos)) {
log.info("该盲盒概率超过100导致不能卖 skuIdList:{}", skuIdList);
......@@ -285,13 +296,17 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
int index = hitRatioList.indexOf(nextDoubleNew);
GoblinGoodsSkuInfoVo goodsSkuInfoVo = newSkuInfoVos.get(index);
String endListId = newListIds.get(index);
// 判断库存
int surplusGeneral = nftOrderUtils.decrSkuStock(goodsSkuInfoVo.getSkuId(), number);
int surplusGeneral = goblinRedisUtils.decrSkuStock(endListId, goodsSkuInfoVo.getSkuId(), number);
if (surplusGeneral < 0) {
nftOrderUtils.incrSkuStock(goodsSkuInfoVo.getSkuId(), number);
goblinRedisUtils.incrSkuStock(endListId, goodsSkuInfoVo.getSkuId(), number);
return lotteryDraw(skuIdList, number);
} else {
return goodsSkuInfoVo;
HashMap<String, Object> map = CollectionUtil.mapStringObject();
map.put("goodsSkuInfoVo", goodsSkuInfoVo);
map.put("listId", endListId);
return map;
}
}
} catch (Exception e) {
......
......@@ -57,11 +57,11 @@ public class GoblinNftOrderUtils {
}
// 回滚用户sku购买个数和库存
public void backSkuCountAndStock(String uid, String stockSkuId, String bySkuId, int number) {
public void backSkuCountAndStock(String listId, String uid, String stockSkuId, String bySkuId, int number) {
// 减少用户购买个数
goblinRedisUtils.decrSkuCountByUid(uid, bySkuId, number);
// 增加库存
incrSkuStock(stockSkuId, number);
goblinRedisUtils.incrSkuStock(listId, stockSkuId, number);
}
// 订单详情vo
......@@ -353,7 +353,7 @@ public class GoblinNftOrderUtils {
* String unbox; 是否盲盒[0-否|1-是]
*/
// 获取盲盒下藏品的库存 各种状态下不能算库存的排除掉
public int getSkuAllStatusStock(GoblinGoodsSkuInfoVo info) {
public int getSkuAllStatusStock(String listId, GoblinGoodsSkuInfoVo info) {
if (
info != null
&& LocalDateTime.now().isAfter(info.getSaleStartTime())
......@@ -361,7 +361,7 @@ public class GoblinNftOrderUtils {
&& (null == info.getSkuCanbuy() || info.getSkuCanbuy().equals("1"))
&& (null == info.getHitRatio() || info.getHitRatio().compareTo(BigDecimal.ZERO) > 0)
) {// 可以返回库存
return goblinRedisUtils.getSkuStock(info.getSkuId());
return goblinRedisUtils.getSkuStock(listId, info.getSkuId());
} else {// 不计入库存
return 0;
}
......
......@@ -45,8 +45,12 @@ public class GoblinRedisUtils {
return (int) redisUtil.decr(rk, stock);
}
public int getSkuStock(String skuId) {
String rk = GoblinRedisConst.REAL_STOCK_SKU.concat(skuId);
public int getSkuStock(String marketPre, String skuId) {
String rk = GoblinRedisConst.REAL_STOCK_SKU;
if (marketPre != null && !marketPre.equals("null")) {
rk = rk.concat(marketPre + ":");
}
rk = rk.concat(skuId);
Object obj = redisUtil.get(rk);
if (obj == null) {
return 0;
......
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