Authored by 匡佳华

商品促销活动

package com.yohoufo.dal.promotion;
import com.yohoufo.dal.promotion.model.ActivityAmountCondition;
import java.util.List;
public interface IActivityAmountConditionMapper {
ActivityAmountCondition selectByActivityId(Integer activity);
}
... ...
package com.yohoufo.dal.promotion;
import com.yohoufo.dal.promotion.model.Activity;
public interface IActivityMapper {
Activity selectRunningActivity(Integer currentTime);
}
... ...
package com.yohoufo.dal.promotion;
import com.yohoufo.dal.promotion.model.ActivityProductScope;
import java.util.List;
public interface IActivityProductScopeMapper {
ActivityProductScope selectByActivityId(Integer activityId);
List<ActivityProductScope> selectByActivityIds(List<Integer> activityList);
}
... ...
package com.yohoufo.dal.promotion.model;
import lombok.Data;
@Data
public class Activity {
private Integer id;
private String activityName;
private String label;
private Integer startTime;
private Integer endTime;
private Integer promotionType;
private String productLimitType;
private Integer joinLimitType;
private Integer joinLimitTimes;
private Integer status;
private Integer createTime;
private Integer updateTime;
}
... ...
package com.yohoufo.dal.promotion.model;
import lombok.Data;
@Data
public class ActivityAmountCondition {
private Integer id;
private Integer activityId;
private Double limitAmount;
private Double offerAmount;
private Double offerMaxLimit;
private Integer createTime;
}
... ...
package com.yohoufo.dal.promotion.model;
import lombok.Data;
@Data
public class ActivityProductScope {
private Integer id;
private Integer activityId;
private Integer productScopeType;
private Integer limitType;
private String limitValues;
private Integer createTime;
}
... ...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yohoufo.dal.promotion.IActivityAmountConditionMapper">
<resultMap id="BaseResultMap" type="com.yohoufo.dal.promotion.model.ActivityAmountCondition">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="activity_id" property="activityId" jdbcType="INTEGER"/>
<result column="limit_amount" property="limitAmount" jdbcType="INTEGER"/>
<result column="offer_amount" property="offerAmount" jdbcType="DECIMAL"/>
<result column="offer_max_limit" property="offerMaxLimit" jdbcType="INTEGER"/>
<result column="create_time" property="createTime" jdbcType="INTEGER"/>
</resultMap>
<select id="selectByActivityId" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select limit_amount, offer_amount, offer_max_limit , create_time
from promotion_amount_condition
where activity_id = #{activityId, jdbcType=INTEGER}
limit 1
</select>
</mapper>
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yohoufo.dal.promotion.IActivityMapper">
<resultMap id="BaseResultMap" type="com.yohoufo.dal.promotion.model.Activity">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="activity_name" property="activityName" jdbcType="VARCHAR"/>
<result column="label" property="label" jdbcType="VARCHAR"/>
<result column="start_time" property="startTime" jdbcType="INTEGER"/>
<result column="end_time" property="endTime" jdbcType="INTEGER"/>
<result column="promotion_type" property="promotionType" jdbcType="INTEGER"/>
<result column="product_limit_type" property="productLimitType" jdbcType="VARCHAR"/>
<result column="join_limit_type" property="joinLimitType" jdbcType="INTEGER"/>
<result column="join_limit_times" property="joinLimitTimes" jdbcType="INTEGER"/>
<result column="status" property="status" jdbcType="INTEGER"/>
<result column="create_time" property="createTime" jdbcType="INTEGER"/>
<result column="update_time" property="updateTime" jdbcType="INTEGER"/>
</resultMap>
<select id="selectRunningActivity" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select id, activity_name, label, start_time, end_time, promotion_type, product_limit_type, join_limit_type, join_limit_times, status
from promotion_activity
where status = 1
and #{currentTime, jdbcType=INTEGER} between start_time and end_time
limit 1;
</select>
</mapper>
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yohoufo.dal.promotion.IActivityProductScopeMapper">
<resultMap id="BaseResultMap" type="com.yohoufo.dal.promotion.model.ActivityProductScope">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="activity_id" property="activityId" jdbcType="INTEGER"/>
<result column="product_scope_type" property="productScopeType" jdbcType="INTEGER"/>
<result column="limit_type" property="limitType" jdbcType="INTEGER"/>
<result column="limit_values" property="limitValues" jdbcType="VARCHAR"/>
<result column="create_time" property="createTime" jdbcType="VARCHAR"/>
</resultMap>
<select id="selectByActivityId" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select id, product_scope_type, limit_type, limit_values
from promotion_product_scope
where activity_id = #{activityId}
limit 1
</select>
</mapper>
\ No newline at end of file
... ...
package com.yohoufo.promotion.controller;
import com.yoho.tools.docs.ApiOperation;
import com.yohobuy.ufo.model.promotion.response.promotionActivity.PromotionActivityRspBo;
import com.yohoufo.common.ApiResponse;
import com.yohoufo.promotion.service.IActivityService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 促销活动相关接口
*/
@RestController
public class ActivityController {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private IActivityService activityService;
@ApiOperation(name = "ufo.promotion.activityList", desc="商品促销活动列表")
@RequestMapping(params = "method=ufo.promotion.activityList")
public ApiResponse getPromotionActivityList(@RequestParam(value = "product_id", required = true) Integer productId) {
logger.info("Method:ufo.promotion.activityList. productId is {}", productId);
List<PromotionActivityRspBo> rspBoList = activityService.getPromotionActivityList(productId);
return new ApiResponse.ApiResponseBuilder().data(rspBoList).code(200).message("商品促销活动列表").build();
}
@ApiOperation(name = "ufo.promotion.activityDetail", desc="当前商品促销活动详情")
@RequestMapping(params = "method=ufo.promotion.activityDetail")
public ApiResponse getPromotionActivityDetail(@RequestParam(value = "current_time", required = true) Integer currentTime) {
logger.info("Method:ufo.promotion.activityDetail. currentTime is {}", currentTime);
PromotionActivityRspBo rspBoList = activityService.getPromotionActivityDetail(currentTime);
return new ApiResponse.ApiResponseBuilder().data(rspBoList).code(200).message("当前商品促销活动详情").build();
}
}
... ...
package com.yohoufo.promotion.service;
import com.yohobuy.ufo.model.promotion.response.promotionActivity.PromotionActivityRspBo;
import java.util.List;
public interface IActivityService {
/**
* 获取商品促销活动列表展示信息
* @param productId
* @return
*/
List<PromotionActivityRspBo> getPromotionActivityList(Integer productId);
/**
* 获取当前促销活动详情
* @param currentTime
* @return
*/
PromotionActivityRspBo getPromotionActivityDetail(Integer currentTime);
}
... ...
package com.yohoufo.promotion.service.impl;
import com.yoho.tools.common.utils.DateUtil;
import com.yohobuy.ufo.model.promotion.response.promotionActivity.PromotionActivityRspBo;
import com.yohobuy.ufo.model.promotion.response.promotionActivity.PromotionAmountConditionBo;
import com.yohobuy.ufo.model.promotion.response.promotionActivity.PromotionJoinTimeLimitBo;
import com.yohobuy.ufo.model.promotion.response.promotionActivity.PromotionProductScopeBo;
import com.yohoufo.dal.product.ProductPoolDetailMapper;
import com.yohoufo.dal.product.model.ProductPoolDetail;
import com.yohoufo.dal.promotion.IActivityAmountConditionMapper;
import com.yohoufo.dal.promotion.IActivityMapper;
import com.yohoufo.dal.promotion.IActivityProductScopeMapper;
import com.yohoufo.dal.promotion.model.Activity;
import com.yohoufo.dal.promotion.model.ActivityAmountCondition;
import com.yohoufo.dal.promotion.model.ActivityProductScope;
import com.yohoufo.promotion.service.IActivityService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class ActivityServiceImpl implements IActivityService {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
IActivityMapper activityMapper;
@Autowired
ProductPoolDetailMapper productPoolDetailMapper;
@Autowired
IActivityProductScopeMapper activityProductScopeMapper;
@Autowired
IActivityAmountConditionMapper activityAmountConditionMapper;
/**
* 根据商品id返回符合条件的促销活动
* @param productId
* @return
*/
@Override
public List<PromotionActivityRspBo> getPromotionActivityList(Integer productId) {
logger.info("getPromotionActivityList: enter. productId is {}", productId);
//获取当前正在进行中的活动
Activity activity = activityMapper.selectRunningActivity(DateUtil.getCurrentTimeSeconds());
if(activity == null){
logger.info("getPromotionActivityList: no running activity. productId is {}", productId);
return new ArrayList<>();
}
//判断商品是否符合商品池限制条件(limitType: 1-包含商品池 2-不包含商品池)
ActivityProductScope productScope = activityProductScopeMapper.selectByActivityId(activity.getId());
ProductPoolDetail productPoolDetail = productPoolDetailMapper.selectByPoolId(productId, Integer.valueOf(productScope.getLimitValues()));
if((productScope.getLimitType() == 1 && productPoolDetail == null)
|| (productScope.getLimitType() == 2 && productPoolDetail != null)){
logger.info("getPromotionActivityList: not in productScope. productId is {}, productPoolId is {}", productScope.getLimitValues());
return new ArrayList<>();
}
//获取这些活动列表相关的信息
PromotionActivityRspBo rspBo = new PromotionActivityRspBo();
rspBo.setActivityName(activity.getActivityName());
rspBo.setStartTime(activity.getStartTime());
rspBo.setEndTime(activity.getEndTime());
rspBo.setPromotionType(activity.getPromotionType());
rspBo.setLabel(activity.getLabel());
List<PromotionActivityRspBo> list = new ArrayList<>();
list.add(rspBo);
logger.info("getPromotionActivityList: end. productId is {}, activityId is {}", rspBo);
return list;
}
@Override
public PromotionActivityRspBo getPromotionActivityDetail(Integer currentTime) {
logger.info("getPromotionActivityList: enter. currentTime is {}", currentTime);
//获取当前正在进行的活动
Activity activity = activityMapper.selectRunningActivity(currentTime);
if(activity == null){
logger.info("getPromotionActivityList: no running activity. currentTime is {}", currentTime);
return null;
}
//组装活动详细信息
PromotionActivityRspBo rspBo = new PromotionActivityRspBo();
rspBo.setActivityName(activity.getActivityName());
rspBo.setStartTime(activity.getStartTime());
rspBo.setEndTime(activity.getEndTime());
rspBo.setPromotionType(activity.getPromotionType());
rspBo.setLabel(activity.getLabel());
//参与次数过滤条件
PromotionJoinTimeLimitBo joinTimeLimitBo = new PromotionJoinTimeLimitBo();
joinTimeLimitBo.setType(activity.getJoinLimitType());
joinTimeLimitBo.setActivityJoinLimitTime(activity.getJoinLimitTimes());
rspBo.setPromotionJoinTimeLimit(joinTimeLimitBo);
//金额限制条件
ActivityAmountCondition activityAmountCondition = activityAmountConditionMapper.selectByActivityId(activity.getId());
List<PromotionAmountConditionBo> amountConditionBoList = new ArrayList<>();
PromotionAmountConditionBo amountConditionBo = new PromotionAmountConditionBo();
amountConditionBo.setLimitAmount(activityAmountCondition.getLimitAmount());
amountConditionBo.setOfferAmount(activityAmountCondition.getOfferAmount());
amountConditionBo.setOfferMaxLimit(activityAmountCondition.getOfferMaxLimit());
amountConditionBoList.add(amountConditionBo);
rspBo.setPromotionConditionList(amountConditionBoList);
//商品范围限制条件
ActivityProductScope productScope = activityProductScopeMapper.selectByActivityId(activity.getId());
List<PromotionProductScopeBo> productScopeBoList = new ArrayList<>();
PromotionProductScopeBo productScopeBo = new PromotionProductScopeBo();
productScopeBo.setLimitType(productScope.getLimitType());
productScopeBo.setProductScopeType(productScope.getProductScopeType());
productScopeBo.setScopeValue(productScope.getLimitValues());
productScopeBoList.add(productScopeBo);
rspBo.setPromotionProductScopeList(productScopeBoList);
logger.info("getPromotionActivityList: end. currentTime is {}, activityInfo is {}", currentTime, rspBo);
return rspBo;
}
}
... ...
... ... @@ -48,6 +48,7 @@ datasources:
- com.yohoufo.dal.product.SelfSizeMapper
- com.yohoufo.dal.product.SelfSizeUidMapper
- com.yohoufo.dal.product.ProductProfitMapper
- com.yohoufo.dal.product.ProductPoolDetailMapper
ufo_order:
... ... @@ -132,6 +133,9 @@ datasources:
- com.yohoufo.dal.promotion.CouponProductLimitMapper
- com.yohoufo.dal.promotion.CouponTypeMapper
- com.yohoufo.dal.promotion.UserCouponMapper
- com.yohoufo.dal.promotion.IActivityMapper
- com.yohoufo.dal.promotion.IActivityProductScopeMapper
- com.yohoufo.dal.promotion.IActivityAmountConditionMapper
ufo_resource:
servers:
... ...
... ... @@ -132,6 +132,9 @@ datasources:
- com.yohoufo.dal.promotion.CouponProductLimitMapper
- com.yohoufo.dal.promotion.CouponTypeMapper
- com.yohoufo.dal.promotion.UserCouponMapper
- com.yohoufo.dal.promotion.IActivityMapper
- com.yohoufo.dal.promotion.IActivityAmountConditionMapper
- com.yohoufo.dal.promotion.IActivityProductScopeMapper
ufo_resource:
... ...