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

Commit da185943 authored by 姜秀龙's avatar 姜秀龙

增加换购价字段

parent a100accc
......@@ -41,6 +41,9 @@ public class GoblinGoodsSkuInfoDetailVo implements Serializable, Cloneable {
@ApiModelProperty(position = 20, value = "单品销售价-原价[20,2]")
private BigDecimal sellPrice;
@ApiModelProperty(value = "收钱吧商品(spuType=33)演出关联换购价(元);其他商品类型恒为 null;SQB 且传入 performancesId 且后台已配置时返回")
private BigDecimal settlementPrice;
@ApiModelProperty(position = 26, value = "限量[0-无限制|X:限购数量]")
private Integer buyLimit;
@ApiModelProperty(position = 27, value = "剩余库存(实时:Redis getSkuStock)")
......
......@@ -19,7 +19,7 @@ public class GoblinSqbPerformanceGoodsInfoVo extends GoblinGoodsInfoVo {
@ApiModelProperty(value = "正常售价")
private BigDecimal price;
@ApiModelProperty(value = "换购价(不设置则按正常价)")
@ApiModelProperty(value = "收钱吧商品(spuType=33)换购价展示(元):关联 SKU 换购价最小值;非 SQB 商品恒为 null;未配置换购价时不返回")
private BigDecimal settlementPrice;
@ApiModelProperty(value = "已上架 SKU 明细(含 restStock、stockLess、canBuy 等,与商品详情接口字段一致)")
......
......@@ -394,14 +394,81 @@ public class GoblinFrontServiceImpl implements GoblinFrontService {
return buildOnShelfSkuDetailList(goblinGoodsInfoVo, null);
}
/**
* 从演出-商品关联构建 skuId → 后台配置的换购价(原始值,展示前需经 {@link #resolveSqbDisplaySettlementPrice})
*/
private Map<String, BigDecimal> buildSqbSettlementPriceBySkuId(List<GoblinSqbPerformanceGoods> relations, String spuId) {
Map<String, BigDecimal> map = new HashMap<>();
if (CollectionUtils.isEmpty(relations)) {
return map;
}
String spu = StringUtil.isBlank(spuId) ? null : spuId.trim();
for (GoblinSqbPerformanceGoods r : relations) {
if (r == null || StringUtil.isBlank(r.getSkuId())) {
continue;
}
if (spu != null && (StringUtil.isBlank(r.getSpuId()) || !spu.equals(r.getSpuId().trim()))) {
continue;
}
map.put(r.getSkuId().trim(), r.getSettlementPrice());
}
return map;
}
/**
* 前台展示换购价:与收钱吧下单 {@code resolveSqbUnitPriceYuan} 一致(换购价须有效且不超过 SKU 售价),但不校验用户是否已购演出门票。
*/
private BigDecimal resolveSqbDisplaySettlementPrice(GoblinGoodsSkuInfoVo skuVo, BigDecimal configuredSettlement) {
if (skuVo == null || configuredSettlement == null) {
return null;
}
if (configuredSettlement.compareTo(BigDecimal.ZERO) <= 0) {
return null;
}
BigDecimal base = skuVo.getSellPrice() != null ? skuVo.getSellPrice() : skuVo.getPrice();
if (base == null) {
return configuredSettlement;
}
if (configuredSettlement.compareTo(base) > 0) {
return base;
}
return configuredSettlement;
}
private BigDecimal resolveSpuMinSettlementPrice(List<GoblinGoodsSkuInfoDetailVo> skuList) {
if (CollectionUtils.isEmpty(skuList)) {
return null;
}
BigDecimal min = null;
for (GoblinGoodsSkuInfoDetailVo sku : skuList) {
if (sku == null || sku.getSettlementPrice() == null) {
continue;
}
if (min == null || sku.getSettlementPrice().compareTo(min) < 0) {
min = sku.getSettlementPrice();
}
}
return min;
}
/**
* @param allowedSkuIds 非 null 时仅保留集合内的 SKU(用于收钱吧演出关联 SKU、spuType=33 详情)
* @param settlementPriceBySkuId 仅 spuType=33 时传入;其他商品类型忽略
*/
private ArrayList<GoblinGoodsSkuInfoDetailVo> buildOnShelfSkuDetailList(GoblinGoodsInfoVo goblinGoodsInfoVo, Set<String> allowedSkuIds) {
return buildOnShelfSkuDetailList(goblinGoodsInfoVo, allowedSkuIds, null);
}
private ArrayList<GoblinGoodsSkuInfoDetailVo> buildOnShelfSkuDetailList(GoblinGoodsInfoVo goblinGoodsInfoVo, Set<String> allowedSkuIds,
Map<String, BigDecimal> settlementPriceBySkuId) {
ArrayList<GoblinGoodsSkuInfoDetailVo> list = ObjectUtil.goblinGoodsSkuInfoDetailVos();
if (goblinGoodsInfoVo == null) {
return list;
}
boolean sqbSpu = isSqbSpuGoods(goblinGoodsInfoVo);
if (!sqbSpu) {
settlementPriceBySkuId = null;
}
String spuId = goblinGoodsInfoVo.getSpuId();
List<String> skuIdList = goblinGoodsInfoVo.getSkuIdList();
if (CollectionUtils.isEmpty(skuIdList)) {
......@@ -422,6 +489,7 @@ public class GoblinFrontServiceImpl implements GoblinFrontService {
int stock = goblinRedisUtils.getSkuStock(pre, goblinGoodsSkuInfoVo.getSkuId());
log.debug("skuId:{},库存数量{}", goblinGoodsSkuInfoVo.getSkuId(), stock);
GoblinGoodsSkuInfoDetailVo goblinGoodsSkuInfoDetailVo = GoblinGoodsSkuInfoDetailVo.getNew();
goblinGoodsSkuInfoDetailVo.setSettlementPrice(null);
BeanUtils.copyProperties(goblinGoodsSkuInfoVo, goblinGoodsSkuInfoDetailVo);
fillSkuPicIfBlank(goblinGoodsSkuInfoDetailVo, goblinGoodsInfoVo);
if (0 != goblinGoodsSkuInfoDetailVo.getBuyLimit()) {
......@@ -438,6 +506,15 @@ public class GoblinFrontServiceImpl implements GoblinFrontService {
goblinGoodsSkuInfoDetailVo.setStockLess(false);
}
goblinGoodsSkuInfoDetailVo.setRestStock(stock);
if (sqbSpu && settlementPriceBySkuId != null && !settlementPriceBySkuId.isEmpty()) {
String skuKey = goblinGoodsSkuInfoVo.getSkuId();
BigDecimal configured = skuKey != null ? settlementPriceBySkuId.get(skuKey) : null;
if (configured == null && StringUtil.isNotBlank(sku)) {
configured = settlementPriceBySkuId.get(sku.trim());
}
goblinGoodsSkuInfoDetailVo.setSettlementPrice(
resolveSqbDisplaySettlementPrice(goblinGoodsSkuInfoVo, configured));
}
list.add(goblinGoodsSkuInfoDetailVo);
}
}
......@@ -464,10 +541,17 @@ public class GoblinFrontServiceImpl implements GoblinFrontService {
goblinFrontGoodDetailVo.setGoblinGoodsInfoVo(goblinGoodsInfoDetailVo);
// int limit= getStockCount(goblinGoodsInfoVo.getStoreId());
Set<String> sqbSkuAllow = null;
Map<String, BigDecimal> settlementPriceBySkuId = null;
if (isSqbSpuGoods(goblinGoodsInfoVo)) {
sqbSkuAllow = loadSqbLinkedSkuIdSet(spuId, performancesId);
if (StringUtil.isNotBlank(performancesId)) {
List<GoblinSqbPerformanceGoods> perfRelations =
loadSqbPerformanceGoodsRelationsFromCacheOrDb(performancesId);
settlementPriceBySkuId = buildSqbSettlementPriceBySkuId(perfRelations, spuId);
}
}
ArrayList<GoblinGoodsSkuInfoDetailVo> list = buildOnShelfSkuDetailList(goblinGoodsInfoVo, sqbSkuAllow);
ArrayList<GoblinGoodsSkuInfoDetailVo> list =
buildOnShelfSkuDetailList(goblinGoodsInfoVo, sqbSkuAllow, settlementPriceBySkuId);
//goblinGoodsInfoVo
GoblinStoreInfoVo goblinStoreInfoVo = this.getStore(goblinGoodsInfoVo.getStoreId());
if (null != goblinStoreInfoVo) {
......@@ -1300,8 +1384,17 @@ public class GoblinFrontServiceImpl implements GoblinFrontService {
BigDecimal normalPrice = resolveGoodsSellPrice(goodsInfoVo, linkedSkuIds);
frontGoods.setSellPrice(normalPrice);
frontGoods.setPrice(normalPrice);
frontGoods.setSettlementPrice(rel.getSettlementPrice());
frontGoods.setGoblinGoodsSkuInfoVolist(buildOnShelfSkuDetailList(goodsInfoVo, linkedSkuIds));
frontGoods.setSettlementPrice(null);
ArrayList<GoblinGoodsSkuInfoDetailVo> skuDetailList;
if (isSqbSpuGoods(goodsInfoVo)) {
Map<String, BigDecimal> settlementPriceBySkuId =
buildSqbSettlementPriceBySkuId(relations, rel.getSpuId());
skuDetailList = buildOnShelfSkuDetailList(goodsInfoVo, linkedSkuIds, settlementPriceBySkuId);
frontGoods.setSettlementPrice(resolveSpuMinSettlementPrice(skuDetailList));
} else {
skuDetailList = buildOnShelfSkuDetailList(goodsInfoVo, linkedSkuIds);
}
frontGoods.setGoblinGoodsSkuInfoVolist(skuDetailList);
allGoods.add(frontGoods);
}
}
......
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