code review:营销活动+订单

This commit is contained in:
YunaiV
2023-09-09 01:27:55 +08:00
parent 5235aff8ad
commit 87c55784c4
18 changed files with 96 additions and 67 deletions

View File

@@ -23,6 +23,7 @@ public class BargainActivityApiImpl implements BargainActivityApi {
@Override
public void updateBargainActivityStock(Long activityId, Integer count) {
// TODO @puhui999可以整个实现到 bargainActivityService 中
// 查询砍价活动
BargainActivityDO activity = bargainActivityService.getBargainActivity(activityId);
if (activity == null) {
@@ -30,6 +31,7 @@ public class BargainActivityApiImpl implements BargainActivityApi {
}
// 更新砍价库存
// TODO @puhui999考虑下并发更新问题
BargainActivityUpdateReqVO reqVO = new BargainActivityUpdateReqVO();
reqVO.setId(activityId);
reqVO.setStock(activity.getStock() - count);

View File

@@ -27,14 +27,19 @@ public class SeckillActivityApiImpl implements SeckillActivityApi {
@Resource
private SeckillActivityService activityService;
// TODO @puhui建议这块弄到 activityService 实现哈;
// TODO @puhui这个方法要考虑事务性
@Override
public void updateSeckillStock(SeckillActivityUpdateStockReqDTO updateStockReqDTO) {
// TODO @puhui999长方法最好有 1.1 1.2 2.1 这种步骤哈;
SeckillActivityDO seckillActivity = activityService.getSeckillActivity(updateStockReqDTO.getActivityId());
if (seckillActivity.getStock() < updateStockReqDTO.getCount()) {
throw exception(SECKILL_ACTIVITY_UPDATE_STOCK_FAIL);
}
// 获取活动商品
// TODO @puhui999在一个方法里dos 和 dolist 最好保持一致,要么用 s要么用 list 哈;
List<SeckillProductDO> productDOs = activityService.getSeckillProductListByActivityId(updateStockReqDTO.getActivityId());
// TODO @puhui999这个是不是搞成 CollectionUtils.convertMultiMap()
List<SeckillActivityUpdateStockReqDTO.Item> items = updateStockReqDTO.getItems();
Map<Long, List<Long>> map = new HashMap<>();
items.forEach(item -> {
@@ -49,9 +54,11 @@ public class SeckillActivityApiImpl implements SeckillActivityApi {
}
});
// 过滤出购买的商品
// TODO @puhui999productDOList 可以简化成 productList一般来说do 之类不用带着哈,在变量里;
List<SeckillProductDO> productDOList = CollectionUtils.filterList(productDOs, item -> map.get(item.getSpuId()).contains(item.getSkuId()));
Map<Long, SeckillActivityUpdateStockReqDTO.Item> productDOMap = CollectionUtils.convertMap(items, SeckillActivityUpdateStockReqDTO.Item::getSkuId, p -> p);
// 检查活动商品库存是否充足
// TODO @puhui999避免 b 这种无业务含义的变量;
boolean b = CollectionUtils.anyMatch(productDOList, item -> {
SeckillActivityUpdateStockReqDTO.Item item1 = productDOMap.get(item.getSkuId());
return (item.getStock() < item1.getCount()) || (item.getStock() - item1.getCount()) < 0;
@@ -59,17 +66,19 @@ public class SeckillActivityApiImpl implements SeckillActivityApi {
if (b) {
throw exception(SECKILL_ACTIVITY_UPDATE_STOCK_FAIL);
}
// TODO @puhui999类似 doList应该和下面的 update 逻辑粘的更紧密一点so 在空行的时候,应该挪到 74 之后里去;甚至更合理,应该是 79 之后;说白了,逻辑要分块,每个模块涉及的代码要紧密在一起;
List<SeckillProductDO> doList = CollectionUtils.convertList(productDOList, item -> {
item.setStock(item.getStock() - productDOMap.get(item.getSkuId()).getCount());
return item;
});
// 更新活动库存
// TODO @puhui999考虑下并发更新
seckillActivity.setStock(seckillActivity.getStock() + updateStockReqDTO.getCount());
seckillActivity.setTotalStock(seckillActivity.getTotalStock() - updateStockReqDTO.getCount());
activityService.updateSeckillActivity(seckillActivity);
// 更新活动商品库存
activityService.updateSeckillActivityProductByList(doList);
activityService.updateSeckillActivityProductList(doList);
}
}

View File

@@ -9,6 +9,7 @@ import lombok.*;
import java.time.LocalDateTime;
// TODO 芋艿:把字段的顺序,和 do 顺序对齐下
/**
* 拼团记录 DO
*
@@ -27,34 +28,28 @@ import java.time.LocalDateTime;
@AllArgsConstructor
public class CombinationRecordDO extends BaseDO {
/**
* 编号,主键自增
*/
@TableId
private Long id;
/**
* 拼团活动编号
*
* 关联 {@link CombinationActivityDO#getId()}
*/
private Long activityId;
/**
* 拼团商品单价
*
* 冗余 {@link CombinationProductDO#getCombinationPrice()}
*/
private Integer combinationPrice;
/**
* SPU 编号
*/
private Long spuId;
/**
* SKU 编号
*/
private Long skuId;
/**
* 用户编号
*/
private Long userId;
/**
* 订单编号
*/
private Long orderId;
/**
* 团长编号
*
* 关联 {@link CombinationRecordDO#getId()}
*/
private Long headId;
/**
* 商品名字
*/
@@ -64,9 +59,14 @@ public class CombinationRecordDO extends BaseDO {
*/
private String picUrl;
/**
* 拼团商品单价
* SKU 编号
*/
private Integer combinationPrice;
private Long skuId;
/**
* 用户编号
*/
private Long userId;
/**
* 用户昵称
*/
@@ -75,6 +75,13 @@ public class CombinationRecordDO extends BaseDO {
* 用户头像
*/
private String avatar;
/**
* 团长编号
*
* 关联 {@link CombinationRecordDO#getId()}
*/
private Long headId;
/**
* 开团状态
*
@@ -82,23 +89,9 @@ public class CombinationRecordDO extends BaseDO {
*/
private Integer status;
/**
* 是否虚拟成团
* 订单编号
*/
private Boolean virtualGroup;
/**
* 过期时间
*
* {@link CombinationRecordDO#getStartTime()} + {@link CombinationActivityDO#getLimitDuration()} 计算
*/
private LocalDateTime expireTime;
/**
* 开始时间 (订单付款后开始的时间)
*/
private LocalDateTime startTime;
/**
* 结束时间(成团时间/失败时间)
*/
private LocalDateTime endTime;
private Long orderId;
/**
* 开团需要人数
*
@@ -109,5 +102,24 @@ public class CombinationRecordDO extends BaseDO {
* 已加入拼团人数
*/
private Integer userCount;
/**
* 是否虚拟成团
*/
private Boolean virtualGroup;
/**
* 过期时间
*
* 基于 {@link CombinationRecordDO#getStartTime()} + {@link CombinationActivityDO#getLimitDuration()} 计算
*/
private LocalDateTime expireTime;
/**
* 开始时间 (订单付款后开始的时间)
*/
private LocalDateTime startTime;
/**
* 结束时间(成团时间/失败时间)
*/
private LocalDateTime endTime;
}

View File

@@ -43,9 +43,9 @@ public interface SeckillActivityService {
/**
* 更新秒杀活动商品
*
* @param productDOList 活动商品列表
* @param productList 活动商品列表
*/
void updateSeckillActivityProductByList(List<SeckillProductDO> productDOList);
void updateSeckillActivityProductList(List<SeckillProductDO> productList);
/**
* 关闭秒杀活动

View File

@@ -93,8 +93,8 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
activityList.removeIf(item -> ObjectUtil.equal(item.getId(), activityId));
}
// 2.2 过滤出所有 configIds 有交集的活动,判断是否存在重叠
List<SeckillActivityDO> activityDOs = filterList(activityList, s -> containsAny(s.getConfigIds(), configIds));
if (isNotEmpty(activityDOs)) {
List<SeckillActivityDO> conflictActivityList = filterList(activityList, s -> containsAny(s.getConfigIds(), configIds));
if (isNotEmpty(conflictActivityList)) {
throw exception(SECKILL_ACTIVITY_SPU_CONFLICTS);
}
}
@@ -150,8 +150,8 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
}
@Override
public void updateSeckillActivityProductByList(List<SeckillProductDO> productDOList) {
seckillProductMapper.updateBatch(productDOList);
public void updateSeckillActivityProductList(List<SeckillProductDO> productList) {
seckillProductMapper.updateBatch(productList);
}
/**