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

Commit 420d6653 authored by 姜秀龙's avatar 姜秀龙

Merge branch 'refs/heads/jxl-settlementPrice' into test-ecs

parents 663219e5 da185943
...@@ -41,6 +41,9 @@ public class GoblinGoodsSkuInfoDetailVo implements Serializable, Cloneable { ...@@ -41,6 +41,9 @@ public class GoblinGoodsSkuInfoDetailVo implements Serializable, Cloneable {
@ApiModelProperty(position = 20, value = "单品销售价-原价[20,2]") @ApiModelProperty(position = 20, value = "单品销售价-原价[20,2]")
private BigDecimal sellPrice; private BigDecimal sellPrice;
@ApiModelProperty(value = "收钱吧商品(spuType=33)演出关联换购价(元);其他商品类型恒为 null;SQB 且传入 performancesId 且后台已配置时返回")
private BigDecimal settlementPrice;
@ApiModelProperty(position = 26, value = "限量[0-无限制|X:限购数量]") @ApiModelProperty(position = 26, value = "限量[0-无限制|X:限购数量]")
private Integer buyLimit; private Integer buyLimit;
@ApiModelProperty(position = 27, value = "剩余库存(实时:Redis getSkuStock)") @ApiModelProperty(position = 27, value = "剩余库存(实时:Redis getSkuStock)")
......
...@@ -19,7 +19,7 @@ public class GoblinSqbPerformanceGoodsInfoVo extends GoblinGoodsInfoVo { ...@@ -19,7 +19,7 @@ public class GoblinSqbPerformanceGoodsInfoVo extends GoblinGoodsInfoVo {
@ApiModelProperty(value = "正常售价") @ApiModelProperty(value = "正常售价")
private BigDecimal price; private BigDecimal price;
@ApiModelProperty(value = "换购价(不设置则按正常价)") @ApiModelProperty(value = "收钱吧商品(spuType=33)换购价展示(元):关联 SKU 换购价最小值;非 SQB 商品恒为 null;未配置换购价时不返回")
private BigDecimal settlementPrice; private BigDecimal settlementPrice;
@ApiModelProperty(value = "已上架 SKU 明细(含 restStock、stockLess、canBuy 等,与商品详情接口字段一致)") @ApiModelProperty(value = "已上架 SKU 明细(含 restStock、stockLess、canBuy 等,与商品详情接口字段一致)")
......
...@@ -394,14 +394,81 @@ public class GoblinFrontServiceImpl implements GoblinFrontService { ...@@ -394,14 +394,81 @@ public class GoblinFrontServiceImpl implements GoblinFrontService {
return buildOnShelfSkuDetailList(goblinGoodsInfoVo, null); 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 allowedSkuIds 非 null 时仅保留集合内的 SKU(用于收钱吧演出关联 SKU、spuType=33 详情)
* @param settlementPriceBySkuId 仅 spuType=33 时传入;其他商品类型忽略
*/ */
private ArrayList<GoblinGoodsSkuInfoDetailVo> buildOnShelfSkuDetailList(GoblinGoodsInfoVo goblinGoodsInfoVo, Set<String> allowedSkuIds) { 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(); ArrayList<GoblinGoodsSkuInfoDetailVo> list = ObjectUtil.goblinGoodsSkuInfoDetailVos();
if (goblinGoodsInfoVo == null) { if (goblinGoodsInfoVo == null) {
return list; return list;
} }
boolean sqbSpu = isSqbSpuGoods(goblinGoodsInfoVo);
if (!sqbSpu) {
settlementPriceBySkuId = null;
}
String spuId = goblinGoodsInfoVo.getSpuId(); String spuId = goblinGoodsInfoVo.getSpuId();
List<String> skuIdList = goblinGoodsInfoVo.getSkuIdList(); List<String> skuIdList = goblinGoodsInfoVo.getSkuIdList();
if (CollectionUtils.isEmpty(skuIdList)) { if (CollectionUtils.isEmpty(skuIdList)) {
...@@ -422,6 +489,7 @@ public class GoblinFrontServiceImpl implements GoblinFrontService { ...@@ -422,6 +489,7 @@ public class GoblinFrontServiceImpl implements GoblinFrontService {
int stock = goblinRedisUtils.getSkuStock(pre, goblinGoodsSkuInfoVo.getSkuId()); int stock = goblinRedisUtils.getSkuStock(pre, goblinGoodsSkuInfoVo.getSkuId());
log.debug("skuId:{},库存数量{}", goblinGoodsSkuInfoVo.getSkuId(), stock); log.debug("skuId:{},库存数量{}", goblinGoodsSkuInfoVo.getSkuId(), stock);
GoblinGoodsSkuInfoDetailVo goblinGoodsSkuInfoDetailVo = GoblinGoodsSkuInfoDetailVo.getNew(); GoblinGoodsSkuInfoDetailVo goblinGoodsSkuInfoDetailVo = GoblinGoodsSkuInfoDetailVo.getNew();
goblinGoodsSkuInfoDetailVo.setSettlementPrice(null);
BeanUtils.copyProperties(goblinGoodsSkuInfoVo, goblinGoodsSkuInfoDetailVo); BeanUtils.copyProperties(goblinGoodsSkuInfoVo, goblinGoodsSkuInfoDetailVo);
fillSkuPicIfBlank(goblinGoodsSkuInfoDetailVo, goblinGoodsInfoVo); fillSkuPicIfBlank(goblinGoodsSkuInfoDetailVo, goblinGoodsInfoVo);
if (0 != goblinGoodsSkuInfoDetailVo.getBuyLimit()) { if (0 != goblinGoodsSkuInfoDetailVo.getBuyLimit()) {
...@@ -438,6 +506,15 @@ public class GoblinFrontServiceImpl implements GoblinFrontService { ...@@ -438,6 +506,15 @@ public class GoblinFrontServiceImpl implements GoblinFrontService {
goblinGoodsSkuInfoDetailVo.setStockLess(false); goblinGoodsSkuInfoDetailVo.setStockLess(false);
} }
goblinGoodsSkuInfoDetailVo.setRestStock(stock); 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); list.add(goblinGoodsSkuInfoDetailVo);
} }
} }
...@@ -464,10 +541,17 @@ public class GoblinFrontServiceImpl implements GoblinFrontService { ...@@ -464,10 +541,17 @@ public class GoblinFrontServiceImpl implements GoblinFrontService {
goblinFrontGoodDetailVo.setGoblinGoodsInfoVo(goblinGoodsInfoDetailVo); goblinFrontGoodDetailVo.setGoblinGoodsInfoVo(goblinGoodsInfoDetailVo);
// int limit= getStockCount(goblinGoodsInfoVo.getStoreId()); // int limit= getStockCount(goblinGoodsInfoVo.getStoreId());
Set<String> sqbSkuAllow = null; Set<String> sqbSkuAllow = null;
Map<String, BigDecimal> settlementPriceBySkuId = null;
if (isSqbSpuGoods(goblinGoodsInfoVo)) { if (isSqbSpuGoods(goblinGoodsInfoVo)) {
sqbSkuAllow = loadSqbLinkedSkuIdSet(spuId, performancesId); 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 //goblinGoodsInfoVo
GoblinStoreInfoVo goblinStoreInfoVo = this.getStore(goblinGoodsInfoVo.getStoreId()); GoblinStoreInfoVo goblinStoreInfoVo = this.getStore(goblinGoodsInfoVo.getStoreId());
if (null != goblinStoreInfoVo) { if (null != goblinStoreInfoVo) {
...@@ -1300,8 +1384,17 @@ public class GoblinFrontServiceImpl implements GoblinFrontService { ...@@ -1300,8 +1384,17 @@ public class GoblinFrontServiceImpl implements GoblinFrontService {
BigDecimal normalPrice = resolveGoodsSellPrice(goodsInfoVo, linkedSkuIds); BigDecimal normalPrice = resolveGoodsSellPrice(goodsInfoVo, linkedSkuIds);
frontGoods.setSellPrice(normalPrice); frontGoods.setSellPrice(normalPrice);
frontGoods.setPrice(normalPrice); frontGoods.setPrice(normalPrice);
frontGoods.setSettlementPrice(rel.getSettlementPrice()); frontGoods.setSettlementPrice(null);
frontGoods.setGoblinGoodsSkuInfoVolist(buildOnShelfSkuDetailList(goodsInfoVo, linkedSkuIds)); 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); 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