fix: 完善拼团、秒杀、砍价活动管理

This commit is contained in:
puhui999
2023-08-06 20:21:53 +08:00
parent 5f9184904a
commit 384359c9d4
27 changed files with 245 additions and 300 deletions

View File

@@ -1,12 +1,12 @@
package cn.iocoder.yudao.module.promotion.api.combination;
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordUpdateReqDTO;
import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum;
import cn.iocoder.yudao.module.promotion.service.combination.CombinationRecordService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
/**
* 拼团活动 API 实现类
@@ -20,23 +20,22 @@ public class CombinationRecordApiImpl implements CombinationRecordApi {
private CombinationRecordService recordService;
@Override
public void createCombinationRecord(CombinationRecordCreateReqDTO reqDTO) {
public void createRecord(CombinationRecordCreateReqDTO reqDTO) {
recordService.createCombinationRecord(reqDTO);
}
@Override
public boolean isCombinationRecordSuccess(Long userId, Long orderId) {
public boolean isRecordSuccess(Long userId, Long orderId) {
return CombinationRecordStatusEnum.isSuccess(recordService.getCombinationRecord(userId, orderId).getStatus());
}
@Override
public void updateCombinationRecordStatus(Long userId, Long orderId, Integer status) {
recordService.updateCombinationRecordStatusByUserIdAndOrderId(userId, orderId, status);
}
@Override
public void updateCombinationRecordStatusAndStartTime(Long userId, Long orderId, Integer status) {
recordService.updateCombinationRecordStatusAndStartTimeByUserIdAndOrderId(userId, orderId, status, LocalDateTime.now());
public void updateRecordStatus(CombinationRecordUpdateReqDTO reqDTO) {
if (null == reqDTO.getStartTime()) {
recordService.updateCombinationRecordStatusByUserIdAndOrderId(reqDTO);
} else {
recordService.updateCombinationRecordStatusAndStartTimeByUserIdAndOrderId(reqDTO);
}
}
}

View File

@@ -29,21 +29,8 @@ public class BargainActivityRespVO extends BargainActivityBaseVO {
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
@Schema(description = "开团人数", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "开团人数不能为空")
private Integer userSize;
@Schema(description = "开团组数", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "开团组数不能为空")
private Integer totalNum;
@Schema(description = "成团组数", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "成团组数不能为空")
private Integer successNum;
@Schema(description = "虚拟成团", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "虚拟成团不能为空")
private Integer virtualGroup;
@Schema(description = "砍价成功数量", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer successCount;
@Schema(description = "活动状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
@NotNull(message = "活动状态不能为空")

View File

@@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* 砍价助力 DO
* 砍价助力 DO TODO
*
* @author HUIHUI
*/

View File

@@ -9,7 +9,7 @@ import lombok.*;
import java.time.LocalDateTime;
/**
* 砍价记录 DO
* 砍价记录 DO TODO
*
* @author HUIHUI
*/

View File

@@ -52,7 +52,7 @@ public class CombinationRecordDO extends BaseDO {
/**
* 团长编号
*
* 关联 {@link CombinationRecordDO#getUserId()}
* 关联 {@link CombinationRecordDO#getId()}
*/
private Long headId;
/**

View File

@@ -1,12 +1,9 @@
package cn.iocoder.yudao.module.promotion.dal.mysql.bargain;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainRecordDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 砍价记录 Mapper
*
@@ -15,34 +12,4 @@ import java.util.List;
@Mapper
public interface BargainRecordMapper extends BaseMapperX<BargainRecordDO> {
// TODO @puhui999selectByUserIdAndOrderId
default BargainRecordDO selectRecord(Long userId, Long orderId) {
return selectOne(BargainRecordDO::getUserId, userId,
BargainRecordDO::getOrderId, orderId);
}
/**
* 查询砍价记录
*
* @param headId 团长编号
* @param activityId 活动编号
* @return 砍价记录
*/
default BargainRecordDO selectRecordByHeadId(Long headId, Long activityId, Integer status) {
return selectOne(new LambdaQueryWrapperX<BargainRecordDO>()
.eq(BargainRecordDO::getUserId, headId)
.eq(BargainRecordDO::getActivityId, activityId)
.eq(BargainRecordDO::getStatus, status));
}
default List<BargainRecordDO> selectListByHeadIdAndStatus(Long headId, Integer status) {
return selectList(new LambdaQueryWrapperX<BargainRecordDO>()
//.eq(BargainRecordDO::getHeadId, headId)
.eq(BargainRecordDO::getStatus, status));
}
default List<BargainRecordDO> selectListByStatus(Integer status) {
return selectList(BargainRecordDO::getStatus, status);
}
}

