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

Commit 14f2add9 authored by wangyifan's avatar wangyifan

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

parent 6beeefde
......@@ -445,6 +445,7 @@ public class GoblinRedisConst {
*/
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;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtGoodsSqbAddParam;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsInfoVo;
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.dto.vo.*;
import com.liquidnet.service.goblin.entity.GoblinSqbGoodsExt;
import com.liquidnet.service.goblin.mapper.GoblinSqbGoodsExtMapper;
import com.liquidnet.service.goblin.service.manage.IGoblinStoreMgtSqbGoodsService;
import com.liquidnet.service.goblin.util.GoblinRedisUtils;
import com.liquidnet.service.goblin.util.GoblinSqbRedisUtils;
import com.liquidnet.service.goblin.util.ObjectUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......@@ -29,11 +27,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 收钱吧商品管理
......@@ -50,6 +44,8 @@ public class GoblinStoreMgtSqbGoodsController {
@Autowired
private GoblinRedisUtils goblinRedisUtils;
@Autowired
private GoblinSqbRedisUtils goblinSqbRedisUtils;
@Autowired
private GoblinSqbGoodsExtMapper goblinSqbGoodsExtMapper;
@Autowired
private SqbBiz goblinShouQianBaService;
......@@ -211,6 +207,9 @@ public class GoblinStoreMgtSqbGoodsController {
ext.setCreatedAt(now);
ext.setUpdatedAt(now);
goblinSqbGoodsExtMapper.insert(ext);
// 设置正在商品获取收钱吧相关信息缓存
goblinSqbRedisUtils.setSqbGoodsExt(ext.getSpuId(), ext.getSkuId(),
GoblinSqbGoodsExtVo.of(ext.getSpuId(), ext.getSkuId(), ext.getMallSn(), ext.getSignature(), ext.getSqbSpuId(), ext.getSqbSkuId()));
}
}
......@@ -286,7 +285,7 @@ public class GoblinStoreMgtSqbGoodsController {
}
private Map<String, Object> buildEditResult(int editSuccess, int notAdded, int sqbNotFound, int editFail,
List<String> invalidReasons) {
List<String> invalidReasons) {
Map<String, Object> result = new HashMap<>();
result.put("editSuccess", editSuccess);
result.put("notAdded", notAdded);
......
......@@ -2,8 +2,10 @@ package com.liquidnet.service.goblin.util;
import com.liquidnet.common.cache.redis.util.RedisUtil;
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.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.GoblinSqbPerfGoodsVo;
import lombok.extern.slf4j.Slf4j;
......@@ -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;
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.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.JsonUtils;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.manage.GoblinSqbOrderParam;
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.order.utils.*;
import lombok.extern.slf4j.Slf4j;
......@@ -49,8 +53,6 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService {
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 {
try {
// Step 2: 校验演出-商品关联
List<GoblinSqbPerfGoodsVo> perfGoods = goblinSqbRedisUtils.getPerfGoods(performancesId);
if (perfGoods.isEmpty()) {
List<GoblinSqbPerformanceGoods> performanceGoodsListCache = goblinSqbRedisUtils.getSqbPerformanceGoodsListCache(performancesId);
if (performanceGoodsListCache.isEmpty()) {
log.error("[收钱吧下单] 演出关联商品列表为空,performancesId={}, skuId={}", performancesId, skuId);
return ResponseDto.failure("商品与演出关联不存在");
}
boolean skuIdExists = false;
for (GoblinSqbPerfGoodsVo perfGood : perfGoods) {
for (MallProductsQueryData.Sku skuResult : perfGood.getSkuResults()) {
if (skuId.equals(skuResult.getSkuId())) {
skuIdExists = true;
}
for (GoblinSqbPerformanceGoods goblinSqbPerformanceGoods : performanceGoodsListCache) {
if (skuId.equals(goblinSqbPerformanceGoods.getSkuId())) {
skuIdExists = true;
}
}
if (!skuIdExists) {
log.error("[收钱吧下单] 演出-商品关联不存在或已禁用,performancesId={}, skuId={}", performancesId, skuId);
return ResponseDto.failure("商品与演出关联不存在");
......@@ -113,15 +115,19 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService {
}
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(
sqbInfoMap.get("mallSn"),
sqbInfoMap.get("signature"),
sqbGoodsExt.getMallSn(),
sqbGoodsExt.getSignature(),
userId,
Collections.singletonList(buildSqbCheckOutItem(skuVo,
quantity, sqbInfoMap.get("sqbSkuId"), sqbInfoMap.get("sqbSpuId"))));
quantity, sqbGoodsExt.getSqbSkuId(), sqbGoodsExt.getSqbSpuId())));
if (settlementData == null) {
goblinRedisUtils.incrSkuStock(null, skuId, quantity);
return ResponseDto.failure("创建结算明细失败");
......@@ -132,8 +138,8 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService {
// Step 4.2: createOrder → 得 sqbOrderSn + sqbOrderSignature + sqbAcquiringSn
String goodsName = skuVo.getName();
OrderCreateData orderData = sqbBiz.createOrder(
sqbInfoMap.get("mallSn"),
sqbInfoMap.get("signature"),
sqbGoodsExt.getMallSn(),
sqbGoodsExt.getSignature(),
checkoutItemsId,
userId,
buildRequestId(IDGenerator.nextSnowId()),
......@@ -252,7 +258,7 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService {
orderVo.setSpuId(spuId);
orderVo.setSkuId(skuId);
orderVo.setQuantity(quantity);
orderVo.setAmount(sqbConvertUtils.yuanToFen(priceTotal));
orderVo.setAmount(GoblinSqbConvertUtils.yuanToFen(priceTotal));
orderVo.setSqbOrderSn(sqbOrderSn);
orderVo.setSqbOrderSignature(sqbOrderSignature);
orderVo.setSqbAcquiringSn(sqbAcquiringSn);
......@@ -305,7 +311,7 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService {
LinkedList<Object[]> sqlDataSqbOrder = new LinkedList<>();
sqlDataSqbOrder.add(new Object[]{
orderId, userId, performancesId, spuId, skuId, quantity,
sqbConvertUtils.yuanToFen(priceTotal),
GoblinSqbConvertUtils.yuanToFen(priceTotal),
sqbOrderSn, sqbOrderSignature, sqbAcquiringSn, sqbAcquiringSign, checkoutItemsId,
0, now, now
});
......@@ -360,7 +366,7 @@ public class GoblinSqbOrderServiceImpl implements IGoblinSqbOrderService {
SettlementCreateRequest.CheckoutItem checkoutItem = new SettlementCreateRequest.CheckoutItem();
checkoutItem.setSpuId(sqbSpuId);
checkoutItem.setSkuId(sqbSkuId);
checkoutItem.setPrice(sqbConvertUtils.yuanToFen(skuVo.getPrice()));
checkoutItem.setPrice(GoblinSqbConvertUtils.yuanToFen(skuVo.getPrice()));
checkoutItem.setQuantity(String.valueOf(quantity));
checkoutItem.setType((byte) 0);
checkoutItem.setTitle(skuVo.getName());
......
package com.liquidnet.service.order.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;
/**
* 收钱吧参数转换工具类
* 1. 金额转换:元(BigDecimal) -> 分(Long)
*/
@Slf4j
@Component
public class GoblinSqbConvertUtils {
/**
* 元转分 (BigDecimal -> Long)
*
* @param amount 元
* @return 分
*/
public Long yuanToFen(BigDecimal amount) {
public static Long yuanToFen(BigDecimal amount) {
if (amount == null) {
return 0L;
}
......@@ -34,15 +28,4 @@ public class GoblinSqbConvertUtils {
.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;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.service.base.constant.RedisKeyExpireConst;
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.GoblinSqbPerfGoodsVo;
import com.liquidnet.service.goblin.entity.GoblinSqbPerformanceGoods;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
......@@ -46,29 +47,22 @@ public class GoblinSqbRedisUtils {
/* ---------------------------------------- 演出关联商品缓存(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
* @return
*/
public List<GoblinSqbPerfGoodsVo> getPerfGoods(String performancesId) {
public List<GoblinSqbPerformanceGoods> getSqbPerformanceGoodsListCache(String performancesId) {
String key = GoblinRedisConst.SQB_PERFORMANCE_GOODS.concat(performancesId);
Object object = redisUtil.get(key);
if (null == object) {
return Collections.emptyList();
}else {
return (List<GoblinSqbPerfGoodsVo>) object;
} else {
return (List<GoblinSqbPerformanceGoods>) object;
}
}
public void delPerfGoods(String performancesId) {
redisUtil.del(GoblinRedisConst.SQB_PERFORMANCE_GOODS.concat(performancesId));
}
/* ---------------------------------------- 下单防重锁(TTL 10s) ---------------------------------------- */
/**
......@@ -96,6 +90,7 @@ public class GoblinSqbRedisUtils {
/**
* 添加用户 收钱吧订单列表
*
* @param userId
* @param orderId
*/
......@@ -114,6 +109,7 @@ public class GoblinSqbRedisUtils {
/**
* 获取 收钱吧订单id列表
*
* @param uid
* @return
*/
......@@ -126,4 +122,21 @@ public class GoblinSqbRedisUtils {
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