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

Commit 14f2add9 authored by wangyifan's avatar wangyifan

添加收钱吧商品扩展 redis缓存

parent 6beeefde
...@@ -445,6 +445,7 @@ public class GoblinRedisConst { ...@@ -445,6 +445,7 @@ public class GoblinRedisConst {
*/ */
public static final String SQB_ORDER_LOCK = PREFIX.concat("sqb:order:lock:"); public static final String SQB_ORDER_LOCK = PREFIX.concat("sqb:order:lock:");
public static final String SQB_GOBLIN_GOODS_EXT_KEY = PREFIX.concat("sqb:goods:ext:");
/** /**
* 收钱吧 用户订单列表 * 收钱吧 用户订单列表
......
...@@ -9,14 +9,12 @@ import com.liquidnet.commons.lang.util.JsonUtils; ...@@ -9,14 +9,12 @@ import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.ErrorMapping; import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtGoodsSqbAddParam; import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtGoodsSqbAddParam;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsInfoVo; import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsSkuInfoVo;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsSpecVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbPerfGoodsVo;
import com.liquidnet.service.goblin.entity.GoblinSqbGoodsExt; import com.liquidnet.service.goblin.entity.GoblinSqbGoodsExt;
import com.liquidnet.service.goblin.mapper.GoblinSqbGoodsExtMapper; import com.liquidnet.service.goblin.mapper.GoblinSqbGoodsExtMapper;
import com.liquidnet.service.goblin.service.manage.IGoblinStoreMgtSqbGoodsService; import com.liquidnet.service.goblin.service.manage.IGoblinStoreMgtSqbGoodsService;
import com.liquidnet.service.goblin.util.GoblinRedisUtils; import com.liquidnet.service.goblin.util.GoblinRedisUtils;
import com.liquidnet.service.goblin.util.GoblinSqbRedisUtils;
import com.liquidnet.service.goblin.util.ObjectUtil; import com.liquidnet.service.goblin.util.ObjectUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
...@@ -29,11 +27,7 @@ import org.springframework.validation.annotation.Validated; ...@@ -29,11 +27,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.*;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* 收钱吧商品管理 * 收钱吧商品管理
...@@ -50,6 +44,8 @@ public class GoblinStoreMgtSqbGoodsController { ...@@ -50,6 +44,8 @@ public class GoblinStoreMgtSqbGoodsController {
@Autowired @Autowired
private GoblinRedisUtils goblinRedisUtils; private GoblinRedisUtils goblinRedisUtils;
@Autowired @Autowired
private GoblinSqbRedisUtils goblinSqbRedisUtils;
@Autowired
private GoblinSqbGoodsExtMapper goblinSqbGoodsExtMapper; private GoblinSqbGoodsExtMapper goblinSqbGoodsExtMapper;
@Autowired @Autowired
private SqbBiz goblinShouQianBaService; private SqbBiz goblinShouQianBaService;
...@@ -211,6 +207,9 @@ public class GoblinStoreMgtSqbGoodsController { ...@@ -211,6 +207,9 @@ public class GoblinStoreMgtSqbGoodsController {
ext.setCreatedAt(now); ext.setCreatedAt(now);
ext.setUpdatedAt(now); ext.setUpdatedAt(now);
goblinSqbGoodsExtMapper.insert(ext); goblinSqbGoodsExtMapper.insert(ext);
// 设置正在商品获取收钱吧相关信息缓存
goblinSqbRedisUtils.setSqbGoodsExt(ext.getSpuId(), ext.getSkuId(),
GoblinSqbGoodsExtVo.of(ext.getSpuId(), ext.getSkuId(), ext.getMallSn(), ext.getSignature(), ext.getSqbSpuId(), ext.getSqbSkuId()));
} }
} }
......
...@@ -2,8 +2,10 @@ package com.liquidnet.service.goblin.util; ...@@ -2,8 +2,10 @@ package com.liquidnet.service.goblin.util;
import com.liquidnet.common.cache.redis.util.RedisUtil; import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.CollectionUtil; import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.base.constant.RedisKeyExpireConst; import com.liquidnet.service.base.constant.RedisKeyExpireConst;
import com.liquidnet.service.goblin.constant.GoblinRedisConst; import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbGoodsExtVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbOrderVo; import com.liquidnet.service.goblin.dto.vo.GoblinSqbOrderVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbPerfGoodsVo; import com.liquidnet.service.goblin.dto.vo.GoblinSqbPerfGoodsVo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -94,4 +96,17 @@ public class GoblinSqbRedisUtils { ...@@ -94,4 +96,17 @@ public class GoblinSqbRedisUtils {
} }
/**
* 设置正在商品获取收钱吧相关信息缓存
* @param spuId 正在spuId
* @param skuId 正在skuId
* @param sqbGoodsExtVo
*/
public void setSqbGoodsExt(String spuId, String skuId, GoblinSqbGoodsExtVo sqbGoodsExtVo) {
if (StringUtil.isBlank(spuId) || StringUtil.isBlank(skuId)) {
return;
}
String redisKey = GoblinRedisConst.SQB_GOBLIN_GOODS_EXT_KEY.concat(spuId).concat(":").concat(skuId);
redisUtil.set(redisKey, sqbGoodsExtVo);
}
} }
...@@ -8,13 +8,17 @@ import com.liquidnet.common.third.sqb.param.request.CashierQueryRequest; ...@@ -8,13 +8,17 @@ import com.liquidnet.common.third.sqb.param.request.CashierQueryRequest;
import com.liquidnet.common.third.sqb.param.request.CommonRequest; import com.liquidnet.common.third.sqb.param.request.CommonRequest;
import com.liquidnet.common.third.sqb.param.request.CreateWechatPrepayOrderRequest; import com.liquidnet.common.third.sqb.param.request.CreateWechatPrepayOrderRequest;
import com.liquidnet.common.third.sqb.param.request.SettlementCreateRequest; import com.liquidnet.common.third.sqb.param.request.SettlementCreateRequest;
import com.liquidnet.common.third.sqb.param.response.data.*; import com.liquidnet.common.third.sqb.param.response.data.CashierQueryData;
import com.liquidnet.common.third.sqb.param.response.data.CreateWechatPrepayOrderData;
import com.liquidnet.common.third.sqb.param.response.data.OrderCreateData;
import com.liquidnet.common.third.sqb.param.response.data.SettlementCreateData;
import com.liquidnet.commons.lang.util.IDGenerator; import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.commons.lang.util.JsonUtils; import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.constant.GoblinStatusConst; import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.manage.GoblinSqbOrderParam; import com.liquidnet.service.goblin.dto.manage.GoblinSqbOrderParam;
import com.liquidnet.service.goblin.dto.vo.*; import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.entity.GoblinSqbPerformanceGoods;
import com.liquidnet.service.goblin.service.IGoblinSqbOrderService; import com.liquidnet.service.goblin.service.IGoblinSqbOrderService;
import com.liquidnet.service.order.utils.*; import com.liquidnet.service.order.utils.*;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -49,8 +53,6 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService { ...@@ -49,8 +53,6 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService {
private static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); private static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Autowired
private GoblinSqbConvertUtils sqbConvertUtils;
// ================================ 创建订单 ================================ // ================================ 创建订单 ================================
...@@ -72,20 +74,20 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService { ...@@ -72,20 +74,20 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService {
try { try {
// Step 2: 校验演出-商品关联 // Step 2: 校验演出-商品关联
List<GoblinSqbPerfGoodsVo> perfGoods = goblinSqbRedisUtils.getPerfGoods(performancesId); List<GoblinSqbPerformanceGoods> performanceGoodsListCache = goblinSqbRedisUtils.getSqbPerformanceGoodsListCache(performancesId);
if (perfGoods.isEmpty()) { if (performanceGoodsListCache.isEmpty()) {
log.error("[收钱吧下单] 演出关联商品列表为空,performancesId={}, skuId={}", performancesId, skuId); log.error("[收钱吧下单] 演出关联商品列表为空,performancesId={}, skuId={}", performancesId, skuId);
return ResponseDto.failure("商品与演出关联不存在"); return ResponseDto.failure("商品与演出关联不存在");
} }
boolean skuIdExists = false; boolean skuIdExists = false;
for (GoblinSqbPerfGoodsVo perfGood : perfGoods) {
for (MallProductsQueryData.Sku skuResult : perfGood.getSkuResults()) { for (GoblinSqbPerformanceGoods goblinSqbPerformanceGoods : performanceGoodsListCache) {
if (skuId.equals(skuResult.getSkuId())) { if (skuId.equals(goblinSqbPerformanceGoods.getSkuId())) {
skuIdExists = true; skuIdExists = true;
} }
} }
}
if (!skuIdExists) { if (!skuIdExists) {
log.error("[收钱吧下单] 演出-商品关联不存在或已禁用,performancesId={}, skuId={}", performancesId, skuId); log.error("[收钱吧下单] 演出-商品关联不存在或已禁用,performancesId={}, skuId={}", performancesId, skuId);
return ResponseDto.failure("商品与演出关联不存在"); return ResponseDto.failure("商品与演出关联不存在");
...@@ -113,15 +115,19 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService { ...@@ -113,15 +115,19 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService {
} }
log.info("[收钱吧下单] 扣减库存成功,skuId={}, 剩余库存={}", skuId, remaining); log.info("[收钱吧下单] 扣减库存成功,skuId={}, 剩余库存={}", skuId, remaining);
//TODO 获取该商品对应的商城的编号和密码 // 获取该商品对应的商城的编号和密码
Map<String, String> sqbInfoMap = sqbConvertUtils.getSqbInfoByzhengzaiSkuIdAndSpuId(skuId, spuId); GoblinSqbGoodsExtVo sqbGoodsExt = goblinSqbRedisUtils.getSqbGoodsExt(skuId, spuId);
if (sqbGoodsExt == null) {
log.error("[收钱吧下单] 正在商品对应收钱吧参数为空, skuId: {}, spuId: {}", skuId, spuId);
return ResponseDto.failure("下单失败");
}
SettlementCreateData settlementData = sqbBiz.createSettlement( SettlementCreateData settlementData = sqbBiz.createSettlement(
sqbInfoMap.get("mallSn"), sqbGoodsExt.getMallSn(),
sqbInfoMap.get("signature"), sqbGoodsExt.getSignature(),
userId, userId,
Collections.singletonList(buildSqbCheckOutItem(skuVo, Collections.singletonList(buildSqbCheckOutItem(skuVo,
quantity, sqbInfoMap.get("sqbSkuId"), sqbInfoMap.get("sqbSpuId")))); quantity, sqbGoodsExt.getSqbSkuId(), sqbGoodsExt.getSqbSpuId())));
if (settlementData == null) { if (settlementData == null) {
goblinRedisUtils.incrSkuStock(null, skuId, quantity); goblinRedisUtils.incrSkuStock(null, skuId, quantity);
return ResponseDto.failure("创建结算明细失败"); return ResponseDto.failure("创建结算明细失败");
...@@ -132,8 +138,8 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService { ...@@ -132,8 +138,8 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService {
// Step 4.2: createOrder → 得 sqbOrderSn + sqbOrderSignature + sqbAcquiringSn // Step 4.2: createOrder → 得 sqbOrderSn + sqbOrderSignature + sqbAcquiringSn
String goodsName = skuVo.getName(); String goodsName = skuVo.getName();
OrderCreateData orderData = sqbBiz.createOrder( OrderCreateData orderData = sqbBiz.createOrder(
sqbInfoMap.get("mallSn"), sqbGoodsExt.getMallSn(),
sqbInfoMap.get("signature"), sqbGoodsExt.getSignature(),
checkoutItemsId, checkoutItemsId,
userId, userId,
buildRequestId(IDGenerator.nextSnowId()), buildRequestId(IDGenerator.nextSnowId()),
...@@ -252,7 +258,7 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService { ...@@ -252,7 +258,7 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService {
orderVo.setSpuId(spuId); orderVo.setSpuId(spuId);
orderVo.setSkuId(skuId); orderVo.setSkuId(skuId);
orderVo.setQuantity(quantity); orderVo.setQuantity(quantity);
orderVo.setAmount(sqbConvertUtils.yuanToFen(priceTotal)); orderVo.setAmount(GoblinSqbConvertUtils.yuanToFen(priceTotal));
orderVo.setSqbOrderSn(sqbOrderSn); orderVo.setSqbOrderSn(sqbOrderSn);
orderVo.setSqbOrderSignature(sqbOrderSignature); orderVo.setSqbOrderSignature(sqbOrderSignature);
orderVo.setSqbAcquiringSn(sqbAcquiringSn); orderVo.setSqbAcquiringSn(sqbAcquiringSn);
...@@ -305,7 +311,7 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService { ...@@ -305,7 +311,7 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService {
LinkedList<Object[]> sqlDataSqbOrder = new LinkedList<>(); LinkedList<Object[]> sqlDataSqbOrder = new LinkedList<>();
sqlDataSqbOrder.add(new Object[]{ sqlDataSqbOrder.add(new Object[]{
orderId, userId, performancesId, spuId, skuId, quantity, orderId, userId, performancesId, spuId, skuId, quantity,
sqbConvertUtils.yuanToFen(priceTotal), GoblinSqbConvertUtils.yuanToFen(priceTotal),
sqbOrderSn, sqbOrderSignature, sqbAcquiringSn, sqbAcquiringSign, checkoutItemsId, sqbOrderSn, sqbOrderSignature, sqbAcquiringSn, sqbAcquiringSign, checkoutItemsId,
0, now, now 0, now, now
}); });
...@@ -360,7 +366,7 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService { ...@@ -360,7 +366,7 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService {
SettlementCreateRequest.CheckoutItem checkoutItem = new SettlementCreateRequest.CheckoutItem(); SettlementCreateRequest.CheckoutItem checkoutItem = new SettlementCreateRequest.CheckoutItem();
checkoutItem.setSpuId(sqbSpuId); checkoutItem.setSpuId(sqbSpuId);
checkoutItem.setSkuId(sqbSkuId); checkoutItem.setSkuId(sqbSkuId);
checkoutItem.setPrice(sqbConvertUtils.yuanToFen(skuVo.getPrice())); checkoutItem.setPrice(GoblinSqbConvertUtils.yuanToFen(skuVo.getPrice()));
checkoutItem.setQuantity(String.valueOf(quantity)); checkoutItem.setQuantity(String.valueOf(quantity));
checkoutItem.setType((byte) 0); checkoutItem.setType((byte) 0);
checkoutItem.setTitle(skuVo.getName()); checkoutItem.setTitle(skuVo.getName());
......
package com.liquidnet.service.order.utils; package com.liquidnet.service.order.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;
/** /**
* 收钱吧参数转换工具类 * 收钱吧参数转换工具类
* 1. 金额转换:元(BigDecimal) -> 分(Long) * 1. 金额转换:元(BigDecimal) -> 分(Long)
*/ */
@Slf4j
@Component
public class GoblinSqbConvertUtils { public class GoblinSqbConvertUtils {
/** /**
* 元转分 (BigDecimal -> Long) * 元转分 (BigDecimal -> Long)
*
* @param amount 元 * @param amount 元
* @return 分 * @return 分
*/ */
public Long yuanToFen(BigDecimal amount) { public static Long yuanToFen(BigDecimal amount) {
if (amount == null) { if (amount == null) {
return 0L; return 0L;
} }
...@@ -34,15 +28,4 @@ public class GoblinSqbConvertUtils { ...@@ -34,15 +28,4 @@ public class GoblinSqbConvertUtils {
.longValue(); .longValue();
} }
/**
* 根据正在的skuId、spuId获取收钱吧信息
* @param skuId
* @param spuId
* @return
*/
public Map<String, String> getSqbInfoByzhengzaiSkuIdAndSpuId(String skuId, String spuId) {
return new HashMap<>();
}
} }
...@@ -4,8 +4,9 @@ import com.liquidnet.common.cache.redis.util.RedisUtil; ...@@ -4,8 +4,9 @@ import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.CollectionUtil; import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.service.base.constant.RedisKeyExpireConst; import com.liquidnet.service.base.constant.RedisKeyExpireConst;
import com.liquidnet.service.goblin.constant.GoblinRedisConst; import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbGoodsExtVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbOrderVo; import com.liquidnet.service.goblin.dto.vo.GoblinSqbOrderVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbPerfGoodsVo; import com.liquidnet.service.goblin.entity.GoblinSqbPerformanceGoods;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -46,27 +47,20 @@ public class GoblinSqbRedisUtils { ...@@ -46,27 +47,20 @@ public class GoblinSqbRedisUtils {
/* ---------------------------------------- 演出关联商品缓存(TTL 5min) ---------------------------------------- */ /* ---------------------------------------- 演出关联商品缓存(TTL 5min) ---------------------------------------- */
public void setPerfGoods(String performancesId, List<GoblinSqbPerfGoodsVo> list) {
redisUtil.set(GoblinRedisConst.SQB_PERFORMANCE_GOODS.concat(performancesId), list, RedisKeyExpireConst.SQB_PERFORMANCE_GOODS_EXPIRE);
}
/** /**
* 获取演出关联商品 * 获取演出关联商品
*
* @param performancesId * @param performancesId
* @return * @return
*/ */
public List<GoblinSqbPerfGoodsVo> getPerfGoods(String performancesId) { public List<GoblinSqbPerformanceGoods> getSqbPerformanceGoodsListCache(String performancesId) {
String key = GoblinRedisConst.SQB_PERFORMANCE_GOODS.concat(performancesId); String key = GoblinRedisConst.SQB_PERFORMANCE_GOODS.concat(performancesId);
Object object = redisUtil.get(key); Object object = redisUtil.get(key);
if (null == object) { if (null == object) {
return Collections.emptyList(); return Collections.emptyList();
}else { } else {
return (List<GoblinSqbPerfGoodsVo>) object; return (List<GoblinSqbPerformanceGoods>) object;
}
} }
public void delPerfGoods(String performancesId) {
redisUtil.del(GoblinRedisConst.SQB_PERFORMANCE_GOODS.concat(performancesId));
} }
/* ---------------------------------------- 下单防重锁(TTL 10s) ---------------------------------------- */ /* ---------------------------------------- 下单防重锁(TTL 10s) ---------------------------------------- */
...@@ -96,6 +90,7 @@ public class GoblinSqbRedisUtils { ...@@ -96,6 +90,7 @@ public class GoblinSqbRedisUtils {
/** /**
* 添加用户 收钱吧订单列表 * 添加用户 收钱吧订单列表
*
* @param userId * @param userId
* @param orderId * @param orderId
*/ */
...@@ -114,6 +109,7 @@ public class GoblinSqbRedisUtils { ...@@ -114,6 +109,7 @@ public class GoblinSqbRedisUtils {
/** /**
* 获取 收钱吧订单id列表 * 获取 收钱吧订单id列表
*
* @param uid * @param uid
* @return * @return
*/ */
...@@ -126,4 +122,21 @@ public class GoblinSqbRedisUtils { ...@@ -126,4 +122,21 @@ public class GoblinSqbRedisUtils {
return (List<String>) obj; return (List<String>) obj;
} }
} }
/**
* 获取正在商品获取收钱吧相关信息缓存
*
* @param spuId
* @param skuId
* @return
*/
public GoblinSqbGoodsExtVo getSqbGoodsExt(String spuId, String skuId) {
String redisKey = GoblinRedisConst.SQB_GOBLIN_GOODS_EXT_KEY.concat(spuId).concat(":").concat(skuId);
Object obj = redisUtil.get(redisKey);
if (obj == null) {
return null;
} else {
return (GoblinSqbGoodsExtVo) obj;
}
}
} }
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