View File

@@ -15,8 +15,7 @@ import java.util.List;
@Mapper
public interface CombinationRecordMapper extends BaseMapperX<CombinationRecordDO> {
// TODO @puhui999selectByUserIdAndOrderId
default CombinationRecordDO selectRecord(Long userId, Long orderId) {
default CombinationRecordDO selectByUserIdAndOrderId(Long userId, Long orderId) {
return selectOne(CombinationRecordDO::getUserId, userId,
CombinationRecordDO::getOrderId, orderId);
}

View File

@@ -48,14 +48,6 @@ public interface BargainActivityService {
*/
BargainActivityDO getBargainActivity(Long id);
/**
* 获得砍价活动列表
*
* @param ids 编号
* @return 砍价活动列表
*/
List<BargainActivityDO> getBargainActivityList(Collection<Long> ids);
/**
* 获得砍价活动分页
*

View File

@@ -1,10 +1,6 @@
package cn.iocoder.yudao.module.promotion.service.bargain;
import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainRecordDO;
import java.time.LocalDateTime;
/**
* 商品活动记录 service
*
@@ -12,40 +8,6 @@ import java.time.LocalDateTime;
*/
public interface BargainRecordService {
/**
* 更新砍价状态
*
* @param userId 用户编号
* @param orderId 订单编号
* @param status 状态
*/
void updateBargainRecordStatusByUserIdAndOrderId(Long userId, Long orderId, Integer status);
///**
// * 创建砍价记录
// *
// * @param reqDTO 创建信息
// */
//void createBargainRecord(BargainRecordCreateReqDTO reqDTO);
/**
* 更新砍价状态和开始时间
*
* @param userId 用户编号
* @param orderId 订单编号
* @param status 状态
* @param startTime 开始时间
*/
void updateBargainRecordStatusAndStartTimeByUserIdAndOrderId(Long userId, Long orderId,
Integer status, LocalDateTime startTime);
/**
* 获得砍价状态
*
* @param userId 用户编号
* @param orderId 订单编号
* @return 砍价状态
*/
BargainRecordDO getBargainRecord(Long userId, Long orderId);
// TODO
}

View File

@@ -18,7 +18,6 @@ import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.product.Bar
import cn.iocoder.yudao.module.promotion.convert.bargain.BargainActivityConvert;
import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainProductDO;
import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainRecordDO;
import cn.iocoder.yudao.module.promotion.dal.mysql.bargain.BargainActivityMapper;
import cn.iocoder.yudao.module.promotion.dal.mysql.bargain.BargainProductMapper;
import cn.iocoder.yudao.module.promotion.dal.mysql.bargain.BargainRecordMapper;
@@ -27,7 +26,6 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
@@ -186,11 +184,6 @@ public class BargainServiceImpl implements BargainActivityService, BargainRecord
return validateBargainActivityExists(id);
}
@Override
public List<BargainActivityDO> getBargainActivityList(Collection<Long> ids) {
return bargainActivityMapper.selectBatchIds(ids);
}
@Override
public PageResult<BargainActivityDO> getBargainActivityPage(BargainActivityPageReqVO pageReqVO) {
return bargainActivityMapper.selectPage(pageReqVO);
@@ -201,93 +194,4 @@ public class BargainServiceImpl implements BargainActivityService, BargainRecord
return bargainProductMapper.selectListByActivityIds(ids);
}
@Override
public void updateBargainRecordStatusByUserIdAndOrderId(Long userId, Long orderId, Integer status) {
// 校验砍价是否存在
// 更新状态
recordMapper.updateById(validateBargainRecord(userId, orderId).setStatus(status));
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateBargainRecordStatusAndStartTimeByUserIdAndOrderId(Long userId, Long orderId, Integer status, LocalDateTime startTime) {
BargainRecordDO recordDO = validateBargainRecord(userId, orderId);
// 更新状态
recordDO.setStatus(status);
// 更新开始时间
//recordDO.setStartTime(startTime);
//recordMapper.updateById(recordDO);
//
//// 更新砍价参入人数
//List<BargainRecordDO> recordDOs = recordMapper.selectListByHeadIdAndStatus(recordDO.getHeadId(), status);
//if (CollUtil.isNotEmpty(recordDOs)) {
// recordDOs.forEach(item -> {
// item.setUserCount(recordDOs.size());
// // 校验砍价是否满足要求
// if (ObjectUtil.equal(recordDOs.size(), recordDO.getUserSize())) {
// item.setStatus(BargainRecordStatusEnum.SUCCESS.getStatus());
// }
// });
//}
//recordMapper.updateBatch(recordDOs);
}
private BargainRecordDO validateBargainRecord(Long userId, Long orderId) {
// 校验砍价是否存在
BargainRecordDO recordDO = recordMapper.selectRecord(userId, orderId);
if (recordDO == null) {
throw exception(BARGAIN_RECORD_NOT_EXISTS);
}
return recordDO;
}
//@Override
//public void createBargainRecord(BargainRecordCreateReqDTO reqDTO) {
// // 1.1 校验砍价活动
// BargainActivityDO activity = validateBargainActivityExists(reqDTO.getActivityId());
// // 1.2 需要校验下,他当前是不是已经参加了该砍价;
// BargainRecordDO recordDO = recordMapper.selectRecord(reqDTO.getUserId(), reqDTO.getOrderId());
// if (recordDO != null) {
// throw exception(BARGAIN_RECORD_EXISTS);
// }
// // 1.3 父砍价是否存在,是否已经满了
// if (reqDTO.getHeadId() != null) {
// BargainRecordDO recordDO1 = recordMapper.selectRecordByHeadId(reqDTO.getHeadId(), reqDTO.getActivityId(), BargainRecordStatusEnum.IN_PROGRESS.getStatus());
// if (recordDO1 == null) {
// throw exception(BARGAIN_RECORD_HEAD_NOT_EXISTS);
// }
// // 校验砍价是否满足要求
// if (ObjectUtil.equal(recordDO1.getUserCount(), recordDO1.getUserSize())) {
// throw exception(BARGAIN_RECORD_USER_FULL);
// }
// }
// // TODO @puhui999应该还有一些校验后续补噶例如说一个团自己已经参与进去了不能再参与进去
//
// // 2. 创建砍价记录
// BargainRecordDO record = BargainActivityConvert.INSTANCE.convert(reqDTO);
// if (reqDTO.getHeadId() == null) {
// // TODO @puhui999不是自己呀headId 是父团长的 BargainRecordDO.id 哈
// record.setHeadId(reqDTO.getUserId());
// }
// record.setVirtualGroup(false);
// // TODO @puhui999过期时间应该是 Date 哈;
// record.setExpireTime(activity.getLimitDuration());
// record.setUserSize(activity.getUserSize());
// recordMapper.insert(record);
//}
@Override
public BargainRecordDO getBargainRecord(Long userId, Long orderId) {
return validateBargainRecord(userId, orderId);
}
/**
* APP 端获取开团记录
*
* @return 开团记录
*/
public List<BargainRecordDO> getRecordListByStatus(Integer status) {
return recordMapper.selectListByStatus(status);
}
}

View File

@@ -1,10 +1,9 @@
package cn.iocoder.yudao.module.promotion.service.combination;
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordUpdateReqDTO;
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationRecordDO;
import java.time.LocalDateTime;
/**
* 商品活动记录 service
*
@@ -15,11 +14,9 @@ public interface CombinationRecordService {
/**
* 更新拼团状态
*
* @param userId 用户编号
* @param orderId 订单编号
* @param status 状态
* @param reqDTO 请求 DTO
*/
void updateCombinationRecordStatusByUserIdAndOrderId(Long userId, Long orderId, Integer status);
void updateCombinationRecordStatusByUserIdAndOrderId(CombinationRecordUpdateReqDTO reqDTO);
/**
* 创建拼团记录
@@ -31,13 +28,9 @@ public interface CombinationRecordService {
/**
* 更新拼团状态和开始时间
*
* @param userId 用户编号
* @param orderId 订单编号
* @param status 状态
* @param startTime 开始时间
* @param reqDTO 请求 DTO
*/
void updateCombinationRecordStatusAndStartTimeByUserIdAndOrderId(Long userId, Long orderId,
Integer status, LocalDateTime startTime);
void updateCombinationRecordStatusAndStartTimeByUserIdAndOrderId(CombinationRecordUpdateReqDTO reqDTO);
/**
* 获得拼团状态

View File

@@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordUpdateReqDTO;
import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO;
import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO;
import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO;
@@ -29,7 +30,6 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
@@ -204,27 +204,27 @@ public class CombinationServiceImpl implements CombinationActivityService, Combi
}
@Override
public void updateCombinationRecordStatusByUserIdAndOrderId(Long userId, Long orderId, Integer status) {
public void updateCombinationRecordStatusByUserIdAndOrderId(CombinationRecordUpdateReqDTO reqDTO) {
// 校验拼团是否存在
CombinationRecordDO recordDO = validateCombinationRecord(userId, orderId);
CombinationRecordDO recordDO = validateCombinationRecord(reqDTO.getUserId(), reqDTO.getOrderId());
// 更新状态
recordDO.setStatus(status);
recordDO.setStatus(reqDTO.getStatus());
recordMapper.updateById(recordDO);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateCombinationRecordStatusAndStartTimeByUserIdAndOrderId(Long userId, Long orderId, Integer status, LocalDateTime startTime) {
CombinationRecordDO recordDO = validateCombinationRecord(userId, orderId);
public void updateCombinationRecordStatusAndStartTimeByUserIdAndOrderId(CombinationRecordUpdateReqDTO reqDTO) {
CombinationRecordDO recordDO = validateCombinationRecord(reqDTO.getUserId(), reqDTO.getOrderId());
// 更新状态
recordDO.setStatus(status);
recordDO.setStatus(reqDTO.getStatus());
// 更新开始时间
recordDO.setStartTime(startTime);
recordDO.setStartTime(reqDTO.getStartTime());
recordMapper.updateById(recordDO);
// 更新拼团参入人数
List<CombinationRecordDO> recordDOs = recordMapper.selectListByHeadIdAndStatus(recordDO.getHeadId(), status);
List<CombinationRecordDO> recordDOs = recordMapper.selectListByHeadIdAndStatus(recordDO.getHeadId(), reqDTO.getStatus());
if (CollUtil.isNotEmpty(recordDOs)) {
recordDOs.forEach(item -> {
item.setUserCount(recordDOs.size());
@@ -239,7 +239,7 @@ public class CombinationServiceImpl implements CombinationActivityService, Combi
private CombinationRecordDO validateCombinationRecord(Long userId, Long orderId) {
// 校验拼团是否存在
CombinationRecordDO recordDO = recordMapper.selectRecord(userId, orderId);
CombinationRecordDO recordDO = recordMapper.selectByUserIdAndOrderId(userId, orderId);
if (recordDO == null) {
throw exception(COMBINATION_RECORD_NOT_EXISTS);
}
@@ -251,7 +251,7 @@ public class CombinationServiceImpl implements CombinationActivityService, Combi
// 1.1 校验拼团活动
CombinationActivityDO activity = validateCombinationActivityExists(reqDTO.getActivityId());
// 1.2 需要校验下,他当前是不是已经参加了该拼团;
CombinationRecordDO recordDO = recordMapper.selectRecord(reqDTO.getUserId(), reqDTO.getOrderId());
CombinationRecordDO recordDO = recordMapper.selectByUserIdAndOrderId(reqDTO.getUserId(), reqDTO.getOrderId());
if (recordDO != null) {
throw exception(COMBINATION_RECORD_EXISTS);
}
@@ -270,10 +270,6 @@ public class CombinationServiceImpl implements CombinationActivityService, Combi
// 2. 创建拼团记录
CombinationRecordDO record = CombinationActivityConvert.INSTANCE.convert(reqDTO);
if (reqDTO.getHeadId() == null) {
// TODO @puhui999不是自己呀headId 是父团长的 CombinationRecordDO.id 哈
record.setHeadId(reqDTO.getUserId());
}
record.setVirtualGroup(false);
// TODO @puhui999过期时间应该是 Date 哈;
record.setExpireTime(activity.getLimitDuration());