砍价活动第一版本

This commit is contained in:
pikachu 2021-07-12 23:38:32 +08:00
parent 0e7a4ee06c
commit 7f08124afc
25 changed files with 1129 additions and 115 deletions

View File

@ -0,0 +1,58 @@
package cn.lili.controller.promotion;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.promotion.entity.dos.KanJiaActivity;
import cn.lili.modules.promotion.entity.dos.KanJiaActivityLog;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityQuery;
import cn.lili.modules.promotion.service.KanJiaActivityService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 买家端,砍价活动
*
* @author qiuqiu
* @date 2021/7/12
**/
@RestController
@Api(tags = "买家端,砍价活动参与记录接口")
@RequestMapping("/buyer/promotion/kanJiaActivity")
public class KanJiaActivityBuyerController {
@Autowired
private KanJiaActivityService kanJiaActivityService;
@GetMapping
@ApiOperation(value = "分页获取为参与的砍价活动")
public ResultMessage<IPage<KanJiaActivity>> getPointsGoodsPage(KanJiaActivityQuery kanJiaActivityQuery, PageVO page) {
// 会员端查询到的肯定是已经开始的活动商品
kanJiaActivityQuery.setMemberId(UserContext.getCurrentUser().getId());
IPage<KanJiaActivity> kanJiaActivityIPage = kanJiaActivityService.getForPage(kanJiaActivityQuery, page);
return ResultUtil.data(kanJiaActivityIPage);
}
@PostMapping
@ApiOperation(value = "发起砍价活动")
public ResultMessage<KanJiaActivityLog> launchKanJiaActivity(String skuId) {
KanJiaActivityLog kanJiaActivityLog = kanJiaActivityService.add(skuId);
return ResultUtil.data(kanJiaActivityLog);
}
@PostMapping("/help")
@ApiOperation(value = "帮砍一刀")
public ResultMessage<KanJiaActivityLog> helpKanJia(String kanJiaActivityId) {
KanJiaActivityLog kanJiaActivityLog = kanJiaActivityService.helpKanJia(kanJiaActivityId);
return ResultUtil.data(kanJiaActivityLog);
}
}

View File

@ -0,0 +1,46 @@
package cn.lili.controller.promotion;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.promotion.entity.dos.KanJiaActivity;
import cn.lili.modules.promotion.entity.dos.KanJiaActivityLog;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityLogQuery;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityQuery;
import cn.lili.modules.promotion.service.KanJiaActivityLogService;
import cn.lili.modules.promotion.service.KanJiaActivityService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 买家端,砍价活动
*
* @author qiuqiu
* @date 2021/7/12
**/
@RestController
@Api(tags = "买家端,砍价活动帮砍记录接口")
@RequestMapping("/buyer/promotion/kanJiaActivityLog")
public class KanJiaActivityLogBuyerController {
@Autowired
private KanJiaActivityLogService kanJiaActivityLogService;
@GetMapping
@ApiOperation(value = "分页获取为参与的帮砍记录")
public ResultMessage<IPage<KanJiaActivityLog>> getPointsGoodsPage(KanJiaActivityLogQuery kanJiaActivityLogQuery, PageVO page) {
// 会员端查询到的肯定是已经开始的活动商品
kanJiaActivityLogQuery.setMemberId(UserContext.getCurrentUser().getId());
IPage<KanJiaActivityLog> kanJiaActivityLogIPage = kanJiaActivityLogService.getForPage(kanJiaActivityLogQuery, page);
return ResultUtil.data(kanJiaActivityLogIPage);
}
}

View File

@ -0,0 +1,42 @@
package cn.lili.controller.promotion;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityGoodsDTO;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.entity.vos.KanJiaActivityGoodsParams;
import cn.lili.modules.promotion.service.KanJiaActivityGoodsService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 买家端,砍价活动商品
*
* @author qiuqiu
* @date 2021/7/12
**/
@RestController
@Api(tags = "买家端,砍价商品接口")
@RequestMapping("/buyer/promotion/kanJiaGoods")
public class KanJiaGoodsActivityBuyerController {
@Autowired
private KanJiaActivityGoodsService kanJiaActivityGoodsService;
@GetMapping
@ApiOperation(value = "分页获取砍价商品")
public ResultMessage<IPage<KanJiaActivityGoodsDTO>> getPointsGoodsPage(KanJiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO page) {
// 会员端查询到的肯定是已经开始的活动商品
kanJiaActivityGoodsParams.setPromotionStatus(PromotionStatusEnum.START.name());
IPage<KanJiaActivityGoodsDTO> kanJiaActivityGoodsDTOIPage = kanJiaActivityGoodsService.getForPage(kanJiaActivityGoodsParams, page);
return ResultUtil.data(kanJiaActivityGoodsDTOIPage);
}
}

View File

