mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-08-16 03:01:53 +08:00
feat:拼团订单集成
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
package cn.iocoder.yudao.module.promotion.api.combination;
|
||||
|
||||
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordReqDTO;
|
||||
import cn.iocoder.yudao.module.promotion.service.combination.CombinationActivityService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* 拼团活动 API 实现类
|
||||
*
|
||||
* @author HUIHUI
|
||||
*/
|
||||
@Service
|
||||
public class CombinationApiImpl implements CombinationApi {
|
||||
@Resource
|
||||
private CombinationActivityService activityService;
|
||||
|
||||
@Override
|
||||
public void createRecord(CombinationRecordReqDTO reqDTO) {
|
||||
activityService.createRecord(reqDTO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateRecordStatus(Long userId, Long orderId, Integer status) {
|
||||
activityService.updateRecordStatusByUserIdAndOrderId(userId, orderId, status);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateRecordStatusAndStartTime(Long userId, Long orderId, Integer status) {
|
||||
activityService.updateRecordStatusAndStartTimeByUserIdAndOrderId(userId, orderId, status, LocalDateTime.now());
|
||||
}
|
||||
|
||||
|
||||
}
|
@@ -37,9 +37,9 @@ public class CombinationActivityBaseVO {
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime[] activityTime;
|
||||
|
||||
@Schema(description = "参与人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "25222")
|
||||
@NotNull(message = "参与人数不能为空")
|
||||
private Integer orderUserCount;
|
||||
@Schema(description = "开团人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "25222")
|
||||
@NotNull(message = "开团人数不能为空")
|
||||
private Integer userSize;
|
||||
|
||||
@Schema(description = "限制时长(小时)", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "限制时长(小时)不能为空")
|
||||
|
@@ -37,7 +37,7 @@ public class CombinationActivityExcelVO {
|
||||
@ExcelProperty("结束时间")
|
||||
private LocalDateTime endTime;
|
||||
|
||||
@ExcelProperty("购买人数")
|
||||
@ExcelProperty("开团人数")
|
||||
private Integer userSize;
|
||||
|
||||
@ExcelProperty("开团组数")
|
||||
|
@@ -32,7 +32,7 @@ public class CombinationActivityExportReqVO {
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime[] endTime;
|
||||
|
||||
@Schema(description = "购买人数")
|
||||
@Schema(description = "开团人数")
|
||||
private Integer userSize;
|
||||
|
||||
@Schema(description = "开团组数")
|
||||
|
@@ -37,7 +37,7 @@ public class CombinationActivityPageReqVO extends PageParam {
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime[] endTime;
|
||||
|
||||
@Schema(description = "购买人数")
|
||||
@Schema(description = "开团人数")
|
||||
private Integer userSize;
|
||||
|
||||
@Schema(description = "开团组数")
|
||||
|
@@ -29,8 +29,8 @@ public class CombinationActivityRespVO extends CombinationActivityBaseVO {
|
||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Schema(description = "购买人数", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "购买人数不能为空")
|
||||
@Schema(description = "开团人数", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "开团人数不能为空")
|
||||
private Integer userSize;
|
||||
|
||||
@Schema(description = "开团组数", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@@ -46,7 +46,7 @@ public class CombinationActivityRespVO extends CombinationActivityBaseVO {
|
||||
private Integer virtualGroup;
|
||||
|
||||
@Schema(description = "活动状态:0开启 1关闭", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
|
||||
@NotNull(message = "活动状态:0开启 1关闭不能为空")
|
||||
@NotNull(message = "活动状态不能为空")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "拼团商品", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
|
@@ -4,6 +4,7 @@ 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;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityExcelVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityRespVO;
|
||||
@@ -13,6 +14,7 @@ import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.product
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.product.CombinationProductUpdateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.combinationactivity.CombinationActivityDO;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.combinationactivity.CombinationProductDO;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.combinationactivity.CombinationRecordDO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mapping;
|
||||
import org.mapstruct.Mappings;
|
||||
@@ -121,4 +123,6 @@ public interface CombinationActivityConvert {
|
||||
return list;
|
||||
}
|
||||
|
||||
CombinationRecordDO convert(CombinationRecordReqDTO reqDTO);
|
||||
|
||||
}
|
||||
|
@@ -54,7 +54,7 @@ public class CombinationActivityDO extends BaseDO {
|
||||
*/
|
||||
private LocalDateTime endTime;
|
||||
/**
|
||||
* 购买人数
|
||||
* 几人团
|
||||
*/
|
||||
private Integer userSize;
|
||||
/**
|
||||
|
@@ -0,0 +1,105 @@
|
||||
package cn.iocoder.yudao.module.promotion.dal.dataobject.combination.combinationactivity;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import com.baomidou.mybatisplus.annotation.KeySequence;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* 拼团记录 DO
|
||||
*
|
||||
* @author HUIHUI
|
||||
*/
|
||||
@TableName("promotion_combination_record")
|
||||
@KeySequence("promotion_combination_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class CombinationRecordDO extends BaseDO {
|
||||
|
||||
@TableId
|
||||
private Long id;
|
||||
/**
|
||||
* 拼团活动编号
|
||||
*/
|
||||
private Long activityId;
|
||||
/**
|
||||
* spu 编号
|
||||
*/
|
||||
private Long spuId;
|
||||
/**
|
||||
* sku 编号
|
||||
*/
|
||||
private Long skuId;
|
||||
/**
|
||||
* 用户编号
|
||||
*/
|
||||
private Long userId;
|
||||
/**
|
||||
* 订单编号
|
||||
*/
|
||||
private Long orderId;
|
||||
/**
|
||||
* 团长编号
|
||||
* <p>
|
||||
* 关联 {@link CombinationRecordDO#getUserId()}
|
||||
*/
|
||||
private Long headId;
|
||||
/**
|
||||
* 商品名字
|
||||
*/
|
||||
private String spuName;
|
||||
/**
|
||||
* 商品图片
|
||||
*/
|
||||
private String picUrl;
|
||||
/**
|
||||
* 拼团商品单价
|
||||
*/
|
||||
private Integer combinationPrice;
|
||||
/**
|
||||
* 用户昵称
|
||||
*/
|
||||
private String nickname;
|
||||
/**
|
||||
* 用户头像
|
||||
*/
|
||||
private String avatar;
|
||||
/**
|
||||
* 开团状态: 正在开团 拼团成功 拼团失败
|
||||
*/
|
||||
private Integer status;
|
||||
/**
|
||||
* 是否虚拟成团
|
||||
*/
|
||||
private Boolean virtualGroup;
|
||||
/**
|
||||
* 过期时间,单位:小时
|
||||
* 关联关联 {@link CombinationActivityDO#getLimitDuration()}
|
||||
*/
|
||||
private Integer expireTime;
|
||||
/**
|
||||
* 开始时间 (订单付款后开始的时间)
|
||||
*/
|
||||
private LocalDateTime startTime;
|
||||
/**
|
||||
* 结束时间(成团时间/失败时间)
|
||||
*/
|
||||
private LocalDateTime endTime;
|
||||
/**
|
||||
* 开团需要人数
|
||||
* 关联 {@link CombinationActivityDO#getUserSize()}
|
||||
*/
|
||||
private Integer userSize;
|
||||
/**
|
||||
* 已加入拼团人数
|
||||
*/
|
||||
private Integer userCount;
|
||||
|
||||
}
|
@@ -0,0 +1,19 @@
|
||||
package cn.iocoder.yudao.module.promotion.dal.mysql.combination.combinationactivity;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.combinationactivity.CombinationRecordDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
/**
|
||||
* 拼团记录 Mapper
|
||||
*
|
||||
* @author HUIHUI
|
||||
*/
|
||||
@Mapper
|
||||
public interface CombinationRecordMapper extends BaseMapperX<CombinationRecordDO> {
|
||||
|
||||
default CombinationRecordDO selectRecord(Long userId, Long orderId) {
|
||||
return selectOne(CombinationRecordDO::getUserId, userId, CombinationRecordDO::getOrderId, orderId);
|
||||
}
|
||||
|
||||
}
|
@@ -1,6 +1,7 @@
|
||||
package cn.iocoder.yudao.module.promotion.service.combination;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordReqDTO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityExportReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO;
|
||||
@@ -9,6 +10,7 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.combinationa
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.combinationactivity.CombinationProductDO;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@@ -80,4 +82,31 @@ public interface CombinationActivityService {
|
||||
* @return 拼团活动的商品列表
|
||||
*/
|
||||
List<CombinationProductDO> getProductsByActivityIds(Collection<Long> ids);
|
||||
|
||||
/**
|
||||
* 更新拼团状态
|
||||
*
|
||||
* @param userId 用户编号
|
||||
* @param orderId 订单编号
|
||||
* @param status 状态
|
||||
*/
|
||||
void updateRecordStatusByUserIdAndOrderId(Long userId, Long orderId, Integer status);
|
||||
|
||||
/**
|
||||
* 更新拼团状态和开始时间
|
||||
*
|
||||
* @param userId 用户编号
|
||||
* @param orderId 订单编号
|
||||
* @param status 状态
|
||||
* @param startTime 开始时间
|
||||
*/
|
||||
void updateRecordStatusAndStartTimeByUserIdAndOrderId(Long userId, Long orderId, Integer status, LocalDateTime startTime);
|
||||
|
||||
/**
|
||||
* 创建拼团记录
|
||||
*
|
||||
* @param reqDTO 创建信息
|
||||
*/
|
||||
void createRecord(CombinationRecordReqDTO reqDTO);
|
||||
|
||||
}
|
||||
|
@@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
|
||||
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.CombinationRecordReqDTO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityExportReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO;
|
||||
@@ -19,12 +20,15 @@ import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.product
|
||||
import cn.iocoder.yudao.module.promotion.convert.combination.CombinationActivityConvert;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.combinationactivity.CombinationActivityDO;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.combinationactivity.CombinationProductDO;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.combinationactivity.CombinationRecordDO;
|
||||
import cn.iocoder.yudao.module.promotion.dal.mysql.combination.combinationactivity.CombinationActivityMapper;
|
||||
import cn.iocoder.yudao.module.promotion.dal.mysql.combination.combinationactivity.CombinationProductMapper;
|
||||
import cn.iocoder.yudao.module.promotion.dal.mysql.combination.combinationactivity.CombinationRecordMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
@@ -46,6 +50,8 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
|
||||
@Resource
|
||||
private CombinationActivityMapper combinationActivityMapper;
|
||||
@Resource
|
||||
private CombinationRecordMapper recordMapper;
|
||||
@Resource
|
||||
private CombinationProductMapper combinationProductMapper;
|
||||
@Resource
|
||||
private ProductSpuApi productSpuApi;
|
||||
@@ -66,7 +72,6 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
|
||||
// 插入拼团活动
|
||||
CombinationActivityDO activityDO = CombinationActivityConvert.INSTANCE.convert(createReqVO);
|
||||
// TODO 营销相关属性初始化
|
||||
activityDO.setUserSize(0);
|
||||
activityDO.setTotalNum(0);
|
||||
activityDO.setSuccessNum(0);
|
||||
activityDO.setOrderUserCount(0);
|
||||
@@ -201,4 +206,46 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
|
||||
return combinationProductMapper.selectListByActivityIds(ids);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateRecordStatusByUserIdAndOrderId(Long userId, Long orderId, Integer status) {
|
||||
// 校验拼团是否存在
|
||||
CombinationRecordDO recordDO = validateCombinationRecord(userId, orderId);
|
||||
|
||||
// 更新状态
|
||||
recordDO.setStatus(status);
|
||||
recordMapper.updateById(recordDO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateRecordStatusAndStartTimeByUserIdAndOrderId(Long userId, Long orderId, Integer status, LocalDateTime startTime) {
|
||||
CombinationRecordDO recordDO = validateCombinationRecord(userId, orderId);
|
||||
|
||||
// 更新状态
|
||||
recordDO.setStatus(status);
|
||||
// 更新开始时间
|
||||
recordDO.setStartTime(startTime);
|
||||
recordMapper.updateById(recordDO);
|
||||
}
|
||||
|
||||
private CombinationRecordDO validateCombinationRecord(Long userId, Long orderId) {
|
||||
// 校验拼团是否存在
|
||||
CombinationRecordDO recordDO = recordMapper.selectRecord(userId, orderId);
|
||||
if (recordDO == null) {
|
||||
throw exception(COMBINATION_RECORD_NOT_EXISTS);
|
||||
}
|
||||
return recordDO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createRecord(CombinationRecordReqDTO reqDTO) {
|
||||
// 校验拼团活动
|
||||
CombinationActivityDO activityDO = validateCombinationActivityExists(reqDTO.getActivityId());
|
||||
|
||||
CombinationRecordDO recordDO = CombinationActivityConvert.INSTANCE.convert(reqDTO);
|
||||
recordDO.setVirtualGroup(false);
|
||||
recordDO.setExpireTime(activityDO.getLimitDuration());
|
||||
recordDO.setUserSize(activityDO.getUserSize());
|
||||
recordMapper.insert(recordDO);
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user