mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-08-14 10:11:53 +08:00
review 拼团、秒杀活动的实现
This commit is contained in:
@@ -14,6 +14,7 @@ import java.time.LocalDateTime;
|
||||
*/
|
||||
@Service
|
||||
public class CombinationApiImpl implements CombinationApi {
|
||||
|
||||
@Resource
|
||||
private CombinationActivityService activityService;
|
||||
|
||||
|
@@ -1,6 +1,5 @@
|
||||
package cn.iocoder.yudao.module.promotion.controller.admin.combination;
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
||||
@@ -28,6 +27,7 @@ import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import static cn.hutool.core.collection.CollectionUtil.newArrayList;
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
||||
|
||||
@@ -71,9 +71,9 @@ public class CombinationActivityController {
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
@PreAuthorize("@ss.hasPermission('promotion:combination-activity:query')")
|
||||
public CommonResult<CombinationActivityRespVO> getCombinationActivity(@RequestParam("id") Long id) {
|
||||
CombinationActivityDO combinationActivity = combinationActivityService.getCombinationActivity(id);
|
||||
List<CombinationProductDO> productDOs = combinationActivityService.getProductsByActivityIds(CollectionUtil.newArrayList(id));
|
||||
return success(CombinationActivityConvert.INSTANCE.convert(combinationActivity, productDOs));
|
||||
CombinationActivityDO activity = combinationActivityService.getCombinationActivity(id);
|
||||
List<CombinationProductDO> products = combinationActivityService.getProductsByActivityIds(newArrayList(id));
|
||||
return success(CombinationActivityConvert.INSTANCE.convert(activity, products));
|
||||
}
|
||||
|
||||
@GetMapping("/list")
|
||||
@@ -88,13 +88,15 @@ public class CombinationActivityController {
|
||||
@GetMapping("/page")
|
||||
@Operation(summary = "获得拼团活动分页")
|
||||
@PreAuthorize("@ss.hasPermission('promotion:combination-activity:query')")
|
||||
public CommonResult<PageResult<CombinationActivityRespVO>> getCombinationActivityPage(@Valid CombinationActivityPageReqVO pageVO) {
|
||||
public CommonResult<PageResult<CombinationActivityRespVO>> getCombinationActivityPage(
|
||||
@Valid CombinationActivityPageReqVO pageVO) {
|
||||
PageResult<CombinationActivityDO> pageResult = combinationActivityService.getCombinationActivityPage(pageVO);
|
||||
// TODO @puhui999:可以不一定 aIds,直接批量查询结果出来;下面也是类似;
|
||||
Set<Long> aIds = CollectionUtils.convertSet(pageResult.getList(), CombinationActivityDO::getId);
|
||||
List<CombinationProductDO> productDOs = combinationActivityService.getProductsByActivityIds(aIds);
|
||||
List<CombinationProductDO> products = combinationActivityService.getProductsByActivityIds(aIds);
|
||||
Set<Long> spuIds = CollectionUtils.convertSet(pageResult.getList(), CombinationActivityDO::getSpuId);
|
||||
List<ProductSpuRespDTO> spuList = spuApi.getSpuList(spuIds);
|
||||
return success(CombinationActivityConvert.INSTANCE.convertPage(pageResult, productDOs, spuList));
|
||||
List<ProductSpuRespDTO> spus = spuApi.getSpuList(spuIds);
|
||||
return success(CombinationActivityConvert.INSTANCE.convertPage(pageResult, products, spus));
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
|
@@ -20,7 +20,7 @@ public class CombinationActivityBaseVO {
|
||||
@NotNull(message = "拼团名称不能为空")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "商品 SPU 编号关联 ProductSpuDO 的 id", example = "[1,2,3]")
|
||||
@Schema(description = "商品 SPU 编号,关联 ProductSpuDO 的 id", example = "[1,2,3]")
|
||||
@NotNull(message = "拼团商品不能为空")
|
||||
private Long spuId;
|
||||
|
||||
@@ -32,6 +32,7 @@ public class CombinationActivityBaseVO {
|
||||
@NotNull(message = "单次限购数量不能为空")
|
||||
private Integer singleLimitCount;
|
||||
|
||||
// TODO @puhui999:是不是弄成 2 个字段会好点哈。开始、结束
|
||||
@Schema(description = "活动时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]")
|
||||
@NotNull(message = "活动时间不能为空")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
@@ -42,7 +43,7 @@ public class CombinationActivityBaseVO {
|
||||
private Integer userSize;
|
||||
|
||||
@Schema(description = "限制时长(小时)", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "限制时长(小时)不能为空")
|
||||
@NotNull(message = "限制时长不能为空")
|
||||
private Integer limitDuration;
|
||||
|
||||
}
|
||||
|
@@ -7,7 +7,7 @@ import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
|
||||
// TODO @puhui999:如无必要,导出都可以删除哈
|
||||
/**
|
||||
* 拼团活动 Excel VO
|
||||
*
|
||||
|
@@ -8,6 +8,7 @@ import java.time.LocalDateTime;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
// TODO @puhui999:如无必要,导出都可以删除哈
|
||||
@Schema(description = "管理后台 - 拼团活动 Excel 导出 Request VO,参数和 CombinationActivityPageReqVO 是一致的")
|
||||
@Data
|
||||
public class CombinationActivityExportReqVO {
|
||||
|
@@ -45,7 +45,7 @@ public class CombinationActivityRespVO extends CombinationActivityBaseVO {
|
||||
@NotNull(message = "虚拟成团不能为空")
|
||||
private Integer virtualGroup;
|
||||
|
||||
@Schema(description = "活动状态:0开启 1关闭", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
|
||||
@Schema(description = "活动状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
|
||||
@NotNull(message = "活动状态不能为空")
|
||||
private Integer status;
|
||||
|
||||
|
@@ -5,6 +5,7 @@ import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
// TODO @puhui999:可以考虑删除 excel 导出哈
|
||||
/**
|
||||
* 拼团商品 Excel VO
|
||||
*
|
||||
|
@@ -8,6 +8,7 @@ import java.time.LocalDateTime;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
// TODO @puhui999:可以考虑删除 excel 导出哈
|
||||
@Schema(description = "管理后台 - 拼团商品 Excel 导出 Request VO,参数和 CombinationProductPageReqVO 是一致的")
|
||||
@Data
|
||||
public class CombinationProductExportReqVO {
|
||||
|
@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.promotion.convert.combination;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
||||
import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
|
||||
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordReqDTO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO;
|
||||
@@ -26,6 +25,8 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
||||
|
||||
/**
|
||||
* 拼团活动 Convert
|
||||
*
|
||||
@@ -74,13 +75,17 @@ public interface CombinationActivityConvert {
|
||||
|
||||
PageResult<CombinationActivityRespVO> convertPage(PageResult<CombinationActivityDO> page);
|
||||
|
||||
default PageResult<CombinationActivityRespVO> convertPage(PageResult<CombinationActivityDO> page, List<CombinationProductDO> productDOList, List<ProductSpuRespDTO> spuList) {
|
||||
Map<Long, ProductSpuRespDTO> spuMap = CollectionUtils.convertMap(spuList, ProductSpuRespDTO::getId, c -> c);
|
||||
default PageResult<CombinationActivityRespVO> convertPage(PageResult<CombinationActivityDO> page,
|
||||
List<CombinationProductDO> productList,
|
||||
List<ProductSpuRespDTO> spuList) {
|
||||
// TODO @puhui999:c -> c 可以去掉哈
|
||||
Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId, c -> c);
|
||||
PageResult<CombinationActivityRespVO> pageResult = convertPage(page);
|
||||
pageResult.getList().forEach(item -> {
|
||||
// TODO @puhui999:最好 MapUtils.findAndThen,万一没找到呢,啊哈哈。
|
||||
item.setSpuName(spuMap.get(item.getSpuId()).getName());
|
||||
item.setPicUrl(spuMap.get(item.getSpuId()).getPicUrl());
|
||||
item.setProducts(convertList2(productDOList));
|
||||
item.setProducts(convertList2(productList));
|
||||
});
|
||||
return pageResult;
|
||||
}
|
||||
@@ -111,12 +116,17 @@ public interface CombinationActivityConvert {
|
||||
return list;
|
||||
}
|
||||
|
||||
default List<CombinationProductDO> convertList1(CombinationActivityDO activityDO, List<CombinationProductUpdateReqVO> vos, List<CombinationProductDO> productDOs) {
|
||||
Map<Long, Long> longMap = CollectionUtils.convertMap(productDOs, CombinationProductDO::getSkuId, CombinationProductDO::getId);
|
||||
// TODO @puhui999:这个方法的参数,调整成 productDOs、vos、activityDO;因为 productDOs 是主角;
|
||||
// 然后,这个方法,感觉不是为了 convert,而是为了补全;
|
||||
default List<CombinationProductDO> convertList1(CombinationActivityDO activityDO,
|
||||
List<CombinationProductUpdateReqVO> vos,
|
||||
List<CombinationProductDO> productDOs) {
|
||||
Map<Long, Long> longMap = convertMap(productDOs, CombinationProductDO::getSkuId, CombinationProductDO::getId);
|
||||
List<CombinationProductDO> list = new ArrayList<>();
|
||||
vos.forEach(sku -> {
|
||||
CombinationProductDO productDO = convert(activityDO, sku);
|
||||
productDO.setId(longMap.get(sku.getSkuId()));
|
||||
// TODO @puhui999:是是不是用 activityDO 的状态;
|
||||
productDO.setActivityStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
list.add(productDO);
|
||||
});
|
||||
|
@@ -84,6 +84,7 @@ public interface SeckillActivityConvert {
|
||||
return list;
|
||||
}
|
||||
|
||||
// TODO @puhui999:同拼团那个 convert 想通的情况哈。
|
||||
default List<SeckillProductDO> convertList1(SeckillActivityDO activityDO, List<SeckillProductUpdateReqVO> vos, List<SeckillProductDO> productDOs) {
|
||||
Map<Long, Long> longMap = CollectionUtils.convertMap(productDOs, SeckillProductDO::getSkuId, SeckillProductDO::getId);
|
||||
List<SeckillProductDO> list = new ArrayList<>();
|
||||
|
@@ -9,6 +9,7 @@ import lombok.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
// TODO @puhui999:是不是应该在 combination 哈?
|
||||
/**
|
||||
* 拼团活动 DO
|
||||
*
|
||||
@@ -34,7 +35,9 @@ public class CombinationActivityDO extends BaseDO {
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* 商品 SPU 编号关联 ProductSpuDO 的 id
|
||||
* 商品 SPU 编号
|
||||
*
|
||||
* 关联 ProductSpuDO 的 id
|
||||
*/
|
||||
private Long spuId;
|
||||
/**
|
||||
@@ -75,7 +78,7 @@ public class CombinationActivityDO extends BaseDO {
|
||||
private Integer virtualGroup;
|
||||
/**
|
||||
* 活动状态:0开启 1关闭
|
||||
* <p>
|
||||
*
|
||||
* 枚举 {@link CommonStatusEnum}
|
||||
*/
|
||||
private Integer status;
|
||||
|
@@ -31,11 +31,11 @@ public class CombinationRecordDO extends BaseDO {
|
||||
*/
|
||||
private Long activityId;
|
||||
/**
|
||||
* spu 编号
|
||||
* SPU 编号
|
||||
*/
|
||||
private Long spuId;
|
||||
/**
|
||||
* sku 编号
|
||||
* SKU 编号
|
||||
*/
|
||||
private Long skuId;
|
||||
/**
|
||||
@@ -48,7 +48,7 @@ public class CombinationRecordDO extends BaseDO {
|
||||
private Long orderId;
|
||||
/**
|
||||
* 团长编号
|
||||
* <p>
|
||||
*
|
||||
* 关联 {@link CombinationRecordDO#getUserId()}
|
||||
*/
|
||||
private Long headId;
|
||||
@@ -84,7 +84,8 @@ public class CombinationRecordDO extends BaseDO {
|
||||
private Boolean virtualGroup;
|
||||
/**
|
||||
* 过期时间,单位:小时
|
||||
* 关联关联 {@link CombinationActivityDO#getLimitDuration()}
|
||||
*
|
||||
* 关联 {@link CombinationActivityDO#getLimitDuration()}
|
||||
*/
|
||||
private Integer expireTime;
|
||||
/**
|
||||
@@ -97,6 +98,7 @@ public class CombinationRecordDO extends BaseDO {
|
||||
private LocalDateTime endTime;
|
||||
/**
|
||||
* 开团需要人数
|
||||
*
|
||||
* 关联 {@link CombinationActivityDO#getUserSize()}
|
||||
*/
|
||||
private Integer userSize;
|
||||
|
@@ -1 +0,0 @@
|
||||
package cn.iocoder.yudao.module.promotion.dal.dataobject.combination;
|
@@ -47,11 +47,11 @@ public class SeckillProductDO extends BaseDO {
|
||||
@TableField(typeHandler = LongListTypeHandler.class)
|
||||
private List<Long> configIds;
|
||||
/**
|
||||
* 商品 spu_id
|
||||
* 商品 SPU 编号
|
||||
*/
|
||||
private Long spuId;
|
||||
/**
|
||||
* 商品 sku_id
|
||||
* 商品 SKU 编号
|
||||
*/
|
||||
private Long skuId;
|
||||
/**
|
||||
|
@@ -50,7 +50,7 @@ public class SeckillConfigDO extends BaseDO {
|
||||
private List<String> sliderPicUrls;
|
||||
/**
|
||||
* 状态
|
||||
* <p>
|
||||
*
|
||||
* 枚举 {@link CommonStatusEnum 对应的类}
|
||||
*/
|
||||
private Integer status;
|
||||
|
@@ -10,6 +10,7 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
// TODO @puhui999:是不是应该在 combination 哈?
|
||||
/**
|
||||
* 拼团活动 Mapper
|
||||
*
|
||||
|
@@ -16,16 +16,18 @@ import java.util.List;
|
||||
public interface CombinationRecordMapper extends BaseMapperX<CombinationRecordDO> {
|
||||
|
||||
default CombinationRecordDO selectRecord(Long userId, Long orderId) {
|
||||
return selectOne(CombinationRecordDO::getUserId, userId, CombinationRecordDO::getOrderId, orderId);
|
||||
return selectOne(CombinationRecordDO::getUserId, userId,
|
||||
CombinationRecordDO::getOrderId, orderId);
|
||||
}
|
||||
|
||||
default List<CombinationRecordDO> selectListByHeadIdAndStatus(Long headId, Integer status) {
|
||||
return selectList(new LambdaQueryWrapperX<CombinationRecordDO>().eq(CombinationRecordDO::getHeadId, headId)
|
||||
return selectList(new LambdaQueryWrapperX<CombinationRecordDO>()
|
||||
.eq(CombinationRecordDO::getHeadId, headId)
|
||||
.eq(CombinationRecordDO::getStatus, status));
|
||||
}
|
||||
|
||||
default List<CombinationRecordDO> selectListByStatus(Integer status) {
|
||||
return selectList(new LambdaQueryWrapperX<CombinationRecordDO>().eq(CombinationRecordDO::getStatus, status));
|
||||
return selectList(CombinationRecordDO::getStatus, status);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -1 +0,0 @@
|
||||
package cn.iocoder.yudao.module.promotion.dal.mysql.combination;
|
@@ -23,5 +23,4 @@ public interface SeckillConfigMapper extends BaseMapperX<SeckillConfigDO> {
|
||||
return selectList(SeckillConfigDO::getStatus, status);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@@ -83,6 +83,7 @@ public interface CombinationActivityService {
|
||||
*/
|
||||
List<CombinationProductDO> getProductsByActivityIds(Collection<Long> ids);
|
||||
|
||||
// TODO @puhui999:拆一个 CombinationRecordService 里,方法名可以简洁成 updateRecordStatusByOrderId;service 方法可以稍微简单一点,如果是 update 方法
|
||||
/**
|
||||
* 更新拼团状态
|
||||
*
|
||||
@@ -99,10 +100,10 @@ public interface CombinationActivityService {
|
||||
* @param orderId 订单编号
|
||||
* @param status 状态
|
||||
* @param startTime 开始时间
|
||||
* @return
|
||||
*/
|
||||
void updateRecordStatusAndStartTimeByUserIdAndOrderId(Long userId, Long orderId, Integer status, LocalDateTime startTime);
|
||||
|
||||
// TODO @puhui999:拆一个 CombinationRecordService 里
|
||||
/**
|
||||
* 创建拼团记录
|
||||
*
|
||||
@@ -118,4 +119,5 @@ public interface CombinationActivityService {
|
||||
* @return 拼团状态
|
||||
*/
|
||||
boolean validateRecordStatusIsSuccess(Long userId, Long orderId);
|
||||
|
||||
}
|
||||
|
@@ -254,28 +254,33 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
|
||||
@Override
|
||||
public void createRecord(CombinationRecordReqDTO reqDTO) {
|
||||
// 校验拼团活动
|
||||
CombinationActivityDO activityDO = validateCombinationActivityExists(reqDTO.getActivityId());
|
||||
CombinationActivityDO activity = validateCombinationActivityExists(reqDTO.getActivityId());
|
||||
// TODO @puhui999:需要校验下,它当前是不是已经参加了该拼团;
|
||||
// TODO @puhui999: 父拼团是否存在,是否已经满了
|
||||
|
||||
CombinationRecordDO recordDO = CombinationActivityConvert.INSTANCE.convert(reqDTO);
|
||||
recordDO.setVirtualGroup(false);
|
||||
recordDO.setExpireTime(activityDO.getLimitDuration());
|
||||
recordDO.setUserSize(activityDO.getUserSize());
|
||||
recordMapper.insert(recordDO);
|
||||
CombinationRecordDO record = CombinationActivityConvert.INSTANCE.convert(reqDTO);
|
||||
record.setVirtualGroup(false);
|
||||
// TODO @puhui999:过期时间,应该是 Date 哈;
|
||||
record.setExpireTime(activity.getLimitDuration());
|
||||
record.setUserSize(activity.getUserSize());
|
||||
recordMapper.insert(record);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean validateRecordStatusIsSuccess(Long userId, Long orderId) {
|
||||
CombinationRecordDO recordDO = validateCombinationRecord(userId, orderId);
|
||||
return ObjectUtil.equal(recordDO.getStatus(), CombinationRecordStatusEnum.SUCCESS.getStatus());
|
||||
CombinationRecordDO record = validateCombinationRecord(userId, orderId);
|
||||
// TODO @puhui999:可以搞个 getRecrod 方法,然后业务通过 CombinationRecordStatusEnum.isSuccess 方法校验
|
||||
return ObjectUtil.equal(record.getStatus(), CombinationRecordStatusEnum.SUCCESS.getStatus());
|
||||
}
|
||||
|
||||
// TODO @puhui999:status 传入进来搞哈;
|
||||
/**
|
||||
* APP 端获取开团记录
|
||||
*
|
||||
* @return 开团记录
|
||||
*/
|
||||
public List<CombinationRecordDO> getRecordList() {
|
||||
return recordMapper.selectListByStatus(CombinationRecordStatusEnum.ONGOING.getStatus());
|
||||
return recordMapper.selectListByStatus(CombinationRecordStatusEnum.IN_PROGRESS.getStatus());
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -60,9 +60,10 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
|
||||
public Long createSeckillActivity(SeckillActivityCreateReqVO createReqVO) {
|
||||
// 校验商品秒秒杀时段是否冲突
|
||||
validateProductSpuSeckillConflict(createReqVO.getConfigIds(), createReqVO.getSpuId(), null);
|
||||
// 获取所选 spu下的所有 sku
|
||||
// 获取所选 spu 下的所有 sku
|
||||
List<ProductSkuRespDTO> skus = productSkuApi.getSkuListBySpuId(CollUtil.newArrayList(createReqVO.getSpuId()));
|
||||
// 校验商品 sku 是否存在
|
||||
// TODO @puhui999:直接校验 sku 数量,是不是就完事啦,不需要校验的特别严谨哈;
|
||||
validateProductSkuExistence(skus, createReqVO.getProducts(), SeckillProductCreateReqVO::getSkuId);
|
||||
|
||||
// 插入秒杀活动
|
||||
@@ -71,6 +72,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
|
||||
.setTotalStock(CollectionUtils.getSumValue(createReqVO.getProducts(), SeckillProductCreateReqVO::getStock, Integer::sum));
|
||||
seckillActivityMapper.insert(activity);
|
||||
// 插入商品
|
||||
// TODO @puhui999:products 要注意复数哈
|
||||
List<SeckillProductDO> product = SeckillActivityConvert.INSTANCE.convertList(activity, createReqVO.getProducts());
|
||||
seckillProductMapper.insertBatch(product);
|
||||
return activity.getId();
|
||||
@@ -97,6 +99,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
|
||||
}
|
||||
List<SeckillActivityDO> activityDOs2 = CollectionUtils.convertList(activityDOs, c -> c, s -> {
|
||||
// 判断秒杀时段是否有交集
|
||||
// TODO @puhui999:是不是 containsAny 就是有交集呀
|
||||
List<Long> configIdsClone = CollUtil.newArrayList(s.getConfigIds());
|
||||
configIdsClone.retainAll(configIds);
|
||||
return CollUtil.isNotEmpty(configIdsClone);
|
||||
@@ -134,29 +137,32 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
|
||||
/**
|
||||
* 更新秒杀商品
|
||||
*
|
||||
* @param updateObj DO
|
||||
* @param updateObj 更新的活动
|
||||
* @param products 商品配置
|
||||
*/
|
||||
// TODO @puhui999:我在想,我们是不是可以封装一个 CollUtil 的方法,传入两个数组,判断出哪些是新增、哪些是修改、哪些是删除;
|
||||
// 例如说,products 先转化成 SeckillProductDO;然后,基于一个 func(key1, key2) 做比对;
|
||||
// 如果可以跑通,所有涉及到这种逻辑的,都可以服用哈。
|
||||
private void updateSeckillProduct(SeckillActivityDO updateObj, List<SeckillProductUpdateReqVO> products) {
|
||||
List<SeckillProductDO> seckillProductDOs = seckillProductMapper.selectListByActivityId(updateObj.getId());
|
||||
// 数据库中的活动商品
|
||||
Set<Long> convertSet = CollectionUtils.convertSet(seckillProductDOs, SeckillProductDO::getSkuId);
|
||||
// 前端传过来的活动商品
|
||||
Set<Long> convertSet1 = CollectionUtils.convertSet(products, SeckillProductUpdateReqVO::getSkuId);
|
||||
// 删除后台存在的前端不存在的商品
|
||||
List<Long> d = CollectionUtils.filterList(convertSet, item -> !convertSet1.contains(item));
|
||||
List<SeckillProductDO> seckillProductDOs = seckillProductMapper.selectListByActivityId(updateObj.getId());
|
||||
Set<Long> dbSkuIds = CollectionUtils.convertSet(seckillProductDOs, SeckillProductDO::getSkuId);
|
||||
// 1. 删除后台存在的前端不存在的商品
|
||||
// TODO @puhui999:delete 应该是 id,不是 skuId 哈
|
||||
Set<Long> voSkuIds = CollectionUtils.convertSet(products, SeckillProductUpdateReqVO::getSkuId);
|
||||
List<Long> d = CollectionUtils.filterList(dbSkuIds, item -> !voSkuIds.contains(item));
|
||||
if (CollUtil.isNotEmpty(d)) {
|
||||
seckillProductMapper.deleteBatchIds(d);
|
||||
}
|
||||
// 前端存在的后端不存在的商品
|
||||
List<Long> c = CollectionUtils.filterList(convertSet1, item -> !convertSet.contains(item));
|
||||
// 2. 前端存在的后端不存在的商品
|
||||
List<Long> c = CollectionUtils.filterList(voSkuIds, item -> !dbSkuIds.contains(item));
|
||||
if (CollUtil.isNotEmpty(c)) {
|
||||
List<SeckillProductUpdateReqVO> vos = CollectionUtils.filterList(products, item -> c.contains(item.getSkuId()));
|
||||
List<SeckillProductDO> productDOs = SeckillActivityConvert.INSTANCE.convertList(updateObj, vos);
|
||||
seckillProductMapper.insertBatch(productDOs);
|
||||
}
|
||||
// 更新已存在的商品
|
||||
List<Long> u = CollectionUtils.filterList(convertSet1, convertSet::contains);
|
||||
// 3. 更新已存在的商品
|
||||
List<Long> u = CollectionUtils.filterList(voSkuIds, dbSkuIds::contains);
|
||||
if (CollUtil.isNotEmpty(u)) {
|
||||
List<SeckillProductUpdateReqVO> vos = CollectionUtils.filterList(products, item -> u.contains(item.getSkuId()));
|
||||
List<SeckillProductDO> productDOs = SeckillActivityConvert.INSTANCE.convertList1(updateObj, vos, seckillProductDOs);
|
||||
@@ -165,12 +171,12 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Transactional(rollbackFor = Exception.class) // TODO @puhui999:这个不用加事务哈
|
||||
public void closeSeckillActivity(Long id) {
|
||||
// TODO 待验证没使用过
|
||||
// 校验存在
|
||||
SeckillActivityDO seckillActivity = validateSeckillActivityExists(id);
|
||||
if (CommonStatusEnum.DISABLE.getStatus().equals(seckillActivity.getStatus())) {
|
||||
SeckillActivityDO activity = validateSeckillActivityExists(id);
|
||||
if (CommonStatusEnum.DISABLE.getStatus().equals(activity.getStatus())) {
|
||||
throw exception(SECKILL_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED);
|
||||
}
|
||||
|
||||
|
@@ -151,6 +151,7 @@ public class SeckillConfigServiceImpl implements SeckillConfigService {
|
||||
return seckillConfigMapper.selectPage(pageVO);
|
||||
}
|
||||
|
||||
// TODO @puhui999:改成传入 enable 状态哈。一个通用的 getSeckillConfigList 方法
|
||||
@Override
|
||||
public List<SeckillConfigDO> getListAllSimple() {
|
||||
return seckillConfigMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
|
@@ -31,6 +31,7 @@ public class PromotionUtils {
|
||||
return LocalDateTimeUtils.beforeNow(endTime) ? CommonStatusEnum.DISABLE.getStatus() : CommonStatusEnum.ENABLE.getStatus();
|
||||
}
|
||||
|
||||
// TODO @puhui999:写个注释哈。
|
||||
public static <T> void validateProductSkuExistence(List<ProductSkuRespDTO> skus, List<T> products, Function<T, Long> func) {
|
||||
// 校验 sku 个数是否一致
|
||||
Set<Long> skuIdsSet = CollectionUtils.convertSet(products, func);
|
||||
|
Reference in New Issue
Block a user