@ -327,8 +327,16 @@ public enum ResultCode {
/**
* 砍价活动
*/
KANJIIA_GOODS_ACTIVE_STOCK_ERROR(48001, "活动库存数量不能高于商品库存"),
KANJIIA_GOODS_ACTIVE_PRICE_ERROR(48001, "活动库存数量不能高于商品库存"),
KANJIA_GOODS_ACTIVE_STOCK_ERROR(48001, "活动库存数量不能高于商品库存"),
KANJIA_GOODS_ACTIVE_PRICE_ERROR(48002, "最低购买金额不能高于商品金额"),
KANJIA_GOODS_ACTIVE_HIGHEST_PRICE_ERROR(48003, "最高砍价金额不能为0且不能超过商品金额"),
KANJIA_GOODS_ACTIVE_LOWEST_PRICE_ERROR(48004, "最低砍价金额不能为0且不能超过商品金额"),
KANJIA_GOODS_ACTIVE_HIGHEST_LOWEST_PRICE_ERROR(48005, "最低砍价金额不能高于最高砍价金额"),
KANJIA_GOODS_ACTIVE_SETTLEMENT_PRICE_ERROR(48006, "结算金额不能高于商品金额"),
KANJIA_GOODS_DELETE_ERROR(48007, "删除砍价商品异常"),
KANJIA_ACTIVITY_NOT_FOUND_ERROR(48008, "砍价记录不存在"),
KANJIA_ACTIVITY_LOG_MEMBER_ERROR(48009, "当前会员已经帮砍"),
KANJIA_ACTIVITY_MEMBER_ERROR(48010, "当前会员已经发起此砍价商品活动"),
/**
* 店铺
*/

View File

@ -0,0 +1,53 @@
package cn.lili.modules.promotion.entity.dos;
import cn.lili.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
* 砍价活动参与实体类
*
* @author qiuqiu
* @date 2020-7-1 10:44 上午
*/
@Data
@Entity
@Table(name = "li_kanjia_activity")
@TableName("li_kanjia_activity")
@ApiModel(value = "砍价活动参与对象")
public class KanJiaActivity extends BaseEntity {
private static final long serialVersionUID = -1583030890805926292L;
@ApiModelProperty(value = "砍价商品id")
private String kanJiaActivityGoodsId;
@ApiModelProperty(value = "参与砍价活动会员id")
private String memberId;
@ApiModelProperty(value = "参与砍价活动会员名称")
private String memberName;
@ApiModelProperty(value = "剩余购买金额")
private Double surplusPrice;
@ApiModelProperty(value = "砍价商品skuId")
private String skuId;
@ApiModelProperty(value = "货品名称")
private String goodsName;
@ApiModelProperty(value = "缩略图")
private String thumbnail;
@ApiModelProperty(value = "我的砍价状态")
private String status;
}

View File

@ -1,7 +1,6 @@
package cn.lili.modules.promotion.entity.dos;
import cn.lili.base.BaseEntity;
import cn.lili.modules.promotion.entity.dto.BasePromotion;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
@ -12,6 +11,7 @@ import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Date;
@ -25,18 +25,21 @@ import java.util.Date;
@Entity
@Table(name = "li_kanjia_activity_goods")
@TableName("li_kanjia_activity_goods")
@ApiModel(value = "砍价活动对象")
@ApiModel(value = "砍价活动商品对象")
public class KanJiaActivityGoods extends BaseEntity {
private static final long serialVersionUID = 6694714877345423488L;
@ApiModelProperty(value = "结算价格")
@NotEmpty(message = "结算价格不能为空")
private Double settlementPrice;
@ApiModelProperty(value = "最低购买金额")
@NotEmpty(message = "最低购买金额不能为空")
private Double purchasePrice;
@ApiModelProperty(value = "货品id")
@NotEmpty(message = "货品id不能为空")
private String skuId;
@ApiModelProperty(value = "货品名称")
@ -46,12 +49,15 @@ public class KanJiaActivityGoods extends BaseEntity {
private String thumbnail;
@ApiModelProperty(value = "活动库存")
@NotEmpty(message = "活动库存不能为空")
private Integer stock;
@ApiModelProperty(value = "每人最低砍价金额")
@NotEmpty(message = "每人最低砍价金额不能为空")
private Double lowestPrice;
@ApiModelProperty(value = "每人最高砍价金额")
@NotEmpty(message = "每人最高砍价金额不能为空")
private Double highestPrice;
/**

View File

@ -0,0 +1,53 @@
package cn.lili.modules.promotion.entity.dos;
import cn.lili.base.BaseEntity;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* 砍价活动商品实体类
*
* @author qiuqiu
* @date 2020-7-1 10:44 上午
*/
@Data
@Entity
@Table(name = "li_kanjia_activity_log")
@TableName("li_kanjia_activity_log")
@ApiModel(value = "砍价活动日志对象")
public class KanJiaActivityLog extends BaseEntity {
private static final long serialVersionUID = 3977352717995562783L;
@ApiModelProperty(value = "砍价活动参与记录id")
private String kanJiaActivityId;
@ApiModelProperty(value = "砍价会员id")
private String kanJiaMemberId;
@ApiModelProperty(value = "砍价会员名称")
private String kanJiaMemberName;
@ApiModelProperty(value = "砍价会员头像")
private String kanJiaMemberFace;
@ApiModelProperty(value = "砍价金额")
private Double kanJiaPrice;
@ApiModelProperty(value = "剩余购买金额")
private Double surplusPrice;
}

View File

@ -0,0 +1,23 @@
package cn.lili.modules.promotion.entity.dto;
import cn.lili.modules.promotion.entity.dos.KanJiaActivityLog;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 砍价活动参与实体类
*
* @author qiuqiu
* @date 2020-7-1 10:44 上午
*/
@Data
@ApiModel(value = "砍价活动参与记录对象")
public class KanJiaActivityDTO extends KanJiaActivityLog {
@ApiModelProperty(value = "砍价金额")
private String kanJiaActivityGoodsId;
}

View File

@ -1,60 +1,26 @@
package cn.lili.modules.promotion.entity.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.promotion.entity.dos.KanJiaActivityGoods;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
import java.util.Date;
/**
* 砍价活动商品
* 砍价活动商品DTO
*
* @author qiuqiu
* @date 2020/8/21
**/
@Data
public class KanJiaActivityGoodsDTO implements Serializable {
public class KanJiaActivityGoodsDTO extends KanJiaActivityGoods implements Serializable {
private static final long serialVersionUID = 1969340823809319805L;
@ApiModelProperty(value = "结算价格")
@NotEmpty(message = "结算价格不能为空")
private Double settlementPrice;
@ApiModelProperty(value = "最低购买金额")
@NotEmpty(message = "最低购买金额不能为空")
private Double purchasePrice;
@ApiModelProperty(value = "货品id")
@NotEmpty(message = "货品id不能为空")
private String skuId;
@ApiModelProperty(value = "活动库存")
@NotEmpty(message = "活动库存不能为空")
private Integer stock;
@ApiModelProperty(value = "每人最低砍价金额")
@NotEmpty(message = "每人最低砍价金额不能为空")
private Double lowestPrice;
@NotEmpty(message = "每人最高砍价金额不能为空")
@ApiModelProperty(value = "每人最高砍价金额")
private Double highestPrice;
@Min(message = "活动开始时间不能为空", value = 0)
@ApiModelProperty(value = "活动开始时间", required = true)
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
@Min(message = "活动结束时间不能为空", value = 0)
@ApiModelProperty(value = "活动结束时间", required = true)
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
@ApiModelProperty(value = "商品规格详细信息")
private GoodsSku goodsSku;
}

View File

@ -1,39 +1,26 @@
package cn.lili.modules.promotion.entity.dto;
import cn.lili.modules.promotion.entity.dos.KanJiaActivityGoods;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 砍价活动通用类
* 砍价活动商品操作DTO
*
* @author qiuqiu
* @date 2020/8/21
**/
@Data
public class KanJiaActivityEditDTO implements Serializable {
public class KanJiaActivityGoodsOperationDTO implements Serializable {
private static final long serialVersionUID = -1378599087650538592L;
@NotEmpty(message = "活动名称不能为空")
@ApiModelProperty(value = "活动名称", required = true)
private String promotionName;
@ApiModelProperty(value = "每人最低砍价金额", required = true)
@NotEmpty(message = "每人最低砍价金额不能为空")
private Double lowestPrice;
@ApiModelProperty(value = "每人最高砍价金额", required = true)
@NotEmpty(message = "每人最高砍价金额不能为空")
private Double highestPrice;
@Min(message = "活动开始时间不能为空", value = 0)
@ApiModelProperty(value = "活动开始时间", required = true)
@ -46,6 +33,6 @@ public class KanJiaActivityEditDTO implements Serializable {
private Date endTime;
@ApiModelProperty(value = "砍价活动商品列表")
IPage<KanJiaActivityGoods> promotionGoodsList;
List<KanJiaActivityGoodsDTO> promotionGoodsList;
}

View File

@ -0,0 +1,42 @@
package cn.lili.modules.promotion.entity.dto;
import cn.hutool.core.text.CharSequenceUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 砍价活动参与实体类
*
* @author qiuqiu
* @date 2020-7-1 10:44 上午
*/
@Data
@ApiModel(value = "砍价活动参与记录查询对象")
public class KanJiaActivityLogQuery {
private static final long serialVersionUID = -1583030890805926292L;
@ApiModelProperty(value = "砍价发起活动id")
private String kanJiaActivityId;
@ApiModelProperty(value = "会员id", hidden = true)
private String memberId;
public <T> QueryWrapper<T> wrapper() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
if (CharSequenceUtil.isNotEmpty(kanJiaActivityId)) {
queryWrapper.like("kan_jia_activity_id", kanJiaActivityId);
}
if (memberId != null) {
queryWrapper.eq("kan_jia_member_id", memberId);
}
queryWrapper.eq("delete_flag", false);
queryWrapper.orderByDesc("create_time");
return queryWrapper;
}
}

View File

@ -0,0 +1,44 @@
package cn.lili.modules.promotion.entity.dto;
import cn.hutool.core.text.CharSequenceUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* 砍价活动参与实体类
*
* @author qiuqiu
* @date 2020-7-1 10:44 上午
*/
@Data
@ApiModel(value = "砍价活动参与记录查询对象")
public class KanJiaActivityQuery {
private static final long serialVersionUID = -1583030890805926292L;
@ApiModelProperty(value = "货品名称")
private String goodsName;
@ApiModelProperty(value = "会员id", hidden = true)
private String memberId;
public <T> QueryWrapper<T> wrapper() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
if (CharSequenceUtil.isNotEmpty(goodsName)) {
queryWrapper.like("goods_name", goodsName);
}
if (memberId != null) {
queryWrapper.eq("member_id", memberId);
}
queryWrapper.eq("delete_flag", false);
queryWrapper.orderByDesc("create_time");
return queryWrapper;
}
}

View File

@ -0,0 +1,22 @@
package cn.lili.modules.promotion.entity.enums;
/**
* 砍价活动状态状态枚举
*
* @author Chopper
* @date 2020-03-19 3:53 下午
*/
public enum KanJiaStatusEnum {
START("开始"), FAIL("失败"), SUCCESS("成功");
private final String description;
KanJiaStatusEnum(String str) {
this.description = str;
}
public String description() {
return description;
}
}

View File

@ -1,6 +1,14 @@
package cn.lili.modules.promotion.entity.vos;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.modules.promotion.entity.enums.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@ -9,6 +17,7 @@ import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.regex.Pattern;
/**
* 砍价活动商品查询通用类
@ -21,16 +30,18 @@ public class KanJiaActivityGoodsParams implements Serializable {
private static final long serialVersionUID = 1344104067705714289L;
@ApiModelProperty(value = "活动名称")
@ApiModelProperty(value = "活动商品")
private String goodsName;
@ApiModelProperty(value = "活动开始时间", required = true)
private Long startTime;
@ApiModelProperty(value = "活动结束时间", required = true)
private Long endTime;
@ApiModelProperty(value = "skuId")
private String skuId;
/**
* @see PromotionStatusEnum
*/
@ -57,5 +68,31 @@ public class KanJiaActivityGoodsParams implements Serializable {
}
public Query mongoQuery() {
Query query = new Query();
if (CharSequenceUtil.isNotEmpty(goodsName)) {
Pattern pattern = Pattern.compile("^.*" + goodsName + ".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("goodsSku.goodsName").regex(pattern));
}
if (CharSequenceUtil.isNotEmpty(promotionStatus)) {
query.addCriteria(Criteria.where("promotionStatus").is(promotionStatus));
}
if (CharSequenceUtil.isNotEmpty(skuId)) {
query.addCriteria(Criteria.where("skuId").is(skuId));
}
if (startTime != null && endTime != null) {
Criteria fromTime = Criteria.where("startTime").gte(new Date(startTime));
Criteria toTime = Criteria.where("endTime").lte(new Date(endTime));
query.addCriteria(fromTime);
query.addCriteria(toTime);
}
query.addCriteria(Criteria.where("deleteFlag").is(false));
Sort.Order order = new Sort.Order(Sort.Direction.DESC, "createTime");
query.with(Sort.by(order));
return query;
}
}

View File

@ -0,0 +1,24 @@
package cn.lili.modules.promotion.entity.vos;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.promotion.entity.dos.KanJiaActivityGoods;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 砍价商品视图对象
*
* @author paulG
* @date 2021/1/13
**/
@EqualsAndHashCode(callSuper = true)
@Data
public class KanJiaGoodsVO extends KanJiaActivityGoods {
private static final long serialVersionUID = -5163709626742905057L;
@ApiModelProperty(value = "商品规格详细信息")
private GoodsSku goodsSku;
}

View File

@ -0,0 +1,15 @@
package cn.lili.modules.promotion.mapper;
import cn.lili.modules.promotion.entity.dos.KanJiaActivityLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
*
* 砍价活动日志数据处理层
*
* @author qiuqiu
* @date 2021/7/1
*/
public interface KanJiaActivityLogMapper extends BaseMapper<KanJiaActivityLog> {
}

View File

@ -0,0 +1,15 @@
package cn.lili.modules.promotion.mapper;
import cn.lili.modules.promotion.entity.dos.KanJiaActivity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
*
* 砍价活动参与记录 数据处理层
*
* @author qiuqiu
* @date 2021/7/1
*/
public interface KanJiaActivityMapper extends BaseMapper<KanJiaActivity> {
}

View File

@ -2,8 +2,10 @@ package cn.lili.modules.promotion.service;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.promotion.entity.dos.KanJiaActivity;
import cn.lili.modules.promotion.entity.dos.KanJiaActivityGoods;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityGoodsDTO;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityGoodsOperationDTO;
import cn.lili.modules.promotion.entity.vos.KanJiaActivityGoodsParams;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
@ -26,7 +28,7 @@ public interface KanJiaActivityGoodsService extends IService<KanJiaActivityGoods
* @param kanJiaActivityGoodsDTOS 砍价商品
* @return 是否添加成功
*/
boolean add(List<KanJiaActivityGoodsDTO> kanJiaActivityGoodsDTOS);
boolean add(KanJiaActivityGoodsOperationDTO kanJiaActivityGoodsDTOS);
/**
* 查询砍价活动商品分页信息
@ -35,7 +37,38 @@ public interface KanJiaActivityGoodsService extends IService<KanJiaActivityGoods
* @param pageVO 分页信息
* @return 砍价商品
*/
IPage<KanJiaActivityGoods> getForPage(KanJiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO pageVO);
IPage<KanJiaActivityGoodsDTO> getForPage(KanJiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO pageVO);
/**
* 查询砍价活动商品
*
* @param goodsId 砍价活动商品id
* @return 砍价活动商品信息
*/
KanJiaActivityGoodsDTO getKanJiaGoodsDetail(String goodsId);
/**
* 修改看见商品信息
*
* @param kanJiaActivityGoodsDTO 砍价商品信息
* @return 是否修改成功
*/
boolean updateKanJiaActivityGoods(KanJiaActivityGoodsDTO kanJiaActivityGoodsDTO);
/**
* 删除砍价商品
*
* @param ids 砍价商品ids
* @return 是否删除成功
*/
boolean deleteKanJiaGoods(List<String> ids);
/**
* 根据skuID查询当前进行的砍价商品信息
*
* @param skuId 商品skuId
* @return
*/
KanJiaActivityGoodsDTO getKanJiaGoodsBySku(String skuId);
}

View File

@ -0,0 +1,36 @@
package cn.lili.modules.promotion.service;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.promotion.entity.dos.KanJiaActivityLog;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityDTO;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityLogQuery;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* 砍价活动日志业务层
*
* @author qiuqiu
* @date 2021/7/1 9:45 上午
*/
public interface KanJiaActivityLogService extends IService<KanJiaActivityLog> {
/**
* 根据砍价参与记录id查询砍价记录
*
* @param kanJiaActivityLogQuery 砍价活动帮砍信息
* @param pageVO 分页信息
* @return 砍价日志
*/
IPage<KanJiaActivityLog> getForPage(KanJiaActivityLogQuery kanJiaActivityLogQuery, PageVO pageVO);
/**
* 砍一刀
*
* @param kanJiaActivityDTO 砍价记录
* @return
*/
KanJiaActivityLog addKanJiaActivityLog(KanJiaActivityDTO kanJiaActivityDTO);
}

View File

@ -0,0 +1,47 @@
package cn.lili.modules.promotion.service;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.promotion.entity.dos.KanJiaActivity;
import cn.lili.modules.promotion.entity.dos.KanJiaActivityLog;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityGoodsDTO;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityQuery;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* 砍价活动参与记录业务层
*
* @author qiuqiu
* @date 2021/7/1 9:45 上午
*/
public interface KanJiaActivityService extends IService<KanJiaActivity> {
/**
* 发起人发起砍价活动
*
* @param skuId 商品skuId
* @return
*/
KanJiaActivityLog add(String skuId);
/**
* 帮砍
*
* @param kanJiaActivityId 活动id
* @return 砍价详细
*/
KanJiaActivityLog helpKanJia(String kanJiaActivityId);
/**
* 根据条件查询我参与的砍价活动
*
* @param kanJiaActivityQuery 砍价活动查询条件
* @param page 分页对象
* @return 我参与的砍价活动信息
*/
IPage<KanJiaActivity> getForPage(KanJiaActivityQuery kanJiaActivityQuery, PageVO page);
}

View File

@ -1,6 +1,7 @@
package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.util.StrUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.trigger.enums.DelayTypeEnums;
@ -9,7 +10,7 @@ import cn.lili.common.trigger.message.PromotionMessage;
import cn.lili.common.trigger.model.TimeExecuteConstant;
import cn.lili.common.trigger.model.TimeTriggerMsg;
import cn.lili.common.trigger.util.DelayQueueTools;
import cn.lili.common.utils.PageUtil;
import cn.lili.common.utils.DateUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.config.rocketmq.RocketmqCustomProperties;
import cn.lili.modules.goods.entity.dos.GoodsSku;
@ -17,17 +18,21 @@ import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.promotion.entity.dos.KanJiaActivityGoods;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityGoodsDTO;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityGoodsOperationDTO;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionTypeEnum;
import cn.lili.modules.promotion.entity.vos.KanJiaActivityGoodsParams;
import cn.lili.modules.promotion.entity.vos.PointsGoodsVO;
import cn.lili.modules.promotion.mapper.KanJiaActivityGoodsMapper;
import cn.lili.modules.promotion.service.KanJiaActivityGoodsService;
import cn.lili.modules.promotion.tools.PromotionTools;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -56,48 +61,40 @@ public class KanJiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
@Autowired
private TimeTrigger timeTrigger;
//Mongo
@Autowired
private MongoTemplate mongoTemplate;
@Override
public boolean add(List<KanJiaActivityGoodsDTO> kanJiaActivityGoodsDTOS) {
public boolean add(KanJiaActivityGoodsOperationDTO kanJiaActivityGoodsOperationDTO) {
List<KanJiaActivityGoods> kanJiaActivityGoodsList = new ArrayList<>();
for (KanJiaActivityGoodsDTO kanJiaActivityGoodsDTO : kanJiaActivityGoodsDTOS) {
for (KanJiaActivityGoodsDTO kanJiaActivityGoodsDTO : kanJiaActivityGoodsOperationDTO.getPromotionGoodsList()) {
//根据skuId查询商品信息
GoodsSku goodsSku = this.checkSkuExist(kanJiaActivityGoodsDTO.getSkuId());
//校验商品是否存在
if (goodsSku == null) {
throw new ServiceException(ResultCode.PROMOTION_GOODS_NOT_EXIT);
}
//校验商品状态
if (goodsSku.getMarketEnable().equals(GoodsStatusEnum.DOWN.name())) {
throw new ServiceException(ResultCode.GOODS_NOT_EXIST);
}
//校验活动库存是否超出此sku的库存
if (goodsSku.getQuantity() < kanJiaActivityGoodsDTO.getStock()) {
throw new ServiceException(ResultCode.POINT_GOODS_ACTIVE_STOCK_ERROR);
}
//校验最低购买金额不能高于商品金额
if (goodsSku.getPrice() < kanJiaActivityGoodsDTO.getPurchasePrice()) {
throw new ServiceException(ResultCode.KANJIIA_GOODS_ACTIVE_PRICE_ERROR);
}
//参数检测
this.checkParam(kanJiaActivityGoodsDTO, goodsSku);
//检测同一时间段是否存在相同的商品
PromotionTools.checkPromotionTime(kanJiaActivityGoodsDTO.getStartTime().getTime(), kanJiaActivityGoodsDTO.getEndTime().getTime());
//赋值保存
KanJiaActivityGoods kanJiaActivityGoods = new KanJiaActivityGoods();
kanJiaActivityGoods.setSkuId(kanJiaActivityGoodsDTO.getSkuId());
kanJiaActivityGoods.setThumbnail(goodsSku.getThumbnail());
kanJiaActivityGoods.setPurchasePrice(kanJiaActivityGoodsDTO.getPurchasePrice());
kanJiaActivityGoods.setSettlementPrice(kanJiaActivityGoodsDTO.getSettlementPrice());
kanJiaActivityGoods.setGoodsName(goodsSku.getGoodsName());
kanJiaActivityGoods.setStock(kanJiaActivityGoodsDTO.getStock());
kanJiaActivityGoods.setHighestPrice(kanJiaActivityGoodsDTO.getHighestPrice());
kanJiaActivityGoods.setLowestPrice(kanJiaActivityGoodsDTO.getLowestPrice());
kanJiaActivityGoodsList.add(kanJiaActivityGoods);
PromotionTools.checkPromotionTime(kanJiaActivityGoodsOperationDTO.getStartTime().getTime(), kanJiaActivityGoodsOperationDTO.getEndTime().getTime());
kanJiaActivityGoodsDTO.setStartTime(kanJiaActivityGoodsOperationDTO.getStartTime());
kanJiaActivityGoodsDTO.setEndTime(kanJiaActivityGoodsOperationDTO.getEndTime());
//检测同一时间段不能允许添加相同的商品
if (this.checkSkuDuplicate(goodsSku.getId(), kanJiaActivityGoodsDTO) != null) {
throw new ServiceException("商品id为" + goodsSku.getId() + "的商品已参加砍价商品活动!");
}
kanJiaActivityGoodsDTO.setGoodsSku(goodsSku);
kanJiaActivityGoodsDTO.setSkuId(kanJiaActivityGoodsDTO.getSkuId());
kanJiaActivityGoodsDTO.setThumbnail(goodsSku.getThumbnail());
kanJiaActivityGoodsDTO.setGoodsName(goodsSku.getGoodsName());
kanJiaActivityGoodsDTO.setPromotionStatus(PromotionStatusEnum.NEW.name());
kanJiaActivityGoodsList.add(kanJiaActivityGoodsDTO);
}
Boolean result = this.saveBatch(kanJiaActivityGoodsList);
if (result) {
//发送砍价延迟任务消息
for (KanJiaActivityGoods kanJiaActivityGoods : kanJiaActivityGoodsList) {
this.addKanJiaGoodsPromotionTask(kanJiaActivityGoods);
for (KanJiaActivityGoodsDTO kanJiaActivityGoodsDTO : kanJiaActivityGoodsOperationDTO.getPromotionGoodsList()) {
this.mongoTemplate.save(kanJiaActivityGoodsDTO);
this.addKanJiaGoodsPromotionTask(kanJiaActivityGoodsDTO);
}
}
return result;
@ -109,7 +106,7 @@ public class KanJiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
*
* @param kanJiaActivityGoods 砍价商品信息
*/
private void addKanJiaGoodsPromotionTask(KanJiaActivityGoods kanJiaActivityGoods) {
private void addKanJiaGoodsPromotionTask(KanJiaActivityGoodsDTO kanJiaActivityGoods) {
PromotionMessage promotionMessage = new PromotionMessage(kanJiaActivityGoods.getId(), PromotionTypeEnum.KAN_JIA.name(),
PromotionStatusEnum.START.name(),
kanJiaActivityGoods.getStartTime(), kanJiaActivityGoods.getEndTime());
@ -123,9 +120,19 @@ public class KanJiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
}
@Override
public IPage<KanJiaActivityGoods> getForPage(KanJiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO pageVO) {
QueryWrapper<KanJiaActivityGoods> queryWrapper = kanJiaActivityGoodsParams.wrapper();
return page(PageUtil.initPage(pageVO), queryWrapper);
public IPage<KanJiaActivityGoodsDTO> getForPage(KanJiaActivityGoodsParams kanJiaActivityGoodsParams, PageVO pageVO) {
IPage<KanJiaActivityGoodsDTO> kanJiaActivityGoodsDTOIPage = new Page<>();
Query query = kanJiaActivityGoodsParams.mongoQuery();
if (pageVO != null) {
PromotionTools.mongoQueryPageParam(query, pageVO);
kanJiaActivityGoodsDTOIPage.setSize(pageVO.getPageSize());
kanJiaActivityGoodsDTOIPage.setCurrent(pageVO.getPageNumber());
}
List<KanJiaActivityGoodsDTO> kanJiaActivityGoodsDTOS = this.mongoTemplate.find(query, KanJiaActivityGoodsDTO.class);
kanJiaActivityGoodsDTOIPage.setRecords(kanJiaActivityGoodsDTOS);
kanJiaActivityGoodsDTOIPage.setTotal(this.mongoTemplate.count(kanJiaActivityGoodsParams.mongoQuery(), KanJiaActivityGoodsDTO.class));
return kanJiaActivityGoodsDTOIPage;
}
@ -143,4 +150,157 @@ public class KanJiaActivityGoodsServiceImpl extends ServiceImpl<KanJiaActivityGo
}
return goodsSku;
}
/**
* 检查参与砍价商品参数
*
* @param kanJiaActivityGoodsDTO 砍价商品信息
* @param goodsSku 商品sku信息
*/
private void checkParam(KanJiaActivityGoodsDTO kanJiaActivityGoodsDTO, GoodsSku goodsSku) {
//校验商品是否存在
if (goodsSku == null) {
throw new ServiceException(ResultCode.PROMOTION_GOODS_NOT_EXIT);
}
//校验商品状态
if (goodsSku.getMarketEnable().equals(GoodsStatusEnum.DOWN.name())) {
throw new ServiceException(ResultCode.GOODS_NOT_EXIST);
}
//校验活动库存是否超出此sku的库存
if (goodsSku.getQuantity() < kanJiaActivityGoodsDTO.getStock()) {
throw new ServiceException(ResultCode.POINT_GOODS_ACTIVE_STOCK_ERROR);
}
//校验最低购买金额不能高于商品金额
if (goodsSku.getPrice() < kanJiaActivityGoodsDTO.getPurchasePrice()) {
throw new ServiceException(ResultCode.KANJIA_GOODS_ACTIVE_PRICE_ERROR);
}
//校验结算价格不能超过商品金额
if (goodsSku.getPrice() < kanJiaActivityGoodsDTO.getSettlementPrice()) {
throw new ServiceException(ResultCode.KANJIA_GOODS_ACTIVE_SETTLEMENT_PRICE_ERROR);
}
//校验最高砍价金额
if (kanJiaActivityGoodsDTO.getHighestPrice() > goodsSku.getPrice() || kanJiaActivityGoodsDTO.getHighestPrice() <= 0) {
throw new ServiceException(ResultCode.KANJIA_GOODS_ACTIVE_HIGHEST_PRICE_ERROR);
}
//校验最低砍价金额
if (kanJiaActivityGoodsDTO.getLowestPrice() > goodsSku.getPrice() || kanJiaActivityGoodsDTO.getLowestPrice() <= 0) {
throw new ServiceException(ResultCode.KANJIA_GOODS_ACTIVE_LOWEST_PRICE_ERROR);
}
//校验最低砍价金额不能高与最低砍价金额
if (kanJiaActivityGoodsDTO.getLowestPrice() > kanJiaActivityGoodsDTO.getHighestPrice()) {
throw new ServiceException(ResultCode.KANJIA_GOODS_ACTIVE_LOWEST_PRICE_ERROR);
}
}
/**
* 检查砍价商品是否重复存在
*
* @param skuId 商品SkuId
* @param kanJiaActivityGoodsDTO 砍价商品
* @return 积分商品信息
*/
private KanJiaActivityGoods checkSkuDuplicate(String skuId, KanJiaActivityGoodsDTO kanJiaActivityGoodsDTO) {
LambdaQueryWrapper<KanJiaActivityGoods> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(KanJiaActivityGoods::getSkuId, skuId);
if (kanJiaActivityGoodsDTO != null && StrUtil.isNotEmpty(kanJiaActivityGoodsDTO.getId())) {
queryWrapper.ne(KanJiaActivityGoods::getId, kanJiaActivityGoodsDTO.getId());
}
queryWrapper.ne(KanJiaActivityGoods::getPromotionStatus, PromotionStatusEnum.END.name());
queryWrapper.ge(KanJiaActivityGoods::getStartTime, kanJiaActivityGoodsDTO.getStartTime());
queryWrapper.le(KanJiaActivityGoods::getEndTime, kanJiaActivityGoodsDTO.getEndTime());
return this.getOne(queryWrapper);
}
@Override
public KanJiaActivityGoodsDTO getKanJiaGoodsDetail(String goodsId) {
KanJiaActivityGoodsDTO kanJiaActivityGoodsDTO = this.mongoTemplate.findById(goodsId, KanJiaActivityGoodsDTO.class);
if (kanJiaActivityGoodsDTO == null) {
log.error("id为" + goodsId + "的砍价商品不存在!");
throw new ServiceException();
}
return kanJiaActivityGoodsDTO;
}
@Override
public boolean updateKanJiaActivityGoods(KanJiaActivityGoodsDTO kanJiaActivityGoodsDTO) {
//校验砍价商品是否存在
KanJiaActivityGoodsDTO dbKanJiaActivityGoods = this.getKanJiaGoodsDetail(kanJiaActivityGoodsDTO.getId());
//校验当前活动是否已经开始,只有新建的未开始的活动可以编辑
if (!dbKanJiaActivityGoods.getPromotionStatus().equals(PromotionStatusEnum.NEW.name())) {
throw new ServiceException(ResultCode.PROMOTION_UPDATE_ERROR);
}
//获取当前sku信息
GoodsSku goodsSku = this.checkSkuExist(kanJiaActivityGoodsDTO.getSkuId());
//校验商品状态
if (goodsSku.getMarketEnable().equals(GoodsStatusEnum.DOWN.name())) {
throw new ServiceException(ResultCode.GOODS_NOT_EXIST);
}
//常规校验砍价商品参数
this.checkParam(kanJiaActivityGoodsDTO, goodsSku);
//检测开始结束时间是否正确
PromotionTools.checkPromotionTime(kanJiaActivityGoodsDTO.getStartTime().getTime(), kanJiaActivityGoodsDTO.getEndTime().getTime());
//检测同一时间段不能允许添加相同的商品
if (this.checkSkuDuplicate(goodsSku.getId(), kanJiaActivityGoodsDTO) != null) {
throw new ServiceException("商品id为" + goodsSku.getId() + "的商品已参加砍价商品活动!");
}
//修改数据库
boolean result = this.updateById(kanJiaActivityGoodsDTO);
//如果校验成功则发送修改延迟任务消息
if (result) {
this.mongoTemplate.save(kanJiaActivityGoodsDTO);
if (dbKanJiaActivityGoods.getStartTime().getTime() != kanJiaActivityGoodsDTO.getStartTime().getTime()) {
PromotionMessage promotionMessage = new PromotionMessage(kanJiaActivityGoodsDTO.getId(), PromotionTypeEnum.KAN_JIA.name(), PromotionStatusEnum.START.name(), kanJiaActivityGoodsDTO.getStartTime(), kanJiaActivityGoodsDTO.getEndTime());
//更新延时任务
this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR,
promotionMessage,
kanJiaActivityGoodsDTO.getStartTime().getTime(),
kanJiaActivityGoodsDTO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
DateUtil.getDelayTime(kanJiaActivityGoodsDTO.getStartTime().getTime()),
rocketmqCustomProperties.getPromotionTopic());
}
}
return result;
}
@Override
public boolean deleteKanJiaGoods(List<String> ids) {
List<String> skuIds = new ArrayList<>();
for (String id : ids) {
KanJiaActivityGoodsDTO kanJiaActivityGoodsDTO = this.getKanJiaGoodsDetail(id);
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR,
kanJiaActivityGoodsDTO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayTypeEnums.PROMOTION, (PromotionTypeEnum.KAN_JIA.name() + kanJiaActivityGoodsDTO.getId())),
rocketmqCustomProperties.getPromotionTopic());
skuIds.add(kanJiaActivityGoodsDTO.getSkuId());
}
boolean result = this.removeByIds(ids);
if (result) {
Query query = new Query();
query.addCriteria(new Criteria("id").in(ids));
this.mongoTemplate.remove(query, KanJiaActivityGoodsDTO.class);
}
return result;
}
@Override
public KanJiaActivityGoodsDTO getKanJiaGoodsBySku(String skuId) {
//构建查询条件
KanJiaActivityGoodsParams kanJiaActivityGoodsParams = new KanJiaActivityGoodsParams();
kanJiaActivityGoodsParams.setSkuId(skuId);
kanJiaActivityGoodsParams.setPromotionStatus(PromotionStatusEnum.START.name());
//查询相关数据
Query query = kanJiaActivityGoodsParams.mongoQuery();
List<KanJiaActivityGoodsDTO> kanJiaActivityGoodsDTOS = this.mongoTemplate.find(query, KanJiaActivityGoodsDTO.class);
// 为了担心会查到多条数据 所以查询集合 正常情况下只会查询到一条
if (kanJiaActivityGoodsDTOS.size() > 0) {
return kanJiaActivityGoodsDTOS.get(0);
}
return null;
}
}

View File

@ -0,0 +1,81 @@
package cn.lili.modules.promotion.serviceimpl;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.BeanUtil;
import cn.lili.common.utils.PageUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.promotion.entity.dos.KanJiaActivity;
import cn.lili.modules.promotion.entity.dos.KanJiaActivityGoods;
import cn.lili.modules.promotion.entity.dos.KanJiaActivityLog;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityDTO;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityLogQuery;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.mapper.KanJiaActivityLogMapper;
import cn.lili.modules.promotion.service.KanJiaActivityGoodsService;
import cn.lili.modules.promotion.service.KanJiaActivityLogService;
import cn.lili.modules.promotion.service.KanJiaActivityService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* 砍价活动日志业务层实现
*
* @author qiuqiu
* @date 2021/7/1
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class KanJiaActivityLogServiceImpl extends ServiceImpl<KanJiaActivityLogMapper, KanJiaActivityLog> implements KanJiaActivityLogService {
@Autowired
private KanJiaActivityGoodsService kanJiaActivityGoodsService;
@Autowired
private KanJiaActivityService kanJiaActivityService;
@Override
public IPage<KanJiaActivityLog> getForPage(KanJiaActivityLogQuery kanJiaActivityLogQuery, PageVO pageVO) {
QueryWrapper<KanJiaActivityLog> queryWrapper = kanJiaActivityLogQuery.wrapper();
return this.page(PageUtil.initPage(pageVO), queryWrapper);
}
@Override
public KanJiaActivityLog addKanJiaActivityLog(KanJiaActivityDTO kanJiaActivityDTO) {
//校验当前会员是否已经参与过此次砍价
QueryWrapper<KanJiaActivityLog> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(kanJiaActivityDTO.getKanJiaMemberId() != null, "kan_jia_member_id", kanJiaActivityDTO.getKanJiaMemberId());
queryWrapper.eq(kanJiaActivityDTO.getKanJiaActivityId() != null, "kan_jia_activity_id", kanJiaActivityDTO.getKanJiaActivityId());
Integer count = this.baseMapper.selectCount(queryWrapper);
if (count > 0) {
throw new ServiceException(ResultCode.KANJIA_ACTIVITY_LOG_MEMBER_ERROR);
}
//校验当前砍价商品是否有效
KanJiaActivityGoods kanJiaActivityGoods = kanJiaActivityGoodsService.getById(kanJiaActivityDTO.getKanJiaActivityGoodsId());
//如果当前活动不为空且还在活动时间内 才可以参与砍价活动
if (kanJiaActivityGoods != null && kanJiaActivityGoods.getPromotionStatus().equals(PromotionStatusEnum.START.name())) {
//获取砍价参与者记录
KanJiaActivity kanJiaActivity = kanJiaActivityService.getById(kanJiaActivityDTO.getKanJiaActivityId());
if (kanJiaActivity != null) {
KanJiaActivityLog kanJiaActivityLog = new KanJiaActivityLog();
kanJiaActivityLog.setKanJiaActivityId(kanJiaActivity.getId());
BeanUtil.copyProperties(kanJiaActivityDTO, kanJiaActivityLog);
boolean result = this.save(kanJiaActivityLog);
if (result) {
return kanJiaActivityLog;
}
}
throw new ServiceException(ResultCode.KANJIA_ACTIVITY_NOT_FOUND_ERROR);
}
throw new ServiceException(ResultCode.PROMOTION_STATUS_END);
}
}

View File

@ -0,0 +1,184 @@
package cn.lili.modules.promotion.serviceimpl;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.CurrencyUtil;
import cn.lili.common.utils.PageUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.promotion.entity.dos.KanJiaActivity;
import cn.lili.modules.promotion.entity.dos.KanJiaActivityGoods;
import cn.lili.modules.promotion.entity.dos.KanJiaActivityLog;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityDTO;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityQuery;
import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.mapper.KanJiaActivityMapper;
import cn.lili.modules.promotion.service.KanJiaActivityGoodsService;
import cn.lili.modules.promotion.service.KanJiaActivityLogService;
import cn.lili.modules.promotion.service.KanJiaActivityService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* 砍价活动参与记录业务层实现
*
* @author qiuqiu
* @date 2021/7/1
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class KanJiaActivityServiceImpl extends ServiceImpl<KanJiaActivityMapper, KanJiaActivity> implements KanJiaActivityService {
@Autowired
private KanJiaActivityGoodsService kanJiaActivityGoodsService;
@Autowired
private KanJiaActivityLogService kanJiaActivityLogService;
@Autowired
private MemberService memberService;
//规格商品
@Autowired
private GoodsSkuService goodsSkuService;
@Override
public KanJiaActivityLog add(String skuId) {
//根据skuId查询当前sku是否参与活动并且是在活动进行中
KanJiaActivityGoods kanJiaActivityGoods = kanJiaActivityGoodsService.getKanJiaGoodsBySku(skuId);
//只有砍价商品存在且已经开始的活动才可以发起砍价
if (kanJiaActivityGoods != null && kanJiaActivityGoods.getPromotionStatus().equals(PromotionStatusEnum.START.name())) {
//获取会员信息
Member member = memberService.getById(UserContext.getCurrentUser().getId());
//校验此活动是否已经发起过
QueryWrapper<KanJiaActivity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("kan_jia_activity_goods_id", kanJiaActivityGoods.getId());
queryWrapper.eq("member_id", member.getId());
if (this.count(queryWrapper) > 0) {
throw new ServiceException(ResultCode.KANJIA_ACTIVITY_MEMBER_ERROR);
}
KanJiaActivity kanJiaActivity = new KanJiaActivity();
//获取商品信息
GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(skuId);
if (goodsSku != null && member != null) {
kanJiaActivity.setSkuId(skuId);
kanJiaActivity.setGoodsName(goodsSku.getGoodsName());
kanJiaActivity.setKanJiaActivityGoodsId(kanJiaActivityGoods.getId());
kanJiaActivity.setThumbnail(goodsSku.getThumbnail());
kanJiaActivity.setMemberId(UserContext.getCurrentUser().getId());
kanJiaActivity.setMemberName(member.getUsername());
kanJiaActivity.setStatus(KanJiaStatusEnum.START.name());
//剩余砍价金额 开始 是商品金额-最低购买金额
Double surplusPrice = CurrencyUtil.sub(goodsSku.getPrice(), kanJiaActivityGoods.getPurchasePrice());
//获取砍价金额因为自己要给自己砍一刀 所以需要在可砍金额范围内 砍一刀
Double price = this.getKanJiaPrice(kanJiaActivityGoods, surplusPrice);
//剩余可砍金额就是 砍一刀后的金额
kanJiaActivity.setSurplusPrice(CurrencyUtil.sub(surplusPrice, price));
//保存我的砍价活动
boolean result = this.save(kanJiaActivity);
//因为发起砍价就是自己给自己砍一刀所以要添加砍价记录信息
if (result) {
KanJiaActivityDTO kanJiaActivityDTO = new KanJiaActivityDTO();
kanJiaActivityDTO.setKanJiaActivityGoodsId(kanJiaActivityGoods.getId());
kanJiaActivityDTO.setKanJiaActivityId(kanJiaActivity.getId());
kanJiaActivityDTO.setKanJiaPrice(price);
kanJiaActivityDTO.setSurplusPrice(kanJiaActivity.getSurplusPrice());
kanJiaActivityDTO.setKanJiaMemberId(kanJiaActivity.getMemberId());
kanJiaActivityDTO.setKanJiaMemberName(kanJiaActivity.getMemberName());
kanJiaActivityDTO.setKanJiaMemberFace(member.getFace());
return kanJiaActivityLogService.addKanJiaActivityLog(kanJiaActivityDTO);
}
}
throw new ServiceException(ResultCode.GOODS_NOT_EXIST);
}
throw new ServiceException(ResultCode.PROMOTION_STATUS_END);
}
@Override
public KanJiaActivityLog helpKanJia(String kanJiaActivityId) {
//获取会员信息
Member member = memberService.getById(UserContext.getCurrentUser().getId());
//根据砍价发起活动id查询砍价活动信息
KanJiaActivity kanJiaActivity = this.getById(kanJiaActivityId);
if (kanJiaActivity != null && kanJiaActivity.getStatus().equals(PromotionStatusEnum.START.name())) {
if (member == null) {
throw new ServiceException(ResultCode.USER_NOT_EXIST);
}
//根据skuId查询当前sku是否参与活动并且是在活动进行中
KanJiaActivityGoods kanJiaActivityGoods = kanJiaActivityGoodsService.getById(kanJiaActivity.getKanJiaActivityGoodsId());
if (kanJiaActivityGoods == null) {
throw new ServiceException(ResultCode.PROMOTION_STATUS_END);
}
KanJiaActivityDTO kanJiaActivityDTO = new KanJiaActivityDTO();
kanJiaActivityDTO.setKanJiaActivityGoodsId(kanJiaActivity.getKanJiaActivityGoodsId());
kanJiaActivityDTO.setKanJiaActivityId(kanJiaActivityId);
//获取砍价金额
Double price = this.getKanJiaPrice(kanJiaActivityGoods, kanJiaActivity.getSurplusPrice());
kanJiaActivityDTO.setKanJiaPrice(price);
//获取可砍金额
kanJiaActivityDTO.setSurplusPrice(CurrencyUtil.sub(kanJiaActivity.getSurplusPrice(), price));
//如果可砍金额为0的话说明活动成功了
if (Double.doubleToLongBits(kanJiaActivityDTO.getSurplusPrice()) == Double.doubleToLongBits(0D)) {
kanJiaActivity.setStatus(KanJiaStatusEnum.SUCCESS.name());
this.updateById(kanJiaActivity);
}
kanJiaActivityDTO.setKanJiaMemberId(member.getId());
kanJiaActivityDTO.setKanJiaMemberName(member.getUsername());
kanJiaActivityDTO.setKanJiaMemberFace(member.getFace());
return kanJiaActivityLogService.addKanJiaActivityLog(kanJiaActivityDTO);
}
throw new ServiceException(ResultCode.PROMOTION_STATUS_END);
}
/**
* 随机获取砍一刀价格
*
* @param kanJiaActivityGoods 砍价商品信息
* @param surplusPrice 剩余可砍金额
* @return
*/
private Double getKanJiaPrice(KanJiaActivityGoods kanJiaActivityGoods, Double surplusPrice) {
double result = kanJiaActivityGoods.getHighestPrice() - kanJiaActivityGoods.getLowestPrice();
double num = (Math.random() * result);
//如果剩余金额小于最低可砍价金额则直接返回最小金额 砍价成功
if (kanJiaActivityGoods.getLowestPrice() > surplusPrice) {
return surplusPrice;
}
Double price = 0D;
while (true) {
price = CurrencyUtil.round(num + kanJiaActivityGoods.getLowestPrice(), 2);
//从最大金额和最小金额之间获取随机砍价金额
if (price < surplusPrice) {
break;
} else {
price = surplusPrice;
break;
}
}
return price;
}
@Override
public IPage<KanJiaActivity> getForPage(KanJiaActivityQuery kanJiaActivityQuery, PageVO page) {
QueryWrapper<KanJiaActivity> queryWrapper = kanJiaActivityQuery.wrapper();
return this.page(PageUtil.initPage(page), queryWrapper);
}
}

View File

@ -9,6 +9,7 @@ import cn.lili.common.trigger.message.PromotionMessage;
import cn.lili.common.exception.ServiceException;
import cn.lili.modules.order.cart.entity.vo.FullDiscountVO;
import cn.lili.modules.promotion.entity.dos.*;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityGoodsDTO;
import cn.lili.modules.promotion.entity.enums.*;
import cn.lili.modules.promotion.entity.vos.*;
import cn.lili.modules.promotion.service.*;
@ -370,7 +371,7 @@ public class PromotionServiceImpl implements PromotionService {
result = this.seckillService.update(promotionMessage.updateWrapper());
//判断参与活动的商品是否为空如果为空则返回
if(seckill.getSeckillApplyList()==null){
if (seckill.getSeckillApplyList() == null) {
return result;
}
@ -438,14 +439,16 @@ public class PromotionServiceImpl implements PromotionService {
* @return 修改结果
*/
private boolean updateKanJiaGoods(PromotionMessage promotionMessage, PromotionTypeEnum promotionTypeEnum) {
boolean result;
KanJiaActivityGoods kanJiaActivityGoods = JSONUtil.toBean(JSONUtil.toJsonStr(promotionMessage), KanJiaActivityGoods.class);
if (kanJiaActivityGoods == null) {
KanJiaActivityGoodsDTO kanJiaActivityGoodsDTO = this.mongoTemplate.findById(promotionMessage.getPromotionId(), KanJiaActivityGoodsDTO.class);
if (kanJiaActivityGoodsDTO == null) {
this.throwPromotionException(promotionTypeEnum, promotionMessage.getPromotionId(), promotionMessage.getPromotionStatus());
return false;
}
kanJiaActivityGoods.setPromotionStatus(promotionMessage.getPromotionStatus());
result = this.kanJiaActivityGoodsService.updateById(kanJiaActivityGoods);
kanJiaActivityGoodsDTO.setPromotionStatus(promotionMessage.getPromotionStatus());
boolean result = this.kanJiaActivityGoodsService.updateById(kanJiaActivityGoodsDTO);
if (result) {
this.mongoTemplate.save(kanJiaActivityGoodsDTO);
}
return result;
}

View File

@ -1,10 +1,13 @@
package cn.lili.controller.promotion;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.promotion.entity.dos.KanJiaActivityGoods;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityGoodsDTO;
import cn.lili.modules.promotion.entity.dto.KanJiaActivityGoodsOperationDTO;
import cn.lili.modules.promotion.entity.vos.KanJiaActivityGoodsParams;
import cn.lili.modules.promotion.service.KanJiaActivityGoodsService;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -13,7 +16,7 @@ import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Arrays;
/**
@ -32,17 +35,43 @@ public class KanJiaActivityGoodsManagerController {
@PostMapping
@ApiOperation(value = "添加砍价活动")
public ResultMessage<Object> add(@RequestBody List<KanJiaActivityGoodsDTO> kanJiaActivityGoodsDTOS) {
kanJiaActivityGoodsService.add(kanJiaActivityGoodsDTOS);
public ResultMessage<Object> add(@RequestBody KanJiaActivityGoodsOperationDTO kanJiaActivityGoodsOperationDTO) {
kanJiaActivityGoodsService.add(kanJiaActivityGoodsOperationDTO);
return ResultUtil.success();
}
@ApiOperation(value = "获取砍价活动分页")
@GetMapping
public ResultMessage<IPage<KanJiaActivityGoods>> getKanjiaActivityPage(KanJiaActivityGoodsParams KanJiaActivityParams, PageVO page) {
public ResultMessage<IPage<KanJiaActivityGoodsDTO>> getKanJiaActivityPage(KanJiaActivityGoodsParams KanJiaActivityParams, PageVO page) {
return ResultUtil.data(kanJiaActivityGoodsService.getForPage(KanJiaActivityParams, page));
}
@GetMapping("/{id}")
@ApiOperation(value = "获取积分商品详情")
public ResultMessage<Object> getPointsGoodsDetail(@PathVariable("id") String goodsId) {
KanJiaActivityGoodsDTO kanJiaActivityGoodsDTO = kanJiaActivityGoodsService.getKanJiaGoodsDetail(goodsId);
return ResultUtil.data(kanJiaActivityGoodsDTO);
}
@PutMapping
@ApiOperation(value = "修改砍价商品")
public ResultMessage<Object> updatePointsGoods(@RequestBody KanJiaActivityGoodsDTO kanJiaActivityGoodsDTO) {
kanJiaActivityGoodsService.updateKanJiaActivityGoods(kanJiaActivityGoodsDTO);
return ResultUtil.success();
}
@DeleteMapping("/{ids}")
@ApiOperation(value = "删除砍价商品")
public ResultMessage<Object> delete(@PathVariable String ids) {
if (kanJiaActivityGoodsService.deleteKanJiaGoods(Arrays.asList(ids.split(",")))) {
return ResultUtil.success();
}
throw new ServiceException(ResultCode.KANJIA_GOODS_DELETE_ERROR);
}
}