|
|
|
|
@ -1,12 +1,16 @@
|
|
|
|
|
package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
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.promotion.controller.admin.seckill.vo.activity.SeckillActivityBaseVO;
|
|
|
|
|
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO;
|
|
|
|
|
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO;
|
|
|
|
|
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO;
|
|
|
|
|
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.product.SeckillProductBaseVO;
|
|
|
|
|
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.product.SeckillProductCreateReqVO;
|
|
|
|
|
import cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity.SeckillActivityConvert;
|
|
|
|
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO;
|
|
|
|
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO;
|
|
|
|
|
@ -49,13 +53,13 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
|
|
|
|
|
// 校验秒杀时段是否存在
|
|
|
|
|
seckillConfigService.validateSeckillConfigExists(createReqVO.getConfigIds());
|
|
|
|
|
|
|
|
|
|
// 插入秒杀活动
|
|
|
|
|
// 插入秒杀活动 TODO 活动日期拼接上秒杀时段 -> 2023-06-08 09:00:00
|
|
|
|
|
SeckillActivityDO seckillActivity = SeckillActivityConvert.INSTANCE.convert(createReqVO)
|
|
|
|
|
.setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime()));
|
|
|
|
|
seckillActivityMapper.insert(seckillActivity);
|
|
|
|
|
// 插入商品
|
|
|
|
|
List<SeckillProductDO> productDOs = SeckillActivityConvert.INSTANCE.convertList(createReqVO.getProducts(), seckillActivity);
|
|
|
|
|
seckillProductMapper.insertBatch(productDOs);
|
|
|
|
|
//List<SeckillProductDO> productDOs = SeckillActivityConvert.INSTANCE.convertList(createReqVO.getProducts(), seckillActivity);
|
|
|
|
|
//seckillProductMapper.insertBatch(productDOs);
|
|
|
|
|
return seckillActivity.getId();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -89,24 +93,24 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
|
|
|
|
|
*/
|
|
|
|
|
private void updateSeckillProduct(SeckillActivityUpdateReqVO updateReqVO) {
|
|
|
|
|
List<SeckillProductDO> seckillProductDOs = seckillProductMapper.selectListByActivityId(updateReqVO.getId());
|
|
|
|
|
List<SeckillActivityBaseVO.Product> products = updateReqVO.getProducts();
|
|
|
|
|
//List<SeckillActivityBaseVO.Product> products = updateReqVO.getProducts();
|
|
|
|
|
|
|
|
|
|
// 计算需要删除的数据
|
|
|
|
|
List<Long> deleteIds = CollectionUtils.convertList(seckillProductDOs, SeckillProductDO::getId,
|
|
|
|
|
seckillProductDO -> products.stream()
|
|
|
|
|
.noneMatch(product -> SeckillActivityConvert.INSTANCE.isEquals(seckillProductDO, product)));
|
|
|
|
|
if (CollUtil.isNotEmpty(deleteIds)) {
|
|
|
|
|
seckillProductMapper.deleteBatchIds(deleteIds);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 计算需要新增的数据
|
|
|
|
|
List<SeckillProductDO> newSeckillProductDOs = CollectionUtils.convertList(products,
|
|
|
|
|
product -> SeckillActivityConvert.INSTANCE.convert(product).setActivityId(updateReqVO.getId()));
|
|
|
|
|
newSeckillProductDOs.removeIf(product -> seckillProductDOs.stream()
|
|
|
|
|
.anyMatch(seckillProduct -> SeckillActivityConvert.INSTANCE.isEquals(seckillProduct, product)));
|
|
|
|
|
if (CollUtil.isNotEmpty(newSeckillProductDOs)) {
|
|
|
|
|
seckillProductMapper.insertBatch(newSeckillProductDOs);
|
|
|
|
|
}
|
|
|
|
|
//List<Long> deleteIds = CollectionUtils.convertList(seckillProductDOs, SeckillProductDO::getId,
|
|
|
|
|
// seckillProductDO -> products.stream()
|
|
|
|
|
// .noneMatch(product -> SeckillActivityConvert.INSTANCE.isEquals(seckillProductDO, product)));
|
|
|
|
|
//if (CollUtil.isNotEmpty(deleteIds)) {
|
|
|
|
|
// seckillProductMapper.deleteBatchIds(deleteIds);
|
|
|
|
|
//}
|
|
|
|
|
//
|
|
|
|
|
//// 计算需要新增的数据
|
|
|
|
|
//List<SeckillProductDO> newSeckillProductDOs = CollectionUtils.convertList(products,
|
|
|
|
|
// product -> SeckillActivityConvert.INSTANCE.convert(product).setActivityId(updateReqVO.getId()));
|
|
|
|
|
//newSeckillProductDOs.removeIf(product -> seckillProductDOs.stream()
|
|
|
|
|
// .anyMatch(seckillProduct -> SeckillActivityConvert.INSTANCE.isEquals(seckillProduct, product)));
|
|
|
|
|
//if (CollUtil.isNotEmpty(newSeckillProductDOs)) {
|
|
|
|
|
// seckillProductMapper.insertBatch(newSeckillProductDOs);
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
//全量更新当前活动商品的秒杀时段id列表(timeIds)
|
|
|
|
|
seckillProductMapper.updateTimeIdsByActivityId(updateReqVO.getId(), updateReqVO.getConfigIds());
|
|
|
|
|
@ -118,23 +122,25 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
|
|
|
|
|
* @param id 秒杀活动编号
|
|
|
|
|
* @param products 商品列表
|
|
|
|
|
*/
|
|
|
|
|
private void validateSeckillActivityProductConflicts(Long id, List<SeckillActivityBaseVO.Product> products) {
|
|
|
|
|
private <T extends SeckillProductBaseVO> void validateSeckillActivityProductConflicts(Long id, List<T> products) {
|
|
|
|
|
if (CollUtil.isEmpty(products)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 校验秒杀商品是否存在
|
|
|
|
|
List<SeckillProductDO> seckillProductDOs = seckillProductMapper
|
|
|
|
|
.selectListBySkuIds(CollectionUtils.convertSet(products, SeckillActivityBaseVO.Product::getSkuId));
|
|
|
|
|
.selectListBySkuIds(CollectionUtils.convertSet(products, T::getSkuId));
|
|
|
|
|
if (CollUtil.isEmpty(seckillProductDOs)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 获取秒杀商品所在活动
|
|
|
|
|
List<SeckillActivityDO> seckillActivityDOs = seckillActivityMapper
|
|
|
|
|
.selectBatchIds(CollectionUtils.convertSet(seckillProductDOs, SeckillProductDO::getActivityId));
|
|
|
|
|
if (id != null) { // 排除自己这个活动
|
|
|
|
|
if (id != null) {
|
|
|
|
|
// 排除自己这个活动
|
|
|
|
|
seckillActivityDOs.removeIf(item -> id.equals(item.getId()));
|
|
|
|
|
}
|
|
|
|
|
// 排除不满足 status 的活动
|
|
|
|
|
List<Integer> statuses = asList(PromotionActivityStatusEnum.WAIT.getStatus(), PromotionActivityStatusEnum.RUN.getStatus());
|
|
|
|
|
seckillActivityDOs.removeIf(item -> !statuses.contains(item.getStatus()));
|
|
|
|
|
// 排除关闭了的活动
|
|
|
|
|
seckillActivityDOs.removeIf(item -> ObjectUtil.equal(item.getStatus(), CommonStatusEnum.DISABLE.getStatus()));
|
|
|
|
|
// 如果非空,则说明冲突
|
|
|
|
|
if (CollUtil.isNotEmpty(seckillActivityDOs)) {
|
|
|
|
|
throw exception(SECKILL_ACTIVITY_SPU_CONFLICTS);
|
|
|
|
|
@ -164,8 +170,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
|
|
|
|
|
if (!statuses.contains(seckillActivity.getStatus())) {
|
|
|
|
|
throw exception(SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END);
|
|
|
|
|
}
|
|
|
|
|
// 更新秒杀时段的秒杀活动数量
|
|
|
|
|
seckillConfigService.seckillActivityCountDecr(seckillActivity.getConfigIds());
|
|
|
|
|
|
|
|
|
|
// 删除
|
|
|
|
|
seckillActivityMapper.deleteById(id);
|
|
|
|
|
}
|
|
|
|
|
|